diff --git a/.github/workflows/on-release.yml b/.github/workflows/on-release.yml index 8a1da10..4a5a1e5 100644 --- a/.github/workflows/on-release.yml +++ b/.github/workflows/on-release.yml @@ -76,3 +76,35 @@ jobs: version: ${{ env.version }} zipball: ${{ env.zip }} changelog: ./changelog.md + + - name: Update mod topic + uses: Kerbalight/ksp2-forum-post-action@latest + with: + username: ${{ secrets.FORUM_USER }} + password: ${{ secrets.FORUM_PASSWORD }} + forum_topic_url: https://forum.kerbalspaceprogram.com/topic/221179-093-patch-manager/ + forum_topic_title: '[{version}] Patch Manager' + spacedock_url: https://spacedock.info/mod/3482/Patch%20Manager + version: ${{ env.version }} + swinfo_path: 'plugin_template/swinfo.json' + changelog: ./changelog.md + + - name: Prepare content for discord + shell: bash + run: | + echo -e "## Release v${version}\n" > ./content.md + cat ./changelog.md >> ./content.md + { + echo 'discord_message<> "$GITHUB_ENV" + + - name: Publish update to Discord + uses: tsickert/discord-webhook@v5.3.0 + with: + webhook-url: ${{ secrets.DISCORD_WEBHOOK }} + content: ${{ env.discord_message }} + thread-id: '1171826066692776028' + username: "Patch Manager" + avatar-url: "https://spacedock.info/content/cheese3660_103715/Patch_Manager/thumb_Patch_Manager-1703507804.jpg" diff --git a/plugin_template/swinfo.json b/plugin_template/swinfo.json index e3d6eb3..adfb8cb 100644 --- a/plugin_template/swinfo.json +++ b/plugin_template/swinfo.json @@ -5,7 +5,7 @@ "name": "Patch Manager", "description": "A mod for generic patching needs similar to KSP 1's Module Manager.", "source": "https://github.com/KSP2Community/PatchManager", - "version": "0.9.4", + "version": "0.10.0", "version_check": "https://raw.githubusercontent.com/KSP2Community/PatchManager/main/plugin_template/swinfo.json", "ksp2_version": { "min": "0.2.0", diff --git a/src/PatchManager.Parts/Modifiables/PartModifiable.cs b/src/PatchManager.Parts/Modifiables/PartModifiable.cs index 42c81fc..8d0eb90 100644 --- a/src/PatchManager.Parts/Modifiables/PartModifiable.cs +++ b/src/PatchManager.Parts/Modifiables/PartModifiable.cs @@ -2,6 +2,7 @@ using PatchManager.Parts.Selectables; using PatchManager.SassyPatching; using PatchManager.SassyPatching.Modifiables; +using Enumerable = UniLinq.Enumerable; namespace PatchManager.Parts.Modifiables; @@ -14,63 +15,25 @@ public sealed class PartModifiable : CustomJTokenModifiable internal PartModifiable(PartSelectable selectable) : base(selectable.JObject["data"],selectable.SetModified) { _selectable = selectable; - CustomIndexAdaptors = new(); - CustomElementAdaptors = new(); - CustomClassAdaptors = new() - { - ["resourceContainers"] = ResourceContainerClassAdapter, - ["attachNodes"] = AttachNodesClassAdaptor - }; - } - - - private static bool ResourceContainerClassAdapter(JToken resourceContainer, string className) => - resourceContainer.Contains("name") && (string)resourceContainer["name"] == className; - - private static bool AttachNodesClassAdaptor(JToken attachNode, string className) => - attachNode.Contains("nodeID") && (string)attachNode["nodeID"] == className; - - private static JToken ModuleElementAdaptor(JToken module, string elementName) - { - var moduleData = module["ModuleData"]; - return moduleData.FirstOrDefault(data => (string)data["Name"] == elementName); - } - - private static JToken ModuleIndexAdaptor(JToken module, ulong index) - { - return module["ModuleData"][(int)index]; } /// - protected override bool CustomFieldAdaptor(string fieldName, out JToken field, out Func classAdaptor, out Func indexAdaptor, - out Func elementAdaptor) + public override DataValue GetFieldValue(string fieldName) { - classAdaptor = null; - elementAdaptor = null; - indexAdaptor = null; - field = null; var repl = fieldName.Replace("PartComponent", ""); - foreach (var module in JToken["serializedPartModules"]) + if (JToken is not JObject jObject) + return DataValue.Null; + if(!jObject.ContainsKey("serializedPartModules")) + return DataValue.Null; + foreach (var module in jObject["serializedPartModules"]) { - if (((string)module["Name"]).Replace("PartComponent", "") != repl) continue; - classAdaptor = null; // As modules have a weird childing system, so we can't easily just do this w/ our custom json adapter - elementAdaptor = ModuleElementAdaptor; - indexAdaptor = ModuleIndexAdaptor; - field = module; - return true; + if (module is not JObject moduleObject)continue; + if (moduleObject.ContainsKey("Name") && ((string)moduleObject["Name"])!.Replace("PartComponent", "") == repl) + return DataValue.FromJToken(module); } - return false; + return DataValue.Null; } - /// - protected override Dictionary> CustomClassAdaptors { get; } - - /// - protected override Dictionary> CustomIndexAdaptors { get; } - - /// - protected override Dictionary> CustomElementAdaptors { get; } - /// public override void Set(DataValue dataValue) { diff --git a/src/PatchManager.SassyPatching.Tests/ParsingTests.cs b/src/PatchManager.SassyPatching.Tests/ParsingTests.cs index f8d1dcc..1a1e540 100644 --- a/src/PatchManager.SassyPatching.Tests/ParsingTests.cs +++ b/src/PatchManager.SassyPatching.Tests/ParsingTests.cs @@ -1,7 +1,6 @@ using PatchManager.SassyPatching.Tests.Validators; using PatchManager.SassyPatching.Tests.Validators.Attributes; using PatchManager.SassyPatching.Tests.Validators.Expressions; -using PatchManager.SassyPatching.Tests.Validators.Indexers; using PatchManager.SassyPatching.Tests.Validators.Selectors; using PatchManager.SassyPatching.Tests.Validators.Statements; using PatchManager.SassyPatching.Tests.Validators.Statements.FunctionLevel; @@ -1523,314 +1522,314 @@ public void FieldSetStringKeyNoIndexer() /// /// Tests a field set selection action w/ an element key and a number indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ an element key and a number indexer")] - public void FieldSetElementKeyNumberIndexer() - { - const string patch = - @" -* { - x[0]: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new NumberIndexerValidator - { - Index = 0 - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch, validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ an element key and a number indexer")] +// public void FieldSetElementKeyNumberIndexer() +// { +// const string patch = +// @" +// * { +// x[0]: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new NumberIndexerValidator +// { +// Index = 0 +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch, validator); +// } /// /// Tests a field set selection action w/ a string key and a number indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ a string key and a number indexer")] - public void FieldSetStringKeyNumberIndexer() - { - const string patch = - @" -* { - 'x'[0]: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new NumberIndexerValidator - { - Index = 0 - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch, validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ a string key and a number indexer")] +// public void FieldSetStringKeyNumberIndexer() +// { +// const string patch = +// @" +// * { +// 'x'[0]: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new NumberIndexerValidator +// { +// Index = 0 +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch, validator); +// } /// /// Tests a field set selection action w/ an element key and an element indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ an element key and an element indexer")] - public void FieldSetElementKeyElementIndexer() - { - const string patch = - @" -* { - x[y]: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new ElementIndexerValidator - { - ElementName = "y" - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch, validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ an element key and an element indexer")] +// public void FieldSetElementKeyElementIndexer() +// { +// const string patch = +// @" +// * { +// x[y]: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new ElementIndexerValidator +// { +// ElementName = "y" +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch, validator); +// } /// /// Tests a field set selection action w/ a string key and an element indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ a string key and an element indexer")] - public void FieldSetStringKeyElementIndexer() - { - const string patch = - @" -* { - 'x'[y]: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new ElementIndexerValidator - { - ElementName = "y" - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch, validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ a string key and an element indexer")] +// public void FieldSetStringKeyElementIndexer() +// { +// const string patch = +// @" +// * { +// 'x'[y]: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new ElementIndexerValidator +// { +// ElementName = "y" +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch, validator); +// } /// /// Tests a field set selection action w/ an element key and a class indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ an element key and a class indexer")] - public void FieldSetElementKeyClassIndexer() - { - const string patch = - @" -* { - x[.y]: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new ClassIndexerValidator - { - ClassName = "y" - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch, validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ an element key and a class indexer")] +// public void FieldSetElementKeyClassIndexer() +// { +// const string patch = +// @" +// * { +// x[.y]: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new ClassIndexerValidator +// { +// ClassName = "y" +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch, validator); +// } /// /// Tests a field set selection action w/ a string key and a class indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ a string key and a class indexer")] - public void FieldSetStringKeyClassIndexer() - { - const string patch = - @" -* { - 'x'[.y]: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new ClassIndexerValidator - { - ClassName = "y" - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch,validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ a string key and a class indexer")] +// public void FieldSetStringKeyClassIndexer() +// { +// const string patch = +// @" +// * { +// 'x'[.y]: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new ClassIndexerValidator +// { +// ClassName = "y" +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch,validator); +// } /// /// Tests a field set selection action w/ an element key and a string indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ an element key and a string indexer")] - public void FieldSetElementKeyStringIndexer() - { - const string patch = - @" -* { - x['y']: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new StringIndexerValidator - { - Index = "y" - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch, validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ an element key and a string indexer")] +// public void FieldSetElementKeyStringIndexer() +// { +// const string patch = +// @" +// * { +// x['y']: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new StringIndexerValidator +// { +// Index = "y" +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch, validator); +// } /// /// Tests a field set selection action w/ a string key and a string indexer /// - [Test(TestOf = typeof(Transformer), Author = "Cheese", - Description = "Tests a field set selection action w/ a string key and a string indexer")] - public void FieldSetStringKeyStringIndexer() - { - const string patch = - @" -* { - 'x'['y']: 5; -} -"; - var validator = new PatchValidator - { - new SelectionBlockValidator - { - Attributes = new(), - Selector = new WildcardSelectorValidator(), - Actions = new() - { - new FieldValidator - { - FieldName = "x", - Indexer = new StringIndexerValidator - { - Index = "y" - }, - FieldValue = new ValueValidator - { - StoredDataValue = 5 - } - } - } - } - }; - Match(patch, validator); - } +// [Test(TestOf = typeof(Transformer), Author = "Cheese", +// Description = "Tests a field set selection action w/ a string key and a string indexer")] +// public void FieldSetStringKeyStringIndexer() +// { +// const string patch = +// @" +// * { +// 'x'['y']: 5; +// } +// "; +// var validator = new PatchValidator +// { +// new SelectionBlockValidator +// { +// Attributes = new(), +// Selector = new WildcardSelectorValidator(), +// Actions = new() +// { +// new FieldValidator +// { +// FieldName = "x", +// Indexer = new StringIndexerValidator +// { +// Index = "y" +// }, +// FieldValue = new ValueValidator +// { +// StoredDataValue = 5 +// } +// } +// } +// } +// }; +// Match(patch, validator); +// } /// /// Tests a nested selection block as a selection action diff --git a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/ClassIndexerValidator.cs b/src/PatchManager.SassyPatching.Tests/Validators/Indexers/ClassIndexerValidator.cs deleted file mode 100644 index a87c9a8..0000000 --- a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/ClassIndexerValidator.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PatchManager.SassyPatching.Tests.Validators.Indexers; -/// -/// Describes a validator for matching nodes of type -/// -public class ClassIndexerValidator : ParseValidator -{ - /// - /// A field that is used to match against the corresponding field in a node of type - /// - public string ClassName = ""; - /// - /// Determines if a node matches the tree defined by this validator - /// - /// The node to match against - /// True if the node matches against the tree defined by this validator - public override bool Validate(ClassIndexer node) => node.ClassName == ClassName; -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/ElementIndexerValidator.cs b/src/PatchManager.SassyPatching.Tests/Validators/Indexers/ElementIndexerValidator.cs deleted file mode 100644 index 16017fd..0000000 --- a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/ElementIndexerValidator.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PatchManager.SassyPatching.Tests.Validators.Indexers; -/// -/// Describes a validator for matching nodes of type -/// -public class ElementIndexerValidator : ParseValidator -{ - /// - /// A field that is used to match against the corresponding field in a node of type - /// - public string ElementName = ""; - /// - /// Determines if a node matches the tree defined by this validator - /// - /// The node to match against - /// True if the node matches against the tree defined by this validator - public override bool Validate(ElementIndexer node) => node.ElementName == ElementName; -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/NumberIndexerValidator.cs b/src/PatchManager.SassyPatching.Tests/Validators/Indexers/NumberIndexerValidator.cs deleted file mode 100644 index d65e9bd..0000000 --- a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/NumberIndexerValidator.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PatchManager.SassyPatching.Tests.Validators.Indexers; -/// -/// Describes a validator for matching nodes of type -/// -public class NumberIndexerValidator : ParseValidator -{ - /// - /// A field that is used to match against the corresponding field in a node of type - /// - public ulong Index; - /// - /// Determines if a node matches the tree defined by this validator - /// - /// The node to match against - /// True if the node matches against the tree defined by this validator - public override bool Validate(NumberIndexer node) => node.Index == Index; -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/StringIndexerValidator.cs b/src/PatchManager.SassyPatching.Tests/Validators/Indexers/StringIndexerValidator.cs deleted file mode 100644 index 28b79e5..0000000 --- a/src/PatchManager.SassyPatching.Tests/Validators/Indexers/StringIndexerValidator.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PatchManager.SassyPatching.Tests.Validators.Indexers; -/// -/// Describes a validator for matching nodes of type -/// -public class StringIndexerValidator : ParseValidator -{ - /// - /// A field that is used to match against the corresponding field in a node of type - /// - public string Index = ""; - /// - /// Determines if a node matches the tree defined by this validator - /// - /// The node to match against - /// True if the node matches against the tree defined by this validator - public override bool Validate(StringIndexer node) => node.Index == Index; -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching.Tests/Validators/Statements/SelectionLevel/FieldValidator.cs b/src/PatchManager.SassyPatching.Tests/Validators/Statements/SelectionLevel/FieldValidator.cs index 33dbccc..71e493d 100644 --- a/src/PatchManager.SassyPatching.Tests/Validators/Statements/SelectionLevel/FieldValidator.cs +++ b/src/PatchManager.SassyPatching.Tests/Validators/Statements/SelectionLevel/FieldValidator.cs @@ -24,9 +24,9 @@ public class FieldValidator : ParseValidator public override bool Validate(Field node) { if (FieldName != node.FieldName) return false; - if (Indexer == null && node.Indexer != null) return false; - if (Indexer != null && node.Indexer == null) return false; - if (Indexer != null && node.Indexer != null && !Indexer.Validate(node.Indexer)) return false; + // if (Indexer == null && node.Indexer != null) return false; + // if (Indexer != null && node.Indexer == null) return false; + // if (Indexer != null && node.Indexer != null && !Indexer.Validate(node.Indexer)) return false; return FieldValue.Validate(node.FieldValue); } } \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/DataValue.cs b/src/PatchManager.SassyPatching/DataValue.cs index 773f40b..64bf402 100644 --- a/src/PatchManager.SassyPatching/DataValue.cs +++ b/src/PatchManager.SassyPatching/DataValue.cs @@ -851,7 +851,8 @@ public static DataValue From(object value) return objectData; } - public static DataValue Null => new(DataType.None); + + public static readonly DataValue Null = new(DataType.None); public static bool operator ==(DataValue leftHandSide, DataValue rightHandSide) { diff --git a/src/PatchManager.SassyPatching/Interfaces/IModifiable.cs b/src/PatchManager.SassyPatching/Interfaces/IModifiable.cs index 79b2fe4..22bc3ab 100644 --- a/src/PatchManager.SassyPatching/Interfaces/IModifiable.cs +++ b/src/PatchManager.SassyPatching/Interfaces/IModifiable.cs @@ -5,51 +5,6 @@ /// public interface IModifiable { - /// - /// Gets a a field indexed by number - /// - /// the name of the field - /// the index - /// The value of the field - public DataValue GetFieldByNumber(string fieldName, ulong index); - /// - /// Gets a field indexed by element type - /// - /// the name of the field - /// The element type - /// The value of the field - public DataValue GetFieldByElement(string fieldName, string elementName); - - /// - /// Gets a field indexed by class - /// - /// the name of the field - /// The class - /// The value of the field - public DataValue GetFieldByClass(string fieldName, string className); - - /// - /// Sets a a field indexed by number - /// - /// the name of the field - /// the index - /// The value of the field - public void SetFieldByNumber(string fieldName, ulong index, DataValue dataValue); - /// - /// Sets a field indexed by element type - /// - /// the name of the field - /// The element type - /// The value of the field - public void SetFieldByElement(string fieldName, string elementName, DataValue dataValue); - - /// - /// Sets a field indexed by class - /// - /// the name of the field - /// The class - /// The value of the field - public void SetFieldByClass(string fieldName, string className, DataValue dataValue); /// /// Gets the value of a field /// diff --git a/src/PatchManager.SassyPatching/Modifiables/CustomJTokenModifiable.cs b/src/PatchManager.SassyPatching/Modifiables/CustomJTokenModifiable.cs index 9601880..a959cf9 100644 --- a/src/PatchManager.SassyPatching/Modifiables/CustomJTokenModifiable.cs +++ b/src/PatchManager.SassyPatching/Modifiables/CustomJTokenModifiable.cs @@ -16,7 +16,7 @@ public abstract class CustomJTokenModifiable : IModifiable /// Deletes a token, or if its a property, its parent /// /// - protected static void RemoveToken(JToken token) + private static void RemoveToken(JToken token) { if (token.Parent is JProperty) { @@ -28,31 +28,6 @@ protected static void RemoveToken(JToken token) } } - /// - /// - /// - /// - /// - /// - /// - /// - /// - protected abstract bool CustomFieldAdaptor(string fieldName, out JToken field, out Func classAdaptor, out Func indexAdaptor, out Func elementAdaptor); - - /// - /// This is a dictionary from fieldName -> function where if that function is run on a child of that field, then it is determined that that field has that class - /// - protected abstract Dictionary> CustomClassAdaptors { get; } - /// - /// This is a dictionary from fieldName -> function where that function returns a custom value at that index or null - /// - protected abstract Dictionary> CustomIndexAdaptors { get; } - /// - /// This is a dictionary from fieldName -> function where that function returns a custom value that is that element or null - /// - protected abstract Dictionary> CustomElementAdaptors { get; } - - /// /// /// @@ -64,74 +39,6 @@ protected CustomJTokenModifiable(JToken jToken, Action setDirty) _setDirty = setDirty; } - /// - public virtual DataValue GetFieldByNumber(string fieldName, ulong index) - { - if (CustomFieldAdaptor(fieldName, out var customField, out _, out var indexAdaptor, out _)) - { - if (indexAdaptor == null) return DataValue.FromJToken(customField[(int)index]); - var result = indexAdaptor(customField, index); - return DataValue.FromJToken(result ?? customField[(int)index]); - } - - var field = JToken[fieldName]; - if (!CustomIndexAdaptors.TryGetValue(fieldName, out var adaptor)) return DataValue.FromJToken(field[(int)index]); - var result2 = adaptor(field, index); - return DataValue.FromJToken(result2 ?? field[(int)index]); - } - - /// - public virtual DataValue GetFieldByElement(string fieldName, string elementName) - { - if (CustomFieldAdaptor(fieldName, out var customField, out _, out _, out var elementAdaptor)) - { - if (elementAdaptor == null) return DataValue.FromJToken(customField[elementName]); - var result = elementAdaptor(customField, elementName); - return DataValue.FromJToken(result ?? customField[elementName]); - } - var field = JToken[fieldName]; - if (!CustomElementAdaptors.TryGetValue(fieldName, out var adaptor)) return DataValue.FromJToken(field[elementName]); - var result2 = adaptor(field, elementName); - return DataValue.FromJToken(result2 ?? field[elementName]); - } - - /// - public virtual DataValue GetFieldByClass(string fieldName, string className) - { - if (CustomFieldAdaptor(fieldName, out var customField, out var classAdaptor, out _, out _)) - { - foreach (var subfield in customField) - { - var converted = subfield is JProperty jProperty ? jProperty.Value : subfield; - if (classAdaptor != null && classAdaptor(converted, className)) - { - return DataValue.FromJToken(subfield); - } - - if (converted.Contains(className)) - { - return DataValue.FromJToken(subfield); - } - } - return new DataValue(DataValue.DataType.None); - } - CustomClassAdaptors.TryGetValue(fieldName, out var adaptor); - var field = JToken[fieldName]; - foreach (var subfield in field) - { - var converted = subfield is JProperty jProperty ? jProperty.Value : subfield; - if (adaptor != null && adaptor(converted, className)) - { - return DataValue.FromJToken(subfield); - } - if (converted.Contains(className)) - { - return DataValue.FromJToken(subfield); - } - } - return new DataValue(DataValue.DataType.None); - } - /// /// Sets a JToken to a value, taking care of deletions /// @@ -150,98 +57,7 @@ protected static void Set(JToken jToken, DataValue dataValue) } /// - public virtual void SetFieldByNumber(string fieldName, ulong index, DataValue dataValue) - { - _setDirty(); - if (CustomFieldAdaptor(fieldName, out var customField, out _, out var indexAdaptor, out _)) - { - if (indexAdaptor == null) - { - Set(customField[(int)index],dataValue); - return; - } - var result = indexAdaptor(customField, index); - Set(result ?? customField[(int)index], dataValue); - return; - } - - var field = JToken[fieldName]; - if (!CustomIndexAdaptors.TryGetValue(fieldName, out var adaptor)) - { - Set(field[(int)index], dataValue); - return; - } - var result2 = adaptor(field, index); - Set(result2 ?? field[(int)index], dataValue); - } - - /// - public virtual void SetFieldByElement(string fieldName, string elementName, DataValue dataValue) - { - _setDirty(); - if (CustomFieldAdaptor(fieldName, out var customField, out _, out _, out var elementAdaptor)) - { - if (elementAdaptor == null) - { - Set(customField[elementName],dataValue); - return; - } - var result = elementAdaptor(customField, elementName); - Set(result ?? customField[elementName],dataValue); - return; - } - var field = JToken[fieldName]; - if (!CustomElementAdaptors.TryGetValue(fieldName, out var adaptor)) - { - Set(field[elementName],dataValue); - return; - } - var result2 = adaptor(field, elementName); - Set(result2 ?? field[elementName],dataValue); - } - - /// - public virtual void SetFieldByClass(string fieldName, string className, DataValue dataValue) - { - _setDirty(); - if (CustomFieldAdaptor(fieldName, out var customField, out var classAdaptor, out _, out _)) - { - foreach (var subfield in customField) - { - var converted = subfield is JProperty jProperty ? jProperty.Value : subfield; - if (classAdaptor != null && classAdaptor(converted, className)) - { - Set(subfield,dataValue); - return; - } - - if (converted.Contains(className)) - { - Set(subfield,dataValue); - return; - } - } - return; - } - CustomClassAdaptors.TryGetValue(fieldName, out var adaptor); - var field = JToken[fieldName]; - foreach (var subfield in field) - { - var converted = subfield is JProperty jProperty ? jProperty.Value : subfield; - if (adaptor != null && adaptor(converted, className)) - { - Set(subfield,dataValue); - return; - } - if (converted.Contains(className)) - { - Set(subfield,dataValue); - return; - } - } - } - - private DataValue BaseGetFieldValue(string fieldName) + public virtual DataValue GetFieldValue(string fieldName) { try { @@ -253,31 +69,21 @@ private DataValue BaseGetFieldValue(string fieldName) } } - /// - public virtual DataValue GetFieldValue(string fieldName) => CustomFieldAdaptor(fieldName, out var customField, out _, out _, out _) ? DataValue.FromJToken(customField) : BaseGetFieldValue(fieldName); - /// public virtual void SetFieldValue(string fieldName, DataValue dataValue) { _setDirty(); - if (CustomFieldAdaptor(fieldName, out var customField, out _, out _, out _)) + if (dataValue.IsDeletion) { - Set(customField, dataValue); + if (JToken is JObject obj && obj.ContainsKey(fieldName)) + JToken[fieldName]!.Remove(); } else { - - if (dataValue.IsDeletion) - { - JToken[fieldName].Remove(); - } + if (JToken is JObject obj && !obj.ContainsKey(fieldName)) + JToken[fieldName] = dataValue.ToJToken(); else - { - if (JToken is JObject obj && !obj.ContainsKey(fieldName)) - JToken[fieldName] = dataValue.ToJToken(); - else - JToken[fieldName].Replace(dataValue.ToJToken()); - } + JToken[fieldName]!.Replace(dataValue.ToJToken()); } } diff --git a/src/PatchManager.SassyPatching/Modifiables/JTokenModifiable.cs b/src/PatchManager.SassyPatching/Modifiables/JTokenModifiable.cs index 56c4262..9ad5b9d 100644 --- a/src/PatchManager.SassyPatching/Modifiables/JTokenModifiable.cs +++ b/src/PatchManager.SassyPatching/Modifiables/JTokenModifiable.cs @@ -25,85 +25,7 @@ public JTokenModifiable(JToken jToken, Action setDirty) _jToken = jToken; this._setDirty = setDirty; } - - public DataValue GetFieldByNumber(string fieldName, ulong index) - { - return DataValue.FromJToken(_jToken[fieldName][(int)index]); - } - - public DataValue GetFieldByElement(string fieldName, string elementName) - { - return DataValue.FromJToken(_jToken[fieldName][elementName]); - } - - public DataValue GetFieldByClass(string fieldName, string className) - { - var field = _jToken[fieldName]; - foreach (var subField in field) - { - if (subField.Contains(className)) - { - return DataValue.FromJToken(field); - } - - } - - return new DataValue(DataValue.DataType.None); - } - - public void SetFieldByNumber(string fieldName, ulong index, DataValue dataValue) - { - _setDirty(); - if (dataValue.IsDeletion) - { - RemoveToken(_jToken[fieldName][(int)index]); - } - else - { - _jToken[fieldName][(int)index].Replace(dataValue.ToJToken()); - } - } - - public void SetFieldByElement(string fieldName, string elementName, DataValue dataValue) - { - _setDirty(); - if (dataValue.IsDeletion) - { - // _jToken[fieldName][elementName].Remove(); - RemoveToken(_jToken[fieldName][elementName]); - } - else { - _jToken[fieldName][elementName].Replace(dataValue.ToJToken()); - } - } - - /// - public void SetFieldByClass(string fieldName, string className, DataValue dataValue) - { - _setDirty(); - var field = _jToken[fieldName]; - foreach (var subField in field.ToList().Where(subField => subField.Contains(className))) - { - if (dataValue.IsDeletion) - { - // subField.Remove(); - RemoveToken(subField); - } - else - { - if (subField is JProperty property) - { - property.Value.Replace(dataValue.ToJToken()); - } - else - { - subField.Replace(dataValue.ToJToken()); - } - } - break; - } - } - + public DataValue GetFieldValue(string fieldName) { try @@ -112,7 +34,7 @@ public DataValue GetFieldValue(string fieldName) } catch { - return new DataValue(DataValue.DataType.None); + return DataValue.Null; } } diff --git a/src/PatchManager.SassyPatching/Nodes/Indexers/ClassIndexer.cs b/src/PatchManager.SassyPatching/Nodes/Indexers/ClassIndexer.cs deleted file mode 100644 index 3f6752f..0000000 --- a/src/PatchManager.SassyPatching/Nodes/Indexers/ClassIndexer.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace PatchManager.SassyPatching.Nodes.Indexers; - -/// -/// Represents a field indexer that indexes the first sub-value w/ the specified class -/// -public class ClassIndexer : Indexer -{ - /// - /// The class to index by - /// - public readonly string ClassName; - internal ClassIndexer(Coordinate c, string className) : base(c) - { - ClassName = className; - } -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/Nodes/Indexers/ElementIndexer.cs b/src/PatchManager.SassyPatching/Nodes/Indexers/ElementIndexer.cs deleted file mode 100644 index cee636c..0000000 --- a/src/PatchManager.SassyPatching/Nodes/Indexers/ElementIndexer.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PatchManager.SassyPatching.Nodes.Indexers; - -/// -/// Represents a field indexer that indexes by element type -/// -public class ElementIndexer : Indexer -{ - /// - /// The element type to index by - /// - public readonly string ElementName; - - internal ElementIndexer(Coordinate c, string elementName) : base(c) - { - ElementName = elementName; - } -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/Nodes/Indexers/EverythingIndexer.cs b/src/PatchManager.SassyPatching/Nodes/Indexers/EverythingIndexer.cs new file mode 100644 index 0000000..288a2c5 --- /dev/null +++ b/src/PatchManager.SassyPatching/Nodes/Indexers/EverythingIndexer.cs @@ -0,0 +1,3 @@ +namespace PatchManager.SassyPatching.Nodes.Indexers; + +public class EverythingIndexer(Coordinate c) : Indexer(c); \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/Nodes/Indexers/NumberIndexer.cs b/src/PatchManager.SassyPatching/Nodes/Indexers/NumberIndexer.cs deleted file mode 100644 index 78d1a95..0000000 --- a/src/PatchManager.SassyPatching/Nodes/Indexers/NumberIndexer.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace PatchManager.SassyPatching.Nodes.Indexers; - -/// -/// Represents a field indexer that indexes by number -/// -public class NumberIndexer : Indexer -{ - /// - /// The index to index the field by - /// - public readonly ulong Index; - internal NumberIndexer(Coordinate c, ulong index) : base(c) - { - Index = index; - } -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/Nodes/Indexers/SingleIndexer.cs b/src/PatchManager.SassyPatching/Nodes/Indexers/SingleIndexer.cs new file mode 100644 index 0000000..cd36f56 --- /dev/null +++ b/src/PatchManager.SassyPatching/Nodes/Indexers/SingleIndexer.cs @@ -0,0 +1,8 @@ +using PatchManager.SassyPatching.Nodes.Expressions; + +namespace PatchManager.SassyPatching.Nodes.Indexers; + +public class SingleIndexer(Coordinate c, Expression index) : Indexer(c) +{ + public Expression Index => index; +} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/Nodes/Indexers/StringIndexer.cs b/src/PatchManager.SassyPatching/Nodes/Indexers/StringIndexer.cs deleted file mode 100644 index f36f966..0000000 --- a/src/PatchManager.SassyPatching/Nodes/Indexers/StringIndexer.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace PatchManager.SassyPatching.Nodes.Indexers; - -/// -/// Represents a field indexer that indexes by element type (same as ) -/// -public class StringIndexer : Indexer -{ - /// - /// The element type to index by - /// - public readonly string Index; - internal StringIndexer(Coordinate c, string index) : base(c) => Index = index; -} \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/Nodes/Statements/SelectionLevel/Field.cs b/src/PatchManager.SassyPatching/Nodes/Statements/SelectionLevel/Field.cs index 67305e4..22d9f00 100644 --- a/src/PatchManager.SassyPatching/Nodes/Statements/SelectionLevel/Field.cs +++ b/src/PatchManager.SassyPatching/Nodes/Statements/SelectionLevel/Field.cs @@ -19,15 +19,15 @@ public class Field : Node, ISelectionAction /// /// The index into the field, if there is one /// - [CanBeNull] public readonly Indexer Indexer; + public readonly List Indexers; /// /// The value to set the field to /// public readonly Expression FieldValue; - internal Field(Coordinate c, string fieldName, [CanBeNull] Indexer indexer, Expression fieldValue) : base(c) + internal Field(Coordinate c, string fieldName, List indexers, Expression fieldValue) : base(c) { FieldName = fieldName; - Indexer = indexer; + Indexers = indexers; FieldValue = fieldValue; } @@ -44,57 +44,117 @@ public void ExecuteOn(Environment environment, ISelectable selectable, IModifiab throw new InterpreterException(Coordinate, "Attempting to modify an unmodifiable selection"); } - var interpolated = ""; - if (Indexer is StringIndexer si) + var current = modifiable.GetFieldValue(FieldName); + var subEnv = new Environment(environment.GlobalEnvironment, environment); + modifiable.SetFieldValue(FieldName, ComputeValues(subEnv, current)); + } + private DataValue ComputeValues(Environment subEnv, DataValue current, int layer = 0) + { + if (Indexers.Count == layer) { - try - { - interpolated = si.Index.Interpolate(environment); - } - catch (Exception e) + subEnv["value"] = current; + return FieldValue.Compute(subEnv); + } + + var indexer = Indexers[layer]; + switch (indexer) + { + case SingleIndexer singleIndexer: { - throw new InterpolationException(Coordinate, e.Message); + var index = singleIndexer.Index.Compute(subEnv); + if (index.IsInteger) + { + return ComputeIntegerIndex(subEnv, current, layer, index, indexer); + } + + if (index.IsString) + { + return ComputeStringIndex(subEnv, current, layer, index, indexer); + } + + throw new InterpreterException(indexer.Coordinate, + $"Invalid index type {index.Type}, expected Integer or String"); } + case EverythingIndexer everythingIndexer: + return current.Type switch + { + DataValue.DataType.List => current.List.Select(value => ComputeValues(subEnv, value, layer + 1)) + .ToList(), + DataValue.DataType.Dictionary => current.Dictionary + .Select(kv => (kv.Key, ComputeValues(subEnv, kv.Value, layer + 1))) + .ToDictionary(kv => kv.Key, kv => kv.Item2), + DataValue.DataType.None => DataValue.Null, + _ => throw new InterpreterException(everythingIndexer.Coordinate, + $"Attempting to use a `*` indexer on a value of type {current.Type}") + }; + default: + throw new InterpreterException(indexer.Coordinate, $"Unknown indexer type: {indexer.GetType()}"); } - - var value = Indexer switch - { - ElementIndexer elementIndexer => modifiable.GetFieldByElement(FieldName, elementIndexer.ElementName), - StringIndexer stringIndexer => modifiable.GetFieldByElement(FieldName, interpolated), - NumberIndexer numberIndexer => modifiable.GetFieldByNumber(FieldName, numberIndexer.Index), - ClassIndexer classIndexer => modifiable.GetFieldByClass(FieldName, classIndexer.ClassName), - _ => modifiable.GetFieldValue(FieldName) - }; - // Console.WriteLine($"Field value: {value}"); - var subEnvironment = new Environment(environment.GlobalEnvironment, environment) + } + + private DataValue ComputeStringIndex( + Environment subEnv, + DataValue current, + int layer, + DataValue index, + Node indexer + ) + { + // ReSharper disable once SwitchExpressionHandlesSomeKnownEnumValuesWithExceptionInDefault + return current.Type switch { - ["value"] = value + DataValue.DataType.None => new Dictionary + { + [index.String] = ComputeValues(subEnv, DataValue.Null, layer + 1) + }, + DataValue.DataType.Dictionary => new Dictionary(current.Dictionary) + { + [index.String] = ComputeValues(subEnv, + current.Dictionary.TryGetValue(index.String, out var currentValue) + ? currentValue + : DataValue.Null, layer + 1), + }, + _ => throw new InterpreterException(indexer.Coordinate, + $"Attempting to index into a value of type {current.Type} with an indexer that is a String") }; - var result = FieldValue.Compute(subEnvironment); - try + } + + private DataValue ComputeIntegerIndex( + Environment subEnv, + DataValue current, + int layer, + DataValue index, + Node indexer + ) + { + // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault + switch (current.Type) { - switch (Indexer) + case DataValue.DataType.None: { - case ElementIndexer setElementIndexer: - modifiable.SetFieldByElement(FieldName, setElementIndexer.ElementName, result); - return; - case StringIndexer setStringIndexer: - modifiable.SetFieldByElement(FieldName, interpolated, result); - return; - case NumberIndexer setNumberIndexer: - modifiable.SetFieldByNumber(FieldName, setNumberIndexer.Index, result); - return; - case ClassIndexer setClassIndexer: - modifiable.SetFieldByClass(FieldName, setClassIndexer.ClassName, result); - return; - default: - modifiable.SetFieldValue(FieldName, result); - return; + var list = new List(); + for (var i = 0; i < index.Integer; i++) + { + list.Add(DataValue.Null); + } + + list.Add(ComputeValues(subEnv, DataValue.Null, layer + 1)); + return list; } - } - catch (NullReferenceException e) - { - Console.WriteLine("Field does not exist :3"); + case DataValue.DataType.List: + { + var list = new List(current.List); + while (list.Count <= (int)index.Integer) + { + list.Add(DataValue.Null); + } + + list[(int)index.Integer] = ComputeValues(subEnv, list[(int)index.Integer], layer + 1); + return list; + } + default: + throw new InterpreterException(indexer.Coordinate, + $"Attempting to index into a value of type {current.Type} with an indexer that is an Integer"); } } } \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/Nodes/Statements/VariableDeclaration.cs b/src/PatchManager.SassyPatching/Nodes/Statements/VariableDeclaration.cs index 90575eb..ea65cb2 100644 --- a/src/PatchManager.SassyPatching/Nodes/Statements/VariableDeclaration.cs +++ b/src/PatchManager.SassyPatching/Nodes/Statements/VariableDeclaration.cs @@ -1,4 +1,7 @@ -using PatchManager.SassyPatching.Nodes.Expressions; +using JetBrains.Annotations; +using PatchManager.SassyPatching.Exceptions; +using PatchManager.SassyPatching.Nodes.Expressions; +using PatchManager.SassyPatching.Nodes.Indexers; using Environment = PatchManager.SassyPatching.Execution.Environment; namespace PatchManager.SassyPatching.Nodes.Statements; @@ -7,19 +10,27 @@ namespace PatchManager.SassyPatching.Nodes.Statements; /// Represents a variable declaration /// public class VariableDeclaration : Node -{ +{ /// /// The name of the variable being declared /// public readonly string Variable; + + /// + /// The list of indexers for list creation/indexing + /// + public readonly List Indexers; + /// /// The value being assigned to the variable /// public readonly Expression Value; - internal VariableDeclaration(Coordinate c, string variable, Expression value) : base(c) + + internal VariableDeclaration(Coordinate c, string variable, List indexers, Expression value) : base(c) { Variable = variable; + Indexers = indexers; Value = value; } @@ -27,14 +38,127 @@ internal VariableDeclaration(Coordinate c, string variable, Expression value) : public override void ExecuteIn(Environment environment) { var subEnv = new Environment(environment.GlobalEnvironment, environment); + var current = DataValue.Null; try { - subEnv["value"] = environment[Variable]; + current = environment[Variable]; } catch { - // ignored + // Ignored + } + + var result = ComputeValues(subEnv, current); + environment[Variable] = result; + } + + private DataValue ComputeValues(Environment subEnv, DataValue current, int layer = 0) + { + if (Indexers.Count == layer) + { + subEnv["value"] = current; + return Value.Compute(subEnv); + } + + var indexer = Indexers[layer]; + switch (indexer) + { + case SingleIndexer singleIndexer: + { + var index = singleIndexer.Index.Compute(subEnv); + if (index.IsInteger) + { + return ComputeIntegerIndex(subEnv, current, layer, index, indexer); + } + + if (index.IsString) + { + return ComputeStringIndex(subEnv, current, layer, index, indexer); + } + + throw new InterpreterException(indexer.Coordinate, + $"Invalid index type {index.Type}, expected Integer or String"); + } + case EverythingIndexer everythingIndexer: + return current.Type switch + { + DataValue.DataType.List => current.List.Select(value => ComputeValues(subEnv, value, layer + 1)) + .ToList(), + DataValue.DataType.Dictionary => current.Dictionary + .Select(kv => (kv.Key, ComputeValues(subEnv, kv.Value, layer + 1))) + .ToDictionary(kv => kv.Key, kv => kv.Item2), + DataValue.DataType.None => DataValue.Null, + _ => throw new InterpreterException(everythingIndexer.Coordinate, + $"Attempting to use a `*` indexer on a value of type {current.Type}") + }; + default: + throw new InterpreterException(indexer.Coordinate, $"Unknown indexer type: {indexer.GetType()}"); + } + } + + private DataValue ComputeStringIndex( + Environment subEnv, + DataValue current, + int layer, + DataValue index, + Node indexer + ) + { + // ReSharper disable once SwitchExpressionHandlesSomeKnownEnumValuesWithExceptionInDefault + return current.Type switch + { + DataValue.DataType.None => new Dictionary + { + [index.String] = ComputeValues(subEnv, DataValue.Null, layer + 1) + }, + DataValue.DataType.Dictionary => new Dictionary(current.Dictionary) + { + [index.String] = ComputeValues(subEnv, + current.Dictionary.TryGetValue(index.String, out var currentValue) + ? currentValue + : DataValue.Null, layer + 1), + }, + _ => throw new InterpreterException(indexer.Coordinate, + $"Attempting to index into a value of type {current.Type} with an indexer that is a String") + }; + } + + private DataValue ComputeIntegerIndex( + Environment subEnv, + DataValue current, + int layer, + DataValue index, + Node indexer + ) + { + // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault + switch (current.Type) + { + case DataValue.DataType.None: + { + var list = new List(); + for (var i = 0; i < index.Integer; i++) + { + list.Add(DataValue.Null); + } + + list.Add(ComputeValues(subEnv, DataValue.Null, layer + 1)); + return list; + } + case DataValue.DataType.List: + { + var list = new List(current.List); + while (list.Count <= (int)index.Integer) + { + list.Add(DataValue.Null); + } + + list[(int)index.Integer] = ComputeValues(subEnv, list[(int)index.Integer], layer + 1); + return list; + } + default: + throw new InterpreterException(indexer.Coordinate, + $"Attempting to index into a value of type {current.Type} with an indexer that is an Integer"); } - environment[Variable] = Value.Compute(subEnv); } } \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.cs b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.cs index 925bfab..2dbd170 100644 --- a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.cs +++ b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.cs @@ -1,14 +1,14 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// ANTLR Version: 4.12.0 +// ANTLR Version: 4.13.1 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar\sassy_parser.g4 by ANTLR 4.12.0 +// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 by ANTLR 4.13.1 // Unreachable code detected #pragma warning disable 0162 @@ -31,7 +31,7 @@ namespace SassyPatchGrammar { using Antlr4.Runtime.Tree; using DFA = Antlr4.Runtime.Dfa.DFA; -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.12.0")] +[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.13.1")] [System.CLSCompliant(false)] public partial class sassy_parser : Parser { protected static DFA[] decisionToDFA; @@ -695,6 +695,7 @@ public virtual void CopyFrom(Var_declContext context) { } public partial class Add_var_declContext : Var_declContext { public IToken variable; + public IndexContext indexor; public ExpressionContext val; [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode PLUS_COLON() { return GetToken(sassy_parser.PLUS_COLON, 0); } [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SEMICOLON() { return GetToken(sassy_parser.SEMICOLON, 0); } @@ -702,6 +703,12 @@ public partial class Add_var_declContext : Var_declContext { [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); + } public Add_var_declContext(Var_declContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { @@ -722,6 +729,7 @@ public override TResult Accept(IParseTreeVisitor visitor) { } public partial class Divide_var_declContext : Var_declContext { public IToken variable; + public IndexContext indexor; public ExpressionContext val; [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode DIVIDE_COLON() { return GetToken(sassy_parser.DIVIDE_COLON, 0); } [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SEMICOLON() { return GetToken(sassy_parser.SEMICOLON, 0); } @@ -729,6 +737,12 @@ public partial class Divide_var_declContext : Var_declContext { [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); + } public Divide_var_declContext(Var_declContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { @@ -749,6 +763,7 @@ public override TResult Accept(IParseTreeVisitor visitor) { } public partial class Multiply_var_declContext : Var_declContext { public IToken variable; + public IndexContext indexor; public ExpressionContext val; [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode MULTIPLY_COLON() { return GetToken(sassy_parser.MULTIPLY_COLON, 0); } [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SEMICOLON() { return GetToken(sassy_parser.SEMICOLON, 0); } @@ -756,6 +771,12 @@ public partial class Multiply_var_declContext : Var_declContext { [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); + } public Multiply_var_declContext(Var_declContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { @@ -776,6 +797,7 @@ public override TResult Accept(IParseTreeVisitor visitor) { } public partial class Normal_var_declContext : Var_declContext { public IToken variable; + public IndexContext indexor; public ExpressionContext val; [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode COLON() { return GetToken(sassy_parser.COLON, 0); } [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SEMICOLON() { return GetToken(sassy_parser.SEMICOLON, 0); } @@ -783,6 +805,12 @@ public partial class Normal_var_declContext : Var_declContext { [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); + } public Normal_var_declContext(Var_declContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { @@ -803,6 +831,7 @@ public override TResult Accept(IParseTreeVisitor visitor) { } public partial class Subtract_var_declContext : Var_declContext { public IToken variable; + public IndexContext indexor; public ExpressionContext val; [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode MINUS_COLON() { return GetToken(sassy_parser.MINUS_COLON, 0); } [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SEMICOLON() { return GetToken(sassy_parser.SEMICOLON, 0); } @@ -810,6 +839,12 @@ public partial class Subtract_var_declContext : Var_declContext { [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); + } public Subtract_var_declContext(Var_declContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { @@ -833,21 +868,36 @@ public override TResult Accept(IParseTreeVisitor visitor) { public Var_declContext var_decl() { Var_declContext _localctx = new Var_declContext(Context, State); EnterRule(_localctx, 12, RULE_var_decl); + int _la; try { - State = 193; + State = 223; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,4,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,9,Context) ) { case 1: _localctx = new Normal_var_declContext(_localctx); EnterOuterAlt(_localctx, 1); { State = 168; ((Normal_var_declContext)_localctx).variable = Match(VARIABLE); - State = 169; + State = 172; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + while (_la==LEFT_BRACKET) { + { + { + State = 169; + ((Normal_var_declContext)_localctx).indexor = index(); + } + } + State = 174; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + } + State = 175; Match(COLON); - State = 170; + State = 176; ((Normal_var_declContext)_localctx).val = expression(0); - State = 171; + State = 177; Match(SEMICOLON); } break; @@ -855,13 +905,27 @@ public Var_declContext var_decl() { _localctx = new Add_var_declContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 173; + State = 179; ((Add_var_declContext)_localctx).variable = Match(VARIABLE); - State = 174; + State = 183; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + while (_la==LEFT_BRACKET) { + { + { + State = 180; + ((Add_var_declContext)_localctx).indexor = index(); + } + } + State = 185; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + } + State = 186; Match(PLUS_COLON); - State = 175; + State = 187; ((Add_var_declContext)_localctx).val = expression(0); - State = 176; + State = 188; Match(SEMICOLON); } break; @@ -869,13 +933,27 @@ public Var_declContext var_decl() { _localctx = new Subtract_var_declContext(_localctx); EnterOuterAlt(_localctx, 3); { - State = 178; + State = 190; ((Subtract_var_declContext)_localctx).variable = Match(VARIABLE); - State = 179; + State = 194; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + while (_la==LEFT_BRACKET) { + { + { + State = 191; + ((Subtract_var_declContext)_localctx).indexor = index(); + } + } + State = 196; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + } + State = 197; Match(MINUS_COLON); - State = 180; + State = 198; ((Subtract_var_declContext)_localctx).val = expression(0); - State = 181; + State = 199; Match(SEMICOLON); } break; @@ -883,13 +961,27 @@ public Var_declContext var_decl() { _localctx = new Divide_var_declContext(_localctx); EnterOuterAlt(_localctx, 4); { - State = 183; + State = 201; ((Divide_var_declContext)_localctx).variable = Match(VARIABLE); - State = 184; + State = 205; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + while (_la==LEFT_BRACKET) { + { + { + State = 202; + ((Divide_var_declContext)_localctx).indexor = index(); + } + } + State = 207; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + } + State = 208; Match(DIVIDE_COLON); - State = 185; + State = 209; ((Divide_var_declContext)_localctx).val = expression(0); - State = 186; + State = 210; Match(SEMICOLON); } break; @@ -897,13 +989,27 @@ public Var_declContext var_decl() { _localctx = new Multiply_var_declContext(_localctx); EnterOuterAlt(_localctx, 5); { - State = 188; + State = 212; ((Multiply_var_declContext)_localctx).variable = Match(VARIABLE); - State = 189; + State = 216; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + while (_la==LEFT_BRACKET) { + { + { + State = 213; + ((Multiply_var_declContext)_localctx).indexor = index(); + } + } + State = 218; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); + } + State = 219; Match(MULTIPLY_COLON); - State = 190; + State = 220; ((Multiply_var_declContext)_localctx).val = expression(0); - State = 191; + State = 221; Match(SEMICOLON); } break; @@ -1026,18 +1132,18 @@ public Stage_defContext stage_def() { EnterRule(_localctx, 14, RULE_stage_def); int _la; try { - State = 218; + State = 248; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,6,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,11,Context) ) { case 1: _localctx = new Implicit_stage_defContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 195; + State = 225; Match(DEFINE_STAGE); - State = 196; + State = 226; ((Implicit_stage_defContext)_localctx).stage = sassy_string(); - State = 197; + State = 227; Match(SEMICOLON); } break; @@ -1045,15 +1151,15 @@ public Stage_defContext stage_def() { _localctx = new Global_stage_defContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 199; + State = 229; Match(DEFINE_STAGE); - State = 200; + State = 230; ((Global_stage_defContext)_localctx).stage = sassy_string(); - State = 201; + State = 231; Match(COLON); - State = 202; + State = 232; Match(GLOBAL); - State = 203; + State = 233; Match(SEMICOLON); } break; @@ -1061,31 +1167,31 @@ public Stage_defContext stage_def() { _localctx = new Relative_stage_defContext(_localctx); EnterOuterAlt(_localctx, 3); { - State = 205; + State = 235; Match(DEFINE_STAGE); - State = 206; + State = 236; ((Relative_stage_defContext)_localctx).stage = sassy_string(); - State = 207; + State = 237; Match(COLON); - State = 208; + State = 238; Match(LEFT_BRACE); - State = 212; + State = 242; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==BEFORE || _la==AFTER) { { { - State = 209; + State = 239; ((Relative_stage_defContext)_localctx).attributes = stage_attribute(); } } - State = 214; + State = 244; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 215; + State = 245; Match(RIGHT_BRACE); - State = 216; + State = 246; Match(SEMICOLON); } break; @@ -1149,19 +1255,19 @@ public Config_creationContext config_creation() { try { EnterOuterAlt(_localctx, 1); { - State = 220; + State = 250; Match(CREATE_CONFIG); - State = 221; + State = 251; _localctx.label = sassy_string(); - State = 222; + State = 252; Match(COMMA); - State = 223; + State = 253; _localctx.config_name = sassy_string(); - State = 224; + State = 254; Match(COLON); - State = 225; + State = 255; _localctx.config_value = expression(0); - State = 226; + State = 256; Match(SEMICOLON); } } @@ -1271,30 +1377,30 @@ public Config_mutationContext config_mutation() { Config_mutationContext _localctx = new Config_mutationContext(Context, State); EnterRule(_localctx, 18, RULE_config_mutation); try { - State = 246; + State = 276; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,7,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,12,Context) ) { case 1: _localctx = new Update_config_fullContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 228; + State = 258; Match(UPDATE_CONFIG); - State = 229; + State = 259; ((Update_config_fullContext)_localctx).priority = expression(0); - State = 230; + State = 260; Match(COMMA); - State = 231; + State = 261; ((Update_config_fullContext)_localctx).label = sassy_string(); - State = 232; + State = 262; Match(COMMA); - State = 233; + State = 263; ((Update_config_fullContext)_localctx).config_name = sassy_string(); - State = 234; + State = 264; Match(COLON); - State = 235; + State = 265; ((Update_config_fullContext)_localctx).config_update = expression(0); - State = 236; + State = 266; Match(SEMICOLON); } break; @@ -1302,19 +1408,19 @@ public Config_mutationContext config_mutation() { _localctx = new Update_config_labelContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 238; + State = 268; Match(UPDATE_CONFIG); - State = 239; + State = 269; ((Update_config_labelContext)_localctx).priority = expression(0); - State = 240; + State = 270; Match(COMMA); - State = 241; + State = 271; ((Update_config_labelContext)_localctx).label = sassy_string(); - State = 242; + State = 272; Match(COLON); - State = 243; + State = 273; ((Update_config_labelContext)_localctx).config_update = expression(0); - State = 244; + State = 274; Match(SEMICOLON); } break; @@ -1399,18 +1505,18 @@ public Stage_attributeContext stage_attribute() { Stage_attributeContext _localctx = new Stage_attributeContext(Context, State); EnterRule(_localctx, 20, RULE_stage_attribute); try { - State = 256; + State = 286; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case BEFORE: _localctx = new Stage_value_beforeContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 248; + State = 278; Match(BEFORE); - State = 249; + State = 279; ((Stage_value_beforeContext)_localctx).stage = sassy_string(); - State = 250; + State = 280; Match(SEMICOLON); } break; @@ -1418,11 +1524,11 @@ public Stage_attributeContext stage_attribute() { _localctx = new Stage_value_afterContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 252; + State = 282; Match(AFTER); - State = 253; + State = 283; ((Stage_value_afterContext)_localctx).stage = sassy_string(); - State = 254; + State = 284; Match(SEMICOLON); } break; @@ -1487,21 +1593,21 @@ public Function_defContext function_def() { try { EnterOuterAlt(_localctx, 1); { - State = 258; + State = 288; Match(FUNCTION); - State = 259; + State = 289; _localctx.name = Match(ELEMENT); - State = 260; + State = 290; Match(LEFT_PAREN); - State = 261; + State = 291; _localctx.args = arg_decl_list(); - State = 262; + State = 292; Match(RIGHT_PAREN); - State = 263; + State = 293; Match(LEFT_BRACE); - State = 264; + State = 294; _localctx.body = function_body(); - State = 265; + State = 295; Match(RIGHT_BRACE); } } @@ -1562,21 +1668,21 @@ public Mixin_defContext mixin_def() { try { EnterOuterAlt(_localctx, 1); { - State = 267; + State = 297; Match(MIXIN); - State = 268; + State = 298; _localctx.name = Match(ELEMENT); - State = 269; + State = 299; Match(LEFT_PAREN); - State = 270; + State = 300; _localctx.args = arg_decl_list(); - State = 271; + State = 301; Match(RIGHT_PAREN); - State = 272; + State = 302; Match(LEFT_BRACE); - State = 273; + State = 303; _localctx.body = selector_body(); - State = 274; + State = 304; Match(RIGHT_BRACE); } } @@ -1641,34 +1747,34 @@ public Top_level_conditionalContext top_level_conditional() { try { EnterOuterAlt(_localctx, 1); { - State = 276; + State = 306; Match(PRE_IF); - State = 277; + State = 307; _localctx.cond = expression(0); - State = 278; + State = 308; Match(LEFT_BRACE); - State = 282; + State = 312; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737895827256L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7805L) != 0)) { { { - State = 279; + State = 309; _localctx.body = top_level_statement(); } } - State = 284; + State = 314; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 285; + State = 315; Match(RIGHT_BRACE); - State = 287; + State = 317; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==PRE_ELSE || _la==PRE_ELSE_IF) { { - State = 286; + State = 316; _localctx.els = top_level_else(); } } @@ -1721,20 +1827,20 @@ public Top_level_elseContext top_level_else() { Top_level_elseContext _localctx = new Top_level_elseContext(Context, State); EnterRule(_localctx, 28, RULE_top_level_else); try { - State = 291; + State = 321; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case PRE_ELSE: EnterOuterAlt(_localctx, 1); { - State = 289; + State = 319; top_level_else_else(); } break; case PRE_ELSE_IF: EnterOuterAlt(_localctx, 2); { - State = 290; + State = 320; top_level_else_if(); } break; @@ -1795,25 +1901,25 @@ public Top_level_else_elseContext top_level_else_else() { try { EnterOuterAlt(_localctx, 1); { - State = 293; + State = 323; Match(PRE_ELSE); - State = 294; + State = 324; Match(LEFT_BRACE); - State = 298; + State = 328; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737895827256L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7805L) != 0)) { { { - State = 295; + State = 325; _localctx.body = top_level_statement(); } } - State = 300; + State = 330; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 301; + State = 331; Match(RIGHT_BRACE); } } @@ -1878,34 +1984,34 @@ public Top_level_else_ifContext top_level_else_if() { try { EnterOuterAlt(_localctx, 1); { - State = 303; + State = 333; Match(PRE_ELSE_IF); - State = 304; + State = 334; _localctx.cond = expression(0); - State = 305; + State = 335; Match(LEFT_BRACE); - State = 309; + State = 339; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737895827256L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7805L) != 0)) { { { - State = 306; + State = 336; _localctx.body = top_level_statement(); } } - State = 311; + State = 341; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 312; + State = 342; Match(RIGHT_BRACE); - State = 314; + State = 344; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==PRE_ELSE || _la==PRE_ELSE_IF) { { - State = 313; + State = 343; _localctx.els = top_level_else(); } } @@ -1962,13 +2068,13 @@ public Selection_blockContext selection_block() { try { EnterOuterAlt(_localctx, 1); { - State = 316; + State = 346; attributed_selector(); - State = 317; + State = 347; Match(LEFT_BRACE); - State = 318; + State = 348; selector_body(); - State = 319; + State = 349; Match(RIGHT_BRACE); } } @@ -2025,21 +2131,21 @@ public Attributed_selectorContext attributed_selector() { try { EnterOuterAlt(_localctx, 1); { - State = 324; + State = 354; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 17563648L) != 0)) { { { - State = 321; + State = 351; _localctx.attributes = attribute(); } } - State = 326; + State = 356; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 327; + State = 357; selector(0); } } @@ -2143,16 +2249,16 @@ public AttributeContext attribute() { AttributeContext _localctx = new AttributeContext(Context, State); EnterRule(_localctx, 38, RULE_attribute); try { - State = 335; + State = 365; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case REQUIRE: _localctx = new Require_modContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 329; + State = 359; Match(REQUIRE); - State = 330; + State = 360; ((Require_modContext)_localctx).expr = require_expression(0); } break; @@ -2160,9 +2266,9 @@ public AttributeContext attribute() { _localctx = new Run_at_stageContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 331; + State = 361; Match(STAGE); - State = 332; + State = 362; ((Run_at_stageContext)_localctx).stage = sassy_string(); } break; @@ -2170,9 +2276,9 @@ public AttributeContext attribute() { _localctx = new New_assetContext(_localctx); EnterOuterAlt(_localctx, 3); { - State = 333; + State = 363; Match(NEW); - State = 334; + State = 364; constructor_arguments(); } break; @@ -2235,35 +2341,35 @@ public Constructor_argumentsContext constructor_arguments() { try { EnterOuterAlt(_localctx, 1); { - State = 337; + State = 367; Match(LEFT_PAREN); - State = 346; + State = 376; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 8070758418052284432L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & 9095L) != 0)) { { - State = 338; + State = 368; expression(0); - State = 343; + State = 373; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==COMMA) { { { - State = 339; + State = 369; Match(COMMA); - State = 340; + State = 370; expression(0); } } - State = 345; + State = 375; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } } } - State = 348; + State = 378; Match(RIGHT_PAREN); } } @@ -2808,16 +2914,16 @@ private SelectorContext selector(int _p) { int _alt; EnterOuterAlt(_localctx, 1); { - State = 397; + State = 427; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,21,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,26,Context) ) { case 1: { _localctx = new Sel_elementContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 351; + State = 381; Match(ELEMENT); } break; @@ -2826,7 +2932,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_element_stringContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 352; + State = 382; Match(STRING); } break; @@ -2835,7 +2941,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_classContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 353; + State = 383; Match(CLASS); } break; @@ -2844,7 +2950,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_string_classContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 354; + State = 384; Match(STRING_CLASS); } break; @@ -2853,27 +2959,27 @@ private SelectorContext selector(int _p) { _localctx = new Sel_class_captureContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 355; + State = 385; Match(CLASS); - State = 356; + State = 386; Match(COLON); - State = 357; + State = 387; Match(LEFT_BRACKET); - State = 361; + State = 391; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 358; + State = 388; ((Sel_class_captureContext)_localctx).body = function_statement(); } } - State = 363; + State = 393; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 364; + State = 394; Match(RIGHT_BRACKET); } break; @@ -2882,27 +2988,27 @@ private SelectorContext selector(int _p) { _localctx = new Sel_string_class_captureContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 365; + State = 395; Match(STRING_CLASS); - State = 366; + State = 396; Match(COLON); - State = 367; + State = 397; Match(LEFT_BRACKET); - State = 371; + State = 401; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 368; + State = 398; ((Sel_string_class_captureContext)_localctx).body = function_statement(); } } - State = 373; + State = 403; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 374; + State = 404; Match(RIGHT_BRACKET); } break; @@ -2911,7 +3017,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_nameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 375; + State = 405; Match(NAME); } break; @@ -2920,7 +3026,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_string_nameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 376; + State = 406; Match(STRING_NAME); } break; @@ -2929,7 +3035,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_rulesetContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 377; + State = 407; Match(RULESET); } break; @@ -2938,7 +3044,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_ensureContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 378; + State = 408; Match(ENSURE); } break; @@ -2947,7 +3053,7 @@ private SelectorContext selector(int _p) { _localctx = new Sel_string_ensureContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 379; + State = 409; Match(STRING_ENSURE); } break; @@ -2956,11 +3062,11 @@ private SelectorContext selector(int _p) { _localctx = new Sel_subContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 380; + State = 410; Match(LEFT_PAREN); - State = 381; + State = 411; ((Sel_subContext)_localctx).internal_selector = selector(0); - State = 382; + State = 412; Match(RIGHT_PAREN); } break; @@ -2969,9 +3075,9 @@ private SelectorContext selector(int _p) { _localctx = new Sel_add_elementContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 384; + State = 414; Match(ADD); - State = 385; + State = 415; ((Sel_add_elementContext)_localctx).element = Match(ELEMENT); } break; @@ -2980,9 +3086,9 @@ private SelectorContext selector(int _p) { _localctx = new Sel_add_string_elementContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 386; + State = 416; Match(ADD); - State = 387; + State = 417; ((Sel_add_string_elementContext)_localctx).str_element = Match(STRING); } break; @@ -2991,9 +3097,9 @@ private SelectorContext selector(int _p) { _localctx = new Sel_without_classContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 388; + State = 418; Match(WITHOUT); - State = 389; + State = 419; ((Sel_without_classContext)_localctx).field = Match(CLASS); } break; @@ -3002,9 +3108,9 @@ private SelectorContext selector(int _p) { _localctx = new Sel_without_string_classContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 390; + State = 420; Match(WITHOUT); - State = 391; + State = 421; ((Sel_without_string_classContext)_localctx).str_field = Match(STRING_CLASS); } break; @@ -3013,9 +3119,9 @@ private SelectorContext selector(int _p) { _localctx = new Sel_without_nameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 392; + State = 422; Match(WITHOUT); - State = 393; + State = 423; ((Sel_without_nameContext)_localctx).name = Match(NAME); } break; @@ -3024,9 +3130,9 @@ private SelectorContext selector(int _p) { _localctx = new Sel_without_string_nameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 394; + State = 424; Match(WITHOUT); - State = 395; + State = 425; ((Sel_without_string_nameContext)_localctx).str_name = Match(STRING_NAME); } break; @@ -3035,34 +3141,34 @@ private SelectorContext selector(int _p) { _localctx = new Sel_everythingContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 396; + State = 426; Match(MULTIPLY); } break; } Context.Stop = TokenStream.LT(-1); - State = 409; + State = 439; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,23,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,28,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( ParseListeners!=null ) TriggerExitRuleEvent(); _prevctx = _localctx; { - State = 407; + State = 437; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,22,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,27,Context) ) { case 1: { _localctx = new Sel_combinationContext(new SelectorContext(_parentctx, _parentState)); ((Sel_combinationContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_selector); - State = 399; + State = 429; if (!(Precpred(Context, 10))) throw new FailedPredicateException(this, "Precpred(Context, 10)"); - State = 400; + State = 430; Match(COMMA); - State = 401; + State = 431; ((Sel_combinationContext)_localctx).rhs = selector_no_children(0); } break; @@ -3071,11 +3177,11 @@ private SelectorContext selector(int _p) { _localctx = new Sel_childContext(new SelectorContext(_parentctx, _parentState)); ((Sel_childContext)_localctx).parent = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_selector); - State = 402; + State = 432; if (!(Precpred(Context, 9))) throw new FailedPredicateException(this, "Precpred(Context, 9)"); - State = 403; + State = 433; Match(GREATER_THAN); - State = 404; + State = 434; ((Sel_childContext)_localctx).child = selector_no_children(0); } break; @@ -3084,18 +3190,18 @@ private SelectorContext selector(int _p) { _localctx = new Sel_intersectionContext(new SelectorContext(_parentctx, _parentState)); ((Sel_intersectionContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_selector); - State = 405; + State = 435; if (!(Precpred(Context, 8))) throw new FailedPredicateException(this, "Precpred(Context, 8)"); - State = 406; + State = 436; ((Sel_intersectionContext)_localctx).rhs = selector_no_children(0); } break; } } } - State = 411; + State = 441; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,23,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,28,Context); } } } @@ -3572,16 +3678,16 @@ private Selector_no_childrenContext selector_no_children(int _p) { int _alt; EnterOuterAlt(_localctx, 1); { - State = 457; + State = 487; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,26,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,31,Context) ) { case 1: { _localctx = new ElementContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 413; + State = 443; Match(ELEMENT); } break; @@ -3590,7 +3696,7 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new String_elementContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 414; + State = 444; Match(STRING); } break; @@ -3599,7 +3705,7 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Class_selectorContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 415; + State = 445; Match(CLASS); } break; @@ -3608,7 +3714,7 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new String_class_selectorContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 416; + State = 446; Match(STRING_CLASS); } break; @@ -3617,27 +3723,27 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Class_capture_selectorContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 417; + State = 447; Match(CLASS); - State = 418; + State = 448; Match(COLON); - State = 419; + State = 449; Match(LEFT_BRACKET); - State = 423; + State = 453; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 420; + State = 450; ((Class_capture_selectorContext)_localctx).body = function_statement(); } } - State = 425; + State = 455; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 426; + State = 456; Match(RIGHT_BRACKET); } break; @@ -3646,27 +3752,27 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new String_class_capture_selectorContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 427; + State = 457; Match(STRING_CLASS); - State = 428; + State = 458; Match(COLON); - State = 429; + State = 459; Match(LEFT_BRACKET); - State = 433; + State = 463; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 430; + State = 460; ((String_class_capture_selectorContext)_localctx).body = function_statement(); } } - State = 435; + State = 465; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 436; + State = 466; Match(RIGHT_BRACKET); } break; @@ -3675,7 +3781,7 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new NameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 437; + State = 467; Match(NAME); } break; @@ -3684,7 +3790,7 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new String_nameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 438; + State = 468; Match(STRING_NAME); } break; @@ -3693,7 +3799,7 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Ruleset_selectorContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 439; + State = 469; Match(RULESET); } break; @@ -3702,11 +3808,11 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Sub_selectorContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 440; + State = 470; Match(LEFT_PAREN); - State = 441; + State = 471; ((Sub_selectorContext)_localctx).internal_selector = selector_no_children(0); - State = 442; + State = 472; Match(RIGHT_PAREN); } break; @@ -3715,9 +3821,9 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Add_elementContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 444; + State = 474; Match(ADD); - State = 445; + State = 475; ((Add_elementContext)_localctx).element = Match(ELEMENT); } break; @@ -3726,9 +3832,9 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Add_string_elementContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 446; + State = 476; Match(ADD); - State = 447; + State = 477; ((Add_string_elementContext)_localctx).str_element = Match(STRING); } break; @@ -3737,9 +3843,9 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Without_classContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 448; + State = 478; Match(WITHOUT); - State = 449; + State = 479; ((Without_classContext)_localctx).field = Match(CLASS); } break; @@ -3748,9 +3854,9 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Without_string_classContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 450; + State = 480; Match(WITHOUT); - State = 451; + State = 481; ((Without_string_classContext)_localctx).str_field = Match(STRING_CLASS); } break; @@ -3759,9 +3865,9 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Without_nameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 452; + State = 482; Match(WITHOUT); - State = 453; + State = 483; ((Without_nameContext)_localctx).name = Match(NAME); } break; @@ -3770,9 +3876,9 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Without_string_nameContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 454; + State = 484; Match(WITHOUT); - State = 455; + State = 485; ((Without_string_nameContext)_localctx).str_name = Match(STRING_NAME); } break; @@ -3781,34 +3887,34 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new EverythingContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 456; + State = 486; Match(MULTIPLY); } break; } Context.Stop = TokenStream.LT(-1); - State = 466; + State = 496; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,28,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,33,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( ParseListeners!=null ) TriggerExitRuleEvent(); _prevctx = _localctx; { - State = 464; + State = 494; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,27,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,32,Context) ) { case 1: { _localctx = new Combination_selectorContext(new Selector_no_childrenContext(_parentctx, _parentState)); ((Combination_selectorContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_selector_no_children); - State = 459; + State = 489; if (!(Precpred(Context, 9))) throw new FailedPredicateException(this, "Precpred(Context, 9)"); - State = 460; + State = 490; Match(COMMA); - State = 461; + State = 491; ((Combination_selectorContext)_localctx).rhs = selector_no_children(10); } break; @@ -3817,18 +3923,18 @@ private Selector_no_childrenContext selector_no_children(int _p) { _localctx = new Intersection_selectorContext(new Selector_no_childrenContext(_parentctx, _parentState)); ((Intersection_selectorContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_selector_no_children); - State = 462; + State = 492; if (!(Precpred(Context, 8))) throw new FailedPredicateException(this, "Precpred(Context, 8)"); - State = 463; + State = 493; ((Intersection_selectorContext)_localctx).rhs = selector_no_children(9); } break; } } } - State = 468; + State = 498; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,28,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,33,Context); } } } @@ -3881,17 +3987,17 @@ public Selector_bodyContext selector_body() { try { EnterOuterAlt(_localctx, 1); { - State = 472; + State = 502; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 469; + State = 499; selector_statement(); } } - State = 474; + State = 504; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -3970,83 +4076,83 @@ public Selector_statementContext selector_statement() { Selector_statementContext _localctx = new Selector_statementContext(Context, State); EnterRule(_localctx, 48, RULE_selector_statement); try { - State = 486; + State = 516; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,30,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,35,Context) ) { case 1: EnterOuterAlt(_localctx, 1); { - State = 475; + State = 505; var_decl(); } break; case 2: EnterOuterAlt(_localctx, 2); { - State = 476; + State = 506; sel_level_conditional(); } break; case 3: EnterOuterAlt(_localctx, 3); { - State = 477; + State = 507; sel_level_each_loop(); } break; case 4: EnterOuterAlt(_localctx, 4); { - State = 478; + State = 508; sel_level_while_loop(); } break; case 5: EnterOuterAlt(_localctx, 5); { - State = 479; + State = 509; sel_level_for_loop(); } break; case 6: EnterOuterAlt(_localctx, 6); { - State = 480; + State = 510; set_value(); } break; case 7: EnterOuterAlt(_localctx, 7); { - State = 481; + State = 511; delete_value(); } break; case 8: EnterOuterAlt(_localctx, 8); { - State = 482; + State = 512; merge_value(); } break; case 9: EnterOuterAlt(_localctx, 9); { - State = 483; + State = 513; field_set(); } break; case 10: EnterOuterAlt(_localctx, 10); { - State = 484; + State = 514; selection_block(); } break; case 11: EnterOuterAlt(_localctx, 11); { - State = 485; + State = 515; mixin_include(); } break; @@ -4113,34 +4219,34 @@ public Sel_level_conditionalContext sel_level_conditional() { try { EnterOuterAlt(_localctx, 1); { - State = 488; + State = 518; Match(PRE_IF); - State = 489; + State = 519; _localctx.cond = expression(0); - State = 490; + State = 520; Match(LEFT_BRACE); - State = 494; + State = 524; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 491; + State = 521; _localctx.body = selector_statement(); } } - State = 496; + State = 526; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 497; + State = 527; Match(RIGHT_BRACE); - State = 499; + State = 529; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==PRE_ELSE || _la==PRE_ELSE_IF) { { - State = 498; + State = 528; _localctx.els = sel_level_else(); } } @@ -4193,20 +4299,20 @@ public Sel_level_elseContext sel_level_else() { Sel_level_elseContext _localctx = new Sel_level_elseContext(Context, State); EnterRule(_localctx, 52, RULE_sel_level_else); try { - State = 503; + State = 533; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case PRE_ELSE: EnterOuterAlt(_localctx, 1); { - State = 501; + State = 531; sel_level_else_else(); } break; case PRE_ELSE_IF: EnterOuterAlt(_localctx, 2); { - State = 502; + State = 532; sel_level_else_if(); } break; @@ -4267,25 +4373,25 @@ public Sel_level_else_elseContext sel_level_else_else() { try { EnterOuterAlt(_localctx, 1); { - State = 505; + State = 535; Match(PRE_ELSE); - State = 506; + State = 536; Match(LEFT_BRACE); - State = 510; + State = 540; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 507; + State = 537; _localctx.body = selector_statement(); } } - State = 512; + State = 542; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 513; + State = 543; Match(RIGHT_BRACE); } } @@ -4350,34 +4456,34 @@ public Sel_level_else_ifContext sel_level_else_if() { try { EnterOuterAlt(_localctx, 1); { - State = 515; + State = 545; Match(PRE_ELSE_IF); - State = 516; + State = 546; _localctx.cond = expression(0); - State = 517; + State = 547; Match(LEFT_BRACE); - State = 521; + State = 551; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 518; + State = 548; _localctx.body = selector_statement(); } } - State = 523; + State = 553; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 524; + State = 554; Match(RIGHT_BRACE); - State = 526; + State = 556; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==PRE_ELSE || _la==PRE_ELSE_IF) { { - State = 525; + State = 555; _localctx.els = sel_level_else(); } } @@ -4432,11 +4538,11 @@ public Set_valueContext set_value() { try { EnterOuterAlt(_localctx, 1); { - State = 528; + State = 558; Match(SET); - State = 529; + State = 559; _localctx.expr = expression(0); - State = 530; + State = 560; Match(SEMICOLON); } } @@ -4484,9 +4590,9 @@ public Delete_valueContext delete_value() { try { EnterOuterAlt(_localctx, 1); { - State = 532; + State = 562; Match(DELETE); - State = 533; + State = 563; Match(SEMICOLON); } } @@ -4538,11 +4644,11 @@ public Merge_valueContext merge_value() { try { EnterOuterAlt(_localctx, 1); { - State = 535; + State = 565; Match(MERGE); - State = 536; + State = 566; _localctx.expr = expression(0); - State = 537; + State = 567; Match(SEMICOLON); } } @@ -4580,8 +4686,11 @@ [System.Diagnostics.DebuggerNonUserCode] public Sassy_stringContext sassy_string [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } - [System.Diagnostics.DebuggerNonUserCode] public IndexContext index() { - return GetRuleContext(0); + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); } public Add_field_setContext(Field_setContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] @@ -4612,8 +4721,11 @@ [System.Diagnostics.DebuggerNonUserCode] public Sassy_stringContext sassy_string [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } - [System.Diagnostics.DebuggerNonUserCode] public IndexContext index() { - return GetRuleContext(0); + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); } public Divide_field_setContext(Field_setContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] @@ -4644,8 +4756,11 @@ [System.Diagnostics.DebuggerNonUserCode] public Sassy_stringContext sassy_string [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } - [System.Diagnostics.DebuggerNonUserCode] public IndexContext index() { - return GetRuleContext(0); + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); } public Subtract_field_setContext(Field_setContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] @@ -4676,8 +4791,11 @@ [System.Diagnostics.DebuggerNonUserCode] public Sassy_stringContext sassy_string [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } - [System.Diagnostics.DebuggerNonUserCode] public IndexContext index() { - return GetRuleContext(0); + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); } public Multiply_field_setContext(Field_setContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] @@ -4708,8 +4826,11 @@ [System.Diagnostics.DebuggerNonUserCode] public Sassy_stringContext sassy_string [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { return GetRuleContext(0); } - [System.Diagnostics.DebuggerNonUserCode] public IndexContext index() { - return GetRuleContext(0); + [System.Diagnostics.DebuggerNonUserCode] public IndexContext[] index() { + return GetRuleContexts(); + } + [System.Diagnostics.DebuggerNonUserCode] public IndexContext index(int i) { + return GetRuleContext(i); } public Normal_field_setContext(Field_setContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] @@ -4736,30 +4857,34 @@ public Field_setContext field_set() { EnterRule(_localctx, 64, RULE_field_set); int _la; try { - State = 579; + State = 624; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,42,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,47,Context) ) { case 1: _localctx = new Normal_field_setContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 539; + State = 569; sassy_string(); - State = 541; + State = 573; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - if (_la==LEFT_BRACKET) { + while (_la==LEFT_BRACKET) { + { { - State = 540; + State = 570; ((Normal_field_setContext)_localctx).indexor = index(); } + } + State = 575; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); } - - State = 543; + State = 576; Match(COLON); - State = 544; + State = 577; ((Normal_field_setContext)_localctx).expr = expression(0); - State = 545; + State = 578; Match(SEMICOLON); } break; @@ -4767,23 +4892,27 @@ public Field_setContext field_set() { _localctx = new Add_field_setContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 547; + State = 580; sassy_string(); - State = 549; + State = 584; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - if (_la==LEFT_BRACKET) { + while (_la==LEFT_BRACKET) { { - State = 548; + { + State = 581; ((Add_field_setContext)_localctx).indexor = index(); } + } + State = 586; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); } - - State = 551; + State = 587; Match(PLUS_COLON); - State = 552; + State = 588; ((Add_field_setContext)_localctx).expr = expression(0); - State = 553; + State = 589; Match(SEMICOLON); } break; @@ -4791,23 +4920,27 @@ public Field_setContext field_set() { _localctx = new Subtract_field_setContext(_localctx); EnterOuterAlt(_localctx, 3); { - State = 555; + State = 591; sassy_string(); - State = 557; + State = 595; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - if (_la==LEFT_BRACKET) { + while (_la==LEFT_BRACKET) { + { { - State = 556; + State = 592; ((Subtract_field_setContext)_localctx).indexor = index(); } + } + State = 597; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); } - - State = 559; + State = 598; Match(MINUS_COLON); - State = 560; + State = 599; ((Subtract_field_setContext)_localctx).expr = expression(0); - State = 561; + State = 600; Match(SEMICOLON); } break; @@ -4815,23 +4948,27 @@ public Field_setContext field_set() { _localctx = new Multiply_field_setContext(_localctx); EnterOuterAlt(_localctx, 4); { - State = 563; + State = 602; sassy_string(); - State = 565; + State = 606; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - if (_la==LEFT_BRACKET) { + while (_la==LEFT_BRACKET) { { - State = 564; + { + State = 603; ((Multiply_field_setContext)_localctx).indexor = index(); } + } + State = 608; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); } - - State = 567; + State = 609; Match(MULTIPLY_COLON); - State = 568; + State = 610; ((Multiply_field_setContext)_localctx).expr = expression(0); - State = 569; + State = 611; Match(SEMICOLON); } break; @@ -4839,23 +4976,27 @@ public Field_setContext field_set() { _localctx = new Divide_field_setContext(_localctx); EnterOuterAlt(_localctx, 5); { - State = 571; + State = 613; sassy_string(); - State = 573; + State = 617; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - if (_la==LEFT_BRACKET) { + while (_la==LEFT_BRACKET) { { - State = 572; + { + State = 614; ((Divide_field_setContext)_localctx).indexor = index(); } + } + State = 619; + ErrorHandler.Sync(this); + _la = TokenStream.LA(1); } - - State = 575; + State = 620; Match(DIVIDE_COLON); - State = 576; + State = 621; ((Divide_field_setContext)_localctx).expr = expression(0); - State = 577; + State = 622; Match(SEMICOLON); } break; @@ -4866,113 +5007,69 @@ public Field_setContext field_set() { ErrorHandler.ReportError(this, re); ErrorHandler.Recover(this, re); } - finally { - ExitRule(); - } - return _localctx; - } - - public partial class IndexContext : ParserRuleContext { - public IndexContext(ParserRuleContext parent, int invokingState) - : base(parent, invokingState) - { - } - public override int RuleIndex { get { return RULE_index; } } - - public IndexContext() { } - public virtual void CopyFrom(IndexContext context) { - base.CopyFrom(context); - } - } - public partial class String_indexorContext : IndexContext { - public IToken elem; - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode LEFT_BRACKET() { return GetToken(sassy_parser.LEFT_BRACKET, 0); } - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode RIGHT_BRACKET() { return GetToken(sassy_parser.RIGHT_BRACKET, 0); } - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode STRING() { return GetToken(sassy_parser.STRING, 0); } - public String_indexorContext(IndexContext context) { CopyFrom(context); } - [System.Diagnostics.DebuggerNonUserCode] - public override void EnterRule(IParseTreeListener listener) { - Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.EnterString_indexor(this); - } - [System.Diagnostics.DebuggerNonUserCode] - public override void ExitRule(IParseTreeListener listener) { - Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.ExitString_indexor(this); - } - [System.Diagnostics.DebuggerNonUserCode] - public override TResult Accept(IParseTreeVisitor visitor) { - Isassy_parserVisitor typedVisitor = visitor as Isassy_parserVisitor; - if (typedVisitor != null) return typedVisitor.VisitString_indexor(this); - else return visitor.VisitChildren(this); - } - } - public partial class Element_indexorContext : IndexContext { - public IToken elem; - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode LEFT_BRACKET() { return GetToken(sassy_parser.LEFT_BRACKET, 0); } - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode RIGHT_BRACKET() { return GetToken(sassy_parser.RIGHT_BRACKET, 0); } - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode ELEMENT() { return GetToken(sassy_parser.ELEMENT, 0); } - public Element_indexorContext(IndexContext context) { CopyFrom(context); } - [System.Diagnostics.DebuggerNonUserCode] - public override void EnterRule(IParseTreeListener listener) { - Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.EnterElement_indexor(this); + finally { + ExitRule(); } - [System.Diagnostics.DebuggerNonUserCode] - public override void ExitRule(IParseTreeListener listener) { - Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.ExitElement_indexor(this); + return _localctx; + } + + public partial class IndexContext : ParserRuleContext { + public IndexContext(ParserRuleContext parent, int invokingState) + : base(parent, invokingState) + { } - [System.Diagnostics.DebuggerNonUserCode] - public override TResult Accept(IParseTreeVisitor visitor) { - Isassy_parserVisitor typedVisitor = visitor as Isassy_parserVisitor; - if (typedVisitor != null) return typedVisitor.VisitElement_indexor(this); - else return visitor.VisitChildren(this); + public override int RuleIndex { get { return RULE_index; } } + + public IndexContext() { } + public virtual void CopyFrom(IndexContext context) { + base.CopyFrom(context); } } - public partial class Number_indexorContext : IndexContext { - public IToken num; + public partial class Map_indexerContext : IndexContext { + public IToken elem; [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode LEFT_BRACKET() { return GetToken(sassy_parser.LEFT_BRACKET, 0); } [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode RIGHT_BRACKET() { return GetToken(sassy_parser.RIGHT_BRACKET, 0); } - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode NUMBER() { return GetToken(sassy_parser.NUMBER, 0); } - public Number_indexorContext(IndexContext context) { CopyFrom(context); } + [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode MULTIPLY() { return GetToken(sassy_parser.MULTIPLY, 0); } + public Map_indexerContext(IndexContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.EnterNumber_indexor(this); + if (typedListener != null) typedListener.EnterMap_indexer(this); } [System.Diagnostics.DebuggerNonUserCode] public override void ExitRule(IParseTreeListener listener) { Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.ExitNumber_indexor(this); + if (typedListener != null) typedListener.ExitMap_indexer(this); } [System.Diagnostics.DebuggerNonUserCode] public override TResult Accept(IParseTreeVisitor visitor) { Isassy_parserVisitor typedVisitor = visitor as Isassy_parserVisitor; - if (typedVisitor != null) return typedVisitor.VisitNumber_indexor(this); + if (typedVisitor != null) return typedVisitor.VisitMap_indexer(this); else return visitor.VisitChildren(this); } } - public partial class Class_indexorContext : IndexContext { - public IToken clazz; + public partial class Expression_indexerContext : IndexContext { + public ExpressionContext elem; [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode LEFT_BRACKET() { return GetToken(sassy_parser.LEFT_BRACKET, 0); } [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode RIGHT_BRACKET() { return GetToken(sassy_parser.RIGHT_BRACKET, 0); } - [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode CLASS() { return GetToken(sassy_parser.CLASS, 0); } - public Class_indexorContext(IndexContext context) { CopyFrom(context); } + [System.Diagnostics.DebuggerNonUserCode] public ExpressionContext expression() { + return GetRuleContext(0); + } + public Expression_indexerContext(IndexContext context) { CopyFrom(context); } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.EnterClass_indexor(this); + if (typedListener != null) typedListener.EnterExpression_indexer(this); } [System.Diagnostics.DebuggerNonUserCode] public override void ExitRule(IParseTreeListener listener) { Isassy_parserListener typedListener = listener as Isassy_parserListener; - if (typedListener != null) typedListener.ExitClass_indexor(this); + if (typedListener != null) typedListener.ExitExpression_indexer(this); } [System.Diagnostics.DebuggerNonUserCode] public override TResult Accept(IParseTreeVisitor visitor) { Isassy_parserVisitor typedVisitor = visitor as Isassy_parserVisitor; - if (typedVisitor != null) return typedVisitor.VisitClass_indexor(this); + if (typedVisitor != null) return typedVisitor.VisitExpression_indexer(this); else return visitor.VisitChildren(this); } } @@ -4982,54 +5079,30 @@ public IndexContext index() { IndexContext _localctx = new IndexContext(Context, State); EnterRule(_localctx, 66, RULE_index); try { - State = 593; + State = 633; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,43,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,48,Context) ) { case 1: - _localctx = new Number_indexorContext(_localctx); + _localctx = new Expression_indexerContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 581; + State = 626; Match(LEFT_BRACKET); - State = 582; - ((Number_indexorContext)_localctx).num = Match(NUMBER); - State = 583; + State = 627; + ((Expression_indexerContext)_localctx).elem = expression(0); + State = 628; Match(RIGHT_BRACKET); } break; case 2: - _localctx = new Element_indexorContext(_localctx); + _localctx = new Map_indexerContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 584; - Match(LEFT_BRACKET); - State = 585; - ((Element_indexorContext)_localctx).elem = Match(ELEMENT); - State = 586; - Match(RIGHT_BRACKET); - } - break; - case 3: - _localctx = new Class_indexorContext(_localctx); - EnterOuterAlt(_localctx, 3); - { - State = 587; - Match(LEFT_BRACKET); - State = 588; - ((Class_indexorContext)_localctx).clazz = Match(CLASS); - State = 589; - Match(RIGHT_BRACKET); - } - break; - case 4: - _localctx = new String_indexorContext(_localctx); - EnterOuterAlt(_localctx, 4); - { - State = 590; + State = 630; Match(LEFT_BRACKET); - State = 591; - ((String_indexorContext)_localctx).elem = Match(STRING); - State = 592; + State = 631; + ((Map_indexerContext)_localctx).elem = Match(MULTIPLY); + State = 632; Match(RIGHT_BRACKET); } break; @@ -5766,22 +5839,22 @@ private ExpressionContext expression(int _p) { int _alt; EnterOuterAlt(_localctx, 1); { - State = 615; + State = 655; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,44,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,49,Context) ) { case 1: { _localctx = new Simple_callContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 596; + State = 636; ((Simple_callContext)_localctx).lhs = Match(ELEMENT); - State = 597; + State = 637; Match(LEFT_PAREN); - State = 598; + State = 638; ((Simple_callContext)_localctx).args = argument_list(); - State = 599; + State = 639; Match(RIGHT_PAREN); } break; @@ -5790,7 +5863,7 @@ private ExpressionContext expression(int _p) { _localctx = new Value_referenceContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 601; + State = 641; value(); } break; @@ -5799,7 +5872,7 @@ private ExpressionContext expression(int _p) { _localctx = new Variable_referenceContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 602; + State = 642; Match(VARIABLE); } break; @@ -5808,7 +5881,7 @@ private ExpressionContext expression(int _p) { _localctx = new Local_variable_referenceContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 603; + State = 643; Match(LOCALVARIABLE); } break; @@ -5817,7 +5890,7 @@ private ExpressionContext expression(int _p) { _localctx = new String_local_variable_referenceContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 604; + State = 644; Match(STRING_LOCALVARIABLE); } break; @@ -5826,11 +5899,11 @@ private ExpressionContext expression(int _p) { _localctx = new Sub_sub_expressionContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 605; + State = 645; Match(LEFT_PAREN); - State = 606; + State = 646; ((Sub_sub_expressionContext)_localctx).internal_expr = expression(0); - State = 607; + State = 647; Match(RIGHT_PAREN); } break; @@ -5839,9 +5912,9 @@ private ExpressionContext expression(int _p) { _localctx = new NegativeContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 609; + State = 649; Match(SUBTRACT); - State = 610; + State = 650; ((NegativeContext)_localctx).child = expression(20); } break; @@ -5850,9 +5923,9 @@ private ExpressionContext expression(int _p) { _localctx = new PositiveContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 611; + State = 651; Match(ADD); - State = 612; + State = 652; ((PositiveContext)_localctx).child = expression(19); } break; @@ -5861,36 +5934,36 @@ private ExpressionContext expression(int _p) { _localctx = new NotContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 613; + State = 653; Match(NOT); - State = 614; + State = 654; ((NotContext)_localctx).child = expression(18); } break; } Context.Stop = TokenStream.LT(-1); - State = 682; + State = 722; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,46,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,51,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( ParseListeners!=null ) TriggerExitRuleEvent(); _prevctx = _localctx; { - State = 680; + State = 720; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,45,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,50,Context) ) { case 1: { _localctx = new MultiplicationContext(new ExpressionContext(_parentctx, _parentState)); ((MultiplicationContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 617; + State = 657; if (!(Precpred(Context, 14))) throw new FailedPredicateException(this, "Precpred(Context, 14)"); - State = 618; + State = 658; Match(MULTIPLY); - State = 619; + State = 659; ((MultiplicationContext)_localctx).rhs = expression(15); } break; @@ -5899,11 +5972,11 @@ private ExpressionContext expression(int _p) { _localctx = new DivisionContext(new ExpressionContext(_parentctx, _parentState)); ((DivisionContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 620; + State = 660; if (!(Precpred(Context, 13))) throw new FailedPredicateException(this, "Precpred(Context, 13)"); - State = 621; + State = 661; Match(DIVIDE); - State = 622; + State = 662; ((DivisionContext)_localctx).rhs = expression(14); } break; @@ -5912,11 +5985,11 @@ private ExpressionContext expression(int _p) { _localctx = new RemainderContext(new ExpressionContext(_parentctx, _parentState)); ((RemainderContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 623; + State = 663; if (!(Precpred(Context, 12))) throw new FailedPredicateException(this, "Precpred(Context, 12)"); - State = 624; + State = 664; Match(MODULUS); - State = 625; + State = 665; ((RemainderContext)_localctx).rhs = expression(13); } break; @@ -5925,11 +5998,11 @@ private ExpressionContext expression(int _p) { _localctx = new AdditionContext(new ExpressionContext(_parentctx, _parentState)); ((AdditionContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 626; + State = 666; if (!(Precpred(Context, 11))) throw new FailedPredicateException(this, "Precpred(Context, 11)"); - State = 627; + State = 667; Match(ADD); - State = 628; + State = 668; ((AdditionContext)_localctx).rhs = expression(12); } break; @@ -5938,11 +6011,11 @@ private ExpressionContext expression(int _p) { _localctx = new SubtractionContext(new ExpressionContext(_parentctx, _parentState)); ((SubtractionContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 629; + State = 669; if (!(Precpred(Context, 10))) throw new FailedPredicateException(this, "Precpred(Context, 10)"); - State = 630; + State = 670; Match(SUBTRACT); - State = 631; + State = 671; ((SubtractionContext)_localctx).rhs = expression(11); } break; @@ -5951,11 +6024,11 @@ private ExpressionContext expression(int _p) { _localctx = new Greater_thanContext(new ExpressionContext(_parentctx, _parentState)); ((Greater_thanContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 632; + State = 672; if (!(Precpred(Context, 9))) throw new FailedPredicateException(this, "Precpred(Context, 9)"); - State = 633; + State = 673; Match(GREATER_THAN); - State = 634; + State = 674; ((Greater_thanContext)_localctx).rhs = expression(10); } break; @@ -5964,11 +6037,11 @@ private ExpressionContext expression(int _p) { _localctx = new Lesser_thanContext(new ExpressionContext(_parentctx, _parentState)); ((Lesser_thanContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 635; + State = 675; if (!(Precpred(Context, 8))) throw new FailedPredicateException(this, "Precpred(Context, 8)"); - State = 636; + State = 676; Match(LESSER_THAN); - State = 637; + State = 677; ((Lesser_thanContext)_localctx).rhs = expression(9); } break; @@ -5977,11 +6050,11 @@ private ExpressionContext expression(int _p) { _localctx = new Greater_than_equalContext(new ExpressionContext(_parentctx, _parentState)); ((Greater_than_equalContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 638; + State = 678; if (!(Precpred(Context, 7))) throw new FailedPredicateException(this, "Precpred(Context, 7)"); - State = 639; + State = 679; Match(GREATER_THAN_EQUAL); - State = 640; + State = 680; ((Greater_than_equalContext)_localctx).rhs = expression(8); } break; @@ -5990,11 +6063,11 @@ private ExpressionContext expression(int _p) { _localctx = new Lesser_than_equalContext(new ExpressionContext(_parentctx, _parentState)); ((Lesser_than_equalContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 641; + State = 681; if (!(Precpred(Context, 6))) throw new FailedPredicateException(this, "Precpred(Context, 6)"); - State = 642; + State = 682; Match(LESSER_THAN_EQUAL); - State = 643; + State = 683; ((Lesser_than_equalContext)_localctx).rhs = expression(7); } break; @@ -6003,11 +6076,11 @@ private ExpressionContext expression(int _p) { _localctx = new Equal_toContext(new ExpressionContext(_parentctx, _parentState)); ((Equal_toContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 644; + State = 684; if (!(Precpred(Context, 5))) throw new FailedPredicateException(this, "Precpred(Context, 5)"); - State = 645; + State = 685; Match(EQUAL_TO); - State = 646; + State = 686; ((Equal_toContext)_localctx).rhs = expression(6); } break; @@ -6016,11 +6089,11 @@ private ExpressionContext expression(int _p) { _localctx = new Not_equal_toContext(new ExpressionContext(_parentctx, _parentState)); ((Not_equal_toContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 647; + State = 687; if (!(Precpred(Context, 4))) throw new FailedPredicateException(this, "Precpred(Context, 4)"); - State = 648; + State = 688; Match(NOT_EQUAL_TO); - State = 649; + State = 689; ((Not_equal_toContext)_localctx).rhs = expression(5); } break; @@ -6029,11 +6102,11 @@ private ExpressionContext expression(int _p) { _localctx = new AndContext(new ExpressionContext(_parentctx, _parentState)); ((AndContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 650; + State = 690; if (!(Precpred(Context, 3))) throw new FailedPredicateException(this, "Precpred(Context, 3)"); - State = 651; + State = 691; Match(AND); - State = 652; + State = 692; ((AndContext)_localctx).rhs = expression(4); } break; @@ -6042,11 +6115,11 @@ private ExpressionContext expression(int _p) { _localctx = new OrContext(new ExpressionContext(_parentctx, _parentState)); ((OrContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 653; + State = 693; if (!(Precpred(Context, 2))) throw new FailedPredicateException(this, "Precpred(Context, 2)"); - State = 654; + State = 694; Match(OR); - State = 655; + State = 695; ((OrContext)_localctx).rhs = expression(3); } break; @@ -6055,15 +6128,15 @@ private ExpressionContext expression(int _p) { _localctx = new TernaryContext(new ExpressionContext(_parentctx, _parentState)); ((TernaryContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 656; + State = 696; if (!(Precpred(Context, 1))) throw new FailedPredicateException(this, "Precpred(Context, 1)"); - State = 657; + State = 697; Match(IF); - State = 658; + State = 698; ((TernaryContext)_localctx).cond = expression(0); - State = 659; + State = 699; Match(ELSE); - State = 660; + State = 700; ((TernaryContext)_localctx).rhs = expression(2); } break; @@ -6072,17 +6145,17 @@ private ExpressionContext expression(int _p) { _localctx = new Member_callContext(new ExpressionContext(_parentctx, _parentState)); ((Member_callContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 662; + State = 702; if (!(Precpred(Context, 17))) throw new FailedPredicateException(this, "Precpred(Context, 17)"); - State = 663; + State = 703; Match(COLON); - State = 664; + State = 704; ((Member_callContext)_localctx).name = Match(ELEMENT); - State = 665; + State = 705; Match(LEFT_PAREN); - State = 666; + State = 706; ((Member_callContext)_localctx).args = argument_list(); - State = 667; + State = 707; Match(RIGHT_PAREN); } break; @@ -6091,15 +6164,15 @@ private ExpressionContext expression(int _p) { _localctx = new Member_call_rulesetContext(new ExpressionContext(_parentctx, _parentState)); ((Member_call_rulesetContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 669; + State = 709; if (!(Precpred(Context, 16))) throw new FailedPredicateException(this, "Precpred(Context, 16)"); - State = 670; + State = 710; Match(RULESET); - State = 671; + State = 711; Match(LEFT_PAREN); - State = 672; + State = 712; ((Member_call_rulesetContext)_localctx).args = argument_list(); - State = 673; + State = 713; Match(RIGHT_PAREN); } break; @@ -6108,22 +6181,22 @@ private ExpressionContext expression(int _p) { _localctx = new IndexorContext(new ExpressionContext(_parentctx, _parentState)); ((IndexorContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_expression); - State = 675; + State = 715; if (!(Precpred(Context, 15))) throw new FailedPredicateException(this, "Precpred(Context, 15)"); - State = 676; + State = 716; Match(LEFT_BRACKET); - State = 677; + State = 717; ((IndexorContext)_localctx).rhs = expression(0); - State = 678; + State = 718; Match(RIGHT_BRACKET); } break; } } } - State = 684; + State = 724; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,46,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,51,Context); } } } @@ -6372,14 +6445,14 @@ public ValueContext value() { ValueContext _localctx = new ValueContext(Context, State); EnterRule(_localctx, 70, RULE_value); try { - State = 702; + State = 742; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case DELETE: _localctx = new Value_deletionContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 685; + State = 725; Match(DELETE); } break; @@ -6387,7 +6460,7 @@ public ValueContext value() { _localctx = new Boolean_trueContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 686; + State = 726; Match(TRUE); } break; @@ -6395,7 +6468,7 @@ public ValueContext value() { _localctx = new Boolean_falseContext(_localctx); EnterOuterAlt(_localctx, 3); { - State = 687; + State = 727; Match(FALSE); } break; @@ -6403,7 +6476,7 @@ public ValueContext value() { _localctx = new Number_valueContext(_localctx); EnterOuterAlt(_localctx, 4); { - State = 688; + State = 728; Match(NUMBER); } break; @@ -6411,7 +6484,7 @@ public ValueContext value() { _localctx = new String_valueContext(_localctx); EnterOuterAlt(_localctx, 5); { - State = 689; + State = 729; Match(STRING); } break; @@ -6419,7 +6492,7 @@ public ValueContext value() { _localctx = new Element_stringContext(_localctx); EnterOuterAlt(_localctx, 6); { - State = 690; + State = 730; Match(ELEMENT); } break; @@ -6427,7 +6500,7 @@ public ValueContext value() { _localctx = new NoneContext(_localctx); EnterOuterAlt(_localctx, 7); { - State = 691; + State = 731; Match(NONE); } break; @@ -6435,19 +6508,19 @@ public ValueContext value() { _localctx = new ClosureContext(_localctx); EnterOuterAlt(_localctx, 8); { - State = 692; + State = 732; Match(FUNCTION); - State = 693; + State = 733; Match(LEFT_PAREN); - State = 694; + State = 734; ((ClosureContext)_localctx).args = arg_decl_list(); - State = 695; + State = 735; Match(RIGHT_PAREN); - State = 696; + State = 736; Match(LEFT_BRACE); - State = 697; + State = 737; ((ClosureContext)_localctx).body = function_body(); - State = 698; + State = 738; Match(RIGHT_BRACE); } break; @@ -6455,7 +6528,7 @@ public ValueContext value() { _localctx = new List_valueContext(_localctx); EnterOuterAlt(_localctx, 9); { - State = 700; + State = 740; list(); } break; @@ -6463,7 +6536,7 @@ public ValueContext value() { _localctx = new Object_valueContext(_localctx); EnterOuterAlt(_localctx, 10); { - State = 701; + State = 741; obj(); } break; @@ -6639,7 +6712,7 @@ private Require_expressionContext require_expression(int _p) { int _alt; EnterOuterAlt(_localctx, 1); { - State = 712; + State = 752; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case LEFT_PAREN: @@ -6648,11 +6721,11 @@ private Require_expressionContext require_expression(int _p) { Context = _localctx; _prevctx = _localctx; - State = 705; + State = 745; Match(LEFT_PAREN); - State = 706; + State = 746; ((Require_subContext)_localctx).internal_expr = require_expression(0); - State = 707; + State = 747; Match(RIGHT_PAREN); } break; @@ -6661,9 +6734,9 @@ private Require_expressionContext require_expression(int _p) { _localctx = new Require_notContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 709; + State = 749; Match(NOT); - State = 710; + State = 750; ((Require_notContext)_localctx).internal_expr = require_expression(2); } break; @@ -6673,7 +6746,7 @@ private Require_expressionContext require_expression(int _p) { _localctx = new Require_guidContext(_localctx); Context = _localctx; _prevctx = _localctx; - State = 711; + State = 751; ((Require_guidContext)_localctx).modid = sassy_string(); } break; @@ -6681,28 +6754,28 @@ private Require_expressionContext require_expression(int _p) { throw new NoViableAltException(this); } Context.Stop = TokenStream.LT(-1); - State = 722; + State = 762; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,50,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,55,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( ParseListeners!=null ) TriggerExitRuleEvent(); _prevctx = _localctx; { - State = 720; + State = 760; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,49,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,54,Context) ) { case 1: { _localctx = new Require_andContext(new Require_expressionContext(_parentctx, _parentState)); ((Require_andContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_require_expression); - State = 714; + State = 754; if (!(Precpred(Context, 4))) throw new FailedPredicateException(this, "Precpred(Context, 4)"); - State = 715; + State = 755; Match(AND); - State = 716; + State = 756; ((Require_andContext)_localctx).rhs = require_expression(5); } break; @@ -6711,20 +6784,20 @@ private Require_expressionContext require_expression(int _p) { _localctx = new Require_orContext(new Require_expressionContext(_parentctx, _parentState)); ((Require_orContext)_localctx).lhs = _prevctx; PushNewRecursionContext(_localctx, _startState, RULE_require_expression); - State = 717; + State = 757; if (!(Precpred(Context, 3))) throw new FailedPredicateException(this, "Precpred(Context, 3)"); - State = 718; + State = 758; Match(OR); - State = 719; + State = 759; ((Require_orContext)_localctx).rhs = require_expression(4); } break; } } } - State = 724; + State = 764; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,50,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,55,Context); } } } @@ -6778,21 +6851,21 @@ public ListContext list() { try { EnterOuterAlt(_localctx, 1); { - State = 725; + State = 765; Match(LEFT_BRACKET); - State = 726; + State = 766; _localctx.@values = list_values(); - State = 728; + State = 768; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==COMMA) { { - State = 727; + State = 767; Match(COMMA); } } - State = 730; + State = 770; Match(RIGHT_BRACKET); } } @@ -6850,38 +6923,38 @@ public List_valuesContext list_values() { int _alt; EnterOuterAlt(_localctx, 1); { - State = 742; + State = 782; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,54,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,59,Context) ) { case 1: { - State = 733; + State = 773; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 8070758418052284432L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & 9095L) != 0)) { { - State = 732; + State = 772; expression(0); } } - State = 739; + State = 779; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,53,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,58,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - State = 735; + State = 775; Match(COMMA); - State = 736; + State = 776; expression(0); } } } - State = 741; + State = 781; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,53,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,58,Context); } } break; @@ -6938,21 +7011,21 @@ public ObjContext obj() { try { EnterOuterAlt(_localctx, 1); { - State = 744; + State = 784; Match(LEFT_BRACE); - State = 745; + State = 785; _localctx.@values = obj_values(); - State = 747; + State = 787; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==COMMA) { { - State = 746; + State = 786; Match(COMMA); } } - State = 749; + State = 789; Match(RIGHT_BRACE); } } @@ -7010,38 +7083,38 @@ public Obj_valuesContext obj_values() { int _alt; EnterOuterAlt(_localctx, 1); { - State = 761; + State = 801; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,58,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,63,Context) ) { case 1: { - State = 752; + State = 792; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==STRING || _la==ELEMENT) { { - State = 751; + State = 791; key_value(); } } - State = 758; + State = 798; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,57,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,62,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - State = 754; + State = 794; Match(COMMA); - State = 755; + State = 795; key_value(); } } } - State = 760; + State = 800; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,57,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,62,Context); } } break; @@ -7129,18 +7202,18 @@ public Key_valueContext key_value() { Key_valueContext _localctx = new Key_valueContext(Context, State); EnterRule(_localctx, 82, RULE_key_value); try { - State = 769; + State = 809; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case ELEMENT: _localctx = new Literal_keyContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 763; + State = 803; ((Literal_keyContext)_localctx).key = Match(ELEMENT); - State = 764; + State = 804; Match(COLON); - State = 765; + State = 805; ((Literal_keyContext)_localctx).val = expression(0); } break; @@ -7148,11 +7221,11 @@ public Key_valueContext key_value() { _localctx = new String_keyContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 766; + State = 806; ((String_keyContext)_localctx).key = Match(STRING); - State = 767; + State = 807; Match(COLON); - State = 768; + State = 808; ((String_keyContext)_localctx).val = expression(0); } break; @@ -7214,48 +7287,48 @@ public Argument_listContext argument_list() { int _alt; EnterOuterAlt(_localctx, 1); { - State = 781; + State = 821; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,62,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,67,Context) ) { case 1: { - State = 772; + State = 812; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 8070758418052284432L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & 9095L) != 0)) { { - State = 771; + State = 811; argument(); } } - State = 778; + State = 818; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,61,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,66,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - State = 774; + State = 814; Match(COMMA); - State = 775; + State = 815; argument(); } } } - State = 780; + State = 820; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,61,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,66,Context); } } break; } - State = 784; + State = 824; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==COMMA) { { - State = 783; + State = 823; Match(COMMA); } } @@ -7340,18 +7413,18 @@ public ArgumentContext argument() { ArgumentContext _localctx = new ArgumentContext(Context, State); EnterRule(_localctx, 86, RULE_argument); try { - State = 790; + State = 830; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,64,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,69,Context) ) { case 1: _localctx = new Named_argumentContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 786; + State = 826; ((Named_argumentContext)_localctx).key = Match(VARIABLE); - State = 787; + State = 827; Match(COLON); - State = 788; + State = 828; ((Named_argumentContext)_localctx).val = expression(0); } break; @@ -7359,7 +7432,7 @@ public ArgumentContext argument() { _localctx = new Unnamed_argumentContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 789; + State = 829; ((Unnamed_argumentContext)_localctx).val = expression(0); } break; @@ -7419,48 +7492,48 @@ public Arg_decl_listContext arg_decl_list() { int _alt; EnterOuterAlt(_localctx, 1); { - State = 802; + State = 842; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,67,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,72,Context) ) { case 1: { - State = 793; + State = 833; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==VARIABLE) { { - State = 792; + State = 832; arg_decl(); } } - State = 799; + State = 839; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,66,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,71,Context); while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - State = 795; + State = 835; Match(COMMA); - State = 796; + State = 836; arg_decl(); } } } - State = 801; + State = 841; ErrorHandler.Sync(this); - _alt = Interpreter.AdaptivePredict(TokenStream,66,Context); + _alt = Interpreter.AdaptivePredict(TokenStream,71,Context); } } break; } - State = 805; + State = 845; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==COMMA) { { - State = 804; + State = 844; Match(COMMA); } } @@ -7543,14 +7616,14 @@ public Arg_declContext arg_decl() { Arg_declContext _localctx = new Arg_declContext(Context, State); EnterRule(_localctx, 90, RULE_arg_decl); try { - State = 811; + State = 851; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,69,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,74,Context) ) { case 1: _localctx = new Argument_without_defaultContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 807; + State = 847; ((Argument_without_defaultContext)_localctx).name = Match(VARIABLE); } break; @@ -7558,11 +7631,11 @@ public Arg_declContext arg_decl() { _localctx = new Argument_with_defaultContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 808; + State = 848; ((Argument_with_defaultContext)_localctx).name = Match(VARIABLE); - State = 809; + State = 849; Match(COLON); - State = 810; + State = 850; ((Argument_with_defaultContext)_localctx).val = expression(0); } break; @@ -7617,17 +7690,17 @@ public Function_bodyContext function_body() { try { EnterOuterAlt(_localctx, 1); { - State = 816; + State = 856; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 813; + State = 853; function_statement(); } } - State = 818; + State = 858; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -7691,48 +7764,48 @@ public Function_statementContext function_statement() { Function_statementContext _localctx = new Function_statementContext(Context, State); EnterRule(_localctx, 94, RULE_function_statement); try { - State = 825; + State = 865; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case VARIABLE: EnterOuterAlt(_localctx, 1); { - State = 819; + State = 859; var_decl(); } break; case PRE_IF: EnterOuterAlt(_localctx, 2); { - State = 820; + State = 860; fn_level_conditional(); } break; case RETURN: EnterOuterAlt(_localctx, 3); { - State = 821; + State = 861; fn_return(); } break; case FOR: EnterOuterAlt(_localctx, 4); { - State = 822; + State = 862; for_loop(); } break; case EACH: EnterOuterAlt(_localctx, 5); { - State = 823; + State = 863; each_loop(); } break; case WHILE: EnterOuterAlt(_localctx, 6); { - State = 824; + State = 864; while_loop(); } break; @@ -7801,34 +7874,34 @@ public Fn_level_conditionalContext fn_level_conditional() { try { EnterOuterAlt(_localctx, 1); { - State = 827; + State = 867; Match(PRE_IF); - State = 828; + State = 868; _localctx.cond = expression(0); - State = 829; + State = 869; Match(LEFT_BRACE); - State = 833; + State = 873; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 830; + State = 870; _localctx.body = function_statement(); } } - State = 835; + State = 875; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 836; + State = 876; Match(RIGHT_BRACE); - State = 838; + State = 878; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==PRE_ELSE || _la==PRE_ELSE_IF) { { - State = 837; + State = 877; _localctx.els = fn_level_else(); } } @@ -7881,20 +7954,20 @@ public Fn_level_elseContext fn_level_else() { Fn_level_elseContext _localctx = new Fn_level_elseContext(Context, State); EnterRule(_localctx, 98, RULE_fn_level_else); try { - State = 842; + State = 882; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case PRE_ELSE: EnterOuterAlt(_localctx, 1); { - State = 840; + State = 880; fn_level_else_else(); } break; case PRE_ELSE_IF: EnterOuterAlt(_localctx, 2); { - State = 841; + State = 881; fn_level_else_if(); } break; @@ -7955,25 +8028,25 @@ public Fn_level_else_elseContext fn_level_else_else() { try { EnterOuterAlt(_localctx, 1); { - State = 844; + State = 884; Match(PRE_ELSE); - State = 845; + State = 885; Match(LEFT_BRACE); - State = 849; + State = 889; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 846; + State = 886; _localctx.body = function_statement(); } } - State = 851; + State = 891; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 852; + State = 892; Match(RIGHT_BRACE); } } @@ -8038,34 +8111,34 @@ public Fn_level_else_ifContext fn_level_else_if() { try { EnterOuterAlt(_localctx, 1); { - State = 854; + State = 894; Match(PRE_ELSE_IF); - State = 855; + State = 895; _localctx.cond = expression(0); - State = 856; + State = 896; Match(LEFT_BRACE); - State = 860; + State = 900; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 857; + State = 897; _localctx.body = function_statement(); } } - State = 862; + State = 902; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 863; + State = 903; Match(RIGHT_BRACE); - State = 865; + State = 905; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la==PRE_ELSE || _la==PRE_ELSE_IF) { { - State = 864; + State = 904; _localctx.els = fn_level_else(); } } @@ -8119,11 +8192,11 @@ public Fn_returnContext fn_return() { try { EnterOuterAlt(_localctx, 1); { - State = 867; + State = 907; Match(RETURN); - State = 868; + State = 908; expression(0); - State = 869; + State = 909; Match(SEMICOLON); } } @@ -8178,15 +8251,15 @@ public Mixin_includeContext mixin_include() { try { EnterOuterAlt(_localctx, 1); { - State = 871; + State = 911; Match(INCLUDE); - State = 872; + State = 912; _localctx.mixin = Match(ELEMENT); - State = 873; + State = 913; Match(LEFT_PAREN); - State = 874; + State = 914; _localctx.args = argument_list(); - State = 875; + State = 915; Match(RIGHT_PAREN); } } @@ -8302,42 +8375,42 @@ public For_loopContext for_loop() { EnterRule(_localctx, 108, RULE_for_loop); int _la; try { - State = 907; + State = 947; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,80,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,85,Context) ) { case 1: _localctx = new For_to_loopContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 877; + State = 917; Match(FOR); - State = 878; + State = 918; ((For_to_loopContext)_localctx).idx = Match(VARIABLE); - State = 879; + State = 919; Match(FROM); - State = 880; + State = 920; ((For_to_loopContext)_localctx).for_start = expression(0); - State = 881; + State = 921; Match(TO); - State = 882; + State = 922; ((For_to_loopContext)_localctx).end = expression(0); - State = 883; + State = 923; Match(LEFT_BRACE); - State = 887; + State = 927; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 884; + State = 924; ((For_to_loopContext)_localctx).body = function_statement(); } } - State = 889; + State = 929; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 890; + State = 930; Match(RIGHT_BRACE); } break; @@ -8345,35 +8418,35 @@ public For_loopContext for_loop() { _localctx = new For_through_loopContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 892; + State = 932; Match(FOR); - State = 893; + State = 933; ((For_through_loopContext)_localctx).idx = Match(VARIABLE); - State = 894; + State = 934; Match(FROM); - State = 895; + State = 935; ((For_through_loopContext)_localctx).for_start = expression(0); - State = 896; + State = 936; Match(THROUGH); - State = 897; + State = 937; ((For_through_loopContext)_localctx).end = expression(0); - State = 898; + State = 938; Match(LEFT_BRACE); - State = 902; + State = 942; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 899; + State = 939; ((For_through_loopContext)_localctx).body = function_statement(); } } - State = 904; + State = 944; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 905; + State = 945; Match(RIGHT_BRACE); } break; @@ -8491,42 +8564,42 @@ public Top_level_for_loopContext top_level_for_loop() { EnterRule(_localctx, 110, RULE_top_level_for_loop); int _la; try { - State = 939; + State = 979; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,83,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,88,Context) ) { case 1: _localctx = new Top_level_for_to_loopContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 909; + State = 949; Match(FOR); - State = 910; + State = 950; ((Top_level_for_to_loopContext)_localctx).idx = Match(VARIABLE); - State = 911; + State = 951; Match(FROM); - State = 912; + State = 952; ((Top_level_for_to_loopContext)_localctx).for_start = expression(0); - State = 913; + State = 953; Match(TO); - State = 914; + State = 954; ((Top_level_for_to_loopContext)_localctx).end = expression(0); - State = 915; + State = 955; Match(LEFT_BRACE); - State = 919; + State = 959; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737895827256L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7805L) != 0)) { { { - State = 916; + State = 956; ((Top_level_for_to_loopContext)_localctx).body = top_level_statement(); } } - State = 921; + State = 961; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 922; + State = 962; Match(RIGHT_BRACE); } break; @@ -8534,35 +8607,35 @@ public Top_level_for_loopContext top_level_for_loop() { _localctx = new Top_level_for_through_loopContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 924; + State = 964; Match(FOR); - State = 925; + State = 965; ((Top_level_for_through_loopContext)_localctx).idx = Match(VARIABLE); - State = 926; + State = 966; Match(FROM); - State = 927; + State = 967; ((Top_level_for_through_loopContext)_localctx).for_start = expression(0); - State = 928; + State = 968; Match(THROUGH); - State = 929; + State = 969; ((Top_level_for_through_loopContext)_localctx).end = expression(0); - State = 930; + State = 970; Match(LEFT_BRACE); - State = 934; + State = 974; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737895827256L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7805L) != 0)) { { { - State = 931; + State = 971; ((Top_level_for_through_loopContext)_localctx).body = top_level_statement(); } } - State = 936; + State = 976; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 937; + State = 977; Match(RIGHT_BRACE); } break; @@ -8680,42 +8753,42 @@ public Sel_level_for_loopContext sel_level_for_loop() { EnterRule(_localctx, 112, RULE_sel_level_for_loop); int _la; try { - State = 971; + State = 1011; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,86,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,91,Context) ) { case 1: _localctx = new Sel_level_for_to_loopContext(_localctx); EnterOuterAlt(_localctx, 1); { - State = 941; + State = 981; Match(FOR); - State = 942; + State = 982; ((Sel_level_for_to_loopContext)_localctx).idx = Match(VARIABLE); - State = 943; + State = 983; Match(FROM); - State = 944; + State = 984; ((Sel_level_for_to_loopContext)_localctx).for_start = expression(0); - State = 945; + State = 985; Match(TO); - State = 946; + State = 986; ((Sel_level_for_to_loopContext)_localctx).end = expression(0); - State = 947; + State = 987; Match(LEFT_BRACE); - State = 951; + State = 991; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 948; + State = 988; ((Sel_level_for_to_loopContext)_localctx).body = selector_statement(); } } - State = 953; + State = 993; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 954; + State = 994; Match(RIGHT_BRACE); } break; @@ -8723,35 +8796,35 @@ public Sel_level_for_loopContext sel_level_for_loop() { _localctx = new Sel_level_for_through_loopContext(_localctx); EnterOuterAlt(_localctx, 2); { - State = 956; + State = 996; Match(FOR); - State = 957; + State = 997; ((Sel_level_for_through_loopContext)_localctx).idx = Match(VARIABLE); - State = 958; + State = 998; Match(FROM); - State = 959; + State = 999; ((Sel_level_for_through_loopContext)_localctx).for_start = expression(0); - State = 960; + State = 1000; Match(THROUGH); - State = 961; + State = 1001; ((Sel_level_for_through_loopContext)_localctx).end = expression(0); - State = 962; + State = 1002; Match(LEFT_BRACE); - State = 966; + State = 1006; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 963; + State = 1003; ((Sel_level_for_through_loopContext)_localctx).body = selector_statement(); } } - State = 968; + State = 1008; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 969; + State = 1009; Match(RIGHT_BRACE); } break; @@ -8822,43 +8895,43 @@ public Each_loopContext each_loop() { try { EnterOuterAlt(_localctx, 1); { - State = 973; + State = 1013; Match(EACH); - State = 976; + State = 1016; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,87,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,92,Context) ) { case 1: { - State = 974; + State = 1014; _localctx.key = Match(VARIABLE); - State = 975; + State = 1015; Match(COMMA); } break; } - State = 978; + State = 1018; _localctx.val = Match(VARIABLE); - State = 979; + State = 1019; Match(IN); - State = 980; + State = 1020; _localctx.iter = expression(0); - State = 981; + State = 1021; Match(LEFT_BRACE); - State = 985; + State = 1025; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 982; + State = 1022; _localctx.body = function_statement(); } } - State = 987; + State = 1027; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 988; + State = 1028; Match(RIGHT_BRACE); } } @@ -8927,43 +9000,43 @@ public Top_level_each_loopContext top_level_each_loop() { try { EnterOuterAlt(_localctx, 1); { - State = 990; + State = 1030; Match(EACH); - State = 993; + State = 1033; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,89,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,94,Context) ) { case 1: { - State = 991; + State = 1031; _localctx.key = Match(VARIABLE); - State = 992; + State = 1032; Match(COMMA); } break; } - State = 995; + State = 1035; _localctx.val = Match(VARIABLE); - State = 996; + State = 1036; Match(IN); - State = 997; + State = 1037; _localctx.iter = expression(0); - State = 998; + State = 1038; Match(LEFT_BRACE); - State = 1002; + State = 1042; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737895827256L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7805L) != 0)) { { { - State = 999; + State = 1039; _localctx.body = top_level_statement(); } } - State = 1004; + State = 1044; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 1005; + State = 1045; Match(RIGHT_BRACE); } } @@ -9032,43 +9105,43 @@ public Sel_level_each_loopContext sel_level_each_loop() { try { EnterOuterAlt(_localctx, 1); { - State = 1007; + State = 1047; Match(EACH); - State = 1010; + State = 1050; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,91,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,96,Context) ) { case 1: { - State = 1008; + State = 1048; _localctx.key = Match(VARIABLE); - State = 1009; + State = 1049; Match(COMMA); } break; } - State = 1012; + State = 1052; _localctx.val = Match(VARIABLE); - State = 1013; + State = 1053; Match(IN); - State = 1014; + State = 1054; _localctx.iter = expression(0); - State = 1015; + State = 1055; Match(LEFT_BRACE); - State = 1019; + State = 1059; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 1016; + State = 1056; _localctx.body = selector_statement(); } } - State = 1021; + State = 1061; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 1022; + State = 1062; Match(RIGHT_BRACE); } } @@ -9129,27 +9202,27 @@ public While_loopContext while_loop() { try { EnterOuterAlt(_localctx, 1); { - State = 1024; + State = 1064; Match(WHILE); - State = 1025; + State = 1065; _localctx.cond = expression(0); - State = 1026; + State = 1066; Match(LEFT_BRACE); - State = 1030; + State = 1070; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4212256L) != 0) || _la==VARIABLE) { { { - State = 1027; + State = 1067; _localctx.body = function_statement(); } } - State = 1032; + State = 1072; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 1033; + State = 1073; Match(RIGHT_BRACE); } } @@ -9210,27 +9283,27 @@ public Top_level_while_loopContext top_level_while_loop() { try { EnterOuterAlt(_localctx, 1); { - State = 1035; + State = 1075; Match(WHILE); - State = 1036; + State = 1076; _localctx.cond = expression(0); - State = 1037; + State = 1077; Match(LEFT_BRACE); - State = 1041; + State = 1081; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737895827256L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7805L) != 0)) { { { - State = 1038; + State = 1078; _localctx.body = top_level_statement(); } } - State = 1043; + State = 1083; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 1044; + State = 1084; Match(RIGHT_BRACE); } } @@ -9291,27 +9364,27 @@ public Sel_level_while_loopContext sel_level_while_loop() { try { EnterOuterAlt(_localctx, 1); { - State = 1046; + State = 1086; Match(WHILE); - State = 1047; + State = 1087; _localctx.cond = expression(0); - State = 1048; + State = 1088; Match(LEFT_BRACE); - State = 1052; + State = 1092; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 576504737083377184L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 7807L) != 0)) { { { - State = 1049; + State = 1089; _localctx.body = selector_statement(); } } - State = 1054; + State = 1094; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } - State = 1055; + State = 1095; Match(RIGHT_BRACE); } } @@ -9381,7 +9454,7 @@ private bool require_expression_sempred(Require_expressionContext _localctx, int } private static int[] _serializedATN = { - 4,1,77,1058,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, + 4,1,77,1098,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, 7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14, 2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21, 2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28, @@ -9392,364 +9465,379 @@ private bool require_expression_sempred(Require_expressionContext _localctx, int 2,57,7,57,2,58,7,58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,1,0,4,0,128, 8,0,11,0,12,0,129,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,3,1,147,8,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,5,3,156,8,3,10,3,12,3, - 159,9,3,1,4,1,4,3,4,163,8,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1, - 6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6, - 1,6,3,6,194,8,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, - 7,1,7,5,7,211,8,7,10,7,12,7,214,9,7,1,7,1,7,1,7,3,7,219,8,7,1,8,1,8,1, - 8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, - 1,9,1,9,1,9,1,9,1,9,1,9,3,9,247,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10, - 1,10,3,10,257,8,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1, - 12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,5,13,281,8,13, - 10,13,12,13,284,9,13,1,13,1,13,3,13,288,8,13,1,14,1,14,3,14,292,8,14,1, - 15,1,15,1,15,5,15,297,8,15,10,15,12,15,300,9,15,1,15,1,15,1,16,1,16,1, - 16,1,16,5,16,308,8,16,10,16,12,16,311,9,16,1,16,1,16,3,16,315,8,16,1,17, - 1,17,1,17,1,17,1,17,1,18,5,18,323,8,18,10,18,12,18,326,9,18,1,18,1,18, - 1,19,1,19,1,19,1,19,1,19,1,19,3,19,336,8,19,1,20,1,20,1,20,1,20,5,20,342, - 8,20,10,20,12,20,345,9,20,3,20,347,8,20,1,20,1,20,1,21,1,21,1,21,1,21, - 1,21,1,21,1,21,1,21,1,21,5,21,360,8,21,10,21,12,21,363,9,21,1,21,1,21, - 1,21,1,21,1,21,5,21,370,8,21,10,21,12,21,373,9,21,1,21,1,21,1,21,1,21, - 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21, - 1,21,1,21,1,21,1,21,1,21,3,21,398,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1, - 21,1,21,5,21,408,8,21,10,21,12,21,411,9,21,1,22,1,22,1,22,1,22,1,22,1, - 22,1,22,1,22,1,22,5,22,422,8,22,10,22,12,22,425,9,22,1,22,1,22,1,22,1, - 22,1,22,5,22,432,8,22,10,22,12,22,435,9,22,1,22,1,22,1,22,1,22,1,22,1, - 22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1, - 22,1,22,3,22,458,8,22,1,22,1,22,1,22,1,22,1,22,5,22,465,8,22,10,22,12, - 22,468,9,22,1,23,5,23,471,8,23,10,23,12,23,474,9,23,1,24,1,24,1,24,1,24, - 1,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,487,8,24,1,25,1,25,1,25,1,25,5, - 25,493,8,25,10,25,12,25,496,9,25,1,25,1,25,3,25,500,8,25,1,26,1,26,3,26, - 504,8,26,1,27,1,27,1,27,5,27,509,8,27,10,27,12,27,512,9,27,1,27,1,27,1, - 28,1,28,1,28,1,28,5,28,520,8,28,10,28,12,28,523,9,28,1,28,1,28,3,28,527, - 8,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,32,1,32, - 3,32,542,8,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,550,8,32,1,32,1,32,1, - 32,1,32,1,32,1,32,3,32,558,8,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,566, - 8,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,574,8,32,1,32,1,32,1,32,1,32,3, - 32,580,8,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33, - 3,33,594,8,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1, - 34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,616,8,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 159,9,3,1,4,1,4,3,4,163,8,4,1,5,1,5,1,5,1,5,1,6,1,6,5,6,171,8,6,10,6,12, + 6,174,9,6,1,6,1,6,1,6,1,6,1,6,1,6,5,6,182,8,6,10,6,12,6,185,9,6,1,6,1, + 6,1,6,1,6,1,6,1,6,5,6,193,8,6,10,6,12,6,196,9,6,1,6,1,6,1,6,1,6,1,6,1, + 6,5,6,204,8,6,10,6,12,6,207,9,6,1,6,1,6,1,6,1,6,1,6,1,6,5,6,215,8,6,10, + 6,12,6,218,9,6,1,6,1,6,1,6,1,6,3,6,224,8,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,5,7,241,8,7,10,7,12,7,244,9,7,1,7,1,7, + 1,7,3,7,249,8,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1, + 9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,277,8,9,1,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,3,10,287,8,10,1,11,1,11,1,11,1,11,1,11,1, + 11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1, + 13,1,13,1,13,5,13,311,8,13,10,13,12,13,314,9,13,1,13,1,13,3,13,318,8,13, + 1,14,1,14,3,14,322,8,14,1,15,1,15,1,15,5,15,327,8,15,10,15,12,15,330,9, + 15,1,15,1,15,1,16,1,16,1,16,1,16,5,16,338,8,16,10,16,12,16,341,9,16,1, + 16,1,16,3,16,345,8,16,1,17,1,17,1,17,1,17,1,17,1,18,5,18,353,8,18,10,18, + 12,18,356,9,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,3,19,366,8,19,1, + 20,1,20,1,20,1,20,5,20,372,8,20,10,20,12,20,375,9,20,3,20,377,8,20,1,20, + 1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,5,21,390,8,21,10,21, + 12,21,393,9,21,1,21,1,21,1,21,1,21,1,21,5,21,400,8,21,10,21,12,21,403, + 9,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21, + 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,428,8,21,1,21,1, + 21,1,21,1,21,1,21,1,21,1,21,1,21,5,21,438,8,21,10,21,12,21,441,9,21,1, + 22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,5,22,452,8,22,10,22,12,22,455, + 9,22,1,22,1,22,1,22,1,22,1,22,5,22,462,8,22,10,22,12,22,465,9,22,1,22, + 1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 1,22,1,22,1,22,1,22,1,22,1,22,3,22,488,8,22,1,22,1,22,1,22,1,22,1,22,5, + 22,495,8,22,10,22,12,22,498,9,22,1,23,5,23,501,8,23,10,23,12,23,504,9, + 23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,517,8,24, + 1,25,1,25,1,25,1,25,5,25,523,8,25,10,25,12,25,526,9,25,1,25,1,25,3,25, + 530,8,25,1,26,1,26,3,26,534,8,26,1,27,1,27,1,27,5,27,539,8,27,10,27,12, + 27,542,9,27,1,27,1,27,1,28,1,28,1,28,1,28,5,28,550,8,28,10,28,12,28,553, + 9,28,1,28,1,28,3,28,557,8,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1, + 31,1,31,1,31,1,32,1,32,5,32,572,8,32,10,32,12,32,575,9,32,1,32,1,32,1, + 32,1,32,1,32,1,32,5,32,583,8,32,10,32,12,32,586,9,32,1,32,1,32,1,32,1, + 32,1,32,1,32,5,32,594,8,32,10,32,12,32,597,9,32,1,32,1,32,1,32,1,32,1, + 32,1,32,5,32,605,8,32,10,32,12,32,608,9,32,1,32,1,32,1,32,1,32,1,32,1, + 32,5,32,616,8,32,10,32,12,32,619,9,32,1,32,1,32,1,32,1,32,3,32,625,8,32, + 1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,634,8,33,1,34,1,34,1,34,1,34,1, + 34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1, + 34,1,34,3,34,656,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,5,34,681,8,34,10,34,12,34,684,9,34,1,35,1,35,1,35, - 1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, - 3,35,703,8,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,713,8,36,1, - 36,1,36,1,36,1,36,1,36,1,36,5,36,721,8,36,10,36,12,36,724,9,36,1,37,1, - 37,1,37,3,37,729,8,37,1,37,1,37,1,38,3,38,734,8,38,1,38,1,38,5,38,738, - 8,38,10,38,12,38,741,9,38,3,38,743,8,38,1,39,1,39,1,39,3,39,748,8,39,1, - 39,1,39,1,40,3,40,753,8,40,1,40,1,40,5,40,757,8,40,10,40,12,40,760,9,40, - 3,40,762,8,40,1,41,1,41,1,41,1,41,1,41,1,41,3,41,770,8,41,1,42,3,42,773, - 8,42,1,42,1,42,5,42,777,8,42,10,42,12,42,780,9,42,3,42,782,8,42,1,42,3, - 42,785,8,42,1,43,1,43,1,43,1,43,3,43,791,8,43,1,44,3,44,794,8,44,1,44, - 1,44,5,44,798,8,44,10,44,12,44,801,9,44,3,44,803,8,44,1,44,3,44,806,8, - 44,1,45,1,45,1,45,1,45,3,45,812,8,45,1,46,5,46,815,8,46,10,46,12,46,818, - 9,46,1,47,1,47,1,47,1,47,1,47,1,47,3,47,826,8,47,1,48,1,48,1,48,1,48,5, - 48,832,8,48,10,48,12,48,835,9,48,1,48,1,48,3,48,839,8,48,1,49,1,49,3,49, - 843,8,49,1,50,1,50,1,50,5,50,848,8,50,10,50,12,50,851,9,50,1,50,1,50,1, - 51,1,51,1,51,1,51,5,51,859,8,51,10,51,12,51,862,9,51,1,51,1,51,3,51,866, - 8,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54, - 1,54,1,54,1,54,1,54,1,54,5,54,886,8,54,10,54,12,54,889,9,54,1,54,1,54, - 1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,5,54,901,8,54,10,54,12,54,904, - 9,54,1,54,1,54,3,54,908,8,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,5, - 55,918,8,55,10,55,12,55,921,9,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1, - 55,1,55,1,55,5,55,933,8,55,10,55,12,55,936,9,55,1,55,1,55,3,55,940,8,55, - 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,950,8,56,10,56,12,56,953, - 9,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,965,8,56,10, - 56,12,56,968,9,56,1,56,1,56,3,56,972,8,56,1,57,1,57,1,57,3,57,977,8,57, - 1,57,1,57,1,57,1,57,1,57,5,57,984,8,57,10,57,12,57,987,9,57,1,57,1,57, - 1,58,1,58,1,58,3,58,994,8,58,1,58,1,58,1,58,1,58,1,58,5,58,1001,8,58,10, - 58,12,58,1004,9,58,1,58,1,58,1,59,1,59,1,59,3,59,1011,8,59,1,59,1,59,1, - 59,1,59,1,59,5,59,1018,8,59,10,59,12,59,1021,9,59,1,59,1,59,1,60,1,60, - 1,60,1,60,5,60,1029,8,60,10,60,12,60,1032,9,60,1,60,1,60,1,61,1,61,1,61, - 1,61,5,61,1040,8,61,10,61,12,61,1043,9,61,1,61,1,61,1,62,1,62,1,62,1,62, - 5,62,1051,8,62,10,62,12,62,1054,9,62,1,62,1,62,1,62,0,4,42,44,68,72,63, - 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48, - 50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96, - 98,100,102,104,106,108,110,112,114,116,118,120,122,124,0,0,1188,0,127, - 1,0,0,0,2,146,1,0,0,0,4,148,1,0,0,0,6,152,1,0,0,0,8,162,1,0,0,0,10,164, - 1,0,0,0,12,193,1,0,0,0,14,218,1,0,0,0,16,220,1,0,0,0,18,246,1,0,0,0,20, - 256,1,0,0,0,22,258,1,0,0,0,24,267,1,0,0,0,26,276,1,0,0,0,28,291,1,0,0, - 0,30,293,1,0,0,0,32,303,1,0,0,0,34,316,1,0,0,0,36,324,1,0,0,0,38,335,1, - 0,0,0,40,337,1,0,0,0,42,397,1,0,0,0,44,457,1,0,0,0,46,472,1,0,0,0,48,486, - 1,0,0,0,50,488,1,0,0,0,52,503,1,0,0,0,54,505,1,0,0,0,56,515,1,0,0,0,58, - 528,1,0,0,0,60,532,1,0,0,0,62,535,1,0,0,0,64,579,1,0,0,0,66,593,1,0,0, - 0,68,615,1,0,0,0,70,702,1,0,0,0,72,712,1,0,0,0,74,725,1,0,0,0,76,742,1, - 0,0,0,78,744,1,0,0,0,80,761,1,0,0,0,82,769,1,0,0,0,84,781,1,0,0,0,86,790, - 1,0,0,0,88,802,1,0,0,0,90,811,1,0,0,0,92,816,1,0,0,0,94,825,1,0,0,0,96, - 827,1,0,0,0,98,842,1,0,0,0,100,844,1,0,0,0,102,854,1,0,0,0,104,867,1,0, - 0,0,106,871,1,0,0,0,108,907,1,0,0,0,110,939,1,0,0,0,112,971,1,0,0,0,114, - 973,1,0,0,0,116,990,1,0,0,0,118,1007,1,0,0,0,120,1024,1,0,0,0,122,1035, - 1,0,0,0,124,1046,1,0,0,0,126,128,3,2,1,0,127,126,1,0,0,0,128,129,1,0,0, - 0,129,127,1,0,0,0,129,130,1,0,0,0,130,131,1,0,0,0,131,132,5,0,0,1,132, - 1,1,0,0,0,133,147,3,10,5,0,134,147,3,12,6,0,135,147,3,14,7,0,136,147,3, - 22,11,0,137,147,3,24,12,0,138,147,3,26,13,0,139,147,3,34,17,0,140,147, - 3,4,2,0,141,147,3,16,8,0,142,147,3,18,9,0,143,147,3,110,55,0,144,147,3, - 116,58,0,145,147,3,122,61,0,146,133,1,0,0,0,146,134,1,0,0,0,146,135,1, - 0,0,0,146,136,1,0,0,0,146,137,1,0,0,0,146,138,1,0,0,0,146,139,1,0,0,0, - 146,140,1,0,0,0,146,141,1,0,0,0,146,142,1,0,0,0,146,143,1,0,0,0,146,144, - 1,0,0,0,146,145,1,0,0,0,147,3,1,0,0,0,148,149,5,23,0,0,149,150,3,6,3,0, - 150,151,5,36,0,0,151,5,1,0,0,0,152,157,3,8,4,0,153,154,5,42,0,0,154,156, - 3,8,4,0,155,153,1,0,0,0,156,159,1,0,0,0,157,155,1,0,0,0,157,158,1,0,0, - 0,158,7,1,0,0,0,159,157,1,0,0,0,160,163,5,65,0,0,161,163,5,77,0,0,162, - 160,1,0,0,0,162,161,1,0,0,0,163,9,1,0,0,0,164,165,5,3,0,0,165,166,3,8, - 4,0,166,167,5,36,0,0,167,11,1,0,0,0,168,169,5,71,0,0,169,170,5,37,0,0, - 170,171,3,68,34,0,171,172,5,36,0,0,172,194,1,0,0,0,173,174,5,71,0,0,174, - 175,5,38,0,0,175,176,3,68,34,0,176,177,5,36,0,0,177,194,1,0,0,0,178,179, - 5,71,0,0,179,180,5,39,0,0,180,181,3,68,34,0,181,182,5,36,0,0,182,194,1, - 0,0,0,183,184,5,71,0,0,184,185,5,40,0,0,185,186,3,68,34,0,186,187,5,36, - 0,0,187,194,1,0,0,0,188,189,5,71,0,0,189,190,5,41,0,0,190,191,3,68,34, - 0,191,192,5,36,0,0,192,194,1,0,0,0,193,168,1,0,0,0,193,173,1,0,0,0,193, - 178,1,0,0,0,193,183,1,0,0,0,193,188,1,0,0,0,194,13,1,0,0,0,195,196,5,20, - 0,0,196,197,3,8,4,0,197,198,5,36,0,0,198,219,1,0,0,0,199,200,5,20,0,0, - 200,201,3,8,4,0,201,202,5,37,0,0,202,203,5,27,0,0,203,204,5,36,0,0,204, - 219,1,0,0,0,205,206,5,20,0,0,206,207,3,8,4,0,207,208,5,37,0,0,208,212, - 5,30,0,0,209,211,3,20,10,0,210,209,1,0,0,0,211,214,1,0,0,0,212,210,1,0, - 0,0,212,213,1,0,0,0,213,215,1,0,0,0,214,212,1,0,0,0,215,216,5,31,0,0,216, - 217,5,36,0,0,217,219,1,0,0,0,218,195,1,0,0,0,218,199,1,0,0,0,218,205,1, - 0,0,0,219,15,1,0,0,0,220,221,5,28,0,0,221,222,3,8,4,0,222,223,5,42,0,0, - 223,224,3,8,4,0,224,225,5,37,0,0,225,226,3,68,34,0,226,227,5,36,0,0,227, - 17,1,0,0,0,228,229,5,29,0,0,229,230,3,68,34,0,230,231,5,42,0,0,231,232, - 3,8,4,0,232,233,5,42,0,0,233,234,3,8,4,0,234,235,5,37,0,0,235,236,3,68, - 34,0,236,237,5,36,0,0,237,247,1,0,0,0,238,239,5,29,0,0,239,240,3,68,34, - 0,240,241,5,42,0,0,241,242,3,8,4,0,242,243,5,37,0,0,243,244,3,68,34,0, - 244,245,5,36,0,0,245,247,1,0,0,0,246,228,1,0,0,0,246,238,1,0,0,0,247,19, - 1,0,0,0,248,249,5,25,0,0,249,250,3,8,4,0,250,251,5,36,0,0,251,257,1,0, - 0,0,252,253,5,26,0,0,253,254,3,8,4,0,254,255,5,36,0,0,255,257,1,0,0,0, - 256,248,1,0,0,0,256,252,1,0,0,0,257,21,1,0,0,0,258,259,5,4,0,0,259,260, - 5,77,0,0,260,261,5,32,0,0,261,262,3,88,44,0,262,263,5,33,0,0,263,264,5, - 30,0,0,264,265,3,92,46,0,265,266,5,31,0,0,266,23,1,0,0,0,267,268,5,8,0, - 0,268,269,5,77,0,0,269,270,5,32,0,0,270,271,3,88,44,0,271,272,5,33,0,0, - 272,273,5,30,0,0,273,274,3,46,23,0,274,275,5,31,0,0,275,25,1,0,0,0,276, - 277,5,5,0,0,277,278,3,68,34,0,278,282,5,30,0,0,279,281,3,2,1,0,280,279, - 1,0,0,0,281,284,1,0,0,0,282,280,1,0,0,0,282,283,1,0,0,0,283,285,1,0,0, - 0,284,282,1,0,0,0,285,287,5,31,0,0,286,288,3,28,14,0,287,286,1,0,0,0,287, - 288,1,0,0,0,288,27,1,0,0,0,289,292,3,30,15,0,290,292,3,32,16,0,291,289, - 1,0,0,0,291,290,1,0,0,0,292,29,1,0,0,0,293,294,5,6,0,0,294,298,5,30,0, - 0,295,297,3,2,1,0,296,295,1,0,0,0,297,300,1,0,0,0,298,296,1,0,0,0,298, - 299,1,0,0,0,299,301,1,0,0,0,300,298,1,0,0,0,301,302,5,31,0,0,302,31,1, - 0,0,0,303,304,5,7,0,0,304,305,3,68,34,0,305,309,5,30,0,0,306,308,3,2,1, - 0,307,306,1,0,0,0,308,311,1,0,0,0,309,307,1,0,0,0,309,310,1,0,0,0,310, - 312,1,0,0,0,311,309,1,0,0,0,312,314,5,31,0,0,313,315,3,28,14,0,314,313, - 1,0,0,0,314,315,1,0,0,0,315,33,1,0,0,0,316,317,3,36,18,0,317,318,5,30, - 0,0,318,319,3,46,23,0,319,320,5,31,0,0,320,35,1,0,0,0,321,323,3,38,19, - 0,322,321,1,0,0,0,323,326,1,0,0,0,324,322,1,0,0,0,324,325,1,0,0,0,325, - 327,1,0,0,0,326,324,1,0,0,0,327,328,3,42,21,0,328,37,1,0,0,0,329,330,5, - 18,0,0,330,336,3,72,36,0,331,332,5,19,0,0,332,336,3,8,4,0,333,334,5,24, - 0,0,334,336,3,40,20,0,335,329,1,0,0,0,335,331,1,0,0,0,335,333,1,0,0,0, - 336,39,1,0,0,0,337,346,5,32,0,0,338,343,3,68,34,0,339,340,5,42,0,0,340, - 342,3,68,34,0,341,339,1,0,0,0,342,345,1,0,0,0,343,341,1,0,0,0,343,344, - 1,0,0,0,344,347,1,0,0,0,345,343,1,0,0,0,346,338,1,0,0,0,346,347,1,0,0, - 0,347,348,1,0,0,0,348,349,5,33,0,0,349,41,1,0,0,0,350,351,6,21,-1,0,351, - 398,5,77,0,0,352,398,5,65,0,0,353,398,5,69,0,0,354,398,5,70,0,0,355,356, - 5,69,0,0,356,357,5,37,0,0,357,361,5,34,0,0,358,360,3,94,47,0,359,358,1, - 0,0,0,360,363,1,0,0,0,361,359,1,0,0,0,361,362,1,0,0,0,362,364,1,0,0,0, - 363,361,1,0,0,0,364,398,5,35,0,0,365,366,5,70,0,0,366,367,5,37,0,0,367, - 371,5,34,0,0,368,370,3,94,47,0,369,368,1,0,0,0,370,373,1,0,0,0,371,369, - 1,0,0,0,371,372,1,0,0,0,372,374,1,0,0,0,373,371,1,0,0,0,374,398,5,35,0, - 0,375,398,5,67,0,0,376,398,5,68,0,0,377,398,5,74,0,0,378,398,5,75,0,0, - 379,398,5,76,0,0,380,381,5,32,0,0,381,382,3,42,21,0,382,383,5,33,0,0,383, - 398,1,0,0,0,384,385,5,43,0,0,385,398,5,77,0,0,386,387,5,43,0,0,387,398, - 5,65,0,0,388,389,5,59,0,0,389,398,5,69,0,0,390,391,5,59,0,0,391,398,5, - 70,0,0,392,393,5,59,0,0,393,398,5,67,0,0,394,395,5,59,0,0,395,398,5,68, - 0,0,396,398,5,45,0,0,397,350,1,0,0,0,397,352,1,0,0,0,397,353,1,0,0,0,397, - 354,1,0,0,0,397,355,1,0,0,0,397,365,1,0,0,0,397,375,1,0,0,0,397,376,1, - 0,0,0,397,377,1,0,0,0,397,378,1,0,0,0,397,379,1,0,0,0,397,380,1,0,0,0, - 397,384,1,0,0,0,397,386,1,0,0,0,397,388,1,0,0,0,397,390,1,0,0,0,397,392, - 1,0,0,0,397,394,1,0,0,0,397,396,1,0,0,0,398,409,1,0,0,0,399,400,10,10, - 0,0,400,401,5,42,0,0,401,408,3,44,22,0,402,403,10,9,0,0,403,404,5,49,0, - 0,404,408,3,44,22,0,405,406,10,8,0,0,406,408,3,44,22,0,407,399,1,0,0,0, - 407,402,1,0,0,0,407,405,1,0,0,0,408,411,1,0,0,0,409,407,1,0,0,0,409,410, - 1,0,0,0,410,43,1,0,0,0,411,409,1,0,0,0,412,413,6,22,-1,0,413,458,5,77, - 0,0,414,458,5,65,0,0,415,458,5,69,0,0,416,458,5,70,0,0,417,418,5,69,0, - 0,418,419,5,37,0,0,419,423,5,34,0,0,420,422,3,94,47,0,421,420,1,0,0,0, - 422,425,1,0,0,0,423,421,1,0,0,0,423,424,1,0,0,0,424,426,1,0,0,0,425,423, - 1,0,0,0,426,458,5,35,0,0,427,428,5,70,0,0,428,429,5,37,0,0,429,433,5,34, - 0,0,430,432,3,94,47,0,431,430,1,0,0,0,432,435,1,0,0,0,433,431,1,0,0,0, - 433,434,1,0,0,0,434,436,1,0,0,0,435,433,1,0,0,0,436,458,5,35,0,0,437,458, - 5,67,0,0,438,458,5,68,0,0,439,458,5,74,0,0,440,441,5,32,0,0,441,442,3, - 44,22,0,442,443,5,33,0,0,443,458,1,0,0,0,444,445,5,43,0,0,445,458,5,77, - 0,0,446,447,5,43,0,0,447,458,5,65,0,0,448,449,5,59,0,0,449,458,5,69,0, - 0,450,451,5,59,0,0,451,458,5,70,0,0,452,453,5,59,0,0,453,458,5,67,0,0, - 454,455,5,59,0,0,455,458,5,68,0,0,456,458,5,45,0,0,457,412,1,0,0,0,457, - 414,1,0,0,0,457,415,1,0,0,0,457,416,1,0,0,0,457,417,1,0,0,0,457,427,1, - 0,0,0,457,437,1,0,0,0,457,438,1,0,0,0,457,439,1,0,0,0,457,440,1,0,0,0, - 457,444,1,0,0,0,457,446,1,0,0,0,457,448,1,0,0,0,457,450,1,0,0,0,457,452, - 1,0,0,0,457,454,1,0,0,0,457,456,1,0,0,0,458,466,1,0,0,0,459,460,10,9,0, - 0,460,461,5,42,0,0,461,465,3,44,22,10,462,463,10,8,0,0,463,465,3,44,22, - 9,464,459,1,0,0,0,464,462,1,0,0,0,465,468,1,0,0,0,466,464,1,0,0,0,466, - 467,1,0,0,0,467,45,1,0,0,0,468,466,1,0,0,0,469,471,3,48,24,0,470,469,1, - 0,0,0,471,474,1,0,0,0,472,470,1,0,0,0,472,473,1,0,0,0,473,47,1,0,0,0,474, - 472,1,0,0,0,475,487,3,12,6,0,476,487,3,50,25,0,477,487,3,118,59,0,478, - 487,3,124,62,0,479,487,3,112,56,0,480,487,3,58,29,0,481,487,3,60,30,0, - 482,487,3,62,31,0,483,487,3,64,32,0,484,487,3,34,17,0,485,487,3,106,53, - 0,486,475,1,0,0,0,486,476,1,0,0,0,486,477,1,0,0,0,486,478,1,0,0,0,486, - 479,1,0,0,0,486,480,1,0,0,0,486,481,1,0,0,0,486,482,1,0,0,0,486,483,1, - 0,0,0,486,484,1,0,0,0,486,485,1,0,0,0,487,49,1,0,0,0,488,489,5,5,0,0,489, - 490,3,68,34,0,490,494,5,30,0,0,491,493,3,48,24,0,492,491,1,0,0,0,493,496, - 1,0,0,0,494,492,1,0,0,0,494,495,1,0,0,0,495,497,1,0,0,0,496,494,1,0,0, - 0,497,499,5,31,0,0,498,500,3,52,26,0,499,498,1,0,0,0,499,500,1,0,0,0,500, - 51,1,0,0,0,501,504,3,54,27,0,502,504,3,56,28,0,503,501,1,0,0,0,503,502, - 1,0,0,0,504,53,1,0,0,0,505,506,5,6,0,0,506,510,5,30,0,0,507,509,3,48,24, - 0,508,507,1,0,0,0,509,512,1,0,0,0,510,508,1,0,0,0,510,511,1,0,0,0,511, - 513,1,0,0,0,512,510,1,0,0,0,513,514,5,31,0,0,514,55,1,0,0,0,515,516,5, - 7,0,0,516,517,3,68,34,0,517,521,5,30,0,0,518,520,3,48,24,0,519,518,1,0, - 0,0,520,523,1,0,0,0,521,519,1,0,0,0,521,522,1,0,0,0,522,524,1,0,0,0,523, - 521,1,0,0,0,524,526,5,31,0,0,525,527,3,52,26,0,526,525,1,0,0,0,526,527, - 1,0,0,0,527,57,1,0,0,0,528,529,5,16,0,0,529,530,3,68,34,0,530,531,5,36, - 0,0,531,59,1,0,0,0,532,533,5,66,0,0,533,534,5,36,0,0,534,61,1,0,0,0,535, - 536,5,17,0,0,536,537,3,68,34,0,537,538,5,36,0,0,538,63,1,0,0,0,539,541, - 3,8,4,0,540,542,3,66,33,0,541,540,1,0,0,0,541,542,1,0,0,0,542,543,1,0, - 0,0,543,544,5,37,0,0,544,545,3,68,34,0,545,546,5,36,0,0,546,580,1,0,0, - 0,547,549,3,8,4,0,548,550,3,66,33,0,549,548,1,0,0,0,549,550,1,0,0,0,550, - 551,1,0,0,0,551,552,5,38,0,0,552,553,3,68,34,0,553,554,5,36,0,0,554,580, - 1,0,0,0,555,557,3,8,4,0,556,558,3,66,33,0,557,556,1,0,0,0,557,558,1,0, - 0,0,558,559,1,0,0,0,559,560,5,39,0,0,560,561,3,68,34,0,561,562,5,36,0, - 0,562,580,1,0,0,0,563,565,3,8,4,0,564,566,3,66,33,0,565,564,1,0,0,0,565, - 566,1,0,0,0,566,567,1,0,0,0,567,568,5,41,0,0,568,569,3,68,34,0,569,570, - 5,36,0,0,570,580,1,0,0,0,571,573,3,8,4,0,572,574,3,66,33,0,573,572,1,0, - 0,0,573,574,1,0,0,0,574,575,1,0,0,0,575,576,5,40,0,0,576,577,3,68,34,0, - 577,578,5,36,0,0,578,580,1,0,0,0,579,539,1,0,0,0,579,547,1,0,0,0,579,555, - 1,0,0,0,579,563,1,0,0,0,579,571,1,0,0,0,580,65,1,0,0,0,581,582,5,34,0, - 0,582,583,5,64,0,0,583,594,5,35,0,0,584,585,5,34,0,0,585,586,5,77,0,0, - 586,594,5,35,0,0,587,588,5,34,0,0,588,589,5,69,0,0,589,594,5,35,0,0,590, - 591,5,34,0,0,591,592,5,65,0,0,592,594,5,35,0,0,593,581,1,0,0,0,593,584, - 1,0,0,0,593,587,1,0,0,0,593,590,1,0,0,0,594,67,1,0,0,0,595,596,6,34,-1, - 0,596,597,5,77,0,0,597,598,5,32,0,0,598,599,3,84,42,0,599,600,5,33,0,0, - 600,616,1,0,0,0,601,616,3,70,35,0,602,616,5,71,0,0,603,616,5,72,0,0,604, - 616,5,73,0,0,605,606,5,32,0,0,606,607,3,68,34,0,607,608,5,33,0,0,608,616, - 1,0,0,0,609,610,5,44,0,0,610,616,3,68,34,20,611,612,5,43,0,0,612,616,3, - 68,34,19,613,614,5,48,0,0,614,616,3,68,34,18,615,595,1,0,0,0,615,601,1, - 0,0,0,615,602,1,0,0,0,615,603,1,0,0,0,615,604,1,0,0,0,615,605,1,0,0,0, - 615,609,1,0,0,0,615,611,1,0,0,0,615,613,1,0,0,0,616,682,1,0,0,0,617,618, - 10,14,0,0,618,619,5,45,0,0,619,681,3,68,34,15,620,621,10,13,0,0,621,622, - 5,46,0,0,622,681,3,68,34,14,623,624,10,12,0,0,624,625,5,47,0,0,625,681, - 3,68,34,13,626,627,10,11,0,0,627,628,5,43,0,0,628,681,3,68,34,12,629,630, - 10,10,0,0,630,631,5,44,0,0,631,681,3,68,34,11,632,633,10,9,0,0,633,634, - 5,49,0,0,634,681,3,68,34,10,635,636,10,8,0,0,636,637,5,51,0,0,637,681, - 3,68,34,9,638,639,10,7,0,0,639,640,5,50,0,0,640,681,3,68,34,8,641,642, - 10,6,0,0,642,643,5,52,0,0,643,681,3,68,34,7,644,645,10,5,0,0,645,646,5, - 53,0,0,646,681,3,68,34,6,647,648,10,4,0,0,648,649,5,54,0,0,649,681,3,68, - 34,5,650,651,10,3,0,0,651,652,5,55,0,0,652,681,3,68,34,4,653,654,10,2, - 0,0,654,655,5,56,0,0,655,681,3,68,34,3,656,657,10,1,0,0,657,658,5,57,0, - 0,658,659,3,68,34,0,659,660,5,58,0,0,660,661,3,68,34,2,661,681,1,0,0,0, - 662,663,10,17,0,0,663,664,5,37,0,0,664,665,5,77,0,0,665,666,5,32,0,0,666, - 667,3,84,42,0,667,668,5,33,0,0,668,681,1,0,0,0,669,670,10,16,0,0,670,671, - 5,74,0,0,671,672,5,32,0,0,672,673,3,84,42,0,673,674,5,33,0,0,674,681,1, - 0,0,0,675,676,10,15,0,0,676,677,5,34,0,0,677,678,3,68,34,0,678,679,5,35, - 0,0,679,681,1,0,0,0,680,617,1,0,0,0,680,620,1,0,0,0,680,623,1,0,0,0,680, - 626,1,0,0,0,680,629,1,0,0,0,680,632,1,0,0,0,680,635,1,0,0,0,680,638,1, - 0,0,0,680,641,1,0,0,0,680,644,1,0,0,0,680,647,1,0,0,0,680,650,1,0,0,0, - 680,653,1,0,0,0,680,656,1,0,0,0,680,662,1,0,0,0,680,669,1,0,0,0,680,675, - 1,0,0,0,681,684,1,0,0,0,682,680,1,0,0,0,682,683,1,0,0,0,683,69,1,0,0,0, - 684,682,1,0,0,0,685,703,5,66,0,0,686,703,5,61,0,0,687,703,5,62,0,0,688, - 703,5,64,0,0,689,703,5,65,0,0,690,703,5,77,0,0,691,703,5,60,0,0,692,693, - 5,4,0,0,693,694,5,32,0,0,694,695,3,88,44,0,695,696,5,33,0,0,696,697,5, - 30,0,0,697,698,3,92,46,0,698,699,5,31,0,0,699,703,1,0,0,0,700,703,3,74, - 37,0,701,703,3,78,39,0,702,685,1,0,0,0,702,686,1,0,0,0,702,687,1,0,0,0, - 702,688,1,0,0,0,702,689,1,0,0,0,702,690,1,0,0,0,702,691,1,0,0,0,702,692, - 1,0,0,0,702,700,1,0,0,0,702,701,1,0,0,0,703,71,1,0,0,0,704,705,6,36,-1, - 0,705,706,5,32,0,0,706,707,3,72,36,0,707,708,5,33,0,0,708,713,1,0,0,0, - 709,710,5,48,0,0,710,713,3,72,36,2,711,713,3,8,4,0,712,704,1,0,0,0,712, - 709,1,0,0,0,712,711,1,0,0,0,713,722,1,0,0,0,714,715,10,4,0,0,715,716,5, - 55,0,0,716,721,3,72,36,5,717,718,10,3,0,0,718,719,5,56,0,0,719,721,3,72, - 36,4,720,714,1,0,0,0,720,717,1,0,0,0,721,724,1,0,0,0,722,720,1,0,0,0,722, - 723,1,0,0,0,723,73,1,0,0,0,724,722,1,0,0,0,725,726,5,34,0,0,726,728,3, - 76,38,0,727,729,5,42,0,0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0, - 0,730,731,5,35,0,0,731,75,1,0,0,0,732,734,3,68,34,0,733,732,1,0,0,0,733, - 734,1,0,0,0,734,739,1,0,0,0,735,736,5,42,0,0,736,738,3,68,34,0,737,735, - 1,0,0,0,738,741,1,0,0,0,739,737,1,0,0,0,739,740,1,0,0,0,740,743,1,0,0, - 0,741,739,1,0,0,0,742,733,1,0,0,0,742,743,1,0,0,0,743,77,1,0,0,0,744,745, - 5,30,0,0,745,747,3,80,40,0,746,748,5,42,0,0,747,746,1,0,0,0,747,748,1, - 0,0,0,748,749,1,0,0,0,749,750,5,31,0,0,750,79,1,0,0,0,751,753,3,82,41, - 0,752,751,1,0,0,0,752,753,1,0,0,0,753,758,1,0,0,0,754,755,5,42,0,0,755, - 757,3,82,41,0,756,754,1,0,0,0,757,760,1,0,0,0,758,756,1,0,0,0,758,759, - 1,0,0,0,759,762,1,0,0,0,760,758,1,0,0,0,761,752,1,0,0,0,761,762,1,0,0, - 0,762,81,1,0,0,0,763,764,5,77,0,0,764,765,5,37,0,0,765,770,3,68,34,0,766, - 767,5,65,0,0,767,768,5,37,0,0,768,770,3,68,34,0,769,763,1,0,0,0,769,766, - 1,0,0,0,770,83,1,0,0,0,771,773,3,86,43,0,772,771,1,0,0,0,772,773,1,0,0, - 0,773,778,1,0,0,0,774,775,5,42,0,0,775,777,3,86,43,0,776,774,1,0,0,0,777, - 780,1,0,0,0,778,776,1,0,0,0,778,779,1,0,0,0,779,782,1,0,0,0,780,778,1, - 0,0,0,781,772,1,0,0,0,781,782,1,0,0,0,782,784,1,0,0,0,783,785,5,42,0,0, - 784,783,1,0,0,0,784,785,1,0,0,0,785,85,1,0,0,0,786,787,5,71,0,0,787,788, - 5,37,0,0,788,791,3,68,34,0,789,791,3,68,34,0,790,786,1,0,0,0,790,789,1, - 0,0,0,791,87,1,0,0,0,792,794,3,90,45,0,793,792,1,0,0,0,793,794,1,0,0,0, - 794,799,1,0,0,0,795,796,5,42,0,0,796,798,3,90,45,0,797,795,1,0,0,0,798, - 801,1,0,0,0,799,797,1,0,0,0,799,800,1,0,0,0,800,803,1,0,0,0,801,799,1, - 0,0,0,802,793,1,0,0,0,802,803,1,0,0,0,803,805,1,0,0,0,804,806,5,42,0,0, - 805,804,1,0,0,0,805,806,1,0,0,0,806,89,1,0,0,0,807,812,5,71,0,0,808,809, - 5,71,0,0,809,810,5,37,0,0,810,812,3,68,34,0,811,807,1,0,0,0,811,808,1, - 0,0,0,812,91,1,0,0,0,813,815,3,94,47,0,814,813,1,0,0,0,815,818,1,0,0,0, - 816,814,1,0,0,0,816,817,1,0,0,0,817,93,1,0,0,0,818,816,1,0,0,0,819,826, - 3,12,6,0,820,826,3,96,48,0,821,826,3,104,52,0,822,826,3,108,54,0,823,826, - 3,114,57,0,824,826,3,120,60,0,825,819,1,0,0,0,825,820,1,0,0,0,825,821, - 1,0,0,0,825,822,1,0,0,0,825,823,1,0,0,0,825,824,1,0,0,0,826,95,1,0,0,0, - 827,828,5,5,0,0,828,829,3,68,34,0,829,833,5,30,0,0,830,832,3,94,47,0,831, - 830,1,0,0,0,832,835,1,0,0,0,833,831,1,0,0,0,833,834,1,0,0,0,834,836,1, - 0,0,0,835,833,1,0,0,0,836,838,5,31,0,0,837,839,3,98,49,0,838,837,1,0,0, - 0,838,839,1,0,0,0,839,97,1,0,0,0,840,843,3,100,50,0,841,843,3,102,51,0, - 842,840,1,0,0,0,842,841,1,0,0,0,843,99,1,0,0,0,844,845,5,6,0,0,845,849, - 5,30,0,0,846,848,3,94,47,0,847,846,1,0,0,0,848,851,1,0,0,0,849,847,1,0, - 0,0,849,850,1,0,0,0,850,852,1,0,0,0,851,849,1,0,0,0,852,853,5,31,0,0,853, - 101,1,0,0,0,854,855,5,7,0,0,855,856,3,68,34,0,856,860,5,30,0,0,857,859, - 3,94,47,0,858,857,1,0,0,0,859,862,1,0,0,0,860,858,1,0,0,0,860,861,1,0, - 0,0,861,863,1,0,0,0,862,860,1,0,0,0,863,865,5,31,0,0,864,866,3,98,49,0, - 865,864,1,0,0,0,865,866,1,0,0,0,866,103,1,0,0,0,867,868,5,22,0,0,868,869, - 3,68,34,0,869,870,5,36,0,0,870,105,1,0,0,0,871,872,5,21,0,0,872,873,5, - 77,0,0,873,874,5,32,0,0,874,875,3,84,42,0,875,876,5,33,0,0,876,107,1,0, - 0,0,877,878,5,10,0,0,878,879,5,71,0,0,879,880,5,11,0,0,880,881,3,68,34, - 0,881,882,5,13,0,0,882,883,3,68,34,0,883,887,5,30,0,0,884,886,3,94,47, - 0,885,884,1,0,0,0,886,889,1,0,0,0,887,885,1,0,0,0,887,888,1,0,0,0,888, - 890,1,0,0,0,889,887,1,0,0,0,890,891,5,31,0,0,891,908,1,0,0,0,892,893,5, - 10,0,0,893,894,5,71,0,0,894,895,5,11,0,0,895,896,3,68,34,0,896,897,5,12, - 0,0,897,898,3,68,34,0,898,902,5,30,0,0,899,901,3,94,47,0,900,899,1,0,0, - 0,901,904,1,0,0,0,902,900,1,0,0,0,902,903,1,0,0,0,903,905,1,0,0,0,904, - 902,1,0,0,0,905,906,5,31,0,0,906,908,1,0,0,0,907,877,1,0,0,0,907,892,1, - 0,0,0,908,109,1,0,0,0,909,910,5,10,0,0,910,911,5,71,0,0,911,912,5,11,0, - 0,912,913,3,68,34,0,913,914,5,13,0,0,914,915,3,68,34,0,915,919,5,30,0, - 0,916,918,3,2,1,0,917,916,1,0,0,0,918,921,1,0,0,0,919,917,1,0,0,0,919, - 920,1,0,0,0,920,922,1,0,0,0,921,919,1,0,0,0,922,923,5,31,0,0,923,940,1, - 0,0,0,924,925,5,10,0,0,925,926,5,71,0,0,926,927,5,11,0,0,927,928,3,68, - 34,0,928,929,5,12,0,0,929,930,3,68,34,0,930,934,5,30,0,0,931,933,3,2,1, - 0,932,931,1,0,0,0,933,936,1,0,0,0,934,932,1,0,0,0,934,935,1,0,0,0,935, - 937,1,0,0,0,936,934,1,0,0,0,937,938,5,31,0,0,938,940,1,0,0,0,939,909,1, - 0,0,0,939,924,1,0,0,0,940,111,1,0,0,0,941,942,5,10,0,0,942,943,5,71,0, - 0,943,944,5,11,0,0,944,945,3,68,34,0,945,946,5,13,0,0,946,947,3,68,34, - 0,947,951,5,30,0,0,948,950,3,48,24,0,949,948,1,0,0,0,950,953,1,0,0,0,951, - 949,1,0,0,0,951,952,1,0,0,0,952,954,1,0,0,0,953,951,1,0,0,0,954,955,5, - 31,0,0,955,972,1,0,0,0,956,957,5,10,0,0,957,958,5,71,0,0,958,959,5,11, - 0,0,959,960,3,68,34,0,960,961,5,12,0,0,961,962,3,68,34,0,962,966,5,30, - 0,0,963,965,3,48,24,0,964,963,1,0,0,0,965,968,1,0,0,0,966,964,1,0,0,0, - 966,967,1,0,0,0,967,969,1,0,0,0,968,966,1,0,0,0,969,970,5,31,0,0,970,972, - 1,0,0,0,971,941,1,0,0,0,971,956,1,0,0,0,972,113,1,0,0,0,973,976,5,14,0, - 0,974,975,5,71,0,0,975,977,5,42,0,0,976,974,1,0,0,0,976,977,1,0,0,0,977, - 978,1,0,0,0,978,979,5,71,0,0,979,980,5,15,0,0,980,981,3,68,34,0,981,985, - 5,30,0,0,982,984,3,94,47,0,983,982,1,0,0,0,984,987,1,0,0,0,985,983,1,0, - 0,0,985,986,1,0,0,0,986,988,1,0,0,0,987,985,1,0,0,0,988,989,5,31,0,0,989, - 115,1,0,0,0,990,993,5,14,0,0,991,992,5,71,0,0,992,994,5,42,0,0,993,991, - 1,0,0,0,993,994,1,0,0,0,994,995,1,0,0,0,995,996,5,71,0,0,996,997,5,15, - 0,0,997,998,3,68,34,0,998,1002,5,30,0,0,999,1001,3,2,1,0,1000,999,1,0, - 0,0,1001,1004,1,0,0,0,1002,1000,1,0,0,0,1002,1003,1,0,0,0,1003,1005,1, - 0,0,0,1004,1002,1,0,0,0,1005,1006,5,31,0,0,1006,117,1,0,0,0,1007,1010, - 5,14,0,0,1008,1009,5,71,0,0,1009,1011,5,42,0,0,1010,1008,1,0,0,0,1010, - 1011,1,0,0,0,1011,1012,1,0,0,0,1012,1013,5,71,0,0,1013,1014,5,15,0,0,1014, - 1015,3,68,34,0,1015,1019,5,30,0,0,1016,1018,3,48,24,0,1017,1016,1,0,0, - 0,1018,1021,1,0,0,0,1019,1017,1,0,0,0,1019,1020,1,0,0,0,1020,1022,1,0, - 0,0,1021,1019,1,0,0,0,1022,1023,5,31,0,0,1023,119,1,0,0,0,1024,1025,5, - 9,0,0,1025,1026,3,68,34,0,1026,1030,5,30,0,0,1027,1029,3,94,47,0,1028, - 1027,1,0,0,0,1029,1032,1,0,0,0,1030,1028,1,0,0,0,1030,1031,1,0,0,0,1031, - 1033,1,0,0,0,1032,1030,1,0,0,0,1033,1034,5,31,0,0,1034,121,1,0,0,0,1035, - 1036,5,9,0,0,1036,1037,3,68,34,0,1037,1041,5,30,0,0,1038,1040,3,2,1,0, - 1039,1038,1,0,0,0,1040,1043,1,0,0,0,1041,1039,1,0,0,0,1041,1042,1,0,0, - 0,1042,1044,1,0,0,0,1043,1041,1,0,0,0,1044,1045,5,31,0,0,1045,123,1,0, - 0,0,1046,1047,5,9,0,0,1047,1048,3,68,34,0,1048,1052,5,30,0,0,1049,1051, - 3,48,24,0,1050,1049,1,0,0,0,1051,1054,1,0,0,0,1052,1050,1,0,0,0,1052,1053, - 1,0,0,0,1053,1055,1,0,0,0,1054,1052,1,0,0,0,1055,1056,5,31,0,0,1056,125, - 1,0,0,0,96,129,146,157,162,193,212,218,246,256,282,287,291,298,309,314, - 324,335,343,346,361,371,397,407,409,423,433,457,464,466,472,486,494,499, - 503,510,521,526,541,549,557,565,573,579,593,615,680,682,702,712,720,722, - 728,733,739,742,747,752,758,761,769,772,778,781,784,790,793,799,802,805, - 811,816,825,833,838,842,849,860,865,887,902,907,919,934,939,951,966,971, - 976,985,993,1002,1010,1019,1030,1041,1052 + 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,5,34,721,8,34,10, + 34,12,34,724,9,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,1,35,3,35,743,8,35,1,36,1,36,1,36,1,36,1,36, + 1,36,1,36,1,36,3,36,753,8,36,1,36,1,36,1,36,1,36,1,36,1,36,5,36,761,8, + 36,10,36,12,36,764,9,36,1,37,1,37,1,37,3,37,769,8,37,1,37,1,37,1,38,3, + 38,774,8,38,1,38,1,38,5,38,778,8,38,10,38,12,38,781,9,38,3,38,783,8,38, + 1,39,1,39,1,39,3,39,788,8,39,1,39,1,39,1,40,3,40,793,8,40,1,40,1,40,5, + 40,797,8,40,10,40,12,40,800,9,40,3,40,802,8,40,1,41,1,41,1,41,1,41,1,41, + 1,41,3,41,810,8,41,1,42,3,42,813,8,42,1,42,1,42,5,42,817,8,42,10,42,12, + 42,820,9,42,3,42,822,8,42,1,42,3,42,825,8,42,1,43,1,43,1,43,1,43,3,43, + 831,8,43,1,44,3,44,834,8,44,1,44,1,44,5,44,838,8,44,10,44,12,44,841,9, + 44,3,44,843,8,44,1,44,3,44,846,8,44,1,45,1,45,1,45,1,45,3,45,852,8,45, + 1,46,5,46,855,8,46,10,46,12,46,858,9,46,1,47,1,47,1,47,1,47,1,47,1,47, + 3,47,866,8,47,1,48,1,48,1,48,1,48,5,48,872,8,48,10,48,12,48,875,9,48,1, + 48,1,48,3,48,879,8,48,1,49,1,49,3,49,883,8,49,1,50,1,50,1,50,5,50,888, + 8,50,10,50,12,50,891,9,50,1,50,1,50,1,51,1,51,1,51,1,51,5,51,899,8,51, + 10,51,12,51,902,9,51,1,51,1,51,3,51,906,8,51,1,52,1,52,1,52,1,52,1,53, + 1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,5,54, + 926,8,54,10,54,12,54,929,9,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54, + 1,54,1,54,5,54,941,8,54,10,54,12,54,944,9,54,1,54,1,54,3,54,948,8,54,1, + 55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,5,55,958,8,55,10,55,12,55,961,9, + 55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,5,55,973,8,55,10, + 55,12,55,976,9,55,1,55,1,55,3,55,980,8,55,1,56,1,56,1,56,1,56,1,56,1,56, + 1,56,1,56,5,56,990,8,56,10,56,12,56,993,9,56,1,56,1,56,1,56,1,56,1,56, + 1,56,1,56,1,56,1,56,1,56,5,56,1005,8,56,10,56,12,56,1008,9,56,1,56,1,56, + 3,56,1012,8,56,1,57,1,57,1,57,3,57,1017,8,57,1,57,1,57,1,57,1,57,1,57, + 5,57,1024,8,57,10,57,12,57,1027,9,57,1,57,1,57,1,58,1,58,1,58,3,58,1034, + 8,58,1,58,1,58,1,58,1,58,1,58,5,58,1041,8,58,10,58,12,58,1044,9,58,1,58, + 1,58,1,59,1,59,1,59,3,59,1051,8,59,1,59,1,59,1,59,1,59,1,59,5,59,1058, + 8,59,10,59,12,59,1061,9,59,1,59,1,59,1,60,1,60,1,60,1,60,5,60,1069,8,60, + 10,60,12,60,1072,9,60,1,60,1,60,1,61,1,61,1,61,1,61,5,61,1080,8,61,10, + 61,12,61,1083,9,61,1,61,1,61,1,62,1,62,1,62,1,62,5,62,1091,8,62,10,62, + 12,62,1094,9,62,1,62,1,62,1,62,0,4,42,44,68,72,63,0,2,4,6,8,10,12,14,16, + 18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64, + 66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108, + 110,112,114,116,118,120,122,124,0,0,1231,0,127,1,0,0,0,2,146,1,0,0,0,4, + 148,1,0,0,0,6,152,1,0,0,0,8,162,1,0,0,0,10,164,1,0,0,0,12,223,1,0,0,0, + 14,248,1,0,0,0,16,250,1,0,0,0,18,276,1,0,0,0,20,286,1,0,0,0,22,288,1,0, + 0,0,24,297,1,0,0,0,26,306,1,0,0,0,28,321,1,0,0,0,30,323,1,0,0,0,32,333, + 1,0,0,0,34,346,1,0,0,0,36,354,1,0,0,0,38,365,1,0,0,0,40,367,1,0,0,0,42, + 427,1,0,0,0,44,487,1,0,0,0,46,502,1,0,0,0,48,516,1,0,0,0,50,518,1,0,0, + 0,52,533,1,0,0,0,54,535,1,0,0,0,56,545,1,0,0,0,58,558,1,0,0,0,60,562,1, + 0,0,0,62,565,1,0,0,0,64,624,1,0,0,0,66,633,1,0,0,0,68,655,1,0,0,0,70,742, + 1,0,0,0,72,752,1,0,0,0,74,765,1,0,0,0,76,782,1,0,0,0,78,784,1,0,0,0,80, + 801,1,0,0,0,82,809,1,0,0,0,84,821,1,0,0,0,86,830,1,0,0,0,88,842,1,0,0, + 0,90,851,1,0,0,0,92,856,1,0,0,0,94,865,1,0,0,0,96,867,1,0,0,0,98,882,1, + 0,0,0,100,884,1,0,0,0,102,894,1,0,0,0,104,907,1,0,0,0,106,911,1,0,0,0, + 108,947,1,0,0,0,110,979,1,0,0,0,112,1011,1,0,0,0,114,1013,1,0,0,0,116, + 1030,1,0,0,0,118,1047,1,0,0,0,120,1064,1,0,0,0,122,1075,1,0,0,0,124,1086, + 1,0,0,0,126,128,3,2,1,0,127,126,1,0,0,0,128,129,1,0,0,0,129,127,1,0,0, + 0,129,130,1,0,0,0,130,131,1,0,0,0,131,132,5,0,0,1,132,1,1,0,0,0,133,147, + 3,10,5,0,134,147,3,12,6,0,135,147,3,14,7,0,136,147,3,22,11,0,137,147,3, + 24,12,0,138,147,3,26,13,0,139,147,3,34,17,0,140,147,3,4,2,0,141,147,3, + 16,8,0,142,147,3,18,9,0,143,147,3,110,55,0,144,147,3,116,58,0,145,147, + 3,122,61,0,146,133,1,0,0,0,146,134,1,0,0,0,146,135,1,0,0,0,146,136,1,0, + 0,0,146,137,1,0,0,0,146,138,1,0,0,0,146,139,1,0,0,0,146,140,1,0,0,0,146, + 141,1,0,0,0,146,142,1,0,0,0,146,143,1,0,0,0,146,144,1,0,0,0,146,145,1, + 0,0,0,147,3,1,0,0,0,148,149,5,23,0,0,149,150,3,6,3,0,150,151,5,36,0,0, + 151,5,1,0,0,0,152,157,3,8,4,0,153,154,5,42,0,0,154,156,3,8,4,0,155,153, + 1,0,0,0,156,159,1,0,0,0,157,155,1,0,0,0,157,158,1,0,0,0,158,7,1,0,0,0, + 159,157,1,0,0,0,160,163,5,65,0,0,161,163,5,77,0,0,162,160,1,0,0,0,162, + 161,1,0,0,0,163,9,1,0,0,0,164,165,5,3,0,0,165,166,3,8,4,0,166,167,5,36, + 0,0,167,11,1,0,0,0,168,172,5,71,0,0,169,171,3,66,33,0,170,169,1,0,0,0, + 171,174,1,0,0,0,172,170,1,0,0,0,172,173,1,0,0,0,173,175,1,0,0,0,174,172, + 1,0,0,0,175,176,5,37,0,0,176,177,3,68,34,0,177,178,5,36,0,0,178,224,1, + 0,0,0,179,183,5,71,0,0,180,182,3,66,33,0,181,180,1,0,0,0,182,185,1,0,0, + 0,183,181,1,0,0,0,183,184,1,0,0,0,184,186,1,0,0,0,185,183,1,0,0,0,186, + 187,5,38,0,0,187,188,3,68,34,0,188,189,5,36,0,0,189,224,1,0,0,0,190,194, + 5,71,0,0,191,193,3,66,33,0,192,191,1,0,0,0,193,196,1,0,0,0,194,192,1,0, + 0,0,194,195,1,0,0,0,195,197,1,0,0,0,196,194,1,0,0,0,197,198,5,39,0,0,198, + 199,3,68,34,0,199,200,5,36,0,0,200,224,1,0,0,0,201,205,5,71,0,0,202,204, + 3,66,33,0,203,202,1,0,0,0,204,207,1,0,0,0,205,203,1,0,0,0,205,206,1,0, + 0,0,206,208,1,0,0,0,207,205,1,0,0,0,208,209,5,40,0,0,209,210,3,68,34,0, + 210,211,5,36,0,0,211,224,1,0,0,0,212,216,5,71,0,0,213,215,3,66,33,0,214, + 213,1,0,0,0,215,218,1,0,0,0,216,214,1,0,0,0,216,217,1,0,0,0,217,219,1, + 0,0,0,218,216,1,0,0,0,219,220,5,41,0,0,220,221,3,68,34,0,221,222,5,36, + 0,0,222,224,1,0,0,0,223,168,1,0,0,0,223,179,1,0,0,0,223,190,1,0,0,0,223, + 201,1,0,0,0,223,212,1,0,0,0,224,13,1,0,0,0,225,226,5,20,0,0,226,227,3, + 8,4,0,227,228,5,36,0,0,228,249,1,0,0,0,229,230,5,20,0,0,230,231,3,8,4, + 0,231,232,5,37,0,0,232,233,5,27,0,0,233,234,5,36,0,0,234,249,1,0,0,0,235, + 236,5,20,0,0,236,237,3,8,4,0,237,238,5,37,0,0,238,242,5,30,0,0,239,241, + 3,20,10,0,240,239,1,0,0,0,241,244,1,0,0,0,242,240,1,0,0,0,242,243,1,0, + 0,0,243,245,1,0,0,0,244,242,1,0,0,0,245,246,5,31,0,0,246,247,5,36,0,0, + 247,249,1,0,0,0,248,225,1,0,0,0,248,229,1,0,0,0,248,235,1,0,0,0,249,15, + 1,0,0,0,250,251,5,28,0,0,251,252,3,8,4,0,252,253,5,42,0,0,253,254,3,8, + 4,0,254,255,5,37,0,0,255,256,3,68,34,0,256,257,5,36,0,0,257,17,1,0,0,0, + 258,259,5,29,0,0,259,260,3,68,34,0,260,261,5,42,0,0,261,262,3,8,4,0,262, + 263,5,42,0,0,263,264,3,8,4,0,264,265,5,37,0,0,265,266,3,68,34,0,266,267, + 5,36,0,0,267,277,1,0,0,0,268,269,5,29,0,0,269,270,3,68,34,0,270,271,5, + 42,0,0,271,272,3,8,4,0,272,273,5,37,0,0,273,274,3,68,34,0,274,275,5,36, + 0,0,275,277,1,0,0,0,276,258,1,0,0,0,276,268,1,0,0,0,277,19,1,0,0,0,278, + 279,5,25,0,0,279,280,3,8,4,0,280,281,5,36,0,0,281,287,1,0,0,0,282,283, + 5,26,0,0,283,284,3,8,4,0,284,285,5,36,0,0,285,287,1,0,0,0,286,278,1,0, + 0,0,286,282,1,0,0,0,287,21,1,0,0,0,288,289,5,4,0,0,289,290,5,77,0,0,290, + 291,5,32,0,0,291,292,3,88,44,0,292,293,5,33,0,0,293,294,5,30,0,0,294,295, + 3,92,46,0,295,296,5,31,0,0,296,23,1,0,0,0,297,298,5,8,0,0,298,299,5,77, + 0,0,299,300,5,32,0,0,300,301,3,88,44,0,301,302,5,33,0,0,302,303,5,30,0, + 0,303,304,3,46,23,0,304,305,5,31,0,0,305,25,1,0,0,0,306,307,5,5,0,0,307, + 308,3,68,34,0,308,312,5,30,0,0,309,311,3,2,1,0,310,309,1,0,0,0,311,314, + 1,0,0,0,312,310,1,0,0,0,312,313,1,0,0,0,313,315,1,0,0,0,314,312,1,0,0, + 0,315,317,5,31,0,0,316,318,3,28,14,0,317,316,1,0,0,0,317,318,1,0,0,0,318, + 27,1,0,0,0,319,322,3,30,15,0,320,322,3,32,16,0,321,319,1,0,0,0,321,320, + 1,0,0,0,322,29,1,0,0,0,323,324,5,6,0,0,324,328,5,30,0,0,325,327,3,2,1, + 0,326,325,1,0,0,0,327,330,1,0,0,0,328,326,1,0,0,0,328,329,1,0,0,0,329, + 331,1,0,0,0,330,328,1,0,0,0,331,332,5,31,0,0,332,31,1,0,0,0,333,334,5, + 7,0,0,334,335,3,68,34,0,335,339,5,30,0,0,336,338,3,2,1,0,337,336,1,0,0, + 0,338,341,1,0,0,0,339,337,1,0,0,0,339,340,1,0,0,0,340,342,1,0,0,0,341, + 339,1,0,0,0,342,344,5,31,0,0,343,345,3,28,14,0,344,343,1,0,0,0,344,345, + 1,0,0,0,345,33,1,0,0,0,346,347,3,36,18,0,347,348,5,30,0,0,348,349,3,46, + 23,0,349,350,5,31,0,0,350,35,1,0,0,0,351,353,3,38,19,0,352,351,1,0,0,0, + 353,356,1,0,0,0,354,352,1,0,0,0,354,355,1,0,0,0,355,357,1,0,0,0,356,354, + 1,0,0,0,357,358,3,42,21,0,358,37,1,0,0,0,359,360,5,18,0,0,360,366,3,72, + 36,0,361,362,5,19,0,0,362,366,3,8,4,0,363,364,5,24,0,0,364,366,3,40,20, + 0,365,359,1,0,0,0,365,361,1,0,0,0,365,363,1,0,0,0,366,39,1,0,0,0,367,376, + 5,32,0,0,368,373,3,68,34,0,369,370,5,42,0,0,370,372,3,68,34,0,371,369, + 1,0,0,0,372,375,1,0,0,0,373,371,1,0,0,0,373,374,1,0,0,0,374,377,1,0,0, + 0,375,373,1,0,0,0,376,368,1,0,0,0,376,377,1,0,0,0,377,378,1,0,0,0,378, + 379,5,33,0,0,379,41,1,0,0,0,380,381,6,21,-1,0,381,428,5,77,0,0,382,428, + 5,65,0,0,383,428,5,69,0,0,384,428,5,70,0,0,385,386,5,69,0,0,386,387,5, + 37,0,0,387,391,5,34,0,0,388,390,3,94,47,0,389,388,1,0,0,0,390,393,1,0, + 0,0,391,389,1,0,0,0,391,392,1,0,0,0,392,394,1,0,0,0,393,391,1,0,0,0,394, + 428,5,35,0,0,395,396,5,70,0,0,396,397,5,37,0,0,397,401,5,34,0,0,398,400, + 3,94,47,0,399,398,1,0,0,0,400,403,1,0,0,0,401,399,1,0,0,0,401,402,1,0, + 0,0,402,404,1,0,0,0,403,401,1,0,0,0,404,428,5,35,0,0,405,428,5,67,0,0, + 406,428,5,68,0,0,407,428,5,74,0,0,408,428,5,75,0,0,409,428,5,76,0,0,410, + 411,5,32,0,0,411,412,3,42,21,0,412,413,5,33,0,0,413,428,1,0,0,0,414,415, + 5,43,0,0,415,428,5,77,0,0,416,417,5,43,0,0,417,428,5,65,0,0,418,419,5, + 59,0,0,419,428,5,69,0,0,420,421,5,59,0,0,421,428,5,70,0,0,422,423,5,59, + 0,0,423,428,5,67,0,0,424,425,5,59,0,0,425,428,5,68,0,0,426,428,5,45,0, + 0,427,380,1,0,0,0,427,382,1,0,0,0,427,383,1,0,0,0,427,384,1,0,0,0,427, + 385,1,0,0,0,427,395,1,0,0,0,427,405,1,0,0,0,427,406,1,0,0,0,427,407,1, + 0,0,0,427,408,1,0,0,0,427,409,1,0,0,0,427,410,1,0,0,0,427,414,1,0,0,0, + 427,416,1,0,0,0,427,418,1,0,0,0,427,420,1,0,0,0,427,422,1,0,0,0,427,424, + 1,0,0,0,427,426,1,0,0,0,428,439,1,0,0,0,429,430,10,10,0,0,430,431,5,42, + 0,0,431,438,3,44,22,0,432,433,10,9,0,0,433,434,5,49,0,0,434,438,3,44,22, + 0,435,436,10,8,0,0,436,438,3,44,22,0,437,429,1,0,0,0,437,432,1,0,0,0,437, + 435,1,0,0,0,438,441,1,0,0,0,439,437,1,0,0,0,439,440,1,0,0,0,440,43,1,0, + 0,0,441,439,1,0,0,0,442,443,6,22,-1,0,443,488,5,77,0,0,444,488,5,65,0, + 0,445,488,5,69,0,0,446,488,5,70,0,0,447,448,5,69,0,0,448,449,5,37,0,0, + 449,453,5,34,0,0,450,452,3,94,47,0,451,450,1,0,0,0,452,455,1,0,0,0,453, + 451,1,0,0,0,453,454,1,0,0,0,454,456,1,0,0,0,455,453,1,0,0,0,456,488,5, + 35,0,0,457,458,5,70,0,0,458,459,5,37,0,0,459,463,5,34,0,0,460,462,3,94, + 47,0,461,460,1,0,0,0,462,465,1,0,0,0,463,461,1,0,0,0,463,464,1,0,0,0,464, + 466,1,0,0,0,465,463,1,0,0,0,466,488,5,35,0,0,467,488,5,67,0,0,468,488, + 5,68,0,0,469,488,5,74,0,0,470,471,5,32,0,0,471,472,3,44,22,0,472,473,5, + 33,0,0,473,488,1,0,0,0,474,475,5,43,0,0,475,488,5,77,0,0,476,477,5,43, + 0,0,477,488,5,65,0,0,478,479,5,59,0,0,479,488,5,69,0,0,480,481,5,59,0, + 0,481,488,5,70,0,0,482,483,5,59,0,0,483,488,5,67,0,0,484,485,5,59,0,0, + 485,488,5,68,0,0,486,488,5,45,0,0,487,442,1,0,0,0,487,444,1,0,0,0,487, + 445,1,0,0,0,487,446,1,0,0,0,487,447,1,0,0,0,487,457,1,0,0,0,487,467,1, + 0,0,0,487,468,1,0,0,0,487,469,1,0,0,0,487,470,1,0,0,0,487,474,1,0,0,0, + 487,476,1,0,0,0,487,478,1,0,0,0,487,480,1,0,0,0,487,482,1,0,0,0,487,484, + 1,0,0,0,487,486,1,0,0,0,488,496,1,0,0,0,489,490,10,9,0,0,490,491,5,42, + 0,0,491,495,3,44,22,10,492,493,10,8,0,0,493,495,3,44,22,9,494,489,1,0, + 0,0,494,492,1,0,0,0,495,498,1,0,0,0,496,494,1,0,0,0,496,497,1,0,0,0,497, + 45,1,0,0,0,498,496,1,0,0,0,499,501,3,48,24,0,500,499,1,0,0,0,501,504,1, + 0,0,0,502,500,1,0,0,0,502,503,1,0,0,0,503,47,1,0,0,0,504,502,1,0,0,0,505, + 517,3,12,6,0,506,517,3,50,25,0,507,517,3,118,59,0,508,517,3,124,62,0,509, + 517,3,112,56,0,510,517,3,58,29,0,511,517,3,60,30,0,512,517,3,62,31,0,513, + 517,3,64,32,0,514,517,3,34,17,0,515,517,3,106,53,0,516,505,1,0,0,0,516, + 506,1,0,0,0,516,507,1,0,0,0,516,508,1,0,0,0,516,509,1,0,0,0,516,510,1, + 0,0,0,516,511,1,0,0,0,516,512,1,0,0,0,516,513,1,0,0,0,516,514,1,0,0,0, + 516,515,1,0,0,0,517,49,1,0,0,0,518,519,5,5,0,0,519,520,3,68,34,0,520,524, + 5,30,0,0,521,523,3,48,24,0,522,521,1,0,0,0,523,526,1,0,0,0,524,522,1,0, + 0,0,524,525,1,0,0,0,525,527,1,0,0,0,526,524,1,0,0,0,527,529,5,31,0,0,528, + 530,3,52,26,0,529,528,1,0,0,0,529,530,1,0,0,0,530,51,1,0,0,0,531,534,3, + 54,27,0,532,534,3,56,28,0,533,531,1,0,0,0,533,532,1,0,0,0,534,53,1,0,0, + 0,535,536,5,6,0,0,536,540,5,30,0,0,537,539,3,48,24,0,538,537,1,0,0,0,539, + 542,1,0,0,0,540,538,1,0,0,0,540,541,1,0,0,0,541,543,1,0,0,0,542,540,1, + 0,0,0,543,544,5,31,0,0,544,55,1,0,0,0,545,546,5,7,0,0,546,547,3,68,34, + 0,547,551,5,30,0,0,548,550,3,48,24,0,549,548,1,0,0,0,550,553,1,0,0,0,551, + 549,1,0,0,0,551,552,1,0,0,0,552,554,1,0,0,0,553,551,1,0,0,0,554,556,5, + 31,0,0,555,557,3,52,26,0,556,555,1,0,0,0,556,557,1,0,0,0,557,57,1,0,0, + 0,558,559,5,16,0,0,559,560,3,68,34,0,560,561,5,36,0,0,561,59,1,0,0,0,562, + 563,5,66,0,0,563,564,5,36,0,0,564,61,1,0,0,0,565,566,5,17,0,0,566,567, + 3,68,34,0,567,568,5,36,0,0,568,63,1,0,0,0,569,573,3,8,4,0,570,572,3,66, + 33,0,571,570,1,0,0,0,572,575,1,0,0,0,573,571,1,0,0,0,573,574,1,0,0,0,574, + 576,1,0,0,0,575,573,1,0,0,0,576,577,5,37,0,0,577,578,3,68,34,0,578,579, + 5,36,0,0,579,625,1,0,0,0,580,584,3,8,4,0,581,583,3,66,33,0,582,581,1,0, + 0,0,583,586,1,0,0,0,584,582,1,0,0,0,584,585,1,0,0,0,585,587,1,0,0,0,586, + 584,1,0,0,0,587,588,5,38,0,0,588,589,3,68,34,0,589,590,5,36,0,0,590,625, + 1,0,0,0,591,595,3,8,4,0,592,594,3,66,33,0,593,592,1,0,0,0,594,597,1,0, + 0,0,595,593,1,0,0,0,595,596,1,0,0,0,596,598,1,0,0,0,597,595,1,0,0,0,598, + 599,5,39,0,0,599,600,3,68,34,0,600,601,5,36,0,0,601,625,1,0,0,0,602,606, + 3,8,4,0,603,605,3,66,33,0,604,603,1,0,0,0,605,608,1,0,0,0,606,604,1,0, + 0,0,606,607,1,0,0,0,607,609,1,0,0,0,608,606,1,0,0,0,609,610,5,41,0,0,610, + 611,3,68,34,0,611,612,5,36,0,0,612,625,1,0,0,0,613,617,3,8,4,0,614,616, + 3,66,33,0,615,614,1,0,0,0,616,619,1,0,0,0,617,615,1,0,0,0,617,618,1,0, + 0,0,618,620,1,0,0,0,619,617,1,0,0,0,620,621,5,40,0,0,621,622,3,68,34,0, + 622,623,5,36,0,0,623,625,1,0,0,0,624,569,1,0,0,0,624,580,1,0,0,0,624,591, + 1,0,0,0,624,602,1,0,0,0,624,613,1,0,0,0,625,65,1,0,0,0,626,627,5,34,0, + 0,627,628,3,68,34,0,628,629,5,35,0,0,629,634,1,0,0,0,630,631,5,34,0,0, + 631,632,5,45,0,0,632,634,5,35,0,0,633,626,1,0,0,0,633,630,1,0,0,0,634, + 67,1,0,0,0,635,636,6,34,-1,0,636,637,5,77,0,0,637,638,5,32,0,0,638,639, + 3,84,42,0,639,640,5,33,0,0,640,656,1,0,0,0,641,656,3,70,35,0,642,656,5, + 71,0,0,643,656,5,72,0,0,644,656,5,73,0,0,645,646,5,32,0,0,646,647,3,68, + 34,0,647,648,5,33,0,0,648,656,1,0,0,0,649,650,5,44,0,0,650,656,3,68,34, + 20,651,652,5,43,0,0,652,656,3,68,34,19,653,654,5,48,0,0,654,656,3,68,34, + 18,655,635,1,0,0,0,655,641,1,0,0,0,655,642,1,0,0,0,655,643,1,0,0,0,655, + 644,1,0,0,0,655,645,1,0,0,0,655,649,1,0,0,0,655,651,1,0,0,0,655,653,1, + 0,0,0,656,722,1,0,0,0,657,658,10,14,0,0,658,659,5,45,0,0,659,721,3,68, + 34,15,660,661,10,13,0,0,661,662,5,46,0,0,662,721,3,68,34,14,663,664,10, + 12,0,0,664,665,5,47,0,0,665,721,3,68,34,13,666,667,10,11,0,0,667,668,5, + 43,0,0,668,721,3,68,34,12,669,670,10,10,0,0,670,671,5,44,0,0,671,721,3, + 68,34,11,672,673,10,9,0,0,673,674,5,49,0,0,674,721,3,68,34,10,675,676, + 10,8,0,0,676,677,5,51,0,0,677,721,3,68,34,9,678,679,10,7,0,0,679,680,5, + 50,0,0,680,721,3,68,34,8,681,682,10,6,0,0,682,683,5,52,0,0,683,721,3,68, + 34,7,684,685,10,5,0,0,685,686,5,53,0,0,686,721,3,68,34,6,687,688,10,4, + 0,0,688,689,5,54,0,0,689,721,3,68,34,5,690,691,10,3,0,0,691,692,5,55,0, + 0,692,721,3,68,34,4,693,694,10,2,0,0,694,695,5,56,0,0,695,721,3,68,34, + 3,696,697,10,1,0,0,697,698,5,57,0,0,698,699,3,68,34,0,699,700,5,58,0,0, + 700,701,3,68,34,2,701,721,1,0,0,0,702,703,10,17,0,0,703,704,5,37,0,0,704, + 705,5,77,0,0,705,706,5,32,0,0,706,707,3,84,42,0,707,708,5,33,0,0,708,721, + 1,0,0,0,709,710,10,16,0,0,710,711,5,74,0,0,711,712,5,32,0,0,712,713,3, + 84,42,0,713,714,5,33,0,0,714,721,1,0,0,0,715,716,10,15,0,0,716,717,5,34, + 0,0,717,718,3,68,34,0,718,719,5,35,0,0,719,721,1,0,0,0,720,657,1,0,0,0, + 720,660,1,0,0,0,720,663,1,0,0,0,720,666,1,0,0,0,720,669,1,0,0,0,720,672, + 1,0,0,0,720,675,1,0,0,0,720,678,1,0,0,0,720,681,1,0,0,0,720,684,1,0,0, + 0,720,687,1,0,0,0,720,690,1,0,0,0,720,693,1,0,0,0,720,696,1,0,0,0,720, + 702,1,0,0,0,720,709,1,0,0,0,720,715,1,0,0,0,721,724,1,0,0,0,722,720,1, + 0,0,0,722,723,1,0,0,0,723,69,1,0,0,0,724,722,1,0,0,0,725,743,5,66,0,0, + 726,743,5,61,0,0,727,743,5,62,0,0,728,743,5,64,0,0,729,743,5,65,0,0,730, + 743,5,77,0,0,731,743,5,60,0,0,732,733,5,4,0,0,733,734,5,32,0,0,734,735, + 3,88,44,0,735,736,5,33,0,0,736,737,5,30,0,0,737,738,3,92,46,0,738,739, + 5,31,0,0,739,743,1,0,0,0,740,743,3,74,37,0,741,743,3,78,39,0,742,725,1, + 0,0,0,742,726,1,0,0,0,742,727,1,0,0,0,742,728,1,0,0,0,742,729,1,0,0,0, + 742,730,1,0,0,0,742,731,1,0,0,0,742,732,1,0,0,0,742,740,1,0,0,0,742,741, + 1,0,0,0,743,71,1,0,0,0,744,745,6,36,-1,0,745,746,5,32,0,0,746,747,3,72, + 36,0,747,748,5,33,0,0,748,753,1,0,0,0,749,750,5,48,0,0,750,753,3,72,36, + 2,751,753,3,8,4,0,752,744,1,0,0,0,752,749,1,0,0,0,752,751,1,0,0,0,753, + 762,1,0,0,0,754,755,10,4,0,0,755,756,5,55,0,0,756,761,3,72,36,5,757,758, + 10,3,0,0,758,759,5,56,0,0,759,761,3,72,36,4,760,754,1,0,0,0,760,757,1, + 0,0,0,761,764,1,0,0,0,762,760,1,0,0,0,762,763,1,0,0,0,763,73,1,0,0,0,764, + 762,1,0,0,0,765,766,5,34,0,0,766,768,3,76,38,0,767,769,5,42,0,0,768,767, + 1,0,0,0,768,769,1,0,0,0,769,770,1,0,0,0,770,771,5,35,0,0,771,75,1,0,0, + 0,772,774,3,68,34,0,773,772,1,0,0,0,773,774,1,0,0,0,774,779,1,0,0,0,775, + 776,5,42,0,0,776,778,3,68,34,0,777,775,1,0,0,0,778,781,1,0,0,0,779,777, + 1,0,0,0,779,780,1,0,0,0,780,783,1,0,0,0,781,779,1,0,0,0,782,773,1,0,0, + 0,782,783,1,0,0,0,783,77,1,0,0,0,784,785,5,30,0,0,785,787,3,80,40,0,786, + 788,5,42,0,0,787,786,1,0,0,0,787,788,1,0,0,0,788,789,1,0,0,0,789,790,5, + 31,0,0,790,79,1,0,0,0,791,793,3,82,41,0,792,791,1,0,0,0,792,793,1,0,0, + 0,793,798,1,0,0,0,794,795,5,42,0,0,795,797,3,82,41,0,796,794,1,0,0,0,797, + 800,1,0,0,0,798,796,1,0,0,0,798,799,1,0,0,0,799,802,1,0,0,0,800,798,1, + 0,0,0,801,792,1,0,0,0,801,802,1,0,0,0,802,81,1,0,0,0,803,804,5,77,0,0, + 804,805,5,37,0,0,805,810,3,68,34,0,806,807,5,65,0,0,807,808,5,37,0,0,808, + 810,3,68,34,0,809,803,1,0,0,0,809,806,1,0,0,0,810,83,1,0,0,0,811,813,3, + 86,43,0,812,811,1,0,0,0,812,813,1,0,0,0,813,818,1,0,0,0,814,815,5,42,0, + 0,815,817,3,86,43,0,816,814,1,0,0,0,817,820,1,0,0,0,818,816,1,0,0,0,818, + 819,1,0,0,0,819,822,1,0,0,0,820,818,1,0,0,0,821,812,1,0,0,0,821,822,1, + 0,0,0,822,824,1,0,0,0,823,825,5,42,0,0,824,823,1,0,0,0,824,825,1,0,0,0, + 825,85,1,0,0,0,826,827,5,71,0,0,827,828,5,37,0,0,828,831,3,68,34,0,829, + 831,3,68,34,0,830,826,1,0,0,0,830,829,1,0,0,0,831,87,1,0,0,0,832,834,3, + 90,45,0,833,832,1,0,0,0,833,834,1,0,0,0,834,839,1,0,0,0,835,836,5,42,0, + 0,836,838,3,90,45,0,837,835,1,0,0,0,838,841,1,0,0,0,839,837,1,0,0,0,839, + 840,1,0,0,0,840,843,1,0,0,0,841,839,1,0,0,0,842,833,1,0,0,0,842,843,1, + 0,0,0,843,845,1,0,0,0,844,846,5,42,0,0,845,844,1,0,0,0,845,846,1,0,0,0, + 846,89,1,0,0,0,847,852,5,71,0,0,848,849,5,71,0,0,849,850,5,37,0,0,850, + 852,3,68,34,0,851,847,1,0,0,0,851,848,1,0,0,0,852,91,1,0,0,0,853,855,3, + 94,47,0,854,853,1,0,0,0,855,858,1,0,0,0,856,854,1,0,0,0,856,857,1,0,0, + 0,857,93,1,0,0,0,858,856,1,0,0,0,859,866,3,12,6,0,860,866,3,96,48,0,861, + 866,3,104,52,0,862,866,3,108,54,0,863,866,3,114,57,0,864,866,3,120,60, + 0,865,859,1,0,0,0,865,860,1,0,0,0,865,861,1,0,0,0,865,862,1,0,0,0,865, + 863,1,0,0,0,865,864,1,0,0,0,866,95,1,0,0,0,867,868,5,5,0,0,868,869,3,68, + 34,0,869,873,5,30,0,0,870,872,3,94,47,0,871,870,1,0,0,0,872,875,1,0,0, + 0,873,871,1,0,0,0,873,874,1,0,0,0,874,876,1,0,0,0,875,873,1,0,0,0,876, + 878,5,31,0,0,877,879,3,98,49,0,878,877,1,0,0,0,878,879,1,0,0,0,879,97, + 1,0,0,0,880,883,3,100,50,0,881,883,3,102,51,0,882,880,1,0,0,0,882,881, + 1,0,0,0,883,99,1,0,0,0,884,885,5,6,0,0,885,889,5,30,0,0,886,888,3,94,47, + 0,887,886,1,0,0,0,888,891,1,0,0,0,889,887,1,0,0,0,889,890,1,0,0,0,890, + 892,1,0,0,0,891,889,1,0,0,0,892,893,5,31,0,0,893,101,1,0,0,0,894,895,5, + 7,0,0,895,896,3,68,34,0,896,900,5,30,0,0,897,899,3,94,47,0,898,897,1,0, + 0,0,899,902,1,0,0,0,900,898,1,0,0,0,900,901,1,0,0,0,901,903,1,0,0,0,902, + 900,1,0,0,0,903,905,5,31,0,0,904,906,3,98,49,0,905,904,1,0,0,0,905,906, + 1,0,0,0,906,103,1,0,0,0,907,908,5,22,0,0,908,909,3,68,34,0,909,910,5,36, + 0,0,910,105,1,0,0,0,911,912,5,21,0,0,912,913,5,77,0,0,913,914,5,32,0,0, + 914,915,3,84,42,0,915,916,5,33,0,0,916,107,1,0,0,0,917,918,5,10,0,0,918, + 919,5,71,0,0,919,920,5,11,0,0,920,921,3,68,34,0,921,922,5,13,0,0,922,923, + 3,68,34,0,923,927,5,30,0,0,924,926,3,94,47,0,925,924,1,0,0,0,926,929,1, + 0,0,0,927,925,1,0,0,0,927,928,1,0,0,0,928,930,1,0,0,0,929,927,1,0,0,0, + 930,931,5,31,0,0,931,948,1,0,0,0,932,933,5,10,0,0,933,934,5,71,0,0,934, + 935,5,11,0,0,935,936,3,68,34,0,936,937,5,12,0,0,937,938,3,68,34,0,938, + 942,5,30,0,0,939,941,3,94,47,0,940,939,1,0,0,0,941,944,1,0,0,0,942,940, + 1,0,0,0,942,943,1,0,0,0,943,945,1,0,0,0,944,942,1,0,0,0,945,946,5,31,0, + 0,946,948,1,0,0,0,947,917,1,0,0,0,947,932,1,0,0,0,948,109,1,0,0,0,949, + 950,5,10,0,0,950,951,5,71,0,0,951,952,5,11,0,0,952,953,3,68,34,0,953,954, + 5,13,0,0,954,955,3,68,34,0,955,959,5,30,0,0,956,958,3,2,1,0,957,956,1, + 0,0,0,958,961,1,0,0,0,959,957,1,0,0,0,959,960,1,0,0,0,960,962,1,0,0,0, + 961,959,1,0,0,0,962,963,5,31,0,0,963,980,1,0,0,0,964,965,5,10,0,0,965, + 966,5,71,0,0,966,967,5,11,0,0,967,968,3,68,34,0,968,969,5,12,0,0,969,970, + 3,68,34,0,970,974,5,30,0,0,971,973,3,2,1,0,972,971,1,0,0,0,973,976,1,0, + 0,0,974,972,1,0,0,0,974,975,1,0,0,0,975,977,1,0,0,0,976,974,1,0,0,0,977, + 978,5,31,0,0,978,980,1,0,0,0,979,949,1,0,0,0,979,964,1,0,0,0,980,111,1, + 0,0,0,981,982,5,10,0,0,982,983,5,71,0,0,983,984,5,11,0,0,984,985,3,68, + 34,0,985,986,5,13,0,0,986,987,3,68,34,0,987,991,5,30,0,0,988,990,3,48, + 24,0,989,988,1,0,0,0,990,993,1,0,0,0,991,989,1,0,0,0,991,992,1,0,0,0,992, + 994,1,0,0,0,993,991,1,0,0,0,994,995,5,31,0,0,995,1012,1,0,0,0,996,997, + 5,10,0,0,997,998,5,71,0,0,998,999,5,11,0,0,999,1000,3,68,34,0,1000,1001, + 5,12,0,0,1001,1002,3,68,34,0,1002,1006,5,30,0,0,1003,1005,3,48,24,0,1004, + 1003,1,0,0,0,1005,1008,1,0,0,0,1006,1004,1,0,0,0,1006,1007,1,0,0,0,1007, + 1009,1,0,0,0,1008,1006,1,0,0,0,1009,1010,5,31,0,0,1010,1012,1,0,0,0,1011, + 981,1,0,0,0,1011,996,1,0,0,0,1012,113,1,0,0,0,1013,1016,5,14,0,0,1014, + 1015,5,71,0,0,1015,1017,5,42,0,0,1016,1014,1,0,0,0,1016,1017,1,0,0,0,1017, + 1018,1,0,0,0,1018,1019,5,71,0,0,1019,1020,5,15,0,0,1020,1021,3,68,34,0, + 1021,1025,5,30,0,0,1022,1024,3,94,47,0,1023,1022,1,0,0,0,1024,1027,1,0, + 0,0,1025,1023,1,0,0,0,1025,1026,1,0,0,0,1026,1028,1,0,0,0,1027,1025,1, + 0,0,0,1028,1029,5,31,0,0,1029,115,1,0,0,0,1030,1033,5,14,0,0,1031,1032, + 5,71,0,0,1032,1034,5,42,0,0,1033,1031,1,0,0,0,1033,1034,1,0,0,0,1034,1035, + 1,0,0,0,1035,1036,5,71,0,0,1036,1037,5,15,0,0,1037,1038,3,68,34,0,1038, + 1042,5,30,0,0,1039,1041,3,2,1,0,1040,1039,1,0,0,0,1041,1044,1,0,0,0,1042, + 1040,1,0,0,0,1042,1043,1,0,0,0,1043,1045,1,0,0,0,1044,1042,1,0,0,0,1045, + 1046,5,31,0,0,1046,117,1,0,0,0,1047,1050,5,14,0,0,1048,1049,5,71,0,0,1049, + 1051,5,42,0,0,1050,1048,1,0,0,0,1050,1051,1,0,0,0,1051,1052,1,0,0,0,1052, + 1053,5,71,0,0,1053,1054,5,15,0,0,1054,1055,3,68,34,0,1055,1059,5,30,0, + 0,1056,1058,3,48,24,0,1057,1056,1,0,0,0,1058,1061,1,0,0,0,1059,1057,1, + 0,0,0,1059,1060,1,0,0,0,1060,1062,1,0,0,0,1061,1059,1,0,0,0,1062,1063, + 5,31,0,0,1063,119,1,0,0,0,1064,1065,5,9,0,0,1065,1066,3,68,34,0,1066,1070, + 5,30,0,0,1067,1069,3,94,47,0,1068,1067,1,0,0,0,1069,1072,1,0,0,0,1070, + 1068,1,0,0,0,1070,1071,1,0,0,0,1071,1073,1,0,0,0,1072,1070,1,0,0,0,1073, + 1074,5,31,0,0,1074,121,1,0,0,0,1075,1076,5,9,0,0,1076,1077,3,68,34,0,1077, + 1081,5,30,0,0,1078,1080,3,2,1,0,1079,1078,1,0,0,0,1080,1083,1,0,0,0,1081, + 1079,1,0,0,0,1081,1082,1,0,0,0,1082,1084,1,0,0,0,1083,1081,1,0,0,0,1084, + 1085,5,31,0,0,1085,123,1,0,0,0,1086,1087,5,9,0,0,1087,1088,3,68,34,0,1088, + 1092,5,30,0,0,1089,1091,3,48,24,0,1090,1089,1,0,0,0,1091,1094,1,0,0,0, + 1092,1090,1,0,0,0,1092,1093,1,0,0,0,1093,1095,1,0,0,0,1094,1092,1,0,0, + 0,1095,1096,5,31,0,0,1096,125,1,0,0,0,101,129,146,157,162,172,183,194, + 205,216,223,242,248,276,286,312,317,321,328,339,344,354,365,373,376,391, + 401,427,437,439,453,463,487,494,496,502,516,524,529,533,540,551,556,573, + 584,595,606,617,624,633,655,720,722,742,752,760,762,768,773,779,782,787, + 792,798,801,809,812,818,821,824,830,833,839,842,845,851,856,865,873,878, + 882,889,900,905,927,942,947,959,974,979,991,1006,1011,1016,1025,1033,1042, + 1050,1059,1070,1081,1092 }; public static readonly ATN _ATN = diff --git a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 index b05da1e..a554fbb 100644 --- a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 +++ b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 @@ -30,11 +30,11 @@ sassy_string : STRING #quoted_string import_declaration : USE imp=sassy_string SEMICOLON; -var_decl : variable=VARIABLE COLON val=expression SEMICOLON #normal_var_decl - | variable=VARIABLE PLUS_COLON val=expression SEMICOLON #add_var_decl - | variable=VARIABLE MINUS_COLON val=expression SEMICOLON #subtract_var_decl - | variable=VARIABLE DIVIDE_COLON val=expression SEMICOLON #divide_var_decl - | variable=VARIABLE MULTIPLY_COLON val=expression SEMICOLON #multiply_var_decl +var_decl : variable=VARIABLE indexor=index* COLON val=expression SEMICOLON #normal_var_decl + | variable=VARIABLE indexor=index* PLUS_COLON val=expression SEMICOLON #add_var_decl + | variable=VARIABLE indexor=index* MINUS_COLON val=expression SEMICOLON #subtract_var_decl + | variable=VARIABLE indexor=index* DIVIDE_COLON val=expression SEMICOLON #divide_var_decl + | variable=VARIABLE indexor=index* MULTIPLY_COLON val=expression SEMICOLON #multiply_var_decl ; @@ -151,17 +151,15 @@ delete_value : DELETE SEMICOLON; merge_value : MERGE expr=expression SEMICOLON; -field_set : sassy_string indexor=index? COLON expr=expression SEMICOLON #normal_field_set - | sassy_string indexor=index? PLUS_COLON expr=expression SEMICOLON #add_field_set - | sassy_string indexor=index? MINUS_COLON expr=expression SEMICOLON #subtract_field_set - | sassy_string indexor=index? MULTIPLY_COLON expr=expression SEMICOLON #multiply_field_set - | sassy_string indexor=index? DIVIDE_COLON expr=expression SEMICOLON #divide_field_set +field_set : sassy_string indexor=index* COLON expr=expression SEMICOLON #normal_field_set + | sassy_string indexor=index* PLUS_COLON expr=expression SEMICOLON #add_field_set + | sassy_string indexor=index* MINUS_COLON expr=expression SEMICOLON #subtract_field_set + | sassy_string indexor=index* MULTIPLY_COLON expr=expression SEMICOLON #multiply_field_set + | sassy_string indexor=index* DIVIDE_COLON expr=expression SEMICOLON #divide_field_set ; -index : LEFT_BRACKET num=NUMBER RIGHT_BRACKET #number_indexor - | LEFT_BRACKET elem=ELEMENT RIGHT_BRACKET #element_indexor - | LEFT_BRACKET clazz=CLASS RIGHT_BRACKET #class_indexor - | LEFT_BRACKET elem=STRING RIGHT_BRACKET #string_indexor +index : LEFT_BRACKET elem=expression RIGHT_BRACKET #expression_indexer + | LEFT_BRACKET elem=MULTIPLY RIGHT_BRACKET #map_indexer ; expression : lhs=ELEMENT LEFT_PAREN args=argument_list RIGHT_PAREN #simple_call diff --git a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.interp b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.interp index 6156c7b..aebe952 100644 --- a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.interp +++ b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.interp @@ -225,4 +225,4 @@ sel_level_while_loop atn: -[4, 1, 77, 1058, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 1, 0, 4, 0, 128, 8, 0, 11, 0, 12, 0, 129, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 147, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 5, 3, 156, 8, 3, 10, 3, 12, 3, 159, 9, 3, 1, 4, 1, 4, 3, 4, 163, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 194, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 211, 8, 7, 10, 7, 12, 7, 214, 9, 7, 1, 7, 1, 7, 1, 7, 3, 7, 219, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 257, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 281, 8, 13, 10, 13, 12, 13, 284, 9, 13, 1, 13, 1, 13, 3, 13, 288, 8, 13, 1, 14, 1, 14, 3, 14, 292, 8, 14, 1, 15, 1, 15, 1, 15, 5, 15, 297, 8, 15, 10, 15, 12, 15, 300, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 308, 8, 16, 10, 16, 12, 16, 311, 9, 16, 1, 16, 1, 16, 3, 16, 315, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 5, 18, 323, 8, 18, 10, 18, 12, 18, 326, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 336, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 342, 8, 20, 10, 20, 12, 20, 345, 9, 20, 3, 20, 347, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 360, 8, 21, 10, 21, 12, 21, 363, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 370, 8, 21, 10, 21, 12, 21, 373, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 398, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 408, 8, 21, 10, 21, 12, 21, 411, 9, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 422, 8, 22, 10, 22, 12, 22, 425, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 432, 8, 22, 10, 22, 12, 22, 435, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 458, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 465, 8, 22, 10, 22, 12, 22, 468, 9, 22, 1, 23, 5, 23, 471, 8, 23, 10, 23, 12, 23, 474, 9, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 487, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 493, 8, 25, 10, 25, 12, 25, 496, 9, 25, 1, 25, 1, 25, 3, 25, 500, 8, 25, 1, 26, 1, 26, 3, 26, 504, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 509, 8, 27, 10, 27, 12, 27, 512, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 520, 8, 28, 10, 28, 12, 28, 523, 9, 28, 1, 28, 1, 28, 3, 28, 527, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 542, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 550, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 558, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 566, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 574, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 580, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 594, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 616, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 681, 8, 34, 10, 34, 12, 34, 684, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 703, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 713, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 721, 8, 36, 10, 36, 12, 36, 724, 9, 36, 1, 37, 1, 37, 1, 37, 3, 37, 729, 8, 37, 1, 37, 1, 37, 1, 38, 3, 38, 734, 8, 38, 1, 38, 1, 38, 5, 38, 738, 8, 38, 10, 38, 12, 38, 741, 9, 38, 3, 38, 743, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 748, 8, 39, 1, 39, 1, 39, 1, 40, 3, 40, 753, 8, 40, 1, 40, 1, 40, 5, 40, 757, 8, 40, 10, 40, 12, 40, 760, 9, 40, 3, 40, 762, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 770, 8, 41, 1, 42, 3, 42, 773, 8, 42, 1, 42, 1, 42, 5, 42, 777, 8, 42, 10, 42, 12, 42, 780, 9, 42, 3, 42, 782, 8, 42, 1, 42, 3, 42, 785, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 791, 8, 43, 1, 44, 3, 44, 794, 8, 44, 1, 44, 1, 44, 5, 44, 798, 8, 44, 10, 44, 12, 44, 801, 9, 44, 3, 44, 803, 8, 44, 1, 44, 3, 44, 806, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 812, 8, 45, 1, 46, 5, 46, 815, 8, 46, 10, 46, 12, 46, 818, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 826, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 832, 8, 48, 10, 48, 12, 48, 835, 9, 48, 1, 48, 1, 48, 3, 48, 839, 8, 48, 1, 49, 1, 49, 3, 49, 843, 8, 49, 1, 50, 1, 50, 1, 50, 5, 50, 848, 8, 50, 10, 50, 12, 50, 851, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 859, 8, 51, 10, 51, 12, 51, 862, 9, 51, 1, 51, 1, 51, 3, 51, 866, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 886, 8, 54, 10, 54, 12, 54, 889, 9, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 901, 8, 54, 10, 54, 12, 54, 904, 9, 54, 1, 54, 1, 54, 3, 54, 908, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 918, 8, 55, 10, 55, 12, 55, 921, 9, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 933, 8, 55, 10, 55, 12, 55, 936, 9, 55, 1, 55, 1, 55, 3, 55, 940, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 950, 8, 56, 10, 56, 12, 56, 953, 9, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 965, 8, 56, 10, 56, 12, 56, 968, 9, 56, 1, 56, 1, 56, 3, 56, 972, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 977, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 984, 8, 57, 10, 57, 12, 57, 987, 9, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 3, 58, 994, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 5, 58, 1001, 8, 58, 10, 58, 12, 58, 1004, 9, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 3, 59, 1011, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1018, 8, 59, 10, 59, 12, 59, 1021, 9, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1029, 8, 60, 10, 60, 12, 60, 1032, 9, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1040, 8, 61, 10, 61, 12, 61, 1043, 9, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 1051, 8, 62, 10, 62, 12, 62, 1054, 9, 62, 1, 62, 1, 62, 1, 62, 0, 4, 42, 44, 68, 72, 63, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 0, 0, 1188, 0, 127, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 4, 148, 1, 0, 0, 0, 6, 152, 1, 0, 0, 0, 8, 162, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, 193, 1, 0, 0, 0, 14, 218, 1, 0, 0, 0, 16, 220, 1, 0, 0, 0, 18, 246, 1, 0, 0, 0, 20, 256, 1, 0, 0, 0, 22, 258, 1, 0, 0, 0, 24, 267, 1, 0, 0, 0, 26, 276, 1, 0, 0, 0, 28, 291, 1, 0, 0, 0, 30, 293, 1, 0, 0, 0, 32, 303, 1, 0, 0, 0, 34, 316, 1, 0, 0, 0, 36, 324, 1, 0, 0, 0, 38, 335, 1, 0, 0, 0, 40, 337, 1, 0, 0, 0, 42, 397, 1, 0, 0, 0, 44, 457, 1, 0, 0, 0, 46, 472, 1, 0, 0, 0, 48, 486, 1, 0, 0, 0, 50, 488, 1, 0, 0, 0, 52, 503, 1, 0, 0, 0, 54, 505, 1, 0, 0, 0, 56, 515, 1, 0, 0, 0, 58, 528, 1, 0, 0, 0, 60, 532, 1, 0, 0, 0, 62, 535, 1, 0, 0, 0, 64, 579, 1, 0, 0, 0, 66, 593, 1, 0, 0, 0, 68, 615, 1, 0, 0, 0, 70, 702, 1, 0, 0, 0, 72, 712, 1, 0, 0, 0, 74, 725, 1, 0, 0, 0, 76, 742, 1, 0, 0, 0, 78, 744, 1, 0, 0, 0, 80, 761, 1, 0, 0, 0, 82, 769, 1, 0, 0, 0, 84, 781, 1, 0, 0, 0, 86, 790, 1, 0, 0, 0, 88, 802, 1, 0, 0, 0, 90, 811, 1, 0, 0, 0, 92, 816, 1, 0, 0, 0, 94, 825, 1, 0, 0, 0, 96, 827, 1, 0, 0, 0, 98, 842, 1, 0, 0, 0, 100, 844, 1, 0, 0, 0, 102, 854, 1, 0, 0, 0, 104, 867, 1, 0, 0, 0, 106, 871, 1, 0, 0, 0, 108, 907, 1, 0, 0, 0, 110, 939, 1, 0, 0, 0, 112, 971, 1, 0, 0, 0, 114, 973, 1, 0, 0, 0, 116, 990, 1, 0, 0, 0, 118, 1007, 1, 0, 0, 0, 120, 1024, 1, 0, 0, 0, 122, 1035, 1, 0, 0, 0, 124, 1046, 1, 0, 0, 0, 126, 128, 3, 2, 1, 0, 127, 126, 1, 0, 0, 0, 128, 129, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 129, 130, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 5, 0, 0, 1, 132, 1, 1, 0, 0, 0, 133, 147, 3, 10, 5, 0, 134, 147, 3, 12, 6, 0, 135, 147, 3, 14, 7, 0, 136, 147, 3, 22, 11, 0, 137, 147, 3, 24, 12, 0, 138, 147, 3, 26, 13, 0, 139, 147, 3, 34, 17, 0, 140, 147, 3, 4, 2, 0, 141, 147, 3, 16, 8, 0, 142, 147, 3, 18, 9, 0, 143, 147, 3, 110, 55, 0, 144, 147, 3, 116, 58, 0, 145, 147, 3, 122, 61, 0, 146, 133, 1, 0, 0, 0, 146, 134, 1, 0, 0, 0, 146, 135, 1, 0, 0, 0, 146, 136, 1, 0, 0, 0, 146, 137, 1, 0, 0, 0, 146, 138, 1, 0, 0, 0, 146, 139, 1, 0, 0, 0, 146, 140, 1, 0, 0, 0, 146, 141, 1, 0, 0, 0, 146, 142, 1, 0, 0, 0, 146, 143, 1, 0, 0, 0, 146, 144, 1, 0, 0, 0, 146, 145, 1, 0, 0, 0, 147, 3, 1, 0, 0, 0, 148, 149, 5, 23, 0, 0, 149, 150, 3, 6, 3, 0, 150, 151, 5, 36, 0, 0, 151, 5, 1, 0, 0, 0, 152, 157, 3, 8, 4, 0, 153, 154, 5, 42, 0, 0, 154, 156, 3, 8, 4, 0, 155, 153, 1, 0, 0, 0, 156, 159, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 7, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 163, 5, 65, 0, 0, 161, 163, 5, 77, 0, 0, 162, 160, 1, 0, 0, 0, 162, 161, 1, 0, 0, 0, 163, 9, 1, 0, 0, 0, 164, 165, 5, 3, 0, 0, 165, 166, 3, 8, 4, 0, 166, 167, 5, 36, 0, 0, 167, 11, 1, 0, 0, 0, 168, 169, 5, 71, 0, 0, 169, 170, 5, 37, 0, 0, 170, 171, 3, 68, 34, 0, 171, 172, 5, 36, 0, 0, 172, 194, 1, 0, 0, 0, 173, 174, 5, 71, 0, 0, 174, 175, 5, 38, 0, 0, 175, 176, 3, 68, 34, 0, 176, 177, 5, 36, 0, 0, 177, 194, 1, 0, 0, 0, 178, 179, 5, 71, 0, 0, 179, 180, 5, 39, 0, 0, 180, 181, 3, 68, 34, 0, 181, 182, 5, 36, 0, 0, 182, 194, 1, 0, 0, 0, 183, 184, 5, 71, 0, 0, 184, 185, 5, 40, 0, 0, 185, 186, 3, 68, 34, 0, 186, 187, 5, 36, 0, 0, 187, 194, 1, 0, 0, 0, 188, 189, 5, 71, 0, 0, 189, 190, 5, 41, 0, 0, 190, 191, 3, 68, 34, 0, 191, 192, 5, 36, 0, 0, 192, 194, 1, 0, 0, 0, 193, 168, 1, 0, 0, 0, 193, 173, 1, 0, 0, 0, 193, 178, 1, 0, 0, 0, 193, 183, 1, 0, 0, 0, 193, 188, 1, 0, 0, 0, 194, 13, 1, 0, 0, 0, 195, 196, 5, 20, 0, 0, 196, 197, 3, 8, 4, 0, 197, 198, 5, 36, 0, 0, 198, 219, 1, 0, 0, 0, 199, 200, 5, 20, 0, 0, 200, 201, 3, 8, 4, 0, 201, 202, 5, 37, 0, 0, 202, 203, 5, 27, 0, 0, 203, 204, 5, 36, 0, 0, 204, 219, 1, 0, 0, 0, 205, 206, 5, 20, 0, 0, 206, 207, 3, 8, 4, 0, 207, 208, 5, 37, 0, 0, 208, 212, 5, 30, 0, 0, 209, 211, 3, 20, 10, 0, 210, 209, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 215, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 216, 5, 31, 0, 0, 216, 217, 5, 36, 0, 0, 217, 219, 1, 0, 0, 0, 218, 195, 1, 0, 0, 0, 218, 199, 1, 0, 0, 0, 218, 205, 1, 0, 0, 0, 219, 15, 1, 0, 0, 0, 220, 221, 5, 28, 0, 0, 221, 222, 3, 8, 4, 0, 222, 223, 5, 42, 0, 0, 223, 224, 3, 8, 4, 0, 224, 225, 5, 37, 0, 0, 225, 226, 3, 68, 34, 0, 226, 227, 5, 36, 0, 0, 227, 17, 1, 0, 0, 0, 228, 229, 5, 29, 0, 0, 229, 230, 3, 68, 34, 0, 230, 231, 5, 42, 0, 0, 231, 232, 3, 8, 4, 0, 232, 233, 5, 42, 0, 0, 233, 234, 3, 8, 4, 0, 234, 235, 5, 37, 0, 0, 235, 236, 3, 68, 34, 0, 236, 237, 5, 36, 0, 0, 237, 247, 1, 0, 0, 0, 238, 239, 5, 29, 0, 0, 239, 240, 3, 68, 34, 0, 240, 241, 5, 42, 0, 0, 241, 242, 3, 8, 4, 0, 242, 243, 5, 37, 0, 0, 243, 244, 3, 68, 34, 0, 244, 245, 5, 36, 0, 0, 245, 247, 1, 0, 0, 0, 246, 228, 1, 0, 0, 0, 246, 238, 1, 0, 0, 0, 247, 19, 1, 0, 0, 0, 248, 249, 5, 25, 0, 0, 249, 250, 3, 8, 4, 0, 250, 251, 5, 36, 0, 0, 251, 257, 1, 0, 0, 0, 252, 253, 5, 26, 0, 0, 253, 254, 3, 8, 4, 0, 254, 255, 5, 36, 0, 0, 255, 257, 1, 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 252, 1, 0, 0, 0, 257, 21, 1, 0, 0, 0, 258, 259, 5, 4, 0, 0, 259, 260, 5, 77, 0, 0, 260, 261, 5, 32, 0, 0, 261, 262, 3, 88, 44, 0, 262, 263, 5, 33, 0, 0, 263, 264, 5, 30, 0, 0, 264, 265, 3, 92, 46, 0, 265, 266, 5, 31, 0, 0, 266, 23, 1, 0, 0, 0, 267, 268, 5, 8, 0, 0, 268, 269, 5, 77, 0, 0, 269, 270, 5, 32, 0, 0, 270, 271, 3, 88, 44, 0, 271, 272, 5, 33, 0, 0, 272, 273, 5, 30, 0, 0, 273, 274, 3, 46, 23, 0, 274, 275, 5, 31, 0, 0, 275, 25, 1, 0, 0, 0, 276, 277, 5, 5, 0, 0, 277, 278, 3, 68, 34, 0, 278, 282, 5, 30, 0, 0, 279, 281, 3, 2, 1, 0, 280, 279, 1, 0, 0, 0, 281, 284, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 285, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 285, 287, 5, 31, 0, 0, 286, 288, 3, 28, 14, 0, 287, 286, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 27, 1, 0, 0, 0, 289, 292, 3, 30, 15, 0, 290, 292, 3, 32, 16, 0, 291, 289, 1, 0, 0, 0, 291, 290, 1, 0, 0, 0, 292, 29, 1, 0, 0, 0, 293, 294, 5, 6, 0, 0, 294, 298, 5, 30, 0, 0, 295, 297, 3, 2, 1, 0, 296, 295, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 301, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 301, 302, 5, 31, 0, 0, 302, 31, 1, 0, 0, 0, 303, 304, 5, 7, 0, 0, 304, 305, 3, 68, 34, 0, 305, 309, 5, 30, 0, 0, 306, 308, 3, 2, 1, 0, 307, 306, 1, 0, 0, 0, 308, 311, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 312, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 312, 314, 5, 31, 0, 0, 313, 315, 3, 28, 14, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 33, 1, 0, 0, 0, 316, 317, 3, 36, 18, 0, 317, 318, 5, 30, 0, 0, 318, 319, 3, 46, 23, 0, 319, 320, 5, 31, 0, 0, 320, 35, 1, 0, 0, 0, 321, 323, 3, 38, 19, 0, 322, 321, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 328, 3, 42, 21, 0, 328, 37, 1, 0, 0, 0, 329, 330, 5, 18, 0, 0, 330, 336, 3, 72, 36, 0, 331, 332, 5, 19, 0, 0, 332, 336, 3, 8, 4, 0, 333, 334, 5, 24, 0, 0, 334, 336, 3, 40, 20, 0, 335, 329, 1, 0, 0, 0, 335, 331, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 336, 39, 1, 0, 0, 0, 337, 346, 5, 32, 0, 0, 338, 343, 3, 68, 34, 0, 339, 340, 5, 42, 0, 0, 340, 342, 3, 68, 34, 0, 341, 339, 1, 0, 0, 0, 342, 345, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 347, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 346, 338, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 349, 5, 33, 0, 0, 349, 41, 1, 0, 0, 0, 350, 351, 6, 21, -1, 0, 351, 398, 5, 77, 0, 0, 352, 398, 5, 65, 0, 0, 353, 398, 5, 69, 0, 0, 354, 398, 5, 70, 0, 0, 355, 356, 5, 69, 0, 0, 356, 357, 5, 37, 0, 0, 357, 361, 5, 34, 0, 0, 358, 360, 3, 94, 47, 0, 359, 358, 1, 0, 0, 0, 360, 363, 1, 0, 0, 0, 361, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 364, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 364, 398, 5, 35, 0, 0, 365, 366, 5, 70, 0, 0, 366, 367, 5, 37, 0, 0, 367, 371, 5, 34, 0, 0, 368, 370, 3, 94, 47, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 374, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 398, 5, 35, 0, 0, 375, 398, 5, 67, 0, 0, 376, 398, 5, 68, 0, 0, 377, 398, 5, 74, 0, 0, 378, 398, 5, 75, 0, 0, 379, 398, 5, 76, 0, 0, 380, 381, 5, 32, 0, 0, 381, 382, 3, 42, 21, 0, 382, 383, 5, 33, 0, 0, 383, 398, 1, 0, 0, 0, 384, 385, 5, 43, 0, 0, 385, 398, 5, 77, 0, 0, 386, 387, 5, 43, 0, 0, 387, 398, 5, 65, 0, 0, 388, 389, 5, 59, 0, 0, 389, 398, 5, 69, 0, 0, 390, 391, 5, 59, 0, 0, 391, 398, 5, 70, 0, 0, 392, 393, 5, 59, 0, 0, 393, 398, 5, 67, 0, 0, 394, 395, 5, 59, 0, 0, 395, 398, 5, 68, 0, 0, 396, 398, 5, 45, 0, 0, 397, 350, 1, 0, 0, 0, 397, 352, 1, 0, 0, 0, 397, 353, 1, 0, 0, 0, 397, 354, 1, 0, 0, 0, 397, 355, 1, 0, 0, 0, 397, 365, 1, 0, 0, 0, 397, 375, 1, 0, 0, 0, 397, 376, 1, 0, 0, 0, 397, 377, 1, 0, 0, 0, 397, 378, 1, 0, 0, 0, 397, 379, 1, 0, 0, 0, 397, 380, 1, 0, 0, 0, 397, 384, 1, 0, 0, 0, 397, 386, 1, 0, 0, 0, 397, 388, 1, 0, 0, 0, 397, 390, 1, 0, 0, 0, 397, 392, 1, 0, 0, 0, 397, 394, 1, 0, 0, 0, 397, 396, 1, 0, 0, 0, 398, 409, 1, 0, 0, 0, 399, 400, 10, 10, 0, 0, 400, 401, 5, 42, 0, 0, 401, 408, 3, 44, 22, 0, 402, 403, 10, 9, 0, 0, 403, 404, 5, 49, 0, 0, 404, 408, 3, 44, 22, 0, 405, 406, 10, 8, 0, 0, 406, 408, 3, 44, 22, 0, 407, 399, 1, 0, 0, 0, 407, 402, 1, 0, 0, 0, 407, 405, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 43, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 412, 413, 6, 22, -1, 0, 413, 458, 5, 77, 0, 0, 414, 458, 5, 65, 0, 0, 415, 458, 5, 69, 0, 0, 416, 458, 5, 70, 0, 0, 417, 418, 5, 69, 0, 0, 418, 419, 5, 37, 0, 0, 419, 423, 5, 34, 0, 0, 420, 422, 3, 94, 47, 0, 421, 420, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 458, 5, 35, 0, 0, 427, 428, 5, 70, 0, 0, 428, 429, 5, 37, 0, 0, 429, 433, 5, 34, 0, 0, 430, 432, 3, 94, 47, 0, 431, 430, 1, 0, 0, 0, 432, 435, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 436, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 436, 458, 5, 35, 0, 0, 437, 458, 5, 67, 0, 0, 438, 458, 5, 68, 0, 0, 439, 458, 5, 74, 0, 0, 440, 441, 5, 32, 0, 0, 441, 442, 3, 44, 22, 0, 442, 443, 5, 33, 0, 0, 443, 458, 1, 0, 0, 0, 444, 445, 5, 43, 0, 0, 445, 458, 5, 77, 0, 0, 446, 447, 5, 43, 0, 0, 447, 458, 5, 65, 0, 0, 448, 449, 5, 59, 0, 0, 449, 458, 5, 69, 0, 0, 450, 451, 5, 59, 0, 0, 451, 458, 5, 70, 0, 0, 452, 453, 5, 59, 0, 0, 453, 458, 5, 67, 0, 0, 454, 455, 5, 59, 0, 0, 455, 458, 5, 68, 0, 0, 456, 458, 5, 45, 0, 0, 457, 412, 1, 0, 0, 0, 457, 414, 1, 0, 0, 0, 457, 415, 1, 0, 0, 0, 457, 416, 1, 0, 0, 0, 457, 417, 1, 0, 0, 0, 457, 427, 1, 0, 0, 0, 457, 437, 1, 0, 0, 0, 457, 438, 1, 0, 0, 0, 457, 439, 1, 0, 0, 0, 457, 440, 1, 0, 0, 0, 457, 444, 1, 0, 0, 0, 457, 446, 1, 0, 0, 0, 457, 448, 1, 0, 0, 0, 457, 450, 1, 0, 0, 0, 457, 452, 1, 0, 0, 0, 457, 454, 1, 0, 0, 0, 457, 456, 1, 0, 0, 0, 458, 466, 1, 0, 0, 0, 459, 460, 10, 9, 0, 0, 460, 461, 5, 42, 0, 0, 461, 465, 3, 44, 22, 10, 462, 463, 10, 8, 0, 0, 463, 465, 3, 44, 22, 9, 464, 459, 1, 0, 0, 0, 464, 462, 1, 0, 0, 0, 465, 468, 1, 0, 0, 0, 466, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 45, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 469, 471, 3, 48, 24, 0, 470, 469, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 47, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 475, 487, 3, 12, 6, 0, 476, 487, 3, 50, 25, 0, 477, 487, 3, 118, 59, 0, 478, 487, 3, 124, 62, 0, 479, 487, 3, 112, 56, 0, 480, 487, 3, 58, 29, 0, 481, 487, 3, 60, 30, 0, 482, 487, 3, 62, 31, 0, 483, 487, 3, 64, 32, 0, 484, 487, 3, 34, 17, 0, 485, 487, 3, 106, 53, 0, 486, 475, 1, 0, 0, 0, 486, 476, 1, 0, 0, 0, 486, 477, 1, 0, 0, 0, 486, 478, 1, 0, 0, 0, 486, 479, 1, 0, 0, 0, 486, 480, 1, 0, 0, 0, 486, 481, 1, 0, 0, 0, 486, 482, 1, 0, 0, 0, 486, 483, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 486, 485, 1, 0, 0, 0, 487, 49, 1, 0, 0, 0, 488, 489, 5, 5, 0, 0, 489, 490, 3, 68, 34, 0, 490, 494, 5, 30, 0, 0, 491, 493, 3, 48, 24, 0, 492, 491, 1, 0, 0, 0, 493, 496, 1, 0, 0, 0, 494, 492, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 497, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 497, 499, 5, 31, 0, 0, 498, 500, 3, 52, 26, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 51, 1, 0, 0, 0, 501, 504, 3, 54, 27, 0, 502, 504, 3, 56, 28, 0, 503, 501, 1, 0, 0, 0, 503, 502, 1, 0, 0, 0, 504, 53, 1, 0, 0, 0, 505, 506, 5, 6, 0, 0, 506, 510, 5, 30, 0, 0, 507, 509, 3, 48, 24, 0, 508, 507, 1, 0, 0, 0, 509, 512, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 513, 1, 0, 0, 0, 512, 510, 1, 0, 0, 0, 513, 514, 5, 31, 0, 0, 514, 55, 1, 0, 0, 0, 515, 516, 5, 7, 0, 0, 516, 517, 3, 68, 34, 0, 517, 521, 5, 30, 0, 0, 518, 520, 3, 48, 24, 0, 519, 518, 1, 0, 0, 0, 520, 523, 1, 0, 0, 0, 521, 519, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 524, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 524, 526, 5, 31, 0, 0, 525, 527, 3, 52, 26, 0, 526, 525, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 57, 1, 0, 0, 0, 528, 529, 5, 16, 0, 0, 529, 530, 3, 68, 34, 0, 530, 531, 5, 36, 0, 0, 531, 59, 1, 0, 0, 0, 532, 533, 5, 66, 0, 0, 533, 534, 5, 36, 0, 0, 534, 61, 1, 0, 0, 0, 535, 536, 5, 17, 0, 0, 536, 537, 3, 68, 34, 0, 537, 538, 5, 36, 0, 0, 538, 63, 1, 0, 0, 0, 539, 541, 3, 8, 4, 0, 540, 542, 3, 66, 33, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 544, 5, 37, 0, 0, 544, 545, 3, 68, 34, 0, 545, 546, 5, 36, 0, 0, 546, 580, 1, 0, 0, 0, 547, 549, 3, 8, 4, 0, 548, 550, 3, 66, 33, 0, 549, 548, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 5, 38, 0, 0, 552, 553, 3, 68, 34, 0, 553, 554, 5, 36, 0, 0, 554, 580, 1, 0, 0, 0, 555, 557, 3, 8, 4, 0, 556, 558, 3, 66, 33, 0, 557, 556, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 5, 39, 0, 0, 560, 561, 3, 68, 34, 0, 561, 562, 5, 36, 0, 0, 562, 580, 1, 0, 0, 0, 563, 565, 3, 8, 4, 0, 564, 566, 3, 66, 33, 0, 565, 564, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 5, 41, 0, 0, 568, 569, 3, 68, 34, 0, 569, 570, 5, 36, 0, 0, 570, 580, 1, 0, 0, 0, 571, 573, 3, 8, 4, 0, 572, 574, 3, 66, 33, 0, 573, 572, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 5, 40, 0, 0, 576, 577, 3, 68, 34, 0, 577, 578, 5, 36, 0, 0, 578, 580, 1, 0, 0, 0, 579, 539, 1, 0, 0, 0, 579, 547, 1, 0, 0, 0, 579, 555, 1, 0, 0, 0, 579, 563, 1, 0, 0, 0, 579, 571, 1, 0, 0, 0, 580, 65, 1, 0, 0, 0, 581, 582, 5, 34, 0, 0, 582, 583, 5, 64, 0, 0, 583, 594, 5, 35, 0, 0, 584, 585, 5, 34, 0, 0, 585, 586, 5, 77, 0, 0, 586, 594, 5, 35, 0, 0, 587, 588, 5, 34, 0, 0, 588, 589, 5, 69, 0, 0, 589, 594, 5, 35, 0, 0, 590, 591, 5, 34, 0, 0, 591, 592, 5, 65, 0, 0, 592, 594, 5, 35, 0, 0, 593, 581, 1, 0, 0, 0, 593, 584, 1, 0, 0, 0, 593, 587, 1, 0, 0, 0, 593, 590, 1, 0, 0, 0, 594, 67, 1, 0, 0, 0, 595, 596, 6, 34, -1, 0, 596, 597, 5, 77, 0, 0, 597, 598, 5, 32, 0, 0, 598, 599, 3, 84, 42, 0, 599, 600, 5, 33, 0, 0, 600, 616, 1, 0, 0, 0, 601, 616, 3, 70, 35, 0, 602, 616, 5, 71, 0, 0, 603, 616, 5, 72, 0, 0, 604, 616, 5, 73, 0, 0, 605, 606, 5, 32, 0, 0, 606, 607, 3, 68, 34, 0, 607, 608, 5, 33, 0, 0, 608, 616, 1, 0, 0, 0, 609, 610, 5, 44, 0, 0, 610, 616, 3, 68, 34, 20, 611, 612, 5, 43, 0, 0, 612, 616, 3, 68, 34, 19, 613, 614, 5, 48, 0, 0, 614, 616, 3, 68, 34, 18, 615, 595, 1, 0, 0, 0, 615, 601, 1, 0, 0, 0, 615, 602, 1, 0, 0, 0, 615, 603, 1, 0, 0, 0, 615, 604, 1, 0, 0, 0, 615, 605, 1, 0, 0, 0, 615, 609, 1, 0, 0, 0, 615, 611, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 682, 1, 0, 0, 0, 617, 618, 10, 14, 0, 0, 618, 619, 5, 45, 0, 0, 619, 681, 3, 68, 34, 15, 620, 621, 10, 13, 0, 0, 621, 622, 5, 46, 0, 0, 622, 681, 3, 68, 34, 14, 623, 624, 10, 12, 0, 0, 624, 625, 5, 47, 0, 0, 625, 681, 3, 68, 34, 13, 626, 627, 10, 11, 0, 0, 627, 628, 5, 43, 0, 0, 628, 681, 3, 68, 34, 12, 629, 630, 10, 10, 0, 0, 630, 631, 5, 44, 0, 0, 631, 681, 3, 68, 34, 11, 632, 633, 10, 9, 0, 0, 633, 634, 5, 49, 0, 0, 634, 681, 3, 68, 34, 10, 635, 636, 10, 8, 0, 0, 636, 637, 5, 51, 0, 0, 637, 681, 3, 68, 34, 9, 638, 639, 10, 7, 0, 0, 639, 640, 5, 50, 0, 0, 640, 681, 3, 68, 34, 8, 641, 642, 10, 6, 0, 0, 642, 643, 5, 52, 0, 0, 643, 681, 3, 68, 34, 7, 644, 645, 10, 5, 0, 0, 645, 646, 5, 53, 0, 0, 646, 681, 3, 68, 34, 6, 647, 648, 10, 4, 0, 0, 648, 649, 5, 54, 0, 0, 649, 681, 3, 68, 34, 5, 650, 651, 10, 3, 0, 0, 651, 652, 5, 55, 0, 0, 652, 681, 3, 68, 34, 4, 653, 654, 10, 2, 0, 0, 654, 655, 5, 56, 0, 0, 655, 681, 3, 68, 34, 3, 656, 657, 10, 1, 0, 0, 657, 658, 5, 57, 0, 0, 658, 659, 3, 68, 34, 0, 659, 660, 5, 58, 0, 0, 660, 661, 3, 68, 34, 2, 661, 681, 1, 0, 0, 0, 662, 663, 10, 17, 0, 0, 663, 664, 5, 37, 0, 0, 664, 665, 5, 77, 0, 0, 665, 666, 5, 32, 0, 0, 666, 667, 3, 84, 42, 0, 667, 668, 5, 33, 0, 0, 668, 681, 1, 0, 0, 0, 669, 670, 10, 16, 0, 0, 670, 671, 5, 74, 0, 0, 671, 672, 5, 32, 0, 0, 672, 673, 3, 84, 42, 0, 673, 674, 5, 33, 0, 0, 674, 681, 1, 0, 0, 0, 675, 676, 10, 15, 0, 0, 676, 677, 5, 34, 0, 0, 677, 678, 3, 68, 34, 0, 678, 679, 5, 35, 0, 0, 679, 681, 1, 0, 0, 0, 680, 617, 1, 0, 0, 0, 680, 620, 1, 0, 0, 0, 680, 623, 1, 0, 0, 0, 680, 626, 1, 0, 0, 0, 680, 629, 1, 0, 0, 0, 680, 632, 1, 0, 0, 0, 680, 635, 1, 0, 0, 0, 680, 638, 1, 0, 0, 0, 680, 641, 1, 0, 0, 0, 680, 644, 1, 0, 0, 0, 680, 647, 1, 0, 0, 0, 680, 650, 1, 0, 0, 0, 680, 653, 1, 0, 0, 0, 680, 656, 1, 0, 0, 0, 680, 662, 1, 0, 0, 0, 680, 669, 1, 0, 0, 0, 680, 675, 1, 0, 0, 0, 681, 684, 1, 0, 0, 0, 682, 680, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 69, 1, 0, 0, 0, 684, 682, 1, 0, 0, 0, 685, 703, 5, 66, 0, 0, 686, 703, 5, 61, 0, 0, 687, 703, 5, 62, 0, 0, 688, 703, 5, 64, 0, 0, 689, 703, 5, 65, 0, 0, 690, 703, 5, 77, 0, 0, 691, 703, 5, 60, 0, 0, 692, 693, 5, 4, 0, 0, 693, 694, 5, 32, 0, 0, 694, 695, 3, 88, 44, 0, 695, 696, 5, 33, 0, 0, 696, 697, 5, 30, 0, 0, 697, 698, 3, 92, 46, 0, 698, 699, 5, 31, 0, 0, 699, 703, 1, 0, 0, 0, 700, 703, 3, 74, 37, 0, 701, 703, 3, 78, 39, 0, 702, 685, 1, 0, 0, 0, 702, 686, 1, 0, 0, 0, 702, 687, 1, 0, 0, 0, 702, 688, 1, 0, 0, 0, 702, 689, 1, 0, 0, 0, 702, 690, 1, 0, 0, 0, 702, 691, 1, 0, 0, 0, 702, 692, 1, 0, 0, 0, 702, 700, 1, 0, 0, 0, 702, 701, 1, 0, 0, 0, 703, 71, 1, 0, 0, 0, 704, 705, 6, 36, -1, 0, 705, 706, 5, 32, 0, 0, 706, 707, 3, 72, 36, 0, 707, 708, 5, 33, 0, 0, 708, 713, 1, 0, 0, 0, 709, 710, 5, 48, 0, 0, 710, 713, 3, 72, 36, 2, 711, 713, 3, 8, 4, 0, 712, 704, 1, 0, 0, 0, 712, 709, 1, 0, 0, 0, 712, 711, 1, 0, 0, 0, 713, 722, 1, 0, 0, 0, 714, 715, 10, 4, 0, 0, 715, 716, 5, 55, 0, 0, 716, 721, 3, 72, 36, 5, 717, 718, 10, 3, 0, 0, 718, 719, 5, 56, 0, 0, 719, 721, 3, 72, 36, 4, 720, 714, 1, 0, 0, 0, 720, 717, 1, 0, 0, 0, 721, 724, 1, 0, 0, 0, 722, 720, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 73, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 725, 726, 5, 34, 0, 0, 726, 728, 3, 76, 38, 0, 727, 729, 5, 42, 0, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 35, 0, 0, 731, 75, 1, 0, 0, 0, 732, 734, 3, 68, 34, 0, 733, 732, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 739, 1, 0, 0, 0, 735, 736, 5, 42, 0, 0, 736, 738, 3, 68, 34, 0, 737, 735, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 733, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 77, 1, 0, 0, 0, 744, 745, 5, 30, 0, 0, 745, 747, 3, 80, 40, 0, 746, 748, 5, 42, 0, 0, 747, 746, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 5, 31, 0, 0, 750, 79, 1, 0, 0, 0, 751, 753, 3, 82, 41, 0, 752, 751, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 758, 1, 0, 0, 0, 754, 755, 5, 42, 0, 0, 755, 757, 3, 82, 41, 0, 756, 754, 1, 0, 0, 0, 757, 760, 1, 0, 0, 0, 758, 756, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 762, 1, 0, 0, 0, 760, 758, 1, 0, 0, 0, 761, 752, 1, 0, 0, 0, 761, 762, 1, 0, 0, 0, 762, 81, 1, 0, 0, 0, 763, 764, 5, 77, 0, 0, 764, 765, 5, 37, 0, 0, 765, 770, 3, 68, 34, 0, 766, 767, 5, 65, 0, 0, 767, 768, 5, 37, 0, 0, 768, 770, 3, 68, 34, 0, 769, 763, 1, 0, 0, 0, 769, 766, 1, 0, 0, 0, 770, 83, 1, 0, 0, 0, 771, 773, 3, 86, 43, 0, 772, 771, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 778, 1, 0, 0, 0, 774, 775, 5, 42, 0, 0, 775, 777, 3, 86, 43, 0, 776, 774, 1, 0, 0, 0, 777, 780, 1, 0, 0, 0, 778, 776, 1, 0, 0, 0, 778, 779, 1, 0, 0, 0, 779, 782, 1, 0, 0, 0, 780, 778, 1, 0, 0, 0, 781, 772, 1, 0, 0, 0, 781, 782, 1, 0, 0, 0, 782, 784, 1, 0, 0, 0, 783, 785, 5, 42, 0, 0, 784, 783, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 85, 1, 0, 0, 0, 786, 787, 5, 71, 0, 0, 787, 788, 5, 37, 0, 0, 788, 791, 3, 68, 34, 0, 789, 791, 3, 68, 34, 0, 790, 786, 1, 0, 0, 0, 790, 789, 1, 0, 0, 0, 791, 87, 1, 0, 0, 0, 792, 794, 3, 90, 45, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 799, 1, 0, 0, 0, 795, 796, 5, 42, 0, 0, 796, 798, 3, 90, 45, 0, 797, 795, 1, 0, 0, 0, 798, 801, 1, 0, 0, 0, 799, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 803, 1, 0, 0, 0, 801, 799, 1, 0, 0, 0, 802, 793, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 805, 1, 0, 0, 0, 804, 806, 5, 42, 0, 0, 805, 804, 1, 0, 0, 0, 805, 806, 1, 0, 0, 0, 806, 89, 1, 0, 0, 0, 807, 812, 5, 71, 0, 0, 808, 809, 5, 71, 0, 0, 809, 810, 5, 37, 0, 0, 810, 812, 3, 68, 34, 0, 811, 807, 1, 0, 0, 0, 811, 808, 1, 0, 0, 0, 812, 91, 1, 0, 0, 0, 813, 815, 3, 94, 47, 0, 814, 813, 1, 0, 0, 0, 815, 818, 1, 0, 0, 0, 816, 814, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 93, 1, 0, 0, 0, 818, 816, 1, 0, 0, 0, 819, 826, 3, 12, 6, 0, 820, 826, 3, 96, 48, 0, 821, 826, 3, 104, 52, 0, 822, 826, 3, 108, 54, 0, 823, 826, 3, 114, 57, 0, 824, 826, 3, 120, 60, 0, 825, 819, 1, 0, 0, 0, 825, 820, 1, 0, 0, 0, 825, 821, 1, 0, 0, 0, 825, 822, 1, 0, 0, 0, 825, 823, 1, 0, 0, 0, 825, 824, 1, 0, 0, 0, 826, 95, 1, 0, 0, 0, 827, 828, 5, 5, 0, 0, 828, 829, 3, 68, 34, 0, 829, 833, 5, 30, 0, 0, 830, 832, 3, 94, 47, 0, 831, 830, 1, 0, 0, 0, 832, 835, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 836, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 836, 838, 5, 31, 0, 0, 837, 839, 3, 98, 49, 0, 838, 837, 1, 0, 0, 0, 838, 839, 1, 0, 0, 0, 839, 97, 1, 0, 0, 0, 840, 843, 3, 100, 50, 0, 841, 843, 3, 102, 51, 0, 842, 840, 1, 0, 0, 0, 842, 841, 1, 0, 0, 0, 843, 99, 1, 0, 0, 0, 844, 845, 5, 6, 0, 0, 845, 849, 5, 30, 0, 0, 846, 848, 3, 94, 47, 0, 847, 846, 1, 0, 0, 0, 848, 851, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 852, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 852, 853, 5, 31, 0, 0, 853, 101, 1, 0, 0, 0, 854, 855, 5, 7, 0, 0, 855, 856, 3, 68, 34, 0, 856, 860, 5, 30, 0, 0, 857, 859, 3, 94, 47, 0, 858, 857, 1, 0, 0, 0, 859, 862, 1, 0, 0, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 863, 1, 0, 0, 0, 862, 860, 1, 0, 0, 0, 863, 865, 5, 31, 0, 0, 864, 866, 3, 98, 49, 0, 865, 864, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 103, 1, 0, 0, 0, 867, 868, 5, 22, 0, 0, 868, 869, 3, 68, 34, 0, 869, 870, 5, 36, 0, 0, 870, 105, 1, 0, 0, 0, 871, 872, 5, 21, 0, 0, 872, 873, 5, 77, 0, 0, 873, 874, 5, 32, 0, 0, 874, 875, 3, 84, 42, 0, 875, 876, 5, 33, 0, 0, 876, 107, 1, 0, 0, 0, 877, 878, 5, 10, 0, 0, 878, 879, 5, 71, 0, 0, 879, 880, 5, 11, 0, 0, 880, 881, 3, 68, 34, 0, 881, 882, 5, 13, 0, 0, 882, 883, 3, 68, 34, 0, 883, 887, 5, 30, 0, 0, 884, 886, 3, 94, 47, 0, 885, 884, 1, 0, 0, 0, 886, 889, 1, 0, 0, 0, 887, 885, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 890, 1, 0, 0, 0, 889, 887, 1, 0, 0, 0, 890, 891, 5, 31, 0, 0, 891, 908, 1, 0, 0, 0, 892, 893, 5, 10, 0, 0, 893, 894, 5, 71, 0, 0, 894, 895, 5, 11, 0, 0, 895, 896, 3, 68, 34, 0, 896, 897, 5, 12, 0, 0, 897, 898, 3, 68, 34, 0, 898, 902, 5, 30, 0, 0, 899, 901, 3, 94, 47, 0, 900, 899, 1, 0, 0, 0, 901, 904, 1, 0, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 905, 1, 0, 0, 0, 904, 902, 1, 0, 0, 0, 905, 906, 5, 31, 0, 0, 906, 908, 1, 0, 0, 0, 907, 877, 1, 0, 0, 0, 907, 892, 1, 0, 0, 0, 908, 109, 1, 0, 0, 0, 909, 910, 5, 10, 0, 0, 910, 911, 5, 71, 0, 0, 911, 912, 5, 11, 0, 0, 912, 913, 3, 68, 34, 0, 913, 914, 5, 13, 0, 0, 914, 915, 3, 68, 34, 0, 915, 919, 5, 30, 0, 0, 916, 918, 3, 2, 1, 0, 917, 916, 1, 0, 0, 0, 918, 921, 1, 0, 0, 0, 919, 917, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 922, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 922, 923, 5, 31, 0, 0, 923, 940, 1, 0, 0, 0, 924, 925, 5, 10, 0, 0, 925, 926, 5, 71, 0, 0, 926, 927, 5, 11, 0, 0, 927, 928, 3, 68, 34, 0, 928, 929, 5, 12, 0, 0, 929, 930, 3, 68, 34, 0, 930, 934, 5, 30, 0, 0, 931, 933, 3, 2, 1, 0, 932, 931, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 937, 1, 0, 0, 0, 936, 934, 1, 0, 0, 0, 937, 938, 5, 31, 0, 0, 938, 940, 1, 0, 0, 0, 939, 909, 1, 0, 0, 0, 939, 924, 1, 0, 0, 0, 940, 111, 1, 0, 0, 0, 941, 942, 5, 10, 0, 0, 942, 943, 5, 71, 0, 0, 943, 944, 5, 11, 0, 0, 944, 945, 3, 68, 34, 0, 945, 946, 5, 13, 0, 0, 946, 947, 3, 68, 34, 0, 947, 951, 5, 30, 0, 0, 948, 950, 3, 48, 24, 0, 949, 948, 1, 0, 0, 0, 950, 953, 1, 0, 0, 0, 951, 949, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 954, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 954, 955, 5, 31, 0, 0, 955, 972, 1, 0, 0, 0, 956, 957, 5, 10, 0, 0, 957, 958, 5, 71, 0, 0, 958, 959, 5, 11, 0, 0, 959, 960, 3, 68, 34, 0, 960, 961, 5, 12, 0, 0, 961, 962, 3, 68, 34, 0, 962, 966, 5, 30, 0, 0, 963, 965, 3, 48, 24, 0, 964, 963, 1, 0, 0, 0, 965, 968, 1, 0, 0, 0, 966, 964, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 969, 1, 0, 0, 0, 968, 966, 1, 0, 0, 0, 969, 970, 5, 31, 0, 0, 970, 972, 1, 0, 0, 0, 971, 941, 1, 0, 0, 0, 971, 956, 1, 0, 0, 0, 972, 113, 1, 0, 0, 0, 973, 976, 5, 14, 0, 0, 974, 975, 5, 71, 0, 0, 975, 977, 5, 42, 0, 0, 976, 974, 1, 0, 0, 0, 976, 977, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 979, 5, 71, 0, 0, 979, 980, 5, 15, 0, 0, 980, 981, 3, 68, 34, 0, 981, 985, 5, 30, 0, 0, 982, 984, 3, 94, 47, 0, 983, 982, 1, 0, 0, 0, 984, 987, 1, 0, 0, 0, 985, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 988, 1, 0, 0, 0, 987, 985, 1, 0, 0, 0, 988, 989, 5, 31, 0, 0, 989, 115, 1, 0, 0, 0, 990, 993, 5, 14, 0, 0, 991, 992, 5, 71, 0, 0, 992, 994, 5, 42, 0, 0, 993, 991, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 1, 0, 0, 0, 995, 996, 5, 71, 0, 0, 996, 997, 5, 15, 0, 0, 997, 998, 3, 68, 34, 0, 998, 1002, 5, 30, 0, 0, 999, 1001, 3, 2, 1, 0, 1000, 999, 1, 0, 0, 0, 1001, 1004, 1, 0, 0, 0, 1002, 1000, 1, 0, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1005, 1, 0, 0, 0, 1004, 1002, 1, 0, 0, 0, 1005, 1006, 5, 31, 0, 0, 1006, 117, 1, 0, 0, 0, 1007, 1010, 5, 14, 0, 0, 1008, 1009, 5, 71, 0, 0, 1009, 1011, 5, 42, 0, 0, 1010, 1008, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 5, 71, 0, 0, 1013, 1014, 5, 15, 0, 0, 1014, 1015, 3, 68, 34, 0, 1015, 1019, 5, 30, 0, 0, 1016, 1018, 3, 48, 24, 0, 1017, 1016, 1, 0, 0, 0, 1018, 1021, 1, 0, 0, 0, 1019, 1017, 1, 0, 0, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1022, 1, 0, 0, 0, 1021, 1019, 1, 0, 0, 0, 1022, 1023, 5, 31, 0, 0, 1023, 119, 1, 0, 0, 0, 1024, 1025, 5, 9, 0, 0, 1025, 1026, 3, 68, 34, 0, 1026, 1030, 5, 30, 0, 0, 1027, 1029, 3, 94, 47, 0, 1028, 1027, 1, 0, 0, 0, 1029, 1032, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1033, 1, 0, 0, 0, 1032, 1030, 1, 0, 0, 0, 1033, 1034, 5, 31, 0, 0, 1034, 121, 1, 0, 0, 0, 1035, 1036, 5, 9, 0, 0, 1036, 1037, 3, 68, 34, 0, 1037, 1041, 5, 30, 0, 0, 1038, 1040, 3, 2, 1, 0, 1039, 1038, 1, 0, 0, 0, 1040, 1043, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1044, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1044, 1045, 5, 31, 0, 0, 1045, 123, 1, 0, 0, 0, 1046, 1047, 5, 9, 0, 0, 1047, 1048, 3, 68, 34, 0, 1048, 1052, 5, 30, 0, 0, 1049, 1051, 3, 48, 24, 0, 1050, 1049, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1055, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1055, 1056, 5, 31, 0, 0, 1056, 125, 1, 0, 0, 0, 96, 129, 146, 157, 162, 193, 212, 218, 246, 256, 282, 287, 291, 298, 309, 314, 324, 335, 343, 346, 361, 371, 397, 407, 409, 423, 433, 457, 464, 466, 472, 486, 494, 499, 503, 510, 521, 526, 541, 549, 557, 565, 573, 579, 593, 615, 680, 682, 702, 712, 720, 722, 728, 733, 739, 742, 747, 752, 758, 761, 769, 772, 778, 781, 784, 790, 793, 799, 802, 805, 811, 816, 825, 833, 838, 842, 849, 860, 865, 887, 902, 907, 919, 934, 939, 951, 966, 971, 976, 985, 993, 1002, 1010, 1019, 1030, 1041, 1052] \ No newline at end of file +[4, 1, 77, 1098, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 1, 0, 4, 0, 128, 8, 0, 11, 0, 12, 0, 129, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 147, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 5, 3, 156, 8, 3, 10, 3, 12, 3, 159, 9, 3, 1, 4, 1, 4, 3, 4, 163, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 5, 6, 171, 8, 6, 10, 6, 12, 6, 174, 9, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 182, 8, 6, 10, 6, 12, 6, 185, 9, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 193, 8, 6, 10, 6, 12, 6, 196, 9, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 204, 8, 6, 10, 6, 12, 6, 207, 9, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 215, 8, 6, 10, 6, 12, 6, 218, 9, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 224, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 241, 8, 7, 10, 7, 12, 7, 244, 9, 7, 1, 7, 1, 7, 1, 7, 3, 7, 249, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 277, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 287, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 311, 8, 13, 10, 13, 12, 13, 314, 9, 13, 1, 13, 1, 13, 3, 13, 318, 8, 13, 1, 14, 1, 14, 3, 14, 322, 8, 14, 1, 15, 1, 15, 1, 15, 5, 15, 327, 8, 15, 10, 15, 12, 15, 330, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 338, 8, 16, 10, 16, 12, 16, 341, 9, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 5, 18, 353, 8, 18, 10, 18, 12, 18, 356, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 366, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 372, 8, 20, 10, 20, 12, 20, 375, 9, 20, 3, 20, 377, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 390, 8, 21, 10, 21, 12, 21, 393, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 400, 8, 21, 10, 21, 12, 21, 403, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 428, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 438, 8, 21, 10, 21, 12, 21, 441, 9, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 452, 8, 22, 10, 22, 12, 22, 455, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 462, 8, 22, 10, 22, 12, 22, 465, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 488, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 495, 8, 22, 10, 22, 12, 22, 498, 9, 22, 1, 23, 5, 23, 501, 8, 23, 10, 23, 12, 23, 504, 9, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 517, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 523, 8, 25, 10, 25, 12, 25, 526, 9, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 26, 1, 26, 3, 26, 534, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 539, 8, 27, 10, 27, 12, 27, 542, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 550, 8, 28, 10, 28, 12, 28, 553, 9, 28, 1, 28, 1, 28, 3, 28, 557, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 5, 32, 572, 8, 32, 10, 32, 12, 32, 575, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 583, 8, 32, 10, 32, 12, 32, 586, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 594, 8, 32, 10, 32, 12, 32, 597, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 605, 8, 32, 10, 32, 12, 32, 608, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 616, 8, 32, 10, 32, 12, 32, 619, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 625, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 634, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 656, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 721, 8, 34, 10, 34, 12, 34, 724, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 743, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 753, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 761, 8, 36, 10, 36, 12, 36, 764, 9, 36, 1, 37, 1, 37, 1, 37, 3, 37, 769, 8, 37, 1, 37, 1, 37, 1, 38, 3, 38, 774, 8, 38, 1, 38, 1, 38, 5, 38, 778, 8, 38, 10, 38, 12, 38, 781, 9, 38, 3, 38, 783, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 788, 8, 39, 1, 39, 1, 39, 1, 40, 3, 40, 793, 8, 40, 1, 40, 1, 40, 5, 40, 797, 8, 40, 10, 40, 12, 40, 800, 9, 40, 3, 40, 802, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 810, 8, 41, 1, 42, 3, 42, 813, 8, 42, 1, 42, 1, 42, 5, 42, 817, 8, 42, 10, 42, 12, 42, 820, 9, 42, 3, 42, 822, 8, 42, 1, 42, 3, 42, 825, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 831, 8, 43, 1, 44, 3, 44, 834, 8, 44, 1, 44, 1, 44, 5, 44, 838, 8, 44, 10, 44, 12, 44, 841, 9, 44, 3, 44, 843, 8, 44, 1, 44, 3, 44, 846, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 852, 8, 45, 1, 46, 5, 46, 855, 8, 46, 10, 46, 12, 46, 858, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 866, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 872, 8, 48, 10, 48, 12, 48, 875, 9, 48, 1, 48, 1, 48, 3, 48, 879, 8, 48, 1, 49, 1, 49, 3, 49, 883, 8, 49, 1, 50, 1, 50, 1, 50, 5, 50, 888, 8, 50, 10, 50, 12, 50, 891, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 899, 8, 51, 10, 51, 12, 51, 902, 9, 51, 1, 51, 1, 51, 3, 51, 906, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 926, 8, 54, 10, 54, 12, 54, 929, 9, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 941, 8, 54, 10, 54, 12, 54, 944, 9, 54, 1, 54, 1, 54, 3, 54, 948, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 958, 8, 55, 10, 55, 12, 55, 961, 9, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 973, 8, 55, 10, 55, 12, 55, 976, 9, 55, 1, 55, 1, 55, 3, 55, 980, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 990, 8, 56, 10, 56, 12, 56, 993, 9, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 1005, 8, 56, 10, 56, 12, 56, 1008, 9, 56, 1, 56, 1, 56, 3, 56, 1012, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 1017, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 1024, 8, 57, 10, 57, 12, 57, 1027, 9, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 3, 58, 1034, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 5, 58, 1041, 8, 58, 10, 58, 12, 58, 1044, 9, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 3, 59, 1051, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1058, 8, 59, 10, 59, 12, 59, 1061, 9, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1069, 8, 60, 10, 60, 12, 60, 1072, 9, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1080, 8, 61, 10, 61, 12, 61, 1083, 9, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 1091, 8, 62, 10, 62, 12, 62, 1094, 9, 62, 1, 62, 1, 62, 1, 62, 0, 4, 42, 44, 68, 72, 63, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 0, 0, 1231, 0, 127, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 4, 148, 1, 0, 0, 0, 6, 152, 1, 0, 0, 0, 8, 162, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, 223, 1, 0, 0, 0, 14, 248, 1, 0, 0, 0, 16, 250, 1, 0, 0, 0, 18, 276, 1, 0, 0, 0, 20, 286, 1, 0, 0, 0, 22, 288, 1, 0, 0, 0, 24, 297, 1, 0, 0, 0, 26, 306, 1, 0, 0, 0, 28, 321, 1, 0, 0, 0, 30, 323, 1, 0, 0, 0, 32, 333, 1, 0, 0, 0, 34, 346, 1, 0, 0, 0, 36, 354, 1, 0, 0, 0, 38, 365, 1, 0, 0, 0, 40, 367, 1, 0, 0, 0, 42, 427, 1, 0, 0, 0, 44, 487, 1, 0, 0, 0, 46, 502, 1, 0, 0, 0, 48, 516, 1, 0, 0, 0, 50, 518, 1, 0, 0, 0, 52, 533, 1, 0, 0, 0, 54, 535, 1, 0, 0, 0, 56, 545, 1, 0, 0, 0, 58, 558, 1, 0, 0, 0, 60, 562, 1, 0, 0, 0, 62, 565, 1, 0, 0, 0, 64, 624, 1, 0, 0, 0, 66, 633, 1, 0, 0, 0, 68, 655, 1, 0, 0, 0, 70, 742, 1, 0, 0, 0, 72, 752, 1, 0, 0, 0, 74, 765, 1, 0, 0, 0, 76, 782, 1, 0, 0, 0, 78, 784, 1, 0, 0, 0, 80, 801, 1, 0, 0, 0, 82, 809, 1, 0, 0, 0, 84, 821, 1, 0, 0, 0, 86, 830, 1, 0, 0, 0, 88, 842, 1, 0, 0, 0, 90, 851, 1, 0, 0, 0, 92, 856, 1, 0, 0, 0, 94, 865, 1, 0, 0, 0, 96, 867, 1, 0, 0, 0, 98, 882, 1, 0, 0, 0, 100, 884, 1, 0, 0, 0, 102, 894, 1, 0, 0, 0, 104, 907, 1, 0, 0, 0, 106, 911, 1, 0, 0, 0, 108, 947, 1, 0, 0, 0, 110, 979, 1, 0, 0, 0, 112, 1011, 1, 0, 0, 0, 114, 1013, 1, 0, 0, 0, 116, 1030, 1, 0, 0, 0, 118, 1047, 1, 0, 0, 0, 120, 1064, 1, 0, 0, 0, 122, 1075, 1, 0, 0, 0, 124, 1086, 1, 0, 0, 0, 126, 128, 3, 2, 1, 0, 127, 126, 1, 0, 0, 0, 128, 129, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 129, 130, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 5, 0, 0, 1, 132, 1, 1, 0, 0, 0, 133, 147, 3, 10, 5, 0, 134, 147, 3, 12, 6, 0, 135, 147, 3, 14, 7, 0, 136, 147, 3, 22, 11, 0, 137, 147, 3, 24, 12, 0, 138, 147, 3, 26, 13, 0, 139, 147, 3, 34, 17, 0, 140, 147, 3, 4, 2, 0, 141, 147, 3, 16, 8, 0, 142, 147, 3, 18, 9, 0, 143, 147, 3, 110, 55, 0, 144, 147, 3, 116, 58, 0, 145, 147, 3, 122, 61, 0, 146, 133, 1, 0, 0, 0, 146, 134, 1, 0, 0, 0, 146, 135, 1, 0, 0, 0, 146, 136, 1, 0, 0, 0, 146, 137, 1, 0, 0, 0, 146, 138, 1, 0, 0, 0, 146, 139, 1, 0, 0, 0, 146, 140, 1, 0, 0, 0, 146, 141, 1, 0, 0, 0, 146, 142, 1, 0, 0, 0, 146, 143, 1, 0, 0, 0, 146, 144, 1, 0, 0, 0, 146, 145, 1, 0, 0, 0, 147, 3, 1, 0, 0, 0, 148, 149, 5, 23, 0, 0, 149, 150, 3, 6, 3, 0, 150, 151, 5, 36, 0, 0, 151, 5, 1, 0, 0, 0, 152, 157, 3, 8, 4, 0, 153, 154, 5, 42, 0, 0, 154, 156, 3, 8, 4, 0, 155, 153, 1, 0, 0, 0, 156, 159, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 7, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 163, 5, 65, 0, 0, 161, 163, 5, 77, 0, 0, 162, 160, 1, 0, 0, 0, 162, 161, 1, 0, 0, 0, 163, 9, 1, 0, 0, 0, 164, 165, 5, 3, 0, 0, 165, 166, 3, 8, 4, 0, 166, 167, 5, 36, 0, 0, 167, 11, 1, 0, 0, 0, 168, 172, 5, 71, 0, 0, 169, 171, 3, 66, 33, 0, 170, 169, 1, 0, 0, 0, 171, 174, 1, 0, 0, 0, 172, 170, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 175, 1, 0, 0, 0, 174, 172, 1, 0, 0, 0, 175, 176, 5, 37, 0, 0, 176, 177, 3, 68, 34, 0, 177, 178, 5, 36, 0, 0, 178, 224, 1, 0, 0, 0, 179, 183, 5, 71, 0, 0, 180, 182, 3, 66, 33, 0, 181, 180, 1, 0, 0, 0, 182, 185, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 186, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 186, 187, 5, 38, 0, 0, 187, 188, 3, 68, 34, 0, 188, 189, 5, 36, 0, 0, 189, 224, 1, 0, 0, 0, 190, 194, 5, 71, 0, 0, 191, 193, 3, 66, 33, 0, 192, 191, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 39, 0, 0, 198, 199, 3, 68, 34, 0, 199, 200, 5, 36, 0, 0, 200, 224, 1, 0, 0, 0, 201, 205, 5, 71, 0, 0, 202, 204, 3, 66, 33, 0, 203, 202, 1, 0, 0, 0, 204, 207, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 208, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 208, 209, 5, 40, 0, 0, 209, 210, 3, 68, 34, 0, 210, 211, 5, 36, 0, 0, 211, 224, 1, 0, 0, 0, 212, 216, 5, 71, 0, 0, 213, 215, 3, 66, 33, 0, 214, 213, 1, 0, 0, 0, 215, 218, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 219, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 219, 220, 5, 41, 0, 0, 220, 221, 3, 68, 34, 0, 221, 222, 5, 36, 0, 0, 222, 224, 1, 0, 0, 0, 223, 168, 1, 0, 0, 0, 223, 179, 1, 0, 0, 0, 223, 190, 1, 0, 0, 0, 223, 201, 1, 0, 0, 0, 223, 212, 1, 0, 0, 0, 224, 13, 1, 0, 0, 0, 225, 226, 5, 20, 0, 0, 226, 227, 3, 8, 4, 0, 227, 228, 5, 36, 0, 0, 228, 249, 1, 0, 0, 0, 229, 230, 5, 20, 0, 0, 230, 231, 3, 8, 4, 0, 231, 232, 5, 37, 0, 0, 232, 233, 5, 27, 0, 0, 233, 234, 5, 36, 0, 0, 234, 249, 1, 0, 0, 0, 235, 236, 5, 20, 0, 0, 236, 237, 3, 8, 4, 0, 237, 238, 5, 37, 0, 0, 238, 242, 5, 30, 0, 0, 239, 241, 3, 20, 10, 0, 240, 239, 1, 0, 0, 0, 241, 244, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 245, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 245, 246, 5, 31, 0, 0, 246, 247, 5, 36, 0, 0, 247, 249, 1, 0, 0, 0, 248, 225, 1, 0, 0, 0, 248, 229, 1, 0, 0, 0, 248, 235, 1, 0, 0, 0, 249, 15, 1, 0, 0, 0, 250, 251, 5, 28, 0, 0, 251, 252, 3, 8, 4, 0, 252, 253, 5, 42, 0, 0, 253, 254, 3, 8, 4, 0, 254, 255, 5, 37, 0, 0, 255, 256, 3, 68, 34, 0, 256, 257, 5, 36, 0, 0, 257, 17, 1, 0, 0, 0, 258, 259, 5, 29, 0, 0, 259, 260, 3, 68, 34, 0, 260, 261, 5, 42, 0, 0, 261, 262, 3, 8, 4, 0, 262, 263, 5, 42, 0, 0, 263, 264, 3, 8, 4, 0, 264, 265, 5, 37, 0, 0, 265, 266, 3, 68, 34, 0, 266, 267, 5, 36, 0, 0, 267, 277, 1, 0, 0, 0, 268, 269, 5, 29, 0, 0, 269, 270, 3, 68, 34, 0, 270, 271, 5, 42, 0, 0, 271, 272, 3, 8, 4, 0, 272, 273, 5, 37, 0, 0, 273, 274, 3, 68, 34, 0, 274, 275, 5, 36, 0, 0, 275, 277, 1, 0, 0, 0, 276, 258, 1, 0, 0, 0, 276, 268, 1, 0, 0, 0, 277, 19, 1, 0, 0, 0, 278, 279, 5, 25, 0, 0, 279, 280, 3, 8, 4, 0, 280, 281, 5, 36, 0, 0, 281, 287, 1, 0, 0, 0, 282, 283, 5, 26, 0, 0, 283, 284, 3, 8, 4, 0, 284, 285, 5, 36, 0, 0, 285, 287, 1, 0, 0, 0, 286, 278, 1, 0, 0, 0, 286, 282, 1, 0, 0, 0, 287, 21, 1, 0, 0, 0, 288, 289, 5, 4, 0, 0, 289, 290, 5, 77, 0, 0, 290, 291, 5, 32, 0, 0, 291, 292, 3, 88, 44, 0, 292, 293, 5, 33, 0, 0, 293, 294, 5, 30, 0, 0, 294, 295, 3, 92, 46, 0, 295, 296, 5, 31, 0, 0, 296, 23, 1, 0, 0, 0, 297, 298, 5, 8, 0, 0, 298, 299, 5, 77, 0, 0, 299, 300, 5, 32, 0, 0, 300, 301, 3, 88, 44, 0, 301, 302, 5, 33, 0, 0, 302, 303, 5, 30, 0, 0, 303, 304, 3, 46, 23, 0, 304, 305, 5, 31, 0, 0, 305, 25, 1, 0, 0, 0, 306, 307, 5, 5, 0, 0, 307, 308, 3, 68, 34, 0, 308, 312, 5, 30, 0, 0, 309, 311, 3, 2, 1, 0, 310, 309, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 315, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 315, 317, 5, 31, 0, 0, 316, 318, 3, 28, 14, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 27, 1, 0, 0, 0, 319, 322, 3, 30, 15, 0, 320, 322, 3, 32, 16, 0, 321, 319, 1, 0, 0, 0, 321, 320, 1, 0, 0, 0, 322, 29, 1, 0, 0, 0, 323, 324, 5, 6, 0, 0, 324, 328, 5, 30, 0, 0, 325, 327, 3, 2, 1, 0, 326, 325, 1, 0, 0, 0, 327, 330, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 331, 1, 0, 0, 0, 330, 328, 1, 0, 0, 0, 331, 332, 5, 31, 0, 0, 332, 31, 1, 0, 0, 0, 333, 334, 5, 7, 0, 0, 334, 335, 3, 68, 34, 0, 335, 339, 5, 30, 0, 0, 336, 338, 3, 2, 1, 0, 337, 336, 1, 0, 0, 0, 338, 341, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 342, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 342, 344, 5, 31, 0, 0, 343, 345, 3, 28, 14, 0, 344, 343, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 33, 1, 0, 0, 0, 346, 347, 3, 36, 18, 0, 347, 348, 5, 30, 0, 0, 348, 349, 3, 46, 23, 0, 349, 350, 5, 31, 0, 0, 350, 35, 1, 0, 0, 0, 351, 353, 3, 38, 19, 0, 352, 351, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 357, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 358, 3, 42, 21, 0, 358, 37, 1, 0, 0, 0, 359, 360, 5, 18, 0, 0, 360, 366, 3, 72, 36, 0, 361, 362, 5, 19, 0, 0, 362, 366, 3, 8, 4, 0, 363, 364, 5, 24, 0, 0, 364, 366, 3, 40, 20, 0, 365, 359, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 366, 39, 1, 0, 0, 0, 367, 376, 5, 32, 0, 0, 368, 373, 3, 68, 34, 0, 369, 370, 5, 42, 0, 0, 370, 372, 3, 68, 34, 0, 371, 369, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 377, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 368, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 5, 33, 0, 0, 379, 41, 1, 0, 0, 0, 380, 381, 6, 21, -1, 0, 381, 428, 5, 77, 0, 0, 382, 428, 5, 65, 0, 0, 383, 428, 5, 69, 0, 0, 384, 428, 5, 70, 0, 0, 385, 386, 5, 69, 0, 0, 386, 387, 5, 37, 0, 0, 387, 391, 5, 34, 0, 0, 388, 390, 3, 94, 47, 0, 389, 388, 1, 0, 0, 0, 390, 393, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 391, 1, 0, 0, 0, 394, 428, 5, 35, 0, 0, 395, 396, 5, 70, 0, 0, 396, 397, 5, 37, 0, 0, 397, 401, 5, 34, 0, 0, 398, 400, 3, 94, 47, 0, 399, 398, 1, 0, 0, 0, 400, 403, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 404, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 404, 428, 5, 35, 0, 0, 405, 428, 5, 67, 0, 0, 406, 428, 5, 68, 0, 0, 407, 428, 5, 74, 0, 0, 408, 428, 5, 75, 0, 0, 409, 428, 5, 76, 0, 0, 410, 411, 5, 32, 0, 0, 411, 412, 3, 42, 21, 0, 412, 413, 5, 33, 0, 0, 413, 428, 1, 0, 0, 0, 414, 415, 5, 43, 0, 0, 415, 428, 5, 77, 0, 0, 416, 417, 5, 43, 0, 0, 417, 428, 5, 65, 0, 0, 418, 419, 5, 59, 0, 0, 419, 428, 5, 69, 0, 0, 420, 421, 5, 59, 0, 0, 421, 428, 5, 70, 0, 0, 422, 423, 5, 59, 0, 0, 423, 428, 5, 67, 0, 0, 424, 425, 5, 59, 0, 0, 425, 428, 5, 68, 0, 0, 426, 428, 5, 45, 0, 0, 427, 380, 1, 0, 0, 0, 427, 382, 1, 0, 0, 0, 427, 383, 1, 0, 0, 0, 427, 384, 1, 0, 0, 0, 427, 385, 1, 0, 0, 0, 427, 395, 1, 0, 0, 0, 427, 405, 1, 0, 0, 0, 427, 406, 1, 0, 0, 0, 427, 407, 1, 0, 0, 0, 427, 408, 1, 0, 0, 0, 427, 409, 1, 0, 0, 0, 427, 410, 1, 0, 0, 0, 427, 414, 1, 0, 0, 0, 427, 416, 1, 0, 0, 0, 427, 418, 1, 0, 0, 0, 427, 420, 1, 0, 0, 0, 427, 422, 1, 0, 0, 0, 427, 424, 1, 0, 0, 0, 427, 426, 1, 0, 0, 0, 428, 439, 1, 0, 0, 0, 429, 430, 10, 10, 0, 0, 430, 431, 5, 42, 0, 0, 431, 438, 3, 44, 22, 0, 432, 433, 10, 9, 0, 0, 433, 434, 5, 49, 0, 0, 434, 438, 3, 44, 22, 0, 435, 436, 10, 8, 0, 0, 436, 438, 3, 44, 22, 0, 437, 429, 1, 0, 0, 0, 437, 432, 1, 0, 0, 0, 437, 435, 1, 0, 0, 0, 438, 441, 1, 0, 0, 0, 439, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 43, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 442, 443, 6, 22, -1, 0, 443, 488, 5, 77, 0, 0, 444, 488, 5, 65, 0, 0, 445, 488, 5, 69, 0, 0, 446, 488, 5, 70, 0, 0, 447, 448, 5, 69, 0, 0, 448, 449, 5, 37, 0, 0, 449, 453, 5, 34, 0, 0, 450, 452, 3, 94, 47, 0, 451, 450, 1, 0, 0, 0, 452, 455, 1, 0, 0, 0, 453, 451, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 456, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 456, 488, 5, 35, 0, 0, 457, 458, 5, 70, 0, 0, 458, 459, 5, 37, 0, 0, 459, 463, 5, 34, 0, 0, 460, 462, 3, 94, 47, 0, 461, 460, 1, 0, 0, 0, 462, 465, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 466, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 466, 488, 5, 35, 0, 0, 467, 488, 5, 67, 0, 0, 468, 488, 5, 68, 0, 0, 469, 488, 5, 74, 0, 0, 470, 471, 5, 32, 0, 0, 471, 472, 3, 44, 22, 0, 472, 473, 5, 33, 0, 0, 473, 488, 1, 0, 0, 0, 474, 475, 5, 43, 0, 0, 475, 488, 5, 77, 0, 0, 476, 477, 5, 43, 0, 0, 477, 488, 5, 65, 0, 0, 478, 479, 5, 59, 0, 0, 479, 488, 5, 69, 0, 0, 480, 481, 5, 59, 0, 0, 481, 488, 5, 70, 0, 0, 482, 483, 5, 59, 0, 0, 483, 488, 5, 67, 0, 0, 484, 485, 5, 59, 0, 0, 485, 488, 5, 68, 0, 0, 486, 488, 5, 45, 0, 0, 487, 442, 1, 0, 0, 0, 487, 444, 1, 0, 0, 0, 487, 445, 1, 0, 0, 0, 487, 446, 1, 0, 0, 0, 487, 447, 1, 0, 0, 0, 487, 457, 1, 0, 0, 0, 487, 467, 1, 0, 0, 0, 487, 468, 1, 0, 0, 0, 487, 469, 1, 0, 0, 0, 487, 470, 1, 0, 0, 0, 487, 474, 1, 0, 0, 0, 487, 476, 1, 0, 0, 0, 487, 478, 1, 0, 0, 0, 487, 480, 1, 0, 0, 0, 487, 482, 1, 0, 0, 0, 487, 484, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 496, 1, 0, 0, 0, 489, 490, 10, 9, 0, 0, 490, 491, 5, 42, 0, 0, 491, 495, 3, 44, 22, 10, 492, 493, 10, 8, 0, 0, 493, 495, 3, 44, 22, 9, 494, 489, 1, 0, 0, 0, 494, 492, 1, 0, 0, 0, 495, 498, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 45, 1, 0, 0, 0, 498, 496, 1, 0, 0, 0, 499, 501, 3, 48, 24, 0, 500, 499, 1, 0, 0, 0, 501, 504, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 47, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 505, 517, 3, 12, 6, 0, 506, 517, 3, 50, 25, 0, 507, 517, 3, 118, 59, 0, 508, 517, 3, 124, 62, 0, 509, 517, 3, 112, 56, 0, 510, 517, 3, 58, 29, 0, 511, 517, 3, 60, 30, 0, 512, 517, 3, 62, 31, 0, 513, 517, 3, 64, 32, 0, 514, 517, 3, 34, 17, 0, 515, 517, 3, 106, 53, 0, 516, 505, 1, 0, 0, 0, 516, 506, 1, 0, 0, 0, 516, 507, 1, 0, 0, 0, 516, 508, 1, 0, 0, 0, 516, 509, 1, 0, 0, 0, 516, 510, 1, 0, 0, 0, 516, 511, 1, 0, 0, 0, 516, 512, 1, 0, 0, 0, 516, 513, 1, 0, 0, 0, 516, 514, 1, 0, 0, 0, 516, 515, 1, 0, 0, 0, 517, 49, 1, 0, 0, 0, 518, 519, 5, 5, 0, 0, 519, 520, 3, 68, 34, 0, 520, 524, 5, 30, 0, 0, 521, 523, 3, 48, 24, 0, 522, 521, 1, 0, 0, 0, 523, 526, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 527, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 527, 529, 5, 31, 0, 0, 528, 530, 3, 52, 26, 0, 529, 528, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 51, 1, 0, 0, 0, 531, 534, 3, 54, 27, 0, 532, 534, 3, 56, 28, 0, 533, 531, 1, 0, 0, 0, 533, 532, 1, 0, 0, 0, 534, 53, 1, 0, 0, 0, 535, 536, 5, 6, 0, 0, 536, 540, 5, 30, 0, 0, 537, 539, 3, 48, 24, 0, 538, 537, 1, 0, 0, 0, 539, 542, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 543, 1, 0, 0, 0, 542, 540, 1, 0, 0, 0, 543, 544, 5, 31, 0, 0, 544, 55, 1, 0, 0, 0, 545, 546, 5, 7, 0, 0, 546, 547, 3, 68, 34, 0, 547, 551, 5, 30, 0, 0, 548, 550, 3, 48, 24, 0, 549, 548, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 554, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 554, 556, 5, 31, 0, 0, 555, 557, 3, 52, 26, 0, 556, 555, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 57, 1, 0, 0, 0, 558, 559, 5, 16, 0, 0, 559, 560, 3, 68, 34, 0, 560, 561, 5, 36, 0, 0, 561, 59, 1, 0, 0, 0, 562, 563, 5, 66, 0, 0, 563, 564, 5, 36, 0, 0, 564, 61, 1, 0, 0, 0, 565, 566, 5, 17, 0, 0, 566, 567, 3, 68, 34, 0, 567, 568, 5, 36, 0, 0, 568, 63, 1, 0, 0, 0, 569, 573, 3, 8, 4, 0, 570, 572, 3, 66, 33, 0, 571, 570, 1, 0, 0, 0, 572, 575, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 576, 1, 0, 0, 0, 575, 573, 1, 0, 0, 0, 576, 577, 5, 37, 0, 0, 577, 578, 3, 68, 34, 0, 578, 579, 5, 36, 0, 0, 579, 625, 1, 0, 0, 0, 580, 584, 3, 8, 4, 0, 581, 583, 3, 66, 33, 0, 582, 581, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 587, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 588, 5, 38, 0, 0, 588, 589, 3, 68, 34, 0, 589, 590, 5, 36, 0, 0, 590, 625, 1, 0, 0, 0, 591, 595, 3, 8, 4, 0, 592, 594, 3, 66, 33, 0, 593, 592, 1, 0, 0, 0, 594, 597, 1, 0, 0, 0, 595, 593, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 598, 1, 0, 0, 0, 597, 595, 1, 0, 0, 0, 598, 599, 5, 39, 0, 0, 599, 600, 3, 68, 34, 0, 600, 601, 5, 36, 0, 0, 601, 625, 1, 0, 0, 0, 602, 606, 3, 8, 4, 0, 603, 605, 3, 66, 33, 0, 604, 603, 1, 0, 0, 0, 605, 608, 1, 0, 0, 0, 606, 604, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 606, 1, 0, 0, 0, 609, 610, 5, 41, 0, 0, 610, 611, 3, 68, 34, 0, 611, 612, 5, 36, 0, 0, 612, 625, 1, 0, 0, 0, 613, 617, 3, 8, 4, 0, 614, 616, 3, 66, 33, 0, 615, 614, 1, 0, 0, 0, 616, 619, 1, 0, 0, 0, 617, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 620, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 620, 621, 5, 40, 0, 0, 621, 622, 3, 68, 34, 0, 622, 623, 5, 36, 0, 0, 623, 625, 1, 0, 0, 0, 624, 569, 1, 0, 0, 0, 624, 580, 1, 0, 0, 0, 624, 591, 1, 0, 0, 0, 624, 602, 1, 0, 0, 0, 624, 613, 1, 0, 0, 0, 625, 65, 1, 0, 0, 0, 626, 627, 5, 34, 0, 0, 627, 628, 3, 68, 34, 0, 628, 629, 5, 35, 0, 0, 629, 634, 1, 0, 0, 0, 630, 631, 5, 34, 0, 0, 631, 632, 5, 45, 0, 0, 632, 634, 5, 35, 0, 0, 633, 626, 1, 0, 0, 0, 633, 630, 1, 0, 0, 0, 634, 67, 1, 0, 0, 0, 635, 636, 6, 34, -1, 0, 636, 637, 5, 77, 0, 0, 637, 638, 5, 32, 0, 0, 638, 639, 3, 84, 42, 0, 639, 640, 5, 33, 0, 0, 640, 656, 1, 0, 0, 0, 641, 656, 3, 70, 35, 0, 642, 656, 5, 71, 0, 0, 643, 656, 5, 72, 0, 0, 644, 656, 5, 73, 0, 0, 645, 646, 5, 32, 0, 0, 646, 647, 3, 68, 34, 0, 647, 648, 5, 33, 0, 0, 648, 656, 1, 0, 0, 0, 649, 650, 5, 44, 0, 0, 650, 656, 3, 68, 34, 20, 651, 652, 5, 43, 0, 0, 652, 656, 3, 68, 34, 19, 653, 654, 5, 48, 0, 0, 654, 656, 3, 68, 34, 18, 655, 635, 1, 0, 0, 0, 655, 641, 1, 0, 0, 0, 655, 642, 1, 0, 0, 0, 655, 643, 1, 0, 0, 0, 655, 644, 1, 0, 0, 0, 655, 645, 1, 0, 0, 0, 655, 649, 1, 0, 0, 0, 655, 651, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 656, 722, 1, 0, 0, 0, 657, 658, 10, 14, 0, 0, 658, 659, 5, 45, 0, 0, 659, 721, 3, 68, 34, 15, 660, 661, 10, 13, 0, 0, 661, 662, 5, 46, 0, 0, 662, 721, 3, 68, 34, 14, 663, 664, 10, 12, 0, 0, 664, 665, 5, 47, 0, 0, 665, 721, 3, 68, 34, 13, 666, 667, 10, 11, 0, 0, 667, 668, 5, 43, 0, 0, 668, 721, 3, 68, 34, 12, 669, 670, 10, 10, 0, 0, 670, 671, 5, 44, 0, 0, 671, 721, 3, 68, 34, 11, 672, 673, 10, 9, 0, 0, 673, 674, 5, 49, 0, 0, 674, 721, 3, 68, 34, 10, 675, 676, 10, 8, 0, 0, 676, 677, 5, 51, 0, 0, 677, 721, 3, 68, 34, 9, 678, 679, 10, 7, 0, 0, 679, 680, 5, 50, 0, 0, 680, 721, 3, 68, 34, 8, 681, 682, 10, 6, 0, 0, 682, 683, 5, 52, 0, 0, 683, 721, 3, 68, 34, 7, 684, 685, 10, 5, 0, 0, 685, 686, 5, 53, 0, 0, 686, 721, 3, 68, 34, 6, 687, 688, 10, 4, 0, 0, 688, 689, 5, 54, 0, 0, 689, 721, 3, 68, 34, 5, 690, 691, 10, 3, 0, 0, 691, 692, 5, 55, 0, 0, 692, 721, 3, 68, 34, 4, 693, 694, 10, 2, 0, 0, 694, 695, 5, 56, 0, 0, 695, 721, 3, 68, 34, 3, 696, 697, 10, 1, 0, 0, 697, 698, 5, 57, 0, 0, 698, 699, 3, 68, 34, 0, 699, 700, 5, 58, 0, 0, 700, 701, 3, 68, 34, 2, 701, 721, 1, 0, 0, 0, 702, 703, 10, 17, 0, 0, 703, 704, 5, 37, 0, 0, 704, 705, 5, 77, 0, 0, 705, 706, 5, 32, 0, 0, 706, 707, 3, 84, 42, 0, 707, 708, 5, 33, 0, 0, 708, 721, 1, 0, 0, 0, 709, 710, 10, 16, 0, 0, 710, 711, 5, 74, 0, 0, 711, 712, 5, 32, 0, 0, 712, 713, 3, 84, 42, 0, 713, 714, 5, 33, 0, 0, 714, 721, 1, 0, 0, 0, 715, 716, 10, 15, 0, 0, 716, 717, 5, 34, 0, 0, 717, 718, 3, 68, 34, 0, 718, 719, 5, 35, 0, 0, 719, 721, 1, 0, 0, 0, 720, 657, 1, 0, 0, 0, 720, 660, 1, 0, 0, 0, 720, 663, 1, 0, 0, 0, 720, 666, 1, 0, 0, 0, 720, 669, 1, 0, 0, 0, 720, 672, 1, 0, 0, 0, 720, 675, 1, 0, 0, 0, 720, 678, 1, 0, 0, 0, 720, 681, 1, 0, 0, 0, 720, 684, 1, 0, 0, 0, 720, 687, 1, 0, 0, 0, 720, 690, 1, 0, 0, 0, 720, 693, 1, 0, 0, 0, 720, 696, 1, 0, 0, 0, 720, 702, 1, 0, 0, 0, 720, 709, 1, 0, 0, 0, 720, 715, 1, 0, 0, 0, 721, 724, 1, 0, 0, 0, 722, 720, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 69, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 725, 743, 5, 66, 0, 0, 726, 743, 5, 61, 0, 0, 727, 743, 5, 62, 0, 0, 728, 743, 5, 64, 0, 0, 729, 743, 5, 65, 0, 0, 730, 743, 5, 77, 0, 0, 731, 743, 5, 60, 0, 0, 732, 733, 5, 4, 0, 0, 733, 734, 5, 32, 0, 0, 734, 735, 3, 88, 44, 0, 735, 736, 5, 33, 0, 0, 736, 737, 5, 30, 0, 0, 737, 738, 3, 92, 46, 0, 738, 739, 5, 31, 0, 0, 739, 743, 1, 0, 0, 0, 740, 743, 3, 74, 37, 0, 741, 743, 3, 78, 39, 0, 742, 725, 1, 0, 0, 0, 742, 726, 1, 0, 0, 0, 742, 727, 1, 0, 0, 0, 742, 728, 1, 0, 0, 0, 742, 729, 1, 0, 0, 0, 742, 730, 1, 0, 0, 0, 742, 731, 1, 0, 0, 0, 742, 732, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 741, 1, 0, 0, 0, 743, 71, 1, 0, 0, 0, 744, 745, 6, 36, -1, 0, 745, 746, 5, 32, 0, 0, 746, 747, 3, 72, 36, 0, 747, 748, 5, 33, 0, 0, 748, 753, 1, 0, 0, 0, 749, 750, 5, 48, 0, 0, 750, 753, 3, 72, 36, 2, 751, 753, 3, 8, 4, 0, 752, 744, 1, 0, 0, 0, 752, 749, 1, 0, 0, 0, 752, 751, 1, 0, 0, 0, 753, 762, 1, 0, 0, 0, 754, 755, 10, 4, 0, 0, 755, 756, 5, 55, 0, 0, 756, 761, 3, 72, 36, 5, 757, 758, 10, 3, 0, 0, 758, 759, 5, 56, 0, 0, 759, 761, 3, 72, 36, 4, 760, 754, 1, 0, 0, 0, 760, 757, 1, 0, 0, 0, 761, 764, 1, 0, 0, 0, 762, 760, 1, 0, 0, 0, 762, 763, 1, 0, 0, 0, 763, 73, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 766, 5, 34, 0, 0, 766, 768, 3, 76, 38, 0, 767, 769, 5, 42, 0, 0, 768, 767, 1, 0, 0, 0, 768, 769, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 771, 5, 35, 0, 0, 771, 75, 1, 0, 0, 0, 772, 774, 3, 68, 34, 0, 773, 772, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 779, 1, 0, 0, 0, 775, 776, 5, 42, 0, 0, 776, 778, 3, 68, 34, 0, 777, 775, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 783, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 773, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 77, 1, 0, 0, 0, 784, 785, 5, 30, 0, 0, 785, 787, 3, 80, 40, 0, 786, 788, 5, 42, 0, 0, 787, 786, 1, 0, 0, 0, 787, 788, 1, 0, 0, 0, 788, 789, 1, 0, 0, 0, 789, 790, 5, 31, 0, 0, 790, 79, 1, 0, 0, 0, 791, 793, 3, 82, 41, 0, 792, 791, 1, 0, 0, 0, 792, 793, 1, 0, 0, 0, 793, 798, 1, 0, 0, 0, 794, 795, 5, 42, 0, 0, 795, 797, 3, 82, 41, 0, 796, 794, 1, 0, 0, 0, 797, 800, 1, 0, 0, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 802, 1, 0, 0, 0, 800, 798, 1, 0, 0, 0, 801, 792, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 81, 1, 0, 0, 0, 803, 804, 5, 77, 0, 0, 804, 805, 5, 37, 0, 0, 805, 810, 3, 68, 34, 0, 806, 807, 5, 65, 0, 0, 807, 808, 5, 37, 0, 0, 808, 810, 3, 68, 34, 0, 809, 803, 1, 0, 0, 0, 809, 806, 1, 0, 0, 0, 810, 83, 1, 0, 0, 0, 811, 813, 3, 86, 43, 0, 812, 811, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 818, 1, 0, 0, 0, 814, 815, 5, 42, 0, 0, 815, 817, 3, 86, 43, 0, 816, 814, 1, 0, 0, 0, 817, 820, 1, 0, 0, 0, 818, 816, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 822, 1, 0, 0, 0, 820, 818, 1, 0, 0, 0, 821, 812, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 824, 1, 0, 0, 0, 823, 825, 5, 42, 0, 0, 824, 823, 1, 0, 0, 0, 824, 825, 1, 0, 0, 0, 825, 85, 1, 0, 0, 0, 826, 827, 5, 71, 0, 0, 827, 828, 5, 37, 0, 0, 828, 831, 3, 68, 34, 0, 829, 831, 3, 68, 34, 0, 830, 826, 1, 0, 0, 0, 830, 829, 1, 0, 0, 0, 831, 87, 1, 0, 0, 0, 832, 834, 3, 90, 45, 0, 833, 832, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 839, 1, 0, 0, 0, 835, 836, 5, 42, 0, 0, 836, 838, 3, 90, 45, 0, 837, 835, 1, 0, 0, 0, 838, 841, 1, 0, 0, 0, 839, 837, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 843, 1, 0, 0, 0, 841, 839, 1, 0, 0, 0, 842, 833, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 845, 1, 0, 0, 0, 844, 846, 5, 42, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 89, 1, 0, 0, 0, 847, 852, 5, 71, 0, 0, 848, 849, 5, 71, 0, 0, 849, 850, 5, 37, 0, 0, 850, 852, 3, 68, 34, 0, 851, 847, 1, 0, 0, 0, 851, 848, 1, 0, 0, 0, 852, 91, 1, 0, 0, 0, 853, 855, 3, 94, 47, 0, 854, 853, 1, 0, 0, 0, 855, 858, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 93, 1, 0, 0, 0, 858, 856, 1, 0, 0, 0, 859, 866, 3, 12, 6, 0, 860, 866, 3, 96, 48, 0, 861, 866, 3, 104, 52, 0, 862, 866, 3, 108, 54, 0, 863, 866, 3, 114, 57, 0, 864, 866, 3, 120, 60, 0, 865, 859, 1, 0, 0, 0, 865, 860, 1, 0, 0, 0, 865, 861, 1, 0, 0, 0, 865, 862, 1, 0, 0, 0, 865, 863, 1, 0, 0, 0, 865, 864, 1, 0, 0, 0, 866, 95, 1, 0, 0, 0, 867, 868, 5, 5, 0, 0, 868, 869, 3, 68, 34, 0, 869, 873, 5, 30, 0, 0, 870, 872, 3, 94, 47, 0, 871, 870, 1, 0, 0, 0, 872, 875, 1, 0, 0, 0, 873, 871, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 876, 1, 0, 0, 0, 875, 873, 1, 0, 0, 0, 876, 878, 5, 31, 0, 0, 877, 879, 3, 98, 49, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 97, 1, 0, 0, 0, 880, 883, 3, 100, 50, 0, 881, 883, 3, 102, 51, 0, 882, 880, 1, 0, 0, 0, 882, 881, 1, 0, 0, 0, 883, 99, 1, 0, 0, 0, 884, 885, 5, 6, 0, 0, 885, 889, 5, 30, 0, 0, 886, 888, 3, 94, 47, 0, 887, 886, 1, 0, 0, 0, 888, 891, 1, 0, 0, 0, 889, 887, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 892, 1, 0, 0, 0, 891, 889, 1, 0, 0, 0, 892, 893, 5, 31, 0, 0, 893, 101, 1, 0, 0, 0, 894, 895, 5, 7, 0, 0, 895, 896, 3, 68, 34, 0, 896, 900, 5, 30, 0, 0, 897, 899, 3, 94, 47, 0, 898, 897, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 900, 1, 0, 0, 0, 903, 905, 5, 31, 0, 0, 904, 906, 3, 98, 49, 0, 905, 904, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 103, 1, 0, 0, 0, 907, 908, 5, 22, 0, 0, 908, 909, 3, 68, 34, 0, 909, 910, 5, 36, 0, 0, 910, 105, 1, 0, 0, 0, 911, 912, 5, 21, 0, 0, 912, 913, 5, 77, 0, 0, 913, 914, 5, 32, 0, 0, 914, 915, 3, 84, 42, 0, 915, 916, 5, 33, 0, 0, 916, 107, 1, 0, 0, 0, 917, 918, 5, 10, 0, 0, 918, 919, 5, 71, 0, 0, 919, 920, 5, 11, 0, 0, 920, 921, 3, 68, 34, 0, 921, 922, 5, 13, 0, 0, 922, 923, 3, 68, 34, 0, 923, 927, 5, 30, 0, 0, 924, 926, 3, 94, 47, 0, 925, 924, 1, 0, 0, 0, 926, 929, 1, 0, 0, 0, 927, 925, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 930, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 930, 931, 5, 31, 0, 0, 931, 948, 1, 0, 0, 0, 932, 933, 5, 10, 0, 0, 933, 934, 5, 71, 0, 0, 934, 935, 5, 11, 0, 0, 935, 936, 3, 68, 34, 0, 936, 937, 5, 12, 0, 0, 937, 938, 3, 68, 34, 0, 938, 942, 5, 30, 0, 0, 939, 941, 3, 94, 47, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 31, 0, 0, 946, 948, 1, 0, 0, 0, 947, 917, 1, 0, 0, 0, 947, 932, 1, 0, 0, 0, 948, 109, 1, 0, 0, 0, 949, 950, 5, 10, 0, 0, 950, 951, 5, 71, 0, 0, 951, 952, 5, 11, 0, 0, 952, 953, 3, 68, 34, 0, 953, 954, 5, 13, 0, 0, 954, 955, 3, 68, 34, 0, 955, 959, 5, 30, 0, 0, 956, 958, 3, 2, 1, 0, 957, 956, 1, 0, 0, 0, 958, 961, 1, 0, 0, 0, 959, 957, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 962, 1, 0, 0, 0, 961, 959, 1, 0, 0, 0, 962, 963, 5, 31, 0, 0, 963, 980, 1, 0, 0, 0, 964, 965, 5, 10, 0, 0, 965, 966, 5, 71, 0, 0, 966, 967, 5, 11, 0, 0, 967, 968, 3, 68, 34, 0, 968, 969, 5, 12, 0, 0, 969, 970, 3, 68, 34, 0, 970, 974, 5, 30, 0, 0, 971, 973, 3, 2, 1, 0, 972, 971, 1, 0, 0, 0, 973, 976, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 977, 1, 0, 0, 0, 976, 974, 1, 0, 0, 0, 977, 978, 5, 31, 0, 0, 978, 980, 1, 0, 0, 0, 979, 949, 1, 0, 0, 0, 979, 964, 1, 0, 0, 0, 980, 111, 1, 0, 0, 0, 981, 982, 5, 10, 0, 0, 982, 983, 5, 71, 0, 0, 983, 984, 5, 11, 0, 0, 984, 985, 3, 68, 34, 0, 985, 986, 5, 13, 0, 0, 986, 987, 3, 68, 34, 0, 987, 991, 5, 30, 0, 0, 988, 990, 3, 48, 24, 0, 989, 988, 1, 0, 0, 0, 990, 993, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 994, 995, 5, 31, 0, 0, 995, 1012, 1, 0, 0, 0, 996, 997, 5, 10, 0, 0, 997, 998, 5, 71, 0, 0, 998, 999, 5, 11, 0, 0, 999, 1000, 3, 68, 34, 0, 1000, 1001, 5, 12, 0, 0, 1001, 1002, 3, 68, 34, 0, 1002, 1006, 5, 30, 0, 0, 1003, 1005, 3, 48, 24, 0, 1004, 1003, 1, 0, 0, 0, 1005, 1008, 1, 0, 0, 0, 1006, 1004, 1, 0, 0, 0, 1006, 1007, 1, 0, 0, 0, 1007, 1009, 1, 0, 0, 0, 1008, 1006, 1, 0, 0, 0, 1009, 1010, 5, 31, 0, 0, 1010, 1012, 1, 0, 0, 0, 1011, 981, 1, 0, 0, 0, 1011, 996, 1, 0, 0, 0, 1012, 113, 1, 0, 0, 0, 1013, 1016, 5, 14, 0, 0, 1014, 1015, 5, 71, 0, 0, 1015, 1017, 5, 42, 0, 0, 1016, 1014, 1, 0, 0, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 5, 71, 0, 0, 1019, 1020, 5, 15, 0, 0, 1020, 1021, 3, 68, 34, 0, 1021, 1025, 5, 30, 0, 0, 1022, 1024, 3, 94, 47, 0, 1023, 1022, 1, 0, 0, 0, 1024, 1027, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1028, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1028, 1029, 5, 31, 0, 0, 1029, 115, 1, 0, 0, 0, 1030, 1033, 5, 14, 0, 0, 1031, 1032, 5, 71, 0, 0, 1032, 1034, 5, 42, 0, 0, 1033, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1035, 1, 0, 0, 0, 1035, 1036, 5, 71, 0, 0, 1036, 1037, 5, 15, 0, 0, 1037, 1038, 3, 68, 34, 0, 1038, 1042, 5, 30, 0, 0, 1039, 1041, 3, 2, 1, 0, 1040, 1039, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1045, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1045, 1046, 5, 31, 0, 0, 1046, 117, 1, 0, 0, 0, 1047, 1050, 5, 14, 0, 0, 1048, 1049, 5, 71, 0, 0, 1049, 1051, 5, 42, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 5, 71, 0, 0, 1053, 1054, 5, 15, 0, 0, 1054, 1055, 3, 68, 34, 0, 1055, 1059, 5, 30, 0, 0, 1056, 1058, 3, 48, 24, 0, 1057, 1056, 1, 0, 0, 0, 1058, 1061, 1, 0, 0, 0, 1059, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1062, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1062, 1063, 5, 31, 0, 0, 1063, 119, 1, 0, 0, 0, 1064, 1065, 5, 9, 0, 0, 1065, 1066, 3, 68, 34, 0, 1066, 1070, 5, 30, 0, 0, 1067, 1069, 3, 94, 47, 0, 1068, 1067, 1, 0, 0, 0, 1069, 1072, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1073, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1073, 1074, 5, 31, 0, 0, 1074, 121, 1, 0, 0, 0, 1075, 1076, 5, 9, 0, 0, 1076, 1077, 3, 68, 34, 0, 1077, 1081, 5, 30, 0, 0, 1078, 1080, 3, 2, 1, 0, 1079, 1078, 1, 0, 0, 0, 1080, 1083, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1084, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1085, 5, 31, 0, 0, 1085, 123, 1, 0, 0, 0, 1086, 1087, 5, 9, 0, 0, 1087, 1088, 3, 68, 34, 0, 1088, 1092, 5, 30, 0, 0, 1089, 1091, 3, 48, 24, 0, 1090, 1089, 1, 0, 0, 0, 1091, 1094, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1095, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1095, 1096, 5, 31, 0, 0, 1096, 125, 1, 0, 0, 0, 101, 129, 146, 157, 162, 172, 183, 194, 205, 216, 223, 242, 248, 276, 286, 312, 317, 321, 328, 339, 344, 354, 365, 373, 376, 391, 401, 427, 437, 439, 453, 463, 487, 494, 496, 502, 516, 524, 529, 533, 540, 551, 556, 573, 584, 595, 606, 617, 624, 633, 655, 720, 722, 742, 752, 760, 762, 768, 773, 779, 782, 787, 792, 798, 801, 809, 812, 818, 821, 824, 830, 833, 839, 842, 845, 851, 856, 865, 873, 878, 882, 889, 900, 905, 927, 942, 947, 959, 974, 979, 991, 1006, 1011, 1016, 1025, 1033, 1042, 1050, 1059, 1070, 1081, 1092] \ No newline at end of file diff --git a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseListener.cs b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseListener.cs index 0e0b159..b9d7c26 100644 --- a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseListener.cs +++ b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseListener.cs @@ -1,14 +1,14 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// ANTLR Version: 4.12.0 +// ANTLR Version: 4.13.1 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar\sassy_parser.g4 by ANTLR 4.12.0 +// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 by ANTLR 4.13.1 // Unreachable code detected #pragma warning disable 0162 @@ -32,7 +32,7 @@ namespace SassyPatchGrammar { /// which can be extended to create a listener which only needs to handle a subset /// of the available methods. /// -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.12.0")] +[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.13.1")] [System.Diagnostics.DebuggerNonUserCode] [System.CLSCompliant(false)] public partial class sassy_parserBaseListener : Isassy_parserListener { @@ -1207,61 +1207,33 @@ public virtual void EnterDivide_field_set([NotNull] sassy_parser.Divide_field_se /// The parse tree. public virtual void ExitDivide_field_set([NotNull] sassy_parser.Divide_field_setContext context) { } /// - /// Enter a parse tree produced by the number_indexor + /// Enter a parse tree produced by the expression_indexer /// labeled alternative in . /// The default implementation does nothing. /// /// The parse tree. - public virtual void EnterNumber_indexor([NotNull] sassy_parser.Number_indexorContext context) { } + public virtual void EnterExpression_indexer([NotNull] sassy_parser.Expression_indexerContext context) { } /// - /// Exit a parse tree produced by the number_indexor + /// Exit a parse tree produced by the expression_indexer /// labeled alternative in . /// The default implementation does nothing. /// /// The parse tree. - public virtual void ExitNumber_indexor([NotNull] sassy_parser.Number_indexorContext context) { } + public virtual void ExitExpression_indexer([NotNull] sassy_parser.Expression_indexerContext context) { } /// - /// Enter a parse tree produced by the element_indexor + /// Enter a parse tree produced by the map_indexer /// labeled alternative in . /// The default implementation does nothing. /// /// The parse tree. - public virtual void EnterElement_indexor([NotNull] sassy_parser.Element_indexorContext context) { } + public virtual void EnterMap_indexer([NotNull] sassy_parser.Map_indexerContext context) { } /// - /// Exit a parse tree produced by the element_indexor + /// Exit a parse tree produced by the map_indexer /// labeled alternative in . /// The default implementation does nothing. /// /// The parse tree. - public virtual void ExitElement_indexor([NotNull] sassy_parser.Element_indexorContext context) { } - /// - /// Enter a parse tree produced by the class_indexor - /// labeled alternative in . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterClass_indexor([NotNull] sassy_parser.Class_indexorContext context) { } - /// - /// Exit a parse tree produced by the class_indexor - /// labeled alternative in . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitClass_indexor([NotNull] sassy_parser.Class_indexorContext context) { } - /// - /// Enter a parse tree produced by the string_indexor - /// labeled alternative in . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterString_indexor([NotNull] sassy_parser.String_indexorContext context) { } - /// - /// Exit a parse tree produced by the string_indexor - /// labeled alternative in . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitString_indexor([NotNull] sassy_parser.String_indexorContext context) { } + public virtual void ExitMap_indexer([NotNull] sassy_parser.Map_indexerContext context) { } /// /// Enter a parse tree produced by the not_equal_to /// labeled alternative in . diff --git a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseVisitor.cs b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseVisitor.cs index e823f8e..7bcc4a5 100644 --- a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseVisitor.cs +++ b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserBaseVisitor.cs @@ -1,14 +1,14 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// ANTLR Version: 4.12.0 +// ANTLR Version: 4.13.1 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar\sassy_parser.g4 by ANTLR 4.12.0 +// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 by ANTLR 4.13.1 // Unreachable code detected #pragma warning disable 0162 @@ -31,7 +31,7 @@ namespace SassyPatchGrammar { /// of the available methods. /// /// The return type of the visit operation. -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.12.0")] +[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.13.1")] [System.Diagnostics.DebuggerNonUserCode] [System.CLSCompliant(false)] public partial class sassy_parserBaseVisitor : AbstractParseTreeVisitor, Isassy_parserVisitor { @@ -969,7 +969,7 @@ public partial class sassy_parserBaseVisitor : AbstractParseTreeVisitor< /// The visitor result. public virtual Result VisitDivide_field_set([NotNull] sassy_parser.Divide_field_setContext context) { return VisitChildren(context); } /// - /// Visit a parse tree produced by the number_indexor + /// Visit a parse tree produced by the expression_indexer /// labeled alternative in . /// /// The default implementation returns the result of calling @@ -978,9 +978,9 @@ public partial class sassy_parserBaseVisitor : AbstractParseTreeVisitor< /// /// The parse tree. /// The visitor result. - public virtual Result VisitNumber_indexor([NotNull] sassy_parser.Number_indexorContext context) { return VisitChildren(context); } + public virtual Result VisitExpression_indexer([NotNull] sassy_parser.Expression_indexerContext context) { return VisitChildren(context); } /// - /// Visit a parse tree produced by the element_indexor + /// Visit a parse tree produced by the map_indexer /// labeled alternative in . /// /// The default implementation returns the result of calling @@ -989,29 +989,7 @@ public partial class sassy_parserBaseVisitor : AbstractParseTreeVisitor< /// /// The parse tree. /// The visitor result. - public virtual Result VisitElement_indexor([NotNull] sassy_parser.Element_indexorContext context) { return VisitChildren(context); } - /// - /// Visit a parse tree produced by the class_indexor - /// labeled alternative in . - /// - /// The default implementation returns the result of calling - /// on . - /// - /// - /// The parse tree. - /// The visitor result. - public virtual Result VisitClass_indexor([NotNull] sassy_parser.Class_indexorContext context) { return VisitChildren(context); } - /// - /// Visit a parse tree produced by the string_indexor - /// labeled alternative in . - /// - /// The default implementation returns the result of calling - /// on . - /// - /// - /// The parse tree. - /// The visitor result. - public virtual Result VisitString_indexor([NotNull] sassy_parser.String_indexorContext context) { return VisitChildren(context); } + public virtual Result VisitMap_indexer([NotNull] sassy_parser.Map_indexerContext context) { return VisitChildren(context); } /// /// Visit a parse tree produced by the not_equal_to /// labeled alternative in . diff --git a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserListener.cs b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserListener.cs index 67dc214..47beaa8 100644 --- a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserListener.cs +++ b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserListener.cs @@ -1,14 +1,14 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// ANTLR Version: 4.12.0 +// ANTLR Version: 4.13.1 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar\sassy_parser.g4 by ANTLR 4.12.0 +// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 by ANTLR 4.13.1 // Unreachable code detected #pragma warning disable 0162 @@ -28,7 +28,7 @@ namespace SassyPatchGrammar { /// This interface defines a complete listener for a parse tree produced by /// . /// -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.12.0")] +[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.13.1")] [System.CLSCompliant(false)] public interface Isassy_parserListener : IParseTreeListener { /// @@ -1028,53 +1028,29 @@ public interface Isassy_parserListener : IParseTreeListener { /// The parse tree. void ExitDivide_field_set([NotNull] sassy_parser.Divide_field_setContext context); /// - /// Enter a parse tree produced by the number_indexor + /// Enter a parse tree produced by the expression_indexer /// labeled alternative in . /// /// The parse tree. - void EnterNumber_indexor([NotNull] sassy_parser.Number_indexorContext context); + void EnterExpression_indexer([NotNull] sassy_parser.Expression_indexerContext context); /// - /// Exit a parse tree produced by the number_indexor + /// Exit a parse tree produced by the expression_indexer /// labeled alternative in . /// /// The parse tree. - void ExitNumber_indexor([NotNull] sassy_parser.Number_indexorContext context); + void ExitExpression_indexer([NotNull] sassy_parser.Expression_indexerContext context); /// - /// Enter a parse tree produced by the element_indexor + /// Enter a parse tree produced by the map_indexer /// labeled alternative in . /// /// The parse tree. - void EnterElement_indexor([NotNull] sassy_parser.Element_indexorContext context); + void EnterMap_indexer([NotNull] sassy_parser.Map_indexerContext context); /// - /// Exit a parse tree produced by the element_indexor + /// Exit a parse tree produced by the map_indexer /// labeled alternative in . /// /// The parse tree. - void ExitElement_indexor([NotNull] sassy_parser.Element_indexorContext context); - /// - /// Enter a parse tree produced by the class_indexor - /// labeled alternative in . - /// - /// The parse tree. - void EnterClass_indexor([NotNull] sassy_parser.Class_indexorContext context); - /// - /// Exit a parse tree produced by the class_indexor - /// labeled alternative in . - /// - /// The parse tree. - void ExitClass_indexor([NotNull] sassy_parser.Class_indexorContext context); - /// - /// Enter a parse tree produced by the string_indexor - /// labeled alternative in . - /// - /// The parse tree. - void EnterString_indexor([NotNull] sassy_parser.String_indexorContext context); - /// - /// Exit a parse tree produced by the string_indexor - /// labeled alternative in . - /// - /// The parse tree. - void ExitString_indexor([NotNull] sassy_parser.String_indexorContext context); + void ExitMap_indexer([NotNull] sassy_parser.Map_indexerContext context); /// /// Enter a parse tree produced by the not_equal_to /// labeled alternative in . diff --git a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserVisitor.cs b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserVisitor.cs index 6c49ab7..660a869 100644 --- a/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserVisitor.cs +++ b/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parserVisitor.cs @@ -1,14 +1,14 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// ANTLR Version: 4.12.0 +// ANTLR Version: 4.13.1 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar\sassy_parser.g4 by ANTLR 4.12.0 +// Generated from C:/Users/arall/PatchManager/src/PatchManager.SassyPatching/SassyPatchGrammar/sassy_parser.g4 by ANTLR 4.13.1 // Unreachable code detected #pragma warning disable 0162 @@ -29,7 +29,7 @@ namespace SassyPatchGrammar { /// by . /// /// The return type of the visit operation. -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.12.0")] +[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.13.1")] [System.CLSCompliant(false)] public interface Isassy_parserVisitor : IParseTreeVisitor { /// @@ -618,33 +618,19 @@ public interface Isassy_parserVisitor : IParseTreeVisitor { /// The visitor result. Result VisitDivide_field_set([NotNull] sassy_parser.Divide_field_setContext context); /// - /// Visit a parse tree produced by the number_indexor + /// Visit a parse tree produced by the expression_indexer /// labeled alternative in . /// /// The parse tree. /// The visitor result. - Result VisitNumber_indexor([NotNull] sassy_parser.Number_indexorContext context); + Result VisitExpression_indexer([NotNull] sassy_parser.Expression_indexerContext context); /// - /// Visit a parse tree produced by the element_indexor + /// Visit a parse tree produced by the map_indexer /// labeled alternative in . /// /// The parse tree. /// The visitor result. - Result VisitElement_indexor([NotNull] sassy_parser.Element_indexorContext context); - /// - /// Visit a parse tree produced by the class_indexor - /// labeled alternative in . - /// - /// The parse tree. - /// The visitor result. - Result VisitClass_indexor([NotNull] sassy_parser.Class_indexorContext context); - /// - /// Visit a parse tree produced by the string_indexor - /// labeled alternative in . - /// - /// The parse tree. - /// The visitor result. - Result VisitString_indexor([NotNull] sassy_parser.String_indexorContext context); + Result VisitMap_indexer([NotNull] sassy_parser.Map_indexerContext context); /// /// Visit a parse tree produced by the not_equal_to /// labeled alternative in . diff --git a/src/PatchManager.SassyPatching/Transformer.cs b/src/PatchManager.SassyPatching/Transformer.cs index edd5543..cbf7854 100644 --- a/src/PatchManager.SassyPatching/Transformer.cs +++ b/src/PatchManager.SassyPatching/Transformer.cs @@ -66,12 +66,14 @@ public override Node VisitImport_declaration(sassy_parser.Import_declarationCont public override Node VisitNormal_var_decl(sassy_parser.Normal_var_declContext context) => new VariableDeclaration(context.GetCoordinate(), context.variable.Text.TrimFirst(), + context.index().Select(Visit).Cast().ToList(), Visit(context.val) as Expression); /// public override Node VisitAdd_var_decl(sassy_parser.Add_var_declContext context) => new VariableDeclaration( context.GetCoordinate(), context.variable.Text.TrimFirst(), + context.index().Select(Visit).Cast().ToList(), new ImplicitAdd(context.GetCoordinate(), Visit(context.val) as Expression)); /// @@ -79,6 +81,7 @@ public override Node VisitSubtract_var_decl(sassy_parser.Subtract_var_declContex new VariableDeclaration( context.GetCoordinate(), context.variable.Text.TrimFirst(), + context.index().Select(Visit).Cast().ToList(), new ImplicitSubtract(context.GetCoordinate(), Visit(context.val) as Expression)); /// @@ -86,12 +89,14 @@ public override Node VisitMultiply_var_decl(sassy_parser.Multiply_var_declContex new VariableDeclaration( context.GetCoordinate(), context.variable.Text.TrimFirst(), + context.index().Select(Visit).Cast().ToList(), new ImplicitMultiply(context.GetCoordinate(), Visit(context.val) as Expression)); /// public override Node VisitDivide_var_decl(sassy_parser.Divide_var_declContext context) => new VariableDeclaration( context.GetCoordinate(), context.variable.Text.TrimFirst(), + context.index().Select(Visit).Cast().ToList(), new ImplicitDivide(context.GetCoordinate(), Visit(context.val) as Expression)); /// @@ -429,36 +434,28 @@ public override Node VisitMerge_value(sassy_parser.Merge_valueContext context) public override Node VisitNormal_field_set(sassy_parser.Normal_field_setContext context) => new Field(context.GetCoordinate(), context.sassy_string().GetStringValue(), - context.indexor != null - ? Visit(context.indexor) as Indexer - : null, + context.index().Select(Visit).Cast().ToList(), Visit(context.expr) as Expression); /// public override Node VisitAdd_field_set(sassy_parser.Add_field_setContext context) => new Field(context.GetCoordinate(), context.sassy_string().GetStringValue(), - context.indexor != null - ? Visit(context.indexor) as Indexer - : null, + context.index().Select(Visit).Cast().ToList(), new ImplicitAdd(context.GetCoordinate(), Visit(context.expr) as Expression)); /// public override Node VisitSubtract_field_set(sassy_parser.Subtract_field_setContext context) => new Field(context.GetCoordinate(), context.sassy_string().GetStringValue(), - context.indexor != null - ? Visit(context.indexor) as Indexer - : null, + context.index().Select(Visit).Cast().ToList(), new ImplicitSubtract(context.GetCoordinate(), Visit(context.expr) as Expression)); /// public override Node VisitMultiply_field_set(sassy_parser.Multiply_field_setContext context) => new Field(context.GetCoordinate(), context.sassy_string().GetStringValue(), - context.indexor != null - ? Visit(context.indexor) as Indexer - : null, + context.index().Select(Visit).Cast().ToList(), new ImplicitMultiply(context.GetCoordinate(), Visit(context.expr) as Expression)); @@ -466,35 +463,14 @@ public override Node VisitMultiply_field_set(sassy_parser.Multiply_field_setCont public override Node VisitDivide_field_set(sassy_parser.Divide_field_setContext context) => new Field(context.GetCoordinate(), context.sassy_string().GetStringValue(), - context.indexor != null - ? Visit(context.indexor) as Indexer - : null, + context.index().Select(Visit).Cast().ToList(), new ImplicitDivide(context.GetCoordinate(), Visit(context.expr) as Expression)); - /// - public override Node VisitNumber_indexor(sassy_parser.Number_indexorContext context) - { - var location = context.GetCoordinate(); - return ulong.TryParse(context.num.Text, NumberStyles.Number, CultureInfo.InvariantCulture, - out var index) - ? new NumberIndexer(location, - index) - : Error(location, - "Index must be a positive integer"); - } + public override Node VisitExpression_indexer(sassy_parser.Expression_indexerContext context) => new SingleIndexer(context.GetCoordinate(),Visit(context.expression()) as Expression); - /// - public override Node VisitElement_indexor(sassy_parser.Element_indexorContext context) => - new ElementIndexer(context.GetCoordinate(), context.elem.Text); - - /// - public override Node VisitClass_indexor(sassy_parser.Class_indexorContext context) => - new ClassIndexer(context.GetCoordinate(), context.clazz.Text.TrimFirst()); + public override Node VisitMap_indexer(sassy_parser.Map_indexerContext context) => new EverythingIndexer(context.GetCoordinate()); - /// - public override Node VisitString_indexor(sassy_parser.String_indexorContext context) => - new StringIndexer(context.GetCoordinate(), context.elem.Text.Unescape()); /// public override Node VisitNot_equal_to(sassy_parser.Not_equal_toContext context) =>