From 433f8a86cea4a4945fd958a0c1b398a9ca946b75 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sun, 28 Jul 2024 18:59:44 +0300 Subject: [PATCH 01/21] include php blade plugin in php cluster --- nbbuild/cluster.properties | 1 + php/php.api.editor/nbproject/project.xml | 1 + php/php.api.framework/nbproject/project.xml | 2 + php/php.api.phpmodule/nbproject/project.xml | 3 + php/php.blade/build.xml | 52 + php/php.blade/manifest.mf | 7 + php/php.blade/nbproject/project.properties | 20 + php/php.blade/nbproject/project.xml | 446 ++ .../php/blade/csl/elements/ClassElement.java | 51 + .../blade/csl/elements/DirectiveElement.java | 38 + .../php/blade/csl/elements/ElementType.java | 39 + .../php/blade/csl/elements/NamedElement.java | 112 + .../php/blade/csl/elements/PathElement.java | 38 + .../csl/elements/PhpFunctionElement.java | 69 + .../php/blade/csl/elements/TagElement.java | 88 + .../php/blade/editor/BladeBracesMatcher.java | 288 + .../php/blade/editor/BladeCommentHandler.java | 116 + .../blade/editor/BladeDeclarationFinder.java | 463 ++ .../php/blade/editor/BladeLanguage.java | 237 + .../blade/editor/BladeSemanticAnalyzer.java | 106 + .../php/blade/editor/EditorStringUtils.java | 64 + .../blade/editor/HyperlinkProviderImpl.java | 208 + .../php/blade/editor/ResourceUtilities.java | 35 + .../editor/actions/AntlrDebugAction.java | 199 + .../php/blade/editor/actions/FindUsage.java | 61 + .../ViewAntlrColoringTokensAction.java | 162 + .../ViewAntlrFormatterTokensAction.java | 193 + .../actions/ViewAntlrLexerTokensAction.java | 178 + .../php/blade/editor/cache/QueryCache.java | 111 + .../completion/BladeCompletionHandler.java | 338 + .../completion/BladeCompletionItem.java | 381 + .../completion/BladeCompletionProposal.java | 469 ++ .../completion/BladeCompletionProvider.java | 305 + .../BladePhpCompletionProvider.java | 383 + .../DirectiveCompletionBuilder.java | 66 + .../completion/DirectiveCompletionList.java | 30 + .../completion/PhpCodeCompletionContext.java | 68 + .../completion/PhpCodeCompletionService.java | 323 + .../blade/editor/completion/TooltipDoc.java | 61 + .../AttributeCompletionService.java | 53 + .../editor/components/ComponentElement.java | 34 + .../editor/components/ComponentModel.java | 51 + .../ComponentsCompletionService.java | 67 + .../components/annotation/Attribute.java | 27 + .../annotation/AttributeRegister.java | 34 + .../components/annotation/Namespace.java | 32 + .../annotation/NamespaceRegister.java | 34 + .../ComponentDeclarationService.java | 81 + .../VitePathDeclarationService.java | 38 + .../editor/directives/CustomDirectives.java | 302 + .../embedding/BladeHtmlEmbeddingProvider.java | 101 + .../embedding/BladePhpEmbeddingProvider.java | 93 + .../blade/editor/format/BladeFormatter.java | 142 + .../editor/format/BladeFormatterService.java | 278 + .../php/blade/editor/format/FormatToken.java | 50 + .../BladeHighlightsContainer.java | 65 + .../BladeHighlightsLayerFactory.java | 27 + .../editor/hints/BladeHintsProvider.java | 237 + .../editor/hints/HintsControllerFactory.java | 47 + .../blade/editor/hints/UnknownDirective.java | 87 + .../php/blade/editor/indexing/BladeIndex.java | 307 + .../blade/editor/indexing/BladeIndexer.java | 295 + .../blade/editor/indexing/IndexManager.java | 84 + .../indexing/PhpIndexFunctionResult.java | 56 + .../blade/editor/indexing/PhpIndexResult.java | 64 + .../blade/editor/indexing/PhpIndexUtils.java | 812 +++ .../php/blade/editor/indexing/QueryUtils.java | 76 + .../php/blade/editor/lexer/BladeLexer.java | 103 + .../blade/editor/lexer/BladeLexerUtils.java | 77 + .../php/blade/editor/lexer/BladeTokenId.java | 119 + .../php/blade/editor/lexer/EditorUtils.java | 71 + .../editor/navigator/BladeStructureItem.java | 218 + .../navigator/BladeStructureScanner.java | 53 + .../php/blade/editor/parser/BladeParser.java | 85 + .../editor/parser/BladeParserResult.java | 995 +++ .../php/blade/editor/parser/ParsingUtils.java | 374 + .../php/blade/editor/path/BladePathUtils.java | 318 + .../preferences/GeneralPreferencesUtils.java | 83 + .../editor/preferences/ModulePreferences.java | 42 + .../editor/refactoring/BladePathInfo.java | 73 + .../editor/refactoring/BladePathUsage.java | 203 + .../RefactoringActionsProvider.java | 175 + .../WhereBladePathUsedRefactoringUIImpl.java | 91 + .../BladeTypedTextInterceptor.java | 175 + .../editor/ui/customizer/BladeDirectives.form | 140 + .../editor/ui/customizer/BladeDirectives.java | 196 + .../BladeDirectivesCustomizerProvider.java | 67 + .../ui/customizer/BladeGeneralSettings.form | 66 + .../ui/customizer/BladeGeneralSettings.java | 98 + .../BladeOptionsCustomizerProvider.java | 65 + .../BladeSettingsCustomizerProvider.java | 105 + .../ui/customizer/BladeViewsFoldersPanel.form | 169 + .../ui/customizer/BladeViewsFoldersPanel.java | 233 + .../editor/ui/customizer/Bundle.properties | 50 + .../editor/ui/customizer/UiOptionsUtils.java | 40 + .../ui/wizard/NewFileWizardIterator.java | 137 + .../blade/project/BladeProjectProperties.java | 188 + .../blade/project/BladeProjectSupport.java | 74 + .../php/blade/project/Bundle.properties | 21 + .../php/blade/project/ComponentsSupport.java | 90 + .../php/blade/project/ProjectUtils.java | 50 + .../php/blade/resources/Bundle.properties | 18 + .../resources/FlatLafDark-FlatLafDark.xml | 34 + .../php/blade/resources/FontAndColors.xml | 34 + .../resources/NewBladeFileDescription.html | 12 + .../blade/resources/emptyBladeFile.blade.php | 0 .../resources/formattingExample.blade.php | 16 + .../blade/resources/highlightBlade.blade.php | 16 + .../modules/php/blade/resources/icon.png | Bin 0 -> 973 bytes .../modules/php/blade/resources/icons/at.png | Bin 0 -> 3228 bytes .../modules/php/blade/resources/icons/at2.png | Bin 0 -> 1212 bytes .../modules/php/blade/resources/icons/at4.png | Bin 0 -> 3264 bytes .../php/blade/resources/icons/file.png | Bin 0 -> 973 bytes .../php/blade/resources/icons/icon.png | Bin 0 -> 973 bytes .../blade/resources/icons/laravel_badge.png | Bin 0 -> 723 bytes .../php/blade/resources/icons/layout.png | Bin 0 -> 2393 bytes .../modules/php/blade/resources/layer.xml | 87 + .../php/blade/resources/mime-resolver.xml | 10 + .../php/blade/resources/preferences.xml | 29 + .../blade/syntax/BladeDirectivesUtils.java | 70 + .../modules/php/blade/syntax/BladeTags.java | 39 + .../php/blade/syntax/BladeTagsUtils.java | 34 + .../php/blade/syntax/DirectivesList.java | 122 + .../modules/php/blade/syntax/StringUtils.java | 60 + .../blade/syntax/annotation/Directive.java | 15 + .../syntax/annotation/DirectiveRegister.java | 16 + .../php/blade/syntax/annotation/Tag.java | 12 + .../blade/syntax/annotation/TagRegister.java | 16 + .../formatter/BladeAntlrFormatterLexer.g4 | 177 + .../formatter/BladeAntlrFormatterLexer.java | 1129 +++ .../formatter/BladeAntlrFormatterParser.g4 | 72 + .../formatter/BladeAntlrFormatterParser.java | 1683 +++++ ...BladeAntlrFormatterParserBaseListener.java | 282 + .../BladeAntlrFormatterParserListener.java | 212 + .../syntax/antlr4/formatter/LexerAdaptor.java | 81 + .../antlr4/v10/BladeAntlrColoringLexer.g4 | 264 + .../antlr4/v10/BladeAntlrColoringLexer.java | 1765 +++++ .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 473 ++ .../syntax/antlr4/v10/BladeAntlrLexer.java | 2583 +++++++ .../syntax/antlr4/v10/BladeAntlrParser.g4 | 217 + .../syntax/antlr4/v10/BladeAntlrParser.java | 6250 +++++++++++++++++ .../v10/BladeAntlrParserBaseListener.java | 878 +++ .../antlr4/v10/BladeAntlrParserListener.java | 710 ++ .../syntax/antlr4/v10/BladeAntlrUtils.java | 303 + .../antlr4/v10/BladeColoringCommonLexer.g4 | 79 + .../syntax/antlr4/v10/BladeCommonLexer.g4 | 79 + .../antlr4/v10/ColoringLexerAdaptor.java | 138 + .../blade/syntax/antlr4/v10/LexerAdaptor.java | 144 + .../blade/ui/options/BladeOptionsPanel.form | 57 + .../blade/ui/options/BladeOptionsPanel.java | 94 + .../options/BladeOptionsPanelController.java | 93 + .../php/blade/ui/options/Bundle.properties | 3 + .../issues/issue61/issue61.blade.php | 6 + .../smoke/content_tag.blade.php | 1 + .../smoke/escaped_tag.blade.php | 3 + .../coloring_lexer/smoke/fragment.blade.php | 7 + .../coloring_lexer/smoke/raw_tag.blade.php | 1 + .../BladeAntlrColoringLexerTestBase.java | 107 + .../antlr4/BladeAntlrLexerTestBase.java | 111 + .../antlr4/BladeAntlrParserTestBase.java | 92 + .../antlr4/BladeAntrlColoringLexerTest.java | 20 + .../syntax/antlr4/BladeAntrlLexerTest.java | 16 + .../syntax/antlr4/BladeAntrlParserTest.java | 15 + .../blade/syntax/antlr4/BladeBaseTest.java | 51 + .../php/blade/syntax/antlr4/BladeUtils.java | 55 + php/php.editor/nbproject/project.xml | 2 + 166 files changed, 33323 insertions(+) create mode 100644 php/php.blade/build.xml create mode 100644 php/php.blade/manifest.mf create mode 100644 php/php.blade/nbproject/project.properties create mode 100644 php/php.blade/nbproject/project.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at4.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/layout.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java diff --git a/nbbuild/cluster.properties b/nbbuild/cluster.properties index e1f0f4b5443e..350a16090556 100644 --- a/nbbuild/cluster.properties +++ b/nbbuild/cluster.properties @@ -955,6 +955,7 @@ nb.cluster.php=\ php.api.testing,\ php.apigen,\ php.atoum,\ + php.blade,\ php.code.analysis,\ php.codeception,\ php.composer,\ diff --git a/php/php.api.editor/nbproject/project.xml b/php/php.api.editor/nbproject/project.xml index bd14af04a19d..db2c8ae3d2c5 100644 --- a/php/php.api.editor/nbproject/project.xml +++ b/php/php.api.editor/nbproject/project.xml @@ -75,6 +75,7 @@ org.nbphpcouncil.modules.php.yii2 org.netbeans.modules.php.api.framework org.netbeans.modules.php.api.testing + org.netbeans.modules.php.blade org.netbeans.modules.php.atoum org.netbeans.modules.php.cake3 org.netbeans.modules.php.codeception diff --git a/php/php.api.framework/nbproject/project.xml b/php/php.api.framework/nbproject/project.xml index 8a6164e1c807..4cb2d522126e 100644 --- a/php/php.api.framework/nbproject/project.xml +++ b/php/php.api.framework/nbproject/project.xml @@ -163,9 +163,11 @@ org.nbphpcouncil.modules.php.laravel4 org.nbphpcouncil.modules.php.yii org.nbphpcouncil.modules.php.yii2 + org.netbeans.modules.php.blade org.netbeans.modules.php.cake3 org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.fuel + org.netbeans.modules.php.laravel org.netbeans.modules.php.nette2 org.netbeans.modules.php.project org.netbeans.modules.php.smarty diff --git a/php/php.api.phpmodule/nbproject/project.xml b/php/php.api.phpmodule/nbproject/project.xml index 09738895b338..06e9293ecbca 100644 --- a/php/php.api.phpmodule/nbproject/project.xml +++ b/php/php.api.phpmodule/nbproject/project.xml @@ -226,6 +226,7 @@ org.cakephp.netbeans + org.netbeans.modules.php.blade org.nbphpcouncil.modules.php.ci org.nbphpcouncil.modules.php.laravel4 org.nbphpcouncil.modules.php.yii @@ -239,6 +240,7 @@ org.netbeans.modules.php.api.testing org.netbeans.modules.php.apigen org.netbeans.modules.php.atoum + org.netbeans.modules.php.blade org.netbeans.modules.php.cake3 org.netbeans.modules.php.code.analysis org.netbeans.modules.php.codeception @@ -247,6 +249,7 @@ org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.editor org.netbeans.modules.php.fuel + org.netbeans.modules.php.laravel org.netbeans.modules.php.nette org.netbeans.modules.php.nette.tester org.netbeans.modules.php.nette2 diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml new file mode 100644 index 000000000000..2b4b2d193870 --- /dev/null +++ b/php/php.blade/build.xml @@ -0,0 +1,52 @@ + + + + Builds, tests, and runs the project org.netbeans.modules.php.blade + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php/php.blade/manifest.mf b/php/php.blade/manifest.mf new file mode 100644 index 000000000000..61a6406d6cd8 --- /dev/null +++ b/php/php.blade/manifest.mf @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +AutoUpdate-Show-In-Client: true +OpenIDE-Module: org.netbeans.modules.php.blade/1 +OpenIDE-Module-Layer: org/netbeans/modules/php/blade/resources/layer.xml +OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/php/blade/resources/Bundle.properties +OpenIDE-Module-Specification-Version: 1.00 + diff --git a/php/php.blade/nbproject/project.properties b/php/php.blade/nbproject/project.properties new file mode 100644 index 000000000000..a18d0ebbe0ed --- /dev/null +++ b/php/php.blade/nbproject/project.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +javac.source=1.8 +javac.compilerargs=-Xlint -Xlint:-serial +spec.version.base.fatal.warning=false diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml new file mode 100644 index 000000000000..5192db4365eb --- /dev/null +++ b/php/php.blade/nbproject/project.xml @@ -0,0 +1,446 @@ + + + + org.netbeans.modules.apisupport.project + + + org.netbeans.modules.php.blade + + + org.apache.commons.lang3 + + + + 3.12.0 + + + + org.netbeans.api.annotations.common + + + + 1 + 1.48 + + + + org.netbeans.api.templates + + + + 1.28 + + + + org.netbeans.core.multiview + + + + 1 + 1.64 + + + + org.netbeans.libs.antlr4.runtime + + + + 2 + 1.21.0.1 + + + + org.netbeans.modules.csl.api + + + + 2 + 2.78.0.2.1.1.8.1 + + + + org.netbeans.modules.csl.types + + + + 1 + 1.20 + + + + org.netbeans.modules.editor + + + + 3 + 1.107.0.6.3.23.55 + + + + org.netbeans.modules.editor.bracesmatching + + + + 0 + 1.59.0.55 + + + + org.netbeans.modules.editor.codetemplates + + + + 1 + 1.64.0.1 + + + + org.netbeans.modules.editor.completion + + + + 1 + 1.65.0.2 + + + + org.netbeans.modules.editor.document + + + + 1.29.0.3 + + + + org.netbeans.modules.editor.indent + + + + 2 + 1.63 + + + + org.netbeans.modules.editor.lib + + + + 3 + 4.27.0.23.3.55 + + + + org.netbeans.modules.editor.lib2 + + + + 1 + 2.40.0.55.3 + + + + org.netbeans.modules.editor.mimelookup + + + + 1 + 1.60 + + + + org.netbeans.modules.editor.settings + + + + 1 + 1.77 + + + + org.netbeans.modules.editor.util + + + + 1 + 1.85 + + + + org.netbeans.modules.html.lexer + + + + 1 + 1.58 + + + + org.netbeans.modules.lexer + + + + 2 + 1.83.0.1 + + + + org.netbeans.modules.lexer.antlr4 + + + + 1.1.0.1 + + + + org.netbeans.modules.nbjunit + + + + 1 + 1.110 + + + + org.netbeans.modules.options.api + + + + 1 + 1.65 + + + + org.netbeans.modules.parsing.api + + + + 1 + 9.27.0.8 + + + + org.netbeans.modules.parsing.indexing + + + + 9.29.0.1.3.8 + + + + org.netbeans.modules.php.editor + + + + 2 + + + + + org.netbeans.modules.php.api.editor + + + + 0 + 0.52 + + + + org.netbeans.modules.php.api.phpmodule + + + + 2.97 + + + + org.netbeans.modules.projectapi + + + + 1 + 1.91 + + + + org.netbeans.modules.projectuiapi + + + + 1 + 1.109.0.8 + + + + org.netbeans.modules.projectuiapi.base + + + + 1 + 1.106.0.9 + + + + org.netbeans.modules.refactoring.api + + + + 1.67.0.1 + + + + org.openide.awt + + + + 7.88 + + + + org.openide.dialogs + + + + 7.66 + + + + org.openide.filesystems + + + + 9.33 + + + + org.openide.filesystems.nb + + + + 9.30 + + + + org.openide.loaders + + + + 7.90 + + + + org.openide.nodes + + + + 7.65 + + + + org.openide.text + + + + 6.88 + + + + org.openide.util + + + + 9.28 + + + + org.openide.util.lookup + + + + 8.54 + + + + org.openide.util.ui + + + + 9.28 + + + + org.openide.windows + + + + 6.97 + + + + + + unit + + org.netbeans.libs.junit4 + + + + org.netbeans.modules.nbjunit + + + + + + + org.netbeans.modules.php.blade.csl.elements + org.netbeans.modules.php.blade.editor + org.netbeans.modules.php.blade.editor.actions + org.netbeans.modules.php.blade.editor.cache + org.netbeans.modules.php.blade.editor.completion + org.netbeans.modules.php.blade.editor.components + org.netbeans.modules.php.blade.editor.components.annotation + org.netbeans.modules.php.blade.editor.declaration + org.netbeans.modules.php.blade.editor.directives + org.netbeans.modules.php.blade.editor.embedding + org.netbeans.modules.php.blade.editor.format + org.netbeans.modules.php.blade.editor.highlighting + org.netbeans.modules.php.blade.editor.hints + org.netbeans.modules.php.blade.editor.indexing + org.netbeans.modules.php.blade.editor.lexer + org.netbeans.modules.php.blade.editor.navigator + org.netbeans.modules.php.blade.editor.parser + org.netbeans.modules.php.blade.editor.path + org.netbeans.modules.php.blade.editor.preferences + org.netbeans.modules.php.blade.editor.refactoring + org.netbeans.modules.php.blade.editor.tools + org.netbeans.modules.php.blade.editor.typinghooks + org.netbeans.modules.php.blade.editor.ui.customizer + org.netbeans.modules.php.blade.editor.ui.wizard + org.netbeans.modules.php.blade.project + org.netbeans.modules.php.blade.syntax + org.netbeans.modules.php.blade.syntax.annotation + org.netbeans.modules.php.blade.syntax.antlr4.formatter + org.netbeans.modules.php.blade.syntax.antlr4.v10 + org.netbeans.modules.php.blade.syntax.antlr4.v10.compiler + + + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java new file mode 100644 index 000000000000..3cd671705db5 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class ClassElement extends NamedElement { + + protected final String namespace; + + public ClassElement(String name, FileObject file) { + super(name, file, ElementType.PHP_CLASS); + this.namespace = null; + } + + public ClassElement(String name, String namespace, + FileObject file) { + super(name, file, ElementType.PHP_CLASS); + this.namespace = namespace; + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + public String getNamespace() { + return namespace; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java new file mode 100644 index 000000000000..41f4a1db91ae --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class DirectiveElement extends NamedElement { + + public DirectiveElement(String name, FileObject file) { + super(name, file, ElementType.PATH); + } + + @Override + public ElementKind getKind() { + return ElementKind.METHOD; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java new file mode 100644 index 000000000000..dd7570c21636 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +/** + * + * @author bogdan + */ +public enum ElementType { + NA, + CUSTOM_DIRECTIVE, + PATH, + DIRECTIVE, + VARIABLE, + PHP_CLASS, + PHP_NAMESPACE, + PHP_FUNCTION, + PHP_CONSTANT, + LARAVEL_COMPONENT, + STACK_ID, + YIELD_ID, + ASSET_FILE +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java new file mode 100644 index 000000000000..486dfac11b81 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import java.util.HashSet; +import java.util.Set; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import static org.netbeans.modules.php.blade.csl.elements.ElementType.CUSTOM_DIRECTIVE; +import static org.netbeans.modules.php.blade.csl.elements.ElementType.STACK_ID; +import static org.netbeans.modules.php.blade.csl.elements.ElementType.YIELD_ID; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class NamedElement implements ElementHandle { + + protected final String name; + protected final FileObject file; + protected final ElementType type; + + public NamedElement(String name, FileObject file) { + //we can add a file object from element + this.name = name; + this.file = file; + this.type = ElementType.NA; + } + + public NamedElement(String name, FileObject file, ElementType type) { + //we can add a file object from element + this.name = name; + this.file = file; + this.type = type; + } + + @Override + public FileObject getFileObject() { + return file; + } + + @Override + public String getMimeType() { + return BladeLanguage.MIME_TYPE; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getIn() { + return ""; + } + + @Override + public ElementKind getKind() { + switch (type) { + case YIELD_ID: + return ElementKind.PACKAGE; + case STACK_ID: + return ElementKind.PACKAGE; + case CUSTOM_DIRECTIVE: + return ElementKind.METHOD; + case PHP_CLASS: + return ElementKind.CLASS; + } + return ElementKind.FILE; + } + + @Override + public Set getModifiers() { + return new HashSet<>(); + } + + @Override + public boolean signatureEquals(ElementHandle eh) { + return false; + } + + @Override + public OffsetRange getOffsetRange(ParserResult pr) { + return OffsetRange.NONE; + } + + public ElementType getType() { + return type; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java new file mode 100644 index 000000000000..a6ef88a2fe83 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class PathElement extends NamedElement { + + public PathElement(String name, FileObject file) { + super(name, file, ElementType.PATH); + } + + @Override + public ElementKind getKind() { + return ElementKind.PACKAGE; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java new file mode 100644 index 000000000000..23ee1ff1eaf4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import java.util.List; +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class PhpFunctionElement extends NamedElement { + + public final List params; + public final String namespace; + + public PhpFunctionElement(String name, FileObject file, + ElementType type, + String namespace, + List params) { + super(name, file, type); + this.namespace = namespace; + this.params = params; + } + + public PhpFunctionElement(String name, FileObject file, + ElementType type, + List params) { + super(name, file, type); + this.namespace = null; + this.params = params; + } + + @Override + public ElementKind getKind() { + return ElementKind.METHOD; + } + + public String getParamsAsString() { + if (params == null || params.isEmpty()) { + return "()"; + } + return "(" + String.join(", ", params) + ")"; + } + + public List getParams() { + return params; + } + + + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java new file mode 100644 index 000000000000..1b7b2051c548 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import java.util.HashSet; +import java.util.Set; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class TagElement implements ElementHandle { + + protected final String name; + protected final ElementType type; + + public TagElement(String name) { + this.name = name; + this.type = ElementType.NA; + } + + @Override + public FileObject getFileObject() { + return null; + } + + @Override + public String getMimeType() { + return BladeLanguage.MIME_TYPE; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getIn() { + return ""; + } + + @Override + public ElementKind getKind() { + return ElementKind.TAG; + } + + @Override + public Set getModifiers() { + return new HashSet<>(); + } + + @Override + public boolean signatureEquals(ElementHandle eh) { + return false; + } + + @Override + public OffsetRange getOffsetRange(ParserResult pr) { + return OffsetRange.NONE; + } + + public ElementType getType() { + return type; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java new file mode 100644 index 000000000000..cc1db9895a4d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -0,0 +1,288 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.swing.text.BadLocationException; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; +import org.netbeans.modules.php.blade.syntax.BladeTagsUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import org.netbeans.spi.editor.bracesmatching.BracesMatcher; +import org.netbeans.spi.editor.bracesmatching.BracesMatcherFactory; +import org.netbeans.spi.editor.bracesmatching.MatcherContext; + +/** + * brace matcher - block directives : @if @endif .. - output echo statements {{ + * }} {!! !!} + * + * @author bogdan + */ +public class BladeBracesMatcher implements BracesMatcher { + + public enum BraceDirectionType { + END_TO_START, START_TO_END, CUSTOM_START_TO_END, CURLY_END_TO_START, CURLY_START_TO_END, STOP + } + private final MatcherContext context; + private Token originToken; + private BraceDirectionType currentDirection; + + private BladeBracesMatcher(MatcherContext context) { + this.context = context; + } + + @Override + public int[] findOrigin() throws InterruptedException, BadLocationException { + int[] result = null; + originToken = null; + BaseDocument document = (BaseDocument) context.getDocument(); + document.readLock(); + try { + Token currentToken = BladeAntlrUtils.getToken(context.getDocument(), context.getSearchOffset()); + + if (currentToken == null) { + return result; + } + + if (!shouldLookForBraceMatch(currentToken)) { + return result; + } + + originToken = currentToken; + int start = currentToken.getStartIndex(); + int end = currentToken.getStopIndex(); + + String tokenText = originToken.getText(); + + if (!tokenText.startsWith("@") + && !tokenText.startsWith("{") + && !tokenText.endsWith("}")) { + return result; + } + + currentDirection = findBraceDirectionType(tokenText, currentToken); + + if (currentDirection.equals(BraceDirectionType.STOP)) { + return result; + } + + result = new int[]{start, end + 1}; + } finally { + document.readUnlock(); + } + return result; + } + + @Override + public int[] findMatches() throws InterruptedException, BadLocationException { + int[] result = null; + if (originToken == null) { + return result; + } + String tokenText = originToken.getText(); + + switch (currentDirection) { + case CURLY_START_TO_END: + return findCloseTag(); + case CURLY_END_TO_START: + return findOpenTag(); + case START_TO_END: + return findDirectiveEnd(tokenText); + case CUSTOM_START_TO_END: + return findCustomDirectiveEnd(tokenText); + case END_TO_START: + return findOriginForDirectiveEnd(tokenText); + } + + return result; + } + + private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { + switch (currentToken.getType()) { + case HTML: + case PHP_EXPRESSION: + case AT: + case BLADE_COMMENT: + case ERROR: + return false; + } + + return true; + } + + public BraceDirectionType findBraceDirectionType(String tokenText, Token token) { + boolean isCloseTag = Arrays.asList(BladeTagsUtils.outputCloseTags()).indexOf(tokenText) >= 0; + + if (isCloseTag) { + return BraceDirectionType.CURLY_END_TO_START; + } + + boolean isStartTag = Arrays.asList(BladeTagsUtils.outputStartTags()).indexOf(tokenText) >= 0; + + if (isStartTag) { + return BraceDirectionType.CURLY_START_TO_END; + } + + if (tokenText.startsWith("@end") || tokenText.equals("@show")) { + return BraceDirectionType.END_TO_START; + } + + if (BladeDirectivesUtils.directiveStart2EndPair(tokenText) != null) { + return BraceDirectionType.START_TO_END; + } + + //TODO get more directive context + if (token.getType() == BladeAntlrLexer.D_CUSTOM + || token.getType() == BladeAntlrLexer.D_UNKNOWN) { + return BraceDirectionType.CUSTOM_START_TO_END; + } + + return BraceDirectionType.STOP; + } + + public int[] findOpenTag() { + int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); + List skipableTokenTypes = new ArrayList<>(); + skipableTokenTypes.add(HTML); + Token startToken = BladeAntlrUtils.findBackwardWithStop(context.getDocument(), + originToken, + matchTokenType, + skipableTokenTypes); + + if (startToken != null) { + int start = startToken.getStartIndex(); + int end = startToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findCloseTag() { + int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); + List skipableTokenTypes = new ArrayList<>(); + skipableTokenTypes.add(HTML); + Token endToken = BladeAntlrUtils.findForwardWithStop(context.getDocument(), + originToken, + matchTokenType, + skipableTokenTypes); + + if (endToken != null) { + int start = endToken.getStartIndex(); + int end = endToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findDirectiveEnd(String directive) { + String[] pair = BladeDirectivesUtils.directiveStart2EndPair(directive); + if (pair == null){ + return null; + } + List startDirectiveForBalance = new ArrayList<>(); + List stopDirectives = Arrays.asList(pair); + + for (String endDirective : pair) { + String[] startDirectives = BladeDirectivesUtils.directiveEnd2StartPair(endDirective); + + if (startDirectives != null) { + startDirectiveForBalance.addAll(Arrays.asList(startDirectives)); + } + } + + Token endToken = BladeAntlrUtils.findForward(context.getDocument(), + originToken, + stopDirectives, + startDirectiveForBalance); + + if (endToken != null) { + //String text = endToken.getText(); + int start = endToken.getStartIndex(); + int end = endToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findCustomDirectiveEnd(String directive) { + String[] pair = new String[]{"@end" + directive.substring(1)}; + List stopDirectives = Arrays.asList(pair); + List startDirectiveForBalance = Arrays.asList(new String[]{directive}); + + Token endToken = BladeAntlrUtils.findForward(context.getDocument(), + originToken, + stopDirectives, + startDirectiveForBalance); + + if (endToken != null) { + int start = endToken.getStartIndex(); + int end = endToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findOriginForDirectiveEnd(String directive) { + String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); + List endDirectivesForBalance = new ArrayList<>(); + List openDirectives = Arrays.asList(pair); + + for (String startDirective : pair) { + String[] endDirectives = BladeDirectivesUtils.directiveStart2EndPair(startDirective); + + if (endDirectives != null) { + endDirectivesForBalance.addAll(Arrays.asList(endDirectives)); + } + } + + Token startToken = BladeAntlrUtils.findBackward(context.getDocument(), + originToken, + openDirectives, + endDirectivesForBalance); + + if (startToken != null) { + int start = startToken.getStartIndex(); + int end = startToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 110) + public static final class Factory implements BracesMatcherFactory { + + @Override + public BracesMatcher createMatcher(MatcherContext context) { + return new BladeBracesMatcher(context); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java new file mode 100644 index 000000000000..388f71f475d4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.csl.spi.CommentHandler; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import org.openide.util.Exceptions; + +/** + * known issues + * currently blade tag comment not wokring inside htmtl tags
{{ $x }}
+ * + * + * @author bhaidu + */ +public class BladeCommentHandler extends CommentHandler.DefaultCommentHandler { + + private static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N + private static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N + + @Override + public String getCommentStartDelimiter() { + return COMMENT_START_DELIMITER; + } + + @Override + public String getCommentEndDelimiter() { + return COMMENT_END_DELIMITER; + } + + @Override + @SuppressWarnings("rawtypes") + public int[] getAdjustedBlocks(final Document doc, int from, int to) { + final int[] bounds = new int[]{from, to}; + + Runnable task = new Runnable() { + @Override + @SuppressWarnings("rawtypes") + public void run() { + TokenHierarchy th = TokenHierarchy.get(doc); + TokenSequence ts = th.tokenSequence(); + ts.move(from); + ts.moveNext(); + + Token token = ts.token(); + + if (token != null && token.id() instanceof BladeTokenId) { + //handle uncomment + switch ((BladeTokenId) token.id()) { + case BLADE_COMMENT_START: + bounds[0] = ts.offset(); + + while (ts.moveNext()) { + if (ts.token().id() == BladeTokenId.BLADE_COMMENT_END) { + bounds[1] = ts.offset() + ts.token().length(); + break; + } + } + break; + case BLADE_DIRECTIVE: + bounds[0] = ts.offset(); + + ts.moveNext(); + if (ts.token().id() == BladeTokenId.PHP_BLADE_EXPRESSION) { + bounds[1] = ts.offset() + ts.token().length(); + } + + try { + //manually inserting the delimiters + doc.insertString(bounds[0], COMMENT_START_DELIMITER, null); + doc.insertString(Math.max(bounds[1], to) + COMMENT_END_DELIMITER.length(), COMMENT_END_DELIMITER, null); + bounds[0] = 0; + bounds[1] = 0; + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + break; + + } + + } + + } + }; + + if (doc instanceof BaseDocument) { + ((BaseDocument) doc).runAtomic(task); + } else { + task.run(); + } + + return new int[]{bounds[0], bounds[1]}; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java new file mode 100644 index 000000000000..8b505f0c8336 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -0,0 +1,463 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PathElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.editor.declaration.ComponentDeclarationService; +import org.netbeans.modules.php.blade.editor.declaration.VitePathDeclarationService; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.editor.indexing.QueryUtils; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.FieldAccessReference; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; +import org.openide.filesystems.FileObject; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileUtil; + +/** + * focuses mainly on string inputs + * + * ?? TODO implement a Extension module + * + * @author bhaidu + */ +public class BladeDeclarationFinder implements DeclarationFinder { + + private int currentTokenId; + private String tokenText; + + @Override + public OffsetRange getReferenceSpan(Document document, int caretOffset) { + BaseDocument baseDoc = (BaseDocument) document; + + //baseDoc.readLock(); + AntlrTokenSequence tokens = null; + OffsetRange offsetRange = OffsetRange.NONE; + tokenText = null; + int lineOffset = caretOffset; + try { + try { + String text = baseDoc.getText(0, baseDoc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + //Exceptions.printStackTrace(ex); + } + } finally { + //baseDoc.readUnlock(); + } + + //inside php expression context ?? + if (tokens == null || tokens.isEmpty()) { + return offsetRange; + } + + tokens.seekTo(lineOffset); + + if (tokens.hasNext()) { + org.antlr.v4.runtime.Token nt = tokens.next().get(); + + switch (nt.getType()) { + case D_CUSTOM: + case PHP_IDENTIFIER: + case PHP_NAMESPACE_PATH: + return new OffsetRange(nt.getStartIndex(), nt.getStopIndex() + 1); + case HTML_COMPONENT_PREFIX: + //direct detection + currentTokenId = HTML_COMPONENT_PREFIX; + //remove ' 3 ? nt.getText() : null; + return new OffsetRange(nt.getStartIndex() + 1, nt.getStopIndex() + 1); + } + + if (!tokens.hasPrevious()) { + return offsetRange; + } + + if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { + List tokensToMatch = BladeLexerUtils.tokensWithIdentifiableParam(); + List tokensStop = Arrays.asList(new Integer[]{HTML}); + org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); + int offsetCorrection = caretOffset - lineOffset; + if (matchedToken != null) { + offsetRange = new OffsetRange(nt.getStartIndex() + offsetCorrection, nt.getStopIndex() + offsetCorrection + 1); + } + return offsetRange; + } + } + return offsetRange; + } + + @Override + public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { + BladeParserResult parserResult = (BladeParserResult) info; + + FileObject currentFile = parserResult.getFileObject(); + DeclarationLocation location = DeclarationLocation.NONE; + + if (tokenText != null && currentTokenId == HTML_COMPONENT_PREFIX) { + String componentId = tokenText.substring(3); + String className = StringUtils.kebabToCamel(componentId); + ComponentDeclarationService componentComplervice = new ComponentDeclarationService(); + Collection indexedReferences = componentComplervice.queryComponents(className, currentFile); + + for (PhpIndexResult indexReference : indexedReferences) { + NamedElement resultHandle = new NamedElement(className, indexReference.declarationFile, ElementType.LARAVEL_COMPONENT); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexReference.declarationFile, indexReference.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + + if (!location.equals(DeclarationLocation.NONE)) { + FileObject resource = componentComplervice.getComponentResourceFile(componentId, indexReference.name, currentFile); + if (resource != null) { + PathElement resourceHandle = new PathElement(componentId, resource); + DeclarationLocation resourceLocation = new DeclarationFinder.DeclarationLocation(resource, indexReference.getStartOffset(), resourceHandle); + location.addAlternative(new AlternativeLocationImpl(resourceLocation)); + } + } + } + return location; + } + + FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(caretOffset); + + if (fieldAccessReference != null) { + switch (fieldAccessReference.type) { + case STATIC_FIELD_ACCESS: + switch (fieldAccessReference.fieldType) { + case CONSTANT: + Collection indexConstantsResults = PhpIndexUtils.queryExactClassConstants(currentFile, fieldAccessReference.fieldName, fieldAccessReference.ownerClass.identifier); + for (PhpIndexResult indexResult : indexConstantsResults) { + NamedElement resultHandle = new NamedElement(fieldAccessReference.fieldName, indexResult.declarationFile, ElementType.PHP_CONSTANT); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + } + return location; + } + } + } + + Reference reference = parserResult.findOccuredRefrence(caretOffset); + + if (reference == null) { + return location; + } + + Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); + + if (projectOwner == null) { + return location; + } + + FileObject sourceFolder = projectOwner.getProjectDirectory(); + String referenceIdentifier = reference.identifier; + + switch (reference.type) { + case EXTENDS: + case INCLUDE: + case INCLUDE_IF: + case EACH: + case INCLUDE_COND: + String viewPath = referenceIdentifier; + List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, viewPath); + + if (includedFiles.isEmpty()) { + return DeclarationLocation.NONE; + } + + for (FileObject includedFile : includedFiles) { + PathElement elHandle = new PathElement(referenceIdentifier, includedFile); + DeclarationLocation dln = new DeclarationFinder.DeclarationLocation(includedFile, 0, elHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dln; + } + location.addAlternative(new AlternativeLocationImpl(dln)); + } + return location; + case SECTION: + case HAS_SECTION: + case SECTION_MISSING: + String yieldId = referenceIdentifier; + List yields = QueryUtils.findYieldReferences(yieldId, currentFile); + if (yields == null) { + return DeclarationLocation.NONE; + } + + for (BladeIndex.IndexedReference yieldReference : yields) { + String yieldReferenceId = yieldReference.getReference().identifier; + NamedElement yieldIdHandle = new NamedElement(yieldReferenceId, + yieldReference.getOriginFile(), ElementType.YIELD_ID); + int startOccurence = yieldReference.getReference().defOffset.getStart(); + DeclarationLocation dlyieldItem = new DeclarationFinder.DeclarationLocation(yieldReference.getOriginFile(), startOccurence, yieldIdHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dlyieldItem; + } + location.addAlternative(new AlternativeLocationImpl(dlyieldItem)); + } + + return location; + case PUSH: + case PUSH_IF: + case PREPEND: + String stackId = referenceIdentifier; + List stacks = QueryUtils.queryStacksReferences(stackId, currentFile); + + if (stacks == null) { + return DeclarationLocation.NONE; + } + + for (BladeIndex.IndexedReference stackReference : stacks) { + String stackReferenceId = stackReference.getReference().identifier; + NamedElement yieldIdHandle = new NamedElement(stackReferenceId, stackReference.getOriginFile(), ElementType.STACK_ID); + int startOccurence = stackReference.getReference().defOffset.getStart(); + DeclarationLocation dlstack = new DeclarationFinder.DeclarationLocation(stackReference.getOriginFile(), startOccurence, yieldIdHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dlstack; + } + location.addAlternative(new AlternativeLocationImpl(dlstack)); + } + + return location; + case CUSTOM_DIRECTIVE: + String directiveNameFound = reference.identifier; + DeclarationLocation dlcustomDirective = DeclarationLocation.NONE; + + CustomDirectives.getInstance(projectOwner).filterAction(new CustomDirectives.FilterCallbackDeclaration(dlcustomDirective) { + @Override + public void filterDirectiveName(CustomDirective directive, FileObject file) { + if (directive.name.equals(directiveNameFound)) { + NamedElement customDirectiveHandle = new NamedElement(directiveNameFound, file, ElementType.CUSTOM_DIRECTIVE); + DeclarationFinder.DeclarationLocation newLoc = new DeclarationFinder.DeclarationLocation(file, directive.offset, customDirectiveHandle); + this.location.addAlternative(new AlternativeLocationImpl(newLoc)); + } + } + }); + + if (!dlcustomDirective.getAlternativeLocations().isEmpty()) { + for (AlternativeLocation loc : dlcustomDirective.getAlternativeLocations()) { + dlcustomDirective = loc.getLocation(); + } + } + return dlcustomDirective; + case PHP_CLASS: + Collection indexClassResults; + String namespace = reference.namespace; + + if (namespace != null && reference.namespace.length() > 2) { + int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; + indexClassResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, + reference.namespace.substring(subOffset, reference.namespace.length() - 1), + sourceFolder + ); + } else { + indexClassResults = PhpIndexUtils.queryExactClass(sourceFolder, reference.identifier); + } + + for (PhpIndexResult indexResult : indexClassResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CLASS); + DeclarationLocation classLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = classLocation; + } + location.addAlternative(new AlternativeLocationImpl(classLocation)); + } + return location; + case PHP_METHOD:{ + if (reference.ownerClass == null) { + return location; + } + String queryNamespace = reference.namespace; + if (queryNamespace != null && queryNamespace.length() > 2) { + int subOffset = queryNamespace.startsWith("\\") ? 1 : 0; + int endOffset = queryNamespace.endsWith("\\") ? queryNamespace.length() - 1 : queryNamespace.length(); + queryNamespace = queryNamespace.substring(subOffset, endOffset); + } else { + queryNamespace = null; + } + Collection indexMethodResults = PhpIndexUtils.queryExactClassMethods(sourceFolder, + referenceIdentifier, reference.ownerClass, queryNamespace); + + + for (PhpIndexFunctionResult indexResult : indexMethodResults) { + PhpFunctionElement resultHandle = new PhpFunctionElement( + referenceIdentifier, + indexResult.declarationFile, + ElementType.PHP_FUNCTION, + indexResult.getClassNamespace(), + indexResult.getParams() + ); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = functionLocation; + } + location.addAlternative(new AlternativeLocationImpl(functionLocation)); + } + return location; + } + case PHP_FUNCTION: + Collection indexResults = PhpIndexUtils.queryExactFunctions(sourceFolder, reference.identifier); + + for (PhpIndexFunctionResult indexResult : indexResults) { + PhpFunctionElement resultHandle = new PhpFunctionElement( + referenceIdentifier, + indexResult.declarationFile, + ElementType.PHP_FUNCTION, + indexResult.getParams() + ); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = functionLocation; + } + location.addAlternative(new AlternativeLocationImpl(functionLocation)); + } + return location; + case PHP_CONSTANT: + Collection indexConstantsResults = PhpIndexUtils.queryExactConstants(sourceFolder, reference.identifier); + + for (PhpIndexResult indexResult : indexConstantsResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CONSTANT); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + } + return location; + case USE: + case INJECT: + case PHP_NAMESPACE_PATH_TYPE:{ + Collection indexNamespaceResults; + if (reference.namespace != null) { + int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; + String namespacePath = reference.namespace.substring(subOffset); + indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, + namespacePath, + sourceFolder + ); + for (PhpIndexResult indexResult : indexNamespaceResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CLASS); + DeclarationLocation classLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = classLocation; + } + location.addAlternative(new AlternativeLocationImpl(classLocation)); + } + } else { + indexNamespaceResults = PhpIndexUtils.queryNamespace(sourceFolder, reference.identifier); + + for (PhpIndexResult indexResult : indexNamespaceResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_NAMESPACE); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + } + } + return location; + } + case VITE_PATH: + VitePathDeclarationService vitePathDeclService = new VitePathDeclarationService(sourceFolder); + FileObject viteAssetFile = vitePathDeclService.findFileObject(referenceIdentifier); + if (viteAssetFile == null || !viteAssetFile.isValid()){ + return location; + } + NamedElement resultHandle = new NamedElement(referenceIdentifier, viteAssetFile, ElementType.ASSET_FILE); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(viteAssetFile, 0, resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + return location; + } + + return DeclarationLocation.NONE; + } + + private static class AlternativeLocationImpl implements AlternativeLocation { + + private final DeclarationLocation location; + + public AlternativeLocationImpl(DeclarationLocation location) { + this.location = location; + } + + @Override + public ElementHandle getElement() { + return getLocation().getElement(); + } + + @Override + public String getDisplayHtml(HtmlFormatter formatter) { + ElementHandle el = getLocation().getElement(); + if (el != null) { + formatter.appendText(el.getName()); + if (el.getFileObject() != null) { + formatter.appendText(" in "); + formatter.appendText(FileUtil.getFileDisplayName(el.getFileObject())); + } + return formatter.getText(); + } + return getLocation().toString(); + } + + @Override + public DeclarationFinder.DeclarationLocation getLocation() { + return location; + } + + @Override + public int compareTo(DeclarationFinder.AlternativeLocation o) { + return 0; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java new file mode 100644 index 000000000000..8a8f9bf49b49 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import org.netbeans.modules.php.blade.editor.hints.BladeHintsProvider; +import org.netbeans.api.lexer.Language; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.csl.spi.DefaultLanguageConfig; +import org.netbeans.modules.csl.spi.LanguageRegistration; +import org.netbeans.spi.lexer.Lexer; +import org.openide.util.NbBundle; +import org.netbeans.spi.lexer.LexerRestartInfo; +import org.openide.awt.ActionID; +import org.openide.awt.ActionReference; +import org.openide.awt.ActionReferences; +import org.openide.filesystems.MIMEResolver; +import org.openide.util.Lookup; +import org.openide.windows.TopComponent; +import org.netbeans.core.spi.multiview.MultiViewElement; +import org.netbeans.core.spi.multiview.text.MultiViewEditorElement; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.csl.api.Formatter; +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.csl.api.SemanticAnalyzer; +import org.netbeans.modules.csl.api.StructureScanner; +import org.netbeans.modules.csl.spi.CommentHandler; +import static org.netbeans.modules.php.blade.editor.BladeLanguage.ACTIONS; +import org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler; +import org.netbeans.modules.php.blade.editor.format.BladeFormatter; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexer; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BladeLanguageHierarchy; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureScanner; +import org.netbeans.modules.php.blade.editor.parser.BladeParser; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; + +/** + * + * @author Haidu Bogdan + */ +@MIMEResolver.Registration( + resource = "../resources/mime-resolver.xml", + displayName = "#LBL_Blade_LOADER", + position = 1 +) + +@NbBundle.Messages({ + "LBL_Blade_LOADER=Blade template files" +}) +@LanguageRegistration(mimeType = "text/x-blade", useMultiview = true) +@ActionReferences({ + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), + @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), + path = ACTIONS, separatorBefore = 1700, position = 1800), + @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), // @ActionReference(id = @ActionID(category = "DebugAntlrActions", id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens"), path = ACTIONS, position = 2000), +// @ActionReference( +// path = "Editors/" + BladeLanguage.MIME_TYPE+ "/Popup", +// id = @ActionID(category = "Refactoring", id = "org.netbeans.modules.refactoring.api.ui.WhereUsedAction"), +// position = 1600 +// ), +} +) +public class BladeLanguage extends DefaultLanguageConfig { + + public BladeLanguage() { + super(); + } + + public static final String ACTIONS = "Loaders/" + BladeLanguage.MIME_TYPE + "/Actions"; //NOI18N + public static final String MIME_TYPE = "text/x-blade"; //NOI18N + + @Override + public Language getLexerLanguage() { + return language; + } + + @Override + public String getDisplayName() { + return "Blade"; //NOI18N + } + + @Override + public String getPreferredExtension() { + return "blade.php"; // NOI18N + } + + @Override + public Parser getParser() { + return new BladeParser(); + } + + //we need this to avoid lang assertion error + @Deprecated + @Override + public boolean hasStructureScanner() { + return true; + } + + @Override + public StructureScanner getStructureScanner() { + return new BladeStructureScanner(); + } + + @Override + public CodeCompletionHandler getCompletionHandler() { + return new BladeCompletionHandler(); + } + + @Override + public CommentHandler getCommentHandler() { + return new BladeCommentHandler(); + } + + @Override + public boolean hasHintsProvider() { + return true; + } + + @Override + public HintsProvider getHintsProvider() { + return new BladeHintsProvider(); + } + + @Override + public boolean hasFormatter() { + return true; + } + + @Override + public Formatter getFormatter() { + return new BladeFormatter(); + } + + @Override + public DeclarationFinder getDeclarationFinder() { + return new BladeDeclarationFinder(); + } + + @Override + @SuppressWarnings("rawtypes") + public SemanticAnalyzer getSemanticAnalyzer() { + return new BladeSemanticAnalyzer(); + } +// +// @Override +// public boolean hasOccurrencesFinder() { +// return true; +// } +// +// @Override +// public OccurrencesFinder getOccurrencesFinder() { +// //practical just for php context +// return new BladeOcurrencesFinder(); +// } + + /** + * flag for detecting if we are in a string context enables to select the + * blade view "layout.index" string value on double click without + * interpreting the same thing for javascript objects + */ + public static volatile Boolean hasQuote = false; + + @Override + public boolean isIdentifierChar(char c) { + /** + * Includes things you'd want selected as a unit when double clicking in + * the editor + */ + //also used for completion items filtering! + if (c == '"' || c == '\'') { + hasQuote = true; + } + return Character.isJavaIdentifierPart(c) + || (c == '@') + || (hasQuote && c == '.') || (c == '_'); + } + +// @deprecated +// @Override +// public KeystrokeHandler getKeystrokeHandler() { +// return new BladeBracketCompleter(); +// } + private static final Language language + = new BladeLanguageHierarchy() { + + @Override + protected String mimeType() { + return BladeLanguage.MIME_TYPE; + } + + @Override + protected Lexer createLexer(LexerRestartInfo info) { + return new BladeLexer(info); + } + + }.language(); + + @NbBundle.Messages("Source=&Source Blade") + @MultiViewElement.Registration( + displayName = "#Source", + persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, + mimeType = BladeLanguage.MIME_TYPE, + preferredID = "blade.source", + position = 100 + ) + public static MultiViewEditorElement createMultiViewEditorElement(Lookup context) { + return new MultiViewEditorElement(context); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java new file mode 100644 index 000000000000..30d7b88b87e8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.ColoringAttributes; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.SemanticAnalyzer; +import org.netbeans.modules.parsing.spi.Scheduler; +import org.netbeans.modules.parsing.spi.SchedulerEvent; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * coloring configured in fonts and colors + * + * @author bhaidu + */ +public class BladeSemanticAnalyzer extends SemanticAnalyzer { + + private boolean cancelled; + public static final EnumSet UNDEFINED_FIELD_SET = EnumSet.of(ColoringAttributes.UNDEFINED); + public static final EnumSet CUSTOM_DIRECTIVE_SET = EnumSet.of(ColoringAttributes.DECLARATION); + private Map> semanticHighlights; + + @Override + public Map> getHighlights() { + return semanticHighlights; + } + + protected final synchronized boolean isCancelled() { + return cancelled; + } + + protected final synchronized void resume() { + cancelled = false; + } + + @Override + public void cancel() { + cancelled = true; + } + + @Override + public int getPriority() { + return 0; + } + + @Override + public Class getSchedulerClass() { + return Scheduler.EDITOR_SENSITIVE_TASK_SCHEDULER; + } + + @Override + public void run(BladeParserResult parserResult, SchedulerEvent event) { + resume(); + + if (isCancelled()) { + return; + } + + Map> highlights + = new HashMap<>(); + FileObject fo = parserResult.getFileObject(); + Project project = ProjectUtils.getMainOwner(fo); + CustomDirectives ct = CustomDirectives.getInstance(project); + for (Map.Entry entry : parserResult.customDirectivesReferences.entrySet()) { + if (entry.getValue().type == BladeParserResult.ReferenceType.POSSIBLE_DIRECTIVE && ct.customDirectiveConfigured(entry.getValue().identifier) ) { + highlights.put(entry.getKey(), CUSTOM_DIRECTIVE_SET); + continue; + } + highlights.put(entry.getKey(), UNDEFINED_FIELD_SET); + } + +// List errorList = parserResult.getDiagnostics(); +// for (org.netbeans.modules.csl.api.Error error : errorList) { +// OffsetRange range = new OffsetRange(error.getStartPosition(), error.getEndPosition()); +// highlights.put(range, UNDEFINED_FIELD_SET); +// } + this.semanticHighlights = highlights; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java new file mode 100644 index 000000000000..dde99d415548 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.Collection; +import org.openide.util.Parameters; + +/** + * + * @author bhaidu + */ +public class EditorStringUtils { + + public static String implode(Collection items, String delimiter) { + Parameters.notNull("items", items); + Parameters.notNull("delimiter", delimiter); + + if (items.isEmpty()) { + return ""; // NOI18N + } + + StringBuilder buffer = new StringBuilder(200); + boolean first = true; + for (String s : items) { + if (!first) { + buffer.append(delimiter); + } + buffer.append(s); + first = false; + } + return buffer.toString(); + } + + public static boolean isQuotedString(String text){ + if (text.length() < 2){ + return false; + } + return (text.startsWith("'") && text.endsWith("'")) + || (text.startsWith("\"") && text.endsWith("\"")); + } + + public static String stripSurroundingQuotes(String text){ + if (!isQuotedString(text)){ + return text; + } + return text.substring(1, text.length()-1); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java new file mode 100644 index 000000000000..2622a72cd93d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -0,0 +1,208 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.io.IOException; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import org.netbeans.api.editor.*; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.lib.editor.hyperlink.spi.HyperlinkProviderExt; +import org.netbeans.lib.editor.hyperlink.spi.HyperlinkType; +import org.netbeans.api.editor.document.LineDocumentUtils; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.api.project.Project; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.blade.editor.lexer.EditorUtils; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; +import org.openide.text.Line; +import org.openide.text.NbDocument; +import org.openide.util.Exceptions; + +/** + * Similar to a declaration finder + * + * @author bhaidu + */ +@MimeRegistration(mimeType = "text/x-php5", service = HyperlinkProviderExt.class) +public class HyperlinkProviderImpl implements HyperlinkProviderExt { + + String methodName; + String identifiableText; + String tooltipText = ""; + FileObject goToFile; + int goToOffset = 0; + int triggeredEvent = 0; + + public enum DeclarationType { + VIEW_PATH; + } + + @Override + public Set getSupportedHyperlinkTypes() { + return EnumSet.of(HyperlinkType.GO_TO_DECLARATION, HyperlinkType.ALT_HYPERLINK); + } + + @Override + public boolean isHyperlinkPoint(Document doc, int offset, HyperlinkType type) { + if (!nonLaravelDeclFinderEnabled(doc)) { + return false; + } + return getHyperlinkSpan(doc, offset, type) != null; + } + + @Override + public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { + if (!nonLaravelDeclFinderEnabled(doc)) { + return null; + } + if (!type.equals(HyperlinkType.GO_TO_DECLARATION)) { + //not handled by a LSP handler + return null; + } + + BaseDocument baseDoc = (BaseDocument) doc; + int lineStart = LineDocumentUtils.getLineStart(baseDoc, offset); + TokenSequence tokensq = EditorUtils.getTokenSequence(doc, offset); + + if (tokensq == null) { + return null; + } + + Token currentToken = tokensq.token(); + int startOffset = tokensq.offset(); + + if (currentToken == null) { + return null; + } + + String focusedText = currentToken.text().toString(); + + //2 char config are not that relevant + if (focusedText.length() < 5 || !EditorStringUtils.isQuotedString(focusedText)) { + return null; + } + + identifiableText = focusedText.substring(1, focusedText.length() - 1); + PHPTokenId prevTokenId = null; + + while (tokensq.movePrevious() && tokensq.offset() >= lineStart) { + Token token = tokensq.token(); + if (token == null) { + break; + } + String text = token.text().toString(); + PHPTokenId id = token.id(); + + if (prevTokenId != null && id.equals(PHPTokenId.PHP_STRING)) { + methodName = text; + //tooltip text + switch (methodName) { + case "view": + case "make": + case "render": + FileObject currentFile = EditorUtils.getFileObjectFromDoc(doc); + + if (currentFile == null) { + return null; + } + List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, identifiableText); + String viewPath = BladePathUtils.toBladeToProjectFilePath(identifiableText); + + for (FileObject includedFile : includedFiles) { + goToFile = includedFile; + tooltipText = "Blade Template File : " + viewPath + + "

" + identifiableText + ""; + goToOffset = 0; + break; + } + + return new int[]{startOffset, startOffset + currentToken.length()}; + default: + return null; + } + } + + if (id.equals(PHPTokenId.PHP_TOKEN) && text.equals("(")) { + prevTokenId = id; + } + } + return null; + } + + @Override + public void performClickAction(Document doc, int offset, HyperlinkType type) { + switch (type) { + case GO_TO_DECLARATION: + switch (methodName) { + case "view": + case "make": + case "render": + if (goToFile != null) { + openDocument(goToFile, goToOffset); + triggeredEvent++; + } + break; + } + break; + case ALT_HYPERLINK: + JTextComponent focused = EditorRegistry.focusedComponent(); + if (focused != null && focused.getDocument() == doc) { + focused.setCaretPosition(offset); + //GoToImplementation.goToImplementation(focused); + } + break; + } + } + + private void openDocument(FileObject f, int offset) { + try { + DataObject dob = DataObject.find(f); + NbDocument.openDocument(dob, offset, Line.ShowOpenType.OPEN, Line.ShowVisibilityType.FOCUS); + + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + } + + private boolean nonLaravelDeclFinderEnabled(Document doc) { + Project projectOwner = EditorUtils.getProjectOwner(doc); + if (projectOwner == null){ + return false; + } + BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(projectOwner); + + return bladeProperties.getNonLaravelDeclFinderFlag(); + } + + @Override + public String getTooltipText(Document doc, int offset, HyperlinkType type) { + return "" + tooltipText + ""; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java new file mode 100644 index 000000000000..3849adeacd71 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import javax.swing.ImageIcon; +import org.openide.util.ImageUtilities; + +/** + * + * @author bhaidu + */ +public class ResourceUtilities { + + public static final String ICON_BASE = "org/netbeans/modules/php/blade/resources/"; //NOI18N + + public static ImageIcon loadResourceIcon(String path){ + return ImageUtilities.loadImageIcon(ICON_BASE + path, false); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java new file mode 100644 index 000000000000..d17b3f7ac7ee --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JComponent; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.awt.Actions; +import org.openide.awt.DynamicMenuContent; +import org.openide.nodes.Node; +import org.openide.util.ContextAwareAction; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.actions.Presenter; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug", category = "System") +@ActionRegistration(displayName = "Antlr Debug", lazy=false) +public class AntlrDebugAction extends AbstractAction implements ContextAwareAction, Presenter.Popup { + + Node node; + + public void setNode(Node node){ + this.node = node; + } + + @Override + public Action createContextAwareInstance(Lookup lkp) { + Node folderNode = lkp.lookup(Node.class); + AntlrDebugAction act = new AntlrDebugAction(); + act.setNode(folderNode); + return act; + } + + static final long serialVersionUID = 4906417339959070129L; + + @Override + public void actionPerformed(ActionEvent ae) { + assert false; + } + + @Override + public JMenuItem getPopupPresenter() { + return new AntlrDebugAction.Popup(this); + } + + private List generate(Action gdlAction, boolean forMenu) { + List actions = getAntlrDebugActions(); + List list = new ArrayList<>(actions.size()); + + Lookup lookup; + + if (gdlAction instanceof Lookup.Provider) { + lookup = ((Lookup.Provider) gdlAction).getLookup(); + } else { + lookup = null; + } + + for (Action a : actions) { + + // Retrieve context sensitive action instance if possible. + if (lookup != null && a instanceof ContextAwareAction) { + a = ((ContextAwareAction) a).createContextAwareInstance(lookup); + } + + if (a != null && a.isEnabled()) { + JMenuItem mi; + mi = new JMenuItem(); + Actions.connect(mi, a, !forMenu); + list.add(mi); + } + } + + return list; + } + + List getAntlrDebugActions() { + + List arr = new ArrayList<>(); + if (node != null) { + arr.add(new ViewAntlrLexerTokensAction(node)); + arr.add(new ViewAntlrColoringTokensAction(node)); + arr.add(new ViewAntlrFormatterTokensAction(node)); + } +// List actions = Utilities.actionsForPath("Actions/AntlrDebugActions"); +// arr.addAll(actions); + //add the actions + return arr; + } + + private final class Popup extends JMenuItem implements DynamicMenuContent { + + private final JMenu menu = new MyMenu(); + private JPopupMenu lastPopup = null; + /** + * Associated tools action. + */ + private final Action antlrDebugAction; + + public Popup(Action antlrDebugAction) { + super(); + this.antlrDebugAction = antlrDebugAction; + HelpCtx.setHelpIDString(menu, AntlrDebugAction.class.getName()); + + } + + @Override + public JComponent[] getMenuPresenters() { + return synchMenuPresenters(new JComponent[0]); + } + + @Override + public JComponent[] synchMenuPresenters(JComponent[] jcs) { + return new JMenuItem[]{menu}; + } + + private class MyMenu extends org.openide.awt.JMenuPlus implements PopupMenuListener { + + MyMenu() { + super("Antlr Debug"); + } + + @Override + public JPopupMenu getPopupMenu() { + JPopupMenu popup = super.getPopupMenu(); + fillSubmenu(popup); + + return popup; + } + + private void fillSubmenu(JPopupMenu pop) { + if (lastPopup != null) { + return; + } + pop.addPopupMenuListener(this); + lastPopup = pop; + + removeAll(); + Iterator it = generate(antlrDebugAction, false).iterator(); + + while (it.hasNext()) { + java.awt.Component item = (java.awt.Component) it.next(); + + if (item == null) { + addSeparator(); + } else { + add(item); + } + } + } + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + + } + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java new file mode 100644 index 000000000000..b39b89ece9ec --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.AbstractAction; +import javax.swing.text.JTextComponent; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.editor.refactoring.BladePathInfo; +import org.netbeans.modules.php.blade.editor.refactoring.WhereBladePathUsedRefactoringUIImpl; +import org.netbeans.modules.refactoring.spi.ui.UI; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.windows.TopComponent; + +/** + * + * @author bogdan + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.FindUsage", category = "TemplateActions") +@ActionRegistration(displayName = "Template Usages") +public class FindUsage extends AbstractAction implements ActionListener { + + Node node; + + public FindUsage(Node node) { + this.node = node; + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + String bladePath = BladePathUtils.toBladeViewPath(fo); + if (bladePath == null) { + return; + } + BladePathInfo si = new BladePathInfo(fo, bladePath); + UI.openRefactoringUI(new WhereBladePathUsedRefactoringUIImpl(si), + TopComponent.getRegistry().getActivated()); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java new file mode 100644 index 000000000000..5045b558072e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java @@ -0,0 +1,162 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.BorderLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import javax.swing.AbstractAction; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.EditorKit; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.windows.TopComponent; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrColoringTokens", category = "DebugAntlrActions") +@ActionRegistration(displayName = "AntlrColoring Tokens") +public class ViewAntlrColoringTokensAction extends AbstractAction implements ActionListener { + + Node node; + private transient JEditorPane viewer; + + public ViewAntlrColoringTokensAction(Node node) { + this.node = node; + putValue(NAME, "AntlrColoring Tokens"); + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + if (fo == null) { + return; + } + AntlrLexerPreviewComponent comp = new AntlrLexerPreviewComponent(fo); + comp.open(); + comp.setVisible(true); + } + + public final class AntlrLexerPreviewComponent extends TopComponent { + + private final FileObject fileObject; + + public AntlrLexerPreviewComponent(FileObject fo) { + this.fileObject = fo; + initComponents(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + protected void initComponents() { + setName("Antlr coloring token preview - " + fileObject.getName()); + setLayout(new BorderLayout()); + viewer = new JEditorPane(); + viewer.setContentType("text/plain"); + viewer.setEditable(false); + //viewer.addHyperlinkListener(this::linkHandler); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new JScrollPane(viewer), BorderLayout.CENTER); + add(panel); + Rectangle vis = viewer.getVisibleRect(); + try { + CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); + BladeAntlrColoringLexer lexer = new BladeAntlrColoringLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + Document doc = viewer.getDocument(); + + // Would be better to create some diff and update the changed elemets + doc.remove(0, doc.getLength()); + StringBuilder result = new StringBuilder(); + + int lastLine = 0; + for (Token token : tokens.getTokens()) { + if (lastLine != token.getLine()) { + lastLine = token.getLine(); + if (lastLine > 1) { + result.append("\n"); + } + result.append("L"); + result.append(lastLine); + result.append(": ").append(lastLine); + } + switch (token.getType()) { + case DIRECTIVE: + case D_AT: + result.append(token.getText()); + break; + case HTML_TAG: + case HTML: + result.append(" (HTML-"); + result.append(token.getType()); + result.append(" "); + result.append(token.getText()); + result.append(" ~)"); + break; + case PHP_EXPRESSION: + result.append(" (PHP_EXPRESSION)"); + result.append(token.getText()); + break; + case BLADE_PHP_ECHO_EXPR: + result.append(" (BLADE_PHP_ECHO_EXPR)"); + result.append(token.getText()); + break; + default: + result.append(token.getType()); + } + if (token.getType() > -1) { + result.append(" | "); + } + } + + EditorKit kit = viewer.getEditorKit(); + Reader reader = new StringReader(result.toString()); + //doc. + kit.read(reader, doc, 0); + viewer.scrollRectToVisible(vis); + } catch (IOException | BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java new file mode 100644 index 000000000000..8b4ee0df6a29 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.BorderLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import javax.swing.AbstractAction; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.EditorKit; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer.*; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.windows.TopComponent; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrFormatterTokens", category = "DebugAntlrActions") +@ActionRegistration(displayName = "AntlrFormatter Tokens") +public class ViewAntlrFormatterTokensAction extends AbstractAction implements ActionListener { + + Node node; + private transient JEditorPane viewer; + + public ViewAntlrFormatterTokensAction(Node node) { + this.node = node; + putValue(NAME, "AntlrFormatter Tokens"); + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + if (fo == null) { + return; + } + AntlrLexerPreviewComponent comp = new AntlrLexerPreviewComponent(fo); + comp.open(); + comp.setVisible(true); + } + + public final class AntlrLexerPreviewComponent extends TopComponent { + + private final FileObject fileObject; + + public AntlrLexerPreviewComponent(FileObject fo) { + this.fileObject = fo; + initComponents(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + protected void initComponents() { + setName("Antlr formatter token preview - " + fileObject.getName()); + setLayout(new BorderLayout()); + viewer = new JEditorPane(); + viewer.setContentType("text/plain"); + viewer.setEditable(false); + //viewer.addHyperlinkListener(this::linkHandler); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new JScrollPane(viewer), BorderLayout.CENTER); + add(panel); + Rectangle vis = viewer.getVisibleRect(); + try { + CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); + BladeAntlrFormatterLexer lexer = new BladeAntlrFormatterLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + Document doc = viewer.getDocument(); + + // Would be better to create some diff and update the changed elemets + doc.remove(0, doc.getLength()); + StringBuilder result = new StringBuilder(); + + int lastLine = 0; + for (Token token : tokens.getTokens()) { + if (lastLine != token.getLine()) { + lastLine = token.getLine(); + if (lastLine > 1) { + result.append("\n"); + } + result.append("L"); + result.append(lastLine); + result.append(": "); + } + switch (token.getType()) { + case PARAM_COMMA: + result.append(" ~,"); + break; + case D_ARG_LPAREN: + result.append(" ~("); + break; + case D_ARG_RPAREN: + result.append(" ~)"); + break; + case SG_QUOTE: + result.append(" '"); + break; + case WS: + result.append(" ("); + result.append(token.getText()); + result.append(" )"); + break; + case NL: + result.append(" (n)"); + break; + case EQ: + result.append("(EQ)"); + break; + case STRING: + result.append("string"); + break; + case IDENTIFIER: + result.append("~"); + result.append(token.getText()); + break; + case COMPONENT_TAG: + result.append("COMP_TAG "); + result.append(token.getText()); + break; + case HTML_CLOSE_TAG: + result.append("CLOSE_TAG "); + result.append(token.getText()); + break; + case HTML_START_BLOCK_TAG: + result.append("START_TAG "); + result.append(token.getText()); + break; + case GT_SYMBOL: + result.append(" (>)"); + break; + case D_PHP: + result.append(" (@php)"); + break; + default: + result.append(token.getType()); + if (token.getText().startsWith("@")) { + result.append(" (DIRECTIVE)"); + } + } + if (token.getType() > -1) { + result.append(" | "); + } + } + + EditorKit kit = viewer.getEditorKit(); + Reader reader = new StringReader(result.toString()); + //doc. + kit.read(reader, doc, 0); + viewer.scrollRectToVisible(vis); + } catch (IOException | BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java new file mode 100644 index 000000000000..ccca610a149f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.BorderLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import javax.swing.AbstractAction; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.EditorKit; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.windows.TopComponent; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens", category = "DebugAntlrActions") +@ActionRegistration(displayName = "AntlrLexer Tokens") +public class ViewAntlrLexerTokensAction extends AbstractAction implements ActionListener { + + Node node; + private transient JEditorPane viewer; + + public ViewAntlrLexerTokensAction(Node node) { + this.node = node; + putValue(NAME, "AntlrLexer Tokens"); + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + if (fo == null) { + return; + } + AntlrLexerPreviewComponent comp = new AntlrLexerPreviewComponent(fo); + comp.open(); + comp.setVisible(true); + } + + public final class AntlrLexerPreviewComponent extends TopComponent { + + private final FileObject fileObject; + + public AntlrLexerPreviewComponent(FileObject fo) { + this.fileObject = fo; + initComponents(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + protected void initComponents() { + setName("Antlr token preview - " + fileObject.getName()); + setLayout(new BorderLayout()); + viewer = new JEditorPane(); + viewer.setContentType("text/plain"); + viewer.setEditable(false); + //viewer.addHyperlinkListener(this::linkHandler); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new JScrollPane(viewer), BorderLayout.CENTER); + add(panel); + Rectangle vis = viewer.getVisibleRect(); + try { + CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); + BladeAntlrLexer lexer = new BladeAntlrLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + Document doc = viewer.getDocument(); + + // Would be better to create some diff and update the changed elemets + doc.remove(0, doc.getLength()); + StringBuilder result = new StringBuilder(); + + int lastLine = 0; + for (Token token : tokens.getTokens()) { + if (lastLine != token.getLine()) { + lastLine = token.getLine(); + if (lastLine > 1) { + result.append("\n"); + } + result.append("L"); + result.append(lastLine); + result.append(": ").append(lastLine); + } + switch (token.getType()) { + case BLADE_EXPR_LPAREN: + result.append(" '('"); + break; + case BLADE_EXPR_RPAREN: + result.append(" ')'"); + break; + case HTML: + result.append(" (HTML)"); + result.append(token.getText()); + break; + case HTML_COMPONENT_PREFIX: + result.append(" (HTML_COMPONENT_PREFIX)"); + result.append(token.getText()); + break; + case PHP_NEW: + result.append(" (\n)"); + break; + case PHP_EXPRESSION: + result.append(" (PHP_EXPRESSION)"); + result.append(token.getText()); + break; + case PHP_NAMESPACE_PATH: + result.append(" (PHP_NAMESPACE_PATH)"); + result.append(token.getText()); + break; + case PHP_IDENTIFIER: + result.append(" (PHP_IDENTIFIER)"); + result.append(token.getText()); + break; + case PHP_VARIABLE: + result.append(" (PHP_VARIABLE)"); + result.append(token.getText()); + break; + default: + result.append(token.getType()); + if (token.getText().startsWith("@")) { + result.append(" (DIRECTIVE)"); + } + } + if (token.getType() > -1) { + result.append(" | "); + } + } + + EditorKit kit = viewer.getEditorKit(); + Reader reader = new StringReader(result.toString()); + //doc. + kit.read(reader, doc, 0); + viewer.scrollRectToVisible(vis); + } catch (IOException | BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java new file mode 100644 index 000000000000..f4fab33a8324 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.cache; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * + * @author bogdan + */ +public class QueryCache { + + public static final Long DEFAULT_CACHE_TIMEOUT = 60000L; + + protected Map> cacheMap; + protected Long cacheTimeout; + + //private static final Map QUERY_SUPPORT_INDEX = new WeakHashMap<>(); + + public QueryCache() { + this(DEFAULT_CACHE_TIMEOUT); + } + + public QueryCache(Long cacheTimeout) { + this.cacheTimeout = cacheTimeout; + this.clear(); + } + + public void clean() { + for (K key : this.getExpiredKeys()) { + this.remove(key); + } + } + + public boolean containsKey(K key) { + return this.cacheMap.containsKey(key); + } + + protected Set getExpiredKeys() { + return this.cacheMap.keySet().parallelStream() + .filter(this::isExpired) + .collect(Collectors.toSet()); + } + + protected boolean isExpired(K key) { + LocalDateTime expirationDateTime = this.cacheMap.get(key).getCreatedAt().plus(this.cacheTimeout, ChronoUnit.MILLIS); + return LocalDateTime.now().isAfter(expirationDateTime); + } + + public void clear() { + this.cacheMap = new HashMap<>(); + } + + public Optional get(K key) { + this.clean(); + return Optional.ofNullable(this.cacheMap.get(key)).map(CacheValue::getValue); + } + + public void put(K key, V value) { + this.cacheMap.put(key, this.createCacheValue(value)); + } + + protected CacheValue createCacheValue(V value) { + LocalDateTime now = LocalDateTime.now(); + return new CacheValue() { + @Override + public V getValue() { + return value; + } + + @Override + public LocalDateTime getCreatedAt() { + return now; + } + }; + } + + public void remove(K key) { + this.cacheMap.remove(key); + } + + protected interface CacheValue { + + V getValue(); + + LocalDateTime getCreatedAt(); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java new file mode 100644 index 000000000000..474342ee41e9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -0,0 +1,338 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.netbeans.editor.BaseDocument; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.CodeCompletionContext; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.api.CodeCompletionHandler2; +import org.netbeans.modules.csl.api.CodeCompletionResult; +import org.netbeans.modules.csl.api.CompletionProposal; +import org.netbeans.modules.csl.api.Documentation; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ParameterInfo; +import org.netbeans.modules.csl.spi.DefaultCompletionResult; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.csl.spi.support.CancelSupport; +import org.netbeans.modules.php.blade.csl.elements.DirectiveElement; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.csl.elements.TagElement; +import org.netbeans.modules.php.blade.editor.completion.BladeCompletionProposal.CompletionRequest; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.BladeTags; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.annotation.Tag; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.CONTENT_TAG_OPEN; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class BladeCompletionHandler implements CodeCompletionHandler2 { + + private static final Logger LOGGER = Logger.getLogger(BladeCompletionHandler.class.getName()); + + @Override + public CodeCompletionResult complete(CodeCompletionContext completionContext) { + if (CancelSupport.getDefault().isCancelled()) { + return CodeCompletionResult.NONE; + } + long startTime = System.currentTimeMillis(); + BaseDocument doc = (BaseDocument) completionContext.getParserResult().getSnapshot().getSource().getDocument(false); + + if (doc == null) { + return CodeCompletionResult.NONE; + } + + int offset = completionContext.getCaretOffset(); + + if (offset < 1) { + return CodeCompletionResult.NONE; + } + + BladeParserResult parserResult = (BladeParserResult) completionContext.getParserResult(); + + final List completionProposals = new ArrayList<>(); + + Token currentToken = BladeAntlrUtils.getToken(doc, offset - 1); + + if (currentToken == null) { + return CodeCompletionResult.NONE; + } + + String prefix = currentToken.getText(); + + if (prefix == null) { + return CodeCompletionResult.NONE; + } + + String tokenText = currentToken.getText(); + FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); + //D_UNKNOWN_ATTR_ENC hack to fix completion not triggered in html embedded text + if (tokenText.startsWith("@") && currentToken.getType() != D_UNKNOWN_ATTR_ENC) { + completeDirectives(completionProposals, completionContext, fo, currentToken); + } else { + if (prefix.length() == 1) { + return CodeCompletionResult.NONE; + } + switch (currentToken.getType()) { + case PHP_IDENTIFIER: + case PHP_NAMESPACE_PATH: + PhpCodeCompletionService.completePhpCode(completionProposals, parserResult, offset, prefix); + break; + case PHP_EXPRESSION: + completePhpSnippet(completionProposals, offset, currentToken); + break; + case PHP_VARIABLE: + completeScopedVariables(completionProposals, completionContext, parserResult, currentToken); + break; + case CONTENT_TAG_OPEN: + case RAW_TAG_OPEN: + //{{ | {!! + if (!ModulePreferences.isAutoTagCompletionEnabled()) { + completeBladeTags(completionProposals, completionContext, currentToken); + } + break; + } + } + + if (completionProposals.isEmpty()) { + return CodeCompletionResult.NONE; + } + + long time = System.currentTimeMillis() - startTime; + if (time > 2000){ + LOGGER.info(String.format("complete() with results took %d ms", time)); + } + return new DefaultCompletionResult(completionProposals, false); + } + + + /** + * proxy completion using the original php code completion service + * + * @param completionProposals + * @param offset + * @param currentToken + */ + private void completePhpSnippet(final List completionProposals, + int offset, Token currentToken) { + PhpCodeCompletionService phpCodeCompletion = new PhpCodeCompletionService(); + for (CompletionProposal proposal : phpCodeCompletion.getCompletionProposal(offset, currentToken)) { + String proposalPrefix = proposal.getInsertPrefix(); + if (proposalPrefix.startsWith(phpCodeCompletion.prefix)) { + completionProposals.add(proposal); + } + } + } + + private void completeScopedVariables(final List completionProposals, + CodeCompletionContext completionContext, BladeParserResult parserResult, Token currentToken) { + String variablePrefix = currentToken.getText(); + Set scopedVariables = parserResult.findLoopVariablesForScope(completionContext.getCaretOffset()); + FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); + + if (scopedVariables != null && !scopedVariables.isEmpty()) { + CompletionRequest request = new CompletionRequest(); + request.anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); + request.carretOffset = completionContext.getCaretOffset(); + request.prefix = variablePrefix; + if ("$loop".startsWith(variablePrefix)) { + String variableName = "$loop"; + NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); + completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); + } + for (String variableName : scopedVariables) { + if (variableName.startsWith(variablePrefix)) { + NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); + completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, request, variableName)); + } + } + } + } + + /** + * BLADES + * + * @param completionProposals + * @param completionContext + * @param parserResult + * @param currentToken + */ + private void completeBladeTags(final List completionProposals, + CodeCompletionContext completionContext, Token currentToken) { + String tagStart = currentToken.getText(); + + CompletionRequest request = completionRequest(tagStart, completionContext.getCaretOffset()); + BladeTags tagsContainer = new BladeTags(); + Tag[] tags = tagsContainer.getTags(); + for (Tag tag : tags) { + if (tag.openTag().startsWith(tagStart)) { + TagElement tagElement = new TagElement(tag.closeTag()); + completionProposals.add(new BladeCompletionProposal.BladeTag(tagElement, request, tag)); + } + } + } + + private void completeDirectives(final List completionProposals, + CodeCompletionContext completionContext, FileObject fo, Token currentToken) { + String prefix = currentToken.getText(); + DirectiveCompletionList completionList = new DirectiveCompletionList(); + + CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + + for (Directive directive : completionList.getDirectives()) { + String directiveName = directive.name(); + if (directiveName.startsWith(prefix)) { + DirectiveElement directiveEl = new DirectiveElement(directiveName, fo); + + if (directive.params()) { + completionProposals.add(new BladeCompletionProposal.DirectiveWithArg(directiveEl, request, directive)); + if (!directive.endtag().isEmpty()) { + completionProposals.add(new BladeCompletionProposal.BlockDirectiveWithArg(directiveEl, request, directive)); + } + } else { + + completionProposals.add(new BladeCompletionProposal.InlineDirective(directiveEl, request, directive)); + if (!directive.endtag().isEmpty()) { + completionProposals.add(new BladeCompletionProposal.BlockDirective(directiveEl, request, directive)); + } + } + } + } + + Project project = ProjectUtils.getMainOwner(fo); + CustomDirectives.getInstance(project).filterAction(new CustomDirectives.FilterCallback() { + @Override + public void filterDirectiveName(CustomDirectives.CustomDirective directive, FileObject file) { + DirectiveElement directiveEl = new DirectiveElement(directive.name, file); + if (directive.name.startsWith(prefix)) { + CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + completionProposals.add( + new BladeCompletionProposal.CustomDirective( + directiveEl, + request, + directive.name + )); + } + } + }); + } + + @Override + public String document(ParserResult pr, ElementHandle eh) { + return null; + } + + @Override + public ElementHandle resolveLink(String string, ElementHandle eh) { + return null; + } + + @Override + public String getPrefix(ParserResult info, int offset, boolean upToOffset) { + return null; + } + + @Override + public CodeCompletionHandler.QueryType getAutoQuery(JTextComponent component, String typedText) { + if (typedText.length() == 0) { + return CodeCompletionHandler.QueryType.NONE; + } + + if (typedText.startsWith("@")) { + return CodeCompletionHandler.QueryType.ALL_COMPLETION; + } + + char lastChar = typedText.charAt(typedText.length() - 1); + + switch (lastChar) { + case '\n': + return CodeCompletionHandler.QueryType.STOP; + default: + return CodeCompletionHandler.QueryType.ALL_COMPLETION; + } + } + + @Override + @SuppressWarnings("rawtypes") + public String resolveTemplateVariable(String string, ParserResult pr, int i, String string1, Map map) { + return null; + } + + @Override + public Set getApplicableTemplates(Document dcmnt, int i, int i1) { + return Collections.emptySet(); + } + + @Override + public ParameterInfo parameters(ParserResult pr, int i, CompletionProposal cp) { + return new ParameterInfo(new ArrayList<>(), 0, 0); + } + + /** + * used also for tooltip in blade mime context + * + * @param parserResult + * @param elementHandle + * @param cancel + * @return + */ + @Override + public Documentation documentElement(ParserResult parserResult, ElementHandle elementHandle, Callable cancel) { + Documentation result = null; + if (elementHandle instanceof PhpFunctionElement) { + return TooltipDoc.generateFunctionDoc((PhpFunctionElement) elementHandle); + } else if (elementHandle instanceof DirectiveElement) { + return result; + } else if (elementHandle instanceof NamedElement) { + return TooltipDoc.generateDoc((NamedElement) elementHandle); + } + return result; + } + + public static CompletionRequest completionRequest(String prefix, int offset) { + CompletionRequest request = new CompletionRequest(); + request.anchorOffset = offset - prefix.length(); + request.carretOffset = offset; + request.prefix = prefix; + + return request; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java new file mode 100644 index 000000000000..563f0a23194c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -0,0 +1,381 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.event.KeyEvent; +import javax.swing.ImageIcon; +import javax.swing.text.BadLocationException; +import javax.swing.text.Caret; +import javax.swing.text.JTextComponent; +import org.netbeans.api.editor.completion.Completion; +import org.netbeans.editor.BaseDocument; +import org.netbeans.lib.editor.codetemplates.api.CodeTemplateManager; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.netbeans.spi.editor.completion.CompletionTask; +import org.netbeans.spi.editor.completion.support.CompletionUtilities; +import org.openide.util.ImageUtilities; + +/** + * + * @author bhaidu + */ +public class BladeCompletionItem implements CompletionItem { + + protected static final int DEFAULT_SORT_PRIORITY = 20; + protected int substitutionOffset; + protected String text; + protected boolean shift; + + //----------- Factory methods -------------- + public static BladeCompletionItem createTag(String name, int substitutionOffset) { + return new BladeTag(name, substitutionOffset); + } + + public static BladeCompletionItem createViewPath(String name, + int substitutionOffset, boolean isFolder, String path) { + return new ViewPath(name, substitutionOffset, isFolder, path); + } + + public static BladeCompletionItem createInlineDirective(String directive, + int substitutionOffset, String description) { + return new InlineDirective(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createDirectiveWithArg(String directive, + int substitutionOffset, String description) { + return new DirectiveWithArg(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirective(String directive, + String endTag, int substitutionOffset, String description) { + return new BlockDirective(directive, endTag, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirectiveWithArg(String directive, + String endTag, int substitutionOffset, String description) { + return new BlockDirectiveWithArg(directive, endTag, substitutionOffset, description); + } + + @Override + public void defaultAction(JTextComponent component) { + if (component != null) { + if (!shift) { + Completion.get().hideDocumentation(); + Completion.get().hideCompletion(); + } + int caretOffset = component.getSelectionEnd(); + int len = caretOffset - substitutionOffset; + if (len >= 0) { + substituteText(component, len); + } + } + } + + @Override + public void processKeyEvent(KeyEvent e) { + shift = (e.getKeyCode() == KeyEvent.VK_ENTER && e.getID() == KeyEvent.KEY_PRESSED && e.isShiftDown()); + } + + @Override + public int getPreferredWidth(Graphics grphcs, Font font) { + return CompletionUtilities.getPreferredWidth(getLeftHtmlText(), getRightHtmlText(), grphcs, font); + } + + protected String getLeftHtmlText() { + return text; + } + + protected String getRightHtmlText() { + return null; + } + + @Override + public void render(Graphics g, Font defaultFont, Color defaultColor, Color backgroundColor, int width, int height, boolean selected) { + CompletionUtilities.renderHtml(getIcon(), getLeftHtmlText(), getRightHtmlText(), g, defaultFont, defaultColor, width, height, selected); + } + + protected ImageIcon getIcon() { + return null; + } + + @Override + public CompletionTask createDocumentationTask() { + return null; + } + + @Override + public CompletionTask createToolTipTask() { + return null; + } + + @Override + public boolean instantSubstitution(JTextComponent component) { + if (component != null) { + try { + int caretOffset = component.getSelectionEnd(); + if (caretOffset > substitutionOffset) { + String currentText = component.getDocument().getText(substitutionOffset, caretOffset - substitutionOffset); + if (!getSubstituteText().startsWith(currentText)) { + return false; + } + } + } catch (BadLocationException ble) { + } + } + defaultAction(component); + return true; + } + + @Override + public int getSortPriority() { + return DEFAULT_SORT_PRIORITY; + } + + @Override + public CharSequence getSortText() { + return getItemText(); + } + + @Override + public CharSequence getInsertPrefix() { + return getItemText(); + } + + protected String getSubstituteText() { + return getItemText(); + } + + public String getItemText() { + return text; + } + + private boolean substituteText(JTextComponent component, int len) { + return substituteText(component, getSubstituteText(), len, 0); + } + + private boolean substituteText(JTextComponent c, final String substituteText, final int len, int moveBack) { + final BaseDocument doc = (BaseDocument) c.getDocument(); + final boolean[] result = new boolean[1]; + result[0] = true; + + doc.runAtomic(new Runnable() { + @Override + public void run() { + try { + //test whether we are trying to insert sg. what is already present in the text + String currentText = doc.getText(substitutionOffset, (doc.getLength() - substitutionOffset) < substituteText.length() ? (doc.getLength() - substitutionOffset) : substituteText.length()); + if (!substituteText.equals(currentText)) { + //remove common part + doc.remove(substitutionOffset, len); + insertString(doc, substitutionOffset, substituteText, c); + } else { + c.setCaretPosition(c.getSelectionEnd() + substituteText.length() - len); + } + } catch (BadLocationException ex) { + result[0] = false; + } + + } + }); + + //format the inserted text + reindent(c); + + if (moveBack != 0) { + Caret caret = c.getCaret(); + int dot = caret.getDot(); + caret.setDot(dot - moveBack); + } + + return result[0]; + } + + protected void insertString(BaseDocument doc, int substitutionOffset, + String substituteText, JTextComponent c) throws BadLocationException { + doc.insertString(substitutionOffset, substituteText, null); + } + + protected void reindent(JTextComponent c) { + + } + + public static class BladeTag extends BladeCompletionItem { + + public BladeTag(String name, int substitutionOffset) { + this.text = name; + this.substitutionOffset = substitutionOffset; + } + } + + public static class InlineDirective extends BladeCompletionItem { + + protected String description; + + public InlineDirective(String directive, int substitutionOffset, + String description) { + this.text = directive; + this.substitutionOffset = substitutionOffset; + this.description = description; + } + + @Override + protected String getRightHtmlText() { + return description; + } + + @Override + protected ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + return ImageUtilities.loadImageIcon(path, false); + } + } + + public static class DirectiveWithArg extends InlineDirective { + + public DirectiveWithArg(String directive, int substitutionOffset, + String description) { + super(directive, substitutionOffset, description); + } + + @Override + protected String getSubstituteText() { + String template = getItemText() + "($$${arg})"; + switch (text){ + case "@include": + case "@extends": + template = getItemText() + "('${path}')"; + break; + } + return template; + } + + @Override + protected String getLeftHtmlText() { + return text + "()"; + } + + @Override + protected void insertString(BaseDocument doc, int substitutionOffset, + String substituteText, JTextComponent ctx) throws BadLocationException { + ctx.setCaretPosition(substitutionOffset); + CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); + } + } + + public static class BlockDirective extends BladeCompletionItem { + + protected String description; + protected String endTag; + + public BlockDirective(String directive, String endTag, int substitutionOffset, + String description) { + this.text = directive; + this.substitutionOffset = substitutionOffset; + this.description = description; + this.endTag = endTag; + } + + @Override + protected String getSubstituteText() { + return getItemText() + "\n${selection}${cursor}\n" + endTag; + } + + @Override + protected String getLeftHtmlText() { + return text + " ... " + endTag; + } + + @Override + protected String getRightHtmlText() { + return description; + } + + @Override + protected ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + return ImageUtilities.loadImageIcon(path, false); + } + + @Override + protected void insertString(BaseDocument doc, int substitutionOffset, + String substituteText, JTextComponent ctx) throws BadLocationException { + ctx.setCaretPosition(substitutionOffset); + CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); + } + } + + public static class BlockDirectiveWithArg extends BlockDirective { + + public BlockDirectiveWithArg(String directive, String endTag, int substitutionOffset, String description) { + super(directive, endTag, substitutionOffset, description); + } + + @Override + protected String getSubstituteText() { + String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; + + switch (text){ + case "@foreach": + template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; + break; + } + + return template; + } + + @Override + protected String getLeftHtmlText() { + return text + "() ... " + endTag; + } + + } + + public static class ViewPath extends BladeCompletionItem { + + protected boolean isFolder; + protected String filePath; + + public ViewPath(String name, int substitutionOffset, + boolean isFolder, String filePath) { + this.text = name; + this.substitutionOffset = substitutionOffset; + this.isFolder = isFolder; + this.filePath = filePath; + } + + @Override + protected ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/file.png"; + if (isFolder) { + path = "org/openide/loaders/defaultFolder.gif";//NOI18N + } + return ImageUtilities.loadImageIcon(path, false); + } + + @Override + protected String getRightHtmlText() { + int viewsPos = filePath.indexOf("/views/"); + return filePath.substring(viewsPos, filePath.length()); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java new file mode 100644 index 000000000000..138798b37af0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -0,0 +1,469 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.Collections; +import java.util.Set; +import javax.swing.ImageIcon; +import org.netbeans.modules.csl.api.CompletionProposal; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.php.blade.csl.elements.ClassElement; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.annotation.Tag; + +import org.openide.filesystems.FileObject; +import org.openide.util.ImageUtilities; + +/** + * + * @author bogdan + */ +public class BladeCompletionProposal implements CompletionProposal { + + //@StaticResource + final CompletionRequest request; + protected final ElementHandle element; + final String previewValue; + protected Directive directive; + + public BladeCompletionProposal(ElementHandle element, CompletionRequest request, String previewValue) { + this.element = element; + this.request = request; + this.previewValue = previewValue; + } + + public BladeCompletionProposal(ElementHandle element, CompletionRequest request, Directive directive) { + this.element = element; + this.request = request; + this.previewValue = directive.name(); + this.directive = directive; + } + + @Override + public int getAnchorOffset() { + return request.anchorOffset; + } + + @Override + public ElementHandle getElement() { + return element; + } + + @Override + public String getName() { + return element.getName(); + } + + @Override + public String getSortText() { + return getName(); + } + + @Override + public int getSortPrioOverride() { + return 0; + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + formatter.name(getKind(), true); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.appendText(previewValue); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.name(getKind(), false); + return formatter.getText(); + } + + @Override + public ImageIcon getIcon() { + return null; + } + + @Override + public Set getModifiers() { + return Collections.emptySet(); + } + + @Override + public String getCustomInsertTemplate() { + return null; + } + + @Override + public String getInsertPrefix() { + StringBuilder template = new StringBuilder(); + template.append(getName()); + return template.toString(); + + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + FileObject file = null; + if (element != null) { + file = element.getFileObject(); + } + if (file != null) { + formatter.reset(); + formatter.appendText(" "); + formatter.appendText(file.getName()); + } + return formatter.getText(); + } + + @Override + public ElementKind getKind() { + return ElementKind.CONSTRUCTOR; + } + + @Override + public boolean isSmart() { + return true; + } + + public static class PhpElementItem extends BladeCompletionProposal { + + public PhpElementItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + FileObject file = null; + if (this.getElement() != null) { + file = this.getElement().getFileObject(); + } + if (file != null) { + formatter.reset(); + formatter.appendText(" "); + formatter.appendText(file.getNameExt()); + } + return formatter.getText(); + } + } + + public static class NamespaceItem extends PhpElementItem { + + public NamespaceItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.PACKAGE; + } + + @Override + public int getSortPrioOverride() { + return -50;//priority + } + } + + public static class DirectiveItem extends BladeCompletionProposal { + + public DirectiveItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + } + + public static class ClassItem extends PhpElementItem { + + protected String namespace = null; + + public ClassItem(ClassElement element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + this.namespace = element.getNamespace(); + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (namespace != null && namespace.length() > 0) { + return namespace; + } + return super.getRhsHtml(formatter); + } + + @Override + public int getSortPrioOverride() { + return 10;//priority + } + + @Override + public String getCustomInsertTemplate() { + if (namespace != null && namespace.length() > 0) { + return "\\" + namespace + "\\" + element.getName(); + } + return element.getName(); + } + } + + public static class FunctionItem extends PhpElementItem { + + protected final String namespace; + + public FunctionItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + this.namespace = null; + } + + public FunctionItem(ElementHandle element, CompletionRequest request, + String namespace, + String previewValue) { + super(element, request, previewValue); + this.namespace = namespace; + } + + @Override + public ElementKind getKind() { + return ElementKind.METHOD; + } + + @Override + public int getSortPrioOverride() { + return 20;//priority + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (namespace != null && namespace.length() > 0) { + return namespace; + } + return super.getRhsHtml(formatter); + } + + } + + public static class ConstantItem extends PhpElementItem { + + public ConstantItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.CONSTANT; + } + + } + + public static class VariableItem extends BladeCompletionProposal { + + public VariableItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.VARIABLE; + } + + } + + public static class BladeVariableItem extends BladeCompletionProposal { + + public BladeVariableItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.VARIABLE; + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + return "blade"; + } + } + + public static class CompletionRequest { + + public int anchorOffset; + public int carretOffset; + public String prefix; + } + + public static class BladeTag extends BladeCompletionProposal { + + protected Tag tag; + + public BladeTag(ElementHandle element, CompletionRequest request, Tag tag) { + super(element, request, ""); + this.tag = tag; + } + + @Override + public String getCustomInsertTemplate() { + return tag.openTag() + " ${cursor} " + tag.closeTag(); + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return tag.openTag() + " " + tag.closeTag(); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + return tag.description(); + } + + @Override + public int getSortPrioOverride() { + return 0; + } + } + + public static class DirectiveProposal extends BladeCompletionProposal { + + public DirectiveProposal(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + public DirectiveProposal(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + return ImageUtilities.loadImageIcon(path, false); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (this.directive == null) { + return null; + } + + if (directive.description().isEmpty() && !this.directive.since().isEmpty()) { + return "v" + this.directive.since(); + } + return this.directive.description(); + } + + } + + public static class CustomDirective extends DirectiveProposal { + + public CustomDirective(ElementHandle element, CompletionRequest request, String preview) { + super(element, request, preview); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (this.getElement().getFileObject() != null) { + return this.getElement().getFileObject().getNameExt(); + } + return "custom directive"; + } + + } + + public static class InlineDirective extends DirectiveProposal { + + public InlineDirective(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + } + + public static class DirectiveWithArg extends InlineDirective { + + public DirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + @Override + public String getCustomInsertTemplate() { + String template = getName() + "($$${arg})"; + switch (getName()) { + case "@include": + case "@extends": + template = getName() + "('${path}')"; + break; + } + return template; + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return getName() + "()"; + } + } + + public static class BlockDirective extends DirectiveProposal { + + public BlockDirective(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return getName() + " ... " + directive.endtag(); + } + + @Override + public String getCustomInsertTemplate() { + return getName() + "\n ${selection} ${cursor}\n" + directive.endtag(); + } + + } + + public static class BlockDirectiveWithArg extends DirectiveProposal { + + public BlockDirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return getName() + "() ... " + directive.endtag(); + } + + @Override + public String getCustomInsertTemplate() { + String template = getName() + "($$${arg})\n ${cursor}\n" + directive.endtag(); + + switch (getName()) { + case "@foreach": + template = getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + directive.endtag(); + break; + case "@section": + case "@session": + template = getName() + "('${id}')\n ${cursor}\n" + directive.endtag(); + break; + } + + return template; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java new file mode 100644 index 000000000000..89700f37392d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -0,0 +1,305 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.editor.document.EditorDocumentUtils; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.editor.completion.BladeCompletionItem.BladeTag; +import org.netbeans.modules.php.blade.editor.components.AttributeCompletionService; +import org.netbeans.modules.php.blade.editor.components.ComponentsCompletionService; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.netbeans.spi.editor.completion.CompletionProvider; +import static org.netbeans.spi.editor.completion.CompletionProvider.COMPLETION_QUERY_TYPE; +import org.netbeans.spi.editor.completion.CompletionResultSet; +import org.netbeans.spi.editor.completion.CompletionTask; +import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; +import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; +import org.netbeans.spi.editor.completion.support.CompletionUtilities; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +@MimeRegistrations(value = { + @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class), + @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class) +}) +public class BladeCompletionProvider implements CompletionProvider { + + private static final Logger LOGGER = Logger.getLogger(BladeCompletionProvider.class.getName()); + + public enum CompletionType { + BLADE_PATH, + YIELD_ID, + DIRECTIVE, + HTML_COMPONENT_TAG + } + + @Override + public CompletionTask createTask(int queryType, JTextComponent component) { + return new AsyncCompletionTask(new BladeCompletionQuery(), component); + } + + @Override + public int getAutoQueryTypes(JTextComponent component, String typedText) { + FileObject fo = EditorDocumentUtils.getFileObject(component.getDocument()); + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return 0; + } + + if (typedText.length() == 0) { + return 0; + } + + //don't autocomplete on space, \n, ) + if (typedText.trim().isEmpty()) { + //TODO this stops raw tags to autocomplete + return 0; + } + + char lastChar = typedText.charAt(typedText.length() - 1); + switch (lastChar) { + case ')': + case '\n': + case '<': + case '>': + return 0; + } + return COMPLETION_QUERY_TYPE; + } + + private class BladeCompletionQuery extends AsyncCompletionQuery { + + public BladeCompletionQuery() { + } + + @Override + protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) { + long startTime = System.currentTimeMillis(); + + try { + FileObject fo = EditorDocumentUtils.getFileObject(doc); + + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return; + } + + AntlrTokenSequence tokens; + try { + String docText = doc.getText(0, doc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(docText))); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + return; + } finally { + } + + if (tokens.isEmpty()) { + return; + } + + if (caretOffset > 1) { + tokens.seekTo(caretOffset - 1); + } else { + tokens.seekTo(caretOffset); + } + + Token currentToken; + + if (!tokens.hasNext() && tokens.hasPrevious()) { + //the carret got too far + currentToken = tokens.previous().get(); + } else if (tokens.hasNext()) { + currentToken = tokens.next().get(); + } else { + return; + } + + if (currentToken == null) { + return; + } + + if (currentToken.getText().trim().length() == 0) { + return; + } + + switch (currentToken.getType()) { + case HTML_IDENTIFIER: + completeAttributes(currentToken.getText(), caretOffset, resultSet); + break; + case HTML: + String nText = currentToken.getText(); + if ("livewire".startsWith(nText)) { + //quick implementation + //?? + addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); + } + break; + case HTML_COMPONENT_PREFIX: + String compPrefix = currentToken.getText().length() > 3 ? StringUtils.kebabToCamel(currentToken.getText().substring(3)) : ""; + completeComponents(compPrefix, fo, caretOffset, resultSet); + break; + case D_UNKNOWN_ATTR_ENC: + completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); + break; + default: + break; + } + } finally { + long time = System.currentTimeMillis() - startTime; + if (time > 2000){ + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + } + resultSet.finish(); + } + } + } + + private void completeDirectives(String prefix, Document doc, int carretOffset, CompletionResultSet resultSet) { + int startOffset = carretOffset - prefix.length(); + DirectiveCompletionList completionList = new DirectiveCompletionList(); + + for (Directive directive : completionList.getDirectives()) { + String directiveName = directive.name(); + if (directiveName.startsWith(prefix)) { + if (directive.params()) { + resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( + startOffset, carretOffset, prefix, directiveName, directive.description(), doc)); + if (!directive.endtag().isEmpty()) { + resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( + startOffset, carretOffset, prefix, directiveName, directive.endtag(), directive.description(), doc)); + } + } else { + resultSet.addItem(DirectiveCompletionBuilder.simpleItem( + startOffset, directiveName, directive.description())); + if (!directive.endtag().isEmpty()) { + resultSet.addItem(DirectiveCompletionBuilder.simpleItem( + startOffset, carretOffset, prefix, directiveName, directive.endtag(), directive.description(), doc)); + } + } + + } + } + + FileObject fo = EditorDocumentUtils.getFileObject(doc); + Project project = ProjectUtils.getMainOwner(fo); + + CustomDirectives.getInstance(project).filterAction(new CustomDirectives.FilterCallback() { + @Override + public void filterDirectiveName(CustomDirective customDirective, FileObject file) { + if (customDirective.name.startsWith(prefix)) { + resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( + startOffset, carretOffset, prefix, customDirective.name, + "custom directive", doc, file)); + } + } + }); + } + + private void completeComponents(String prefixIdentifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + + int insertOffset = caretOffset - prefixIdentifier.length(); + ComponentsCompletionService componentComplervice = new ComponentsCompletionService(); + Collection indexedReferences = componentComplervice.queryComponents(prefixIdentifier, fo); + + for (PhpIndexResult indexReference : indexedReferences) { + addComponentIdCompletionItem(indexReference, + insertOffset, resultSet); + } + + } + + private void completeAttributes(String prefix, int caretOffset, CompletionResultSet resultSet) { + int insertOffset = caretOffset; + AttributeCompletionService attributeCompletionService = new AttributeCompletionService(); + Collection attributes = attributeCompletionService.queryComponents(prefix); + + for (String attribute : attributes) { + addSimplAttributeItem(prefix, attribute, insertOffset, resultSet); + } + } + + //?? + private void addHtmlTagCompletionItem(String prefix, String tagName, String plugin, + int caretOffset, CompletionResultSet resultSet) { + + int insertOffset = caretOffset - prefix.length(); + BladeTag item = new BladeTag(tagName, insertOffset); + resultSet.addItem(item); + } + + private void addSimplAttributeItem(String prefix, String attributeName, int caretOffset, CompletionResultSet resultSet) { + int insertOffset = caretOffset - prefix.length(); + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(attributeName) + .startOffset(insertOffset) + .leftHtmlText(attributeName) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private void addComponentIdCompletionItem(PhpIndexResult indexReference, + int caretOffset, CompletionResultSet resultSet) { + + String tagName = StringUtils.toKebabCase(indexReference.name); + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(tagName) + .iconResource(getReferenceIcon(CompletionType.HTML_COMPONENT_TAG)) + .startOffset(caretOffset) + .leftHtmlText(tagName) + .rightHtmlText(indexReference.namespace) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private static String getReferenceIcon(CompletionType type) { + switch (type) { + case HTML_COMPONENT_TAG: + return "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N + case YIELD_ID: + return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + } + return ResourceUtilities.ICON_BASE + "icons/at.png"; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java new file mode 100644 index 000000000000..23c541dc059c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -0,0 +1,383 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.editor.document.EditorDocumentUtils; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex.IndexedReferenceId; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.netbeans.spi.editor.completion.CompletionProvider; +import org.netbeans.spi.editor.completion.CompletionResultSet; +import org.netbeans.spi.editor.completion.CompletionTask; +import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; +import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; +import org.netbeans.spi.editor.completion.support.CompletionUtilities; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +@MimeRegistrations(value = { + @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), // @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class, position = 105), +} +) +public class BladePhpCompletionProvider implements CompletionProvider { + + private static final Logger LOGGER = Logger.getLogger(BladePhpCompletionProvider.class.getName()); + public static final String JS_ASSET_FOLDER = "resources/js"; + public static final String CSS_ASSET_FOLDER = "resources/css"; + + public enum CompletionType { + BLADE_PATH, + YIELD_ID, + DIRECTIVE, + HTML_COMPONENT_TAG, + FOLDER, + CSS_FILE, + JS_FILE + } + + @Override + public CompletionTask createTask(int queryType, JTextComponent component) { + return new AsyncCompletionTask(new BladeCompletionQuery(), component); + } + + @Override + public int getAutoQueryTypes(JTextComponent component, String typedText) { + FileObject fo = EditorDocumentUtils.getFileObject(component.getDocument()); + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return 0; + } + + if (typedText.length() == 0) { + return 0; + } + + //don't autocomplete on space, \n, ) + if (typedText.trim().isEmpty()) { + return 0; + } + + char lastChar = typedText.charAt(typedText.length() - 1); + switch (lastChar) { + case ')': + case '\n': + case '<': + case '>': + return 0; + } + + return COMPLETION_QUERY_TYPE; + } + + private class BladeCompletionQuery extends AsyncCompletionQuery { + + public BladeCompletionQuery() { + } + + @Override + protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) { + long startTime = System.currentTimeMillis(); + doQuery(resultSet, doc, caretOffset); + long time = System.currentTimeMillis() - startTime; + if (time > 2000) { + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + } + resultSet.finish(); + } + } + + private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffset) { + FileObject fo = EditorDocumentUtils.getFileObject(doc); + + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return; + } + + AntlrTokenSequence tokens; + try { + String docText = doc.getText(0, doc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(docText))); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + return; + } + + if (tokens.isEmpty()) { + return; + } + + if (caretOffset > 1) { + tokens.seekTo(caretOffset - 1); + } else { + tokens.seekTo(caretOffset); + } + + Token currentToken; + + if (!tokens.hasNext() && tokens.hasPrevious()) { + //the carret got too far + currentToken = tokens.previous().get(); + } else if (tokens.hasNext()) { + currentToken = tokens.next().get(); + } else { + return; + } + + if (currentToken == null) { + return; + } + + if (currentToken.getText().trim().length() == 0) { + return; + } + + switch (currentToken.getType()) { + case BL_PARAM_STRING: { + String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); + List tokensMatch = Arrays.asList(new Integer[]{ + D_EXTENDS, D_INCLUDE, D_SECTION, D_HAS_SECTION, + D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, + D_EACH, D_PUSH, D_PUSH_IF, D_PREPEND + }); + + List tokensStop = Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR}); + Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensMatch, tokensStop); + if (directiveToken == null) { + break; + } + switch (directiveToken.getType()) { + case D_EXTENDS: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_UNLESS: + case D_EACH: + int lastDotPos; + + if (pathName.endsWith(".")) { + lastDotPos = pathName.length(); + } else { + lastDotPos = pathName.lastIndexOf("."); + } + int pathOffset; + + if (lastDotPos > 0) { + int dotFix = pathName.endsWith(".") ? 0 : 1; + pathOffset = caretOffset - pathName.length() + lastDotPos + dotFix; + } else { + pathOffset = caretOffset - pathName.length(); + } + List childrenFiles = BladePathUtils.getParentChildrenFromPrefixPath(fo, pathName); + for (FileObject file : childrenFiles) { + String pathFileName = file.getName(); + if (!file.isFolder()) { + pathFileName = pathFileName.replace(".blade", ""); + } + completeBladePath(pathFileName, file, pathOffset, resultSet); + } + return; + case D_SECTION: + case D_HAS_SECTION: + completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); + break; + case D_PUSH: + case D_PUSH_IF: + case D_PREPEND: + completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); + break; + } + break; + } + case EXPR_STRING: { + String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); + + if (!pathName.contains("resources")) { + if (!"resources".startsWith(pathName)) { + break; + } + } + + int lastSlash = pathName.lastIndexOf("/"); + + FileObject projectDir = ProjectUtils.getProjectDirectory(fo); + + if (projectDir == null) { + break; + } + + int pathOffset = caretOffset - pathName.length(); + //laravel framework + if (lastSlash < 0) { + String jsDirRoot = JS_ASSET_FOLDER; + FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); + addAssetPathCompletionItem(jsDirRoot, jsFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); + String cssDirRoot = CSS_ASSET_FOLDER; + FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); + addAssetPathCompletionItem(cssDirRoot, cssFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); + break; + } + + boolean isJsPath = JS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(JS_ASSET_FOLDER); + boolean isCssPath = CSS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(CSS_ASSET_FOLDER); + + if (isJsPath) { + FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); + if (jsFolder == null || !jsFolder.isValid()) { + break; + } + for (FileObject file : jsFolder.getChildren()) { + String jsPath = JS_ASSET_FOLDER + "/" + file.getNameExt(); + if (jsPath.startsWith(pathName)) { + addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.JS_FILE); + } + } + break; + } + if (isCssPath) { + FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); + if (cssFolder == null || !cssFolder.isValid()) { + break; + } + for (FileObject file : cssFolder.getChildren()) { + String jsPath = CSS_ASSET_FOLDER + "/" + file.getNameExt(); + if (jsPath.startsWith(pathName)) { + addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.CSS_FILE); + } + } + break; + } + break; + } + default: + break; + } + } + + private void completeYieldIdFromIndex(String prefixIdentifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + BladeIndex bladeIndex; + Project project = ProjectUtils.getMainOwner(fo); + int insertOffset = caretOffset - prefixIdentifier.length(); + try { + bladeIndex = BladeIndex.get(project); + List indexedReferences = bladeIndex.queryYieldIds(prefixIdentifier); + for (IndexedReferenceId indexReference : indexedReferences) { + addYieldIdCompletionItem(indexReference.getIdenfiier(), indexReference.getOriginFile(), + insertOffset, resultSet); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + private void completeStackIdFromIndex(String prefixIdentifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + BladeIndex bladeIndex; + Project project = ProjectUtils.getMainOwner(fo); + int insertOffset = caretOffset - prefixIdentifier.length(); + try { + bladeIndex = BladeIndex.get(project); + List indexedReferences = bladeIndex.queryStacksIndexedReferences(prefixIdentifier); + for (IndexedReferenceId indexReference : indexedReferences) { + addYieldIdCompletionItem(indexReference.getIdenfiier(), indexReference.getOriginFile(), + insertOffset, resultSet); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + private void completeBladePath(String bladePath, FileObject originFile, + int caretOffset, CompletionResultSet resultSet) { + + String filePath = originFile.getPath(); + + BladeCompletionItem item = BladeCompletionItem.createViewPath( + bladePath, caretOffset, originFile.isFolder(), filePath); + resultSet.addItem(item); + } + + private void addYieldIdCompletionItem(String identifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + + String filePath = fo.getPath(); + int viewsPos = filePath.indexOf("/views/"); + + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(identifier) + .iconResource(getReferenceIcon(CompletionType.YIELD_ID)) + .startOffset(caretOffset) + .leftHtmlText(identifier) + .rightHtmlText(filePath.substring(viewsPos, filePath.length())) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private void addAssetPathCompletionItem(String preview, String info, + int caretOffset, CompletionResultSet resultSet, CompletionType type) { + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(preview) + .iconResource(getReferenceIcon(type)) + .startOffset(caretOffset) + .leftHtmlText(preview) + .rightHtmlText(info) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private static String getReferenceIcon(CompletionType type) { + + switch (type) { + case FOLDER: + return "org/openide/loaders/defaultFolder.gif"; + case CSS_FILE: + return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; + case JS_FILE: + return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; + } + return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java new file mode 100644 index 000000000000..c73236b032b3 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import javax.swing.text.Document; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class DirectiveCompletionBuilder { + + public static CompletionItem simpleItem(int startOffset, String directive, + String description) { + + return BladeCompletionItem.createInlineDirective(directive, startOffset, description); + } + + public static CompletionItem simpleItem(int startOffset, int carretOffset, + String prefix, String directive, String endtag, + String description, Document doc) { + + return BladeCompletionItem.createBlockDirective( + directive, endtag, startOffset, description); + } + + public static CompletionItem itemWithArg(int startOffset, int carretOffset, + String prefix, String directive, + String description, Document doc) { + + return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + } + + public static CompletionItem itemWithArg(int startOffset, int carretOffset, + String prefix, String directive, String endtag, + String description, Document doc) { + + return BladeCompletionItem.createBlockDirectiveWithArg( + directive, endtag, startOffset, description); + } + + public static CompletionItem itemWithArg(int startOffset, int carretOffset, + String prefix, String directive, + String description, Document doc, + FileObject file) { + return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java new file mode 100644 index 000000000000..3ac0ae5cdb8c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import org.netbeans.modules.php.blade.syntax.DirectivesList; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; + +public final class DirectiveCompletionList { + + public Directive[] getDirectives() { + DirectivesList listClass = new DirectivesList(); + return listClass.getDirectives(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java new file mode 100644 index 000000000000..2fd4d6f5ae1a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import org.netbeans.modules.csl.api.CodeCompletionContext; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.spi.ParserResult; + +/** + * used to trigger php.editor package completion flow + * + * @author bhaidu + */ +public class PhpCodeCompletionContext { + + public static CodeCompletionContext completionContext(int carretOffset, + ParserResult phpParserResult, + String phpPrefix) { + return new CodeCompletionContext() { + @Override + public int getCaretOffset() { + //the offset should be taken from compiler + return carretOffset; + } + + @Override + public ParserResult getParserResult() { + return phpParserResult; + } + + @Override + public String getPrefix() { + return phpPrefix; + } + + @Override + public boolean isPrefixMatch() { + return true; + } + + @Override + public CodeCompletionHandler.QueryType getQueryType() { + return CodeCompletionHandler.QueryType.COMPLETION; + } + + @Override + public boolean isCaseSensitive() { + return true; + } + }; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java new file mode 100644 index 000000000000..c8458a073ba0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -0,0 +1,323 @@ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.CodeCompletionContext; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.api.CodeCompletionResult; +import org.netbeans.modules.csl.api.CompletionProposal; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.csl.elements.ClassElement; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import static org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler.completionRequest; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CLASS; +import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CONSTANT; +import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_NAMESPACE_PATH_TYPE; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.editor.csl.PHPLanguage; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpCodeCompletionService { + + public String prefix = ""; + + public List getCompletionProposal(int offset, Token currentToken) { + List proposals = new ArrayList<>(); + String phpSnippet = currentToken.getText(); + String phpStart = " completionProposals, + BladeParserResult parserResult, + int offset, String prefix) { + BladeParserResult.FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(offset); + + FileObject fo = parserResult.getSnapshot().getSource().getFileObject(); + + if (fieldAccessReference != null) { + completeClassConstants(prefix, fieldAccessReference.ownerClass.identifier, offset, completionProposals, fo); + completeClassMethods(prefix, fieldAccessReference, offset, completionProposals, fo); + return; + } + + //based on ParserResult implementation + //inside tag {{ }} and inside directive expression differences + BladeParserResult.Reference elementReference = parserResult.findOccuredRefrence(offset); + + if (elementReference == null) { + completeNamespace(prefix, offset, completionProposals, fo); + completePhpClasses(prefix, offset, completionProposals, fo); + completePhpFunctions(prefix, offset, completionProposals, fo); + completeConstants(prefix, offset, completionProposals, fo); + return; + } + + switch (elementReference.type) { + case PHP_CONSTANT: + case PHP_CLASS: + completeNamespace(prefix, offset, completionProposals, fo); + completePhpClasses(prefix, offset, completionProposals, fo); + completeConstants(prefix, offset, completionProposals, fo); + break; + case PHP_NAMESPACE_PATH_TYPE: + String prefixNamespace = elementReference.namespace != null ? elementReference.namespace + prefix : prefix; + completeNamespace(prefixNamespace, offset, completionProposals, fo); + + //we are after '\[a-z]' + if (elementReference.namespace != null) { + String classQuery = prefix; + String namespace = elementReference.namespace; + int substringStartOffset = namespace.startsWith("\\") ? 1 : 0; + String namespacePath = namespace.substring(substringStartOffset) + classQuery; + Collection indexedNamespaces = PhpIndexUtils.queryNamespaces( + fo, namespacePath, QuerySupport.Kind.PREFIX + ); + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexedNamespaces) { + completionProposals.add(new BladeCompletionProposal.NamespaceItem( + namespaceElement(indexResult), request, indexResult.name)); + } + } else if (prefix.endsWith("\\")) { + //the identifier is the namespace + int substringOffset = elementReference.identifier.startsWith("\\") ? 1 : 0; + String namespacePath = elementReference.identifier.substring(substringOffset, elementReference.identifier.length() - 1); + Collection indexClassResults = PhpIndexUtils.queryAllNamespaceClasses(fo, namespacePath); + BladeCompletionProposal.CompletionRequest request = completionRequest(namespacePath, offset + namespacePath.length()); + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ClassItem(classElement(indexResult), request, indexResult.name)); + } + //completeNamespacedPhpClasses("", namespace, offset, completionProposals, parserResult); + } + break; + } + } + + private static void completePhpClasses(String prefix, int offset, + final List completionProposals, + FileObject fo) + { + + Collection indexClassResults = PhpIndexUtils.queryClass(fo, prefix); + + if (indexClassResults.isEmpty()) { + return; + } + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ClassItem( + classElement(indexResult), request, indexResult.name)); + } + } + + private static void completePhpFunctions(String prefix, int offset, + final List completionProposals, + FileObject fo) { + Collection indexedFunctions = PhpIndexUtils.queryFunctions( + fo, prefix); + if (indexedFunctions.isEmpty()) { + return; + } + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + for (PhpIndexFunctionResult indexResult : indexedFunctions) { + //to be completed + //might add syntax completion cursor + String preview = indexResult.name + indexResult.getParamsAsString(); + completionProposals.add(new BladeCompletionProposal.FunctionItem( + functionElement(indexResult), + request, + preview) + ); + } + } + + /** + * Warning this doesn't check access permission (private, protected) + * + * @param prefix + * @param fieldAccessReference + * @param offset + * @param completionProposals + * @param fo + */ + private static void completeClassMethods(String prefix, BladeParserResult.FieldAccessReference fieldAccessReference, + int offset, + final List completionProposals, + FileObject fo) { + Collection indexedFunctions = PhpIndexUtils.queryClassMethods( + fo, prefix, fieldAccessReference.ownerClass.identifier, + fieldAccessReference.ownerClass.namespace); + if (indexedFunctions.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexFunctionResult indexResult : indexedFunctions) { + //to be completed + //might add syntax completion cursor + String preview = indexResult.name + indexResult.getParamsAsString(); + completionProposals.add(new BladeCompletionProposal.FunctionItem( + functionElement(indexResult), + request, + indexResult.getClassNamespace(), + preview) + ); + } + } + + private static void completeNamespace(String prefix, int offset, + final List completionProposals, + FileObject fo) { + + if (!prefix.startsWith("\\") && !Character.isUpperCase(prefix.charAt(0))) { + //skip lowercase string from namespce search + return; + } + + //TODO check if this really matters + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return; + } + int substringOffset = prefix.startsWith("\\") ? 1 : 0; + Collection indexClassResults = PhpIndexUtils.queryNamespace( + projectOwner.getProjectDirectory(), prefix.substring(substringOffset) + ); + if (indexClassResults.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset + substringOffset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.NamespaceItem( + namespaceElement(indexResult), request, indexResult.name)); + } + } + + private static void completeConstants(String prefix, int offset, + final List completionProposals, + FileObject fo) + { + Collection indexClassResults = PhpIndexUtils.queryConstants(fo, prefix); + + //treat only uppercase strings + if (!Character.isUpperCase(prefix.charAt(0))){ + return; + } + + if (indexClassResults.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ConstantItem( + constantElement(indexResult), request, indexResult.name)); + } + } + + private static void completeClassConstants(String prefix, String ownerClass, int offset, + final List completionProposals, + FileObject fo) { + + Collection indexClassResults = PhpIndexUtils.queryClassConstants( + fo, prefix, ownerClass); + + //treat only uppercase strings + if (!Character.isUpperCase(prefix.charAt(0))){ + return; + } + + if (indexClassResults.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ConstantItem( + constantElement(indexResult), request, indexResult.name)); + } + } + + //TODO might move in a factory for NamedElement + + private static ClassElement classElement(PhpIndexResult indexResult) { + return new ClassElement(indexResult.name, + indexResult.namespace, + indexResult.declarationFile); + } + + private static NamedElement namespaceElement(PhpIndexResult indexResult) { + return namedElement(indexResult, ElementType.PHP_NAMESPACE); + } + + private static NamedElement functionElement(PhpIndexResult indexResult) { + String inputString = indexResult.name + "()"; + return namedElement(inputString, indexResult, ElementType.PHP_FUNCTION); + } + + private static NamedElement constantElement(PhpIndexResult indexResult) { + return namedElement(indexResult, ElementType.PHP_CONSTANT); + } + + private static NamedElement namedElement(PhpIndexResult indexResult, ElementType type) { + return new NamedElement(indexResult.name, indexResult.declarationFile, type); + } + + private static NamedElement namedElement(String preview, PhpIndexResult indexResult, ElementType type) { + return new NamedElement(preview, indexResult.declarationFile, type); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java new file mode 100644 index 000000000000..e55f0b8714d8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import org.netbeans.modules.csl.api.Documentation; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; + +/** + * @TODO update doc representation + * + * @author bogdan + */ +public class TooltipDoc { + + public static Documentation generateDoc(NamedElement elementHandle) { + Documentation result = null; + switch (elementHandle.getType()) { + case PATH: + String filePath = ""; + if (elementHandle.getFileObject() != null){ + filePath = BladePathUtils.getRelativeProjectPath(elementHandle.getFileObject()); + } + return Documentation.create(String.format("
%s
", "blade path") + + "
" + filePath + "
", null); + case CUSTOM_DIRECTIVE: + String docInfo = String.format("
%s
", "custom directive") + + "
" + elementHandle.getFileObject().getNameExt() + "
"; + return Documentation.create(docInfo, null); + } + + return result; + } + + public static Documentation generateFunctionDoc(PhpFunctionElement elementHandle) { + String info = "
" + elementHandle.getName() + elementHandle.getParamsAsString() + "
"; + if (elementHandle.namespace != null){ + info += "
" + elementHandle.namespace + "
"; + } + info += "
" + elementHandle.getFileObject().getNameExt() + "
"; + info += String.format("
%s
", "php function"); + return Documentation.create(info, null); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java new file mode 100644 index 000000000000..499042ed1753 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import java.util.ArrayList; +import java.util.Collection; +import org.netbeans.modules.php.blade.editor.components.annotation.Attribute; +import org.netbeans.modules.php.blade.editor.components.annotation.AttributeRegister; + +/** + * + * @author bhaidu + */ +@AttributeRegister({ + @Attribute(name = "class"), + @Attribute(name = "id"), + @Attribute(name = "title"), +}) +public class AttributeCompletionService { + + public Collection queryComponents(String prefix) { + Collection results = new ArrayList<>(); + + for (Attribute attrName : getAttributes()) { + if (attrName.name().startsWith(prefix)){ + results.add(attrName.name()); + } + } + + return results; + } + + public Attribute[] getAttributes() { + AttributeRegister attributeRegister = this.getClass().getAnnotation(AttributeRegister.class); + return attributeRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java new file mode 100644 index 000000000000..fa9628c37714 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import java.util.HashSet; +import java.util.Set; + +/** + * TO use in implementation with ComponentModel + * + * @author bhaidu + */ +public class ComponentElement { + public String name; + public String qualifiedClassName; + + public Set properties = new HashSet<>(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java new file mode 100644 index 000000000000..32aa0b7b9ec9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import java.util.Map; +import java.util.WeakHashMap; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * TO BE CONTINUED + * + * @author bhaidu + */ +public class ComponentModel { + + private static final Map MODEL_INSTANCE = new WeakHashMap<>(); + + protected static ComponentModel getModel(FileObject fo, String prefix) { + ComponentModel selfModel = new ComponentModel(); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return null; + } + int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); + if (ComponentModel.MODEL_INSTANCE.containsKey(pathHash)) { + selfModel = MODEL_INSTANCE.get(pathHash); + + } else { + MODEL_INSTANCE.put(pathHash, selfModel); + } + return selfModel; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java new file mode 100644 index 000000000000..39ba9ef68b4d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import org.netbeans.modules.php.blade.editor.components.annotation.NamespaceRegister; +import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import java.util.ArrayList; +import java.util.Collection; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * most frequently used plugins for laravel + * + * @author bhaidu + */ +@NamespaceRegister({ + @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), + @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), + @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"),//from 10 + @Namespace(path = "Illuminate\\Console\\View\\Components"), + @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), + @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), + @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), +}) +public class ComponentsCompletionService { + + public Collection queryComponents(String prefix, FileObject fo) { + Collection results = new ArrayList<>(); + Project project = ProjectUtils.getMainOwner(fo); + for (Namespace namespace : getNamespaces()){ + if (namespace.from_app()){ + //check if folder exists + if (project.getProjectDirectory().getFileObject(namespace.relativeFilePath()) == null){ + continue; + } + } + results.addAll(PhpIndexUtils.queryNamespaceClassesName(prefix, namespace.path(), fo)); + } + + return results; + } + + public Namespace[] getNamespaces() { + NamespaceRegister namespaceRegister = this.getClass().getAnnotation(NamespaceRegister.class); + return namespaceRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java new file mode 100644 index 000000000000..a8cde3f03713 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +/** + * + * @author bhaidu + */ +public @interface Attribute { + String name(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java new file mode 100644 index 000000000000..9090bb74be54 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface AttributeRegister { + public Attribute[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java new file mode 100644 index 000000000000..dff6931bb05a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +/** + * + * @author bhaidu + */ +public @interface Namespace { + String path(); + String relativeFilePath() default ""; + String packageName() default "blade"; + //inside App folder + boolean from_app() default false; + boolean from_vendor() default true; +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java new file mode 100644 index 000000000000..2cc4cf16cfbc --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface NamespaceRegister { + public Namespace[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java new file mode 100644 index 000000000000..13c01e4e9351 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.declaration; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.project.ComponentsSupport; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class ComponentDeclarationService { + + public Collection queryComponents(String prefix, FileObject fo) { + Collection results = new ArrayList<>(); + Project project = ProjectUtils.getMainOwner(fo); + + if (project == null) { + return results; + } + + ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); + + if (!componentSupport.isScanned()){ + componentSupport.scanForInstalledComponents(); + } + + for (Map.Entry namespace : componentSupport.getInstalledComponentNamespace().entrySet()) { + results.addAll(PhpIndexUtils.queryComponentClass(prefix, namespace.getValue().path(), fo)); + } + + return results; + } + + public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { + if (classQualifiedName.toLowerCase().contains("livewire")){ + return getLivewireComponentResourceFile(componentId, sourceFo); + } + + return null; + } + + public FileObject getLivewireComponentResourceFile(String componentId, FileObject sourceFo) { + Project project = ProjectUtils.getMainOwner(sourceFo); + if (project == null) { + return null; + } + + FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + ".blade.php"); + + if (componentResource != null && componentResource.isValid()){ + return componentResource; + } + + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java new file mode 100644 index 000000000000..b748f625fa08 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.declaration; + +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class VitePathDeclarationService { + + private final FileObject sourceFolder; + + public VitePathDeclarationService(FileObject sourceFolder) { + this.sourceFolder = sourceFolder; + } + + public FileObject findFileObject(String path) { + return sourceFolder.getFileObject(path); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java new file mode 100644 index 000000000000..aef8df37b541 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -0,0 +1,302 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.directives; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.editor.parser.astnodes.Expression; +import org.netbeans.modules.php.editor.parser.astnodes.FunctionInvocation; +import org.netbeans.modules.php.editor.parser.astnodes.Scalar; +import org.openide.filesystems.FileChangeAdapter; +import org.openide.filesystems.FileChangeListener; +import org.openide.filesystems.FileEvent; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bhaidu + */ +public final class CustomDirectives { + + private final Project project; + private static final Map INSTANCES = new WeakHashMap<>(); + private final Map> customDirectives = new LinkedHashMap<>(); + + public List customDirectiveList = new ArrayList<>(); + + private final FileChangeListener fileChangeListener = new FileChangeListenerImpl(); + + private static final Logger LOGGER = Logger.getLogger(CustomDirectives.class.getName()); + + public static CustomDirectives getInstance(Project project) { + if (project == null) { + return new CustomDirectives(); + } + synchronized (INSTANCES) { + CustomDirectives customDirective = INSTANCES.get(project); + if (customDirective == null) { + customDirective = new CustomDirectives(project); + INSTANCES.put(project, customDirective); + } + return customDirective; + } + } + + public static CustomDirectives resetInstance(Project project) { + CustomDirectives customDirective = new CustomDirectives(project); + INSTANCES.put(project, customDirective); + return customDirective; + } + + private CustomDirectives() { + this.project = null; + } + + private CustomDirectives(Project project) { + this.project = project; + extractCustomDirectives(); + LOGGER.log(Level.INFO, "Finished extracting directives. Found ({0})", customDirectives.size()); + } + + private void extractCustomDirectives() { + LOGGER.info("Extracting custom directives"); + String[] compilerPathList = BladeProjectProperties.getInstance(project).getCompilerPathList(); + FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); + String defaultAppPath = ""; + + if (defaultAppProvider != null){ + addDirectiveNamesFromFile(defaultAppProvider); + File defaultAppFile = new File(defaultAppProvider.getPath()); + defaultAppPath = defaultAppFile.getAbsolutePath(); + FileUtil.addRecursiveListener(fileChangeListener, defaultAppFile); + } + + if (compilerPathList.length == 0) { + return; + } + for (String path : compilerPathList) { + if (path.equals("")) { + continue; + } + File file = new File(path); + if (!file.exists()) { + //remove + continue; + } + + String filePath = file.getPath(); + if (defaultAppPath.equals(filePath)){ + continue; + } + FileUtil.addRecursiveListener(fileChangeListener, file); + FileObject fileObj = FileUtil.toFileObject(file); + addDirectiveNamesFromFile(fileObj); + } + + } + + private void rescanFile(FileObject file) { + List entry = customDirectives.get(file); + if (entry.isEmpty()) { + addDirectiveNamesFromFile(file); + } + } + + public void addDirectiveNamesFromFile(FileObject file) { + ParsingUtils parsingUtils = new ParsingUtils(); + parsingUtils.parseFileObject(file); + FunctionInvocationVisitor functionInvocationVisitor = new FunctionInvocationVisitor(); + if (parsingUtils.getParserResult() != null && parsingUtils.getParserResult().getProgram() != null) { + parsingUtils.getParserResult().getProgram().accept(functionInvocationVisitor); + List directiveList = functionInvocationVisitor.getDirectives(); + + if (directiveList.isEmpty()) { + return; + } + + customDirectiveList.addAll(directiveList); + customDirectives.put(file, directiveList); + } + } + + public Map> getCustomDirectives() { + return customDirectives; + } + + public class DirectiveNames { + + private final List directiveNames; + + public DirectiveNames(List directiveNames) { + this.directiveNames = directiveNames; + } + + public List getList() { + return directiveNames; + } + } + + /** + * we are scanning the php ast nodes to search for the use of directive + * method the first parameter of the called method will be the custom + * directive name + */ + private class FunctionInvocationVisitor extends org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor { + private final String[] validFunctions = new String[]{"directive", "if"}; + private final List directives; + + public FunctionInvocationVisitor() { + this.directives = new ArrayList<>(); + } + + @Override + public void scan(org.netbeans.modules.php.editor.parser.astnodes.ASTNode node) { + if (node != null) { + super.scan(node); + } + } + + @Override + public void visit(FunctionInvocation node) { + String functionName = node.getFunctionName().toString(); + if (!Arrays.stream(validFunctions).anyMatch(functionName::equals)) { + return; + } + List parameters = node.getParameters(); + Iterator iter = parameters.iterator(); + Expression directiveName = (Expression) iter.next(); + if (directiveName != null && directiveName instanceof Scalar) { + Scalar name = (Scalar) directiveName; + String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); + directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset())); + //Custom If Statements + if (functionName.equals("if")){ + directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); + directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); + directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); + } + } + } + + public List getDirectives() { + return directives; + } + } + + private final class FileChangeListenerImpl extends FileChangeAdapter { + + @Override + public void fileFolderCreated(FileEvent fe) { + + } + + @Override + public void fileChanged(FileEvent fe) { + processFile(fe.getFile()); + } + + @Override + public void fileDataCreated(FileEvent fe) { + + } + + private void processFile(FileObject file) { + assert file.isData() : file; + CustomDirectives.getInstance(project).rescanFile(file); + } + + } + + public void filterAction(FilterCallback callback) { + for (Map.Entry> entry : customDirectives.entrySet()) { + if (!entry.getKey().isValid()) { + continue; + } + + for (CustomDirective directive : entry.getValue()) { + callback.filterDirectiveName(directive, entry.getKey()); + } + + } + } + + public void filterAction(FilterCallbackDeclaration callback) { + for (Map.Entry> entry : customDirectives.entrySet()) { + if (!entry.getKey().isValid()) { + continue; + } + + for (CustomDirective directive : entry.getValue()) { + callback.filterDirectiveName(directive, entry.getKey()); + } + + } + } + + public boolean customDirectiveConfigured(String query){ + for (CustomDirectives.CustomDirective customDirective : customDirectiveList){ + if (customDirective.name.equals(query)){ + return true; + } + } + return false; + } + + public static interface FilterCallback { + + public void filterDirectiveName(CustomDirective directive, FileObject file); + } + + public static abstract class FilterCallbackDeclaration { + protected DeclarationFinder.DeclarationLocation location ; + + public FilterCallbackDeclaration(DeclarationFinder.DeclarationLocation location){ + this.location = location; + } + + public void filterDirectiveName(CustomDirective directive, FileObject file){} + } + + public static class CustomDirective { + public String name; + public int offset = 0; + + public CustomDirective(String name){ + this.name = name; + } + + public CustomDirective(String name, int offset){ + this.name = name; + this.offset = offset; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java new file mode 100644 index 000000000000..f2e9da7b7c08 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenId; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; + +/** + * this will enable braces matches of html elements + * + * @author bhaidu + */ +@EmbeddingProvider.Registration( + mimeType = BladeLanguage.MIME_TYPE, + targetMimeType = "text/html") +public class BladeHtmlEmbeddingProvider extends EmbeddingProvider { + public static final String FILLER = " "; + public static final String TARGET_MIME_TYPE = "text/html"; //NOI18N + + @Override + public List getEmbeddings(final Snapshot snapshot) { + TokenHierarchy tokenHierarchy = snapshot.getTokenHierarchy(); + TokenSequence sequence = tokenHierarchy.tokenSequence(); + + if (sequence == null || !sequence.isValid()) { + return Collections.emptyList(); + } + sequence.moveStart(); + List embeddings = new ArrayList<>(); + + int offset = 0; + int len = 0; + + String fake; + + try { + while (sequence.moveNext()) { + Token t = sequence.token(); + offset = sequence.offset(); + TokenId id = t.id(); + len += t.length(); + String tText = t.text().toString(); + if (len == 0) { + continue; + } + if (id.equals(BladeTokenId.HTML)) { + embeddings.add(snapshot.create(offset, t.length(), TARGET_MIME_TYPE)); + } else { + fake = new String(new char[tText.length()]).replace("\0", FILLER); + embeddings.add(snapshot.create(fake, TARGET_MIME_TYPE)); + } + } + } catch (Exception ex) { + //Exceptions.printStackTrace(ex); + return Collections.emptyList(); + } + + //LOGGER.log(Level.INFO, "html ebedding finished for {0}, it took " + (System.currentTimeMillis() - startTime), snapshot.getSource().getFileObject().getName()); + + if (embeddings.isEmpty()) { + return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); + } else { + return Collections.singletonList(Embedding.create(embeddings)); + } + } + + @Override + public int getPriority() { + return 210; + } + + @Override + public void cancel() { + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java new file mode 100644 index 000000000000..d7df7529180f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenId; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; + +/** + * this will enable braces matches of html elements + * + * @author bhaidu + */ +@EmbeddingProvider.Registration( + mimeType = BladeLanguage.MIME_TYPE, + targetMimeType = "text/x-php5") +public class BladePhpEmbeddingProvider extends EmbeddingProvider { + public static final String TARGET_MIME_TYPE = "text/x-php5"; //NOI18N + + @Override + public List getEmbeddings(final Snapshot snapshot) { + TokenHierarchy tokenHierarchy = snapshot.getTokenHierarchy(); + TokenSequence sequence = tokenHierarchy.tokenSequence(); + if (sequence == null) { + return Collections.emptyList(); + } + sequence.moveStart(); + List embeddings = new ArrayList<>(); + + int offset = 0; + int len = 0; + + String fake; + + while (sequence.moveNext()) { + Token t = sequence.token(); + offset = sequence.offset(); + TokenId id = t.id(); + len += t.length(); + String tText = t.text().toString(); + if (len == 0) { + continue; + } + if (id.equals(BladeTokenId.PHP_INLINE)) { + embeddings.add(snapshot.create(offset, t.length(), TARGET_MIME_TYPE)); + } else { + fake = new String(new char[tText.length()]).replace("\0", "@"); + embeddings.add(snapshot.create(fake, TARGET_MIME_TYPE)); + } + } + + if (embeddings.isEmpty()) { + return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); + } else { + return Collections.singletonList(Embedding.create(embeddings)); + } + } + + @Override + public int getPriority() { + return 210; + } + + @Override + public void cancel() { + //TODO see html implementation + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java new file mode 100644 index 000000000000..06c29099f1f7 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.format; + +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.prefs.Preferences; +import javax.swing.SwingUtilities; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.modules.csl.api.Formatter; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.editor.indent.spi.Context; + +import org.netbeans.api.editor.document.LineDocument; +import org.netbeans.api.editor.document.LineDocumentUtils; +import org.netbeans.api.editor.settings.SimpleValueNames; +import org.netbeans.api.project.Project; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.editor.indent.spi.CodeStylePreferences; +import org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeFormatter implements Formatter { + private static final Logger LOGGER = Logger.getLogger(BladeFormatter.class.getName()); + + public BladeFormatter() { + } + + @Override + public void reformat(Context context, ParserResult compilationInfo) { + + LineDocument doc = LineDocumentUtils.as(context.document(), LineDocument.class); + if (doc == null) { + return; + } + if (context.isIndent() && !isBladeIndentEnabled(doc)) { + return; + } else if (!isBladeFormattingEnabled(doc)) { + return; + } + //todo + //check tab context + FileObject file = NbEditorUtilities.getFileObject(doc); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(file); + if (projectOwner == null) { + return; + } + + int indentSize = getIndentSize(context.document()); + + long start = System.currentTimeMillis(); + Runnable rn = new Runnable() { + @Override + public void run() { + //the text can update between reformatting + LineDocument doc = LineDocumentUtils.as(context.document(), LineDocument.class); + if (doc == null) { + return; + } + try { + String currentText = doc.getText(0, doc.getLength()); + + if (context.isIndent()) { + int lineStart = context.lineStartOffset(context.caretOffset()); + String lineText = doc.getText(lineStart, context.caretOffset() - lineStart); + if (!lineText.isEmpty() && lineText.replaceAll(" ", "").isEmpty()) { + return; + } + } + (new BladeFormatterService()).format(context, currentText, indentSize); + + } catch (BadLocationException ex) { + } + } + + }; + + //run after html indent is finished + SwingUtilities.invokeLater(rn); + if (LOGGER.isLoggable(Level.FINE)) { + long end = System.currentTimeMillis(); + LOGGER.log(Level.FINE, "Reformat took: {0} ms", (end - start)); //NOI18N + } + } + + @Override + public void reindent(Context context) { + reformat(context, null); + } + + @Override + public boolean needsParserResult() { + return false; + } + + @Override + public int indentSize() { + return 4; + } + + @Override + public int hangingIndentSize() { + return 4; + } + + static int getIndentSize(Document doc) { + Preferences prefs = CodeStylePreferences.get(doc).getPreferences(); + return prefs.getInt(SimpleValueNames.INDENT_SHIFT_WIDTH, 4); + } + + static boolean isBladeIndentEnabled(Document doc) { + Preferences prefs = CodeStylePreferences.get(doc).getPreferences(); + return prefs.getBoolean(GeneralPreferencesUtils.ENABLE_INDENTATION, false); + } + + static boolean isBladeFormattingEnabled(Document doc) { + Preferences prefs = CodeStylePreferences.get(doc).getPreferences(); + return prefs.getBoolean(GeneralPreferencesUtils.ENABLE_FORMATTING, false); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java new file mode 100644 index 000000000000..8bc9edf32a01 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java @@ -0,0 +1,278 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.format; + +import java.util.Map; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.BadLocationException; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ConsoleErrorListener; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.netbeans.modules.editor.indent.spi.Context; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterParser; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterParserBaseListener; +import org.openide.util.Exceptions; + +/** + * + * + * @author bhaidu + */ +public class BladeFormatterService { + private static final Logger LOGGER = Logger.getLogger(BladeFormatterService.class.getName()); + public final Map formattedLineIndentList = new TreeMap<>(); + boolean debugMode = false; + public boolean isIndentation; + + public void format(Context context, String text, int indentSize) { + isIndentation = context.isIndent(); + BladeAntlrFormatterLexer lexer = new BladeAntlrFormatterLexer(CharStreams.fromString(text)); + CommonTokenStream tokens = new CommonTokenStream(lexer); + BladeAntlrFormatterParser parser = new BladeAntlrFormatterParser(tokens); + parser.removeErrorListener(ConsoleErrorListener.INSTANCE); + parser.addParseListener(createFormatterListener()); + parser.setBuildParseTree(false); + parser.file(); + + final int cstart = context.startOffset(); + final int cend = context.endOffset(); + int textDelta = 0; + LOGGER.log(Level.INFO, "Starting formatting from caret {0}:\n", cstart); + + for (Map.Entry entry : formattedLineIndentList.entrySet()) { + int tstart = entry.getValue().tokenStart; + int indent = entry.getValue().indent; + int htmlIndent = entry.getValue().htmlIndent; + if (tstart < context.document().getLength()) { + int existingLineIndent = 0; + try { + existingLineIndent = context.lineIndent(tstart); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + break; + } + if (tstart > cend) { +// System.out.println("exit " + tstart + " > " + cend); +// System.out.println("line : " + entry.getKey() + " ei " + existingLineIndent); +// System.out.println("token : " + entry.getValue()); +// System.out.println("Finished formatting for caret " + cstart); + break; + } + } + + if (tstart >= cstart) { +// System.out.println("doc length : " + context.document().getLength()); +// System.out.println("delta : " + (tstart - textDelta)); + if (context.document().getLength() < (tstart - textDelta)) { + //skipping + continue; + } + +// System.out.println("line : " + entry.getKey()); +// System.out.println("token : " + entry.getValue()); +// System.out.println("indent : " + indent); +// System.out.println("htmlindent : " + htmlIndent); + try { + int lineStart_i = context.lineStartOffset(tstart - textDelta); + int originalIndent_i = context.lineIndent(lineStart_i); + int wsIndent = (indent + htmlIndent) * indentSize; +// System.out.println("linestart + offset : " + (lineStart_i + wsIndent)); + if (lineStart_i + wsIndent > context.document().getLength()) { +// System.out.println("out of range : " + (lineStart_i + wsIndent)); + break; + } + context.modifyIndent(lineStart_i, wsIndent); +// System.out.println("delta : " + (originalIndent_i - wsIndent)); +// System.out.println("===================================="); + textDelta += (originalIndent_i - wsIndent); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + break; + } + } + } + } + + private ParseTreeListener createFormatterListener() { + return new BladeAntlrFormatterParserBaseListener() { + int indent = 0; + int blockBalance = 0; + int htmlBlockBalance = 0; + int lastIncrementedLine = 0; + + @Override + public void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { + + Token start = ctx.getStart(); + blockBalance++; + if (ctx.getStop() != null && !formattedLineIndentList.containsKey(start.getLine())) { + Token endDefinition = ctx.getStop(); + //hack to indent after blade block + int offset = isIndentation ? 1 : 0; + formattedLineIndentList.put(endDefinition.getLine(), + new FormatToken(endDefinition.getStopIndex() + 1 + offset, indent+offset, htmlBlockBalance, null)); + } + indent++; + } + + @Override + public void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + indent--; + //correction + if (indent < 0) { + indent = 0; + } + if (!formattedLineIndentList.containsKey(line)) { + String debugText = debugMode ? start.getText() : null; + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, debugText)); + } else { + formattedLineIndentList.remove(line); + } + + blockBalance--; + } + + @Override + public void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { + Token start = ctx.getStart(); + blockBalance++; + if (ctx.getStop() != null && !formattedLineIndentList.containsKey(start.getLine())) { + Token rArgParent = ctx.getStop(); + String debugText = debugMode ? rArgParent.getText() : null; + formattedLineIndentList.put(rArgParent.getLine(), new FormatToken(rArgParent.getStopIndex() + 1, indent, htmlBlockBalance, debugText)); + indent++; + } + } + + @Override + public void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + indent--; + if (indent < 0) { + indent = 0; + } + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } else { + formattedLineIndentList.remove(line); + } + //correction + if (indent < 0) { + indent = 0; + } + blockBalance--; + } + + @Override + public void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + } + } + + @Override + public void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { + if (ctx.WS().isEmpty()) { + return; + } + + Token start = ctx.WS(0).getSymbol(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, "ws")); + } + } + + @Override + public void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { + + Token start = ctx.getStart(); + int line = start.getLine(); + if (line > 0 && lastIncrementedLine != line){ + if (htmlBlockBalance > 0) { + htmlBlockBalance--; + } else { + htmlBlockBalance = 0; + } + lastIncrementedLine = line; + } + if (!formattedLineIndentList.containsKey(line)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + } + + @Override + public void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + htmlBlockBalance++; + } + } + + @Override + public void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + } + } + + @Override + public void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + String debugText = debugMode ? start.getText() : null; + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, debugText)); + } + htmlBlockBalance++; + } + + @Override + public void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent - 1, htmlBlockBalance, start.getText())); + } + } + } + }; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java new file mode 100644 index 000000000000..2503109a0c8a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.format; + +/** + * + * @author bhaidu + */ +public class FormatToken { + + public int tokenStart; + public int indent; + public int htmlIndent; + //for directive + public String directive; + + public FormatToken(int tokenStart, int indent, String directive) { + this.tokenStart = tokenStart; + this.indent = indent; + this.directive = directive; + } + + public FormatToken(int tokenStart, int indent, int htmlIndent, String directive) { + this.tokenStart = tokenStart; + this.indent = indent; + this.directive = directive; + this.htmlIndent = htmlIndent; + } + + @Override + public String toString() { + return this.directive + ", " + this.indent * 4 + ", " + this.tokenStart; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java new file mode 100644 index 000000000000..3f8640b1b1db --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java @@ -0,0 +1,65 @@ +package org.netbeans.modules.php.blade.editor.highlighting; + +import javax.swing.text.AbstractDocument; +import javax.swing.text.AttributeSet; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.spi.editor.highlighting.HighlightsSequence; +import org.netbeans.spi.editor.highlighting.support.AbstractHighlightsContainer; + + +/** + * + * hack to fix the highlighting issue on javascript properties vs blade paths + * "@include('my.path') - my.path should be fully selected on double click + * window.test - should not be fully selected on double click + * + * @author bhaidu + */ +public class BladeHighlightsContainer extends AbstractHighlightsContainer { + + private final AbstractDocument doc; + AttributeSet attrs = null; + private static int offset = 0; + + public BladeHighlightsContainer(AbstractDocument doc) { + this.doc = doc; + } + + public @Override + HighlightsSequence getHighlights(final int startOffset, final int endOffset) { + return new HighlightsSequence() { + int start, end; + final int scanStart; + + { + scanStart = doc.getParagraphElement(startOffset).getStartOffset(); + if (offset != scanStart){ + offset = scanStart; + //reset the hasQuote flag from isIdentifierChar + BladeLanguage.hasQuote = false; + } + } + + public @Override + boolean moveNext() { + + return false; + } + + public @Override + int getStartOffset() { + return start; + } + + public @Override + int getEndOffset() { + return end; + } + + public @Override + AttributeSet getAttributes() { + return attrs; + } + }; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java new file mode 100644 index 000000000000..b81d5b06d98f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java @@ -0,0 +1,27 @@ +package org.netbeans.modules.php.blade.editor.highlighting; + +import javax.swing.text.AbstractDocument; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.spi.editor.highlighting.HighlightsLayer; + +import org.netbeans.spi.editor.highlighting.HighlightsLayerFactory; +import org.netbeans.spi.editor.highlighting.ZOrder; + + +/** + * hack to fix the highlighting issue on javascript properties vs blade paths + * "@include('my.path') - my.path should be fully selected on double click + * window.test - should not be fully selected on double click + * + * @author bhaidu + */ +@MimeRegistration(service=HighlightsLayerFactory.class, mimeType=BladeLanguage.MIME_TYPE, position=200) +public class BladeHighlightsLayerFactory implements HighlightsLayerFactory { + + public @Override HighlightsLayer[] createLayers(final Context context) { + return new HighlightsLayer[] {HighlightsLayer.create("blade", ZOrder.SYNTAX_RACK.forPosition(10), true, + new BladeHighlightsContainer((AbstractDocument) context.getDocument()))}; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java new file mode 100644 index 000000000000..e3e1117c2e9f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.hints; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.swing.text.BadLocationException; +import org.netbeans.api.editor.document.EditorDocumentUtils; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.Error; +import org.netbeans.modules.csl.api.Hint; +import org.netbeans.modules.csl.api.HintSeverity; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.Rule; +import org.netbeans.modules.csl.api.Rule.ErrorRule; +import org.netbeans.modules.csl.api.RuleContext; +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeHintsProvider implements HintsProvider { + + /** + * Compute hints applicable to the given compilation info and add to the + * given result list. + * + * @param manager + * @param context + * @param hints + */ + @Override + public void computeHints(HintsManager manager, RuleContext context, List hints) { + if (!(context.parserResult instanceof BladeParserResult)) { + return; + } + Map> allHints = manager.getHints(false, context); + List directiveHints = allHints.get("blade.option.directive.hints"); + + BladeParserResult parserResult = (BladeParserResult) context.parserResult; + FileObject fo = EditorDocumentUtils.getFileObject(context.doc); + Project project = ProjectUtils.getMainOwner(fo); + CustomDirectives ct = CustomDirectives.getInstance(project); + + if (directiveHints != null) { + for (Rule.AstRule astRule : directiveHints) { + if (!manager.isEnabled(astRule)) { + continue; + } + if (astRule instanceof UnknownDirective) { + for (Map.Entry entry : parserResult.customDirectivesReferences.entrySet()) { + if (entry.getValue().type == BladeParserResult.ReferenceType.POSSIBLE_DIRECTIVE) { + continue; + } + + if (ct.customDirectiveConfigured(entry.getValue().identifier)) { + continue; + } + hints.add(new Hint(astRule, + "Unknown directive. Try adding the provider class file using Project -> Properties -> Custom Directives", + context.parserResult.getSnapshot().getSource().getFileObject(), + entry.getKey(), + Collections.emptyList(), + 10)); + } + } + } + } + + //validate path config + for (Map.Entry> entry : parserResult.includeBladeOccurences.entrySet()) { + FileObject realFile = BladePathUtils.findFileObjectForBladeViewPath(parserResult.getFileObject(), + entry.getKey()); + if (realFile != null) { + continue; + } + for (OffsetRange range : entry.getValue()) { + OffsetRange hintRange = new OffsetRange(range.getStart(), range.getEnd() + 1); + hints.add(new Hint(new BladeRule(HintSeverity.WARNING), + "Blade path not found.\nFor custom blade context you can try to set the root folder using:\nProject -> Properties -> Laravel Blade -> Views Folder", + context.parserResult.getSnapshot().getSource().getFileObject(), + hintRange, + Collections.emptyList(), + 10)); + } + } + + } + + /** + * Compute any suggestions applicable to the given caret offset, and add to + * the given suggestion list. + */ + @Override + public void computeSuggestions(HintsManager manager, RuleContext context, List suggestions, int caretOffset) { + } + + /** + * Compute any suggestions applicable to the given caret offset, and add to + * the given suggestion list. + */ + @Override + public void computeSelectionHints(HintsManager manager, RuleContext context, List suggestions, int start, int end) { + } + + /** + * Process the errors for the given compilation info, and add errors and + * warning descriptions into the provided hint list. Return any errors that + * were not added as error descriptions (e.g. had no applicable error rule) + */ + @Override + public void computeErrors(HintsManager manager, RuleContext context, List hints, List unhandled) { + BladeParserResult parserResult = (BladeParserResult) context.parserResult; + + unhandled.addAll(parserResult.getDiagnostics()); + } + + /** + * Cancel in-progress processing of hints. + */ + @Override + public void cancel() { + //todo implement + } + + /** + *

+ * Optional builtin Rules. Typically you don't use this; you register your + * rules in your filesystem layer in the gsf-hints/mimetype1/mimetype2 + * folder, for example gsf-hints/text/x-ruby/. Error hints should go in the + * "errors" folder, selection hints should go in the "selection" folder, and + * all other hints should go in the "hints" folder (but note that you can + * create localized folders and organize them under hints; these categories + * are shown in the hints options panel. Hints returned from this method + * will be placed in the "general" folder. + *

+ *

+ * This method is primarily intended for rules that should be added + * dynamically, for example for Rules that have a many different flavors yet + * a single implementation class (such as JavaScript's StrictWarning rule + * which wraps a number of builtin parser warnings.) + * + * @return A list of rules that are builtin, or null or an empty list when + * there are no builtins + */ + @Override + public List getBuiltinRules() { + return null; + } + + /** + * Create a RuleContext object specific to this HintsProvider. This lets + * implementations of this interface created subclasses of the RuleContext + * that can be passed around to all the executed rules. + * + * @return A new instance of a RuleContext object + */ + @Override + public RuleContext createRuleContext() { + return new BladeRuleContext(); + } + + private static final class BladeRule implements ErrorRule { + + private final HintSeverity severity; + + private BladeRule(HintSeverity severity) { + this.severity = severity; + } + + @Override + public Set getCodes() { + return Collections.emptySet(); + } + + @Override + public boolean appliesTo(RuleContext context) { + return true; + } + + @Override + public String getDisplayName() { + return "blade"; //NOI18N + } + + @Override + public boolean showInTasklist() { + return true; + } + + @Override + public HintSeverity getDefaultSeverity() { + return severity; + } + } + + public class BladeRuleContext extends RuleContext { + + private BladeParserResult bladeParserResult = null; + + public BladeParserResult getJsParserResult() { + if (bladeParserResult == null) { + bladeParserResult = (BladeParserResult) parserResult; + } + return bladeParserResult; + } + + public boolean isCancelled() { + return false; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java new file mode 100644 index 000000000000..57b23a072f74 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.hints; + +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.util.NbBundle; + +/** + * + * @author bogdan + */ +public class HintsControllerFactory { + + public HintsControllerFactory() { + } + + @OptionsPanelController.SubRegistration( + id = "BladeHints", + location = "Blade/Hints", + displayName = "#HintsControllerFactory.name" + ) + @NbBundle.Messages("HintsControllerFactory.name=Blade Hints") + public static OptionsPanelController createOptions() { + HintsProvider.HintsManager manager = HintsProvider.HintsManager.getManagerForMimeType(BladeLanguage.MIME_TYPE); + assert manager != null; + + return manager.getOptionsController(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java new file mode 100644 index 000000000000..7bb522aa035d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.hints; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.prefs.Preferences; +import javax.swing.JComponent; +import javax.swing.text.BadLocationException; +import org.netbeans.modules.csl.api.Hint; +import org.netbeans.modules.csl.api.HintSeverity; +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.csl.api.Rule; +import org.netbeans.modules.csl.api.RuleContext; + +/** + * + * @author bogdan + */ +public class UnknownDirective implements Rule.AstRule { + + public void computeHints(RuleContext context, List hints, int offset, HintsProvider.HintsManager manager) throws BadLocationException { + + } + + @Override + public boolean getDefaultEnabled() { + return true; + } + + @Override + public JComponent getCustomizer(Preferences node) { + return null; + } + + @Override + public boolean appliesTo(RuleContext context) { + return context instanceof BladeHintsProvider.BladeRuleContext; + } + + @Override + public boolean showInTasklist() { + return true; + } + + @Override + public HintSeverity getDefaultSeverity() { + return HintSeverity.WARNING; + } + + @Override + public Set getKinds() { + return Collections.singleton("blade.option.directive.hints"); + } + + @Override + public String getId() { + return "blade.hint.unknown_directive"; + } + + @Override + public String getDescription() { + return "Unknown Directive. The directive my not be in the base laravel blade compiler and was not found in the custom list."; + } + + @Override + public String getDisplayName() { + return "Unknown Directive"; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java new file mode 100644 index 000000000000..d9db8d33a07f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java @@ -0,0 +1,307 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.concurrent.ExecutionException; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ui.OpenProjects; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.parsing.spi.indexing.support.IndexResult; +import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +public class BladeIndex { + + private final QuerySupport querySupport; + private static final Map INDEXES = new WeakHashMap<>(); + private static boolean areProjectsOpen = false; + + private BladeIndex(QuerySupport querySupport) throws IOException { + this.querySupport = querySupport; + } + + public QuerySupport getQuerySupport() { + return querySupport; + } + + public static BladeIndex get(Project project) throws IOException { + if (project == null) { + return null; + } + synchronized (INDEXES) { + BladeIndex index = INDEXES.get(project); + if (index == null) { + if (!areProjectsOpen) { + try { + // just be sure that the projects are open + OpenProjects.getDefault().openProjects().get(); + } catch (InterruptedException | ExecutionException ex) { + Exceptions.printStackTrace(ex); + } finally { + areProjectsOpen = true; + } + } + Collection sourceRoots = QuerySupport.findRoots(project, + null /* all source roots */, + Collections.emptyList(), + Collections.emptyList()); + QuerySupport querySupport = QuerySupport.forRoots(BladeIndexer.Factory.NAME, BladeIndexer.Factory.VERSION, sourceRoots.toArray(new FileObject[]{})); + index = new BladeIndex(querySupport); + if (!sourceRoots.isEmpty()) { + INDEXES.put(project, index); + } + } + return index; + } + } + + public List queryYieldIds(String prefix) { + return queryIndexedReferenceId(prefix, BladeIndexer.YIELD_ID); + } + + public List queryStacksIndexedReferences(String prefix) { + return queryIndexedReferenceId(prefix, BladeIndexer.STACK_ID); + } + + private List queryIndexedReferenceId(String prefix, String indexKey) { + List indexedReferences = new ArrayList<>(); + + try { + Collection result = querySupport.query(indexKey, prefix, QuerySupport.Kind.PREFIX, indexKey); + + if (result == null || result.isEmpty()) { + return indexedReferences; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(indexKey); + for (String value : values) { + if (value.startsWith(prefix)) { + indexedReferences.add(new IndexedReferenceId(value, indexResult.getFile())); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + return indexedReferences; + } + + public List queryYieldIndexedReferences(String prefix) { + return queryIndexedReferences(prefix, + BladeIndexer.YIELD_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractYieldDataFromIndex(value); + } + } + ); + } + + public List queryStacksIdsReference(String prefix) { + return queryIndexedReferences(prefix, + BladeIndexer.STACK_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractStackDataFromIndex(value); + } + } + ); + } + + private List queryIndexedReferences(String prefix, String indexKey, IndexReferenceCallback callback) { + List references = new ArrayList<>(); + try { + Collection result = querySupport.query(indexKey, + prefix, QuerySupport.Kind.PREFIX, indexKey); + + if (result == null || result.isEmpty()) { + return references; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(indexKey); + for (String value : values) { + if (value.startsWith(prefix)) { + references.add(new IndexedReference(callback.createIndexReference(value), indexResult.getFile())); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + return references; + } + + public List findYieldIndexedReferences(String prefix) { + return findIndexedReferences(prefix, + BladeIndexer.YIELD_ID, + new String[]{BladeIndexer.YIELD_ID, BladeIndexer.YIELD_REFERENCE}, + BladeIndexer.YIELD_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractYieldDataFromIndex(value); + } + } + ); + } + + private List findIndexedReferences(String prefix, + String indexKey, String[] valuesKeys, String valueKey, + IndexReferenceCallback callback) { + List references = new ArrayList<>(); + try { + Collection result = querySupport.query(indexKey, + prefix, QuerySupport.Kind.EXACT, valuesKeys); + + if (result == null || result.isEmpty()) { + return references; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(valueKey); + for (String value : values) { + String name = BladeIndexer.getIdFromSignature(value); + if (name != null && name.equals(prefix)) { + references.add( + new IndexedReference(callback.createIndexReference(value), + indexResult.getFile())); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + return references; + } + + public List getIncludePaths(String prefix) { + List references = new ArrayList<>(); + Collection result; + try { + result = querySupport.query(BladeIndexer.INCLUDE_PATH, prefix, QuerySupport.Kind.PREFIX, BladeIndexer.INCLUDE_PATH); + + if (result == null || result.isEmpty()) { + return references; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(BladeIndexer.INCLUDE_PATH); + for (String value : values) { + Reference templatePathRef = BladeIndexer.extractTemplatePathDataFromIndex(value); + if (!templatePathRef.identifier.equals(prefix)) { + continue; + } + references.add(new IndexedOffsetReference(templatePathRef.identifier, indexResult.getFile(), templatePathRef.defOffset)); + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return references; + } + + public static interface IndexReferenceCallback { + + public Reference createIndexReference(String value); + } + + public static class IndexedReferenceId { + + private final String identifier; + private final FileObject originFile; + + public IndexedReferenceId(String identifier, FileObject originFile) { + this.identifier = identifier; + this.originFile = originFile; + } + + public String getIdenfiier() { + return this.identifier; + } + + public FileObject getOriginFile() { + return this.originFile; + } + } + + public static class IndexedReference { + + private final Reference reference; + private final FileObject originFile; + + public IndexedReference(Reference reference, FileObject originFile) { + this.reference = reference; + this.originFile = originFile; + } + + public Reference getReference() { + return this.reference; + } + + public FileObject getOriginFile() { + return this.originFile; + } + } + + public static class IndexedOffsetReference { + + private final String identifier; + private final FileObject originFile; + private final OffsetRange range; + + public IndexedOffsetReference(String identifier, + FileObject originFile, OffsetRange range) { + this.identifier = identifier; + this.originFile = originFile; + this.range = range; + } + + public String getReference() { + return this.identifier; + } + + public FileObject getOriginFile() { + return this.originFile; + } + + public int getStart() { + return this.range.getStart(); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java new file mode 100644 index 000000000000..d7f9f5d5a32d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java @@ -0,0 +1,295 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.parsing.spi.indexing.Context; +import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexer; +import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory; +import org.netbeans.modules.parsing.spi.indexing.Indexable; +import org.netbeans.modules.parsing.spi.indexing.support.IndexingSupport; +import org.netbeans.modules.parsing.spi.indexing.support.IndexDocument; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * move to language EmbeddingIndexerFactory getIndexerFactory ? + * + * @author bhaidu + */ +public class BladeIndexer extends EmbeddingIndexer { + + private static final Logger LOGGER = Logger.getLogger(BladeIndexer.class.getSimpleName()); + public static final String BLADE_INDEXED = "indexed"; //NOI18N + public static final String YIELD_REFERENCE = "yield"; //NOI18N + public static final String YIELD_ID = "yieldid"; //NOI18N + public static final String STACK_REFERENCE = "stack"; //NOI18N + public static final String STACK_ID = "stackid"; //NOI18N + public static final String INCLUDE_PATH = "include"; //NOI18N + public static final String BLADE_PATH = "path"; //NOI18N + public static final String INFO_SEPARATOR = "#"; //NOI18N + + @Override + protected void index(Indexable indxbl, Parser.Result result, Context context) { + long startTime = System.currentTimeMillis(); + LOGGER.log(Level.INFO, "Indexer requested {0}", context.getIndexFolder().getName()); + BladeParserResult parserResult; + if (result instanceof BladeParserResult) { + parserResult = (BladeParserResult) result; + } else { + return; + } + + //we have errors + if (!parserResult.getDiagnostics().isEmpty()) { + return; + } + // LOGGER.log(Level.INFO, "indexing {0}", result.getSnapshot().getSource().getFileObject().getName()); + try { + IndexingSupport support = IndexingSupport.getInstance(context); + // we need to remove old documents (document per object, not file) + support.removeDocuments(indxbl); + IndexDocument document = support.createDocument(indxbl); + + if (!parserResult.getYieldReferences().isEmpty()) { + storeYieldReferences(parserResult.getYieldReferences(), document); + } + + if (!parserResult.getStackReferences().isEmpty()) { + storeStackReferences(parserResult.getStackReferences(), document); + } + + if (!parserResult.includeBladeOccurences.isEmpty()) { + storeIncludePathReferences(parserResult.includeBladeOccurences, document); + } + + storeFilePathAsBladePath(parserResult.getSnapshot().getSource().getFileObject(), document); + + document.addPair(BLADE_INDEXED, Boolean.TRUE.toString(), true, true); + + support.addDocument(document); + LOGGER.log(Level.INFO, "Indexer finished {0}", System.currentTimeMillis() - startTime); + } catch (IOException ex) { + LOGGER.log(Level.WARNING, null, ex); + Exceptions.printStackTrace(ex); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + } + + private void storeYieldReferences(Map yields, IndexDocument document) { + + for (Map.Entry entry : yields.entrySet()) { + StringBuilder sb = new StringBuilder(); + Reference ref = entry.getValue(); + //used for completion + document.addPair(YIELD_ID, entry.getKey(), true, true); + sb.append(entry.getKey()).append(INFO_SEPARATOR).append(ref.defOffset.getStart()).append(";").append(ref.defOffset.getEnd()); //NOI18N + //used for declaration finder + document.addPair(YIELD_REFERENCE, sb.toString(), true, true); + } + } + + private void storeStackReferences(Map stacks, IndexDocument document) { + + for (Map.Entry entry : stacks.entrySet()) { + StringBuilder sb = new StringBuilder(); + Reference ref = entry.getValue(); + //used for completion + document.addPair(STACK_ID, entry.getKey(), true, true); + //do we need end ?? + sb.append(entry.getKey()).append(INFO_SEPARATOR).append(ref.defOffset.getStart()).append(";").append(ref.defOffset.getEnd()); //NOI18N + //used for declaration finder + document.addPair(STACK_REFERENCE, sb.toString(), true, true); + } + } + + private void storeFilePathAsBladePath(FileObject fo, IndexDocument document) { + Project project = ProjectUtils.getMainOwner(fo); + if (project == null) { + return; + } + List roots = BladePathUtils.getCustomViewsRoots(project, fo); + String filePath = fo.getPath(); + + for (FileObject root : roots) { + String rootPath = root.getPath(); + if (filePath.startsWith(rootPath)) { + String bladeFormatPath = BladePathUtils.toBladeViewPath(filePath.replace(rootPath, "")); + if (bladeFormatPath.startsWith(".")) { + bladeFormatPath = bladeFormatPath.substring(1, bladeFormatPath.length()); + } + document.addPair(BLADE_PATH, bladeFormatPath, true, true); + } + } + } + + public static Reference extractYieldDataFromIndex(String index) { + String[] mainElements = index.split(INFO_SEPARATOR); + + if (mainElements.length == 0) { + return null; + } + + String name = mainElements[0]; + String offsets[] = mainElements[1].split(";"); + int start = 0; + int end = 1; + + if (offsets.length > 0) { + start = Integer.parseInt(offsets[0]); + end = Integer.parseInt(offsets[1]); + } + + return new Reference(ReferenceType.YIELD, name, new OffsetRange(start, end)); + } + + public static Reference extractStackDataFromIndex(String index) { + String[] mainElements = index.split(INFO_SEPARATOR); + + if (mainElements.length == 0) { + return null; + } + + String name = mainElements[0]; + String offsets[] = mainElements[1].split(";"); + int start = 0; + int end = 1; + + if (offsets.length > 0) { + start = Integer.parseInt(offsets[0]); + end = Integer.parseInt(offsets[1]); + } + + return new Reference(ReferenceType.STACK, name, new OffsetRange(start, end)); + } + + public static Reference extractTemplatePathDataFromIndex(String indexInfo) { + String[] mainElements = indexInfo.split(INFO_SEPARATOR); + + if (mainElements.length == 0) { + return null; + } + + String name = mainElements[0]; + String offsets[] = mainElements[1].split(";"); + int start = 0; + int end = 1; + + if (offsets.length > 0) { + start = Integer.parseInt(offsets[0]); + end = start + name.length(); + } + + return new Reference(ReferenceType.TEMPLATE_PATH, name, new OffsetRange(start, end)); + } + + public static String getIdFromSignature(String value) { + String[] mainElements = value.split(INFO_SEPARATOR); + if (mainElements.length == 0) { + return null; + } + + return mainElements[0]; + } + + private void storeIncludePathReferences(Map> includes, IndexDocument document) { + for (Map.Entry> entry : includes.entrySet()) { + StringBuilder sb = new StringBuilder(); + + sb.append(entry.getKey()).append(INFO_SEPARATOR); + for (OffsetRange range : entry.getValue()) { + sb.append(range.getStart()); //NOI18N + sb.append(";");//NOI18N + } + + document.addPair(INCLUDE_PATH, sb.toString(), true, true); + } + } + + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = EmbeddingIndexerFactory.class, position = 500) //NOI18N + public static class Factory extends EmbeddingIndexerFactory { + + public static final String NAME = "blade"; //NOI18N + public static final int VERSION = 2; + + @Override + public EmbeddingIndexer createIndexer(Indexable indxbl, Snapshot snapshot) { + if (isIndexable(snapshot)) { + return new BladeIndexer(); + } else { + return null; + } + } + + @Override + public void filesDeleted(Iterable deleted, Context context) { + try { + IndexingSupport is = IndexingSupport.getInstance(context); + for (Indexable i : deleted) { + is.removeDocuments(i); + } + } catch (IOException ioe) { + LOGGER.log(Level.WARNING, null, ioe); + } + } + + @Override + public void filesDirty(Iterable dirty, org.netbeans.modules.parsing.spi.indexing.Context context) { + try { + IndexingSupport is = IndexingSupport.getInstance(context); + for (Indexable i : dirty) { + is.markDirtyDocuments(i); + } + } catch (IOException ioe) { + LOGGER.log(Level.WARNING, null, ioe); + } + } + + @Override + public String getIndexerName() { + return NAME; + } + + @Override + public int getIndexVersion() { + return VERSION; + } + + private boolean isIndexable(Snapshot snapshot) { + return BladeLanguage.MIME_TYPE.equals(snapshot.getMimeType()); + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java new file mode 100644 index 000000000000..701b1c268db6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.File; +import java.util.Enumeration; +import org.netbeans.api.project.Project; +import org.netbeans.modules.parsing.api.indexing.IndexingManager; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bogdan + */ +public class IndexManager { + + public static void reindexProjectViews(Project project) { + assert project != null; + String[] views = BladeProjectProperties.getInstance(project).getViewsPathList(); + + if (views.length > 0) { + for (String view : views) { + if (view.length() == 0) { + continue; + } + File viewPath = new File(view); + if (viewPath.exists()) { + FileObject fileObj = FileUtil.toFileObject(viewPath); + Enumeration children = fileObj.getChildren(true); + while (children.hasMoreElements()) { + FileObject file = children.nextElement(); + if (file.isFolder()) { + continue; + } + IndexingManager.getDefault().refreshAllIndices(file); + } + } + } + } else { + //falback + String projectDir = project.getProjectDirectory().getPath(); + File viewPath = new File(projectDir + "/views"); + if (viewPath.exists()) { + FileObject fileObj = FileUtil.toFileObject(viewPath); + Enumeration children = fileObj.getChildren(true); + while (children.hasMoreElements()) { + FileObject file = children.nextElement(); + IndexingManager.getDefault().refreshAllIndices(file); + } + } + } + } + + public static void reindexFolder(File viewPath) { + FileObject fileObj = FileUtil.toFileObject(viewPath); + Enumeration children = fileObj.getChildren(true); + while (children.hasMoreElements()) { + FileObject file = children.nextElement(); + if (file.isFolder()) { + continue; + } + IndexingManager.getDefault().refreshAllIndices(file); + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java new file mode 100644 index 000000000000..439b3bad1f33 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.util.List; +import org.netbeans.modules.csl.api.OffsetRange; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpIndexFunctionResult extends PhpIndexResult { + + protected final List params; + protected final String classNamespace; + + public PhpIndexFunctionResult(String name, FileObject fo, + PhpIndexFunctionResult.Type type, + OffsetRange range, String classNamespace, List params) { + super(name, fo, type, range); + this.params = params; + this.classNamespace = classNamespace; + } + + public String getParamsAsString() { + if (params == null || params.isEmpty()){ + return "()"; + } + return "(" + String.join(", ", params) + ")"; + } + + public List getParams(){ + return params; + } + + public String getClassNamespace(){ + return classNamespace; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java new file mode 100644 index 000000000000..7db56cacdf88 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import org.netbeans.modules.csl.api.OffsetRange; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpIndexResult { + public static enum Type{ + CLASS, + FUNCTION, + NAMESPACE, + CONSTANT + }; + + public String name; + public String namespace; + public FileObject declarationFile; + public PhpIndexResult.Type type; + public OffsetRange range; + + public PhpIndexResult(String name, FileObject fo, + PhpIndexResult.Type type, + OffsetRange range){ + this.name = name; + this.declarationFile = fo; + this.type = type; + this.range = range; + } + + public PhpIndexResult(String name, String qualifiedName, FileObject fo, + PhpIndexResult.Type type, + OffsetRange range){ + this.name = name; + this.namespace = qualifiedName; + this.declarationFile = fo; + this.type = type; + this.range = range; + } + + public int getStartOffset(){ + return this.range.getStart(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java new file mode 100644 index 000000000000..9513b7f7da95 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -0,0 +1,812 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.parsing.spi.indexing.support.IndexResult; +import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.editor.cache.QueryCache; +import org.netbeans.modules.php.editor.api.QuerySupportFactory; +import org.netbeans.modules.php.editor.index.PHPIndexer; +import org.netbeans.modules.php.editor.index.Signature; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * TODO needs simplification & refactor + * + * @author bhaidu + */ +public class PhpIndexUtils { + + private final static QueryCache> cache = new QueryCache(); + private final static QueryCache> functionCache = new QueryCache(); + + private static final Map QUERY_SUPPORT_INSTANCES = new WeakHashMap<>(); + + /** + * class query without namespace + * + * @param fo + * @param prefix + * @return + */ + public static Collection queryClass(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + + QueryCache> selfCache = getCache(fo, prefix); + if (selfCache != null && selfCache.containsKey(prefix)) { + return selfCache.get(prefix).get(); + } + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, + queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_CLASS,}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); + for (String value : values) { + Signature sig = Signature.get(value); + String fullName = sig.string(1); + String namespace = sig.string(4); + + if (fullName.length() > 0 && fullName.startsWith(prefix)) { + results.add(new PhpIndexResult(fullName, namespace, + indexFile, + PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + if (selfCache != null && !results.isEmpty()) { + selfCache.put(prefix, results); + } + return results; + } + + public static Collection queryNamespaceClassesName(String prefix, + String namespace, FileObject fo) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace("\\", "\\\\") + ";.*"; + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_CLASS, queryPrefix, QuerySupport.Kind.REGEXP, new String[]{ + PHPIndexer.FIELD_CLASS, PHPIndexer.FIELD_FIELD}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); + //should use this approach on methods + //String[] fields = indexResult.getValues(PHPIndexer.FIELD_FIELD); + for (String value : values) { + Signature sig = Signature.get(value); + String fullName = sig.string(1); + String classNamespace = sig.string(4); + if (fullName.length() > 0 + && classNamespace.length() > 0 + && classNamespace.startsWith(namespace)) { + results.add(new PhpIndexResult(fullName, + classNamespace + "\\" + fullName, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactNamespaceClasses(String identifier, + String namespace, FileObject fo) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, + new String[]{ + PHPIndexer.FIELD_NAMESPACE + }); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + if (!indexFile.getName().equals(identifier)){ + continue; + } + + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + + if (namespaceValue == null){ + continue; + } + + results.add(new PhpIndexResult(namespace + "\\" + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryComponentClass(String identifier, + String namespace, FileObject fo) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, + new String[]{ + PHPIndexer.FIELD_NAMESPACE + }); + for (IndexResult indexResult : indexResults) { + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + if (namespaceValue == null){ + continue; + } + Signature sig = Signature.get(namespaceValue); + String name = sig.string(1); + String domainName = sig.string(2); + FileObject indexFile = indexResult.getFile(); + if (indexFile.getName().equals(identifier)) { + results.add(new PhpIndexResult(domainName + "\\" + name + "\\" + indexFile.getName(), + indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactClass(FileObject fo, String identifier) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + QueryCache> selfCache = getCache(fo, identifier); + if (selfCache != null && selfCache.containsKey(identifier)) { + return selfCache.get(identifier).get(); + } + Collection results = new ArrayList<>(); + String queryPrefix = identifier.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, + queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + if (name.length() > 0 && name.equals(identifier)) { + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + if (selfCache != null && !results.isEmpty()) { + selfCache.put(identifier, results); + } + return results; + } + + public static Collection queryFunctions(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_BASE, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_BASE}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_BASE); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(prefix)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult( + name, indexFile, + PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + null, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactFunctions(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + QueryCache> selfCache = getFunctionCache(fo, prefix); + if (selfCache != null && selfCache.containsKey(prefix)) { + return selfCache.get(prefix).get(); + } + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_BASE, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_BASE}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_BASE); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult(name, + indexFile, PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + null, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + if (selfCache != null && !results.isEmpty()) { + selfCache.put(prefix, results); + } + return results; + } + + //should query the class before? + public static Collection queryExactClassMethods(FileObject fo, + String method, String className, String queryNamespace) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + //for the moment a quick hack + //maybe send the classNamePath directly? + String regexQuery = className.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, regexQuery, + QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CLASS, PHPIndexer.FIELD_METHOD}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + String[] classValues = indexResult.getValues(PHPIndexer.FIELD_CLASS); + + Signature classSignature = null; + String classNamespace = null; + + for (String classValue : classValues) { + Signature sig = Signature.get(classValue); + String name = sig.string(1); + String namespace = sig.string(4); + if (name.length() > 0 && name.equals(className) + ) { + if (queryNamespace != null && !namespace.equals(queryNamespace)){ + continue; + } + classSignature = sig; + + if (namespace.length() > 0){ + classNamespace = namespace + "\\" + className; + } + } + } + + if (classSignature == null){ + continue; + } + + String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(method)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult(name, + indexFile, PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + classNamespace, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + /** + * + * + * @param fo + * @param method + * @param className + * @param queryNamespace + * @return + */ + public static Collection queryClassMethods(FileObject fo, + String method, String className, String queryNamespace) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + + if (queryNamespace != null && queryNamespace.length() > 3){ + int startOffset = queryNamespace.startsWith("\\") ? 1 : 0; + int endOffset = queryNamespace.endsWith("\\") ? 1 : 0; + queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); + } + //should query the class befoe + //for the moment a quick hack + //maybe send the classNamePath directly? + String regexQuery = className.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, regexQuery, + QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CLASS, PHPIndexer.FIELD_METHOD}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String[] classValues = indexResult.getValues(PHPIndexer.FIELD_CLASS); + + Signature classSignature = null; + String classNamespace = null; + + for (String classValue : classValues) { + Signature sig = Signature.get(classValue); + String name = sig.string(1); + if (name.length() > 0 && name.equals(className)) { + classSignature = sig; + String namespace = sig.string(4); + + if (queryNamespace != null && !namespace.equals(queryNamespace) ){ + classSignature = null; + continue; + } + + if (namespace.length() > 0){ + classNamespace = namespace + "\\" + className; + } + } + } + + if (classSignature == null){ + continue; + } + + String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(method)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult(name, + indexFile, PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + classNamespace, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryConstants(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CONST}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryNamespace(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + Collection namespaces = new ArrayList<>(); + //subfolders with lowercase ; rootFolder + //third signature namespace + //the first el is the folder + String originalPrefix = prefix; + + if (prefix.endsWith("\\\\")) { + return results; + } + + String[] queryItems = prefix.split("\\\\"); + + if (queryItems.length == 0) { + return results; + } + + String queryPrefix = prefix.toLowerCase(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix + "\\", QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String topFieldValue = indexResult.getValue(PHPIndexer.FIELD_TOP_LEVEL); + //internal php index + if (topFieldValue.startsWith(prefix.toLowerCase())) { + String firstValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + if (firstValue == null || firstValue.isEmpty()) { + continue; + } + Signature sig = Signature.get(firstValue); + + String name = sig.string(1); + String namespace = sig.string(2); + + String fullNamespace = ""; + + if (!namespace.isEmpty()) { + fullNamespace = namespace + "\\"; + } + + fullNamespace += name; + + //just one namespace is enough + if (fullNamespace.startsWith(originalPrefix) && !namespaces.contains(fullNamespace)) { + namespaces.add(fullNamespace); + results.add(new PhpIndexResult(fullNamespace, indexFile, PhpIndexResult.Type.NAMESPACE, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryNamespaces(FileObject fo, String namespace, + QuerySupport.Kind queryType) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = namespace.toLowerCase(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, + new String[]{ + PHPIndexer.FIELD_NAMESPACE, + PHPIndexer.FIELD_TOP_LEVEL + }); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + //no namespace found + if (namespaceValue == null){ + continue; + } + results.add(new PhpIndexResult(namespaceValue, indexFile, PhpIndexResult.Type.NAMESPACE, new OffsetRange(0, 1))); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + /** + * a optimized hack solution + * assuming that the name of the class is the same with the file + * + * @param fo + * @param namespace + * @return + */ + public static Collection queryAllNamespaceClasses(FileObject fo, String namespace) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = namespace.toLowerCase(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.EXACT, + new String[]{ + PHPIndexer.FIELD_NAMESPACE, + PHPIndexer.FIELD_TOP_LEVEL + }); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + //no namespace found + if (namespaceValue == null){ + continue; + } + results.add(new PhpIndexResult(indexFile.getName(), indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryClassConstants(FileObject fo, String prefix, String ownerClass) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_CLASS_CONST, PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); + if (classOwnerName == null || !classOwnerName.startsWith(ownerClass.toLowerCase())) { + continue; + } + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + /** + * @notused TO BE continued + * + * @param fo + * @param prefix + * @param ownerClass + * @return + */ + public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass){ + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_FIELD, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_FIELD, PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); + if (classOwnerName == null || !classOwnerName.startsWith(ownerClass.toLowerCase() + ";")) { + continue; + } + String[] values = indexResult.getValues(PHPIndexer.FIELD_FIELD); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactClassConstants(FileObject fo, String prefix, String ownerClass) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_CLASS_CONST, PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); + if (!classOwnerName.startsWith(ownerClass.toLowerCase() + ";")) { + continue; + } + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactConstants(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CONST}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.FUNCTION, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + static List parseParameters(final String signature) { + List retval = new ArrayList<>(); + if (signature != null && signature.length() > 0) { + final String regexp = String.format("\\%s", ","); //NOI18N + + for (String sign : signature.split(regexp)) { + try { + final String param = parseOneParameter(sign); + if (param != null) { + retval.add(param); + } + } catch (NumberFormatException originalException) { + final String message = String.format("%s [for signature: %s]", originalException.getMessage(), signature); //NOI18N + final NumberFormatException formatException = new NumberFormatException(message); + formatException.initCause(originalException); + throw formatException; + } + } + } + return retval; + } + + /** + * TODO improve the function param parsing + * + * @param sig + * @return + */ + static String parseOneParameter(String sig) { + String retval = null; + final String regexp = String.format("\\%s", ":"); //NOI18N + String[] parts = sig.split(regexp); + if (parts.length > 0) { + String paramName = parts[0]; + boolean isRawType = Integer.parseInt(parts[2]) > 0; + boolean isMandatory = Integer.parseInt(parts[4]) > 0; + boolean isReference = Integer.parseInt(parts[5]) > 0; + boolean isVariadic = Integer.parseInt(parts[6]) > 0; + boolean isUnionType = Integer.parseInt(parts[7]) > 0; + int modifier = Integer.parseInt(parts[8]); + boolean isIntersectionType = Integer.parseInt(parts[9]) > 0; + String defValue = parts.length > 3 ? parts[3] : null; + String declaredType = parts.length > 10 ? parts[10] : null; + String phpdocType = parts.length > 11 ? parts[11] : null; + retval = paramName; + } + return retval; + } + + protected static QueryCache> getCache(FileObject fo, String prefix) { + QueryCache> selfCache = new QueryCache<>(); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return null; + } + int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); + if (PhpIndexUtils.QUERY_SUPPORT_INSTANCES.containsKey(pathHash)) { + PhpIndexUtils indexUtils = QUERY_SUPPORT_INSTANCES.get(pathHash); + selfCache = indexUtils.getQueryCache(); + + } else { + QUERY_SUPPORT_INSTANCES.put(pathHash, new PhpIndexUtils()); + } + return selfCache; + } + + protected static QueryCache> getFunctionCache(FileObject fo, String prefix) { + QueryCache> selfCache = new QueryCache<>(); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return null; + } + int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); + if (PhpIndexUtils.QUERY_SUPPORT_INSTANCES.containsKey(pathHash)) { + PhpIndexUtils indexUtils = QUERY_SUPPORT_INSTANCES.get(pathHash); + selfCache = indexUtils.getFunctionQueryCache(); + + } else { + QUERY_SUPPORT_INSTANCES.put(pathHash, new PhpIndexUtils()); + } + return selfCache; + } + + public QueryCache> getQueryCache() { + return cache; + } + + public QueryCache> getFunctionQueryCache() { + return functionCache; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java new file mode 100644 index 000000000000..4e7cb2972de2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.List; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bogdan + */ +public class QueryUtils { + + public static List queryYieldReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.queryYieldIndexedReferences(prefix); + } + + public static List findYieldReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.findYieldIndexedReferences(prefix); + } + + public static List queryStacksReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.queryStacksIdsReference(prefix); + } + + public static List getIncludePathReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.getIncludePaths(prefix); + } + + public static BladeIndex getIndex(FileObject fo) { + Project project = ProjectUtils.getMainOwner(fo); + + try { + return BladeIndex.get(project); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java new file mode 100644 index 000000000000..b91d0bc13072 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import org.netbeans.api.lexer.Token; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; +import org.netbeans.spi.lexer.LexerRestartInfo; +import org.netbeans.spi.lexer.antlr4.AbstractAntlrLexerBridge; + +/** + * + * @author bogdan + */ +public class BladeLexer extends AbstractAntlrLexerBridge { + + public BladeLexer(LexerRestartInfo info) { + super(info, BladeAntlrColoringLexer::new); + } + + @Override + public Object state() { + return new State(lexer); + } + + @Override + protected Token mapToken(org.antlr.v4.runtime.Token antlrToken) { + //debug text + //String text = antlrToken.getText(); + int type = antlrToken.getType(); + //System.out.println(text + " " + type); + switch (type) { + case BladeAntlrColoringLexer.BLADE_COMMENT_START: + return token(BLADE_COMMENT_START); + case BladeAntlrColoringLexer.BLADE_COMMENT: + return token(BLADE_COMMENT); + case BladeAntlrColoringLexer.BLADE_COMMENT_END: + return token(BLADE_COMMENT_END); + case BladeAntlrColoringLexer.HTML_TAG: + case BladeAntlrColoringLexer.HTML: + return token(HTML); + case BladeAntlrColoringLexer.PHP_INLINE: + return token(PHP_INLINE); + case BladeAntlrColoringLexer.PHP_EXPRESSION: + //System.out.println(antlrToken.getText()); + return token(PHP_BLADE_EXPRESSION); + case BladeAntlrColoringLexer.BLADE_PHP_INLINE: + return token(PHP_BLADE_INLINE_CODE); + case BladeAntlrColoringLexer.DIRECTIVE: + case BladeAntlrColoringLexer.D_PHP: + case BladeAntlrColoringLexer.D_ENDPHP: + case BladeAntlrColoringLexer.D_CUSTOM: + return token(BLADE_DIRECTIVE); + case BladeAntlrColoringLexer.RAW_TAG: + case BladeAntlrColoringLexer.CONTENT_TAG: + return token(BLADE_ECHO_DELIMITOR); + case BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR: + return token(PHP_BLADE_ECHO_EXPR); + case BladeAntlrColoringLexer.D_UNKNOWN: + case BladeAntlrColoringLexer.D_AT: + return token(BLADE_DIRECTIVE_UNKNOWN); + case BladeAntlrColoringLexer.ERROR: + case BladeAntlrColoringLexer.WS_EXPR: + return token(WS_D); + default: + return token(OTHER); + } + } + + private static class State extends AbstractAntlrLexerBridge.LexerState { + + final int currentRuleType; + + public State(BladeAntlrColoringLexer lexer) { + super(lexer); + this.currentRuleType = lexer.getCurrentRuleType(); + } + + @Override + public void restore(BladeAntlrColoringLexer lexer) { + super.restore(lexer); + lexer.setCurrentRuleType(currentRuleType); + } + + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java new file mode 100644 index 000000000000..6c9020786636 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.util.Arrays; +import java.util.List; +import javax.swing.text.Document; +import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; + +/** + * + * @author bogdan + */ +public class BladeLexerUtils { + + public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { + return getTokenSequence(th, offset, PHPTokenId.language()); + } + + public static TokenSequence getPhpTokenSequence(final Document document, final int offset) { + TokenHierarchy th = TokenHierarchy.get(document); + return getTokenSequence(th, offset, PHPTokenId.language()); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + public static TokenSequence getTokenSequence(final TokenHierarchy th, + final int offset, final Language language) { + TokenSequence ts = th.tokenSequence(language); + if (ts == null) { + List> list = th.embeddedTokenSequences(offset, true); + for (TokenSequence t : list) { + if (t.language() == language) { + ts = t; + break; + } + } + if (ts == null) { + list = th.embeddedTokenSequences(offset, false); + for (TokenSequence t : list) { + if (t.language() == language) { + ts = t; + break; + } + } + } + } + return ts; + } + + public static List tokensWithIdentifiableParam() { + return Arrays.asList(new Integer[]{ + D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, + D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, + D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER + }); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java new file mode 100644 index 000000000000..795605937553 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.util.Collection; +import java.util.EnumSet; +import java.util.WeakHashMap; +import org.netbeans.api.lexer.InputAttributes; +import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.LanguagePath; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenId; +import org.netbeans.spi.lexer.LanguageEmbedding; +import org.netbeans.spi.lexer.LanguageHierarchy; +import org.netbeans.spi.lexer.LanguageProvider; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; +import org.openide.util.Lookup; + +/** + * + * @author bogdan + */ +public enum BladeTokenId implements TokenId { + BLADE_COMMENT_START("blade_comment"), + BLADE_COMMENT("blade_comment"), + BLADE_COMMENT_END("blade_comment"), + BLADE_DIRECTIVE("blade_directive"), + BLADE_ECHO_DELIMITOR("blade_echo_delimiters"), + HTML("html"), + WS_D("html"), + BLADE_DIRECTIVE_UNKNOWN("at_string"), + PHP_BLADE_EXPRESSION("blade_php"), + PHP_BLADE_ECHO_EXPR("blade_php"), + PHP_BLADE_INLINE_CODE("blade_php"), + PHP_INLINE("php"), + OTHER("error"); + private final String category; + + BladeTokenId(String category) { + this.category = category; + } + + @Override + public String primaryCategory() { + return category; + } + + public static abstract class BladeLanguageHierarchy extends LanguageHierarchy { + + private final WeakHashMap> tokenLangCache + = new WeakHashMap<>(); + + @Override + protected Collection createTokenIds() { + return EnumSet.allOf(BladeTokenId.class); + } + + @Override + protected LanguageEmbedding embedding(Token token, + LanguagePath languagePath, InputAttributes inputAttributes) { + boolean joinHtml = true; + switch (token.id()) { + case PHP_INLINE: + Language phpLanguageCode = PHPTokenId.language(); + return phpLanguageCode != null ? LanguageEmbedding.create(phpLanguageCode, 0, 0, false) : null; + case PHP_BLADE_EXPRESSION: + case PHP_BLADE_ECHO_EXPR: + case PHP_BLADE_INLINE_CODE: + /** + * troubleshooting php embedding freeze (?:, ::) + * force a return null; + */ + Language phpLanguage = PHPTokenId.languageInPHP(); + return phpLanguage != null ? LanguageEmbedding.create(phpLanguage, 0, 0, false) : null; + case HTML: + LanguageEmbedding lang; + + if (tokenLangCache.containsKey(token.id())) { + lang = tokenLangCache.get(token.id()); + } else { + Language htmlLanguage = null; + + @SuppressWarnings("unchecked") + Collection providers = (Collection) Lookup.getDefault().lookupAll(LanguageProvider.class); + for (LanguageProvider provider : providers) { + htmlLanguage = (Language) provider.findLanguage("text/html"); //NOI18N + if (htmlLanguage != null) { + break; + } + } + + lang = htmlLanguage != null ? LanguageEmbedding.create(htmlLanguage, 0, 0, joinHtml) : null; + tokenLangCache.put(token.id(), lang); + } + + return lang; + default: + return null; + } + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java new file mode 100644 index 000000000000..6e304376950d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import javax.swing.text.Document; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.api.project.Project; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public class EditorUtils { + + public static TokenSequence getTokenSequence(Document doc, int offset) { + BaseDocument baseDoc = (BaseDocument) doc; + TokenSequence tokenSequence = null; + baseDoc.readLock(); + try { + TokenHierarchy hierarchy = TokenHierarchy.get(baseDoc); + tokenSequence = hierarchy.tokenSequence(PHPTokenId.language()); + } finally { + baseDoc.readUnlock(); + } + if (tokenSequence != null) { + tokenSequence.move(offset); + tokenSequence.moveNext(); + } + return tokenSequence; + + } + + public static FileObject getFileObjectFromDoc(Document doc) { + DataObject dObject = NbEditorUtilities.getDataObject(doc); + if (dObject != null) { + return dObject.getPrimaryFile().getParent(); + } + return null; + } + + public static Project getProjectOwner(Document doc) { + FileObject file = getFileObjectFromDoc(doc); + if (file == null){ + return null; + } + return ProjectUtils.getMainOwner(file); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java new file mode 100644 index 000000000000..b3975d6ccfa1 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java @@ -0,0 +1,218 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.navigator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import javax.swing.ImageIcon; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.StructureItem; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public abstract class BladeStructureItem implements ElementHandle, StructureItem { + + final String name; + final FileObject source; + final int startOffset; + final int stopOffset; + + public BladeStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + this.name = name; + this.source = source; + this.startOffset = startOffset; + this.stopOffset = stopOffset; + } + + @Override + public String getSortText() { + return String.format("[%8d]", this.startOffset).replace(' ', '0'); + } + + @Override + public String getHtml(HtmlFormatter formatter) { + formatter.appendText(name); + return formatter.getText(); + } + + @Override + public ElementHandle getElementHandle() { + return this; + } + + @Override + public long getPosition() { + return startOffset; + } + + @Override + public long getEndPosition() { + return stopOffset; + } + + @Override + public ImageIcon getCustomIcon() { + return null; + } + + @Override + public FileObject getFileObject() { + return source; + } + + @Override + public String getMimeType() { + return source.getMIMEType(); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getIn() { + return null; + } + + @Override + public Set getModifiers() { + return Collections.emptySet(); + } + + @Override + public boolean signatureEquals(ElementHandle handle) { + return false; + } + + @Override + public OffsetRange getOffsetRange(ParserResult result) { + return new OffsetRange(startOffset, stopOffset); + } + + public static final class DirectiveBlockStructureItem extends BladeStructureItem { + + private String identifier; + + public final List nestedItems = new ArrayList<>(); + + public DirectiveBlockStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + } + + public DirectiveBlockStructureItem(String name, String identifier, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + this.identifier = identifier; + } + + @Override + public boolean isLeaf() { + return nestedItems.isEmpty(); + } + + @Override + public List getNestedItems() { + return nestedItems; + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + @Override + public String getHtml(HtmlFormatter formatter) { + formatter.appendText(name); + if (identifier != null) { + formatter.appendText(" "); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.appendText(identifier); + formatter.appendHtml(""); + formatter.appendHtml(""); + } + return formatter.getText(); + } + + @Override + public ImageIcon getCustomIcon() { + return ResourceUtilities.loadResourceIcon("icons/layout.png"); + } + } + + public static class DirectiveInlineStructureItem extends BladeStructureItem { + + private String identifier; + + public DirectiveInlineStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + } + + public DirectiveInlineStructureItem(String name, String identifier, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + this.identifier = identifier; + } + + @Override + public boolean isLeaf() { + return true; + } + + @Override + public String getHtml(HtmlFormatter formatter) { + formatter.appendText(name); + if (identifier != null) { + formatter.appendText(" "); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.appendText(identifier); + formatter.appendHtml(""); + formatter.appendHtml(""); + } + return formatter.getText(); + } + + @Override + public List getNestedItems() { + return Collections.emptyList(); + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + @Override + public ImageIcon getCustomIcon() { + return ResourceUtilities.loadResourceIcon("icons/layout.png"); + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java new file mode 100644 index 000000000000..7557b8a300e0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.navigator; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.StructureItem; +import org.netbeans.modules.csl.api.StructureScanner; +import org.netbeans.modules.csl.api.StructureScanner.Configuration; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; + +/** + * + * @author bhaidu + */ +public class BladeStructureScanner implements StructureScanner { + + @Override + public List scan(ParserResult info) { + return ((BladeParserResult)info).structure; + } + + @Override + public Map> folds(ParserResult info) { + Map> ret = Collections.singletonMap("codeblocks", ((BladeParserResult)info).folds); //NOI18N + return ret; + } + + @Override + public Configuration getConfiguration() { + return new Configuration(true, false); + } + +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java new file mode 100644 index 000000000000..09ef2be2f32e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.WeakHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.event.ChangeListener; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.api.Task; +import org.netbeans.modules.parsing.spi.ParseException; +import org.netbeans.modules.parsing.spi.SourceModificationEvent; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeParser extends org.netbeans.modules.parsing.spi.Parser { + private static final Logger LOGGER = Logger.getLogger(BladeParser.class.getName()); + BladeParserResult lastResult; + private static final WeakHashMap> CACHE = new WeakHashMap<>(); + + @Override + public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) throws ParseException { + if (snapshot == null) { + return; + } + LOGGER.info(String.format("Parsing request for for " + task.getClass().getName() + " event changed : " + event.sourceChanged())); + if (task.getClass().getName().contains("HtmlCssIndexContributor")){ + LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); + return; + } + long startTime = System.currentTimeMillis(); + BladeParserResult parserResult = createParserResult(snapshot); + + BladeParserResult parsed = parserResult.get(task.getClass().getName()); + //cacheResult(snapshot.getSource().getFileObject(), parsed); + lastResult = parsed; + //LOGGER.info(String.format("Finished parsing for " + task.getClass().getName() + ". Time : %d ms", System.currentTimeMillis() - startTime)); + } + + private static void cacheResult(FileObject fo, BladeParserResult result) { + synchronized (CACHE) { + CACHE.put(fo, new WeakReference<>(result)); + } + } + + @Override + public Result getResult(Task task) throws ParseException { + assert lastResult != null; + return lastResult; + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + } + + @Override + public void removeChangeListener(ChangeListener changeListener) { + } + + protected BladeParserResult createParserResult(Snapshot snapshot) { + return new BladeParserResult(snapshot); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java new file mode 100644 index 000000000000..d749f36849d0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -0,0 +1,995 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.antlr.v4.runtime.ANTLRErrorListener; +import org.antlr.v4.runtime.BaseErrorListener; +import org.netbeans.modules.csl.api.Error; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.parsing.api.Snapshot; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ConsoleErrorListener; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.antlr.v4.runtime.tree.TerminalNode; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.annotations.common.NullAllowed; +import org.netbeans.modules.csl.api.Severity; +import org.netbeans.modules.csl.spi.DefaultError; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveBlockStructureItem; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveInlineStructureItem; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeParserResult extends ParserResult { + + private static final Logger LOGGER = Logger.getLogger(BladeParserResult.class.getSimpleName()); + public final List errors = new ArrayList<>(); + private final Map yieldReferences = new TreeMap<>(); + private final Map stackReferences = new TreeMap<>(); + public final Map> includeBladeOccurences = new HashMap<>(); + public final Map occurancesForDeclaration = new TreeMap<>(); + public final Map phpClassOccurences = new TreeMap<>(); + public final Map phpFunctionOccurences = new TreeMap<>(); + public final Map phpMethodOccurences = new TreeMap<>(); + public final Map phpConstantOccurences = new TreeMap<>(); + public final Map phpNamespacePathOccurences = new TreeMap<>(); + public final Map customDirectivesReferences = new TreeMap<>(); + public final Map fieldCallType = new TreeMap<>(); + public final Map> loopScopedVariables = new TreeMap<>(); + public final List structure = new ArrayList<>(); + public final List folds = new ArrayList<>(); + volatile boolean finished = false; + volatile boolean debugMode = false; + + public enum ReferenceType { + YIELD, STACK, SECTION, PUSH, PUSH_IF, PREPEND, INCLUDE, INCLUDE_IF, + INCLUDE_COND, EXTENDS, EACH, HAS_SECTION, + SECTION_MISSING, USE, INJECT, CUSTOM_DIRECTIVE, POSSIBLE_DIRECTIVE, + PHP_FUNCTION, PHP_CLASS, PHP_METHOD, PHP_CONSTANT, PHP_NAMESPACE, PHP_NAMESPACE_PATH_TYPE, + STATIC_FIELD_ACCESS, VITE_PATH, + TEMPLATE_PATH, + } + + public BladeParserResult(Snapshot snapshot) { + super(snapshot); + } + + protected BladeAntlrParser createParser(Snapshot snapshot) { + CharStream cs = CharStreams.fromString(String.valueOf(snapshot.getText())); + BladeAntlrLexer lexer = new BladeAntlrLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + BladeAntlrParser ret = new BladeAntlrParser(tokens); + ret.removeErrorListener(ConsoleErrorListener.INSTANCE); + return ret; + } + + public BladeParserResult get(String taskClass) { + long startTime = System.currentTimeMillis(); + if (debugMode){ + LOGGER.log(Level.INFO, "PARSER TRIGGERED BY {0}", taskClass); + } + if (!finished) { + BladeAntlrParser parser = createParser(getSnapshot()); + parser.setBuildParseTree(false); + //LOGGER.info(String.format("parser created in %d ms", System.currentTimeMillis() - startTime)); + parser.addErrorListener(createErrorListener()); + parser.addParseListener(createDeclarationReferencesListener()); + parser.addParseListener(createPhpElementsOccurencesListener()); + + if (taskClass.toLowerCase().contains("completion")) { + parser.addParseListener(createVariableListener()); + } + + parser.addParseListener(createStructureListener()); + + if (taskClass.toLowerCase().contains("hints")) { + parser.addParseListener(createSemanticsListener()); + } + evaluateParser(parser); + if (debugMode){ + LOGGER.info(String.format("Parser evaluated in %d ms " + taskClass + " | " + this.getFileObject().getNameExt(), System.currentTimeMillis() - startTime)); + } + finished = true; + } + long time = System.currentTimeMillis() - startTime; + + if (debugMode){ + LOGGER.info(String.format("finished parser took %d ms " + this.getFileObject().getNameExt(), time)); + } + return this; + } + + protected void evaluateParser(BladeAntlrParser parser) { + parser.file(); + } + + protected ParseTreeListener createDeclarationReferencesListener() { + + return new BladeAntlrParserBaseListener() { + @Override + public void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { + Token directive = ctx.getParent().getStart(); + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { + Token directive = ctx.getParent().getStart(); + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { + Token directive = ctx.d_name; + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitEach(BladeAntlrParser.EachContext ctx) { + Token directive = ctx.getStart(); + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { + Token directive = ctx.d_name; + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { + String directiveName = ctx.getStart().getText(); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + occurancesForDeclaration.put(range, new Reference(ReferenceType.CUSTOM_DIRECTIVE, directiveName, range)); + } + + /** + * for @stack, @yield, @each, @include() + */ + private void addIdentifiableOccurenceForDeclaration(Token directive, + Token paramString) { + + OffsetRange range = new OffsetRange(paramString.getStartIndex(), paramString.getStopIndex()); + String bladeParamText = EditorStringUtils.stripSurroundingQuotes(paramString.getText()); + + //used for indexing + switch (directive.getType()) { + case D_STACK: + addStackReference(ReferenceType.STACK, bladeParamText, range); + break; + case D_YIELD: + addYieldReference(ReferenceType.YIELD, bladeParamText, range); + break; + } + + ReferenceType type = getReferenceType(directive.getType()); + + if (type == null) { + return; + } + + Reference ref; + if (type.equals(ReferenceType.USE) || type.equals(ReferenceType.INJECT)) { + int lastSlashPos = bladeParamText.lastIndexOf("\\"); + if (lastSlashPos < 0 || lastSlashPos >= bladeParamText.length() - 1) { + return; + } + range = new OffsetRange(paramString.getStartIndex(), paramString.getStopIndex()); + //extracting the namespace and classname + ref = new Reference(type, bladeParamText.substring(lastSlashPos + 1), range, null, bladeParamText.substring(0, lastSlashPos)); + } else { + ref = new Reference(type, bladeParamText, range); + } + + occurancesForDeclaration.put(range, ref); + + switch (directive.getType()) { + case D_EACH: + case D_INCLUDE_WHEN: + case D_INCLUDE_UNLESS: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_FIRST: + if (bladeParamText.contains("::")) { + //don't include package resources + break; + } + markIncludeBladeOccurrence(bladeParamText, range); + break; + } + } + + @Override + public void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { + if (ctx.id_string != null){ + Token idToken = ctx.id_string; + String path = idToken.getText(); + path = EditorStringUtils.stripSurroundingQuotes(path); + OffsetRange range = new OffsetRange(idToken.getStartIndex(), idToken.getStopIndex()); + Reference ref = new Reference(ReferenceType.VITE_PATH, path, range); + occurancesForDeclaration.put(range, ref); + return; + } + Token dirToken = ctx.dir; + String dir = ""; + if (dirToken != null){ + dir = dirToken.getText(); + } + + for (TerminalNode node : ctx.EXPR_STRING()){ + Token symbolNode = node.getSymbol(); + if (symbolNode == null){ + continue; + } + String path = node.getText(); + if (path.equals(dir)){ + //skipping last parameter + continue; + } + path = EditorStringUtils.stripSurroundingQuotes(path); + OffsetRange range = new OffsetRange(symbolNode.getStartIndex(), symbolNode.getStopIndex()); + Reference ref = new Reference(ReferenceType.VITE_PATH, path, range); + occurancesForDeclaration.put(range, ref); + } + } + + }; + + } + + private ParseTreeListener createVariableListener() { + return new BladeAntlrParserBaseListener() { + List foreachVariableList = new ArrayList<>(); + int foreachBalance = 0; + + @Override + public void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { + ForeachVariables foreachVariables = new ForeachVariables(); + foreachVariables.arrayVariable = ctx.loop_array.getText(); + if (ctx.item != null) { + foreachVariables.keyVariable = ctx.key.getText(); + foreachVariables.itemVariable = ctx.item.getText(); + } else { + + foreachVariables.itemVariable = ctx.key.getText(); + } + foreachVariableList.add(foreachVariables); + } + + @Override + public void enterForeach(BladeAntlrParser.ForeachContext ctx) { + foreachBalance++; + } + + @Override + public void exitForeach(BladeAntlrParser.ForeachContext ctx) { + if (!foreachVariableList.isEmpty()) { + Set varList = new LinkedHashSet<>(); + for (ForeachVariables foreachVariables : foreachVariableList) { + + varList.add(foreachVariables.arrayVariable); + if (foreachVariables.keyVariable != null) { + varList.add(foreachVariables.keyVariable); + } + varList.add(foreachVariables.itemVariable); + + } + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + loopScopedVariables.put(range, varList); + } + + foreachBalance--; + //reset + if (foreachBalance < 0) { + foreachVariableList.clear(); + } + } + + @Override + public void exitForelse(BladeAntlrParser.ForelseContext ctx) { + if (!foreachVariableList.isEmpty()) { + Set varList = new LinkedHashSet<>(); + for (ForeachVariables foreachVariables : foreachVariableList) { + + varList.add(foreachVariables.arrayVariable); + if (foreachVariables.keyVariable != null) { + varList.add(foreachVariables.keyVariable); + } + varList.add(foreachVariables.itemVariable); + + } + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + loopScopedVariables.put(range, varList); + } + + //reset + foreachVariableList.clear(); + } + + @Override + public void exitFile(BladeAntlrParser.FileContext ctx) { + foreachVariableList.clear(); + } + }; + } + + private ParseTreeListener createPhpElementsOccurencesListener() { + return new BladeAntlrParserBaseListener() { + /** + * handling isolated PHP_IDENTIFIER to reference them as possible + * constants + */ + @Override + public void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { + if (ctx.PHP_IDENTIFIER() != null && ctx.PHP_IDENTIFIER().getSymbol() != null) { + String identifierString = ctx.PHP_IDENTIFIER().getSymbol().getText(); + if (identifierString != null && org.netbeans.modules.php.blade.syntax.StringUtils.isUpperCase(identifierString)) { + OffsetRange range = new OffsetRange(ctx.PHP_IDENTIFIER().getSymbol().getStartIndex(), ctx.PHP_IDENTIFIER().getSymbol().getStopIndex() + 1); + phpConstantOccurences.put(range, identifierString); + } + } + if (ctx.PHP_NAMESPACE_PATH() != null && ctx.PHP_NAMESPACE_PATH().getSymbol() != null) { + String identifierString = ctx.PHP_NAMESPACE_PATH().getSymbol().getText(); + if (identifierString != null) { + OffsetRange range = new OffsetRange(ctx.PHP_NAMESPACE_PATH().getSymbol().getStartIndex(), ctx.PHP_NAMESPACE_PATH().getSymbol().getStopIndex() + 1); + phpNamespacePathOccurences.put(range, identifierString); + } + } + } + + @Override + public void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { + if (ctx.PHP_IDENTIFIER() == null || ctx.PHP_NAMESPACE_PATH() == null) { + return; + } + String namespace = ctx.PHP_NAMESPACE_PATH().getSymbol().getText(); + Token classIdentifier = ctx.PHP_IDENTIFIER().getSymbol(); + String className = classIdentifier.getText(); + OffsetRange classRange = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + occurancesForDeclaration.put(range, new Reference(ReferenceType.PHP_NAMESPACE_PATH_TYPE, className, classRange, null, namespace)); + } + + @Override + public void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { + if (ctx.class_name == null) { + return; + } + + Token classIdentifier = ctx.class_name; + String className = classIdentifier.getText(); + OffsetRange range = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); + + Reference classReference = new Reference( + ReferenceType.PHP_CLASS, + className, range, + null, + ctx.namespace.getText() + ); + occurancesForDeclaration.put(range, classReference); + + OffsetRange callRange = null; + int start = ctx.PHP_STATIC_ACCESS().getSymbol().getStartIndex(); + String fieldName = null; + FieldType fieldType = null; + + if (ctx.static_property != null) { + //constants + callRange = new OffsetRange(start, ctx.static_property.getStopIndex() + 1); + fieldName = ctx.static_property.getText(); + fieldType = FieldType.CONSTANT; + } else if (ctx.func_name != null) { + //methods + callRange = new OffsetRange(start, ctx.func_name.getStopIndex() + 1);//bad + fieldName = ctx.func_name.getText(); + fieldType = FieldType.METHOD; + OffsetRange functionRange = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); + + phpMethodOccurences.put(functionRange, + new Reference(ReferenceType.PHP_METHOD, + fieldName, range, className, + ctx.namespace.getText()) + ); + + } + + if (callRange != null) { + FieldAccessReference fieldAccess = new FieldAccessReference( + ReferenceType.STATIC_FIELD_ACCESS, + classReference, + fieldName, + fieldType + ); + fieldCallType.put(callRange, fieldAccess); + } + } + + //this will be always static + @Override + public void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { + if (ctx.class_name == null) { + return; + } + + Token classIdentifier = ctx.class_name; + String className = classIdentifier.getText(); + OffsetRange range = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); + + phpClassOccurences.put(range, className); + + OffsetRange callRange = null; + int start = ctx.PHP_STATIC_ACCESS().getSymbol().getStartIndex(); + String fieldName = null; + FieldType fieldType = null; + if (ctx.static_property != null) { + //constants + callRange = new OffsetRange(start, ctx.static_property.getStopIndex() + 1); + fieldName = ctx.static_property.getText(); + fieldType = FieldType.CONSTANT; + } else if (ctx.func_name != null) { + //methods + callRange = new OffsetRange(start, ctx.func_name.getStopIndex() + 1); + fieldName = ctx.func_name.getText(); + fieldType = FieldType.METHOD; + OffsetRange functionRange = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); + phpMethodOccurences.put(functionRange, new Reference(ReferenceType.PHP_METHOD, fieldName, range, className)); + } + + if (callRange != null) { + Reference classReference = new Reference( + ReferenceType.PHP_CLASS, + className, range, + null, + null + ); + FieldAccessReference fieldAccess = new FieldAccessReference( + ReferenceType.STATIC_FIELD_ACCESS, + classReference, + fieldName, + fieldType + ); + fieldCallType.put(callRange, fieldAccess); + } + } + + @Override + public void exitFunction_call(BladeAntlrParser.Function_callContext ctx) { + if (ctx.func_name == null || ctx.func_name.getText() == null) { + return; + } + String functionName = ctx.func_name.getText(); + OffsetRange range = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); + phpFunctionOccurences.put(range, functionName); + } + }; + } + + private ParseTreeListener createStructureListener() { + + return new BladeAntlrParserBaseListener() { + + final List lexerStructure = new ArrayList<>(); + int blockBalance = 0; + String identifier; + + @Override + public void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { + identifier = null; + } + + @Override + public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { + Token directive = ctx.d_name; + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + String bladeParamText = paramString.getText(); + identifier = EditorStringUtils.stripSurroundingQuotes(bladeParamText); + } + + @Override + public void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + + DirectiveInlineStructureItem inlineElement; + String directiveName = directiveToken.getText(); + + inlineElement = new DirectiveInlineStructureItem(directiveName, identifier, + getFileObject(), directiveToken.getStartIndex(), directiveToken.getStopIndex() + 1); + + if (blockBalance > 0) { + lexerStructure.add(inlineElement); + } else { + structure.add(inlineElement); + } + + } + + @Override + public void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx) { + identifier = null; + blockBalance++; + } + + @Override + public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { + blockBalance--; + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + + String directiveName = directiveToken.getText(); + DirectiveBlockStructureItem blockItem = new DirectiveBlockStructureItem(directiveName, identifier, + getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + + blockItem.nestedItems.addAll(lexerStructure); + lexerStructure.clear(); + if (blockBalance > 0 && !directiveName.startsWith("@else")) { + lexerStructure.add(blockItem); + } else { + structure.add(blockItem); + } + //folds + int start = ctx.getStart().getStartIndex() + 1 + directiveName.length(); + int end = ctx.getStop().getStartIndex();//the start of the close directive + + if (start > end) { + return; + } + OffsetRange range = new OffsetRange(start, end); + if (!folds.contains(range)) { + folds.add(range); + } + } + }; + } + + private ReferenceType getReferenceType(int type) { + switch (type) { + case D_INCLUDE: + return ReferenceType.INCLUDE; + case D_INCLUDE_IF: + return ReferenceType.INCLUDE_IF; + case D_EXTENDS: + return ReferenceType.EXTENDS; + case D_USE: + return ReferenceType.USE; + case D_INJECT: + return ReferenceType.INJECT; + case D_SECTION: + return ReferenceType.SECTION; + case D_HAS_SECTION: + return ReferenceType.HAS_SECTION; + case D_SECTION_MISSING: + return ReferenceType.SECTION_MISSING; + case D_PUSH: + return ReferenceType.PUSH; + case D_PUSH_IF: + return ReferenceType.PUSH_IF; + case D_PREPEND: + return ReferenceType.PREPEND; + case D_EACH: + return ReferenceType.EACH; + default: + return null; + } + } + + /** + * might move to a model all these processing + * + * @param offset + * @return + */ + public Reference findOccuredRefrence(int offset) { + + //TODO could do a similar thing and generate the Reference class on loop + for (Map.Entry entry : occurancesForDeclaration.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + for (Map.Entry entry : phpFunctionOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_FUNCTION, entry.getValue(), range); + } + } + + for (Map.Entry entry : phpClassOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_CLASS, entry.getValue(), range); + } + } + + for (Map.Entry entry : phpMethodOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + for (Map.Entry entry : phpConstantOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_CONSTANT, entry.getValue(), range); + } + } + + for (Map.Entry entry : phpNamespacePathOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_NAMESPACE_PATH_TYPE, entry.getValue(), range); + } + } + + return null; + } + + public FieldAccessReference findFieldAccessRefrence(int offset) { + for (Map.Entry entry : fieldCallType.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + + protected final void markIncludeBladeOccurrence(String refName, OffsetRange or) { + includeBladeOccurences.computeIfAbsent(refName, s -> new ArrayList<>()).add(or); + } + + //not used so far + public Collection findIncludeOccurrence(String refName) { + ArrayList ret = new ArrayList<>(); + if (includeBladeOccurences.containsKey(refName)) { + ret.addAll(includeBladeOccurences.get(refName)); + } + return ret; + } + + public Set findLoopVariablesForScope(int offset) { + + Set variableList = new LinkedHashSet<>(); + + for (Map.Entry> entry : loopScopedVariables.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + variableList.addAll(entry.getValue()); + } + } + + if (variableList.isEmpty()) { + return null; + } + return variableList; + } + + private ParseTreeListener createSemanticsListener() { + return new BladeAntlrParserBaseListener() { + int ifBalance = 0; + int ifStart = 0; + + @Override + public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { + String directiveName = ctx.getStart().getText(); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStart().getStartIndex() + directiveName.length()); + customDirectivesReferences.put(range, new Reference(ReferenceType.CUSTOM_DIRECTIVE, directiveName, range)); + } + + @Override + public void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { + String directiveName = ctx.getStart().getText(); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStart().getStartIndex() + directiveName.length()); + customDirectivesReferences.put(range, new Reference(ReferenceType.POSSIBLE_DIRECTIVE, directiveName, range)); + } + + @Override + public void enterIf(BladeAntlrParser.IfContext ctx) { + ifBalance++; + ifStart = ctx.getStart().getStartIndex(); + } + + @Override + public void exitEndif(BladeAntlrParser.EndifContext ctx) { + ifBalance--; + } + + @Override + public void exitFile(BladeAntlrParser.FileContext ctx) { + if (ifBalance != 0) { + errors.add(new BladeError(null, "Unclosed @if", null, getFileObject(), ifStart, ctx.getStart().getStopIndex(), Severity.ERROR)); + } + } + + }; + } + + public void addYieldReference(ReferenceType type, String yieldId, OffsetRange range) { + Reference ref = new Reference(type, yieldId, range); + yieldReferences.put(ref.identifier, ref); + } + + public void addStackReference(ReferenceType type, String stackId, OffsetRange range) { + Reference ref = new Reference(type, stackId, range); + stackReferences.put(ref.identifier, ref); + } + + @Override + protected boolean processingFinished() { + return finished; + } + + @Override + public List getDiagnostics() { + return errors; + } + + @Override + protected void invalidate() { + loopScopedVariables.clear(); + } + + public Map getYieldReferences() { + return yieldReferences; + } + + public Map getStackReferences() { + return stackReferences; + } + + protected ANTLRErrorListener createErrorListener() { + return new BaseErrorListener() { + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { + int errorPosition = 0; + if (offendingSymbol instanceof Token) { + Token offendingToken = (Token) offendingSymbol; + errorPosition = offendingToken.getStartIndex(); + } + errors.add(new BladeError(null, msg, null, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); + } + + }; + } + + public final FileObject getFileObject() { + return getSnapshot().getSource().getFileObject(); + } + + public static class Reference { + + public final ReferenceType type; + public final String identifier; + public final String ownerClass; + public final String namespace; + public final OffsetRange defOffset; + + public Reference(ReferenceType type, String name, OffsetRange defOffset, String ownerClass) { + this.type = type; + this.identifier = name; + this.defOffset = defOffset; + this.ownerClass = ownerClass; + this.namespace = null; + } + + public Reference(ReferenceType type, String name, OffsetRange defOffset, String ownerClass, String namespace) { + this.type = type; + this.identifier = name; + this.defOffset = defOffset; + this.ownerClass = ownerClass; + this.namespace = namespace; + } + + public Reference(ReferenceType type, String name, OffsetRange defOffset) { + this.type = type; + this.identifier = name; + this.defOffset = defOffset; + this.ownerClass = null; + this.namespace = null; + } + } + + public enum FieldType { + PROPERTY, + CONSTANT, + METHOD; + } + + public static class FieldAccessReference { + + public final ReferenceType type; + public final Reference ownerClass; + public final String fieldName; + public final FieldType fieldType; + + public FieldAccessReference(ReferenceType type, Reference ownerClass, + String fieldName, FieldType fieldType) { + this.type = type; + this.ownerClass = ownerClass; + this.fieldName = fieldName; + this.fieldType = fieldType; + } + } + + public class ForeachVariables { + + public String arrayVariable; + public String keyVariable; + public String itemVariable; + } + + /** + * seems that java caches only this class ? BladeError is not found in some + * occasions + */ + public static class BladeError extends DefaultError implements org.netbeans.modules.csl.api.Error.Badging { + + public BladeError(@NullAllowed String key, @NonNull String displayName, @NullAllowed String description, @NonNull FileObject file, @NonNull int start, @NonNull int end, @NonNull Severity severity) { + super(key, displayName, description, file, start, end, severity); + } + + @Override + public boolean showExplorerBadge() { + return true; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java new file mode 100644 index 000000000000..6f93fd83feb4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java @@ -0,0 +1,374 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collections; +import java.util.Date; +import java.util.Enumeration; +import javax.swing.text.Document; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.ParseException; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.php.editor.parser.PHPParseResult; +import org.openide.filesystems.AbstractFileSystem; +import org.openide.filesystems.DefaultAttributes; +import org.openide.filesystems.FileChangeListener; +import org.openide.filesystems.FileLock; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileStateInvalidException; +import org.openide.filesystems.FileSystem; +import org.openide.util.Exceptions; +import org.openide.cookies.EditorCookie; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public class ParsingUtils { + + private final FileObject currentFile; + + public ParsingUtils(FileObject file) { + this.currentFile = file; + } + + public ParsingUtils() { + this.currentFile = null; + } + + private PHPParseResult phpParserResult; + + public FakeFileObject createFileObject(String phpText) { + return new FakeFileObject(phpText); + } + + public void parsePhpText(String phpText) { + FakeFileObject file = new FakeFileObject(phpText); + if (currentFile != null) { + file.setParent(currentFile.getParent()); + } + parseFileObject(file); + } + + public void parseFileObject(FileObject file){ + Document doc = openDocument(file); + + try { + Source source = Source.create(doc); + + if (source == null){ + return; + } + + Document sourceDoc = source.getDocument(false); + + if (sourceDoc == null) { + return; + } + + source.createSnapshot(); + ParserManager.parse(Collections.singletonList(source), new UserTask() { + + @Override + public void run(ResultIterator resultIterator) throws Exception { + Parser.Result parserResult = resultIterator.getParserResult(); + if (parserResult instanceof PHPParseResult) { + phpParserResult = (PHPParseResult) parserResult; + } + } + }); + + } catch (ParseException ex) { + Exceptions.printStackTrace(ex); + } + } + + public PHPParseResult getParserResult() { + return phpParserResult; + } + + public Document openDocument(FileObject f) { + try { + DataObject dataObject = DataObject.find(f); + EditorCookie ec = dataObject.getLookup().lookup(EditorCookie.class); + return ec.openDocument(); + } catch (IOException ex) { + throw new IllegalStateException(ex); + } + } + + public class FakeFileObject extends FileObject { + + InputStream stream; + FileObject parent; + + public FakeFileObject(String text) { + stream = new ByteArrayInputStream(text.getBytes()); + } + + @Override + public String getName() { + return "test"; + } + + @Override + public String getExt() { + return "php"; + } + + @Override + public void rename(FileLock fl, String string, String string1) throws IOException { + // + } + + @Override + public FileSystem getFileSystem() throws FileStateInvalidException { + return new FakeFileSystem(); + } + + public void setParent(FileObject parent) { + this.parent = parent; + } + + @Override + public FileObject getParent() { + return parent; + } + + @Override + public boolean isFolder() { + return false; + } + + @Override + public Date lastModified() { + return new Date(); + } + + @Override + public boolean isRoot() { + return false; + } + + @Override + public boolean isData() { + return false; + } + + @Override + public boolean isValid() { + return true; + } + + @Override + public void delete(FileLock fl) throws IOException { + // + } + + @Override + public Object getAttribute(String string) { + return null; + } + + @Override + public void setAttribute(String string, Object o) throws IOException { + // + } + + @Override + public Enumeration getAttributes() { + return null; + } + + @Override + public void addFileChangeListener(FileChangeListener fl) { + // + } + + @Override + public void removeFileChangeListener(FileChangeListener fl) { + // + } + + @Override + public long getSize() { + return 1; + } + + @Override + public InputStream getInputStream() throws FileNotFoundException { + return stream; + } + + @Override + public OutputStream getOutputStream(FileLock fl) throws IOException { + return null; + } + + @Override + public FileLock lock() throws IOException { + return null; + } + + //deprecated + @SuppressWarnings("deprecation") + @Override + public void setImportant(boolean bln) { + // + } + + @Override + public FileObject[] getChildren() { + return new FileObject[0]; + } + + @Override + public FileObject getFileObject(String string, String string1) { + return null; + } + + @Override + public FileObject createFolder(String string) throws IOException { + return null; + } + + @Override + public FileObject createData(String string, String string1) throws IOException { + return null; + } + + //deprecated + @SuppressWarnings("deprecation") + @Override + public boolean isReadOnly() { + return true; + } + + } + + class FakeFileSystem extends AbstractFileSystem + implements AbstractFileSystem.Info, AbstractFileSystem.List, AbstractFileSystem.Change { + + String dir = "dir"; + + @SuppressWarnings(value = "LeakingThisInConstructor") + public FakeFileSystem() { + this.info = this; + this.list = this; + this.change = this; + this.attr = new DefaultAttributes(info, change, list); + } + + @Override + public String getDisplayName() { + return "Fake FS"; + } + + @Override + public boolean isReadOnly() { + return true; + } + + @Override + public Date lastModified(String name) { + return new Date(5000L); + } + + @Override + public boolean folder(String name) { + return dir.equals(name); + } + + @Override + public boolean readOnly(String name) { + return false; + } + + @Override + public String mimeType(String name) { + return "text/x-php5"; + } + + @Override + public long size(String name) { + return 0; + } + + @Override + public InputStream inputStream(String name) throws FileNotFoundException { + return new ByteArrayInputStream(new byte[0]); + } + + @Override + public OutputStream outputStream(String name) throws IOException { + return new ByteArrayOutputStream(); + } + + @Override + public void lock(String name) throws IOException { + } + + @Override + public void unlock(String name) { + } + + @Override + public void markUnimportant(String name) { + } + + @Override + public String[] children(String f) { + if ("".equals(f)) { + return new String[]{dir}; + } else { + return new String[]{"empty.txt"}; + } + } + + @Override + public void createFolder(String name) throws IOException { + throw new IOException(); + } + + @Override + public void createData(String name) throws IOException { + throw new IOException(); + } + + @Override + public void rename(String oldName, String newName) throws IOException { + } + + @Override + public void delete(String name) throws IOException { + throw new IOException(); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java new file mode 100644 index 000000000000..d3ccef8d5580 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -0,0 +1,318 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.path; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bogdan + */ +public class BladePathUtils { + + public static final String LARAVEL_VIEW_PATH = "resources/views"; //NOI18N + public static final String BLADE_EXT = ".blade.php"; //NOI18N + + /** + * first we need to extract the root folder of view after we apply a generic + * path sanitize for blade paths (ex "my.path" -> "my/path.blade.php") + * + * @param contextFile + * @param viewPath + * @return List + */ + public static List findFileObjectsForBladeViewPath(FileObject contextFile, String viewPath) { + List fileViewAssociationList = new ArrayList<>(); + Project project = ProjectConvertors.getNonConvertorOwner(contextFile); + + if (project == null) { + return fileViewAssociationList; + } + + HashSet viewRoots = getDefaultRoots(project); + viewRoots.addAll(getCustomViewsRoots(project, contextFile)); + + if (viewRoots.isEmpty()) { + return fileViewAssociationList; + } + + String sanitizedBladePath = viewPathToFilePath(viewPath); //NOI18N + + for (FileObject viewRoot : viewRoots) { + FileObject includedFile = viewRoot.getFileObject(sanitizedBladePath, true); + + if (includedFile != null && includedFile.isValid()) { + fileViewAssociationList.add(includedFile); + } + } + + return fileViewAssociationList; + } + + public static FileObject findFileObjectForBladeViewPath(FileObject contextFile, String viewPath) { + FileObject res = null; + Project project = ProjectConvertors.getNonConvertorOwner(contextFile); + + if (project == null) { + return res; + } + + HashSet viewRoots = getDefaultRoots(project); + viewRoots.addAll(getCustomViewsRoots(project, contextFile)); + + if (viewRoots.isEmpty()) { + return res; + } + + String sanitizedBladePath = viewPathToFilePath(viewPath); + + for (FileObject viewRoot : viewRoots) { + FileObject includedFile = viewRoot.getFileObject(sanitizedBladePath, true); + + if (includedFile != null && includedFile.isValid()) { + return includedFile; + } + } + + return res; + } + + /** + * + * + * @param contextFile + * @param prefixViewPath + * @return List + */ + public static List getParentChildrenFromPrefixPath(FileObject contextFile, + String prefixViewPath) { + List list = new ArrayList<>(); + //this should be a fallback + Project project = ProjectConvertors.getNonConvertorOwner(contextFile); + + if (project == null) { + return list; + } + + HashSet viewRoots = getDefaultRoots(project); + viewRoots.addAll(getCustomViewsRoots(project, contextFile)); + + if (viewRoots.isEmpty()) { + return list; + } + + String unixPath = prefixViewPath.replace(".", "/"); + int relativeSlash; + + //fix issues with lastIndexOf search + relativeSlash = unixPath.lastIndexOf("/"); + + HashSet filteredViewRoots = new HashSet<>(); + + Map relativeFilePathMap = new HashMap<>(); + + if (relativeSlash > 0) { + //filter only relative folders + for (FileObject rootFolder : viewRoots) { + FileObject relativeViewRoot = rootFolder.getFileObject(unixPath.substring(0, relativeSlash)); + + if (relativeViewRoot != null && relativeViewRoot.isValid()) { + relativeFilePathMap.put(unixPath, relativeViewRoot); + } + } + } else { + //include all root folders + filteredViewRoots = viewRoots; + } + + String relativePrefixToCompare; + + if (relativeSlash > 0) { + //extract the path name prefix + relativePrefixToCompare = unixPath.substring(relativeSlash+1, unixPath.length()); + } else { + //root reference + relativePrefixToCompare = unixPath; + } + + if (unixPath.endsWith("/")) { + //add children + for (FileObject rootFolder : filteredViewRoots) { + list.addAll(Arrays.asList(rootFolder.getChildren())); + } + for (Map.Entry entry : relativeFilePathMap.entrySet()){ + list.addAll(Arrays.asList(entry.getValue().getChildren())); + } + } else { + //filter by filename in relative context + for (FileObject rootFolder : filteredViewRoots) { + for (FileObject file : rootFolder.getChildren()) { + String filePath = file.getPath().replace(rootFolder.getPath() + "/", ""); + if (filePath.startsWith(relativePrefixToCompare)) { + list.add(file); + } + } + } + + for (Map.Entry entry : relativeFilePathMap.entrySet()){ + for (FileObject file : entry.getValue().getChildren()) { + if (file.getName().startsWith(relativePrefixToCompare)){ + list.add(file); + } + } + } + } + + //empty list + viewRoots.clear(); + return list; + } + + public static List getCustomViewsRoots(Project project, FileObject contextFile) { + List list = new ArrayList<>(); + + String[] views = BladeProjectProperties.getInstance(project).getViewsPathList(); + + if (views.length > 0) { + views = Arrays.stream(views).filter(s -> !s.isEmpty()).toArray(String[]::new); + Arrays.sort(views, (String s1, String s2) -> { + //clear empty configs + if (s1 == null || s2 == null) { + return 0; + } + return s2.length() - s1.length();// comparision + }); + for (String view : views) { + if (view.length() == 0) { + continue; + } + File viewPath = new File(view); + if (!viewPath.exists()) { + continue; + } + + list.add(FileUtil.toFileObject(viewPath)); + } + } + return list; + } + + public static String toBladeViewPath(FileObject file) { + String path = null; + Project project = ProjectUtils.getMainOwner(file); + + if (project == null) { + return path; + } + + String filePath = file.getPath(); + FileObject defaultLaravelPath = project.getProjectDirectory().getFileObject(LARAVEL_VIEW_PATH); + + if (defaultLaravelPath != null) { + //belongs to the default folder + String viewFolderPath = defaultLaravelPath.getPath(); + if (filePath.startsWith(viewFolderPath)) { + String bladePath = BladePathUtils.toBladeViewPath(filePath.replace(viewFolderPath, "")); + //starting slash + if (bladePath.startsWith(".")) { + bladePath = bladePath.substring(1, bladePath.length()); + } + return bladePath; + } + } + + String[] viewFolders = BladeProjectProperties.getInstance(project).getViewsPathList(); + + for (String viewFolder : viewFolders) { + if (viewFolder.length() == 0) { + continue; + } + File viewPath = new File(viewFolder); + if (!viewPath.exists()) { + continue; + } + + //we need to keep the same format + FileObject viewFile = FileUtil.toFileObject(viewPath); + String viewFileAbsPath = viewFile.getPath(); + if (filePath.startsWith(viewFileAbsPath)) { + String relativePath = filePath.replace(viewFileAbsPath, ""); + if (!relativePath.startsWith("/")) { + //it doesn't belong to the folder + continue; + } + return BladePathUtils.toBladeViewPath(relativePath.substring(1)); + } + } + + return path; + } + + public static String getRelativeProjectPath(FileObject currentFile){ + Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); + if (projectOwner == null){ + return ""; + } + + String dirPath = projectOwner.getProjectDirectory().getPath(); + String relativePath = currentFile.getPath().replace(dirPath, ""); + + //only if we found the relative project path + if (currentFile.getPath().length() > relativePath.length()){ + return relativePath; + } + + return ""; + } + + public static String toBladeViewPath(String filePath){ + return filePath.replace(BLADE_EXT, "").replace("/", "."); + } + + public static String viewPathToFilePath(String viewPath){ + return viewPath.replace(".", "/") + BLADE_EXT; + } + + public static HashSet getDefaultRoots(Project project){ + HashSet defaultList = new HashSet<>(); + FileObject defaultViewsRoot = project.getProjectDirectory().getFileObject(LARAVEL_VIEW_PATH); + + if (defaultViewsRoot != null && defaultViewsRoot.isValid()){ + defaultList.add(defaultViewsRoot); + } + + return defaultList; + } + + public static String toBladeToProjectFilePath(String path){ + return LARAVEL_VIEW_PATH + "/" + viewPathToFilePath(path); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java new file mode 100644 index 000000000000..bffc0993746f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.preferences; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; +import java.util.prefs.Preferences; +import org.netbeans.api.editor.mimelookup.MimeLookup; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.openide.util.WeakListeners; + +/** + * this will be moved to PHP Options + * + * @author bogdan + */ +public final class GeneralPreferencesUtils { + + private static final AtomicBoolean INITED = new AtomicBoolean(false); + + public static final String ENABLE_FORMATTING = "enable-blade-format"; // NOI18N + public static final String ENABLE_INDENTATION = "enable-blade-indent"; // NOI18N + public static final String ENABLE_AUTO_TAG_COMPLETION = "enable-auto-tag-completion"; // NOI18N + + private static Boolean enableFormatting = null; + private static Boolean enableIndentation = null; + private static Boolean enableAutoTagCompletion = null; + + // default values + private static Preferences PREFERENCES; + + private static final PreferenceChangeListener PREFERENCES_TRACKER = new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + enableFormatting = PREFERENCES.getBoolean(ENABLE_FORMATTING, false); + enableIndentation = PREFERENCES.getBoolean(ENABLE_INDENTATION, false); + enableAutoTagCompletion = PREFERENCES.getBoolean(ENABLE_AUTO_TAG_COMPLETION, false); + } + }; + + private GeneralPreferencesUtils() { + } + + public static boolean isFormattingEnabled(){ + lazyInit(); + return enableFormatting; + } + + public static boolean isIndentationEnabled(){ + lazyInit(); + return enableIndentation; + } + + public static boolean isAutoTagCompletionEnabled(){ + lazyInit(); + return enableAutoTagCompletion; + } + + private static void lazyInit() { + if (INITED.compareAndSet(false, true)) { + PREFERENCES = MimeLookup.getLookup(BladeLanguage.MIME_TYPE).lookup(Preferences.class); + PREFERENCES.addPreferenceChangeListener(WeakListeners.create(PreferenceChangeListener.class, PREFERENCES_TRACKER, PREFERENCES)); + PREFERENCES_TRACKER.preferenceChange(null); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java new file mode 100644 index 000000000000..98790bec04fb --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.preferences; + +import java.util.prefs.Preferences; +import org.netbeans.api.editor.mimelookup.MimeLookup; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import static org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils.ENABLE_AUTO_TAG_COMPLETION; + +/** + * + * @author bogdan + */ +public class ModulePreferences { + public static Preferences getPreferences(){ + return MimeLookup.getLookup(BladeLanguage.MIME_TYPE).lookup(Preferences.class); + } + + public static void setPrefBoolean(String key, boolean value){ + getPreferences().putBoolean(key, value); + } + + public static boolean isAutoTagCompletionEnabled(){ + return ModulePreferences.getPreferences().getBoolean(ENABLE_AUTO_TAG_COMPLETION, true); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java new file mode 100644 index 000000000000..a37be0c2dec5 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + + +import java.util.Objects; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class BladePathInfo { + + private final FileObject sourceFile; + private final String bladePath; + + public BladePathInfo(FileObject sourceFile, String bladePath) { + this.sourceFile = sourceFile; + this.bladePath = bladePath; + } + + public FileObject getSourceFile() { + return sourceFile; + } + + public String getBladePath() { + return bladePath; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 53 * hash + Objects.hashCode(this.sourceFile); + hash = 53 * hash + Objects.hashCode(this.bladePath); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final BladePathInfo other = (BladePathInfo) obj; + if (!Objects.equals(this.bladePath, other.bladePath)) { + return false; + } + return Objects.equals(this.sourceFile, other.sourceFile); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java new file mode 100644 index 000000000000..dc67db853139 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.CancellationException; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.swing.text.BadLocationException; +import javax.swing.text.Position; +import javax.swing.text.StyledDocument; +import org.netbeans.api.editor.document.LineDocument; +import org.netbeans.api.editor.document.LineDocumentUtils; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex.IndexedOffsetReference; +import org.netbeans.modules.php.blade.editor.indexing.QueryUtils; + +import org.netbeans.modules.refactoring.api.AbstractRefactoring; +import org.netbeans.modules.refactoring.api.Problem; +import org.netbeans.modules.refactoring.api.WhereUsedQuery; +import org.netbeans.modules.refactoring.spi.RefactoringElementsBag; +import org.netbeans.modules.refactoring.spi.RefactoringPlugin; +import org.netbeans.modules.refactoring.spi.RefactoringPluginFactory; +import org.netbeans.modules.refactoring.spi.SimpleRefactoringElementImplementation; +import org.openide.cookies.EditorCookie; +import org.openide.filesystems.FileObject; +import org.openide.text.CloneableEditorSupport; +import org.openide.text.PositionBounds; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.lookup.ServiceProvider; + +/** + * + * @author bogdan + */ +public class BladePathUsage { + + private static final class WhereUsedRefactoringPlugin implements RefactoringPlugin { + + private final WhereUsedQuery query; + private final BladePathInfo bladeFileReference; + private final AtomicBoolean cancel = new AtomicBoolean(); + + public WhereUsedRefactoringPlugin(WhereUsedQuery query, BladePathInfo bladeFileReference) { + this.query = query; + this.bladeFileReference = bladeFileReference; + } + + @Override + public Problem preCheck() { + return null; + } + + @Override + public Problem checkParameters() { + return null; + } + + @Override + public Problem fastCheckParameters() { + return null; + } + + @Override + public void cancelRequest() { + cancel.set(true); + } + + @Override + public Problem prepare(RefactoringElementsBag refactoringElements) { + try { + FileObject sourceFO = this.bladeFileReference.getSourceFile(); + + if (!BladeLanguage.MIME_TYPE.equals(sourceFO.getMIMEType())) { + return null; + } + + List references = QueryUtils.getIncludePathReferences(this.bladeFileReference.getBladePath(), sourceFO); + + for (IndexedOffsetReference reference : references) { + if (cancel.get()) { + throw new CancellationException(); + } + + PositionBounds bounds; + FileObject fo = reference.getOriginFile(); + int start = reference.getStart(); + int end = start + reference.getReference().length(); + try { + CloneableEditorSupport es = fo.getLookup().lookup(CloneableEditorSupport.class); + EditorCookie ec = fo.getLookup().lookup(EditorCookie.class); + StyledDocument doc = ec.openDocument(); + LineDocument ldoc = (LineDocument) doc; + + int rowStart = LineDocumentUtils.getLineStart(ldoc, start); + int rowEnd = LineDocumentUtils.getLineEnd(ldoc, end); + + bounds = new PositionBounds( + es.createPositionRef(start, Position.Bias.Forward), + es.createPositionRef(end, Position.Bias.Forward) + ); + + String lineText = doc.getText(rowStart, rowEnd - rowStart); + //offset quote symbols + String annotatedLine + = lineText.substring(0, start - rowStart + 1) + + "" + + lineText.substring(start - rowStart + 1, end - rowStart + 2) + + "" + + lineText.substring(end - rowStart + 2); + refactoringElements.add(query, new BladeRefactoringElementImpl(annotatedLine, fo, bounds)); + } catch (BadLocationException | IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + return null; + } catch (CancellationException ex) { + return new Problem(false, "Cancelled"); + } + } + + } + + @ServiceProvider(service = RefactoringPluginFactory.class) + public static class FactoryImpl implements RefactoringPluginFactory { + + @Override + public RefactoringPlugin createInstance(AbstractRefactoring refactoring) { + if (refactoring instanceof WhereUsedQuery) { + WhereUsedQuery q = (WhereUsedQuery) refactoring; + BladePathInfo symbolInformation = q.getRefactoringSource().lookup(BladePathInfo.class); + if (symbolInformation != null) { + return new WhereUsedRefactoringPlugin(q, symbolInformation); + } + } + return null; + } + + } + + public static class BladeRefactoringElementImpl extends SimpleRefactoringElementImplementation { + + private final String annotatedLine; + private final FileObject file; + private final PositionBounds bounds; + + public BladeRefactoringElementImpl(String annotatedLine, FileObject file, PositionBounds bounds) { + this.annotatedLine = annotatedLine; + this.file = file; + this.bounds = bounds; + } + + @Override + public String getText() { + return "Element usage"; + } + + @Override + public String getDisplayText() { + return annotatedLine; + } + + @Override + public void performChange() { + // Currently the BladeRefactoringElementImpl is only used for the + // WhereUsedRefactoring, which is not doing changes + throw new UnsupportedOperationException(); + } + + @Override + public Lookup getLookup() { + return Lookup.EMPTY; + } + + @Override + public FileObject getParentFile() { + return file; + } + + @Override + public PositionBounds getPosition() { + return bounds; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java new file mode 100644 index 000000000000..4807dfda165e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + +import java.io.IOException; +import javax.swing.JEditorPane; +import javax.swing.SwingUtilities; +import javax.swing.text.AbstractDocument; +import javax.swing.text.Document; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.refactoring.api.ui.ExplorerContext; +import org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider; +import org.netbeans.modules.refactoring.spi.ui.UI; +import org.openide.cookies.*; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.loaders.DataObject; +import org.openide.nodes.Node; +import org.openide.text.CloneableEditorSupport; +import org.openide.text.NbDocument; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; +import org.openide.windows.TopComponent; + +/** + * + * @author bogdan + */ +@NbBundle.Messages({"WARN_CannotPerformHere=Cannot perform rename here."}) +@org.openide.util.lookup.ServiceProvider(service = org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider.class, position = 300) +public class RefactoringActionsProvider extends ActionsImplementationProvider { + + @Override + @Messages("NM_Unknown=Unknown") + public void doFindUsages(Lookup lookup) { + Runnable start = () -> { + EditorCookie ec = lookup.lookup(EditorCookie.class); + + if (isFromEditor(ec)) { + JEditorPane c = ec.getOpenedPanes()[0]; + Document doc = c.getDocument(); + AbstractDocument abstractDoc = (doc instanceof AbstractDocument) ? ((AbstractDocument) doc) : null; + FileObject file = NbEditorUtilities.getFileObject(doc); + int caretPos = c.getCaretPosition(); + + String name = "Unknown"; + + if (abstractDoc != null) { + abstractDoc.readLock(); + } + try { + TokenSequence ts = TokenHierarchy.get(doc).tokenSequence(); + if (ts != null) { + ts.move(caretPos); + if (ts.moveNext()) { + name = ts.token().text().toString(); + } + } + } finally { + if (abstractDoc != null) { + abstractDoc.readUnlock(); + } + } + + BladePathInfo si = new BladePathInfo(file, name); + UI.openRefactoringUI(new WhereBladePathUsedRefactoringUIImpl(si), + TopComponent.getRegistry().getActivated()); + } + }; + SwingUtilities.invokeLater(start); + } + + @Override + public boolean canCopy(Lookup lookup) { + boolean isBlade = isBlade(lookup); + if (!isBlade) { + return super.canCopy(lookup); + } + return true; + } + + @Override + public void doCopy(final Lookup lookup) { + + final FileObject dir = getTarget(lookup); + + //should treat multiple files + Runnable start = () -> { + Node node = lookup.lookup(Node.class); + FileObject file = node.getLookup().lookup(FileObject.class); + FileObject dirTarget = (dir!= null && dir.isFolder()) ? dir : file.getParent(); + + String name = file.getNameExt(); + String existingFileName = file.getNameExt(); + int counter = 1; + while(counter < 50 && dirTarget.getFileObject(existingFileName)!= null){ + //shouldn't be the case + existingFileName = name.substring(0, name.length() - ".blade.php".length()) + "_" + counter + ".blade.php"; + counter++; + } + + String incrementSuffix = counter > 1 ? "_" + (counter - 1) : ""; + String resultName = existingFileName.substring(0, name.length() - ".blade.php".length()) + incrementSuffix; + try { + FileUtil.copyFile(file, dirTarget, resultName, "blade.php"); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + }; + SwingUtilities.invokeLater(start); + } + + public boolean isBlade(Lookup lookup) { + boolean ret = false; + Node node = lookup.lookup(Node.class); + + //hack to identify a blade file ? + if (node != null && node.getDisplayName().endsWith(".blade.php")) { + ret = true; + } + return ret; + } + + public static FileObject getTarget(Lookup look) { + ExplorerContext drop = look.lookup(ExplorerContext.class); + if (drop == null) { + return null; + } + Node n = drop.getTargetNode(); + if (n == null) { + return null; + } + DataObject dob = n.getCookie(DataObject.class); + if (dob != null) { + return dob.getPrimaryFile(); + } + return null; + } + + @Override + public boolean canFindUsages(Lookup lookup) { + return isBlade(lookup); + } + + public static boolean isFromEditor(EditorCookie ec) { + if (ec != null && NbDocument.findRecentEditorPane(ec) != null) { + TopComponent activetc = TopComponent.getRegistry().getActivated(); + if (activetc instanceof CloneableEditorSupport.Pane) { + return true; + } + } + return false; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java new file mode 100644 index 000000000000..bdd16a76b86f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + +import javax.swing.event.ChangeListener; +import org.netbeans.modules.refactoring.api.AbstractRefactoring; +import org.netbeans.modules.refactoring.api.Problem; +import org.netbeans.modules.refactoring.api.WhereUsedQuery; +import org.netbeans.modules.refactoring.spi.ui.CustomRefactoringPanel; +import org.netbeans.modules.refactoring.spi.ui.RefactoringUI; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle.Messages; +import org.openide.util.lookup.Lookups; + +/** + * + * @author bogdan + */ +public class WhereBladePathUsedRefactoringUIImpl implements RefactoringUI { + private final BladePathInfo symbolInformation; + + public WhereBladePathUsedRefactoringUIImpl(BladePathInfo symbolInformation) { + this.symbolInformation = symbolInformation; + } + + @Override + public String getName() { + return symbolInformation.getBladePath(); + } + + @Override + @Messages({ + "# {0} - identifier", + "DESC_Usages=Usages of {0}" + }) + public String getDescription() { + return Bundle.DESC_Usages(symbolInformation.getBladePath()); + } + + @Override + public boolean isQuery() { + return true; + } + + @Override + public CustomRefactoringPanel getPanel(ChangeListener parent) { + return null; + } + + @Override + public Problem setParameters() { + return null; + } + + @Override + public Problem checkParameters() { + return null; + } + + @Override + public boolean hasParameters() { + return false; + } + + @Override + public AbstractRefactoring getRefactoring() { + return new WhereUsedQuery(Lookups.fixed(symbolInformation)); + } + + @Override + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java new file mode 100644 index 000000000000..79e201d1779e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.typinghooks; + +import java.util.Map; +import java.util.WeakHashMap; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.api.editor.mimelookup.MimePath; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.spi.editor.typinghooks.TypedTextInterceptor; + +/** + * auto complete for '[', '(', '\'', '"' + * + * @author bhaidu + */ +public class BladeTypedTextInterceptor implements TypedTextInterceptor { + + static final Map CHAR_PAIR = new WeakHashMap<>(); + + public static enum TagType { + CONTENT, + RAW, + COMMENT + } + /** + * auto complete char pair + */ + static { + CHAR_PAIR.put('(', ')'); + CHAR_PAIR.put('[', ']'); + CHAR_PAIR.put('\'', '\''); + CHAR_PAIR.put('"', '"'); + } + + @Override + public boolean beforeInsert(Context cntxt) throws BadLocationException { + return false; + } + + @Override + public void insert(MutableContext context) throws BadLocationException { + if (context.getReplacedText().length() != 0) { + return; + } + + char ch = context.getText().charAt(0); + + if (CHAR_PAIR.containsKey(ch)) { + completePairChar(context, ch, CHAR_PAIR.get(ch)); + return; + } + + if (!isAutoTagCompletionEnabled()){ + return; + } + + String typedText = context.getText(); + + Map TagParts = new WeakHashMap<>(); + TagParts.put("{", TagType.CONTENT); + TagParts.put("!", TagType.RAW); + TagParts.put("-", TagType.CONTENT); + + TagType tagType = TagParts.get(typedText); + + if (tagType == null){ + return; + } + + int offset = context.getOffset(); + + if (offset < 2){ + return; + } + + Document document = context.getDocument(); + TokenHierarchy th = TokenHierarchy.get(document); + TokenSequence ts = th.tokenSequence(); + ts.move(context.getOffset() - 1); + ts.moveNext(); + + Token token = ts.token(); + + if (token == null || !(token.id() instanceof BladeTokenId)){ + return; + } + + BladeTokenId bladeToken = (BladeTokenId) token.id(); + + String tokenText = token.text().toString(); + + switch (bladeToken) { + case HTML: + if (tokenText.equals("{") && tagType == TagType.CONTENT){ + context.setText("{ }}", 1); + } else if (tokenText.equals("{!") && tagType == TagType.RAW ){ + context.setText("! !!}", 1); + } else if (tokenText.equals("{{-") && tagType == TagType.COMMENT ){ + context.setText("- --}}", 1); + } + break; + } + } + + /** + * simple char context completion + * + * @param context + * @param chopen + * @param chclose + */ + private void completePairChar(MutableContext context, char chopen, char chclose) { + StringBuilder sb = new StringBuilder(); + sb.append(chopen); + sb.append(chclose); + String text = sb.toString(); + context.setText(text, 1); + } + + @Override + public void afterInsert(Context cntxt) throws BadLocationException { + + } + + @Override + public void cancelled(Context cntxt) { + + } + + public boolean isAutoTagCompletionEnabled(){ + return ModulePreferences.isAutoTagCompletionEnabled(); + } + + /** + * register for HTML also + */ + @MimeRegistrations(value = { + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = TypedTextInterceptor.Factory.class), + @MimeRegistration(mimeType = "text/html", service = TypedTextInterceptor.Factory.class) + }) + public static class Factory implements TypedTextInterceptor.Factory { + + @Override + public TypedTextInterceptor createTypedTextInterceptor(MimePath mimePath) { + return new BladeTypedTextInterceptor(); + } + + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form new file mode 100644 index 000000000000..b92b5b851cd8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form @@ -0,0 +1,140 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java new file mode 100644 index 000000000000..78f0e75981d8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.Desktop; +import java.awt.EventQueue; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.openide.filesystems.FileChooserBuilder; +import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +public class BladeDirectives extends javax.swing.JPanel { + + private final Project project; + BladeProjectProperties bladeProperties; + + /** + * Creates new form CustomizerIncludePath + * + * @param project + */ + public BladeDirectives(Project project) { + this.project = project; + bladeProperties = BladeProjectProperties.getInstance(project); + initComponents(); + init(); + } + + private void init() { + //the model reference is enough + customDirectivePathList.setModel(bladeProperties.getModelForDirectiveCusomizerPathList()); + } + + public void storeData() { + bladeProperties.storeDirectiveCustomizerPaths(); + CustomDirectives.resetInstance(project); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + includePathLabel = new javax.swing.JLabel(); + compilerPathFileButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + customDirectivePathList = new javax.swing.JList<>(); + removePathButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + + org.openide.awt.Mnemonics.setLocalizedText(includePathLabel, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.includePathLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(compilerPathFileButton, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.compilerPathFileButton.text_1")); // NOI18N + compilerPathFileButton.setToolTipText(org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.compilerPathFileButton.toolTipText_1")); // NOI18N + compilerPathFileButton.setActionCommand(org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.compilerPathFileButton.actionCommand_1")); // NOI18N + compilerPathFileButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + compilerPathFileButtonActionPerformed(evt); + } + }); + + jScrollPane1.setViewportView(customDirectivePathList); + + org.openide.awt.Mnemonics.setLocalizedText(removePathButton, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.removePathButton.text_1")); // NOI18N + removePathButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + removePathButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.jLabel1.text")); // NOI18N + + jLabel3.setForeground(new java.awt.Color(0, 51, 255)); + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.jLabel3.text")); // NOI18N + jLabel3.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + jLabel3MouseClicked(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 486, Short.MAX_VALUE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(compilerPathFileButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(removePathButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(includePathLabel) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel3) + .addComponent(jLabel1)))) + .addGap(0, 306, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(20, 20, 20) + .addComponent(includePathLabel) + .addGap(15, 15, 15) + .addComponent(jLabel1) + .addGap(8, 8, 8) + .addComponent(jLabel3) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(compilerPathFileButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(removePathButton))) + .addGap(0, 50, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void compilerPathFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_compilerPathFileButtonActionPerformed + assert EventQueue.isDispatchThread(); + File sources = new FileChooserBuilder(BladeDirectives.class) + .setFilesOnly(true) + .setTitle("Select compiler File Path") + .setDefaultWorkingDirectory(FileUtil.toFile(project.getProjectDirectory())) + .forceUseOfDefaultWorkingDirectory(true) + .showOpenDialog(); + if (sources != null) { + //TODO validate the path if it has directives + bladeProperties.addDirectiveCustomizerPath(FileUtil.normalizeFile(sources).getAbsolutePath()); + } + }//GEN-LAST:event_compilerPathFileButtonActionPerformed + + private void removePathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removePathButtonActionPerformed + int index = customDirectivePathList.getSelectedIndex(); + if (index > -1) { + bladeProperties.removeCustomizerPath(index); + } + + }//GEN-LAST:event_removePathButtonActionPerformed + + private void jLabel3MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel3MouseClicked + try { + Desktop.getDesktop().browse(new URI("https://laravel.com/docs/10.x/blade#extending-blade")); + } catch (URISyntaxException | IOException ex) { + Exceptions.printStackTrace(ex); + } + + }//GEN-LAST:event_jLabel3MouseClicked + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton compilerPathFileButton; + private javax.swing.JList customDirectivePathList; + private javax.swing.JLabel includePathLabel; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel3; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton removePathButton; + // End of variables declaration//GEN-END:variables +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java new file mode 100644 index 000000000000..7a8dd8fe2ab1 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JComponent; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * + * @author bhaidu + */ +public class BladeDirectivesCustomizerProvider implements ProjectCustomizer.CompositeCategoryProvider { + + public static final String BLADE_DIRECTIVES = "Custom Directives"; // NOI18N + + @NbBundle.Messages("BladeCompilerCustomizerProvider.name=Blade Directives") + @Override + public ProjectCustomizer.Category createCategory(Lookup lkp) { + return ProjectCustomizer.Category.create(BLADE_DIRECTIVES, BLADE_DIRECTIVES, null); + } + + @Override + public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + Project project = context.lookup(Project.class); + assert project != null; + + BladeDirectives panel = new BladeDirectives(project); + category.setOkButtonListener(new BladeDirectivesCustomizerProvider.Listener(panel)); + return panel; + } + + private class Listener implements ActionListener { + + private final BladeDirectives panel; + + public Listener(BladeDirectives panel) { + this.panel = panel; + } + + @Override + public void actionPerformed(ActionEvent e) { + this.panel.storeData(); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form new file mode 100644 index 000000000000..6c452fb0787d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form @@ -0,0 +1,66 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java new file mode 100644 index 000000000000..18ed2f2a02f2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils; +/** + * + * @author bhaidu + */ +public class BladeGeneralSettings extends javax.swing.JPanel { + + /** + * Creates new form BladeGeneral + * @param project + */ + public BladeGeneralSettings(Project project) { + initComponents(); + init(); + } + + private void init() { + this.formatting_enabled.setSelected(GeneralPreferencesUtils.isFormattingEnabled()); + this.indentation_enabled.setSelected(GeneralPreferencesUtils.isIndentationEnabled()); + } + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + formatting_enabled = new javax.swing.JCheckBox(); + indentation_enabled = new javax.swing.JCheckBox(); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeGeneralSettings.class, "BladeGeneralSettings.jLabel1.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(formatting_enabled, org.openide.util.NbBundle.getMessage(BladeGeneralSettings.class, "BladeGeneralSettings.formatting_enabled.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(indentation_enabled, org.openide.util.NbBundle.getMessage(BladeGeneralSettings.class, "BladeGeneralSettings.indentation_enabled.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(formatting_enabled) + .addComponent(jLabel1) + .addComponent(indentation_enabled)) + .addContainerGap(184, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(formatting_enabled) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(indentation_enabled) + .addGap(0, 229, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox formatting_enabled; + private javax.swing.JCheckBox indentation_enabled; + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables + + public void storeData() { + ModulePreferences.setPrefBoolean(GeneralPreferencesUtils.ENABLE_FORMATTING, this.formatting_enabled.isSelected()); + ModulePreferences.setPrefBoolean(GeneralPreferencesUtils.ENABLE_INDENTATION, this.indentation_enabled.isSelected()); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java new file mode 100644 index 000000000000..c46e7ae390ec --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JComponent; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * + * @author bhaidu + */ +public class BladeOptionsCustomizerProvider implements ProjectCustomizer.CompositeCategoryProvider { + + public static final String VIEWS_FOLDERS = "views_folders"; // NOI18N + + @Override + public ProjectCustomizer.Category createCategory(Lookup lkp) { + return ProjectCustomizer.Category.create(VIEWS_FOLDERS, + NbBundle.getMessage(BladeOptionsCustomizerProvider.class, + "LBL_ViewsFolders"), null); + } + + @Override + public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + Project project = context.lookup(Project.class); + assert project != null; + + BladeViewsFoldersPanel panel = new BladeViewsFoldersPanel(project); + category.setOkButtonListener(new Listener(panel)); + return panel; + } + + private class Listener implements ActionListener { + private final BladeViewsFoldersPanel panel; + public Listener(BladeViewsFoldersPanel panel){ + this.panel = panel; + } + @Override + public void actionPerformed(ActionEvent e) { + this.panel.storeData(); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java new file mode 100644 index 000000000000..d0dc423b6f17 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JComponent; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * Blade settings node + * + * @author bhaidu + */ +public class BladeSettingsCustomizerProvider implements ProjectCustomizer.CompositeCategoryProvider { + + public static final String CUSTOMIZER_IDENT = "Laravel Blade"; // NOI18N + + @NbBundle.Messages("BladeSettingsCustomizerProvider.name=Blade") + @Override + public ProjectCustomizer.Category createCategory(Lookup lkp) { + List subcategories = new ArrayList<>(); + BladeOptionsCustomizerProvider optionsCustomizer = new BladeOptionsCustomizerProvider(); + subcategories.add(optionsCustomizer.createCategory(lkp)); + BladeDirectivesCustomizerProvider directiveCustomizer = new BladeDirectivesCustomizerProvider(); + subcategories.add(directiveCustomizer.createCategory(lkp)); + return ProjectCustomizer.Category.create(CUSTOMIZER_IDENT, + NbBundle.getMessage(BladeSettingsCustomizerProvider.class, "LBL_LaravelBlade"), null, + subcategories.toArray(new ProjectCustomizer.Category[0])); + } + + @Override + public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + switch (category.getName()) { + case BladeOptionsCustomizerProvider.VIEWS_FOLDERS: + BladeOptionsCustomizerProvider provider = new BladeOptionsCustomizerProvider(); + return provider.createComponent(category, context); + case BladeDirectivesCustomizerProvider.BLADE_DIRECTIVES: + BladeDirectivesCustomizerProvider directivesProvider = new BladeDirectivesCustomizerProvider(); + return directivesProvider.createComponent(category, context); + } + + return createGeneralSettingsComponent(category, context); + } + + public JComponent createGeneralSettingsComponent(ProjectCustomizer.Category category, Lookup context) { + Project project = context.lookup(Project.class); + assert project != null; + + BladeGeneralSettings panel = new BladeGeneralSettings(project); + category.setOkButtonListener(new Listener(panel)); + return panel; + } + + private class Listener implements ActionListener { + + private final BladeGeneralSettings panel; + + public Listener(BladeGeneralSettings panel) { + this.panel = panel; + } + + @Override + public void actionPerformed(ActionEvent e) { + this.panel.storeData(); + } + + } + + @ProjectCustomizer.CompositeCategoryProvider.Registration( + projectType = "org.netbeans.modules.web.clientproject", // NOI18N + position = 367) + public static BladeSettingsCustomizerProvider forHtml5Project() { + return new BladeSettingsCustomizerProvider(); + } + + @ProjectCustomizer.CompositeCategoryProvider.Registration( + projectType = "org-netbeans-modules-php-project", // NOI18N + position = 402) + public static ProjectCustomizer.CompositeCategoryProvider forPhpProject() { + return new BladeSettingsCustomizerProvider(); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form new file mode 100644 index 000000000000..0fbe951aaca2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form @@ -0,0 +1,169 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java new file mode 100644 index 000000000000..3d28314d3b43 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java @@ -0,0 +1,233 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.EventQueue; +import java.io.File; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.indexing.IndexManager; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.filesystems.*; +import org.openide.util.ChangeSupport; +import org.openide.util.NbBundle; + +@NbBundle.Messages("BladePanel.options.keywords.tabTitle=Frameworks & Tools") +@OptionsPanelController.Keywords( + keywords = { + "php", "blade" + }, + location = "Html5", + tabTitle = "#BladePanel.options.keywords.tabTitle" +) + +public final class BladeViewsFoldersPanel extends javax.swing.JPanel { + + private final ChangeSupport changeSupport = new ChangeSupport(this); + private final Project project; + BladeProjectProperties bladeProperties; + + BladeViewsFoldersPanel(Project project) { + assert project != null; + this.project = project; + bladeProperties = BladeProjectProperties.getInstance(project); + initComponents(); + init(); + } + + private void init(){ + viewsPathList.setModel(bladeProperties.getModelViewsPathList()); + nonLaravelViewDeclFinder.setSelected(bladeProperties.getNonLaravelDeclFinderFlag()); + } + + public void storeData(){ + bladeProperties.storeViewsPaths(); + bladeProperties.storeNonLaravelDeclFinderFlag(nonLaravelViewDeclFinder.isSelected()); + } + + public void addChangeListener(ChangeListener listener) { + changeSupport.addChangeListener(listener); + } + + void fireChange() { + changeSupport.fireChange(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + toggleCommentButtonGroup = new javax.swing.ButtonGroup(); + jLabel1 = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + viewsPathList = new javax.swing.JList<>(); + addViewFolderButton = new javax.swing.JButton(); + removeViewFolderButton = new javax.swing.JButton(); + reindexViewsButton = new javax.swing.JButton(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + reindexViewFolderButton = new javax.swing.JButton(); + nonLaravelViewDeclFinder = new javax.swing.JCheckBox(); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel1.text")); // NOI18N + jLabel1.setToolTipText(org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel1.toolTipText")); // NOI18N + + jScrollPane1.setViewportView(viewsPathList); + + org.openide.awt.Mnemonics.setLocalizedText(addViewFolderButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.addViewFolderButton.text")); // NOI18N + addViewFolderButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + addViewFolderButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(removeViewFolderButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.removeViewFolderButton.text")); // NOI18N + removeViewFolderButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + removeViewFolderButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(reindexViewsButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.reindexViewsButton.text")); // NOI18N + reindexViewsButton.setToolTipText(org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.reindexViewsButton.toolTipText")); // NOI18N + reindexViewsButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + reindexViewsButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel3.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel4.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(reindexViewFolderButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.reindexViewFolderButton.text")); // NOI18N + reindexViewFolderButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + reindexViewFolderButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(nonLaravelViewDeclFinder, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.nonLaravelViewDeclFinder.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(jScrollPane1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(removeViewFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(addViewFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(reindexViewFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addComponent(reindexViewsButton) + .addComponent(jLabel4) + .addComponent(nonLaravelViewDeclFinder)) + .addGap(0, 83, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel4) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(addViewFolderButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(removeViewFolderButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(reindexViewFolderButton)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(reindexViewsButton) + .addGap(18, 18, 18) + .addComponent(nonLaravelViewDeclFinder) + .addContainerGap(144, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void addViewFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addViewFolderButtonActionPerformed + assert EventQueue.isDispatchThread(); + File sources = new FileChooserBuilder(BladeDirectives.class) + .setDirectoriesOnly(true) + .setTitle("Select View Folder Path") + .setDefaultWorkingDirectory(FileUtil.toFile(project.getProjectDirectory())) + .forceUseOfDefaultWorkingDirectory(true) + .showOpenDialog(); + if (sources != null) { + //TODO validate the path if it has blade files ? + bladeProperties.addViewsPath(FileUtil.normalizeFile(sources).getAbsolutePath()); + } + }//GEN-LAST:event_addViewFolderButtonActionPerformed + + private void removeViewFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeViewFolderButtonActionPerformed + int index = viewsPathList.getSelectedIndex(); + if (index > -1) { + bladeProperties.removeViewsPath(index); + } + }//GEN-LAST:event_removeViewFolderButtonActionPerformed + + private void reindexViewsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reindexViewsButtonActionPerformed + IndexManager.reindexProjectViews(project); + }//GEN-LAST:event_reindexViewsButtonActionPerformed + + private void reindexViewFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reindexViewFolderButtonActionPerformed + String path = viewsPathList.getSelectedValue(); + if (path != null && path.length() > 0) { + File viewPath = new File(path); + if (viewPath.exists()) { + IndexManager.reindexFolder(viewPath); + } + } + }//GEN-LAST:event_reindexViewFolderButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton addViewFolderButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JCheckBox nonLaravelViewDeclFinder; + private javax.swing.JButton reindexViewFolderButton; + private javax.swing.JButton reindexViewsButton; + private javax.swing.JButton removeViewFolderButton; + private javax.swing.ButtonGroup toggleCommentButtonGroup; + private javax.swing.JList viewsPathList; + // End of variables declaration//GEN-END:variables + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties new file mode 100644 index 000000000000..a8933a024d26 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties @@ -0,0 +1,50 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +BladeDirectives.removePathButton.text=Remove File +BladeDirectives.compilerPathFileButton.actionCommand=compilerPathFolderButton +BladeDirectives.compilerPathFileButton.toolTipText= +BladeDirectives.compilerPathFileButton.text=Add File + + +# include path +BladeDirectives.includePathLabel.text=Custom Directive paths : +BladeDirectives.removePathButton.text_1=Remove File +BladeDirectives.compilerPathFileButton.actionCommand_1=compilerPathFolderButton +BladeDirectives.compilerPathFileButton.toolTipText_1= +BladeDirectives.compilerPathFileButton.text_1=Add File + + +# include path +BladeDirectives.includePathLabel.text_1=Custom Directive php setup files +LBL_LaravelBlade=Laravel blade +LBL_ViewsFolders=Views Folders +BladeDirectives.jLabel1.text=Php files containing custom directive defintions as in : +BladeDirectives.jLabel3.text=https://laravel.com/docs/10.x/blade#extending-blade +BladeViewsFoldersPanel.reindexViewFolderButton.text=Reindex selected +BladeViewsFoldersPanel.jLabel4.text=*Also add root folders of custom folder and fallback configuration (ex: views/template2022/) +BladeViewsFoldersPanel.jLabel3.text=*Add the folder where the blade view files are used. (ex: {root}/views) +BladeViewsFoldersPanel.reindexViewsButton.toolTipText=Reindex blade files to rebuild index regarding view paths +BladeViewsFoldersPanel.reindexViewsButton.text=Re-index views +BladeViewsFoldersPanel.removeViewFolderButton.text=Remove Folder +BladeViewsFoldersPanel.addViewFolderButton.text=Add Folder +BladeViewsFoldersPanel.jLabel1.toolTipText=Add your folder containing your blade files. +BladeViewsFoldersPanel.jLabel1.text=Views Folders +BladeGeneralSettings.jLabel1.text=Blade General Settings +BladeGeneralSettings.formatting_enabled.text=Enable Formatting (experimental) +BladeGeneralSettings.indentation_enabled.text=Enable Indentation (experimental) +BladeViewsFoldersPanel.nonLaravelViewDeclFinder.text=Allow Go to click action for paths arugment on `view`, `render` and `make` method diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java new file mode 100644 index 000000000000..194a751d7fb6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + + +/** + * + * @author bhaidu + */ +public class UiOptionsUtils { + + public static String encodeToStrings(Enumeration list) { + List result = new ArrayList<>(); + while (list.hasMoreElements()) { + result.add(list.nextElement()); + } + + return String.join("|", result); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java new file mode 100644 index 000000000000..661da7979c26 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.wizard; + +import java.io.IOException; +import java.util.Collections; +import java.util.Set; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectUtils; +import org.netbeans.api.project.SourceGroup; +import org.netbeans.api.project.Sources; +import org.netbeans.api.templates.TemplateRegistration; +import org.openide.WizardDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataFolder; +import org.netbeans.spi.project.ui.templates.support.Templates; +import org.openide.loaders.DataObject; + +/** + * + * @author bhaidu + */ +public class NewFileWizardIterator implements WizardDescriptor.InstantiatingIterator { + + WizardDescriptor wizard; + private WizardDescriptor.Panel wizardPanel; + + private NewFileWizardIterator() { + } + + @TemplateRegistration(folder = "Blade", category = "PHP", + content = "../../../resources/emptyBladeFile.blade.php", + description = "../../../resources/NewBladeFileDescription.html", + position = 120, + displayName = "Blade file", + scriptEngine = "freemarker") + public static WizardDescriptor.InstantiatingIterator createBladeWizardIterator() { + return new NewFileWizardIterator(); + } + + @Override + public Set instantiate() throws IOException { + // getBottomPanel().save(); + + FileObject dir = Templates.getTargetFolder(wizard); + FileObject template = Templates.getTemplate(wizard); + + DataFolder dataFolder = DataFolder.findFolder(dir); + DataObject dataTemplate = DataObject.find(template); + DataObject createdFile = dataTemplate.createFromTemplate(dataFolder, Templates.getTargetName(wizard) + ".blade"); + return Collections.singleton(createdFile.getPrimaryFile()); + } + + @Override + public void initialize(WizardDescriptor wizard) { + this.wizard = wizard; + Templates.setTargetName(wizard, "myfile"); + wizardPanel = createWizardPanel(); + } + + @Override + public void uninitialize(WizardDescriptor wizard) { + this.wizard = null; + wizardPanel = null; + } + + @Override + public WizardDescriptor.Panel current() { + return wizardPanel; + } + + @Override + public String name() { + return "new php file wizaed"; // NOI18N + } + + @Override + public boolean hasNext() { + return false; + } + + @Override + public boolean hasPrevious() { + return false; + } + + @Override + public void nextPanel() { + } + + @Override + public void previousPanel() { + } + + @Override + public void addChangeListener(ChangeListener listener) { + } + + @Override + public void removeChangeListener(ChangeListener listener) { + } + + + private WizardDescriptor.Panel createWizardPanel() { + Project project = getProject(); + assert project != null; + return Templates.buildSimpleTargetChooser(project, getSourceGroups(project)) + .create(); + } + + private SourceGroup[] getSourceGroups(Project project) { + Sources sources = ProjectUtils.getSources(project); + return sources.getSourceGroups(Sources.TYPE_GENERIC); + } + + private Project getProject() { + return Templates.getProject(wizard); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java new file mode 100644 index 000000000000..0606a5791531 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -0,0 +1,188 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import java.util.HashMap; +import java.util.Map; +import java.util.prefs.PreferenceChangeListener; +import java.util.prefs.Preferences; +import javax.swing.DefaultListModel; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectUtils; +import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; +//import org.netbeans.modules.php.blade.editor.actions.ToggleBlockCommentAction; +import org.openide.util.NbPreferences; + +/** + * @todo ADD NEW OPTION VALUES + * @todo use nodes for files + * + * @author Haidu Bogdan + */ +public final class BladeProjectProperties { + + private static final Map INSTANCES = new HashMap<>(); + private static final String BLADE_VERSION = "blade.version"; // NOI18N + private static final String DIRECTIVE_CUSTOMIZER_PATH_LIST = "directive_customizer.path.list"; // NOI18N + private static final String VIEW_PATH_LIST = "views.path.list"; // NOI18N + private static final String NON_LARAVEL_DECL_FINDER = "non_laravel.decl.finder"; // NOI18N + public Project project; + + DefaultListModel directiveCustomizerPathList = new DefaultListModel(); + DefaultListModel viewsPathList = new DefaultListModel(); + boolean nonLaravelDeclFinder = false; + + private BladeProjectProperties(Project project) { + this.project = project; + initModelsFromPreferences(); + } + + public static BladeProjectProperties getInstance(Project project) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + BladeProjectProperties instance = new BladeProjectProperties(project); + INSTANCES.put(project, instance); + return instance; + } + + public static void closeProject(Project project){ + if (INSTANCES.containsKey(project)) { + INSTANCES.remove(project); + } + } + + private Preferences getPreferences() { + if (project != null) { + return ProjectUtils.getPreferences(project, this.getClass(), false); + } + return NbPreferences.forModule(this.getClass()); + } + + private void initModelsFromPreferences() { + directiveCustomizerPathList = createModelForDirectiveCusomizerPathList(); + viewsPathList = createModelForViewsPathList(); + nonLaravelDeclFinder = getPreferences().getBoolean(NON_LARAVEL_DECL_FINDER, false); + } + + public void storeDirectiveCustomizerPaths() { + String includePath = UiOptionsUtils.encodeToStrings(directiveCustomizerPathList.elements()); + getPreferences().put(DIRECTIVE_CUSTOMIZER_PATH_LIST, includePath); + } + + + public void storeViewsPaths() { + String includePath = UiOptionsUtils.encodeToStrings(viewsPathList.elements()); + getPreferences().put(VIEW_PATH_LIST, includePath); + } + + public void storeNonLaravelDeclFinderFlag(boolean status) { + nonLaravelDeclFinder = status; + getPreferences().putBoolean(NON_LARAVEL_DECL_FINDER, status); + } + + public void addDirectiveCustomizerPath(String path) { + directiveCustomizerPathList.addElement(path); + } + + public void addViewsPath(String path) { + viewsPathList.addElement(path); + } + + public void removeCustomizerPath(int index) { + directiveCustomizerPathList.remove(index); + } + + public void removeViewsPath(int index) { + viewsPathList.remove(index); + } + + public void setViewsPathList(DefaultListModel list) { + String includePath = UiOptionsUtils.encodeToStrings(list.elements()); + getPreferences().put(VIEW_PATH_LIST, includePath); + } + + public DefaultListModel createModelForDirectiveCusomizerPathList() { + return creatModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); + } + + public DefaultListModel createModelForViewsPathList() { + return creatModelFromPreferences(VIEW_PATH_LIST); + } + + public DefaultListModel getModelForDirectiveCusomizerPathList() { + return directiveCustomizerPathList; + } + + public DefaultListModel getModelViewsPathList() { + return viewsPathList; + } + + public boolean getNonLaravelDeclFinderFlag() { + return nonLaravelDeclFinder; + } + + private DefaultListModel creatModelFromPreferences(String pathName) { + DefaultListModel model = new DefaultListModel<>(); + String encodedCompilerPathList = getPreferences().get(pathName, null); + String[] paths; + + if (encodedCompilerPathList != null) { + paths = encodedCompilerPathList.split("\\|", -1); + } else { + return model; + } + if (paths.length == 0) { + return model; + } + + for (String path : paths) { + model.addElement(path); + } + + return model; + } + + public String[] getCompilerPathList() { + String encodedCompilerPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); + String[] paths = new String[]{}; + if (encodedCompilerPathList != null) { + return encodedCompilerPathList.split("\\|", -1); + } + return paths; + } + + public String[] getViewsPathList() { + String encodedCompilerPathList = getPreferences().get(VIEW_PATH_LIST, null); + String[] paths = new String[]{}; + if (encodedCompilerPathList != null) { + return encodedCompilerPathList.split("\\|", -1); + } + return paths; + } + + public void addPreferenceChangeListener(PreferenceChangeListener preferenceChangeListener) { + getPreferences().addPreferenceChangeListener(preferenceChangeListener); + } + + public void removePreferenceChangeListener(PreferenceChangeListener preferenceChangeListener) { + getPreferences().removePreferenceChangeListener(preferenceChangeListener); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java new file mode 100644 index 000000000000..847131a0f082 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ProjectServiceProvider; +import org.netbeans.spi.project.ui.ProjectOpenedHook; +/** + * + * @author bhaidu + */ +public class BladeProjectSupport extends ProjectOpenedHook implements PreferenceChangeListener{ + private final Project project; + + public BladeProjectSupport(Project project) { + assert project != null; + this.project = project; + } + + private static BladeProjectSupport create(Project project) { + BladeProjectSupport support = new BladeProjectSupport(project); + return support; + } + + @ProjectServiceProvider(service = ProjectOpenedHook.class, projectType = "org-netbeans-modules-php-blade-project") // NOI18N + public static BladeProjectSupport forBladeProject(Project project) { + return create(project); + } + + @ProjectServiceProvider(service = ProjectOpenedHook.class, projectType = "org-netbeans-modules-php-project") // NOI18N + public static BladeProjectSupport forPhpProject(Project project) { + return create(project); + } + + @ProjectServiceProvider(service = ProjectOpenedHook.class, projectType = "org-netbeans-modules-web-project") // NOI18N + public static BladeProjectSupport forWebProject(Project project) { + return create(project); + } + + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + // + } + + @Override + protected void projectOpened() { + BladeProjectProperties.getInstance(project); + ComponentsSupport.getInstance(project); + } + + @Override + protected void projectClosed() { + BladeProjectProperties.closeProject(project); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties new file mode 100644 index 000000000000..0eee8c6fd7de --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +LBL_BladeOptionsName=Blade +CodeCompletionPanel.autoCompletionEscapedEchoDelimitersCheckBox.text=Use &Smart Escaped Echo Delimiters ({!!) Completion +CodeCompletionPanel.autoCompletionEchoDelimiterCheckBox.text=&Use Smart Echo Delimiters ({{) Completion +CodeCompletionPanel.autoCompletionSmartQuotesDelimitersLabel.text=Echo Delimiters Completion: diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java new file mode 100644 index 000000000000..3c1d7e86dc07 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import java.util.HashMap; +import java.util.Map; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import org.netbeans.modules.php.blade.editor.components.annotation.NamespaceRegister; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +@NamespaceRegister({ + @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), + @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), + @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"),//from 10 + @Namespace(path = "Illuminate\\Console\\View\\Components"), + @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), + @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"), + }) +public class ComponentsSupport { + + private static final Map INSTANCES = new HashMap<>(); + private final Map installedComponentNamespace = new HashMap<>(); + private boolean scanned = false; + public Project project; + + private ComponentsSupport(Project project) { + this.project = project; + } + + public static ComponentsSupport getInstance(Project project) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + ComponentsSupport instance = new ComponentsSupport(project); + INSTANCES.put(project, instance); + return instance; + } + + public void scanForInstalledComponents() { + for (Namespace namespace : getRegisteredNamespaces()) { + FileObject fo; + if (namespace.from_app()) { + //check if folder exists + fo = project.getProjectDirectory().getFileObject(namespace.relativeFilePath()); + } else { + fo = project.getProjectDirectory().getFileObject("vendor/" + namespace.relativeFilePath()); + + } + if (fo == null || !fo.isValid()) { + continue; + } + installedComponentNamespace.put(fo, namespace); + } + scanned = true; + } + + public boolean isScanned() { + return scanned; + } + + public Map getInstalledComponentNamespace() { + return installedComponentNamespace; + } + + public Namespace[] getRegisteredNamespaces() { + NamespaceRegister namespaceRegister = this.getClass().getAnnotation(NamespaceRegister.class); + return namespaceRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java new file mode 100644 index 000000000000..78b4983af70f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class ProjectUtils { + + public static Project getMainOwner(FileObject file) { + Project project = ProjectConvertors.getNonConvertorOwner(file); + + if (project == null) { + return null; + } + + return project; + } + + public static FileObject getProjectDirectory(FileObject file) { + Project project = getMainOwner(file); + + if (project == null){ + return null; + } + + return project.getProjectDirectory(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties new file mode 100644 index 000000000000..f00205e51804 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties @@ -0,0 +1,18 @@ +OpenIDE-Module-Display-Category=PHP +OpenIDE-Module-Long-Description=\ + Support for Blade template syntax for PHP.\n\ + Still experimental.\n\ +

@author Haidu Bogdan

\n\n

Latest updates

\n\n[2.5.0.0] - fix IDE freeze on '?\ + :' short if expr, fix namespace static method completion
\n[2.4.9.9] - limited go to file + completion for vite assets, decl finder fixes + refactor for php code
\n[2.4.9.8] - fix comment highlight issue in directive php expression, improvements on php namespace completion
\n[2.4.9.7] - fix livewire component formatting, display namespace path on class method completion
\n[2.4.9.6] - detect namespace path on directives php expression\n[2.4.9.5] - fix directive completion before double quote html, add attr directive to completion list
\n[2.4.9.4] - fix issue 57 formatting with optgroup
\n[2.4.9.3] - configurable declaration finder for view paths
\n[2.4.9.1] - fix block tag completion cursor preview
\n[2.4.8.9] - auto tag completion is true by default
\n[2.4.8.8] - fix issue 61, endcan tag breaks syntax highlighting
\n[2.4.8.7] - cleaning code, refactor
\n[2.4.8.7] - cleaning code, refactor
\n[2.4.8] - change License to Apache, blade tag autocomplete
\n[2.4.7] - debug lag with completion
\n[2.4.6] - use custom BladeCompletionItem, add @lang
\n[2.4.5] - use custom BladeCompletionItem
\n[2.4.3.2] - disable unused parser caching
\n[2.3.4.3] - [code] brace matcher is using annotation
\n[2.3.4.2] - fix navigator regression hafter disabling the ParserListener
\n[2.3.4.1] - fix php parser error for empty `@php` blocks
\n[2.3.9.3] - fix comment parser error regression
\n[2.3.7.2 - 2.3.8.3] - refactor directive completion
\n[2.3.6.2] - refactored parser for optimisation +OpenIDE-Module-Name=Php Blade +OpenIDE-Module-Short-Description=Support for Blade template engine for PHP. + +UnclosedIfError="Unclosed @if" + +blade_directive=Blade directive +blade_comment=Blade comment +blade_echo_delimiters=Blade echo tags +blade_php=Php +mod-undefined=Custom Directive effect +mod-declaration=Custom Directive + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml new file mode 100644 index 000000000000..8533ed78b169 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml new file mode 100644 index 000000000000..18c86c64419a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html new file mode 100644 index 000000000000..8bc99c49c5ae --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html @@ -0,0 +1,12 @@ + + + + + Blade wizard + + + + +
Create new file
+ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php b/php/php.blade/src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php b/php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php new file mode 100644 index 000000000000..6bf35049eac4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php @@ -0,0 +1,16 @@ +@extends('my.layout') + +
+ {{-- BLADE COMMENT --}} + @if ($test) + {{-- REGULAR ECHO --}} + {{ $x }} + + {{-- RAW ECHO --}} + {!! $x !!} + @endif + + @verbatim +
{{escaped}}
+ @endverbatim +
\ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php b/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php new file mode 100644 index 000000000000..baf125d61fc9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php @@ -0,0 +1,16 @@ +@extends('my.layout') + +
+ {{-- BLADE COMMENT --}} + @if ($test) + {{-- REGULAR ECHO --}} + {{ $x }} + + {{-- RAW ECHO --}} + {!! $x !!} + @endif + + @verbatim +
{{escaped}}
+ @endverbatim +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..87ced4a74a8a75f28331705a6c368f8654294233 GIT binary patch literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at.png new file mode 100644 index 0000000000000000000000000000000000000000..4f74305ff1968736bdc3b2944c2818646cad7352 GIT binary patch literal 3228 zcmV;N3}f?&P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1e=(i|xc{m&`p2ndPoIIIzUgFgN|Kv31TXWAXn zmHsNTNDz|V(}KD1vSe5AknHC(^nS+3%Kp9|(r+@qeBp3s z-1!Vf(YLJQcYb(x2>Qhf@;@x#w~hPWI2Iju*8N2zDSt8Qn4^Dl_B7`>))fhGLpVmA zEzA{zi4~%FFAKOL{yd)JzA~<4i)|#f+h!}SMwuM3og~x^6`C}t|znkzo*PPA5 zM?|om)K}2UxrGBQH}d+%Gyp+^Qxnpq^2$1)#LrEvh0oWw)2zz5qq&?Sp zcg7Jaz{hjo2y8MJfF2t_2r<`*s*t3W!zF>91j8dwrT&4ONYOJZ|S{mrnr1=(FY^mi| zy6fDf`yP7ispnn>4N%Dp8GeKjM;dvQ39e0^GW`rQ&NTBZ4>d*gr|Tb}Mv9u-NUeGC zp@z{Im!K_zR-W+-Ga%-KfOuR8fY5GXW)q3Hh1|l-W{0To4odokO($Cn1wbf+oS*ct z`ylt*xEc8R?{IU!gPd8={R_xBGx!JGet}wFnXqldP82SmT1NCuJBmvMn;WinJtfS& z_gwaaKuhW33H5<#3|sfJWd;TJ>fB~%y2|_{X2c_>H)OuhX{~PXNj-~;Oxw!bGMSy- zqe#W(KKyV;QrzO2onCs`qs5NO@Z}ar+%4Diq#F`==BSV+w|-ugGy+Jme-tL&I73Ch zR3XIn0Drb#;6t&|{q!D~*r`dG*Lox`rda0THNJRB^L@wQy9j!$aZoY9wx+ zL5{6p8{*Q{B?ZyVM@Bk2l1%HZs)`9!sQKgF5wB$xwS&&=#Klf7&q?I6zebpED_l@l z6zY7Yv=%G;D=I&6_eUs{Y1Yj*Zc=+22)A*xSSC((=Lf>9q3rD~a%*zv#157z7#0pO zhi`w<$rp&ULjD5Xjww=i$zxm36W<)%q9!WrZGKxR0b*J@|RK)K%b+@|gtxdV#f zuJ$9fVcLhsX_WF9CH0u#VGS2$eVa$D^fc60Esf>>V)pKylO6r+&;`7luD@{d*dssF zZd8=i5=gJEOJqjVxD>!gtshd_7-`&ywRw7^Q~x!ucf~yq$z{Dk>*pzDYy}>#@SdoS^B)&VAGo??L@&aRY@Be0duJh@^z-7mV)R`Qv&nIN$HDz zbW8;{keTknjCMDl)anxrG>-~#&OOCi&l^0pp5=HGJ}nCU*Y$f)BJM>AeP)3m7t4I0zowf3nl()*3l@N&yhr>Yq)VG@mW0tKl*qs=%~3H2`z6WxjO zRr;xEUd&j5fBC#=5yypbWQX9ikVvY)_N4#=-_T3&T>RyUfSiwxapi-Ti>gaUDh>Cl&%{|T&Q{q?tRPPnURoN@eDriAe?yi*nQ2WS1Iz1bOH%#f1|UUWCFeJ}`sESC#AKq3GIbUry@DLs8o{By?9=-XK}4 zk+fz@RpS!cy5m}yX|EM!mAAABxpFHAaN75U=~9+*rWa&Q9f8jOX0@6x$~ z93HLC;!IwL5rwvW@&|G(}yYMgQrqSw;90>jFw zBCFBWYGK1|8NxMMyE`0L&j8M+U%iBu1ydIz)v)z{4L@|A6McU+{{;!}Z;`v9#%=%r z0fT8nLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~mUA{B>b5b2PiI$01Eag-_+!9r;( zwCZ4T=@&FHBq=VAf@{ISkHxBki?gl{u7V)=0pjT7r060g{x2!Ci1FaKAMfrx?%n}H zv&J;5XB^OU+sq^rQogVvg_QH{!9W))K- zo+6H^nojvb-eZ;X7H6$iXYG6P7lw=aa+d2fqex;ADWoAmK^;}pU?WbePKt#L?I(Qv z!>&I~E`?lGFmlXe0~%!45B>+gyR}M_6JAm{0rb8&&c_H4+67t-$N4^XoYn~td3_TgLDZ5gTrcf#Y?`QN)1t4+@^sjoowfAxQ z0OY8vr5oVj5Ev~}_L|ST`?`Dk_e{ILA43jul-4n9=Kufz24YJ`L;xEA8vq-0Wtfow z000SaNLh0L04^f{04^f|c%?sf000ArNklD(3` zRiID`6pDqG|I3Rb@pt|5eYc+wHko-gyCl)!az{jju2zS$2?+g%V!v*rh84s3b|AGn zwXUkWj_@qdSZJ3Ixr)xe5(sn`wlwG2tE#XD16VvBwC!!S7newljA*~zzI`bZ3VnRB zr$^ZhyjWqlU2f<`w27|q?oh8)LLRnjD)8j9{ zy5NxIZs`NBKT;Jexe|Eyoa8PoW%0%!sqZdhJ=uW!^-c;}&rtC4OV}#PNk<={=?31K zYQ*J4ZQl6rSLHQT>B_IG$@A6LlKx|o^x!Wz-sr^Bd>XUILoS^rzn}mNP%{~phKKQ- zXuwrfCFBgfORTmPHWk%WBj@Fjo|wRNxB}0qSF!qhOb=Wqdg*I6<8gFNWoK)P_4^~J zxg2(Xv2@UEZ4))a2stAWG(}-0`Uq2fJyyS;jlbuZzV-w2W8(;BGdtNVn~7y82^gX* zqo@j5T@Q;nUB~A28mgj@otnl}(GGv6Ib`h{v(i9T#M?nN)lc z6+;)dbv>3@Ul)*Nq!*q?&F!FT8g{=AcY7O^Z@r1GX$Yc(HN2nVx;hNQ;K{9x=;UQ+i*(9@d$i1~TQMJ{wzLs(e_AgL-BhBi{4 z$lJQk_```$pZobnWxmC7Dtzo1`${7u=jKT*#xdJ$>Y8Tl9oV2p>5@k>3x7!TjSV#2!3Q5;L=3%;d7~ zjb;8(|Mx}!izw3R-W%D_)Gi63Nfd+-fNmHu9flo}^iAJtayp}FyUxF|d4+6054I}+ O0000EX>4Tx04R}tkv&MmKpe$iQ>7vmhh`AzkfAzR5EXHhDi*;)X)CnqU~=gfG%+M8 zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCJG^=ME&~)3( zBok7;up)(C5rlvUq7Y?f8L8|-4!+~-9s$1I#d((hxj)B%TC^AtkcelQVcNv&#M7I$ z!FiupWEEK@J|`YC>4LolWCVi75%AwfYMRn%Z3PODCeg$(T{eEh?%KTR%$Tvae~ z%wq!@WY-V=2fw?uN|O^_QaAzhzBtau2oTx@S`EkfK6aee2@re+uJn$7qY2D>lHTZO zu_It`8@RacXv!XNxdRM68L}z6Qjn%lDgp0j^i2gIatrjYdcC#xaryw{sH>$L;NTD# zEmQWI&%67&d;9lHyT2bp4sw(#%Q2Mz000JJOGiWi8vq*s8+2uukpKVy32;bRa{vG? zBLDy{BLR4&KXw2B0?kQ8K~y-)m6OeDRA&^2pZn$=@14o5om&&*#Kfjfi-Zzww0?A< zrc+!Qgr-9OfcAzA$W5Akz35fL##AVIMtVvJOl zmSyJRC7Jy3XQ}4%A|gW~f+ZqxcW=dfEg z5$f1VVf+a|2pCjAqA)#8Xj>;6yeLa|N6CG6me;=gl=wF%@ZLX!<=TX|bz*6a3OiKh z()GnB6wpuHv|GbUW=@C7!4@+x`seh1s1-q?{pim&lWZBRjs{^_efK&qz z5MwYaD_FV-?KV?dSfFs{E<7!xU6)EGi$9fOWA8ib9%vvHc`M%fZ0tU!;?umRm%`~Q zOnvqRR&xZqdk0pB%i^_RO7|ZS-uX7}8+E@(X<(!|9^ae2`Wwac9Ic5yVT2;Gp4T%hy3(BZN~?2yIx0(!BPrf)sJ#DuReSo82Df1)u-3=^yS6nuVr+7&U(r3d=8jw a4F3nS_kBWhz+Zm=0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxvgIZW{AU$e0z%@o91u{I9c1}wjPSX+GnJWC z<#^^AY#yRpYRPW?_2+Vb;1}2@Coz{)Q}Xypl^Plv#eaU&?&leKdH&uX*=i2Wj=;i%D~NdtE!g^dzs$he1~ zfuCoEbErYtGqLQ8R>)j=aN)ojCNqoU@Y+JpzV+EpsbJ?p7#awR5vKg><$g8bcdoV6 z10&iHlVJtBLfAaehLQJQ3VvZ%&*j(ZyDW;Ti+A-HMXUQ?AoO8)F zx57nAEUDyDN-eF1$_U9=Q_Z#1T3f@OOy4uT{vHHXHA6O$}Ej&!^ zartEpPjlW2JxkEmnYcLvV?hXv=gj~dI&97m&mv(nw>k4QASz;jk#Tb~$Tvp`6w0I! z7roqlnEP$s9I*ZsZ{c^CbDO&Vfw|x&f8*^Ztc|UN`Y?8)aAWEj(YL~Ap|sG|73{y8 z1%vOsXNe>+NvyN*)6NRjYJNV`s;8m*Da9#ul-)uW0fW!j&plH-vs=pm|4fmbu}rwR5WAL|I-5x|o}Z*iHEOSU)fVP>o9bGcjVj|Rte_O3p=1UwCq`q+P0+5R!S zbw-_uT0P?uX^H7<8{pv2PR@=T&r#HmQrpuUs-^ccRjSU|&(sW&EaL-~)@L&pXRKo) zyBI(zd&q(<0MAKhSuD!KpZ2N~sR-S(`4XRUbT(ypysb8C_`-gkQ9+l82ID=Ux2GC1 zNyXaDl_Y$o_eZw3$q1&jPIF1fo6r0@RxK%iP6q6b$2z>o0Nh3*E(6fFX^NNu;_;a$ zP>@k<`Pg#NG*55rNlxckeqw=E-z6HBpzB%4Hd<0M25VK318JHmgtLuPxlAGjJ+Ae5 zmd?)cf+--s+>-C+6HiYWqJQlGW)I6;R(+ljz?s|2Cuq8IU;NX&zZ8v}((Y29j1OR;oE@a}i zkv!3#>*n!>^Fm#P*ooIe{SKXb2Gm{s1+|t@jz9q|*H9|OVAKuRh-iN`Yc{%=&^9uf z{T*WNqn`CZ5nS1sQlkD6uH`x~4uXHC2XpGG*zoB!-&mWGt9a9d_H(zTb%_P!TnZr` z@kN-69b-mWS%)d~s8CA~eU^*x2=B1u^UiZaf81$)B`s%QBbwFDG!jju$B+2hY()(@ z(sjd0NKHW17DKzPP!D>D!Wqp?;C6_%6D
    Gg;|d{*F*bQD?ii(w!g3AU4UdqE{U z%!uJx7u4sbqrRo3`p=P~4(konzp`b+Qim+^I$mYOI)*u6mV?-xSFNa@vwiTBneE8w z!S8ZNfL+Rb@#`mO0pQ#K-Yf-uLL6BLDa}v5{0A#Dpy>AtJes8z%kH zdlM2!^SpWnh0SEop?R1>k3}X-H+fAITGgUu@-|$rScaWt%DAZnCcWVf)@G_BeUy$= z#v35@x(OnFc2lRVKi(uFwIp(~oZI(c&JViGt^}-xEsqZv6LTq+!UNT-tdDT({yKWB zW_-ly1uG>X6GY^xn;XDaEi>@ADw7+5TgYr`mx#(6`e`KgB5An`?Q=SX}aKb^5jx3s%Xs%F>XlI|$ zwl`SYE?0)}0Aa!x;W(W_y((PBJq+!vo#Lkk!)M@GAW*uchuJakMQ^wukCTb^{_rz= zCd)Z)@z-`h!*8`SP?4@+4%VQ>mfE&YMjFe#MGW$e33Dbrf^H5PvsI3&mQ?T!%SNW^ zE*nmvm0qfbXekF|R2Y7IG7QAL-vC6Oh;&7i`5e!+Ilyzh2Z&tsdy%`66(e0BniokL z^G!8~97n@I9tqGkbIAgi43-72WZ+}P^k3TctCNxxNEWq}tqQxR)t_4g@xW{-y9P7Q z-g(ATxlv)(->|EB@lAqtGynhrgK0xUP)S2WAaHVTW@&6?004NLeUUv#!$2Ix zUsI(b6^CXJ>5!p1Sr8R*lqwd%LTM|s>R@u|7c?;>DK3tJYr(;f#j1mgv#t)Vf*|+- z;^^e0=prTlFDbN$@!+^0@9sVB-T^|h#x$#E9ME*z%p?<1zOW*NUJ-WW*MpM zLJq#;>mC8V-o<&A|G7WMfLgQ|5RiyxnPJ+*>%`NWw!wLySY#DhB|aw}GwFiFk6c$g ze&bwrS>TzXnaj)(i^Nj7i)(H@N2Cnpuf1?S^e3IViXt5(;a2vR|?r6#$aJd5vJsGko zyHb#*P$~iMXY@@4AaV=zuX??;_i_3FzgPU?uj;sFFgkXHTiLCvsf)J5ioL6gwYkdTda%K8GCapjyl!3d^9T zG3`5%JWWXMAl62l%=G8uR}=El(<8&WQojQ_!VLQx4-HD4$B~_0Sh#>ljDqnC$X&?7 zfm#;G(U+;&^ArvDKi%)Ub?P0Tixcvx7m4k^uj3PC&ug+H&0!W!HX$QUhyK;Oc?qqgeGJ%D;UzXi*vP|VCw@%4cxjG0Z4oBfd01Y!=x&T z8u9Y>rc@OQru_k`dIhQ`HQo?4p%>VBU8lI1ky}Y&Zl_Va5$wS>Y@vM^S_yS!iCTXXuJB&$bspAl{z&e|2n(sqS^3xz{liI2$tHHl$4+0L!8Id_Hh)EUa^lEX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..87ced4a74a8a75f28331705a6c368f8654294233 GIT binary patch literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7b7ccb1428036113de07951cbb9b8b27e86430 GIT binary patch literal 723 zcmV;^0xbQBP)EX>4Tx04UFukxM8&YTEi`ZIrZQ)+w*0}9RzBZHR zxZ-uic52o7xu<$z-I6msrF5Asj55XqljxYNvOSI+l84}JgZ2+AMf!YTOE2Qct1daj_g z?nA={oLv?)a~sY#q4^u93o(cLR@(rYca=WRGAdvt7010qNS#tmY4#WTe4#WYKD-Ig~000JJOGiWi z8vq*s8+2uukpKVy2XskIMF-{r8WspK$N}S20002eNkl-NgPj*&Vcs}GI?)k>oxek zAq2&?&)D4$OveyUz)j4M9rJL}(1XEX>4Tx04UFukxwWDQ5?rVJ4+;Tum@=mbHIrblB1SviqcwTaWFG$m)aTI%x*4@ z%2he|bMf!s;>^{-RVn39$HFUI+k4*!+Ck2;y_z1dor0T) z$Ml)htX}s_7>yR9L=4NzPfU#_sX9Jx390p_TV?UT(Ue~FEC}hsLss4`2rmc^tQPW$ zcZ4I>l93iZ74CB7g2MMoH%t7YI2*90G9zv>F)SPr*0U9CRUs`%Ri|D?D~aV=ws zV}uoKjKGijgWuhHnZDjqQezBipM3wV1M0TmYt#2X4}JgZ2*QtW;gtO=2Qc_9`es>c z--qUPIJ+!s<~E#fKL}00$a+R9JLU zVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}typQ&94QX{&ne~z2#M`DtPy>KKK?vFP}R0) z+8xoA{wlLb5R%^0g3b8zk7@pck8|D{@iB!Qg2hL&WLNNz?B_G|e#Xek{=Og5Z!*7p z;c#c%`3y$Ux2)rLet35X`o#79Dri{Y4`we=+KqqknVuH0Ll#lBE;ndt*(c zJ=b}6#t|yO$8+EaY%&*sCE~%KC?28E;B=`_Q3@heJ>)fUL9(wGl=UxU4P{|A#euNQ68hMlnu1%gY{R}hCH1jMEHAVHO>mQ&-ikjO< zt$FdGhS3<8pe=${p79GaAm)UCcw7j8&~9O76N$Km+``Oehp6xlO8SLOCtC~!Kq!Np zpY*W%Aott28Tk6|aC5(doLSKQ3&=S$_y^p6fm&agux-Rn6fU1yM)XZPic1BX8?JUe zCCt6|T=s)NOX=bX^?_*&TlceN1_k%(+-7LH%KRi|#3QFSWWLa8t#0s1J&TJ>+sfQB znVsFENX6zp{BTE7+~S&@UV7Q1#g5AGMwo9a zTu@gO>U^fO7AyQKDnD`eM<|qO*3CC=QhOT+w{f&sCQf$e2g0nO?CmXbYjWts4wfkx z77j7v$#-1)5gNFm96m89rAi{VFmL6#RJa7?rb#ox8RPmuW;mPIYG=kkx!(5NrtTWK z1B&6U_9L}n+K0z!l=2uQ^_bvc4Hsp7n@6nlG}KoujphGh_U@jO9sTUk1-zWDzi{%{ zBR|t_RFu>bNUyF-WJc4t6u?KVA5z*FY21jld3vN%|2407#XS$nWxYY`=P70730 zND3Elgb}^C&V&6WIb6p15zlj0S27#O7yY#eBb`6KywPAcSv4Y&7C_dKR321K-BomK z%Mm0ngO4-wh)AvKpfrod*;qMQ`n=m<)0-#lM8PmsNgEjfbEysTb*7@0g6K|D0`tg8 z>5G1JOa(TOneM`jb~m5Y>Jtq#j|y?lJ;hqj8$7n2<#-c4%?N6~Np{wkd9h#nnBFuS ztnsMhaQ0~J;a-77K>0#lQ(}Y8pTH!T={~l|sN)kyGhRT`w5bIR8q?vm_Ngw?`;F4@ za?g&vOU0cI@{M2OQCffx%t}iVyNl|zJe>q}h@gz8su?a}5{+~M1*t!y%{WyF^)C+- z-HGy5`l)GN%vgbc`MhZn$AxiZhv2l3NUFg0r2qrp&`a=K{N;&&oR5xi<%5@ts!K;I z4hzuJZUP#FGp%qQN0)%p!tko3izV#MJ`iaYFrK2k7P$L zfyql?J92CM@H5++`hns2ii3PZgjc>RT}yi*jbU{+4&T}`p)a9)tFlr6Ox})1K0=RM zUdhb!WtHG=c}2JRSc?v(XpWH8$d!}EyaAHY=Zkdq+PHzi{qon{6fCYQ259BfsV$}L zJA*YZ4Xwyn2~zvUjIdB;E6!=@QkHV27i3KxfzJPCwVE&F^2#WxfQ%V#yS zDbc+g9<9#eOkRf(g|>b227*G%@GfV=g%6(;n&l%L3XakRX5Fm+zwS6{oN^JO*V4NJ z!^){5tI^eJVZ&`1!ZljEI~-Tf0M4ghy@ZwpQx_xEu=RfpKXjfGeSbFp1qttOk-MSB zZU6uP24YJ`L;xEA8vq-0Wtfow002cvL_t(IPh)&5qw=4D5&$xQTmaI`1T}|j0QQ2= z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml new file mode 100644 index 000000000000..d0e7152241f8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml new file mode 100644 index 000000000000..5eb201132c4d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml @@ -0,0 +1,29 @@ + + + + + + true + true + true + 4 + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java new file mode 100644 index 000000000000..7886b57b7f4b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +import org.netbeans.modules.php.blade.syntax.annotation.Directive; + +/** + * + * + * @author bhaidu + */ +public class BladeDirectivesUtils { + + public static String[] directiveStart2EndPair(String directive){ + if (directive.equals("@section")){ + return new String[]{"@endsection", "@show", "@stop", "@append"}; + } + DirectivesList listClass = new DirectivesList(); + for (Directive directiveEl : listClass.getDirectives()){ + if (!directiveEl.name().equals(directive)){ + continue; + } + if (directiveEl.endtag().isEmpty()){ + return null; + } + return new String[]{directiveEl.endtag()}; + } + return null; + } + + public static String[] directiveEnd2StartPair(String directive){ + //still easier with switch + switch (directive) { + case "@endif": + return new String[]{"@if", "@hasSection", "@sectionMissing"}; + case "@endsection": + case "@stop": + case "@append": + case "@show": + return new String[]{"@section"}; + } + DirectivesList listClass = new DirectivesList(); + for (Directive directiveEl : listClass.getDirectives()){ + if (directiveEl.endtag().isEmpty()){ + continue; + } + if (directiveEl.endtag().equals(directive)){ + return new String[]{directiveEl.name()}; + } + } + + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java new file mode 100644 index 000000000000..3b24488e4023 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +import org.netbeans.modules.php.blade.syntax.annotation.Tag; +import org.netbeans.modules.php.blade.syntax.annotation.TagRegister; + +/** + * + * @author bhaidu + */ +@TagRegister({ + @Tag(openTag = "{{", closeTag = "}}", description = "regular echo", position=0), + @Tag(openTag = "{!!", closeTag = "!!}", description = "raw echo", position=1), + @Tag(openTag = "{{--", closeTag = "--}}", description = "comment", position=2) +}) +public class BladeTags { + + public Tag[] getTags() { + TagRegister tagRegister = this.getClass().getAnnotation(TagRegister.class); + return tagRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java new file mode 100644 index 000000000000..197f2f8cce1a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +/** + * + * @author bhaidu + */ +public class BladeTagsUtils { + + public static String[] outputCloseTags() { + return new String[]{"}}", "!!}"}; //NOI18N + } + + public static String[] outputStartTags() { + return new String[]{"{{", "{!!"}; //NOI18N + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java new file mode 100644 index 000000000000..9cf06abac872 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.annotation.DirectiveRegister; + +/** + * + * the since values are taken from + * https://github.com/onecentlin/laravel-blade-snippets-vscode + * + * + * @author bhaidu + */ +@DirectiveRegister({ + //conditionals + @Directive(name = "@if", params = true, endtag = "@endif"), + @Directive(name = "@elseif", params = true), + @Directive(name = "@else"), + @Directive(name = "@endif"), + @Directive(name = "@empty", since = "5.4"), + @Directive(name = "@empty", params = true, endtag = "@endempty", since = "5.4"), + @Directive(name = "@isset", params = true, endtag = "@endisset"), + @Directive(name = "@unless", params = true, endtag = "@endunless"), + //loops + @Directive(name = "@for", params = true, endtag = "@endfor"), + @Directive(name = "@foreach", params = true, endtag = "@endforeach"), + @Directive(name = "@forelse", params = true, endtag = "@endforelse"), + @Directive(name = "@break"), + @Directive(name = "@continue"), + @Directive(name = "@endfor"), + @Directive(name = "@endforeach"), + @Directive(name = "@endforelse"), + //layout + @Directive(name = "@extends", params = true), + @Directive(name = "@section", params = true, endtag = "@endsection", endTags = {"@endsection", "@show", "@stop", "@append"}), + @Directive(name = "@endsection"), + @Directive(name = "@stop"), + @Directive(name = "@append"), + @Directive(name = "@once"), + @Directive(name = "@endonce"), + @Directive(name = "@overwrite"), + @Directive(name = "@yield", params = true), + @Directive(name = "@hasSection", params = true, endtag = "@endif"), + @Directive(name = "@sectionMissing", params = true, endtag = "@endif"), + @Directive(name = "@include", params = true), + @Directive(name = "@includeFirst", params = true), + @Directive(name = "@includeIf", params = true), + @Directive(name = "@includeWhen", params = true), + @Directive(name = "@includeUnless", params = true), + @Directive(name = "@each", params = true), + //statement + @Directive(name = "@switch", params = true, endtag = "@endswitch"), + @Directive(name = "@case", params = true), + @Directive(name = "@default"), + //stack + @Directive(name = "@stack", params = true), + @Directive(name = "@push", params = true, endtag = "@endpush"), + @Directive(name = "@endpush"), + @Directive(name = "@prepend", params = true, endtag = "@endprepend"), + @Directive(name = "@endprepend"), + @Directive(name = "@pushIf", params = true, endtag = "@endPushIf"), + @Directive(name = "@endPushIf"), + // + @Directive(name = "@fragment", params = true, endtag = "@endfragment"), + @Directive(name = "@endfragment"), + //form + @Directive(name = "@csrf"), + @Directive(name = "@method", params = true), + @Directive(name = "@error", params = true, endtag = "@enderror"), + //env + @Directive(name = "@env", params = true, endtag = "@endenv"), + //auth + @Directive(name = "@auth", params = true, endtag = "@endauth"), + @Directive(name = "@guest", params = true, endtag = "@endguest"), + @Directive(name = "@can", params = true, endtag = "@endcan", since = "5.1"), + @Directive(name = "@canany", params = true, endtag = "@endcanany", since = "5.8"), + @Directive(name = "@cannot", params = true, endtag = "@endcannot", since = "5.3"), + //php + @Directive(name = "@php", endtag = "@endphp"), + @Directive(name = "@use", params = true), + @Directive(name = "@inject", params = true), + //utils + @Directive(name = "@lang", params = true), + @Directive(name = "@session", params = true, endtag = "@endsession", since = "10"), + @Directive(name = "@dump", params = true), + @Directive(name = "@dd", params = true), + @Directive(name = "@json", params = true), + @Directive(name = "@vite", params = true, since = "11"), + //styles + @Directive(name = "@class", params = true, since = "8"), + @Directive(name = "@style", params = true, since = "9"), + @Directive(name = "@checked", params = true, since = "9"), + @Directive(name = "@disabled", params = true, since = "9"), + @Directive(name = "@readony", params = true, since = "9"), + @Directive(name = "@required", params = true, since = "9"), + } +) +public class DirectivesList { + + public Directive[] getDirectives() { + DirectiveRegister directiveRegister = this.getClass().getAnnotation(DirectiveRegister.class); + return directiveRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java new file mode 100644 index 000000000000..6a7206ff08df --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +/** + * + * @author bhaidu + */ +public class StringUtils { + + public static boolean isUpperCase(String s) { + for (char c : s.toCharArray()) { + if (!Character.isLetter(c)) { + continue; + } + if (!Character.isUpperCase(c)) { + return false; + } + } + + return true; + } + + public static String capitalize(String str) { + if (str == null || str.length() <= 1) { + return str; + } + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + public static String toKebabCase(String str) { + return str.replaceAll("([A-Z])", "-$1").toLowerCase().substring(1); + } + + public static String kebabToCamel(String str) { + str = str.toLowerCase(); + String[] words = str.split("-"); + String camelCase = words[0]; + for (int i = 1; i < words.length; i++) { + camelCase += words[i].substring(0, 1).toUpperCase() + words[i].substring(1); + } + return capitalize(camelCase); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java new file mode 100644 index 000000000000..7fe99d909f14 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java @@ -0,0 +1,15 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +/** + * + * @author bhaidu + */ +public @interface Directive { + String name(); + boolean params() default false; + String endtag() default ""; + String[] endTags() default {}; + String description() default ""; + String category() default ""; + String since() default ""; +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java new file mode 100644 index 000000000000..d1e6d45744aa --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java @@ -0,0 +1,16 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface DirectiveRegister { + public Directive[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java new file mode 100644 index 000000000000..4756e2c31e5c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java @@ -0,0 +1,12 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +/** + * + * @author bhaidu + */ +public @interface Tag { + String openTag(); + String closeTag() default ""; + String description() default ""; + int position() default 0; +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java new file mode 100644 index 000000000000..7b3d28fbd777 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java @@ -0,0 +1,16 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface TagRegister { + public Tag[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 new file mode 100644 index 000000000000..b2950e97c9e6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 @@ -0,0 +1,177 @@ +lexer grammar BladeAntlrFormatterLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; +} + +options { + superClass = LexerAdaptor; + caseInsensitive = true; +} + +//we will hide html in the end +tokens {HTML, PHP_CODE, PARAM_COMMA} + + channels { COMMENT } + + fragment DirectiveLabel + : [a-z\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment Identifier + : [a-z\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment CompomentIdentifier + : [a-z\u0080-\ufffe][a-z0-9_.:\u0080-\ufffe]*; + +fragment DirectiveArgLookup + : (' ')* {this._input.LA(1) == '('}?; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' ([\\"] | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment BlockDirectiveName + : 'auth' | 'guest' + | 'if' | 'can' ('any' | 'not')? | 'for' ('each' | 'else')? + | 'while' | 'hasSection' | 'sectionMissing' | 'fragment' | 'verbatim' + | 'isset' | 'unless' | 'empty' + | 'session' + | 'env' | 'once' | 'error' + | 'push' ('if' | 'once')? | 'prepend' | 'switch'; + +PHP_INLINE : '' | ''; +// +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]* + | '@charset' + | '@import' + | '@namespace' + | '@document' + | '@font-face' + | '@page' + | '@supports' + | '@layer' + | '@tailwind' + | '@apply' + | '@-webkit-keyframes' + | '@keyframes' + )->type(HTML); + +D_BLOCK_DIRECTIVE_START : ('@' BlockDirectiveName DirectiveArgLookup)->pushMode(DIRECTIVE_ARG); +D_BLOCK_DIRECTIVE_START_NO_ARG : '@' ('auth' | 'production')->type(D_BLOCK_DIRECTIVE_START); +D_BLOCK_DIRECTIVE_END : '@end' BlockDirectiveName | '@endphp'; + +D_SECTION : ('@section' DirectiveArgLookup)->pushMode(DIRECTIVE_ARG_WITH_PARAM); +D_ENDSECTION : '@endsection' | '@show' | '@append' | '@stop'; +D_BLOCK_ALIGNED_DIRECTIVE : '@else' | '@elseif' | '@empty'; +NON_PARAM_DIRECTIVE : '@continue' | '@break'; + +D_INLINE_DIRECTIVE : '@' DirectiveLabel DirectiveArgLookup | '@csrf'; + +STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO); +RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO); + +SG_QUOTE : '\''; +DB_QUOTE : '"'; + +HTML_CLOSE_TAG : ('<' (' ')* '/' (' ')* [a-z\u0080-\ufffe][a-z0-9_.\u0080-\ufffe]* (' ')* '>') +| ('') +; +HTML_COMMENT: ''; +HTML_START_BLOCK_TAG : '<' ('div' + | 'section' | 'main' | 'article' + | 'html' | 'title' | 'head' | 'style' | 'script' | 'footer' + | 'pre' | 'code' | 'blockquote' + | 'dt' | 'dl' | 'video' + | 'template' + | 'span' | 'strong' | 'em' | 'small' | 'sub' | 'sup' + | 'figure' | 'canvas' | 'svg' | 'use' | 'path' | 'polygon' | 'picture' + | 'header' | 'h' [1-9] | 'nav' + | 'dialog' + | 'summary' | 'details' | 'slot' + | 'label' | 'select' | 'optgroup' | 'option' | 'fieldset' | 'textarea' | 'button' | 'form' | 'search' + | 'ul' | 'ol' | 'li' + | 'table' | 'tr' | 'td' | 'th' | 'tbody' | 'thead' | 'tfoot' | 'caption' | + | 'time' | + | 'var' | 'q' | 'p' | 'a' | 'b' | 'i') {this._input.LA(1) == '>' || this._input.LA(1) == '@' || this._input.LA(1) == ' ' || this._input.LA(1) == '\n'}?; + + +HTML_SELF_CLOSE_TAG : '<' ('img' | 'input' | 'br' | 'hr' | 'link' | 'meta'); + +COMPONENT_TAG : ''; +GT_SYMBOL : '>'; + +D_PHP : '@php' {this._input.LA(1) == ' ' || this._input.LA(1) == '\n'}?->pushMode(BLADE_INLINE_PHP); + +AT : '@' ->skip; + +WS : ((' ') | [\t])+; +NL : [\r\n]; + + + +OTHER : . ->skip; + +mode DIRECTIVE_ARG; + +D_ARG_LPAREN : '(' {this.consumeDirectiveArgLParen();}; +D_ARG_RPAREN : ')' {this.consumeDirectiveArgRParen();}; + +D_ARG_NL : [\r\n]->type(NL); + +PHP_EXPR : . ->skip; + +EXIT_EOF : EOF->popMode; + +mode DIRECTIVE_ARG_WITH_PARAM; + +D_ARG_PARAM_LPAREN : '(' {this.consumeDirectiveArgLParen();}; +D_ARG_PARAM_RPAREN : ')' {this.consumeDirectiveArgRParen();}; + +BL_SQ_LPAREN : '[' {this.squareParenBalance++;}->skip; +BL_SQ_RPAREN : ']' {this.squareParenBalance--;}->skip; + +BL_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->skip; +BL_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->skip; + +D_ARG_COMMA_EL : ',' {this.consumeBladeParamComma();}; +D_ARG_PARAM_NL : [\r\n]->type(NL); + +BL_PHP_EXPR : . ->skip; + +BL_EXIT_EOF : EOF->popMode; + +mode BLADE_INLINE_PHP; + +D_ENDPHP : '@endphp'->popMode; + +PHP_CODE_GREEDY : ~[@]+->type(PHP_CODE); + +PHP_CODE_COMPLETION : . ->type(PHP_CODE); + +// {{ }} +mode INSIDE_REGULAR_ECHO; + +CONTENT_TAG_CLOSE : ('}}')->popMode; +CONTENT_OTHER : . ->skip; +EXIT_REGULAR_ECHO_EOF : EOF->popMode; + +// {!! !!} +mode INSIDE_RAW_ECHO; + +RAW_TAG_CLOSE : ('!!}')->popMode; +RAW_CONTENT_OTHER : . ->skip; +EXIT_RAW_ECHO_EOF : EOF->popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java new file mode 100644 index 000000000000..9a8a2d31d81e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java @@ -0,0 +1,1129 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrFormatterLexer extends LexerAdaptor { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, PHP_CODE=2, PARAM_COMMA=3, PHP_INLINE=4, D_BLOCK_DIRECTIVE_START=5, + D_BLOCK_DIRECTIVE_END=6, D_SECTION=7, D_ENDSECTION=8, D_BLOCK_ALIGNED_DIRECTIVE=9, + NON_PARAM_DIRECTIVE=10, D_INLINE_DIRECTIVE=11, STRING=12, CONTENT_TAG_OPEN=13, + RAW_TAG_OPEN=14, SG_QUOTE=15, DB_QUOTE=16, HTML_CLOSE_TAG=17, HTML_COMMENT=18, + HTML_START_BLOCK_TAG=19, HTML_SELF_CLOSE_TAG=20, COMPONENT_TAG=21, EQ=22, + IDENTIFIER=23, INLINE_GT_SYMBOL=24, GT_SYMBOL=25, D_PHP=26, AT=27, WS=28, + NL=29, OTHER=30, D_ARG_LPAREN=31, D_ARG_RPAREN=32, PHP_EXPR=33, EXIT_EOF=34, + D_ARG_PARAM_LPAREN=35, D_ARG_PARAM_RPAREN=36, BL_SQ_LPAREN=37, BL_SQ_RPAREN=38, + BL_CURLY_LPAREN=39, BL_CURLY_RPAREN=40, D_ARG_COMMA_EL=41, BL_PHP_EXPR=42, + BL_EXIT_EOF=43, D_ENDPHP=44, CONTENT_TAG_CLOSE=45, CONTENT_OTHER=46, EXIT_REGULAR_ECHO_EOF=47, + RAW_TAG_CLOSE=48, RAW_CONTENT_OTHER=49, EXIT_RAW_ECHO_EOF=50; + public static final int + COMMENT=2; + public static final int + DIRECTIVE_ARG=1, DIRECTIVE_ARG_WITH_PARAM=2, BLADE_INLINE_PHP=3, INSIDE_REGULAR_ECHO=4, + INSIDE_RAW_ECHO=5; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "COMMENT" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "DIRECTIVE_ARG", "DIRECTIVE_ARG_WITH_PARAM", "BLADE_INLINE_PHP", + "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO" + }; + + private static String[] makeRuleNames() { + return new String[] { + "DirectiveLabel", "Identifier", "CompomentIdentifier", "DirectiveArgLookup", + "DOUBLE_QUOTED_STRING_FRAGMENT", "SINGLE_QUOTED_STRING_FRAGMENT", "BlockDirectiveName", + "PHP_INLINE", "D_ESCAPES", "D_BLOCK_DIRECTIVE_START", "D_BLOCK_DIRECTIVE_START_NO_ARG", + "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", + "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", + "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", + "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", + "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "D_ARG_NL", "PHP_EXPR", "EXIT_EOF", + "D_ARG_PARAM_LPAREN", "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", + "BL_CURLY_LPAREN", "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "D_ARG_PARAM_NL", + "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", "PHP_CODE_GREEDY", "PHP_CODE_COMPLETION", + "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'{{'", "'{!!'", "'''", "'\"'", null, null, null, null, null, "'='", + null, "'/>'", "'>'", null, "'@'", null, null, null, null, null, null, + null, null, null, null, null, null, null, "','", null, null, "'@endphp'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "PHP_CODE", "PARAM_COMMA", "PHP_INLINE", "D_BLOCK_DIRECTIVE_START", + "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", + "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", + "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", + "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", + "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "PHP_EXPR", "EXIT_EOF", "D_ARG_PARAM_LPAREN", + "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", "BL_CURLY_LPAREN", + "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", + "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public BladeAntlrFormatterLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladeAntlrFormatterLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 36: + D_ARG_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 37: + D_ARG_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 41: + D_ARG_PARAM_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 42: + D_ARG_PARAM_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 43: + BL_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 44: + BL_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 45: + BL_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 46: + BL_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 47: + D_ARG_COMMA_EL_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void D_ARG_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + this.consumeDirectiveArgLParen(); + break; + } + } + private void D_ARG_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + this.consumeDirectiveArgRParen(); + break; + } + } + private void D_ARG_PARAM_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + this.consumeDirectiveArgLParen(); + break; + } + } + private void D_ARG_PARAM_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + this.consumeDirectiveArgRParen(); + break; + } + } + private void BL_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + this.squareParenBalance++; + break; + } + } + private void BL_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + this.squareParenBalance--; + break; + } + } + private void BL_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 6: + this.curlyParenBalance++; + break; + } + } + private void BL_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 7: + this.curlyParenBalance--; + break; + } + } + private void D_ARG_COMMA_EL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 8: + this.consumeBladeParamComma(); + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 3: + return DirectiveArgLookup_sempred((RuleContext)_localctx, predIndex); + case 24: + return HTML_START_BLOCK_TAG_sempred((RuleContext)_localctx, predIndex); + case 31: + return D_PHP_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean DirectiveArgLookup_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this._input.LA(1) == '('; + } + return true; + } + private boolean HTML_START_BLOCK_TAG_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return this._input.LA(1) == '>' || this._input.LA(1) == '@' || this._input.LA(1) == ' ' || this._input.LA(1) == '\n'; + } + return true; + } + private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return this._input.LA(1) == ' ' || this._input.LA(1) == '\n'; + } + return true; + } + + public static final String _serializedATN = + "\u0004\u00002\u04bf\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ + "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ + "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ + "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ + "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0001\u0000\u0001\u0000\u0005\u0000"+ + "\u0081\b\u0000\n\u0000\f\u0000\u0084\t\u0000\u0001\u0001\u0001\u0001\u0005"+ + "\u0001\u0088\b\u0001\n\u0001\f\u0001\u008b\t\u0001\u0001\u0002\u0001\u0002"+ + "\u0005\u0002\u008f\b\u0002\n\u0002\f\u0002\u0092\t\u0002\u0001\u0003\u0005"+ + "\u0003\u0095\b\u0003\n\u0003\f\u0003\u0098\t\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004\u009f\b\u0004\n\u0004"+ + "\f\u0004\u00a2\t\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u00aa\b\u0005\n\u0005\f\u0005\u00ad"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u00c6\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0003\u0006\u00d4\b\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u0131"+ + "\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0003\u0006\u0140\b\u0006\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u0147\b\u0007\n\u0007\f\u0007"+ + "\u014a\t\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u0155\b\u0007"+ + "\n\u0007\f\u0007\u0158\t\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u015c"+ + "\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003"+ + "\b\u0165\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u016b\b\b\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0005\b\u0175"+ + "\b\b\n\b\f\b\u0178\t\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0003\b\u01e5\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0003\n\u01fe\b\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u020f\b\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u023a\b\r\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e"+ + "\u024e\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u025f\b\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u026a\b\u0010\u0001\u0011"+ + "\u0001\u0011\u0003\u0011\u026e\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0005\u0016\u0281\b\u0016\n\u0016\f\u0016\u0284"+ + "\t\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0288\b\u0016\n\u0016\f\u0016"+ + "\u028b\t\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u028f\b\u0016\n\u0016"+ + "\f\u0016\u0292\t\u0016\u0001\u0016\u0005\u0016\u0295\b\u0016\n\u0016\f"+ + "\u0016\u0298\t\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0005\u0016\u029f\b\u0016\n\u0016\f\u0016\u02a2\t\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0004\u0016\u02ad\b\u0016\u000b\u0016\f\u0016"+ + "\u02ae\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0005\u0016\u02be\b\u0016\n\u0016\f\u0016\u02c1\t\u0016"+ + "\u0003\u0016\u02c3\b\u0016\u0001\u0016\u0005\u0016\u02c6\b\u0016\n\u0016"+ + "\f\u0016\u02c9\t\u0016\u0001\u0016\u0001\u0016\u0003\u0016\u02cd\b\u0016"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0005\u0017\u02d5\b\u0017\n\u0017\f\u0017\u02d8\t\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0003\u0018\u03fc\b\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0003\u0019\u0415\b\u0019\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0004\u001a\u0422\b\u001a\u000b\u001a\f"+ + "\u001a\u0423\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0003\u001a\u0432\b\u001a\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001"+ + "!\u0004!\u044b\b!\u000b!\f!\u044c\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+ + "&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001"+ + ")\u0001)\u0001)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u0001"+ + "2\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00014\u00044\u049b\b4\u000b4\f4\u049c\u00014\u00014\u00015\u00015\u0001"+ + "5\u00015\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ + "7\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u00019\u0001"+ + "9\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0004\u00a0"+ + "\u0148\u0156\u02d6\u0000<\u0006\u0000\b\u0000\n\u0000\f\u0000\u000e\u0000"+ + "\u0010\u0000\u0012\u0000\u0014\u0004\u0016\u0000\u0018\u0005\u001a\u0000"+ + "\u001c\u0006\u001e\u0007 \b\"\t$\n&\u000b(\f*\r,\u000e.\u000f0\u00102"+ + "\u00114\u00126\u00138\u0014:\u0015<\u0016>\u0017@\u0018B\u0019D\u001a"+ + "F\u001bH\u001cJ\u001dL\u001eN\u001fP R\u0000T!V\"X#Z$\\%^&`\'b(d)f\u0000"+ + "h*j+l,n\u0000p\u0000r-t.v/x0z1|2\u0006\u0000\u0001\u0002\u0003\u0004\u0005"+ + "$\u0003\u0000AZaz\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe"+ + "\u0006\u0000..0:AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002\u0000"+ + "\'\'\\\\\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000TTtt\u0002\u0000H"+ + "Hhh\u0002\u0000GGgg\u0002\u0000EEee\u0002\u0000SSss\u0002\u0000IIii\u0002"+ + "\u0000FFff\u0002\u0000CCcc\u0002\u0000NNnn\u0002\u0000YYyy\u0002\u0000"+ + "OOoo\u0002\u0000RRrr\u0002\u0000LLll\u0002\u0000WWww\u0002\u0000MMmm\u0002"+ + "\u0000VVvv\u0002\u0000BBbb\u0002\u0000PPpp\u0002\u0000DDdd\u0001\u0000"+ + " \u0002\u0000KKkk\u0006\u0000..09AZ__az\u0080\u8000\ufffe\u0002\u0000"+ + "XXxx\u0002\u0000QQqq\u0001\u000019\u0006\u0000ABIIPQabiipq\u0002\u0000"+ + "\t\t \u0002\u0000\n\n\r\r\u0001\u0000@@\u0545\u0000\u0014\u0001\u0000"+ + "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ + "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ + "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ + "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ + "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ + "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ + "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ + "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ + "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ + "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ + "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ + "\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000"+ + "\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0001N\u0001\u0000\u0000\u0000"+ + "\u0001P\u0001\u0000\u0000\u0000\u0001R\u0001\u0000\u0000\u0000\u0001T"+ + "\u0001\u0000\u0000\u0000\u0001V\u0001\u0000\u0000\u0000\u0002X\u0001\u0000"+ + "\u0000\u0000\u0002Z\u0001\u0000\u0000\u0000\u0002\\\u0001\u0000\u0000"+ + "\u0000\u0002^\u0001\u0000\u0000\u0000\u0002`\u0001\u0000\u0000\u0000\u0002"+ + "b\u0001\u0000\u0000\u0000\u0002d\u0001\u0000\u0000\u0000\u0002f\u0001"+ + "\u0000\u0000\u0000\u0002h\u0001\u0000\u0000\u0000\u0002j\u0001\u0000\u0000"+ + "\u0000\u0003l\u0001\u0000\u0000\u0000\u0003n\u0001\u0000\u0000\u0000\u0003"+ + "p\u0001\u0000\u0000\u0000\u0004r\u0001\u0000\u0000\u0000\u0004t\u0001"+ + "\u0000\u0000\u0000\u0004v\u0001\u0000\u0000\u0000\u0005x\u0001\u0000\u0000"+ + "\u0000\u0005z\u0001\u0000\u0000\u0000\u0005|\u0001\u0000\u0000\u0000\u0006"+ + "~\u0001\u0000\u0000\u0000\b\u0085\u0001\u0000\u0000\u0000\n\u008c\u0001"+ + "\u0000\u0000\u0000\f\u0096\u0001\u0000\u0000\u0000\u000e\u009b\u0001\u0000"+ + "\u0000\u0000\u0010\u00a5\u0001\u0000\u0000\u0000\u0012\u013f\u0001\u0000"+ + "\u0000\u0000\u0014\u015b\u0001\u0000\u0000\u0000\u0016\u01e4\u0001\u0000"+ + "\u0000\u0000\u0018\u01e8\u0001\u0000\u0000\u0000\u001a\u01ee\u0001\u0000"+ + "\u0000\u0000\u001c\u020e\u0001\u0000\u0000\u0000\u001e\u0210\u0001\u0000"+ + "\u0000\u0000 \u0239\u0001\u0000\u0000\u0000\"\u024d\u0001\u0000\u0000"+ + "\u0000$\u025e\u0001\u0000\u0000\u0000&\u0269\u0001\u0000\u0000\u0000("+ + "\u026d\u0001\u0000\u0000\u0000*\u026f\u0001\u0000\u0000\u0000,\u0274\u0001"+ + "\u0000\u0000\u0000.\u027a\u0001\u0000\u0000\u00000\u027c\u0001\u0000\u0000"+ + "\u00002\u02cc\u0001\u0000\u0000\u00004\u02ce\u0001\u0000\u0000\u00006"+ + "\u02dd\u0001\u0000\u0000\u00008\u03ff\u0001\u0000\u0000\u0000:\u0431\u0001"+ + "\u0000\u0000\u0000<\u0433\u0001\u0000\u0000\u0000>\u0435\u0001\u0000\u0000"+ + "\u0000@\u0437\u0001\u0000\u0000\u0000B\u043a\u0001\u0000\u0000\u0000D"+ + "\u043c\u0001\u0000\u0000\u0000F\u0445\u0001\u0000\u0000\u0000H\u044a\u0001"+ + "\u0000\u0000\u0000J\u044e\u0001\u0000\u0000\u0000L\u0450\u0001\u0000\u0000"+ + "\u0000N\u0454\u0001\u0000\u0000\u0000P\u0457\u0001\u0000\u0000\u0000R"+ + "\u045a\u0001\u0000\u0000\u0000T\u045e\u0001\u0000\u0000\u0000V\u0462\u0001"+ + "\u0000\u0000\u0000X\u0466\u0001\u0000\u0000\u0000Z\u0469\u0001\u0000\u0000"+ + "\u0000\\\u046c\u0001\u0000\u0000\u0000^\u0471\u0001\u0000\u0000\u0000"+ + "`\u0476\u0001\u0000\u0000\u0000b\u047b\u0001\u0000\u0000\u0000d\u0480"+ + "\u0001\u0000\u0000\u0000f\u0483\u0001\u0000\u0000\u0000h\u0487\u0001\u0000"+ + "\u0000\u0000j\u048b\u0001\u0000\u0000\u0000l\u048f\u0001\u0000\u0000\u0000"+ + "n\u049a\u0001\u0000\u0000\u0000p\u04a0\u0001\u0000\u0000\u0000r\u04a4"+ + "\u0001\u0000\u0000\u0000t\u04a9\u0001\u0000\u0000\u0000v\u04ad\u0001\u0000"+ + "\u0000\u0000x\u04b1\u0001\u0000\u0000\u0000z\u04b7\u0001\u0000\u0000\u0000"+ + "|\u04bb\u0001\u0000\u0000\u0000~\u0082\u0007\u0000\u0000\u0000\u007f\u0081"+ + "\u0007\u0001\u0000\u0000\u0080\u007f\u0001\u0000\u0000\u0000\u0081\u0084"+ + "\u0001\u0000\u0000\u0000\u0082\u0080\u0001\u0000\u0000\u0000\u0082\u0083"+ + "\u0001\u0000\u0000\u0000\u0083\u0007\u0001\u0000\u0000\u0000\u0084\u0082"+ + "\u0001\u0000\u0000\u0000\u0085\u0089\u0007\u0000\u0000\u0000\u0086\u0088"+ + "\u0007\u0001\u0000\u0000\u0087\u0086\u0001\u0000\u0000\u0000\u0088\u008b"+ + "\u0001\u0000\u0000\u0000\u0089\u0087\u0001\u0000\u0000\u0000\u0089\u008a"+ + "\u0001\u0000\u0000\u0000\u008a\t\u0001\u0000\u0000\u0000\u008b\u0089\u0001"+ + "\u0000\u0000\u0000\u008c\u0090\u0007\u0000\u0000\u0000\u008d\u008f\u0007"+ + "\u0002\u0000\u0000\u008e\u008d\u0001\u0000\u0000\u0000\u008f\u0092\u0001"+ + "\u0000\u0000\u0000\u0090\u008e\u0001\u0000\u0000\u0000\u0090\u0091\u0001"+ + "\u0000\u0000\u0000\u0091\u000b\u0001\u0000\u0000\u0000\u0092\u0090\u0001"+ + "\u0000\u0000\u0000\u0093\u0095\u0005 \u0000\u0000\u0094\u0093\u0001\u0000"+ + "\u0000\u0000\u0095\u0098\u0001\u0000\u0000\u0000\u0096\u0094\u0001\u0000"+ + "\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000\u0097\u0099\u0001\u0000"+ + "\u0000\u0000\u0098\u0096\u0001\u0000\u0000\u0000\u0099\u009a\u0004\u0003"+ + "\u0000\u0000\u009a\r\u0001\u0000\u0000\u0000\u009b\u00a0\u0005\"\u0000"+ + "\u0000\u009c\u009f\u0007\u0003\u0000\u0000\u009d\u009f\t\u0000\u0000\u0000"+ + "\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009d\u0001\u0000\u0000\u0000"+ + "\u009f\u00a2\u0001\u0000\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000"+ + "\u00a0\u009e\u0001\u0000\u0000\u0000\u00a1\u00a3\u0001\u0000\u0000\u0000"+ + "\u00a2\u00a0\u0001\u0000\u0000\u0000\u00a3\u00a4\u0005\"\u0000\u0000\u00a4"+ + "\u000f\u0001\u0000\u0000\u0000\u00a5\u00ab\u0005\'\u0000\u0000\u00a6\u00aa"+ + "\b\u0004\u0000\u0000\u00a7\u00a8\u0005\\\u0000\u0000\u00a8\u00aa\t\u0000"+ + "\u0000\u0000\u00a9\u00a6\u0001\u0000\u0000\u0000\u00a9\u00a7\u0001\u0000"+ + "\u0000\u0000\u00aa\u00ad\u0001\u0000\u0000\u0000\u00ab\u00a9\u0001\u0000"+ + "\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ae\u0001\u0000"+ + "\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae\u00af\u0005\'\u0000"+ + "\u0000\u00af\u0011\u0001\u0000\u0000\u0000\u00b0\u00b1\u0007\u0005\u0000"+ + "\u0000\u00b1\u00b2\u0007\u0006\u0000\u0000\u00b2\u00b3\u0007\u0007\u0000"+ + "\u0000\u00b3\u0140\u0007\b\u0000\u0000\u00b4\u00b5\u0007\t\u0000\u0000"+ + "\u00b5\u00b6\u0007\u0006\u0000\u0000\u00b6\u00b7\u0007\n\u0000\u0000\u00b7"+ + "\u00b8\u0007\u000b\u0000\u0000\u00b8\u0140\u0007\u0007\u0000\u0000\u00b9"+ + "\u00ba\u0007\f\u0000\u0000\u00ba\u0140\u0007\r\u0000\u0000\u00bb\u00bc"+ + "\u0007\u000e\u0000\u0000\u00bc\u00bd\u0007\u0005\u0000\u0000\u00bd\u00be"+ + "\u0007\u000f\u0000\u0000\u00be\u00c5\u0001\u0000\u0000\u0000\u00bf\u00c0"+ + "\u0007\u0005\u0000\u0000\u00c0\u00c1\u0007\u000f\u0000\u0000\u00c1\u00c6"+ + "\u0007\u0010\u0000\u0000\u00c2\u00c3\u0007\u000f\u0000\u0000\u00c3\u00c4"+ + "\u0007\u0011\u0000\u0000\u00c4\u00c6\u0007\u0007\u0000\u0000\u00c5\u00bf"+ + "\u0001\u0000\u0000\u0000\u00c5\u00c2\u0001\u0000\u0000\u0000\u00c5\u00c6"+ + "\u0001\u0000\u0000\u0000\u00c6\u0140\u0001\u0000\u0000\u0000\u00c7\u00c8"+ + "\u0007\r\u0000\u0000\u00c8\u00c9\u0007\u0011\u0000\u0000\u00c9\u00ca\u0007"+ + "\u0012\u0000\u0000\u00ca\u00d3\u0001\u0000\u0000\u0000\u00cb\u00cc\u0007"+ + "\n\u0000\u0000\u00cc\u00cd\u0007\u0005\u0000\u0000\u00cd\u00ce\u0007\u000e"+ + "\u0000\u0000\u00ce\u00d4\u0007\b\u0000\u0000\u00cf\u00d0\u0007\n\u0000"+ + "\u0000\u00d0\u00d1\u0007\u0013\u0000\u0000\u00d1\u00d2\u0007\u000b\u0000"+ + "\u0000\u00d2\u00d4\u0007\n\u0000\u0000\u00d3\u00cb\u0001\u0000\u0000\u0000"+ + "\u00d3\u00cf\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001\u0000\u0000\u0000"+ + "\u00d4\u0140\u0001\u0000\u0000\u0000\u00d5\u00d6\u0007\u0014\u0000\u0000"+ + "\u00d6\u00d7\u0007\b\u0000\u0000\u00d7\u00d8\u0007\f\u0000\u0000\u00d8"+ + "\u00d9\u0007\u0013\u0000\u0000\u00d9\u0140\u0007\n\u0000\u0000\u00da\u00db"+ + "\u0007\b\u0000\u0000\u00db\u00dc\u0007\u0005\u0000\u0000\u00dc\u00dd\u0007"+ + "\u000b\u0000\u0000\u00dd\u00de\u0007\u000b\u0000\u0000\u00de\u00df\u0007"+ + "\n\u0000\u0000\u00df\u00e0\u0007\u000e\u0000\u0000\u00e0\u00e1\u0007\u0007"+ + "\u0000\u0000\u00e1\u00e2\u0007\f\u0000\u0000\u00e2\u00e3\u0007\u0011\u0000"+ + "\u0000\u00e3\u0140\u0007\u000f\u0000\u0000\u00e4\u00e5\u0007\u000b\u0000"+ + "\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6\u00e7\u0007\u000e\u0000\u0000"+ + "\u00e7\u00e8\u0007\u0007\u0000\u0000\u00e8\u00e9\u0007\f\u0000\u0000\u00e9"+ + "\u00ea\u0007\u0011\u0000\u0000\u00ea\u00eb\u0007\u000f\u0000\u0000\u00eb"+ + "\u00ec\u0007\u0015\u0000\u0000\u00ec\u00ed\u0007\f\u0000\u0000\u00ed\u00ee"+ + "\u0007\u000b\u0000\u0000\u00ee\u00ef\u0007\u000b\u0000\u0000\u00ef\u00f0"+ + "\u0007\f\u0000\u0000\u00f0\u00f1\u0007\u000f\u0000\u0000\u00f1\u0140\u0007"+ + "\t\u0000\u0000\u00f2\u00f3\u0007\r\u0000\u0000\u00f3\u00f4\u0007\u0012"+ + "\u0000\u0000\u00f4\u00f5\u0007\u0005\u0000\u0000\u00f5\u00f6\u0007\t\u0000"+ + "\u0000\u00f6\u00f7\u0007\u0015\u0000\u0000\u00f7\u00f8\u0007\n\u0000\u0000"+ + "\u00f8\u00f9\u0007\u000f\u0000\u0000\u00f9\u0140\u0007\u0007\u0000\u0000"+ + "\u00fa\u00fb\u0007\u0016\u0000\u0000\u00fb\u00fc\u0007\n\u0000\u0000\u00fc"+ + "\u00fd\u0007\u0012\u0000\u0000\u00fd\u00fe\u0007\u0017\u0000\u0000\u00fe"+ + "\u00ff\u0007\u0005\u0000\u0000\u00ff\u0100\u0007\u0007\u0000\u0000\u0100"+ + "\u0101\u0007\f\u0000\u0000\u0101\u0140\u0007\u0015\u0000\u0000\u0102\u0103"+ + "\u0007\f\u0000\u0000\u0103\u0104\u0007\u000b\u0000\u0000\u0104\u0105\u0007"+ + "\u000b\u0000\u0000\u0105\u0106\u0007\n\u0000\u0000\u0106\u0140\u0007\u0007"+ + "\u0000\u0000\u0107\u0108\u0007\u0006\u0000\u0000\u0108\u0109\u0007\u000f"+ + "\u0000\u0000\u0109\u010a\u0007\u0013\u0000\u0000\u010a\u010b\u0007\n\u0000"+ + "\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c\u0140\u0007\u000b\u0000"+ + "\u0000\u010d\u010e\u0007\n\u0000\u0000\u010e\u010f\u0007\u0015\u0000\u0000"+ + "\u010f\u0110\u0007\u0018\u0000\u0000\u0110\u0111\u0007\u0007\u0000\u0000"+ + "\u0111\u0140\u0007\u0010\u0000\u0000\u0112\u0113\u0007\u000b\u0000\u0000"+ + "\u0113\u0114\u0007\n\u0000\u0000\u0114\u0115\u0007\u000b\u0000\u0000\u0115"+ + "\u0116\u0007\u000b\u0000\u0000\u0116\u0117\u0007\f\u0000\u0000\u0117\u0118"+ + "\u0007\u0011\u0000\u0000\u0118\u0140\u0007\u000f\u0000\u0000\u0119\u011a"+ + "\u0007\n\u0000\u0000\u011a\u011b\u0007\u000f\u0000\u0000\u011b\u0140\u0007"+ + "\u0016\u0000\u0000\u011c\u011d\u0007\u0011\u0000\u0000\u011d\u011e\u0007"+ + "\u000f\u0000\u0000\u011e\u011f\u0007\u000e\u0000\u0000\u011f\u0140\u0007"+ + "\n\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122\u0007\u0012"+ + "\u0000\u0000\u0122\u0123\u0007\u0012\u0000\u0000\u0123\u0124\u0007\u0011"+ + "\u0000\u0000\u0124\u0140\u0007\u0012\u0000\u0000\u0125\u0126\u0007\u0018"+ + "\u0000\u0000\u0126\u0127\u0007\u0006\u0000\u0000\u0127\u0128\u0007\u000b"+ + "\u0000\u0000\u0128\u0129\u0007\b\u0000\u0000\u0129\u0130\u0001\u0000\u0000"+ + "\u0000\u012a\u012b\u0007\f\u0000\u0000\u012b\u0131\u0007\r\u0000\u0000"+ + "\u012c\u012d\u0007\u0011\u0000\u0000\u012d\u012e\u0007\u000f\u0000\u0000"+ + "\u012e\u012f\u0007\u000e\u0000\u0000\u012f\u0131\u0007\n\u0000\u0000\u0130"+ + "\u012a\u0001\u0000\u0000\u0000\u0130\u012c\u0001\u0000\u0000\u0000\u0130"+ + "\u0131\u0001\u0000\u0000\u0000\u0131\u0140\u0001\u0000\u0000\u0000\u0132"+ + "\u0133\u0007\u0018\u0000\u0000\u0133\u0134\u0007\u0012\u0000\u0000\u0134"+ + "\u0135\u0007\n\u0000\u0000\u0135\u0136\u0007\u0018\u0000\u0000\u0136\u0137"+ + "\u0007\n\u0000\u0000\u0137\u0138\u0007\u000f\u0000\u0000\u0138\u0140\u0007"+ + "\u0019\u0000\u0000\u0139\u013a\u0007\u000b\u0000\u0000\u013a\u013b\u0007"+ + "\u0014\u0000\u0000\u013b\u013c\u0007\f\u0000\u0000\u013c\u013d\u0007\u0007"+ + "\u0000\u0000\u013d\u013e\u0007\u000e\u0000\u0000\u013e\u0140\u0007\b\u0000"+ + "\u0000\u013f\u00b0\u0001\u0000\u0000\u0000\u013f\u00b4\u0001\u0000\u0000"+ + "\u0000\u013f\u00b9\u0001\u0000\u0000\u0000\u013f\u00bb\u0001\u0000\u0000"+ + "\u0000\u013f\u00c7\u0001\u0000\u0000\u0000\u013f\u00d5\u0001\u0000\u0000"+ + "\u0000\u013f\u00da\u0001\u0000\u0000\u0000\u013f\u00e4\u0001\u0000\u0000"+ + "\u0000\u013f\u00f2\u0001\u0000\u0000\u0000\u013f\u00fa\u0001\u0000\u0000"+ + "\u0000\u013f\u0102\u0001\u0000\u0000\u0000\u013f\u0107\u0001\u0000\u0000"+ + "\u0000\u013f\u010d\u0001\u0000\u0000\u0000\u013f\u0112\u0001\u0000\u0000"+ + "\u0000\u013f\u0119\u0001\u0000\u0000\u0000\u013f\u011c\u0001\u0000\u0000"+ + "\u0000\u013f\u0120\u0001\u0000\u0000\u0000\u013f\u0125\u0001\u0000\u0000"+ + "\u0000\u013f\u0132\u0001\u0000\u0000\u0000\u013f\u0139\u0001\u0000\u0000"+ + "\u0000\u0140\u0013\u0001\u0000\u0000\u0000\u0141\u0142\u0005<\u0000\u0000"+ + "\u0142\u0143\u0005?\u0000\u0000\u0143\u0144\u0005=\u0000\u0000\u0144\u0148"+ + "\u0001\u0000\u0000\u0000\u0145\u0147\t\u0000\u0000\u0000\u0146\u0145\u0001"+ + "\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000\u0000\u0148\u0149\u0001"+ + "\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000\u0000\u0149\u014b\u0001"+ + "\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000\u014b\u014c\u0005"+ + "?\u0000\u0000\u014c\u015c\u0005>\u0000\u0000\u014d\u014e\u0005<\u0000"+ + "\u0000\u014e\u014f\u0005?\u0000\u0000\u014f\u0150\u0007\u0018\u0000\u0000"+ + "\u0150\u0151\u0007\b\u0000\u0000\u0151\u0152\u0007\u0018\u0000\u0000\u0152"+ + "\u0156\u0001\u0000\u0000\u0000\u0153\u0155\t\u0000\u0000\u0000\u0154\u0153"+ + "\u0001\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000\u0000\u0156\u0157"+ + "\u0001\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0157\u0159"+ + "\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000\u0000\u0000\u0159\u015a"+ + "\u0005?\u0000\u0000\u015a\u015c\u0005>\u0000\u0000\u015b\u0141\u0001\u0000"+ + "\u0000\u0000\u015b\u014d\u0001\u0000\u0000\u0000\u015c\u0015\u0001\u0000"+ + "\u0000\u0000\u015d\u015e\u0005{\u0000\u0000\u015e\u015f\u0005{\u0000\u0000"+ + "\u015f\u01e5\u0005{\u0000\u0000\u0160\u0161\u0005@\u0000\u0000\u0161\u0162"+ + "\u0005@\u0000\u0000\u0162\u0164\u0001\u0000\u0000\u0000\u0163\u0165\u0005"+ + "@\u0000\u0000\u0164\u0163\u0001\u0000\u0000\u0000\u0164\u0165\u0001\u0000"+ + "\u0000\u0000\u0165\u01e5\u0001\u0000\u0000\u0000\u0166\u0167\u0005@\u0000"+ + "\u0000\u0167\u0168\u0005{\u0000\u0000\u0168\u016a\u0001\u0000\u0000\u0000"+ + "\u0169\u016b\u0005{\u0000\u0000\u016a\u0169\u0001\u0000\u0000\u0000\u016a"+ + "\u016b\u0001\u0000\u0000\u0000\u016b\u01e5\u0001\u0000\u0000\u0000\u016c"+ + "\u016d\u0005@\u0000\u0000\u016d\u016e\u0007\u0015\u0000\u0000\u016e\u016f"+ + "\u0007\n\u0000\u0000\u016f\u0170\u0007\u0019\u0000\u0000\u0170\u0171\u0007"+ + "\f\u0000\u0000\u0171\u0172\u0007\u0005\u0000\u0000\u0172\u0176\u0001\u0000"+ + "\u0000\u0000\u0173\u0175\u0007\u001a\u0000\u0000\u0174\u0173\u0001\u0000"+ + "\u0000\u0000\u0175\u0178\u0001\u0000\u0000\u0000\u0176\u0174\u0001\u0000"+ + "\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177\u01e5\u0001\u0000"+ + "\u0000\u0000\u0178\u0176\u0001\u0000\u0000\u0000\u0179\u017a\u0005@\u0000"+ + "\u0000\u017a\u017b\u0007\u000e\u0000\u0000\u017b\u017c\u0007\b\u0000\u0000"+ + "\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e\u0007\u0012\u0000\u0000"+ + "\u017e\u017f\u0007\u000b\u0000\u0000\u017f\u0180\u0007\n\u0000\u0000\u0180"+ + "\u01e5\u0007\u0007\u0000\u0000\u0181\u0182\u0005@\u0000\u0000\u0182\u0183"+ + "\u0007\f\u0000\u0000\u0183\u0184\u0007\u0015\u0000\u0000\u0184\u0185\u0007"+ + "\u0018\u0000\u0000\u0185\u0186\u0007\u0011\u0000\u0000\u0186\u0187\u0007"+ + "\u0012\u0000\u0000\u0187\u01e5\u0007\u0007\u0000\u0000\u0188\u0189\u0005"+ + "@\u0000\u0000\u0189\u018a\u0007\u000f\u0000\u0000\u018a\u018b\u0007\u0005"+ + "\u0000\u0000\u018b\u018c\u0007\u0015\u0000\u0000\u018c\u018d\u0007\n\u0000"+ + "\u0000\u018d\u018e\u0007\u000b\u0000\u0000\u018e\u018f\u0007\u0018\u0000"+ + "\u0000\u018f\u0190\u0007\u0005\u0000\u0000\u0190\u0191\u0007\u000e\u0000"+ + "\u0000\u0191\u01e5\u0007\n\u0000\u0000\u0192\u0193\u0005@\u0000\u0000"+ + "\u0193\u0194\u0007\u0019\u0000\u0000\u0194\u0195\u0007\u0011\u0000\u0000"+ + "\u0195\u0196\u0007\u000e\u0000\u0000\u0196\u0197\u0007\u0006\u0000\u0000"+ + "\u0197\u0198\u0007\u0015\u0000\u0000\u0198\u0199\u0007\n\u0000\u0000\u0199"+ + "\u019a\u0007\u000f\u0000\u0000\u019a\u01e5\u0007\u0007\u0000\u0000\u019b"+ + "\u019c\u0005@\u0000\u0000\u019c\u019d\u0007\r\u0000\u0000\u019d\u019e"+ + "\u0007\u0011\u0000\u0000\u019e\u019f\u0007\u000f\u0000\u0000\u019f\u01a0"+ + "\u0007\u0007\u0000\u0000\u01a0\u01a1\u0005-\u0000\u0000\u01a1\u01a2\u0007"+ + "\r\u0000\u0000\u01a2\u01a3\u0007\u0005\u0000\u0000\u01a3\u01a4\u0007\u000e"+ + "\u0000\u0000\u01a4\u01e5\u0007\n\u0000\u0000\u01a5\u01a6\u0005@\u0000"+ + "\u0000\u01a6\u01a7\u0007\u0018\u0000\u0000\u01a7\u01a8\u0007\u0005\u0000"+ + "\u0000\u01a8\u01a9\u0007\t\u0000\u0000\u01a9\u01e5\u0007\n\u0000\u0000"+ + "\u01aa\u01ab\u0005@\u0000\u0000\u01ab\u01ac\u0007\u000b\u0000\u0000\u01ac"+ + "\u01ad\u0007\u0006\u0000\u0000\u01ad\u01ae\u0007\u0018\u0000\u0000\u01ae"+ + "\u01af\u0007\u0018\u0000\u0000\u01af\u01b0\u0007\u0011\u0000\u0000\u01b0"+ + "\u01b1\u0007\u0012\u0000\u0000\u01b1\u01b2\u0007\u0007\u0000\u0000\u01b2"+ + "\u01e5\u0007\u000b\u0000\u0000\u01b3\u01b4\u0005@\u0000\u0000\u01b4\u01b5"+ + "\u0007\u0013\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6\u01b7"+ + "\u0007\u0010\u0000\u0000\u01b7\u01b8\u0007\n\u0000\u0000\u01b8\u01e5\u0007"+ + "\u0012\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba\u01bb\u0007\u0007"+ + "\u0000\u0000\u01bb\u01bc\u0007\u0005\u0000\u0000\u01bc\u01bd\u0007\f\u0000"+ + "\u0000\u01bd\u01be\u0007\u0013\u0000\u0000\u01be\u01bf\u0007\u0014\u0000"+ + "\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01c1\u0007\u000f\u0000\u0000"+ + "\u01c1\u01e5\u0007\u0019\u0000\u0000\u01c2\u01c3\u0005@\u0000\u0000\u01c3"+ + "\u01c4\u0007\u0005\u0000\u0000\u01c4\u01c5\u0007\u0018\u0000\u0000\u01c5"+ + "\u01c6\u0007\u0018\u0000\u0000\u01c6\u01c7\u0007\u0013\u0000\u0000\u01c7"+ + "\u01e5\u0007\u0010\u0000\u0000\u01c8\u01c9\u0005@\u0000\u0000\u01c9\u01ca"+ + "\u0005-\u0000\u0000\u01ca\u01cb\u0007\u0014\u0000\u0000\u01cb\u01cc\u0007"+ + "\n\u0000\u0000\u01cc\u01cd\u0007\u0017\u0000\u0000\u01cd\u01ce\u0007\u001b"+ + "\u0000\u0000\u01ce\u01cf\u0007\f\u0000\u0000\u01cf\u01d0\u0007\u0007\u0000"+ + "\u0000\u01d0\u01d1\u0005-\u0000\u0000\u01d1\u01d2\u0007\u001b\u0000\u0000"+ + "\u01d2\u01d3\u0007\n\u0000\u0000\u01d3\u01d4\u0007\u0010\u0000\u0000\u01d4"+ + "\u01d5\u0007\r\u0000\u0000\u01d5\u01d6\u0007\u0012\u0000\u0000\u01d6\u01d7"+ + "\u0007\u0005\u0000\u0000\u01d7\u01d8\u0007\u0015\u0000\u0000\u01d8\u01d9"+ + "\u0007\n\u0000\u0000\u01d9\u01e5\u0007\u000b\u0000\u0000\u01da\u01db\u0005"+ + "@\u0000\u0000\u01db\u01dc\u0007\u001b\u0000\u0000\u01dc\u01dd\u0007\n"+ + "\u0000\u0000\u01dd\u01de\u0007\u0010\u0000\u0000\u01de\u01df\u0007\r\u0000"+ + "\u0000\u01df\u01e0\u0007\u0012\u0000\u0000\u01e0\u01e1\u0007\u0005\u0000"+ + "\u0000\u01e1\u01e2\u0007\u0015\u0000\u0000\u01e2\u01e3\u0007\n\u0000\u0000"+ + "\u01e3\u01e5\u0007\u000b\u0000\u0000\u01e4\u015d\u0001\u0000\u0000\u0000"+ + "\u01e4\u0160\u0001\u0000\u0000\u0000\u01e4\u0166\u0001\u0000\u0000\u0000"+ + "\u01e4\u016c\u0001\u0000\u0000\u0000\u01e4\u0179\u0001\u0000\u0000\u0000"+ + "\u01e4\u0181\u0001\u0000\u0000\u0000\u01e4\u0188\u0001\u0000\u0000\u0000"+ + "\u01e4\u0192\u0001\u0000\u0000\u0000\u01e4\u019b\u0001\u0000\u0000\u0000"+ + "\u01e4\u01a5\u0001\u0000\u0000\u0000\u01e4\u01aa\u0001\u0000\u0000\u0000"+ + "\u01e4\u01b3\u0001\u0000\u0000\u0000\u01e4\u01b9\u0001\u0000\u0000\u0000"+ + "\u01e4\u01c2\u0001\u0000\u0000\u0000\u01e4\u01c8\u0001\u0000\u0000\u0000"+ + "\u01e4\u01da\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000\u0000\u0000"+ + "\u01e6\u01e7\u0006\b\u0000\u0000\u01e7\u0017\u0001\u0000\u0000\u0000\u01e8"+ + "\u01e9\u0005@\u0000\u0000\u01e9\u01ea\u0003\u0012\u0006\u0000\u01ea\u01eb"+ + "\u0003\f\u0003\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec\u01ed\u0006"+ + "\t\u0001\u0000\u01ed\u0019\u0001\u0000\u0000\u0000\u01ee\u01fd\u0005@"+ + "\u0000\u0000\u01ef\u01f0\u0007\u0005\u0000\u0000\u01f0\u01f1\u0007\u0006"+ + "\u0000\u0000\u01f1\u01f2\u0007\u0007\u0000\u0000\u01f2\u01fe\u0007\b\u0000"+ + "\u0000\u01f3\u01f4\u0007\u0018\u0000\u0000\u01f4\u01f5\u0007\u0012\u0000"+ + "\u0000\u01f5\u01f6\u0007\u0011\u0000\u0000\u01f6\u01f7\u0007\u0019\u0000"+ + "\u0000\u01f7\u01f8\u0007\u0006\u0000\u0000\u01f8\u01f9\u0007\u000e\u0000"+ + "\u0000\u01f9\u01fa\u0007\u0007\u0000\u0000\u01fa\u01fb\u0007\f\u0000\u0000"+ + "\u01fb\u01fc\u0007\u0011\u0000\u0000\u01fc\u01fe\u0007\u000f\u0000\u0000"+ + "\u01fd\u01ef\u0001\u0000\u0000\u0000\u01fd\u01f3\u0001\u0000\u0000\u0000"+ + "\u01fe\u01ff\u0001\u0000\u0000\u0000\u01ff\u0200\u0006\n\u0002\u0000\u0200"+ + "\u001b\u0001\u0000\u0000\u0000\u0201\u0202\u0005@\u0000\u0000\u0202\u0203"+ + "\u0007\n\u0000\u0000\u0203\u0204\u0007\u000f\u0000\u0000\u0204\u0205\u0007"+ + "\u0019\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u020f\u0003"+ + "\u0012\u0006\u0000\u0207\u0208\u0005@\u0000\u0000\u0208\u0209\u0007\n"+ + "\u0000\u0000\u0209\u020a\u0007\u000f\u0000\u0000\u020a\u020b\u0007\u0019"+ + "\u0000\u0000\u020b\u020c\u0007\u0018\u0000\u0000\u020c\u020d\u0007\b\u0000"+ + "\u0000\u020d\u020f\u0007\u0018\u0000\u0000\u020e\u0201\u0001\u0000\u0000"+ + "\u0000\u020e\u0207\u0001\u0000\u0000\u0000\u020f\u001d\u0001\u0000\u0000"+ + "\u0000\u0210\u0211\u0005@\u0000\u0000\u0211\u0212\u0007\u000b\u0000\u0000"+ + "\u0212\u0213\u0007\n\u0000\u0000\u0213\u0214\u0007\u000e\u0000\u0000\u0214"+ + "\u0215\u0007\u0007\u0000\u0000\u0215\u0216\u0007\f\u0000\u0000\u0216\u0217"+ + "\u0007\u0011\u0000\u0000\u0217\u0218\u0007\u000f\u0000\u0000\u0218\u0219"+ + "\u0001\u0000\u0000\u0000\u0219\u021a\u0003\f\u0003\u0000\u021a\u021b\u0001"+ + "\u0000\u0000\u0000\u021b\u021c\u0006\f\u0003\u0000\u021c\u001f\u0001\u0000"+ + "\u0000\u0000\u021d\u021e\u0005@\u0000\u0000\u021e\u021f\u0007\n\u0000"+ + "\u0000\u021f\u0220\u0007\u000f\u0000\u0000\u0220\u0221\u0007\u0019\u0000"+ + "\u0000\u0221\u0222\u0007\u000b\u0000\u0000\u0222\u0223\u0007\n\u0000\u0000"+ + "\u0223\u0224\u0007\u000e\u0000\u0000\u0224\u0225\u0007\u0007\u0000\u0000"+ + "\u0225\u0226\u0007\f\u0000\u0000\u0226\u0227\u0007\u0011\u0000\u0000\u0227"+ + "\u023a\u0007\u000f\u0000\u0000\u0228\u0229\u0005@\u0000\u0000\u0229\u022a"+ + "\u0007\u000b\u0000\u0000\u022a\u022b\u0007\b\u0000\u0000\u022b\u022c\u0007"+ + "\u0011\u0000\u0000\u022c\u023a\u0007\u0014\u0000\u0000\u022d\u022e\u0005"+ + "@\u0000\u0000\u022e\u022f\u0007\u0005\u0000\u0000\u022f\u0230\u0007\u0018"+ + "\u0000\u0000\u0230\u0231\u0007\u0018\u0000\u0000\u0231\u0232\u0007\n\u0000"+ + "\u0000\u0232\u0233\u0007\u000f\u0000\u0000\u0233\u023a\u0007\u0019\u0000"+ + "\u0000\u0234\u0235\u0005@\u0000\u0000\u0235\u0236\u0007\u000b\u0000\u0000"+ + "\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238\u0007\u0011\u0000\u0000"+ + "\u0238\u023a\u0007\u0018\u0000\u0000\u0239\u021d\u0001\u0000\u0000\u0000"+ + "\u0239\u0228\u0001\u0000\u0000\u0000\u0239\u022d\u0001\u0000\u0000\u0000"+ + "\u0239\u0234\u0001\u0000\u0000\u0000\u023a!\u0001\u0000\u0000\u0000\u023b"+ + "\u023c\u0005@\u0000\u0000\u023c\u023d\u0007\n\u0000\u0000\u023d\u023e"+ + "\u0007\u0013\u0000\u0000\u023e\u023f\u0007\u000b\u0000\u0000\u023f\u024e"+ + "\u0007\n\u0000\u0000\u0240\u0241\u0005@\u0000\u0000\u0241\u0242\u0007"+ + "\n\u0000\u0000\u0242\u0243\u0007\u0013\u0000\u0000\u0243\u0244\u0007\u000b"+ + "\u0000\u0000\u0244\u0245\u0007\n\u0000\u0000\u0245\u0246\u0007\f\u0000"+ + "\u0000\u0246\u024e\u0007\r\u0000\u0000\u0247\u0248\u0005@\u0000\u0000"+ + "\u0248\u0249\u0007\n\u0000\u0000\u0249\u024a\u0007\u0015\u0000\u0000\u024a"+ + "\u024b\u0007\u0018\u0000\u0000\u024b\u024c\u0007\u0007\u0000\u0000\u024c"+ + "\u024e\u0007\u0010\u0000\u0000\u024d\u023b\u0001\u0000\u0000\u0000\u024d"+ + "\u0240\u0001\u0000\u0000\u0000\u024d\u0247\u0001\u0000\u0000\u0000\u024e"+ + "#\u0001\u0000\u0000\u0000\u024f\u0250\u0005@\u0000\u0000\u0250\u0251\u0007"+ + "\u000e\u0000\u0000\u0251\u0252\u0007\u0011\u0000\u0000\u0252\u0253\u0007"+ + "\u000f\u0000\u0000\u0253\u0254\u0007\u0007\u0000\u0000\u0254\u0255\u0007"+ + "\f\u0000\u0000\u0255\u0256\u0007\u000f\u0000\u0000\u0256\u0257\u0007\u0006"+ + "\u0000\u0000\u0257\u025f\u0007\n\u0000\u0000\u0258\u0259\u0005@\u0000"+ + "\u0000\u0259\u025a\u0007\u0017\u0000\u0000\u025a\u025b\u0007\u0012\u0000"+ + "\u0000\u025b\u025c\u0007\n\u0000\u0000\u025c\u025d\u0007\u0005\u0000\u0000"+ + "\u025d\u025f\u0007\u001b\u0000\u0000\u025e\u024f\u0001\u0000\u0000\u0000"+ + "\u025e\u0258\u0001\u0000\u0000\u0000\u025f%\u0001\u0000\u0000\u0000\u0260"+ + "\u0261\u0005@\u0000\u0000\u0261\u0262\u0003\u0006\u0000\u0000\u0262\u0263"+ + "\u0003\f\u0003\u0000\u0263\u026a\u0001\u0000\u0000\u0000\u0264\u0265\u0005"+ + "@\u0000\u0000\u0265\u0266\u0007\u000e\u0000\u0000\u0266\u0267\u0007\u000b"+ + "\u0000\u0000\u0267\u0268\u0007\u0012\u0000\u0000\u0268\u026a\u0007\r\u0000"+ + "\u0000\u0269\u0260\u0001\u0000\u0000\u0000\u0269\u0264\u0001\u0000\u0000"+ + "\u0000\u026a\'\u0001\u0000\u0000\u0000\u026b\u026e\u0003\u000e\u0004\u0000"+ + "\u026c\u026e\u0003\u0010\u0005\u0000\u026d\u026b\u0001\u0000\u0000\u0000"+ + "\u026d\u026c\u0001\u0000\u0000\u0000\u026e)\u0001\u0000\u0000\u0000\u026f"+ + "\u0270\u0005{\u0000\u0000\u0270\u0271\u0005{\u0000\u0000\u0271\u0272\u0001"+ + "\u0000\u0000\u0000\u0272\u0273\u0006\u0012\u0004\u0000\u0273+\u0001\u0000"+ + "\u0000\u0000\u0274\u0275\u0005{\u0000\u0000\u0275\u0276\u0005!\u0000\u0000"+ + "\u0276\u0277\u0005!\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278"+ + "\u0279\u0006\u0013\u0005\u0000\u0279-\u0001\u0000\u0000\u0000\u027a\u027b"+ + "\u0005\'\u0000\u0000\u027b/\u0001\u0000\u0000\u0000\u027c\u027d\u0005"+ + "\"\u0000\u0000\u027d1\u0001\u0000\u0000\u0000\u027e\u0282\u0005<\u0000"+ + "\u0000\u027f\u0281\u0005 \u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000"+ + "\u0281\u0284\u0001\u0000\u0000\u0000\u0282\u0280\u0001\u0000\u0000\u0000"+ + "\u0282\u0283\u0001\u0000\u0000\u0000\u0283\u0285\u0001\u0000\u0000\u0000"+ + "\u0284\u0282\u0001\u0000\u0000\u0000\u0285\u0289\u0005/\u0000\u0000\u0286"+ + "\u0288\u0005 \u0000\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0288\u028b"+ + "\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0001\u0000\u0000\u0000\u028a\u028c\u0001\u0000\u0000\u0000\u028b\u0289"+ + "\u0001\u0000\u0000\u0000\u028c\u0290\u0007\u0000\u0000\u0000\u028d\u028f"+ + "\u0007\u001c\u0000\u0000\u028e\u028d\u0001\u0000\u0000\u0000\u028f\u0292"+ + "\u0001\u0000\u0000\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0290\u0291"+ + "\u0001\u0000\u0000\u0000\u0291\u0296\u0001\u0000\u0000\u0000\u0292\u0290"+ + "\u0001\u0000\u0000\u0000\u0293\u0295\u0005 \u0000\u0000\u0294\u0293\u0001"+ + "\u0000\u0000\u0000\u0295\u0298\u0001\u0000\u0000\u0000\u0296\u0294\u0001"+ + "\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000\u0000\u0297\u0299\u0001"+ + "\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0299\u02cd\u0005"+ + ">\u0000\u0000\u029a\u029b\u0005<\u0000\u0000\u029b\u029c\u0005/\u0000"+ + "\u0000\u029c\u02a0\u0001\u0000\u0000\u0000\u029d\u029f\u0005 \u0000\u0000"+ + "\u029e\u029d\u0001\u0000\u0000\u0000\u029f\u02a2\u0001\u0000\u0000\u0000"+ + "\u02a0\u029e\u0001\u0000\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000"+ + "\u02a1\u02c2\u0001\u0000\u0000\u0000\u02a2\u02a0\u0001\u0000\u0000\u0000"+ + "\u02a3\u02a4\u0007\u001d\u0000\u0000\u02a4\u02a5\u0005-\u0000\u0000\u02a5"+ + "\u02a6\u0001\u0000\u0000\u0000\u02a6\u02c3\u0003\n\u0002\u0000\u02a7\u02ac"+ + "\u0003\n\u0002\u0000\u02a8\u02a9\u0005:\u0000\u0000\u02a9\u02aa\u0005"+ + ":\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000\u0000\u02ab\u02ad\u0003\n"+ + "\u0002\u0000\u02ac\u02a8\u0001\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000"+ + "\u0000\u0000\u02ae\u02ac\u0001\u0000\u0000\u0000\u02ae\u02af\u0001\u0000"+ + "\u0000\u0000\u02af\u02c3\u0001\u0000\u0000\u0000\u02b0\u02b1\u0007\u0013"+ + "\u0000\u0000\u02b1\u02b2\u0007\f\u0000\u0000\u02b2\u02b3\u0007\u0016\u0000"+ + "\u0000\u02b3\u02b4\u0007\n\u0000\u0000\u02b4\u02b5\u0007\u0014\u0000\u0000"+ + "\u02b5\u02b6\u0007\f\u0000\u0000\u02b6\u02b7\u0007\u0012\u0000\u0000\u02b7"+ + "\u02b8\u0007\n\u0000\u0000\u02b8\u02b9\u0005:\u0000\u0000\u02b9\u02ba"+ + "\u0001\u0000\u0000\u0000\u02ba\u02bf\u0003\n\u0002\u0000\u02bb\u02bc\u0005"+ + "-\u0000\u0000\u02bc\u02be\u0003\n\u0002\u0000\u02bd\u02bb\u0001\u0000"+ + "\u0000\u0000\u02be\u02c1\u0001\u0000\u0000\u0000\u02bf\u02bd\u0001\u0000"+ + "\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c3\u0001\u0000"+ + "\u0000\u0000\u02c1\u02bf\u0001\u0000\u0000\u0000\u02c2\u02a3\u0001\u0000"+ + "\u0000\u0000\u02c2\u02a7\u0001\u0000\u0000\u0000\u02c2\u02b0\u0001\u0000"+ + "\u0000\u0000\u02c3\u02c7\u0001\u0000\u0000\u0000\u02c4\u02c6\u0005 \u0000"+ + "\u0000\u02c5\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c9\u0001\u0000\u0000"+ + "\u0000\u02c7\u02c5\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000"+ + "\u0000\u02c8\u02ca\u0001\u0000\u0000\u0000\u02c9\u02c7\u0001\u0000\u0000"+ + "\u0000\u02ca\u02cb\u0005>\u0000\u0000\u02cb\u02cd\u0001\u0000\u0000\u0000"+ + "\u02cc\u027e\u0001\u0000\u0000\u0000\u02cc\u029a\u0001\u0000\u0000\u0000"+ + "\u02cd3\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005<\u0000\u0000\u02cf\u02d0"+ + "\u0005!\u0000\u0000\u02d0\u02d1\u0005-\u0000\u0000\u02d1\u02d2\u0005-"+ + "\u0000\u0000\u02d2\u02d6\u0001\u0000\u0000\u0000\u02d3\u02d5\t\u0000\u0000"+ + "\u0000\u02d4\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d8\u0001\u0000\u0000"+ + "\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d6\u02d4\u0001\u0000\u0000"+ + "\u0000\u02d7\u02d9\u0001\u0000\u0000\u0000\u02d8\u02d6\u0001\u0000\u0000"+ + "\u0000\u02d9\u02da\u0005-\u0000\u0000\u02da\u02db\u0005-\u0000\u0000\u02db"+ + "\u02dc\u0005>\u0000\u0000\u02dc5\u0001\u0000\u0000\u0000\u02dd\u03fb\u0005"+ + "<\u0000\u0000\u02de\u02df\u0007\u0019\u0000\u0000\u02df\u02e0\u0007\f"+ + "\u0000\u0000\u02e0\u03fc\u0007\u0016\u0000\u0000\u02e1\u02e2\u0007\u000b"+ + "\u0000\u0000\u02e2\u02e3\u0007\n\u0000\u0000\u02e3\u02e4\u0007\u000e\u0000"+ + "\u0000\u02e4\u02e5\u0007\u0007\u0000\u0000\u02e5\u02e6\u0007\f\u0000\u0000"+ + "\u02e6\u02e7\u0007\u0011\u0000\u0000\u02e7\u03fc\u0007\u000f\u0000\u0000"+ + "\u02e8\u02e9\u0007\u0015\u0000\u0000\u02e9\u02ea\u0007\u0005\u0000\u0000"+ + "\u02ea\u02eb\u0007\f\u0000\u0000\u02eb\u03fc\u0007\u000f\u0000\u0000\u02ec"+ + "\u02ed\u0007\u0005\u0000\u0000\u02ed\u02ee\u0007\u0012\u0000\u0000\u02ee"+ + "\u02ef\u0007\u0007\u0000\u0000\u02ef\u02f0\u0007\f\u0000\u0000\u02f0\u02f1"+ + "\u0007\u000e\u0000\u0000\u02f1\u02f2\u0007\u0013\u0000\u0000\u02f2\u03fc"+ + "\u0007\n\u0000\u0000\u02f3\u02f4\u0007\b\u0000\u0000\u02f4\u02f5\u0007"+ + "\u0007\u0000\u0000\u02f5\u02f6\u0007\u0015\u0000\u0000\u02f6\u03fc\u0007"+ + "\u0013\u0000\u0000\u02f7\u02f8\u0007\u0007\u0000\u0000\u02f8\u02f9\u0007"+ + "\f\u0000\u0000\u02f9\u02fa\u0007\u0007\u0000\u0000\u02fa\u02fb\u0007\u0013"+ + "\u0000\u0000\u02fb\u03fc\u0007\n\u0000\u0000\u02fc\u02fd\u0007\b\u0000"+ + "\u0000\u02fd\u02fe\u0007\n\u0000\u0000\u02fe\u02ff\u0007\u0005\u0000\u0000"+ + "\u02ff\u03fc\u0007\u0019\u0000\u0000\u0300\u0301\u0007\u000b\u0000\u0000"+ + "\u0301\u0302\u0007\u0007\u0000\u0000\u0302\u0303\u0007\u0010\u0000\u0000"+ + "\u0303\u0304\u0007\u0013\u0000\u0000\u0304\u03fc\u0007\n\u0000\u0000\u0305"+ + "\u0306\u0007\u000b\u0000\u0000\u0306\u0307\u0007\u000e\u0000\u0000\u0307"+ + "\u0308\u0007\u0012\u0000\u0000\u0308\u0309\u0007\f\u0000\u0000\u0309\u030a"+ + "\u0007\u0018\u0000\u0000\u030a\u03fc\u0007\u0007\u0000\u0000\u030b\u030c"+ + "\u0007\r\u0000\u0000\u030c\u030d\u0007\u0011\u0000\u0000\u030d\u030e\u0007"+ + "\u0011\u0000\u0000\u030e\u030f\u0007\u0007\u0000\u0000\u030f\u0310\u0007"+ + "\n\u0000\u0000\u0310\u03fc\u0007\u0012\u0000\u0000\u0311\u0312\u0007\u0018"+ + "\u0000\u0000\u0312\u0313\u0007\u0012\u0000\u0000\u0313\u03fc\u0007\n\u0000"+ + "\u0000\u0314\u0315\u0007\u000e\u0000\u0000\u0315\u0316\u0007\u0011\u0000"+ + "\u0000\u0316\u0317\u0007\u0019\u0000\u0000\u0317\u03fc\u0007\n\u0000\u0000"+ + "\u0318\u0319\u0007\u0017\u0000\u0000\u0319\u031a\u0007\u0013\u0000\u0000"+ + "\u031a\u031b\u0007\u0011\u0000\u0000\u031b\u031c\u0007\u000e\u0000\u0000"+ + "\u031c\u031d\u0007\u001b\u0000\u0000\u031d\u031e\u0007\u001e\u0000\u0000"+ + "\u031e\u031f\u0007\u0006\u0000\u0000\u031f\u0320\u0007\u0011\u0000\u0000"+ + "\u0320\u0321\u0007\u0007\u0000\u0000\u0321\u03fc\u0007\n\u0000\u0000\u0322"+ + "\u0323\u0007\u0019\u0000\u0000\u0323\u03fc\u0007\u0007\u0000\u0000\u0324"+ + "\u0325\u0007\u0019\u0000\u0000\u0325\u03fc\u0007\u0013\u0000\u0000\u0326"+ + "\u0327\u0007\u0016\u0000\u0000\u0327\u0328\u0007\f\u0000\u0000\u0328\u0329"+ + "\u0007\u0019\u0000\u0000\u0329\u032a\u0007\n\u0000\u0000\u032a\u03fc\u0007"+ + "\u0011\u0000\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c\u032d\u0007"+ + "\n\u0000\u0000\u032d\u032e\u0007\u0015\u0000\u0000\u032e\u032f\u0007\u0018"+ + "\u0000\u0000\u032f\u0330\u0007\u0013\u0000\u0000\u0330\u0331\u0007\u0005"+ + "\u0000\u0000\u0331\u0332\u0007\u0007\u0000\u0000\u0332\u03fc\u0007\n\u0000"+ + "\u0000\u0333\u0334\u0007\u000b\u0000\u0000\u0334\u0335\u0007\u0018\u0000"+ + "\u0000\u0335\u0336\u0007\u0005\u0000\u0000\u0336\u03fc\u0007\u000f\u0000"+ + "\u0000\u0337\u0338\u0007\u000b\u0000\u0000\u0338\u0339\u0007\u0007\u0000"+ + "\u0000\u0339\u033a\u0007\u0012\u0000\u0000\u033a\u033b\u0007\u0011\u0000"+ + "\u0000\u033b\u033c\u0007\u000f\u0000\u0000\u033c\u03fc\u0007\t\u0000\u0000"+ + "\u033d\u033e\u0007\n\u0000\u0000\u033e\u03fc\u0007\u0015\u0000\u0000\u033f"+ + "\u0340\u0007\u000b\u0000\u0000\u0340\u0341\u0007\u0015\u0000\u0000\u0341"+ + "\u0342\u0007\u0005\u0000\u0000\u0342\u0343\u0007\u0013\u0000\u0000\u0343"+ + "\u03fc\u0007\u0013\u0000\u0000\u0344\u0345\u0007\u000b\u0000\u0000\u0345"+ + "\u0346\u0007\u0006\u0000\u0000\u0346\u03fc\u0007\u0017\u0000\u0000\u0347"+ + "\u0348\u0007\u000b\u0000\u0000\u0348\u0349\u0007\u0006\u0000\u0000\u0349"+ + "\u03fc\u0007\u0018\u0000\u0000\u034a\u034b\u0007\r\u0000\u0000\u034b\u034c"+ + "\u0007\f\u0000\u0000\u034c\u034d\u0007\t\u0000\u0000\u034d\u034e\u0007"+ + "\u0006\u0000\u0000\u034e\u034f\u0007\u0012\u0000\u0000\u034f\u03fc\u0007"+ + "\n\u0000\u0000\u0350\u0351\u0007\u000e\u0000\u0000\u0351\u0352\u0007\u0005"+ + "\u0000\u0000\u0352\u0353\u0007\u000f\u0000\u0000\u0353\u0354\u0007\u0016"+ + "\u0000\u0000\u0354\u0355\u0007\u0005\u0000\u0000\u0355\u03fc\u0007\u000b"+ + "\u0000\u0000\u0356\u0357\u0007\u000b\u0000\u0000\u0357\u0358\u0007\u0016"+ + "\u0000\u0000\u0358\u03fc\u0007\t\u0000\u0000\u0359\u035a\u0007\u0006\u0000"+ + "\u0000\u035a\u035b\u0007\u000b\u0000\u0000\u035b\u03fc\u0007\n\u0000\u0000"+ + "\u035c\u035d\u0007\u0018\u0000\u0000\u035d\u035e\u0007\u0005\u0000\u0000"+ + "\u035e\u035f\u0007\u0007\u0000\u0000\u035f\u03fc\u0007\b\u0000\u0000\u0360"+ + "\u0361\u0007\u0018\u0000\u0000\u0361\u0362\u0007\u0011\u0000\u0000\u0362"+ + "\u0363\u0007\u0013\u0000\u0000\u0363\u0364\u0007\u0010\u0000\u0000\u0364"+ + "\u0365\u0007\t\u0000\u0000\u0365\u0366\u0007\u0011\u0000\u0000\u0366\u03fc"+ + "\u0007\u000f\u0000\u0000\u0367\u0368\u0007\u0018\u0000\u0000\u0368\u0369"+ + "\u0007\f\u0000\u0000\u0369\u036a\u0007\u000e\u0000\u0000\u036a\u036b\u0007"+ + "\u0007\u0000\u0000\u036b\u036c\u0007\u0006\u0000\u0000\u036c\u036d\u0007"+ + "\u0012\u0000\u0000\u036d\u03fc\u0007\n\u0000\u0000\u036e\u036f\u0007\b"+ + "\u0000\u0000\u036f\u0370\u0007\n\u0000\u0000\u0370\u0371\u0007\u0005\u0000"+ + "\u0000\u0371\u0372\u0007\u0019\u0000\u0000\u0372\u0373\u0007\n\u0000\u0000"+ + "\u0373\u03fc\u0007\u0012\u0000\u0000\u0374\u0375\u0007\b\u0000\u0000\u0375"+ + "\u03fc\u0007\u001f\u0000\u0000\u0376\u0377\u0007\u000f\u0000\u0000\u0377"+ + "\u0378\u0007\u0005\u0000\u0000\u0378\u03fc\u0007\u0016\u0000\u0000\u0379"+ + "\u037a\u0007\u0019\u0000\u0000\u037a\u037b\u0007\f\u0000\u0000\u037b\u037c"+ + "\u0007\u0005\u0000\u0000\u037c\u037d\u0007\u0013\u0000\u0000\u037d\u037e"+ + "\u0007\u0011\u0000\u0000\u037e\u03fc\u0007\t\u0000\u0000\u037f\u0380\u0007"+ + "\u000b\u0000\u0000\u0380\u0381\u0007\u0006\u0000\u0000\u0381\u0382\u0007"+ + "\u0015\u0000\u0000\u0382\u0383\u0007\u0015\u0000\u0000\u0383\u0384\u0007"+ + "\u0005\u0000\u0000\u0384\u0385\u0007\u0012\u0000\u0000\u0385\u03fc\u0007"+ + "\u0010\u0000\u0000\u0386\u0387\u0007\u0019\u0000\u0000\u0387\u0388\u0007"+ + "\n\u0000\u0000\u0388\u0389\u0007\u0007\u0000\u0000\u0389\u038a\u0007\u0005"+ + "\u0000\u0000\u038a\u038b\u0007\f\u0000\u0000\u038b\u038c\u0007\u0013\u0000"+ + "\u0000\u038c\u03fc\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u000b\u0000"+ + "\u0000\u038e\u038f\u0007\u0013\u0000\u0000\u038f\u0390\u0007\u0011\u0000"+ + "\u0000\u0390\u03fc\u0007\u0007\u0000\u0000\u0391\u0392\u0007\u0013\u0000"+ + "\u0000\u0392\u0393\u0007\u0005\u0000\u0000\u0393\u0394\u0007\u0017\u0000"+ + "\u0000\u0394\u0395\u0007\n\u0000\u0000\u0395\u03fc\u0007\u0013\u0000\u0000"+ + "\u0396\u0397\u0007\u000b\u0000\u0000\u0397\u0398\u0007\n\u0000\u0000\u0398"+ + "\u0399\u0007\u0013\u0000\u0000\u0399\u039a\u0007\n\u0000\u0000\u039a\u039b"+ + "\u0007\u000e\u0000\u0000\u039b\u03fc\u0007\u0007\u0000\u0000\u039c\u039d"+ + "\u0007\u0011\u0000\u0000\u039d\u039e\u0007\u0018\u0000\u0000\u039e\u039f"+ + "\u0007\u0007\u0000\u0000\u039f\u03a0\u0007\t\u0000\u0000\u03a0\u03a1\u0007"+ + "\u0012\u0000\u0000\u03a1\u03a2\u0007\u0011\u0000\u0000\u03a2\u03a3\u0007"+ + "\u0006\u0000\u0000\u03a3\u03fc\u0007\u0018\u0000\u0000\u03a4\u03a5\u0007"+ + "\u0011\u0000\u0000\u03a5\u03a6\u0007\u0018\u0000\u0000\u03a6\u03a7\u0007"+ + "\u0007\u0000\u0000\u03a7\u03a8\u0007\f\u0000\u0000\u03a8\u03a9\u0007\u0011"+ + "\u0000\u0000\u03a9\u03fc\u0007\u000f\u0000\u0000\u03aa\u03ab\u0007\r\u0000"+ + "\u0000\u03ab\u03ac\u0007\f\u0000\u0000\u03ac\u03ad\u0007\n\u0000\u0000"+ + "\u03ad\u03ae\u0007\u0013\u0000\u0000\u03ae\u03af\u0007\u0019\u0000\u0000"+ + "\u03af\u03b0\u0007\u000b\u0000\u0000\u03b0\u03b1\u0007\n\u0000\u0000\u03b1"+ + "\u03fc\u0007\u0007\u0000\u0000\u03b2\u03b3\u0007\u0007\u0000\u0000\u03b3"+ + "\u03b4\u0007\n\u0000\u0000\u03b4\u03b5\u0007\u001d\u0000\u0000\u03b5\u03b6"+ + "\u0007\u0007\u0000\u0000\u03b6\u03b7\u0007\u0005\u0000\u0000\u03b7\u03b8"+ + "\u0007\u0012\u0000\u0000\u03b8\u03b9\u0007\n\u0000\u0000\u03b9\u03fc\u0007"+ + "\u0005\u0000\u0000\u03ba\u03bb\u0007\u0017\u0000\u0000\u03bb\u03bc\u0007"+ + "\u0006\u0000\u0000\u03bc\u03bd\u0007\u0007\u0000\u0000\u03bd\u03be\u0007"+ + "\u0007\u0000\u0000\u03be\u03bf\u0007\u0011\u0000\u0000\u03bf\u03fc\u0007"+ + "\u000f\u0000\u0000\u03c0\u03c1\u0007\r\u0000\u0000\u03c1\u03c2\u0007\u0011"+ + "\u0000\u0000\u03c2\u03c3\u0007\u0012\u0000\u0000\u03c3\u03fc\u0007\u0015"+ + "\u0000\u0000\u03c4\u03c5\u0007\u000b\u0000\u0000\u03c5\u03c6\u0007\n\u0000"+ + "\u0000\u03c6\u03c7\u0007\u0005\u0000\u0000\u03c7\u03c8\u0007\u0012\u0000"+ + "\u0000\u03c8\u03c9\u0007\u000e\u0000\u0000\u03c9\u03fc\u0007\b\u0000\u0000"+ + "\u03ca\u03cb\u0007\u0006\u0000\u0000\u03cb\u03fc\u0007\u0013\u0000\u0000"+ + "\u03cc\u03cd\u0007\u0011\u0000\u0000\u03cd\u03fc\u0007\u0013\u0000\u0000"+ + "\u03ce\u03cf\u0007\u0013\u0000\u0000\u03cf\u03fc\u0007\f\u0000\u0000\u03d0"+ + "\u03d1\u0007\u0007\u0000\u0000\u03d1\u03d2\u0007\u0005\u0000\u0000\u03d2"+ + "\u03d3\u0007\u0017\u0000\u0000\u03d3\u03d4\u0007\u0013\u0000\u0000\u03d4"+ + "\u03fc\u0007\n\u0000\u0000\u03d5\u03d6\u0007\u0007\u0000\u0000\u03d6\u03fc"+ + "\u0007\u0012\u0000\u0000\u03d7\u03d8\u0007\u0007\u0000\u0000\u03d8\u03fc"+ + "\u0007\u0019\u0000\u0000\u03d9\u03da\u0007\u0007\u0000\u0000\u03da\u03fc"+ + "\u0007\b\u0000\u0000\u03db\u03dc\u0007\u0007\u0000\u0000\u03dc\u03dd\u0007"+ + "\u0017\u0000\u0000\u03dd\u03de\u0007\u0011\u0000\u0000\u03de\u03df\u0007"+ + "\u0019\u0000\u0000\u03df\u03fc\u0007\u0010\u0000\u0000\u03e0\u03e1\u0007"+ + "\u0007\u0000\u0000\u03e1\u03e2\u0007\b\u0000\u0000\u03e2\u03e3\u0007\n"+ + "\u0000\u0000\u03e3\u03e4\u0007\u0005\u0000\u0000\u03e4\u03fc\u0007\u0019"+ + "\u0000\u0000\u03e5\u03e6\u0007\u0007\u0000\u0000\u03e6\u03e7\u0007\r\u0000"+ + "\u0000\u03e7\u03e8\u0007\u0011\u0000\u0000\u03e8\u03e9\u0007\u0011\u0000"+ + "\u0000\u03e9\u03fc\u0007\u0007\u0000\u0000\u03ea\u03eb\u0007\u000e\u0000"+ + "\u0000\u03eb\u03ec\u0007\u0005\u0000\u0000\u03ec\u03ed\u0007\u0018\u0000"+ + "\u0000\u03ed\u03ee\u0007\u0007\u0000\u0000\u03ee\u03ef\u0007\f\u0000\u0000"+ + "\u03ef\u03f0\u0007\u0011\u0000\u0000\u03f0\u03fc\u0007\u000f\u0000\u0000"+ + "\u03f1\u03fc\u0001\u0000\u0000\u0000\u03f2\u03f3\u0007\u0007\u0000\u0000"+ + "\u03f3\u03f4\u0007\f\u0000\u0000\u03f4\u03f5\u0007\u0015\u0000\u0000\u03f5"+ + "\u03fc\u0007\n\u0000\u0000\u03f6\u03fc\u0001\u0000\u0000\u0000\u03f7\u03f8"+ + "\u0007\u0016\u0000\u0000\u03f8\u03f9\u0007\u0005\u0000\u0000\u03f9\u03fc"+ + "\u0007\u0012\u0000\u0000\u03fa\u03fc\u0007 \u0000\u0000\u03fb\u02de\u0001"+ + "\u0000\u0000\u0000\u03fb\u02e1\u0001\u0000\u0000\u0000\u03fb\u02e8\u0001"+ + "\u0000\u0000\u0000\u03fb\u02ec\u0001\u0000\u0000\u0000\u03fb\u02f3\u0001"+ + "\u0000\u0000\u0000\u03fb\u02f7\u0001\u0000\u0000\u0000\u03fb\u02fc\u0001"+ + "\u0000\u0000\u0000\u03fb\u0300\u0001\u0000\u0000\u0000\u03fb\u0305\u0001"+ + "\u0000\u0000\u0000\u03fb\u030b\u0001\u0000\u0000\u0000\u03fb\u0311\u0001"+ + "\u0000\u0000\u0000\u03fb\u0314\u0001\u0000\u0000\u0000\u03fb\u0318\u0001"+ + "\u0000\u0000\u0000\u03fb\u0322\u0001\u0000\u0000\u0000\u03fb\u0324\u0001"+ + "\u0000\u0000\u0000\u03fb\u0326\u0001\u0000\u0000\u0000\u03fb\u032b\u0001"+ + "\u0000\u0000\u0000\u03fb\u0333\u0001\u0000\u0000\u0000\u03fb\u0337\u0001"+ + "\u0000\u0000\u0000\u03fb\u033d\u0001\u0000\u0000\u0000\u03fb\u033f\u0001"+ + "\u0000\u0000\u0000\u03fb\u0344\u0001\u0000\u0000\u0000\u03fb\u0347\u0001"+ + "\u0000\u0000\u0000\u03fb\u034a\u0001\u0000\u0000\u0000\u03fb\u0350\u0001"+ + "\u0000\u0000\u0000\u03fb\u0356\u0001\u0000\u0000\u0000\u03fb\u0359\u0001"+ + "\u0000\u0000\u0000\u03fb\u035c\u0001\u0000\u0000\u0000\u03fb\u0360\u0001"+ + "\u0000\u0000\u0000\u03fb\u0367\u0001\u0000\u0000\u0000\u03fb\u036e\u0001"+ + "\u0000\u0000\u0000\u03fb\u0374\u0001\u0000\u0000\u0000\u03fb\u0376\u0001"+ + "\u0000\u0000\u0000\u03fb\u0379\u0001\u0000\u0000\u0000\u03fb\u037f\u0001"+ + "\u0000\u0000\u0000\u03fb\u0386\u0001\u0000\u0000\u0000\u03fb\u038d\u0001"+ + "\u0000\u0000\u0000\u03fb\u0391\u0001\u0000\u0000\u0000\u03fb\u0396\u0001"+ + "\u0000\u0000\u0000\u03fb\u039c\u0001\u0000\u0000\u0000\u03fb\u03a4\u0001"+ + "\u0000\u0000\u0000\u03fb\u03aa\u0001\u0000\u0000\u0000\u03fb\u03b2\u0001"+ + "\u0000\u0000\u0000\u03fb\u03ba\u0001\u0000\u0000\u0000\u03fb\u03c0\u0001"+ + "\u0000\u0000\u0000\u03fb\u03c4\u0001\u0000\u0000\u0000\u03fb\u03ca\u0001"+ + "\u0000\u0000\u0000\u03fb\u03cc\u0001\u0000\u0000\u0000\u03fb\u03ce\u0001"+ + "\u0000\u0000\u0000\u03fb\u03d0\u0001\u0000\u0000\u0000\u03fb\u03d5\u0001"+ + "\u0000\u0000\u0000\u03fb\u03d7\u0001\u0000\u0000\u0000\u03fb\u03d9\u0001"+ + "\u0000\u0000\u0000\u03fb\u03db\u0001\u0000\u0000\u0000\u03fb\u03e0\u0001"+ + "\u0000\u0000\u0000\u03fb\u03e5\u0001\u0000\u0000\u0000\u03fb\u03ea\u0001"+ + "\u0000\u0000\u0000\u03fb\u03f1\u0001\u0000\u0000\u0000\u03fb\u03f2\u0001"+ + "\u0000\u0000\u0000\u03fb\u03f6\u0001\u0000\u0000\u0000\u03fb\u03f7\u0001"+ + "\u0000\u0000\u0000\u03fb\u03fa\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001"+ + "\u0000\u0000\u0000\u03fd\u03fe\u0004\u0018\u0001\u0000\u03fe7\u0001\u0000"+ + "\u0000\u0000\u03ff\u0414\u0005<\u0000\u0000\u0400\u0401\u0007\f\u0000"+ + "\u0000\u0401\u0402\u0007\u0015\u0000\u0000\u0402\u0415\u0007\t\u0000\u0000"+ + "\u0403\u0404\u0007\f\u0000\u0000\u0404\u0405\u0007\u000f\u0000\u0000\u0405"+ + "\u0406\u0007\u0018\u0000\u0000\u0406\u0407\u0007\u0006\u0000\u0000\u0407"+ + "\u0415\u0007\u0007\u0000\u0000\u0408\u0409\u0007\u0017\u0000\u0000\u0409"+ + "\u0415\u0007\u0012\u0000\u0000\u040a\u040b\u0007\b\u0000\u0000\u040b\u0415"+ + "\u0007\u0012\u0000\u0000\u040c\u040d\u0007\u0013\u0000\u0000\u040d\u040e"+ + "\u0007\f\u0000\u0000\u040e\u040f\u0007\u000f\u0000\u0000\u040f\u0415\u0007"+ + "\u001b\u0000\u0000\u0410\u0411\u0007\u0015\u0000\u0000\u0411\u0412\u0007"+ + "\n\u0000\u0000\u0412\u0413\u0007\u0007\u0000\u0000\u0413\u0415\u0007\u0005"+ + "\u0000\u0000\u0414\u0400\u0001\u0000\u0000\u0000\u0414\u0403\u0001\u0000"+ + "\u0000\u0000\u0414\u0408\u0001\u0000\u0000\u0000\u0414\u040a\u0001\u0000"+ + "\u0000\u0000\u0414\u040c\u0001\u0000\u0000\u0000\u0414\u0410\u0001\u0000"+ + "\u0000\u0000\u04159\u0001\u0000\u0000\u0000\u0416\u0417\u0005<\u0000\u0000"+ + "\u0417\u0418\u0007\u001d\u0000\u0000\u0418\u0419\u0005-\u0000\u0000\u0419"+ + "\u041a\u0001\u0000\u0000\u0000\u041a\u0432\u0003\n\u0002\u0000\u041b\u041c"+ + "\u0005<\u0000\u0000\u041c\u0421\u0003\n\u0002\u0000\u041d\u041e\u0005"+ + ":\u0000\u0000\u041e\u041f\u0005:\u0000\u0000\u041f\u0420\u0001\u0000\u0000"+ + "\u0000\u0420\u0422\u0003\n\u0002\u0000\u0421\u041d\u0001\u0000\u0000\u0000"+ + "\u0422\u0423\u0001\u0000\u0000\u0000\u0423\u0421\u0001\u0000\u0000\u0000"+ + "\u0423\u0424\u0001\u0000\u0000\u0000\u0424\u0432\u0001\u0000\u0000\u0000"+ + "\u0425\u0426\u0005<\u0000\u0000\u0426\u0427\u0007\u0013\u0000\u0000\u0427"+ + "\u0428\u0007\f\u0000\u0000\u0428\u0429\u0007\u0016\u0000\u0000\u0429\u042a"+ + "\u0007\n\u0000\u0000\u042a\u042b\u0007\u0014\u0000\u0000\u042b\u042c\u0007"+ + "\f\u0000\u0000\u042c\u042d\u0007\u0012\u0000\u0000\u042d\u042e\u0007\n"+ + "\u0000\u0000\u042e\u042f\u0005:\u0000\u0000\u042f\u0430\u0001\u0000\u0000"+ + "\u0000\u0430\u0432\u0003\n\u0002\u0000\u0431\u0416\u0001\u0000\u0000\u0000"+ + "\u0431\u041b\u0001\u0000\u0000\u0000\u0431\u0425\u0001\u0000\u0000\u0000"+ + "\u0432;\u0001\u0000\u0000\u0000\u0433\u0434\u0005=\u0000\u0000\u0434="+ + "\u0001\u0000\u0000\u0000\u0435\u0436\u0003\b\u0001\u0000\u0436?\u0001"+ + "\u0000\u0000\u0000\u0437\u0438\u0005/\u0000\u0000\u0438\u0439\u0005>\u0000"+ + "\u0000\u0439A\u0001\u0000\u0000\u0000\u043a\u043b\u0005>\u0000\u0000\u043b"+ + "C\u0001\u0000\u0000\u0000\u043c\u043d\u0005@\u0000\u0000\u043d\u043e\u0007"+ + "\u0018\u0000\u0000\u043e\u043f\u0007\b\u0000\u0000\u043f\u0440\u0007\u0018"+ + "\u0000\u0000\u0440\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0004\u001f"+ + "\u0002\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0006\u001f"+ + "\u0006\u0000\u0444E\u0001\u0000\u0000\u0000\u0445\u0446\u0005@\u0000\u0000"+ + "\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006 \u0007\u0000\u0448"+ + "G\u0001\u0000\u0000\u0000\u0449\u044b\u0007!\u0000\u0000\u044a\u0449\u0001"+ + "\u0000\u0000\u0000\u044b\u044c\u0001\u0000\u0000\u0000\u044c\u044a\u0001"+ + "\u0000\u0000\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044dI\u0001\u0000"+ + "\u0000\u0000\u044e\u044f\u0007\"\u0000\u0000\u044fK\u0001\u0000\u0000"+ + "\u0000\u0450\u0451\t\u0000\u0000\u0000\u0451\u0452\u0001\u0000\u0000\u0000"+ + "\u0452\u0453\u0006#\u0007\u0000\u0453M\u0001\u0000\u0000\u0000\u0454\u0455"+ + "\u0005(\u0000\u0000\u0455\u0456\u0006$\b\u0000\u0456O\u0001\u0000\u0000"+ + "\u0000\u0457\u0458\u0005)\u0000\u0000\u0458\u0459\u0006%\t\u0000\u0459"+ + "Q\u0001\u0000\u0000\u0000\u045a\u045b\u0007\"\u0000\u0000\u045b\u045c"+ + "\u0001\u0000\u0000\u0000\u045c\u045d\u0006&\n\u0000\u045dS\u0001\u0000"+ + "\u0000\u0000\u045e\u045f\t\u0000\u0000\u0000\u045f\u0460\u0001\u0000\u0000"+ + "\u0000\u0460\u0461\u0006\'\u0007\u0000\u0461U\u0001\u0000\u0000\u0000"+ + "\u0462\u0463\u0005\u0000\u0000\u0001\u0463\u0464\u0001\u0000\u0000\u0000"+ + "\u0464\u0465\u0006(\u000b\u0000\u0465W\u0001\u0000\u0000\u0000\u0466\u0467"+ + "\u0005(\u0000\u0000\u0467\u0468\u0006)\f\u0000\u0468Y\u0001\u0000\u0000"+ + "\u0000\u0469\u046a\u0005)\u0000\u0000\u046a\u046b\u0006*\r\u0000\u046b"+ + "[\u0001\u0000\u0000\u0000\u046c\u046d\u0005[\u0000\u0000\u046d\u046e\u0006"+ + "+\u000e\u0000\u046e\u046f\u0001\u0000\u0000\u0000\u046f\u0470\u0006+\u0007"+ + "\u0000\u0470]\u0001\u0000\u0000\u0000\u0471\u0472\u0005]\u0000\u0000\u0472"+ + "\u0473\u0006,\u000f\u0000\u0473\u0474\u0001\u0000\u0000\u0000\u0474\u0475"+ + "\u0006,\u0007\u0000\u0475_\u0001\u0000\u0000\u0000\u0476\u0477\u0005{"+ + "\u0000\u0000\u0477\u0478\u0006-\u0010\u0000\u0478\u0479\u0001\u0000\u0000"+ + "\u0000\u0479\u047a\u0006-\u0007\u0000\u047aa\u0001\u0000\u0000\u0000\u047b"+ + "\u047c\u0005}\u0000\u0000\u047c\u047d\u0006.\u0011\u0000\u047d\u047e\u0001"+ + "\u0000\u0000\u0000\u047e\u047f\u0006.\u0007\u0000\u047fc\u0001\u0000\u0000"+ + "\u0000\u0480\u0481\u0005,\u0000\u0000\u0481\u0482\u0006/\u0012\u0000\u0482"+ + "e\u0001\u0000\u0000\u0000\u0483\u0484\u0007\"\u0000\u0000\u0484\u0485"+ + "\u0001\u0000\u0000\u0000\u0485\u0486\u00060\n\u0000\u0486g\u0001\u0000"+ + "\u0000\u0000\u0487\u0488\t\u0000\u0000\u0000\u0488\u0489\u0001\u0000\u0000"+ + "\u0000\u0489\u048a\u00061\u0007\u0000\u048ai\u0001\u0000\u0000\u0000\u048b"+ + "\u048c\u0005\u0000\u0000\u0001\u048c\u048d\u0001\u0000\u0000\u0000\u048d"+ + "\u048e\u00062\u000b\u0000\u048ek\u0001\u0000\u0000\u0000\u048f\u0490\u0005"+ + "@\u0000\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u000f"+ + "\u0000\u0000\u0492\u0493\u0007\u0019\u0000\u0000\u0493\u0494\u0007\u0018"+ + "\u0000\u0000\u0494\u0495\u0007\b\u0000\u0000\u0495\u0496\u0007\u0018\u0000"+ + "\u0000\u0496\u0497\u0001\u0000\u0000\u0000\u0497\u0498\u00063\u000b\u0000"+ + "\u0498m\u0001\u0000\u0000\u0000\u0499\u049b\b#\u0000\u0000\u049a\u0499"+ + "\u0001\u0000\u0000\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049a"+ + "\u0001\u0000\u0000\u0000\u049c\u049d\u0001\u0000\u0000\u0000\u049d\u049e"+ + "\u0001\u0000\u0000\u0000\u049e\u049f\u00064\u0013\u0000\u049fo\u0001\u0000"+ + "\u0000\u0000\u04a0\u04a1\t\u0000\u0000\u0000\u04a1\u04a2\u0001\u0000\u0000"+ + "\u0000\u04a2\u04a3\u00065\u0013\u0000\u04a3q\u0001\u0000\u0000\u0000\u04a4"+ + "\u04a5\u0005}\u0000\u0000\u04a5\u04a6\u0005}\u0000\u0000\u04a6\u04a7\u0001"+ + "\u0000\u0000\u0000\u04a7\u04a8\u00066\u000b\u0000\u04a8s\u0001\u0000\u0000"+ + "\u0000\u04a9\u04aa\t\u0000\u0000\u0000\u04aa\u04ab\u0001\u0000\u0000\u0000"+ + "\u04ab\u04ac\u00067\u0007\u0000\u04acu\u0001\u0000\u0000\u0000\u04ad\u04ae"+ + "\u0005\u0000\u0000\u0001\u04ae\u04af\u0001\u0000\u0000\u0000\u04af\u04b0"+ + "\u00068\u000b\u0000\u04b0w\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005!"+ + "\u0000\u0000\u04b2\u04b3\u0005!\u0000\u0000\u04b3\u04b4\u0005}\u0000\u0000"+ + "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6\u00069\u000b\u0000\u04b6"+ + "y\u0001\u0000\u0000\u0000\u04b7\u04b8\t\u0000\u0000\u0000\u04b8\u04b9"+ + "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006:\u0007\u0000\u04ba{\u0001\u0000"+ + "\u0000\u0000\u04bb\u04bc\u0005\u0000\u0000\u0001\u04bc\u04bd\u0001\u0000"+ + "\u0000\u0000\u04bd\u04be\u0006;\u000b\u0000\u04be}\u0001\u0000\u0000\u0000"+ + "2\u0000\u0001\u0002\u0003\u0004\u0005\u0082\u0089\u0090\u0096\u009e\u00a0"+ + "\u00a9\u00ab\u00c5\u00d3\u0130\u013f\u0148\u0156\u015b\u0164\u016a\u0176"+ + "\u01e4\u01fd\u020e\u0239\u024d\u025e\u0269\u026d\u0282\u0289\u0290\u0296"+ + "\u02a0\u02ae\u02bf\u02c2\u02c7\u02cc\u02d6\u03fb\u0414\u0423\u0431\u044a"+ + "\u044c\u049c\u0014\u0007\u0001\u0000\u0005\u0001\u0000\u0007\u0005\u0000"+ + "\u0005\u0002\u0000\u0005\u0004\u0000\u0005\u0005\u0000\u0005\u0003\u0000"+ + "\u0006\u0000\u0000\u0001$\u0000\u0001%\u0001\u0007\u001d\u0000\u0004\u0000"+ + "\u0000\u0001)\u0002\u0001*\u0003\u0001+\u0004\u0001,\u0005\u0001-\u0006"+ + "\u0001.\u0007\u0001/\b\u0007\u0002\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 new file mode 100644 index 000000000000..7de7b9840ded --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 @@ -0,0 +1,72 @@ +parser grammar BladeAntlrFormatterParser; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; +} + +options { tokenVocab = BladeAntlrFormatterLexer; } + +file : statement* EOF; + +statement: + html_indent + | block_start + | block_end + | html_tag + | self_closed_tag + | section_block + | inline_identable_element + | block_aligned_directive + | static_element + | nl_with_space_before + | blade_echo + | block_end + | html_close_tag + | (SG_QUOTE | DB_QUOTE) + | INLINE_GT_SYMBOL + | GT_SYMBOL + | (NL | WS) + ; + +inline_tag_statement : + IDENTIFIER EQ IDENTIFIER + | block_start + | block_end + | blade_echo + | D_INLINE_DIRECTIVE + | NON_PARAM_DIRECTIVE + | D_BLOCK_ALIGNED_DIRECTIVE + | IDENTIFIER EQ STRING + | IDENTIFIER + | STRING + | EQ + | WS + | NL + ; + +html_close_tag : HTML_CLOSE_TAG; + +html_indent : (HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* GT_SYMBOL NL WS*; +html_tag : (HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* GT_SYMBOL; +self_closed_tag : HTML_SELF_CLOSE_TAG | ((HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* INLINE_GT_SYMBOL); +block_start : ws_before=nl_with_space_before? block_directive_name D_ARG_LPAREN D_ARG_RPAREN; +block_directive_name : D_BLOCK_DIRECTIVE_START; +block_end : D_BLOCK_DIRECTIVE_END; +block_aligned_directive : D_BLOCK_ALIGNED_DIRECTIVE; +inline_identable_element : D_INLINE_DIRECTIVE | NON_PARAM_DIRECTIVE | section_inline + | blade_echo | D_PHP PHP_CODE+ D_ENDPHP + ; + +section_inline : D_SECTION D_ARG_LPAREN PARAM_COMMA D_ARG_RPAREN; +section_block : section_block_start (statement)+ section_block_end; +section_block_end : D_ENDSECTION; +section_block_start : D_SECTION D_ARG_LPAREN D_ARG_RPAREN; +nl_with_space_before : NL WS*; +nl_with_space : NL WS*; + +static_element : HTML_COMMENT + | HTML + | OTHER; + +blade_echo : (CONTENT_TAG_OPEN CONTENT_TAG_CLOSE) + | (RAW_TAG_OPEN RAW_TAG_CLOSE); \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java new file mode 100644 index 000000000000..1d08041f2826 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java @@ -0,0 +1,1683 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrFormatterParser extends Parser { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, PHP_CODE=2, PARAM_COMMA=3, PHP_INLINE=4, D_BLOCK_DIRECTIVE_START=5, + D_BLOCK_DIRECTIVE_END=6, D_SECTION=7, D_ENDSECTION=8, D_BLOCK_ALIGNED_DIRECTIVE=9, + NON_PARAM_DIRECTIVE=10, D_INLINE_DIRECTIVE=11, STRING=12, CONTENT_TAG_OPEN=13, + RAW_TAG_OPEN=14, SG_QUOTE=15, DB_QUOTE=16, HTML_CLOSE_TAG=17, HTML_COMMENT=18, + HTML_START_BLOCK_TAG=19, HTML_SELF_CLOSE_TAG=20, COMPONENT_TAG=21, EQ=22, + IDENTIFIER=23, INLINE_GT_SYMBOL=24, GT_SYMBOL=25, D_PHP=26, AT=27, WS=28, + NL=29, OTHER=30, D_ARG_LPAREN=31, D_ARG_RPAREN=32, PHP_EXPR=33, EXIT_EOF=34, + D_ARG_PARAM_LPAREN=35, D_ARG_PARAM_RPAREN=36, BL_SQ_LPAREN=37, BL_SQ_RPAREN=38, + BL_CURLY_LPAREN=39, BL_CURLY_RPAREN=40, D_ARG_COMMA_EL=41, BL_PHP_EXPR=42, + BL_EXIT_EOF=43, D_ENDPHP=44, CONTENT_TAG_CLOSE=45, CONTENT_OTHER=46, EXIT_REGULAR_ECHO_EOF=47, + RAW_TAG_CLOSE=48, RAW_CONTENT_OTHER=49, EXIT_RAW_ECHO_EOF=50; + public static final int + RULE_file = 0, RULE_statement = 1, RULE_inline_tag_statement = 2, RULE_html_close_tag = 3, + RULE_html_indent = 4, RULE_html_tag = 5, RULE_self_closed_tag = 6, RULE_block_start = 7, + RULE_block_directive_name = 8, RULE_block_end = 9, RULE_block_aligned_directive = 10, + RULE_inline_identable_element = 11, RULE_section_inline = 12, RULE_section_block = 13, + RULE_section_block_end = 14, RULE_section_block_start = 15, RULE_nl_with_space_before = 16, + RULE_nl_with_space = 17, RULE_static_element = 18, RULE_blade_echo = 19; + private static String[] makeRuleNames() { + return new String[] { + "file", "statement", "inline_tag_statement", "html_close_tag", "html_indent", + "html_tag", "self_closed_tag", "block_start", "block_directive_name", + "block_end", "block_aligned_directive", "inline_identable_element", "section_inline", + "section_block", "section_block_end", "section_block_start", "nl_with_space_before", + "nl_with_space", "static_element", "blade_echo" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'{{'", "'{!!'", "'''", "'\"'", null, null, null, null, null, "'='", + null, "'/>'", "'>'", null, "'@'", null, null, null, null, null, null, + null, null, null, null, null, null, null, "','", null, null, "'@endphp'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "PHP_CODE", "PARAM_COMMA", "PHP_INLINE", "D_BLOCK_DIRECTIVE_START", + "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", + "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", + "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", + "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", + "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "PHP_EXPR", "EXIT_EOF", "D_ARG_PARAM_LPAREN", + "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", "BL_CURLY_LPAREN", + "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", + "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "java-escape"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public BladeAntlrFormatterParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class FileContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(BladeAntlrFormatterParser.EOF, 0); } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public FileContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_file; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterFile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitFile(this); + } + } + + public final FileContext file() throws RecognitionException { + FileContext _localctx = new FileContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_file); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(43); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0) { + { + { + setState(40); + statement(); + } + } + setState(45); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(46); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StatementContext extends ParserRuleContext { + public Html_indentContext html_indent() { + return getRuleContext(Html_indentContext.class,0); + } + public Block_startContext block_start() { + return getRuleContext(Block_startContext.class,0); + } + public Block_endContext block_end() { + return getRuleContext(Block_endContext.class,0); + } + public Html_tagContext html_tag() { + return getRuleContext(Html_tagContext.class,0); + } + public Self_closed_tagContext self_closed_tag() { + return getRuleContext(Self_closed_tagContext.class,0); + } + public Section_blockContext section_block() { + return getRuleContext(Section_blockContext.class,0); + } + public Inline_identable_elementContext inline_identable_element() { + return getRuleContext(Inline_identable_elementContext.class,0); + } + public Block_aligned_directiveContext block_aligned_directive() { + return getRuleContext(Block_aligned_directiveContext.class,0); + } + public Static_elementContext static_element() { + return getRuleContext(Static_elementContext.class,0); + } + public Nl_with_space_beforeContext nl_with_space_before() { + return getRuleContext(Nl_with_space_beforeContext.class,0); + } + public Blade_echoContext blade_echo() { + return getRuleContext(Blade_echoContext.class,0); + } + public Html_close_tagContext html_close_tag() { + return getRuleContext(Html_close_tagContext.class,0); + } + public TerminalNode SG_QUOTE() { return getToken(BladeAntlrFormatterParser.SG_QUOTE, 0); } + public TerminalNode DB_QUOTE() { return getToken(BladeAntlrFormatterParser.DB_QUOTE, 0); } + public TerminalNode INLINE_GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.INLINE_GT_SYMBOL, 0); } + public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public TerminalNode WS() { return getToken(BladeAntlrFormatterParser.WS, 0); } + public StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitStatement(this); + } + } + + public final StatementContext statement() throws RecognitionException { + StatementContext _localctx = new StatementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_statement); + int _la; + try { + setState(65); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(48); + html_indent(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(49); + block_start(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(50); + block_end(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(51); + html_tag(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(52); + self_closed_tag(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(53); + section_block(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(54); + inline_identable_element(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(55); + block_aligned_directive(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(56); + static_element(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(57); + nl_with_space_before(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(58); + blade_echo(); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(59); + block_end(); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(60); + html_close_tag(); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(61); + _la = _input.LA(1); + if ( !(_la==SG_QUOTE || _la==DB_QUOTE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(62); + match(INLINE_GT_SYMBOL); + } + break; + case 16: + enterOuterAlt(_localctx, 16); + { + setState(63); + match(GT_SYMBOL); + } + break; + case 17: + enterOuterAlt(_localctx, 17); + { + setState(64); + _la = _input.LA(1); + if ( !(_la==WS || _la==NL) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_tag_statementContext extends ParserRuleContext { + public List IDENTIFIER() { return getTokens(BladeAntlrFormatterParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladeAntlrFormatterParser.IDENTIFIER, i); + } + public TerminalNode EQ() { return getToken(BladeAntlrFormatterParser.EQ, 0); } + public Block_startContext block_start() { + return getRuleContext(Block_startContext.class,0); + } + public Block_endContext block_end() { + return getRuleContext(Block_endContext.class,0); + } + public Blade_echoContext blade_echo() { + return getRuleContext(Blade_echoContext.class,0); + } + public TerminalNode D_INLINE_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_INLINE_DIRECTIVE, 0); } + public TerminalNode NON_PARAM_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.NON_PARAM_DIRECTIVE, 0); } + public TerminalNode D_BLOCK_ALIGNED_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_BLOCK_ALIGNED_DIRECTIVE, 0); } + public TerminalNode STRING() { return getToken(BladeAntlrFormatterParser.STRING, 0); } + public TerminalNode WS() { return getToken(BladeAntlrFormatterParser.WS, 0); } + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public Inline_tag_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_tag_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterInline_tag_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitInline_tag_statement(this); + } + } + + public final Inline_tag_statementContext inline_tag_statement() throws RecognitionException { + Inline_tag_statementContext _localctx = new Inline_tag_statementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_inline_tag_statement); + try { + setState(84); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(67); + match(IDENTIFIER); + setState(68); + match(EQ); + setState(69); + match(IDENTIFIER); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(70); + block_start(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(71); + block_end(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(72); + blade_echo(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(73); + match(D_INLINE_DIRECTIVE); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(74); + match(NON_PARAM_DIRECTIVE); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(75); + match(D_BLOCK_ALIGNED_DIRECTIVE); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(76); + match(IDENTIFIER); + setState(77); + match(EQ); + setState(78); + match(STRING); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(79); + match(IDENTIFIER); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(80); + match(STRING); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(81); + match(EQ); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(82); + match(WS); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(83); + match(NL); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Html_close_tagContext extends ParserRuleContext { + public TerminalNode HTML_CLOSE_TAG() { return getToken(BladeAntlrFormatterParser.HTML_CLOSE_TAG, 0); } + public Html_close_tagContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html_close_tag; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_close_tag(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_close_tag(this); + } + } + + public final Html_close_tagContext html_close_tag() throws RecognitionException { + Html_close_tagContext _localctx = new Html_close_tagContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_html_close_tag); + try { + enterOuterAlt(_localctx, 1); + { + setState(86); + match(HTML_CLOSE_TAG); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Html_indentContext extends ParserRuleContext { + public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } + public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } + public List inline_tag_statement() { + return getRuleContexts(Inline_tag_statementContext.class); + } + public Inline_tag_statementContext inline_tag_statement(int i) { + return getRuleContext(Inline_tag_statementContext.class,i); + } + public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } + public TerminalNode WS(int i) { + return getToken(BladeAntlrFormatterParser.WS, i); + } + public Html_indentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html_indent; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_indent(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_indent(this); + } + } + + public final Html_indentContext html_indent() throws RecognitionException { + Html_indentContext _localctx = new Html_indentContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_html_indent); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(88); + _la = _input.LA(1); + if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(92); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + { + { + setState(89); + inline_tag_statement(); + } + } + setState(94); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(95); + match(GT_SYMBOL); + setState(96); + match(NL); + setState(100); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,4,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(97); + match(WS); + } + } + } + setState(102); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,4,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Html_tagContext extends ParserRuleContext { + public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } + public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } + public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } + public List inline_tag_statement() { + return getRuleContexts(Inline_tag_statementContext.class); + } + public Inline_tag_statementContext inline_tag_statement(int i) { + return getRuleContext(Inline_tag_statementContext.class,i); + } + public Html_tagContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html_tag; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_tag(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_tag(this); + } + } + + public final Html_tagContext html_tag() throws RecognitionException { + Html_tagContext _localctx = new Html_tagContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_html_tag); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(103); + _la = _input.LA(1); + if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(107); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + { + { + setState(104); + inline_tag_statement(); + } + } + setState(109); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(110); + match(GT_SYMBOL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Self_closed_tagContext extends ParserRuleContext { + public TerminalNode HTML_SELF_CLOSE_TAG() { return getToken(BladeAntlrFormatterParser.HTML_SELF_CLOSE_TAG, 0); } + public TerminalNode INLINE_GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.INLINE_GT_SYMBOL, 0); } + public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } + public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } + public List inline_tag_statement() { + return getRuleContexts(Inline_tag_statementContext.class); + } + public Inline_tag_statementContext inline_tag_statement(int i) { + return getRuleContext(Inline_tag_statementContext.class,i); + } + public Self_closed_tagContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_self_closed_tag; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSelf_closed_tag(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSelf_closed_tag(this); + } + } + + public final Self_closed_tagContext self_closed_tag() throws RecognitionException { + Self_closed_tagContext _localctx = new Self_closed_tagContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_self_closed_tag); + int _la; + try { + setState(121); + _errHandler.sync(this); + switch (_input.LA(1)) { + case HTML_SELF_CLOSE_TAG: + enterOuterAlt(_localctx, 1); + { + setState(112); + match(HTML_SELF_CLOSE_TAG); + } + break; + case HTML_START_BLOCK_TAG: + case COMPONENT_TAG: + enterOuterAlt(_localctx, 2); + { + { + setState(113); + _la = _input.LA(1); + if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(117); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + { + { + setState(114); + inline_tag_statement(); + } + } + setState(119); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(120); + match(INLINE_GT_SYMBOL); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_startContext extends ParserRuleContext { + public Nl_with_space_beforeContext ws_before; + public Block_directive_nameContext block_directive_name() { + return getRuleContext(Block_directive_nameContext.class,0); + } + public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } + public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } + public Nl_with_space_beforeContext nl_with_space_before() { + return getRuleContext(Nl_with_space_beforeContext.class,0); + } + public Block_startContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_start; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_start(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_start(this); + } + } + + public final Block_startContext block_start() throws RecognitionException { + Block_startContext _localctx = new Block_startContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_block_start); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(124); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NL) { + { + setState(123); + ((Block_startContext)_localctx).ws_before = nl_with_space_before(); + } + } + + setState(126); + block_directive_name(); + setState(127); + match(D_ARG_LPAREN); + setState(128); + match(D_ARG_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_directive_nameContext extends ParserRuleContext { + public TerminalNode D_BLOCK_DIRECTIVE_START() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_START, 0); } + public Block_directive_nameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_directive_name; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_directive_name(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_directive_name(this); + } + } + + public final Block_directive_nameContext block_directive_name() throws RecognitionException { + Block_directive_nameContext _localctx = new Block_directive_nameContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_block_directive_name); + try { + enterOuterAlt(_localctx, 1); + { + setState(130); + match(D_BLOCK_DIRECTIVE_START); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_endContext extends ParserRuleContext { + public TerminalNode D_BLOCK_DIRECTIVE_END() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_END, 0); } + public Block_endContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_end; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_end(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_end(this); + } + } + + public final Block_endContext block_end() throws RecognitionException { + Block_endContext _localctx = new Block_endContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_block_end); + try { + enterOuterAlt(_localctx, 1); + { + setState(132); + match(D_BLOCK_DIRECTIVE_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_aligned_directiveContext extends ParserRuleContext { + public TerminalNode D_BLOCK_ALIGNED_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_BLOCK_ALIGNED_DIRECTIVE, 0); } + public Block_aligned_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_aligned_directive; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_aligned_directive(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_aligned_directive(this); + } + } + + public final Block_aligned_directiveContext block_aligned_directive() throws RecognitionException { + Block_aligned_directiveContext _localctx = new Block_aligned_directiveContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_block_aligned_directive); + try { + enterOuterAlt(_localctx, 1); + { + setState(134); + match(D_BLOCK_ALIGNED_DIRECTIVE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_identable_elementContext extends ParserRuleContext { + public TerminalNode D_INLINE_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_INLINE_DIRECTIVE, 0); } + public TerminalNode NON_PARAM_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.NON_PARAM_DIRECTIVE, 0); } + public Section_inlineContext section_inline() { + return getRuleContext(Section_inlineContext.class,0); + } + public Blade_echoContext blade_echo() { + return getRuleContext(Blade_echoContext.class,0); + } + public TerminalNode D_PHP() { return getToken(BladeAntlrFormatterParser.D_PHP, 0); } + public TerminalNode D_ENDPHP() { return getToken(BladeAntlrFormatterParser.D_ENDPHP, 0); } + public List PHP_CODE() { return getTokens(BladeAntlrFormatterParser.PHP_CODE); } + public TerminalNode PHP_CODE(int i) { + return getToken(BladeAntlrFormatterParser.PHP_CODE, i); + } + public Inline_identable_elementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_identable_element; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterInline_identable_element(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitInline_identable_element(this); + } + } + + public final Inline_identable_elementContext inline_identable_element() throws RecognitionException { + Inline_identable_elementContext _localctx = new Inline_identable_elementContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_inline_identable_element); + int _la; + try { + setState(147); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_INLINE_DIRECTIVE: + enterOuterAlt(_localctx, 1); + { + setState(136); + match(D_INLINE_DIRECTIVE); + } + break; + case NON_PARAM_DIRECTIVE: + enterOuterAlt(_localctx, 2); + { + setState(137); + match(NON_PARAM_DIRECTIVE); + } + break; + case D_SECTION: + enterOuterAlt(_localctx, 3); + { + setState(138); + section_inline(); + } + break; + case CONTENT_TAG_OPEN: + case RAW_TAG_OPEN: + enterOuterAlt(_localctx, 4); + { + setState(139); + blade_echo(); + } + break; + case D_PHP: + enterOuterAlt(_localctx, 5); + { + setState(140); + match(D_PHP); + setState(142); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(141); + match(PHP_CODE); + } + } + setState(144); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==PHP_CODE ); + setState(146); + match(D_ENDPHP); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_inlineContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } + public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } + public TerminalNode PARAM_COMMA() { return getToken(BladeAntlrFormatterParser.PARAM_COMMA, 0); } + public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } + public Section_inlineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_inline; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_inline(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_inline(this); + } + } + + public final Section_inlineContext section_inline() throws RecognitionException { + Section_inlineContext _localctx = new Section_inlineContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_section_inline); + try { + enterOuterAlt(_localctx, 1); + { + setState(149); + match(D_SECTION); + setState(150); + match(D_ARG_LPAREN); + setState(151); + match(PARAM_COMMA); + setState(152); + match(D_ARG_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_blockContext extends ParserRuleContext { + public Section_block_startContext section_block_start() { + return getRuleContext(Section_block_startContext.class,0); + } + public Section_block_endContext section_block_end() { + return getRuleContext(Section_block_endContext.class,0); + } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public Section_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block(this); + } + } + + public final Section_blockContext section_block() throws RecognitionException { + Section_blockContext _localctx = new Section_blockContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_section_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(154); + section_block_start(); + setState(156); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(155); + statement(); + } + } + setState(158); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0 ); + setState(160); + section_block_end(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_block_endContext extends ParserRuleContext { + public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrFormatterParser.D_ENDSECTION, 0); } + public Section_block_endContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_block_end; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block_end(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block_end(this); + } + } + + public final Section_block_endContext section_block_end() throws RecognitionException { + Section_block_endContext _localctx = new Section_block_endContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_section_block_end); + try { + enterOuterAlt(_localctx, 1); + { + setState(162); + match(D_ENDSECTION); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_block_startContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } + public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } + public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } + public Section_block_startContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_block_start; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block_start(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block_start(this); + } + } + + public final Section_block_startContext section_block_start() throws RecognitionException { + Section_block_startContext _localctx = new Section_block_startContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_section_block_start); + try { + enterOuterAlt(_localctx, 1); + { + setState(164); + match(D_SECTION); + setState(165); + match(D_ARG_LPAREN); + setState(166); + match(D_ARG_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Nl_with_space_beforeContext extends ParserRuleContext { + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } + public TerminalNode WS(int i) { + return getToken(BladeAntlrFormatterParser.WS, i); + } + public Nl_with_space_beforeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nl_with_space_before; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space_before(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space_before(this); + } + } + + public final Nl_with_space_beforeContext nl_with_space_before() throws RecognitionException { + Nl_with_space_beforeContext _localctx = new Nl_with_space_beforeContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_nl_with_space_before); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(168); + match(NL); + setState(172); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(169); + match(WS); + } + } + } + setState(174); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Nl_with_spaceContext extends ParserRuleContext { + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } + public TerminalNode WS(int i) { + return getToken(BladeAntlrFormatterParser.WS, i); + } + public Nl_with_spaceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nl_with_space; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space(this); + } + } + + public final Nl_with_spaceContext nl_with_space() throws RecognitionException { + Nl_with_spaceContext _localctx = new Nl_with_spaceContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_nl_with_space); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(175); + match(NL); + setState(179); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==WS) { + { + { + setState(176); + match(WS); + } + } + setState(181); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Static_elementContext extends ParserRuleContext { + public TerminalNode HTML_COMMENT() { return getToken(BladeAntlrFormatterParser.HTML_COMMENT, 0); } + public TerminalNode HTML() { return getToken(BladeAntlrFormatterParser.HTML, 0); } + public TerminalNode OTHER() { return getToken(BladeAntlrFormatterParser.OTHER, 0); } + public Static_elementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_static_element; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterStatic_element(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitStatic_element(this); + } + } + + public final Static_elementContext static_element() throws RecognitionException { + Static_elementContext _localctx = new Static_elementContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_static_element); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(182); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 1074003970L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Blade_echoContext extends ParserRuleContext { + public TerminalNode CONTENT_TAG_OPEN() { return getToken(BladeAntlrFormatterParser.CONTENT_TAG_OPEN, 0); } + public TerminalNode CONTENT_TAG_CLOSE() { return getToken(BladeAntlrFormatterParser.CONTENT_TAG_CLOSE, 0); } + public TerminalNode RAW_TAG_OPEN() { return getToken(BladeAntlrFormatterParser.RAW_TAG_OPEN, 0); } + public TerminalNode RAW_TAG_CLOSE() { return getToken(BladeAntlrFormatterParser.RAW_TAG_CLOSE, 0); } + public Blade_echoContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_blade_echo; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlade_echo(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlade_echo(this); + } + } + + public final Blade_echoContext blade_echo() throws RecognitionException { + Blade_echoContext _localctx = new Blade_echoContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_blade_echo); + try { + setState(188); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CONTENT_TAG_OPEN: + enterOuterAlt(_localctx, 1); + { + { + setState(184); + match(CONTENT_TAG_OPEN); + setState(185); + match(CONTENT_TAG_CLOSE); + } + } + break; + case RAW_TAG_OPEN: + enterOuterAlt(_localctx, 2); + { + { + setState(186); + match(RAW_TAG_OPEN); + setState(187); + match(RAW_TAG_CLOSE); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u00012\u00bf\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0001\u0000\u0005\u0000*\b\u0000\n\u0000\f\u0000"+ + "-\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0003\u0001B\b\u0001\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002U\b\u0002\u0001\u0003"+ + "\u0001\u0003\u0001\u0004\u0001\u0004\u0005\u0004[\b\u0004\n\u0004\f\u0004"+ + "^\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004c\b\u0004\n\u0004"+ + "\f\u0004f\t\u0004\u0001\u0005\u0001\u0005\u0005\u0005j\b\u0005\n\u0005"+ + "\f\u0005m\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0005\u0006t\b\u0006\n\u0006\f\u0006w\t\u0006\u0001\u0006\u0003"+ + "\u0006z\b\u0006\u0001\u0007\u0003\u0007}\b\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0004\u000b\u008f\b\u000b\u000b\u000b\f\u000b\u0090\u0001\u000b\u0003"+ + "\u000b\u0094\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0004\r\u009d\b\r\u000b\r\f\r\u009e\u0001\r\u0001\r\u0001\u000e\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001"+ + "\u0010\u0005\u0010\u00ab\b\u0010\n\u0010\f\u0010\u00ae\t\u0010\u0001\u0011"+ + "\u0001\u0011\u0005\u0011\u00b2\b\u0011\n\u0011\f\u0011\u00b5\t\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003"+ + "\u0013\u00bd\b\u0013\u0001\u0013\u0000\u0000\u0014\u0000\u0002\u0004\u0006"+ + "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&\u0000"+ + "\u0004\u0001\u0000\u000f\u0010\u0001\u0000\u001c\u001d\u0002\u0000\u0013"+ + "\u0013\u0015\u0015\u0003\u0000\u0001\u0001\u0012\u0012\u001e\u001e\u00d6"+ + "\u0000+\u0001\u0000\u0000\u0000\u0002A\u0001\u0000\u0000\u0000\u0004T"+ + "\u0001\u0000\u0000\u0000\u0006V\u0001\u0000\u0000\u0000\bX\u0001\u0000"+ + "\u0000\u0000\ng\u0001\u0000\u0000\u0000\fy\u0001\u0000\u0000\u0000\u000e"+ + "|\u0001\u0000\u0000\u0000\u0010\u0082\u0001\u0000\u0000\u0000\u0012\u0084"+ + "\u0001\u0000\u0000\u0000\u0014\u0086\u0001\u0000\u0000\u0000\u0016\u0093"+ + "\u0001\u0000\u0000\u0000\u0018\u0095\u0001\u0000\u0000\u0000\u001a\u009a"+ + "\u0001\u0000\u0000\u0000\u001c\u00a2\u0001\u0000\u0000\u0000\u001e\u00a4"+ + "\u0001\u0000\u0000\u0000 \u00a8\u0001\u0000\u0000\u0000\"\u00af\u0001"+ + "\u0000\u0000\u0000$\u00b6\u0001\u0000\u0000\u0000&\u00bc\u0001\u0000\u0000"+ + "\u0000(*\u0003\u0002\u0001\u0000)(\u0001\u0000\u0000\u0000*-\u0001\u0000"+ + "\u0000\u0000+)\u0001\u0000\u0000\u0000+,\u0001\u0000\u0000\u0000,.\u0001"+ + "\u0000\u0000\u0000-+\u0001\u0000\u0000\u0000./\u0005\u0000\u0000\u0001"+ + "/\u0001\u0001\u0000\u0000\u00000B\u0003\b\u0004\u00001B\u0003\u000e\u0007"+ + "\u00002B\u0003\u0012\t\u00003B\u0003\n\u0005\u00004B\u0003\f\u0006\u0000"+ + "5B\u0003\u001a\r\u00006B\u0003\u0016\u000b\u00007B\u0003\u0014\n\u0000"+ + "8B\u0003$\u0012\u00009B\u0003 \u0010\u0000:B\u0003&\u0013\u0000;B\u0003"+ + "\u0012\t\u0000B\u0005"+ + "\u0018\u0000\u0000?B\u0005\u0019\u0000\u0000@B\u0007\u0001\u0000\u0000"+ + "A0\u0001\u0000\u0000\u0000A1\u0001\u0000\u0000\u0000A2\u0001\u0000\u0000"+ + "\u0000A3\u0001\u0000\u0000\u0000A4\u0001\u0000\u0000\u0000A5\u0001\u0000"+ + "\u0000\u0000A6\u0001\u0000\u0000\u0000A7\u0001\u0000\u0000\u0000A8\u0001"+ + "\u0000\u0000\u0000A9\u0001\u0000\u0000\u0000A:\u0001\u0000\u0000\u0000"+ + "A;\u0001\u0000\u0000\u0000A<\u0001\u0000\u0000\u0000A=\u0001\u0000\u0000"+ + "\u0000A>\u0001\u0000\u0000\u0000A?\u0001\u0000\u0000\u0000A@\u0001\u0000"+ + "\u0000\u0000B\u0003\u0001\u0000\u0000\u0000CD\u0005\u0017\u0000\u0000"+ + "DE\u0005\u0016\u0000\u0000EU\u0005\u0017\u0000\u0000FU\u0003\u000e\u0007"+ + "\u0000GU\u0003\u0012\t\u0000HU\u0003&\u0013\u0000IU\u0005\u000b\u0000"+ + "\u0000JU\u0005\n\u0000\u0000KU\u0005\t\u0000\u0000LM\u0005\u0017\u0000"+ + "\u0000MN\u0005\u0016\u0000\u0000NU\u0005\f\u0000\u0000OU\u0005\u0017\u0000"+ + "\u0000PU\u0005\f\u0000\u0000QU\u0005\u0016\u0000\u0000RU\u0005\u001c\u0000"+ + "\u0000SU\u0005\u001d\u0000\u0000TC\u0001\u0000\u0000\u0000TF\u0001\u0000"+ + "\u0000\u0000TG\u0001\u0000\u0000\u0000TH\u0001\u0000\u0000\u0000TI\u0001"+ + "\u0000\u0000\u0000TJ\u0001\u0000\u0000\u0000TK\u0001\u0000\u0000\u0000"+ + "TL\u0001\u0000\u0000\u0000TO\u0001\u0000\u0000\u0000TP\u0001\u0000\u0000"+ + "\u0000TQ\u0001\u0000\u0000\u0000TR\u0001\u0000\u0000\u0000TS\u0001\u0000"+ + "\u0000\u0000U\u0005\u0001\u0000\u0000\u0000VW\u0005\u0011\u0000\u0000"+ + "W\u0007\u0001\u0000\u0000\u0000X\\\u0007\u0002\u0000\u0000Y[\u0003\u0004"+ + "\u0002\u0000ZY\u0001\u0000\u0000\u0000[^\u0001\u0000\u0000\u0000\\Z\u0001"+ + "\u0000\u0000\u0000\\]\u0001\u0000\u0000\u0000]_\u0001\u0000\u0000\u0000"+ + "^\\\u0001\u0000\u0000\u0000_`\u0005\u0019\u0000\u0000`d\u0005\u001d\u0000"+ + "\u0000ac\u0005\u001c\u0000\u0000ba\u0001\u0000\u0000\u0000cf\u0001\u0000"+ + "\u0000\u0000db\u0001\u0000\u0000\u0000de\u0001\u0000\u0000\u0000e\t\u0001"+ + "\u0000\u0000\u0000fd\u0001\u0000\u0000\u0000gk\u0007\u0002\u0000\u0000"+ + "hj\u0003\u0004\u0002\u0000ih\u0001\u0000\u0000\u0000jm\u0001\u0000\u0000"+ + "\u0000ki\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000ln\u0001\u0000"+ + "\u0000\u0000mk\u0001\u0000\u0000\u0000no\u0005\u0019\u0000\u0000o\u000b"+ + "\u0001\u0000\u0000\u0000pz\u0005\u0014\u0000\u0000qu\u0007\u0002\u0000"+ + "\u0000rt\u0003\u0004\u0002\u0000sr\u0001\u0000\u0000\u0000tw\u0001\u0000"+ + "\u0000\u0000us\u0001\u0000\u0000\u0000uv\u0001\u0000\u0000\u0000vx\u0001"+ + "\u0000\u0000\u0000wu\u0001\u0000\u0000\u0000xz\u0005\u0018\u0000\u0000"+ + "yp\u0001\u0000\u0000\u0000yq\u0001\u0000\u0000\u0000z\r\u0001\u0000\u0000"+ + "\u0000{}\u0003 \u0010\u0000|{\u0001\u0000\u0000\u0000|}\u0001\u0000\u0000"+ + "\u0000}~\u0001\u0000\u0000\u0000~\u007f\u0003\u0010\b\u0000\u007f\u0080"+ + "\u0005\u001f\u0000\u0000\u0080\u0081\u0005 \u0000\u0000\u0081\u000f\u0001"+ + "\u0000\u0000\u0000\u0082\u0083\u0005\u0005\u0000\u0000\u0083\u0011\u0001"+ + "\u0000\u0000\u0000\u0084\u0085\u0005\u0006\u0000\u0000\u0085\u0013\u0001"+ + "\u0000\u0000\u0000\u0086\u0087\u0005\t\u0000\u0000\u0087\u0015\u0001\u0000"+ + "\u0000\u0000\u0088\u0094\u0005\u000b\u0000\u0000\u0089\u0094\u0005\n\u0000"+ + "\u0000\u008a\u0094\u0003\u0018\f\u0000\u008b\u0094\u0003&\u0013\u0000"+ + "\u008c\u008e\u0005\u001a\u0000\u0000\u008d\u008f\u0005\u0002\u0000\u0000"+ + "\u008e\u008d\u0001\u0000\u0000\u0000\u008f\u0090\u0001\u0000\u0000\u0000"+ + "\u0090\u008e\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000\u0000\u0000"+ + "\u0091\u0092\u0001\u0000\u0000\u0000\u0092\u0094\u0005,\u0000\u0000\u0093"+ + "\u0088\u0001\u0000\u0000\u0000\u0093\u0089\u0001\u0000\u0000\u0000\u0093"+ + "\u008a\u0001\u0000\u0000\u0000\u0093\u008b\u0001\u0000\u0000\u0000\u0093"+ + "\u008c\u0001\u0000\u0000\u0000\u0094\u0017\u0001\u0000\u0000\u0000\u0095"+ + "\u0096\u0005\u0007\u0000\u0000\u0096\u0097\u0005\u001f\u0000\u0000\u0097"+ + "\u0098\u0005\u0003\u0000\u0000\u0098\u0099\u0005 \u0000\u0000\u0099\u0019"+ + "\u0001\u0000\u0000\u0000\u009a\u009c\u0003\u001e\u000f\u0000\u009b\u009d"+ + "\u0003\u0002\u0001\u0000\u009c\u009b\u0001\u0000\u0000\u0000\u009d\u009e"+ + "\u0001\u0000\u0000\u0000\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009f"+ + "\u0001\u0000\u0000\u0000\u009f\u00a0\u0001\u0000\u0000\u0000\u00a0\u00a1"+ + "\u0003\u001c\u000e\u0000\u00a1\u001b\u0001\u0000\u0000\u0000\u00a2\u00a3"+ + "\u0005\b\u0000\u0000\u00a3\u001d\u0001\u0000\u0000\u0000\u00a4\u00a5\u0005"+ + "\u0007\u0000\u0000\u00a5\u00a6\u0005\u001f\u0000\u0000\u00a6\u00a7\u0005"+ + " \u0000\u0000\u00a7\u001f\u0001\u0000\u0000\u0000\u00a8\u00ac\u0005\u001d"+ + "\u0000\u0000\u00a9\u00ab\u0005\u001c\u0000\u0000\u00aa\u00a9\u0001\u0000"+ + "\u0000\u0000\u00ab\u00ae\u0001\u0000\u0000\u0000\u00ac\u00aa\u0001\u0000"+ + "\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad!\u0001\u0000\u0000"+ + "\u0000\u00ae\u00ac\u0001\u0000\u0000\u0000\u00af\u00b3\u0005\u001d\u0000"+ + "\u0000\u00b0\u00b2\u0005\u001c\u0000\u0000\u00b1\u00b0\u0001\u0000\u0000"+ + "\u0000\u00b2\u00b5\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000"+ + "\u0000\u00b3\u00b4\u0001\u0000\u0000\u0000\u00b4#\u0001\u0000\u0000\u0000"+ + "\u00b5\u00b3\u0001\u0000\u0000\u0000\u00b6\u00b7\u0007\u0003\u0000\u0000"+ + "\u00b7%\u0001\u0000\u0000\u0000\u00b8\u00b9\u0005\r\u0000\u0000\u00b9"+ + "\u00bd\u0005-\u0000\u0000\u00ba\u00bb\u0005\u000e\u0000\u0000\u00bb\u00bd"+ + "\u00050\u0000\u0000\u00bc\u00b8\u0001\u0000\u0000\u0000\u00bc\u00ba\u0001"+ + "\u0000\u0000\u0000\u00bd\'\u0001\u0000\u0000\u0000\u000f+AT\\dkuy|\u0090"+ + "\u0093\u009e\u00ac\u00b3\u00bc"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java new file mode 100644 index 000000000000..b7fdeef1bebc --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java @@ -0,0 +1,282 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link BladeAntlrFormatterParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class BladeAntlrFormatterParserBaseListener implements BladeAntlrFormatterParserListener { + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFile(BladeAntlrFormatterParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFile(BladeAntlrFormatterParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatement(BladeAntlrFormatterParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatement(BladeAntlrFormatterParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx) { } + + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java new file mode 100644 index 000000000000..340c1cdc50f8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java @@ -0,0 +1,212 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BladeAntlrFormatterParser}. + */ +public interface BladeAntlrFormatterParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#file}. + * @param ctx the parse tree + */ + void enterFile(BladeAntlrFormatterParser.FileContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#file}. + * @param ctx the parse tree + */ + void exitFile(BladeAntlrFormatterParser.FileContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#statement}. + * @param ctx the parse tree + */ + void enterStatement(BladeAntlrFormatterParser.StatementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#statement}. + * @param ctx the parse tree + */ + void exitStatement(BladeAntlrFormatterParser.StatementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#inline_tag_statement}. + * @param ctx the parse tree + */ + void enterInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#inline_tag_statement}. + * @param ctx the parse tree + */ + void exitInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_close_tag}. + * @param ctx the parse tree + */ + void enterHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_close_tag}. + * @param ctx the parse tree + */ + void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_indent}. + * @param ctx the parse tree + */ + void enterHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_indent}. + * @param ctx the parse tree + */ + void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_tag}. + * @param ctx the parse tree + */ + void enterHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_tag}. + * @param ctx the parse tree + */ + void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#self_closed_tag}. + * @param ctx the parse tree + */ + void enterSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#self_closed_tag}. + * @param ctx the parse tree + */ + void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_start}. + * @param ctx the parse tree + */ + void enterBlock_start(BladeAntlrFormatterParser.Block_startContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_start}. + * @param ctx the parse tree + */ + void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_directive_name}. + * @param ctx the parse tree + */ + void enterBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_directive_name}. + * @param ctx the parse tree + */ + void exitBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_end}. + * @param ctx the parse tree + */ + void enterBlock_end(BladeAntlrFormatterParser.Block_endContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_end}. + * @param ctx the parse tree + */ + void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_aligned_directive}. + * @param ctx the parse tree + */ + void enterBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_aligned_directive}. + * @param ctx the parse tree + */ + void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#inline_identable_element}. + * @param ctx the parse tree + */ + void enterInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#inline_identable_element}. + * @param ctx the parse tree + */ + void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_inline}. + * @param ctx the parse tree + */ + void enterSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_inline}. + * @param ctx the parse tree + */ + void exitSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block}. + * @param ctx the parse tree + */ + void enterSection_block(BladeAntlrFormatterParser.Section_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block}. + * @param ctx the parse tree + */ + void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block_end}. + * @param ctx the parse tree + */ + void enterSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block_end}. + * @param ctx the parse tree + */ + void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block_start}. + * @param ctx the parse tree + */ + void enterSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block_start}. + * @param ctx the parse tree + */ + void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_before}. + * @param ctx the parse tree + */ + void enterNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_before}. + * @param ctx the parse tree + */ + void exitNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space}. + * @param ctx the parse tree + */ + void enterNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space}. + * @param ctx the parse tree + */ + void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#static_element}. + * @param ctx the parse tree + */ + void enterStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#static_element}. + * @param ctx the parse tree + */ + void exitStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#blade_echo}. + * @param ctx the parse tree + */ + void enterBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#blade_echo}. + * @param ctx the parse tree + */ + void exitBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx); +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java new file mode 100644 index 000000000000..a923d32b2c8c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java @@ -0,0 +1,81 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; + +/** + * + * @author bogdan + */ +public abstract class LexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int roundParenBalance = 0; + public int squareParenBalance = 0; + public int curlyParenBalance = 0; + public int exitIfModePosition = 0; + + public LexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + public void consumeDirectiveArgLParen() { + if (this.roundParenBalance == 0) { + this.setType(BladeAntlrFormatterLexer.D_ARG_LPAREN); + } else { + this.skip(); + } + this.roundParenBalance++; + } + + public void consumeDirectiveArgRParen() { + //we start from 0 balance + this.roundParenBalance--; + System.out.println("balance " + this.roundParenBalance); + if (this.roundParenBalance <= 0) { + this.setType(BladeAntlrFormatterLexer.D_ARG_RPAREN); + this.roundParenBalance = 0; + this.mode(DEFAULT_MODE); + } else { + this.skip(); + } + } + + public void consumeBladeParamComma() { + if (this.hasNoBladeParamOpenBracket()) { + this.setType(BladeAntlrFormatterLexer.PARAM_COMMA); + } else { + this.skip(); + } + } + + public boolean hasNoBladeParamOpenBracket() { + return this.roundParenBalance == 1 + && this.squareParenBalance == 0 + && this.curlyParenBalance == 0; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 new file mode 100644 index 000000000000..27a260f73fa7 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -0,0 +1,264 @@ +lexer grammar BladeAntlrColoringLexer; +import BladeColoringCommonLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; +} + +options { + superClass = ColoringLexerAdaptor; + caseInsensitive = true; + } + +channels {PHP_CODE} + +tokens { + DIRECTIVE, + PHP_EXPRESSION, + BLADE_PHP_ECHO_EXPR, + RAW_TAG, + CONTENT_TAG, + HTML, + HTML_TAG, + ERROR +} + +fragment NekudoWithelistMatch : '::' | '?:' | ' : '; + +fragment DirectivesWithEndTag : 'for' ('each')? | 'if' | 'while' + | 'section' | 'session' | 'once' | 'push' | 'PushOnce' + | 'switch' | 'unless' | 'can' ('any' | 'not')? + | 'auth' | 'guest' + | 'error' | 'production' | 'empty'; + +fragment Include : '@include' ('If' | 'When' | 'First' | 'Unless')?; + +//to remove +fragment DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP + : '"' (ESC_DOUBLE_QUOTED_STRING | '{' PhpVariable '}' | . | ~[:])*? '"'; + +fragment ComponentTagIdentifier + : [a-z_\u0080-\ufffe][a-z0-9.:\u0080-\ufffe-]*; + +//?? +fragment SpecialChars : '°'; + +PHP_INLINE : '' | '' | EOF); + +D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' + | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')+ {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue')->type(DIRECTIVE); + +D_GENERIC_END_TAGS : ('@stop' | '@show' | '@overwrite' | '@viteReactRefresh' | '@end' DirectivesWithEndTag)->type(DIRECTIVE); + +//verbatim has special blade escape logic +D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE), type(DIRECTIVE); +D_ENDVERBATIM : '@endverbatim'->type(DIRECTIVE); + +D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +D_SIMPLE : ('@else' | '@csrf' | '@default' | '@append' | '@parent')->type(DIRECTIVE); + +//php emebeddings +D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(LOOK_FOR_PHP_EXPRESSION); +D_PHP : '@php'->pushMode(BLADE_INLINE_PHP); + +//allow php expression highlight for custom directives which start with 'end' also +D_END : ('@end' NameString)->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +//known plugins +D_LIVEWIRE : ('@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@click' ('.away')? '=')->type(DIRECTIVE); +D_ASSET_BUNDLER : '@vite'->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +//we will decide that a custom directive has expression to avoid email matching +D_CUSTOM : ('@' NameString {this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '(')}? ) ->pushMode(LOOK_FOR_PHP_EXPRESSION); + +D_UNKNOWN : '@' NameString; + +//TODO move all known directives to fragment? +//hack to allow completion for directives +//it doesn't trigger completion +D_AT : '@' (' ' | '>' | [\n\r])?; + +//display +CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO),type(CONTENT_TAG); +RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO),type(RAW_TAG); + +CSS_COMMENT : ('/*' .*? '*/' | '//')->type(HTML); + +HTML_X : ('type(HTML),pushMode(INSIDE_HTML_COMPONENT_TAG); + +CLOSE_TAG : ('' [\n\r ]*)+->type(HTML); + +HTML : ((' ')+ | [\r\n]+ | ComponentTagIdentifier | SpecialChars | '"' {this._input.LA(1) != '@'}? | '\\\'' {this._input.LA(1) != '@'}? | '_' | '.' +| ',' | '=' | [()-;]+ | '[' | ']' )* '<' {this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'}? ->pushMode(INSIDE_HTML_TAG),more; + +HTML_MISC : ((' ')+ | [\r\n]+ | ('#' | '.')? ComponentTagIdentifier | SpecialChars | '"' {this._input.LA(1) != '@'}? +| ',' | '\\\'' | '_' | '.' | '=' | [()-;]+ | '[' | ']' )+->type(HTML); + +HTML_WS : ((' ')+ | [\r\n]+)->type(HTML); + +INCOMPLETE_BLADE_TAG : ('{!' | '{{-') ->type(HTML); + +OTHER : . ->type(HTML); + +mode INSIDE_HTML_TAG; + +OTHER_HTML_POP : . {this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?'))}? ->type(HTML_TAG), popMode; + +OTHER_HTML : . ->more; + +HTML_EOF : EOF->type(HTML_TAG),popMode; + +// {{ }} +mode INSIDE_REGULAR_ECHO; + +CONTENT_TAG_CLOSE : ('}}')->popMode,type(CONTENT_TAG); +//hack due to a netbeans php embedding issue when adding or deleting ':' chars +ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeEscapedEchoToken();}; +ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeEscapedEchoToken();}; +ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; + +GREEDY_REGULAR_ECHO_EXPR : ~[ ':{}]+ {this.consumeEscapedEchoToken();}; + +ESCAPED_ECHO_EXPR : . [ ]* {this.consumeEscapedEchoToken();}; +EXIT_ECHO_EOF : EOF->type(ERROR),popMode; + +// {!! !!} +mode INSIDE_RAW_ECHO; + +RAW_TAG_CLOSE : ('!!}')->popMode, type(RAW_TAG); +//hack due to a netbeans php embedding issue when adding or deleting ':' chars +RAW_ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeNotEscapedEchoToken();}; +RAW_ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeNotEscapedEchoToken();}; +RAW_ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; +RAW_ECHO_EXPR : ~[ ':!{}]+ {this.consumeNotEscapedEchoToken();}; +RAW_ECHO_EXPR_MORE : . [ ]* {this.consumeNotEscapedEchoToken();}; +EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; + +// @directive ()? +mode LOOK_FOR_PHP_EXPRESSION; + +WS_EXPR : [ ]+ {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION); +OPEN_EXPR_PAREN_MORE : '(' {this.increaseRoundParenBalance();} ->more,pushMode(INSIDE_PHP_EXPRESSION); + +AFTER_DIRECTIVE : NameString->type(ERROR), popMode; +L_OTHER : . ->type(ERROR), popMode; + +// @directive (?) +mode INSIDE_PHP_EXPRESSION; + +OPEN_EXPR_PAREN : {this.roundParenBalance == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +CLOSE_EXPR_PAREN : {this.roundParenBalance == 1}? ')' + {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +LPAREN : {this.roundParenBalance > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +RPAREN : {this.roundParenBalance > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; + +//in case of lexer restart context +EXIT_RPAREN : ')' {this.roundParenBalance == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +DB_STRING_OPEN : '"' ->more,pushMode(DB_STRING_MODE); +//hack due to a netbeans php embedding issue when adding or deleting ':' chars + +SHORT_IF_EXPR_ERR : ('?:') {this.testForFreezeCombination();}; + +DOUBLE_NEKODU : ('::') {this.consumeExprToken();}; + + +EXPR_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT (' ')*) {this.consumeExprToken();}; + +//STATIC_STRING : //check if start of token ... check if bracket and + +FREEZE_NEKUDO_GREEDY : ':' {this._input.LA(1) != ':'}?->skip; + +FREEZE_NEKUDO : ':'->skip; + +PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->skip; + +PHP_EXPRESSION_MORE : . {this.consumeExprToken();}; + +EXIT_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); + +// @php +mode BLADE_INLINE_PHP; + +D_ENDPHP : '@endphp'->popMode; + +//hack to merge all php inputs into one token +BLADE_PHP_INLINE : . { + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'p' && + this._input.LA(6) == 'h' && + this._input.LA(7) == 'p' + }?->channel(PHP_CODE) ; +BLADE_PHP_INLINE_MORE : . ->more; + +EXIT_INLINE_PHP_EOF : EOF->type(ERROR),popMode; + +// @verbatim +mode VERBATIM_MODE; + +D_ENDVERBATIM_IN_MODE : '@endverbatim'->type(DIRECTIVE), popMode; + +//hack to merge all php inputs into one token +VERBATIM_HTML : . { + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + }? ->type(HTML); +VERBATIM_HTML_MORE : . ->more; + +EXIT_VERBATIM_MOD_EOF : EOF->type(ERROR),popMode; + +mode INSIDE_HTML_COMPONENT_TAG; + +COMPONENT_ATTRIBUTE : (':' FullIdentifier '="') ->type(HTML),pushMode(COMPONENT_PHP_EXPRESSION); + +COMPONENT_CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO),type(CONTENT_TAG); +COMPONENT_RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO),type(RAW_TAG); + +EXIT_HTML_COMPONENT : '>'->type(HTML), popMode; + +HTML_COMPONENT_ANY : . ->type(HTML); + +EXIT_HTML_COMPONENT_EOF : EOF->type(ERROR),popMode; + +mode COMPONENT_PHP_EXPRESSION; + +EXIT_COMPONENT_PHP_EXPRESSION : '"'->type(HTML), popMode; +COMPONENT_PHP_EXPRESSION_LAST : . {this._input.LA(1) == '"'}? ->type(PHP_EXPRESSION); +COMPONENT_PHP_EXPRESSION : . ->more; + +EXIT_COMPONENT_PHP_EXPRESSION_EOF : EOF->type(ERROR),popMode; + +mode DB_STRING_MODE; + +DB_STRING_NEKUDO_GREEDY : NekudoWithelistMatch '$'? FullIdentifier '}' ->more; + +DB_STRING_NEKUDO : NekudoWithelistMatch ->more; +//TODO numeric +DB_JSON_PAIR : '{' [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier? [\\']? (',' ( [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier [\\']? ))* ','? '}' ->more; + +PHP_INTERCALATED : '{' '$' FullIdentifier ('[' [\\'] FullIdentifier [\\'] ']')* '::' FullIdentifier '}'->more; + +DB_POINT : ('{' '$' FullIdentifier ('[' [\\'] FullIdentifier? [\\'] ']')* (('::'+ FullIdentifier)? (':' FullIdentifier?)+ ) '}' | ':$')->type(ERROR); + +DB_QUOTE_MORE : '\\"'->more; + +DB_QUOTE_EXIT : '"'->more, popMode; + +DB_QUOTE_ANY : . ->more; + +DB_QUOTE_EOF : EOF->type(ERROR),popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java new file mode 100644 index 000000000000..86836c78400e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -0,0 +1,1765 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + DIRECTIVE=1, PHP_EXPRESSION=2, BLADE_PHP_ECHO_EXPR=3, RAW_TAG=4, CONTENT_TAG=5, + HTML=6, HTML_TAG=7, ERROR=8, BLADE_COMMENT=9, PHP_INLINE=10, D_PHP=11, + D_CUSTOM=12, D_UNKNOWN=13, D_AT=14, BLADE_COMMENT_START=15, ECHO_DOUBLE_NEKODU=16, + ECHO_STRING_LITERAL=17, ECHO_PHP_FREEZE_SYNTAX=18, GREEDY_REGULAR_ECHO_EXPR=19, + ESCAPED_ECHO_EXPR=20, RAW_ECHO_DOUBLE_NEKODU=21, RAW_ECHO_STRING_LITERAL=22, + RAW_ECHO_PHP_FREEZE_SYNTAX=23, RAW_ECHO_EXPR=24, RAW_ECHO_EXPR_MORE=25, + WS_EXPR=26, OPEN_EXPR_PAREN=27, LPAREN=28, RPAREN=29, SHORT_IF_EXPR_ERR=30, + DOUBLE_NEKODU=31, EXPR_STRING_LITERAL=32, FREEZE_NEKUDO_GREEDY=33, FREEZE_NEKUDO=34, + PHP_EXPRESSION_COMMENT=35, PHP_EXPRESSION_MORE=36, D_ENDPHP=37, BLADE_PHP_INLINE=38, + BLADE_COMMENT_END=39, D_ENDVERBATIM=40, DB_STRING_OPEN=41, EXIT_HTML_COMPONENT=42, + DB_QUOTE_MORE=43; + public static final int + PHP_CODE=2; + public static final int + INSIDE_HTML_TAG=1, INSIDE_REGULAR_ECHO=2, INSIDE_RAW_ECHO=3, LOOK_FOR_PHP_EXPRESSION=4, + INSIDE_PHP_EXPRESSION=5, BLADE_INLINE_PHP=6, VERBATIM_MODE=7, INSIDE_HTML_COMPONENT_TAG=8, + COMPONENT_PHP_EXPRESSION=9, DB_STRING_MODE=10, INSIDE_BLADE_COMMENT=11; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "PHP_CODE" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INSIDE_HTML_TAG", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", + "LOOK_FOR_PHP_EXPRESSION", "INSIDE_PHP_EXPRESSION", "BLADE_INLINE_PHP", + "VERBATIM_MODE", "INSIDE_HTML_COMPONENT_TAG", "COMPONENT_PHP_EXPRESSION", + "DB_STRING_MODE", "INSIDE_BLADE_COMMENT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "NekudoWithelistMatch", "DirectivesWithEndTag", "Include", "DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP", + "ComponentTagIdentifier", "SpecialChars", "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", + "D_GENERIC_INLINE_DIRECTIVES", "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", + "D_VERBATIM", "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", + "D_END", "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", + "CONTENT_TAG_OPEN", "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", + "HTML", "HTML_MISC", "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", + "BladeLabel", "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", + "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", + "D_ESCAPES", "OTHER_HTML_POP", "OTHER_HTML", "HTML_EOF", "CONTENT_TAG_CLOSE", + "ECHO_DOUBLE_NEKODU", "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", + "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "EXIT_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", "RAW_ECHO_PHP_FREEZE_SYNTAX", + "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", "WS_EXPR", + "OPEN_EXPR_PAREN_MORE", "AFTER_DIRECTIVE", "L_OTHER", "OPEN_EXPR_PAREN", + "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", "EXIT_RPAREN", "DB_STRING_OPEN", + "SHORT_IF_EXPR_ERR", "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", + "FREEZE_NEKUDO", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "EXIT_EOF", + "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", "EXIT_INLINE_PHP_EOF", + "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", "EXIT_VERBATIM_MOD_EOF", + "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", "COMPONENT_RAW_TAG_OPEN", + "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", "EXIT_HTML_COMPONENT_EOF", + "EXIT_COMPONENT_PHP_EXPRESSION", "COMPONENT_PHP_EXPRESSION_LAST", "COMPONENT_PHP_EXPRESSION", + "EXIT_COMPONENT_PHP_EXPRESSION_EOF", "DB_STRING_NEKUDO_GREEDY", "DB_STRING_NEKUDO", + "DB_JSON_PAIR", "PHP_INTERCALATED", "DB_POINT", "DB_QUOTE_MORE", "DB_QUOTE_EXIT", + "DB_QUOTE_ANY", "DB_QUOTE_EOF", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", + "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, "'@php'", + null, null, null, "'{{--'", null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, "':'", + null, null, "'@endphp'", null, "'--}}'", null, null, "'>'", "'\\\"'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "DIRECTIVE", "PHP_EXPRESSION", "BLADE_PHP_ECHO_EXPR", "RAW_TAG", + "CONTENT_TAG", "HTML", "HTML_TAG", "ERROR", "BLADE_COMMENT", "PHP_INLINE", + "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", "ECHO_DOUBLE_NEKODU", + "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", "GREEDY_REGULAR_ECHO_EXPR", + "ESCAPED_ECHO_EXPR", "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", + "RAW_ECHO_PHP_FREEZE_SYNTAX", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", + "WS_EXPR", "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "SHORT_IF_EXPR_ERR", + "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", "FREEZE_NEKUDO", + "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "D_ENDPHP", "BLADE_PHP_INLINE", + "BLADE_COMMENT_END", "D_ENDVERBATIM", "DB_STRING_OPEN", "EXIT_HTML_COMPONENT", + "DB_QUOTE_MORE" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public BladeAntlrColoringLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladeAntlrColoringLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 51: + ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); + break; + case 52: + ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); + break; + case 54: + GREEDY_REGULAR_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); + break; + case 55: + ESCAPED_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); + break; + case 58: + RAW_ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); + break; + case 59: + RAW_ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); + break; + case 61: + RAW_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); + break; + case 62: + RAW_ECHO_EXPR_MORE_action((RuleContext)_localctx, actionIndex); + break; + case 65: + OPEN_EXPR_PAREN_MORE_action((RuleContext)_localctx, actionIndex); + break; + case 68: + OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 69: + CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 70: + LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 71: + RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 74: + SHORT_IF_EXPR_ERR_action((RuleContext)_localctx, actionIndex); + break; + case 75: + DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); + break; + case 76: + EXPR_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); + break; + case 80: + PHP_EXPRESSION_MORE_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + this.consumeEscapedEchoToken(); + break; + } + } + private void ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + this.consumeEscapedEchoToken(); + break; + } + } + private void GREEDY_REGULAR_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + this.consumeEscapedEchoToken(); + break; + } + } + private void ESCAPED_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + this.consumeEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 6: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_EXPR_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 7: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void OPEN_EXPR_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 8: + this.increaseRoundParenBalance(); + break; + } + } + private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 9: + this.increaseRoundParenBalance(); + break; + case 10: + this.consumeExprToken(); + break; + } + } + private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 11: + this.decreaseRoundParenBalance(); + break; + } + } + private void LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 12: + this.increaseRoundParenBalance(); + break; + case 13: + this.consumeExprToken(); + break; + } + } + private void RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 14: + this.decreaseRoundParenBalance(); + break; + case 15: + this.consumeExprToken(); + break; + } + } + private void SHORT_IF_EXPR_ERR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 16: + this.testForFreezeCombination(); + break; + } + } + private void DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 17: + this.consumeExprToken(); + break; + } + } + private void EXPR_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 18: + this.consumeExprToken(); + break; + } + } + private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 19: + this.consumeExprToken(); + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 8: + return D_GENERIC_INLINE_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); + case 15: + return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); + case 20: + return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); + case 28: + return HTML_sempred((RuleContext)_localctx, predIndex); + case 29: + return HTML_MISC_sempred((RuleContext)_localctx, predIndex); + case 47: + return OTHER_HTML_POP_sempred((RuleContext)_localctx, predIndex); + case 64: + return WS_EXPR_sempred((RuleContext)_localctx, predIndex); + case 68: + return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 69: + return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 70: + return LPAREN_sempred((RuleContext)_localctx, predIndex); + case 71: + return RPAREN_sempred((RuleContext)_localctx, predIndex); + case 72: + return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); + case 77: + return FREEZE_NEKUDO_GREEDY_sempred((RuleContext)_localctx, predIndex); + case 83: + return BLADE_PHP_INLINE_sempred((RuleContext)_localctx, predIndex); + case 87: + return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); + case 97: + return COMPONENT_PHP_EXPRESSION_LAST_sempred((RuleContext)_localctx, predIndex); + case 110: + return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean D_GENERIC_INLINE_DIRECTIVES_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '('); + } + return true; + } + private boolean HTML_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 3: + return this._input.LA(1) != '@'; + case 4: + return this._input.LA(1) != '@'; + case 5: + return this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'; + } + return true; + } + private boolean HTML_MISC_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 6: + return this._input.LA(1) != '@'; + } + return true; + } + private boolean OTHER_HTML_POP_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 7: + return this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?')); + } + return true; + } + private boolean WS_EXPR_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 8: + return this._input.LA(1) == '('; + } + return true; + } + private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 9: + return this.roundParenBalance == 0; + } + return true; + } + private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 10: + return this.roundParenBalance == 1; + } + return true; + } + private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 11: + return this.roundParenBalance > 0; + } + return true; + } + private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 12: + return this.roundParenBalance > 0; + } + return true; + } + private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 13: + return this.roundParenBalance == 0; + } + return true; + } + private boolean FREEZE_NEKUDO_GREEDY_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 14: + return this._input.LA(1) != ':'; + } + return true; + } + private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 15: + return + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'p' && + this._input.LA(6) == 'h' && + this._input.LA(7) == 'p' + ; + } + return true; + } + private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 16: + return + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + ; + } + return true; + } + private boolean COMPONENT_PHP_EXPRESSION_LAST_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 17: + return this._input.LA(1) == '"'; + } + return true; + } + private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 18: + return + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + ; + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0000+\u0735\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ + "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ + "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ + "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ + "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ + "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ + "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+ + "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+ + "A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002"+ + "F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002"+ + "K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002"+ + "P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002"+ + "U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002"+ + "Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002"+ + "_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002"+ + "d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002"+ + "i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002"+ + "n\u0007n\u0002o\u0007o\u0002p\u0007p\u0001\u0000\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0003\u0001\u0100\b\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u013d\b\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u015c\b\u0001"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0003\u0002\u0178\b\u0002\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0005\u0003\u0182\b\u0003\n\u0003\f\u0003\u0185\t\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0004\u0001\u0004\u0005\u0004\u018b\b\u0004\n\u0004\f\u0004"+ + "\u018e\t\u0004\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0005\u0006\u0197\b\u0006\n\u0006\f\u0006\u019a"+ + "\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01a5\b\u0006\n"+ + "\u0006\f\u0006\u01a8\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u01ad\b\u0006\u0003\u0006\u01af\b\u0006\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0003\u0007\u01cd\b\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0003\b\u023f\b\b\u0001\b\u0004\b\u0242\b\b\u000b\b"+ + "\f\b\u0243\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0003\t\u025a\b\t\u0001\t\u0001\t\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0289\b\n\u0001\n\u0001"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0003\r\u02c0\b\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0003\u000e\u02e5\b\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003"+ + "\u000f\u02ef\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0347\b\u0012\u0001"+ + "\u0012\u0003\u0012\u034a\b\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001"+ + "\u0016\u0003\u0016\u0362\b\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0005\u0019\u0375\b\u0019\n\u0019\f\u0019\u0378\t\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u037e\b\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0004\u001a\u038d\b\u001a\u000b\u001a\f\u001a\u038e\u0003"+ + "\u001a\u0391\b\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u039c"+ + "\b\u001b\n\u001b\f\u001b\u039f\t\u001b\u0004\u001b\u03a1\b\u001b\u000b"+ + "\u001b\f\u001b\u03a2\u0001\u001b\u0001\u001b\u0001\u001c\u0004\u001c\u03a8"+ + "\b\u001c\u000b\u001c\f\u001c\u03a9\u0001\u001c\u0004\u001c\u03ad\b\u001c"+ + "\u000b\u001c\f\u001c\u03ae\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0004\u001c\u03bb\b\u001c\u000b\u001c\f\u001c\u03bc\u0001\u001c\u0005"+ + "\u001c\u03c0\b\u001c\n\u001c\f\u001c\u03c3\t\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0004\u001d"+ + "\u03cc\b\u001d\u000b\u001d\f\u001d\u03cd\u0001\u001d\u0004\u001d\u03d1"+ + "\b\u001d\u000b\u001d\f\u001d\u03d2\u0001\u001d\u0003\u001d\u03d6\b\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0004\u001d\u03e1\b\u001d\u000b\u001d"+ + "\f\u001d\u03e2\u0001\u001d\u0004\u001d\u03e6\b\u001d\u000b\u001d\f\u001d"+ + "\u03e7\u0001\u001d\u0001\u001d\u0001\u001e\u0004\u001e\u03ed\b\u001e\u000b"+ + "\u001e\f\u001e\u03ee\u0001\u001e\u0004\u001e\u03f2\b\u001e\u000b\u001e"+ + "\f\u001e\u03f3\u0003\u001e\u03f6\b\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u03ff"+ + "\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ + "!\u0005!\u0409\b!\n!\f!\u040c\t!\u0001\"\u0001\"\u0005\"\u0410\b\"\n\""+ + "\f\"\u0413\t\"\u0001#\u0001#\u0005#\u0417\b#\n#\f#\u041a\t#\u0001$\u0001"+ + "$\u0001%\u0001%\u0001%\u0005%\u0421\b%\n%\f%\u0424\t%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0005&\u042c\b&\n&\f&\u042f\t&\u0001&\u0001&\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0005\'\u0437\b\'\n\'\f\'\u043a\t\'\u0001("+ + "\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0003)\u0451\b)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001"+ + "-\u0003-\u0465\b-\u0004-\u0467\b-\u000b-\f-\u0468\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0474\b.\u0001.\u0001"+ + ".\u0001.\u0001.\u0003.\u047a\b.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0005.\u0484\b.\n.\f.\u0487\t.\u0001.\u0003.\u048a\b."+ + "\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0005.\u0496\b.\n.\f.\u0499\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0005.\u04a4\b.\n.\f.\u04a7\t.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ + ".\u04b5\b.\n.\f.\u04b8\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0005.\u04c5\b.\n.\f.\u04c8\t.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0005.\u04d6\b.\n.\f.\u04d9\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0005.\u04e2\b.\n.\f.\u04e5\t.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04f2\b.\n.\f.\u04f5"+ + "\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04ff"+ + "\b.\n.\f.\u0502\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0005.\u050f\b.\n.\f.\u0512\t.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u051c\b.\n.\f.\u051f\t.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ + ".\u0535\b.\n.\f.\u0538\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u0546\b.\n.\f.\u0549\t.\u0003"+ + ".\u054b\b.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "0\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ + "2\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00014\u00014\u0003"+ + "4\u0569\b4\u00014\u00014\u00015\u00015\u00015\u00035\u0570\b5\u00015\u0001"+ + "5\u00016\u00046\u0575\b6\u000b6\f6\u0576\u00016\u00016\u00017\u00017\u0005"+ + "7\u057d\b7\n7\f7\u0580\t7\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ + "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001;\u0001;\u0003;\u0595\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003"+ + "<\u059c\b<\u0001<\u0001<\u0001=\u0004=\u05a1\b=\u000b=\f=\u05a2\u0001"+ + "=\u0001=\u0001>\u0001>\u0005>\u05a9\b>\n>\f>\u05ac\t>\u0001>\u0001>\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0004@\u05b6\b@\u000b@\f@\u05b7\u0001"+ + "@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001"+ + "I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001L\u0001L\u0005L\u05fb\bL\nL\fL\u05fe\tL\u0001L\u0001"+ + "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ + "O\u0001O\u0001O\u0001O\u0005O\u060f\bO\nO\fO\u0612\tO\u0001O\u0001O\u0001"+ + "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001"+ + "_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ + "d\u0001d\u0003d\u068f\bd\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001"+ + "e\u0001e\u0001e\u0001f\u0001f\u0003f\u069c\bf\u0001f\u0001f\u0003f\u06a0"+ + "\bf\u0001f\u0004f\u06a3\bf\u000bf\ff\u06a4\u0001f\u0003f\u06a8\bf\u0001"+ + "f\u0003f\u06ab\bf\u0001f\u0003f\u06ae\bf\u0001f\u0001f\u0003f\u06b2\b"+ + "f\u0001f\u0001f\u0003f\u06b6\bf\u0001f\u0004f\u06b9\bf\u000bf\ff\u06ba"+ + "\u0001f\u0003f\u06be\bf\u0001f\u0001f\u0003f\u06c2\bf\u0005f\u06c4\bf"+ + "\nf\ff\u06c7\tf\u0001f\u0003f\u06ca\bf\u0001f\u0001f\u0001f\u0001f\u0001"+ + "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0005g\u06d9"+ + "\bg\ng\fg\u06dc\tg\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+ + "g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u06ec\bh\u0001h\u0001"+ + "h\u0005h\u06f0\bh\nh\fh\u06f3\th\u0001h\u0001h\u0004h\u06f7\bh\u000bh"+ + "\fh\u06f8\u0001h\u0003h\u06fc\bh\u0001h\u0001h\u0003h\u0700\bh\u0004h"+ + "\u0702\bh\u000bh\fh\u0703\u0001h\u0001h\u0001h\u0001h\u0003h\u070a\bh"+ + "\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001"+ + "j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001"+ + "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ + "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+ + "p\u0001p\u0001p\u0006\u0183\u0198\u01a6\u0376\u0422\u0610\u0000q\f\u0000"+ + "\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016\u0000\u0018\n\u001a"+ + "\u0000\u001c\u0000\u001e\u0000 \u0000\"\u0000$(&\u0000(\u0000*\u0000,"+ + "\u000b.\u00000\u00002\u00004\f6\r8\u000e:\u0000<\u0000>\u0000@\u0000B"+ + "\u0000D\u0006F\u0000H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000"+ + "V\u0000X\u0000Z\u0000\\\u0000^\u0000`\u0000b\u000fd\u0000f\u0000h\u0000"+ + "j\u0000l\u0000n\u0000p\u0000r\u0010t\u0011v\u0012x\u0013z\u0014|\u0000"+ + "~\u0000\u0080\u0015\u0082\u0016\u0084\u0017\u0086\u0018\u0088\u0019\u008a"+ + "\u0000\u008c\u001a\u008e\u0000\u0090\u0000\u0092\u0000\u0094\u001b\u0096"+ + "\u0000\u0098\u001c\u009a\u001d\u009c\u0000\u009e)\u00a0\u001e\u00a2\u001f"+ + "\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000"+ + "\u00b6\u0000\u00b8\u0000\u00ba\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000"+ + "\u00c2\u0000\u00c4\u0000\u00c6*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce"+ + "\u0000\u00d0\u0000\u00d2\u0000\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da"+ + "\u0000\u00dc\u0000\u00de+\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6\'"+ + "\u00e8\u0000\u00ea\u0000\u00ec\u0000\f\u0000\u0001\u0002\u0003\u0004\u0005"+ + "\u0006\u0007\b\t\n\u000b-\u0002\u0000FFff\u0002\u0000OOoo\u0002\u0000"+ + "RRrr\u0002\u0000EEee\u0002\u0000AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002"+ + "\u0000IIii\u0002\u0000WWww\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000"+ + "TTtt\u0002\u0000NNnn\u0002\u0000PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002"+ + "\u0000GGgg\u0002\u0000DDdd\u0002\u0000MMmm\u0001\u0000::\u0004\u0000A"+ + "Z__az\u0080\u8000\ufffe\u0005\u0000-.0:AZaz\u0080\u8000\ufffe\u0002\u0000"+ + "XXxx\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002"+ + "\u0000JJjj\u0004\u0000\n\n\r\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n"+ + "\n\r\r\u0004\u0000,,..==__\u0001\u0000(;\u0002\u0000[[]]\u0002\u0000#"+ + "#..\u0003\u0000..==__\u0005\u000009AZ__az\u0080\u8000\ufffe\u0003\u0000"+ + "AZaz\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000\ufffe\u0006\u0000"+ + "--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001"+ + "\u0000 \u0005\u0000 \'\'::{{}}\u0005\u0000 !\'\'::{{}}\u07d1\u0000\u0018"+ + "\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c"+ + "\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001"+ + "\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000"+ + "\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000"+ + "\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000."+ + "\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000"+ + "\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000"+ + "\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<"+ + "\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000"+ + "\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000"+ + "\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J"+ + "\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000"+ + "\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000"+ + "\u0000h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l"+ + "\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000"+ + "\u0000\u0000\u0002r\u0001\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000"+ + "\u0002v\u0001\u0000\u0000\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z"+ + "\u0001\u0000\u0000\u0000\u0002|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000"+ + "\u0000\u0000\u0003\u0080\u0001\u0000\u0000\u0000\u0003\u0082\u0001\u0000"+ + "\u0000\u0000\u0003\u0084\u0001\u0000\u0000\u0000\u0003\u0086\u0001\u0000"+ + "\u0000\u0000\u0003\u0088\u0001\u0000\u0000\u0000\u0003\u008a\u0001\u0000"+ + "\u0000\u0000\u0004\u008c\u0001\u0000\u0000\u0000\u0004\u008e\u0001\u0000"+ + "\u0000\u0000\u0004\u0090\u0001\u0000\u0000\u0000\u0004\u0092\u0001\u0000"+ + "\u0000\u0000\u0005\u0094\u0001\u0000\u0000\u0000\u0005\u0096\u0001\u0000"+ + "\u0000\u0000\u0005\u0098\u0001\u0000\u0000\u0000\u0005\u009a\u0001\u0000"+ + "\u0000\u0000\u0005\u009c\u0001\u0000\u0000\u0000\u0005\u009e\u0001\u0000"+ + "\u0000\u0000\u0005\u00a0\u0001\u0000\u0000\u0000\u0005\u00a2\u0001\u0000"+ + "\u0000\u0000\u0005\u00a4\u0001\u0000\u0000\u0000\u0005\u00a6\u0001\u0000"+ + "\u0000\u0000\u0005\u00a8\u0001\u0000\u0000\u0000\u0005\u00aa\u0001\u0000"+ + "\u0000\u0000\u0005\u00ac\u0001\u0000\u0000\u0000\u0005\u00ae\u0001\u0000"+ + "\u0000\u0000\u0006\u00b0\u0001\u0000\u0000\u0000\u0006\u00b2\u0001\u0000"+ + "\u0000\u0000\u0006\u00b4\u0001\u0000\u0000\u0000\u0006\u00b6\u0001\u0000"+ + "\u0000\u0000\u0007\u00b8\u0001\u0000\u0000\u0000\u0007\u00ba\u0001\u0000"+ + "\u0000\u0000\u0007\u00bc\u0001\u0000\u0000\u0000\u0007\u00be\u0001\u0000"+ + "\u0000\u0000\b\u00c0\u0001\u0000\u0000\u0000\b\u00c2\u0001\u0000\u0000"+ + "\u0000\b\u00c4\u0001\u0000\u0000\u0000\b\u00c6\u0001\u0000\u0000\u0000"+ + "\b\u00c8\u0001\u0000\u0000\u0000\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc"+ + "\u0001\u0000\u0000\u0000\t\u00ce\u0001\u0000\u0000\u0000\t\u00d0\u0001"+ + "\u0000\u0000\u0000\t\u00d2\u0001\u0000\u0000\u0000\n\u00d4\u0001\u0000"+ + "\u0000\u0000\n\u00d6\u0001\u0000\u0000\u0000\n\u00d8\u0001\u0000\u0000"+ + "\u0000\n\u00da\u0001\u0000\u0000\u0000\n\u00dc\u0001\u0000\u0000\u0000"+ + "\n\u00de\u0001\u0000\u0000\u0000\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2"+ + "\u0001\u0000\u0000\u0000\n\u00e4\u0001\u0000\u0000\u0000\u000b\u00e6\u0001"+ + "\u0000\u0000\u0000\u000b\u00e8\u0001\u0000\u0000\u0000\u000b\u00ea\u0001"+ + "\u0000\u0000\u0000\u000b\u00ec\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000"+ + "\u0000\u0000\u000e\u015b\u0001\u0000\u0000\u0000\u0010\u015d\u0001\u0000"+ + "\u0000\u0000\u0012\u0179\u0001\u0000\u0000\u0000\u0014\u0188\u0001\u0000"+ + "\u0000\u0000\u0016\u018f\u0001\u0000\u0000\u0000\u0018\u01ae\u0001\u0000"+ + "\u0000\u0000\u001a\u01cc\u0001\u0000\u0000\u0000\u001c\u023e\u0001\u0000"+ + "\u0000\u0000\u001e\u0259\u0001\u0000\u0000\u0000 \u0288\u0001\u0000\u0000"+ + "\u0000\"\u028c\u0001\u0000\u0000\u0000$\u0299\u0001\u0000\u0000\u0000"+ + "&\u02bf\u0001\u0000\u0000\u0000(\u02e4\u0001\u0000\u0000\u0000*\u02e8"+ + "\u0001\u0000\u0000\u0000,\u02f5\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000"+ + "\u0000\u00000\u0349\u0001\u0000\u0000\u00002\u034d\u0001\u0000\u0000\u0000"+ + "4\u0356\u0001\u0000\u0000\u00006\u035c\u0001\u0000\u0000\u00008\u035f"+ + "\u0001\u0000\u0000\u0000:\u0363\u0001\u0000\u0000\u0000<\u0369\u0001\u0000"+ + "\u0000\u0000>\u037d\u0001\u0000\u0000\u0000@\u0390\u0001\u0000\u0000\u0000"+ + "B\u03a0\u0001\u0000\u0000\u0000D\u03c1\u0001\u0000\u0000\u0000F\u03e5"+ + "\u0001\u0000\u0000\u0000H\u03f5\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000"+ + "\u0000\u0000L\u0402\u0001\u0000\u0000\u0000N\u0406\u0001\u0000\u0000\u0000"+ + "P\u040d\u0001\u0000\u0000\u0000R\u0414\u0001\u0000\u0000\u0000T\u041b"+ + "\u0001\u0000\u0000\u0000V\u041d\u0001\u0000\u0000\u0000X\u0427\u0001\u0000"+ + "\u0000\u0000Z\u0432\u0001\u0000\u0000\u0000\\\u043b\u0001\u0000\u0000"+ + "\u0000^\u0450\u0001\u0000\u0000\u0000`\u0452\u0001\u0000\u0000\u0000b"+ + "\u0454\u0001\u0000\u0000\u0000d\u045b\u0001\u0000\u0000\u0000f\u0461\u0001"+ + "\u0000\u0000\u0000h\u054a\u0001\u0000\u0000\u0000j\u054e\u0001\u0000\u0000"+ + "\u0000l\u0554\u0001\u0000\u0000\u0000n\u0558\u0001\u0000\u0000\u0000p"+ + "\u055d\u0001\u0000\u0000\u0000r\u0563\u0001\u0000\u0000\u0000t\u0568\u0001"+ + "\u0000\u0000\u0000v\u056f\u0001\u0000\u0000\u0000x\u0574\u0001\u0000\u0000"+ + "\u0000z\u057a\u0001\u0000\u0000\u0000|\u0583\u0001\u0000\u0000\u0000~"+ + "\u0588\u0001\u0000\u0000\u0000\u0080\u058f\u0001\u0000\u0000\u0000\u0082"+ + "\u0594\u0001\u0000\u0000\u0000\u0084\u059b\u0001\u0000\u0000\u0000\u0086"+ + "\u05a0\u0001\u0000\u0000\u0000\u0088\u05a6\u0001\u0000\u0000\u0000\u008a"+ + "\u05af\u0001\u0000\u0000\u0000\u008c\u05b5\u0001\u0000\u0000\u0000\u008e"+ + "\u05bd\u0001\u0000\u0000\u0000\u0090\u05c3\u0001\u0000\u0000\u0000\u0092"+ + "\u05c8\u0001\u0000\u0000\u0000\u0094\u05cd\u0001\u0000\u0000\u0000\u0096"+ + "\u05d2\u0001\u0000\u0000\u0000\u0098\u05d9\u0001\u0000\u0000\u0000\u009a"+ + "\u05de\u0001\u0000\u0000\u0000\u009c\u05e3\u0001\u0000\u0000\u0000\u009e"+ + "\u05e9\u0001\u0000\u0000\u0000\u00a0\u05ee\u0001\u0000\u0000\u0000\u00a2"+ + "\u05f3\u0001\u0000\u0000\u0000\u00a4\u05f8\u0001\u0000\u0000\u0000\u00a6"+ + "\u0601\u0001\u0000\u0000\u0000\u00a8\u0606\u0001\u0000\u0000\u0000\u00aa"+ + "\u060a\u0001\u0000\u0000\u0000\u00ac\u0618\u0001\u0000\u0000\u0000\u00ae"+ + "\u061b\u0001\u0000\u0000\u0000\u00b0\u0620\u0001\u0000\u0000\u0000\u00b2"+ + "\u062a\u0001\u0000\u0000\u0000\u00b4\u062f\u0001\u0000\u0000\u0000\u00b6"+ + "\u0633\u0001\u0000\u0000\u0000\u00b8\u0638\u0001\u0000\u0000\u0000\u00ba"+ + "\u0648\u0001\u0000\u0000\u0000\u00bc\u064d\u0001\u0000\u0000\u0000\u00be"+ + "\u0651\u0001\u0000\u0000\u0000\u00c0\u0656\u0001\u0000\u0000\u0000\u00c2"+ + "\u065e\u0001\u0000\u0000\u0000\u00c4\u0664\u0001\u0000\u0000\u0000\u00c6"+ + "\u066b\u0001\u0000\u0000\u0000\u00c8\u0670\u0001\u0000\u0000\u0000\u00ca"+ + "\u0674\u0001\u0000\u0000\u0000\u00cc\u0679\u0001\u0000\u0000\u0000\u00ce"+ + "\u067e\u0001\u0000\u0000\u0000\u00d0\u0683\u0001\u0000\u0000\u0000\u00d2"+ + "\u0687\u0001\u0000\u0000\u0000\u00d4\u068c\u0001\u0000\u0000\u0000\u00d6"+ + "\u0695\u0001\u0000\u0000\u0000\u00d8\u0699\u0001\u0000\u0000\u0000\u00da"+ + "\u06cf\u0001\u0000\u0000\u0000\u00dc\u0709\u0001\u0000\u0000\u0000\u00de"+ + "\u070d\u0001\u0000\u0000\u0000\u00e0\u0712\u0001\u0000\u0000\u0000\u00e2"+ + "\u0717\u0001\u0000\u0000\u0000\u00e4\u071b\u0001\u0000\u0000\u0000\u00e6"+ + "\u0720\u0001\u0000\u0000\u0000\u00e8\u0727\u0001\u0000\u0000\u0000\u00ea"+ + "\u072c\u0001\u0000\u0000\u0000\u00ec\u0730\u0001\u0000\u0000\u0000\u00ee"+ + "\u00ef\u0005:\u0000\u0000\u00ef\u00f6\u0005:\u0000\u0000\u00f0\u00f1\u0005"+ + "?\u0000\u0000\u00f1\u00f6\u0005:\u0000\u0000\u00f2\u00f3\u0005 \u0000"+ + "\u0000\u00f3\u00f4\u0005:\u0000\u0000\u00f4\u00f6\u0005 \u0000\u0000\u00f5"+ + "\u00ee\u0001\u0000\u0000\u0000\u00f5\u00f0\u0001\u0000\u0000\u0000\u00f5"+ + "\u00f2\u0001\u0000\u0000\u0000\u00f6\r\u0001\u0000\u0000\u0000\u00f7\u00f8"+ + "\u0007\u0000\u0000\u0000\u00f8\u00f9\u0007\u0001\u0000\u0000\u00f9\u00fa"+ + "\u0007\u0002\u0000\u0000\u00fa\u00ff\u0001\u0000\u0000\u0000\u00fb\u00fc"+ + "\u0007\u0003\u0000\u0000\u00fc\u00fd\u0007\u0004\u0000\u0000\u00fd\u00fe"+ + "\u0007\u0005\u0000\u0000\u00fe\u0100\u0007\u0006\u0000\u0000\u00ff\u00fb"+ + "\u0001\u0000\u0000\u0000\u00ff\u0100\u0001\u0000\u0000\u0000\u0100\u015c"+ + "\u0001\u0000\u0000\u0000\u0101\u0102\u0007\u0007\u0000\u0000\u0102\u015c"+ + "\u0007\u0000\u0000\u0000\u0103\u0104\u0007\b\u0000\u0000\u0104\u0105\u0007"+ + "\u0006\u0000\u0000\u0105\u0106\u0007\u0007\u0000\u0000\u0106\u0107\u0007"+ + "\t\u0000\u0000\u0107\u015c\u0007\u0003\u0000\u0000\u0108\u0109\u0007\n"+ + "\u0000\u0000\u0109\u010a\u0007\u0003\u0000\u0000\u010a\u010b\u0007\u0005"+ + "\u0000\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c\u010d\u0007\u0007"+ + "\u0000\u0000\u010d\u010e\u0007\u0001\u0000\u0000\u010e\u015c\u0007\f\u0000"+ + "\u0000\u010f\u0110\u0007\n\u0000\u0000\u0110\u0111\u0007\u0003\u0000\u0000"+ + "\u0111\u0112\u0007\n\u0000\u0000\u0112\u0113\u0007\n\u0000\u0000\u0113"+ + "\u0114\u0007\u0007\u0000\u0000\u0114\u0115\u0007\u0001\u0000\u0000\u0115"+ + "\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007\u0001\u0000\u0000\u0117\u0118"+ + "\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005\u0000\u0000\u0119\u015c\u0007"+ + "\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000\u0000\u011b\u011c\u0007\u000e"+ + "\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000\u011d\u015c\u0007\u0006\u0000"+ + "\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f\u0120\u0007\u000e\u0000\u0000"+ + "\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122\u0007\u0006\u0000\u0000\u0122"+ + "\u0123\u0007\u0001\u0000\u0000\u0123\u0124\u0007\f\u0000\u0000\u0124\u0125"+ + "\u0007\u0005\u0000\u0000\u0125\u015c\u0007\u0003\u0000\u0000\u0126\u0127"+ + "\u0007\n\u0000\u0000\u0127\u0128\u0007\b\u0000\u0000\u0128\u0129\u0007"+ + "\u0007\u0000\u0000\u0129\u012a\u0007\u000b\u0000\u0000\u012a\u012b\u0007"+ + "\u0005\u0000\u0000\u012b\u015c\u0007\u0006\u0000\u0000\u012c\u012d\u0007"+ + "\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000\u0000\u012e\u012f\u0007\t"+ + "\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000\u0130\u0131\u0007\n\u0000"+ + "\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132\u0133\u0007\u0005\u0000\u0000"+ + "\u0133\u0134\u0007\u0004\u0000\u0000\u0134\u0135\u0007\f\u0000\u0000\u0135"+ + "\u013c\u0001\u0000\u0000\u0000\u0136\u0137\u0007\u0004\u0000\u0000\u0137"+ + "\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007\u000f\u0000\u0000\u0139\u013a"+ + "\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001\u0000\u0000\u013b\u013d\u0007"+ + "\u000b\u0000\u0000\u013c\u0136\u0001\u0000\u0000\u0000\u013c\u0139\u0001"+ + "\u0000\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u015c\u0001"+ + "\u0000\u0000\u0000\u013e\u013f\u0007\u0004\u0000\u0000\u013f\u0140\u0007"+ + "\u000e\u0000\u0000\u0140\u0141\u0007\u000b\u0000\u0000\u0141\u015c\u0007"+ + "\u0006\u0000\u0000\u0142\u0143\u0007\u0010\u0000\u0000\u0143\u0144\u0007"+ + "\u000e\u0000\u0000\u0144\u0145\u0007\u0003\u0000\u0000\u0145\u0146\u0007"+ + "\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000\u0000\u0147\u0148\u0007\u0003"+ + "\u0000\u0000\u0148\u0149\u0007\u0002\u0000\u0000\u0149\u014a\u0007\u0002"+ + "\u0000\u0000\u014a\u014b\u0007\u0001\u0000\u0000\u014b\u015c\u0007\u0002"+ + "\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000\u014d\u014e\u0007\u0002\u0000"+ + "\u0000\u014e\u014f\u0007\u0001\u0000\u0000\u014f\u0150\u0007\u0011\u0000"+ + "\u0000\u0150\u0151\u0007\u000e\u0000\u0000\u0151\u0152\u0007\u0005\u0000"+ + "\u0000\u0152\u0153\u0007\u000b\u0000\u0000\u0153\u0154\u0007\u0007\u0000"+ + "\u0000\u0154\u0155\u0007\u0001\u0000\u0000\u0155\u015c\u0007\f\u0000\u0000"+ + "\u0156\u0157\u0007\u0003\u0000\u0000\u0157\u0158\u0007\u0012\u0000\u0000"+ + "\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a\u0007\u000b\u0000\u0000\u015a"+ + "\u015c\u0007\u000f\u0000\u0000\u015b\u00f7\u0001\u0000\u0000\u0000\u015b"+ + "\u0101\u0001\u0000\u0000\u0000\u015b\u0103\u0001\u0000\u0000\u0000\u015b"+ + "\u0108\u0001\u0000\u0000\u0000\u015b\u010f\u0001\u0000\u0000\u0000\u015b"+ + "\u0116\u0001\u0000\u0000\u0000\u015b\u011a\u0001\u0000\u0000\u0000\u015b"+ + "\u011e\u0001\u0000\u0000\u0000\u015b\u0126\u0001\u0000\u0000\u0000\u015b"+ + "\u012c\u0001\u0000\u0000\u0000\u015b\u0132\u0001\u0000\u0000\u0000\u015b"+ + "\u013e\u0001\u0000\u0000\u0000\u015b\u0142\u0001\u0000\u0000\u0000\u015b"+ + "\u0147\u0001\u0000\u0000\u0000\u015b\u014c\u0001\u0000\u0000\u0000\u015b"+ + "\u0156\u0001\u0000\u0000\u0000\u015c\u000f\u0001\u0000\u0000\u0000\u015d"+ + "\u015e\u0005@\u0000\u0000\u015e\u015f\u0007\u0007\u0000\u0000\u015f\u0160"+ + "\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005\u0000\u0000\u0161\u0162\u0007"+ + "\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000\u0000\u0163\u0164\u0007\u0011"+ + "\u0000\u0000\u0164\u0165\u0007\u0003\u0000\u0000\u0165\u0177\u0001\u0000"+ + "\u0000\u0000\u0166\u0167\u0007\u0007\u0000\u0000\u0167\u0178\u0007\u0000"+ + "\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000\u0169\u016a\u0007\u0006\u0000"+ + "\u0000\u016a\u016b\u0007\u0003\u0000\u0000\u016b\u0178\u0007\f\u0000\u0000"+ + "\u016c\u016d\u0007\u0000\u0000\u0000\u016d\u016e\u0007\u0007\u0000\u0000"+ + "\u016e\u016f\u0007\u0002\u0000\u0000\u016f\u0170\u0007\n\u0000\u0000\u0170"+ + "\u0178\u0007\u000b\u0000\u0000\u0171\u0172\u0007\u000e\u0000\u0000\u0172"+ + "\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007\t\u0000\u0000\u0174\u0175"+ + "\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n\u0000\u0000\u0176\u0178\u0007"+ + "\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000\u0000\u0177\u0168\u0001\u0000"+ + "\u0000\u0000\u0177\u016c\u0001\u0000\u0000\u0000\u0177\u0171\u0001\u0000"+ + "\u0000\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0011\u0001\u0000"+ + "\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000\u017a\u0182\u0003T$\u0000"+ + "\u017b\u017c\u0005{\u0000\u0000\u017c\u017d\u0003\\(\u0000\u017d\u017e"+ + "\u0005}\u0000\u0000\u017e\u0182\u0001\u0000\u0000\u0000\u017f\u0182\t"+ + "\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000\u0000\u0181\u017a\u0001\u0000"+ + "\u0000\u0000\u0181\u017b\u0001\u0000\u0000\u0000\u0181\u017f\u0001\u0000"+ + "\u0000\u0000\u0181\u0180\u0001\u0000\u0000\u0000\u0182\u0185\u0001\u0000"+ + "\u0000\u0000\u0183\u0184\u0001\u0000\u0000\u0000\u0183\u0181\u0001\u0000"+ + "\u0000\u0000\u0184\u0186\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000"+ + "\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000\u0187\u0013\u0001\u0000\u0000"+ + "\u0000\u0188\u018c\u0007\u0014\u0000\u0000\u0189\u018b\u0007\u0015\u0000"+ + "\u0000\u018a\u0189\u0001\u0000\u0000\u0000\u018b\u018e\u0001\u0000\u0000"+ + "\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018c\u018d\u0001\u0000\u0000"+ + "\u0000\u018d\u0015\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000"+ + "\u0000\u018f\u0190\u0005\u00b0\u0000\u0000\u0190\u0017\u0001\u0000\u0000"+ + "\u0000\u0191\u0192\u0005<\u0000\u0000\u0192\u0193\u0005?\u0000\u0000\u0193"+ + "\u0194\u0005=\u0000\u0000\u0194\u0198\u0001\u0000\u0000\u0000\u0195\u0197"+ + "\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ + "\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0198\u0196\u0001"+ + "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ + "\u0000\u0000\u0000\u019b\u019c\u0005?\u0000\u0000\u019c\u01af\u0005>\u0000"+ + "\u0000\u019d\u019e\u0005<\u0000\u0000\u019e\u019f\u0005?\u0000\u0000\u019f"+ + "\u01a0\u0007\r\u0000\u0000\u01a0\u01a1\u0007\u0006\u0000\u0000\u01a1\u01a2"+ + "\u0007\r\u0000\u0000\u01a2\u01a6\u0001\u0000\u0000\u0000\u01a3\u01a5\t"+ + "\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000\u0000\u0000\u01a5\u01a8\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+ + "\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001"+ + "\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000\u0000\u01aa\u01ad\u0005>\u0000"+ + "\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001\u01ac\u01a9\u0001\u0000\u0000"+ + "\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ad\u01af\u0001\u0000\u0000"+ + "\u0000\u01ae\u0191\u0001\u0000\u0000\u0000\u01ae\u019d\u0001\u0000\u0000"+ + "\u0000\u01af\u0019\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005@\u0000\u0000"+ + "\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2\u01b3\u0005@\u0000\u0000\u01b3"+ + "\u01b4\u0007\n\u0000\u0000\u01b4\u01b5\u0007\u0003\u0000\u0000\u01b5\u01b6"+ + "\u0007\u0005\u0000\u0000\u01b6\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8"+ + "\u0007\u0007\u0000\u0000\u01b8\u01b9\u0007\u0001\u0000\u0000\u01b9\u01ba"+ + "\u0007\f\u0000\u0000\u01ba\u01bb\u0007\u0012\u0000\u0000\u01bb\u01bc\u0007"+ + "\u0007\u0000\u0000\u01bc\u01bd\u0007\n\u0000\u0000\u01bd\u01be\u0007\n"+ + "\u0000\u0000\u01be\u01bf\u0007\u0007\u0000\u0000\u01bf\u01c0\u0007\f\u0000"+ + "\u0000\u01c0\u01cd\u0007\u0010\u0000\u0000\u01c1\u01c2\u0005@\u0000\u0000"+ + "\u01c2\u01c3\u0007\u0006\u0000\u0000\u01c3\u01c4\u0007\u0004\u0000\u0000"+ + "\u01c4\u01c5\u0007\n\u0000\u0000\u01c5\u01c6\u0007\n\u0000\u0000\u01c6"+ + "\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8\u0007\u0005\u0000\u0000\u01c8"+ + "\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca\u0007\u0007\u0000\u0000\u01ca"+ + "\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd\u0007\f\u0000\u0000\u01cc\u01b0"+ + "\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001\u0000\u0000\u0000\u01cc\u01c1"+ + "\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ce\u01cf"+ + "\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006\u0007\u0001\u0000\u01d0\u001b"+ + "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005@\u0000\u0000\u01d2\u01d3\u0007"+ + "\u0003\u0000\u0000\u01d3\u01d4\u0007\t\u0000\u0000\u01d4\u01d5\u0007\n"+ + "\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000\u0000\u01d6\u01d7\u0007\u0007"+ + "\u0000\u0000\u01d7\u023f\u0007\u0000\u0000\u0000\u01d8\u023f\u0003\u0010"+ + "\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000\u01da\u01db\u0007\u0003\u0000"+ + "\u0000\u01db\u01dc\u0007\u0016\u0000\u0000\u01dc\u01dd\u0007\u000b\u0000"+ + "\u0000\u01dd\u01de\u0007\u0003\u0000\u0000\u01de\u01df\u0007\f\u0000\u0000"+ + "\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0\u023f\u0007\n\u0000\u0000\u01e1"+ + "\u01e2\u0005@\u0000\u0000\u01e2\u01e3\u0007\u0003\u0000\u0000\u01e3\u01e4"+ + "\u0007\u0004\u0000\u0000\u01e4\u01e5\u0007\u0005\u0000\u0000\u01e5\u023f"+ + "\u0007\u0006\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007"+ + "\u000f\u0000\u0000\u01e8\u01e9\u0007\u0007\u0000\u0000\u01e9\u01ea\u0007"+ + "\u0003\u0000\u0000\u01ea\u01eb\u0007\t\u0000\u0000\u01eb\u023f\u0007\u0011"+ + "\u0000\u0000\u01ec\u01ed\u0005@\u0000\u0000\u01ed\u01ee\u0007\r\u0000"+ + "\u0000\u01ee\u01ef\u0007\u0002\u0000\u0000\u01ef\u01f0\u0007\u0001\u0000"+ + "\u0000\u01f0\u01f1\u0007\r\u0000\u0000\u01f1\u023f\u0007\n\u0000\u0000"+ + "\u01f2\u01f3\u0005@\u0000\u0000\u01f3\u01f4\u0007\u0012\u0000\u0000\u01f4"+ + "\u01f5\u0007\u0003\u0000\u0000\u01f5\u01f6\u0007\u000b\u0000\u0000\u01f6"+ + "\u01f7\u0007\u0006\u0000\u0000\u01f7\u01f8\u0007\u0001\u0000\u0000\u01f8"+ + "\u023f\u0007\u0011\u0000\u0000\u01f9\u01fa\u0005@\u0000\u0000\u01fa\u01fb"+ + "\u0007\u0005\u0000\u0000\u01fb\u01fc\u0007\t\u0000\u0000\u01fc\u01fd\u0007"+ + "\u0004\u0000\u0000\u01fd\u01fe\u0007\n\u0000\u0000\u01fe\u023f\u0007\n"+ + "\u0000\u0000\u01ff\u0200\u0005@\u0000\u0000\u0200\u0201\u0007\n\u0000"+ + "\u0000\u0201\u0202\u0007\u000b\u0000\u0000\u0202\u0203\u0007\u000f\u0000"+ + "\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204\u023f\u0007\u0003\u0000\u0000"+ + "\u0205\u0206\u0005@\u0000\u0000\u0206\u0207\u0007\u0004\u0000\u0000\u0207"+ + "\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007\u0004\u0000\u0000\u0209\u020a"+ + "\u0007\u0002\u0000\u0000\u020a\u023f\u0007\u0003\u0000\u0000\u020b\u020c"+ + "\u0005@\u0000\u0000\u020c\u020d\u0007\u0017\u0000\u0000\u020d\u020e\u0007"+ + "\u0002\u0000\u0000\u020e\u020f\u0007\u0003\u0000\u0000\u020f\u0210\u0007"+ + "\u0004\u0000\u0000\u0210\u023f\u0007\u0018\u0000\u0000\u0211\u0212\u0005"+ + "@\u0000\u0000\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0001"+ + "\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000\u0215\u0216\u0007\u000b\u0000"+ + "\u0000\u0216\u0217\u0007\u0007\u0000\u0000\u0217\u0218\u0007\f\u0000\u0000"+ + "\u0218\u0219\u0007\u000e\u0000\u0000\u0219\u023f\u0007\u0003\u0000\u0000"+ + "\u021a\u021b\u0005@\u0000\u0000\u021b\u021c\u0007\n\u0000\u0000\u021c"+ + "\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007\t\u0000\u0000\u021e\u021f"+ + "\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005\u0000\u0000\u0220\u0221"+ + "\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003\u0000\u0000\u0222\u023f"+ + "\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000\u0000\u0224\u0225\u0007"+ + "\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000\u0000\u0226\u0227\u0007"+ + "\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000\u0228\u0229\u0007\u0017"+ + "\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a\u022b\u0007\u0003\u0000"+ + "\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c\u022d\u0005@\u0000\u0000"+ + "\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f\u0007\u0003\u0000\u0000"+ + "\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231\u0007\u0011\u0000\u0000"+ + "\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233\u0007\f\u0000\u0000\u0233"+ + "\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007\u000f\u0000\u0000\u0235\u0236"+ + "\u0005@\u0000\u0000\u0236\u0237\u0007\u0002\u0000\u0000\u0237\u0238\u0007"+ + "\u0003\u0000\u0000\u0238\u0239\u0007\u0019\u0000\u0000\u0239\u023a\u0007"+ + "\u000e\u0000\u0000\u023a\u023b\u0007\u0007\u0000\u0000\u023b\u023c\u0007"+ + "\u0002\u0000\u0000\u023c\u023d\u0007\u0003\u0000\u0000\u023d\u023f\u0007"+ + "\u0011\u0000\u0000\u023e\u01d1\u0001\u0000\u0000\u0000\u023e\u01d8\u0001"+ + "\u0000\u0000\u0000\u023e\u01d9\u0001\u0000\u0000\u0000\u023e\u01e1\u0001"+ + "\u0000\u0000\u0000\u023e\u01e6\u0001\u0000\u0000\u0000\u023e\u01ec\u0001"+ + "\u0000\u0000\u0000\u023e\u01f2\u0001\u0000\u0000\u0000\u023e\u01f9\u0001"+ + "\u0000\u0000\u0000\u023e\u01ff\u0001\u0000\u0000\u0000\u023e\u0205\u0001"+ + "\u0000\u0000\u0000\u023e\u020b\u0001\u0000\u0000\u0000\u023e\u0211\u0001"+ + "\u0000\u0000\u0000\u023e\u021a\u0001\u0000\u0000\u0000\u023e\u0223\u0001"+ + "\u0000\u0000\u0000\u023e\u022c\u0001\u0000\u0000\u0000\u023e\u0235\u0001"+ + "\u0000\u0000\u0000\u023f\u0241\u0001\u0000\u0000\u0000\u0240\u0242\u0005"+ + " \u0000\u0000\u0241\u0240\u0001\u0000\u0000\u0000\u0242\u0243\u0001\u0000"+ + "\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000"+ + "\u0000\u0000\u0244\u0245\u0001\u0000\u0000\u0000\u0245\u0246\u0004\b\u0000"+ + "\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0006\b\u0000\u0000"+ + "\u0248\u0249\u0006\b\u0001\u0000\u0249\u001d\u0001\u0000\u0000\u0000\u024a"+ + "\u024b\u0005@\u0000\u0000\u024b\u024c\u0007\u0017\u0000\u0000\u024c\u024d"+ + "\u0007\u0002\u0000\u0000\u024d\u024e\u0007\u0003\u0000\u0000\u024e\u024f"+ + "\u0007\u0004\u0000\u0000\u024f\u025a\u0007\u0018\u0000\u0000\u0250\u0251"+ + "\u0005@\u0000\u0000\u0251\u0252\u0007\u0005\u0000\u0000\u0252\u0253\u0007"+ + "\u0001\u0000\u0000\u0253\u0254\u0007\f\u0000\u0000\u0254\u0255\u0007\u000b"+ + "\u0000\u0000\u0255\u0256\u0007\u0007\u0000\u0000\u0256\u0257\u0007\f\u0000"+ + "\u0000\u0257\u0258\u0007\u000e\u0000\u0000\u0258\u025a\u0007\u0003\u0000"+ + "\u0000\u0259\u024a\u0001\u0000\u0000\u0000\u0259\u0250\u0001\u0000\u0000"+ + "\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b\u025c\u0006\t\u0001\u0000"+ + "\u025c\u001f\u0001\u0000\u0000\u0000\u025d\u025e\u0005@\u0000\u0000\u025e"+ + "\u025f\u0007\n\u0000\u0000\u025f\u0260\u0007\u000b\u0000\u0000\u0260\u0261"+ + "\u0007\u0001\u0000\u0000\u0261\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005"+ + "@\u0000\u0000\u0263\u0264\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006"+ + "\u0000\u0000\u0265\u0266\u0007\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000"+ + "\u0000\u0267\u0268\u0005@\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000"+ + "\u0269\u026a\u0007\u001a\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000"+ + "\u026b\u026c\u0007\u0002\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d"+ + "\u026e\u0007\u0002\u0000\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f"+ + "\u0270\u0007\u000b\u0000\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271"+ + "\u0272\u0005@\u0000\u0000\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274"+ + "\u0007\u0007\u0000\u0000\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276"+ + "\u0007\u0003\u0000\u0000\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278"+ + "\u0007\u0003\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a"+ + "\u0007\u0005\u0000\u0000\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c"+ + "\u0007\u0002\u0000\u0000\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e"+ + "\u0007\u0000\u0000\u0000\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280"+ + "\u0007\u0003\u0000\u0000\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007"+ + "\u0006\u0000\u0000\u0282\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003"+ + "\u0000\u0000\u0284\u0285\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000"+ + "\u0000\u0286\u0287\u0001\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001"+ + "\u0000\u0288\u025d\u0001\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000"+ + "\u0000\u0288\u0267\u0001\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000"+ + "\u0000\u0288\u0282\u0001\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000"+ + "\u0000\u028a\u028b\u0006\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000"+ + "\u028c\u028d\u0005@\u0000\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e"+ + "\u028f\u0007\u0003\u0000\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290"+ + "\u0291\u0007\u0017\u0000\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292"+ + "\u0293\u0007\u000b\u0000\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294"+ + "\u0295\u0007\u0012\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296"+ + "\u0297\u0006\u000b\u0002\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298"+ + "#\u0001\u0000\u0000\u0000\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007"+ + "\u0003\u0000\u0000\u029b\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011"+ + "\u0000\u0000\u029d\u029e\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003"+ + "\u0000\u0000\u029f\u02a0\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017"+ + "\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b"+ + "\u0000\u0000\u02a3\u02a4\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012"+ + "\u0000\u0000\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001"+ + "\u0000\u02a7%\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9"+ + "\u02aa\u0007\u0011\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab"+ + "\u02ac\u0005@\u0000\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae"+ + "\u0007\u000e\u0000\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0"+ + "\u0007\r\u0000\u0000\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007"+ + "\u001b\u0000\u0000\u02b2\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@"+ + "\u0000\u0000\u02b4\u02b5\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000"+ + "\u0000\u02b6\u02b7\u0007\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000"+ + "\u02b8\u02b9\u0005@\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba"+ + "\u02bb\u0007\f\u0000\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd"+ + "\u0007\u0003\u0000\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0"+ + "\u0007\u000b\u0000\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab"+ + "\u0001\u0000\u0000\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3"+ + "\u0001\u0000\u0000\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1"+ + "\u0001\u0000\u0000\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006"+ + "\r\u0001\u0000\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000"+ + "\u0000\u02c5\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000"+ + "\u02c7\u02c8\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9"+ + "\u02ca\u0005@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc"+ + "\u0007\n\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007"+ + "\u0000\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011"+ + "\u0000\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000"+ + "\u0000\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e"+ + "\u0000\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000"+ + "\u0000\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000"+ + "\u02d8\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da"+ + "\u02db\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5"+ + "\u0007\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007"+ + "\r\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ + "\u0000\u0000\u02e1\u02e2\u0007\u0003\u0000\u0000\u02e2\u02e3\u0007\f\u0000"+ + "\u0000\u02e3\u02e5\u0007\u000b\u0000\u0000\u02e4\u02c4\u0001\u0000\u0000"+ + "\u0000\u02e4\u02c9\u0001\u0000\u0000\u0000\u02e4\u02ce\u0001\u0000\u0000"+ + "\u0000\u02e4\u02d6\u0001\u0000\u0000\u0000\u02e4\u02dd\u0001\u0000\u0000"+ + "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0006\u000e\u0001"+ + "\u0000\u02e7)\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005@\u0000\u0000\u02e9"+ + "\u02ea\u0007\r\u0000\u0000\u02ea\u02eb\u0007\u0006\u0000\u0000\u02eb\u02ec"+ + "\u0007\r\u0000\u0000\u02ec\u02ee\u0001\u0000\u0000\u0000\u02ed\u02ef\u0005"+ + " \u0000\u0000\u02ee\u02ed\u0001\u0000\u0000\u0000\u02ee\u02ef\u0001\u0000"+ + "\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1\u0004\u000f"+ + "\u0001\u0000\u02f1\u02f2\u0001\u0000\u0000\u0000\u02f2\u02f3\u0006\u000f"+ + "\u0003\u0000\u02f3\u02f4\u0006\u000f\u0000\u0000\u02f4+\u0001\u0000\u0000"+ + "\u0000\u02f5\u02f6\u0005@\u0000\u0000\u02f6\u02f7\u0007\r\u0000\u0000"+ + "\u02f7\u02f8\u0007\u0006\u0000\u0000\u02f8\u02f9\u0007\r\u0000\u0000\u02f9"+ + "\u02fa\u0001\u0000\u0000\u0000\u02fa\u02fb\u0006\u0010\u0004\u0000\u02fb"+ + "-\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005@\u0000\u0000\u02fd\u02fe\u0007"+ + "\u0003\u0000\u0000\u02fe\u02ff\u0007\f\u0000\u0000\u02ff\u0300\u0007\u0011"+ + "\u0000\u0000\u0300\u0301\u0001\u0000\u0000\u0000\u0301\u0302\u0003N!\u0000"+ + "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0011\u0000\u0000"+ + "\u0304\u0305\u0006\u0011\u0001\u0000\u0305/\u0001\u0000\u0000\u0000\u0306"+ + "\u0307\u0005@\u0000\u0000\u0307\u0308\u0007\t\u0000\u0000\u0308\u0309"+ + "\u0007\u0007\u0000\u0000\u0309\u030a\u0007\u001a\u0000\u0000\u030a\u030b"+ + "\u0007\u0003\u0000\u0000\u030b\u030c\u0007\b\u0000\u0000\u030c\u030d\u0007"+ + "\u0007\u0000\u0000\u030d\u030e\u0007\u0002\u0000\u0000\u030e\u030f\u0007"+ + "\u0003\u0000\u0000\u030f\u0310\u0007\n\u0000\u0000\u0310\u0311\u0007\u000b"+ + "\u0000\u0000\u0311\u0312\u0007\u000f\u0000\u0000\u0312\u0313\u0007\t\u0000"+ + "\u0000\u0313\u0314\u0007\u0003\u0000\u0000\u0314\u034a\u0007\n\u0000\u0000"+ + "\u0315\u0316\u0005@\u0000\u0000\u0316\u0317\u0007\u0017\u0000\u0000\u0317"+ + "\u0318\u0007\u000e\u0000\u0000\u0318\u0319\u0007\u0018\u0000\u0000\u0319"+ + "\u031a\u0007\n\u0000\u0000\u031a\u031b\u0007\u000b\u0000\u0000\u031b\u031c"+ + "\u0007\u000f\u0000\u0000\u031c\u031d\u0007\t\u0000\u0000\u031d\u031e\u0007"+ + "\u0003\u0000\u0000\u031e\u034a\u0007\n\u0000\u0000\u031f\u0320\u0005@"+ + "\u0000\u0000\u0320\u0321\u0007\t\u0000\u0000\u0321\u0322\u0007\u0007\u0000"+ + "\u0000\u0322\u0323\u0007\u001a\u0000\u0000\u0323\u0324\u0007\u0003\u0000"+ + "\u0000\u0324\u0325\u0007\b\u0000\u0000\u0325\u0326\u0007\u0007\u0000\u0000"+ + "\u0326\u0327\u0007\u0002\u0000\u0000\u0327\u0328\u0007\u0003\u0000\u0000"+ + "\u0328\u0329\u0007\n\u0000\u0000\u0329\u032a\u0007\u0005\u0000\u0000\u032a"+ + "\u032b\u0007\u0002\u0000\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c"+ + "\u032d\u0007\r\u0000\u0000\u032d\u032e\u0007\u000b\u0000\u0000\u032e\u034a"+ + "\u0007\n\u0000\u0000\u032f\u0330\u0005@\u0000\u0000\u0330\u0331\u0007"+ + "\u0017\u0000\u0000\u0331\u0332\u0007\u000e\u0000\u0000\u0332\u0333\u0007"+ + "\u0018\u0000\u0000\u0333\u0334\u0007\n\u0000\u0000\u0334\u0335\u0007\u0005"+ + "\u0000\u0000\u0335\u0336\u0007\u0002\u0000\u0000\u0336\u0337\u0007\u0007"+ + "\u0000\u0000\u0337\u0338\u0007\r\u0000\u0000\u0338\u0339\u0007\u000b\u0000"+ + "\u0000\u0339\u034a\u0007\n\u0000\u0000\u033a\u033b\u0005@\u0000\u0000"+ + "\u033b\u033c\u0007\u0005\u0000\u0000\u033c\u033d\u0007\t\u0000\u0000\u033d"+ + "\u033e\u0007\u0007\u0000\u0000\u033e\u033f\u0007\u0005\u0000\u0000\u033f"+ + "\u0340\u0007\u0018\u0000\u0000\u0340\u0346\u0001\u0000\u0000\u0000\u0341"+ + "\u0342\u0005.\u0000\u0000\u0342\u0343\u0007\u0004\u0000\u0000\u0343\u0344"+ + "\u0007\b\u0000\u0000\u0344\u0345\u0007\u0004\u0000\u0000\u0345\u0347\u0007"+ + "\u000f\u0000\u0000\u0346\u0341\u0001\u0000\u0000\u0000\u0346\u0347\u0001"+ + "\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000\u0000\u0348\u034a\u0005"+ + "=\u0000\u0000\u0349\u0306\u0001\u0000\u0000\u0000\u0349\u0315\u0001\u0000"+ + "\u0000\u0000\u0349\u031f\u0001\u0000\u0000\u0000\u0349\u032f\u0001\u0000"+ + "\u0000\u0000\u0349\u033a\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000"+ + "\u0000\u0000\u034b\u034c\u0006\u0012\u0001\u0000\u034c1\u0001\u0000\u0000"+ + "\u0000\u034d\u034e\u0005@\u0000\u0000\u034e\u034f\u0007\u001a\u0000\u0000"+ + "\u034f\u0350\u0007\u0007\u0000\u0000\u0350\u0351\u0007\u000b\u0000\u0000"+ + "\u0351\u0352\u0007\u0003\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000"+ + "\u0353\u0354\u0006\u0013\u0000\u0000\u0354\u0355\u0006\u0013\u0001\u0000"+ + "\u03553\u0001\u0000\u0000\u0000\u0356\u0357\u0005@\u0000\u0000\u0357\u0358"+ + "\u0003N!\u0000\u0358\u0359\u0004\u0014\u0002\u0000\u0359\u035a\u0001\u0000"+ + "\u0000\u0000\u035a\u035b\u0006\u0014\u0000\u0000\u035b5\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0005@\u0000\u0000\u035d\u035e\u0003N!\u0000\u035e"+ + "7\u0001\u0000\u0000\u0000\u035f\u0361\u0005@\u0000\u0000\u0360\u0362\u0007"+ + "\u001c\u0000\u0000\u0361\u0360\u0001\u0000\u0000\u0000\u0361\u0362\u0001"+ + "\u0000\u0000\u0000\u03629\u0001\u0000\u0000\u0000\u0363\u0364\u0005{\u0000"+ + "\u0000\u0364\u0365\u0005{\u0000\u0000\u0365\u0366\u0001\u0000\u0000\u0000"+ + "\u0366\u0367\u0006\u0017\u0005\u0000\u0367\u0368\u0006\u0017\u0006\u0000"+ + "\u0368;\u0001\u0000\u0000\u0000\u0369\u036a\u0005{\u0000\u0000\u036a\u036b"+ + "\u0005!\u0000\u0000\u036b\u036c\u0005!\u0000\u0000\u036c\u036d\u0001\u0000"+ + "\u0000\u0000\u036d\u036e\u0006\u0018\u0007\u0000\u036e\u036f\u0006\u0018"+ + "\b\u0000\u036f=\u0001\u0000\u0000\u0000\u0370\u0371\u0005/\u0000\u0000"+ + "\u0371\u0372\u0005*\u0000\u0000\u0372\u0376\u0001\u0000\u0000\u0000\u0373"+ + "\u0375\t\u0000\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375\u0378"+ + "\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0376\u0374"+ + "\u0001\u0000\u0000\u0000\u0377\u0379\u0001\u0000\u0000\u0000\u0378\u0376"+ + "\u0001\u0000\u0000\u0000\u0379\u037a\u0005*\u0000\u0000\u037a\u037e\u0005"+ + "/\u0000\u0000\u037b\u037c\u0005/\u0000\u0000\u037c\u037e\u0005/\u0000"+ + "\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000"+ + "\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u0380\u0006\u0019\t\u0000"+ + "\u0380?\u0001\u0000\u0000\u0000\u0381\u0382\u0005<\u0000\u0000\u0382\u0383"+ + "\u0007\u0016\u0000\u0000\u0383\u0384\u0005-\u0000\u0000\u0384\u0385\u0001"+ + "\u0000\u0000\u0000\u0385\u0391\u0003\u0014\u0004\u0000\u0386\u0387\u0005"+ + "<\u0000\u0000\u0387\u038c\u0003\u0014\u0004\u0000\u0388\u0389\u0005:\u0000"+ + "\u0000\u0389\u038a\u0005:\u0000\u0000\u038a\u038b\u0001\u0000\u0000\u0000"+ + "\u038b\u038d\u0003\u0014\u0004\u0000\u038c\u0388\u0001\u0000\u0000\u0000"+ + "\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000\u0000\u0000"+ + "\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0391\u0001\u0000\u0000\u0000"+ + "\u0390\u0381\u0001\u0000\u0000\u0000\u0390\u0386\u0001\u0000\u0000\u0000"+ + "\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0006\u001a\t\u0000\u0393"+ + "\u0394\u0006\u001a\n\u0000\u0394A\u0001\u0000\u0000\u0000\u0395\u0396"+ + "\u0005<\u0000\u0000\u0396\u0397\u0005/\u0000\u0000\u0397\u0398\u0001\u0000"+ + "\u0000\u0000\u0398\u0399\u0003R#\u0000\u0399\u039d\u0005>\u0000\u0000"+ + "\u039a\u039c\u0007\u001d\u0000\u0000\u039b\u039a\u0001\u0000\u0000\u0000"+ + "\u039c\u039f\u0001\u0000\u0000\u0000\u039d\u039b\u0001\u0000\u0000\u0000"+ + "\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a1\u0001\u0000\u0000\u0000"+ + "\u039f\u039d\u0001\u0000\u0000\u0000\u03a0\u0395\u0001\u0000\u0000\u0000"+ + "\u03a1\u03a2\u0001\u0000\u0000\u0000\u03a2\u03a0\u0001\u0000\u0000\u0000"+ + "\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000"+ + "\u03a4\u03a5\u0006\u001b\t\u0000\u03a5C\u0001\u0000\u0000\u0000\u03a6"+ + "\u03a8\u0005 \u0000\u0000\u03a7\u03a6\u0001\u0000\u0000\u0000\u03a8\u03a9"+ + "\u0001\u0000\u0000\u0000\u03a9\u03a7\u0001\u0000\u0000\u0000\u03a9\u03aa"+ + "\u0001\u0000\u0000\u0000\u03aa\u03c0\u0001\u0000\u0000\u0000\u03ab\u03ad"+ + "\u0007\u001e\u0000\u0000\u03ac\u03ab\u0001\u0000\u0000\u0000\u03ad\u03ae"+ + "\u0001\u0000\u0000\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000\u03ae\u03af"+ + "\u0001\u0000\u0000\u0000\u03af\u03c0\u0001\u0000\u0000\u0000\u03b0\u03c0"+ + "\u0003\u0014\u0004\u0000\u03b1\u03c0\u0003\u0016\u0005\u0000\u03b2\u03b3"+ + "\u0005\"\u0000\u0000\u03b3\u03c0\u0004\u001c\u0003\u0000\u03b4\u03b5\u0005"+ + "\\\u0000\u0000\u03b5\u03b6\u0005\'\u0000\u0000\u03b6\u03b7\u0001\u0000"+ + "\u0000\u0000\u03b7\u03c0\u0004\u001c\u0004\u0000\u03b8\u03c0\u0007\u001f"+ + "\u0000\u0000\u03b9\u03bb\u0007 \u0000\u0000\u03ba\u03b9\u0001\u0000\u0000"+ + "\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03ba\u0001\u0000\u0000"+ + "\u0000\u03bc\u03bd\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ + "\u0000\u03be\u03c0\u0007!\u0000\u0000\u03bf\u03a7\u0001\u0000\u0000\u0000"+ + "\u03bf\u03ac\u0001\u0000\u0000\u0000\u03bf\u03b0\u0001\u0000\u0000\u0000"+ + "\u03bf\u03b1\u0001\u0000\u0000\u0000\u03bf\u03b2\u0001\u0000\u0000\u0000"+ + "\u03bf\u03b4\u0001\u0000\u0000\u0000\u03bf\u03b8\u0001\u0000\u0000\u0000"+ + "\u03bf\u03ba\u0001\u0000\u0000\u0000\u03bf\u03be\u0001\u0000\u0000\u0000"+ + "\u03c0\u03c3\u0001\u0000\u0000\u0000\u03c1\u03bf\u0001\u0000\u0000\u0000"+ + "\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2\u03c4\u0001\u0000\u0000\u0000"+ + "\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005<\u0000\u0000\u03c5"+ + "\u03c6\u0004\u001c\u0005\u0000\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7"+ + "\u03c8\u0006\u001c\u000b\u0000\u03c8\u03c9\u0006\u001c\f\u0000\u03c9E"+ + "\u0001\u0000\u0000\u0000\u03ca\u03cc\u0005 \u0000\u0000\u03cb\u03ca\u0001"+ + "\u0000\u0000\u0000\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u03cb\u0001"+ + "\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03e6\u0001"+ + "\u0000\u0000\u0000\u03cf\u03d1\u0007\u001e\u0000\u0000\u03d0\u03cf\u0001"+ + "\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000\u0000\u0000\u03d2\u03d0\u0001"+ + "\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u03e6\u0001"+ + "\u0000\u0000\u0000\u03d4\u03d6\u0007\"\u0000\u0000\u03d5\u03d4\u0001\u0000"+ + "\u0000\u0000\u03d5\u03d6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0001\u0000"+ + "\u0000\u0000\u03d7\u03e6\u0003\u0014\u0004\u0000\u03d8\u03e6\u0003\u0016"+ + "\u0005\u0000\u03d9\u03da\u0005\"\u0000\u0000\u03da\u03e6\u0004\u001d\u0006"+ + "\u0000\u03db\u03e6\u0005,\u0000\u0000\u03dc\u03dd\u0005\\\u0000\u0000"+ + "\u03dd\u03e6\u0005\'\u0000\u0000\u03de\u03e6\u0007#\u0000\u0000\u03df"+ + "\u03e1\u0007 \u0000\u0000\u03e0\u03df\u0001\u0000\u0000\u0000\u03e1\u03e2"+ + "\u0001\u0000\u0000\u0000\u03e2\u03e0\u0001\u0000\u0000\u0000\u03e2\u03e3"+ + "\u0001\u0000\u0000\u0000\u03e3\u03e6\u0001\u0000\u0000\u0000\u03e4\u03e6"+ + "\u0007!\u0000\u0000\u03e5\u03cb\u0001\u0000\u0000\u0000\u03e5\u03d0\u0001"+ + "\u0000\u0000\u0000\u03e5\u03d5\u0001\u0000\u0000\u0000\u03e5\u03d8\u0001"+ + "\u0000\u0000\u0000\u03e5\u03d9\u0001\u0000\u0000\u0000\u03e5\u03db\u0001"+ + "\u0000\u0000\u0000\u03e5\u03dc\u0001\u0000\u0000\u0000\u03e5\u03de\u0001"+ + "\u0000\u0000\u0000\u03e5\u03e0\u0001\u0000\u0000\u0000\u03e5\u03e4\u0001"+ + "\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e5\u0001"+ + "\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03e9\u0001"+ + "\u0000\u0000\u0000\u03e9\u03ea\u0006\u001d\t\u0000\u03eaG\u0001\u0000"+ + "\u0000\u0000\u03eb\u03ed\u0005 \u0000\u0000\u03ec\u03eb\u0001\u0000\u0000"+ + "\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee\u03ec\u0001\u0000\u0000"+ + "\u0000\u03ee\u03ef\u0001\u0000\u0000\u0000\u03ef\u03f6\u0001\u0000\u0000"+ + "\u0000\u03f0\u03f2\u0007\u001e\u0000\u0000\u03f1\u03f0\u0001\u0000\u0000"+ + "\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000\u0000"+ + "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f6\u0001\u0000\u0000"+ + "\u0000\u03f5\u03ec\u0001\u0000\u0000\u0000\u03f5\u03f1\u0001\u0000\u0000"+ + "\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006\u001e\t\u0000"+ + "\u03f8I\u0001\u0000\u0000\u0000\u03f9\u03fa\u0005{\u0000\u0000\u03fa\u03ff"+ + "\u0005!\u0000\u0000\u03fb\u03fc\u0005{\u0000\u0000\u03fc\u03fd\u0005{"+ + "\u0000\u0000\u03fd\u03ff\u0005-\u0000\u0000\u03fe\u03f9\u0001\u0000\u0000"+ + "\u0000\u03fe\u03fb\u0001\u0000\u0000\u0000\u03ff\u0400\u0001\u0000\u0000"+ + "\u0000\u0400\u0401\u0006\u001f\t\u0000\u0401K\u0001\u0000\u0000\u0000"+ + "\u0402\u0403\t\u0000\u0000\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404"+ + "\u0405\u0006 \t\u0000\u0405M\u0001\u0000\u0000\u0000\u0406\u040a\u0007"+ + "\u0014\u0000\u0000\u0407\u0409\u0007$\u0000\u0000\u0408\u0407\u0001\u0000"+ + "\u0000\u0000\u0409\u040c\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000"+ + "\u0000\u0000\u040a\u040b\u0001\u0000\u0000\u0000\u040bO\u0001\u0000\u0000"+ + "\u0000\u040c\u040a\u0001\u0000\u0000\u0000\u040d\u0411\u0007%\u0000\u0000"+ + "\u040e\u0410\u0007&\u0000\u0000\u040f\u040e\u0001\u0000\u0000\u0000\u0410"+ + "\u0413\u0001\u0000\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0411"+ + "\u0412\u0001\u0000\u0000\u0000\u0412Q\u0001\u0000\u0000\u0000\u0413\u0411"+ + "\u0001\u0000\u0000\u0000\u0414\u0418\u0007\u0014\u0000\u0000\u0415\u0417"+ + "\u0007\'\u0000\u0000\u0416\u0415\u0001\u0000\u0000\u0000\u0417\u041a\u0001"+ + "\u0000\u0000\u0000\u0418\u0416\u0001\u0000\u0000\u0000\u0418\u0419\u0001"+ + "\u0000\u0000\u0000\u0419S\u0001\u0000\u0000\u0000\u041a\u0418\u0001\u0000"+ + "\u0000\u0000\u041b\u041c\u0007(\u0000\u0000\u041cU\u0001\u0000\u0000\u0000"+ + "\u041d\u0422\u0005\"\u0000\u0000\u041e\u0421\u0003T$\u0000\u041f\u0421"+ + "\t\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u041f\u0001"+ + "\u0000\u0000\u0000\u0421\u0424\u0001\u0000\u0000\u0000\u0422\u0423\u0001"+ + "\u0000\u0000\u0000\u0422\u0420\u0001\u0000\u0000\u0000\u0423\u0425\u0001"+ + "\u0000\u0000\u0000\u0424\u0422\u0001\u0000\u0000\u0000\u0425\u0426\u0005"+ + "\"\u0000\u0000\u0426W\u0001\u0000\u0000\u0000\u0427\u042d\u0005\'\u0000"+ + "\u0000\u0428\u042c\b)\u0000\u0000\u0429\u042a\u0005\\\u0000\u0000\u042a"+ + "\u042c\t\u0000\u0000\u0000\u042b\u0428\u0001\u0000\u0000\u0000\u042b\u0429"+ + "\u0001\u0000\u0000\u0000\u042c\u042f\u0001\u0000\u0000\u0000\u042d\u042b"+ + "\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u0430"+ + "\u0001\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u0430\u0431"+ + "\u0005\'\u0000\u0000\u0431Y\u0001\u0000\u0000\u0000\u0432\u0433\u0005"+ + "/\u0000\u0000\u0433\u0434\u0005/\u0000\u0000\u0434\u0438\u0001\u0000\u0000"+ + "\u0000\u0435\u0437\b\u001e\u0000\u0000\u0436\u0435\u0001\u0000\u0000\u0000"+ + "\u0437\u043a\u0001\u0000\u0000\u0000\u0438\u0436\u0001\u0000\u0000\u0000"+ + "\u0438\u0439\u0001\u0000\u0000\u0000\u0439[\u0001\u0000\u0000\u0000\u043a"+ + "\u0438\u0001\u0000\u0000\u0000\u043b\u043c\u0005$\u0000\u0000\u043c\u043d"+ + "\u0003N!\u0000\u043d]\u0001\u0000\u0000\u0000\u043e\u043f\u0007\u0004"+ + "\u0000\u0000\u043f\u0440\u0007\u0002\u0000\u0000\u0440\u0441\u0007\u0002"+ + "\u0000\u0000\u0441\u0442\u0007\u0004\u0000\u0000\u0442\u0451\u0007\u000f"+ + "\u0000\u0000\u0443\u0444\u0007\u0005\u0000\u0000\u0444\u0445\u0007\t\u0000"+ + "\u0000\u0445\u0446\u0007\u0004\u0000\u0000\u0446\u0447\u0007\n\u0000\u0000"+ + "\u0447\u0451\u0007\n\u0000\u0000\u0448\u0449\u0007\u0003\u0000\u0000\u0449"+ + "\u044a\u0007\u0012\u0000\u0000\u044a\u044b\u0007\r\u0000\u0000\u044b\u044c"+ + "\u0007\u000b\u0000\u0000\u044c\u0451\u0007\u000f\u0000\u0000\u044d\u044e"+ + "\u0007\u000e\u0000\u0000\u044e\u044f\u0007\n\u0000\u0000\u044f\u0451\u0007"+ + "\u0003\u0000\u0000\u0450\u043e\u0001\u0000\u0000\u0000\u0450\u0443\u0001"+ + "\u0000\u0000\u0000\u0450\u0448\u0001\u0000\u0000\u0000\u0450\u044d\u0001"+ + "\u0000\u0000\u0000\u0451_\u0001\u0000\u0000\u0000\u0452\u0453\u000209"+ + "\u0000\u0453a\u0001\u0000\u0000\u0000\u0454\u0455\u0005{\u0000\u0000\u0455"+ + "\u0456\u0005{\u0000\u0000\u0456\u0457\u0005-\u0000\u0000\u0457\u0458\u0005"+ + "-\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006+\r"+ + "\u0000\u045ac\u0001\u0000\u0000\u0000\u045b\u045c\u0005@\u0000\u0000\u045c"+ + "\u045d\u0003R#\u0000\u045d\u045e\u0005.\u0000\u0000\u045e\u045f\u0001"+ + "\u0000\u0000\u0000\u045f\u0460\u0006,\t\u0000\u0460e\u0001\u0000\u0000"+ + "\u0000\u0461\u0466\u0005@\u0000\u0000\u0462\u0464\u0003`*\u0000\u0463"+ + "\u0465\u0005.\u0000\u0000\u0464\u0463\u0001\u0000\u0000\u0000\u0464\u0465"+ + "\u0001\u0000\u0000\u0000\u0465\u0467\u0001\u0000\u0000\u0000\u0466\u0462"+ + "\u0001\u0000\u0000\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0466"+ + "\u0001\u0000\u0000\u0000\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a"+ + "\u0001\u0000\u0000\u0000\u046a\u046b\u0006-\t\u0000\u046bg\u0001\u0000"+ + "\u0000\u0000\u046c\u046d\u0005{\u0000\u0000\u046d\u046e\u0005{\u0000\u0000"+ + "\u046e\u054b\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ + "\u0005@\u0000\u0000\u0471\u0473\u0001\u0000\u0000\u0000\u0472\u0474\u0005"+ + "@\u0000\u0000\u0473\u0472\u0001\u0000\u0000\u0000\u0473\u0474\u0001\u0000"+ + "\u0000\u0000\u0474\u054b\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ + "\u0000\u0476\u0477\u0005{\u0000\u0000\u0477\u0479\u0001\u0000\u0000\u0000"+ + "\u0478\u047a\u0005{\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u0479"+ + "\u047a\u0001\u0000\u0000\u0000\u047a\u054b\u0001\u0000\u0000\u0000\u047b"+ + "\u047c\u0005@\u0000\u0000\u047c\u047d\u0007\u0012\u0000\u0000\u047d\u047e"+ + "\u0007\u0003\u0000\u0000\u047e\u047f\u0007\u0011\u0000\u0000\u047f\u0480"+ + "\u0007\u0007\u0000\u0000\u0480\u0481\u0007\u0004\u0000\u0000\u0481\u0485"+ + "\u0001\u0000\u0000\u0000\u0482\u0484\u0007*\u0000\u0000\u0483\u0482\u0001"+ + "\u0000\u0000\u0000\u0484\u0487\u0001\u0000\u0000\u0000\u0485\u0483\u0001"+ + "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0489\u0001"+ + "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0488\u048a\u0005"+ + "(\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u0489\u048a\u0001\u0000"+ + "\u0000\u0000\u048a\u054b\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ + "\u0000\u048c\u048d\u0007\u0005\u0000\u0000\u048d\u048e\u0007\u0006\u0000"+ + "\u0000\u048e\u048f\u0007\u0004\u0000\u0000\u048f\u0490\u0007\u0002\u0000"+ + "\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u0003\u0000\u0000"+ + "\u0492\u0493\u0007\u000b\u0000\u0000\u0493\u0497\u0001\u0000\u0000\u0000"+ + "\u0494\u0496\u0007*\u0000\u0000\u0495\u0494\u0001\u0000\u0000\u0000\u0496"+ + "\u0499\u0001\u0000\u0000\u0000\u0497\u0495\u0001\u0000\u0000\u0000\u0497"+ + "\u0498\u0001\u0000\u0000\u0000\u0498\u054b\u0001\u0000\u0000\u0000\u0499"+ + "\u0497\u0001\u0000\u0000\u0000\u049a\u049b\u0005@\u0000\u0000\u049b\u049c"+ + "\u0007\u0007\u0000\u0000\u049c\u049d\u0007\u0012\u0000\u0000\u049d\u049e"+ + "\u0007\r\u0000\u0000\u049e\u049f\u0007\u0001\u0000\u0000\u049f\u04a0\u0007"+ + "\u0002\u0000\u0000\u04a0\u04a1\u0007\u000b\u0000\u0000\u04a1\u04a5\u0001"+ + "\u0000\u0000\u0000\u04a2\u04a4\u0007*\u0000\u0000\u04a3\u04a2\u0001\u0000"+ + "\u0000\u0000\u04a4\u04a7\u0001\u0000\u0000\u0000\u04a5\u04a3\u0001\u0000"+ + "\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000\u04a6\u054b\u0001\u0000"+ + "\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000\u0000\u04a8\u04a9\u0005@\u0000"+ + "\u0000\u04a9\u04aa\u0007\f\u0000\u0000\u04aa\u04ab\u0007\u0004\u0000\u0000"+ + "\u04ab\u04ac\u0007\u0012\u0000\u0000\u04ac\u04ad\u0007\u0003\u0000\u0000"+ + "\u04ad\u04ae\u0007\n\u0000\u0000\u04ae\u04af\u0007\r\u0000\u0000\u04af"+ + "\u04b0\u0007\u0004\u0000\u0000\u04b0\u04b1\u0007\u0005\u0000\u0000\u04b1"+ + "\u04b2\u0007\u0003\u0000\u0000\u04b2\u04b6\u0001\u0000\u0000\u0000\u04b3"+ + "\u04b5\u0007*\u0000\u0000\u04b4\u04b3\u0001\u0000\u0000\u0000\u04b5\u04b8"+ + "\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6\u04b7"+ + "\u0001\u0000\u0000\u0000\u04b7\u054b\u0001\u0000\u0000\u0000\u04b8\u04b6"+ + "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005@\u0000\u0000\u04ba\u04bb\u0007"+ + "\u0011\u0000\u0000\u04bb\u04bc\u0007\u0001\u0000\u0000\u04bc\u04bd\u0007"+ + "\u0005\u0000\u0000\u04bd\u04be\u0007\u000e\u0000\u0000\u04be\u04bf\u0007"+ + "\u0012\u0000\u0000\u04bf\u04c0\u0007\u0003\u0000\u0000\u04c0\u04c1\u0007"+ + "\f\u0000\u0000\u04c1\u04c2\u0007\u000b\u0000\u0000\u04c2\u04c6\u0001\u0000"+ + "\u0000\u0000\u04c3\u04c5\u0007*\u0000\u0000\u04c4\u04c3\u0001\u0000\u0000"+ + "\u0000\u04c5\u04c8\u0001\u0000\u0000\u0000\u04c6\u04c4\u0001\u0000\u0000"+ + "\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7\u054b\u0001\u0000\u0000"+ + "\u0000\u04c8\u04c6\u0001\u0000\u0000\u0000\u04c9\u04ca\u0005@\u0000\u0000"+ + "\u04ca\u04cb\u0007\u0000\u0000\u0000\u04cb\u04cc\u0007\u0001\u0000\u0000"+ + "\u04cc\u04cd\u0007\f\u0000\u0000\u04cd\u04ce\u0007\u000b\u0000\u0000\u04ce"+ + "\u04cf\u0005-\u0000\u0000\u04cf\u04d0\u0007\u0000\u0000\u0000\u04d0\u04d1"+ + "\u0007\u0004\u0000\u0000\u04d1\u04d2\u0007\u0005\u0000\u0000\u04d2\u04d3"+ + "\u0007\u0003\u0000\u0000\u04d3\u04d7\u0001\u0000\u0000\u0000\u04d4\u04d6"+ + "\u0007*\u0000\u0000\u04d5\u04d4\u0001\u0000\u0000\u0000\u04d6\u04d9\u0001"+ + "\u0000\u0000\u0000\u04d7\u04d5\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ + "\u0000\u0000\u0000\u04d8\u054b\u0001\u0000\u0000\u0000\u04d9\u04d7\u0001"+ + "\u0000\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0007\r"+ + "\u0000\u0000\u04dc\u04dd\u0007\u0004\u0000\u0000\u04dd\u04de\u0007\u0010"+ + "\u0000\u0000\u04de\u04df\u0007\u0003\u0000\u0000\u04df\u04e3\u0001\u0000"+ + "\u0000\u0000\u04e0\u04e2\u0007*\u0000\u0000\u04e1\u04e0\u0001\u0000\u0000"+ + "\u0000\u04e2\u04e5\u0001\u0000\u0000\u0000\u04e3\u04e1\u0001\u0000\u0000"+ + "\u0000\u04e3\u04e4\u0001\u0000\u0000\u0000\u04e4\u054b\u0001\u0000\u0000"+ + "\u0000\u04e5\u04e3\u0001\u0000\u0000\u0000\u04e6\u04e7\u0005@\u0000\u0000"+ + "\u04e7\u04e8\u0007\n\u0000\u0000\u04e8\u04e9\u0007\u000e\u0000\u0000\u04e9"+ + "\u04ea\u0007\r\u0000\u0000\u04ea\u04eb\u0007\r\u0000\u0000\u04eb\u04ec"+ + "\u0007\u0001\u0000\u0000\u04ec\u04ed\u0007\u0002\u0000\u0000\u04ed\u04ee"+ + "\u0007\u000b\u0000\u0000\u04ee\u04ef\u0007\n\u0000\u0000\u04ef\u04f3\u0001"+ + "\u0000\u0000\u0000\u04f0\u04f2\u0007*\u0000\u0000\u04f1\u04f0\u0001\u0000"+ + "\u0000\u0000\u04f2\u04f5\u0001\u0000\u0000\u0000\u04f3\u04f1\u0001\u0000"+ + "\u0000\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u054b\u0001\u0000"+ + "\u0000\u0000\u04f5\u04f3\u0001\u0000\u0000\u0000\u04f6\u04f7\u0005@\u0000"+ + "\u0000\u04f7\u04f8\u0007\t\u0000\u0000\u04f8\u04f9\u0007\u0004\u0000\u0000"+ + "\u04f9\u04fa\u0007\u000f\u0000\u0000\u04fa\u04fb\u0007\u0003\u0000\u0000"+ + "\u04fb\u04fc\u0007\u0002\u0000\u0000\u04fc\u0500\u0001\u0000\u0000\u0000"+ + "\u04fd\u04ff\u0007*\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04ff"+ + "\u0502\u0001\u0000\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0500"+ + "\u0501\u0001\u0000\u0000\u0000\u0501\u054b\u0001\u0000\u0000\u0000\u0502"+ + "\u0500\u0001\u0000\u0000\u0000\u0503\u0504\u0005@\u0000\u0000\u0504\u0505"+ + "\u0007\u000b\u0000\u0000\u0505\u0506\u0007\u0004\u0000\u0000\u0506\u0507"+ + "\u0007\u0007\u0000\u0000\u0507\u0508\u0007\t\u0000\u0000\u0508\u0509\u0007"+ + "\b\u0000\u0000\u0509\u050a\u0007\u0007\u0000\u0000\u050a\u050b\u0007\f"+ + "\u0000\u0000\u050b\u050c\u0007\u0011\u0000\u0000\u050c\u0510\u0001\u0000"+ + "\u0000\u0000\u050d\u050f\u0007*\u0000\u0000\u050e\u050d\u0001\u0000\u0000"+ + "\u0000\u050f\u0512\u0001\u0000\u0000\u0000\u0510\u050e\u0001\u0000\u0000"+ + "\u0000\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u054b\u0001\u0000\u0000"+ + "\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0513\u0514\u0005@\u0000\u0000"+ + "\u0514\u0515\u0007\u0004\u0000\u0000\u0515\u0516\u0007\r\u0000\u0000\u0516"+ + "\u0517\u0007\r\u0000\u0000\u0517\u0518\u0007\t\u0000\u0000\u0518\u0519"+ + "\u0007\u000f\u0000\u0000\u0519\u051d\u0001\u0000\u0000\u0000\u051a\u051c"+ + "\u0007*\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u051f\u0001"+ + "\u0000\u0000\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051d\u051e\u0001"+ + "\u0000\u0000\u0000\u051e\u054b\u0001\u0000\u0000\u0000\u051f\u051d\u0001"+ + "\u0000\u0000\u0000\u0520\u0521\u0005@\u0000\u0000\u0521\u0522\u0005-\u0000"+ + "\u0000\u0522\u0523\u0007\b\u0000\u0000\u0523\u0524\u0007\u0003\u0000\u0000"+ + "\u0524\u0525\u0007\u0017\u0000\u0000\u0525\u0526\u0007\u0018\u0000\u0000"+ + "\u0526\u0527\u0007\u0007\u0000\u0000\u0527\u0528\u0007\u000b\u0000\u0000"+ + "\u0528\u0529\u0005-\u0000\u0000\u0529\u052a\u0007\u0018\u0000\u0000\u052a"+ + "\u052b\u0007\u0003\u0000\u0000\u052b\u052c\u0007\u000f\u0000\u0000\u052c"+ + "\u052d\u0007\u0000\u0000\u0000\u052d\u052e\u0007\u0002\u0000\u0000\u052e"+ + "\u052f\u0007\u0004\u0000\u0000\u052f\u0530\u0007\u0012\u0000\u0000\u0530"+ + "\u0531\u0007\u0003\u0000\u0000\u0531\u0532\u0007\n\u0000\u0000\u0532\u0536"+ + "\u0001\u0000\u0000\u0000\u0533\u0535\u0007*\u0000\u0000\u0534\u0533\u0001"+ + "\u0000\u0000\u0000\u0535\u0538\u0001\u0000\u0000\u0000\u0536\u0534\u0001"+ + "\u0000\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537\u054b\u0001"+ + "\u0000\u0000\u0000\u0538\u0536\u0001\u0000\u0000\u0000\u0539\u053a\u0005"+ + "@\u0000\u0000\u053a\u053b\u0007\u0018\u0000\u0000\u053b\u053c\u0007\u0003"+ + "\u0000\u0000\u053c\u053d\u0007\u000f\u0000\u0000\u053d\u053e\u0007\u0000"+ + "\u0000\u0000\u053e\u053f\u0007\u0002\u0000\u0000\u053f\u0540\u0007\u0004"+ + "\u0000\u0000\u0540\u0541\u0007\u0012\u0000\u0000\u0541\u0542\u0007\u0003"+ + "\u0000\u0000\u0542\u0543\u0007\n\u0000\u0000\u0543\u0547\u0001\u0000\u0000"+ + "\u0000\u0544\u0546\u0007*\u0000\u0000\u0545\u0544\u0001\u0000\u0000\u0000"+ + "\u0546\u0549\u0001\u0000\u0000\u0000\u0547\u0545\u0001\u0000\u0000\u0000"+ + "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u054b\u0001\u0000\u0000\u0000"+ + "\u0549\u0547\u0001\u0000\u0000\u0000\u054a\u046c\u0001\u0000\u0000\u0000"+ + "\u054a\u046f\u0001\u0000\u0000\u0000\u054a\u0475\u0001\u0000\u0000\u0000"+ + "\u054a\u047b\u0001\u0000\u0000\u0000\u054a\u048b\u0001\u0000\u0000\u0000"+ + "\u054a\u049a\u0001\u0000\u0000\u0000\u054a\u04a8\u0001\u0000\u0000\u0000"+ + "\u054a\u04b9\u0001\u0000\u0000\u0000\u054a\u04c9\u0001\u0000\u0000\u0000"+ + "\u054a\u04da\u0001\u0000\u0000\u0000\u054a\u04e6\u0001\u0000\u0000\u0000"+ + "\u054a\u04f6\u0001\u0000\u0000\u0000\u054a\u0503\u0001\u0000\u0000\u0000"+ + "\u054a\u0513\u0001\u0000\u0000\u0000\u054a\u0520\u0001\u0000\u0000\u0000"+ + "\u054a\u0539\u0001\u0000\u0000\u0000\u054b\u054c\u0001\u0000\u0000\u0000"+ + "\u054c\u054d\u0006.\t\u0000\u054di\u0001\u0000\u0000\u0000\u054e\u054f"+ + "\t\u0000\u0000\u0000\u054f\u0550\u0004/\u0007\u0000\u0550\u0551\u0001"+ + "\u0000\u0000\u0000\u0551\u0552\u0006/\u000e\u0000\u0552\u0553\u0006/\u000f"+ + "\u0000\u0553k\u0001\u0000\u0000\u0000\u0554\u0555\t\u0000\u0000\u0000"+ + "\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u00060\f\u0000\u0557"+ + "m\u0001\u0000\u0000\u0000\u0558\u0559\u0005\u0000\u0000\u0001\u0559\u055a"+ + "\u0001\u0000\u0000\u0000\u055a\u055b\u00061\u000e\u0000\u055b\u055c\u0006"+ + "1\u000f\u0000\u055co\u0001\u0000\u0000\u0000\u055d\u055e\u0005}\u0000"+ + "\u0000\u055e\u055f\u0005}\u0000\u0000\u055f\u0560\u0001\u0000\u0000\u0000"+ + "\u0560\u0561\u00062\u000f\u0000\u0561\u0562\u00062\u0006\u0000\u0562q"+ + "\u0001\u0000\u0000\u0000\u0563\u0564\u0003\f\u0000\u0000\u0564\u0565\u0006"+ + "3\u0010\u0000\u0565s\u0001\u0000\u0000\u0000\u0566\u0569\u0003X&\u0000"+ + "\u0567\u0569\u0003\u0012\u0003\u0000\u0568\u0566\u0001\u0000\u0000\u0000"+ + "\u0568\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000"+ + "\u056a\u056b\u00064\u0011\u0000\u056bu\u0001\u0000\u0000\u0000\u056c\u056d"+ + "\u0005:\u0000\u0000\u056d\u0570\u0005)\u0000\u0000\u056e\u0570\u0005:"+ + "\u0000\u0000\u056f\u056c\u0001\u0000\u0000\u0000\u056f\u056e\u0001\u0000"+ + "\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u00065\u0012"+ + "\u0000\u0572w\u0001\u0000\u0000\u0000\u0573\u0575\b+\u0000\u0000\u0574"+ + "\u0573\u0001\u0000\u0000\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576"+ + "\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577"+ + "\u0578\u0001\u0000\u0000\u0000\u0578\u0579\u00066\u0013\u0000\u0579y\u0001"+ + "\u0000\u0000\u0000\u057a\u057e\t\u0000\u0000\u0000\u057b\u057d\u0007*"+ + "\u0000\u0000\u057c\u057b\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000"+ + "\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000"+ + "\u0000\u0000\u057f\u0581\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000"+ + "\u0000\u0000\u0581\u0582\u00067\u0014\u0000\u0582{\u0001\u0000\u0000\u0000"+ + "\u0583\u0584\u0005\u0000\u0000\u0001\u0584\u0585\u0001\u0000\u0000\u0000"+ + "\u0585\u0586\u00068\u0015\u0000\u0586\u0587\u00068\u000f\u0000\u0587}"+ + "\u0001\u0000\u0000\u0000\u0588\u0589\u0005!\u0000\u0000\u0589\u058a\u0005"+ + "!\u0000\u0000\u058a\u058b\u0005}\u0000\u0000\u058b\u058c\u0001\u0000\u0000"+ + "\u0000\u058c\u058d\u00069\u000f\u0000\u058d\u058e\u00069\b\u0000\u058e"+ + "\u007f\u0001\u0000\u0000\u0000\u058f\u0590\u0003\f\u0000\u0000\u0590\u0591"+ + "\u0006:\u0016\u0000\u0591\u0081\u0001\u0000\u0000\u0000\u0592\u0595\u0003"+ + "X&\u0000\u0593\u0595\u0003\u0012\u0003\u0000\u0594\u0592\u0001\u0000\u0000"+ + "\u0000\u0594\u0593\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000"+ + "\u0000\u0596\u0597\u0006;\u0017\u0000\u0597\u0083\u0001\u0000\u0000\u0000"+ + "\u0598\u0599\u0005:\u0000\u0000\u0599\u059c\u0005)\u0000\u0000\u059a\u059c"+ + "\u0005:\u0000\u0000\u059b\u0598\u0001\u0000\u0000\u0000\u059b\u059a\u0001"+ + "\u0000\u0000\u0000\u059c\u059d\u0001\u0000\u0000\u0000\u059d\u059e\u0006"+ + "<\u0012\u0000\u059e\u0085\u0001\u0000\u0000\u0000\u059f\u05a1\b,\u0000"+ + "\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000"+ + "\u0000\u05a2\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ + "\u0000\u05a3\u05a4\u0001\u0000\u0000\u0000\u05a4\u05a5\u0006=\u0018\u0000"+ + "\u05a5\u0087\u0001\u0000\u0000\u0000\u05a6\u05aa\t\u0000\u0000\u0000\u05a7"+ + "\u05a9\u0007*\u0000\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000\u05a9\u05ac"+ + "\u0001\u0000\u0000\u0000\u05aa\u05a8\u0001\u0000\u0000\u0000\u05aa\u05ab"+ + "\u0001\u0000\u0000\u0000\u05ab\u05ad\u0001\u0000\u0000\u0000\u05ac\u05aa"+ + "\u0001\u0000\u0000\u0000\u05ad\u05ae\u0006>\u0019\u0000\u05ae\u0089\u0001"+ + "\u0000\u0000\u0000\u05af\u05b0\u0005\u0000\u0000\u0001\u05b0\u05b1\u0001"+ + "\u0000\u0000\u0000\u05b1\u05b2\u0006?\u0015\u0000\u05b2\u05b3\u0006?\u000f"+ + "\u0000\u05b3\u008b\u0001\u0000\u0000\u0000\u05b4\u05b6\u0007*\u0000\u0000"+ + "\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000"+ + "\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000"+ + "\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba\u0004@\b\u0000\u05ba"+ + "\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bc\u0006@\u001a\u0000\u05bc\u008d"+ + "\u0001\u0000\u0000\u0000\u05bd\u05be\u0005(\u0000\u0000\u05be\u05bf\u0006"+ + "A\u001b\u0000\u05bf\u05c0\u0001\u0000\u0000\u0000\u05c0\u05c1\u0006A\f"+ + "\u0000\u05c1\u05c2\u0006A\u001a\u0000\u05c2\u008f\u0001\u0000\u0000\u0000"+ + "\u05c3\u05c4\u0003N!\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000\u05c5\u05c6"+ + "\u0006B\u0015\u0000\u05c6\u05c7\u0006B\u000f\u0000\u05c7\u0091\u0001\u0000"+ + "\u0000\u0000\u05c8\u05c9\t\u0000\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000"+ + "\u0000\u05ca\u05cb\u0006C\u0015\u0000\u05cb\u05cc\u0006C\u000f\u0000\u05cc"+ + "\u0093\u0001\u0000\u0000\u0000\u05cd\u05ce\u0004D\t\u0000\u05ce\u05cf"+ + "\u0005(\u0000\u0000\u05cf\u05d0\u0006D\u001c\u0000\u05d0\u05d1\u0006D"+ + "\u001d\u0000\u05d1\u0095\u0001\u0000\u0000\u0000\u05d2\u05d3\u0004E\n"+ + "\u0000\u05d3\u05d4\u0005)\u0000\u0000\u05d4\u05d5\u0006E\u001e\u0000\u05d5"+ + "\u05d6\u0001\u0000\u0000\u0000\u05d6\u05d7\u0006E\u001f\u0000\u05d7\u05d8"+ + "\u0006E \u0000\u05d8\u0097\u0001\u0000\u0000\u0000\u05d9\u05da\u0004F"+ + "\u000b\u0000\u05da\u05db\u0005(\u0000\u0000\u05db\u05dc\u0006F!\u0000"+ + "\u05dc\u05dd\u0006F\"\u0000\u05dd\u0099\u0001\u0000\u0000\u0000\u05de"+ + "\u05df\u0004G\f\u0000\u05df\u05e0\u0005)\u0000\u0000\u05e0\u05e1\u0006"+ + "G#\u0000\u05e1\u05e2\u0006G$\u0000\u05e2\u009b\u0001\u0000\u0000\u0000"+ + "\u05e3\u05e4\u0005)\u0000\u0000\u05e4\u05e5\u0004H\r\u0000\u05e5\u05e6"+ + "\u0001\u0000\u0000\u0000\u05e6\u05e7\u0006H\u001f\u0000\u05e7\u05e8\u0006"+ + "H \u0000\u05e8\u009d\u0001\u0000\u0000\u0000\u05e9\u05ea\u0005\"\u0000"+ + "\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0006I\f\u0000"+ + "\u05ec\u05ed\u0006I%\u0000\u05ed\u009f\u0001\u0000\u0000\u0000\u05ee\u05ef"+ + "\u0005?\u0000\u0000\u05ef\u05f0\u0005:\u0000\u0000\u05f0\u05f1\u0001\u0000"+ + "\u0000\u0000\u05f1\u05f2\u0006J&\u0000\u05f2\u00a1\u0001\u0000\u0000\u0000"+ + "\u05f3\u05f4\u0005:\u0000\u0000\u05f4\u05f5\u0005:\u0000\u0000\u05f5\u05f6"+ + "\u0001\u0000\u0000\u0000\u05f6\u05f7\u0006K\'\u0000\u05f7\u00a3\u0001"+ + "\u0000\u0000\u0000\u05f8\u05fc\u0003X&\u0000\u05f9\u05fb\u0005 \u0000"+ + "\u0000\u05fa\u05f9\u0001\u0000\u0000\u0000\u05fb\u05fe\u0001\u0000\u0000"+ + "\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000"+ + "\u0000\u05fd\u05ff\u0001\u0000\u0000\u0000\u05fe\u05fc\u0001\u0000\u0000"+ + "\u0000\u05ff\u0600\u0006L(\u0000\u0600\u00a5\u0001\u0000\u0000\u0000\u0601"+ + "\u0602\u0005:\u0000\u0000\u0602\u0603\u0004M\u000e\u0000\u0603\u0604\u0001"+ + "\u0000\u0000\u0000\u0604\u0605\u0006M\u0012\u0000\u0605\u00a7\u0001\u0000"+ + "\u0000\u0000\u0606\u0607\u0005:\u0000\u0000\u0607\u0608\u0001\u0000\u0000"+ + "\u0000\u0608\u0609\u0006N\u0012\u0000\u0609\u00a9\u0001\u0000\u0000\u0000"+ + "\u060a\u060b\u0005/\u0000\u0000\u060b\u060c\u0005*\u0000\u0000\u060c\u0610"+ + "\u0001\u0000\u0000\u0000\u060d\u060f\t\u0000\u0000\u0000\u060e\u060d\u0001"+ + "\u0000\u0000\u0000\u060f\u0612\u0001\u0000\u0000\u0000\u0610\u0611\u0001"+ + "\u0000\u0000\u0000\u0610\u060e\u0001\u0000\u0000\u0000\u0611\u0613\u0001"+ + "\u0000\u0000\u0000\u0612\u0610\u0001\u0000\u0000\u0000\u0613\u0614\u0005"+ + "*\u0000\u0000\u0614\u0615\u0005/\u0000\u0000\u0615\u0616\u0001\u0000\u0000"+ + "\u0000\u0616\u0617\u0006O\u0012\u0000\u0617\u00ab\u0001\u0000\u0000\u0000"+ + "\u0618\u0619\t\u0000\u0000\u0000\u0619\u061a\u0006P)\u0000\u061a\u00ad"+ + "\u0001\u0000\u0000\u0000\u061b\u061c\u0005\u0000\u0000\u0001\u061c\u061d"+ + "\u0001\u0000\u0000\u0000\u061d\u061e\u0006Q\u0015\u0000\u061e\u061f\u0006"+ + "Q \u0000\u061f\u00af\u0001\u0000\u0000\u0000\u0620\u0621\u0005@\u0000"+ + "\u0000\u0621\u0622\u0007\u0003\u0000\u0000\u0622\u0623\u0007\f\u0000\u0000"+ + "\u0623\u0624\u0007\u0011\u0000\u0000\u0624\u0625\u0007\r\u0000\u0000\u0625"+ + "\u0626\u0007\u0006\u0000\u0000\u0626\u0627\u0007\r\u0000\u0000\u0627\u0628"+ + "\u0001\u0000\u0000\u0000\u0628\u0629\u0006R\u000f\u0000\u0629\u00b1\u0001"+ + "\u0000\u0000\u0000\u062a\u062b\t\u0000\u0000\u0000\u062b\u062c\u0004S"+ + "\u000f\u0000\u062c\u062d\u0001\u0000\u0000\u0000\u062d\u062e\u0006S*\u0000"+ + "\u062e\u00b3\u0001\u0000\u0000\u0000\u062f\u0630\t\u0000\u0000\u0000\u0630"+ + "\u0631\u0001\u0000\u0000\u0000\u0631\u0632\u0006T\f\u0000\u0632\u00b5"+ + "\u0001\u0000\u0000\u0000\u0633\u0634\u0005\u0000\u0000\u0001\u0634\u0635"+ + "\u0001\u0000\u0000\u0000\u0635\u0636\u0006U\u0015\u0000\u0636\u0637\u0006"+ + "U\u000f\u0000\u0637\u00b7\u0001\u0000\u0000\u0000\u0638\u0639\u0005@\u0000"+ + "\u0000\u0639\u063a\u0007\u0003\u0000\u0000\u063a\u063b\u0007\f\u0000\u0000"+ + "\u063b\u063c\u0007\u0011\u0000\u0000\u063c\u063d\u0007\u001a\u0000\u0000"+ + "\u063d\u063e\u0007\u0003\u0000\u0000\u063e\u063f\u0007\u0002\u0000\u0000"+ + "\u063f\u0640\u0007\u0017\u0000\u0000\u0640\u0641\u0007\u0004\u0000\u0000"+ + "\u0641\u0642\u0007\u000b\u0000\u0000\u0642\u0643\u0007\u0007\u0000\u0000"+ + "\u0643\u0644\u0007\u0012\u0000\u0000\u0644\u0645\u0001\u0000\u0000\u0000"+ + "\u0645\u0646\u0006V\u0001\u0000\u0646\u0647\u0006V\u000f\u0000\u0647\u00b9"+ + "\u0001\u0000\u0000\u0000\u0648\u0649\t\u0000\u0000\u0000\u0649\u064a\u0004"+ + "W\u0010\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0006W\t"+ + "\u0000\u064c\u00bb\u0001\u0000\u0000\u0000\u064d\u064e\t\u0000\u0000\u0000"+ + "\u064e\u064f\u0001\u0000\u0000\u0000\u064f\u0650\u0006X\f\u0000\u0650"+ + "\u00bd\u0001\u0000\u0000\u0000\u0651\u0652\u0005\u0000\u0000\u0001\u0652"+ + "\u0653\u0001\u0000\u0000\u0000\u0653\u0654\u0006Y\u0015\u0000\u0654\u0655"+ + "\u0006Y\u000f\u0000\u0655\u00bf\u0001\u0000\u0000\u0000\u0656\u0657\u0005"+ + ":\u0000\u0000\u0657\u0658\u0003R#\u0000\u0658\u0659\u0005=\u0000\u0000"+ + "\u0659\u065a\u0005\"\u0000\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b"+ + "\u065c\u0006Z\t\u0000\u065c\u065d\u0006Z+\u0000\u065d\u00c1\u0001\u0000"+ + "\u0000\u0000\u065e\u065f\u0005{\u0000\u0000\u065f\u0660\u0005{\u0000\u0000"+ + "\u0660\u0661\u0001\u0000\u0000\u0000\u0661\u0662\u0006[\u0005\u0000\u0662"+ + "\u0663\u0006[\u0006\u0000\u0663\u00c3\u0001\u0000\u0000\u0000\u0664\u0665"+ + "\u0005{\u0000\u0000\u0665\u0666\u0005!\u0000\u0000\u0666\u0667\u0005!"+ + "\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0669\u0006\\\u0007"+ + "\u0000\u0669\u066a\u0006\\\b\u0000\u066a\u00c5\u0001\u0000\u0000\u0000"+ + "\u066b\u066c\u0005>\u0000\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d"+ + "\u066e\u0006]\t\u0000\u066e\u066f\u0006]\u000f\u0000\u066f\u00c7\u0001"+ + "\u0000\u0000\u0000\u0670\u0671\t\u0000\u0000\u0000\u0671\u0672\u0001\u0000"+ + "\u0000\u0000\u0672\u0673\u0006^\t\u0000\u0673\u00c9\u0001\u0000\u0000"+ + "\u0000\u0674\u0675\u0005\u0000\u0000\u0001\u0675\u0676\u0001\u0000\u0000"+ + "\u0000\u0676\u0677\u0006_\u0015\u0000\u0677\u0678\u0006_\u000f\u0000\u0678"+ + "\u00cb\u0001\u0000\u0000\u0000\u0679\u067a\u0005\"\u0000\u0000\u067a\u067b"+ + "\u0001\u0000\u0000\u0000\u067b\u067c\u0006`\t\u0000\u067c\u067d\u0006"+ + "`\u000f\u0000\u067d\u00cd\u0001\u0000\u0000\u0000\u067e\u067f\t\u0000"+ + "\u0000\u0000\u067f\u0680\u0004a\u0011\u0000\u0680\u0681\u0001\u0000\u0000"+ + "\u0000\u0681\u0682\u0006a\u001f\u0000\u0682\u00cf\u0001\u0000\u0000\u0000"+ + "\u0683\u0684\t\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685"+ + "\u0686\u0006b\f\u0000\u0686\u00d1\u0001\u0000\u0000\u0000\u0687\u0688"+ + "\u0005\u0000\u0000\u0001\u0688\u0689\u0001\u0000\u0000\u0000\u0689\u068a"+ + "\u0006c\u0015\u0000\u068a\u068b\u0006c\u000f\u0000\u068b\u00d3\u0001\u0000"+ + "\u0000\u0000\u068c\u068e\u0003\f\u0000\u0000\u068d\u068f\u0005$\u0000"+ + "\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000\u0000"+ + "\u0000\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0691\u0003R#\u0000\u0691"+ + "\u0692\u0005}\u0000\u0000\u0692\u0693\u0001\u0000\u0000\u0000\u0693\u0694"+ + "\u0006d\f\u0000\u0694\u00d5\u0001\u0000\u0000\u0000\u0695\u0696\u0003"+ + "\f\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u0698\u0006e"+ + "\f\u0000\u0698\u00d7\u0001\u0000\u0000\u0000\u0699\u069b\u0005{\u0000"+ + "\u0000\u069a\u069c\u0007)\u0000\u0000\u069b\u069a\u0001\u0000\u0000\u0000"+ + "\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000"+ + "\u069d\u069f\u0003R#\u0000\u069e\u06a0\u0007)\u0000\u0000\u069f\u069e"+ + "\u0001\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a2"+ + "\u0001\u0000\u0000\u0000\u06a1\u06a3\u0005:\u0000\u0000\u06a2\u06a1\u0001"+ + "\u0000\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a2\u0001"+ + "\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000\u0000\u06a5\u06a7\u0001"+ + "\u0000\u0000\u0000\u06a6\u06a8\u0007)\u0000\u0000\u06a7\u06a6\u0001\u0000"+ + "\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06aa\u0001\u0000"+ + "\u0000\u0000\u06a9\u06ab\u0003R#\u0000\u06aa\u06a9\u0001\u0000\u0000\u0000"+ + "\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab\u06ad\u0001\u0000\u0000\u0000"+ + "\u06ac\u06ae\u0007)\u0000\u0000\u06ad\u06ac\u0001\u0000\u0000\u0000\u06ad"+ + "\u06ae\u0001\u0000\u0000\u0000\u06ae\u06c5\u0001\u0000\u0000\u0000\u06af"+ + "\u06b1\u0005,\u0000\u0000\u06b0\u06b2\u0007)\u0000\u0000\u06b1\u06b0\u0001"+ + "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b3\u0001"+ + "\u0000\u0000\u0000\u06b3\u06b5\u0003R#\u0000\u06b4\u06b6\u0007)\u0000"+ + "\u0000\u06b5\u06b4\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ + "\u0000\u06b6\u06b8\u0001\u0000\u0000\u0000\u06b7\u06b9\u0005:\u0000\u0000"+ + "\u06b8\u06b7\u0001\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000"+ + "\u06ba\u06b8\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000"+ + "\u06bb\u06bd\u0001\u0000\u0000\u0000\u06bc\u06be\u0007)\u0000\u0000\u06bd"+ + "\u06bc\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be"+ + "\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c1\u0003R#\u0000\u06c0\u06c2\u0007"+ + ")\u0000\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000"+ + "\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06af\u0001\u0000"+ + "\u0000\u0000\u06c4\u06c7\u0001\u0000\u0000\u0000\u06c5\u06c3\u0001\u0000"+ + "\u0000\u0000\u06c5\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c9\u0001\u0000"+ + "\u0000\u0000\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c8\u06ca\u0005,\u0000"+ + "\u0000\u06c9\u06c8\u0001\u0000\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000"+ + "\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb\u06cc\u0005}\u0000\u0000"+ + "\u06cc\u06cd\u0001\u0000\u0000\u0000\u06cd\u06ce\u0006f\f\u0000\u06ce"+ + "\u00d9\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005{\u0000\u0000\u06d0\u06d1"+ + "\u0005$\u0000\u0000\u06d1\u06da\u0003R#\u0000\u06d2\u06d3\u0005[\u0000"+ + "\u0000\u06d3\u06d4\u0007)\u0000\u0000\u06d4\u06d5\u0003R#\u0000\u06d5"+ + "\u06d6\u0007)\u0000\u0000\u06d6\u06d7\u0005]\u0000\u0000\u06d7\u06d9\u0001"+ + "\u0000\u0000\u0000\u06d8\u06d2\u0001\u0000\u0000\u0000\u06d9\u06dc\u0001"+ + "\u0000\u0000\u0000\u06da\u06d8\u0001\u0000\u0000\u0000\u06da\u06db\u0001"+ + "\u0000\u0000\u0000\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06da\u0001"+ + "\u0000\u0000\u0000\u06dd\u06de\u0005:\u0000\u0000\u06de\u06df\u0005:\u0000"+ + "\u0000\u06df\u06e0\u0001\u0000\u0000\u0000\u06e0\u06e1\u0003R#\u0000\u06e1"+ + "\u06e2\u0005}\u0000\u0000\u06e2\u06e3\u0001\u0000\u0000\u0000\u06e3\u06e4"+ + "\u0006g\f\u0000\u06e4\u00db\u0001\u0000\u0000\u0000\u06e5\u06e6\u0005"+ + "{\u0000\u0000\u06e6\u06e7\u0005$\u0000\u0000\u06e7\u06f1\u0003R#\u0000"+ + "\u06e8\u06e9\u0005[\u0000\u0000\u06e9\u06eb\u0007)\u0000\u0000\u06ea\u06ec"+ + "\u0003R#\u0000\u06eb\u06ea\u0001\u0000\u0000\u0000\u06eb\u06ec\u0001\u0000"+ + "\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0007)\u0000"+ + "\u0000\u06ee\u06f0\u0005]\u0000\u0000\u06ef\u06e8\u0001\u0000\u0000\u0000"+ + "\u06f0\u06f3\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001\u0000\u0000\u0000"+ + "\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06fb\u0001\u0000\u0000\u0000"+ + "\u06f3\u06f1\u0001\u0000\u0000\u0000\u06f4\u06f5\u0005:\u0000\u0000\u06f5"+ + "\u06f7\u0005:\u0000\u0000\u06f6\u06f4\u0001\u0000\u0000\u0000\u06f7\u06f8"+ + "\u0001\u0000\u0000\u0000\u06f8\u06f6\u0001\u0000\u0000\u0000\u06f8\u06f9"+ + "\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fc"+ + "\u0003R#\u0000\u06fb\u06f6\u0001\u0000\u0000\u0000\u06fb\u06fc\u0001\u0000"+ + "\u0000\u0000\u06fc\u0701\u0001\u0000\u0000\u0000\u06fd\u06ff\u0005:\u0000"+ + "\u0000\u06fe\u0700\u0003R#\u0000\u06ff\u06fe\u0001\u0000\u0000\u0000\u06ff"+ + "\u0700\u0001\u0000\u0000\u0000\u0700\u0702\u0001\u0000\u0000\u0000\u0701"+ + "\u06fd\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703"+ + "\u0701\u0001\u0000\u0000\u0000\u0703\u0704\u0001\u0000\u0000\u0000\u0704"+ + "\u0705\u0001\u0000\u0000\u0000\u0705\u0706\u0005}\u0000\u0000\u0706\u070a"+ + "\u0001\u0000\u0000\u0000\u0707\u0708\u0005:\u0000\u0000\u0708\u070a\u0005"+ + "$\u0000\u0000\u0709\u06e5\u0001\u0000\u0000\u0000\u0709\u0707\u0001\u0000"+ + "\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u070c\u0006h\u0015"+ + "\u0000\u070c\u00dd\u0001\u0000\u0000\u0000\u070d\u070e\u0005\\\u0000\u0000"+ + "\u070e\u070f\u0005\"\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ + "\u0711\u0006i\f\u0000\u0711\u00df\u0001\u0000\u0000\u0000\u0712\u0713"+ + "\u0005\"\u0000\u0000\u0713\u0714\u0001\u0000\u0000\u0000\u0714\u0715\u0006"+ + "j\f\u0000\u0715\u0716\u0006j\u000f\u0000\u0716\u00e1\u0001\u0000\u0000"+ + "\u0000\u0717\u0718\t\u0000\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000"+ + "\u0719\u071a\u0006k\f\u0000\u071a\u00e3\u0001\u0000\u0000\u0000\u071b"+ + "\u071c\u0005\u0000\u0000\u0001\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ + "\u071e\u0006l\u0015\u0000\u071e\u071f\u0006l\u000f\u0000\u071f\u00e5\u0001"+ + "\u0000\u0000\u0000\u0720\u0721\u0005-\u0000\u0000\u0721\u0722\u0005-\u0000"+ + "\u0000\u0722\u0723\u0005}\u0000\u0000\u0723\u0724\u0005}\u0000\u0000\u0724"+ + "\u0725\u0001\u0000\u0000\u0000\u0725\u0726\u0006m\u000f\u0000\u0726\u00e7"+ + "\u0001\u0000\u0000\u0000\u0727\u0728\t\u0000\u0000\u0000\u0728\u0729\u0004"+ + "n\u0012\u0000\u0729\u072a\u0001\u0000\u0000\u0000\u072a\u072b\u0006n,"+ + "\u0000\u072b\u00e9\u0001\u0000\u0000\u0000\u072c\u072d\t\u0000\u0000\u0000"+ + "\u072d\u072e\u0001\u0000\u0000\u0000\u072e\u072f\u0006o\f\u0000\u072f"+ + "\u00eb\u0001\u0000\u0000\u0000\u0730\u0731\u0005\u0000\u0000\u0001\u0731"+ + "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006p,\u0000\u0733\u0734\u0006"+ + "p\u000f\u0000\u0734\u00ed\u0001\u0000\u0000\u0000u\u0000\u0001\u0002\u0003"+ + "\u0004\u0005\u0006\u0007\b\t\n\u000b\u00f5\u00ff\u013c\u015b\u0177\u0181"+ + "\u0183\u018c\u0198\u01a6\u01ac\u01ae\u01cc\u023e\u0243\u0259\u0288\u02bf"+ + "\u02e4\u02ee\u0346\u0349\u0361\u0376\u037d\u038e\u0390\u039d\u03a2\u03a9"+ + "\u03ae\u03bc\u03bf\u03c1\u03cd\u03d2\u03d5\u03e2\u03e5\u03e7\u03ee\u03f3"+ + "\u03f5\u03fe\u040a\u0411\u0418\u0420\u0422\u042b\u042d\u0438\u0450\u0464"+ + "\u0468\u0473\u0479\u0485\u0489\u0497\u04a5\u04b6\u04c6\u04d7\u04e3\u04f3"+ + "\u0500\u0510\u051d\u0536\u0547\u054a\u0568\u056f\u0576\u057e\u0594\u059b"+ + "\u05a2\u05aa\u05b7\u05fc\u0610\u068e\u069b\u069f\u06a4\u06a7\u06aa\u06ad"+ + "\u06b1\u06b5\u06ba\u06bd\u06c1\u06c5\u06c9\u06da\u06eb\u06f1\u06f8\u06fb"+ + "\u06ff\u0703\u0709-\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ + "\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0005\u0000"+ + "\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005\b\u0000\u0005"+ + "\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007\u0000\u0004"+ + "\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u00016\u0002"+ + "\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006\u0001"+ + ">\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b\u0007"+ + "\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001G\u000f"+ + "\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013\u0000"+ + "\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 new file mode 100644 index 000000000000..a88de8e22777 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -0,0 +1,473 @@ +lexer grammar BladeAntlrLexer; +import BladeCommonLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; +} + +options { + superClass = LexerAdaptor; + caseInsensitive = true; +} + +tokens { + PHP_EXPRESSION, + PHP_VARIABLE, + PHP_KEYWORD, + PHP_NEW, + PHP_IDENTIFIER, + PHP_NAMESPACE_PATH, + PHP_STATIC_ACCESS, + PHP_CLASS_KEYWORD, + PHP_INSTANCE_ACCESS, + BLADE_PARAM_EXTRA, + BLADE_PARAM_LPAREN, + BLADE_PARAM_RPAREN, + BLADE_EXPR_LPAREN, + BLADE_EXPR_RPAREN, + BL_SQ_LPAREN, + BL_SQ_LRAREN, + BL_PARAM_STRING, + BL_PARAM_ASSIGN, + BL_COMMA, + BL_PARAM_COMMA, + PHP_EXPR_STRING, + ERROR +} + +channels { COMMENT, PHP_CODE } + +fragment CompomentIdentifier + : [a-z\u0080-\ufffe][a-z0-9-_.:\u0080-\ufffe]*; + +fragment CssSelector + : ('#' | '.')? [a-z\u0080-\ufffe][a-z0-9-_:\u0080-\ufffe]* | CssAttrSelector; + +fragment JsFunctionStart + : NameString '(' NameString* (',' (' ')* NameString)* (' ')* ')' (' ')* ('{' { this._input.LA(1) != '{'}?)?; + +fragment StringParam + : [\\'] CssSelector ((' ')* CssSelector)* [\\'] | '"' CssSelector ((' ')* CssSelector)* [\\'] '"'; + +fragment CssAttrSelector + : '[' FullIdentifier (EQ StringAttrValue)? ']'; + +fragment StringAttrValue + : '"' FullIdentifier '"' | [\\'] FullIdentifier [\\']; +//RULES + + +//conditionals +D_IF : '@if'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ELSEIF : '@elseif'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ELSE : '@else'; +D_ENDIF : '@endif'; +D_SWITCH : '@switch'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_CASE : '@case'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_DEFAULT : '@default'; +D_ENDSWITCH : '@endswitch'; + +D_EMPTY : '@empty'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ENDEMPTY : '@endempty'; + +D_COND_BLOCK_START : ('@unless' | '@isset')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_COND_BLOCK_END : ('@endunless' | '@endisset'); + +//loops +D_FOREACH : '@foreach'->pushMode(FOREACH_LOOP_EXPRESSION); +D_ENDFOREACH : '@endforeach'; +D_FOR : '@for'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ENDFOR : '@endfor'; +D_FORELSE : '@forelse'->pushMode(FOREACH_LOOP_EXPRESSION); +D_ENDFORELSE : '@endforelse'; +D_WHILE : '@while'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ENDWHILE : '@endwhile'; +D_BREAK : '@break'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_LOOP_ACTION : ('@continue')->pushMode(LOOK_FOR_PHP_EXPRESSION); + +//includes +D_INCLUDE : '@include'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_IF : '@includeIf'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_WHEN : '@includeWhen'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_FIRST : '@includeFirst'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_UNLESS : '@includeUnless'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_EACH : '@each'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +//layout +D_EXTENDS : '@extends'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +//from livewire (converts variable to javascript syntax) +D_JS : '@js'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +//safe json_encode +D_JSON : '@json'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +D_SECTION : '@section'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_HAS_SECTION : '@hasSection'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_SECTION_MISSING : '@sectionMissing'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDSECTION : '@endsection'; +D_YIELD : '@yield'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PARENT : '@parent'; +D_SHOW : '@show'; +D_OVERWRITE : '@overwrite'; +D_STOP : '@stop'; +D_APPEND : '@append'; +D_ONCE : '@once'; +D_ENDONCE : '@endonce'; +D_STACK : '@stack'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PUSH : '@push'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPUSH : '@endpush'; +D_PUSH_IF : '@pushIf'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPUSH_IF : '@endPushIf'; +D_PUSH_ONCE : '@pushOnce'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPUSH_ONCE : '@endPushOnce'; +D_PREPEND : '@prepend'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPREPEND : '@endprepend'; +D_PROPS : '@props'->pushMode(LOOK_FOR_PHP_EXPRESSION); + +D_FRAGMENT : '@fragment'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ENDFRAGMENT : '@endfragment'; + +//forms +D_CSRF : '@csrf'; +D_METHOD : '@method'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ERROR : '@error'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ENDERROR : '@enderror'; + +//env +D_PRODUCTION : '@production'; +D_ENDPRODUCTION : '@endproduction'; +D_ENV : '@env'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDENV : '@endenv'; + +//auth and roles +D_AUTH_START : ('@auth' | '@guest')->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_AUTH_END : ('@endauth' | '@endguest'); + +//lazy parser +D_PERMISSION_START : '@can' ('not' | 'any')?->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_PERMISSION_ELSE : '@elsecan' ('not' | 'any')?->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_PERMISSION_END : '@endcan' ('not' |'any')?; + +//styles, attributes +D_CLASS : '@class'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_STYLE : '@style'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_HTML_ATTR_EXPR : ('@checked' | '@disabled' | '@readonly' | '@required' | '@selected')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_AWARE : '@aware'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +//misc +D_SESSION : '@session'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ENDSESSION : '@endsession'; + +D_DD : ('@dd' | '@dump')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_LANG : '@lang'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +//php injection +D_USE : '@use'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INJECT : '@inject'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_PHP : '@php' {this._input.LA(1) == ' ' || this._input.LA(1) == '\r' || this._input.LA(1) == '\n'}?->pushMode(BLADE_INLINE_PHP); + +D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE); +D_ENDVERBATIM : '@endverbatim'; + +//known plugins +D_LIVEWIRE : '@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@livewire'; +D_ASSET_BUNDLER : '@vite'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +D_MISC : '@viteReactRefresh'; + +//we will decide that a custom directive has expression to avoid email matching +D_CUSTOM : ('@' NameString {this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '(')}? ) ->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +D_UNKNOWN_ATTR_ENC : '@' NameString {this._input.LA(1) == '"'}?; +D_UNKNOWN : '@' NameString {this._input.LA(1) != '"'}?; + +//display +CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO); +RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO); + +AT : '@'->type(HTML); +//for completion +RAW_TAG_START : '{!'->type(HTML); + +PHP_INLINE_START : ('pushMode(INSIDE_PHP_INLINE); + + + +HTML_COMPONENT_PREFIX : ''}? ->type(HTML_COMPONENT_PREFIX); +JS_SCRIPT : ('$'? '(' StringParam | FullIdentifier ')' ('.' NameString)? | JsFunctionStart ('.' JsFunctionStart)*) ->skip; +HTML_TAG_START : '<' FullIdentifier; +HTML_CLOSE_TAG : ('')+ ->skip; +HTML_TAG_SELF_CLOSE : '/>' {this.compomentTagOpen = false;}->type(HTML); +HTML_CLOSE_SYMBOL : '>' {this.compomentTagOpen = false;} ->type(HTML); +STRING_PATH : ('"' HTML_PATH* '"' | [\\'] HTML_PATH [\\'])->skip; +HTML_PATH : (' ')* FullIdentifier ('/' FullIdentifier)+ ('.' NameString)? ('?' NameString (EQ NameString)*)? ->skip; +HTML_TEXT : (' ')* FullIdentifier ((' ')+ FullIdentifier)+ ->skip; + + +HTML_IDENTIFIER : FullIdentifier {this.consumeHtmlIdentifier();}; + +EQ : '='; +WS : ((' ')+ | [\r\n]+)->skip; +OTHER : . ->skip; + +/** +* MODES +* +*/ + +// {{ }} +mode INSIDE_REGULAR_ECHO; + +REGULAR_ECHO_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +REGULAR_ECHO_KEYWORD : PhpKeyword->type(PHP_KEYWORD); + +REGULAR_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); +REGULAR_ECHO_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +REGULAR_ECHO_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +CONTENT_TAG_CLOSE : ('}}')->popMode; +REGULAR_ECHO_LPAREN : '(' ->type(BLADE_EXPR_LPAREN); +REGULAR_ECHO_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); +REGULAR_ECHO_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); + +//not treated +REGULAR_ECHO_EXPR_MORE : . ->skip; +EXIT_REGULAR_ECHO_EOF : EOF->type(ERROR),popMode; + +// {!! !!} +mode INSIDE_RAW_ECHO; + +RAW_ECHO_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +RAW_ECHO_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +RAW_ECHO_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); +RAW_ECHO_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +RAW_ECHO_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +RAW_TAG_CLOSE : ('!!}')->popMode; +RAW_ECHO_LPAREN : '(' ->type(BLADE_EXPR_LPAREN); +RAW_ECHO_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); +RAW_ECHO_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); + +//NOT TREATED +RAW_ECHO_EXPR_MORE : . ->skip; +EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; + +mode LOOK_FOR_PHP_EXPRESSION; + +WS_EXPR_ESCAPE : [ ]+ {this._input.LA(1) == '@'}?->skip, popMode; +WS_EXPR : [ ]+->skip; +OPEN_EXPR_PAREN_MORE : '(' ->more,pushMode(INSIDE_PHP_EXPRESSION); + +L_OHTER_ESCAPE : . {this._input.LA(1) == '@'}?->type(HTML), popMode; +L_OTHER : . ->type(HTML), popMode; + +//{{}}, @if, @foreach +mode INSIDE_PHP_EXPRESSION; + +OPEN_EXPR_PAREN : {this.roundParenBalance == 0}? '(' {this.increaseRoundParenBalance();} ->more; +CLOSE_EXPR_PAREN : {this.roundParenBalance == 1}? ')' + {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +LPAREN : {this.roundParenBalance > 0}? '(' {this.increaseRoundParenBalance();}->more; +RPAREN : {this.roundParenBalance > 0}? ')' {this.decreaseRoundParenBalance();}->more; + +//in case of lexer restart context +EXIT_RPAREN : ')' {this.roundParenBalance == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +PHP_EXPRESSION_MORE : . ->more; + +EXIT_EOF : EOF->type(ERROR),popMode; + +//@if +mode LOOK_FOR_PHP_COMPOSED_EXPRESSION; + +WS_COMPOSED_EXPR : [ ]+->skip; +BLADE_EXPR_LPAREN : '(' {this.roundParenBalance = 0;} ->pushMode(INSIDE_PHP_COMPOSED_EXPRESSION); + +L_COMPOSED_EXPR_OTHER : . ->type(HTML), popMode; + +//{{}}, @if, @foreach +mode INSIDE_PHP_COMPOSED_EXPRESSION; + +EXPR_SQ_LPAREN : '[' {this.squareParenBalance++;}->type(BL_SQ_LPAREN); +EXPR_SQ_RPAREN : ']' {this.squareParenBalance--;}->type(BL_SQ_RPAREN); + +EXPR_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->type(PHP_EXPRESSION); +EXPR_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->type(PHP_EXPRESSION); + +EXPR_STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); + +COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +COMPOSED_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); +COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); + +COMPOSED_EXPR_LPAREN : '(' {this.increaseRoundParenBalance();}->type(BLADE_EXPR_LPAREN); +COMPOSED_EXPR_RPAREN : ')' {consumeExprRParen();}; + +//not treated +PHP_COMPOSED_EXPRESSION : . ->skip; + +EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(ERROR),popMode; + +//@section, @include etc +mode LOOK_FOR_BLADE_PARAMETERS; + +WS_BL_PARAM : [ ]+->skip; +OPEN_BL_PARAM_PAREN_MORE : '(' {this.roundParenBalance = 0;} ->type(BLADE_PARAM_LPAREN),pushMode(INSIDE_BLADE_PARAMETERS); + +L_BL_PARAM_OTHER : . ->type(HTML), popMode; + +mode FOREACH_LOOP_EXPRESSION; + +FOREACH_WS_EXPR : [ ]+->skip; +FOREACH_LOOP_LPAREN : '(' {this.increaseRoundParenBalance();}; +FOREACH_LOOP_RPAREN : ')' {this.decreaseRoundParenBalance(); if (this.roundParenBalance == 0){this.popMode();}}; + +FOREACH_AS : 'as'; + +FOREACH_PHP_VARIABLE : PhpVariable->type(PHP_VARIABLE); + +FOREACH_PARAM_ASSIGN : '=>'; + +LOOP_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_EXPRESSION); + +LOOP_NAME_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT | NameString)->type(PHP_EXPRESSION); + +LOOP_STATIC_ACCESS : '::'->type(PHP_EXPRESSION); + +LOOP_PHP_EXPRESSION : . ->type(PHP_EXPRESSION); +FOREACH_EOF : EOF->type(ERROR),popMode; +//( ) +mode INSIDE_BLADE_PARAMETERS; + +BL_PARAM_LINE_COMMENT : LineComment->channel(COMMENT); + +BL_SQ_LPAREN : '[' {this.squareParenBalance++;}; +BL_SQ_RPAREN : ']' {this.squareParenBalance--;}; + +BL_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->type(BLADE_PARAM_EXTRA); +BL_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->type(BLADE_PARAM_EXTRA); + +BL_PARAM_LPAREN : '(' {this.increaseRoundParenBalance();}->type(BLADE_PARAM_EXTRA); +BL_PARAM_RPAREN : ')' {consumeParamRParen();}; + +BL_PARAM_STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +BL_PARAM_PHP_VARIABLE : PhpVariable->type(PHP_VARIABLE); + +BL_PARAM_ASSIGN : '=>'; + +BL_PARAM_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); + +BL_PARAM_CONCAT_OPERATOR : '.'; + +BL_COMMA_EL : ',' {this.consumeBladeParamComma();}; + +BL_PARAM_WS : [ \t\r\n]+->skip; + +BL_NAME_STRING : NameString; + +BL_PARAM_MORE : . ->type(BLADE_PARAM_EXTRA); + +BL_PARAM_EXIT_EOF : EOF->type(ERROR),popMode; + +//@php @endphp +mode BLADE_INLINE_PHP; + +PHP_D_BLADE_COMMENT : ('//' ~[\n\r]+)->skip; +PHP_D_BLADE_ML_COMMENT : '/*' .*? '*/' [\n\r]*->skip; + +D_ENDPHP : '@endphp'->popMode; +PHP_D_UNKNOWN : '@'->type(HTML),popMode; + +//hack to merge all php inputs into one token +PHP_D_EXPR_SQ_LPAREN : '[' ->type(PHP_EXPRESSION); +PHP_D_EXPR_SQ_RPAREN : ']' ->type(PHP_EXPRESSION); + +PHP_D_EXPR_CURLY_LPAREN : '{' ->type(PHP_EXPRESSION); +PHP_D_EXPR_CURLY_RPAREN : '}' ->type(PHP_EXPRESSION); + +PHP_D_EXPR_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT)->type(PHP_EXPR_STRING); + +//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); + +PHP_D_COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +PHP_D_NEW : 'new' {this._input.LA(1) == ' '}? ->type(PHP_NEW); +PHP_D_CLASS : 'class' ->type(PHP_CLASS_KEYWORD); + +PHP_D_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); + +PHP_D_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); + +PHP_D_COMPOSED_EXPR_PHP_CLASS_IDENTIFIER : '\\' NameString->type(PHP_IDENTIFIER); +PHP_D_COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +PHP_D_COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); + +PHP_D_COMPOSED_EXPR_LPAREN : '('->type(BLADE_EXPR_LPAREN); +PHP_D_COMPOSED_EXPR_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); +PHP_D_WS : ' ' ->skip; + +PHP_D_EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(ERROR),popMode; + +//untreated +PHP_D_PHP_COMPOSED_EXPRESSION : . ->skip; + +//php inline +//might think to skip tokens which are not used ?? +mode INSIDE_PHP_INLINE; + +PHP_EXIT : '?>'->popMode; + +PHP_INLINE_COMMENT : ('//' ~[\n\r]+)->skip; +PHP_INLINE_ML_COMMENT : ('/*' .*? '*/')->skip; +//hack to merge all php inputs into one token +PHP_EXPR_SQ_LPAREN : '[' ->type(PHP_EXPRESSION); +PHP_EXPR_SQ_RPAREN : ']' ->type(PHP_EXPRESSION); + +PHP_EXPR_CURLY_LPAREN : '{' ->type(PHP_EXPRESSION); +PHP_EXPR_CURLY_RPAREN : '}' ->type(PHP_EXPRESSION); + +PHP_EXPR_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT)->type(PHP_EXPR_STRING); + +//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); + +PHP_COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +PHP_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +PHP_COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +PHP_COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +//need to implement alias access +PHP_COMPOSED_EXPR_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); + +PHP_COMPOSED_EXPR_LPAREN : '('->type(BLADE_EXPR_LPAREN); +PHP_COMPOSED_EXPR_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); + + +PHP_EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(PHP_EXPRESSION),popMode; + +PHP_PHP_COMPOSED_EXPRESSION : . ->type(PHP_EXPRESSION); + +mode VERBATIM_MODE; + +D_ENDVERBATIM_IN_MODE : '@endverbatim'->type(D_ENDVERBATIM), mode(DEFAULT_MODE); + +//hack to merge all php inputs into one token +VERBATIM_HTML : . { + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + }? ->skip; + + +EXIT_VERBATIM_MOD_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); + +VERBATIM_HTML_MORE : . ->more; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java new file mode 100644 index 000000000000..daa06d403dde --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -0,0 +1,2583 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrLexer extends LexerAdaptor { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + PHP_EXPRESSION=1, PHP_VARIABLE=2, PHP_KEYWORD=3, PHP_NEW=4, PHP_IDENTIFIER=5, + PHP_NAMESPACE_PATH=6, PHP_STATIC_ACCESS=7, PHP_CLASS_KEYWORD=8, PHP_INSTANCE_ACCESS=9, + BLADE_PARAM_EXTRA=10, BLADE_PARAM_LPAREN=11, BLADE_PARAM_RPAREN=12, BLADE_EXPR_LPAREN=13, + BLADE_EXPR_RPAREN=14, BL_SQ_LPAREN=15, BL_SQ_LRAREN=16, BL_PARAM_STRING=17, + BL_PARAM_ASSIGN=18, BL_COMMA=19, BL_PARAM_COMMA=20, PHP_EXPR_STRING=21, + ERROR=22, HTML=23, BLADE_COMMENT=24, D_IF=25, D_ELSEIF=26, D_ELSE=27, + D_ENDIF=28, D_SWITCH=29, D_CASE=30, D_DEFAULT=31, D_ENDSWITCH=32, D_EMPTY=33, + D_ENDEMPTY=34, D_COND_BLOCK_START=35, D_COND_BLOCK_END=36, D_FOREACH=37, + D_ENDFOREACH=38, D_FOR=39, D_ENDFOR=40, D_FORELSE=41, D_ENDFORELSE=42, + D_WHILE=43, D_ENDWHILE=44, D_BREAK=45, D_LOOP_ACTION=46, D_INCLUDE=47, + D_INCLUDE_IF=48, D_INCLUDE_WHEN=49, D_INCLUDE_FIRST=50, D_INCLUDE_UNLESS=51, + D_EACH=52, D_EXTENDS=53, D_JS=54, D_JSON=55, D_SECTION=56, D_HAS_SECTION=57, + D_SECTION_MISSING=58, D_ENDSECTION=59, D_YIELD=60, D_PARENT=61, D_SHOW=62, + D_OVERWRITE=63, D_STOP=64, D_APPEND=65, D_ONCE=66, D_ENDONCE=67, D_STACK=68, + D_PUSH=69, D_ENDPUSH=70, D_PUSH_IF=71, D_ENDPUSH_IF=72, D_PUSH_ONCE=73, + D_ENDPUSH_ONCE=74, D_PREPEND=75, D_ENDPREPEND=76, D_PROPS=77, D_FRAGMENT=78, + D_ENDFRAGMENT=79, D_CSRF=80, D_METHOD=81, D_ERROR=82, D_ENDERROR=83, D_PRODUCTION=84, + D_ENDPRODUCTION=85, D_ENV=86, D_ENDENV=87, D_AUTH_START=88, D_AUTH_END=89, + D_PERMISSION_START=90, D_PERMISSION_ELSE=91, D_PERMISSION_END=92, D_CLASS=93, + D_STYLE=94, D_HTML_ATTR_EXPR=95, D_AWARE=96, D_SESSION=97, D_ENDSESSION=98, + D_DD=99, D_LANG=100, D_USE=101, D_INJECT=102, D_PHP=103, D_VERBATIM=104, + D_ENDVERBATIM=105, D_LIVEWIRE=106, D_ASSET_BUNDLER=107, D_MISC=108, D_CUSTOM=109, + D_UNKNOWN_ATTR_ENC=110, D_UNKNOWN=111, CONTENT_TAG_OPEN=112, RAW_TAG_OPEN=113, + PHP_INLINE_START=114, HTML_COMPONENT_PREFIX=115, JS_SCRIPT=116, HTML_TAG_START=117, + HTML_CLOSE_TAG=118, STRING_PATH=119, HTML_PATH=120, HTML_TEXT=121, HTML_IDENTIFIER=122, + EQ=123, WS=124, OTHER=125, BLADE_COMMENT_START=126, CONTENT_TAG_CLOSE=127, + REGULAR_ECHO_EXPR_MORE=128, RAW_TAG_CLOSE=129, RAW_ECHO_EXPR_MORE=130, + WS_EXPR_ESCAPE=131, WS_EXPR=132, WS_COMPOSED_EXPR=133, EXPR_STRING=134, + COMPOSED_EXPR_RPAREN=135, PHP_COMPOSED_EXPRESSION=136, WS_BL_PARAM=137, + FOREACH_WS_EXPR=138, FOREACH_LOOP_LPAREN=139, FOREACH_LOOP_RPAREN=140, + FOREACH_AS=141, FOREACH_PARAM_ASSIGN=142, BL_PARAM_LINE_COMMENT=143, BL_SQ_RPAREN=144, + BL_PARAM_RPAREN=145, BL_PARAM_CONCAT_OPERATOR=146, BL_COMMA_EL=147, BL_PARAM_WS=148, + BL_NAME_STRING=149, PHP_D_BLADE_COMMENT=150, PHP_D_BLADE_ML_COMMENT=151, + D_ENDPHP=152, PHP_D_WS=153, PHP_D_PHP_COMPOSED_EXPRESSION=154, PHP_EXIT=155, + PHP_INLINE_COMMENT=156, PHP_INLINE_ML_COMMENT=157, VERBATIM_HTML=158, + BLADE_COMMENT_END=159, BLADE_COMMENT_PEEK=160, BLADE_COMMENT_MORE=161, + BLADE_COMMENT_EOF=162, AT=163, RAW_TAG_START=164, REGULAR_ECHO_STATIC_ACCESS=165, + REGULAR_ECHO_LPAREN=166, REGULAR_ECHO_RPAREN=167, REGULAR_ECHO_INSTANCE_ACCESS=168, + PHP_D_EXPR_CURLY_LPAREN=169, PHP_D_EXPR_CURLY_RPAREN=170, PHP_D_CLASS=171; + public static final int + COMMENT=2, PHP_CODE=3; + public static final int + INSIDE_REGULAR_ECHO=1, INSIDE_RAW_ECHO=2, LOOK_FOR_PHP_EXPRESSION=3, INSIDE_PHP_EXPRESSION=4, + LOOK_FOR_PHP_COMPOSED_EXPRESSION=5, INSIDE_PHP_COMPOSED_EXPRESSION=6, + LOOK_FOR_BLADE_PARAMETERS=7, FOREACH_LOOP_EXPRESSION=8, INSIDE_BLADE_PARAMETERS=9, + BLADE_INLINE_PHP=10, INSIDE_PHP_INLINE=11, VERBATIM_MODE=12, INSIDE_BLADE_COMMENT=13; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "COMMENT", "PHP_CODE" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", "LOOK_FOR_PHP_EXPRESSION", + "INSIDE_PHP_EXPRESSION", "LOOK_FOR_PHP_COMPOSED_EXPRESSION", "INSIDE_PHP_COMPOSED_EXPRESSION", + "LOOK_FOR_BLADE_PARAMETERS", "FOREACH_LOOP_EXPRESSION", "INSIDE_BLADE_PARAMETERS", + "BLADE_INLINE_PHP", "INSIDE_PHP_INLINE", "VERBATIM_MODE", "INSIDE_BLADE_COMMENT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "CompomentIdentifier", "CssSelector", "JsFunctionStart", "StringParam", + "CssAttrSelector", "StringAttrValue", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", + "D_SWITCH", "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", + "D_COND_BLOCK_START", "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", + "D_FOR", "D_ENDFOR", "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", + "D_BREAK", "D_LOOP_ACTION", "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", + "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", "D_EACH", "D_EXTENDS", "D_JS", + "D_JSON", "D_SECTION", "D_HAS_SECTION", "D_SECTION_MISSING", "D_ENDSECTION", + "D_YIELD", "D_PARENT", "D_SHOW", "D_OVERWRITE", "D_STOP", "D_APPEND", + "D_ONCE", "D_ENDONCE", "D_STACK", "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", + "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", "D_PREPEND", "D_ENDPREPEND", + "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", "D_CSRF", "D_METHOD", "D_ERROR", + "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", "D_ENV", "D_ENDENV", + "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", "D_PERMISSION_ELSE", + "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", "D_AWARE", + "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", "D_PHP_SHORT", + "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", + "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "AT", "RAW_TAG_START", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", + "HTML_L_COMPONENT", "JS_SCRIPT", "HTML_TAG_START", "HTML_CLOSE_TAG", + "HTML_TAG_SELF_CLOSE", "HTML_CLOSE_SYMBOL", "STRING_PATH", "HTML_PATH", + "HTML_TEXT", "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "NameString", "BladeLabel", + "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", + "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", + "D_ESCAPES", "REGULAR_ECHO_PHP_VAR", "REGULAR_ECHO_KEYWORD", "REGULAR_PHP_NAMESPACE_PATH", + "REGULAR_ECHO_PHP_IDENTIFIER", "REGULAR_ECHO_STATIC_ACCESS", "CONTENT_TAG_CLOSE", + "REGULAR_ECHO_LPAREN", "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", + "REGULAR_ECHO_EXPR_MORE", "EXIT_REGULAR_ECHO_EOF", "RAW_ECHO_PHP_VAR", + "RAW_ECHO_KEYWORD", "RAW_ECHO_PHP_NAMESPACE_PATH", "RAW_ECHO_PHP_IDENTIFIER", + "RAW_ECHO_STATIC_ACCESS", "RAW_TAG_CLOSE", "RAW_ECHO_LPAREN", "RAW_ECHO_RPAREN", + "RAW_ECHO_INSTANCE_ACCESS", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", + "WS_EXPR_ESCAPE", "WS_EXPR", "OPEN_EXPR_PAREN_MORE", "L_OHTER_ESCAPE", + "L_OTHER", "OPEN_EXPR_PAREN", "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", + "EXIT_RPAREN", "PHP_EXPRESSION_MORE", "EXIT_EOF", "WS_COMPOSED_EXPR", + "BLADE_EXPR_LPAREN", "L_COMPOSED_EXPR_OTHER", "EXPR_SQ_LPAREN", "EXPR_SQ_RPAREN", + "EXPR_CURLY_LPAREN", "EXPR_CURLY_RPAREN", "EXPR_STRING", "COMPOSED_EXPR_PHP_VAR", + "COMPOSED_PHP_KEYWORD", "COMPOSED_PHP_NAMESPACE_PATH", "COMPOSED_EXPR_PHP_IDENTIFIER", + "COMPOSED_EXPR_STATIC_ACCESS", "COMPOSED_EXPR_LPAREN", "COMPOSED_EXPR_RPAREN", + "PHP_COMPOSED_EXPRESSION", "EXIT_COMPOSED_EXPRESSION_EOF", "WS_BL_PARAM", + "OPEN_BL_PARAM_PAREN_MORE", "L_BL_PARAM_OTHER", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", + "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PHP_VARIABLE", "FOREACH_PARAM_ASSIGN", + "LOOP_COMPOSED_PHP_KEYWORD", "LOOP_NAME_STRING", "LOOP_STATIC_ACCESS", + "LOOP_PHP_EXPRESSION", "FOREACH_EOF", "BL_PARAM_LINE_COMMENT", "BL_SQ_LPAREN", + "BL_SQ_RPAREN", "BL_CURLY_LPAREN", "BL_CURLY_RPAREN", "BL_PARAM_LPAREN", + "BL_PARAM_RPAREN", "BL_PARAM_STRING", "BL_PARAM_PHP_VARIABLE", "BL_PARAM_ASSIGN", + "BL_PARAM_PHP_KEYWORD", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", "BL_PARAM_WS", + "BL_NAME_STRING", "BL_PARAM_MORE", "BL_PARAM_EXIT_EOF", "PHP_D_BLADE_COMMENT", + "PHP_D_BLADE_ML_COMMENT", "D_ENDPHP", "PHP_D_UNKNOWN", "PHP_D_EXPR_SQ_LPAREN", + "PHP_D_EXPR_SQ_RPAREN", "PHP_D_EXPR_CURLY_LPAREN", "PHP_D_EXPR_CURLY_RPAREN", + "PHP_D_EXPR_STRING", "PHP_D_COMPOSED_EXPR_PHP_VAR", "PHP_D_NEW", "PHP_D_CLASS", + "PHP_D_COMPOSED_PHP_KEYWORD", "PHP_D_NAMESPACE_PATH", "PHP_D_COMPOSED_EXPR_PHP_CLASS_IDENTIFIER", + "PHP_D_COMPOSED_EXPR_PHP_IDENTIFIER", "PHP_D_COMPOSED_EXPR_STATIC_ACCESS", + "PHP_D_COMPOSED_EXPR_LPAREN", "PHP_D_COMPOSED_EXPR_RPAREN", "PHP_D_WS", + "PHP_D_EXIT_COMPOSED_EXPRESSION_EOF", "PHP_D_PHP_COMPOSED_EXPRESSION", + "PHP_EXIT", "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "PHP_EXPR_SQ_LPAREN", + "PHP_EXPR_SQ_RPAREN", "PHP_EXPR_CURLY_LPAREN", "PHP_EXPR_CURLY_RPAREN", + "PHP_EXPR_STRING", "PHP_COMPOSED_EXPR_PHP_VAR", "PHP_COMPOSED_PHP_KEYWORD", + "PHP_COMPOSED_EXPR_PHP_IDENTIFIER", "PHP_COMPOSED_EXPR_STATIC_ACCESS", + "PHP_COMPOSED_EXPR_INSTANCE_ACCESS", "PHP_COMPOSED_EXPR_LPAREN", "PHP_COMPOSED_EXPR_RPAREN", + "PHP_EXIT_COMPOSED_EXPRESSION_EOF", "PHP_PHP_COMPOSED_EXPRESSION", "D_ENDVERBATIM_IN_MODE", + "VERBATIM_HTML", "EXIT_VERBATIM_MOD_EOF", "VERBATIM_HTML_MORE", "BLADE_COMMENT_END", + "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'@if'", "'@elseif'", "'@else'", "'@endif'", "'@switch'", "'@case'", + "'@default'", "'@endswitch'", "'@empty'", "'@endempty'", null, null, + "'@foreach'", "'@endforeach'", "'@for'", "'@endfor'", "'@forelse'", "'@endforelse'", + "'@while'", "'@endwhile'", "'@break'", null, "'@include'", "'@includeIf'", + "'@includeWhen'", "'@includeFirst'", "'@includeUnless'", "'@each'", "'@extends'", + "'@js'", "'@json'", "'@section'", "'@hasSection'", "'@sectionMissing'", + "'@endsection'", "'@yield'", "'@parent'", "'@show'", "'@overwrite'", + "'@stop'", "'@append'", "'@once'", "'@endonce'", "'@stack'", "'@push'", + "'@endpush'", "'@pushIf'", "'@endPushIf'", "'@pushOnce'", "'@endPushOnce'", + "'@prepend'", "'@endprepend'", "'@props'", "'@fragment'", "'@endfragment'", + "'@csrf'", "'@method'", "'@error'", "'@enderror'", "'@production'", "'@endproduction'", + "'@env'", "'@endenv'", null, null, null, null, null, "'@class'", "'@style'", + null, "'@aware'", "'@session'", "'@endsession'", null, "'@lang'", "'@use'", + "'@inject'", null, "'@verbatim'", "'@endverbatim'", null, "'@vite'", + "'@viteReactRefresh'", null, null, null, "'{{'", "'{!!'", null, null, + null, null, null, null, null, null, null, "'='", null, null, "'{{--'", + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, "'as'", null, null, null, null, "'.'", "','", null, null, + null, null, "'@endphp'", "' '", null, "'?>'", null, null, null, "'--}}'", + null, null, null, null, "'{!'", null, null, null, null, null, null, "'class'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "PHP_EXPRESSION", "PHP_VARIABLE", "PHP_KEYWORD", "PHP_NEW", "PHP_IDENTIFIER", + "PHP_NAMESPACE_PATH", "PHP_STATIC_ACCESS", "PHP_CLASS_KEYWORD", "PHP_INSTANCE_ACCESS", + "BLADE_PARAM_EXTRA", "BLADE_PARAM_LPAREN", "BLADE_PARAM_RPAREN", "BLADE_EXPR_LPAREN", + "BLADE_EXPR_RPAREN", "BL_SQ_LPAREN", "BL_SQ_LRAREN", "BL_PARAM_STRING", + "BL_PARAM_ASSIGN", "BL_COMMA", "BL_PARAM_COMMA", "PHP_EXPR_STRING", "ERROR", + "HTML", "BLADE_COMMENT", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", "D_SWITCH", + "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", "D_COND_BLOCK_START", + "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", "D_FOR", "D_ENDFOR", + "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", "D_BREAK", "D_LOOP_ACTION", + "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", + "D_EACH", "D_EXTENDS", "D_JS", "D_JSON", "D_SECTION", "D_HAS_SECTION", + "D_SECTION_MISSING", "D_ENDSECTION", "D_YIELD", "D_PARENT", "D_SHOW", + "D_OVERWRITE", "D_STOP", "D_APPEND", "D_ONCE", "D_ENDONCE", "D_STACK", + "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", + "D_PREPEND", "D_ENDPREPEND", "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", + "D_CSRF", "D_METHOD", "D_ERROR", "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", + "D_ENV", "D_ENDENV", "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", + "D_PERMISSION_ELSE", "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", + "D_AWARE", "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", + "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", + "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", "JS_SCRIPT", + "HTML_TAG_START", "HTML_CLOSE_TAG", "STRING_PATH", "HTML_PATH", "HTML_TEXT", + "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "BLADE_COMMENT_START", "CONTENT_TAG_CLOSE", + "REGULAR_ECHO_EXPR_MORE", "RAW_TAG_CLOSE", "RAW_ECHO_EXPR_MORE", "WS_EXPR_ESCAPE", + "WS_EXPR", "WS_COMPOSED_EXPR", "EXPR_STRING", "COMPOSED_EXPR_RPAREN", + "PHP_COMPOSED_EXPRESSION", "WS_BL_PARAM", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", + "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PARAM_ASSIGN", "BL_PARAM_LINE_COMMENT", + "BL_SQ_RPAREN", "BL_PARAM_RPAREN", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", + "BL_PARAM_WS", "BL_NAME_STRING", "PHP_D_BLADE_COMMENT", "PHP_D_BLADE_ML_COMMENT", + "D_ENDPHP", "PHP_D_WS", "PHP_D_PHP_COMPOSED_EXPRESSION", "PHP_EXIT", + "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "VERBATIM_HTML", "BLADE_COMMENT_END", + "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF", "AT", + "RAW_TAG_START", "REGULAR_ECHO_STATIC_ACCESS", "REGULAR_ECHO_LPAREN", + "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", "PHP_D_EXPR_CURLY_LPAREN", + "PHP_D_EXPR_CURLY_RPAREN", "PHP_D_CLASS" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public BladeAntlrLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladeAntlrLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 99: + HTML_COMPONENT_PREFIX_action((RuleContext)_localctx, actionIndex); + break; + case 104: + HTML_TAG_SELF_CLOSE_action((RuleContext)_localctx, actionIndex); + break; + case 105: + HTML_CLOSE_SYMBOL_action((RuleContext)_localctx, actionIndex); + break; + case 109: + HTML_IDENTIFIER_action((RuleContext)_localctx, actionIndex); + break; + case 154: + OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 155: + CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 156: + LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 157: + RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 162: + BLADE_EXPR_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 164: + EXPR_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 165: + EXPR_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 166: + EXPR_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 167: + EXPR_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 174: + COMPOSED_EXPR_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 175: + COMPOSED_EXPR_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 179: + OPEN_BL_PARAM_PAREN_MORE_action((RuleContext)_localctx, actionIndex); + break; + case 182: + FOREACH_LOOP_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 183: + FOREACH_LOOP_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 193: + BL_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 194: + BL_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 195: + BL_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 196: + BL_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 197: + BL_PARAM_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 198: + BL_PARAM_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 204: + BL_COMMA_EL_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void HTML_COMPONENT_PREFIX_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + this.compomentTagOpen = true; + break; + } + } + private void HTML_TAG_SELF_CLOSE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + this.compomentTagOpen = false; + break; + } + } + private void HTML_CLOSE_SYMBOL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + this.compomentTagOpen = false; + break; + } + } + private void HTML_IDENTIFIER_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + this.consumeHtmlIdentifier(); + break; + } + } + private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + this.increaseRoundParenBalance(); + break; + } + } + private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + this.decreaseRoundParenBalance(); + break; + } + } + private void LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 6: + this.increaseRoundParenBalance(); + break; + } + } + private void RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 7: + this.decreaseRoundParenBalance(); + break; + } + } + private void BLADE_EXPR_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 8: + this.roundParenBalance = 0; + break; + } + } + private void EXPR_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 9: + this.squareParenBalance++; + break; + } + } + private void EXPR_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 10: + this.squareParenBalance--; + break; + } + } + private void EXPR_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 11: + this.curlyParenBalance++; + break; + } + } + private void EXPR_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 12: + this.curlyParenBalance--; + break; + } + } + private void COMPOSED_EXPR_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 13: + this.increaseRoundParenBalance(); + break; + } + } + private void COMPOSED_EXPR_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 14: + consumeExprRParen(); + break; + } + } + private void OPEN_BL_PARAM_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 15: + this.roundParenBalance = 0; + break; + } + } + private void FOREACH_LOOP_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 16: + this.increaseRoundParenBalance(); + break; + } + } + private void FOREACH_LOOP_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 17: + this.decreaseRoundParenBalance(); if (this.roundParenBalance == 0){this.popMode();} + break; + } + } + private void BL_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 18: + this.squareParenBalance++; + break; + } + } + private void BL_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 19: + this.squareParenBalance--; + break; + } + } + private void BL_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 20: + this.curlyParenBalance++; + break; + } + } + private void BL_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 21: + this.curlyParenBalance--; + break; + } + } + private void BL_PARAM_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 22: + this.increaseRoundParenBalance(); + break; + } + } + private void BL_PARAM_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 23: + consumeParamRParen(); + break; + } + } + private void BL_COMMA_EL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 24: + this.consumeBladeParamComma(); + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 2: + return JsFunctionStart_sempred((RuleContext)_localctx, predIndex); + case 84: + return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); + case 85: + return D_PHP_sempred((RuleContext)_localctx, predIndex); + case 91: + return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); + case 92: + return D_UNKNOWN_ATTR_ENC_sempred((RuleContext)_localctx, predIndex); + case 93: + return D_UNKNOWN_sempred((RuleContext)_localctx, predIndex); + case 100: + return HTML_L_COMPONENT_sempred((RuleContext)_localctx, predIndex); + case 149: + return WS_EXPR_ESCAPE_sempred((RuleContext)_localctx, predIndex); + case 152: + return L_OHTER_ESCAPE_sempred((RuleContext)_localctx, predIndex); + case 154: + return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 155: + return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 156: + return LPAREN_sempred((RuleContext)_localctx, predIndex); + case 157: + return RPAREN_sempred((RuleContext)_localctx, predIndex); + case 158: + return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); + case 219: + return PHP_D_NEW_sempred((RuleContext)_localctx, predIndex); + case 249: + return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); + case 253: + return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean JsFunctionStart_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this._input.LA(1) != '{'; + } + return true; + } + private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return this._input.LA(1) == ' ' || this._input.LA(1) == '\r' || this._input.LA(1) == '\n'; + } + return true; + } + private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 3: + return this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '('); + } + return true; + } + private boolean D_UNKNOWN_ATTR_ENC_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 4: + return this._input.LA(1) == '"'; + } + return true; + } + private boolean D_UNKNOWN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 5: + return this._input.LA(1) != '"'; + } + return true; + } + private boolean HTML_L_COMPONENT_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 6: + return this._input.LA(1) == '>'; + } + return true; + } + private boolean WS_EXPR_ESCAPE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 7: + return this._input.LA(1) == '@'; + } + return true; + } + private boolean L_OHTER_ESCAPE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 8: + return this._input.LA(1) == '@'; + } + return true; + } + private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 9: + return this.roundParenBalance == 0; + } + return true; + } + private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 10: + return this.roundParenBalance == 1; + } + return true; + } + private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 11: + return this.roundParenBalance > 0; + } + return true; + } + private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 12: + return this.roundParenBalance > 0; + } + return true; + } + private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 13: + return this.roundParenBalance == 0; + } + return true; + } + private boolean PHP_D_NEW_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 14: + return this._input.LA(1) == ' '; + } + return true; + } + private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 15: + return + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + ; + } + return true; + } + private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 16: + return + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + ; + } + return true; + } + + private static final String _serializedATNSegment0 = + "\u0004\u0000\u00ab\u0b3f\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ + "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ + "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ + "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ + ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ + "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ + "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ + "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ + "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ + "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ + "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ + "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ + "f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002"+ + "k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002"+ + "p\u0007p\u0002q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002"+ + "u\u0007u\u0002v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002"+ + "z\u0007z\u0002{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002"+ + "\u007f\u0007\u007f\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002"+ + "\u0082\u0007\u0082\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002"+ + "\u0085\u0007\u0085\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002"+ + "\u0088\u0007\u0088\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002"+ + "\u008b\u0007\u008b\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002"+ + "\u008e\u0007\u008e\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002"+ + "\u0091\u0007\u0091\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002"+ + "\u0094\u0007\u0094\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002"+ + "\u0097\u0007\u0097\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002"+ + "\u009a\u0007\u009a\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002"+ + "\u009d\u0007\u009d\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002"+ + "\u00a0\u0007\u00a0\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002"+ + "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ + "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ + "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ + "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ + "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0002"+ + "\u00b2\u0007\u00b2\u0002\u00b3\u0007\u00b3\u0002\u00b4\u0007\u00b4\u0002"+ + "\u00b5\u0007\u00b5\u0002\u00b6\u0007\u00b6\u0002\u00b7\u0007\u00b7\u0002"+ + "\u00b8\u0007\u00b8\u0002\u00b9\u0007\u00b9\u0002\u00ba\u0007\u00ba\u0002"+ + "\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0002\u00bd\u0007\u00bd\u0002"+ + "\u00be\u0007\u00be\u0002\u00bf\u0007\u00bf\u0002\u00c0\u0007\u00c0\u0002"+ + "\u00c1\u0007\u00c1\u0002\u00c2\u0007\u00c2\u0002\u00c3\u0007\u00c3\u0002"+ + "\u00c4\u0007\u00c4\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002"+ + "\u00c7\u0007\u00c7\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002"+ + "\u00ca\u0007\u00ca\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002"+ + "\u00cd\u0007\u00cd\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002"+ + "\u00d0\u0007\u00d0\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002"+ + "\u00d3\u0007\u00d3\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002"+ + "\u00d6\u0007\u00d6\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002"+ + "\u00d9\u0007\u00d9\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002"+ + "\u00dc\u0007\u00dc\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002"+ + "\u00df\u0007\u00df\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002"+ + "\u00e2\u0007\u00e2\u0002\u00e3\u0007\u00e3\u0002\u00e4\u0007\u00e4\u0002"+ + "\u00e5\u0007\u00e5\u0002\u00e6\u0007\u00e6\u0002\u00e7\u0007\u00e7\u0002"+ + "\u00e8\u0007\u00e8\u0002\u00e9\u0007\u00e9\u0002\u00ea\u0007\u00ea\u0002"+ + "\u00eb\u0007\u00eb\u0002\u00ec\u0007\u00ec\u0002\u00ed\u0007\u00ed\u0002"+ + "\u00ee\u0007\u00ee\u0002\u00ef\u0007\u00ef\u0002\u00f0\u0007\u00f0\u0002"+ + "\u00f1\u0007\u00f1\u0002\u00f2\u0007\u00f2\u0002\u00f3\u0007\u00f3\u0002"+ + "\u00f4\u0007\u00f4\u0002\u00f5\u0007\u00f5\u0002\u00f6\u0007\u00f6\u0002"+ + "\u00f7\u0007\u00f7\u0002\u00f8\u0007\u00f8\u0002\u00f9\u0007\u00f9\u0002"+ + "\u00fa\u0007\u00fa\u0002\u00fb\u0007\u00fb\u0002\u00fc\u0007\u00fc\u0002"+ + "\u00fd\u0007\u00fd\u0002\u00fe\u0007\u00fe\u0002\u00ff\u0007\u00ff\u0001"+ + "\u0000\u0001\u0000\u0005\u0000\u0211\b\u0000\n\u0000\f\u0000\u0214\t\u0000"+ + "\u0001\u0001\u0003\u0001\u0217\b\u0001\u0001\u0001\u0001\u0001\u0005\u0001"+ + "\u021b\b\u0001\n\u0001\f\u0001\u021e\t\u0001\u0001\u0001\u0003\u0001\u0221"+ + "\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u0226\b\u0002"+ + "\n\u0002\f\u0002\u0229\t\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u022d"+ + "\b\u0002\n\u0002\f\u0002\u0230\t\u0002\u0001\u0002\u0005\u0002\u0233\b"+ + "\u0002\n\u0002\f\u0002\u0236\t\u0002\u0001\u0002\u0005\u0002\u0239\b\u0002"+ + "\n\u0002\f\u0002\u023c\t\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u0240"+ + "\b\u0002\n\u0002\f\u0002\u0243\t\u0002\u0001\u0002\u0001\u0002\u0003\u0002"+ + "\u0247\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u024c\b"+ + "\u0003\n\u0003\f\u0003\u024f\t\u0003\u0001\u0003\u0005\u0003\u0252\b\u0003"+ + "\n\u0003\f\u0003\u0255\t\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0005\u0003\u025c\b\u0003\n\u0003\f\u0003\u025f\t\u0003"+ + "\u0001\u0003\u0005\u0003\u0262\b\u0003\n\u0003\f\u0003\u0265\t\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u026a\b\u0003\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0271\b\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u027d\b\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0003\u0010\u02e2\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011"+ + "\u02f9\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ + "+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00014\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u0001"+ + "5\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ + "6\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00016\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0003"+ + "E\u0518\bE\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0003F\u052d\bF\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001G\u0003G\u053a\bG\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0003H\u054d\bH\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ + "I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0003I\u055f\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ + "K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0003L\u059f\bL\u0001L\u0001L\u0001M\u0001"+ + "M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ + "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ + "O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0003P\u05cb"+ + "\bP\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0003T\u05ee\bT\u0001T\u0001T\u0001T\u0001T\u0001"+ + "T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0003X\u0654\bX\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001"+ + "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u069a\bb\u0001b\u0001b\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0004"+ + "c\u06a8\bc\u000bc\fc\u06a9\u0003c\u06ac\bc\u0001c\u0001c\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0003e\u06ba"+ + "\be\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0003e\u06c2\be\u0001e\u0001"+ + "e\u0001e\u0005e\u06c7\be\ne\fe\u06ca\te\u0003e\u06cc\be\u0001e\u0001e"+ + "\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0005g\u06d8"+ + "\bg\ng\fg\u06db\tg\u0001g\u0001g\u0004g\u06df\bg\u000bg\fg\u06e0\u0001"+ + "g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001"+ + "i\u0001i\u0001i\u0001i\u0001j\u0001j\u0005j\u06f3\bj\nj\fj\u06f6\tj\u0001"+ + "j\u0001j\u0001j\u0001j\u0001j\u0003j\u06fd\bj\u0001j\u0001j\u0001k\u0005"+ + "k\u0702\bk\nk\fk\u0705\tk\u0001k\u0001k\u0001k\u0004k\u070a\bk\u000bk"+ + "\fk\u070b\u0001k\u0001k\u0003k\u0710\bk\u0001k\u0001k\u0001k\u0001k\u0001"+ + "k\u0005k\u0717\bk\nk\fk\u071a\tk\u0003k\u071c\bk\u0001k\u0001k\u0001l"+ + "\u0005l\u0721\bl\nl\fl\u0724\tl\u0001l\u0001l\u0004l\u0728\bl\u000bl\f"+ + "l\u0729\u0001l\u0004l\u072d\bl\u000bl\fl\u072e\u0001l\u0001l\u0001m\u0001"+ + "m\u0001m\u0001n\u0001n\u0001o\u0004o\u0739\bo\u000bo\fo\u073a\u0001o\u0004"+ + "o\u073e\bo\u000bo\fo\u073f\u0003o\u0742\bo\u0001o\u0001o\u0001p\u0001"+ + "p\u0001p\u0001p\u0001q\u0001q\u0005q\u074c\bq\nq\fq\u074f\tq\u0001r\u0001"+ + "r\u0005r\u0753\br\nr\fr\u0756\tr\u0001s\u0001s\u0005s\u075a\bs\ns\fs\u075d"+ + "\ts\u0001t\u0001t\u0001u\u0001u\u0001u\u0005u\u0764\bu\nu\fu\u0767\tu"+ + "\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0005v\u076f\bv\nv\fv\u0772"+ + "\tv\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0005w\u077a\bw\nw\fw\u077d"+ + "\tw\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ + "y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ + "y\u0001y\u0003y\u0794\by\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001"+ + "{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+ + "}\u0001}\u0001}\u0003}\u07a9\b}\u0004}\u07ab\b}\u000b}\f}\u07ac\u0001"+ + "}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u07b8"+ + "\b~\u0001~\u0001~\u0001~\u0001~\u0003~\u07be\b~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07c8\b~\n~\f~\u07cb\t~\u0001~\u0003"+ + "~\u07ce\b~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0005~\u07da\b~\n~\f~\u07dd\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07e8\b~\n~\f~\u07eb\t~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0005~\u07f9\b~\n~\f~\u07fc\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0809\b~\n~\f~\u080c\t~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0005~\u081a\b~\n~\f~\u081d\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0005~\u0826\b~\n~\f~\u0829\t~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0836\b~\n~"+ + "\f~\u0839\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005"+ + "~\u0843\b~\n~\f~\u0846\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u0853\b~\n~\f~\u0856\t~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0860\b~\n~\f~\u0863"+ + "\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0005~\u0879\b~\n~\f~\u087c\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u088a\b~\n~\f~\u088d"+ + "\t~\u0003~\u088f\b~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ + "\u0003\u0081\u089c\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0004\u0081"+ + "\u08a1\b\u0081\u000b\u0081\f\u0081\u08a2\u0001\u0081\u0001\u0081\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ + "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ + "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08d4\b\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0004\u008c\u08d9\b\u008c\u000b\u008c\f\u008c\u08da"+ + "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ + "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0004\u0095\u0905\b\u0095"+ + "\u000b\u0095\f\u0095\u0906\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0096\u0004\u0096\u090f\b\u0096\u000b\u0096\f\u0096"+ + "\u0910\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ + "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004"+ + "\u00a1\u094e\b\u00a1\u000b\u00a1\f\u00a1\u094f\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0974\b\u00a8\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00ab\u0003\u00ab\u097f\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0004\u00ab\u0984\b\u00ab\u000b\u00ab\f\u00ab\u0985\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ + "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ + "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0004\u00b2\u09a5\b\u00b2\u000b"+ + "\u00b2\f\u00b2\u09a6\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0004\u00b5\u09b7\b\u00b5\u000b"+ + "\u00b5\f\u00b5\u09b8\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ + "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u09d4\b\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ + "\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001"+ + "\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ + "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ + "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+ + "\u00c6\u0001\u00c7\u0001\u00c7\u0003\u00c7\u0a04\b\u00c7\u0001\u00c8\u0001"+ + "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ + "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001"+ + "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0004\u00cd\u0a17\b\u00cd\u000b"+ + "\u00cd\f\u00cd\u0a18\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001"+ + "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001"+ + "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+ + "\u00d1\u0004\u00d1\u0a2c\b\u00d1\u000b\u00d1\f\u00d1\u0a2d\u0001\u00d1"+ + "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2"+ + "\u0a36\b\u00d2\n\u00d2\f\u00d2\u0a39\t\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ + "\u00d2\u0001\u00d2\u0005\u00d2\u0a3f\b\u00d2\n\u00d2\f\u00d2\u0a42\t\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ + "\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9"+ + "\u0a67\b\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da"+ + "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ + "\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ + "\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a84\b\u00de"+ + "\u0001\u00de\u0001\u00de\u0001\u00de\u0004\u00de\u0a89\b\u00de\u000b\u00de"+ + "\f\u00de\u0a8a\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8"+ + "\u0abb\b\u00e8\u000b\u00e8\f\u00e8\u0abc\u0001\u00e8\u0001\u00e8\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ac5\b\u00e9\n"+ + "\u00e9\f\u00e9\u0ac8\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001"+ + "\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001"+ + "\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ + "\u00ee\u0001\u00ee\u0003\u00ee\u0ae1\b\u00ee\u0001\u00ee\u0001\u00ee\u0001"+ + "\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001"+ + "\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001"+ + "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001"+ + "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ + "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ + "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001"+ + "\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001"+ + "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001"+ + "\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ + "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ + "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001"+ + "\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ + "\u00ff\u0003\u0765\u0a37\u0ac6\u0000\u0100\u000e\u0000\u0010\u0000\u0012"+ + "\u0000\u0014\u0000\u0016\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e"+ + "\u001b \u001c\"\u001d$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/"+ + "H0J1L2N3P4R5T6V7X8Z9\\:^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082"+ + "M\u0084N\u0086O\u0088P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096"+ + "W\u0098X\u009aY\u009cZ\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aa"+ + "a\u00acb\u00aec\u00b0d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci"+ + "\u00bej\u00c0k\u00c2l\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0"+ + "\u00a4\u00d2r\u00d4s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0"+ + "\u0000\u00e2w\u00e4x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2"+ + "\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe"+ + "\u0000\u0100\u0000\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000"+ + "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f"+ + "\u0118\u00a6\u011a\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000"+ + "\u0124\u0000\u0126\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000"+ + "\u0130\u0000\u0132\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084"+ + "\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000"+ + "\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154"+ + "\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160"+ + "\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c"+ + "\u0087\u016e\u0088\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178"+ + "\u008a\u017a\u008b\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184"+ + "\u0000\u0186\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190"+ + "\u000f\u0192\u0090\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c"+ + "\u0011\u019e\u0000\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8"+ + "\u0094\u01aa\u0095\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4"+ + "\u0098\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0"+ + "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc"+ + "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8"+ + "\u0000\u01da\u009a\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4"+ + "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0"+ + "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ + "\u0000\u01fe\u0000\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208"+ + "\u00a0\u020a\u00a1\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005"+ + "\u0006\u0007\b\t\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006"+ + "\u0000-.0:AZ__az\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ_"+ + "_az\u0080\u8000\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000"+ + "FFff\u0002\u0000EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002"+ + "\u0000DDdd\u0002\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000"+ + "HHhh\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002"+ + "\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002"+ + "\u0000QQqq\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__a"+ + "z\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000"+ + "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ + "\u0000\"\"\\\\\u0001\u0000 \u0003\u0000\t\n\r\r \u0ba3\u0000\u001a\u0001"+ + "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ + "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ + "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ + "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ + "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ + "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ + "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ + "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ + "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ + "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ + "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ + "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ + "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ + "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ + "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ + "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ + "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ + "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ + "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ + "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ + "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ + "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ + "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ + "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ + "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ + "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ + "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ + "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ + "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ + "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ + "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ + "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ + "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ + "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ + "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ + "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ + "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ + "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ + "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ + "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ + "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ + "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ + "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ + "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ + "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ + "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ + "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ + "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ + "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ + "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ + "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ + "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001"+ + "\u010c\u0001\u0000\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001"+ + "\u0110\u0001\u0000\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001"+ + "\u0114\u0001\u0000\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001"+ + "\u0118\u0001\u0000\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001"+ + "\u011c\u0001\u0000\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001"+ + "\u0120\u0001\u0000\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002"+ + "\u0124\u0001\u0000\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002"+ + "\u0128\u0001\u0000\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002"+ + "\u012c\u0001\u0000\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002"+ + "\u0130\u0001\u0000\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002"+ + "\u0134\u0001\u0000\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003"+ + "\u0138\u0001\u0000\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003"+ + "\u013c\u0001\u0000\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003"+ + "\u0140\u0001\u0000\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004"+ + "\u0144\u0001\u0000\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004"+ + "\u0148\u0001\u0000\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004"+ + "\u014c\u0001\u0000\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005"+ + "\u0150\u0001\u0000\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005"+ + "\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006"+ + "\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006"+ + "\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006"+ + "\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006"+ + "\u0164\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006"+ + "\u0168\u0001\u0000\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006"+ + "\u016c\u0001\u0000\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006"+ + "\u0170\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007"+ + "\u0174\u0001\u0000\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178"+ + "\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001"+ + "\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000"+ + "\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000"+ + "\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000"+ + "\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e"+ + "\u0001\u0000\u0000\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001"+ + "\u0000\u0000\u0000\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000"+ + "\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000"+ + "\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000"+ + "\t\u01a0\u0001\u0000\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4"+ + "\u0001\u0000\u0000\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001"+ + "\u0000\u0000\u0000\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000"+ + "\u0000\u0000\t\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000"+ + "\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000"+ + "\n\u01b6\u0001\u0000\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba"+ + "\u0001\u0000\u0000\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001"+ + "\u0000\u0000\u0000\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000"+ + "\u0000\u0000\n\u01c4\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000"+ + "\u0000\n\u01c8\u0001\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000"+ + "\n\u01cc\u0001\u0000\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0"+ + "\u0001\u0000\u0000\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001"+ + "\u0000\u0000\u0000\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000"+ + "\u0000\u0000\n\u01da\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000"+ + "\u0000\u000b\u01de\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000"+ + "\u0000\u000b\u01e2\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000"+ + "\u0000\u000b\u01e6\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000"+ + "\u0000\u000b\u01ea\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000"+ + "\u0000\u000b\u01ee\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000"+ + "\u0000\u000b\u01f2\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000"+ + "\u0000\u000b\u01f6\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000"+ + "\u0000\u000b\u01fa\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000"+ + "\u0000\f\u01fe\u0001\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000"+ + "\f\u0202\u0001\u0000\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206"+ + "\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001"+ + "\u0000\u0000\u0000\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000"+ + "\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000"+ + "\u0000\u0000\u0014\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000"+ + "\u0000\u0000\u0018\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000"+ + "\u0000\u0000\u001c\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000"+ + "\u0000\u0000 \u0294\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000"+ + "\u0000$\u02a5\u0001\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000("+ + "\u02b6\u0001\u0000\u0000\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001"+ + "\u0000\u0000\u0000.\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000"+ + "\u00002\u02fa\u0001\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006"+ + "\u0311\u0001\u0000\u0000\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001"+ + "\u0000\u0000\u0000<\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000"+ + "\u0000@\u0340\u0001\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D"+ + "\u0353\u0001\u0000\u0000\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001"+ + "\u0000\u0000\u0000J\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000"+ + "\u0000N\u0396\u0001\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R"+ + "\u03af\u0001\u0000\u0000\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001"+ + "\u0000\u0000\u0000X\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000"+ + "\u0000\\\u03e1\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000"+ + "`\u03ff\u0001\u0000\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410"+ + "\u0001\u0000\u0000\u0000f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000"+ + "\u0000\u0000j\u0427\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000"+ + "n\u0435\u0001\u0000\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447"+ + "\u0001\u0000\u0000\u0000t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000"+ + "\u0000\u0000x\u0462\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000"+ + "|\u0479\u0001\u0000\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491"+ + "\u0001\u0000\u0000\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6"+ + "\u0001\u0000\u0000\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf"+ + "\u0001\u0000\u0000\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf"+ + "\u0001\u0000\u0000\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2"+ + "\u0001\u0000\u0000\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd"+ + "\u0001\u0000\u0000\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517"+ + "\u0001\u0000\u0000\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e"+ + "\u0001\u0000\u0000\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550"+ + "\u0001\u0000\u0000\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569"+ + "\u0001\u0000\u0000\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2"+ + "\u0001\u0000\u0000\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6"+ + "\u0001\u0000\u0000\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce"+ + "\u0001\u0000\u0000\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd"+ + "\u0001\u0000\u0000\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4"+ + "\u0001\u0000\u0000\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609"+ + "\u0001\u0000\u0000\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655"+ + "\u0001\u0000\u0000\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f"+ + "\u0001\u0000\u0000\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679"+ + "\u0001\u0000\u0000\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682"+ + "\u0001\u0000\u0000\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c"+ + "\u0001\u0000\u0000\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d"+ + "\u0001\u0000\u0000\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb"+ + "\u0001\u0000\u0000\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de"+ + "\u0001\u0000\u0000\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb"+ + "\u0001\u0000\u0000\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703"+ + "\u0001\u0000\u0000\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732"+ + "\u0001\u0000\u0000\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741"+ + "\u0001\u0000\u0000\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749"+ + "\u0001\u0000\u0000\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757"+ + "\u0001\u0000\u0000\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760"+ + "\u0001\u0000\u0000\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775"+ + "\u0001\u0000\u0000\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793"+ + "\u0001\u0000\u0000\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797"+ + "\u0001\u0000\u0000\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5"+ + "\u0001\u0000\u0000\u0000\u010a\u088e\u0001\u0000\u0000\u0000\u010c\u0892"+ + "\u0001\u0000\u0000\u0000\u010e\u0896\u0001\u0000\u0000\u0000\u0110\u089b"+ + "\u0001\u0000\u0000\u0000\u0112\u08a6\u0001\u0000\u0000\u0000\u0114\u08aa"+ + "\u0001\u0000\u0000\u0000\u0116\u08af\u0001\u0000\u0000\u0000\u0118\u08b4"+ + "\u0001\u0000\u0000\u0000\u011a\u08b8\u0001\u0000\u0000\u0000\u011c\u08bc"+ + "\u0001\u0000\u0000\u0000\u011e\u08c1\u0001\u0000\u0000\u0000\u0120\u08c5"+ + "\u0001\u0000\u0000\u0000\u0122\u08ca\u0001\u0000\u0000\u0000\u0124\u08ce"+ + "\u0001\u0000\u0000\u0000\u0126\u08d3\u0001\u0000\u0000\u0000\u0128\u08de"+ + "\u0001\u0000\u0000\u0000\u012a\u08e2\u0001\u0000\u0000\u0000\u012c\u08e7"+ + "\u0001\u0000\u0000\u0000\u012e\u08ed\u0001\u0000\u0000\u0000\u0130\u08f1"+ + "\u0001\u0000\u0000\u0000\u0132\u08f5\u0001\u0000\u0000\u0000\u0134\u08fa"+ + "\u0001\u0000\u0000\u0000\u0136\u08fe\u0001\u0000\u0000\u0000\u0138\u0904"+ + "\u0001\u0000\u0000\u0000\u013a\u090e\u0001\u0000\u0000\u0000\u013c\u0914"+ + "\u0001\u0000\u0000\u0000\u013e\u0919\u0001\u0000\u0000\u0000\u0140\u091f"+ + "\u0001\u0000\u0000\u0000\u0142\u0924\u0001\u0000\u0000\u0000\u0144\u092a"+ + "\u0001\u0000\u0000\u0000\u0146\u0931\u0001\u0000\u0000\u0000\u0148\u0937"+ + "\u0001\u0000\u0000\u0000\u014a\u093d\u0001\u0000\u0000\u0000\u014c\u0943"+ + "\u0001\u0000\u0000\u0000\u014e\u0947\u0001\u0000\u0000\u0000\u0150\u094d"+ + "\u0001\u0000\u0000\u0000\u0152\u0953\u0001\u0000\u0000\u0000\u0154\u0958"+ + "\u0001\u0000\u0000\u0000\u0156\u095d\u0001\u0000\u0000\u0000\u0158\u0962"+ + "\u0001\u0000\u0000\u0000\u015a\u0967\u0001\u0000\u0000\u0000\u015c\u096c"+ + "\u0001\u0000\u0000\u0000\u015e\u0973\u0001\u0000\u0000\u0000\u0160\u0975"+ + "\u0001\u0000\u0000\u0000\u0162\u0979\u0001\u0000\u0000\u0000\u0164\u097e"+ + "\u0001\u0000\u0000\u0000\u0166\u0989\u0001\u0000\u0000\u0000\u0168\u098d"+ + "\u0001\u0000\u0000\u0000\u016a\u0992\u0001\u0000\u0000\u0000\u016c\u0997"+ + "\u0001\u0000\u0000\u0000\u016e\u099a\u0001\u0000\u0000\u0000\u0170\u099e"+ + "\u0001\u0000\u0000\u0000\u0172\u09a4\u0001\u0000\u0000\u0000\u0174\u09aa"+ + "\u0001\u0000\u0000\u0000\u0176\u09b0\u0001\u0000\u0000\u0000\u0178\u09b6"+ + "\u0001\u0000\u0000\u0000\u017a\u09bc\u0001\u0000\u0000\u0000\u017c\u09bf"+ + "\u0001\u0000\u0000\u0000\u017e\u09c2\u0001\u0000\u0000\u0000\u0180\u09c5"+ + "\u0001\u0000\u0000\u0000\u0182\u09c9\u0001\u0000\u0000\u0000\u0184\u09cc"+ + "\u0001\u0000\u0000\u0000\u0186\u09d3\u0001\u0000\u0000\u0000\u0188\u09d7"+ + "\u0001\u0000\u0000\u0000\u018a\u09dc\u0001\u0000\u0000\u0000\u018c\u09e0"+ + "\u0001\u0000\u0000\u0000\u018e\u09e5\u0001\u0000\u0000\u0000\u0190\u09e9"+ + "\u0001\u0000\u0000\u0000\u0192\u09ec\u0001\u0000\u0000\u0000\u0194\u09ef"+ + "\u0001\u0000\u0000\u0000\u0196\u09f4\u0001\u0000\u0000\u0000\u0198\u09f9"+ + "\u0001\u0000\u0000\u0000\u019a\u09fe\u0001\u0000\u0000\u0000\u019c\u0a03"+ + "\u0001\u0000\u0000\u0000\u019e\u0a05\u0001\u0000\u0000\u0000\u01a0\u0a09"+ + "\u0001\u0000\u0000\u0000\u01a2\u0a0c\u0001\u0000\u0000\u0000\u01a4\u0a10"+ + "\u0001\u0000\u0000\u0000\u01a6\u0a12\u0001\u0000\u0000\u0000\u01a8\u0a16"+ + "\u0001\u0000\u0000\u0000\u01aa\u0a1c\u0001\u0000\u0000\u0000\u01ac\u0a1e"+ + "\u0001\u0000\u0000\u0000\u01ae\u0a22\u0001\u0000\u0000\u0000\u01b0\u0a27"+ + "\u0001\u0000\u0000\u0000\u01b2\u0a31\u0001\u0000\u0000\u0000\u01b4\u0a45"+ + "\u0001\u0000\u0000\u0000\u01b6\u0a4f\u0001\u0000\u0000\u0000\u01b8\u0a54"+ + "\u0001\u0000\u0000\u0000\u01ba\u0a58\u0001\u0000\u0000\u0000\u01bc\u0a5c"+ + "\u0001\u0000\u0000\u0000\u01be\u0a60\u0001\u0000\u0000\u0000\u01c0\u0a66"+ + "\u0001\u0000\u0000\u0000\u01c2\u0a6a\u0001\u0000\u0000\u0000\u01c4\u0a6e"+ + "\u0001\u0000\u0000\u0000\u01c6\u0a76\u0001\u0000\u0000\u0000\u01c8\u0a7e"+ + "\u0001\u0000\u0000\u0000\u01ca\u0a83\u0001\u0000\u0000\u0000\u01cc\u0a8e"+ + "\u0001\u0000\u0000\u0000\u01ce\u0a93\u0001\u0000\u0000\u0000\u01d0\u0a97"+ + "\u0001\u0000\u0000\u0000\u01d2\u0a9c\u0001\u0000\u0000\u0000\u01d4\u0aa0"+ + "\u0001\u0000\u0000\u0000\u01d6\u0aa4\u0001\u0000\u0000\u0000\u01d8\u0aa8"+ + "\u0001\u0000\u0000\u0000\u01da\u0aad\u0001\u0000\u0000\u0000\u01dc\u0ab1"+ + "\u0001\u0000\u0000\u0000\u01de\u0ab6\u0001\u0000\u0000\u0000\u01e0\u0ac0"+ + "\u0001\u0000\u0000\u0000\u01e2\u0ace\u0001\u0000\u0000\u0000\u01e4\u0ad2"+ + "\u0001\u0000\u0000\u0000\u01e6\u0ad6\u0001\u0000\u0000\u0000\u01e8\u0ada"+ + "\u0001\u0000\u0000\u0000\u01ea\u0ae0\u0001\u0000\u0000\u0000\u01ec\u0ae4"+ + "\u0001\u0000\u0000\u0000\u01ee\u0ae8\u0001\u0000\u0000\u0000\u01f0\u0aec"+ + "\u0001\u0000\u0000\u0000\u01f2\u0af0\u0001\u0000\u0000\u0000\u01f4\u0af5"+ + "\u0001\u0000\u0000\u0000\u01f6\u0afa\u0001\u0000\u0000\u0000\u01f8\u0afe"+ + "\u0001\u0000\u0000\u0000\u01fa\u0b02\u0001\u0000\u0000\u0000\u01fc\u0b07"+ + "\u0001\u0000\u0000\u0000\u01fe\u0b0b\u0001\u0000\u0000\u0000\u0200\u0b1b"+ + "\u0001\u0000\u0000\u0000\u0202\u0b20\u0001\u0000\u0000\u0000\u0204\u0b25"+ + "\u0001\u0000\u0000\u0000\u0206\u0b29\u0001\u0000\u0000\u0000\u0208\u0b31"+ + "\u0001\u0000\u0000\u0000\u020a\u0b36\u0001\u0000\u0000\u0000\u020c\u0b3a"+ + "\u0001\u0000\u0000\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211"+ + "\u0007\u0001\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214"+ + "\u0001\u0000\u0000\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213"+ + "\u0001\u0000\u0000\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212"+ + "\u0001\u0000\u0000\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215"+ + "\u0001\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218"+ + "\u0001\u0000\u0000\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b"+ + "\u0007\u0003\u0000\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e"+ + "\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d"+ + "\u0001\u0000\u0000\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c"+ + "\u0001\u0000\u0000\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216"+ + "\u0001\u0000\u0000\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011"+ + "\u0001\u0000\u0000\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005"+ + "(\u0000\u0000\u0224\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000"+ + "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ + "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000"+ + "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000"+ + "\u022b\u022d\u0005 \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ + "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ + "\u022f\u0001\u0000\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230"+ + "\u022e\u0001\u0000\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a"+ + "\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232"+ + "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a"+ + "\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239"+ + "\u0005 \u0000\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001"+ + "\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ + "\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ + "\u0000\u0000\u0000\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000"+ + "\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000"+ + "\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ + "\u0000\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ + "\u0000\u0244\u0245\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000"+ + "\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ + "\u0247\u0013\u0001\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000"+ + "\u0249\u0253\u0003\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b"+ + "\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d"+ + "\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e"+ + "\u0250\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250"+ + "\u0252\u0003\u0010\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252"+ + "\u0255\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253"+ + "\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255"+ + "\u0253\u0001\u0000\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257"+ + "\u026a\u0001\u0000\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263"+ + "\u0003\u0010\u0001\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001"+ + "\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001"+ + "\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001"+ + "\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003"+ + "\u0010\u0001\u0000\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001"+ + "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ + "\u0000\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ + "\u0000\u0000\u0000\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005"+ + "\"\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000"+ + "\u0000\u0000\u0269\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000"+ + "\u0000\u0000\u026b\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000"+ + "\u026d\u026e\u0003\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f"+ + "\u0271\u0001\u0000\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272"+ + "\u0273\u0005]\u0000\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275"+ + "\u0005\"\u0000\u0000\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005"+ + "\"\u0000\u0000\u0277\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004"+ + "\u0000\u0000\u0279\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000"+ + "\u0000\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000"+ + "\u0000\u027c\u0278\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000"+ + "\u0000\u027e\u027f\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000"+ + "\u0280\u0281\u0007\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000"+ + "\u0282\u0283\u0006\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000"+ + "\u0284\u0285\u0005@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286"+ + "\u0287\u0007\b\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289"+ + "\u0007\u0007\u0000\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b"+ + "\u0007\u0006\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+ + "\u0006\u0007\u0000\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f"+ + "\u0005@\u0000\u0000\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007"+ + "\b\u0000\u0000\u0291\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007"+ + "\u0000\u0000\u0293\u001f\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000"+ + "\u0000\u0295\u0296\u0007\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000"+ + "\u0297\u0298\u0007\u000b\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000"+ + "\u0299\u029a\u0007\u0006\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b"+ + "\u029c\u0005@\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e"+ + "\u0007\f\u0000\u0000\u029e\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007"+ + "\r\u0000\u0000\u02a0\u02a1\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f"+ + "\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001"+ + "\u0000\u02a4#\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6"+ + "\u02a7\u0007\u000e\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8"+ + "\u02a9\u0007\t\u0000\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab"+ + "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001"+ + "\u0000\u0000\u0000\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b"+ + "\u0000\u0000\u02af\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006"+ + "\u0000\u0000\u02b1\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011"+ + "\u0000\u0000\u02b3\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000"+ + "\u0000\u02b5\'\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000"+ + "\u02b7\u02b8\u0007\u0007\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9"+ + "\u02ba\u0007\u000b\u0000\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc"+ + "\u0007\f\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007"+ + "\r\u0000\u0000\u02be\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f"+ + "\u0000\u0000\u02c0)\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000"+ + "\u02c2\u02c3\u0007\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000"+ + "\u02c4\u02c5\u0007\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6"+ + "\u02c7\u0007\u0014\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8"+ + "\u02c9\u0006\u000e\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb"+ + "\u0005@\u0000\u0000\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007"+ + "\n\u0000\u0000\u02cd\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007"+ + "\u0000\u0000\u02cf\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013"+ + "\u0000\u0000\u02d1\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000"+ + "\u0000\u02d3-\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5"+ + "\u02d6\u0007\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8"+ + "\u0007\b\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007"+ + "\t\u0000\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000"+ + "\u0000\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000"+ + "\u02de\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0"+ + "\u02e2\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4"+ + "\u0006\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ + "@\u0000\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n"+ + "\u0000\u0000\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011"+ + "\u0000\u0000\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000"+ + "\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000"+ + "\u02ee\u02f9\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0"+ + "\u02f1\u0007\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3"+ + "\u0007\u000b\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5"+ + "\u0007\t\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007"+ + "\u0007\u0000\u0000\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000"+ + "\u0000\u0000\u02f8\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000"+ + "\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000"+ + "\u02fc\u02fd\u0007\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000"+ + "\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000"+ + "\u0300\u0301\u0007\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000"+ + "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000"+ + "\u03043\u0001\u0000\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307"+ + "\u0007\u0007\u0000\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007"+ + "\u000b\u0000\u0000\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007"+ + "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ + "\u0007\u0000\u0000\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007"+ + "\u000e\u0000\u0000\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000"+ + "\u0000\u0000\u0311\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000"+ + "\u0000\u0313\u0314\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000"+ + "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001"+ + "\u0000\u03177\u0001\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319"+ + "\u031a\u0007\u0007\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c"+ + "\u0007\u000b\u0000\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e"+ + "\u0007\u0015\u0000\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001"+ + "\u0000\u0000\u0000\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006"+ + "\u0000\u0000\u0322\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016"+ + "\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000"+ + "\u0000\u0326\u0327\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000"+ + "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000"+ + "\u032a;\u0001\u0000\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d"+ + "\u0007\u0007\u0000\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007"+ + "\u000b\u0000\u0000\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007"+ + "\u0015\u0000\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007"+ + "\u0007\u0000\u0000\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t"+ + "\u0000\u0000\u0335\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000"+ + "\u0000\u0337\u0338\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000"+ + "\u0339\u033a\u0007\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000"+ + "\u033b\u033c\u0007\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d"+ + "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f"+ + "?\u0001\u0000\u0000\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007"+ + "\u0007\u0000\u0000\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b"+ + "\u0000\u0000\u0344\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000"+ + "\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000"+ + "\u0348\u0349\u0007\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a"+ + "\u034b\u0005@\u0000\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d"+ + "\u0007\u0016\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ + "\u0007\u0010\u0000\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351"+ + "\u0001\u0000\u0000\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001"+ + "\u0000\u0000\u0000\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e"+ + "\u0000\u0000\u0355\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000"+ + "\u0000\u0357\u0358\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000"+ + "\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b"+ + "\u035c\u0007\u0007\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d"+ + "\u035e\u0006\u001b\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360"+ + "\u0005@\u0000\u0000\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007"+ + "\n\u0000\u0000\u0362\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b"+ + "\u0000\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b"+ + "\u0000\u0000\u0366\u0367\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000"+ + "\u0000\u0000\u0368\u0369\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000"+ + "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000"+ + "\u036c\u036d\u0007\n\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e"+ + "\u036f\u0007\b\u0000\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371"+ + "\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373"+ + "\u0007\u0005\u0000\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375"+ + "\u0001\u0000\u0000\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001"+ + "\u0000\u0000\u0000\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005"+ + "\u0000\u0000\u0379\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000"+ + "\u0000\u037b\u037c\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000"+ + "\u037d\u037e\u0007\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000"+ + "\u037f\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381"+ + "\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384"+ + "\u0001\u0000\u0000\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001"+ + "\u0000\u0000\u0000\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005"+ + "\u0000\u0000\u0388\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000"+ + "\u0000\u038a\u038b\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000"+ + "\u038c\u038d\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000"+ + "\u038e\u038f\u0007\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000"+ + "\u0390\u0391\u0007\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392"+ + "\u0393\u0007\r\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ + "\u0006\u001f\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ + "@\u0000\u0000\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n"+ + "\u0000\u0000\u0399\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000"+ + "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ + "\u0000\u039d\u039e\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ + "\u0000\u039f\u03a0\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000"+ + "\u03a1\u03a2\u0007\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3"+ + "\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6"+ + "\u0006 \u0003\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@"+ + "\u0000\u0000\u03a8\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010"+ + "\u0000\u0000\u03aa\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f"+ + "\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003"+ + "\u0000\u03aeQ\u0001\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0"+ + "\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2"+ + "\u03b3\u0007\r\u0000\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5"+ + "\u0007\n\u0000\u0000\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007"+ + "\t\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\""+ + "\u0003\u0000\u03b9S\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000"+ + "\u03bb\u03bc\u0007\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd"+ + "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001"+ + "\u0000\u0000\u0000\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a"+ + "\u0000\u0000\u03c2\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000"+ + "\u0000\u03c4\u03c5\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000"+ + "\u03c6\u03c7\u0006$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9"+ + "\u0005@\u0000\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007"+ + "\u0007\u0000\u0000\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007"+ + "\r\u0000\u0000\u03cd\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015"+ + "\u0000\u0000\u03cf\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000"+ + "\u0000\u03d1\u03d2\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3"+ + "\u03d4\u0005@\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6"+ + "\u0007\u0010\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007"+ + "\t\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e"+ + "\u0000\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000"+ + "\u0000\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000"+ + "\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0"+ + "[\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007"+ + "\t\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ + "\u0000\u0000\u03e5\u03e6\u0007\r\u0000\u0000\u03e6\u03e7\u0007\u0005\u0000"+ + "\u0000\u03e7\u03e8\u0007\u0015\u0000\u0000\u03e8\u03e9\u0007\n\u0000\u0000"+ + "\u03e9\u03ea\u0007\u0012\u0000\u0000\u03ea\u03eb\u0007\u0005\u0000\u0000"+ + "\u03eb\u03ec\u0007\t\u0000\u0000\u03ec\u03ed\u0007\t\u0000\u0000\u03ed"+ + "\u03ee\u0007\u0005\u0000\u0000\u03ee\u03ef\u0007\n\u0000\u0000\u03ef\u03f0"+ + "\u0007\u001b\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f2"+ + "\u0006\'\u0003\u0000\u03f2]\u0001\u0000\u0000\u0000\u03f3\u03f4\u0005"+ + "@\u0000\u0000\u03f4\u03f5\u0007\u0007\u0000\u0000\u03f5\u03f6\u0007\n"+ + "\u0000\u0000\u03f6\u03f7\u0007\u000b\u0000\u0000\u03f7\u03f8\u0007\t\u0000"+ + "\u0000\u03f8\u03f9\u0007\u0007\u0000\u0000\u03f9\u03fa\u0007\u000e\u0000"+ + "\u0000\u03fa\u03fb\u0007\r\u0000\u0000\u03fb\u03fc\u0007\u0005\u0000\u0000"+ + "\u03fc\u03fd\u0007\u0015\u0000\u0000\u03fd\u03fe\u0007\n\u0000\u0000\u03fe"+ + "_\u0001\u0000\u0000\u0000\u03ff\u0400\u0005@\u0000\u0000\u0400\u0401\u0007"+ + "\u0014\u0000\u0000\u0401\u0402\u0007\u0005\u0000\u0000\u0402\u0403\u0007"+ + "\u0007\u0000\u0000\u0403\u0404\u0007\b\u0000\u0000\u0404\u0405\u0007\u000b"+ + "\u0000\u0000\u0405\u0406\u0001\u0000\u0000\u0000\u0406\u0407\u0006)\u0003"+ + "\u0000\u0407a\u0001\u0000\u0000\u0000\u0408\u0409\u0005@\u0000\u0000\u0409"+ + "\u040a\u0007\u0013\u0000\u0000\u040a\u040b\u0007\u0010\u0000\u0000\u040b"+ + "\u040c\u0007\u0016\u0000\u0000\u040c\u040d\u0007\u0007\u0000\u0000\u040d"+ + "\u040e\u0007\n\u0000\u0000\u040e\u040f\u0007\r\u0000\u0000\u040fc\u0001"+ + "\u0000\u0000\u0000\u0410\u0411\u0005@\u0000\u0000\u0411\u0412\u0007\t"+ + "\u0000\u0000\u0412\u0413\u0007\u000f\u0000\u0000\u0413\u0414\u0007\u0015"+ + "\u0000\u0000\u0414\u0415\u0007\f\u0000\u0000\u0415e\u0001\u0000\u0000"+ + "\u0000\u0416\u0417\u0005@\u0000\u0000\u0417\u0418\u0007\u0015\u0000\u0000"+ + "\u0418\u0419\u0007\u001c\u0000\u0000\u0419\u041a\u0007\u0007\u0000\u0000"+ + "\u041a\u041b\u0007\u0016\u0000\u0000\u041b\u041c\u0007\f\u0000\u0000\u041c"+ + "\u041d\u0007\u0016\u0000\u0000\u041d\u041e\u0007\u0005\u0000\u0000\u041e"+ + "\u041f\u0007\r\u0000\u0000\u041f\u0420\u0007\u0007\u0000\u0000\u0420g"+ + "\u0001\u0000\u0000\u0000\u0421\u0422\u0005@\u0000\u0000\u0422\u0423\u0007"+ + "\t\u0000\u0000\u0423\u0424\u0007\r\u0000\u0000\u0424\u0425\u0007\u0015"+ + "\u0000\u0000\u0425\u0426\u0007\u0013\u0000\u0000\u0426i\u0001\u0000\u0000"+ + "\u0000\u0427\u0428\u0005@\u0000\u0000\u0428\u0429\u0007\u0010\u0000\u0000"+ + "\u0429\u042a\u0007\u0013\u0000\u0000\u042a\u042b\u0007\u0013\u0000\u0000"+ + "\u042b\u042c\u0007\u0007\u0000\u0000\u042c\u042d\u0007\n\u0000\u0000\u042d"+ + "\u042e\u0007\u000b\u0000\u0000\u042ek\u0001\u0000\u0000\u0000\u042f\u0430"+ + "\u0005@\u0000\u0000\u0430\u0431\u0007\u0015\u0000\u0000\u0431\u0432\u0007"+ + "\n\u0000\u0000\u0432\u0433\u0007\u000e\u0000\u0000\u0433\u0434\u0007\u0007"+ + "\u0000\u0000\u0434m\u0001\u0000\u0000\u0000\u0435\u0436\u0005@\u0000\u0000"+ + "\u0436\u0437\u0007\u0007\u0000\u0000\u0437\u0438\u0007\n\u0000\u0000\u0438"+ + "\u0439\u0007\u000b\u0000\u0000\u0439\u043a\u0007\u0015\u0000\u0000\u043a"+ + "\u043b\u0007\n\u0000\u0000\u043b\u043c\u0007\u000e\u0000\u0000\u043c\u043d"+ + "\u0007\u0007\u0000\u0000\u043do\u0001\u0000\u0000\u0000\u043e\u043f\u0005"+ + "@\u0000\u0000\u043f\u0440\u0007\t\u0000\u0000\u0440\u0441\u0007\r\u0000"+ + "\u0000\u0441\u0442\u0007\u0010\u0000\u0000\u0442\u0443\u0007\u000e\u0000"+ + "\u0000\u0443\u0444\u0007\u0018\u0000\u0000\u0444\u0445\u0001\u0000\u0000"+ + "\u0000\u0445\u0446\u00061\u0003\u0000\u0446q\u0001\u0000\u0000\u0000\u0447"+ + "\u0448\u0005@\u0000\u0000\u0448\u0449\u0007\u0013\u0000\u0000\u0449\u044a"+ + "\u0007\u0011\u0000\u0000\u044a\u044b\u0007\t\u0000\u0000\u044b\u044c\u0007"+ + "\u000f\u0000\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044d\u044e\u0006"+ + "2\u0003\u0000\u044es\u0001\u0000\u0000\u0000\u044f\u0450\u0005@\u0000"+ + "\u0000\u0450\u0451\u0007\u0007\u0000\u0000\u0451\u0452\u0007\n\u0000\u0000"+ + "\u0452\u0453\u0007\u000b\u0000\u0000\u0453\u0454\u0007\u0013\u0000\u0000"+ + "\u0454\u0455\u0007\u0011\u0000\u0000\u0455\u0456\u0007\t\u0000\u0000\u0456"+ + "\u0457\u0007\u000f\u0000\u0000\u0457u\u0001\u0000\u0000\u0000\u0458\u0459"+ + "\u0005@\u0000\u0000\u0459\u045a\u0007\u0013\u0000\u0000\u045a\u045b\u0007"+ + "\u0011\u0000\u0000\u045b\u045c\u0007\t\u0000\u0000\u045c\u045d\u0007\u000f"+ + "\u0000\u0000\u045d\u045e\u0007\u0005\u0000\u0000\u045e\u045f\u0007\u0006"+ + "\u0000\u0000\u045f\u0460\u0001\u0000\u0000\u0000\u0460\u0461\u00064\u0003"+ + "\u0000\u0461w\u0001\u0000\u0000\u0000\u0462\u0463\u0005@\u0000\u0000\u0463"+ + "\u0464\u0007\u0007\u0000\u0000\u0464\u0465\u0007\n\u0000\u0000\u0465\u0466"+ + "\u0007\u000b\u0000\u0000\u0466\u0467\u0007\u0013\u0000\u0000\u0467\u0468"+ + "\u0007\u0011\u0000\u0000\u0468\u0469\u0007\t\u0000\u0000\u0469\u046a\u0007"+ + "\u000f\u0000\u0000\u046a\u046b\u0007\u0005\u0000\u0000\u046b\u046c\u0007"+ + "\u0006\u0000\u0000\u046cy\u0001\u0000\u0000\u0000\u046d\u046e\u0005@\u0000"+ + "\u0000\u046e\u046f\u0007\u0013\u0000\u0000\u046f\u0470\u0007\u0011\u0000"+ + "\u0000\u0470\u0471\u0007\t\u0000\u0000\u0471\u0472\u0007\u000f\u0000\u0000"+ + "\u0472\u0473\u0007\u0015\u0000\u0000\u0473\u0474\u0007\n\u0000\u0000\u0474"+ + "\u0475\u0007\u000e\u0000\u0000\u0475\u0476\u0007\u0007\u0000\u0000\u0476"+ + "\u0477\u0001\u0000\u0000\u0000\u0477\u0478\u00066\u0003\u0000\u0478{\u0001"+ + "\u0000\u0000\u0000\u0479\u047a\u0005@\u0000\u0000\u047a\u047b\u0007\u0007"+ + "\u0000\u0000\u047b\u047c\u0007\n\u0000\u0000\u047c\u047d\u0007\u000b\u0000"+ + "\u0000\u047d\u047e\u0007\u0013\u0000\u0000\u047e\u047f\u0007\u0011\u0000"+ + "\u0000\u047f\u0480\u0007\t\u0000\u0000\u0480\u0481\u0007\u000f\u0000\u0000"+ + "\u0481\u0482\u0007\u0015\u0000\u0000\u0482\u0483\u0007\n\u0000\u0000\u0483"+ + "\u0484\u0007\u000e\u0000\u0000\u0484\u0485\u0007\u0007\u0000\u0000\u0485"+ + "}\u0001\u0000\u0000\u0000\u0486\u0487\u0005@\u0000\u0000\u0487\u0488\u0007"+ + "\u0013\u0000\u0000\u0488\u0489\u0007\u0016\u0000\u0000\u0489\u048a\u0007"+ + "\u0007\u0000\u0000\u048a\u048b\u0007\u0013\u0000\u0000\u048b\u048c\u0007"+ + "\u0007\u0000\u0000\u048c\u048d\u0007\n\u0000\u0000\u048d\u048e\u0007\u000b"+ + "\u0000\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u00068\u0003"+ + "\u0000\u0490\u007f\u0001\u0000\u0000\u0000\u0491\u0492\u0005@\u0000\u0000"+ + "\u0492\u0493\u0007\u0007\u0000\u0000\u0493\u0494\u0007\n\u0000\u0000\u0494"+ + "\u0495\u0007\u000b\u0000\u0000\u0495\u0496\u0007\u0013\u0000\u0000\u0496"+ + "\u0497\u0007\u0016\u0000\u0000\u0497\u0498\u0007\u0007\u0000\u0000\u0498"+ + "\u0499\u0007\u0013\u0000\u0000\u0499\u049a\u0007\u0007\u0000\u0000\u049a"+ + "\u049b\u0007\n\u0000\u0000\u049b\u049c\u0007\u000b\u0000\u0000\u049c\u0081"+ + "\u0001\u0000\u0000\u0000\u049d\u049e\u0005@\u0000\u0000\u049e\u049f\u0007"+ + "\u0013\u0000\u0000\u049f\u04a0\u0007\u0016\u0000\u0000\u04a0\u04a1\u0007"+ + "\u0015\u0000\u0000\u04a1\u04a2\u0007\u0013\u0000\u0000\u04a2\u04a3\u0007"+ + "\t\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4\u04a5\u0006:"+ + "\u0001\u0000\u04a5\u0083\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005@\u0000"+ + "\u0000\u04a7\u04a8\u0007\u0006\u0000\u0000\u04a8\u04a9\u0007\u0016\u0000"+ + "\u0000\u04a9\u04aa\u0007\u0010\u0000\u0000\u04aa\u04ab\u0007\u001b\u0000"+ + "\u0000\u04ab\u04ac\u0007\u0012\u0000\u0000\u04ac\u04ad\u0007\u0007\u0000"+ + "\u0000\u04ad\u04ae\u0007\n\u0000\u0000\u04ae\u04af\u0007\r\u0000\u0000"+ + "\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u04b1\u0006;\u0000\u0000\u04b1"+ + "\u0085\u0001\u0000\u0000\u0000\u04b2\u04b3\u0005@\u0000\u0000\u04b3\u04b4"+ + "\u0007\u0007\u0000\u0000\u04b4\u04b5\u0007\n\u0000\u0000\u04b5\u04b6\u0007"+ + "\u000b\u0000\u0000\u04b6\u04b7\u0007\u0006\u0000\u0000\u04b7\u04b8\u0007"+ + "\u0016\u0000\u0000\u04b8\u04b9\u0007\u0010\u0000\u0000\u04b9\u04ba\u0007"+ + "\u001b\u0000\u0000\u04ba\u04bb\u0007\u0012\u0000\u0000\u04bb\u04bc\u0007"+ + "\u0007\u0000\u0000\u04bc\u04bd\u0007\n\u0000\u0000\u04bd\u04be\u0007\r"+ + "\u0000\u0000\u04be\u0087\u0001\u0000\u0000\u0000\u04bf\u04c0\u0005@\u0000"+ + "\u0000\u04c0\u04c1\u0007\u000e\u0000\u0000\u04c1\u04c2\u0007\t\u0000\u0000"+ + "\u04c2\u04c3\u0007\u0016\u0000\u0000\u04c3\u04c4\u0007\u0006\u0000\u0000"+ + "\u04c4\u0089\u0001\u0000\u0000\u0000\u04c5\u04c6\u0005@\u0000\u0000\u04c6"+ + "\u04c7\u0007\u0012\u0000\u0000\u04c7\u04c8\u0007\u0007\u0000\u0000\u04c8"+ + "\u04c9\u0007\r\u0000\u0000\u04c9\u04ca\u0007\u000f\u0000\u0000\u04ca\u04cb"+ + "\u0007\u0015\u0000\u0000\u04cb\u04cc\u0007\u000b\u0000\u0000\u04cc\u04cd"+ + "\u0001\u0000\u0000\u0000\u04cd\u04ce\u0006>\u0001\u0000\u04ce\u008b\u0001"+ + "\u0000\u0000\u0000\u04cf\u04d0\u0005@\u0000\u0000\u04d0\u04d1\u0007\u0007"+ + "\u0000\u0000\u04d1\u04d2\u0007\u0016\u0000\u0000\u04d2\u04d3\u0007\u0016"+ + "\u0000\u0000\u04d3\u04d4\u0007\u0015\u0000\u0000\u04d4\u04d5\u0007\u0016"+ + "\u0000\u0000\u04d5\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d7\u0006?\u0001"+ + "\u0000\u04d7\u008d\u0001\u0000\u0000\u0000\u04d8\u04d9\u0005@\u0000\u0000"+ + "\u04d9\u04da\u0007\u0007\u0000\u0000\u04da\u04db\u0007\n\u0000\u0000\u04db"+ + "\u04dc\u0007\u000b\u0000\u0000\u04dc\u04dd\u0007\u0007\u0000\u0000\u04dd"+ + "\u04de\u0007\u0016\u0000\u0000\u04de\u04df\u0007\u0016\u0000\u0000\u04df"+ + "\u04e0\u0007\u0015\u0000\u0000\u04e0\u04e1\u0007\u0016\u0000\u0000\u04e1"+ + "\u008f\u0001\u0000\u0000\u0000\u04e2\u04e3\u0005@\u0000\u0000\u04e3\u04e4"+ + "\u0007\u0013\u0000\u0000\u04e4\u04e5\u0007\u0016\u0000\u0000\u04e5\u04e6"+ + "\u0007\u0015\u0000\u0000\u04e6\u04e7\u0007\u000b\u0000\u0000\u04e7\u04e8"+ + "\u0007\u0011\u0000\u0000\u04e8\u04e9\u0007\u000e\u0000\u0000\u04e9\u04ea"+ + "\u0007\r\u0000\u0000\u04ea\u04eb\u0007\u0005\u0000\u0000\u04eb\u04ec\u0007"+ + "\u0015\u0000\u0000\u04ec\u04ed\u0007\n\u0000\u0000\u04ed\u0091\u0001\u0000"+ + "\u0000\u0000\u04ee\u04ef\u0005@\u0000\u0000\u04ef\u04f0\u0007\u0007\u0000"+ + "\u0000\u04f0\u04f1\u0007\n\u0000\u0000\u04f1\u04f2\u0007\u000b\u0000\u0000"+ + "\u04f2\u04f3\u0007\u0013\u0000\u0000\u04f3\u04f4\u0007\u0016\u0000\u0000"+ + "\u04f4\u04f5\u0007\u0015\u0000\u0000\u04f5\u04f6\u0007\u000b\u0000\u0000"+ + "\u04f6\u04f7\u0007\u0011\u0000\u0000\u04f7\u04f8\u0007\u000e\u0000\u0000"+ + "\u04f8\u04f9\u0007\r\u0000\u0000\u04f9\u04fa\u0007\u0005\u0000\u0000\u04fa"+ + "\u04fb\u0007\u0015\u0000\u0000\u04fb\u04fc\u0007\n\u0000\u0000\u04fc\u0093"+ + "\u0001\u0000\u0000\u0000\u04fd\u04fe\u0005@\u0000\u0000\u04fe\u04ff\u0007"+ + "\u0007\u0000\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501\u0007\u001c"+ + "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0006C\u0003"+ + "\u0000\u0503\u0095\u0001\u0000\u0000\u0000\u0504\u0505\u0005@\u0000\u0000"+ + "\u0505\u0506\u0007\u0007\u0000\u0000\u0506\u0507\u0007\n\u0000\u0000\u0507"+ + "\u0508\u0007\u000b\u0000\u0000\u0508\u0509\u0007\u0007\u0000\u0000\u0509"+ + "\u050a\u0007\n\u0000\u0000\u050a\u050b\u0007\u001c\u0000\u0000\u050b\u0097"+ + "\u0001\u0000\u0000\u0000\u050c\u050d\u0005@\u0000\u0000\u050d\u050e\u0007"+ + "\u0010\u0000\u0000\u050e\u050f\u0007\u0011\u0000\u0000\u050f\u0510\u0007"+ + "\r\u0000\u0000\u0510\u0518\u0007\u000f\u0000\u0000\u0511\u0512\u0005@"+ + "\u0000\u0000\u0512\u0513\u0007\u001b\u0000\u0000\u0513\u0514\u0007\u0011"+ + "\u0000\u0000\u0514\u0515\u0007\u0007\u0000\u0000\u0515\u0516\u0007\t\u0000"+ + "\u0000\u0516\u0518\u0007\r\u0000\u0000\u0517\u050c\u0001\u0000\u0000\u0000"+ + "\u0517\u0511\u0001\u0000\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000"+ + "\u0519\u051a\u0006E\u0003\u0000\u051a\u0099\u0001\u0000\u0000\u0000\u051b"+ + "\u051c\u0005@\u0000\u0000\u051c\u051d\u0007\u0007\u0000\u0000\u051d\u051e"+ + "\u0007\n\u0000\u0000\u051e\u051f\u0007\u000b\u0000\u0000\u051f\u0520\u0007"+ + "\u0010\u0000\u0000\u0520\u0521\u0007\u0011\u0000\u0000\u0521\u0522\u0007"+ + "\r\u0000\u0000\u0522\u052d\u0007\u000f\u0000\u0000\u0523\u0524\u0005@"+ + "\u0000\u0000\u0524\u0525\u0007\u0007\u0000\u0000\u0525\u0526\u0007\n\u0000"+ + "\u0000\u0526\u0527\u0007\u000b\u0000\u0000\u0527\u0528\u0007\u001b\u0000"+ + "\u0000\u0528\u0529\u0007\u0011\u0000\u0000\u0529\u052a\u0007\u0007\u0000"+ + "\u0000\u052a\u052b\u0007\t\u0000\u0000\u052b\u052d\u0007\r\u0000\u0000"+ + "\u052c\u051b\u0001\u0000\u0000\u0000\u052c\u0523\u0001\u0000\u0000\u0000"+ + "\u052d\u009b\u0001\u0000\u0000\u0000\u052e\u052f\u0005@\u0000\u0000\u052f"+ + "\u0530\u0007\u000e\u0000\u0000\u0530\u0531\u0007\u0010\u0000\u0000\u0531"+ + "\u0532\u0007\n\u0000\u0000\u0532\u0539\u0001\u0000\u0000\u0000\u0533\u0534"+ + "\u0007\n\u0000\u0000\u0534\u0535\u0007\u0015\u0000\u0000\u0535\u053a\u0007"+ + "\r\u0000\u0000\u0536\u0537\u0007\u0010\u0000\u0000\u0537\u0538\u0007\n"+ + "\u0000\u0000\u0538\u053a\u0007\u0014\u0000\u0000\u0539\u0533\u0001\u0000"+ + "\u0000\u0000\u0539\u0536\u0001\u0000\u0000\u0000\u0539\u053a\u0001\u0000"+ + "\u0000\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u053c\u0006G\u0000"+ + "\u0000\u053c\u009d\u0001\u0000\u0000\u0000\u053d\u053e\u0005@\u0000\u0000"+ + "\u053e\u053f\u0007\u0007\u0000\u0000\u053f\u0540\u0007\b\u0000\u0000\u0540"+ + "\u0541\u0007\t\u0000\u0000\u0541\u0542\u0007\u0007\u0000\u0000\u0542\u0543"+ + "\u0007\u000e\u0000\u0000\u0543\u0544\u0007\u0010\u0000\u0000\u0544\u0545"+ + "\u0007\n\u0000\u0000\u0545\u054c\u0001\u0000\u0000\u0000\u0546\u0547\u0007"+ + "\n\u0000\u0000\u0547\u0548\u0007\u0015\u0000\u0000\u0548\u054d\u0007\r"+ + "\u0000\u0000\u0549\u054a\u0007\u0010\u0000\u0000\u054a\u054b\u0007\n\u0000"+ + "\u0000\u054b\u054d\u0007\u0014\u0000\u0000\u054c\u0546\u0001\u0000\u0000"+ + "\u0000\u054c\u0549\u0001\u0000\u0000\u0000\u054c\u054d\u0001\u0000\u0000"+ + "\u0000\u054d\u054e\u0001\u0000\u0000\u0000\u054e\u054f\u0006H\u0000\u0000"+ + "\u054f\u009f\u0001\u0000\u0000\u0000\u0550\u0551\u0005@\u0000\u0000\u0551"+ + "\u0552\u0007\u0007\u0000\u0000\u0552\u0553\u0007\n\u0000\u0000\u0553\u0554"+ + "\u0007\u000b\u0000\u0000\u0554\u0555\u0007\u000e\u0000\u0000\u0555\u0556"+ + "\u0007\u0010\u0000\u0000\u0556\u0557\u0007\n\u0000\u0000\u0557\u055e\u0001"+ + "\u0000\u0000\u0000\u0558\u0559\u0007\n\u0000\u0000\u0559\u055a\u0007\u0015"+ + "\u0000\u0000\u055a\u055f\u0007\r\u0000\u0000\u055b\u055c\u0007\u0010\u0000"+ + "\u0000\u055c\u055d\u0007\n\u0000\u0000\u055d\u055f\u0007\u0014\u0000\u0000"+ + "\u055e\u0558\u0001\u0000\u0000\u0000\u055e\u055b\u0001\u0000\u0000\u0000"+ + "\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u00a1\u0001\u0000\u0000\u0000"+ + "\u0560\u0561\u0005@\u0000\u0000\u0561\u0562\u0007\u000e\u0000\u0000\u0562"+ + "\u0563\u0007\b\u0000\u0000\u0563\u0564\u0007\u0010\u0000\u0000\u0564\u0565"+ + "\u0007\t\u0000\u0000\u0565\u0566\u0007\t\u0000\u0000\u0566\u0567\u0001"+ + "\u0000\u0000\u0000\u0567\u0568\u0006J\u0001\u0000\u0568\u00a3\u0001\u0000"+ + "\u0000\u0000\u0569\u056a\u0005@\u0000\u0000\u056a\u056b\u0007\t\u0000"+ + "\u0000\u056b\u056c\u0007\r\u0000\u0000\u056c\u056d\u0007\u0014\u0000\u0000"+ + "\u056d\u056e\u0007\b\u0000\u0000\u056e\u056f\u0007\u0007\u0000\u0000\u056f"+ + "\u0570\u0001\u0000\u0000\u0000\u0570\u0571\u0006K\u0001\u0000\u0571\u00a5"+ + "\u0001\u0000\u0000\u0000\u0572\u0573\u0005@\u0000\u0000\u0573\u0574\u0007"+ + "\u000e\u0000\u0000\u0574\u0575\u0007\u000f\u0000\u0000\u0575\u0576\u0007"+ + "\u0007\u0000\u0000\u0576\u0577\u0007\u000e\u0000\u0000\u0577\u0578\u0007"+ + "\u0018\u0000\u0000\u0578\u0579\u0007\u0007\u0000\u0000\u0579\u059f\u0007"+ + "\u000b\u0000\u0000\u057a\u057b\u0005@\u0000\u0000\u057b\u057c\u0007\u000b"+ + "\u0000\u0000\u057c\u057d\u0007\u0005\u0000\u0000\u057d\u057e\u0007\t\u0000"+ + "\u0000\u057e\u057f\u0007\u0010\u0000\u0000\u057f\u0580\u0007\u0017\u0000"+ + "\u0000\u0580\u0581\u0007\b\u0000\u0000\u0581\u0582\u0007\u0007\u0000\u0000"+ + "\u0582\u059f\u0007\u000b\u0000\u0000\u0583\u0584\u0005@\u0000\u0000\u0584"+ + "\u0585\u0007\u0016\u0000\u0000\u0585\u0586\u0007\u0007\u0000\u0000\u0586"+ + "\u0587\u0007\u0010\u0000\u0000\u0587\u0588\u0007\u000b\u0000\u0000\u0588"+ + "\u0589\u0007\u0015\u0000\u0000\u0589\u058a\u0007\n\u0000\u0000\u058a\u058b"+ + "\u0007\b\u0000\u0000\u058b\u059f\u0007\u0014\u0000\u0000\u058c\u058d\u0005"+ + "@\u0000\u0000\u058d\u058e\u0007\u0016\u0000\u0000\u058e\u058f\u0007\u0007"+ + "\u0000\u0000\u058f\u0590\u0007\u001d\u0000\u0000\u0590\u0591\u0007\u0011"+ + "\u0000\u0000\u0591\u0592\u0007\u0005\u0000\u0000\u0592\u0593\u0007\u0016"+ + "\u0000\u0000\u0593\u0594\u0007\u0007\u0000\u0000\u0594\u059f\u0007\u000b"+ + "\u0000\u0000\u0595\u0596\u0005@\u0000\u0000\u0596\u0597\u0007\t\u0000"+ + "\u0000\u0597\u0598\u0007\u0007\u0000\u0000\u0598\u0599\u0007\b\u0000\u0000"+ + "\u0599\u059a\u0007\u0007\u0000\u0000\u059a\u059b\u0007\u000e\u0000\u0000"+ + "\u059b\u059c\u0007\r\u0000\u0000\u059c\u059d\u0007\u0007\u0000\u0000\u059d"+ + "\u059f\u0007\u000b\u0000\u0000\u059e\u0572\u0001\u0000\u0000\u0000\u059e"+ + "\u057a\u0001\u0000\u0000\u0000\u059e\u0583\u0001\u0000\u0000\u0000\u059e"+ + "\u058c\u0001\u0000\u0000\u0000\u059e\u0595\u0001\u0000\u0000\u0000\u059f"+ + "\u05a0\u0001\u0000\u0000\u0000\u05a0\u05a1\u0006L\u0000\u0000\u05a1\u00a7"+ + "\u0001\u0000\u0000\u0000\u05a2\u05a3\u0005@\u0000\u0000\u05a3\u05a4\u0007"+ + "\u0010\u0000\u0000\u05a4\u05a5\u0007\f\u0000\u0000\u05a5\u05a6\u0007\u0010"+ + "\u0000\u0000\u05a6\u05a7\u0007\u0016\u0000\u0000\u05a7\u05a8\u0007\u0007"+ + "\u0000\u0000\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0006M\u0000"+ + "\u0000\u05aa\u00a9\u0001\u0000\u0000\u0000\u05ab\u05ac\u0005@\u0000\u0000"+ + "\u05ac\u05ad\u0007\t\u0000\u0000\u05ad\u05ae\u0007\u0007\u0000\u0000\u05ae"+ + "\u05af\u0007\t\u0000\u0000\u05af\u05b0\u0007\t\u0000\u0000\u05b0\u05b1"+ + "\u0007\u0005\u0000\u0000\u05b1\u05b2\u0007\u0015\u0000\u0000\u05b2\u05b3"+ + "\u0007\n\u0000\u0000\u05b3\u05b4\u0001\u0000\u0000\u0000\u05b4\u05b5\u0006"+ + "N\u0000\u0000\u05b5\u00ab\u0001\u0000\u0000\u0000\u05b6\u05b7\u0005@\u0000"+ + "\u0000\u05b7\u05b8\u0007\u0007\u0000\u0000\u05b8\u05b9\u0007\n\u0000\u0000"+ + "\u05b9\u05ba\u0007\u000b\u0000\u0000\u05ba\u05bb\u0007\t\u0000\u0000\u05bb"+ + "\u05bc\u0007\u0007\u0000\u0000\u05bc\u05bd\u0007\t\u0000\u0000\u05bd\u05be"+ + "\u0007\t\u0000\u0000\u05be\u05bf\u0007\u0005\u0000\u0000\u05bf\u05c0\u0007"+ + "\u0015\u0000\u0000\u05c0\u05c1\u0007\n\u0000\u0000\u05c1\u00ad\u0001\u0000"+ + "\u0000\u0000\u05c2\u05c3\u0005@\u0000\u0000\u05c3\u05c4\u0007\u000b\u0000"+ + "\u0000\u05c4\u05cb\u0007\u000b\u0000\u0000\u05c5\u05c6\u0005@\u0000\u0000"+ + "\u05c6\u05c7\u0007\u000b\u0000\u0000\u05c7\u05c8\u0007\u0011\u0000\u0000"+ + "\u05c8\u05c9\u0007\u0012\u0000\u0000\u05c9\u05cb\u0007\u0013\u0000\u0000"+ + "\u05ca\u05c2\u0001\u0000\u0000\u0000\u05ca\u05c5\u0001\u0000\u0000\u0000"+ + "\u05cb\u05cc\u0001\u0000\u0000\u0000\u05cc\u05cd\u0006P\u0000\u0000\u05cd"+ + "\u00af\u0001\u0000\u0000\u0000\u05ce\u05cf\u0005@\u0000\u0000\u05cf\u05d0"+ + "\u0007\b\u0000\u0000\u05d0\u05d1\u0007\u0010\u0000\u0000\u05d1\u05d2\u0007"+ + "\n\u0000\u0000\u05d2\u05d3\u0007\u001b\u0000\u0000\u05d3\u05d4\u0001\u0000"+ + "\u0000\u0000\u05d4\u05d5\u0006Q\u0003\u0000\u05d5\u00b1\u0001\u0000\u0000"+ + "\u0000\u05d6\u05d7\u0005@\u0000\u0000\u05d7\u05d8\u0007\u0011\u0000\u0000"+ + "\u05d8\u05d9\u0007\t\u0000\u0000\u05d9\u05da\u0007\u0007\u0000\u0000\u05da"+ + "\u05db\u0001\u0000\u0000\u0000\u05db\u05dc\u0006R\u0003\u0000\u05dc\u00b3"+ + "\u0001\u0000\u0000\u0000\u05dd\u05de\u0005@\u0000\u0000\u05de\u05df\u0007"+ + "\u0005\u0000\u0000\u05df\u05e0\u0007\n\u0000\u0000\u05e0\u05e1\u0007\u001a"+ + "\u0000\u0000\u05e1\u05e2\u0007\u0007\u0000\u0000\u05e2\u05e3\u0007\u000e"+ + "\u0000\u0000\u05e3\u05e4\u0007\r\u0000\u0000\u05e4\u05e5\u0001\u0000\u0000"+ + "\u0000\u05e5\u05e6\u0006S\u0003\u0000\u05e6\u00b5\u0001\u0000\u0000\u0000"+ + "\u05e7\u05e8\u0005@\u0000\u0000\u05e8\u05e9\u0007\u0013\u0000\u0000\u05e9"+ + "\u05ea\u0007\u000f\u0000\u0000\u05ea\u05eb\u0007\u0013\u0000\u0000\u05eb"+ + "\u05ed\u0001\u0000\u0000\u0000\u05ec\u05ee\u0005 \u0000\u0000\u05ed\u05ec"+ + "\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee\u05ef"+ + "\u0001\u0000\u0000\u0000\u05ef\u05f0\u0004T\u0001\u0000\u05f0\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f1\u05f2\u0006T\u0004\u0000\u05f2\u05f3\u0006T\u0000"+ + "\u0000\u05f3\u00b7\u0001\u0000\u0000\u0000\u05f4\u05f5\u0005@\u0000\u0000"+ + "\u05f5\u05f6\u0007\u0013\u0000\u0000\u05f6\u05f7\u0007\u000f\u0000\u0000"+ + "\u05f7\u05f8\u0007\u0013\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000"+ + "\u05f9\u05fa\u0004U\u0002\u0000\u05fa\u05fb\u0001\u0000\u0000\u0000\u05fb"+ + "\u05fc\u0006U\u0005\u0000\u05fc\u00b9\u0001\u0000\u0000\u0000\u05fd\u05fe"+ + "\u0005@\u0000\u0000\u05fe\u05ff\u0007\u001c\u0000\u0000\u05ff\u0600\u0007"+ + "\u0007\u0000\u0000\u0600\u0601\u0007\u0016\u0000\u0000\u0601\u0602\u0007"+ + "\u0017\u0000\u0000\u0602\u0603\u0007\u0010\u0000\u0000\u0603\u0604\u0007"+ + "\r\u0000\u0000\u0604\u0605\u0007\u0005\u0000\u0000\u0605\u0606\u0007\u0012"+ + "\u0000\u0000\u0606\u0607\u0001\u0000\u0000\u0000\u0607\u0608\u0006V\u0006"+ + "\u0000\u0608\u00bb\u0001\u0000\u0000\u0000\u0609\u060a\u0005@\u0000\u0000"+ + "\u060a\u060b\u0007\u0007\u0000\u0000\u060b\u060c\u0007\n\u0000\u0000\u060c"+ + "\u060d\u0007\u000b\u0000\u0000\u060d\u060e\u0007\u001c\u0000\u0000\u060e"+ + "\u060f\u0007\u0007\u0000\u0000\u060f\u0610\u0007\u0016\u0000\u0000\u0610"+ + "\u0611\u0007\u0017\u0000\u0000\u0611\u0612\u0007\u0010\u0000\u0000\u0612"+ + "\u0613\u0007\r\u0000\u0000\u0613\u0614\u0007\u0005\u0000\u0000\u0614\u0615"+ + "\u0007\u0012\u0000\u0000\u0615\u00bd\u0001\u0000\u0000\u0000\u0616\u0617"+ + "\u0005@\u0000\u0000\u0617\u0618\u0007\b\u0000\u0000\u0618\u0619\u0007"+ + "\u0005\u0000\u0000\u0619\u061a\u0007\u001c\u0000\u0000\u061a\u061b\u0007"+ + "\u0007\u0000\u0000\u061b\u061c\u0007\f\u0000\u0000\u061c\u061d\u0007\u0005"+ + "\u0000\u0000\u061d\u061e\u0007\u0016\u0000\u0000\u061e\u061f\u0007\u0007"+ + "\u0000\u0000\u061f\u0620\u0007\t\u0000\u0000\u0620\u0621\u0007\r\u0000"+ + "\u0000\u0621\u0622\u0007\u0014\u0000\u0000\u0622\u0623\u0007\b\u0000\u0000"+ + "\u0623\u0624\u0007\u0007\u0000\u0000\u0624\u0654\u0007\t\u0000\u0000\u0625"+ + "\u0626\u0005@\u0000\u0000\u0626\u0627\u0007\u0017\u0000\u0000\u0627\u0628"+ + "\u0007\u0011\u0000\u0000\u0628\u0629\u0007\u0018\u0000\u0000\u0629\u062a"+ + "\u0007\t\u0000\u0000\u062a\u062b\u0007\r\u0000\u0000\u062b\u062c\u0007"+ + "\u0014\u0000\u0000\u062c\u062d\u0007\b\u0000\u0000\u062d\u062e\u0007\u0007"+ + "\u0000\u0000\u062e\u0654\u0007\t\u0000\u0000\u062f\u0630\u0005@\u0000"+ + "\u0000\u0630\u0631\u0007\b\u0000\u0000\u0631\u0632\u0007\u0005\u0000\u0000"+ + "\u0632\u0633\u0007\u001c\u0000\u0000\u0633\u0634\u0007\u0007\u0000\u0000"+ + "\u0634\u0635\u0007\f\u0000\u0000\u0635\u0636\u0007\u0005\u0000\u0000\u0636"+ + "\u0637\u0007\u0016\u0000\u0000\u0637\u0638\u0007\u0007\u0000\u0000\u0638"+ + "\u0639\u0007\t\u0000\u0000\u0639\u063a\u0007\u000e\u0000\u0000\u063a\u063b"+ + "\u0007\u0016\u0000\u0000\u063b\u063c\u0007\u0005\u0000\u0000\u063c\u063d"+ + "\u0007\u0013\u0000\u0000\u063d\u063e\u0007\r\u0000\u0000\u063e\u0654\u0007"+ + "\t\u0000\u0000\u063f\u0640\u0005@\u0000\u0000\u0640\u0641\u0007\u0017"+ + "\u0000\u0000\u0641\u0642\u0007\u0011\u0000\u0000\u0642\u0643\u0007\u0018"+ + "\u0000\u0000\u0643\u0644\u0007\t\u0000\u0000\u0644\u0645\u0007\u000e\u0000"+ + "\u0000\u0645\u0646\u0007\u0016\u0000\u0000\u0646\u0647\u0007\u0005\u0000"+ + "\u0000\u0647\u0648\u0007\u0013\u0000\u0000\u0648\u0649\u0007\r\u0000\u0000"+ + "\u0649\u0654\u0007\t\u0000\u0000\u064a\u064b\u0005@\u0000\u0000\u064b"+ + "\u064c\u0007\b\u0000\u0000\u064c\u064d\u0007\u0005\u0000\u0000\u064d\u064e"+ + "\u0007\u001c\u0000\u0000\u064e\u064f\u0007\u0007\u0000\u0000\u064f\u0650"+ + "\u0007\f\u0000\u0000\u0650\u0651\u0007\u0005\u0000\u0000\u0651\u0652\u0007"+ + "\u0016\u0000\u0000\u0652\u0654\u0007\u0007\u0000\u0000\u0653\u0616\u0001"+ + "\u0000\u0000\u0000\u0653\u0625\u0001\u0000\u0000\u0000\u0653\u062f\u0001"+ + "\u0000\u0000\u0000\u0653\u063f\u0001\u0000\u0000\u0000\u0653\u064a\u0001"+ + "\u0000\u0000\u0000\u0654\u00bf\u0001\u0000\u0000\u0000\u0655\u0656\u0005"+ + "@\u0000\u0000\u0656\u0657\u0007\u001c\u0000\u0000\u0657\u0658\u0007\u0005"+ + "\u0000\u0000\u0658\u0659\u0007\r\u0000\u0000\u0659\u065a\u0007\u0007\u0000"+ + "\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b\u065c\u0006Y\u0000\u0000"+ + "\u065c\u00c1\u0001\u0000\u0000\u0000\u065d\u065e\u0005@\u0000\u0000\u065e"+ + "\u065f\u0007\u001c\u0000\u0000\u065f\u0660\u0007\u0005\u0000\u0000\u0660"+ + "\u0661\u0007\r\u0000\u0000\u0661\u0662\u0007\u0007\u0000\u0000\u0662\u0663"+ + "\u0007\u0016\u0000\u0000\u0663\u0664\u0007\u0007\u0000\u0000\u0664\u0665"+ + "\u0007\u0010\u0000\u0000\u0665\u0666\u0007\u000e\u0000\u0000\u0666\u0667"+ + "\u0007\r\u0000\u0000\u0667\u0668\u0007\u0016\u0000\u0000\u0668\u0669\u0007"+ + "\u0007\u0000\u0000\u0669\u066a\u0007\u0006\u0000\u0000\u066a\u066b\u0007"+ + "\u0016\u0000\u0000\u066b\u066c\u0007\u0007\u0000\u0000\u066c\u066d\u0007"+ + "\t\u0000\u0000\u066d\u066e\u0007\u000f\u0000\u0000\u066e\u00c3\u0001\u0000"+ + "\u0000\u0000\u066f\u0670\u0005@\u0000\u0000\u0670\u0671\u0003\u00f0q\u0000"+ + "\u0671\u0672\u0004[\u0003\u0000\u0672\u0673\u0001\u0000\u0000\u0000\u0673"+ + "\u0674\u0006[\u0003\u0000\u0674\u00c5\u0001\u0000\u0000\u0000\u0675\u0676"+ + "\u0005@\u0000\u0000\u0676\u0677\u0003\u00f0q\u0000\u0677\u0678\u0004\\"+ + "\u0004\u0000\u0678\u00c7\u0001\u0000\u0000\u0000\u0679\u067a\u0005@\u0000"+ + "\u0000\u067a\u067b\u0003\u00f0q\u0000\u067b\u067c\u0004]\u0005\u0000\u067c"+ + "\u00c9\u0001\u0000\u0000\u0000\u067d\u067e\u0005{\u0000\u0000\u067e\u067f"+ + "\u0005{\u0000\u0000\u067f\u0680\u0001\u0000\u0000\u0000\u0680\u0681\u0006"+ + "^\u0007\u0000\u0681\u00cb\u0001\u0000\u0000\u0000\u0682\u0683\u0005{\u0000"+ + "\u0000\u0683\u0684\u0005!\u0000\u0000\u0684\u0685\u0005!\u0000\u0000\u0685"+ + "\u0686\u0001\u0000\u0000\u0000\u0686\u0687\u0006_\b\u0000\u0687\u00cd"+ + "\u0001\u0000\u0000\u0000\u0688\u0689\u0005@\u0000\u0000\u0689\u068a\u0001"+ + "\u0000\u0000\u0000\u068a\u068b\u0006`\t\u0000\u068b\u00cf\u0001\u0000"+ + "\u0000\u0000\u068c\u068d\u0005{\u0000\u0000\u068d\u068e\u0005!\u0000\u0000"+ + "\u068e\u068f\u0001\u0000\u0000\u0000\u068f\u0690\u0006a\t\u0000\u0690"+ + "\u00d1\u0001\u0000\u0000\u0000\u0691\u0692\u0005<\u0000\u0000\u0692\u0693"+ + "\u0005?\u0000\u0000\u0693\u0694\u0007\u0013\u0000\u0000\u0694\u0695\u0007"+ + "\u000f\u0000\u0000\u0695\u069a\u0007\u0013\u0000\u0000\u0696\u0697\u0005"+ + "<\u0000\u0000\u0697\u0698\u0005?\u0000\u0000\u0698\u069a\u0005=\u0000"+ + "\u0000\u0699\u0691\u0001\u0000\u0000\u0000\u0699\u0696\u0001\u0000\u0000"+ + "\u0000\u069a\u069b\u0001\u0000\u0000\u0000\u069b\u069c\u0006b\n\u0000"+ + "\u069c\u00d3\u0001\u0000\u0000\u0000\u069d\u069e\u0005<\u0000\u0000\u069e"+ + "\u069f\u0007\u0019\u0000\u0000\u069f\u06a0\u0005-\u0000\u0000\u06a0\u06ab"+ + "\u0001\u0000\u0000\u0000\u06a1\u06ac\u0003\u000e\u0000\u0000\u06a2\u06a7"+ + "\u0003\u000e\u0000\u0000\u06a3\u06a4\u0005:\u0000\u0000\u06a4\u06a5\u0005"+ + ":\u0000\u0000\u06a5\u06a6\u0001\u0000\u0000\u0000\u06a6\u06a8\u0003\u000e"+ + "\u0000\u0000\u06a7\u06a3\u0001\u0000\u0000\u0000\u06a8\u06a9\u0001\u0000"+ + "\u0000\u0000\u06a9\u06a7\u0001\u0000\u0000\u0000\u06a9\u06aa\u0001\u0000"+ + "\u0000\u0000\u06aa\u06ac\u0001\u0000\u0000\u0000\u06ab\u06a1\u0001\u0000"+ + "\u0000\u0000\u06ab\u06a2\u0001\u0000\u0000\u0000\u06ab\u06ac\u0001\u0000"+ + "\u0000\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06ae\u0006c\u000b"+ + "\u0000\u06ae\u00d5\u0001\u0000\u0000\u0000\u06af\u06b0\u0005<\u0000\u0000"+ + "\u06b0\u06b1\u0007\u0019\u0000\u0000\u06b1\u06b2\u0005-\u0000\u0000\u06b2"+ + "\u06b3\u0001\u0000\u0000\u0000\u06b3\u06b4\u0003\u000e\u0000\u0000\u06b4"+ + "\u06b5\u0004d\u0006\u0000\u06b5\u06b6\u0001\u0000\u0000\u0000\u06b6\u06b7"+ + "\u0006d\f\u0000\u06b7\u00d7\u0001\u0000\u0000\u0000\u06b8\u06ba\u0005"+ + "$\u0000\u0000\u06b9\u06b8\u0001\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000"+ + "\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06bc\u0005(\u0000"+ + "\u0000\u06bc\u06cc\u0003\u0014\u0003\u0000\u06bd\u06be\u0003\u00f4s\u0000"+ + "\u06be\u06c1\u0005)\u0000\u0000\u06bf\u06c0\u0005.\u0000\u0000\u06c0\u06c2"+ + "\u0003\u00f0q\u0000\u06c1\u06bf\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001"+ + "\u0000\u0000\u0000\u06c2\u06cc\u0001\u0000\u0000\u0000\u06c3\u06c8\u0003"+ + "\u0012\u0002\u0000\u06c4\u06c5\u0005.\u0000\u0000\u06c5\u06c7\u0003\u0012"+ + "\u0002\u0000\u06c6\u06c4\u0001\u0000\u0000\u0000\u06c7\u06ca\u0001\u0000"+ + "\u0000\u0000\u06c8\u06c6\u0001\u0000\u0000\u0000\u06c8\u06c9\u0001\u0000"+ + "\u0000\u0000\u06c9\u06cc\u0001\u0000\u0000\u0000\u06ca\u06c8\u0001\u0000"+ + "\u0000\u0000\u06cb\u06b9\u0001\u0000\u0000\u0000\u06cb\u06bd\u0001\u0000"+ + "\u0000\u0000\u06cb\u06c3\u0001\u0000\u0000\u0000\u06cc\u06cd\u0001\u0000"+ + "\u0000\u0000\u06cd\u06ce\u0006e\r\u0000\u06ce\u00d9\u0001\u0000\u0000"+ + "\u0000\u06cf\u06d0\u0005<\u0000\u0000\u06d0\u06d1\u0003\u00f4s\u0000\u06d1"+ + "\u00db\u0001\u0000\u0000\u0000\u06d2\u06d3\u0005<\u0000\u0000\u06d3\u06d4"+ + "\u0005/\u0000\u0000\u06d4\u06d5\u0001\u0000\u0000\u0000\u06d5\u06d9\u0003"+ + "\u00f4s\u0000\u06d6\u06d8\u0007\u001e\u0000\u0000\u06d7\u06d6\u0001\u0000"+ + "\u0000\u0000\u06d8\u06db\u0001\u0000\u0000\u0000\u06d9\u06d7\u0001\u0000"+ + "\u0000\u0000\u06d9\u06da\u0001\u0000\u0000\u0000\u06da\u06dc\u0001\u0000"+ + "\u0000\u0000\u06db\u06d9\u0001\u0000\u0000\u0000\u06dc\u06dd\u0005>\u0000"+ + "\u0000\u06dd\u06df\u0001\u0000\u0000\u0000\u06de\u06d2\u0001\u0000\u0000"+ + "\u0000\u06df\u06e0\u0001\u0000\u0000\u0000\u06e0\u06de\u0001\u0000\u0000"+ + "\u0000\u06e0\u06e1\u0001\u0000\u0000\u0000\u06e1\u06e2\u0001\u0000\u0000"+ + "\u0000\u06e2\u06e3\u0006g\r\u0000\u06e3\u00dd\u0001\u0000\u0000\u0000"+ + "\u06e4\u06e5\u0005/\u0000\u0000\u06e5\u06e6\u0005>\u0000\u0000\u06e6\u06e7"+ + "\u0001\u0000\u0000\u0000\u06e7\u06e8\u0006h\u000e\u0000\u06e8\u06e9\u0001"+ + "\u0000\u0000\u0000\u06e9\u06ea\u0006h\t\u0000\u06ea\u00df\u0001\u0000"+ + "\u0000\u0000\u06eb\u06ec\u0005>\u0000\u0000\u06ec\u06ed\u0006i\u000f\u0000"+ + "\u06ed\u06ee\u0001\u0000\u0000\u0000\u06ee\u06ef\u0006i\t\u0000\u06ef"+ + "\u00e1\u0001\u0000\u0000\u0000\u06f0\u06f4\u0005\"\u0000\u0000\u06f1\u06f3"+ + "\u0003\u00e4k\u0000\u06f2\u06f1\u0001\u0000\u0000\u0000\u06f3\u06f6\u0001"+ + "\u0000\u0000\u0000\u06f4\u06f2\u0001\u0000\u0000\u0000\u06f4\u06f5\u0001"+ + "\u0000\u0000\u0000\u06f5\u06f7\u0001\u0000\u0000\u0000\u06f6\u06f4\u0001"+ + "\u0000\u0000\u0000\u06f7\u06fd\u0005\"\u0000\u0000\u06f8\u06f9\u0007\u0004"+ + "\u0000\u0000\u06f9\u06fa\u0003\u00e4k\u0000\u06fa\u06fb\u0007\u0004\u0000"+ + "\u0000\u06fb\u06fd\u0001\u0000\u0000\u0000\u06fc\u06f0\u0001\u0000\u0000"+ + "\u0000\u06fc\u06f8\u0001\u0000\u0000\u0000\u06fd\u06fe\u0001\u0000\u0000"+ + "\u0000\u06fe\u06ff\u0006j\r\u0000\u06ff\u00e3\u0001\u0000\u0000\u0000"+ + "\u0700\u0702\u0005 \u0000\u0000\u0701\u0700\u0001\u0000\u0000\u0000\u0702"+ + "\u0705\u0001\u0000\u0000\u0000\u0703\u0701\u0001\u0000\u0000\u0000\u0703"+ + "\u0704\u0001\u0000\u0000\u0000\u0704\u0706\u0001\u0000\u0000\u0000\u0705"+ + "\u0703\u0001\u0000\u0000\u0000\u0706\u0709\u0003\u00f4s\u0000\u0707\u0708"+ + "\u0005/\u0000\u0000\u0708\u070a\u0003\u00f4s\u0000\u0709\u0707\u0001\u0000"+ + "\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u0709\u0001\u0000"+ + "\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c\u070f\u0001\u0000"+ + "\u0000\u0000\u070d\u070e\u0005.\u0000\u0000\u070e\u0710\u0003\u00f0q\u0000"+ + "\u070f\u070d\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000"+ + "\u0710\u071b\u0001\u0000\u0000\u0000\u0711\u0712\u0005?\u0000\u0000\u0712"+ + "\u0718\u0003\u00f0q\u0000\u0713\u0714\u0003\u00ean\u0000\u0714\u0715\u0003"+ + "\u00f0q\u0000\u0715\u0717\u0001\u0000\u0000\u0000\u0716\u0713\u0001\u0000"+ + "\u0000\u0000\u0717\u071a\u0001\u0000\u0000\u0000\u0718\u0716\u0001\u0000"+ + "\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000\u0719\u071c\u0001\u0000"+ + "\u0000\u0000\u071a\u0718\u0001\u0000\u0000\u0000\u071b\u0711\u0001\u0000"+ + "\u0000\u0000\u071b\u071c\u0001\u0000\u0000\u0000\u071c\u071d\u0001\u0000"+ + "\u0000\u0000\u071d\u071e\u0006k\r\u0000\u071e\u00e5\u0001\u0000\u0000"+ + "\u0000\u071f\u0721\u0005 \u0000\u0000\u0720\u071f\u0001\u0000\u0000\u0000"+ + "\u0721\u0724\u0001\u0000\u0000\u0000\u0722\u0720\u0001\u0000\u0000\u0000"+ + "\u0722\u0723\u0001\u0000\u0000\u0000\u0723\u0725\u0001\u0000\u0000\u0000"+ + "\u0724\u0722\u0001\u0000\u0000\u0000\u0725\u072c\u0003\u00f4s\u0000\u0726"+ + "\u0728\u0005 \u0000\u0000\u0727\u0726\u0001\u0000\u0000\u0000\u0728\u0729"+ + "\u0001\u0000\u0000\u0000\u0729\u0727\u0001\u0000\u0000\u0000\u0729\u072a"+ + "\u0001\u0000\u0000\u0000\u072a\u072b\u0001\u0000\u0000\u0000\u072b\u072d"+ + "\u0003\u00f4s\u0000\u072c\u0727\u0001\u0000\u0000\u0000\u072d\u072e\u0001"+ + "\u0000\u0000\u0000\u072e\u072c\u0001\u0000\u0000\u0000\u072e\u072f\u0001"+ + "\u0000\u0000\u0000\u072f\u0730\u0001\u0000\u0000\u0000\u0730\u0731\u0006"+ + "l\r\u0000\u0731\u00e7\u0001\u0000\u0000\u0000\u0732\u0733\u0003\u00f4"+ + "s\u0000\u0733\u0734\u0006m\u0010\u0000\u0734\u00e9\u0001\u0000\u0000\u0000"+ + "\u0735\u0736\u0005=\u0000\u0000\u0736\u00eb\u0001\u0000\u0000\u0000\u0737"+ + "\u0739\u0005 \u0000\u0000\u0738\u0737\u0001\u0000\u0000\u0000\u0739\u073a"+ + "\u0001\u0000\u0000\u0000\u073a\u0738\u0001\u0000\u0000\u0000\u073a\u073b"+ + "\u0001\u0000\u0000\u0000\u073b\u0742\u0001\u0000\u0000\u0000\u073c\u073e"+ + "\u0007\u001f\u0000\u0000\u073d\u073c\u0001\u0000\u0000\u0000\u073e\u073f"+ + "\u0001\u0000\u0000\u0000\u073f\u073d\u0001\u0000\u0000\u0000\u073f\u0740"+ + "\u0001\u0000\u0000\u0000\u0740\u0742\u0001\u0000\u0000\u0000\u0741\u0738"+ + "\u0001\u0000\u0000\u0000\u0741\u073d\u0001\u0000\u0000\u0000\u0742\u0743"+ + "\u0001\u0000\u0000\u0000\u0743\u0744\u0006o\r\u0000\u0744\u00ed\u0001"+ + "\u0000\u0000\u0000\u0745\u0746\t\u0000\u0000\u0000\u0746\u0747\u0001\u0000"+ + "\u0000\u0000\u0747\u0748\u0006p\r\u0000\u0748\u00ef\u0001\u0000\u0000"+ + "\u0000\u0749\u074d\u0007 \u0000\u0000\u074a\u074c\u0007!\u0000\u0000\u074b"+ + "\u074a\u0001\u0000\u0000\u0000\u074c\u074f\u0001\u0000\u0000\u0000\u074d"+ + "\u074b\u0001\u0000\u0000\u0000\u074d\u074e\u0001\u0000\u0000\u0000\u074e"+ + "\u00f1\u0001\u0000\u0000\u0000\u074f\u074d\u0001\u0000\u0000\u0000\u0750"+ + "\u0754\u0007\u0000\u0000\u0000\u0751\u0753\u0007\"\u0000\u0000\u0752\u0751"+ + "\u0001\u0000\u0000\u0000\u0753\u0756\u0001\u0000\u0000\u0000\u0754\u0752"+ + "\u0001\u0000\u0000\u0000\u0754\u0755\u0001\u0000\u0000\u0000\u0755\u00f3"+ + "\u0001\u0000\u0000\u0000\u0756\u0754\u0001\u0000\u0000\u0000\u0757\u075b"+ + "\u0007 \u0000\u0000\u0758\u075a\u0007#\u0000\u0000\u0759\u0758\u0001\u0000"+ + "\u0000\u0000\u075a\u075d\u0001\u0000\u0000\u0000\u075b\u0759\u0001\u0000"+ + "\u0000\u0000\u075b\u075c\u0001\u0000\u0000\u0000\u075c\u00f5\u0001\u0000"+ + "\u0000\u0000\u075d\u075b\u0001\u0000\u0000\u0000\u075e\u075f\u0007$\u0000"+ + "\u0000\u075f\u00f7\u0001\u0000\u0000\u0000\u0760\u0765\u0005\"\u0000\u0000"+ + "\u0761\u0764\u0003\u00f6t\u0000\u0762\u0764\t\u0000\u0000\u0000\u0763"+ + "\u0761\u0001\u0000\u0000\u0000\u0763\u0762\u0001\u0000\u0000\u0000\u0764"+ + "\u0767\u0001\u0000\u0000\u0000\u0765\u0766\u0001\u0000\u0000\u0000\u0765"+ + "\u0763\u0001\u0000\u0000\u0000\u0766\u0768\u0001\u0000\u0000\u0000\u0767"+ + "\u0765\u0001\u0000\u0000\u0000\u0768\u0769\u0005\"\u0000\u0000\u0769\u00f9"+ + "\u0001\u0000\u0000\u0000\u076a\u0770\u0005\'\u0000\u0000\u076b\u076f\b"+ + "\u0004\u0000\u0000\u076c\u076d\u0005\\\u0000\u0000\u076d\u076f\t\u0000"+ + "\u0000\u0000\u076e\u076b\u0001\u0000\u0000\u0000\u076e\u076c\u0001\u0000"+ + "\u0000\u0000\u076f\u0772\u0001\u0000\u0000\u0000\u0770\u076e\u0001\u0000"+ + "\u0000\u0000\u0770\u0771\u0001\u0000\u0000\u0000\u0771\u0773\u0001\u0000"+ + "\u0000\u0000\u0772\u0770\u0001\u0000\u0000\u0000\u0773\u0774\u0005\'\u0000"+ + "\u0000\u0774\u00fb\u0001\u0000\u0000\u0000\u0775\u0776\u0005/\u0000\u0000"+ + "\u0776\u0777\u0005/\u0000\u0000\u0777\u077b\u0001\u0000\u0000\u0000\u0778"+ + "\u077a\b\u001f\u0000\u0000\u0779\u0778\u0001\u0000\u0000\u0000\u077a\u077d"+ + "\u0001\u0000\u0000\u0000\u077b\u0779\u0001\u0000\u0000\u0000\u077b\u077c"+ + "\u0001\u0000\u0000\u0000\u077c\u00fd\u0001\u0000\u0000\u0000\u077d\u077b"+ + "\u0001\u0000\u0000\u0000\u077e\u077f\u0005$\u0000\u0000\u077f\u0780\u0003"+ + "\u00f0q\u0000\u0780\u00ff\u0001\u0000\u0000\u0000\u0781\u0782\u0007\u0010"+ + "\u0000\u0000\u0782\u0783\u0007\u0016\u0000\u0000\u0783\u0784\u0007\u0016"+ + "\u0000\u0000\u0784\u0785\u0007\u0010\u0000\u0000\u0785\u0794\u0007\u0014"+ + "\u0000\u0000\u0786\u0787\u0007\u000e\u0000\u0000\u0787\u0788\u0007\b\u0000"+ + "\u0000\u0788\u0789\u0007\u0010\u0000\u0000\u0789\u078a\u0007\t\u0000\u0000"+ + "\u078a\u0794\u0007\t\u0000\u0000\u078b\u078c\u0007\u0007\u0000\u0000\u078c"+ + "\u078d\u0007\u0012\u0000\u0000\u078d\u078e\u0007\u0013\u0000\u0000\u078e"+ + "\u078f\u0007\r\u0000\u0000\u078f\u0794\u0007\u0014\u0000\u0000\u0790\u0791"+ + "\u0007\u0011\u0000\u0000\u0791\u0792\u0007\t\u0000\u0000\u0792\u0794\u0007"+ + "\u0007\u0000\u0000\u0793\u0781\u0001\u0000\u0000\u0000\u0793\u0786\u0001"+ + "\u0000\u0000\u0000\u0793\u078b\u0001\u0000\u0000\u0000\u0793\u0790\u0001"+ + "\u0000\u0000\u0000\u0794\u0101\u0001\u0000\u0000\u0000\u0795\u0796\u0002"+ + "09\u0000\u0796\u0103\u0001\u0000\u0000\u0000\u0797\u0798\u0005{\u0000"+ + "\u0000\u0798\u0799\u0005{\u0000\u0000\u0799\u079a\u0005-\u0000\u0000\u079a"+ + "\u079b\u0005-\u0000\u0000\u079b\u079c\u0001\u0000\u0000\u0000\u079c\u079d"+ + "\u0006{\u0011\u0000\u079d\u079e\u0006{\r\u0000\u079e\u0105\u0001\u0000"+ + "\u0000\u0000\u079f\u07a0\u0005@\u0000\u0000\u07a0\u07a1\u0003\u00f4s\u0000"+ + "\u07a1\u07a2\u0005.\u0000\u0000\u07a2\u07a3\u0001\u0000\u0000\u0000\u07a3"+ + "\u07a4\u0006|\t\u0000\u07a4\u0107\u0001\u0000\u0000\u0000\u07a5\u07aa"+ + "\u0005@\u0000\u0000\u07a6\u07a8\u0003\u0102z\u0000\u07a7\u07a9\u0005."+ + "\u0000\u0000\u07a8\u07a7\u0001\u0000\u0000\u0000\u07a8\u07a9\u0001\u0000"+ + "\u0000\u0000\u07a9\u07ab\u0001\u0000\u0000\u0000\u07aa\u07a6\u0001\u0000"+ + "\u0000\u0000\u07ab\u07ac\u0001\u0000\u0000\u0000\u07ac\u07aa\u0001\u0000"+ + "\u0000\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0001\u0000"+ + "\u0000\u0000\u07ae\u07af\u0006}\t\u0000\u07af\u0109\u0001\u0000\u0000"+ + "\u0000\u07b0\u07b1\u0005{\u0000\u0000\u07b1\u07b2\u0005{\u0000\u0000\u07b2"+ + "\u088f\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ + "@\u0000\u0000\u07b5\u07b7\u0001\u0000\u0000\u0000\u07b6\u07b8\u0005@\u0000"+ + "\u0000\u07b7\u07b6\u0001\u0000\u0000\u0000\u07b7\u07b8\u0001\u0000\u0000"+ + "\u0000\u07b8\u088f\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ + "\u07ba\u07bb\u0005{\u0000\u0000\u07bb\u07bd\u0001\u0000\u0000\u0000\u07bc"+ + "\u07be\u0005{\u0000\u0000\u07bd\u07bc\u0001\u0000\u0000\u0000\u07bd\u07be"+ + "\u0001\u0000\u0000\u0000\u07be\u088f\u0001\u0000\u0000\u0000\u07bf\u07c0"+ + "\u0005@\u0000\u0000\u07c0\u07c1\u0007\u0012\u0000\u0000\u07c1\u07c2\u0007"+ + "\u0007\u0000\u0000\u07c2\u07c3\u0007\u000b\u0000\u0000\u07c3\u07c4\u0007"+ + "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c9\u0001"+ + "\u0000\u0000\u0000\u07c6\u07c8\u0007%\u0000\u0000\u07c7\u07c6\u0001\u0000"+ + "\u0000\u0000\u07c8\u07cb\u0001\u0000\u0000\u0000\u07c9\u07c7\u0001\u0000"+ + "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07cd\u0001\u0000"+ + "\u0000\u0000\u07cb\u07c9\u0001\u0000\u0000\u0000\u07cc\u07ce\u0005(\u0000"+ + "\u0000\u07cd\u07cc\u0001\u0000\u0000\u0000\u07cd\u07ce\u0001\u0000\u0000"+ + "\u0000\u07ce\u088f\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ + "\u07d0\u07d1\u0007\u000e\u0000\u0000\u07d1\u07d2\u0007\u000f\u0000\u0000"+ + "\u07d2\u07d3\u0007\u0010\u0000\u0000\u07d3\u07d4\u0007\u0016\u0000\u0000"+ + "\u07d4\u07d5\u0007\t\u0000\u0000\u07d5\u07d6\u0007\u0007\u0000\u0000\u07d6"+ + "\u07d7\u0007\r\u0000\u0000\u07d7\u07db\u0001\u0000\u0000\u0000\u07d8\u07da"+ + "\u0007%\u0000\u0000\u07d9\u07d8\u0001\u0000\u0000\u0000\u07da\u07dd\u0001"+ + "\u0000\u0000\u0000\u07db\u07d9\u0001\u0000\u0000\u0000\u07db\u07dc\u0001"+ + "\u0000\u0000\u0000\u07dc\u088f\u0001\u0000\u0000\u0000\u07dd\u07db\u0001"+ + "\u0000\u0000\u0000\u07de\u07df\u0005@\u0000\u0000\u07df\u07e0\u0007\u0005"+ + "\u0000\u0000\u07e0\u07e1\u0007\u0012\u0000\u0000\u07e1\u07e2\u0007\u0013"+ + "\u0000\u0000\u07e2\u07e3\u0007\u0015\u0000\u0000\u07e3\u07e4\u0007\u0016"+ + "\u0000\u0000\u07e4\u07e5\u0007\r\u0000\u0000\u07e5\u07e9\u0001\u0000\u0000"+ + "\u0000\u07e6\u07e8\u0007%\u0000\u0000\u07e7\u07e6\u0001\u0000\u0000\u0000"+ + "\u07e8\u07eb\u0001\u0000\u0000\u0000\u07e9\u07e7\u0001\u0000\u0000\u0000"+ + "\u07e9\u07ea\u0001\u0000\u0000\u0000\u07ea\u088f\u0001\u0000\u0000\u0000"+ + "\u07eb\u07e9\u0001\u0000\u0000\u0000\u07ec\u07ed\u0005@\u0000\u0000\u07ed"+ + "\u07ee\u0007\n\u0000\u0000\u07ee\u07ef\u0007\u0010\u0000\u0000\u07ef\u07f0"+ + "\u0007\u0012\u0000\u0000\u07f0\u07f1\u0007\u0007\u0000\u0000\u07f1\u07f2"+ + "\u0007\t\u0000\u0000\u07f2\u07f3\u0007\u0013\u0000\u0000\u07f3\u07f4\u0007"+ + "\u0010\u0000\u0000\u07f4\u07f5\u0007\u000e\u0000\u0000\u07f5\u07f6\u0007"+ + "\u0007\u0000\u0000\u07f6\u07fa\u0001\u0000\u0000\u0000\u07f7\u07f9\u0007"+ + "%\u0000\u0000\u07f8\u07f7\u0001\u0000\u0000\u0000\u07f9\u07fc\u0001\u0000"+ + "\u0000\u0000\u07fa\u07f8\u0001\u0000\u0000\u0000\u07fa\u07fb\u0001\u0000"+ + "\u0000\u0000\u07fb\u088f\u0001\u0000\u0000\u0000\u07fc\u07fa\u0001\u0000"+ + "\u0000\u0000\u07fd\u07fe\u0005@\u0000\u0000\u07fe\u07ff\u0007\u000b\u0000"+ + "\u0000\u07ff\u0800\u0007\u0015\u0000\u0000\u0800\u0801\u0007\u000e\u0000"+ + "\u0000\u0801\u0802\u0007\u0011\u0000\u0000\u0802\u0803\u0007\u0012\u0000"+ + "\u0000\u0803\u0804\u0007\u0007\u0000\u0000\u0804\u0805\u0007\n\u0000\u0000"+ + "\u0805\u0806\u0007\r\u0000\u0000\u0806\u080a\u0001\u0000\u0000\u0000\u0807"+ + "\u0809\u0007%\u0000\u0000\u0808\u0807\u0001\u0000\u0000\u0000\u0809\u080c"+ + "\u0001\u0000\u0000\u0000\u080a\u0808\u0001\u0000\u0000\u0000\u080a\u080b"+ + "\u0001\u0000\u0000\u0000\u080b\u088f\u0001\u0000\u0000\u0000\u080c\u080a"+ + "\u0001\u0000\u0000\u0000\u080d\u080e\u0005@\u0000\u0000\u080e\u080f\u0007"+ + "\u0006\u0000\u0000\u080f\u0810\u0007\u0015\u0000\u0000\u0810\u0811\u0007"+ + "\n\u0000\u0000\u0811\u0812\u0007\r\u0000\u0000\u0812\u0813\u0005-\u0000"+ + "\u0000\u0813\u0814\u0007\u0006\u0000\u0000\u0814\u0815\u0007\u0010\u0000"+ + "\u0000\u0815\u0816\u0007\u000e\u0000\u0000\u0816\u0817\u0007\u0007\u0000"+ + "\u0000\u0817\u081b\u0001\u0000\u0000\u0000\u0818\u081a\u0007%\u0000\u0000"+ + "\u0819\u0818\u0001\u0000\u0000\u0000\u081a\u081d\u0001\u0000\u0000\u0000"+ + "\u081b\u0819\u0001\u0000\u0000\u0000\u081b\u081c\u0001\u0000\u0000\u0000"+ + "\u081c\u088f\u0001\u0000\u0000\u0000\u081d\u081b\u0001\u0000\u0000\u0000"+ + "\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0007\u0013\u0000\u0000\u0820"+ + "\u0821\u0007\u0010\u0000\u0000\u0821\u0822\u0007\u001b\u0000\u0000\u0822"+ + "\u0823\u0007\u0007\u0000\u0000\u0823\u0827\u0001\u0000\u0000\u0000\u0824"+ + "\u0826\u0007%\u0000\u0000\u0825\u0824\u0001\u0000\u0000\u0000\u0826\u0829"+ + "\u0001\u0000\u0000\u0000\u0827\u0825\u0001\u0000\u0000\u0000\u0827\u0828"+ + "\u0001\u0000\u0000\u0000\u0828\u088f\u0001\u0000\u0000\u0000\u0829\u0827"+ + "\u0001\u0000\u0000\u0000\u082a\u082b\u0005@\u0000\u0000\u082b\u082c\u0007"+ + "\t\u0000\u0000\u082c\u082d\u0007\u0011\u0000\u0000\u082d\u082e\u0007\u0013"+ + "\u0000\u0000\u082e\u082f\u0007\u0013\u0000\u0000\u082f\u0830\u0007\u0015"+ + "\u0000\u0000\u0830\u0831\u0007\u0016\u0000\u0000\u0831\u0832\u0007\r\u0000"+ + "\u0000\u0832\u0833\u0007\t\u0000\u0000\u0833\u0837\u0001\u0000\u0000\u0000"+ + "\u0834\u0836\u0007%\u0000\u0000\u0835\u0834\u0001\u0000\u0000\u0000\u0836"+ + "\u0839\u0001\u0000\u0000\u0000\u0837\u0835\u0001\u0000\u0000\u0000\u0837"+ + "\u0838\u0001\u0000\u0000\u0000\u0838\u088f\u0001\u0000\u0000\u0000\u0839"+ + "\u0837\u0001\u0000\u0000\u0000\u083a\u083b\u0005@\u0000\u0000\u083b\u083c"+ + "\u0007\b\u0000\u0000\u083c\u083d\u0007\u0010\u0000\u0000\u083d\u083e\u0007"+ + "\u0014\u0000\u0000\u083e\u083f\u0007\u0007\u0000\u0000\u083f\u0840\u0007"+ + "\u0016\u0000\u0000\u0840\u0844\u0001\u0000\u0000\u0000\u0841\u0843\u0007"+ + "%\u0000\u0000\u0842\u0841\u0001\u0000\u0000\u0000\u0843\u0846\u0001\u0000"+ + "\u0000\u0000\u0844\u0842\u0001\u0000\u0000\u0000\u0844\u0845\u0001\u0000"+ + "\u0000\u0000\u0845\u088f\u0001\u0000\u0000\u0000\u0846\u0844\u0001\u0000"+ + "\u0000\u0000\u0847\u0848\u0005@\u0000\u0000\u0848\u0849\u0007\r\u0000"+ + "\u0000\u0849\u084a\u0007\u0010\u0000\u0000\u084a\u084b\u0007\u0005\u0000"+ + "\u0000\u084b\u084c\u0007\b\u0000\u0000\u084c\u084d\u0007\f\u0000\u0000"+ + "\u084d\u084e\u0007\u0005\u0000\u0000\u084e\u084f\u0007\n\u0000\u0000\u084f"+ + "\u0850\u0007\u000b\u0000\u0000\u0850\u0854\u0001\u0000\u0000\u0000\u0851"+ + "\u0853\u0007%\u0000\u0000\u0852\u0851\u0001\u0000\u0000\u0000\u0853\u0856"+ + "\u0001\u0000\u0000\u0000\u0854\u0852\u0001\u0000\u0000\u0000\u0854\u0855"+ + "\u0001\u0000\u0000\u0000\u0855\u088f\u0001\u0000\u0000\u0000\u0856\u0854"+ + "\u0001\u0000\u0000\u0000\u0857\u0858\u0005@\u0000\u0000\u0858\u0859\u0007"+ + "\u0010\u0000\u0000\u0859\u085a\u0007\u0013\u0000\u0000\u085a\u085b\u0007"+ + "\u0013\u0000\u0000\u085b\u085c\u0007\b\u0000\u0000\u085c\u085d\u0007\u0014"+ + "\u0000\u0000\u085d\u0861\u0001\u0000\u0000\u0000\u085e\u0860\u0007%\u0000"+ + "\u0000\u085f\u085e\u0001\u0000\u0000\u0000\u0860\u0863\u0001\u0000\u0000"+ + "\u0000\u0861\u085f\u0001\u0000\u0000\u0000\u0861\u0862\u0001\u0000\u0000"+ + "\u0000\u0862\u088f\u0001\u0000\u0000\u0000\u0863\u0861\u0001\u0000\u0000"+ + "\u0000\u0864\u0865\u0005@\u0000\u0000\u0865\u0866\u0005-\u0000\u0000\u0866"+ + "\u0867\u0007\f\u0000\u0000\u0867\u0868\u0007\u0007\u0000\u0000\u0868\u0869"+ + "\u0007\u0017\u0000\u0000\u0869\u086a\u0007\u0018\u0000\u0000\u086a\u086b"+ + "\u0007\u0005\u0000\u0000\u086b\u086c\u0007\r\u0000\u0000\u086c\u086d\u0005"+ + "-\u0000\u0000\u086d\u086e\u0007\u0018\u0000\u0000\u086e\u086f\u0007\u0007"+ + "\u0000\u0000\u086f\u0870\u0007\u0014\u0000\u0000\u0870\u0871\u0007\u0006"+ + "\u0000\u0000\u0871\u0872\u0007\u0016\u0000\u0000\u0872\u0873\u0007\u0010"+ + "\u0000\u0000\u0873\u0874\u0007\u0012\u0000\u0000\u0874\u0875\u0007\u0007"+ + "\u0000\u0000\u0875\u0876\u0007\t\u0000\u0000\u0876\u087a\u0001\u0000\u0000"+ + "\u0000\u0877\u0879\u0007%\u0000\u0000\u0878\u0877\u0001\u0000\u0000\u0000"+ + "\u0879\u087c\u0001\u0000\u0000\u0000\u087a\u0878\u0001\u0000\u0000\u0000"+ + "\u087a\u087b\u0001\u0000\u0000\u0000\u087b\u088f\u0001\u0000\u0000\u0000"+ + "\u087c\u087a\u0001\u0000\u0000\u0000\u087d\u087e\u0005@\u0000\u0000\u087e"+ + "\u087f\u0007\u0018\u0000\u0000\u087f\u0880\u0007\u0007\u0000\u0000\u0880"+ + "\u0881\u0007\u0014\u0000\u0000\u0881\u0882\u0007\u0006\u0000\u0000\u0882"+ + "\u0883\u0007\u0016\u0000\u0000\u0883\u0884\u0007\u0010\u0000\u0000\u0884"+ + "\u0885\u0007\u0012\u0000\u0000\u0885\u0886\u0007\u0007\u0000\u0000\u0886"+ + "\u0887\u0007\t\u0000\u0000\u0887\u088b\u0001\u0000\u0000\u0000\u0888\u088a"+ + "\u0007%\u0000\u0000\u0889\u0888\u0001\u0000\u0000\u0000\u088a\u088d\u0001"+ + "\u0000\u0000\u0000\u088b\u0889\u0001\u0000\u0000\u0000\u088b\u088c\u0001"+ + "\u0000\u0000\u0000\u088c\u088f\u0001\u0000\u0000\u0000\u088d\u088b\u0001"+ + "\u0000\u0000\u0000\u088e\u07b0\u0001\u0000\u0000\u0000\u088e\u07b3\u0001"+ + "\u0000\u0000\u0000\u088e\u07b9\u0001\u0000\u0000\u0000\u088e\u07bf\u0001"+ + "\u0000\u0000\u0000\u088e\u07cf\u0001\u0000\u0000\u0000\u088e\u07de\u0001"+ + "\u0000\u0000\u0000\u088e\u07ec\u0001\u0000\u0000\u0000\u088e\u07fd\u0001"+ + "\u0000\u0000\u0000\u088e\u080d\u0001\u0000\u0000\u0000\u088e\u081e\u0001"+ + "\u0000\u0000\u0000\u088e\u082a\u0001\u0000\u0000\u0000\u088e\u083a\u0001"+ + "\u0000\u0000\u0000\u088e\u0847\u0001\u0000\u0000\u0000\u088e\u0857\u0001"+ + "\u0000\u0000\u0000\u088e\u0864\u0001\u0000\u0000\u0000\u088e\u087d\u0001"+ + "\u0000\u0000\u0000\u088f\u0890\u0001\u0000\u0000\u0000\u0890\u0891\u0006"+ + "~\t\u0000\u0891\u010b\u0001\u0000\u0000\u0000\u0892\u0893\u0003\u00fe"+ + "x\u0000\u0893\u0894\u0001\u0000\u0000\u0000\u0894\u0895\u0006\u007f\u0012"+ + "\u0000\u0895\u010d\u0001\u0000\u0000\u0000\u0896\u0897\u0003\u0100y\u0000"+ + "\u0897\u0898\u0001\u0000\u0000\u0000\u0898\u0899\u0006\u0080\u0013\u0000"+ + "\u0899\u010f\u0001\u0000\u0000\u0000\u089a\u089c\u0005\\\u0000\u0000\u089b"+ + "\u089a\u0001\u0000\u0000\u0000\u089b\u089c\u0001\u0000\u0000\u0000\u089c"+ + "\u08a0\u0001\u0000\u0000\u0000\u089d\u089e\u0003\u00f0q\u0000\u089e\u089f"+ + "\u0005\\\u0000\u0000\u089f\u08a1\u0001\u0000\u0000\u0000\u08a0\u089d\u0001"+ + "\u0000\u0000\u0000\u08a1\u08a2\u0001\u0000\u0000\u0000\u08a2\u08a0\u0001"+ + "\u0000\u0000\u0000\u08a2\u08a3\u0001\u0000\u0000\u0000\u08a3\u08a4\u0001"+ + "\u0000\u0000\u0000\u08a4\u08a5\u0006\u0081\u0014\u0000\u08a5\u0111\u0001"+ + "\u0000\u0000\u0000\u08a6\u08a7\u0003\u00f0q\u0000\u08a7\u08a8\u0001\u0000"+ + "\u0000\u0000\u08a8\u08a9\u0006\u0082\u0015\u0000\u08a9\u0113\u0001\u0000"+ + "\u0000\u0000\u08aa\u08ab\u0005:\u0000\u0000\u08ab\u08ac\u0005:\u0000\u0000"+ + "\u08ac\u08ad\u0001\u0000\u0000\u0000\u08ad\u08ae\u0006\u0083\u0016\u0000"+ + "\u08ae\u0115\u0001\u0000\u0000\u0000\u08af\u08b0\u0005}\u0000\u0000\u08b0"+ + "\u08b1\u0005}\u0000\u0000\u08b1\u08b2\u0001\u0000\u0000\u0000\u08b2\u08b3"+ + "\u0006\u0084\u0017\u0000\u08b3\u0117\u0001\u0000\u0000\u0000\u08b4\u08b5"+ + "\u0005(\u0000\u0000\u08b5\u08b6\u0001\u0000\u0000\u0000\u08b6\u08b7\u0006"+ + "\u0085\u0018\u0000\u08b7\u0119\u0001\u0000\u0000\u0000\u08b8\u08b9\u0005"+ + ")\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba\u08bb\u0006\u0086"+ + "\u0019\u0000\u08bb\u011b\u0001\u0000\u0000\u0000\u08bc\u08bd\u0005-\u0000"+ + "\u0000\u08bd\u08be\u0005>\u0000\u0000\u08be\u08bf\u0001\u0000\u0000\u0000"+ + "\u08bf\u08c0\u0006\u0087\u001a\u0000\u08c0\u011d\u0001\u0000\u0000\u0000"+ + "\u08c1\u08c2\t\u0000\u0000\u0000\u08c2\u08c3\u0001\u0000\u0000\u0000\u08c3"+ + "\u08c4\u0006\u0088\r\u0000\u08c4\u011f\u0001\u0000\u0000\u0000\u08c5\u08c6"+ + "\u0005\u0000\u0000\u0001\u08c6\u08c7\u0001\u0000\u0000\u0000\u08c7\u08c8"+ + "\u0006\u0089\u001b\u0000\u08c8\u08c9\u0006\u0089\u0017\u0000\u08c9\u0121"+ + "\u0001\u0000\u0000\u0000\u08ca\u08cb\u0003\u00fex\u0000\u08cb\u08cc\u0001"+ + "\u0000\u0000\u0000\u08cc\u08cd\u0006\u008a\u0012\u0000\u08cd\u0123\u0001"+ + "\u0000\u0000\u0000\u08ce\u08cf\u0003\u0100y\u0000\u08cf\u08d0\u0001\u0000"+ + "\u0000\u0000\u08d0\u08d1\u0006\u008b\u0013\u0000\u08d1\u0125\u0001\u0000"+ + "\u0000\u0000\u08d2\u08d4\u0005\\\u0000\u0000\u08d3\u08d2\u0001\u0000\u0000"+ + "\u0000\u08d3\u08d4\u0001\u0000\u0000\u0000\u08d4\u08d8\u0001\u0000\u0000"+ + "\u0000\u08d5\u08d6\u0003\u00f0q\u0000\u08d6\u08d7\u0005\\\u0000\u0000"+ + "\u08d7\u08d9\u0001\u0000\u0000\u0000\u08d8\u08d5\u0001\u0000\u0000\u0000"+ + "\u08d9\u08da\u0001\u0000\u0000\u0000\u08da\u08d8\u0001\u0000\u0000\u0000"+ + "\u08da\u08db\u0001\u0000\u0000\u0000\u08db\u08dc\u0001\u0000\u0000\u0000"+ + "\u08dc\u08dd\u0006\u008c\u0014\u0000\u08dd\u0127\u0001\u0000\u0000\u0000"+ + "\u08de\u08df\u0003\u00f0q\u0000\u08df\u08e0\u0001\u0000\u0000\u0000\u08e0"+ + "\u08e1\u0006\u008d\u0015\u0000\u08e1\u0129\u0001\u0000\u0000\u0000\u08e2"+ + "\u08e3\u0005:\u0000\u0000\u08e3\u08e4\u0005:\u0000\u0000\u08e4\u08e5\u0001"+ + "\u0000\u0000\u0000\u08e5\u08e6\u0006\u008e\u0016\u0000\u08e6\u012b\u0001"+ + "\u0000\u0000\u0000\u08e7\u08e8\u0005!\u0000\u0000\u08e8\u08e9\u0005!\u0000"+ + "\u0000\u08e9\u08ea\u0005}\u0000\u0000\u08ea\u08eb\u0001\u0000\u0000\u0000"+ + "\u08eb\u08ec\u0006\u008f\u0017\u0000\u08ec\u012d\u0001\u0000\u0000\u0000"+ + "\u08ed\u08ee\u0005(\u0000\u0000\u08ee\u08ef\u0001\u0000\u0000\u0000\u08ef"+ + "\u08f0\u0006\u0090\u0018\u0000\u08f0\u012f\u0001\u0000\u0000\u0000\u08f1"+ + "\u08f2\u0005)\u0000\u0000\u08f2\u08f3\u0001\u0000\u0000\u0000\u08f3\u08f4"+ + "\u0006\u0091\u0019\u0000\u08f4\u0131\u0001\u0000\u0000\u0000\u08f5\u08f6"+ + "\u0005-\u0000\u0000\u08f6\u08f7\u0005>\u0000\u0000\u08f7\u08f8\u0001\u0000"+ + "\u0000\u0000\u08f8\u08f9\u0006\u0092\u001a\u0000\u08f9\u0133\u0001\u0000"+ + "\u0000\u0000\u08fa\u08fb\t\u0000\u0000\u0000\u08fb\u08fc\u0001\u0000\u0000"+ + "\u0000\u08fc\u08fd\u0006\u0093\r\u0000\u08fd\u0135\u0001\u0000\u0000\u0000"+ + "\u08fe\u08ff\u0005\u0000\u0000\u0001\u08ff\u0900\u0001\u0000\u0000\u0000"+ + "\u0900\u0901\u0006\u0094\u001b\u0000\u0901\u0902\u0006\u0094\u0017\u0000"+ + "\u0902\u0137\u0001\u0000\u0000\u0000\u0903\u0905\u0007%\u0000\u0000\u0904"+ + "\u0903\u0001\u0000\u0000\u0000\u0905\u0906\u0001\u0000\u0000\u0000\u0906"+ + "\u0904\u0001\u0000\u0000\u0000\u0906\u0907\u0001\u0000\u0000\u0000\u0907"+ + "\u0908\u0001\u0000\u0000\u0000\u0908\u0909\u0004\u0095\u0007\u0000\u0909"+ + "\u090a\u0001\u0000\u0000\u0000\u090a\u090b\u0006\u0095\r\u0000\u090b\u090c"+ + "\u0006\u0095\u0017\u0000\u090c\u0139\u0001\u0000\u0000\u0000\u090d\u090f"+ + "\u0007%\u0000\u0000\u090e\u090d\u0001\u0000\u0000\u0000\u090f\u0910\u0001"+ + "\u0000\u0000\u0000\u0910\u090e\u0001\u0000\u0000\u0000\u0910\u0911\u0001"+ + "\u0000\u0000\u0000\u0911\u0912\u0001\u0000\u0000\u0000\u0912\u0913\u0006"+ + "\u0096\r\u0000\u0913\u013b\u0001\u0000\u0000\u0000\u0914\u0915\u0005("+ + "\u0000\u0000\u0915\u0916\u0001\u0000\u0000\u0000\u0916\u0917\u0006\u0097"+ + "\u001c\u0000\u0917\u0918\u0006\u0097\u001d\u0000\u0918\u013d\u0001\u0000"+ + "\u0000\u0000\u0919\u091a\t\u0000\u0000\u0000\u091a\u091b\u0004\u0098\b"+ + "\u0000\u091b\u091c\u0001\u0000\u0000\u0000\u091c\u091d\u0006\u0098\t\u0000"+ + "\u091d\u091e\u0006\u0098\u0017\u0000\u091e\u013f\u0001\u0000\u0000\u0000"+ + "\u091f\u0920\t\u0000\u0000\u0000\u0920\u0921\u0001\u0000\u0000\u0000\u0921"+ + "\u0922\u0006\u0099\t\u0000\u0922\u0923\u0006\u0099\u0017\u0000\u0923\u0141"+ + "\u0001\u0000\u0000\u0000\u0924\u0925\u0004\u009a\t\u0000\u0925\u0926\u0005"+ + "(\u0000\u0000\u0926\u0927\u0006\u009a\u001e\u0000\u0927\u0928\u0001\u0000"+ + "\u0000\u0000\u0928\u0929\u0006\u009a\u001c\u0000\u0929\u0143\u0001\u0000"+ + "\u0000\u0000\u092a\u092b\u0004\u009b\n\u0000\u092b\u092c\u0005)\u0000"+ + "\u0000\u092c\u092d\u0006\u009b\u001f\u0000\u092d\u092e\u0001\u0000\u0000"+ + "\u0000\u092e\u092f\u0006\u009b \u0000\u092f\u0930\u0006\u009b!\u0000\u0930"+ + "\u0145\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009c\u000b\u0000\u0932"+ + "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009c\"\u0000\u0934\u0935"+ + "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009c\u001c\u0000\u0936\u0147"+ + "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009d\f\u0000\u0938\u0939\u0005"+ + ")\u0000\u0000\u0939\u093a\u0006\u009d#\u0000\u093a\u093b\u0001\u0000\u0000"+ + "\u0000\u093b\u093c\u0006\u009d\u001c\u0000\u093c\u0149\u0001\u0000\u0000"+ + "\u0000\u093d\u093e\u0005)\u0000\u0000\u093e\u093f\u0004\u009e\r\u0000"+ + "\u093f\u0940\u0001\u0000\u0000\u0000\u0940\u0941\u0006\u009e \u0000\u0941"+ + "\u0942\u0006\u009e!\u0000\u0942\u014b\u0001\u0000\u0000\u0000\u0943\u0944"+ + "\t\u0000\u0000\u0000\u0944\u0945\u0001\u0000\u0000\u0000\u0945\u0946\u0006"+ + "\u009f\u001c\u0000\u0946\u014d\u0001\u0000\u0000\u0000\u0947\u0948\u0005"+ + "\u0000\u0000\u0001\u0948\u0949\u0001\u0000\u0000\u0000\u0949\u094a\u0006"+ + "\u00a0\u001b\u0000\u094a\u094b\u0006\u00a0\u0017\u0000\u094b\u014f\u0001"+ + "\u0000\u0000\u0000\u094c\u094e\u0007%\u0000\u0000\u094d\u094c\u0001\u0000"+ + "\u0000\u0000\u094e\u094f\u0001\u0000\u0000\u0000\u094f\u094d\u0001\u0000"+ + "\u0000\u0000\u094f\u0950\u0001\u0000\u0000\u0000\u0950\u0951\u0001\u0000"+ + "\u0000\u0000\u0951\u0952\u0006\u00a1\r\u0000\u0952\u0151\u0001\u0000\u0000"+ + "\u0000\u0953\u0954\u0005(\u0000\u0000\u0954\u0955\u0006\u00a2$\u0000\u0955"+ + "\u0956\u0001\u0000\u0000\u0000\u0956\u0957\u0006\u00a2%\u0000\u0957\u0153"+ + "\u0001\u0000\u0000\u0000\u0958\u0959\t\u0000\u0000\u0000\u0959\u095a\u0001"+ + "\u0000\u0000\u0000\u095a\u095b\u0006\u00a3\t\u0000\u095b\u095c\u0006\u00a3"+ + "\u0017\u0000\u095c\u0155\u0001\u0000\u0000\u0000\u095d\u095e\u0005[\u0000"+ + "\u0000\u095e\u095f\u0006\u00a4&\u0000\u095f\u0960\u0001\u0000\u0000\u0000"+ + "\u0960\u0961\u0006\u00a4\'\u0000\u0961\u0157\u0001\u0000\u0000\u0000\u0962"+ + "\u0963\u0005]\u0000\u0000\u0963\u0964\u0006\u00a5(\u0000\u0964\u0965\u0001"+ + "\u0000\u0000\u0000\u0965\u0966\u0006\u00a5)\u0000\u0966\u0159\u0001\u0000"+ + "\u0000\u0000\u0967\u0968\u0005{\u0000\u0000\u0968\u0969\u0006\u00a6*\u0000"+ + "\u0969\u096a\u0001\u0000\u0000\u0000\u096a\u096b\u0006\u00a6 \u0000\u096b"+ + "\u015b\u0001\u0000\u0000\u0000\u096c\u096d\u0005}\u0000\u0000\u096d\u096e"+ + "\u0006\u00a7+\u0000\u096e\u096f\u0001\u0000\u0000\u0000\u096f\u0970\u0006"+ + "\u00a7 \u0000\u0970\u015d\u0001\u0000\u0000\u0000\u0971\u0974\u0003\u00f8"+ + "u\u0000\u0972\u0974\u0003\u00fav\u0000\u0973\u0971\u0001\u0000\u0000\u0000"+ + "\u0973\u0972\u0001\u0000\u0000\u0000\u0974\u015f\u0001\u0000\u0000\u0000"+ + "\u0975\u0976\u0003\u00fex\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977"+ + "\u0978\u0006\u00a9\u0012\u0000\u0978\u0161\u0001\u0000\u0000\u0000\u0979"+ + "\u097a\u0003\u0100y\u0000\u097a\u097b\u0001\u0000\u0000\u0000\u097b\u097c"+ + "\u0006\u00aa\u0013\u0000\u097c\u0163\u0001\u0000\u0000\u0000\u097d\u097f"+ + "\u0005\\\u0000\u0000\u097e\u097d\u0001\u0000\u0000\u0000\u097e\u097f\u0001"+ + "\u0000"; + private static final String _serializedATNSegment1 = + "\u0000\u0000\u097f\u0983\u0001\u0000\u0000\u0000\u0980\u0981\u0003\u00f0"+ + "q\u0000\u0981\u0982\u0005\\\u0000\u0000\u0982\u0984\u0001\u0000\u0000"+ + "\u0000\u0983\u0980\u0001\u0000\u0000\u0000\u0984\u0985\u0001\u0000\u0000"+ + "\u0000\u0985\u0983\u0001\u0000\u0000\u0000\u0985\u0986\u0001\u0000\u0000"+ + "\u0000\u0986\u0987\u0001\u0000\u0000\u0000\u0987\u0988\u0006\u00ab\u0014"+ + "\u0000\u0988\u0165\u0001\u0000\u0000\u0000\u0989\u098a\u0003\u00f0q\u0000"+ + "\u098a\u098b\u0001\u0000\u0000\u0000\u098b\u098c\u0006\u00ac\u0015\u0000"+ + "\u098c\u0167\u0001\u0000\u0000\u0000\u098d\u098e\u0005:\u0000\u0000\u098e"+ + "\u098f\u0005:\u0000\u0000\u098f\u0990\u0001\u0000\u0000\u0000\u0990\u0991"+ + "\u0006\u00ad\u0016\u0000\u0991\u0169\u0001\u0000\u0000\u0000\u0992\u0993"+ + "\u0005(\u0000\u0000\u0993\u0994\u0006\u00ae,\u0000\u0994\u0995\u0001\u0000"+ + "\u0000\u0000\u0995\u0996\u0006\u00ae\u0018\u0000\u0996\u016b\u0001\u0000"+ + "\u0000\u0000\u0997\u0998\u0005)\u0000\u0000\u0998\u0999\u0006\u00af-\u0000"+ + "\u0999\u016d\u0001\u0000\u0000\u0000\u099a\u099b\t\u0000\u0000\u0000\u099b"+ + "\u099c\u0001\u0000\u0000\u0000\u099c\u099d\u0006\u00b0\r\u0000\u099d\u016f"+ + "\u0001\u0000\u0000\u0000\u099e\u099f\u0005\u0000\u0000\u0001\u099f\u09a0"+ + "\u0001\u0000\u0000\u0000\u09a0\u09a1\u0006\u00b1\u001b\u0000\u09a1\u09a2"+ + "\u0006\u00b1\u0017\u0000\u09a2\u0171\u0001\u0000\u0000\u0000\u09a3\u09a5"+ + "\u0007%\u0000\u0000\u09a4\u09a3\u0001\u0000\u0000\u0000\u09a5\u09a6\u0001"+ + "\u0000\u0000\u0000\u09a6\u09a4\u0001\u0000\u0000\u0000\u09a6\u09a7\u0001"+ + "\u0000\u0000\u0000\u09a7\u09a8\u0001\u0000\u0000\u0000\u09a8\u09a9\u0006"+ + "\u00b2\r\u0000\u09a9\u0173\u0001\u0000\u0000\u0000\u09aa\u09ab\u0005("+ + "\u0000\u0000\u09ab\u09ac\u0006\u00b3.\u0000\u09ac\u09ad\u0001\u0000\u0000"+ + "\u0000\u09ad\u09ae\u0006\u00b3/\u0000\u09ae\u09af\u0006\u00b30\u0000\u09af"+ + "\u0175\u0001\u0000\u0000\u0000\u09b0\u09b1\t\u0000\u0000\u0000\u09b1\u09b2"+ + "\u0001\u0000\u0000\u0000\u09b2\u09b3\u0006\u00b4\t\u0000\u09b3\u09b4\u0006"+ + "\u00b4\u0017\u0000\u09b4\u0177\u0001\u0000\u0000\u0000\u09b5\u09b7\u0007"+ + "%\u0000\u0000\u09b6\u09b5\u0001\u0000\u0000\u0000\u09b7\u09b8\u0001\u0000"+ + "\u0000\u0000\u09b8\u09b6\u0001\u0000\u0000\u0000\u09b8\u09b9\u0001\u0000"+ + "\u0000\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b5"+ + "\r\u0000\u09bb\u0179\u0001\u0000\u0000\u0000\u09bc\u09bd\u0005(\u0000"+ + "\u0000\u09bd\u09be\u0006\u00b61\u0000\u09be\u017b\u0001\u0000\u0000\u0000"+ + "\u09bf\u09c0\u0005)\u0000\u0000\u09c0\u09c1\u0006\u00b72\u0000\u09c1\u017d"+ + "\u0001\u0000\u0000\u0000\u09c2\u09c3\u0007\u0010\u0000\u0000\u09c3\u09c4"+ + "\u0007\t\u0000\u0000\u09c4\u017f\u0001\u0000\u0000\u0000\u09c5\u09c6\u0003"+ + "\u00fex\u0000\u09c6\u09c7\u0001\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b9"+ + "\u0012\u0000\u09c8\u0181\u0001\u0000\u0000\u0000\u09c9\u09ca\u0005=\u0000"+ + "\u0000\u09ca\u09cb\u0005>\u0000\u0000\u09cb\u0183\u0001\u0000\u0000\u0000"+ + "\u09cc\u09cd\u0003\u0100y\u0000\u09cd\u09ce\u0001\u0000\u0000\u0000\u09ce"+ + "\u09cf\u0006\u00bb \u0000\u09cf\u0185\u0001\u0000\u0000\u0000\u09d0\u09d4"+ + "\u0003\u00f8u\u0000\u09d1\u09d4\u0003\u00fav\u0000\u09d2\u09d4\u0003\u00f0"+ + "q\u0000\u09d3\u09d0\u0001\u0000\u0000\u0000\u09d3\u09d1\u0001\u0000\u0000"+ + "\u0000\u09d3\u09d2\u0001\u0000\u0000\u0000\u09d4\u09d5\u0001\u0000\u0000"+ + "\u0000\u09d5\u09d6\u0006\u00bc \u0000\u09d6\u0187\u0001\u0000\u0000\u0000"+ + "\u09d7\u09d8\u0005:\u0000\u0000\u09d8\u09d9\u0005:\u0000\u0000\u09d9\u09da"+ + "\u0001\u0000\u0000\u0000\u09da\u09db\u0006\u00bd \u0000\u09db\u0189\u0001"+ + "\u0000\u0000\u0000\u09dc\u09dd\t\u0000\u0000\u0000\u09dd\u09de\u0001\u0000"+ + "\u0000\u0000\u09de\u09df\u0006\u00be \u0000\u09df\u018b\u0001\u0000\u0000"+ + "\u0000\u09e0\u09e1\u0005\u0000\u0000\u0001\u09e1\u09e2\u0001\u0000\u0000"+ + "\u0000\u09e2\u09e3\u0006\u00bf\u001b\u0000\u09e3\u09e4\u0006\u00bf\u0017"+ + "\u0000\u09e4\u018d\u0001\u0000\u0000\u0000\u09e5\u09e6\u0003\u00fcw\u0000"+ + "\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8\u0006\u00c03\u0000\u09e8"+ + "\u018f\u0001\u0000\u0000\u0000\u09e9\u09ea\u0005[\u0000\u0000\u09ea\u09eb"+ + "\u0006\u00c14\u0000\u09eb\u0191\u0001\u0000\u0000\u0000\u09ec\u09ed\u0005"+ + "]\u0000\u0000\u09ed\u09ee\u0006\u00c25\u0000\u09ee\u0193\u0001\u0000\u0000"+ + "\u0000\u09ef\u09f0\u0005{\u0000\u0000\u09f0\u09f1\u0006\u00c36\u0000\u09f1"+ + "\u09f2\u0001\u0000\u0000\u0000\u09f2\u09f3\u0006\u00c37\u0000\u09f3\u0195"+ + "\u0001\u0000\u0000\u0000\u09f4\u09f5\u0005}\u0000\u0000\u09f5\u09f6\u0006"+ + "\u00c48\u0000\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006\u00c4"+ + "7\u0000\u09f8\u0197\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005(\u0000\u0000"+ + "\u09fa\u09fb\u0006\u00c59\u0000\u09fb\u09fc\u0001\u0000\u0000\u0000\u09fc"+ + "\u09fd\u0006\u00c57\u0000\u09fd\u0199\u0001\u0000\u0000\u0000\u09fe\u09ff"+ + "\u0005)\u0000\u0000\u09ff\u0a00\u0006\u00c6:\u0000\u0a00\u019b\u0001\u0000"+ + "\u0000\u0000\u0a01\u0a04\u0003\u00f8u\u0000\u0a02\u0a04\u0003\u00fav\u0000"+ + "\u0a03\u0a01\u0001\u0000\u0000\u0000\u0a03\u0a02\u0001\u0000\u0000\u0000"+ + "\u0a04\u019d\u0001\u0000\u0000\u0000\u0a05\u0a06\u0003\u00fex\u0000\u0a06"+ + "\u0a07\u0001\u0000\u0000\u0000\u0a07\u0a08\u0006\u00c8\u0012\u0000\u0a08"+ + "\u019f\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0005=\u0000\u0000\u0a0a\u0a0b"+ + "\u0005>\u0000\u0000\u0a0b\u01a1\u0001\u0000\u0000\u0000\u0a0c\u0a0d\u0003"+ + "\u0100y\u0000\u0a0d\u0a0e\u0001\u0000\u0000\u0000\u0a0e\u0a0f\u0006\u00ca"+ + "\u0013\u0000\u0a0f\u01a3\u0001\u0000\u0000\u0000\u0a10\u0a11\u0005.\u0000"+ + "\u0000\u0a11\u01a5\u0001\u0000\u0000\u0000\u0a12\u0a13\u0005,\u0000\u0000"+ + "\u0a13\u0a14\u0006\u00cc;\u0000\u0a14\u01a7\u0001\u0000\u0000\u0000\u0a15"+ + "\u0a17\u0007&\u0000\u0000\u0a16\u0a15\u0001\u0000\u0000\u0000\u0a17\u0a18"+ + "\u0001\u0000\u0000\u0000\u0a18\u0a16\u0001\u0000\u0000\u0000\u0a18\u0a19"+ + "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0001\u0000\u0000\u0000\u0a1a\u0a1b"+ + "\u0006\u00cd\r\u0000\u0a1b\u01a9\u0001\u0000\u0000\u0000\u0a1c\u0a1d\u0003"+ + "\u00f0q\u0000\u0a1d\u01ab\u0001\u0000\u0000\u0000\u0a1e\u0a1f\t\u0000"+ + "\u0000\u0000\u0a1f\u0a20\u0001\u0000\u0000\u0000\u0a20\u0a21\u0006\u00cf"+ + "7\u0000\u0a21\u01ad\u0001\u0000\u0000\u0000\u0a22\u0a23\u0005\u0000\u0000"+ + "\u0001\u0a23\u0a24\u0001\u0000\u0000\u0000\u0a24\u0a25\u0006\u00d0\u001b"+ + "\u0000\u0a25\u0a26\u0006\u00d0\u0017\u0000\u0a26\u01af\u0001\u0000\u0000"+ + "\u0000\u0a27\u0a28\u0005/\u0000\u0000\u0a28\u0a29\u0005/\u0000\u0000\u0a29"+ + "\u0a2b\u0001\u0000\u0000\u0000\u0a2a\u0a2c\b\u001f\u0000\u0000\u0a2b\u0a2a"+ + "\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000\u0000\u0000\u0a2d\u0a2b"+ + "\u0001\u0000\u0000\u0000\u0a2d\u0a2e\u0001\u0000\u0000\u0000\u0a2e\u0a2f"+ + "\u0001\u0000\u0000\u0000\u0a2f\u0a30\u0006\u00d1\r\u0000\u0a30\u01b1\u0001"+ + "\u0000\u0000\u0000\u0a31\u0a32\u0005/\u0000\u0000\u0a32\u0a33\u0005*\u0000"+ + "\u0000\u0a33\u0a37\u0001\u0000\u0000\u0000\u0a34\u0a36\t\u0000\u0000\u0000"+ + "\u0a35\u0a34\u0001\u0000\u0000\u0000\u0a36\u0a39\u0001\u0000\u0000\u0000"+ + "\u0a37\u0a38\u0001\u0000\u0000\u0000\u0a37\u0a35\u0001\u0000\u0000\u0000"+ + "\u0a38\u0a3a\u0001\u0000\u0000\u0000\u0a39\u0a37\u0001\u0000\u0000\u0000"+ + "\u0a3a\u0a3b\u0005*\u0000\u0000\u0a3b\u0a3c\u0005/\u0000\u0000\u0a3c\u0a40"+ + "\u0001\u0000\u0000\u0000\u0a3d\u0a3f\u0007\u001f\u0000\u0000\u0a3e\u0a3d"+ + "\u0001\u0000\u0000\u0000\u0a3f\u0a42\u0001\u0000\u0000\u0000\u0a40\u0a3e"+ + "\u0001\u0000\u0000\u0000\u0a40\u0a41\u0001\u0000\u0000\u0000\u0a41\u0a43"+ + "\u0001\u0000\u0000\u0000\u0a42\u0a40\u0001\u0000\u0000\u0000\u0a43\u0a44"+ + "\u0006\u00d2\r\u0000\u0a44\u01b3\u0001\u0000\u0000\u0000\u0a45\u0a46\u0005"+ + "@\u0000\u0000\u0a46\u0a47\u0007\u0007\u0000\u0000\u0a47\u0a48\u0007\n"+ + "\u0000\u0000\u0a48\u0a49\u0007\u000b\u0000\u0000\u0a49\u0a4a\u0007\u0013"+ + "\u0000\u0000\u0a4a\u0a4b\u0007\u000f\u0000\u0000\u0a4b\u0a4c\u0007\u0013"+ + "\u0000\u0000\u0a4c\u0a4d\u0001\u0000\u0000\u0000\u0a4d\u0a4e\u0006\u00d3"+ + "\u0017\u0000\u0a4e\u01b5\u0001\u0000\u0000\u0000\u0a4f\u0a50\u0005@\u0000"+ + "\u0000\u0a50\u0a51\u0001\u0000\u0000\u0000\u0a51\u0a52\u0006\u00d4\t\u0000"+ + "\u0a52\u0a53\u0006\u00d4\u0017\u0000\u0a53\u01b7\u0001\u0000\u0000\u0000"+ + "\u0a54\u0a55\u0005[\u0000\u0000\u0a55\u0a56\u0001\u0000\u0000\u0000\u0a56"+ + "\u0a57\u0006\u00d5 \u0000\u0a57\u01b9\u0001\u0000\u0000\u0000\u0a58\u0a59"+ + "\u0005]\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000\u0000\u0a5a\u0a5b\u0006"+ + "\u00d6 \u0000\u0a5b\u01bb\u0001\u0000\u0000\u0000\u0a5c\u0a5d\u0005{\u0000"+ + "\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000\u0a5e\u0a5f\u0006\u00d7 \u0000"+ + "\u0a5f\u01bd\u0001\u0000\u0000\u0000\u0a60\u0a61\u0005}\u0000\u0000\u0a61"+ + "\u0a62\u0001\u0000\u0000\u0000\u0a62\u0a63\u0006\u00d8 \u0000\u0a63\u01bf"+ + "\u0001\u0000\u0000\u0000\u0a64\u0a67\u0003\u00f8u\u0000\u0a65\u0a67\u0003"+ + "\u00fav\u0000\u0a66\u0a64\u0001\u0000\u0000\u0000\u0a66\u0a65\u0001\u0000"+ + "\u0000\u0000\u0a67\u0a68\u0001\u0000\u0000\u0000\u0a68\u0a69\u0006\u00d9"+ + "<\u0000\u0a69\u01c1\u0001\u0000\u0000\u0000\u0a6a\u0a6b\u0003\u00fex\u0000"+ + "\u0a6b\u0a6c\u0001\u0000\u0000\u0000\u0a6c\u0a6d\u0006\u00da\u0012\u0000"+ + "\u0a6d\u01c3\u0001\u0000\u0000\u0000\u0a6e\u0a6f\u0007\n\u0000\u0000\u0a6f"+ + "\u0a70\u0007\u0007\u0000\u0000\u0a70\u0a71\u0007\f\u0000\u0000\u0a71\u0a72"+ + "\u0001\u0000\u0000\u0000\u0a72\u0a73\u0004\u00db\u000e\u0000\u0a73\u0a74"+ + "\u0001\u0000\u0000\u0000\u0a74\u0a75\u0006\u00db=\u0000\u0a75\u01c5\u0001"+ + "\u0000\u0000\u0000\u0a76\u0a77\u0007\u000e\u0000\u0000\u0a77\u0a78\u0007"+ + "\b\u0000\u0000\u0a78\u0a79\u0007\u0010\u0000\u0000\u0a79\u0a7a\u0007\t"+ + "\u0000\u0000\u0a7a\u0a7b\u0007\t\u0000\u0000\u0a7b\u0a7c\u0001\u0000\u0000"+ + "\u0000\u0a7c\u0a7d\u0006\u00dc>\u0000\u0a7d\u01c7\u0001\u0000\u0000\u0000"+ + "\u0a7e\u0a7f\u0003\u0100y\u0000\u0a7f\u0a80\u0001\u0000\u0000\u0000\u0a80"+ + "\u0a81\u0006\u00dd\u0013\u0000\u0a81\u01c9\u0001\u0000\u0000\u0000\u0a82"+ + "\u0a84\u0005\\\u0000\u0000\u0a83\u0a82\u0001\u0000\u0000\u0000\u0a83\u0a84"+ + "\u0001\u0000\u0000\u0000\u0a84\u0a88\u0001\u0000\u0000\u0000\u0a85\u0a86"+ + "\u0003\u00f0q\u0000\u0a86\u0a87\u0005\\\u0000\u0000\u0a87\u0a89\u0001"+ + "\u0000\u0000\u0000\u0a88\u0a85\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0001"+ + "\u0000\u0000\u0000\u0a8a\u0a88\u0001\u0000\u0000\u0000\u0a8a\u0a8b\u0001"+ + "\u0000\u0000\u0000\u0a8b\u0a8c\u0001\u0000\u0000\u0000\u0a8c\u0a8d\u0006"+ + "\u00de\u0014\u0000\u0a8d\u01cb\u0001\u0000\u0000\u0000\u0a8e\u0a8f\u0005"+ + "\\\u0000\u0000\u0a8f\u0a90\u0003\u00f0q\u0000\u0a90\u0a91\u0001\u0000"+ + "\u0000\u0000\u0a91\u0a92\u0006\u00df\u0015\u0000\u0a92\u01cd\u0001\u0000"+ + "\u0000\u0000\u0a93\u0a94\u0003\u00f0q\u0000\u0a94\u0a95\u0001\u0000\u0000"+ + "\u0000\u0a95\u0a96\u0006\u00e0\u0015\u0000\u0a96\u01cf\u0001\u0000\u0000"+ + "\u0000\u0a97\u0a98\u0005:\u0000\u0000\u0a98\u0a99\u0005:\u0000\u0000\u0a99"+ + "\u0a9a\u0001\u0000\u0000\u0000\u0a9a\u0a9b\u0006\u00e1\u0016\u0000\u0a9b"+ + "\u01d1\u0001\u0000\u0000\u0000\u0a9c\u0a9d\u0005(\u0000\u0000\u0a9d\u0a9e"+ + "\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00e2\u0018\u0000\u0a9f\u01d3"+ + "\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0005)\u0000\u0000\u0aa1\u0aa2\u0001"+ + "\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e3\u0019\u0000\u0aa3\u01d5\u0001"+ + "\u0000\u0000\u0000\u0aa4\u0aa5\u0005 \u0000\u0000\u0aa5\u0aa6\u0001\u0000"+ + "\u0000\u0000\u0aa6\u0aa7\u0006\u00e4\r\u0000\u0aa7\u01d7\u0001\u0000\u0000"+ + "\u0000\u0aa8\u0aa9\u0005\u0000\u0000\u0001\u0aa9\u0aaa\u0001\u0000\u0000"+ + "\u0000\u0aaa\u0aab\u0006\u00e5\u001b\u0000\u0aab\u0aac\u0006\u00e5\u0017"+ + "\u0000\u0aac\u01d9\u0001\u0000\u0000\u0000\u0aad\u0aae\t\u0000\u0000\u0000"+ + "\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e6\r\u0000\u0ab0"+ + "\u01db\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005?\u0000\u0000\u0ab2\u0ab3"+ + "\u0005>\u0000\u0000\u0ab3\u0ab4\u0001\u0000\u0000\u0000\u0ab4\u0ab5\u0006"+ + "\u00e7\u0017\u0000\u0ab5\u01dd\u0001\u0000\u0000\u0000\u0ab6\u0ab7\u0005"+ + "/\u0000\u0000\u0ab7\u0ab8\u0005/\u0000\u0000\u0ab8\u0aba\u0001\u0000\u0000"+ + "\u0000\u0ab9\u0abb\b\u001f\u0000\u0000\u0aba\u0ab9\u0001\u0000\u0000\u0000"+ + "\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc\u0aba\u0001\u0000\u0000\u0000"+ + "\u0abc\u0abd\u0001\u0000\u0000\u0000\u0abd\u0abe\u0001\u0000\u0000\u0000"+ + "\u0abe\u0abf\u0006\u00e8\r\u0000\u0abf\u01df\u0001\u0000\u0000\u0000\u0ac0"+ + "\u0ac1\u0005/\u0000\u0000\u0ac1\u0ac2\u0005*\u0000\u0000\u0ac2\u0ac6\u0001"+ + "\u0000\u0000\u0000\u0ac3\u0ac5\t\u0000\u0000\u0000\u0ac4\u0ac3\u0001\u0000"+ + "\u0000\u0000\u0ac5\u0ac8\u0001\u0000\u0000\u0000\u0ac6\u0ac7\u0001\u0000"+ + "\u0000\u0000\u0ac6\u0ac4\u0001\u0000\u0000\u0000\u0ac7\u0ac9\u0001\u0000"+ + "\u0000\u0000\u0ac8\u0ac6\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0005*\u0000"+ + "\u0000\u0aca\u0acb\u0005/\u0000\u0000\u0acb\u0acc\u0001\u0000\u0000\u0000"+ + "\u0acc\u0acd\u0006\u00e9\r\u0000\u0acd\u01e1\u0001\u0000\u0000\u0000\u0ace"+ + "\u0acf\u0005[\u0000\u0000\u0acf\u0ad0\u0001\u0000\u0000\u0000\u0ad0\u0ad1"+ + "\u0006\u00ea \u0000\u0ad1\u01e3\u0001\u0000\u0000\u0000\u0ad2\u0ad3\u0005"+ + "]\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad4\u0ad5\u0006\u00eb"+ + " \u0000\u0ad5\u01e5\u0001\u0000\u0000\u0000\u0ad6\u0ad7\u0005{\u0000\u0000"+ + "\u0ad7\u0ad8\u0001\u0000\u0000\u0000\u0ad8\u0ad9\u0006\u00ec \u0000\u0ad9"+ + "\u01e7\u0001\u0000\u0000\u0000\u0ada\u0adb\u0005}\u0000\u0000\u0adb\u0adc"+ + "\u0001\u0000\u0000\u0000\u0adc\u0add\u0006\u00ed \u0000\u0add\u01e9\u0001"+ + "\u0000\u0000\u0000\u0ade\u0ae1\u0003\u00f8u\u0000\u0adf\u0ae1\u0003\u00fa"+ + "v\u0000\u0ae0\u0ade\u0001\u0000\u0000\u0000\u0ae0\u0adf\u0001\u0000\u0000"+ + "\u0000\u0ae1\u0ae2\u0001\u0000\u0000\u0000\u0ae2\u0ae3\u0006\u00ee<\u0000"+ + "\u0ae3\u01eb\u0001\u0000\u0000\u0000\u0ae4\u0ae5\u0003\u00fex\u0000\u0ae5"+ + "\u0ae6\u0001\u0000\u0000\u0000\u0ae6\u0ae7\u0006\u00ef\u0012\u0000\u0ae7"+ + "\u01ed\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0003\u0100y\u0000\u0ae9\u0aea"+ + "\u0001\u0000\u0000\u0000\u0aea\u0aeb\u0006\u00f0\u0013\u0000\u0aeb\u01ef"+ + "\u0001\u0000\u0000\u0000\u0aec\u0aed\u0003\u00f0q\u0000\u0aed\u0aee\u0001"+ + "\u0000\u0000\u0000\u0aee\u0aef\u0006\u00f1\u0015\u0000\u0aef\u01f1\u0001"+ + "\u0000\u0000\u0000\u0af0\u0af1\u0005:\u0000\u0000\u0af1\u0af2\u0005:\u0000"+ + "\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3\u0af4\u0006\u00f2\u0016"+ + "\u0000\u0af4\u01f3\u0001\u0000\u0000\u0000\u0af5\u0af6\u0005-\u0000\u0000"+ + "\u0af6\u0af7\u0005>\u0000\u0000\u0af7\u0af8\u0001\u0000\u0000\u0000\u0af8"+ + "\u0af9\u0006\u00f3\u001a\u0000\u0af9\u01f5\u0001\u0000\u0000\u0000\u0afa"+ + "\u0afb\u0005(\u0000\u0000\u0afb\u0afc\u0001\u0000\u0000\u0000\u0afc\u0afd"+ + "\u0006\u00f4\u0018\u0000\u0afd\u01f7\u0001\u0000\u0000\u0000\u0afe\u0aff"+ + "\u0005)\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000\u0000\u0b00\u0b01\u0006"+ + "\u00f5\u0019\u0000\u0b01\u01f9\u0001\u0000\u0000\u0000\u0b02\u0b03\u0005"+ + "\u0000\u0000\u0001\u0b03\u0b04\u0001\u0000\u0000\u0000\u0b04\u0b05\u0006"+ + "\u00f6 \u0000\u0b05\u0b06\u0006\u00f6\u0017\u0000\u0b06\u01fb\u0001\u0000"+ + "\u0000\u0000\u0b07\u0b08\t\u0000\u0000\u0000\u0b08\u0b09\u0001\u0000\u0000"+ + "\u0000\u0b09\u0b0a\u0006\u00f7 \u0000\u0b0a\u01fd\u0001\u0000\u0000\u0000"+ + "\u0b0b\u0b0c\u0005@\u0000\u0000\u0b0c\u0b0d\u0007\u0007\u0000\u0000\u0b0d"+ + "\u0b0e\u0007\n\u0000\u0000\u0b0e\u0b0f\u0007\u000b\u0000\u0000\u0b0f\u0b10"+ + "\u0007\u001c\u0000\u0000\u0b10\u0b11\u0007\u0007\u0000\u0000\u0b11\u0b12"+ + "\u0007\u0016\u0000\u0000\u0b12\u0b13\u0007\u0017\u0000\u0000\u0b13\u0b14"+ + "\u0007\u0010\u0000\u0000\u0b14\u0b15\u0007\r\u0000\u0000\u0b15\u0b16\u0007"+ + "\u0005\u0000\u0000\u0b16\u0b17\u0007\u0012\u0000\u0000\u0b17\u0b18\u0001"+ + "\u0000\u0000\u0000\u0b18\u0b19\u0006\u00f8?\u0000\u0b19\u0b1a\u0006\u00f8"+ + "!\u0000\u0b1a\u01ff\u0001\u0000\u0000\u0000\u0b1b\u0b1c\t\u0000\u0000"+ + "\u0000\u0b1c\u0b1d\u0004\u00f9\u000f\u0000\u0b1d\u0b1e\u0001\u0000\u0000"+ + "\u0000\u0b1e\u0b1f\u0006\u00f9\r\u0000\u0b1f\u0201\u0001\u0000\u0000\u0000"+ + "\u0b20\u0b21\u0005\u0000\u0000\u0001\u0b21\u0b22\u0001\u0000\u0000\u0000"+ + "\u0b22\u0b23\u0006\u00fa\u001b\u0000\u0b23\u0b24\u0006\u00fa!\u0000\u0b24"+ + "\u0203\u0001\u0000\u0000\u0000\u0b25\u0b26\t\u0000\u0000\u0000\u0b26\u0b27"+ + "\u0001\u0000\u0000\u0000\u0b27\u0b28\u0006\u00fb\u001c\u0000\u0b28\u0205"+ + "\u0001\u0000\u0000\u0000\u0b29\u0b2a\u0005-\u0000\u0000\u0b2a\u0b2b\u0005"+ + "-\u0000\u0000\u0b2b\u0b2c\u0005}\u0000\u0000\u0b2c\u0b2d\u0005}\u0000"+ + "\u0000\u0b2d\u0b2e\u0001\u0000\u0000\u0000\u0b2e\u0b2f\u0006\u00fc\u0017"+ + "\u0000\u0b2f\u0b30\u0006\u00fc\r\u0000\u0b30\u0207\u0001\u0000\u0000\u0000"+ + "\u0b31\u0b32\t\u0000\u0000\u0000\u0b32\u0b33\u0004\u00fd\u0010\u0000\u0b33"+ + "\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006\u00fd\r\u0000\u0b35\u0209"+ + "\u0001\u0000\u0000\u0000\u0b36\u0b37\t\u0000\u0000\u0000\u0b37\u0b38\u0001"+ + "\u0000\u0000\u0000\u0b38\u0b39\u0006\u00fe\r\u0000\u0b39\u020b\u0001\u0000"+ + "\u0000\u0000\u0b3a\u0b3b\u0005\u0000\u0000\u0001\u0b3b\u0b3c\u0001\u0000"+ + "\u0000\u0000\u0b3c\u0b3d\u0006\u00ff\u0017\u0000\u0b3d\u0b3e\u0006\u00ff"+ + "\r\u0000\u0b3e\u020d\u0001\u0000\u0000\u0000t\u0000\u0001\u0002\u0003"+ + "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u0212\u0216\u021c\u0220\u0227"+ + "\u022e\u0234\u023a\u0241\u0246\u024d\u0253\u025d\u0263\u0269\u0270\u027c"+ + "\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e\u059e\u05ca\u05ed\u0653\u0699"+ + "\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9\u06e0\u06f4\u06fc\u0703\u070b"+ + "\u070f\u0718\u071b\u0722\u0729\u072e\u073a\u073f\u0741\u074d\u0754\u075b"+ + "\u0763\u0765\u076e\u0770\u077b\u0793\u07a8\u07ac\u07b7\u07bd\u07c9\u07cd"+ + "\u07db\u07e9\u07fa\u080a\u081b\u0827\u0837\u0844\u0854\u0861\u087a\u088b"+ + "\u088e\u089b\u08a2\u08d3\u08da\u0906\u0910\u094f\u0973\u097e\u0985\u09a6"+ + "\u09b8\u09d3\u0a03\u0a18\u0a2d\u0a37\u0a40\u0a66\u0a83\u0a8a\u0abc\u0ac6"+ + "\u0ae0@\u0005\u0005\u0000\u0005\u0003\u0000\u0005\b\u0000\u0005\u0007"+ + "\u0000\u0007g\u0000\u0005\n\u0000\u0005\f\u0000\u0005\u0001\u0000\u0005"+ + "\u0002\u0000\u0007\u0017\u0000\u0005\u000b\u0000\u0001c\u0000\u0007s\u0000"+ + "\u0006\u0000\u0000\u0001h\u0001\u0001i\u0002\u0001m\u0003\u0005\r\u0000"+ + "\u0007\u0002\u0000\u0007\u0003\u0000\u0007\u0006\u0000\u0007\u0005\u0000"+ + "\u0007\u0007\u0000\u0004\u0000\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007"+ + "\t\u0000\u0007\u0016\u0000\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a"+ + "\u0004\u0001\u009b\u0005\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c"+ + "\u0006\u0001\u009d\u0007\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t"+ + "\u0007\u000f\u0000\u0001\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001"+ + "\u00a7\f\u0001\u00ae\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b"+ + "\u0000\u0005\t\u0000\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000"+ + "\u0001\u00c1\u0012\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001"+ + "\u00c4\u0015\u0001\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007"+ + "\u0015\u0000\u0007\u0004\u0000\u0007\b\u0000\u0007i\u0000"; + public static final String _serializedATN = Utils.join( + new String[] { + _serializedATNSegment0, + _serializedATNSegment1 + }, + "" + ); + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 new file mode 100644 index 000000000000..d3121117c97a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -0,0 +1,217 @@ +parser grammar BladeAntlrParser; + +@header{ + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; +} + +@parser::members {public static int bladeVersion = 10;} + +options { tokenVocab = BladeAntlrLexer; } + +file : general_statement* EOF; + +general_statement: inline_statement + | block_statement + | html + ; + +inline_statement: + inline_directive + | possibleDirective + | regular_echo + | raw_echo + | phpInline + ; + +inline_directive: + section_inline + | identifiableType + | stack + | includeCond + | each + | (D_INCLUDE_FIRST | D_CLASS | D_STYLE | D_METHOD | D_PROPS + | D_DD | D_JS | D_JS | D_AWARE | D_HTML_ATTR_EXPR | D_CASE | D_JSON) composed_php_expression + | (D_CSRF | D_LOOP_ACTION | D_BREAK | D_LIVEWIRE | D_DEFAULT) + | asset_bundler + | inject + //using basic inline case statement to not add complexity to parser + | D_PERMISSION_ELSE composed_php_expression + | loop_action + | D_ELSE //custom block directives? + | D_MISC + | custom_directive + ; + +block_statement: + section + | condSection + | push + | pushIf + | once_block + | prepend + | fragmentD + | if + | switch + | env_block + | empty_block + | error_block + //we can consider the statements not being empty + | conditional_block + | auth_block + //lazy parser for can + | permission + | while + | for + | foreach + | forelse + | session + | verbatim_block + | php_blade + ; + +identifiableType : d_name=(D_INCLUDE | D_INCLUDE_IF | D_EXTENDS + | D_YIELD | D_USE | D_LANG) BLADE_PARAM_LPAREN (idString = BL_PARAM_STRING | composedArgument) (BL_COMMA composedArgument)? (BL_COMMA)? BLADE_PARAM_RPAREN; +section_inline: D_SECTION doubleArgWrapperP; +section : D_SECTION singleArgWrapperP (general_statement | D_PARENT)* (D_SHOW | D_STOP | D_OVERWRITE | D_ENDSECTION | D_APPEND); +push : D_PUSH singleArgWrapperP general_statement* D_ENDPUSH; +pushOnce : D_PUSH_ONCE singleArgWrapperP general_statement* D_ENDPUSH_ONCE; +pushIf : D_PUSH_IF singleArgWrapperP general_statement* D_ENDPUSH_IF; +prepend : D_PREPEND singleArgWrapperP general_statement* D_ENDPREPEND; +fragmentD : D_FRAGMENT composed_php_expression general_statement* D_ENDFRAGMENT; + +if : D_IF main_php_expression general_statement* (D_ELSEIF main_php_expression general_statement*)* else? endif; +else : D_ELSE general_statement*; +endif: D_ENDIF; +empty_block : D_EMPTY composed_php_expression simple_conditional_stm D_ENDEMPTY; + +//the consistency for these blocks need to be checked inside the parser +conditional_block : D_COND_BLOCK_START main_php_expression simple_conditional_stm D_COND_BLOCK_END; +auth_block : D_AUTH_START (BLADE_PARAM_LPAREN (composedArgument)* BLADE_PARAM_RPAREN)* simple_conditional_stm D_AUTH_END; +env_block: (D_ENV singleArgWrapperP simple_conditional_stm D_ENDENV) | D_PRODUCTION simple_conditional_stm D_ENDPRODUCTION; +permission : D_PERMISSION_START composed_php_expression simple_conditional_stm D_PERMISSION_END; + +simple_conditional_stm : general_statement* else?; +// +error_block : D_ERROR php_expression general_statement* D_ENDERROR; + +//no need to add complexity to parser +switch: D_SWITCH php_expression (general_statement | D_BREAK)+ D_ENDSWITCH; + +//loops +while : D_WHILE php_expression (general_statement)* D_ENDWHILE; +for : D_FOR php_expression (general_statement)* D_ENDFOR; +foreach : D_FOREACH FOREACH_LOOP_LPAREN loop_expression FOREACH_LOOP_RPAREN (general_statement)* D_ENDFOREACH; +forelse : D_FORELSE FOREACH_LOOP_LPAREN loop_expression FOREACH_LOOP_RPAREN (general_statement | D_EMPTY)* D_ENDFORELSE; + +//misc block +session : D_SESSION composed_php_expression general_statement* D_ENDSESSION; + +//layout +stack : D_STACK singleArgWrapperP; +asset_bundler : d_name=D_ASSET_BUNDLER BLADE_EXPR_LPAREN (BL_SQ_LPAREN id_strings=EXPR_STRING+ BL_SQ_RPAREN dir=EXPR_STRING? | id_string=EXPR_STRING | composed_php_expression+) BLADE_EXPR_RPAREN; +inject : D_INJECT BLADE_PARAM_LPAREN composedArgument BL_COMMA (identifiableArgument | composedArgument) BLADE_PARAM_RPAREN; + +includeCond : d_name=(D_INCLUDE_WHEN | D_INCLUDE_UNLESS) BLADE_PARAM_LPAREN + composedArgument + BL_COMMA + (idString=BL_PARAM_STRING | composedArgument) + (BL_COMMA composedArgument)? + BLADE_PARAM_RPAREN; + +each : D_EACH BLADE_PARAM_LPAREN + (idString=BL_PARAM_STRING | composedArgument) //default path + BL_COMMA + composedArgument + BL_COMMA + composedArgument + (BL_COMMA + (identifiableArgument | composedArgument))? //fallback + BLADE_PARAM_RPAREN; + +once_block : D_ONCE general_statement+ D_ENDONCE; +condSection : (D_SECTION_MISSING | D_HAS_SECTION) singleArgWrapperP simple_conditional_stm D_ENDIF; + +custom_directive : D_CUSTOM ((BLADE_PARAM_LPAREN BLADE_PARAM_RPAREN) | multiArgWrapper ) +; + +possibleDirective : D_UNKNOWN | D_UNKNOWN_ATTR_ENC; + +php_blade : D_PHP composed_php_expression* D_ENDPHP | D_PHP main_php_expression; + +phpInline : PHP_INLINE_START composed_php_expression+ (PHP_EXIT | EOF); +//echo + +regular_echo : CONTENT_TAG_OPEN echo_expr* CONTENT_TAG_CLOSE; +raw_echo : RAW_TAG_OPEN echo_expr* RAW_TAG_CLOSE; + +echo_expr : composed_php_expression; + +class_expr_usage: class_name_reference +| object_alias_static_access +| object_alias_direct_access +| static_direct_class_access +| static_direct_namespace_class_access +| class_instance; + +object_alias_static_access : alias_name=PHP_VARIABLE PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER; +object_alias_direct_access : alias_name=PHP_VARIABLE PHP_INSTANCE_ACCESS property=PHP_IDENTIFIER; +static_direct_class_access : class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS + func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN + | class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER + ; +static_direct_namespace_class_access : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS + func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN + | namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER + ; + +class_instance : PHP_NEW (namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER) BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN; +class_name_reference : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS PHP_CLASS_KEYWORD; + +namespacePath : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER; + +function_call : func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN; + +php_expression: PHP_EXPRESSION; +loop_expression : simple_foreach_expr +| (PHP_VARIABLE | PHP_EXPRESSION | FOREACH_PARAM_ASSIGN | FOREACH_LOOP_LPAREN | FOREACH_LOOP_RPAREN | FOREACH_AS)+ //complex expression (lazy handling) +; + +main_php_expression : BLADE_EXPR_LPAREN composed_php_expression+ BLADE_EXPR_RPAREN; + +composed_php_expression : class_expr_usage | function_call | PHP_IDENTIFIER | namespacePath | PHP_VARIABLE +| PHP_NAMESPACE_PATH | EXPR_STRING | + PHP_KEYWORD | PHP_EXPRESSION+ | PHP_STATIC_ACCESS | PHP_CLASS_KEYWORD +| PHP_INSTANCE_ACCESS | BL_SQ_LPAREN composed_php_expression* BL_SQ_RPAREN | BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN | PHP_EXPR_STRING; + +simple_foreach_expr: loop_array=PHP_VARIABLE FOREACH_AS key=PHP_VARIABLE (FOREACH_PARAM_ASSIGN item=PHP_VARIABLE)?; + +singleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BLADE_PARAM_RPAREN; +doubleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BL_COMMA composedArgument BLADE_PARAM_RPAREN; +multiArgWrapper : BLADE_PARAM_LPAREN (composedArgument) (BL_COMMA composedArgument)* BLADE_PARAM_RPAREN; + +identifiableArgument : BL_PARAM_STRING; +composedArgument : (phpExpr)+ ; + +phpExpr : identifiableArray | arrayDefine | BLADE_PARAM_EXTRA | PHP_VARIABLE | PHP_KEYWORD | BL_PARAM_CONCAT_OPERATOR | BL_PARAM_STRING | BL_PARAM_ASSIGN | BL_NAME_STRING | BL_PARAM_COMMA; + +//['key' => $value] +identifiableArray : BL_SQ_LPAREN paramAssign (BL_PARAM_COMMA paramAssign)* BL_PARAM_COMMA? BL_SQ_RPAREN; +arrayDefine : BL_SQ_LPAREN phpExpr+ BL_SQ_RPAREN +| BL_SQ_LPAREN BL_SQ_RPAREN; + +paramAssign : BL_PARAM_STRING BL_PARAM_ASSIGN (PHP_VARIABLE | PHP_KEYWORD | BL_PARAM_STRING); +verbatim_block : D_VERBATIM D_ENDVERBATIM; + +loop_action : (D_LOOP_ACTION | D_BREAK) php_expression?; + + +//html +html : HTML+ | HTML_COMPONENT_PREFIX | HTML_TAG_START | EQ | HTML_IDENTIFIER; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java new file mode 100644 index 000000000000..eeb99c968722 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java @@ -0,0 +1,6250 @@ +// Generated from java-escape by ANTLR 4.11.1 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrParser extends Parser { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + PHP_EXPRESSION=1, PHP_VARIABLE=2, PHP_KEYWORD=3, PHP_NEW=4, PHP_IDENTIFIER=5, + PHP_NAMESPACE_PATH=6, PHP_STATIC_ACCESS=7, PHP_CLASS_KEYWORD=8, PHP_INSTANCE_ACCESS=9, + BLADE_PARAM_EXTRA=10, BLADE_PARAM_LPAREN=11, BLADE_PARAM_RPAREN=12, BLADE_EXPR_LPAREN=13, + BLADE_EXPR_RPAREN=14, BL_SQ_LPAREN=15, BL_SQ_LRAREN=16, BL_PARAM_STRING=17, + BL_PARAM_ASSIGN=18, BL_COMMA=19, BL_PARAM_COMMA=20, PHP_EXPR_STRING=21, + ERROR=22, HTML=23, BLADE_COMMENT=24, D_IF=25, D_ELSEIF=26, D_ELSE=27, + D_ENDIF=28, D_SWITCH=29, D_CASE=30, D_DEFAULT=31, D_ENDSWITCH=32, D_EMPTY=33, + D_ENDEMPTY=34, D_COND_BLOCK_START=35, D_COND_BLOCK_END=36, D_FOREACH=37, + D_ENDFOREACH=38, D_FOR=39, D_ENDFOR=40, D_FORELSE=41, D_ENDFORELSE=42, + D_WHILE=43, D_ENDWHILE=44, D_BREAK=45, D_LOOP_ACTION=46, D_INCLUDE=47, + D_INCLUDE_IF=48, D_INCLUDE_WHEN=49, D_INCLUDE_FIRST=50, D_INCLUDE_UNLESS=51, + D_EACH=52, D_EXTENDS=53, D_JS=54, D_JSON=55, D_SECTION=56, D_HAS_SECTION=57, + D_SECTION_MISSING=58, D_ENDSECTION=59, D_YIELD=60, D_PARENT=61, D_SHOW=62, + D_OVERWRITE=63, D_STOP=64, D_APPEND=65, D_ONCE=66, D_ENDONCE=67, D_STACK=68, + D_PUSH=69, D_ENDPUSH=70, D_PUSH_IF=71, D_ENDPUSH_IF=72, D_PUSH_ONCE=73, + D_ENDPUSH_ONCE=74, D_PREPEND=75, D_ENDPREPEND=76, D_PROPS=77, D_FRAGMENT=78, + D_ENDFRAGMENT=79, D_CSRF=80, D_METHOD=81, D_ERROR=82, D_ENDERROR=83, D_PRODUCTION=84, + D_ENDPRODUCTION=85, D_ENV=86, D_ENDENV=87, D_AUTH_START=88, D_AUTH_END=89, + D_PERMISSION_START=90, D_PERMISSION_ELSE=91, D_PERMISSION_END=92, D_CLASS=93, + D_STYLE=94, D_HTML_ATTR_EXPR=95, D_AWARE=96, D_SESSION=97, D_ENDSESSION=98, + D_DD=99, D_LANG=100, D_USE=101, D_INJECT=102, D_PHP=103, D_VERBATIM=104, + D_ENDVERBATIM=105, D_LIVEWIRE=106, D_ASSET_BUNDLER=107, D_MISC=108, D_CUSTOM=109, + D_UNKNOWN_ATTR_ENC=110, D_UNKNOWN=111, CONTENT_TAG_OPEN=112, RAW_TAG_OPEN=113, + PHP_INLINE_START=114, HTML_COMPONENT_PREFIX=115, JS_SCRIPT=116, HTML_TAG_START=117, + HTML_CLOSE_TAG=118, STRING_PATH=119, HTML_PATH=120, HTML_TEXT=121, HTML_IDENTIFIER=122, + EQ=123, WS=124, OTHER=125, BLADE_COMMENT_START=126, CONTENT_TAG_CLOSE=127, + REGULAR_ECHO_EXPR_MORE=128, RAW_TAG_CLOSE=129, RAW_ECHO_EXPR_MORE=130, + WS_EXPR_ESCAPE=131, WS_EXPR=132, WS_COMPOSED_EXPR=133, EXPR_STRING=134, + COMPOSED_EXPR_RPAREN=135, PHP_COMPOSED_EXPRESSION=136, WS_BL_PARAM=137, + FOREACH_WS_EXPR=138, FOREACH_LOOP_LPAREN=139, FOREACH_LOOP_RPAREN=140, + FOREACH_AS=141, FOREACH_PARAM_ASSIGN=142, BL_PARAM_LINE_COMMENT=143, BL_SQ_RPAREN=144, + BL_PARAM_RPAREN=145, BL_PARAM_CONCAT_OPERATOR=146, BL_COMMA_EL=147, BL_PARAM_WS=148, + BL_NAME_STRING=149, PHP_D_BLADE_COMMENT=150, PHP_D_BLADE_ML_COMMENT=151, + D_ENDPHP=152, PHP_D_WS=153, PHP_D_PHP_COMPOSED_EXPRESSION=154, PHP_EXIT=155, + PHP_INLINE_COMMENT=156, PHP_INLINE_ML_COMMENT=157, VERBATIM_HTML=158, + BLADE_COMMENT_END=159, BLADE_COMMENT_PEEK=160, BLADE_COMMENT_MORE=161, + BLADE_COMMENT_EOF=162, AT=163, RAW_TAG_START=164, REGULAR_ECHO_STATIC_ACCESS=165, + REGULAR_ECHO_LPAREN=166, REGULAR_ECHO_RPAREN=167, REGULAR_ECHO_INSTANCE_ACCESS=168, + PHP_D_EXPR_CURLY_LPAREN=169, PHP_D_EXPR_CURLY_RPAREN=170, PHP_D_CLASS=171; + public static final int + RULE_file = 0, RULE_general_statement = 1, RULE_inline_statement = 2, + RULE_inline_directive = 3, RULE_block_statement = 4, RULE_identifiableType = 5, + RULE_section_inline = 6, RULE_section = 7, RULE_push = 8, RULE_pushOnce = 9, + RULE_pushIf = 10, RULE_prepend = 11, RULE_fragmentD = 12, RULE_if = 13, + RULE_else = 14, RULE_endif = 15, RULE_empty_block = 16, RULE_conditional_block = 17, + RULE_auth_block = 18, RULE_env_block = 19, RULE_permission = 20, RULE_simple_conditional_stm = 21, + RULE_error_block = 22, RULE_switch = 23, RULE_while = 24, RULE_for = 25, + RULE_foreach = 26, RULE_forelse = 27, RULE_session = 28, RULE_stack = 29, + RULE_asset_bundler = 30, RULE_inject = 31, RULE_includeCond = 32, RULE_each = 33, + RULE_once_block = 34, RULE_condSection = 35, RULE_custom_directive = 36, + RULE_possibleDirective = 37, RULE_php_blade = 38, RULE_phpInline = 39, + RULE_regular_echo = 40, RULE_raw_echo = 41, RULE_echo_expr = 42, RULE_class_expr_usage = 43, + RULE_object_alias_static_access = 44, RULE_object_alias_direct_access = 45, + RULE_static_direct_class_access = 46, RULE_static_direct_namespace_class_access = 47, + RULE_class_instance = 48, RULE_class_name_reference = 49, RULE_namespacePath = 50, + RULE_function_call = 51, RULE_php_expression = 52, RULE_loop_expression = 53, + RULE_main_php_expression = 54, RULE_composed_php_expression = 55, RULE_simple_foreach_expr = 56, + RULE_singleArgWrapperP = 57, RULE_doubleArgWrapperP = 58, RULE_multiArgWrapper = 59, + RULE_identifiableArgument = 60, RULE_composedArgument = 61, RULE_phpExpr = 62, + RULE_identifiableArray = 63, RULE_arrayDefine = 64, RULE_paramAssign = 65, + RULE_verbatim_block = 66, RULE_loop_action = 67, RULE_html = 68; + private static String[] makeRuleNames() { + return new String[] { + "file", "general_statement", "inline_statement", "inline_directive", + "block_statement", "identifiableType", "section_inline", "section", "push", + "pushOnce", "pushIf", "prepend", "fragmentD", "if", "else", "endif", + "empty_block", "conditional_block", "auth_block", "env_block", "permission", + "simple_conditional_stm", "error_block", "switch", "while", "for", "foreach", + "forelse", "session", "stack", "asset_bundler", "inject", "includeCond", + "each", "once_block", "condSection", "custom_directive", "possibleDirective", + "php_blade", "phpInline", "regular_echo", "raw_echo", "echo_expr", "class_expr_usage", + "object_alias_static_access", "object_alias_direct_access", "static_direct_class_access", + "static_direct_namespace_class_access", "class_instance", "class_name_reference", + "namespacePath", "function_call", "php_expression", "loop_expression", + "main_php_expression", "composed_php_expression", "simple_foreach_expr", + "singleArgWrapperP", "doubleArgWrapperP", "multiArgWrapper", "identifiableArgument", + "composedArgument", "phpExpr", "identifiableArray", "arrayDefine", "paramAssign", + "verbatim_block", "loop_action", "html" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'@if'", "'@elseif'", "'@else'", "'@endif'", "'@switch'", "'@case'", + "'@default'", "'@endswitch'", "'@empty'", "'@endempty'", null, null, + "'@foreach'", "'@endforeach'", "'@for'", "'@endfor'", "'@forelse'", "'@endforelse'", + "'@while'", "'@endwhile'", "'@break'", null, "'@include'", "'@includeIf'", + "'@includeWhen'", "'@includeFirst'", "'@includeUnless'", "'@each'", "'@extends'", + "'@js'", "'@json'", "'@section'", "'@hasSection'", "'@sectionMissing'", + "'@endsection'", "'@yield'", "'@parent'", "'@show'", "'@overwrite'", + "'@stop'", "'@append'", "'@once'", "'@endonce'", "'@stack'", "'@push'", + "'@endpush'", "'@pushIf'", "'@endPushIf'", "'@pushOnce'", "'@endPushOnce'", + "'@prepend'", "'@endprepend'", "'@props'", "'@fragment'", "'@endfragment'", + "'@csrf'", "'@method'", "'@error'", "'@enderror'", "'@production'", "'@endproduction'", + "'@env'", "'@endenv'", null, null, null, null, null, "'@class'", "'@style'", + null, "'@aware'", "'@session'", "'@endsession'", null, "'@lang'", "'@use'", + "'@inject'", null, "'@verbatim'", "'@endverbatim'", null, "'@vite'", + "'@viteReactRefresh'", null, null, null, "'{{'", "'{!!'", null, null, + null, null, null, null, null, null, null, "'='", null, null, "'{{--'", + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, "'as'", null, null, null, null, "'.'", "','", null, null, + null, null, "'@endphp'", "' '", null, "'?>'", null, null, null, "'--}}'", + null, null, null, null, "'{!'", null, null, null, null, null, null, "'class'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "PHP_EXPRESSION", "PHP_VARIABLE", "PHP_KEYWORD", "PHP_NEW", "PHP_IDENTIFIER", + "PHP_NAMESPACE_PATH", "PHP_STATIC_ACCESS", "PHP_CLASS_KEYWORD", "PHP_INSTANCE_ACCESS", + "BLADE_PARAM_EXTRA", "BLADE_PARAM_LPAREN", "BLADE_PARAM_RPAREN", "BLADE_EXPR_LPAREN", + "BLADE_EXPR_RPAREN", "BL_SQ_LPAREN", "BL_SQ_LRAREN", "BL_PARAM_STRING", + "BL_PARAM_ASSIGN", "BL_COMMA", "BL_PARAM_COMMA", "PHP_EXPR_STRING", "ERROR", + "HTML", "BLADE_COMMENT", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", "D_SWITCH", + "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", "D_COND_BLOCK_START", + "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", "D_FOR", "D_ENDFOR", + "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", "D_BREAK", "D_LOOP_ACTION", + "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", + "D_EACH", "D_EXTENDS", "D_JS", "D_JSON", "D_SECTION", "D_HAS_SECTION", + "D_SECTION_MISSING", "D_ENDSECTION", "D_YIELD", "D_PARENT", "D_SHOW", + "D_OVERWRITE", "D_STOP", "D_APPEND", "D_ONCE", "D_ENDONCE", "D_STACK", + "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", + "D_PREPEND", "D_ENDPREPEND", "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", + "D_CSRF", "D_METHOD", "D_ERROR", "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", + "D_ENV", "D_ENDENV", "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", + "D_PERMISSION_ELSE", "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", + "D_AWARE", "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", + "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", + "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", "JS_SCRIPT", + "HTML_TAG_START", "HTML_CLOSE_TAG", "STRING_PATH", "HTML_PATH", "HTML_TEXT", + "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "BLADE_COMMENT_START", "CONTENT_TAG_CLOSE", + "REGULAR_ECHO_EXPR_MORE", "RAW_TAG_CLOSE", "RAW_ECHO_EXPR_MORE", "WS_EXPR_ESCAPE", + "WS_EXPR", "WS_COMPOSED_EXPR", "EXPR_STRING", "COMPOSED_EXPR_RPAREN", + "PHP_COMPOSED_EXPRESSION", "WS_BL_PARAM", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", + "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PARAM_ASSIGN", "BL_PARAM_LINE_COMMENT", + "BL_SQ_RPAREN", "BL_PARAM_RPAREN", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", + "BL_PARAM_WS", "BL_NAME_STRING", "PHP_D_BLADE_COMMENT", "PHP_D_BLADE_ML_COMMENT", + "D_ENDPHP", "PHP_D_WS", "PHP_D_PHP_COMPOSED_EXPRESSION", "PHP_EXIT", + "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "VERBATIM_HTML", "BLADE_COMMENT_END", + "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF", "AT", + "RAW_TAG_START", "REGULAR_ECHO_STATIC_ACCESS", "REGULAR_ECHO_LPAREN", + "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", "PHP_D_EXPR_CURLY_LPAREN", + "PHP_D_EXPR_CURLY_RPAREN", "PHP_D_CLASS" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "java-escape"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public static int bladeVersion = 10; + public BladeAntlrParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class FileContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(BladeAntlrParser.EOF, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public FileContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_file; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFile(this); + } + } + + public final FileContext file() throws RecognitionException { + FileContext _localctx = new FileContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_file); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(141); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(138); + general_statement(); + } + } + setState(143); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(144); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class General_statementContext extends ParserRuleContext { + public Inline_statementContext inline_statement() { + return getRuleContext(Inline_statementContext.class,0); + } + public Block_statementContext block_statement() { + return getRuleContext(Block_statementContext.class,0); + } + public HtmlContext html() { + return getRuleContext(HtmlContext.class,0); + } + public General_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_general_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterGeneral_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitGeneral_statement(this); + } + } + + public final General_statementContext general_statement() throws RecognitionException { + General_statementContext _localctx = new General_statementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_general_statement); + try { + setState(149); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(146); + inline_statement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(147); + block_statement(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(148); + html(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_statementContext extends ParserRuleContext { + public Inline_directiveContext inline_directive() { + return getRuleContext(Inline_directiveContext.class,0); + } + public PossibleDirectiveContext possibleDirective() { + return getRuleContext(PossibleDirectiveContext.class,0); + } + public Regular_echoContext regular_echo() { + return getRuleContext(Regular_echoContext.class,0); + } + public Raw_echoContext raw_echo() { + return getRuleContext(Raw_echoContext.class,0); + } + public PhpInlineContext phpInline() { + return getRuleContext(PhpInlineContext.class,0); + } + public Inline_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInline_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInline_statement(this); + } + } + + public final Inline_statementContext inline_statement() throws RecognitionException { + Inline_statementContext _localctx = new Inline_statementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_inline_statement); + try { + setState(156); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_ELSE: + case D_CASE: + case D_DEFAULT: + case D_BREAK: + case D_LOOP_ACTION: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_FIRST: + case D_INCLUDE_UNLESS: + case D_EACH: + case D_EXTENDS: + case D_JS: + case D_JSON: + case D_SECTION: + case D_YIELD: + case D_STACK: + case D_PROPS: + case D_CSRF: + case D_METHOD: + case D_PERMISSION_ELSE: + case D_CLASS: + case D_STYLE: + case D_HTML_ATTR_EXPR: + case D_AWARE: + case D_DD: + case D_LANG: + case D_USE: + case D_INJECT: + case D_LIVEWIRE: + case D_ASSET_BUNDLER: + case D_MISC: + case D_CUSTOM: + enterOuterAlt(_localctx, 1); + { + setState(151); + inline_directive(); + } + break; + case D_UNKNOWN_ATTR_ENC: + case D_UNKNOWN: + enterOuterAlt(_localctx, 2); + { + setState(152); + possibleDirective(); + } + break; + case CONTENT_TAG_OPEN: + enterOuterAlt(_localctx, 3); + { + setState(153); + regular_echo(); + } + break; + case RAW_TAG_OPEN: + enterOuterAlt(_localctx, 4); + { + setState(154); + raw_echo(); + } + break; + case PHP_INLINE_START: + enterOuterAlt(_localctx, 5); + { + setState(155); + phpInline(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_directiveContext extends ParserRuleContext { + public Section_inlineContext section_inline() { + return getRuleContext(Section_inlineContext.class,0); + } + public IdentifiableTypeContext identifiableType() { + return getRuleContext(IdentifiableTypeContext.class,0); + } + public StackContext stack() { + return getRuleContext(StackContext.class,0); + } + public IncludeCondContext includeCond() { + return getRuleContext(IncludeCondContext.class,0); + } + public EachContext each() { + return getRuleContext(EachContext.class,0); + } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public TerminalNode D_INCLUDE_FIRST() { return getToken(BladeAntlrParser.D_INCLUDE_FIRST, 0); } + public TerminalNode D_CLASS() { return getToken(BladeAntlrParser.D_CLASS, 0); } + public TerminalNode D_STYLE() { return getToken(BladeAntlrParser.D_STYLE, 0); } + public TerminalNode D_METHOD() { return getToken(BladeAntlrParser.D_METHOD, 0); } + public TerminalNode D_PROPS() { return getToken(BladeAntlrParser.D_PROPS, 0); } + public TerminalNode D_DD() { return getToken(BladeAntlrParser.D_DD, 0); } + public TerminalNode D_JS() { return getToken(BladeAntlrParser.D_JS, 0); } + public TerminalNode D_AWARE() { return getToken(BladeAntlrParser.D_AWARE, 0); } + public TerminalNode D_HTML_ATTR_EXPR() { return getToken(BladeAntlrParser.D_HTML_ATTR_EXPR, 0); } + public TerminalNode D_CASE() { return getToken(BladeAntlrParser.D_CASE, 0); } + public TerminalNode D_JSON() { return getToken(BladeAntlrParser.D_JSON, 0); } + public TerminalNode D_CSRF() { return getToken(BladeAntlrParser.D_CSRF, 0); } + public TerminalNode D_LOOP_ACTION() { return getToken(BladeAntlrParser.D_LOOP_ACTION, 0); } + public TerminalNode D_BREAK() { return getToken(BladeAntlrParser.D_BREAK, 0); } + public TerminalNode D_LIVEWIRE() { return getToken(BladeAntlrParser.D_LIVEWIRE, 0); } + public TerminalNode D_DEFAULT() { return getToken(BladeAntlrParser.D_DEFAULT, 0); } + public Asset_bundlerContext asset_bundler() { + return getRuleContext(Asset_bundlerContext.class,0); + } + public InjectContext inject() { + return getRuleContext(InjectContext.class,0); + } + public TerminalNode D_PERMISSION_ELSE() { return getToken(BladeAntlrParser.D_PERMISSION_ELSE, 0); } + public Loop_actionContext loop_action() { + return getRuleContext(Loop_actionContext.class,0); + } + public TerminalNode D_ELSE() { return getToken(BladeAntlrParser.D_ELSE, 0); } + public TerminalNode D_MISC() { return getToken(BladeAntlrParser.D_MISC, 0); } + public Custom_directiveContext custom_directive() { + return getRuleContext(Custom_directiveContext.class,0); + } + public Inline_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_directive; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInline_directive(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInline_directive(this); + } + } + + public final Inline_directiveContext inline_directive() throws RecognitionException { + Inline_directiveContext _localctx = new Inline_directiveContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_inline_directive); + int _la; + try { + setState(174); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(158); + section_inline(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(159); + identifiableType(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(160); + stack(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(161); + includeCond(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(162); + each(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(163); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 55169096509030400L) != 0 || (((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 5177361L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(164); + composed_php_expression(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(165); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 105555263750144L) != 0 || _la==D_CSRF || _la==D_LIVEWIRE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(166); + asset_bundler(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(167); + inject(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(168); + match(D_PERMISSION_ELSE); + setState(169); + composed_php_expression(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(170); + loop_action(); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(171); + match(D_ELSE); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(172); + match(D_MISC); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(173); + custom_directive(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_statementContext extends ParserRuleContext { + public SectionContext section() { + return getRuleContext(SectionContext.class,0); + } + public CondSectionContext condSection() { + return getRuleContext(CondSectionContext.class,0); + } + public PushContext push() { + return getRuleContext(PushContext.class,0); + } + public PushIfContext pushIf() { + return getRuleContext(PushIfContext.class,0); + } + public Once_blockContext once_block() { + return getRuleContext(Once_blockContext.class,0); + } + public PrependContext prepend() { + return getRuleContext(PrependContext.class,0); + } + public FragmentDContext fragmentD() { + return getRuleContext(FragmentDContext.class,0); + } + public IfContext if_() { + return getRuleContext(IfContext.class,0); + } + public SwitchContext switch_() { + return getRuleContext(SwitchContext.class,0); + } + public Env_blockContext env_block() { + return getRuleContext(Env_blockContext.class,0); + } + public Empty_blockContext empty_block() { + return getRuleContext(Empty_blockContext.class,0); + } + public Error_blockContext error_block() { + return getRuleContext(Error_blockContext.class,0); + } + public Conditional_blockContext conditional_block() { + return getRuleContext(Conditional_blockContext.class,0); + } + public Auth_blockContext auth_block() { + return getRuleContext(Auth_blockContext.class,0); + } + public PermissionContext permission() { + return getRuleContext(PermissionContext.class,0); + } + public WhileContext while_() { + return getRuleContext(WhileContext.class,0); + } + public ForContext for_() { + return getRuleContext(ForContext.class,0); + } + public ForeachContext foreach() { + return getRuleContext(ForeachContext.class,0); + } + public ForelseContext forelse() { + return getRuleContext(ForelseContext.class,0); + } + public SessionContext session() { + return getRuleContext(SessionContext.class,0); + } + public Verbatim_blockContext verbatim_block() { + return getRuleContext(Verbatim_blockContext.class,0); + } + public Php_bladeContext php_blade() { + return getRuleContext(Php_bladeContext.class,0); + } + public Block_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterBlock_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitBlock_statement(this); + } + } + + public final Block_statementContext block_statement() throws RecognitionException { + Block_statementContext _localctx = new Block_statementContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_block_statement); + try { + setState(198); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_SECTION: + enterOuterAlt(_localctx, 1); + { + setState(176); + section(); + } + break; + case D_HAS_SECTION: + case D_SECTION_MISSING: + enterOuterAlt(_localctx, 2); + { + setState(177); + condSection(); + } + break; + case D_PUSH: + enterOuterAlt(_localctx, 3); + { + setState(178); + push(); + } + break; + case D_PUSH_IF: + enterOuterAlt(_localctx, 4); + { + setState(179); + pushIf(); + } + break; + case D_ONCE: + enterOuterAlt(_localctx, 5); + { + setState(180); + once_block(); + } + break; + case D_PREPEND: + enterOuterAlt(_localctx, 6); + { + setState(181); + prepend(); + } + break; + case D_FRAGMENT: + enterOuterAlt(_localctx, 7); + { + setState(182); + fragmentD(); + } + break; + case D_IF: + enterOuterAlt(_localctx, 8); + { + setState(183); + if_(); + } + break; + case D_SWITCH: + enterOuterAlt(_localctx, 9); + { + setState(184); + switch_(); + } + break; + case D_PRODUCTION: + case D_ENV: + enterOuterAlt(_localctx, 10); + { + setState(185); + env_block(); + } + break; + case D_EMPTY: + enterOuterAlt(_localctx, 11); + { + setState(186); + empty_block(); + } + break; + case D_ERROR: + enterOuterAlt(_localctx, 12); + { + setState(187); + error_block(); + } + break; + case D_COND_BLOCK_START: + enterOuterAlt(_localctx, 13); + { + setState(188); + conditional_block(); + } + break; + case D_AUTH_START: + enterOuterAlt(_localctx, 14); + { + setState(189); + auth_block(); + } + break; + case D_PERMISSION_START: + enterOuterAlt(_localctx, 15); + { + setState(190); + permission(); + } + break; + case D_WHILE: + enterOuterAlt(_localctx, 16); + { + setState(191); + while_(); + } + break; + case D_FOR: + enterOuterAlt(_localctx, 17); + { + setState(192); + for_(); + } + break; + case D_FOREACH: + enterOuterAlt(_localctx, 18); + { + setState(193); + foreach(); + } + break; + case D_FORELSE: + enterOuterAlt(_localctx, 19); + { + setState(194); + forelse(); + } + break; + case D_SESSION: + enterOuterAlt(_localctx, 20); + { + setState(195); + session(); + } + break; + case D_VERBATIM: + enterOuterAlt(_localctx, 21); + { + setState(196); + verbatim_block(); + } + break; + case D_PHP: + enterOuterAlt(_localctx, 22); + { + setState(197); + php_blade(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifiableTypeContext extends ParserRuleContext { + public Token d_name; + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode D_INCLUDE() { return getToken(BladeAntlrParser.D_INCLUDE, 0); } + public TerminalNode D_INCLUDE_IF() { return getToken(BladeAntlrParser.D_INCLUDE_IF, 0); } + public TerminalNode D_EXTENDS() { return getToken(BladeAntlrParser.D_EXTENDS, 0); } + public TerminalNode D_YIELD() { return getToken(BladeAntlrParser.D_YIELD, 0); } + public TerminalNode D_USE() { return getToken(BladeAntlrParser.D_USE, 0); } + public TerminalNode D_LANG() { return getToken(BladeAntlrParser.D_LANG, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public IdentifiableTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifiableType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableType(this); + } + } + + public final IdentifiableTypeContext identifiableType() throws RecognitionException { + IdentifiableTypeContext _localctx = new IdentifiableTypeContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_identifiableType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(200); + ((IdentifiableTypeContext)_localctx).d_name = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la - 47)) & ~0x3f) == 0 && ((1L << (_la - 47)) & 27021597764231235L) != 0) ) { + ((IdentifiableTypeContext)_localctx).d_name = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(201); + match(BLADE_PARAM_LPAREN); + setState(204); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { + case 1: + { + setState(202); + ((IdentifiableTypeContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(203); + composedArgument(); + } + break; + } + setState(208); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + case 1: + { + setState(206); + match(BL_COMMA); + setState(207); + composedArgument(); + } + break; + } + setState(211); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_COMMA) { + { + setState(210); + match(BL_COMMA); + } + } + + setState(213); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_inlineContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrParser.D_SECTION, 0); } + public DoubleArgWrapperPContext doubleArgWrapperP() { + return getRuleContext(DoubleArgWrapperPContext.class,0); + } + public Section_inlineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_inline; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSection_inline(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSection_inline(this); + } + } + + public final Section_inlineContext section_inline() throws RecognitionException { + Section_inlineContext _localctx = new Section_inlineContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_section_inline); + try { + enterOuterAlt(_localctx, 1); + { + setState(215); + match(D_SECTION); + setState(216); + doubleArgWrapperP(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SectionContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrParser.D_SECTION, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_SHOW() { return getToken(BladeAntlrParser.D_SHOW, 0); } + public TerminalNode D_STOP() { return getToken(BladeAntlrParser.D_STOP, 0); } + public TerminalNode D_OVERWRITE() { return getToken(BladeAntlrParser.D_OVERWRITE, 0); } + public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrParser.D_ENDSECTION, 0); } + public TerminalNode D_APPEND() { return getToken(BladeAntlrParser.D_APPEND, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_PARENT() { return getTokens(BladeAntlrParser.D_PARENT); } + public TerminalNode D_PARENT(int i) { + return getToken(BladeAntlrParser.D_PARENT, i); + } + public SectionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSection(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSection(this); + } + } + + public final SectionContext section() throws RecognitionException { + SectionContext _localctx = new SectionContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_section); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(218); + match(D_SECTION); + setState(219); + singleArgWrapperP(); + setState(224); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 4035201810946850816L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + setState(222); + _errHandler.sync(this); + switch (_input.LA(1)) { + case HTML: + case D_IF: + case D_ELSE: + case D_SWITCH: + case D_CASE: + case D_DEFAULT: + case D_EMPTY: + case D_COND_BLOCK_START: + case D_FOREACH: + case D_FOR: + case D_FORELSE: + case D_WHILE: + case D_BREAK: + case D_LOOP_ACTION: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_FIRST: + case D_INCLUDE_UNLESS: + case D_EACH: + case D_EXTENDS: + case D_JS: + case D_JSON: + case D_SECTION: + case D_HAS_SECTION: + case D_SECTION_MISSING: + case D_YIELD: + case D_ONCE: + case D_STACK: + case D_PUSH: + case D_PUSH_IF: + case D_PREPEND: + case D_PROPS: + case D_FRAGMENT: + case D_CSRF: + case D_METHOD: + case D_ERROR: + case D_PRODUCTION: + case D_ENV: + case D_AUTH_START: + case D_PERMISSION_START: + case D_PERMISSION_ELSE: + case D_CLASS: + case D_STYLE: + case D_HTML_ATTR_EXPR: + case D_AWARE: + case D_SESSION: + case D_DD: + case D_LANG: + case D_USE: + case D_INJECT: + case D_PHP: + case D_VERBATIM: + case D_LIVEWIRE: + case D_ASSET_BUNDLER: + case D_MISC: + case D_CUSTOM: + case D_UNKNOWN_ATTR_ENC: + case D_UNKNOWN: + case CONTENT_TAG_OPEN: + case RAW_TAG_OPEN: + case PHP_INLINE_START: + case HTML_COMPONENT_PREFIX: + case HTML_TAG_START: + case HTML_IDENTIFIER: + case EQ: + { + setState(220); + general_statement(); + } + break; + case D_PARENT: + { + setState(221); + match(D_PARENT); + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(226); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(227); + _la = _input.LA(1); + if ( !((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 121L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PushContext extends ParserRuleContext { + public TerminalNode D_PUSH() { return getToken(BladeAntlrParser.D_PUSH, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPUSH() { return getToken(BladeAntlrParser.D_ENDPUSH, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PushContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_push; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPush(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPush(this); + } + } + + public final PushContext push() throws RecognitionException { + PushContext _localctx = new PushContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_push); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(229); + match(D_PUSH); + setState(230); + singleArgWrapperP(); + setState(234); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(231); + general_statement(); + } + } + setState(236); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(237); + match(D_ENDPUSH); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PushOnceContext extends ParserRuleContext { + public TerminalNode D_PUSH_ONCE() { return getToken(BladeAntlrParser.D_PUSH_ONCE, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPUSH_ONCE() { return getToken(BladeAntlrParser.D_ENDPUSH_ONCE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PushOnceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pushOnce; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPushOnce(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPushOnce(this); + } + } + + public final PushOnceContext pushOnce() throws RecognitionException { + PushOnceContext _localctx = new PushOnceContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_pushOnce); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(239); + match(D_PUSH_ONCE); + setState(240); + singleArgWrapperP(); + setState(244); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(241); + general_statement(); + } + } + setState(246); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(247); + match(D_ENDPUSH_ONCE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PushIfContext extends ParserRuleContext { + public TerminalNode D_PUSH_IF() { return getToken(BladeAntlrParser.D_PUSH_IF, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPUSH_IF() { return getToken(BladeAntlrParser.D_ENDPUSH_IF, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PushIfContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pushIf; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPushIf(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPushIf(this); + } + } + + public final PushIfContext pushIf() throws RecognitionException { + PushIfContext _localctx = new PushIfContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_pushIf); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(249); + match(D_PUSH_IF); + setState(250); + singleArgWrapperP(); + setState(254); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(251); + general_statement(); + } + } + setState(256); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(257); + match(D_ENDPUSH_IF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PrependContext extends ParserRuleContext { + public TerminalNode D_PREPEND() { return getToken(BladeAntlrParser.D_PREPEND, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPREPEND() { return getToken(BladeAntlrParser.D_ENDPREPEND, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PrependContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_prepend; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPrepend(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPrepend(this); + } + } + + public final PrependContext prepend() throws RecognitionException { + PrependContext _localctx = new PrependContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_prepend); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(259); + match(D_PREPEND); + setState(260); + singleArgWrapperP(); + setState(264); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(261); + general_statement(); + } + } + setState(266); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(267); + match(D_ENDPREPEND); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FragmentDContext extends ParserRuleContext { + public TerminalNode D_FRAGMENT() { return getToken(BladeAntlrParser.D_FRAGMENT, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public TerminalNode D_ENDFRAGMENT() { return getToken(BladeAntlrParser.D_ENDFRAGMENT, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public FragmentDContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fragmentD; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFragmentD(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFragmentD(this); + } + } + + public final FragmentDContext fragmentD() throws RecognitionException { + FragmentDContext _localctx = new FragmentDContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_fragmentD); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(269); + match(D_FRAGMENT); + setState(270); + composed_php_expression(); + setState(274); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(271); + general_statement(); + } + } + setState(276); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(277); + match(D_ENDFRAGMENT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IfContext extends ParserRuleContext { + public TerminalNode D_IF() { return getToken(BladeAntlrParser.D_IF, 0); } + public List main_php_expression() { + return getRuleContexts(Main_php_expressionContext.class); + } + public Main_php_expressionContext main_php_expression(int i) { + return getRuleContext(Main_php_expressionContext.class,i); + } + public EndifContext endif() { + return getRuleContext(EndifContext.class,0); + } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_ELSEIF() { return getTokens(BladeAntlrParser.D_ELSEIF); } + public TerminalNode D_ELSEIF(int i) { + return getToken(BladeAntlrParser.D_ELSEIF, i); + } + public ElseContext else_() { + return getRuleContext(ElseContext.class,0); + } + public IfContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_if; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIf(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIf(this); + } + } + + public final IfContext if_() throws RecognitionException { + IfContext _localctx = new IfContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_if); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(279); + match(D_IF); + setState(280); + main_php_expression(); + setState(284); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(281); + general_statement(); + } + } + } + setState(286); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + } + setState(297); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==D_ELSEIF) { + { + { + setState(287); + match(D_ELSEIF); + setState(288); + main_php_expression(); + setState(292); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(289); + general_statement(); + } + } + } + setState(294); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + } + } + } + setState(299); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(301); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==D_ELSE) { + { + setState(300); + else_(); + } + } + + setState(303); + endif(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElseContext extends ParserRuleContext { + public TerminalNode D_ELSE() { return getToken(BladeAntlrParser.D_ELSE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ElseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_else; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterElse(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitElse(this); + } + } + + public final ElseContext else_() throws RecognitionException { + ElseContext _localctx = new ElseContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_else); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(305); + match(D_ELSE); + setState(309); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(306); + general_statement(); + } + } + setState(311); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EndifContext extends ParserRuleContext { + public TerminalNode D_ENDIF() { return getToken(BladeAntlrParser.D_ENDIF, 0); } + public EndifContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_endif; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEndif(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEndif(this); + } + } + + public final EndifContext endif() throws RecognitionException { + EndifContext _localctx = new EndifContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_endif); + try { + enterOuterAlt(_localctx, 1); + { + setState(312); + match(D_ENDIF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Empty_blockContext extends ParserRuleContext { + public TerminalNode D_EMPTY() { return getToken(BladeAntlrParser.D_EMPTY, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_ENDEMPTY() { return getToken(BladeAntlrParser.D_ENDEMPTY, 0); } + public Empty_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_empty_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEmpty_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEmpty_block(this); + } + } + + public final Empty_blockContext empty_block() throws RecognitionException { + Empty_blockContext _localctx = new Empty_blockContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_empty_block); + try { + enterOuterAlt(_localctx, 1); + { + setState(314); + match(D_EMPTY); + setState(315); + composed_php_expression(); + setState(316); + simple_conditional_stm(); + setState(317); + match(D_ENDEMPTY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Conditional_blockContext extends ParserRuleContext { + public TerminalNode D_COND_BLOCK_START() { return getToken(BladeAntlrParser.D_COND_BLOCK_START, 0); } + public Main_php_expressionContext main_php_expression() { + return getRuleContext(Main_php_expressionContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_COND_BLOCK_END() { return getToken(BladeAntlrParser.D_COND_BLOCK_END, 0); } + public Conditional_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_conditional_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterConditional_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitConditional_block(this); + } + } + + public final Conditional_blockContext conditional_block() throws RecognitionException { + Conditional_blockContext _localctx = new Conditional_blockContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_conditional_block); + try { + enterOuterAlt(_localctx, 1); + { + setState(319); + match(D_COND_BLOCK_START); + setState(320); + main_php_expression(); + setState(321); + simple_conditional_stm(); + setState(322); + match(D_COND_BLOCK_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Auth_blockContext extends ParserRuleContext { + public TerminalNode D_AUTH_START() { return getToken(BladeAntlrParser.D_AUTH_START, 0); } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_AUTH_END() { return getToken(BladeAntlrParser.D_AUTH_END, 0); } + public List BLADE_PARAM_LPAREN() { return getTokens(BladeAntlrParser.BLADE_PARAM_LPAREN); } + public TerminalNode BLADE_PARAM_LPAREN(int i) { + return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, i); + } + public List BLADE_PARAM_RPAREN() { return getTokens(BladeAntlrParser.BLADE_PARAM_RPAREN); } + public TerminalNode BLADE_PARAM_RPAREN(int i) { + return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, i); + } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public Auth_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_auth_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterAuth_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitAuth_block(this); + } + } + + public final Auth_blockContext auth_block() throws RecognitionException { + Auth_blockContext _localctx = new Auth_blockContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_auth_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(324); + match(D_AUTH_START); + setState(335); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==BLADE_PARAM_LPAREN) { + { + { + setState(325); + match(BLADE_PARAM_LPAREN); + setState(329); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0 || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING) { + { + { + setState(326); + composedArgument(); + } + } + setState(331); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(332); + match(BLADE_PARAM_RPAREN); + } + } + setState(337); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(338); + simple_conditional_stm(); + setState(339); + match(D_AUTH_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Env_blockContext extends ParserRuleContext { + public TerminalNode D_ENV() { return getToken(BladeAntlrParser.D_ENV, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_ENDENV() { return getToken(BladeAntlrParser.D_ENDENV, 0); } + public TerminalNode D_PRODUCTION() { return getToken(BladeAntlrParser.D_PRODUCTION, 0); } + public TerminalNode D_ENDPRODUCTION() { return getToken(BladeAntlrParser.D_ENDPRODUCTION, 0); } + public Env_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_env_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEnv_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEnv_block(this); + } + } + + public final Env_blockContext env_block() throws RecognitionException { + Env_blockContext _localctx = new Env_blockContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_env_block); + try { + setState(350); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_ENV: + enterOuterAlt(_localctx, 1); + { + { + setState(341); + match(D_ENV); + setState(342); + singleArgWrapperP(); + setState(343); + simple_conditional_stm(); + setState(344); + match(D_ENDENV); + } + } + break; + case D_PRODUCTION: + enterOuterAlt(_localctx, 2); + { + setState(346); + match(D_PRODUCTION); + setState(347); + simple_conditional_stm(); + setState(348); + match(D_ENDPRODUCTION); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PermissionContext extends ParserRuleContext { + public TerminalNode D_PERMISSION_START() { return getToken(BladeAntlrParser.D_PERMISSION_START, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_PERMISSION_END() { return getToken(BladeAntlrParser.D_PERMISSION_END, 0); } + public PermissionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_permission; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPermission(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPermission(this); + } + } + + public final PermissionContext permission() throws RecognitionException { + PermissionContext _localctx = new PermissionContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_permission); + try { + enterOuterAlt(_localctx, 1); + { + setState(352); + match(D_PERMISSION_START); + setState(353); + composed_php_expression(); + setState(354); + simple_conditional_stm(); + setState(355); + match(D_PERMISSION_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Simple_conditional_stmContext extends ParserRuleContext { + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ElseContext else_() { + return getRuleContext(ElseContext.class,0); + } + public Simple_conditional_stmContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simple_conditional_stm; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSimple_conditional_stm(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSimple_conditional_stm(this); + } + } + + public final Simple_conditional_stmContext simple_conditional_stm() throws RecognitionException { + Simple_conditional_stmContext _localctx = new Simple_conditional_stmContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_simple_conditional_stm); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(360); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(357); + general_statement(); + } + } + } + setState(362); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); + } + setState(364); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==D_ELSE) { + { + setState(363); + else_(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Error_blockContext extends ParserRuleContext { + public TerminalNode D_ERROR() { return getToken(BladeAntlrParser.D_ERROR, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDERROR() { return getToken(BladeAntlrParser.D_ENDERROR, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public Error_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_error_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterError_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitError_block(this); + } + } + + public final Error_blockContext error_block() throws RecognitionException { + Error_blockContext _localctx = new Error_blockContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_error_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(366); + match(D_ERROR); + setState(367); + php_expression(); + setState(371); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(368); + general_statement(); + } + } + setState(373); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(374); + match(D_ENDERROR); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SwitchContext extends ParserRuleContext { + public TerminalNode D_SWITCH() { return getToken(BladeAntlrParser.D_SWITCH, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDSWITCH() { return getToken(BladeAntlrParser.D_ENDSWITCH, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_BREAK() { return getTokens(BladeAntlrParser.D_BREAK); } + public TerminalNode D_BREAK(int i) { + return getToken(BladeAntlrParser.D_BREAK, i); + } + public SwitchContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switch; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSwitch(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSwitch(this); + } + } + + public final SwitchContext switch_() throws RecognitionException { + SwitchContext _localctx = new SwitchContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_switch); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(376); + match(D_SWITCH); + setState(377); + php_expression(); + setState(380); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + setState(380); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { + case 1: + { + setState(378); + general_statement(); + } + break; + case 2: + { + setState(379); + match(D_BREAK); + } + break; + } + } + setState(382); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0 ); + setState(384); + match(D_ENDSWITCH); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class WhileContext extends ParserRuleContext { + public TerminalNode D_WHILE() { return getToken(BladeAntlrParser.D_WHILE, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDWHILE() { return getToken(BladeAntlrParser.D_ENDWHILE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public WhileContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_while; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterWhile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitWhile(this); + } + } + + public final WhileContext while_() throws RecognitionException { + WhileContext _localctx = new WhileContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_while); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(386); + match(D_WHILE); + setState(387); + php_expression(); + setState(391); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(388); + general_statement(); + } + } + setState(393); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(394); + match(D_ENDWHILE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForContext extends ParserRuleContext { + public TerminalNode D_FOR() { return getToken(BladeAntlrParser.D_FOR, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDFOR() { return getToken(BladeAntlrParser.D_ENDFOR, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ForContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_for; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFor(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFor(this); + } + } + + public final ForContext for_() throws RecognitionException { + ForContext _localctx = new ForContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_for); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(396); + match(D_FOR); + setState(397); + php_expression(); + setState(401); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(398); + general_statement(); + } + } + setState(403); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(404); + match(D_ENDFOR); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForeachContext extends ParserRuleContext { + public TerminalNode D_FOREACH() { return getToken(BladeAntlrParser.D_FOREACH, 0); } + public TerminalNode FOREACH_LOOP_LPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, 0); } + public Loop_expressionContext loop_expression() { + return getRuleContext(Loop_expressionContext.class,0); + } + public TerminalNode FOREACH_LOOP_RPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, 0); } + public TerminalNode D_ENDFOREACH() { return getToken(BladeAntlrParser.D_ENDFOREACH, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ForeachContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_foreach; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterForeach(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitForeach(this); + } + } + + public final ForeachContext foreach() throws RecognitionException { + ForeachContext _localctx = new ForeachContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_foreach); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(406); + match(D_FOREACH); + setState(407); + match(FOREACH_LOOP_LPAREN); + setState(408); + loop_expression(); + setState(409); + match(FOREACH_LOOP_RPAREN); + setState(413); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(410); + general_statement(); + } + } + setState(415); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(416); + match(D_ENDFOREACH); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForelseContext extends ParserRuleContext { + public TerminalNode D_FORELSE() { return getToken(BladeAntlrParser.D_FORELSE, 0); } + public TerminalNode FOREACH_LOOP_LPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, 0); } + public Loop_expressionContext loop_expression() { + return getRuleContext(Loop_expressionContext.class,0); + } + public TerminalNode FOREACH_LOOP_RPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, 0); } + public TerminalNode D_ENDFORELSE() { return getToken(BladeAntlrParser.D_ENDFORELSE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_EMPTY() { return getTokens(BladeAntlrParser.D_EMPTY); } + public TerminalNode D_EMPTY(int i) { + return getToken(BladeAntlrParser.D_EMPTY, i); + } + public ForelseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forelse; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterForelse(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitForelse(this); + } + } + + public final ForelseContext forelse() throws RecognitionException { + ForelseContext _localctx = new ForelseContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_forelse); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(418); + match(D_FORELSE); + setState(419); + match(FOREACH_LOOP_LPAREN); + setState(420); + loop_expression(); + setState(421); + match(FOREACH_LOOP_RPAREN); + setState(426); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + setState(424); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { + case 1: + { + setState(422); + general_statement(); + } + break; + case 2: + { + setState(423); + match(D_EMPTY); + } + break; + } + } + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(429); + match(D_ENDFORELSE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SessionContext extends ParserRuleContext { + public TerminalNode D_SESSION() { return getToken(BladeAntlrParser.D_SESSION, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public TerminalNode D_ENDSESSION() { return getToken(BladeAntlrParser.D_ENDSESSION, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public SessionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_session; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSession(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSession(this); + } + } + + public final SessionContext session() throws RecognitionException { + SessionContext _localctx = new SessionContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_session); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(431); + match(D_SESSION); + setState(432); + composed_php_expression(); + setState(436); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(433); + general_statement(); + } + } + setState(438); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(439); + match(D_ENDSESSION); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StackContext extends ParserRuleContext { + public TerminalNode D_STACK() { return getToken(BladeAntlrParser.D_STACK, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public StackContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_stack; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStack(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStack(this); + } + } + + public final StackContext stack() throws RecognitionException { + StackContext _localctx = new StackContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_stack); + try { + enterOuterAlt(_localctx, 1); + { + setState(441); + match(D_STACK); + setState(442); + singleArgWrapperP(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Asset_bundlerContext extends ParserRuleContext { + public Token d_name; + public Token id_strings; + public Token dir; + public Token id_string; + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode D_ASSET_BUNDLER() { return getToken(BladeAntlrParser.D_ASSET_BUNDLER, 0); } + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List EXPR_STRING() { return getTokens(BladeAntlrParser.EXPR_STRING); } + public TerminalNode EXPR_STRING(int i) { + return getToken(BladeAntlrParser.EXPR_STRING, i); + } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Asset_bundlerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_asset_bundler; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterAsset_bundler(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitAsset_bundler(this); + } + } + + public final Asset_bundlerContext asset_bundler() throws RecognitionException { + Asset_bundlerContext _localctx = new Asset_bundlerContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_asset_bundler); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(444); + ((Asset_bundlerContext)_localctx).d_name = match(D_ASSET_BUNDLER); + setState(445); + match(BLADE_EXPR_LPAREN); + setState(462); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + { + setState(446); + match(BL_SQ_LPAREN); + setState(448); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(447); + ((Asset_bundlerContext)_localctx).id_strings = match(EXPR_STRING); + } + } + setState(450); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==EXPR_STRING ); + setState(452); + match(BL_SQ_RPAREN); + setState(454); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EXPR_STRING) { + { + setState(453); + ((Asset_bundlerContext)_localctx).dir = match(EXPR_STRING); + } + } + + } + break; + case 2: + { + setState(456); + ((Asset_bundlerContext)_localctx).id_string = match(EXPR_STRING); + } + break; + case 3: + { + setState(458); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(457); + composed_php_expression(); + } + } + setState(460); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + } + break; + } + setState(464); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InjectContext extends ParserRuleContext { + public TerminalNode D_INJECT() { return getToken(BladeAntlrParser.D_INJECT, 0); } + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BL_COMMA() { return getToken(BladeAntlrParser.BL_COMMA, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public IdentifiableArgumentContext identifiableArgument() { + return getRuleContext(IdentifiableArgumentContext.class,0); + } + public InjectContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inject; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInject(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInject(this); + } + } + + public final InjectContext inject() throws RecognitionException { + InjectContext _localctx = new InjectContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_inject); + try { + enterOuterAlt(_localctx, 1); + { + setState(466); + match(D_INJECT); + setState(467); + match(BLADE_PARAM_LPAREN); + setState(468); + composedArgument(); + setState(469); + match(BL_COMMA); + setState(472); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: + { + setState(470); + identifiableArgument(); + } + break; + case 2: + { + setState(471); + composedArgument(); + } + break; + } + setState(474); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IncludeCondContext extends ParserRuleContext { + public Token d_name; + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode D_INCLUDE_WHEN() { return getToken(BladeAntlrParser.D_INCLUDE_WHEN, 0); } + public TerminalNode D_INCLUDE_UNLESS() { return getToken(BladeAntlrParser.D_INCLUDE_UNLESS, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public IncludeCondContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_includeCond; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIncludeCond(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIncludeCond(this); + } + } + + public final IncludeCondContext includeCond() throws RecognitionException { + IncludeCondContext _localctx = new IncludeCondContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_includeCond); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(476); + ((IncludeCondContext)_localctx).d_name = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==D_INCLUDE_WHEN || _la==D_INCLUDE_UNLESS) ) { + ((IncludeCondContext)_localctx).d_name = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(477); + match(BLADE_PARAM_LPAREN); + setState(478); + composedArgument(); + setState(479); + match(BL_COMMA); + setState(482); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + case 1: + { + setState(480); + ((IncludeCondContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(481); + composedArgument(); + } + break; + } + setState(486); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_COMMA) { + { + setState(484); + match(BL_COMMA); + setState(485); + composedArgument(); + } + } + + setState(488); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EachContext extends ParserRuleContext { + public Token idString; + public TerminalNode D_EACH() { return getToken(BladeAntlrParser.D_EACH, 0); } + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public IdentifiableArgumentContext identifiableArgument() { + return getRuleContext(IdentifiableArgumentContext.class,0); + } + public EachContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_each; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEach(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEach(this); + } + } + + public final EachContext each() throws RecognitionException { + EachContext _localctx = new EachContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_each); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(490); + match(D_EACH); + setState(491); + match(BLADE_PARAM_LPAREN); + setState(494); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + case 1: + { + setState(492); + ((EachContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(493); + composedArgument(); + } + break; + } + setState(496); + match(BL_COMMA); + setState(497); + composedArgument(); + setState(498); + match(BL_COMMA); + setState(499); + composedArgument(); + setState(505); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_COMMA) { + { + setState(500); + match(BL_COMMA); + setState(503); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: + { + setState(501); + identifiableArgument(); + } + break; + case 2: + { + setState(502); + composedArgument(); + } + break; + } + } + } + + setState(507); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Once_blockContext extends ParserRuleContext { + public TerminalNode D_ONCE() { return getToken(BladeAntlrParser.D_ONCE, 0); } + public TerminalNode D_ENDONCE() { return getToken(BladeAntlrParser.D_ENDONCE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public Once_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_once_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterOnce_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitOnce_block(this); + } + } + + public final Once_blockContext once_block() throws RecognitionException { + Once_blockContext _localctx = new Once_blockContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_once_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(509); + match(D_ONCE); + setState(511); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(510); + general_statement(); + } + } + setState(513); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0 ); + setState(515); + match(D_ENDONCE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CondSectionContext extends ParserRuleContext { + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_ENDIF() { return getToken(BladeAntlrParser.D_ENDIF, 0); } + public TerminalNode D_SECTION_MISSING() { return getToken(BladeAntlrParser.D_SECTION_MISSING, 0); } + public TerminalNode D_HAS_SECTION() { return getToken(BladeAntlrParser.D_HAS_SECTION, 0); } + public CondSectionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_condSection; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterCondSection(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitCondSection(this); + } + } + + public final CondSectionContext condSection() throws RecognitionException { + CondSectionContext _localctx = new CondSectionContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_condSection); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(517); + _la = _input.LA(1); + if ( !(_la==D_HAS_SECTION || _la==D_SECTION_MISSING) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(518); + singleArgWrapperP(); + setState(519); + simple_conditional_stm(); + setState(520); + match(D_ENDIF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Custom_directiveContext extends ParserRuleContext { + public TerminalNode D_CUSTOM() { return getToken(BladeAntlrParser.D_CUSTOM, 0); } + public MultiArgWrapperContext multiArgWrapper() { + return getRuleContext(MultiArgWrapperContext.class,0); + } + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public Custom_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_custom_directive; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterCustom_directive(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitCustom_directive(this); + } + } + + public final Custom_directiveContext custom_directive() throws RecognitionException { + Custom_directiveContext _localctx = new Custom_directiveContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_custom_directive); + try { + enterOuterAlt(_localctx, 1); + { + setState(522); + match(D_CUSTOM); + setState(526); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + case 1: + { + { + setState(523); + match(BLADE_PARAM_LPAREN); + setState(524); + match(BLADE_PARAM_RPAREN); + } + } + break; + case 2: + { + setState(525); + multiArgWrapper(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PossibleDirectiveContext extends ParserRuleContext { + public TerminalNode D_UNKNOWN() { return getToken(BladeAntlrParser.D_UNKNOWN, 0); } + public TerminalNode D_UNKNOWN_ATTR_ENC() { return getToken(BladeAntlrParser.D_UNKNOWN_ATTR_ENC, 0); } + public PossibleDirectiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_possibleDirective; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPossibleDirective(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPossibleDirective(this); + } + } + + public final PossibleDirectiveContext possibleDirective() throws RecognitionException { + PossibleDirectiveContext _localctx = new PossibleDirectiveContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_possibleDirective); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(528); + _la = _input.LA(1); + if ( !(_la==D_UNKNOWN_ATTR_ENC || _la==D_UNKNOWN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Php_bladeContext extends ParserRuleContext { + public TerminalNode D_PHP() { return getToken(BladeAntlrParser.D_PHP, 0); } + public TerminalNode D_ENDPHP() { return getToken(BladeAntlrParser.D_ENDPHP, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Main_php_expressionContext main_php_expression() { + return getRuleContext(Main_php_expressionContext.class,0); + } + public Php_bladeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_php_blade; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhp_blade(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhp_blade(this); + } + } + + public final Php_bladeContext php_blade() throws RecognitionException { + Php_bladeContext _localctx = new Php_bladeContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_php_blade); + int _la; + try { + setState(540); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(530); + match(D_PHP); + setState(534); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(531); + composed_php_expression(); + } + } + setState(536); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(537); + match(D_ENDPHP); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(538); + match(D_PHP); + setState(539); + main_php_expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PhpInlineContext extends ParserRuleContext { + public TerminalNode PHP_INLINE_START() { return getToken(BladeAntlrParser.PHP_INLINE_START, 0); } + public TerminalNode PHP_EXIT() { return getToken(BladeAntlrParser.PHP_EXIT, 0); } + public TerminalNode EOF() { return getToken(BladeAntlrParser.EOF, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public PhpInlineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_phpInline; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhpInline(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhpInline(this); + } + } + + public final PhpInlineContext phpInline() throws RecognitionException { + PhpInlineContext _localctx = new PhpInlineContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_phpInline); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(542); + match(PHP_INLINE_START); + setState(544); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(543); + composed_php_expression(); + } + } + setState(546); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + setState(548); + _la = _input.LA(1); + if ( !(_la==EOF || _la==PHP_EXIT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Regular_echoContext extends ParserRuleContext { + public TerminalNode CONTENT_TAG_OPEN() { return getToken(BladeAntlrParser.CONTENT_TAG_OPEN, 0); } + public TerminalNode CONTENT_TAG_CLOSE() { return getToken(BladeAntlrParser.CONTENT_TAG_CLOSE, 0); } + public List echo_expr() { + return getRuleContexts(Echo_exprContext.class); + } + public Echo_exprContext echo_expr(int i) { + return getRuleContext(Echo_exprContext.class,i); + } + public Regular_echoContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_regular_echo; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterRegular_echo(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitRegular_echo(this); + } + } + + public final Regular_echoContext regular_echo() throws RecognitionException { + Regular_echoContext _localctx = new Regular_echoContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_regular_echo); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(550); + match(CONTENT_TAG_OPEN); + setState(554); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(551); + echo_expr(); + } + } + setState(556); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(557); + match(CONTENT_TAG_CLOSE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Raw_echoContext extends ParserRuleContext { + public TerminalNode RAW_TAG_OPEN() { return getToken(BladeAntlrParser.RAW_TAG_OPEN, 0); } + public TerminalNode RAW_TAG_CLOSE() { return getToken(BladeAntlrParser.RAW_TAG_CLOSE, 0); } + public List echo_expr() { + return getRuleContexts(Echo_exprContext.class); + } + public Echo_exprContext echo_expr(int i) { + return getRuleContext(Echo_exprContext.class,i); + } + public Raw_echoContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_raw_echo; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterRaw_echo(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitRaw_echo(this); + } + } + + public final Raw_echoContext raw_echo() throws RecognitionException { + Raw_echoContext _localctx = new Raw_echoContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_raw_echo); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(559); + match(RAW_TAG_OPEN); + setState(563); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(560); + echo_expr(); + } + } + setState(565); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(566); + match(RAW_TAG_CLOSE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Echo_exprContext extends ParserRuleContext { + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public Echo_exprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_echo_expr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEcho_expr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEcho_expr(this); + } + } + + public final Echo_exprContext echo_expr() throws RecognitionException { + Echo_exprContext _localctx = new Echo_exprContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_echo_expr); + try { + enterOuterAlt(_localctx, 1); + { + setState(568); + composed_php_expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Class_expr_usageContext extends ParserRuleContext { + public Class_name_referenceContext class_name_reference() { + return getRuleContext(Class_name_referenceContext.class,0); + } + public Object_alias_static_accessContext object_alias_static_access() { + return getRuleContext(Object_alias_static_accessContext.class,0); + } + public Object_alias_direct_accessContext object_alias_direct_access() { + return getRuleContext(Object_alias_direct_accessContext.class,0); + } + public Static_direct_class_accessContext static_direct_class_access() { + return getRuleContext(Static_direct_class_accessContext.class,0); + } + public Static_direct_namespace_class_accessContext static_direct_namespace_class_access() { + return getRuleContext(Static_direct_namespace_class_accessContext.class,0); + } + public Class_instanceContext class_instance() { + return getRuleContext(Class_instanceContext.class,0); + } + public Class_expr_usageContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_expr_usage; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_expr_usage(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_expr_usage(this); + } + } + + public final Class_expr_usageContext class_expr_usage() throws RecognitionException { + Class_expr_usageContext _localctx = new Class_expr_usageContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_class_expr_usage); + try { + setState(576); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(570); + class_name_reference(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(571); + object_alias_static_access(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(572); + object_alias_direct_access(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(573); + static_direct_class_access(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(574); + static_direct_namespace_class_access(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(575); + class_instance(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Object_alias_static_accessContext extends ParserRuleContext { + public Token alias_name; + public Token static_property; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public Object_alias_static_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_object_alias_static_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterObject_alias_static_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitObject_alias_static_access(this); + } + } + + public final Object_alias_static_accessContext object_alias_static_access() throws RecognitionException { + Object_alias_static_accessContext _localctx = new Object_alias_static_accessContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_object_alias_static_access); + try { + enterOuterAlt(_localctx, 1); + { + setState(578); + ((Object_alias_static_accessContext)_localctx).alias_name = match(PHP_VARIABLE); + setState(579); + match(PHP_STATIC_ACCESS); + setState(580); + ((Object_alias_static_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Object_alias_direct_accessContext extends ParserRuleContext { + public Token alias_name; + public Token property; + public TerminalNode PHP_INSTANCE_ACCESS() { return getToken(BladeAntlrParser.PHP_INSTANCE_ACCESS, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public Object_alias_direct_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_object_alias_direct_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterObject_alias_direct_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitObject_alias_direct_access(this); + } + } + + public final Object_alias_direct_accessContext object_alias_direct_access() throws RecognitionException { + Object_alias_direct_accessContext _localctx = new Object_alias_direct_accessContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_object_alias_direct_access); + try { + enterOuterAlt(_localctx, 1); + { + setState(582); + ((Object_alias_direct_accessContext)_localctx).alias_name = match(PHP_VARIABLE); + setState(583); + match(PHP_INSTANCE_ACCESS); + setState(584); + ((Object_alias_direct_accessContext)_localctx).property = match(PHP_IDENTIFIER); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Static_direct_class_accessContext extends ParserRuleContext { + public Token class_name; + public Token func_name; + public Token static_property; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public List PHP_IDENTIFIER() { return getTokens(BladeAntlrParser.PHP_IDENTIFIER); } + public TerminalNode PHP_IDENTIFIER(int i) { + return getToken(BladeAntlrParser.PHP_IDENTIFIER, i); + } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Static_direct_class_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_static_direct_class_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStatic_direct_class_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStatic_direct_class_access(this); + } + } + + public final Static_direct_class_accessContext static_direct_class_access() throws RecognitionException { + Static_direct_class_accessContext _localctx = new Static_direct_class_accessContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_static_direct_class_access); + int _la; + try { + setState(600); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(586); + ((Static_direct_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(587); + match(PHP_STATIC_ACCESS); + setState(588); + ((Static_direct_class_accessContext)_localctx).func_name = match(PHP_IDENTIFIER); + setState(589); + match(BLADE_EXPR_LPAREN); + setState(593); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(590); + composed_php_expression(); + } + } + setState(595); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(596); + match(BLADE_EXPR_RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(597); + ((Static_direct_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(598); + match(PHP_STATIC_ACCESS); + setState(599); + ((Static_direct_class_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Static_direct_namespace_class_accessContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public Token func_name; + public Token static_property; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public List PHP_IDENTIFIER() { return getTokens(BladeAntlrParser.PHP_IDENTIFIER); } + public TerminalNode PHP_IDENTIFIER(int i) { + return getToken(BladeAntlrParser.PHP_IDENTIFIER, i); + } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public Static_direct_namespace_class_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_static_direct_namespace_class_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStatic_direct_namespace_class_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStatic_direct_namespace_class_access(this); + } + } + + public final Static_direct_namespace_class_accessContext static_direct_namespace_class_access() throws RecognitionException { + Static_direct_namespace_class_accessContext _localctx = new Static_direct_namespace_class_accessContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_static_direct_namespace_class_access); + int _la; + try { + setState(622); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(603); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(602); + ((Static_direct_namespace_class_accessContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(605); + ((Static_direct_namespace_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(606); + match(PHP_STATIC_ACCESS); + setState(607); + ((Static_direct_namespace_class_accessContext)_localctx).func_name = match(PHP_IDENTIFIER); + setState(608); + match(BLADE_EXPR_LPAREN); + setState(612); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(609); + composed_php_expression(); + } + } + setState(614); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(615); + match(BLADE_EXPR_RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(617); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(616); + ((Static_direct_namespace_class_accessContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(619); + ((Static_direct_namespace_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(620); + match(PHP_STATIC_ACCESS); + setState(621); + ((Static_direct_namespace_class_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Class_instanceContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public TerminalNode PHP_NEW() { return getToken(BladeAntlrParser.PHP_NEW, 0); } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public Class_instanceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_instance; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_instance(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_instance(this); + } + } + + public final Class_instanceContext class_instance() throws RecognitionException { + Class_instanceContext _localctx = new Class_instanceContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_class_instance); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(624); + match(PHP_NEW); + { + setState(626); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(625); + ((Class_instanceContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(628); + ((Class_instanceContext)_localctx).class_name = match(PHP_IDENTIFIER); + } + setState(630); + match(BLADE_EXPR_LPAREN); + setState(634); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(631); + composed_php_expression(); + } + } + setState(636); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(637); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Class_name_referenceContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode PHP_CLASS_KEYWORD() { return getToken(BladeAntlrParser.PHP_CLASS_KEYWORD, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public Class_name_referenceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_name_reference; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_name_reference(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_name_reference(this); + } + } + + public final Class_name_referenceContext class_name_reference() throws RecognitionException { + Class_name_referenceContext _localctx = new Class_name_referenceContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_class_name_reference); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(640); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(639); + ((Class_name_referenceContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(642); + ((Class_name_referenceContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(643); + match(PHP_STATIC_ACCESS); + setState(644); + match(PHP_CLASS_KEYWORD); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NamespacePathContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public NamespacePathContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespacePath; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterNamespacePath(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitNamespacePath(this); + } + } + + public final NamespacePathContext namespacePath() throws RecognitionException { + NamespacePathContext _localctx = new NamespacePathContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_namespacePath); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(647); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(646); + ((NamespacePathContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(649); + ((NamespacePathContext)_localctx).class_name = match(PHP_IDENTIFIER); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Function_callContext extends ParserRuleContext { + public Token func_name; + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Function_callContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_function_call; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFunction_call(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFunction_call(this); + } + } + + public final Function_callContext function_call() throws RecognitionException { + Function_callContext _localctx = new Function_callContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_function_call); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(651); + ((Function_callContext)_localctx).func_name = match(PHP_IDENTIFIER); + setState(652); + match(BLADE_EXPR_LPAREN); + setState(656); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(653); + composed_php_expression(); + } + } + setState(658); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(659); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Php_expressionContext extends ParserRuleContext { + public TerminalNode PHP_EXPRESSION() { return getToken(BladeAntlrParser.PHP_EXPRESSION, 0); } + public Php_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_php_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhp_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhp_expression(this); + } + } + + public final Php_expressionContext php_expression() throws RecognitionException { + Php_expressionContext _localctx = new Php_expressionContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_php_expression); + try { + enterOuterAlt(_localctx, 1); + { + setState(661); + match(PHP_EXPRESSION); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Loop_expressionContext extends ParserRuleContext { + public Simple_foreach_exprContext simple_foreach_expr() { + return getRuleContext(Simple_foreach_exprContext.class,0); + } + public List PHP_VARIABLE() { return getTokens(BladeAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladeAntlrParser.PHP_VARIABLE, i); + } + public List PHP_EXPRESSION() { return getTokens(BladeAntlrParser.PHP_EXPRESSION); } + public TerminalNode PHP_EXPRESSION(int i) { + return getToken(BladeAntlrParser.PHP_EXPRESSION, i); + } + public List FOREACH_PARAM_ASSIGN() { return getTokens(BladeAntlrParser.FOREACH_PARAM_ASSIGN); } + public TerminalNode FOREACH_PARAM_ASSIGN(int i) { + return getToken(BladeAntlrParser.FOREACH_PARAM_ASSIGN, i); + } + public List FOREACH_LOOP_LPAREN() { return getTokens(BladeAntlrParser.FOREACH_LOOP_LPAREN); } + public TerminalNode FOREACH_LOOP_LPAREN(int i) { + return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, i); + } + public List FOREACH_LOOP_RPAREN() { return getTokens(BladeAntlrParser.FOREACH_LOOP_RPAREN); } + public TerminalNode FOREACH_LOOP_RPAREN(int i) { + return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, i); + } + public List FOREACH_AS() { return getTokens(BladeAntlrParser.FOREACH_AS); } + public TerminalNode FOREACH_AS(int i) { + return getToken(BladeAntlrParser.FOREACH_AS, i); + } + public Loop_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_loop_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterLoop_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitLoop_expression(this); + } + } + + public final Loop_expressionContext loop_expression() throws RecognitionException { + Loop_expressionContext _localctx = new Loop_expressionContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_loop_expression); + int _la; + try { + int _alt; + setState(669); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(663); + simple_foreach_expr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(665); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(664); + _la = _input.LA(1); + if ( !(_la==PHP_EXPRESSION || _la==PHP_VARIABLE || (((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 15L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(667); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Main_php_expressionContext extends ParserRuleContext { + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Main_php_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_main_php_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterMain_php_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitMain_php_expression(this); + } + } + + public final Main_php_expressionContext main_php_expression() throws RecognitionException { + Main_php_expressionContext _localctx = new Main_php_expressionContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_main_php_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(671); + match(BLADE_EXPR_LPAREN); + setState(673); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(672); + composed_php_expression(); + } + } + setState(675); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + setState(677); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Composed_php_expressionContext extends ParserRuleContext { + public Class_expr_usageContext class_expr_usage() { + return getRuleContext(Class_expr_usageContext.class,0); + } + public Function_callContext function_call() { + return getRuleContext(Function_callContext.class,0); + } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public NamespacePathContext namespacePath() { + return getRuleContext(NamespacePathContext.class,0); + } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public TerminalNode EXPR_STRING() { return getToken(BladeAntlrParser.EXPR_STRING, 0); } + public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } + public List PHP_EXPRESSION() { return getTokens(BladeAntlrParser.PHP_EXPRESSION); } + public TerminalNode PHP_EXPRESSION(int i) { + return getToken(BladeAntlrParser.PHP_EXPRESSION, i); + } + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode PHP_CLASS_KEYWORD() { return getToken(BladeAntlrParser.PHP_CLASS_KEYWORD, 0); } + public TerminalNode PHP_INSTANCE_ACCESS() { return getToken(BladeAntlrParser.PHP_INSTANCE_ACCESS, 0); } + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode PHP_EXPR_STRING() { return getToken(BladeAntlrParser.PHP_EXPR_STRING, 0); } + public Composed_php_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_composed_php_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterComposed_php_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitComposed_php_expression(this); + } + } + + public final Composed_php_expressionContext composed_php_expression() throws RecognitionException { + Composed_php_expressionContext _localctx = new Composed_php_expressionContext(_ctx, getState()); + enterRule(_localctx, 110, RULE_composed_php_expression); + int _la; + try { + int _alt; + setState(712); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(679); + class_expr_usage(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(680); + function_call(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(681); + match(PHP_IDENTIFIER); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(682); + namespacePath(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(683); + match(PHP_VARIABLE); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(684); + match(PHP_NAMESPACE_PATH); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(685); + match(EXPR_STRING); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(686); + match(PHP_KEYWORD); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(688); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(687); + match(PHP_EXPRESSION); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(690); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,66,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(692); + match(PHP_STATIC_ACCESS); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(693); + match(PHP_CLASS_KEYWORD); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(694); + match(PHP_INSTANCE_ACCESS); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(695); + match(BL_SQ_LPAREN); + setState(699); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(696); + composed_php_expression(); + } + } + setState(701); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(702); + match(BL_SQ_RPAREN); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(703); + match(BLADE_EXPR_LPAREN); + setState(707); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(704); + composed_php_expression(); + } + } + setState(709); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(710); + match(BLADE_EXPR_RPAREN); + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(711); + match(PHP_EXPR_STRING); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Simple_foreach_exprContext extends ParserRuleContext { + public Token loop_array; + public Token key; + public Token item; + public TerminalNode FOREACH_AS() { return getToken(BladeAntlrParser.FOREACH_AS, 0); } + public List PHP_VARIABLE() { return getTokens(BladeAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladeAntlrParser.PHP_VARIABLE, i); + } + public TerminalNode FOREACH_PARAM_ASSIGN() { return getToken(BladeAntlrParser.FOREACH_PARAM_ASSIGN, 0); } + public Simple_foreach_exprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simple_foreach_expr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSimple_foreach_expr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSimple_foreach_expr(this); + } + } + + public final Simple_foreach_exprContext simple_foreach_expr() throws RecognitionException { + Simple_foreach_exprContext _localctx = new Simple_foreach_exprContext(_ctx, getState()); + enterRule(_localctx, 112, RULE_simple_foreach_expr); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(714); + ((Simple_foreach_exprContext)_localctx).loop_array = match(PHP_VARIABLE); + setState(715); + match(FOREACH_AS); + setState(716); + ((Simple_foreach_exprContext)_localctx).key = match(PHP_VARIABLE); + setState(719); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FOREACH_PARAM_ASSIGN) { + { + setState(717); + match(FOREACH_PARAM_ASSIGN); + setState(718); + ((Simple_foreach_exprContext)_localctx).item = match(PHP_VARIABLE); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SingleArgWrapperPContext extends ParserRuleContext { + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public ComposedArgumentContext composedArgument() { + return getRuleContext(ComposedArgumentContext.class,0); + } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public SingleArgWrapperPContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleArgWrapperP; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSingleArgWrapperP(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSingleArgWrapperP(this); + } + } + + public final SingleArgWrapperPContext singleArgWrapperP() throws RecognitionException { + SingleArgWrapperPContext _localctx = new SingleArgWrapperPContext(_ctx, getState()); + enterRule(_localctx, 114, RULE_singleArgWrapperP); + try { + enterOuterAlt(_localctx, 1); + { + setState(721); + match(BLADE_PARAM_LPAREN); + setState(724); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + case 1: + { + setState(722); + ((SingleArgWrapperPContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(723); + composedArgument(); + } + break; + } + setState(726); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DoubleArgWrapperPContext extends ParserRuleContext { + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BL_COMMA() { return getToken(BladeAntlrParser.BL_COMMA, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public DoubleArgWrapperPContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_doubleArgWrapperP; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterDoubleArgWrapperP(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitDoubleArgWrapperP(this); + } + } + + public final DoubleArgWrapperPContext doubleArgWrapperP() throws RecognitionException { + DoubleArgWrapperPContext _localctx = new DoubleArgWrapperPContext(_ctx, getState()); + enterRule(_localctx, 116, RULE_doubleArgWrapperP); + try { + enterOuterAlt(_localctx, 1); + { + setState(728); + match(BLADE_PARAM_LPAREN); + setState(731); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + case 1: + { + setState(729); + ((DoubleArgWrapperPContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(730); + composedArgument(); + } + break; + } + setState(733); + match(BL_COMMA); + setState(734); + composedArgument(); + setState(735); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MultiArgWrapperContext extends ParserRuleContext { + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public MultiArgWrapperContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiArgWrapper; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterMultiArgWrapper(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitMultiArgWrapper(this); + } + } + + public final MultiArgWrapperContext multiArgWrapper() throws RecognitionException { + MultiArgWrapperContext _localctx = new MultiArgWrapperContext(_ctx, getState()); + enterRule(_localctx, 118, RULE_multiArgWrapper); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(737); + match(BLADE_PARAM_LPAREN); + { + setState(738); + composedArgument(); + } + setState(743); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==BL_COMMA) { + { + { + setState(739); + match(BL_COMMA); + setState(740); + composedArgument(); + } + } + setState(745); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(746); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifiableArgumentContext extends ParserRuleContext { + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public IdentifiableArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifiableArgument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableArgument(this); + } + } + + public final IdentifiableArgumentContext identifiableArgument() throws RecognitionException { + IdentifiableArgumentContext _localctx = new IdentifiableArgumentContext(_ctx, getState()); + enterRule(_localctx, 120, RULE_identifiableArgument); + try { + enterOuterAlt(_localctx, 1); + { + setState(748); + match(BL_PARAM_STRING); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ComposedArgumentContext extends ParserRuleContext { + public List phpExpr() { + return getRuleContexts(PhpExprContext.class); + } + public PhpExprContext phpExpr(int i) { + return getRuleContext(PhpExprContext.class,i); + } + public ComposedArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_composedArgument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterComposedArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitComposedArgument(this); + } + } + + public final ComposedArgumentContext composedArgument() throws RecognitionException { + ComposedArgumentContext _localctx = new ComposedArgumentContext(_ctx, getState()); + enterRule(_localctx, 122, RULE_composedArgument); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(751); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(750); + phpExpr(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(753); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,74,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PhpExprContext extends ParserRuleContext { + public IdentifiableArrayContext identifiableArray() { + return getRuleContext(IdentifiableArrayContext.class,0); + } + public ArrayDefineContext arrayDefine() { + return getRuleContext(ArrayDefineContext.class,0); + } + public TerminalNode BLADE_PARAM_EXTRA() { return getToken(BladeAntlrParser.BLADE_PARAM_EXTRA, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } + public TerminalNode BL_PARAM_CONCAT_OPERATOR() { return getToken(BladeAntlrParser.BL_PARAM_CONCAT_OPERATOR, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public TerminalNode BL_PARAM_ASSIGN() { return getToken(BladeAntlrParser.BL_PARAM_ASSIGN, 0); } + public TerminalNode BL_NAME_STRING() { return getToken(BladeAntlrParser.BL_NAME_STRING, 0); } + public TerminalNode BL_PARAM_COMMA() { return getToken(BladeAntlrParser.BL_PARAM_COMMA, 0); } + public PhpExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_phpExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhpExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhpExpr(this); + } + } + + public final PhpExprContext phpExpr() throws RecognitionException { + PhpExprContext _localctx = new PhpExprContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_phpExpr); + try { + setState(765); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(755); + identifiableArray(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(756); + arrayDefine(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(757); + match(BLADE_PARAM_EXTRA); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(758); + match(PHP_VARIABLE); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(759); + match(PHP_KEYWORD); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(760); + match(BL_PARAM_CONCAT_OPERATOR); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(761); + match(BL_PARAM_STRING); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(762); + match(BL_PARAM_ASSIGN); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(763); + match(BL_NAME_STRING); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(764); + match(BL_PARAM_COMMA); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifiableArrayContext extends ParserRuleContext { + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public List paramAssign() { + return getRuleContexts(ParamAssignContext.class); + } + public ParamAssignContext paramAssign(int i) { + return getRuleContext(ParamAssignContext.class,i); + } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List BL_PARAM_COMMA() { return getTokens(BladeAntlrParser.BL_PARAM_COMMA); } + public TerminalNode BL_PARAM_COMMA(int i) { + return getToken(BladeAntlrParser.BL_PARAM_COMMA, i); + } + public IdentifiableArrayContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifiableArray; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableArray(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableArray(this); + } + } + + public final IdentifiableArrayContext identifiableArray() throws RecognitionException { + IdentifiableArrayContext _localctx = new IdentifiableArrayContext(_ctx, getState()); + enterRule(_localctx, 126, RULE_identifiableArray); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(767); + match(BL_SQ_LPAREN); + setState(768); + paramAssign(); + setState(773); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,76,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(769); + match(BL_PARAM_COMMA); + setState(770); + paramAssign(); + } + } + } + setState(775); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,76,_ctx); + } + setState(777); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_PARAM_COMMA) { + { + setState(776); + match(BL_PARAM_COMMA); + } + } + + setState(779); + match(BL_SQ_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayDefineContext extends ParserRuleContext { + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List phpExpr() { + return getRuleContexts(PhpExprContext.class); + } + public PhpExprContext phpExpr(int i) { + return getRuleContext(PhpExprContext.class,i); + } + public ArrayDefineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayDefine; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterArrayDefine(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitArrayDefine(this); + } + } + + public final ArrayDefineContext arrayDefine() throws RecognitionException { + ArrayDefineContext _localctx = new ArrayDefineContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_arrayDefine); + int _la; + try { + setState(791); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(781); + match(BL_SQ_LPAREN); + setState(783); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(782); + phpExpr(); + } + } + setState(785); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0 || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING ); + setState(787); + match(BL_SQ_RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(789); + match(BL_SQ_LPAREN); + setState(790); + match(BL_SQ_RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ParamAssignContext extends ParserRuleContext { + public List BL_PARAM_STRING() { return getTokens(BladeAntlrParser.BL_PARAM_STRING); } + public TerminalNode BL_PARAM_STRING(int i) { + return getToken(BladeAntlrParser.BL_PARAM_STRING, i); + } + public TerminalNode BL_PARAM_ASSIGN() { return getToken(BladeAntlrParser.BL_PARAM_ASSIGN, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } + public ParamAssignContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_paramAssign; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterParamAssign(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitParamAssign(this); + } + } + + public final ParamAssignContext paramAssign() throws RecognitionException { + ParamAssignContext _localctx = new ParamAssignContext(_ctx, getState()); + enterRule(_localctx, 130, RULE_paramAssign); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(793); + match(BL_PARAM_STRING); + setState(794); + match(BL_PARAM_ASSIGN); + setState(795); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 131084L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Verbatim_blockContext extends ParserRuleContext { + public TerminalNode D_VERBATIM() { return getToken(BladeAntlrParser.D_VERBATIM, 0); } + public TerminalNode D_ENDVERBATIM() { return getToken(BladeAntlrParser.D_ENDVERBATIM, 0); } + public Verbatim_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_verbatim_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterVerbatim_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitVerbatim_block(this); + } + } + + public final Verbatim_blockContext verbatim_block() throws RecognitionException { + Verbatim_blockContext _localctx = new Verbatim_blockContext(_ctx, getState()); + enterRule(_localctx, 132, RULE_verbatim_block); + try { + enterOuterAlt(_localctx, 1); + { + setState(797); + match(D_VERBATIM); + setState(798); + match(D_ENDVERBATIM); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Loop_actionContext extends ParserRuleContext { + public TerminalNode D_LOOP_ACTION() { return getToken(BladeAntlrParser.D_LOOP_ACTION, 0); } + public TerminalNode D_BREAK() { return getToken(BladeAntlrParser.D_BREAK, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public Loop_actionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_loop_action; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterLoop_action(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitLoop_action(this); + } + } + + public final Loop_actionContext loop_action() throws RecognitionException { + Loop_actionContext _localctx = new Loop_actionContext(_ctx, getState()); + enterRule(_localctx, 134, RULE_loop_action); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(800); + _la = _input.LA(1); + if ( !(_la==D_BREAK || _la==D_LOOP_ACTION) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(802); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_EXPRESSION) { + { + setState(801); + php_expression(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class HtmlContext extends ParserRuleContext { + public List HTML() { return getTokens(BladeAntlrParser.HTML); } + public TerminalNode HTML(int i) { + return getToken(BladeAntlrParser.HTML, i); + } + public TerminalNode HTML_COMPONENT_PREFIX() { return getToken(BladeAntlrParser.HTML_COMPONENT_PREFIX, 0); } + public TerminalNode HTML_TAG_START() { return getToken(BladeAntlrParser.HTML_TAG_START, 0); } + public TerminalNode EQ() { return getToken(BladeAntlrParser.EQ, 0); } + public TerminalNode HTML_IDENTIFIER() { return getToken(BladeAntlrParser.HTML_IDENTIFIER, 0); } + public HtmlContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterHtml(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitHtml(this); + } + } + + public final HtmlContext html() throws RecognitionException { + HtmlContext _localctx = new HtmlContext(_ctx, getState()); + enterRule(_localctx, 136, RULE_html); + try { + int _alt; + setState(813); + _errHandler.sync(this); + switch (_input.LA(1)) { + case HTML: + enterOuterAlt(_localctx, 1); + { + setState(805); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(804); + match(HTML); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(807); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case HTML_COMPONENT_PREFIX: + enterOuterAlt(_localctx, 2); + { + setState(809); + match(HTML_COMPONENT_PREFIX); + } + break; + case HTML_TAG_START: + enterOuterAlt(_localctx, 3); + { + setState(810); + match(HTML_TAG_START); + } + break; + case EQ: + enterOuterAlt(_localctx, 4); + { + setState(811); + match(EQ); + } + break; + case HTML_IDENTIFIER: + enterOuterAlt(_localctx, 5); + { + setState(812); + match(HTML_IDENTIFIER); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u0001\u00ab\u0330\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ + "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ + "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ + "\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+ + "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+ + "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+ + "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+ + "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007"+ + "\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007"+ + "\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007"+ + "\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007"+ + "\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007"+ + ",\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u0007"+ + "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+ + "6\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007"+ + ";\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007"+ + "@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0001\u0000"+ + "\u0005\u0000\u008c\b\u0000\n\u0000\f\u0000\u008f\t\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0096\b\u0001\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002\u009d"+ + "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u00af"+ + "\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u00c7"+ + "\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00cd"+ + "\b\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00d1\b\u0005\u0001\u0005"+ + "\u0003\u0005\u00d4\b\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007"+ + "\u00df\b\u0007\n\u0007\f\u0007\u00e2\t\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0005\b\u00e9\b\b\n\b\f\b\u00ec\t\b\u0001\b\u0001\b"+ + "\u0001\t\u0001\t\u0001\t\u0005\t\u00f3\b\t\n\t\f\t\u00f6\t\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0005\n\u00fd\b\n\n\n\f\n\u0100\t\n\u0001\n"+ + "\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u0107\b\u000b"+ + "\n\u000b\f\u000b\u010a\t\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f"+ + "\u0001\f\u0005\f\u0111\b\f\n\f\f\f\u0114\t\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0001\r\u0005\r\u011b\b\r\n\r\f\r\u011e\t\r\u0001\r\u0001\r\u0001\r"+ + "\u0005\r\u0123\b\r\n\r\f\r\u0126\t\r\u0005\r\u0128\b\r\n\r\f\r\u012b\t"+ + "\r\u0001\r\u0003\r\u012e\b\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0005"+ + "\u000e\u0134\b\u000e\n\u000e\f\u000e\u0137\t\u000e\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0005\u0012\u0148\b\u0012\n\u0012\f\u0012\u014b\t\u0012\u0001"+ + "\u0012\u0005\u0012\u014e\b\u0012\n\u0012\f\u0012\u0151\t\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013"+ + "\u015f\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0015\u0005\u0015\u0167\b\u0015\n\u0015\f\u0015\u016a\t\u0015\u0001"+ + "\u0015\u0003\u0015\u016d\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0005"+ + "\u0016\u0172\b\u0016\n\u0016\f\u0016\u0175\t\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0004\u0017\u017d\b\u0017"+ + "\u000b\u0017\f\u0017\u017e\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0005\u0018\u0186\b\u0018\n\u0018\f\u0018\u0189\t\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0190"+ + "\b\u0019\n\u0019\f\u0019\u0193\t\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u019c\b\u001a"+ + "\n\u001a\f\u001a\u019f\t\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u01a9"+ + "\b\u001b\n\u001b\f\u001b\u01ac\t\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0005\u001c\u01b3\b\u001c\n\u001c\f\u001c\u01b6"+ + "\t\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0004\u001e\u01c1\b\u001e\u000b"+ + "\u001e\f\u001e\u01c2\u0001\u001e\u0001\u001e\u0003\u001e\u01c7\b\u001e"+ + "\u0001\u001e\u0001\u001e\u0004\u001e\u01cb\b\u001e\u000b\u001e\f\u001e"+ + "\u01cc\u0003\u001e\u01cf\b\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u01d9"+ + "\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0003 \u01e3\b \u0001 \u0001 \u0003 \u01e7\b \u0001 \u0001 \u0001!\u0001"+ + "!\u0001!\u0001!\u0003!\u01ef\b!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0003!\u01f8\b!\u0003!\u01fa\b!\u0001!\u0001!\u0001\"\u0001\""+ + "\u0004\"\u0200\b\"\u000b\"\f\"\u0201\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0003$\u020f\b$\u0001%\u0001"+ + "%\u0001&\u0001&\u0005&\u0215\b&\n&\f&\u0218\t&\u0001&\u0001&\u0001&\u0003"+ + "&\u021d\b&\u0001\'\u0001\'\u0004\'\u0221\b\'\u000b\'\f\'\u0222\u0001\'"+ + "\u0001\'\u0001(\u0001(\u0005(\u0229\b(\n(\f(\u022c\t(\u0001(\u0001(\u0001"+ + ")\u0001)\u0005)\u0232\b)\n)\f)\u0235\t)\u0001)\u0001)\u0001*\u0001*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u0241\b+\u0001,\u0001,\u0001"+ + ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0005.\u0250\b.\n.\f.\u0253\t.\u0001.\u0001.\u0001.\u0001.\u0003.\u0259"+ + "\b.\u0001/\u0003/\u025c\b/\u0001/\u0001/\u0001/\u0001/\u0001/\u0005/\u0263"+ + "\b/\n/\f/\u0266\t/\u0001/\u0001/\u0003/\u026a\b/\u0001/\u0001/\u0001/"+ + "\u0003/\u026f\b/\u00010\u00010\u00030\u0273\b0\u00010\u00010\u00010\u0001"+ + "0\u00050\u0279\b0\n0\f0\u027c\t0\u00010\u00010\u00011\u00031\u0281\b1"+ + "\u00011\u00011\u00011\u00011\u00012\u00032\u0288\b2\u00012\u00012\u0001"+ + "3\u00013\u00013\u00053\u028f\b3\n3\f3\u0292\t3\u00013\u00013\u00014\u0001"+ + "4\u00015\u00015\u00045\u029a\b5\u000b5\f5\u029b\u00035\u029e\b5\u0001"+ + "6\u00016\u00046\u02a2\b6\u000b6\f6\u02a3\u00016\u00016\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00017\u00017\u00017\u00047\u02b1\b7\u000b7\f7"+ + "\u02b2\u00017\u00017\u00017\u00017\u00017\u00057\u02ba\b7\n7\f7\u02bd"+ + "\t7\u00017\u00017\u00017\u00057\u02c2\b7\n7\f7\u02c5\t7\u00017\u00017"+ + "\u00037\u02c9\b7\u00018\u00018\u00018\u00018\u00018\u00038\u02d0\b8\u0001"+ + "9\u00019\u00019\u00039\u02d5\b9\u00019\u00019\u0001:\u0001:\u0001:\u0003"+ + ":\u02dc\b:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0005"+ + ";\u02e6\b;\n;\f;\u02e9\t;\u0001;\u0001;\u0001<\u0001<\u0001=\u0004=\u02f0"+ + "\b=\u000b=\f=\u02f1\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0003>\u02fe\b>\u0001?\u0001?\u0001?\u0001?\u0005?\u0304"+ + "\b?\n?\f?\u0307\t?\u0001?\u0003?\u030a\b?\u0001?\u0001?\u0001@\u0001@"+ + "\u0004@\u0310\b@\u000b@\f@\u0311\u0001@\u0001@\u0001@\u0001@\u0003@\u0318"+ + "\b@\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0003"+ + "C\u0323\bC\u0001D\u0004D\u0326\bD\u000bD\fD\u0327\u0001D\u0001D\u0001"+ + "D\u0001D\u0003D\u032e\bD\u0001D\u0000\u0000E\u0000\u0002\u0004\u0006\b"+ + "\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02"+ + "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088"+ + "\u0000\u000b\u0007\u0000\u001e\u001e2267MMQQ]`cc\u0004\u0000\u001f\u001f"+ + "-.PPjj\u0004\u0000/055<A\u0002\u00001133\u0001\u0000"+ + "9:\u0001\u0000no\u0001\u0001\u009b\u009b\u0002\u0000\u0001\u0002\u008b"+ + "\u008e\u0002\u0000\u0002\u0003\u0011\u0011\u0001\u0000-.\u037e\u0000\u008d"+ + "\u0001\u0000\u0000\u0000\u0002\u0095\u0001\u0000\u0000\u0000\u0004\u009c"+ + "\u0001\u0000\u0000\u0000\u0006\u00ae\u0001\u0000\u0000\u0000\b\u00c6\u0001"+ + "\u0000\u0000\u0000\n\u00c8\u0001\u0000\u0000\u0000\f\u00d7\u0001\u0000"+ + "\u0000\u0000\u000e\u00da\u0001\u0000\u0000\u0000\u0010\u00e5\u0001\u0000"+ + "\u0000\u0000\u0012\u00ef\u0001\u0000\u0000\u0000\u0014\u00f9\u0001\u0000"+ + "\u0000\u0000\u0016\u0103\u0001\u0000\u0000\u0000\u0018\u010d\u0001\u0000"+ + "\u0000\u0000\u001a\u0117\u0001\u0000\u0000\u0000\u001c\u0131\u0001\u0000"+ + "\u0000\u0000\u001e\u0138\u0001\u0000\u0000\u0000 \u013a\u0001\u0000\u0000"+ + "\u0000\"\u013f\u0001\u0000\u0000\u0000$\u0144\u0001\u0000\u0000\u0000"+ + "&\u015e\u0001\u0000\u0000\u0000(\u0160\u0001\u0000\u0000\u0000*\u0168"+ + "\u0001\u0000\u0000\u0000,\u016e\u0001\u0000\u0000\u0000.\u0178\u0001\u0000"+ + "\u0000\u00000\u0182\u0001\u0000\u0000\u00002\u018c\u0001\u0000\u0000\u0000"+ + "4\u0196\u0001\u0000\u0000\u00006\u01a2\u0001\u0000\u0000\u00008\u01af"+ + "\u0001\u0000\u0000\u0000:\u01b9\u0001\u0000\u0000\u0000<\u01bc\u0001\u0000"+ + "\u0000\u0000>\u01d2\u0001\u0000\u0000\u0000@\u01dc\u0001\u0000\u0000\u0000"+ + "B\u01ea\u0001\u0000\u0000\u0000D\u01fd\u0001\u0000\u0000\u0000F\u0205"+ + "\u0001\u0000\u0000\u0000H\u020a\u0001\u0000\u0000\u0000J\u0210\u0001\u0000"+ + "\u0000\u0000L\u021c\u0001\u0000\u0000\u0000N\u021e\u0001\u0000\u0000\u0000"+ + "P\u0226\u0001\u0000\u0000\u0000R\u022f\u0001\u0000\u0000\u0000T\u0238"+ + "\u0001\u0000\u0000\u0000V\u0240\u0001\u0000\u0000\u0000X\u0242\u0001\u0000"+ + "\u0000\u0000Z\u0246\u0001\u0000\u0000\u0000\\\u0258\u0001\u0000\u0000"+ + "\u0000^\u026e\u0001\u0000\u0000\u0000`\u0270\u0001\u0000\u0000\u0000b"+ + "\u0280\u0001\u0000\u0000\u0000d\u0287\u0001\u0000\u0000\u0000f\u028b\u0001"+ + "\u0000\u0000\u0000h\u0295\u0001\u0000\u0000\u0000j\u029d\u0001\u0000\u0000"+ + "\u0000l\u029f\u0001\u0000\u0000\u0000n\u02c8\u0001\u0000\u0000\u0000p"+ + "\u02ca\u0001\u0000\u0000\u0000r\u02d1\u0001\u0000\u0000\u0000t\u02d8\u0001"+ + "\u0000\u0000\u0000v\u02e1\u0001\u0000\u0000\u0000x\u02ec\u0001\u0000\u0000"+ + "\u0000z\u02ef\u0001\u0000\u0000\u0000|\u02fd\u0001\u0000\u0000\u0000~"+ + "\u02ff\u0001\u0000\u0000\u0000\u0080\u0317\u0001\u0000\u0000\u0000\u0082"+ + "\u0319\u0001\u0000\u0000\u0000\u0084\u031d\u0001\u0000\u0000\u0000\u0086"+ + "\u0320\u0001\u0000\u0000\u0000\u0088\u032d\u0001\u0000\u0000\u0000\u008a"+ + "\u008c\u0003\u0002\u0001\u0000\u008b\u008a\u0001\u0000\u0000\u0000\u008c"+ + "\u008f\u0001\u0000\u0000\u0000\u008d\u008b\u0001\u0000\u0000\u0000\u008d"+ + "\u008e\u0001\u0000\u0000\u0000\u008e\u0090\u0001\u0000\u0000\u0000\u008f"+ + "\u008d\u0001\u0000\u0000\u0000\u0090\u0091\u0005\u0000\u0000\u0001\u0091"+ + "\u0001\u0001\u0000\u0000\u0000\u0092\u0096\u0003\u0004\u0002\u0000\u0093"+ + "\u0096\u0003\b\u0004\u0000\u0094\u0096\u0003\u0088D\u0000\u0095\u0092"+ + "\u0001\u0000\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000\u0095\u0094"+ + "\u0001\u0000\u0000\u0000\u0096\u0003\u0001\u0000\u0000\u0000\u0097\u009d"+ + "\u0003\u0006\u0003\u0000\u0098\u009d\u0003J%\u0000\u0099\u009d\u0003P"+ + "(\u0000\u009a\u009d\u0003R)\u0000\u009b\u009d\u0003N\'\u0000\u009c\u0097"+ + "\u0001\u0000\u0000\u0000\u009c\u0098\u0001\u0000\u0000\u0000\u009c\u0099"+ + "\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000\u009c\u009b"+ + "\u0001\u0000\u0000\u0000\u009d\u0005\u0001\u0000\u0000\u0000\u009e\u00af"+ + "\u0003\f\u0006\u0000\u009f\u00af\u0003\n\u0005\u0000\u00a0\u00af\u0003"+ + ":\u001d\u0000\u00a1\u00af\u0003@ \u0000\u00a2\u00af\u0003B!\u0000\u00a3"+ + "\u00a4\u0007\u0000\u0000\u0000\u00a4\u00af\u0003n7\u0000\u00a5\u00af\u0007"+ + "\u0001\u0000\u0000\u00a6\u00af\u0003<\u001e\u0000\u00a7\u00af\u0003>\u001f"+ + "\u0000\u00a8\u00a9\u0005[\u0000\u0000\u00a9\u00af\u0003n7\u0000\u00aa"+ + "\u00af\u0003\u0086C\u0000\u00ab\u00af\u0005\u001b\u0000\u0000\u00ac\u00af"+ + "\u0005l\u0000\u0000\u00ad\u00af\u0003H$\u0000\u00ae\u009e\u0001\u0000"+ + "\u0000\u0000\u00ae\u009f\u0001\u0000\u0000\u0000\u00ae\u00a0\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a1\u0001\u0000\u0000\u0000\u00ae\u00a2\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a3\u0001\u0000\u0000\u0000\u00ae\u00a5\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a6\u0001\u0000\u0000\u0000\u00ae\u00a7\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a8\u0001\u0000\u0000\u0000\u00ae\u00aa\u0001\u0000"+ + "\u0000\u0000\u00ae\u00ab\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001\u0000"+ + "\u0000\u0000\u00ae\u00ad\u0001\u0000\u0000\u0000\u00af\u0007\u0001\u0000"+ + "\u0000\u0000\u00b0\u00c7\u0003\u000e\u0007\u0000\u00b1\u00c7\u0003F#\u0000"+ + "\u00b2\u00c7\u0003\u0010\b\u0000\u00b3\u00c7\u0003\u0014\n\u0000\u00b4"+ + "\u00c7\u0003D\"\u0000\u00b5\u00c7\u0003\u0016\u000b\u0000\u00b6\u00c7"+ + "\u0003\u0018\f\u0000\u00b7\u00c7\u0003\u001a\r\u0000\u00b8\u00c7\u0003"+ + ".\u0017\u0000\u00b9\u00c7\u0003&\u0013\u0000\u00ba\u00c7\u0003 \u0010"+ + "\u0000\u00bb\u00c7\u0003,\u0016\u0000\u00bc\u00c7\u0003\"\u0011\u0000"+ + "\u00bd\u00c7\u0003$\u0012\u0000\u00be\u00c7\u0003(\u0014\u0000\u00bf\u00c7"+ + "\u00030\u0018\u0000\u00c0\u00c7\u00032\u0019\u0000\u00c1\u00c7\u00034"+ + "\u001a\u0000\u00c2\u00c7\u00036\u001b\u0000\u00c3\u00c7\u00038\u001c\u0000"+ + "\u00c4\u00c7\u0003\u0084B\u0000\u00c5\u00c7\u0003L&\u0000\u00c6\u00b0"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b1\u0001\u0000\u0000\u0000\u00c6\u00b2"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b3\u0001\u0000\u0000\u0000\u00c6\u00b4"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b5\u0001\u0000\u0000\u0000\u00c6\u00b6"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b7\u0001\u0000\u0000\u0000\u00c6\u00b8"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b9\u0001\u0000\u0000\u0000\u00c6\u00ba"+ + "\u0001\u0000\u0000\u0000\u00c6\u00bb\u0001\u0000\u0000\u0000\u00c6\u00bc"+ + "\u0001\u0000\u0000\u0000\u00c6\u00bd\u0001\u0000\u0000\u0000\u00c6\u00be"+ + "\u0001\u0000\u0000\u0000\u00c6\u00bf\u0001\u0000\u0000\u0000\u00c6\u00c0"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c1\u0001\u0000\u0000\u0000\u00c6\u00c2"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c3\u0001\u0000\u0000\u0000\u00c6\u00c4"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c5\u0001\u0000\u0000\u0000\u00c7\t\u0001"+ + "\u0000\u0000\u0000\u00c8\u00c9\u0007\u0002\u0000\u0000\u00c9\u00cc\u0005"+ + "\u000b\u0000\u0000\u00ca\u00cd\u0005\u0011\u0000\u0000\u00cb\u00cd\u0003"+ + "z=\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000"+ + "\u0000\u00cd\u00d0\u0001\u0000\u0000\u0000\u00ce\u00cf\u0005\u0013\u0000"+ + "\u0000\u00cf\u00d1\u0003z=\u0000\u00d0\u00ce\u0001\u0000\u0000\u0000\u00d0"+ + "\u00d1\u0001\u0000\u0000\u0000\u00d1\u00d3\u0001\u0000\u0000\u0000\u00d2"+ + "\u00d4\u0005\u0013\u0000\u0000\u00d3\u00d2\u0001\u0000\u0000\u0000\u00d3"+ + "\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5\u0001\u0000\u0000\u0000\u00d5"+ + "\u00d6\u0005\f\u0000\u0000\u00d6\u000b\u0001\u0000\u0000\u0000\u00d7\u00d8"+ + "\u00058\u0000\u0000\u00d8\u00d9\u0003t:\u0000\u00d9\r\u0001\u0000\u0000"+ + "\u0000\u00da\u00db\u00058\u0000\u0000\u00db\u00e0\u0003r9\u0000\u00dc"+ + "\u00df\u0003\u0002\u0001\u0000\u00dd\u00df\u0005=\u0000\u0000\u00de\u00dc"+ + "\u0001\u0000\u0000\u0000\u00de\u00dd\u0001\u0000\u0000\u0000\u00df\u00e2"+ + "\u0001\u0000\u0000\u0000\u00e0\u00de\u0001\u0000\u0000\u0000\u00e0\u00e1"+ + "\u0001\u0000\u0000\u0000\u00e1\u00e3\u0001\u0000\u0000\u0000\u00e2\u00e0"+ + "\u0001\u0000\u0000\u0000\u00e3\u00e4\u0007\u0003\u0000\u0000\u00e4\u000f"+ + "\u0001\u0000\u0000\u0000\u00e5\u00e6\u0005E\u0000\u0000\u00e6\u00ea\u0003"+ + "r9\u0000\u00e7\u00e9\u0003\u0002\u0001\u0000\u00e8\u00e7\u0001\u0000\u0000"+ + "\u0000\u00e9\u00ec\u0001\u0000\u0000\u0000\u00ea\u00e8\u0001\u0000\u0000"+ + "\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00ed\u0001\u0000\u0000"+ + "\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ed\u00ee\u0005F\u0000\u0000"+ + "\u00ee\u0011\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005I\u0000\u0000\u00f0"+ + "\u00f4\u0003r9\u0000\u00f1\u00f3\u0003\u0002\u0001\u0000\u00f2\u00f1\u0001"+ + "\u0000\u0000\u0000\u00f3\u00f6\u0001\u0000\u0000\u0000\u00f4\u00f2\u0001"+ + "\u0000\u0000\u0000\u00f4\u00f5\u0001\u0000\u0000\u0000\u00f5\u00f7\u0001"+ + "\u0000\u0000\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000\u00f7\u00f8\u0005"+ + "J\u0000\u0000\u00f8\u0013\u0001\u0000\u0000\u0000\u00f9\u00fa\u0005G\u0000"+ + "\u0000\u00fa\u00fe\u0003r9\u0000\u00fb\u00fd\u0003\u0002\u0001\u0000\u00fc"+ + "\u00fb\u0001\u0000\u0000\u0000\u00fd\u0100\u0001\u0000\u0000\u0000\u00fe"+ + "\u00fc\u0001\u0000\u0000\u0000\u00fe\u00ff\u0001\u0000\u0000\u0000\u00ff"+ + "\u0101\u0001\u0000\u0000\u0000\u0100\u00fe\u0001\u0000\u0000\u0000\u0101"+ + "\u0102\u0005H\u0000\u0000\u0102\u0015\u0001\u0000\u0000\u0000\u0103\u0104"+ + "\u0005K\u0000\u0000\u0104\u0108\u0003r9\u0000\u0105\u0107\u0003\u0002"+ + "\u0001\u0000\u0106\u0105\u0001\u0000\u0000\u0000\u0107\u010a\u0001\u0000"+ + "\u0000\u0000\u0108\u0106\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000"+ + "\u0000\u0000\u0109\u010b\u0001\u0000\u0000\u0000\u010a\u0108\u0001\u0000"+ + "\u0000\u0000\u010b\u010c\u0005L\u0000\u0000\u010c\u0017\u0001\u0000\u0000"+ + "\u0000\u010d\u010e\u0005N\u0000\u0000\u010e\u0112\u0003n7\u0000\u010f"+ + "\u0111\u0003\u0002\u0001\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0111"+ + "\u0114\u0001\u0000\u0000\u0000\u0112\u0110\u0001\u0000\u0000\u0000\u0112"+ + "\u0113\u0001\u0000\u0000\u0000\u0113\u0115\u0001\u0000\u0000\u0000\u0114"+ + "\u0112\u0001\u0000\u0000\u0000\u0115\u0116\u0005O\u0000\u0000\u0116\u0019"+ + "\u0001\u0000\u0000\u0000\u0117\u0118\u0005\u0019\u0000\u0000\u0118\u011c"+ + "\u0003l6\u0000\u0119\u011b\u0003\u0002\u0001\u0000\u011a\u0119\u0001\u0000"+ + "\u0000\u0000\u011b\u011e\u0001\u0000\u0000\u0000\u011c\u011a\u0001\u0000"+ + "\u0000\u0000\u011c\u011d\u0001\u0000\u0000\u0000\u011d\u0129\u0001\u0000"+ + "\u0000\u0000\u011e\u011c\u0001\u0000\u0000\u0000\u011f\u0120\u0005\u001a"+ + "\u0000\u0000\u0120\u0124\u0003l6\u0000\u0121\u0123\u0003\u0002\u0001\u0000"+ + "\u0122\u0121\u0001\u0000\u0000\u0000\u0123\u0126\u0001\u0000\u0000\u0000"+ + "\u0124\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001\u0000\u0000\u0000"+ + "\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000\u0000\u0000"+ + "\u0127\u011f\u0001\u0000\u0000\u0000\u0128\u012b\u0001\u0000\u0000\u0000"+ + "\u0129\u0127\u0001\u0000\u0000\u0000\u0129\u012a\u0001\u0000\u0000\u0000"+ + "\u012a\u012d\u0001\u0000\u0000\u0000\u012b\u0129\u0001\u0000\u0000\u0000"+ + "\u012c\u012e\u0003\u001c\u000e\u0000\u012d\u012c\u0001\u0000\u0000\u0000"+ + "\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0001\u0000\u0000\u0000"+ + "\u012f\u0130\u0003\u001e\u000f\u0000\u0130\u001b\u0001\u0000\u0000\u0000"+ + "\u0131\u0135\u0005\u001b\u0000\u0000\u0132\u0134\u0003\u0002\u0001\u0000"+ + "\u0133\u0132\u0001\u0000\u0000\u0000\u0134\u0137\u0001\u0000\u0000\u0000"+ + "\u0135\u0133\u0001\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000"+ + "\u0136\u001d\u0001\u0000\u0000\u0000\u0137\u0135\u0001\u0000\u0000\u0000"+ + "\u0138\u0139\u0005\u001c\u0000\u0000\u0139\u001f\u0001\u0000\u0000\u0000"+ + "\u013a\u013b\u0005!\u0000\u0000\u013b\u013c\u0003n7\u0000\u013c\u013d"+ + "\u0003*\u0015\u0000\u013d\u013e\u0005\"\u0000\u0000\u013e!\u0001\u0000"+ + "\u0000\u0000\u013f\u0140\u0005#\u0000\u0000\u0140\u0141\u0003l6\u0000"+ + "\u0141\u0142\u0003*\u0015\u0000\u0142\u0143\u0005$\u0000\u0000\u0143#"+ + "\u0001\u0000\u0000\u0000\u0144\u014f\u0005X\u0000\u0000\u0145\u0149\u0005"+ + "\u000b\u0000\u0000\u0146\u0148\u0003z=\u0000\u0147\u0146\u0001\u0000\u0000"+ + "\u0000\u0148\u014b\u0001\u0000\u0000\u0000\u0149\u0147\u0001\u0000\u0000"+ + "\u0000\u0149\u014a\u0001\u0000\u0000\u0000\u014a\u014c\u0001\u0000\u0000"+ + "\u0000\u014b\u0149\u0001\u0000\u0000\u0000\u014c\u014e\u0005\f\u0000\u0000"+ + "\u014d\u0145\u0001\u0000\u0000\u0000\u014e\u0151\u0001\u0000\u0000\u0000"+ + "\u014f\u014d\u0001\u0000\u0000\u0000\u014f\u0150\u0001\u0000\u0000\u0000"+ + "\u0150\u0152\u0001\u0000\u0000\u0000\u0151\u014f\u0001\u0000\u0000\u0000"+ + "\u0152\u0153\u0003*\u0015\u0000\u0153\u0154\u0005Y\u0000\u0000\u0154%"+ + "\u0001\u0000\u0000\u0000\u0155\u0156\u0005V\u0000\u0000\u0156\u0157\u0003"+ + "r9\u0000\u0157\u0158\u0003*\u0015\u0000\u0158\u0159\u0005W\u0000\u0000"+ + "\u0159\u015f\u0001\u0000\u0000\u0000\u015a\u015b\u0005T\u0000\u0000\u015b"+ + "\u015c\u0003*\u0015\u0000\u015c\u015d\u0005U\u0000\u0000\u015d\u015f\u0001"+ + "\u0000\u0000\u0000\u015e\u0155\u0001\u0000\u0000\u0000\u015e\u015a\u0001"+ + "\u0000\u0000\u0000\u015f\'\u0001\u0000\u0000\u0000\u0160\u0161\u0005Z"+ + "\u0000\u0000\u0161\u0162\u0003n7\u0000\u0162\u0163\u0003*\u0015\u0000"+ + "\u0163\u0164\u0005\\\u0000\u0000\u0164)\u0001\u0000\u0000\u0000\u0165"+ + "\u0167\u0003\u0002\u0001\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0167"+ + "\u016a\u0001\u0000\u0000\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0168"+ + "\u0169\u0001\u0000\u0000\u0000\u0169\u016c\u0001\u0000\u0000\u0000\u016a"+ + "\u0168\u0001\u0000\u0000\u0000\u016b\u016d\u0003\u001c\u000e\u0000\u016c"+ + "\u016b\u0001\u0000\u0000\u0000\u016c\u016d\u0001\u0000\u0000\u0000\u016d"+ + "+\u0001\u0000\u0000\u0000\u016e\u016f\u0005R\u0000\u0000\u016f\u0173\u0003"+ + "h4\u0000\u0170\u0172\u0003\u0002\u0001\u0000\u0171\u0170\u0001\u0000\u0000"+ + "\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173\u0171\u0001\u0000\u0000"+ + "\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u0174\u0176\u0001\u0000\u0000"+ + "\u0000\u0175\u0173\u0001\u0000\u0000\u0000\u0176\u0177\u0005S\u0000\u0000"+ + "\u0177-\u0001\u0000\u0000\u0000\u0178\u0179\u0005\u001d\u0000\u0000\u0179"+ + "\u017c\u0003h4\u0000\u017a\u017d\u0003\u0002\u0001\u0000\u017b\u017d\u0005"+ + "-\u0000\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017c\u017b\u0001\u0000"+ + "\u0000\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000"+ + "\u0000\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000"+ + "\u0000\u0000\u0180\u0181\u0005 \u0000\u0000\u0181/\u0001\u0000\u0000\u0000"+ + "\u0182\u0183\u0005+\u0000\u0000\u0183\u0187\u0003h4\u0000\u0184\u0186"+ + "\u0003\u0002\u0001\u0000\u0185\u0184\u0001\u0000\u0000\u0000\u0186\u0189"+ + "\u0001\u0000\u0000\u0000\u0187\u0185\u0001\u0000\u0000\u0000\u0187\u0188"+ + "\u0001\u0000\u0000\u0000\u0188\u018a\u0001\u0000\u0000\u0000\u0189\u0187"+ + "\u0001\u0000\u0000\u0000\u018a\u018b\u0005,\u0000\u0000\u018b1\u0001\u0000"+ + "\u0000\u0000\u018c\u018d\u0005\'\u0000\u0000\u018d\u0191\u0003h4\u0000"+ + "\u018e\u0190\u0003\u0002\u0001\u0000\u018f\u018e\u0001\u0000\u0000\u0000"+ + "\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000\u0000\u0000"+ + "\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u0194\u0001\u0000\u0000\u0000"+ + "\u0193\u0191\u0001\u0000\u0000\u0000\u0194\u0195\u0005(\u0000\u0000\u0195"+ + "3\u0001\u0000\u0000\u0000\u0196\u0197\u0005%\u0000\u0000\u0197\u0198\u0005"+ + "\u008b\u0000\u0000\u0198\u0199\u0003j5\u0000\u0199\u019d\u0005\u008c\u0000"+ + "\u0000\u019a\u019c\u0003\u0002\u0001\u0000\u019b\u019a\u0001\u0000\u0000"+ + "\u0000\u019c\u019f\u0001\u0000\u0000\u0000\u019d\u019b\u0001\u0000\u0000"+ + "\u0000\u019d\u019e\u0001\u0000\u0000\u0000\u019e\u01a0\u0001\u0000\u0000"+ + "\u0000\u019f\u019d\u0001\u0000\u0000\u0000\u01a0\u01a1\u0005&\u0000\u0000"+ + "\u01a15\u0001\u0000\u0000\u0000\u01a2\u01a3\u0005)\u0000\u0000\u01a3\u01a4"+ + "\u0005\u008b\u0000\u0000\u01a4\u01a5\u0003j5\u0000\u01a5\u01aa\u0005\u008c"+ + "\u0000\u0000\u01a6\u01a9\u0003\u0002\u0001\u0000\u01a7\u01a9\u0005!\u0000"+ + "\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8\u01a7\u0001\u0000\u0000"+ + "\u0000\u01a9\u01ac\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000"+ + "\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab\u01ad\u0001\u0000\u0000"+ + "\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ad\u01ae\u0005*\u0000\u0000"+ + "\u01ae7\u0001\u0000\u0000\u0000\u01af\u01b0\u0005a\u0000\u0000\u01b0\u01b4"+ + "\u0003n7\u0000\u01b1\u01b3\u0003\u0002\u0001\u0000\u01b2\u01b1\u0001\u0000"+ + "\u0000\u0000\u01b3\u01b6\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000"+ + "\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7\u0001\u0000"+ + "\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b7\u01b8\u0005b\u0000"+ + "\u0000\u01b89\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005D\u0000\u0000\u01ba"+ + "\u01bb\u0003r9\u0000\u01bb;\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005"+ + "k\u0000\u0000\u01bd\u01ce\u0005\r\u0000\u0000\u01be\u01c0\u0005\u000f"+ + "\u0000\u0000\u01bf\u01c1\u0005\u0086\u0000\u0000\u01c0\u01bf\u0001\u0000"+ + "\u0000\u0000\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000"+ + "\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c4\u0001\u0000"+ + "\u0000\u0000\u01c4\u01c6\u0005\u0090\u0000\u0000\u01c5\u01c7\u0005\u0086"+ + "\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ + "\u0000\u0000\u01c7\u01cf\u0001\u0000\u0000\u0000\u01c8\u01cf\u0005\u0086"+ + "\u0000\u0000\u01c9\u01cb\u0003n7\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000"+ + "\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01ca\u0001\u0000\u0000\u0000"+ + "\u01cc\u01cd\u0001\u0000\u0000\u0000\u01cd\u01cf\u0001\u0000\u0000\u0000"+ + "\u01ce\u01be\u0001\u0000\u0000\u0000\u01ce\u01c8\u0001\u0000\u0000\u0000"+ + "\u01ce\u01ca\u0001\u0000\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000\u0000"+ + "\u01d0\u01d1\u0005\u000e\u0000\u0000\u01d1=\u0001\u0000\u0000\u0000\u01d2"+ + "\u01d3\u0005f\u0000\u0000\u01d3\u01d4\u0005\u000b\u0000\u0000\u01d4\u01d5"+ + "\u0003z=\u0000\u01d5\u01d8\u0005\u0013\u0000\u0000\u01d6\u01d9\u0003x"+ + "<\u0000\u01d7\u01d9\u0003z=\u0000\u01d8\u01d6\u0001\u0000\u0000\u0000"+ + "\u01d8\u01d7\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000\u0000"+ + "\u01da\u01db\u0005\f\u0000\u0000\u01db?\u0001\u0000\u0000\u0000\u01dc"+ + "\u01dd\u0007\u0004\u0000\u0000\u01dd\u01de\u0005\u000b\u0000\u0000\u01de"+ + "\u01df\u0003z=\u0000\u01df\u01e2\u0005\u0013\u0000\u0000\u01e0\u01e3\u0005"+ + "\u0011\u0000\u0000\u01e1\u01e3\u0003z=\u0000\u01e2\u01e0\u0001\u0000\u0000"+ + "\u0000\u01e2\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e6\u0001\u0000\u0000"+ + "\u0000\u01e4\u01e5\u0005\u0013\u0000\u0000\u01e5\u01e7\u0003z=\u0000\u01e6"+ + "\u01e4\u0001\u0000\u0000\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7"+ + "\u01e8\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005\f\u0000\u0000\u01e9A"+ + "\u0001\u0000\u0000\u0000\u01ea\u01eb\u00054\u0000\u0000\u01eb\u01ee\u0005"+ + "\u000b\u0000\u0000\u01ec\u01ef\u0005\u0011\u0000\u0000\u01ed\u01ef\u0003"+ + "z=\u0000\u01ee\u01ec\u0001\u0000\u0000\u0000\u01ee\u01ed\u0001\u0000\u0000"+ + "\u0000\u01ef\u01f0\u0001\u0000\u0000\u0000\u01f0\u01f1\u0005\u0013\u0000"+ + "\u0000\u01f1\u01f2\u0003z=\u0000\u01f2\u01f3\u0005\u0013\u0000\u0000\u01f3"+ + "\u01f9\u0003z=\u0000\u01f4\u01f7\u0005\u0013\u0000\u0000\u01f5\u01f8\u0003"+ + "x<\u0000\u01f6\u01f8\u0003z=\u0000\u01f7\u01f5\u0001\u0000\u0000\u0000"+ + "\u01f7\u01f6\u0001\u0000\u0000\u0000\u01f8\u01fa\u0001\u0000\u0000\u0000"+ + "\u01f9\u01f4\u0001\u0000\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000"+ + "\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005\f\u0000\u0000\u01fc"+ + "C\u0001\u0000\u0000\u0000\u01fd\u01ff\u0005B\u0000\u0000\u01fe\u0200\u0003"+ + "\u0002\u0001\u0000\u01ff\u01fe\u0001\u0000\u0000\u0000\u0200\u0201\u0001"+ + "\u0000\u0000\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0201\u0202\u0001"+ + "\u0000\u0000\u0000\u0202\u0203\u0001\u0000\u0000\u0000\u0203\u0204\u0005"+ + "C\u0000\u0000\u0204E\u0001\u0000\u0000\u0000\u0205\u0206\u0007\u0005\u0000"+ + "\u0000\u0206\u0207\u0003r9\u0000\u0207\u0208\u0003*\u0015\u0000\u0208"+ + "\u0209\u0005\u001c\u0000\u0000\u0209G\u0001\u0000\u0000\u0000\u020a\u020e"+ + "\u0005m\u0000\u0000\u020b\u020c\u0005\u000b\u0000\u0000\u020c\u020f\u0005"+ + "\f\u0000\u0000\u020d\u020f\u0003v;\u0000\u020e\u020b\u0001\u0000\u0000"+ + "\u0000\u020e\u020d\u0001\u0000\u0000\u0000\u020fI\u0001\u0000\u0000\u0000"+ + "\u0210\u0211\u0007\u0006\u0000\u0000\u0211K\u0001\u0000\u0000\u0000\u0212"+ + "\u0216\u0005g\u0000\u0000\u0213\u0215\u0003n7\u0000\u0214\u0213\u0001"+ + "\u0000\u0000\u0000\u0215\u0218\u0001\u0000\u0000\u0000\u0216\u0214\u0001"+ + "\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0219\u0001"+ + "\u0000\u0000\u0000\u0218\u0216\u0001\u0000\u0000\u0000\u0219\u021d\u0005"+ + "\u0098\u0000\u0000\u021a\u021b\u0005g\u0000\u0000\u021b\u021d\u0003l6"+ + "\u0000\u021c\u0212\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000"+ + "\u0000\u021dM\u0001\u0000\u0000\u0000\u021e\u0220\u0005r\u0000\u0000\u021f"+ + "\u0221\u0003n7\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0222\u0001"+ + "\u0000\u0000\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0222\u0223\u0001"+ + "\u0000\u0000\u0000\u0223\u0224\u0001\u0000\u0000\u0000\u0224\u0225\u0007"+ + "\u0007\u0000\u0000\u0225O\u0001\u0000\u0000\u0000\u0226\u022a\u0005p\u0000"+ + "\u0000\u0227\u0229\u0003T*\u0000\u0228\u0227\u0001\u0000\u0000\u0000\u0229"+ + "\u022c\u0001\u0000\u0000\u0000\u022a\u0228\u0001\u0000\u0000\u0000\u022a"+ + "\u022b\u0001\u0000\u0000\u0000\u022b\u022d\u0001\u0000\u0000\u0000\u022c"+ + "\u022a\u0001\u0000\u0000\u0000\u022d\u022e\u0005\u007f\u0000\u0000\u022e"+ + "Q\u0001\u0000\u0000\u0000\u022f\u0233\u0005q\u0000\u0000\u0230\u0232\u0003"+ + "T*\u0000\u0231\u0230\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000\u0000"+ + "\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000\u0000"+ + "\u0000\u0234\u0236\u0001\u0000\u0000\u0000\u0235\u0233\u0001\u0000\u0000"+ + "\u0000\u0236\u0237\u0005\u0081\u0000\u0000\u0237S\u0001\u0000\u0000\u0000"+ + "\u0238\u0239\u0003n7\u0000\u0239U\u0001\u0000\u0000\u0000\u023a\u0241"+ + "\u0003b1\u0000\u023b\u0241\u0003X,\u0000\u023c\u0241\u0003Z-\u0000\u023d"+ + "\u0241\u0003\\.\u0000\u023e\u0241\u0003^/\u0000\u023f\u0241\u0003`0\u0000"+ + "\u0240\u023a\u0001\u0000\u0000\u0000\u0240\u023b\u0001\u0000\u0000\u0000"+ + "\u0240\u023c\u0001\u0000\u0000\u0000\u0240\u023d\u0001\u0000\u0000\u0000"+ + "\u0240\u023e\u0001\u0000\u0000\u0000\u0240\u023f\u0001\u0000\u0000\u0000"+ + "\u0241W\u0001\u0000\u0000\u0000\u0242\u0243\u0005\u0002\u0000\u0000\u0243"+ + "\u0244\u0005\u0007\u0000\u0000\u0244\u0245\u0005\u0005\u0000\u0000\u0245"+ + "Y\u0001\u0000\u0000\u0000\u0246\u0247\u0005\u0002\u0000\u0000\u0247\u0248"+ + "\u0005\t\u0000\u0000\u0248\u0249\u0005\u0005\u0000\u0000\u0249[\u0001"+ + "\u0000\u0000\u0000\u024a\u024b\u0005\u0005\u0000\u0000\u024b\u024c\u0005"+ + "\u0007\u0000\u0000\u024c\u024d\u0005\u0005\u0000\u0000\u024d\u0251\u0005"+ + "\r\u0000\u0000\u024e\u0250\u0003n7\u0000\u024f\u024e\u0001\u0000\u0000"+ + "\u0000\u0250\u0253\u0001\u0000\u0000\u0000\u0251\u024f\u0001\u0000\u0000"+ + "\u0000\u0251\u0252\u0001\u0000\u0000\u0000\u0252\u0254\u0001\u0000\u0000"+ + "\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0254\u0259\u0005\u000e\u0000"+ + "\u0000\u0255\u0256\u0005\u0005\u0000\u0000\u0256\u0257\u0005\u0007\u0000"+ + "\u0000\u0257\u0259\u0005\u0005\u0000\u0000\u0258\u024a\u0001\u0000\u0000"+ + "\u0000\u0258\u0255\u0001\u0000\u0000\u0000\u0259]\u0001\u0000\u0000\u0000"+ + "\u025a\u025c\u0005\u0006\u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ + "\u025b\u025c\u0001\u0000\u0000\u0000\u025c\u025d\u0001\u0000\u0000\u0000"+ + "\u025d\u025e\u0005\u0005\u0000\u0000\u025e\u025f\u0005\u0007\u0000\u0000"+ + "\u025f\u0260\u0005\u0005\u0000\u0000\u0260\u0264\u0005\r\u0000\u0000\u0261"+ + "\u0263\u0003n7\u0000\u0262\u0261\u0001\u0000\u0000\u0000\u0263\u0266\u0001"+ + "\u0000\u0000\u0000\u0264\u0262\u0001\u0000\u0000\u0000\u0264\u0265\u0001"+ + "\u0000\u0000\u0000\u0265\u0267\u0001\u0000\u0000\u0000\u0266\u0264\u0001"+ + "\u0000\u0000\u0000\u0267\u026f\u0005\u000e\u0000\u0000\u0268\u026a\u0005"+ + "\u0006\u0000\u0000\u0269\u0268\u0001\u0000\u0000\u0000\u0269\u026a\u0001"+ + "\u0000\u0000\u0000\u026a\u026b\u0001\u0000\u0000\u0000\u026b\u026c\u0005"+ + "\u0005\u0000\u0000\u026c\u026d\u0005\u0007\u0000\u0000\u026d\u026f\u0005"+ + "\u0005\u0000\u0000\u026e\u025b\u0001\u0000\u0000\u0000\u026e\u0269\u0001"+ + "\u0000\u0000\u0000\u026f_\u0001\u0000\u0000\u0000\u0270\u0272\u0005\u0004"+ + "\u0000\u0000\u0271\u0273\u0005\u0006\u0000\u0000\u0272\u0271\u0001\u0000"+ + "\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0001\u0000"+ + "\u0000\u0000\u0274\u0275\u0005\u0005\u0000\u0000\u0275\u0276\u0001\u0000"+ + "\u0000\u0000\u0276\u027a\u0005\r\u0000\u0000\u0277\u0279\u0003n7\u0000"+ + "\u0278\u0277\u0001\u0000\u0000\u0000\u0279\u027c\u0001\u0000\u0000\u0000"+ + "\u027a\u0278\u0001\u0000\u0000\u0000\u027a\u027b\u0001\u0000\u0000\u0000"+ + "\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u027a\u0001\u0000\u0000\u0000"+ + "\u027d\u027e\u0005\u000e\u0000\u0000\u027ea\u0001\u0000\u0000\u0000\u027f"+ + "\u0281\u0005\u0006\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0280"+ + "\u0281\u0001\u0000\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282"+ + "\u0283\u0005\u0005\u0000\u0000\u0283\u0284\u0005\u0007\u0000\u0000\u0284"+ + "\u0285\u0005\b\u0000\u0000\u0285c\u0001\u0000\u0000\u0000\u0286\u0288"+ + "\u0005\u0006\u0000\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0287\u0288"+ + "\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0005\u0005\u0000\u0000\u028ae\u0001\u0000\u0000\u0000\u028b\u028c\u0005"+ + "\u0005\u0000\u0000\u028c\u0290\u0005\r\u0000\u0000\u028d\u028f\u0003n"+ + "7\u0000\u028e\u028d\u0001\u0000\u0000\u0000\u028f\u0292\u0001\u0000\u0000"+ + "\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0290\u0291\u0001\u0000\u0000"+ + "\u0000\u0291\u0293\u0001\u0000\u0000\u0000\u0292\u0290\u0001\u0000\u0000"+ + "\u0000\u0293\u0294\u0005\u000e\u0000\u0000\u0294g\u0001\u0000\u0000\u0000"+ + "\u0295\u0296\u0005\u0001\u0000\u0000\u0296i\u0001\u0000\u0000\u0000\u0297"+ + "\u029e\u0003p8\u0000\u0298\u029a\u0007\b\u0000\u0000\u0299\u0298\u0001"+ + "\u0000\u0000\u0000\u029a\u029b\u0001\u0000\u0000\u0000\u029b\u0299\u0001"+ + "\u0000\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u029e\u0001"+ + "\u0000\u0000\u0000\u029d\u0297\u0001\u0000\u0000\u0000\u029d\u0299\u0001"+ + "\u0000\u0000\u0000\u029ek\u0001\u0000\u0000\u0000\u029f\u02a1\u0005\r"+ + "\u0000\u0000\u02a0\u02a2\u0003n7\u0000\u02a1\u02a0\u0001\u0000\u0000\u0000"+ + "\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000"+ + "\u02a3\u02a4\u0001\u0000\u0000\u0000\u02a4\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a5\u02a6\u0005\u000e\u0000\u0000\u02a6m\u0001\u0000\u0000\u0000\u02a7"+ + "\u02c9\u0003V+\u0000\u02a8\u02c9\u0003f3\u0000\u02a9\u02c9\u0005\u0005"+ + "\u0000\u0000\u02aa\u02c9\u0003d2\u0000\u02ab\u02c9\u0005\u0002\u0000\u0000"+ + "\u02ac\u02c9\u0005\u0006\u0000\u0000\u02ad\u02c9\u0005\u0086\u0000\u0000"+ + "\u02ae\u02c9\u0005\u0003\u0000\u0000\u02af\u02b1\u0005\u0001\u0000\u0000"+ + "\u02b0\u02af\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000"+ + "\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b2\u02b3\u0001\u0000\u0000\u0000"+ + "\u02b3\u02c9\u0001\u0000\u0000\u0000\u02b4\u02c9\u0005\u0007\u0000\u0000"+ + "\u02b5\u02c9\u0005\b\u0000\u0000\u02b6\u02c9\u0005\t\u0000\u0000\u02b7"+ + "\u02bb\u0005\u000f\u0000\u0000\u02b8\u02ba\u0003n7\u0000\u02b9\u02b8\u0001"+ + "\u0000\u0000\u0000\u02ba\u02bd\u0001\u0000\u0000\u0000\u02bb\u02b9\u0001"+ + "\u0000\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc\u02be\u0001"+ + "\u0000\u0000\u0000\u02bd\u02bb\u0001\u0000\u0000\u0000\u02be\u02c9\u0005"+ + "\u0090\u0000\u0000\u02bf\u02c3\u0005\r\u0000\u0000\u02c0\u02c2\u0003n"+ + "7\u0000\u02c1\u02c0\u0001\u0000\u0000\u0000\u02c2\u02c5\u0001\u0000\u0000"+ + "\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3\u02c4\u0001\u0000\u0000"+ + "\u0000\u02c4\u02c6\u0001\u0000\u0000\u0000\u02c5\u02c3\u0001\u0000\u0000"+ + "\u0000\u02c6\u02c9\u0005\u000e\u0000\u0000\u02c7\u02c9\u0005\u0015\u0000"+ + "\u0000\u02c8\u02a7\u0001\u0000\u0000\u0000\u02c8\u02a8\u0001\u0000\u0000"+ + "\u0000\u02c8\u02a9\u0001\u0000\u0000\u0000\u02c8\u02aa\u0001\u0000\u0000"+ + "\u0000\u02c8\u02ab\u0001\u0000\u0000\u0000\u02c8\u02ac\u0001\u0000\u0000"+ + "\u0000\u02c8\u02ad\u0001\u0000\u0000\u0000\u02c8\u02ae\u0001\u0000\u0000"+ + "\u0000\u02c8\u02b0\u0001\u0000\u0000\u0000\u02c8\u02b4\u0001\u0000\u0000"+ + "\u0000\u02c8\u02b5\u0001\u0000\u0000\u0000\u02c8\u02b6\u0001\u0000\u0000"+ + "\u0000\u02c8\u02b7\u0001\u0000\u0000\u0000\u02c8\u02bf\u0001\u0000\u0000"+ + "\u0000\u02c8\u02c7\u0001\u0000\u0000\u0000\u02c9o\u0001\u0000\u0000\u0000"+ + "\u02ca\u02cb\u0005\u0002\u0000\u0000\u02cb\u02cc\u0005\u008d\u0000\u0000"+ + "\u02cc\u02cf\u0005\u0002\u0000\u0000\u02cd\u02ce\u0005\u008e\u0000\u0000"+ + "\u02ce\u02d0\u0005\u0002\u0000\u0000\u02cf\u02cd\u0001\u0000\u0000\u0000"+ + "\u02cf\u02d0\u0001\u0000\u0000\u0000\u02d0q\u0001\u0000\u0000\u0000\u02d1"+ + "\u02d4\u0005\u000b\u0000\u0000\u02d2\u02d5\u0005\u0011\u0000\u0000\u02d3"+ + "\u02d5\u0003z=\u0000\u02d4\u02d2\u0001\u0000\u0000\u0000\u02d4\u02d3\u0001"+ + "\u0000\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005"+ + "\f\u0000\u0000\u02d7s\u0001\u0000\u0000\u0000\u02d8\u02db\u0005\u000b"+ + "\u0000\u0000\u02d9\u02dc\u0005\u0011\u0000\u0000\u02da\u02dc\u0003z=\u0000"+ + "\u02db\u02d9\u0001\u0000\u0000\u0000\u02db\u02da\u0001\u0000\u0000\u0000"+ + "\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02de\u0005\u0013\u0000\u0000"+ + "\u02de\u02df\u0003z=\u0000\u02df\u02e0\u0005\f\u0000\u0000\u02e0u\u0001"+ + "\u0000\u0000\u0000\u02e1\u02e2\u0005\u000b\u0000\u0000\u02e2\u02e7\u0003"+ + "z=\u0000\u02e3\u02e4\u0005\u0013\u0000\u0000\u02e4\u02e6\u0003z=\u0000"+ + "\u02e5\u02e3\u0001\u0000\u0000\u0000\u02e6\u02e9\u0001\u0000\u0000\u0000"+ + "\u02e7\u02e5\u0001\u0000\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000"+ + "\u02e8\u02ea\u0001\u0000\u0000\u0000\u02e9\u02e7\u0001\u0000\u0000\u0000"+ + "\u02ea\u02eb\u0005\f\u0000\u0000\u02ebw\u0001\u0000\u0000\u0000\u02ec"+ + "\u02ed\u0005\u0011\u0000\u0000\u02edy\u0001\u0000\u0000\u0000\u02ee\u02f0"+ + "\u0003|>\u0000\u02ef\u02ee\u0001\u0000\u0000\u0000\u02f0\u02f1\u0001\u0000"+ + "\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001\u0000"+ + "\u0000\u0000\u02f2{\u0001\u0000\u0000\u0000\u02f3\u02fe\u0003~?\u0000"+ + "\u02f4\u02fe\u0003\u0080@\u0000\u02f5\u02fe\u0005\n\u0000\u0000\u02f6"+ + "\u02fe\u0005\u0002\u0000\u0000\u02f7\u02fe\u0005\u0003\u0000\u0000\u02f8"+ + "\u02fe\u0005\u0092\u0000\u0000\u02f9\u02fe\u0005\u0011\u0000\u0000\u02fa"+ + "\u02fe\u0005\u0012\u0000\u0000\u02fb\u02fe\u0005\u0095\u0000\u0000\u02fc"+ + "\u02fe\u0005\u0014\u0000\u0000\u02fd\u02f3\u0001\u0000\u0000\u0000\u02fd"+ + "\u02f4\u0001\u0000\u0000\u0000\u02fd\u02f5\u0001\u0000\u0000\u0000\u02fd"+ + "\u02f6\u0001\u0000\u0000\u0000\u02fd\u02f7\u0001\u0000\u0000\u0000\u02fd"+ + "\u02f8\u0001\u0000\u0000\u0000\u02fd\u02f9\u0001\u0000\u0000\u0000\u02fd"+ + "\u02fa\u0001\u0000\u0000\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fd"+ + "\u02fc\u0001\u0000\u0000\u0000\u02fe}\u0001\u0000\u0000\u0000\u02ff\u0300"+ + "\u0005\u000f\u0000\u0000\u0300\u0305\u0003\u0082A\u0000\u0301\u0302\u0005"+ + "\u0014\u0000\u0000\u0302\u0304\u0003\u0082A\u0000\u0303\u0301\u0001\u0000"+ + "\u0000\u0000\u0304\u0307\u0001\u0000\u0000\u0000\u0305\u0303\u0001\u0000"+ + "\u0000\u0000\u0305\u0306\u0001\u0000\u0000\u0000\u0306\u0309\u0001\u0000"+ + "\u0000\u0000\u0307\u0305\u0001\u0000\u0000\u0000\u0308\u030a\u0005\u0014"+ + "\u0000\u0000\u0309\u0308\u0001\u0000\u0000\u0000\u0309\u030a\u0001\u0000"+ + "\u0000\u0000\u030a\u030b\u0001\u0000\u0000\u0000\u030b\u030c\u0005\u0090"+ + "\u0000\u0000\u030c\u007f\u0001\u0000\u0000\u0000\u030d\u030f\u0005\u000f"+ + "\u0000\u0000\u030e\u0310\u0003|>\u0000\u030f\u030e\u0001\u0000\u0000\u0000"+ + "\u0310\u0311\u0001\u0000\u0000\u0000\u0311\u030f\u0001\u0000\u0000\u0000"+ + "\u0311\u0312\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000\u0000"+ + "\u0313\u0314\u0005\u0090\u0000\u0000\u0314\u0318\u0001\u0000\u0000\u0000"+ + "\u0315\u0316\u0005\u000f\u0000\u0000\u0316\u0318\u0005\u0090\u0000\u0000"+ + "\u0317\u030d\u0001\u0000\u0000\u0000\u0317\u0315\u0001\u0000\u0000\u0000"+ + "\u0318\u0081\u0001\u0000\u0000\u0000\u0319\u031a\u0005\u0011\u0000\u0000"+ + "\u031a\u031b\u0005\u0012\u0000\u0000\u031b\u031c\u0007\t\u0000\u0000\u031c"+ + "\u0083\u0001\u0000\u0000\u0000\u031d\u031e\u0005h\u0000\u0000\u031e\u031f"+ + "\u0005i\u0000\u0000\u031f\u0085\u0001\u0000\u0000\u0000\u0320\u0322\u0007"+ + "\n\u0000\u0000\u0321\u0323\u0003h4\u0000\u0322\u0321\u0001\u0000\u0000"+ + "\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323\u0087\u0001\u0000\u0000"+ + "\u0000\u0324\u0326\u0005\u0017\u0000\u0000\u0325\u0324\u0001\u0000\u0000"+ + "\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327\u0325\u0001\u0000\u0000"+ + "\u0000\u0327\u0328\u0001\u0000\u0000\u0000\u0328\u032e\u0001\u0000\u0000"+ + "\u0000\u0329\u032e\u0005s\u0000\u0000\u032a\u032e\u0005u\u0000\u0000\u032b"+ + "\u032e\u0005{\u0000\u0000\u032c\u032e\u0005z\u0000\u0000\u032d\u0325\u0001"+ + "\u0000\u0000\u0000\u032d\u0329\u0001\u0000\u0000\u0000\u032d\u032a\u0001"+ + "\u0000\u0000\u0000\u032d\u032b\u0001\u0000\u0000\u0000\u032d\u032c\u0001"+ + "\u0000\u0000\u0000\u032e\u0089\u0001\u0000\u0000\u0000S\u008d\u0095\u009c"+ + "\u00ae\u00c6\u00cc\u00d0\u00d3\u00de\u00e0\u00ea\u00f4\u00fe\u0108\u0112"+ + "\u011c\u0124\u0129\u012d\u0135\u0149\u014f\u015e\u0168\u016c\u0173\u017c"+ + "\u017e\u0187\u0191\u019d\u01a8\u01aa\u01b4\u01c2\u01c6\u01cc\u01ce\u01d8"+ + "\u01e2\u01e6\u01ee\u01f7\u01f9\u0201\u020e\u0216\u021c\u0222\u022a\u0233"+ + "\u0240\u0251\u0258\u025b\u0264\u0269\u026e\u0272\u027a\u0280\u0287\u0290"+ + "\u029b\u029d\u02a3\u02b2\u02bb\u02c3\u02c8\u02cf\u02d4\u02db\u02e7\u02f1"+ + "\u02fd\u0305\u0309\u0311\u0317\u0322\u0327\u032d"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java new file mode 100644 index 000000000000..2785bf4f2b54 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java @@ -0,0 +1,878 @@ +// Generated from java-escape by ANTLR 4.11.1 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link BladeAntlrParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class BladeAntlrParserBaseListener implements BladeAntlrParserListener { + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFile(BladeAntlrParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFile(BladeAntlrParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterGeneral_statement(BladeAntlrParser.General_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitGeneral_statement(BladeAntlrParser.General_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_statement(BladeAntlrParser.Inline_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_statement(BladeAntlrParser.Inline_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_inline(BladeAntlrParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_inline(BladeAntlrParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection(BladeAntlrParser.SectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection(BladeAntlrParser.SectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPush(BladeAntlrParser.PushContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPush(BladeAntlrParser.PushContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPushOnce(BladeAntlrParser.PushOnceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPushOnce(BladeAntlrParser.PushOnceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPushIf(BladeAntlrParser.PushIfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPushIf(BladeAntlrParser.PushIfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPrepend(BladeAntlrParser.PrependContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPrepend(BladeAntlrParser.PrependContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFragmentD(BladeAntlrParser.FragmentDContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFragmentD(BladeAntlrParser.FragmentDContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIf(BladeAntlrParser.IfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIf(BladeAntlrParser.IfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterElse(BladeAntlrParser.ElseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitElse(BladeAntlrParser.ElseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEndif(BladeAntlrParser.EndifContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEndif(BladeAntlrParser.EndifContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEmpty_block(BladeAntlrParser.Empty_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEmpty_block(BladeAntlrParser.Empty_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterConditional_block(BladeAntlrParser.Conditional_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitConditional_block(BladeAntlrParser.Conditional_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterAuth_block(BladeAntlrParser.Auth_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitAuth_block(BladeAntlrParser.Auth_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEnv_block(BladeAntlrParser.Env_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEnv_block(BladeAntlrParser.Env_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPermission(BladeAntlrParser.PermissionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPermission(BladeAntlrParser.PermissionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterError_block(BladeAntlrParser.Error_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitError_block(BladeAntlrParser.Error_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSwitch(BladeAntlrParser.SwitchContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSwitch(BladeAntlrParser.SwitchContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterWhile(BladeAntlrParser.WhileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitWhile(BladeAntlrParser.WhileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFor(BladeAntlrParser.ForContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFor(BladeAntlrParser.ForContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterForeach(BladeAntlrParser.ForeachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitForeach(BladeAntlrParser.ForeachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterForelse(BladeAntlrParser.ForelseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitForelse(BladeAntlrParser.ForelseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSession(BladeAntlrParser.SessionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSession(BladeAntlrParser.SessionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStack(BladeAntlrParser.StackContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStack(BladeAntlrParser.StackContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInject(BladeAntlrParser.InjectContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInject(BladeAntlrParser.InjectContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEach(BladeAntlrParser.EachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEach(BladeAntlrParser.EachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterOnce_block(BladeAntlrParser.Once_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitOnce_block(BladeAntlrParser.Once_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterCondSection(BladeAntlrParser.CondSectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitCondSection(BladeAntlrParser.CondSectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhp_blade(BladeAntlrParser.Php_bladeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhp_blade(BladeAntlrParser.Php_bladeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhpInline(BladeAntlrParser.PhpInlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterRegular_echo(BladeAntlrParser.Regular_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitRegular_echo(BladeAntlrParser.Regular_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterRaw_echo(BladeAntlrParser.Raw_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitRaw_echo(BladeAntlrParser.Raw_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEcho_expr(BladeAntlrParser.Echo_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEcho_expr(BladeAntlrParser.Echo_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterClass_instance(BladeAntlrParser.Class_instanceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitClass_instance(BladeAntlrParser.Class_instanceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFunction_call(BladeAntlrParser.Function_callContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFunction_call(BladeAntlrParser.Function_callContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhp_expression(BladeAntlrParser.Php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhp_expression(BladeAntlrParser.Php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterLoop_expression(BladeAntlrParser.Loop_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitLoop_expression(BladeAntlrParser.Loop_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhpExpr(BladeAntlrParser.PhpExprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhpExpr(BladeAntlrParser.PhpExprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterArrayDefine(BladeAntlrParser.ArrayDefineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitArrayDefine(BladeAntlrParser.ArrayDefineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterParamAssign(BladeAntlrParser.ParamAssignContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitParamAssign(BladeAntlrParser.ParamAssignContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterLoop_action(BladeAntlrParser.Loop_actionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitLoop_action(BladeAntlrParser.Loop_actionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml(BladeAntlrParser.HtmlContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml(BladeAntlrParser.HtmlContext ctx) { } + + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java new file mode 100644 index 000000000000..028880cddca2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java @@ -0,0 +1,710 @@ +// Generated from java-escape by ANTLR 4.11.1 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BladeAntlrParser}. + */ +public interface BladeAntlrParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link BladeAntlrParser#file}. + * @param ctx the parse tree + */ + void enterFile(BladeAntlrParser.FileContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#file}. + * @param ctx the parse tree + */ + void exitFile(BladeAntlrParser.FileContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#general_statement}. + * @param ctx the parse tree + */ + void enterGeneral_statement(BladeAntlrParser.General_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#general_statement}. + * @param ctx the parse tree + */ + void exitGeneral_statement(BladeAntlrParser.General_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#inline_statement}. + * @param ctx the parse tree + */ + void enterInline_statement(BladeAntlrParser.Inline_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#inline_statement}. + * @param ctx the parse tree + */ + void exitInline_statement(BladeAntlrParser.Inline_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#inline_directive}. + * @param ctx the parse tree + */ + void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#inline_directive}. + * @param ctx the parse tree + */ + void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#block_statement}. + * @param ctx the parse tree + */ + void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#block_statement}. + * @param ctx the parse tree + */ + void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#identifiableType}. + * @param ctx the parse tree + */ + void enterIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#identifiableType}. + * @param ctx the parse tree + */ + void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#section_inline}. + * @param ctx the parse tree + */ + void enterSection_inline(BladeAntlrParser.Section_inlineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#section_inline}. + * @param ctx the parse tree + */ + void exitSection_inline(BladeAntlrParser.Section_inlineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#section}. + * @param ctx the parse tree + */ + void enterSection(BladeAntlrParser.SectionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#section}. + * @param ctx the parse tree + */ + void exitSection(BladeAntlrParser.SectionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#push}. + * @param ctx the parse tree + */ + void enterPush(BladeAntlrParser.PushContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#push}. + * @param ctx the parse tree + */ + void exitPush(BladeAntlrParser.PushContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#pushOnce}. + * @param ctx the parse tree + */ + void enterPushOnce(BladeAntlrParser.PushOnceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#pushOnce}. + * @param ctx the parse tree + */ + void exitPushOnce(BladeAntlrParser.PushOnceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#pushIf}. + * @param ctx the parse tree + */ + void enterPushIf(BladeAntlrParser.PushIfContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#pushIf}. + * @param ctx the parse tree + */ + void exitPushIf(BladeAntlrParser.PushIfContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#prepend}. + * @param ctx the parse tree + */ + void enterPrepend(BladeAntlrParser.PrependContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#prepend}. + * @param ctx the parse tree + */ + void exitPrepend(BladeAntlrParser.PrependContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#fragmentD}. + * @param ctx the parse tree + */ + void enterFragmentD(BladeAntlrParser.FragmentDContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#fragmentD}. + * @param ctx the parse tree + */ + void exitFragmentD(BladeAntlrParser.FragmentDContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#if}. + * @param ctx the parse tree + */ + void enterIf(BladeAntlrParser.IfContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#if}. + * @param ctx the parse tree + */ + void exitIf(BladeAntlrParser.IfContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#else}. + * @param ctx the parse tree + */ + void enterElse(BladeAntlrParser.ElseContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#else}. + * @param ctx the parse tree + */ + void exitElse(BladeAntlrParser.ElseContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#endif}. + * @param ctx the parse tree + */ + void enterEndif(BladeAntlrParser.EndifContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#endif}. + * @param ctx the parse tree + */ + void exitEndif(BladeAntlrParser.EndifContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#empty_block}. + * @param ctx the parse tree + */ + void enterEmpty_block(BladeAntlrParser.Empty_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#empty_block}. + * @param ctx the parse tree + */ + void exitEmpty_block(BladeAntlrParser.Empty_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#conditional_block}. + * @param ctx the parse tree + */ + void enterConditional_block(BladeAntlrParser.Conditional_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#conditional_block}. + * @param ctx the parse tree + */ + void exitConditional_block(BladeAntlrParser.Conditional_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#auth_block}. + * @param ctx the parse tree + */ + void enterAuth_block(BladeAntlrParser.Auth_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#auth_block}. + * @param ctx the parse tree + */ + void exitAuth_block(BladeAntlrParser.Auth_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#env_block}. + * @param ctx the parse tree + */ + void enterEnv_block(BladeAntlrParser.Env_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#env_block}. + * @param ctx the parse tree + */ + void exitEnv_block(BladeAntlrParser.Env_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#permission}. + * @param ctx the parse tree + */ + void enterPermission(BladeAntlrParser.PermissionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#permission}. + * @param ctx the parse tree + */ + void exitPermission(BladeAntlrParser.PermissionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#simple_conditional_stm}. + * @param ctx the parse tree + */ + void enterSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#simple_conditional_stm}. + * @param ctx the parse tree + */ + void exitSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#error_block}. + * @param ctx the parse tree + */ + void enterError_block(BladeAntlrParser.Error_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#error_block}. + * @param ctx the parse tree + */ + void exitError_block(BladeAntlrParser.Error_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#switch}. + * @param ctx the parse tree + */ + void enterSwitch(BladeAntlrParser.SwitchContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#switch}. + * @param ctx the parse tree + */ + void exitSwitch(BladeAntlrParser.SwitchContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#while}. + * @param ctx the parse tree + */ + void enterWhile(BladeAntlrParser.WhileContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#while}. + * @param ctx the parse tree + */ + void exitWhile(BladeAntlrParser.WhileContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#for}. + * @param ctx the parse tree + */ + void enterFor(BladeAntlrParser.ForContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#for}. + * @param ctx the parse tree + */ + void exitFor(BladeAntlrParser.ForContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#foreach}. + * @param ctx the parse tree + */ + void enterForeach(BladeAntlrParser.ForeachContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#foreach}. + * @param ctx the parse tree + */ + void exitForeach(BladeAntlrParser.ForeachContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#forelse}. + * @param ctx the parse tree + */ + void enterForelse(BladeAntlrParser.ForelseContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#forelse}. + * @param ctx the parse tree + */ + void exitForelse(BladeAntlrParser.ForelseContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#session}. + * @param ctx the parse tree + */ + void enterSession(BladeAntlrParser.SessionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#session}. + * @param ctx the parse tree + */ + void exitSession(BladeAntlrParser.SessionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#stack}. + * @param ctx the parse tree + */ + void enterStack(BladeAntlrParser.StackContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#stack}. + * @param ctx the parse tree + */ + void exitStack(BladeAntlrParser.StackContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#asset_bundler}. + * @param ctx the parse tree + */ + void enterAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#asset_bundler}. + * @param ctx the parse tree + */ + void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#inject}. + * @param ctx the parse tree + */ + void enterInject(BladeAntlrParser.InjectContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#inject}. + * @param ctx the parse tree + */ + void exitInject(BladeAntlrParser.InjectContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#includeCond}. + * @param ctx the parse tree + */ + void enterIncludeCond(BladeAntlrParser.IncludeCondContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#includeCond}. + * @param ctx the parse tree + */ + void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#each}. + * @param ctx the parse tree + */ + void enterEach(BladeAntlrParser.EachContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#each}. + * @param ctx the parse tree + */ + void exitEach(BladeAntlrParser.EachContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#once_block}. + * @param ctx the parse tree + */ + void enterOnce_block(BladeAntlrParser.Once_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#once_block}. + * @param ctx the parse tree + */ + void exitOnce_block(BladeAntlrParser.Once_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#condSection}. + * @param ctx the parse tree + */ + void enterCondSection(BladeAntlrParser.CondSectionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#condSection}. + * @param ctx the parse tree + */ + void exitCondSection(BladeAntlrParser.CondSectionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#custom_directive}. + * @param ctx the parse tree + */ + void enterCustom_directive(BladeAntlrParser.Custom_directiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#custom_directive}. + * @param ctx the parse tree + */ + void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#possibleDirective}. + * @param ctx the parse tree + */ + void enterPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#possibleDirective}. + * @param ctx the parse tree + */ + void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#php_blade}. + * @param ctx the parse tree + */ + void enterPhp_blade(BladeAntlrParser.Php_bladeContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#php_blade}. + * @param ctx the parse tree + */ + void exitPhp_blade(BladeAntlrParser.Php_bladeContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#phpInline}. + * @param ctx the parse tree + */ + void enterPhpInline(BladeAntlrParser.PhpInlineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#phpInline}. + * @param ctx the parse tree + */ + void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#regular_echo}. + * @param ctx the parse tree + */ + void enterRegular_echo(BladeAntlrParser.Regular_echoContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#regular_echo}. + * @param ctx the parse tree + */ + void exitRegular_echo(BladeAntlrParser.Regular_echoContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#raw_echo}. + * @param ctx the parse tree + */ + void enterRaw_echo(BladeAntlrParser.Raw_echoContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#raw_echo}. + * @param ctx the parse tree + */ + void exitRaw_echo(BladeAntlrParser.Raw_echoContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#echo_expr}. + * @param ctx the parse tree + */ + void enterEcho_expr(BladeAntlrParser.Echo_exprContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#echo_expr}. + * @param ctx the parse tree + */ + void exitEcho_expr(BladeAntlrParser.Echo_exprContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#class_expr_usage}. + * @param ctx the parse tree + */ + void enterClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#class_expr_usage}. + * @param ctx the parse tree + */ + void exitClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#object_alias_static_access}. + * @param ctx the parse tree + */ + void enterObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#object_alias_static_access}. + * @param ctx the parse tree + */ + void exitObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#object_alias_direct_access}. + * @param ctx the parse tree + */ + void enterObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#object_alias_direct_access}. + * @param ctx the parse tree + */ + void exitObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#static_direct_class_access}. + * @param ctx the parse tree + */ + void enterStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#static_direct_class_access}. + * @param ctx the parse tree + */ + void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#static_direct_namespace_class_access}. + * @param ctx the parse tree + */ + void enterStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#static_direct_namespace_class_access}. + * @param ctx the parse tree + */ + void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#class_instance}. + * @param ctx the parse tree + */ + void enterClass_instance(BladeAntlrParser.Class_instanceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#class_instance}. + * @param ctx the parse tree + */ + void exitClass_instance(BladeAntlrParser.Class_instanceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#class_name_reference}. + * @param ctx the parse tree + */ + void enterClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#class_name_reference}. + * @param ctx the parse tree + */ + void exitClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#namespacePath}. + * @param ctx the parse tree + */ + void enterNamespacePath(BladeAntlrParser.NamespacePathContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#namespacePath}. + * @param ctx the parse tree + */ + void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#function_call}. + * @param ctx the parse tree + */ + void enterFunction_call(BladeAntlrParser.Function_callContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#function_call}. + * @param ctx the parse tree + */ + void exitFunction_call(BladeAntlrParser.Function_callContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#php_expression}. + * @param ctx the parse tree + */ + void enterPhp_expression(BladeAntlrParser.Php_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#php_expression}. + * @param ctx the parse tree + */ + void exitPhp_expression(BladeAntlrParser.Php_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#loop_expression}. + * @param ctx the parse tree + */ + void enterLoop_expression(BladeAntlrParser.Loop_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#loop_expression}. + * @param ctx the parse tree + */ + void exitLoop_expression(BladeAntlrParser.Loop_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#main_php_expression}. + * @param ctx the parse tree + */ + void enterMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#main_php_expression}. + * @param ctx the parse tree + */ + void exitMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#composed_php_expression}. + * @param ctx the parse tree + */ + void enterComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#composed_php_expression}. + * @param ctx the parse tree + */ + void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#simple_foreach_expr}. + * @param ctx the parse tree + */ + void enterSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#simple_foreach_expr}. + * @param ctx the parse tree + */ + void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#singleArgWrapperP}. + * @param ctx the parse tree + */ + void enterSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#singleArgWrapperP}. + * @param ctx the parse tree + */ + void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#doubleArgWrapperP}. + * @param ctx the parse tree + */ + void enterDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#doubleArgWrapperP}. + * @param ctx the parse tree + */ + void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#multiArgWrapper}. + * @param ctx the parse tree + */ + void enterMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#multiArgWrapper}. + * @param ctx the parse tree + */ + void exitMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#identifiableArgument}. + * @param ctx the parse tree + */ + void enterIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#identifiableArgument}. + * @param ctx the parse tree + */ + void exitIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#composedArgument}. + * @param ctx the parse tree + */ + void enterComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#composedArgument}. + * @param ctx the parse tree + */ + void exitComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#phpExpr}. + * @param ctx the parse tree + */ + void enterPhpExpr(BladeAntlrParser.PhpExprContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#phpExpr}. + * @param ctx the parse tree + */ + void exitPhpExpr(BladeAntlrParser.PhpExprContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#identifiableArray}. + * @param ctx the parse tree + */ + void enterIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#identifiableArray}. + * @param ctx the parse tree + */ + void exitIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#arrayDefine}. + * @param ctx the parse tree + */ + void enterArrayDefine(BladeAntlrParser.ArrayDefineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#arrayDefine}. + * @param ctx the parse tree + */ + void exitArrayDefine(BladeAntlrParser.ArrayDefineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#paramAssign}. + * @param ctx the parse tree + */ + void enterParamAssign(BladeAntlrParser.ParamAssignContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#paramAssign}. + * @param ctx the parse tree + */ + void exitParamAssign(BladeAntlrParser.ParamAssignContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#verbatim_block}. + * @param ctx the parse tree + */ + void enterVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#verbatim_block}. + * @param ctx the parse tree + */ + void exitVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#loop_action}. + * @param ctx the parse tree + */ + void enterLoop_action(BladeAntlrParser.Loop_actionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#loop_action}. + * @param ctx the parse tree + */ + void exitLoop_action(BladeAntlrParser.Loop_actionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#html}. + * @param ctx the parse tree + */ + void enterHtml(BladeAntlrParser.HtmlContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#html}. + * @param ctx the parse tree + */ + void exitHtml(BladeAntlrParser.HtmlContext ctx); +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java new file mode 100644 index 000000000000..e0cbcd1ab281 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -0,0 +1,303 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import java.util.List; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.*; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * + * @author bogdan + */ +public class BladeAntlrUtils { + + public static AntlrTokenSequence getTokens(Document doc) { + + try { + String text = doc.getText(0, doc.getLength()); + return new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + + } + return null; + } + + public static Token getToken(Document doc, int offset) { + AntlrTokenSequence tokens = getTokens(doc); + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(offset); + + if (!tokens.hasNext()) { + return null; + } + + Token token = tokens.next().get(); + + //need to move back + if ( token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset){ + token = tokens.previous().get(); + } + + return token; + } + + public static Token findForward(Document doc, Token start, + List stopTokenText, List openTokensText) { + + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStopIndex() + 1); + + int openTokenBalance = 0; + + while (tokens.hasNext()) { + Token nt = tokens.next().get(); + if (nt == null) { + continue; + } + + String tokenText = nt.getText(); + + if (openTokensText.contains(tokenText)) { + openTokenBalance++; + continue; + } + if (stopTokenText.contains(tokenText)) { + if (openTokenBalance > 0) { + openTokenBalance--; + } else { + return nt; + } + } + } + + return null; + } + + public static Token findForward(AntlrTokenSequence tokens, + List tokensMatch, List tokensStop) { + + while (tokens.hasNext()) { + Token pt = tokens.next().get(); + if (pt == null) { + continue; + } + + if (tokensMatch.contains(pt.getType())) { + return pt; + } + + if (tokensStop.contains(pt.getType())) { + return null; + } + } + + return null; + } + + public static Token findBackward(Document doc, Token start, + List stopTokenText, List openTokensText) { + + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStartIndex() - 1); + + int openTokenBalance = 0; + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + String tokenText = pt.getText(); + + if (openTokensText.contains(tokenText)) { + openTokenBalance++; + continue; + } + if (stopTokenText.contains(tokenText)) { + if (openTokenBalance > 0) { + openTokenBalance--; + } else { + return pt; + } + } + } + + return null; + } + + public static Token findBackward(AntlrTokenSequence tokens, + List tokensMatch, List tokensStop) { + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + if (tokensMatch.contains(pt.getType())) { + return pt; + } + + if (tokensStop.contains(pt.getType())) { + return null; + } + } + + return null; + } + + public static Token findForward(Document doc, Token start, + int tokensMatch, List skipableTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStopIndex() + 1); + + while (tokens.hasNext()) { + Token pt = tokens.next().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (skipableTokens.contains(pt.getType())) { + continue; + } + + return null; + } + + return null; + + } + + public static Token findForwardWithStop(Document doc, Token start, + int tokensMatch, List stopTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStopIndex() + 1); + + while (tokens.hasNext()) { + Token pt = tokens.next().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (stopTokens.contains(pt.getType())) { + return null; + } + } + + return null; + + } + + public static Token findBackward(Document doc, Token start, + int tokensMatch, List skipableTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStartIndex() - 1); + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (skipableTokens.contains(pt.getType())) { + continue; + } + + return null; + } + + return null; + + } + + public static Token findBackwardWithStop(Document doc, Token start, + int tokensMatch, List stopTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStartIndex() - 1); + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (stopTokens.contains(pt.getType())) { + return null; + } + } + + return null; + + } + + public static int getTagPairTokenType(int tokenType) { + switch (tokenType) { + case CONTENT_TAG_OPEN: + return CONTENT_TAG_CLOSE; + case CONTENT_TAG_CLOSE: + return CONTENT_TAG_OPEN; + case RAW_TAG_OPEN: + return RAW_TAG_CLOSE; + case RAW_TAG_CLOSE: + return RAW_TAG_OPEN; + default: + return -1; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 new file mode 100644 index 000000000000..f79431ab19e2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 @@ -0,0 +1,79 @@ +lexer grammar BladeCommonLexer; + +tokens { + HTML, + BLADE_COMMENT +} + +fragment NameString + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment BladeLabel + : [a-z\u0080-\ufffe][a-z0-9_.\u0080-\ufffe]*; + +fragment FullIdentifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; + +fragment ESC_DOUBLE_QUOTED_STRING + : [\\"]; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' (ESC_DOUBLE_QUOTED_STRING | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment LineComment + : '//' ~ [\r\n]* + ; + +fragment PhpVariable + : '$' NameString; + +fragment PhpKeyword + : 'array' | 'class' | 'empty' | 'use'; + +fragment Digit + : ('0'..'9'); + +BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT); + +EMAIL_SUBSTRING : ('@' FullIdentifier '.')->type(HTML); + +VERSION_WITH_AT: '@' (Digit '.'?)+->type(HTML); + +//escapes +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]* '('? + | '@charset' [ ]* + | '@import' [ ]* + | '@namespace' [ ]* + | '@document' [ ]* + | '@font-face' [ ]* + | '@page' [ ]* + | '@supports' [ ]* + | '@layer' [ ]* + | '@tailwind' [ ]* + | '@apply' [ ]* + | '@-webkit-keyframes' [ ]* + | '@keyframes' [ ]* + )->type(HTML); + +mode INSIDE_BLADE_COMMENT; + +BLADE_COMMENT_END : '--}}'->popMode; + +//hack to merge all php inputs into one token +BLADE_COMMENT_PEEK : . { + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + }? ->type(BLADE_COMMENT); +BLADE_COMMENT_MORE : . ->more; + +BLADE_COMMENT_EOF : EOF->type(BLADE_COMMENT),popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 new file mode 100644 index 000000000000..853121caac06 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 @@ -0,0 +1,79 @@ +lexer grammar BladeCommonLexer; + +tokens { + HTML, + BLADE_COMMENT +} + +fragment NameString + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment BladeLabel + : [a-z\u0080-\ufffe][a-z0-9_.\u0080-\ufffe]*; + +fragment FullIdentifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; + +fragment ESC_DOUBLE_QUOTED_STRING + : [\\"]; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' (ESC_DOUBLE_QUOTED_STRING | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment LineComment + : '//' ~ [\r\n]* + ; + +fragment PhpVariable + : '$' NameString; + +fragment PhpKeyword + : 'array' | 'class' | 'empty' | 'use'; + +fragment Digit + : ('0'..'9'); + +BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT), skip; + +EMAIL_SUBSTRING : ('@' FullIdentifier '.')->type(HTML); + +VERSION_WITH_AT: '@' (Digit '.'?)+->type(HTML); + +//escapes +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]* '('? + | '@charset' [ ]* + | '@import' [ ]* + | '@namespace' [ ]* + | '@document' [ ]* + | '@font-face' [ ]* + | '@page' [ ]* + | '@supports' [ ]* + | '@layer' [ ]* + | '@tailwind' [ ]* + | '@apply' [ ]* + | '@-webkit-keyframes' [ ]* + | '@keyframes' [ ]* + )->type(HTML); + +mode INSIDE_BLADE_COMMENT; + +BLADE_COMMENT_END : '--}}'->popMode, skip; + +//hack to merge all php inputs into one token +BLADE_COMMENT_PEEK : . { + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + }? ->skip; +BLADE_COMMENT_MORE : . ->skip; + +BLADE_COMMENT_EOF : EOF->popMode, skip; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java new file mode 100644 index 000000000000..9700d68dea3c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -0,0 +1,138 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; + +/** + * + * @author bogdan + */ +public abstract class ColoringLexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int roundParenBalance = 0; + public int squareParenBalance = 0; + public int curlyParenBalance = 0; + public int exitIfModePosition = 0; + public int phpExpressionOffset = -1; + public boolean hasPhpExprContent = false; + + public ColoringLexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + /** + * eager check to see if the character position in a line is at the start + * + * @return + */ + public boolean IsNewLineOrStart() { + return this._tokenStartCharPositionInLine <= 2; + } + + public boolean peekNextChar(char peekChar) { + return (char) this._input.LA(1) == peekChar; + } + + public boolean peekNextChars(char peekChar, int number) { + for (int i = 1; i < number; i++) { + if ((char) this._input.LA(i) != peekChar) { + return false; + } + } + return true; + } + + public void increaseRoundParenBalance() { + this.roundParenBalance++; + } + + public void decreaseRoundParenBalance() { + this.roundParenBalance--; + } + + public boolean endsWith(char ch1, char ch2) { + return this._input.LA(1) == ch1 && this._input.LA(2) == ch2; + } + + public boolean endsWith(char ch1, char ch2, char ch3) { + return this._input.LA(1) == ch1 + && this._input.LA(2) == ch2 + && this._input.LA(3) == ch3; + } + + public boolean hasNoBladeParamOpenBracket() { + return this.roundParenBalance > 0 + && this.squareParenBalance == 0 + && this.curlyParenBalance == 0; + } + + //blade coloring lexer + public void consumeEscapedEchoToken() { + if (this._input.LA(1) == '}' && this._input.LA(2) == '}') { + this.setType(BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR); + } else { + this.more(); + } + } + + //blade coloring lexer + public void consumeNotEscapedEchoToken() { + if (this._input.LA(1) == '!' && this._input.LA(2) == '!' && this._input.LA(3) == '}') { + this.setType(BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR); + } else { + this.more(); + } + } + + public void consumeExprToken(){ + if (this._input.LA(1) == ':' && this._input.LA(2) != ':'){ + this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); + } else { + this.more(); + } + } + + public void testForFreezeCombination(){ + if (this.roundParenBalance <= 1 && + (this._input.LA(1) == ')' + || this._input.LA(1) == ']')){ + this.setType(BladeAntlrColoringLexer.ERROR); + } else { + this.consumeExprToken(); + } + } + +// to continue when the sepparation of PHP_EXPRESSION can be implemented +// public void setPhpExpressionOffset(){ +// this.phpExpressionOffset = this.getCharIndex(); +// } +// +// public boolean isFirstElement() { +// return this._tokenStartCharIndex <= this.phpExpressionOffset; +// } +} + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java new file mode 100644 index 000000000000..c733cfe0e7c0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java @@ -0,0 +1,144 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.misc.Interval; + +/** + * + * @author bogdan + */ +public abstract class LexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int roundParenBalance = 0; + public int squareParenBalance = 0; + public int curlyParenBalance = 0; + public int exitIfModePosition = 0; + public boolean compomentTagOpen = false; + + public LexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + /** + * eager check to see if the character position in a line is at the start + * + * @return + */ + public boolean IsNewLineOrStart() { + return this._tokenStartCharPositionInLine <= 2; + } + + public boolean peekNextChar(char peekChar) { + return (char) this._input.LA(1) == peekChar; + } + + public boolean peekNextChars(char peekChar, int number) { + for (int i = 1; i < number; i++) { + if ((char) this._input.LA(i) != peekChar) { + return false; + } + } + return true; + } + + public void increaseRoundParenBalance() { + this.roundParenBalance++; + } + + public void decreaseRoundParenBalance() { + this.roundParenBalance--; + } + + public boolean endsWith(char ch1, char ch2) { + return this._input.LA(1) == ch1 && this._input.LA(2) == ch2; + } + + public boolean endsWith(char ch1, char ch2, char ch3) { + return this._input.LA(1) == ch1 + && this._input.LA(2) == ch2 + && this._input.LA(3) == ch3; + } + + public boolean hasNoBladeParamOpenBracket() { + return this.roundParenBalance == 0 + && this.squareParenBalance == 0 + && this.curlyParenBalance == 0; + } + + public void consumeBladeParamComma(){ + if (this.hasNoBladeParamOpenBracket()){ + this.setType(BladeAntlrLexer.BL_COMMA); + } else { + this.setType(BladeAntlrLexer.BL_PARAM_COMMA); + } + } + + public void consumeRParen(){ + //we start from 0 balance + this.roundParenBalance--; + if (this.roundParenBalance < 0) { + this.roundParenBalance = 0; + this.setType(BladeAntlrLexer.BLADE_PARAM_RPAREN); + this.mode(DEFAULT_MODE); + } else { + this.setType(BladeAntlrLexer.BLADE_PARAM_EXTRA); + } + } + + public void consumeParamRParen(){ + //we start from 0 balance + this.roundParenBalance--; + if (this.roundParenBalance < 0) { + this.roundParenBalance = 0; + this.setType(BladeAntlrLexer.BLADE_PARAM_RPAREN); + this.mode(DEFAULT_MODE); + } else { + this.setType(BladeAntlrLexer.BLADE_PARAM_EXTRA); + } + } + + public void consumeExprRParen(){ + //we start from 0 balance + this.roundParenBalance--; + this.setType(BladeAntlrLexer.BLADE_EXPR_RPAREN); + if (this.roundParenBalance < 0) { + this.roundParenBalance = 0; + this.mode(DEFAULT_MODE); + } + } + + + public void consumeHtmlIdentifier(){ + if (this.compomentTagOpen == true) { + this.setType(BladeAntlrLexer.HTML_IDENTIFIER); + } else { + this.setType(BladeAntlrLexer.HTML); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form new file mode 100644 index 000000000000..ec263c1cdaf6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form @@ -0,0 +1,57 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java new file mode 100644 index 000000000000..7b9c05f95fa4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java @@ -0,0 +1,94 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.ui.options; + +import org.netbeans.modules.php.api.util.UiUtils; +import org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.spi.options.OptionsPanelController; + +/** + * + * @author bogdan + */ +@OptionsPanelController.Keywords( + keywords = { + "php", "twig" + }, + location = UiUtils.OPTIONS_PATH, + tabTitle = "Laravel tab" +) +public class BladeOptionsPanel extends javax.swing.JPanel { + + private final BladeOptionsPanelController controller; + + BladeOptionsPanel(BladeOptionsPanelController controller) { + this.controller = controller; + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + auto_tag_completion = new javax.swing.JCheckBox(); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeOptionsPanel.class, "BladeOptionsPanel.jLabel1.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(auto_tag_completion, org.openide.util.NbBundle.getMessage(BladeOptionsPanel.class, "BladeOptionsPanel.auto_tag_completion.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addComponent(auto_tag_completion)) + .addContainerGap(127, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(auto_tag_completion) + .addContainerGap(252, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + void load() { + this.auto_tag_completion.setSelected(GeneralPreferencesUtils.isAutoTagCompletionEnabled()); + } + + void store() { + ModulePreferences.setPrefBoolean(GeneralPreferencesUtils.ENABLE_AUTO_TAG_COMPLETION, this.auto_tag_completion.isSelected()); + } + + void cancel() { + //throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + boolean valid() { + return true; + } + + boolean changed() { + return false; + } + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox auto_tag_completion; + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java new file mode 100644 index 000000000000..772608815ff8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java @@ -0,0 +1,93 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.ui.options; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import javax.swing.JComponent; +import org.netbeans.modules.php.api.util.UiUtils; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; + +@UiUtils.PhpOptionsPanelRegistration( + id = BladeOptionsPanelController.ID, + displayName = "Blade", + position = 2150 +) +public class BladeOptionsPanelController extends OptionsPanelController { + + static final String ID = "Blade"; // NOI18N + public static final String OPTIONS_SUBPATH = UiUtils.FRAMEWORKS_AND_TOOLS_SUB_PATH + "/" + ID; // NOI18N + + private BladeOptionsPanel panel; + private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + private volatile boolean changed; + + @Override + public void update() { + getPanel().load(); + changed = false; + } + + @Override + public void applyChanges() { + getPanel().store(); + changed = false; + } + + @Override + public void cancel() { + getPanel().cancel(); + } + + @Override + public boolean isValid() { + return getPanel().valid(); + } + + @Override + public boolean isChanged() { + return getPanel().changed(); + } + + @Override + public HelpCtx getHelpCtx() { + return new HelpCtx("org.netbeans.modules.php.blade.editor.Options"); //NOI18N + } + + @Override + public JComponent getComponent(Lookup masterLookup) { + return getPanel(); + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener l) { + pcs.addPropertyChangeListener(l); + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener l) { + pcs.removePropertyChangeListener(l); + } + + private BladeOptionsPanel getPanel() { + if (panel == null) { + panel = new BladeOptionsPanel(this); + } + return panel; + } + + void changed() { + if (!changed) { + changed = true; + pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true); + } + pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null); + } + + public static String getOptionsPath() { + return UiUtils.OPTIONS_PATH + "/" + OPTIONS_SUBPATH; // NOI18N + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties new file mode 100644 index 000000000000..22a91f094ade --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties @@ -0,0 +1,3 @@ + +BladeOptionsPanel.jLabel1.text=Blade +BladeOptionsPanel.auto_tag_completion.text=Auto tag completion ("{{ }}", "{!! !!}", "{{-- --}}") diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php new file mode 100644 index 000000000000..d195ba0d8de1 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php new file mode 100644 index 000000000000..16532c33e245 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php @@ -0,0 +1 @@ +Hello, {{ $name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php new file mode 100644 index 000000000000..56c97d5369a5 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php @@ -0,0 +1,3 @@ +

    Laravel

    + +Hello, @{{ name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php new file mode 100644 index 000000000000..c52c3f531d8e --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php @@ -0,0 +1,7 @@ +@fragment('user-list') +
      + @foreach ($users as $user) +
    • {{ $user->name }}
    • + @endforeach +
    +@endfragment \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php new file mode 100644 index 000000000000..4099847299d0 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php @@ -0,0 +1 @@ +Hello, {!! $name !!}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java new file mode 100644 index 000000000000..c5f3fb680ddd --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java @@ -0,0 +1,107 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.junit.NbTestCase; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bhaidu + */ +public class BladeAntlrColoringLexerTestBase extends BladeBaseTest { + + public BladeAntlrColoringLexerTestBase(String testName) { + super(testName); + } + + public static final FileObject copyStringToFileObject(FileObject fo, String content) throws IOException { + OutputStream os = fo.getOutputStream(); + try { + InputStream is = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); + try { + FileUtil.copy(is, os); + return fo; + } finally { + is.close(); + } + } finally { + os.close(); + } + } + + protected void performTest(String filename) throws Exception { + String result = getTestResult(filename); + String goldenFolder = getDataDir() + "/goldenfiles/"; + File goldenFile = new File(goldenFolder + filename + ".pass"); + if (!goldenFile.exists()) { + FileObject goldenFO = touch(goldenFolder, filename + ".pass"); + copyStringToFileObject(goldenFO, result); + } else { + // if exist, compare it. + FileObject resultFO = touch(getWorkDir(), filename + ".result"); + copyStringToFileObject(resultFO, result); + assertFile(FileUtil.toFile(resultFO), goldenFile, getWorkDir()); + } + } + + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); + CommonTokenStream tokenStream = BladeUtils.getColoringTokenStream(content); + System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); + return createResult(tokenStream); + } + + protected String createResult(CommonTokenStream tokenStream) throws Exception { + StringBuilder result = new StringBuilder(); + + for (Token token : tokenStream.getTokens()) { + switch (token.getType()) { + case HTML: + result.append("HTML "); + break; + case RAW_TAG: + result.append("RAW_TAG "); + break; + case PHP_EXPRESSION: + result.append("PHP_EXPRESSION "); + break; + case BLADE_PHP_ECHO_EXPR: + result.append("PHP_BLADE_ECHO_EXPR "); + break; + case BLADE_PHP_INLINE: + result.append("BLADE_PHP_INLINE "); + break; + default: + result.append(token.getType()); + result.append(" "); + break; + } + + String text = replaceLinesAndTabs(token.getText()); + result.append(text); + result.append(";"); + result.append("\n"); + } + + return result.toString(); + } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java new file mode 100644 index 000000000000..f23bc0f0f853 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java @@ -0,0 +1,111 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.junit.NbTestCase; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; + +/** + * + * @author bhaidu + */ +public class BladeAntlrLexerTestBase extends NbTestCase { + + public BladeAntlrLexerTestBase(String testName) { + super(testName); + } + + public File getDataDir() { + URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); + File dataDir = null; + try { + dataDir = new File(new File(codebase.toURI()), "data"); + } catch (URISyntaxException x) { + throw new Error(x); + } + return dataDir; + } + + protected void performTest(String filename) throws Exception { + performTest(filename, null); + } + + protected String getTestResult(String filename, String caretLine) throws Exception { + return getTestResult(filename); + } + + protected void performTest(String filename, String caretLine) throws Exception { + // parse the file + String result = getTestResult(filename, caretLine); + System.out.print(result); + } + + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); + CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); + System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); + return createResult(tokenStream); + } + + protected String createResult(CommonTokenStream tokenStream) throws Exception { + StringBuilder result = new StringBuilder(); + + for (Token token : tokenStream.getTokens()) { + int channel = token.getChannel(); + switch (token.getType()) { + case BL_PARAM_STRING: + result.append("BL_PARAM_STRING "); + break; + case BL_NAME_STRING: + result.append("BL_NAME_STRING "); + break; + case BL_COMMA: + result.append("BL_COMMA "); + break; + case BL_PARAM_COMMA: + result.append("BL_PARAM_COMMA "); + break; + case BLADE_PARAM_LPAREN: + result.append("BLADE_PARAM_LPAREN "); + break; + case BLADE_PARAM_RPAREN: + result.append("BLADE_PARAM_RPAREN "); + break; + case BLADE_PARAM_EXTRA: + result.append("BLADE_PARAM_EXTRA "); + break; + case D_VERBATIM: + result.append("D_VERBATIM "); + break; + case D_ENDVERBATIM: + result.append("D_ENDVERBATIM "); + break; + case HTML: + result.append("HTML "); + break; + default: + result.append(token.getType()); + result.append(" "); + break; + } + + String text = replaceLinesAndTabs(token.getText()); + result.append(text); + result.append(";"); + result.append("\n"); + } + + return result.toString(); + } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java new file mode 100644 index 000000000000..83f87733ebf6 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java @@ -0,0 +1,92 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.netbeans.junit.NbTestCase; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; + +/** + * + * @author bhaidu + */ +public class BladeAntlrParserTestBase extends NbTestCase { + + public BladeAntlrParserTestBase(String testName) { + super(testName); + } + + public File getDataDir() { + URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); + File dataDir = null; + try { + dataDir = new File(new File(codebase.toURI()), "data"); + } catch (URISyntaxException x) { + throw new Error(x); + } + return dataDir; + } + + protected void performTest(String filename) throws Exception { + performTest(filename, null); + } + + protected String getTestResult(String filename, String caretLine) throws Exception { + return getTestResult(filename); + } + + protected void performTest(String filename, String caretLine) throws Exception { + // parse the file + String result = getTestResult(filename, caretLine); + System.out.print(result); + } + + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); + ParsingUtils parsingUtils = new ParsingUtils(); + parsingUtils.parsePhpText(content); + CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); + System.out.print("\n---Psrser scan for <<" + filename + ">>\n\n"); + BladeAntlrParser parser = new BladeAntlrParser(tokenStream); + ParseTreeListener listener = new BladeAntlrParserBaseListener(){ + + }; + parser.addParseListener(listener); + parser.file(); + System.out.println(parser.getBuildParseTree()); + + return createResult(tokenStream); + } + + protected String createResult(CommonTokenStream tokenStream) throws Exception { + StringBuilder result = new StringBuilder(); + + for (Token token : tokenStream.getTokens()) { + switch (token.getType()) { +// case BLADE_ESCAPED_CONTENT: +// result.append("BLADE_ESCAPED_CONTENT "); +// break; + } + + String text = replaceLinesAndTabs(token.getText()); + result.append(text); + result.append(";"); + result.append("\n"); + } + + return result.toString(); + } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java new file mode 100644 index 000000000000..c05053ebf87b --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java @@ -0,0 +1,20 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import org.junit.Test; + +/** + * + * @author bhaidu + */ +public class BladeAntrlColoringLexerTest extends BladeAntlrColoringLexerTestBase { + + public BladeAntrlColoringLexerTest(String testName) { + super(testName); + } + + @Test + public void test_smoke_content_tag() throws Exception { + performTest("coloring_lexer/smoke/content_tag.blade.php"); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java new file mode 100644 index 000000000000..2745fbca6681 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java @@ -0,0 +1,16 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import org.junit.Test; + +/** + * + * @author bhaidu + */ +public class BladeAntrlLexerTest extends BladeAntlrLexerTestBase { + + public BladeAntrlLexerTest(String testName) { + super(testName); + } + + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java new file mode 100644 index 000000000000..9c7ee6071d11 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java @@ -0,0 +1,15 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import org.junit.Test; + +/** + * + * @author bhaidu + */ +public class BladeAntrlParserTest extends BladeAntlrParserTestBase { + + public BladeAntrlParserTest(String testName) { + super(testName); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java new file mode 100644 index 000000000000..28ce701c61e1 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java @@ -0,0 +1,51 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import static junit.framework.TestCase.assertTrue; +import org.netbeans.junit.NbTestCase; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bhaidu + */ +public abstract class BladeBaseTest extends NbTestCase { + + public BladeBaseTest(String testName) { + super(testName); + } + + protected FileObject touch(final FileObject dir, final String path) throws IOException { + return FileUtil.createData(dir, path); + } + + public File getDataDir() { + URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); + File dataDir = null; + try { + dataDir = new File(new File(codebase.toURI()), "data"); + } catch (URISyntaxException x) { + throw new Error(x); + } + return dataDir; + } + + + protected FileObject touch(final String dir, final String path) throws IOException { + return touch(new File(dir), path); + } + + protected FileObject touch(final File dir, final String path) throws IOException { + if (!dir.isDirectory()) { + assertTrue("success to create " + dir, dir.mkdirs()); + } + FileObject dirFO = FileUtil.toFileObject(FileUtil.normalizeFile(dir)); + return touch(dirFO, path); + } + + abstract protected String getTestResult(String filename) throws Exception; +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java new file mode 100644 index 000000000000..fb495a7370ff --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java @@ -0,0 +1,55 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import org.antlr.v4.runtime.*; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; + +/** + * + * @author bhaidu + */ +public class BladeUtils { + + public static String getFileContent(File file) throws Exception { + StringBuffer sb = new StringBuffer(); + String lineSep = "\n";//NOI18N + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); + String line = br.readLine(); + while (line != null) { + sb.append(line); + sb.append(lineSep); + line = br.readLine(); + } + br.close(); + return sb.toString(); + } + + public static CommonTokenStream getTokenStream(String content) { + CharStream stream = CharStreams.fromString(content); + BladeAntlrLexer lexer = new BladeAntlrLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return tokens; + } + + public static CommonTokenStream getColoringTokenStream(String content) { + CharStream stream = CharStreams.fromString(content); + BladeAntlrColoringLexer lexer = new BladeAntlrColoringLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return tokens; + } + + public static CommonTokenStream getFormatTokenStream(String content) { + CharStream stream = CharStreams.fromString(content); + BladeAntlrFormatterLexer lexer = new BladeAntlrFormatterLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return tokens; + } +} diff --git a/php/php.editor/nbproject/project.xml b/php/php.editor/nbproject/project.xml index f1dd294cdc38..57f41fd79e05 100644 --- a/php/php.editor/nbproject/project.xml +++ b/php/php.editor/nbproject/project.xml @@ -601,9 +601,11 @@ org.cakephp.netbeans org.nbphpcouncil.modules.php.yii org.netbeans.modules.php.dbgp + org.netbeans.modules.php.blade org.netbeans.modules.php.nette org.netbeans.modules.php.prado org.netbeans.modules.php.refactoring + org.netbeans.modules.php.laravel org.netbeans.modules.php.smarty org.netbeans.modules.php.symfony org.netbeans.modules.php.zend From 53e6c82e3589a26f21507415deaff77f15fcdc30 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 31 Jul 2024 07:36:23 +0300 Subject: [PATCH 02/21] feedback resolve: license header, tab -> whitespace on project.xml, // NOI18N string tag --- php/php.blade/manifest.mf | 2 +- php/php.blade/nbproject/project.xml | 33 +---------- .../php/blade/editor/BladeBracesMatcher.java | 10 ++-- .../completion/PhpCodeCompletionService.java | 18 ++++++ .../BladeHighlightsContainer.java | 18 ++++++ .../BladeHighlightsLayerFactory.java | 18 ++++++ .../editor/hints/BladeHintsProvider.java | 1 - .../php/blade/resources/Bundle.properties | 16 ++++++ .../modules/php/blade/resources/layer.xml | 20 +++++++ .../php/blade/resources/mime-resolver.xml | 20 +++++++ .../blade/syntax/BladeDirectivesUtils.java | 20 ++++--- .../formatter/BladeAntlrFormatterLexer.g4 | 38 ++++++++++++- .../formatter/BladeAntlrFormatterParser.g4 | 20 ++++++- .../syntax/antlr4/formatter/LexerAdaptor.java | 20 ++++++- .../antlr4/v10/BladeAntlrColoringLexer.g4 | 36 ++++++++++++ .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 39 ++++++++++++- .../syntax/antlr4/v10/BladeAntlrParser.g4 | 55 ++++++++++++++++--- .../syntax/antlr4/v10/BladeAntlrUtils.java | 19 ++++++- .../antlr4/v10/BladeColoringCommonLexer.g4 | 18 ++++++ .../syntax/antlr4/v10/BladeCommonLexer.g4 | 18 ++++++ .../antlr4/v10/ColoringLexerAdaptor.java | 19 ++++++- .../blade/syntax/antlr4/v10/LexerAdaptor.java | 19 ++++++- .../blade/ui/options/BladeOptionsPanel.java | 17 +++++- .../options/BladeOptionsPanelController.java | 17 +++++- .../php/blade/ui/options/Bundle.properties | 17 +++++- .../BladeAntlrColoringLexerTestBase.java | 18 ++++++ .../antlr4/BladeAntlrLexerTestBase.java | 18 ++++++ .../antlr4/BladeAntlrParserTestBase.java | 18 ++++++ .../antlr4/BladeAntrlColoringLexerTest.java | 18 ++++++ .../syntax/antlr4/BladeAntrlLexerTest.java | 18 ++++++ .../syntax/antlr4/BladeAntrlParserTest.java | 18 ++++++ .../blade/syntax/antlr4/BladeBaseTest.java | 18 ++++++ .../php/blade/syntax/antlr4/BladeUtils.java | 18 ++++++ php/php.editor/nbproject/project.xml | 3 +- 34 files changed, 604 insertions(+), 71 deletions(-) diff --git a/php/php.blade/manifest.mf b/php/php.blade/manifest.mf index 61a6406d6cd8..7340e66f38d2 100644 --- a/php/php.blade/manifest.mf +++ b/php/php.blade/manifest.mf @@ -3,5 +3,5 @@ AutoUpdate-Show-In-Client: true OpenIDE-Module: org.netbeans.modules.php.blade/1 OpenIDE-Module-Layer: org/netbeans/modules/php/blade/resources/layer.xml OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/php/blade/resources/Bundle.properties -OpenIDE-Module-Specification-Version: 1.00 +OpenIDE-Module-Specification-Version: 1.0.0 diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml index 5192db4365eb..68d3e31e54b9 100644 --- a/php/php.blade/nbproject/project.xml +++ b/php/php.blade/nbproject/project.xml @@ -409,38 +409,7 @@ - - org.netbeans.modules.php.blade.csl.elements - org.netbeans.modules.php.blade.editor - org.netbeans.modules.php.blade.editor.actions - org.netbeans.modules.php.blade.editor.cache - org.netbeans.modules.php.blade.editor.completion - org.netbeans.modules.php.blade.editor.components - org.netbeans.modules.php.blade.editor.components.annotation - org.netbeans.modules.php.blade.editor.declaration - org.netbeans.modules.php.blade.editor.directives - org.netbeans.modules.php.blade.editor.embedding - org.netbeans.modules.php.blade.editor.format - org.netbeans.modules.php.blade.editor.highlighting - org.netbeans.modules.php.blade.editor.hints - org.netbeans.modules.php.blade.editor.indexing - org.netbeans.modules.php.blade.editor.lexer - org.netbeans.modules.php.blade.editor.navigator - org.netbeans.modules.php.blade.editor.parser - org.netbeans.modules.php.blade.editor.path - org.netbeans.modules.php.blade.editor.preferences - org.netbeans.modules.php.blade.editor.refactoring - org.netbeans.modules.php.blade.editor.tools - org.netbeans.modules.php.blade.editor.typinghooks - org.netbeans.modules.php.blade.editor.ui.customizer - org.netbeans.modules.php.blade.editor.ui.wizard - org.netbeans.modules.php.blade.project - org.netbeans.modules.php.blade.syntax - org.netbeans.modules.php.blade.syntax.annotation - org.netbeans.modules.php.blade.syntax.antlr4.formatter - org.netbeans.modules.php.blade.syntax.antlr4.v10 - org.netbeans.modules.php.blade.syntax.antlr4.v10.compiler - + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index cc1db9895a4d..3ba5e6a1f16f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -77,9 +77,10 @@ public int[] findOrigin() throws InterruptedException, BadLocationException { String tokenText = originToken.getText(); - if (!tokenText.startsWith("@") - && !tokenText.startsWith("{") - && !tokenText.endsWith("}")) { + if (!tokenText.startsWith("@") // NOI18N + && !tokenText.startsWith("{") // NOI18N + && !tokenText.endsWith("}")) // NOI18N + { return result; } @@ -146,7 +147,8 @@ public BraceDirectionType findBraceDirectionType(String tokenText, Token token) return BraceDirectionType.CURLY_START_TO_END; } - if (tokenText.startsWith("@end") || tokenText.equals("@show")) { + if (tokenText.startsWith(BladeDirectivesUtils.END_DIRECTIVE_PREFIX) || + tokenText.equals(BladeDirectivesUtils.DIRECTIVE_SHOW)) { return BraceDirectionType.END_TO_START; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index c8458a073ba0..ac8239181495 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.editor.completion; import java.util.ArrayList; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java index 3f8640b1b1db..67cda30fe116 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.editor.highlighting; import javax.swing.text.AbstractDocument; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java index b81d5b06d98f..3752ee15ad56 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.editor.highlighting; import javax.swing.text.AbstractDocument; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java index e3e1117c2e9f..52767eb34478 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.swing.text.BadLocationException; import org.netbeans.api.editor.document.EditorDocumentUtils; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.Error; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties index f00205e51804..21a228e9af98 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties @@ -1,3 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. OpenIDE-Module-Display-Category=PHP OpenIDE-Module-Long-Description=\ Support for Blade template syntax for PHP.\n\ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml index b6c971c83ad9..f775d62fc08c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml @@ -1,4 +1,24 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml index d0e7152241f8..65f2c52db668 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml @@ -1,6 +1,26 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 7886b57b7f4b..b46c3c1a4f78 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -25,11 +25,17 @@ * * @author bhaidu */ -public class BladeDirectivesUtils { +public final class BladeDirectivesUtils { + public static final String END_DIRECTIVE_PREFIX = "@end"; // NOI18N + public static final String DIRECTIVE_SECTION = "@section"; // NOI18N + public static final String DIRECTIVE_SHOW = "@show"; // NOI18N + public static final String DIRECTIVE_STOP = "@stop"; // NOI18N + public static final String DIRECTIVE_APPEND = "@append"; // NOI18N + public static String[] directiveStart2EndPair(String directive){ - if (directive.equals("@section")){ - return new String[]{"@endsection", "@show", "@stop", "@append"}; + if (directive.equals(DIRECTIVE_SECTION)){ + return new String[]{"@endsection", DIRECTIVE_SHOW, DIRECTIVE_STOP, DIRECTIVE_APPEND}; } DirectivesList listClass = new DirectivesList(); for (Directive directiveEl : listClass.getDirectives()){ @@ -50,10 +56,10 @@ public static String[] directiveEnd2StartPair(String directive){ case "@endif": return new String[]{"@if", "@hasSection", "@sectionMissing"}; case "@endsection": - case "@stop": - case "@append": - case "@show": - return new String[]{"@section"}; + case DIRECTIVE_APPEND: + case DIRECTIVE_STOP: + case DIRECTIVE_SHOW: + return new String[]{DIRECTIVE_SECTION}; } DirectivesList listClass = new DirectivesList(); for (Directive directiveEl : listClass.getDirectives()){ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 index b2950e97c9e6..f52cc8168ef5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 @@ -1,7 +1,43 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeAntlrFormatterLexer; @header{ - package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.formatter; } options { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 index 7de7b9840ded..b915b9c25d0b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 @@ -1,7 +1,25 @@ parser grammar BladeAntlrFormatterParser; @header{ - package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.formatter; } options { tokenVocab = BladeAntlrFormatterLexer; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java index a923d32b2c8c..36923de2fb18 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java @@ -1,9 +1,23 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.formatter; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Token; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index 27a260f73fa7..0955308d73e5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -1,7 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeAntlrColoringLexer; import BladeColoringCommonLexer; @header{ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index a88de8e22777..2a9635e5c4df 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -1,8 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeAntlrLexer; import BladeCommonLexer; @header{ - package org.netbeans.modules.php.blade.syntax.antlr4.v10; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.netbeans.modules.php.blade.syntax.antlr4.v10; } options { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 index d3121117c97a..6e285b0d9312 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -1,15 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ parser grammar BladeAntlrParser; @header{ - /** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - package org.netbeans.modules.php.blade.syntax.antlr4.v10; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +/** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ } @parser::members {public static int bladeVersion = 10;} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java index e0cbcd1ab281..47a886fa710f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -1,5 +1,20 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 index f79431ab19e2..5fe43ce485d2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 @@ -1,3 +1,21 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeCommonLexer; tokens { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 index 853121caac06..e54c30072a04 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 @@ -1,3 +1,21 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeCommonLexer; tokens { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java index 9700d68dea3c..8dde751fa163 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -1,5 +1,20 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java index c733cfe0e7c0..45188124859c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java @@ -1,5 +1,20 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java index 7b9c05f95fa4..ca6bbd80d2da 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java @@ -1,5 +1,20 @@ /* -Licensed to the Apache Software Foundation (ASF) + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.ui.options; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java index 772608815ff8..8b6edf154758 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java @@ -1,5 +1,20 @@ /* -Licensed to the Apache Software Foundation (ASF) + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.ui.options; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties index 22a91f094ade..0094b70d270d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties @@ -1,3 +1,18 @@ - +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. BladeOptionsPanel.jLabel1.text=Blade BladeOptionsPanel.auto_tag_completion.text=Auto tag completion ("{{ }}", "{!! !!}", "{{-- --}}") diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java index c5f3fb680ddd..0b99deee6f93 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.ByteArrayInputStream; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java index f23bc0f0f853..bdef2ab6bb9b 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.File; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java index 83f87733ebf6..13923a4bf3f6 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.File; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java index c05053ebf87b..885de18ce54f 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import org.junit.Test; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java index 2745fbca6681..4ad3b7ed21c0 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import org.junit.Test; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java index 9c7ee6071d11..1b9e8a885891 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import org.junit.Test; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java index 28ce701c61e1..0cbd29122d83 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.File; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java index fb495a7370ff..a33a082e1d53 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.BufferedReader; diff --git a/php/php.editor/nbproject/project.xml b/php/php.editor/nbproject/project.xml index 57f41fd79e05..370f9b65f1ef 100644 --- a/php/php.editor/nbproject/project.xml +++ b/php/php.editor/nbproject/project.xml @@ -601,11 +601,10 @@ org.cakephp.netbeans org.nbphpcouncil.modules.php.yii org.netbeans.modules.php.dbgp - org.netbeans.modules.php.blade + org.netbeans.modules.php.blade org.netbeans.modules.php.nette org.netbeans.modules.php.prado org.netbeans.modules.php.refactoring - org.netbeans.modules.php.laravel org.netbeans.modules.php.smarty org.netbeans.modules.php.symfony org.netbeans.modules.php.zend From 37b8bc9fb0c282f66b3d990c624b8dc122082ad0 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sun, 4 Aug 2024 10:15:32 +0300 Subject: [PATCH 03/21] image license, use a fallback blade icon, license on generated lexer, parser files, // NOI18N comments --- php/php.blade/licenseinfo.xml | 45 ++++++++++++++++++ .../php/blade/csl/elements/NamedElement.java | 2 - .../csl/elements/PhpFunctionElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 3 +- .../blade/editor/BladeDeclarationFinder.java | 19 ++++---- .../php/blade/editor/EditorStringUtils.java | 32 +++++++++---- .../blade/editor/HyperlinkProviderImpl.java | 18 +++---- .../php/blade/editor/ResourceUtilities.java | 8 +++- .../editor/actions/AntlrDebugAction.java | 2 +- .../php/blade/editor/actions/FindUsage.java | 2 +- .../php/blade/editor/cache/QueryCache.java | 6 +-- .../completion/BladeCompletionHandler.java | 7 +-- .../completion/BladeCompletionItem.java | 18 +++---- .../completion/BladeCompletionProposal.java | 6 +-- .../completion/BladeCompletionProvider.java | 4 +- .../BladePhpCompletionProvider.java | 14 +++--- .../completion/PhpCodeCompletionService.java | 5 +- .../AttributeCompletionService.java | 6 +-- .../ComponentsCompletionService.java | 14 +++--- .../components/annotation/Namespace.java | 2 +- .../modules/php/blade/resources/icon.png | Bin 973 -> 3207 bytes .../php/blade/resources/icons/blade_file.png | Bin 0 -> 3207 bytes .../php/blade/resources/icons/file.png | Bin 973 -> 0 bytes .../blade/resources/icons/laravel_badge.png | Bin 723 -> 0 bytes .../modules/php/blade/syntax/StringUtils.java | 3 +- .../blade/syntax/annotation/Directive.java | 18 +++++++ .../syntax/annotation/DirectiveRegister.java | 18 +++++++ .../php/blade/syntax/annotation/Tag.java | 18 +++++++ .../blade/syntax/annotation/TagRegister.java | 18 +++++++ .../formatter/BladeAntlrFormatterLexer.g4 | 2 +- .../formatter/BladeAntlrFormatterLexer.java | 20 +++++++- .../formatter/BladeAntlrFormatterParser.java | 20 +++++++- ...BladeAntlrFormatterParserBaseListener.java | 20 +++++++- .../BladeAntlrFormatterParserListener.java | 20 +++++++- .../antlr4/v10/BladeAntlrColoringLexer.java | 18 +++++++ .../syntax/antlr4/v10/BladeAntlrLexer.java | 21 +++++++- .../syntax/antlr4/v10/BladeAntlrParser.java | 37 ++++++++++---- .../v10/BladeAntlrParserBaseListener.java | 37 ++++++++++---- .../antlr4/v10/BladeAntlrParserListener.java | 37 ++++++++++---- 39 files changed, 411 insertions(+), 111 deletions(-) create mode 100644 php/php.blade/licenseinfo.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/blade_file.png delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png diff --git a/php/php.blade/licenseinfo.xml b/php/php.blade/licenseinfo.xml new file mode 100644 index 000000000000..68c1a44517b8 --- /dev/null +++ b/php/php.blade/licenseinfo.xml @@ -0,0 +1,45 @@ + + + + + src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php + + + + + tools/skeleton.netbeans + src/org/netbeans/modules/php/blade/resources/icon.png + src/org/netbeans/modules/php/blade/resources/icons/at.png + src/org/netbeans/modules/php/blade/resources/icons/at2.png + src/org/netbeans/modules/php/blade/resources/icons/at4.png + src/org/netbeans/modules/php/blade/resources/icons/blade_file.png + src/org/netbeans/modules/php/blade/resources/icons/layout.png + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 486dfac11b81..bd5e1820a1bc 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -42,14 +42,12 @@ public class NamedElement implements ElementHandle { protected final ElementType type; public NamedElement(String name, FileObject file) { - //we can add a file object from element this.name = name; this.file = file; this.type = ElementType.NA; } public NamedElement(String name, FileObject file, ElementType type) { - //we can add a file object from element this.name = name; this.file = file; this.type = type; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 23ee1ff1eaf4..f4d120fc59ea 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -28,8 +28,8 @@ */ public class PhpFunctionElement extends NamedElement { - public final List params; public final String namespace; + private final List params; public PhpFunctionElement(String name, FileObject file, ElementType type, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 3ba5e6a1f16f..6bd9177cb234 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -233,7 +233,8 @@ public int[] findDirectiveEnd(String directive) { } public int[] findCustomDirectiveEnd(String directive) { - String[] pair = new String[]{"@end" + directive.substring(1)}; + String endPrefix = "@end"; // NOI18N + String[] pair = new String[]{endPrefix + directive.substring(1)}; List stopDirectives = Arrays.asList(pair); List startDirectiveForBalance = Arrays.asList(new String[]{directive}); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index 8b505f0c8336..d5c0853524c8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -292,9 +292,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { String namespace = reference.namespace; if (namespace != null && reference.namespace.length() > 2) { - int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; indexClassResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, - reference.namespace.substring(subOffset, reference.namespace.length() - 1), + EditorStringUtils.trimNamespace(namespace), sourceFolder ); } else { @@ -315,10 +314,9 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { return location; } String queryNamespace = reference.namespace; + if (queryNamespace != null && queryNamespace.length() > 2) { - int subOffset = queryNamespace.startsWith("\\") ? 1 : 0; - int endOffset = queryNamespace.endsWith("\\") ? queryNamespace.length() - 1 : queryNamespace.length(); - queryNamespace = queryNamespace.substring(subOffset, endOffset); + queryNamespace = EditorStringUtils.trimNamespace(queryNamespace); } else { queryNamespace = null; } @@ -334,7 +332,9 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { indexResult.getClassNamespace(), indexResult.getParams() ); - DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation( + indexResult.declarationFile, + indexResult.getStartOffset(), resultHandle); if (location.equals(DeclarationLocation.NONE)) { location = functionLocation; } @@ -376,10 +376,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { case PHP_NAMESPACE_PATH_TYPE:{ Collection indexNamespaceResults; if (reference.namespace != null) { - int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; - String namespacePath = reference.namespace.substring(subOffset); indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, - namespacePath, + EditorStringUtils.trimNamespace(reference.namespace), sourceFolder ); for (PhpIndexResult indexResult : indexNamespaceResults) { @@ -395,7 +393,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { for (PhpIndexResult indexResult : indexNamespaceResults) { NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_NAMESPACE); - DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation( + indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); if (location.equals(DeclarationLocation.NONE)) { location = constantLocation; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java index dde99d415548..9bb9086e7e43 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -25,11 +25,16 @@ * * @author bhaidu */ -public class EditorStringUtils { +public final class EditorStringUtils { + + public static final String NAMESPACE_SEPARATOR = "\\"; // NOI18N + + private EditorStringUtils() { + } public static String implode(Collection items, String delimiter) { - Parameters.notNull("items", items); - Parameters.notNull("delimiter", delimiter); + Parameters.notNull("items", items); // NOI18N + Parameters.notNull("delimiter", delimiter); // NOI18N if (items.isEmpty()) { return ""; // NOI18N @@ -46,19 +51,26 @@ public static String implode(Collection items, String delimiter) { } return buffer.toString(); } - - public static boolean isQuotedString(String text){ - if (text.length() < 2){ + + public static boolean isQuotedString(String text) { + if (text.length() < 2) { return false; } - return (text.startsWith("'") && text.endsWith("'")) + return (text.startsWith("'") && text.endsWith("'")) || (text.startsWith("\"") && text.endsWith("\"")); } - public static String stripSurroundingQuotes(String text){ - if (!isQuotedString(text)){ + public static String stripSurroundingQuotes(String text) { + if (!isQuotedString(text)) { return text; } - return text.substring(1, text.length()-1); + return text.substring(1, text.length() - 1); + } + + public static String trimNamespace(String namespace) { + assert namespace.length() > 2; + int subOffset = namespace.startsWith(NAMESPACE_SEPARATOR) ? 1 : 0; + int endOffset = namespace.endsWith(NAMESPACE_SEPARATOR) ? 1 : 0; + return namespace.substring(subOffset, namespace.length() - endOffset); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 2622a72cd93d..045d0a00b458 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -51,12 +51,12 @@ @MimeRegistration(mimeType = "text/x-php5", service = HyperlinkProviderExt.class) public class HyperlinkProviderImpl implements HyperlinkProviderExt { - String methodName; - String identifiableText; - String tooltipText = ""; - FileObject goToFile; - int goToOffset = 0; - int triggeredEvent = 0; + private String methodName; + private String identifiableText; + private String tooltipText = ""; + private FileObject goToFile; + private int goToOffset = 0; + private int triggeredEvent = 0; public enum DeclarationType { VIEW_PATH; @@ -159,9 +159,9 @@ public void performClickAction(Document doc, int offset, HyperlinkType type) { switch (type) { case GO_TO_DECLARATION: switch (methodName) { - case "view": - case "make": - case "render": + case "view": // NOI18N + case "make": // NOI18N + case "render": // NOI18N if (goToFile != null) { openDocument(goToFile, goToOffset); triggeredEvent++; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index 3849adeacd71..b06046848da8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -19,16 +19,22 @@ package org.netbeans.modules.php.blade.editor; import javax.swing.ImageIcon; +import org.netbeans.api.annotations.common.CheckForNull; import org.openide.util.ImageUtilities; /** * * @author bhaidu */ -public class ResourceUtilities { +public final class ResourceUtilities { public static final String ICON_BASE = "org/netbeans/modules/php/blade/resources/"; //NOI18N + + private ResourceUtilities(){ + + } + @CheckForNull public static ImageIcon loadResourceIcon(String path){ return ImageUtilities.loadImageIcon(ICON_BASE + path, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java index d17b3f7ac7ee..55e012d7c437 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java @@ -48,7 +48,7 @@ @ActionRegistration(displayName = "Antlr Debug", lazy=false) public class AntlrDebugAction extends AbstractAction implements ContextAwareAction, Presenter.Popup { - Node node; + private Node node; public void setNode(Node node){ this.node = node; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java index b39b89ece9ec..62d1715761c8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java @@ -40,7 +40,7 @@ @ActionRegistration(displayName = "Template Usages") public class FindUsage extends AbstractAction implements ActionListener { - Node node; + private final Node node; public FindUsage(Node node) { this.node = node; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java index f4fab33a8324..e6568f2153b0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java @@ -30,12 +30,12 @@ * * @author bogdan */ -public class QueryCache { +public final class QueryCache { public static final Long DEFAULT_CACHE_TIMEOUT = 60000L; - protected Map> cacheMap; - protected Long cacheTimeout; + private Map> cacheMap; + private Long cacheTimeout; //private static final Map QUERY_SUPPORT_INDEX = new WeakHashMap<>(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index 474342ee41e9..84f50ae68c4f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -105,7 +105,8 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { String tokenText = currentToken.getText(); FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); //D_UNKNOWN_ATTR_ENC hack to fix completion not triggered in html embedded text - if (tokenText.startsWith("@") && currentToken.getType() != D_UNKNOWN_ATTR_ENC) { + if (tokenText.startsWith("@") // NOI18N + && currentToken.getType() != D_UNKNOWN_ATTR_ENC) { completeDirectives(completionProposals, completionContext, fo, currentToken); } else { if (prefix.length() == 1) { @@ -174,7 +175,7 @@ private void completeScopedVariables(final List completionPr request.carretOffset = completionContext.getCaretOffset(); request.prefix = variablePrefix; if ("$loop".startsWith(variablePrefix)) { - String variableName = "$loop"; + String variableName = "$loop"; // NOI18N NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); } @@ -276,7 +277,7 @@ public CodeCompletionHandler.QueryType getAutoQuery(JTextComponent component, St return CodeCompletionHandler.QueryType.NONE; } - if (typedText.startsWith("@")) { + if (typedText.startsWith("@")) { // NOI18N return CodeCompletionHandler.QueryType.ALL_COMPLETION; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index 563f0a23194c..90fd15cb90a7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -245,7 +245,7 @@ protected String getRightHtmlText() { @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + String path = ResourceUtilities.ICON_BASE + "icons/at.png"; //NOI18N return ImageUtilities.loadImageIcon(path, false); } } @@ -259,11 +259,11 @@ public DirectiveWithArg(String directive, int substitutionOffset, @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})"; + String template = getItemText() + "($$${arg})"; // NOI18N switch (text){ - case "@include": - case "@extends": - template = getItemText() + "('${path}')"; + case "@include": // NOI18N + case "@extends": // NOI18N + template = getItemText() + "('${path}')"; // NOI18N break; } return template; @@ -332,11 +332,11 @@ public BlockDirectiveWithArg(String directive, String endTag, int substitutionOf @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; + String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; // NOI18N switch (text){ case "@foreach": - template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; + template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; // NOI18N break; } @@ -365,7 +365,7 @@ public ViewPath(String name, int substitutionOffset, @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/file.png"; + String path = ResourceUtilities.ICON_BASE + "icons/blade_file.png"; // NOI18N if (isFolder) { path = "org/openide/loaders/defaultFolder.gif";//NOI18N } @@ -374,7 +374,7 @@ protected ImageIcon getIcon() { @Override protected String getRightHtmlText() { - int viewsPos = filePath.indexOf("/views/"); + int viewsPos = filePath.indexOf("/views/"); // NOI18N return filePath.substring(viewsPos, filePath.length()); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 138798b37af0..3cf295170969 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -453,11 +453,11 @@ public String getCustomInsertTemplate() { String template = getName() + "($$${arg})\n ${cursor}\n" + directive.endtag(); switch (getName()) { - case "@foreach": + case "@foreach": // NOI18N template = getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + directive.endtag(); break; - case "@section": - case "@session": + case "@section": // NOI18N + case "@session": // NOI18N template = getName() + "('${id}')\n ${cursor}\n" + directive.endtag(); break; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index 89700f37392d..c7949012c364 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -171,7 +171,7 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse if ("livewire".startsWith(nText)) { //quick implementation //?? - addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); + addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); // NOI18N } break; case HTML_COMPONENT_PREFIX: @@ -299,7 +299,7 @@ private static String getReferenceIcon(CompletionType type) { case YIELD_ID: return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N } - return ResourceUtilities.ICON_BASE + "icons/at.png"; + return ResourceUtilities.ICON_BASE + "icons/at.png"; // NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 23c541dc059c..53faeeb1d8d4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -58,14 +58,14 @@ * @author bhaidu */ @MimeRegistrations(value = { - @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), // @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class, position = 105), + @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), } ) public class BladePhpCompletionProvider implements CompletionProvider { private static final Logger LOGGER = Logger.getLogger(BladePhpCompletionProvider.class.getName()); - public static final String JS_ASSET_FOLDER = "resources/js"; - public static final String CSS_ASSET_FOLDER = "resources/css"; + public static final String JS_ASSET_FOLDER = "resources/js"; // NOI18N + public static final String CSS_ASSET_FOLDER = "resources/css"; // NOI18N public enum CompletionType { BLADE_PATH, @@ -342,7 +342,7 @@ private void addYieldIdCompletionItem(String identifier, FileObject fo, int caretOffset, CompletionResultSet resultSet) { String filePath = fo.getPath(); - int viewsPos = filePath.indexOf("/views/"); + int viewsPos = filePath.indexOf("/views/"); // NOI18N CompletionItem item = CompletionUtilities.newCompletionItemBuilder(identifier) .iconResource(getReferenceIcon(CompletionType.YIELD_ID)) @@ -370,11 +370,11 @@ private static String getReferenceIcon(CompletionType type) { switch (type) { case FOLDER: - return "org/openide/loaders/defaultFolder.gif"; + return "org/openide/loaders/defaultFolder.gif"; // NOI18N case CSS_FILE: - return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; + return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; // NOI18N case JS_FILE: - return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; + return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; // NOI18N } return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index ac8239181495..1d3c146ee7f1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -32,6 +32,7 @@ import org.netbeans.modules.php.blade.csl.elements.ClassElement; import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; import static org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler.completionRequest; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; @@ -237,7 +238,7 @@ private static void completeNamespace(String prefix, int offset, final List completionProposals, FileObject fo) { - if (!prefix.startsWith("\\") && !Character.isUpperCase(prefix.charAt(0))) { + if (!prefix.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) && !Character.isUpperCase(prefix.charAt(0))) { //skip lowercase string from namespce search return; } @@ -247,7 +248,7 @@ private static void completeNamespace(String prefix, int offset, if (projectOwner == null) { return; } - int substringOffset = prefix.startsWith("\\") ? 1 : 0; + int substringOffset = prefix.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; Collection indexClassResults = PhpIndexUtils.queryNamespace( projectOwner.getProjectDirectory(), prefix.substring(substringOffset) ); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java index 499042ed1753..a7e005c2d528 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java @@ -28,9 +28,9 @@ * @author bhaidu */ @AttributeRegister({ - @Attribute(name = "class"), - @Attribute(name = "id"), - @Attribute(name = "title"), + @Attribute(name = "class"), // NOI18N + @Attribute(name = "id"), // NOI18N + @Attribute(name = "title"), // NOI18N }) public class AttributeCompletionService { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java index 39ba9ef68b4d..09f460f93124 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -34,13 +34,13 @@ * @author bhaidu */ @NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), - @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), - @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"),//from 10 - @Namespace(path = "Illuminate\\Console\\View\\Components"), - @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), - @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), - @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), + @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), // NOI18N + @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), // NOI18N + @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"), // NOI18N + @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N + @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N + @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N + @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N }) public class ComponentsCompletionService { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java index dff6931bb05a..7988f90d1aa9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java @@ -25,7 +25,7 @@ public @interface Namespace { String path(); String relativeFilePath() default ""; - String packageName() default "blade"; + String packageName() default "blade"; // NOI18N //inside App folder boolean from_app() default false; boolean from_vendor() default true; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png index 87ced4a74a8a75f28331705a6c368f8654294233..4e24f58cf55c5c83268b82e233a9162c452440a5 100644 GIT binary patch literal 3207 zcmV;240!X2P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00059Nkl$8pqpq= z5QkFg)PFie+u)FPC^!g(40UW*-xEWe`XUm1eMw*5I}Y-0^Wuxe9{BF%yWhRvIh=Eq zh!Dp7i`OTlD|uLgWjJ^1bfF;!EvN);6}K?FX{*t}OY&;$)|h z(U~;}0)G5Dj)mQ5(meJ!{OK?;K1Moqr9As|L7PR5d>^HV2heJH)Eh4KhD&aA6yNj8 z;oHQ6$CtFx#eq2trDA(zD23y?EU&%MXKl{|Kq*C{^RnOedm5cfB)FBmL96KkaQ;Fc zo23t0SDVuhCB3_^530Fg(!2XqbHf0{X|a57Fe^u$`^Qz_CbNv2Zd zYpoXHJ*Rf+l)AVYyWJ1Kr=3Q6eCqDEg_i|v+y1NkWHO0u+j<9h^86Ja%kPJPsx|@` txO`9kx6!5bB?Ux(c4>X-`dKIUdjKZ2B|HKh0MGyc002ovPDHLkV1i8F13v%& literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/blade_file.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/blade_file.png new file mode 100644 index 0000000000000000000000000000000000000000..4e24f58cf55c5c83268b82e233a9162c452440a5 GIT binary patch literal 3207 zcmV;240!X2P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00059Nkl$8pqpq= z5QkFg)PFie+u)FPC^!g(40UW*-xEWe`XUm1eMw*5I}Y-0^Wuxe9{BF%yWhRvIh=Eq zh!Dp7i`OTlD|uLgWjJ^1bfF;!EvN);6}K?FX{*t}OY&;$)|h z(U~;}0)G5Dj)mQ5(meJ!{OK?;K1Moqr9As|L7PR5d>^HV2heJH)Eh4KhD&aA6yNj8 z;oHQ6$CtFx#eq2trDA(zD23y?EU&%MXKl{|Kq*C{^RnOedm5cfB)FBmL96KkaQ;Fc zo23t0SDVuhCB3_^530Fg(!2XqbHf0{X|a57Fe^u$`^Qz_CbNv2Zd zYpoXHJ*Rf+l)AVYyWJ1Kr=3Q6eCqDEg_i|v+y1NkWHO0u+j<9h^86Ja%kPJPsx|@` txO`9kx6!5bB?Ux(c4>X-`dKIUdjKZ2B|HKh0MGyc002ovPDHLkV1i8F13v%& literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png deleted file mode 100644 index 87ced4a74a8a75f28331705a6c368f8654294233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png deleted file mode 100644 index fc7b7ccb1428036113de07951cbb9b8b27e86430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmV;^0xbQBP)EX>4Tx04UFukxM8&YTEi`ZIrZQ)+w*0}9RzBZHR zxZ-uic52o7xu<$z-I6msrF5Asj55XqljxYNvOSI+l84}JgZ2+AMf!YTOE2Qct1daj_g z?nA={oLv?)a~sY#q4^u93o(cLR@(rYca=WRGAdvt7010qNS#tmY4#WTe4#WYKD-Ig~000JJOGiWi z8vq*s8+2uukpKVy2XskIMF-{r8WspK$N}S20002eNkl-NgPj*&Vcs}GI?)k>oxek zAq2&?&)D4$OveyUz)j4M9rJL}(1X Date: Mon, 5 Aug 2024 06:58:28 +0300 Subject: [PATCH 04/21] remove laravel from friend package list, move icon path in ResourceUtilities, remove unused function, add better return values for queryUtils methods, refactor editorUtils, utils class adjusments --- php/php.api.framework/nbproject/project.xml | 1 - php/php.api.phpmodule/nbproject/project.xml | 1 - php/php.blade/nbproject/project.properties | 1 + .../php/blade/csl/elements/NamedElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 28 +++--- .../blade/editor/BladeDeclarationFinder.java | 4 +- .../php/blade/editor/EditorStringUtils.java | 24 +---- .../modules/php/blade/editor/EditorUtils.java | 55 +++++++++++ .../blade/editor/HyperlinkProviderImpl.java | 4 +- .../php/blade/editor/ResourceUtilities.java | 11 +++ .../completion/BladeCompletionItem.java | 8 +- .../completion/BladeCompletionProposal.java | 2 +- .../completion/BladeCompletionProvider.java | 6 +- .../BladePhpCompletionProvider.java | 4 +- .../php/blade/editor/indexing/BladeIndex.java | 14 +++ .../blade/editor/indexing/PhpIndexUtils.java | 97 ++++++++++--------- .../php/blade/editor/indexing/QueryUtils.java | 33 +++---- .../blade/editor/lexer/BladeLexerUtils.java | 20 ++-- .../{EditorUtils.java => PHPLexerUtils.java} | 28 ++---- .../editor/navigator/BladeStructureItem.java | 4 +- .../php/blade/editor/parser/ParsingUtils.java | 23 +---- .../php/blade/editor/path/BladePathUtils.java | 54 ++++++----- .../preferences/GeneralPreferencesUtils.java | 7 +- .../php/blade/project/ProjectUtils.java | 14 ++- .../modules/php/blade/syntax/StringUtils.java | 6 +- .../syntax/antlr4/v10/BladeAntlrUtils.java | 16 +-- 26 files changed, 259 insertions(+), 208 deletions(-) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java rename php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/{EditorUtils.java => PHPLexerUtils.java} (69%) diff --git a/php/php.api.framework/nbproject/project.xml b/php/php.api.framework/nbproject/project.xml index 4cb2d522126e..4dcdf5329791 100644 --- a/php/php.api.framework/nbproject/project.xml +++ b/php/php.api.framework/nbproject/project.xml @@ -167,7 +167,6 @@ org.netbeans.modules.php.cake3 org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.fuel - org.netbeans.modules.php.laravel org.netbeans.modules.php.nette2 org.netbeans.modules.php.project org.netbeans.modules.php.smarty diff --git a/php/php.api.phpmodule/nbproject/project.xml b/php/php.api.phpmodule/nbproject/project.xml index 06e9293ecbca..20b8466b0815 100644 --- a/php/php.api.phpmodule/nbproject/project.xml +++ b/php/php.api.phpmodule/nbproject/project.xml @@ -249,7 +249,6 @@ org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.editor org.netbeans.modules.php.fuel - org.netbeans.modules.php.laravel org.netbeans.modules.php.nette org.netbeans.modules.php.nette.tester org.netbeans.modules.php.nette2 diff --git a/php/php.blade/nbproject/project.properties b/php/php.blade/nbproject/project.properties index a18d0ebbe0ed..d4476f1c745e 100644 --- a/php/php.blade/nbproject/project.properties +++ b/php/php.blade/nbproject/project.properties @@ -18,3 +18,4 @@ javac.source=1.8 javac.compilerargs=-Xlint -Xlint:-serial spec.version.base.fatal.warning=false +javac.release=17 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index bd5e1820a1bc..1660b48fffb5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -70,7 +70,7 @@ public String getName() { @Override public String getIn() { - return ""; + return ""; // NOI18N } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 6bd9177cb234..995f7e3bcabe 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -99,36 +99,36 @@ public int[] findOrigin() throws InterruptedException, BadLocationException { @Override public int[] findMatches() throws InterruptedException, BadLocationException { - int[] result = null; if (originToken == null) { - return result; + return null; } String tokenText = originToken.getText(); switch (currentDirection) { - case CURLY_START_TO_END: + case CURLY_START_TO_END -> { return findCloseTag(); - case CURLY_END_TO_START: + } + case CURLY_END_TO_START -> { return findOpenTag(); - case START_TO_END: + } + case START_TO_END -> { return findDirectiveEnd(tokenText); - case CUSTOM_START_TO_END: + } + case CUSTOM_START_TO_END -> { return findCustomDirectiveEnd(tokenText); - case END_TO_START: + } + case END_TO_START -> { return findOriginForDirectiveEnd(tokenText); + } + default -> { return null;} } - - return result; } private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { switch (currentToken.getType()) { - case HTML: - case PHP_EXPRESSION: - case AT: - case BLADE_COMMENT: - case ERROR: + case HTML, PHP_EXPRESSION, AT, BLADE_COMMENT, ERROR -> { return false; + } } return true; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index d5c0853524c8..a530258e7cd5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -118,7 +118,7 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { } if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { - List tokensToMatch = BladeLexerUtils.tokensWithIdentifiableParam(); + List tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; List tokensStop = Arrays.asList(new Integer[]{HTML}); org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); int offsetCorrection = caretOffset - lineOffset; @@ -248,7 +248,7 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { case PUSH_IF: case PREPEND: String stackId = referenceIdentifier; - List stacks = QueryUtils.queryStacksReferences(stackId, currentFile); + List stacks = QueryUtils.findStacksReferences(stackId, currentFile); if (stacks == null) { return DeclarationLocation.NONE; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java index 9bb9086e7e43..3fde6c8b3ef9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -32,32 +32,12 @@ public final class EditorStringUtils { private EditorStringUtils() { } - public static String implode(Collection items, String delimiter) { - Parameters.notNull("items", items); // NOI18N - Parameters.notNull("delimiter", delimiter); // NOI18N - - if (items.isEmpty()) { - return ""; // NOI18N - } - - StringBuilder buffer = new StringBuilder(200); - boolean first = true; - for (String s : items) { - if (!first) { - buffer.append(delimiter); - } - buffer.append(s); - first = false; - } - return buffer.toString(); - } - public static boolean isQuotedString(String text) { if (text.length() < 2) { return false; } - return (text.startsWith("'") && text.endsWith("'")) - || (text.startsWith("\"") && text.endsWith("\"")); + return (text.startsWith("'") && text.endsWith("'")) // NOI18N + || (text.startsWith("\"") && text.endsWith("\"")); // NOI18N } public static String stripSurroundingQuotes(String text) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java new file mode 100644 index 000000000000..f504563d315b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import javax.swing.text.Document; +import org.netbeans.api.annotations.common.CheckForNull; +import org.netbeans.api.project.Project; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public final class EditorUtils { + + private EditorUtils() { + } + + @CheckForNull + public static FileObject getFileObjectFromDoc(Document doc) { + DataObject dObject = NbEditorUtilities.getDataObject(doc); + if (dObject != null) { + return dObject.getPrimaryFile().getParent(); + } + return null; + } + + @CheckForNull + public static Project getProjectOwner(Document doc) { + FileObject file = getFileObjectFromDoc(doc); + if (file == null) { + return null; + } + return ProjectUtils.getMainOwner(file); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 045d0a00b458..ac8c3f343cb7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -33,7 +33,7 @@ import org.netbeans.api.lexer.TokenSequence; import org.netbeans.api.project.Project; import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.php.blade.editor.lexer.EditorUtils; +import org.netbeans.modules.php.blade.editor.lexer.PHPLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.modules.php.editor.lexer.PHPTokenId; @@ -87,7 +87,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { BaseDocument baseDoc = (BaseDocument) doc; int lineStart = LineDocumentUtils.getLineStart(baseDoc, offset); - TokenSequence tokensq = EditorUtils.getTokenSequence(doc, offset); + TokenSequence tokensq = PHPLexerUtils.getTokenSequence(doc, offset); if (tokensq == null) { return null; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index b06046848da8..67c5e8ee90dd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -28,7 +28,13 @@ */ public final class ResourceUtilities { + public static final String FOLDER = "org/openide/loaders/defaultFolder.gif";//NOI18N public static final String ICON_BASE = "org/netbeans/modules/php/blade/resources/"; //NOI18N + public static final String DIRECTIVE_ICON = ICON_BASE + "icons/at.png"; //NOI18N + public static final String BLADE_VIEW = ICON_BASE + "icons/blade_file.png"; //NOI18N + public static final String LAYOUT_IDENTIFIER = ICON_BASE + "icons/layout.png"; //NOI18N + public static final String COMPONENT_TAG = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N + private ResourceUtilities(){ @@ -38,4 +44,9 @@ private ResourceUtilities(){ public static ImageIcon loadResourceIcon(String path){ return ImageUtilities.loadImageIcon(ICON_BASE + path, false); } + + @CheckForNull + public static ImageIcon loadLayoutIcon(){ + return ImageUtilities.loadImageIcon(LAYOUT_IDENTIFIER, false); + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index 90fd15cb90a7..be17635232b7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -245,7 +245,7 @@ protected String getRightHtmlText() { @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png"; //NOI18N + String path = ResourceUtilities.DIRECTIVE_ICON; return ImageUtilities.loadImageIcon(path, false); } } @@ -312,7 +312,7 @@ protected String getRightHtmlText() { @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + String path = ResourceUtilities.DIRECTIVE_ICON; return ImageUtilities.loadImageIcon(path, false); } @@ -365,9 +365,9 @@ public ViewPath(String name, int substitutionOffset, @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/blade_file.png"; // NOI18N + String path = ResourceUtilities.BLADE_VIEW; if (isFolder) { - path = "org/openide/loaders/defaultFolder.gif";//NOI18N + path = ResourceUtilities.FOLDER; } return ImageUtilities.loadImageIcon(path, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 3cf295170969..b4566b493a57 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -353,7 +353,7 @@ public DirectiveProposal(ElementHandle element, CompletionRequest request, Strin @Override public ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + String path = ResourceUtilities.DIRECTIVE_ICON; return ImageUtilities.loadImageIcon(path, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index c7949012c364..b76830d256f6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -295,11 +295,11 @@ private void addComponentIdCompletionItem(PhpIndexResult indexReference, private static String getReferenceIcon(CompletionType type) { switch (type) { case HTML_COMPONENT_TAG: - return "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N + return ResourceUtilities.COMPONENT_TAG; case YIELD_ID: - return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + return ResourceUtilities.LAYOUT_IDENTIFIER; } - return ResourceUtilities.ICON_BASE + "icons/at.png"; // NOI18N + return ResourceUtilities.DIRECTIVE_ICON; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 53faeeb1d8d4..92529fe16625 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -370,13 +370,13 @@ private static String getReferenceIcon(CompletionType type) { switch (type) { case FOLDER: - return "org/openide/loaders/defaultFolder.gif"; // NOI18N + return ResourceUtilities.FOLDER; // NOI18N case CSS_FILE: return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; // NOI18N case JS_FILE: return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; // NOI18N } - return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + return ResourceUtilities.LAYOUT_IDENTIFIER; //NOI18N } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java index d9db8d33a07f..4859e7f55b18 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java @@ -179,6 +179,20 @@ public Reference createIndexReference(String value) { } ); } + + public List findStackIdIndexedReferences(String prefix) { + return findIndexedReferences(prefix, + BladeIndexer.STACK_ID, + new String[]{BladeIndexer.STACK_ID, BladeIndexer.STACK_REFERENCE}, + BladeIndexer.STACK_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractStackDataFromIndex(value); + } + } + ); + } private List findIndexedReferences(String prefix, String indexKey, String[] valuesKeys, String valueKey, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java index 9513b7f7da95..a363b5d8d009 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -41,13 +41,17 @@ * * @author bhaidu */ -public class PhpIndexUtils { +public final class PhpIndexUtils { private final static QueryCache> cache = new QueryCache(); private final static QueryCache> functionCache = new QueryCache(); private static final Map QUERY_SUPPORT_INSTANCES = new WeakHashMap<>(); + private PhpIndexUtils() { + + } + /** * class query without namespace * @@ -127,7 +131,7 @@ public static Collection queryNamespaceClassesName(String prefix } return results; } - + public static Collection queryExactNamespaceClasses(String identifier, String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -135,23 +139,23 @@ public static Collection queryExactNamespaceClasses(String ident try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, new String[]{ PHPIndexer.FIELD_NAMESPACE }); for (IndexResult indexResult : indexResults) { FileObject indexFile = indexResult.getFile(); - - if (!indexFile.getName().equals(identifier)){ + + if (!indexFile.getName().equals(identifier)) { continue; } - + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); - - if (namespaceValue == null){ + + if (namespaceValue == null) { continue; } - + results.add(new PhpIndexResult(namespace + "\\" + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } catch (IOException ex) { @@ -159,7 +163,7 @@ public static Collection queryExactNamespaceClasses(String ident } return results; } - + public static Collection queryComponentClass(String identifier, String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -167,13 +171,13 @@ public static Collection queryComponentClass(String identifier, try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, new String[]{ PHPIndexer.FIELD_NAMESPACE }); for (IndexResult indexResult : indexResults) { String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); - if (namespaceValue == null){ + if (namespaceValue == null) { continue; } Signature sig = Signature.get(namespaceValue); @@ -320,23 +324,22 @@ public static Collection queryExactClassMethods(FileObje Signature sig = Signature.get(classValue); String name = sig.string(1); String namespace = sig.string(4); - if (name.length() > 0 && name.equals(className) - ) { - if (queryNamespace != null && !namespace.equals(queryNamespace)){ + if (name.length() > 0 && name.equals(className)) { + if (queryNamespace != null && !namespace.equals(queryNamespace)) { continue; } classSignature = sig; - - if (namespace.length() > 0){ + + if (namespace.length() > 0) { classNamespace = namespace + "\\" + className; } } } - - if (classSignature == null){ + + if (classSignature == null) { continue; } - + String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); for (String value : values) { Signature sig = Signature.get(value); @@ -359,9 +362,9 @@ public static Collection queryExactClassMethods(FileObje } return results; } - + /** - * + * * * @param fo * @param method @@ -374,10 +377,10 @@ public static Collection queryClassMethods(FileObject fo QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - if (queryNamespace != null && queryNamespace.length() > 3){ + if (queryNamespace != null && queryNamespace.length() > 3) { int startOffset = queryNamespace.startsWith("\\") ? 1 : 0; int endOffset = queryNamespace.endsWith("\\") ? 1 : 0; - queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); + queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); } //should query the class befoe //for the moment a quick hack @@ -399,19 +402,19 @@ public static Collection queryClassMethods(FileObject fo if (name.length() > 0 && name.equals(className)) { classSignature = sig; String namespace = sig.string(4); - - if (queryNamespace != null && !namespace.equals(queryNamespace) ){ + + if (queryNamespace != null && !namespace.equals(queryNamespace)) { classSignature = null; continue; } - - if (namespace.length() > 0){ + + if (namespace.length() > 0) { classNamespace = namespace + "\\" + className; } } } - if (classSignature == null){ + if (classSignature == null) { continue; } @@ -464,7 +467,7 @@ public static Collection queryConstants(FileObject fo, String pr } return results; } - + public static Collection queryNamespace(FileObject fo, String prefix) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); @@ -473,11 +476,11 @@ public static Collection queryNamespace(FileObject fo, String pr //third signature namespace //the first el is the folder String originalPrefix = prefix; - + if (prefix.endsWith("\\\\")) { return results; } - + String[] queryItems = prefix.split("\\\\"); if (queryItems.length == 0) { @@ -524,7 +527,7 @@ public static Collection queryNamespace(FileObject fo, String pr } return results; } - + public static Collection queryNamespaces(FileObject fo, String namespace, QuerySupport.Kind queryType) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -533,7 +536,7 @@ public static Collection queryNamespaces(FileObject fo, String n try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL @@ -542,7 +545,7 @@ public static Collection queryNamespaces(FileObject fo, String n FileObject indexFile = indexResult.getFile(); String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); //no namespace found - if (namespaceValue == null){ + if (namespaceValue == null) { continue; } results.add(new PhpIndexResult(namespaceValue, indexFile, PhpIndexResult.Type.NAMESPACE, new OffsetRange(0, 1))); @@ -554,12 +557,12 @@ public static Collection queryNamespaces(FileObject fo, String n } /** - * a optimized hack solution - * assuming that the name of the class is the same with the file - * + * a optimized hack solution assuming that the name of the class is the same + * with the file + * * @param fo * @param namespace - * @return + * @return */ public static Collection queryAllNamespaceClasses(FileObject fo, String namespace) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -568,7 +571,7 @@ public static Collection queryAllNamespaceClasses(FileObject fo, try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.EXACT, + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.EXACT, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL @@ -577,7 +580,7 @@ public static Collection queryAllNamespaceClasses(FileObject fo, FileObject indexFile = indexResult.getFile(); String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); //no namespace found - if (namespaceValue == null){ + if (namespaceValue == null) { continue; } results.add(new PhpIndexResult(indexFile.getName(), indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); @@ -619,16 +622,16 @@ public static Collection queryClassConstants(FileObject fo, Stri } return results; } - + /** * @notused TO BE continued - * + * * @param fo * @param prefix * @param ownerClass - * @return + * @return */ - public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass){ + public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); String queryPrefix = prefix.toLowerCase(); @@ -743,9 +746,9 @@ static List parseParameters(final String signature) { /** * TODO improve the function param parsing - * + * * @param sig - * @return + * @return */ static String parseOneParameter(String sig) { String retval = null; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java index 4e7cb2972de2..777e52be6990 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java @@ -19,7 +19,9 @@ package org.netbeans.modules.php.blade.editor.indexing; import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.openide.filesystems.FileObject; @@ -29,43 +31,40 @@ * * @author bogdan */ -public class QueryUtils { +public final class QueryUtils { + + private QueryUtils() { - public static List queryYieldReferences(String prefix, FileObject fo) { - BladeIndex bladeIndex = getIndex(fo); - if (bladeIndex == null) { - return null; - } - return bladeIndex.queryYieldIndexedReferences(prefix); } - + public static List findYieldReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return null; + return new ArrayList<>(); } return bladeIndex.findYieldIndexedReferences(prefix); } - - public static List queryStacksReferences(String prefix, FileObject fo) { + + public static List findStacksReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return null; + return new ArrayList<>(); } - return bladeIndex.queryStacksIdsReference(prefix); + return bladeIndex.findStackIdIndexedReferences(prefix); } - + public static List getIncludePathReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return null; + return new ArrayList<>(); } return bladeIndex.getIncludePaths(prefix); } - + + @CheckForNull public static BladeIndex getIndex(FileObject fo) { Project project = ProjectUtils.getMainOwner(fo); - + try { return BladeIndex.get(project); } catch (IOException ex) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java index 6c9020786636..d9e5de511063 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -31,7 +31,17 @@ * * @author bogdan */ -public class BladeLexerUtils { +public final class BladeLexerUtils { + + private BladeLexerUtils() { + + } + + public static final List TOKENS_WITH_IDENTIFIABLE_PARAM = Arrays.asList(new Integer[]{ + D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, + D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, + D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER + }); public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { return getTokenSequence(th, offset, PHPTokenId.language()); @@ -66,12 +76,4 @@ public static TokenSequence getTokenSequence(final TokenHierarc } return ts; } - - public static List tokensWithIdentifiableParam() { - return Arrays.asList(new Integer[]{ - D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, - D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, - D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER - }); - } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java similarity index 69% rename from php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java rename to php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java index 6e304376950d..f550155d71d4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java @@ -21,19 +21,18 @@ import javax.swing.text.Document; import org.netbeans.api.lexer.TokenHierarchy; import org.netbeans.api.lexer.TokenSequence; -import org.netbeans.api.project.Project; import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.editor.NbEditorUtilities; -import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.editor.lexer.PHPTokenId; -import org.openide.filesystems.FileObject; -import org.openide.loaders.DataObject; /** * * @author bogdan */ -public class EditorUtils { +public final class PHPLexerUtils { + + private PHPLexerUtils() { + + } public static TokenSequence getTokenSequence(Document doc, int offset) { BaseDocument baseDoc = (BaseDocument) doc; @@ -52,20 +51,5 @@ public static TokenSequence getTokenSequence(Document doc, int offse return tokenSequence; } - - public static FileObject getFileObjectFromDoc(Document doc) { - DataObject dObject = NbEditorUtilities.getDataObject(doc); - if (dObject != null) { - return dObject.getPrimaryFile().getParent(); - } - return null; - } - - public static Project getProjectOwner(Document doc) { - FileObject file = getFileObjectFromDoc(doc); - if (file == null){ - return null; - } - return ProjectUtils.getMainOwner(file); - } + } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java index b3975d6ccfa1..0e14ecc5e01f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java @@ -163,7 +163,7 @@ public String getHtml(HtmlFormatter formatter) { @Override public ImageIcon getCustomIcon() { - return ResourceUtilities.loadResourceIcon("icons/layout.png"); + return ResourceUtilities.loadLayoutIcon(); } } @@ -211,7 +211,7 @@ public ElementKind getKind() { @Override public ImageIcon getCustomIcon() { - return ResourceUtilities.loadResourceIcon("icons/layout.png"); + return ResourceUtilities.loadLayoutIcon(); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java index 6f93fd83feb4..16c6fd6e8e66 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java @@ -50,17 +50,7 @@ * * @author bogdan */ -public class ParsingUtils { - - private final FileObject currentFile; - - public ParsingUtils(FileObject file) { - this.currentFile = file; - } - - public ParsingUtils() { - this.currentFile = null; - } +public final class ParsingUtils { private PHPParseResult phpParserResult; @@ -70,19 +60,16 @@ public FakeFileObject createFileObject(String phpText) { public void parsePhpText(String phpText) { FakeFileObject file = new FakeFileObject(phpText); - if (currentFile != null) { - file.setParent(currentFile.getParent()); - } parseFileObject(file); } - - public void parseFileObject(FileObject file){ + + public void parseFileObject(FileObject file) { Document doc = openDocument(file); try { Source source = Source.create(doc); - - if (source == null){ + + if (source == null) { return; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index d3ccef8d5580..6d660dbb8e3d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -36,11 +36,15 @@ * * @author bogdan */ -public class BladePathUtils { +public final class BladePathUtils { public static final String LARAVEL_VIEW_PATH = "resources/views"; //NOI18N public static final String BLADE_EXT = ".blade.php"; //NOI18N + private BladePathUtils() { + + } + /** * first we need to extract the root folder of view after we apply a generic * path sanitize for blade paths (ex "my.path" -> "my/path.blade.php") @@ -136,9 +140,9 @@ public static List getParentChildrenFromPrefixPath(FileObject contex relativeSlash = unixPath.lastIndexOf("/"); HashSet filteredViewRoots = new HashSet<>(); - + Map relativeFilePathMap = new HashMap<>(); - + if (relativeSlash > 0) { //filter only relative folders for (FileObject rootFolder : viewRoots) { @@ -157,7 +161,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex if (relativeSlash > 0) { //extract the path name prefix - relativePrefixToCompare = unixPath.substring(relativeSlash+1, unixPath.length()); + relativePrefixToCompare = unixPath.substring(relativeSlash + 1, unixPath.length()); } else { //root reference relativePrefixToCompare = unixPath; @@ -168,7 +172,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex for (FileObject rootFolder : filteredViewRoots) { list.addAll(Arrays.asList(rootFolder.getChildren())); } - for (Map.Entry entry : relativeFilePathMap.entrySet()){ + for (Map.Entry entry : relativeFilePathMap.entrySet()) { list.addAll(Arrays.asList(entry.getValue().getChildren())); } } else { @@ -181,10 +185,10 @@ public static List getParentChildrenFromPrefixPath(FileObject contex } } } - - for (Map.Entry entry : relativeFilePathMap.entrySet()){ + + for (Map.Entry entry : relativeFilePathMap.entrySet()) { for (FileObject file : entry.getValue().getChildren()) { - if (file.getName().startsWith(relativePrefixToCompare)){ + if (file.getName().startsWith(relativePrefixToCompare)) { list.add(file); } } @@ -275,44 +279,44 @@ public static String toBladeViewPath(FileObject file) { return path; } - - public static String getRelativeProjectPath(FileObject currentFile){ + + public static String getRelativeProjectPath(FileObject currentFile) { Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); - if (projectOwner == null){ + if (projectOwner == null) { return ""; } - + String dirPath = projectOwner.getProjectDirectory().getPath(); String relativePath = currentFile.getPath().replace(dirPath, ""); //only if we found the relative project path - if (currentFile.getPath().length() > relativePath.length()){ + if (currentFile.getPath().length() > relativePath.length()) { return relativePath; } - + return ""; } - - public static String toBladeViewPath(String filePath){ + + public static String toBladeViewPath(String filePath) { return filePath.replace(BLADE_EXT, "").replace("/", "."); } - - public static String viewPathToFilePath(String viewPath){ + + public static String viewPathToFilePath(String viewPath) { return viewPath.replace(".", "/") + BLADE_EXT; } - - public static HashSet getDefaultRoots(Project project){ + + public static HashSet getDefaultRoots(Project project) { HashSet defaultList = new HashSet<>(); FileObject defaultViewsRoot = project.getProjectDirectory().getFileObject(LARAVEL_VIEW_PATH); - - if (defaultViewsRoot != null && defaultViewsRoot.isValid()){ + + if (defaultViewsRoot != null && defaultViewsRoot.isValid()) { defaultList.add(defaultViewsRoot); } - + return defaultList; } - - public static String toBladeToProjectFilePath(String path){ + + public static String toBladeToProjectFilePath(String path) { return LARAVEL_VIEW_PATH + "/" + viewPathToFilePath(path); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java index bffc0993746f..c34e71bf47ba 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java @@ -45,6 +45,10 @@ public final class GeneralPreferencesUtils { // default values private static Preferences PREFERENCES; + + private GeneralPreferencesUtils(){ + + } private static final PreferenceChangeListener PREFERENCES_TRACKER = new PreferenceChangeListener() { @Override @@ -55,9 +59,6 @@ public void preferenceChange(PreferenceChangeEvent evt) { } }; - private GeneralPreferencesUtils() { - } - public static boolean isFormattingEnabled(){ lazyInit(); return enableFormatting; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java index 78b4983af70f..773214730f9b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java @@ -26,7 +26,11 @@ * * @author bogdan */ -public class ProjectUtils { +public final class ProjectUtils { + + private ProjectUtils() { + + } public static Project getMainOwner(FileObject file) { Project project = ProjectConvertors.getNonConvertorOwner(file); @@ -34,17 +38,17 @@ public static Project getMainOwner(FileObject file) { if (project == null) { return null; } - + return project; } - + public static FileObject getProjectDirectory(FileObject file) { Project project = getMainOwner(file); - if (project == null){ + if (project == null) { return null; } - + return project.getProjectDirectory(); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java index c140bae300c5..42b6b9eda961 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -22,7 +22,11 @@ * * @author bhaidu */ -public class StringUtils { +public final class StringUtils { + + private StringUtils() { + + } public static boolean isUpperCase(String s) { for (char c : s.toCharArray()) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java index 47a886fa710f..ae688538e85c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -1,4 +1,4 @@ - /* +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -30,7 +30,11 @@ * * @author bogdan */ -public class BladeAntlrUtils { +public final class BladeAntlrUtils { + + private BladeAntlrUtils() { + + } public static AntlrTokenSequence getTokens(Document doc) { @@ -58,10 +62,10 @@ public static Token getToken(Document doc, int offset) { Token token = tokens.next().get(); //need to move back - if ( token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset){ + if (token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset) { token = tokens.previous().get(); } - + return token; } @@ -211,7 +215,7 @@ public static Token findForward(Document doc, Token start, return null; } - + public static Token findForwardWithStop(Document doc, Token start, int tokensMatch, List stopTokens) { AntlrTokenSequence tokens = getTokens(doc); @@ -271,7 +275,7 @@ public static Token findBackward(Document doc, Token start, return null; } - + public static Token findBackwardWithStop(Document doc, Token start, int tokensMatch, List stopTokens) { AntlrTokenSequence tokens = getTokens(doc); From 98e30a43d4aa97cd14fded812ea96ee494ac9e50 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 5 Aug 2024 07:45:51 +0300 Subject: [PATCH 05/21] fix duplicated project.xml, using new switch syntax, // NOI18N --- php/php.api.phpmodule/nbproject/project.xml | 1 - .../php/blade/csl/elements/NamedElement.java | 18 ++++++++++++------ .../blade/csl/elements/PhpFunctionElement.java | 2 -- .../php/blade/csl/elements/TagElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 3 ++- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/php/php.api.phpmodule/nbproject/project.xml b/php/php.api.phpmodule/nbproject/project.xml index 20b8466b0815..d269125fd2af 100644 --- a/php/php.api.phpmodule/nbproject/project.xml +++ b/php/php.api.phpmodule/nbproject/project.xml @@ -226,7 +226,6 @@ org.cakephp.netbeans - org.netbeans.modules.php.blade org.nbphpcouncil.modules.php.ci org.nbphpcouncil.modules.php.laravel4 org.nbphpcouncil.modules.php.yii diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 1660b48fffb5..b039ab821b89 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -76,16 +76,22 @@ public String getIn() { @Override public ElementKind getKind() { switch (type) { - case YIELD_ID: + case YIELD_ID -> { return ElementKind.PACKAGE; - case STACK_ID: + } + case STACK_ID -> { return ElementKind.PACKAGE; - case CUSTOM_DIRECTIVE: + } + case CUSTOM_DIRECTIVE -> { return ElementKind.METHOD; - case PHP_CLASS: + } + case PHP_CLASS -> { return ElementKind.CLASS; + } + default -> { + return ElementKind.FILE; + } } - return ElementKind.FILE; } @Override @@ -106,5 +112,5 @@ public OffsetRange getOffsetRange(ParserResult pr) { public ElementType getType() { return type; } - + } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index f4d120fc59ea..6a2765887134 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -63,7 +63,5 @@ public String getParamsAsString() { public List getParams() { return params; } - - } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java index 1b7b2051c548..7263694e0589 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -59,7 +59,7 @@ public String getName() { @Override public String getIn() { - return ""; + return ""; // NOI18N } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 995f7e3bcabe..27b1f8755cf4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -120,8 +120,9 @@ public int[] findMatches() throws InterruptedException, BadLocationException { case END_TO_START -> { return findOriginForDirectiveEnd(tokenText); } - default -> { return null;} } + + return null; } private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { From bf8347eb8ed096b49f12fe9a9a81555baaa81e93 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 7 Aug 2024 08:34:15 +0300 Subject: [PATCH 06/21] batch of reviews, adding // NOI18N, refactoring the switch syntax, moving strings to constants, removing comments, removing unused images --- php/php.blade/licenseinfo.xml | 10 +--- php/php.blade/nbproject/project.properties | 1 - .../csl/elements/PhpFunctionElement.java | 2 +- .../php/blade/csl/elements/TagElement.java | 4 +- .../php/blade/editor/BladeBracesMatcher.java | 38 +++++---------- .../php/blade/editor/EditorStringUtils.java | 3 -- .../blade/editor/HyperlinkProviderImpl.java | 2 - .../blade/editor/indexing/PhpIndexUtils.java | 31 ++++++------ .../php/blade/editor/indexing/QueryUtils.java | 7 ++- .../blade/project/BladeProjectProperties.java | 46 +++++++++--------- .../php/blade/project/ComponentsSupport.java | 29 +++++------ .../modules/php/blade/resources/icons/at2.png | Bin 1212 -> 0 bytes .../modules/php/blade/resources/icons/at4.png | Bin 3264 -> 0 bytes .../blade/syntax/BladeDirectivesUtils.java | 18 ++++--- 14 files changed, 85 insertions(+), 106 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at4.png diff --git a/php/php.blade/licenseinfo.xml b/php/php.blade/licenseinfo.xml index 68c1a44517b8..b832d133ad7a 100644 --- a/php/php.blade/licenseinfo.xml +++ b/php/php.blade/licenseinfo.xml @@ -29,17 +29,9 @@ tools/skeleton.netbeans src/org/netbeans/modules/php/blade/resources/icon.png src/org/netbeans/modules/php/blade/resources/icons/at.png - src/org/netbeans/modules/php/blade/resources/icons/at2.png - src/org/netbeans/modules/php/blade/resources/icons/at4.png src/org/netbeans/modules/php/blade/resources/icons/blade_file.png src/org/netbeans/modules/php/blade/resources/icons/layout.png - - - \ No newline at end of file + diff --git a/php/php.blade/nbproject/project.properties b/php/php.blade/nbproject/project.properties index d4476f1c745e..4c3b5d6a165f 100644 --- a/php/php.blade/nbproject/project.properties +++ b/php/php.blade/nbproject/project.properties @@ -15,7 +15,6 @@ # specific language governing permissions and limitations # under the License. -javac.source=1.8 javac.compilerargs=-Xlint -Xlint:-serial spec.version.base.fatal.warning=false javac.release=17 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 6a2765887134..0555a9898996 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -57,7 +57,7 @@ public String getParamsAsString() { if (params == null || params.isEmpty()) { return "()"; } - return "(" + String.join(", ", params) + ")"; + return "(" + String.join(", ", params) + ")"; // NOI18N } public List getParams() { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java index 7263694e0589..522b3796e436 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -34,8 +34,8 @@ */ public class TagElement implements ElementHandle { - protected final String name; - protected final ElementType type; + private final String name; + private final ElementType type; public TagElement(String name) { this.name = name; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 27b1f8755cf4..a772fa38abd7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -104,35 +104,21 @@ public int[] findMatches() throws InterruptedException, BadLocationException { } String tokenText = originToken.getText(); - switch (currentDirection) { - case CURLY_START_TO_END -> { - return findCloseTag(); - } - case CURLY_END_TO_START -> { - return findOpenTag(); - } - case START_TO_END -> { - return findDirectiveEnd(tokenText); - } - case CUSTOM_START_TO_END -> { - return findCustomDirectiveEnd(tokenText); - } - case END_TO_START -> { - return findOriginForDirectiveEnd(tokenText); - } - } - - return null; + return switch (currentDirection) { + case CURLY_START_TO_END -> findCloseTag(); + case CURLY_END_TO_START -> findOpenTag(); + case START_TO_END -> findDirectiveEnd(tokenText); + case CUSTOM_START_TO_END -> findCustomDirectiveEnd(tokenText); + case END_TO_START -> findOriginForDirectiveEnd(tokenText); + default -> null; + }; } private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { - switch (currentToken.getType()) { - case HTML, PHP_EXPRESSION, AT, BLADE_COMMENT, ERROR -> { - return false; - } - } - - return true; + return switch (currentToken.getType()) { + case HTML, PHP_EXPRESSION, AT, BLADE_COMMENT, ERROR -> false; + default -> true; + }; } public BraceDirectionType findBraceDirectionType(String tokenText, Token token) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java index 3fde6c8b3ef9..0ef7c48f8d1b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -18,9 +18,6 @@ */ package org.netbeans.modules.php.blade.editor; -import java.util.Collection; -import org.openide.util.Parameters; - /** * * @author bhaidu diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index ac8c3f343cb7..50289a746ee3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -56,7 +56,6 @@ public class HyperlinkProviderImpl implements HyperlinkProviderExt { private String tooltipText = ""; private FileObject goToFile; private int goToOffset = 0; - private int triggeredEvent = 0; public enum DeclarationType { VIEW_PATH; @@ -164,7 +163,6 @@ public void performClickAction(Document doc, int offset, HyperlinkType type) { case "render": // NOI18N if (goToFile != null) { openDocument(goToFile, goToOffset); - triggeredEvent++; } break; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java index a363b5d8d009..534c737512ed 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -28,6 +28,8 @@ import org.netbeans.modules.csl.api.OffsetRange; import org.netbeans.modules.parsing.spi.indexing.support.IndexResult; import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import static org.netbeans.modules.php.blade.editor.EditorStringUtils.NAMESPACE_SEPARATOR; import org.netbeans.modules.php.blade.editor.cache.QueryCache; import org.netbeans.modules.php.editor.api.QuerySupportFactory; import org.netbeans.modules.php.editor.index.PHPIndexer; @@ -43,6 +45,7 @@ */ public final class PhpIndexUtils { + public final static String ESCAPED_NAMESPACE_SEPARATOR = "\\\\"; // NOI18N private final static QueryCache> cache = new QueryCache(); private final static QueryCache> functionCache = new QueryCache(); @@ -102,7 +105,7 @@ public static Collection queryNamespaceClassesName(String prefix String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace("\\", "\\\\") + ";.*"; + String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace(NAMESPACE_SEPARATOR, ESCAPED_NAMESPACE_SEPARATOR) + ";.*"; // NOI18N try { Collection indexResults = phpindex.query( @@ -122,7 +125,7 @@ public static Collection queryNamespaceClassesName(String prefix && classNamespace.length() > 0 && classNamespace.startsWith(namespace)) { results.add(new PhpIndexResult(fullName, - classNamespace + "\\" + fullName, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + classNamespace + NAMESPACE_SEPARATOR + fullName, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } } @@ -156,7 +159,7 @@ public static Collection queryExactNamespaceClasses(String ident continue; } - results.add(new PhpIndexResult(namespace + "\\" + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + results.add(new PhpIndexResult(namespace + NAMESPACE_SEPARATOR + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } catch (IOException ex) { Exceptions.printStackTrace(ex); @@ -185,7 +188,7 @@ public static Collection queryComponentClass(String identifier, String domainName = sig.string(2); FileObject indexFile = indexResult.getFile(); if (indexFile.getName().equals(identifier)) { - results.add(new PhpIndexResult(domainName + "\\" + name + "\\" + indexFile.getName(), + results.add(new PhpIndexResult(domainName + NAMESPACE_SEPARATOR + name + NAMESPACE_SEPARATOR + indexFile.getName(), indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } @@ -331,7 +334,7 @@ public static Collection queryExactClassMethods(FileObje classSignature = sig; if (namespace.length() > 0) { - classNamespace = namespace + "\\" + className; + classNamespace = namespace + NAMESPACE_SEPARATOR + className; } } } @@ -376,11 +379,9 @@ public static Collection queryClassMethods(FileObject fo String method, String className, String queryNamespace) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - + String queryNamespacePath = queryNamespace; if (queryNamespace != null && queryNamespace.length() > 3) { - int startOffset = queryNamespace.startsWith("\\") ? 1 : 0; - int endOffset = queryNamespace.endsWith("\\") ? 1 : 0; - queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); + queryNamespacePath = EditorStringUtils.trimNamespace(queryNamespace); } //should query the class befoe //for the moment a quick hack @@ -403,7 +404,7 @@ public static Collection queryClassMethods(FileObject fo classSignature = sig; String namespace = sig.string(4); - if (queryNamespace != null && !namespace.equals(queryNamespace)) { + if (queryNamespacePath != null && !namespace.equals(queryNamespacePath)) { classSignature = null; continue; } @@ -477,11 +478,11 @@ public static Collection queryNamespace(FileObject fo, String pr //the first el is the folder String originalPrefix = prefix; - if (prefix.endsWith("\\\\")) { + if (prefix.endsWith(ESCAPED_NAMESPACE_SEPARATOR)) { return results; } - String[] queryItems = prefix.split("\\\\"); + String[] queryItems = prefix.split(ESCAPED_NAMESPACE_SEPARATOR); if (queryItems.length == 0) { return results; @@ -491,7 +492,7 @@ public static Collection queryNamespace(FileObject fo, String pr try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix + "\\", QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix + NAMESPACE_SEPARATOR, QuerySupport.Kind.PREFIX, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL}); for (IndexResult indexResult : indexResults) { FileObject indexFile = indexResult.getFile(); @@ -507,10 +508,10 @@ public static Collection queryNamespace(FileObject fo, String pr String name = sig.string(1); String namespace = sig.string(2); - String fullNamespace = ""; + String fullNamespace = ""; // NOI18N if (!namespace.isEmpty()) { - fullNamespace = namespace + "\\"; + fullNamespace = namespace + NAMESPACE_SEPARATOR; } fullNamespace += name; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java index 777e52be6990..18e27e90c94f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java @@ -19,7 +19,6 @@ package org.netbeans.modules.php.blade.editor.indexing; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; @@ -40,7 +39,7 @@ private QueryUtils() { public static List findYieldReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return new ArrayList<>(); + return List.of(); } return bladeIndex.findYieldIndexedReferences(prefix); } @@ -48,7 +47,7 @@ public static List findYieldReferences(String prefi public static List findStacksReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return new ArrayList<>(); + return List.of(); } return bladeIndex.findStackIdIndexedReferences(prefix); } @@ -56,7 +55,7 @@ public static List findStacksReferences(String pref public static List getIncludePathReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return new ArrayList<>(); + return List.of(); } return bladeIndex.getIncludePaths(prefix); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 0606a5791531..4c625962edc1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -23,6 +23,7 @@ import java.util.prefs.PreferenceChangeListener; import java.util.prefs.Preferences; import javax.swing.DefaultListModel; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; @@ -38,31 +39,33 @@ public final class BladeProjectProperties { private static final Map INSTANCES = new HashMap<>(); - private static final String BLADE_VERSION = "blade.version"; // NOI18N private static final String DIRECTIVE_CUSTOMIZER_PATH_LIST = "directive_customizer.path.list"; // NOI18N private static final String VIEW_PATH_LIST = "views.path.list"; // NOI18N private static final String NON_LARAVEL_DECL_FINDER = "non_laravel.decl.finder"; // NOI18N - public Project project; + public final Project project; - DefaultListModel directiveCustomizerPathList = new DefaultListModel(); - DefaultListModel viewsPathList = new DefaultListModel(); - boolean nonLaravelDeclFinder = false; + private DefaultListModel directiveCustomizerPathList = new DefaultListModel(); + private DefaultListModel viewsPathList = new DefaultListModel(); + private boolean nonLaravelDeclFinder = false; private BladeProjectProperties(Project project) { this.project = project; initModelsFromPreferences(); } + @CheckForNull public static BladeProjectProperties getInstance(Project project) { - if (INSTANCES.containsKey(project)) { - return INSTANCES.get(project); + synchronized (INSTANCES) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + BladeProjectProperties instance = new BladeProjectProperties(project); + INSTANCES.put(project, instance); + return instance; } - BladeProjectProperties instance = new BladeProjectProperties(project); - INSTANCES.put(project, instance); - return instance; } - - public static void closeProject(Project project){ + + public static void closeProject(Project project) { if (INSTANCES.containsKey(project)) { INSTANCES.remove(project); } @@ -85,13 +88,12 @@ public void storeDirectiveCustomizerPaths() { String includePath = UiOptionsUtils.encodeToStrings(directiveCustomizerPathList.elements()); getPreferences().put(DIRECTIVE_CUSTOMIZER_PATH_LIST, includePath); } - - + public void storeViewsPaths() { String includePath = UiOptionsUtils.encodeToStrings(viewsPathList.elements()); getPreferences().put(VIEW_PATH_LIST, includePath); } - + public void storeNonLaravelDeclFinderFlag(boolean status) { nonLaravelDeclFinder = status; getPreferences().putBoolean(NON_LARAVEL_DECL_FINDER, status); @@ -100,7 +102,7 @@ public void storeNonLaravelDeclFinderFlag(boolean status) { public void addDirectiveCustomizerPath(String path) { directiveCustomizerPathList.addElement(path); } - + public void addViewsPath(String path) { viewsPathList.addElement(path); } @@ -108,7 +110,7 @@ public void addViewsPath(String path) { public void removeCustomizerPath(int index) { directiveCustomizerPathList.remove(index); } - + public void removeViewsPath(int index) { viewsPathList.remove(index); } @@ -121,7 +123,7 @@ public void setViewsPathList(DefaultListModel list) { public DefaultListModel createModelForDirectiveCusomizerPathList() { return creatModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); } - + public DefaultListModel createModelForViewsPathList() { return creatModelFromPreferences(VIEW_PATH_LIST); } @@ -137,14 +139,14 @@ public DefaultListModel getModelViewsPathList() { public boolean getNonLaravelDeclFinderFlag() { return nonLaravelDeclFinder; } - + private DefaultListModel creatModelFromPreferences(String pathName) { DefaultListModel model = new DefaultListModel<>(); String encodedCompilerPathList = getPreferences().get(pathName, null); String[] paths; if (encodedCompilerPathList != null) { - paths = encodedCompilerPathList.split("\\|", -1); + paths = encodedCompilerPathList.split("\\|", -1); // NOI18N } else { return model; } @@ -163,7 +165,7 @@ public String[] getCompilerPathList() { String encodedCompilerPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); String[] paths = new String[]{}; if (encodedCompilerPathList != null) { - return encodedCompilerPathList.split("\\|", -1); + return encodedCompilerPathList.split("\\|", -1); // NOI18N } return paths; } @@ -172,7 +174,7 @@ public String[] getViewsPathList() { String encodedCompilerPathList = getPreferences().get(VIEW_PATH_LIST, null); String[] paths = new String[]{}; if (encodedCompilerPathList != null) { - return encodedCompilerPathList.split("\\|", -1); + return encodedCompilerPathList.split("\\|", -1); // NOI18N } return paths; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index 3c1d7e86dc07..f6b6d6c37466 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -30,31 +30,32 @@ * @author bogdan */ @NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), - @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), - @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"),//from 10 - @Namespace(path = "Illuminate\\Console\\View\\Components"), - @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), - @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"), - }) + @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), // NOI18N + @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), // NOI18N + @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"), // NOI18N + @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N + @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), // NOI18N + @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) // NOI18N public class ComponentsSupport { private static final Map INSTANCES = new HashMap<>(); private final Map installedComponentNamespace = new HashMap<>(); private boolean scanned = false; - public Project project; + private final Project project; private ComponentsSupport(Project project) { this.project = project; } public static ComponentsSupport getInstance(Project project) { - if (INSTANCES.containsKey(project)) { - return INSTANCES.get(project); + synchronized (INSTANCES) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + ComponentsSupport instance = new ComponentsSupport(project); + INSTANCES.put(project, instance); + return instance; } - ComponentsSupport instance = new ComponentsSupport(project); - INSTANCES.put(project, instance); - return instance; } public void scanForInstalledComponents() { @@ -64,7 +65,7 @@ public void scanForInstalledComponents() { //check if folder exists fo = project.getProjectDirectory().getFileObject(namespace.relativeFilePath()); } else { - fo = project.getProjectDirectory().getFileObject("vendor/" + namespace.relativeFilePath()); + fo = project.getProjectDirectory().getFileObject("vendor/" + namespace.relativeFilePath()); // NOI18N } if (fo == null || !fo.isValid()) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png deleted file mode 100644 index 4a15be190b54b33c296a825031970194f802b4f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1212 zcmV;t1Vj6YP)EX>4Tx04R}tkv&MmKpe$iQ>7vmhh`AzkfAzR5EXHhDi*;)X)CnqU~=gfG%+M8 zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCJG^=ME&~)3( zBok7;up)(C5rlvUq7Y?f8L8|-4!+~-9s$1I#d((hxj)B%TC^AtkcelQVcNv&#M7I$ z!FiupWEEK@J|`YC>4LolWCVi75%AwfYMRn%Z3PODCeg$(T{eEh?%KTR%$Tvae~ z%wq!@WY-V=2fw?uN|O^_QaAzhzBtau2oTx@S`EkfK6aee2@re+uJn$7qY2D>lHTZO zu_It`8@RacXv!XNxdRM68L}z6Qjn%lDgp0j^i2gIatrjYdcC#xaryw{sH>$L;NTD# zEmQWI&%67&d;9lHyT2bp4sw(#%Q2Mz000JJOGiWi8vq*s8+2uukpKVy32;bRa{vG? zBLDy{BLR4&KXw2B0?kQ8K~y-)m6OeDRA&^2pZn$=@14o5om&&*#Kfjfi-Zzww0?A< zrc+!Qgr-9OfcAzA$W5Akz35fL##AVIMtVvJOl zmSyJRC7Jy3XQ}4%A|gW~f+ZqxcW=dfEg z5$f1VVf+a|2pCjAqA)#8Xj>;6yeLa|N6CG6me;=gl=wF%@ZLX!<=TX|bz*6a3OiKh z()GnB6wpuHv|GbUW=@C7!4@+x`seh1s1-q?{pim&lWZBRjs{^_efK&qz z5MwYaD_FV-?KV?dSfFs{E<7!xU6)EGi$9fOWA8ib9%vvHc`M%fZ0tU!;?umRm%`~Q zOnvqRR&xZqdk0pB%i^_RO7|ZS-uX7}8+E@(X<(!|9^ae2`Wwac9Ic5yVT2;Gp4T%hy3(BZN~?2yIx0(!BPrf)sJ#DuReSo82Df1)u-3=^yS6nuVr+7&U(r3d=8jw a4F3nS_kBWhz+Zm=0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxvgIZW{AU$e0z%@o91u{I9c1}wjPSX+GnJWC z<#^^AY#yRpYRPW?_2+Vb;1}2@Coz{)Q}Xypl^Plv#eaU&?&leKdH&uX*=i2Wj=;i%D~NdtE!g^dzs$he1~ zfuCoEbErYtGqLQ8R>)j=aN)ojCNqoU@Y+JpzV+EpsbJ?p7#awR5vKg><$g8bcdoV6 z10&iHlVJtBLfAaehLQJQ3VvZ%&*j(ZyDW;Ti+A-HMXUQ?AoO8)F zx57nAEUDyDN-eF1$_U9=Q_Z#1T3f@OOy4uT{vHHXHA6O$}Ej&!^ zartEpPjlW2JxkEmnYcLvV?hXv=gj~dI&97m&mv(nw>k4QASz;jk#Tb~$Tvp`6w0I! z7roqlnEP$s9I*ZsZ{c^CbDO&Vfw|x&f8*^Ztc|UN`Y?8)aAWEj(YL~Ap|sG|73{y8 z1%vOsXNe>+NvyN*)6NRjYJNV`s;8m*Da9#ul-)uW0fW!j&plH-vs=pm|4fmbu}rwR5WAL|I-5x|o}Z*iHEOSU)fVP>o9bGcjVj|Rte_O3p=1UwCq`q+P0+5R!S zbw-_uT0P?uX^H7<8{pv2PR@=T&r#HmQrpuUs-^ccRjSU|&(sW&EaL-~)@L&pXRKo) zyBI(zd&q(<0MAKhSuD!KpZ2N~sR-S(`4XRUbT(ypysb8C_`-gkQ9+l82ID=Ux2GC1 zNyXaDl_Y$o_eZw3$q1&jPIF1fo6r0@RxK%iP6q6b$2z>o0Nh3*E(6fFX^NNu;_;a$ zP>@k<`Pg#NG*55rNlxckeqw=E-z6HBpzB%4Hd<0M25VK318JHmgtLuPxlAGjJ+Ae5 zmd?)cf+--s+>-C+6HiYWqJQlGW)I6;R(+ljz?s|2Cuq8IU;NX&zZ8v}((Y29j1OR;oE@a}i zkv!3#>*n!>^Fm#P*ooIe{SKXb2Gm{s1+|t@jz9q|*H9|OVAKuRh-iN`Yc{%=&^9uf z{T*WNqn`CZ5nS1sQlkD6uH`x~4uXHC2XpGG*zoB!-&mWGt9a9d_H(zTb%_P!TnZr` z@kN-69b-mWS%)d~s8CA~eU^*x2=B1u^UiZaf81$)B`s%QBbwFDG!jju$B+2hY()(@ z(sjd0NKHW17DKzPP!D>D!Wqp?;C6_%6D
      Gg;|d{*F*bQD?ii(w!g3AU4UdqE{U z%!uJx7u4sbqrRo3`p=P~4(konzp`b+Qim+^I$mYOI)*u6mV?-xSFNa@vwiTBneE8w z!S8ZNfL+Rb@#`mO0pQ#K-Yf-uLL6BLDa}v5{0A#Dpy>AtJes8z%kH zdlM2!^SpWnh0SEop?R1>k3}X-H+fAITGgUu@-|$rScaWt%DAZnCcWVf)@G_BeUy$= z#v35@x(OnFc2lRVKi(uFwIp(~oZI(c&JViGt^}-xEsqZv6LTq+!UNT-tdDT({yKWB zW_-ly1uG>X6GY^xn;XDaEi>@ADw7+5TgYr`mx#(6`e`KgB5An`?Q=SX}aKb^5jx3s%Xs%F>XlI|$ zwl`SYE?0)}0Aa!x;W(W_y((PBJq+!vo#Lkk!)M@GAW*uchuJakMQ^wukCTb^{_rz= zCd)Z)@z-`h!*8`SP?4@+4%VQ>mfE&YMjFe#MGW$e33Dbrf^H5PvsI3&mQ?T!%SNW^ zE*nmvm0qfbXekF|R2Y7IG7QAL-vC6Oh;&7i`5e!+Ilyzh2Z&tsdy%`66(e0BniokL z^G!8~97n@I9tqGkbIAgi43-72WZ+}P^k3TctCNxxNEWq}tqQxR)t_4g@xW{-y9P7Q z-g(ATxlv)(->|EB@lAqtGynhrgK0xUP)S2WAaHVTW@&6?004NLeUUv#!$2Ix zUsI(b6^CXJ>5!p1Sr8R*lqwd%LTM|s>R@u|7c?;>DK3tJYr(;f#j1mgv#t)Vf*|+- z;^^e0=prTlFDbN$@!+^0@9sVB-T^|h#x$#E9ME*z%p?<1zOW*NUJ-WW*MpM zLJq#;>mC8V-o<&A|G7WMfLgQ|5RiyxnPJ+*>%`NWw!wLySY#DhB|aw}GwFiFk6c$g ze&bwrS>TzXnaj)(i^Nj7i)(H@N2Cnpuf1?S^e3IViXt5(;a2vR|?r6#$aJd5vJsGko zyHb#*P$~iMXY@@4AaV=zuX??;_i_3FzgPU?uj;sFFgkXHTiLCvsf)J5ioL6gwYkdTda%K8GCapjyl!3d^9T zG3`5%JWWXMAl62l%=G8uR}=El(<8&WQojQ_!VLQx4-HD4$B~_0Sh#>ljDqnC$X&?7 zfm#;G(U+;&^ArvDKi%)Ub?P0Tixcvx7m4k^uj3PC&ug+H&0!W!HX$QUhyK;Oc?qqgeGJ%D;UzXi*vP|VCw@%4cxjG0Z4oBfd01Y!=x&T z8u9Y>rc@OQru_k`dIhQ`HQo?4p%>VBU8lI1ky}Y&Zl_Va5$wS>Y@vM^S_yS!iCTXXuJB&$bspAl{z&e|2n(sqS^3xz{liI2$tHHl$4+0L!8Id_Hh)EUa^l { + return new String[]{DIRECTIVE_IF, DIRECTIVE_HAS_SECTION, DIRECTIVE_SECTION_MISSING}; + } + case DIRECTIVE_ENDSECTION, DIRECTIVE_APPEND, DIRECTIVE_STOP, DIRECTIVE_SHOW -> { return new String[]{DIRECTIVE_SECTION}; + } } DirectivesList listClass = new DirectivesList(); for (Directive directiveEl : listClass.getDirectives()){ From ad1a7e03bab094156ec19b32c72c140d74f13437 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Thu, 8 Aug 2024 07:21:49 +0300 Subject: [PATCH 07/21] batch of reviews, first set of unit tests, remove old test base --- php/php.blade/nbproject/project.xml | 57 ++++++++ .../php/blade/csl/elements/ClassElement.java | 4 +- .../php/blade/csl/elements/NamedElement.java | 25 +--- .../php/blade/project/ProjectUtils.java | 3 + .../lexer/BladeLexerTest/content_tag.pass | 5 + .../lexer/BladeLexerTest/escaped_tag.pass | 6 + .../editor/lexer/BladeLexerTest/raw_tag.pass | 5 + .../AntlrColoringLexerTest/content_tag.pass | 6 + .../AntlrColoringLexerTest/escaped_tag.pass | 7 + .../lexer/blade/content_tag.pass | 6 + .../lexer/blade/escaped_tag.pass | 7 + .../lexer/blade/raw_tag.pass | 6 + .../v10/AntlrColoringLexerTest/raw_tag.pass | 6 + .../completion/testCompletion_01.blade.php | 1 + ..._01.blade.php.testCompletion_01.completion | 96 +++++++++++++ .../lexer/blade/content_tag.blade.php | 1 + .../lexer/blade/escaped_tag.blade.php | 3 + .../blade/performance/perf_test_01.blade.php | 66 +++++++++ .../testfiles/lexer/blade/raw_tag.blade.php | 1 + .../parser/performance/perf_test_01.blade.php | 66 +++++++++ .../performance/perf_test_01.blade.php.errors | 0 .../testfiles/parser/smoke/test_01.blade.php | 9 ++ .../unopend/unopend_set_error_01.blade.php | 3 + .../unopend_set_error_01.blade.php.errors | 1 + .../issues/issue61/issue61.blade.php | 6 - .../smoke/content_tag.blade.php | 1 - .../smoke/escaped_tag.blade.php | 3 - .../coloring_lexer/smoke/fragment.blade.php | 7 - .../coloring_lexer/smoke/raw_tag.blade.php | 1 - .../blade/editor/BladeGoldenFileTestBase.java | 57 ++++++++ .../php/blade/editor/BladeTestBase.java | 43 ++++++ .../{syntax/antlr4 => editor}/BladeUtils.java | 18 ++- .../completion/BladeCompletionTest.java} | 14 +- .../lexer/BladeLexerPerformanceTest.java | 63 +++++++++ .../blade/editor/lexer/BladeLexerTest.java | 80 +++++++++++ .../editor/lexer/BladeLexerTestBase.java | 44 ++++++ .../parser/BladeParserErrorTest.java} | 16 +-- .../editor/parser/ParserPerformanceTest.java | 79 +++++++++++ .../BladeAntlrColoringLexerTestBase.java | 125 ----------------- .../antlr4/BladeAntlrLexerTestBase.java | 129 ------------------ .../antlr4/BladeAntlrParserTestBase.java | 110 --------------- .../blade/syntax/antlr4/BladeBaseTest.java | 69 ---------- .../antlr4/v10/AntlrColoringLexerTest.java | 82 +++++++++++ .../syntax/antlr4/v10/AntlrLexerTestBase.java | 44 ++++++ .../BladeAntlrParserTestBase.java} | 21 ++- .../antlr4/v10/BladeAntrlParserTest.java | 65 +++++++++ 46 files changed, 974 insertions(+), 493 deletions(-) create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php.errors create mode 100644 php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/{syntax/antlr4 => editor}/BladeUtils.java (84%) rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/{syntax/antlr4/BladeAntrlLexerTest.java => editor/completion/BladeCompletionTest.java} (68%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/{syntax/antlr4/BladeAntrlColoringLexerTest.java => editor/parser/BladeParserErrorTest.java} (69%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/{BladeAntrlParserTest.java => v10/BladeAntlrParserTestBase.java} (65%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml index 68d3e31e54b9..3c38a4c6735b 100644 --- a/php/php.blade/nbproject/project.xml +++ b/php/php.blade/nbproject/project.xml @@ -402,6 +402,63 @@ org.netbeans.libs.junit4 + + org.netbeans.modules.csl.api + + + + + + org.netbeans.modules.editor.bracesmatching + + + + + org.netbeans.modules.editor.lib + + + + org.netbeans.modules.editor.mimelookup + + + + + org.netbeans.modules.editor.mimelookup.impl + + + org.netbeans.modules.editor.util + + + + + org.netbeans.modules.lexer + + + + + org.netbeans.modules.lexer.nbbridge + + + + org.netbeans.modules.nbjunit + + + + + org.openide.util.lookup + + + + + org.netbeans.modules.projectapi.nb + + + org.netbeans.modules.parsing.nb + + + org.netbeans.modules.parsing.api + + org.netbeans.modules.nbjunit diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java index 3cd671705db5..5b68135c1577 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.csl.elements; +import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -27,7 +28,8 @@ */ public class ClassElement extends NamedElement { - protected final String namespace; + @NullAllowed + private final String namespace; public ClassElement(String name, FileObject file) { super(name, file, ElementType.PHP_CLASS); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index b039ab821b89..73b3d40ab1b1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -75,28 +75,17 @@ public String getIn() { @Override public ElementKind getKind() { - switch (type) { - case YIELD_ID -> { - return ElementKind.PACKAGE; - } - case STACK_ID -> { - return ElementKind.PACKAGE; - } - case CUSTOM_DIRECTIVE -> { - return ElementKind.METHOD; - } - case PHP_CLASS -> { - return ElementKind.CLASS; - } - default -> { - return ElementKind.FILE; - } - } + return switch (type) { + case YIELD_ID, STACK_ID -> ElementKind.PACKAGE; + case CUSTOM_DIRECTIVE -> ElementKind.METHOD; + case PHP_CLASS -> ElementKind.CLASS; + default -> ElementKind.FILE; + }; } @Override public Set getModifiers() { - return new HashSet<>(); + return Set.of(); } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java index 773214730f9b..3f23c7382a35 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.project; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.spi.project.ui.support.ProjectConvertors; import org.openide.filesystems.FileObject; @@ -32,6 +33,7 @@ private ProjectUtils() { } + @CheckForNull public static Project getMainOwner(FileObject file) { Project project = ProjectConvertors.getNonConvertorOwner(file); @@ -42,6 +44,7 @@ public static Project getMainOwner(FileObject file) { return project; } + @CheckForNull public static FileObject getProjectDirectory(FileObject file) { Project project = getMainOwner(file); diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass new file mode 100644 index 000000000000..39b810172f0f --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass @@ -0,0 +1,5 @@ +Token #0 HTML [Hello, ] +Token #1 BLADE_ECHO_DELIMITOR [{{] +Token #2 PHP_BLADE_ECHO_EXPR [ $name ] +Token #3 BLADE_ECHO_DELIMITOR [}}] +Token #4 HTML [.\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass new file mode 100644 index 000000000000..7f4a5b6cfc2c --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass @@ -0,0 +1,6 @@ +Token #0 HTML [

      Laravel

      \n \nHello, ] +Token #1 HTML [@{{] +Token #2 HTML [ name ] +Token #3 HTML [}] +Token #4 HTML [}] +Token #5 HTML [.\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass new file mode 100644 index 000000000000..71ef32ac7c0e --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass @@ -0,0 +1,5 @@ +Token #0 HTML [Hello, ] +Token #1 BLADE_ECHO_DELIMITOR [{!!] +Token #2 PHP_BLADE_ECHO_EXPR [ $name ] +Token #3 BLADE_ECHO_DELIMITOR [!!}] +Token #4 HTML [.\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass new file mode 100644 index 000000000000..2d8358ce0466 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #5 CONTENT_TAG [[@1,7:8='{{',<5>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<3>,1:9]] +Token #5 CONTENT_TAG [[@3,16:17='}}',<5>,1:16]] +Token #6 HTML [[@4,18:19='.\n',<6>,1:18]] +Token #-1 EOF [[@5,20:19='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass new file mode 100644 index 000000000000..1516d27bfc42 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass @@ -0,0 +1,7 @@ +Token #7 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<7>,1:0]] +Token #6 HTML [[@1,26:28='@{{',<6>,3:7]] +Token #6 HTML [[@2,29:34=' name ',<6>,3:10]] +Token #6 HTML [[@3,35:35='}',<6>,3:16]] +Token #6 HTML [[@4,36:36='}',<6>,3:17]] +Token #6 HTML [[@5,37:38='.\n',<6>,3:18]] +Token #-1 EOF [[@6,39:38='',<-1>,4:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass new file mode 100644 index 000000000000..2d8358ce0466 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #5 CONTENT_TAG [[@1,7:8='{{',<5>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<3>,1:9]] +Token #5 CONTENT_TAG [[@3,16:17='}}',<5>,1:16]] +Token #6 HTML [[@4,18:19='.\n',<6>,1:18]] +Token #-1 EOF [[@5,20:19='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass new file mode 100644 index 000000000000..1516d27bfc42 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass @@ -0,0 +1,7 @@ +Token #7 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<7>,1:0]] +Token #6 HTML [[@1,26:28='@{{',<6>,3:7]] +Token #6 HTML [[@2,29:34=' name ',<6>,3:10]] +Token #6 HTML [[@3,35:35='}',<6>,3:16]] +Token #6 HTML [[@4,36:36='}',<6>,3:17]] +Token #6 HTML [[@5,37:38='.\n',<6>,3:18]] +Token #-1 EOF [[@6,39:38='',<-1>,4:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass new file mode 100644 index 000000000000..6b9d29e50f18 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #4 RAW_TAG [[@1,7:9='{!!',<4>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<3>,1:10]] +Token #4 RAW_TAG [[@3,17:19='!!}',<4>,1:17]] +Token #6 HTML [[@4,20:21='.\n',<6>,1:20]] +Token #-1 EOF [[@5,22:21='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass new file mode 100644 index 000000000000..6b9d29e50f18 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #4 RAW_TAG [[@1,7:9='{!!',<4>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<3>,1:10]] +Token #4 RAW_TAG [[@3,17:19='!!}',<4>,1:17]] +Token #6 HTML [[@4,20:21='.\n',<6>,1:20]] +Token #-1 EOF [[@5,22:21='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php new file mode 100644 index 000000000000..59c227c5c811 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php @@ -0,0 +1 @@ +@ diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion new file mode 100644 index 000000000000..977291474786 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion @@ -0,0 +1,96 @@ +Code completion result for source line: +@| +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +CONSTRUCTO @append +CONSTRUCTO @break +CONSTRUCTO @continue +CONSTRUCTO @csrf +CONSTRUCTO @default +CONSTRUCTO @else +CONSTRUCTO @empty v5.4 +CONSTRUCTO @endPushIf +CONSTRUCTO @endfor +CONSTRUCTO @endforeach@endforelse
      @endfragment@endif
      +CONSTRUCTO @endonce +CONSTRUCTO @endprepend@endpush +CONSTRUCTO @endsection@once +CONSTRUCTO @overwrite +CONSTRUCTO @php +CONSTRUCTO @stop +CONSTRUCTO @auth() +CONSTRUCTO @auth() ... @endauth +CONSTRUCTO @can() v5.1 +CONSTRUCTO @can() ... @endcan v5.1 +CONSTRUCTO @canany() v5.8 +CONSTRUCTO @canany() ... @endcanany v5.8 +CONSTRUCTO @cannot() v5.3 +CONSTRUCTO @cannot() ... @endcannot v5.3 +CONSTRUCTO @case() +CONSTRUCTO @checked() v9 +CONSTRUCTO @class() v8 +CONSTRUCTO @dd() +CONSTRUCTO @disabled() v9 +CONSTRUCTO @dump() +CONSTRUCTO @each() +CONSTRUCTO @elseif() +CONSTRUCTO @empty() v5.4 +CONSTRUCTO @empty() ... @endempty v5.4 +CONSTRUCTO @env() +CONSTRUCTO @env() ... @endenv +CONSTRUCTO @error() +CONSTRUCTO @error() ... @enderror +CONSTRUCTO @extends() +CONSTRUCTO @for() +CONSTRUCTO @for() ... @endfor +CONSTRUCTO @foreach() +CONSTRUCTO @foreach() ... @endforeach +CONSTRUCTO @forelse() +CONSTRUCTO @forelse() ... @endforelse +CONSTRUCTO @fragment() +CONSTRUCTO @fragment() ... @endfragment +CONSTRUCTO @guest() +CONSTRUCTO @guest() ... @endguest +CONSTRUCTO @hasSection() +CONSTRUCTO @hasSection() ... @endif +CONSTRUCTO @if() +CONSTRUCTO @if() ... @endif +CONSTRUCTO @include() +CONSTRUCTO @includeFirst() +CONSTRUCTO @includeIf() +CONSTRUCTO @includeUnless() +CONSTRUCTO @includeWhen() +CONSTRUCTO @inject() +CONSTRUCTO @isset() +CONSTRUCTO @isset() ... @endisset +CONSTRUCTO @json() +CONSTRUCTO @lang() +CONSTRUCTO @method() +CONSTRUCTO @php ... @endphp +CONSTRUCTO @prepend() +CONSTRUCTO @prepend() ... @endprepend +CONSTRUCTO @push() +CONSTRUCTO @push() ... @endpush +CONSTRUCTO @pushIf() +CONSTRUCTO @pushIf() ... @endPushIf +CONSTRUCTO @readony() v9 +CONSTRUCTO @required() v9 +CONSTRUCTO @section() +CONSTRUCTO @section() ... @endsection +CONSTRUCTO @sectionMissing() +CONSTRUCTO @sectionMissing() ... @endif +CONSTRUCTO @session() v10 +CONSTRUCTO @session() ... @endsession v10 +CONSTRUCTO @stack() +CONSTRUCTO @style() v9 +CONSTRUCTO @switch() +CONSTRUCTO @switch() ... @endswitch +CONSTRUCTO @unless() +CONSTRUCTO @unless() ... @endunless +CONSTRUCTO @use() +CONSTRUCTO @vite() v11 +CONSTRUCTO @yield() diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php new file mode 100644 index 000000000000..3858bd8c876e --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php @@ -0,0 +1 @@ +Hello, {{ $name }}. diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php new file mode 100644 index 000000000000..9516e7ea7e3a --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php @@ -0,0 +1,3 @@ +

      Laravel

      + +Hello, @{{ name }}. diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php new file mode 100644 index 000000000000..ee323cf41bc7 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php @@ -0,0 +1,66 @@ +@extends('layout.layout') +
      + @if (count($records) === 1) + I have one record! + @elseif (count($records) > 1) + I have multiple records! + @else + I don't have any records! + @endif +
      + +@sectionMissing('navigation') +
      + @include('default-navigation') +
      +@endif + +@for ($i = 0; $i < 10; $i++) + The current value is {{ $i }} +@endfor + +@foreach ($users as $user) +

      This is user {{ $user->id }}

      +@endforeach + +@forelse ($users as $user) +
    1. {{ $user->name }}
    2. +@empty +

      No users

      +@endforelse + +@while (true) +

      I'm looping forever.

      +@endwhile + +@php + $isActive = false; + $hasError = true; +@endphp + + $isActive, + 'text-gray-500' => ! $isActive, + 'bg-red' => $hasError, +])> + + + +
      + @include('shared.errors') + +
      + +
      +
      + +@once + @push('scripts') + + @endpush +@endonce + +@use('App\Models\Flight', 'FlightModel') diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php new file mode 100644 index 000000000000..9f9f75fce5bc --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php @@ -0,0 +1 @@ +Hello, {!! $name !!}. diff --git a/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php new file mode 100644 index 000000000000..ee323cf41bc7 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php @@ -0,0 +1,66 @@ +@extends('layout.layout') +
      + @if (count($records) === 1) + I have one record! + @elseif (count($records) > 1) + I have multiple records! + @else + I don't have any records! + @endif +
      + +@sectionMissing('navigation') +
      + @include('default-navigation') +
      +@endif + +@for ($i = 0; $i < 10; $i++) + The current value is {{ $i }} +@endfor + +@foreach ($users as $user) +

      This is user {{ $user->id }}

      +@endforeach + +@forelse ($users as $user) +
    3. {{ $user->name }}
    4. +@empty +

      No users

      +@endforelse + +@while (true) +

      I'm looping forever.

      +@endwhile + +@php + $isActive = false; + $hasError = true; +@endphp + + $isActive, + 'text-gray-500' => ! $isActive, + 'bg-red' => $hasError, +])> + + + +
      + @include('shared.errors') + +
      + +
      +
      + +@once + @push('scripts') + + @endpush +@endonce + +@use('App\Models\Flight', 'FlightModel') diff --git a/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php.errors new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php new file mode 100644 index 000000000000..5eff48815e7c --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php @@ -0,0 +1,9 @@ +@extends('layout.layout') + +@section('content') +
      +@endsection + +@php +$value = $var['1'] +@endphp diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php new file mode 100644 index 000000000000..4e4e5c319125 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php @@ -0,0 +1,3 @@ +@if($f) +@endif +@endif diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors new file mode 100644 index 000000000000..118b39ce090f --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors @@ -0,0 +1 @@ +15-15:extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php deleted file mode 100644 index d195ba0d8de1..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php deleted file mode 100644 index 16532c33e245..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php +++ /dev/null @@ -1 +0,0 @@ -Hello, {{ $name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php deleted file mode 100644 index 56c97d5369a5..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php +++ /dev/null @@ -1,3 +0,0 @@ -

      Laravel

      - -Hello, @{{ name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php deleted file mode 100644 index c52c3f531d8e..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php +++ /dev/null @@ -1,7 +0,0 @@ -@fragment('user-list') -
        - @foreach ($users as $user) -
      • {{ $user->name }}
      • - @endforeach -
      -@endfragment \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php deleted file mode 100644 index 4099847299d0..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php +++ /dev/null @@ -1 +0,0 @@ -Hello, {!! $name !!}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java new file mode 100644 index 000000000000..793227b8c91e --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.io.File; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bogdan + */ +public abstract class BladeGoldenFileTestBase extends BladeTestBase { + + public BladeGoldenFileTestBase(String testName) { + super(testName); + } + + protected abstract String getTestResult(String filename) throws Exception; + + protected void performTest(String filename) throws Exception { + // parse the file + String result = getTestResult(filename); + String fullClassName = this.getClass().getName(); + String goldenFileDir = fullClassName.replace('.', '/'); + // try to find golden file + String goldenFolder = getDataSourceDir().getAbsolutePath() + "/goldenfiles/" + goldenFileDir + "/"; + File goldenFile = new File(goldenFolder + filename + ".pass"); + if (!goldenFile.exists()) { + // if doesn't exist, create it + FileObject goldenFO = touch(goldenFolder, filename + ".pass"); + copyStringToFileObject(goldenFO, result); + } else { + // if exist, compare it. + goldenFile = getGoldenFile(filename + ".pass"); + FileObject resultFO = touch(getWorkDir(), filename + ".result"); + copyStringToFileObject(resultFO, result); + assertFile(FileUtil.toFile(resultFO), goldenFile, getWorkDir()); + } + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java new file mode 100644 index 000000000000..eb069a45f111 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import org.netbeans.modules.csl.api.test.CslTestBase; +import org.netbeans.modules.csl.spi.DefaultLanguageConfig; + +/** + * + * @author bogdan + */ +public abstract class BladeTestBase extends CslTestBase { + + public BladeTestBase(String testName) { + super(testName); + } + + @Override + protected DefaultLanguageConfig getPreferredLanguage() { + return new BladeLanguage(); + } + + @Override + protected String getPreferredMimeType() { + return BladeLanguage.MIME_TYPE; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java similarity index 84% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java index a33a082e1d53..806a193a82f6 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.editor; import java.io.BufferedReader; import java.io.File; @@ -31,11 +31,15 @@ * * @author bhaidu */ -public class BladeUtils { +public final class BladeUtils { + + private BladeUtils() { + + } public static String getFileContent(File file) throws Exception { StringBuffer sb = new StringBuffer(); - String lineSep = "\n";//NOI18N + String lineSep = "\n"; BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String line = br.readLine(); while (line != null) { @@ -70,4 +74,12 @@ public static CommonTokenStream getFormatTokenStream(String content) { tokens.fill(); return tokens; } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java similarity index 68% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java index 4ad3b7ed21c0..364729eb19fd 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java @@ -16,19 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.editor.completion; -import org.junit.Test; +import org.netbeans.modules.php.blade.editor.BladeTestBase; /** * - * @author bhaidu + * @author bogdan */ -public class BladeAntrlLexerTest extends BladeAntlrLexerTestBase { +public class BladeCompletionTest extends BladeTestBase { - public BladeAntrlLexerTest(String testName) { + public BladeCompletionTest(String testName) { super(testName); } - + public void testCompletion_01() throws Exception { + checkCompletion("testfiles/completion/testCompletion_01.blade.php", "@^", false); + } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java new file mode 100644 index 000000000000..81e187df6ab8 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.io.File; +import java.util.Date; +import org.netbeans.modules.php.blade.editor.BladeTestBase; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.Language; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.BladeUtils; + +/** + * + * @author bogdan + */ +public class BladeLexerPerformanceTest extends BladeTestBase { + + public BladeLexerPerformanceTest(String testName) { + super(testName); + } + + public void testFile_01() throws Exception { + testFile("perf_test_01"); + } + + private void testFile(String filename) throws Exception { + Date start = new Date(); + File testFile = new File(getDataDir(), "testfiles/lexer/blade/performance/" + filename + ".blade.php"); + String content = BladeUtils.getFileContent(testFile); + BladeLanguage lang = new BladeLanguage(); + Language language = lang.getLexerLanguage(); + TokenHierarchy.create(content, language); + Date end = new Date(); + long time = end.getTime() - start.getTime(); + long fileSize = testFile.getTotalSpace() / 1024; + String output = String.format( + "Parsing of file(%s: %sKB) takes: %sms", + testFile.getName(), + fileSize, + time + ); +// + System.out.println(output); + assertTrue(time < 200); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java new file mode 100644 index 000000000000..a58a52384c8e --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.io.File; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.BladeUtils; + +/** + * + * @author bogdan + */ +public class BladeLexerTest extends BladeLexerTestBase { + + public BladeLexerTest(String testName) { + super(testName); + } + + public void testRawTag_01() throws Exception { + performTest("raw_tag"); + } + + public void testContentTag_01() throws Exception { + performTest("content_tag"); + } + + public void testEscapedTag_01() throws Exception { + performTest("escaped_tag"); + } + + @Override + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/lexer/blade/" + filename + ".blade.php")); + BladeLanguage lang = new BladeLanguage(); + Language language = lang.getLexerLanguage(); + TokenHierarchy hierarchy = TokenHierarchy.create(content, language); + return createResult(hierarchy.tokenSequence(language)); + } + + private String createResult(TokenSequence ts) throws Exception { + StringBuilder result = new StringBuilder(); + while (ts.moveNext()) { + BladeTokenId tokenId = ts.token().id(); + CharSequence text = ts.token().text(); + result.append("Token #"); + result.append(ts.index()); + result.append(" "); + result.append(tokenId.name()); + String token = BladeUtils.replaceLinesAndTabs(text.toString()); + if (!token.isEmpty()) { + result.append(" "); + result.append("["); + result.append(token); + result.append("]"); + } + result.append("\n"); + } + + return result.toString(); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java new file mode 100644 index 000000000000..953c650fce66 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import org.netbeans.modules.php.blade.editor.BladeGoldenFileTestBase; + +/** + * + * @author bogdan + */ +public abstract class BladeLexerTestBase extends BladeGoldenFileTestBase { + + public BladeLexerTestBase(String testName) { + super(testName); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + clearWorkDir(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java similarity index 69% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java index 885de18ce54f..3fa71b9fbc8b 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java @@ -16,23 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.editor.parser; -import org.junit.Test; +import org.netbeans.modules.php.blade.editor.BladeTestBase; /** * - * @author bhaidu + * @author bogdan */ -public class BladeAntrlColoringLexerTest extends BladeAntlrColoringLexerTestBase { +public class BladeParserErrorTest extends BladeTestBase { - public BladeAntrlColoringLexerTest(String testName) { + public BladeParserErrorTest(String testName) { super(testName); } - @Test - public void test_smoke_content_tag() throws Exception { - performTest("coloring_lexer/smoke/content_tag.blade.php"); + public void testUnopendSetError_01() throws Exception { + checkErrors("testfiles/parser/unopend/unopend_set_error_01.blade.php"); } - } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java new file mode 100644 index 000000000000..bfe1b0c2712a --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import static junit.framework.TestCase.assertNotNull; +import static junit.framework.TestCase.assertTrue; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.php.blade.editor.BladeTestBase; + +/** + * + * @author bogdan + */ +public class ParserPerformanceTest extends BladeTestBase { + + public ParserPerformanceTest(String testName) { + super(testName); + } + + public void testFile_01() throws Exception { + testFile("testfiles/parser/performance/perf_test_01.blade.php"); // 1.01MB + } + + private void testFile(String filePath) throws Exception { + Source testSource = getTestSource(getTestFile(filePath)); + + Date start = new Date(); + ParserManager.parse(Collections.singleton(testSource), new UserTask() { + public @Override + void run(ResultIterator resultIterator) throws Exception { + Parser.Result r = resultIterator.getParserResult(); + assertNotNull(r); + assertTrue(r instanceof ParserResult); + + ParserResult pr = (ParserResult) r; + List diagnostics = pr.getDiagnostics(); + String annotatedSource = annotateErrors(diagnostics); + assertDescriptionMatches(filePath, annotatedSource, false, ".errors"); + } + }); + Date end = new Date(); + + long time = end.getTime() - start.getTime(); + long fileSize = testSource.getFileObject().getSize() / 1024; + String output = String.format( + "Parsing of file(%s: %sKB) takes: %sms", + testSource.getFileObject().getName(), + fileSize, + time + ); +// + System.out.println(output); + assertTrue(time < 500); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java deleted file mode 100644 index 0b99deee6f93..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Token; -import org.netbeans.junit.NbTestCase; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; - -/** - * - * @author bhaidu - */ -public class BladeAntlrColoringLexerTestBase extends BladeBaseTest { - - public BladeAntlrColoringLexerTestBase(String testName) { - super(testName); - } - - public static final FileObject copyStringToFileObject(FileObject fo, String content) throws IOException { - OutputStream os = fo.getOutputStream(); - try { - InputStream is = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); - try { - FileUtil.copy(is, os); - return fo; - } finally { - is.close(); - } - } finally { - os.close(); - } - } - - protected void performTest(String filename) throws Exception { - String result = getTestResult(filename); - String goldenFolder = getDataDir() + "/goldenfiles/"; - File goldenFile = new File(goldenFolder + filename + ".pass"); - if (!goldenFile.exists()) { - FileObject goldenFO = touch(goldenFolder, filename + ".pass"); - copyStringToFileObject(goldenFO, result); - } else { - // if exist, compare it. - FileObject resultFO = touch(getWorkDir(), filename + ".result"); - copyStringToFileObject(resultFO, result); - assertFile(FileUtil.toFile(resultFO), goldenFile, getWorkDir()); - } - } - - protected String getTestResult(String filename) throws Exception { - String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); - CommonTokenStream tokenStream = BladeUtils.getColoringTokenStream(content); - System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); - return createResult(tokenStream); - } - - protected String createResult(CommonTokenStream tokenStream) throws Exception { - StringBuilder result = new StringBuilder(); - - for (Token token : tokenStream.getTokens()) { - switch (token.getType()) { - case HTML: - result.append("HTML "); - break; - case RAW_TAG: - result.append("RAW_TAG "); - break; - case PHP_EXPRESSION: - result.append("PHP_EXPRESSION "); - break; - case BLADE_PHP_ECHO_EXPR: - result.append("PHP_BLADE_ECHO_EXPR "); - break; - case BLADE_PHP_INLINE: - result.append("BLADE_PHP_INLINE "); - break; - default: - result.append(token.getType()); - result.append(" "); - break; - } - - String text = replaceLinesAndTabs(token.getText()); - result.append(text); - result.append(";"); - result.append("\n"); - } - - return result.toString(); - } - - public static String replaceLinesAndTabs(String input) { - String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N - return escapedString; - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java deleted file mode 100644 index bdef2ab6bb9b..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Token; -import org.netbeans.junit.NbTestCase; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; - -/** - * - * @author bhaidu - */ -public class BladeAntlrLexerTestBase extends NbTestCase { - - public BladeAntlrLexerTestBase(String testName) { - super(testName); - } - - public File getDataDir() { - URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); - File dataDir = null; - try { - dataDir = new File(new File(codebase.toURI()), "data"); - } catch (URISyntaxException x) { - throw new Error(x); - } - return dataDir; - } - - protected void performTest(String filename) throws Exception { - performTest(filename, null); - } - - protected String getTestResult(String filename, String caretLine) throws Exception { - return getTestResult(filename); - } - - protected void performTest(String filename, String caretLine) throws Exception { - // parse the file - String result = getTestResult(filename, caretLine); - System.out.print(result); - } - - protected String getTestResult(String filename) throws Exception { - String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); - CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); - System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); - return createResult(tokenStream); - } - - protected String createResult(CommonTokenStream tokenStream) throws Exception { - StringBuilder result = new StringBuilder(); - - for (Token token : tokenStream.getTokens()) { - int channel = token.getChannel(); - switch (token.getType()) { - case BL_PARAM_STRING: - result.append("BL_PARAM_STRING "); - break; - case BL_NAME_STRING: - result.append("BL_NAME_STRING "); - break; - case BL_COMMA: - result.append("BL_COMMA "); - break; - case BL_PARAM_COMMA: - result.append("BL_PARAM_COMMA "); - break; - case BLADE_PARAM_LPAREN: - result.append("BLADE_PARAM_LPAREN "); - break; - case BLADE_PARAM_RPAREN: - result.append("BLADE_PARAM_RPAREN "); - break; - case BLADE_PARAM_EXTRA: - result.append("BLADE_PARAM_EXTRA "); - break; - case D_VERBATIM: - result.append("D_VERBATIM "); - break; - case D_ENDVERBATIM: - result.append("D_ENDVERBATIM "); - break; - case HTML: - result.append("HTML "); - break; - default: - result.append(token.getType()); - result.append(" "); - break; - } - - String text = replaceLinesAndTabs(token.getText()); - result.append(text); - result.append(";"); - result.append("\n"); - } - - return result.toString(); - } - - public static String replaceLinesAndTabs(String input) { - String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N - return escapedString; - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java deleted file mode 100644 index 13923a4bf3f6..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.netbeans.junit.NbTestCase; -import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; - -/** - * - * @author bhaidu - */ -public class BladeAntlrParserTestBase extends NbTestCase { - - public BladeAntlrParserTestBase(String testName) { - super(testName); - } - - public File getDataDir() { - URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); - File dataDir = null; - try { - dataDir = new File(new File(codebase.toURI()), "data"); - } catch (URISyntaxException x) { - throw new Error(x); - } - return dataDir; - } - - protected void performTest(String filename) throws Exception { - performTest(filename, null); - } - - protected String getTestResult(String filename, String caretLine) throws Exception { - return getTestResult(filename); - } - - protected void performTest(String filename, String caretLine) throws Exception { - // parse the file - String result = getTestResult(filename, caretLine); - System.out.print(result); - } - - protected String getTestResult(String filename) throws Exception { - String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); - ParsingUtils parsingUtils = new ParsingUtils(); - parsingUtils.parsePhpText(content); - CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); - System.out.print("\n---Psrser scan for <<" + filename + ">>\n\n"); - BladeAntlrParser parser = new BladeAntlrParser(tokenStream); - ParseTreeListener listener = new BladeAntlrParserBaseListener(){ - - }; - parser.addParseListener(listener); - parser.file(); - System.out.println(parser.getBuildParseTree()); - - return createResult(tokenStream); - } - - protected String createResult(CommonTokenStream tokenStream) throws Exception { - StringBuilder result = new StringBuilder(); - - for (Token token : tokenStream.getTokens()) { - switch (token.getType()) { -// case BLADE_ESCAPED_CONTENT: -// result.append("BLADE_ESCAPED_CONTENT "); -// break; - } - - String text = replaceLinesAndTabs(token.getText()); - result.append(text); - result.append(";"); - result.append("\n"); - } - - return result.toString(); - } - - public static String replaceLinesAndTabs(String input) { - String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N - return escapedString; - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java deleted file mode 100644 index 0cbd29122d83..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import static junit.framework.TestCase.assertTrue; -import org.netbeans.junit.NbTestCase; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; - -/** - * - * @author bhaidu - */ -public abstract class BladeBaseTest extends NbTestCase { - - public BladeBaseTest(String testName) { - super(testName); - } - - protected FileObject touch(final FileObject dir, final String path) throws IOException { - return FileUtil.createData(dir, path); - } - - public File getDataDir() { - URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); - File dataDir = null; - try { - dataDir = new File(new File(codebase.toURI()), "data"); - } catch (URISyntaxException x) { - throw new Error(x); - } - return dataDir; - } - - - protected FileObject touch(final String dir, final String path) throws IOException { - return touch(new File(dir), path); - } - - protected FileObject touch(final File dir, final String path) throws IOException { - if (!dir.isDirectory()) { - assertTrue("success to create " + dir, dir.mkdirs()); - } - FileObject dirFO = FileUtil.toFileObject(FileUtil.normalizeFile(dir)); - return touch(dirFO, path); - } - - abstract protected String getTestResult(String filename) throws Exception; -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java new file mode 100644 index 000000000000..cd646c7abfb1 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import java.io.File; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.Vocabulary; +import org.netbeans.modules.php.blade.editor.BladeUtils; + +/** + * + * @author bogdan + */ +public class AntlrColoringLexerTest extends AntlrLexerTestBase { + + public AntlrColoringLexerTest(String testName) { + super(testName); + } + + public void testRawTag_01() throws Exception { + performTest("lexer/blade/raw_tag"); + } + + public void testContentTag_01() throws Exception { + performTest("lexer/blade/content_tag"); + } + + public void testEscapedTag_01() throws Exception { + performTest("lexer/blade/escaped_tag"); + } + + @Override + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename + ".blade.php")); + CharStream stream = CharStreams.fromString(content); + BladeAntlrColoringLexer lexer = new BladeAntlrColoringLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return createResult(tokens, lexer.getVocabulary()); + } + + private String createResult(CommonTokenStream tokenStream, Vocabulary vocabulary) throws Exception { + StringBuilder result = new StringBuilder(); + for (Token token : tokenStream.getTokens()) { + int tokenId = token.getType(); + String text = token.getText(); + result.append("Token #"); + result.append(tokenId); + result.append(" "); + result.append(vocabulary.getDisplayName(tokenId)); + String tokenText = BladeUtils.replaceLinesAndTabs(text); + if (!tokenText.isEmpty()) { + result.append(" "); + result.append("["); + result.append(token); + result.append("]"); + } + result.append("\n"); + } + + return result.toString(); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java new file mode 100644 index 000000000000..573944a71e6f --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.netbeans.modules.php.blade.editor.BladeGoldenFileTestBase; + +/** + * + * @author bogdan + */ +public abstract class AntlrLexerTestBase extends BladeGoldenFileTestBase { + + public AntlrLexerTestBase(String testName) { + super(testName); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + clearWorkDir(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserTestBase.java similarity index 65% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserTestBase.java index 1b9e8a885891..0b61ba9ed8fd 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserTestBase.java @@ -16,18 +16,29 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.syntax.antlr4.v10; -import org.junit.Test; +import org.netbeans.modules.php.blade.editor.BladeTestBase; /** * * @author bhaidu */ -public class BladeAntrlParserTest extends BladeAntlrParserTestBase { +public abstract class BladeAntlrParserTestBase extends BladeTestBase { - public BladeAntrlParserTest(String testName) { + public BladeAntlrParserTestBase(String testName) { super(testName); } -} + @Override + protected void setUp() throws Exception { + super.setUp(); + clearWorkDir(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + +} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java new file mode 100644 index 000000000000..09a48461b4bd --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import java.io.File; +import java.util.Date; +import static junit.framework.TestCase.assertTrue; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; + +/** + * + * @author bhaidu + */ +public class BladeAntrlParserTest extends BladeAntlrParserTestBase { + + public BladeAntrlParserTest(String testName) { + super(testName); + } + + public void testSmokeFile_01() throws Exception { + testFile("smoke/test_01"); + } + + private void testFile(String filename) throws Exception { + Date start = new Date(); + File testFile = new File(getDataDir(), "testfiles/parser/" + filename + ".blade.php"); + String content = org.netbeans.modules.php.blade.editor.BladeUtils.getFileContent(testFile); + CharStream stream = CharStreams.fromString(content); + BladeAntlrLexer lexer = new BladeAntlrLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + BladeAntlrParser parser = new BladeAntlrParser(tokens); + parser.setBuildParseTree(false); + parser.file(); + Date end = new Date(); + long time = end.getTime() - start.getTime(); + long fileSize = testFile.getTotalSpace() / 1024; + String output = String.format( + "Parsing of file(%s: %sKB) takes: %sms", + testFile.getName(), + fileSize, + time + ); +// + System.out.println(output); + assertTrue(time < 200); + } +} From bc66ee04e9873c1817cc5426f26e43d8f75b7e5e Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 07:42:32 +0300 Subject: [PATCH 08/21] batch of reviews changes //NOI18N for strings, permission refactoring, switch statement refactor --- .../php/blade/csl/elements/ClassElement.java | 2 + .../php/blade/csl/elements/NamedElement.java | 6 +-- .../csl/elements/PhpFunctionElement.java | 8 +-- .../php/blade/csl/elements/TagElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 25 +++++----- .../php/blade/editor/BladeCommentHandler.java | 16 +++--- .../blade/editor/BladeDeclarationFinder.java | 47 +++++++++--------- .../php/blade/editor/BladeLanguage.java | 11 ----- .../blade/editor/BladeSemanticAnalyzer.java | 5 -- .../modules/php/blade/editor/EditorUtils.java | 4 +- .../blade/editor/HyperlinkProviderImpl.java | 49 ++++++++++--------- .../php/blade/editor/ResourceUtilities.java | 2 +- .../ComponentsCompletionService.java | 40 +++++++-------- .../components/annotation/Namespace.java | 2 +- .../blade/project/BladeProjectProperties.java | 13 ++--- .../blade/project/BladeProjectSupport.java | 9 +--- .../php/blade/project/ComponentsSupport.java | 8 +-- .../modules/php/blade/editor/BladeUtils.java | 6 +-- 18 files changed, 121 insertions(+), 134 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java index 5b68135c1577..d86cfc87b880 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.csl.elements; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -47,6 +48,7 @@ public ElementKind getKind() { return ElementKind.CLASS; } + @CheckForNull public String getNamespace() { return namespace; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 73b3d40ab1b1..2e4dc2484fb0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -37,9 +37,9 @@ */ public class NamedElement implements ElementHandle { - protected final String name; - protected final FileObject file; - protected final ElementType type; + private final String name; + private final FileObject file; + private final ElementType type; public NamedElement(String name, FileObject file) { this.name = name; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 0555a9898996..c715c2fcc0d1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -19,6 +19,7 @@ package org.netbeans.modules.php.blade.csl.elements; import java.util.List; +import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -28,6 +29,7 @@ */ public class PhpFunctionElement extends NamedElement { + @NullAllowed public final String namespace; private final List params; @@ -37,7 +39,7 @@ public PhpFunctionElement(String name, FileObject file, List params) { super(name, file, type); this.namespace = namespace; - this.params = params; + this.params = List.copyOf(params); } public PhpFunctionElement(String name, FileObject file, @@ -45,7 +47,7 @@ public PhpFunctionElement(String name, FileObject file, List params) { super(name, file, type); this.namespace = null; - this.params = params; + this.params = List.copyOf(params); } @Override @@ -55,7 +57,7 @@ public ElementKind getKind() { public String getParamsAsString() { if (params == null || params.isEmpty()) { - return "()"; + return "()"; // NOI18N } return "(" + String.join(", ", params) + ")"; // NOI18N } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java index 522b3796e436..63bab6ec475e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -69,7 +69,7 @@ public ElementKind getKind() { @Override public Set getModifiers() { - return new HashSet<>(); + return Set.of(); } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index a772fa38abd7..785185316ca8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -23,6 +23,7 @@ import java.util.List; import javax.swing.text.BadLocationException; import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.editor.mimelookup.MimeRegistration; import org.netbeans.editor.BaseDocument; @@ -44,11 +45,11 @@ public class BladeBracesMatcher implements BracesMatcher { public enum BraceDirectionType { - END_TO_START, START_TO_END, CUSTOM_START_TO_END, CURLY_END_TO_START, CURLY_START_TO_END, STOP - } + END_TO_START, START_TO_END, CUSTOM_START_TO_END, CURLY_END_TO_START, CURLY_START_TO_END, STOP, NONE + }; private final MatcherContext context; private Token originToken; - private BraceDirectionType currentDirection; + private BraceDirectionType currentDirection = BraceDirectionType.NONE; private BladeBracesMatcher(MatcherContext context) { this.context = context; @@ -102,6 +103,7 @@ public int[] findMatches() throws InterruptedException, BadLocationException { if (originToken == null) { return null; } + String tokenText = originToken.getText(); return switch (currentDirection) { @@ -121,7 +123,7 @@ private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { }; } - public BraceDirectionType findBraceDirectionType(String tokenText, Token token) { + private BraceDirectionType findBraceDirectionType(String tokenText, Token token) { boolean isCloseTag = Arrays.asList(BladeTagsUtils.outputCloseTags()).indexOf(tokenText) >= 0; if (isCloseTag) { @@ -143,7 +145,6 @@ public BraceDirectionType findBraceDirectionType(String tokenText, Token token) return BraceDirectionType.START_TO_END; } - //TODO get more directive context if (token.getType() == BladeAntlrLexer.D_CUSTOM || token.getType() == BladeAntlrLexer.D_UNKNOWN) { return BraceDirectionType.CUSTOM_START_TO_END; @@ -152,7 +153,7 @@ public BraceDirectionType findBraceDirectionType(String tokenText, Token token) return BraceDirectionType.STOP; } - public int[] findOpenTag() { + private int[] findOpenTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); List skipableTokenTypes = new ArrayList<>(); skipableTokenTypes.add(HTML); @@ -188,7 +189,8 @@ public int[] findCloseTag() { return null; } - public int[] findDirectiveEnd(String directive) { + @CheckForNull + private int[] findDirectiveEnd(String directive) { String[] pair = BladeDirectivesUtils.directiveStart2EndPair(directive); if (pair == null){ return null; @@ -210,7 +212,6 @@ public int[] findDirectiveEnd(String directive) { startDirectiveForBalance); if (endToken != null) { - //String text = endToken.getText(); int start = endToken.getStartIndex(); int end = endToken.getStopIndex(); return new int[]{start, end + 1}; @@ -219,8 +220,9 @@ public int[] findDirectiveEnd(String directive) { return null; } - public int[] findCustomDirectiveEnd(String directive) { - String endPrefix = "@end"; // NOI18N + @CheckForNull + private int[] findCustomDirectiveEnd(String directive) { + String endPrefix = BladeDirectivesUtils.END_DIRECTIVE_PREFIX; String[] pair = new String[]{endPrefix + directive.substring(1)}; List stopDirectives = Arrays.asList(pair); List startDirectiveForBalance = Arrays.asList(new String[]{directive}); @@ -239,7 +241,8 @@ public int[] findCustomDirectiveEnd(String directive) { return null; } - public int[] findOriginForDirectiveEnd(String directive) { + @CheckForNull + private int[] findOriginForDirectiveEnd(String directive) { String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); List endDirectivesForBalance = new ArrayList<>(); List openDirectives = Arrays.asList(pair); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java index 388f71f475d4..dc3964efc9f6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.editor; +import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import org.netbeans.api.lexer.Token; @@ -39,6 +40,8 @@ public class BladeCommentHandler extends CommentHandler.DefaultCommentHandler { private static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N private static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N + + private static final Logger LOGGER = Logger.getLogger(BladeCommentHandler.class.getName()); @Override public String getCommentStartDelimiter() { @@ -69,7 +72,7 @@ public void run() { if (token != null && token.id() instanceof BladeTokenId) { //handle uncomment switch ((BladeTokenId) token.id()) { - case BLADE_COMMENT_START: + case BLADE_COMMENT_START -> { bounds[0] = ts.offset(); while (ts.moveNext()) { @@ -78,12 +81,11 @@ public void run() { break; } } - break; - case BLADE_DIRECTIVE: + } + case BLADE_DIRECTIVE -> { bounds[0] = ts.offset(); - ts.moveNext(); - if (ts.token().id() == BladeTokenId.PHP_BLADE_EXPRESSION) { + if (ts.moveNext() && ts.token().id() == BladeTokenId.PHP_BLADE_EXPRESSION) { bounds[1] = ts.offset() + ts.token().length(); } @@ -94,9 +96,9 @@ public void run() { bounds[0] = 0; bounds[1] = 0; } catch (BadLocationException ex) { - Exceptions.printStackTrace(ex); + LOGGER.warning(ex.getMessage()); } - break; + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index a530258e7cd5..a94cc7c18cd1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import org.antlr.v4.runtime.CharStreams; @@ -60,7 +61,7 @@ /** * focuses mainly on string inputs - * + * * ?? TODO implement a Extension module * * @author bhaidu @@ -69,28 +70,24 @@ public class BladeDeclarationFinder implements DeclarationFinder { private int currentTokenId; private String tokenText; + private static final Logger LOGGER = Logger.getLogger(BladeDeclarationFinder.class.getName()); @Override public OffsetRange getReferenceSpan(Document document, int caretOffset) { BaseDocument baseDoc = (BaseDocument) document; - //baseDoc.readLock(); AntlrTokenSequence tokens = null; OffsetRange offsetRange = OffsetRange.NONE; tokenText = null; int lineOffset = caretOffset; + try { - try { - String text = baseDoc.getText(0, baseDoc.getLength()); - tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); - } catch (BadLocationException ex) { - //Exceptions.printStackTrace(ex); - } - } finally { - //baseDoc.readUnlock(); + String text = baseDoc.getText(0, baseDoc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + LOGGER.warning(ex.getMessage()); } - //inside php expression context ?? if (tokens == null || tokens.isEmpty()) { return offsetRange; } @@ -101,16 +98,21 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { org.antlr.v4.runtime.Token nt = tokens.next().get(); switch (nt.getType()) { - case D_CUSTOM: - case PHP_IDENTIFIER: - case PHP_NAMESPACE_PATH: + case D_CUSTOM, PHP_IDENTIFIER, PHP_NAMESPACE_PATH -> { return new OffsetRange(nt.getStartIndex(), nt.getStopIndex() + 1); - case HTML_COMPONENT_PREFIX: + } + case HTML_COMPONENT_PREFIX -> { //direct detection currentTokenId = HTML_COMPONENT_PREFIX; - //remove ' 3 ? nt.getText() : null; + + if (nt.getText().length() <= 3) { + return offsetRange; + } + + tokenText = nt.getText(); + return new OffsetRange(nt.getStartIndex() + 1, nt.getStopIndex() + 1); + } } if (!tokens.hasPrevious()) { @@ -199,7 +201,7 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { FileObject sourceFolder = projectOwner.getProjectDirectory(); String referenceIdentifier = reference.identifier; - + switch (reference.type) { case EXTENDS: case INCLUDE: @@ -309,7 +311,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(classLocation)); } return location; - case PHP_METHOD:{ + case PHP_METHOD: { if (reference.ownerClass == null) { return location; } @@ -322,8 +324,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } Collection indexMethodResults = PhpIndexUtils.queryExactClassMethods(sourceFolder, referenceIdentifier, reference.ownerClass, queryNamespace); - - + for (PhpIndexFunctionResult indexResult : indexMethodResults) { PhpFunctionElement resultHandle = new PhpFunctionElement( referenceIdentifier, @@ -373,7 +374,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { return location; case USE: case INJECT: - case PHP_NAMESPACE_PATH_TYPE:{ + case PHP_NAMESPACE_PATH_TYPE: { Collection indexNamespaceResults; if (reference.namespace != null) { indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, @@ -406,7 +407,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { case VITE_PATH: VitePathDeclarationService vitePathDeclService = new VitePathDeclarationService(sourceFolder); FileObject viteAssetFile = vitePathDeclService.findFileObject(referenceIdentifier); - if (viteAssetFile == null || !viteAssetFile.isValid()){ + if (viteAssetFile == null || !viteAssetFile.isValid()) { return location; } NamedElement resultHandle = new NamedElement(referenceIdentifier, viteAssetFile, ElementType.ASSET_FILE); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index 8a8f9bf49b49..b35f4f683d10 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -168,17 +168,6 @@ public DeclarationFinder getDeclarationFinder() { public SemanticAnalyzer getSemanticAnalyzer() { return new BladeSemanticAnalyzer(); } -// -// @Override -// public boolean hasOccurrencesFinder() { -// return true; -// } -// -// @Override -// public OccurrencesFinder getOccurrencesFinder() { -// //practical just for php context -// return new BladeOcurrencesFinder(); -// } /** * flag for detecting if we are in a string context enables to select the diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java index 30d7b88b87e8..7d69ad749b68 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java @@ -95,11 +95,6 @@ public void run(BladeParserResult parserResult, SchedulerEvent event) { highlights.put(entry.getKey(), UNDEFINED_FIELD_SET); } -// List errorList = parserResult.getDiagnostics(); -// for (org.netbeans.modules.csl.api.Error error : errorList) { -// OffsetRange range = new OffsetRange(error.getStartPosition(), error.getEndPosition()); -// highlights.put(range, UNDEFINED_FIELD_SET); -// } this.semanticHighlights = highlights; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java index f504563d315b..820a99f603f9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java @@ -36,7 +36,7 @@ private EditorUtils() { } @CheckForNull - public static FileObject getFileObjectFromDoc(Document doc) { + public static FileObject getFileObject(Document doc) { DataObject dObject = NbEditorUtilities.getDataObject(doc); if (dObject != null) { return dObject.getPrimaryFile().getParent(); @@ -46,7 +46,7 @@ public static FileObject getFileObjectFromDoc(Document doc) { @CheckForNull public static Project getProjectOwner(Document doc) { - FileObject file = getFileObjectFromDoc(doc); + FileObject file = getFileObject(doc); if (file == null) { return null; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 50289a746ee3..4edf290dbe50 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -33,6 +33,7 @@ import org.netbeans.api.lexer.TokenSequence; import org.netbeans.api.project.Project; import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.lexer.PHPLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.BladeProjectProperties; @@ -48,12 +49,12 @@ * * @author bhaidu */ -@MimeRegistration(mimeType = "text/x-php5", service = HyperlinkProviderExt.class) +@MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = HyperlinkProviderExt.class) public class HyperlinkProviderImpl implements HyperlinkProviderExt { - private String methodName; + private String methodName = ""; // NOI18N private String identifiableText; - private String tooltipText = ""; + private String tooltipText = ""; // NOI18N private FileObject goToFile; private int goToOffset = 0; @@ -102,6 +103,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { String focusedText = currentToken.text().toString(); //2 char config are not that relevant + //quote x 2 + min 3 length config if (focusedText.length() < 5 || !EditorStringUtils.isQuotedString(focusedText)) { return null; } @@ -121,10 +123,8 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { methodName = text; //tooltip text switch (methodName) { - case "view": - case "make": - case "render": - FileObject currentFile = EditorUtils.getFileObjectFromDoc(doc); + case "view", "make", "render" -> { + FileObject currentFile = EditorUtils.getFileObject(doc); if (currentFile == null) { return null; @@ -134,19 +134,21 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { for (FileObject includedFile : includedFiles) { goToFile = includedFile; - tooltipText = "Blade Template File : " + viewPath - + "

      " + identifiableText + ""; + tooltipText = "Blade Template File : " + viewPath // NOI18N + + "

      " + identifiableText + ""; // NOI18N goToOffset = 0; break; } return new int[]{startOffset, startOffset + currentToken.length()}; - default: + } + default -> { return null; + } } } - if (id.equals(PHPTokenId.PHP_TOKEN) && text.equals("(")) { + if (id.equals(PHPTokenId.PHP_TOKEN) && text.equals("(")) { // NOI18N prevTokenId = id; } } @@ -156,24 +158,25 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { @Override public void performClickAction(Document doc, int offset, HyperlinkType type) { switch (type) { - case GO_TO_DECLARATION: + case GO_TO_DECLARATION -> { switch (methodName) { - case "view": // NOI18N - case "make": // NOI18N - case "render": // NOI18N + case "view", "make", "render" -> // NOI18N + { if (goToFile != null) { openDocument(goToFile, goToOffset); } - break; + } + default -> { + //no-op + } } - break; - case ALT_HYPERLINK: + } + case ALT_HYPERLINK -> { JTextComponent focused = EditorRegistry.focusedComponent(); if (focused != null && focused.getDocument() == doc) { focused.setCaretPosition(offset); - //GoToImplementation.goToImplementation(focused); } - break; + } } } @@ -190,17 +193,17 @@ private void openDocument(FileObject f, int offset) { private boolean nonLaravelDeclFinderEnabled(Document doc) { Project projectOwner = EditorUtils.getProjectOwner(doc); - if (projectOwner == null){ + if (projectOwner == null) { return false; } BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(projectOwner); - + return bladeProperties.getNonLaravelDeclFinderFlag(); } @Override public String getTooltipText(Document doc, int offset, HyperlinkType type) { - return "" + tooltipText + ""; + return "" + tooltipText + ""; // NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index 67c5e8ee90dd..e44652dc2d6e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -36,7 +36,7 @@ public final class ResourceUtilities { public static final String COMPONENT_TAG = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N - private ResourceUtilities(){ + private ResourceUtilities() { } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java index 09f460f93124..ac2a2deabc01 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -22,9 +22,12 @@ import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; import java.util.ArrayList; import java.util.Collection; +import java.util.Map; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.project.ComponentsSupport; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.openide.filesystems.FileObject; @@ -33,35 +36,28 @@ * * @author bhaidu */ -@NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), // NOI18N - @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), // NOI18N - @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"), // NOI18N - @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N - @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N - @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N - @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N -}) + public class ComponentsCompletionService { + @CheckForNull public Collection queryComponents(String prefix, FileObject fo) { Collection results = new ArrayList<>(); Project project = ProjectUtils.getMainOwner(fo); - for (Namespace namespace : getNamespaces()){ - if (namespace.from_app()){ - //check if folder exists - if (project.getProjectDirectory().getFileObject(namespace.relativeFilePath()) == null){ - continue; - } - } - results.addAll(PhpIndexUtils.queryNamespaceClassesName(prefix, namespace.path(), fo)); + + if (project == null){ + return results; } - return results; - } + ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); - public Namespace[] getNamespaces() { - NamespaceRegister namespaceRegister = this.getClass().getAnnotation(NamespaceRegister.class); - return namespaceRegister.value(); + if (!componentSupport.isScanned()){ + componentSupport.scanForInstalledComponents(); + } + + for (Map.Entry namespace : componentSupport.getInstalledComponentNamespace().entrySet()){ + results.addAll(PhpIndexUtils.queryNamespaceClassesName(prefix, namespace.getValue().path(), fo)); + } + + return results; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java index 7988f90d1aa9..4fede8568c49 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java @@ -27,6 +27,6 @@ String relativeFilePath() default ""; String packageName() default "blade"; // NOI18N //inside App folder - boolean from_app() default false; + boolean fromApp() default false; boolean from_vendor() default true; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 4c625962edc1..91f5219449dd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.prefs.PreferenceChangeListener; import java.util.prefs.Preferences; import javax.swing.DefaultListModel; @@ -27,7 +28,6 @@ import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; -//import org.netbeans.modules.php.blade.editor.actions.ToggleBlockCommentAction; import org.openide.util.NbPreferences; /** @@ -42,11 +42,12 @@ public final class BladeProjectProperties { private static final String DIRECTIVE_CUSTOMIZER_PATH_LIST = "directive_customizer.path.list"; // NOI18N private static final String VIEW_PATH_LIST = "views.path.list"; // NOI18N private static final String NON_LARAVEL_DECL_FINDER = "non_laravel.decl.finder"; // NOI18N - public final Project project; + private final Project project; private DefaultListModel directiveCustomizerPathList = new DefaultListModel(); private DefaultListModel viewsPathList = new DefaultListModel(); - private boolean nonLaravelDeclFinder = false; + // declaration finder outside of framework plugin + private final AtomicBoolean nonLaravelDeclFinder = new AtomicBoolean(false); private BladeProjectProperties(Project project) { this.project = project; @@ -81,7 +82,7 @@ private Preferences getPreferences() { private void initModelsFromPreferences() { directiveCustomizerPathList = createModelForDirectiveCusomizerPathList(); viewsPathList = createModelForViewsPathList(); - nonLaravelDeclFinder = getPreferences().getBoolean(NON_LARAVEL_DECL_FINDER, false); + nonLaravelDeclFinder.set(getPreferences().getBoolean(NON_LARAVEL_DECL_FINDER, false)); } public void storeDirectiveCustomizerPaths() { @@ -95,7 +96,7 @@ public void storeViewsPaths() { } public void storeNonLaravelDeclFinderFlag(boolean status) { - nonLaravelDeclFinder = status; + nonLaravelDeclFinder.set(status); getPreferences().putBoolean(NON_LARAVEL_DECL_FINDER, status); } @@ -137,7 +138,7 @@ public DefaultListModel getModelViewsPathList() { } public boolean getNonLaravelDeclFinderFlag() { - return nonLaravelDeclFinder; + return nonLaravelDeclFinder.get(); } private DefaultListModel creatModelFromPreferences(String pathName) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java index 847131a0f082..f8cbd7e6caae 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java @@ -18,8 +18,6 @@ */ package org.netbeans.modules.php.blade.project; -import java.util.prefs.PreferenceChangeEvent; -import java.util.prefs.PreferenceChangeListener; import org.netbeans.api.project.Project; import org.netbeans.spi.project.ProjectServiceProvider; import org.netbeans.spi.project.ui.ProjectOpenedHook; @@ -27,7 +25,7 @@ * * @author bhaidu */ -public class BladeProjectSupport extends ProjectOpenedHook implements PreferenceChangeListener{ +public class BladeProjectSupport extends ProjectOpenedHook { private final Project project; public BladeProjectSupport(Project project) { @@ -54,11 +52,6 @@ public static BladeProjectSupport forPhpProject(Project project) { public static BladeProjectSupport forWebProject(Project project) { return create(project); } - - @Override - public void preferenceChange(PreferenceChangeEvent evt) { - // - } @Override protected void projectOpened() { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index f6b6d6c37466..8d6e7b87458e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -30,9 +30,9 @@ * @author bogdan */ @NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), // NOI18N - @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), // NOI18N - @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"), // NOI18N + @Namespace(path = "App\\View\\Components", fromApp = true, relativeFilePath = "app/View/Components"), // NOI18N + @Namespace(path = "App\\Http\\Livewire", fromApp = true, relativeFilePath = "app/Http/Livewire"), // NOI18N + @Namespace(path = "App\\Livewire", fromApp = true, relativeFilePath = "app/Livewire"), // NOI18N @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), // NOI18N @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) // NOI18N @@ -61,7 +61,7 @@ public static ComponentsSupport getInstance(Project project) { public void scanForInstalledComponents() { for (Namespace namespace : getRegisteredNamespaces()) { FileObject fo; - if (namespace.from_app()) { + if (namespace.fromApp()) { //check if folder exists fo = project.getProjectDirectory().getFileObject(namespace.relativeFilePath()); } else { diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java index 806a193a82f6..b11664a72af2 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java @@ -77,9 +77,9 @@ public static CommonTokenStream getFormatTokenStream(String content) { public static String replaceLinesAndTabs(String input) { String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + escapedString = escapedString.replaceAll("\n", "\\\\n"); + escapedString = escapedString.replaceAll("\r", "\\\\r"); + escapedString = escapedString.replaceAll("\t", "\\\\t"); return escapedString; } } From f47f3af684cf51bc5332291889a0520264fa1659 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 07:51:24 +0300 Subject: [PATCH 09/21] switch refacotr, // NOI18N, safe case for null pointer --- .../php/blade/editor/BladeBracesMatcher.java | 2 +- .../blade/editor/BladeDeclarationFinder.java | 52 +++++++++---------- .../blade/editor/HyperlinkProviderImpl.java | 6 ++- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 785185316ca8..c6a5f6be4e7a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -171,7 +171,7 @@ private int[] findOpenTag() { return null; } - public int[] findCloseTag() { + private int[] findCloseTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); List skipableTokenTypes = new ArrayList<>(); skipableTokenTypes.add(HTML); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index a94cc7c18cd1..210362eb64bf 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -104,12 +104,12 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { case HTML_COMPONENT_PREFIX -> { //direct detection currentTokenId = HTML_COMPONENT_PREFIX; - + if (nt.getText().length() <= 3) { return offsetRange; } - - tokenText = nt.getText(); + + tokenText = nt.getText(); return new OffsetRange(nt.getStartIndex() + 1, nt.getStopIndex() + 1); } @@ -170,9 +170,9 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { if (fieldAccessReference != null) { switch (fieldAccessReference.type) { - case STATIC_FIELD_ACCESS: + case STATIC_FIELD_ACCESS -> { switch (fieldAccessReference.fieldType) { - case CONSTANT: + case CONSTANT -> { Collection indexConstantsResults = PhpIndexUtils.queryExactClassConstants(currentFile, fieldAccessReference.fieldName, fieldAccessReference.ownerClass.identifier); for (PhpIndexResult indexResult : indexConstantsResults) { NamedElement resultHandle = new NamedElement(fieldAccessReference.fieldName, indexResult.declarationFile, ElementType.PHP_CONSTANT); @@ -183,7 +183,9 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { location.addAlternative(new AlternativeLocationImpl(constantLocation)); } return location; + } } + } } } @@ -203,11 +205,7 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { String referenceIdentifier = reference.identifier; switch (reference.type) { - case EXTENDS: - case INCLUDE: - case INCLUDE_IF: - case EACH: - case INCLUDE_COND: + case EXTENDS, INCLUDE, INCLUDE_IF, EACH, INCLUDE_COND -> { String viewPath = referenceIdentifier; List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, viewPath); @@ -224,9 +222,8 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { location.addAlternative(new AlternativeLocationImpl(dln)); } return location; - case SECTION: - case HAS_SECTION: - case SECTION_MISSING: + } + case SECTION, HAS_SECTION, SECTION_MISSING -> { String yieldId = referenceIdentifier; List yields = QueryUtils.findYieldReferences(yieldId, currentFile); if (yields == null) { @@ -246,9 +243,8 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { } return location; - case PUSH: - case PUSH_IF: - case PREPEND: + } + case PUSH, PUSH_IF, PREPEND -> { String stackId = referenceIdentifier; List stacks = QueryUtils.findStacksReferences(stackId, currentFile); @@ -268,7 +264,8 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { } return location; - case CUSTOM_DIRECTIVE: + } + case CUSTOM_DIRECTIVE -> { String directiveNameFound = reference.identifier; DeclarationLocation dlcustomDirective = DeclarationLocation.NONE; @@ -289,7 +286,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } } return dlcustomDirective; - case PHP_CLASS: + } + case PHP_CLASS -> { Collection indexClassResults; String namespace = reference.namespace; @@ -311,7 +309,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(classLocation)); } return location; - case PHP_METHOD: { + } + case PHP_METHOD -> { if (reference.ownerClass == null) { return location; } @@ -343,7 +342,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } return location; } - case PHP_FUNCTION: + case PHP_FUNCTION -> { Collection indexResults = PhpIndexUtils.queryExactFunctions(sourceFolder, reference.identifier); for (PhpIndexFunctionResult indexResult : indexResults) { @@ -360,7 +359,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(functionLocation)); } return location; - case PHP_CONSTANT: + } + case PHP_CONSTANT -> { Collection indexConstantsResults = PhpIndexUtils.queryExactConstants(sourceFolder, reference.identifier); for (PhpIndexResult indexResult : indexConstantsResults) { @@ -372,9 +372,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(constantLocation)); } return location; - case USE: - case INJECT: - case PHP_NAMESPACE_PATH_TYPE: { + } + case USE, INJECT, PHP_NAMESPACE_PATH_TYPE -> { Collection indexNamespaceResults; if (reference.namespace != null) { indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, @@ -404,7 +403,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } return location; } - case VITE_PATH: + case VITE_PATH -> { VitePathDeclarationService vitePathDeclService = new VitePathDeclarationService(sourceFolder); FileObject viteAssetFile = vitePathDeclService.findFileObject(referenceIdentifier); if (viteAssetFile == null || !viteAssetFile.isValid()) { @@ -417,6 +416,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } location.addAlternative(new AlternativeLocationImpl(constantLocation)); return location; + } } return DeclarationLocation.NONE; @@ -441,7 +441,7 @@ public String getDisplayHtml(HtmlFormatter formatter) { if (el != null) { formatter.appendText(el.getName()); if (el.getFileObject() != null) { - formatter.appendText(" in "); + formatter.appendText(" in "); // NOI18N formatter.appendText(FileUtil.getFileDisplayName(el.getFileObject())); } return formatter.getText(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 4edf290dbe50..bfebbd4b3557 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -123,7 +123,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { methodName = text; //tooltip text switch (methodName) { - case "view", "make", "render" -> { + case "view", "make", "render" -> { // NOI18N FileObject currentFile = EditorUtils.getFileObject(doc); if (currentFile == null) { @@ -198,6 +198,10 @@ private boolean nonLaravelDeclFinderEnabled(Document doc) { } BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(projectOwner); + if (bladeProperties == null){ + return false; + } + return bladeProperties.getNonLaravelDeclFinderFlag(); } From 0c9d843a317b1f4651e1192060af593293906ed5 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 07:53:37 +0300 Subject: [PATCH 10/21] remove BladeLanguage commented scripts --- .../modules/php/blade/editor/BladeLanguage.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index b35f4f683d10..f06567555346 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -80,11 +80,6 @@ @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), path = ACTIONS, separatorBefore = 1700, position = 1800), @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), // @ActionReference(id = @ActionID(category = "DebugAntlrActions", id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens"), path = ACTIONS, position = 2000), -// @ActionReference( -// path = "Editors/" + BladeLanguage.MIME_TYPE+ "/Popup", -// id = @ActionID(category = "Refactoring", id = "org.netbeans.modules.refactoring.api.ui.WhereUsedAction"), -// position = 1600 -// ), } ) public class BladeLanguage extends DefaultLanguageConfig { @@ -191,11 +186,6 @@ public boolean isIdentifierChar(char c) { || (hasQuote && c == '.') || (c == '_'); } -// @deprecated -// @Override -// public KeystrokeHandler getKeystrokeHandler() { -// return new BladeBracketCompleter(); -// } private static final Language language = new BladeLanguageHierarchy() { From 944088e1aed9647e4f7b094753c478ec55a73d3a Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 08:01:25 +0300 Subject: [PATCH 11/21] cover all possilities for some 17 syntax switch rules --- .../php/blade/csl/elements/NamedElement.java | 16 ++++++++++++---- .../php/blade/editor/BladeBracesMatcher.java | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 2e4dc2484fb0..9ca37d9aa0e9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -76,10 +76,18 @@ public String getIn() { @Override public ElementKind getKind() { return switch (type) { - case YIELD_ID, STACK_ID -> ElementKind.PACKAGE; - case CUSTOM_DIRECTIVE -> ElementKind.METHOD; - case PHP_CLASS -> ElementKind.CLASS; - default -> ElementKind.FILE; + case YIELD_ID, STACK_ID, PHP_NAMESPACE, LARAVEL_COMPONENT -> + ElementKind.PACKAGE; + case CUSTOM_DIRECTIVE, DIRECTIVE, PHP_FUNCTION -> + ElementKind.METHOD; + case PHP_CLASS -> + ElementKind.CLASS; + case PHP_CONSTANT -> + ElementKind.CONSTANT; + case VARIABLE -> + ElementKind.VARIABLE; + case NA, PATH, ASSET_FILE -> + ElementKind.FILE; }; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index c6a5f6be4e7a..18e8a1ec9605 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -112,7 +112,7 @@ public int[] findMatches() throws InterruptedException, BadLocationException { case START_TO_END -> findDirectiveEnd(tokenText); case CUSTOM_START_TO_END -> findCustomDirectiveEnd(tokenText); case END_TO_START -> findOriginForDirectiveEnd(tokenText); - default -> null; + case NONE, STOP -> null; }; } From 4f12f9f663457ca5015c4df14130059de44f6e7d Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 08:05:41 +0300 Subject: [PATCH 12/21] reviews on PhpFunctionElement - modify namespace access, use List.of for return --- .../php/blade/csl/elements/PhpFunctionElement.java | 8 ++++++-- .../modules/php/blade/editor/completion/TooltipDoc.java | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index c715c2fcc0d1..6a0add653737 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -30,7 +30,7 @@ public class PhpFunctionElement extends NamedElement { @NullAllowed - public final String namespace; + private final String namespace; private final List params; public PhpFunctionElement(String name, FileObject file, @@ -63,7 +63,11 @@ public String getParamsAsString() { } public List getParams() { - return params; + return List.copyOf(params); + } + + public String getNamespace(){ + return namespace; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java index e55f0b8714d8..339855a4b66b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java @@ -51,8 +51,8 @@ public static Documentation generateDoc(NamedElement elementHandle) { public static Documentation generateFunctionDoc(PhpFunctionElement elementHandle) { String info = "
      " + elementHandle.getName() + elementHandle.getParamsAsString() + "
      "; - if (elementHandle.namespace != null){ - info += "
      " + elementHandle.namespace + "
      "; + if (elementHandle.getNamespace() != null){ + info += "
      " + elementHandle.getNamespace() + "
      "; } info += "
      " + elementHandle.getFileObject().getNameExt() + "
      "; info += String.format("
      %s
      ", "php function"); From e48a1a428f810e2876bb207c2cb72c744d43525d Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 20 Aug 2024 20:20:04 +0300 Subject: [PATCH 13/21] review updates for 12 august --- .../php/blade/csl/elements/PhpFunctionElement.java | 10 ++++++---- .../php/blade/editor/HyperlinkProviderImpl.java | 4 +++- .../modules/php/blade/editor/ResourceUtilities.java | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 6a0add653737..8763afe80d58 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -19,6 +19,7 @@ package org.netbeans.modules.php.blade.csl.elements; import java.util.List; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -41,7 +42,7 @@ public PhpFunctionElement(String name, FileObject file, this.namespace = namespace; this.params = List.copyOf(params); } - + public PhpFunctionElement(String name, FileObject file, ElementType type, List params) { @@ -63,10 +64,11 @@ public String getParamsAsString() { } public List getParams() { - return List.copyOf(params); + return params; } - - public String getNamespace(){ + + @CheckForNull + public String getNamespace() { return namespace; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index bfebbd4b3557..79a10119bdb9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -57,6 +57,7 @@ public class HyperlinkProviderImpl implements HyperlinkProviderExt { private String tooltipText = ""; // NOI18N private FileObject goToFile; private int goToOffset = 0; + public static final String FILE_TITLE = "Blade Template File"; public enum DeclarationType { VIEW_PATH; @@ -134,7 +135,8 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { for (FileObject includedFile : includedFiles) { goToFile = includedFile; - tooltipText = "Blade Template File : " + viewPath // NOI18N + tooltipText = FILE_TITLE + + " : " + viewPath // NOI18N + "

      " + identifiableText + ""; // NOI18N goToOffset = 0; break; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index e44652dc2d6e..da54f586d1c4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -35,7 +35,6 @@ public final class ResourceUtilities { public static final String LAYOUT_IDENTIFIER = ICON_BASE + "icons/layout.png"; //NOI18N public static final String COMPONENT_TAG = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N - private ResourceUtilities() { } From 2dd76c955f3b6be6e7a846bcad36040d1d9eb593 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 20 Aug 2024 20:30:46 +0300 Subject: [PATCH 14/21] comment update, syncronize blade project properties cleanup --- .../modules/php/blade/project/BladeProjectProperties.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 91f5219449dd..43be0b7256b5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -46,7 +46,7 @@ public final class BladeProjectProperties { private DefaultListModel directiveCustomizerPathList = new DefaultListModel(); private DefaultListModel viewsPathList = new DefaultListModel(); - // declaration finder outside of framework plugin + // enable declaration finder outside of framework plugin private final AtomicBoolean nonLaravelDeclFinder = new AtomicBoolean(false); private BladeProjectProperties(Project project) { @@ -67,8 +67,10 @@ public static BladeProjectProperties getInstance(Project project) { } public static void closeProject(Project project) { - if (INSTANCES.containsKey(project)) { - INSTANCES.remove(project); + synchronized (INSTANCES) { + if (INSTANCES.containsKey(project)) { + INSTANCES.remove(project); + } } } From ba6ca2580195b7cb7079f553a2bfc03af72fbf3d Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 4 Sep 2024 07:46:25 +0300 Subject: [PATCH 15/21] batch of java code compliance changes for hyperlinkprovider, blade completion handler, parse, blade typed text interceptor --- .../php/blade/editor/BladeCommentHandler.java | 8 +- .../blade/editor/HyperlinkProviderImpl.java | 2 +- .../completion/BladeCompletionHandler.java | 21 +--- .../php/blade/editor/parser/BladeParser.java | 21 +--- .../editor/parser/BladeParserResult.java | 5 +- .../BladeTypedTextInterceptor.java | 105 ++++++++++++------ .../blade/project/BladeProjectProperties.java | 11 +- 7 files changed, 90 insertions(+), 83 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java index dc3964efc9f6..de2a4869e7a7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.editor; +import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; @@ -27,7 +28,6 @@ import org.netbeans.editor.BaseDocument; import org.netbeans.modules.csl.spi.CommentHandler; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; -import org.openide.util.Exceptions; /** * known issues @@ -38,8 +38,8 @@ */ public class BladeCommentHandler extends CommentHandler.DefaultCommentHandler { - private static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N - private static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N + public static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N + public static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N private static final Logger LOGGER = Logger.getLogger(BladeCommentHandler.class.getName()); @@ -96,7 +96,7 @@ public void run() { bounds[0] = 0; bounds[1] = 0; } catch (BadLocationException ex) { - LOGGER.warning(ex.getMessage()); + LOGGER.log(Level.WARNING, "Invalid offset: {0}", ex.offsetRequested()); // NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 79a10119bdb9..1c33ec4cd8fd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -104,7 +104,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { String focusedText = currentToken.text().toString(); //2 char config are not that relevant - //quote x 2 + min 3 length config + //2 qoute char an 3 char minimum length text if (focusedText.length() < 5 || !EditorStringUtils.isQuotedString(focusedText)) { return null; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index 84f50ae68c4f..c8b51115359d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; -import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.editor.BaseDocument; import javax.swing.text.Document; @@ -113,23 +112,15 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { return CodeCompletionResult.NONE; } switch (currentToken.getType()) { - case PHP_IDENTIFIER: - case PHP_NAMESPACE_PATH: - PhpCodeCompletionService.completePhpCode(completionProposals, parserResult, offset, prefix); - break; - case PHP_EXPRESSION: - completePhpSnippet(completionProposals, offset, currentToken); - break; - case PHP_VARIABLE: - completeScopedVariables(completionProposals, completionContext, parserResult, currentToken); - break; - case CONTENT_TAG_OPEN: - case RAW_TAG_OPEN: + case PHP_IDENTIFIER, PHP_NAMESPACE_PATH -> PhpCodeCompletionService.completePhpCode(completionProposals, parserResult, offset, prefix); + case PHP_EXPRESSION -> completePhpSnippet(completionProposals, offset, currentToken); + case PHP_VARIABLE -> completeScopedVariables(completionProposals, completionContext, parserResult, currentToken); + case CONTENT_TAG_OPEN, RAW_TAG_OPEN -> { //{{ | {!! if (!ModulePreferences.isAutoTagCompletionEnabled()) { completeBladeTags(completionProposals, completionContext, currentToken); } - break; + } } } @@ -139,7 +130,7 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { long time = System.currentTimeMillis() - startTime; if (time > 2000){ - LOGGER.info(String.format("complete() with results took %d ms", time)); + LOGGER.info(String.format("complete() with results took %d ms", time)); // NOI18N } return new DefaultCompletionResult(completionProposals, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java index 09ef2be2f32e..0b30f60add97 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java @@ -18,9 +18,6 @@ */ package org.netbeans.modules.php.blade.editor.parser; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; -import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.event.ChangeListener; @@ -28,16 +25,15 @@ import org.netbeans.modules.parsing.api.Task; import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.parsing.spi.SourceModificationEvent; -import org.openide.filesystems.FileObject; /** * * @author bhaidu */ public class BladeParser extends org.netbeans.modules.parsing.spi.Parser { + private static final Logger LOGGER = Logger.getLogger(BladeParser.class.getName()); - BladeParserResult lastResult; - private static final WeakHashMap> CACHE = new WeakHashMap<>(); + private BladeParserResult lastResult; @Override public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) throws ParseException { @@ -45,25 +41,16 @@ public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) t return; } LOGGER.info(String.format("Parsing request for for " + task.getClass().getName() + " event changed : " + event.sourceChanged())); - if (task.getClass().getName().contains("HtmlCssIndexContributor")){ + if (task.getClass().getName().contains("HtmlCssIndexContributor")) { LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); return; } - long startTime = System.currentTimeMillis(); BladeParserResult parserResult = createParserResult(snapshot); BladeParserResult parsed = parserResult.get(task.getClass().getName()); - //cacheResult(snapshot.getSource().getFileObject(), parsed); lastResult = parsed; - //LOGGER.info(String.format("Finished parsing for " + task.getClass().getName() + ". Time : %d ms", System.currentTimeMillis() - startTime)); - } - - private static void cacheResult(FileObject fo, BladeParserResult result) { - synchronized (CACHE) { - CACHE.put(fo, new WeakReference<>(result)); - } } - + @Override public Result getResult(Task task) throws ParseException { assert lastResult != null; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index d749f36849d0..c778365e5fd4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -79,8 +79,8 @@ public class BladeParserResult extends ParserResult { public final Map> loopScopedVariables = new TreeMap<>(); public final List structure = new ArrayList<>(); public final List folds = new ArrayList<>(); - volatile boolean finished = false; - volatile boolean debugMode = false; + volatile private boolean finished = false; + volatile private boolean debugMode = false; public enum ReferenceType { YIELD, STACK, SECTION, PUSH, PUSH_IF, PREPEND, INCLUDE, INCLUDE_IF, @@ -112,7 +112,6 @@ public BladeParserResult get(String taskClass) { if (!finished) { BladeAntlrParser parser = createParser(getSnapshot()); parser.setBuildParseTree(false); - //LOGGER.info(String.format("parser created in %d ms", System.currentTimeMillis() - startTime)); parser.addErrorListener(createErrorListener()); parser.addParseListener(createDeclarationReferencesListener()); parser.addParseListener(createPhpElementsOccurencesListener()); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java index 79e201d1779e..e8f3101998b9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java @@ -29,7 +29,10 @@ import org.netbeans.api.lexer.Token; import org.netbeans.api.lexer.TokenHierarchy; import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.php.blade.editor.BladeCommentHandler; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.HTML; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BLADE_COMMENT; import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; import org.netbeans.spi.editor.typinghooks.TypedTextInterceptor; @@ -40,13 +43,14 @@ */ public class BladeTypedTextInterceptor implements TypedTextInterceptor { - static final Map CHAR_PAIR = new WeakHashMap<>(); + private static final Map CHAR_PAIR = new WeakHashMap<>(); public static enum TagType { CONTENT, RAW, COMMENT } + /** * auto complete char pair */ @@ -75,29 +79,24 @@ public void insert(MutableContext context) throws BadLocationException { return; } - if (!isAutoTagCompletionEnabled()){ + if (!isAutoTagCompletionEnabled()) { return; } - - String typedText = context.getText(); - - Map TagParts = new WeakHashMap<>(); - TagParts.put("{", TagType.CONTENT); - TagParts.put("!", TagType.RAW); - TagParts.put("-", TagType.CONTENT); - - TagType tagType = TagParts.get(typedText); - - if (tagType == null){ + + String typedText = context.getText(); + + TagType tagType = getTagType(typedText); + + if (tagType == null) { return; } - + int offset = context.getOffset(); - - if (offset < 2){ + + if (offset < 2) { return; } - + Document document = context.getDocument(); TokenHierarchy th = TokenHierarchy.get(document); TokenSequence ts = th.tokenSequence(); @@ -105,25 +104,17 @@ public void insert(MutableContext context) throws BadLocationException { ts.moveNext(); Token token = ts.token(); - - if (token == null || !(token.id() instanceof BladeTokenId)){ + + if (token == null || !(token.id() instanceof BladeTokenId)) { return; } - + BladeTokenId bladeToken = (BladeTokenId) token.id(); - + String tokenText = token.text().toString(); - - switch (bladeToken) { - case HTML: - if (tokenText.equals("{") && tagType == TagType.CONTENT){ - context.setText("{ }}", 1); - } else if (tokenText.equals("{!") && tagType == TagType.RAW ){ - context.setText("! !!}", 1); - } else if (tokenText.equals("{{-") && tagType == TagType.COMMENT ){ - context.setText("- --}}", 1); - } - break; + + if (bladeToken.equals(HTML)) { + completeFromHtmlFragments(tokenText, context, tagType); } } @@ -151,11 +142,57 @@ public void afterInsert(Context cntxt) throws BadLocationException { public void cancelled(Context cntxt) { } - - public boolean isAutoTagCompletionEnabled(){ + + public boolean isAutoTagCompletionEnabled() { return ModulePreferences.isAutoTagCompletionEnabled(); } + private TagType getTagType(String typedText) { + + return switch (typedText) { + case "{" -> // NOI18N + TagType.CONTENT; + case "!" -> // NOI18N + TagType.RAW; + case "-" -> // NOI18N + TagType.COMMENT; + default -> + null; + }; + } + + private void completeFromHtmlFragments(String tokenText, MutableContext context, TagType tagType) { + switch (tokenText) { + case "{" -> // NOI18N + completeContentTag(context, tagType); + case "{!" -> // NOI18N + completeRawContentTag(context, tagType); + case "{{-" -> // NOI18N + completeCommenTag(context, tagType); + } + } + + private void completeContentTag(MutableContext context, TagType tagType) { + if (tagType != TagType.CONTENT) { + return; + } + context.setText("{ }}", 1);// NOI18N + } + + private void completeRawContentTag(MutableContext context, TagType tagType) { + if (tagType != TagType.RAW) { + return; + } + context.setText("! !!}", 1);// NOI18N + } + + private void completeCommenTag(MutableContext context, TagType tagType) { + if (tagType != TagType.COMMENT) { + return; + } + context.setText("- --}}", 1);// NOI18N + } + /** * register for HTML also */ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 43be0b7256b5..b1d91977a230 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -57,20 +57,13 @@ private BladeProjectProperties(Project project) { @CheckForNull public static BladeProjectProperties getInstance(Project project) { synchronized (INSTANCES) { - if (INSTANCES.containsKey(project)) { - return INSTANCES.get(project); - } - BladeProjectProperties instance = new BladeProjectProperties(project); - INSTANCES.put(project, instance); - return instance; + return INSTANCES.computeIfAbsent(project, k -> new BladeProjectProperties(project)); } } public static void closeProject(Project project) { synchronized (INSTANCES) { - if (INSTANCES.containsKey(project)) { - INSTANCES.remove(project); - } + INSTANCES.remove(project); } } From 43c7e7d7a57450ae48b02c00e564db7cf41d2885 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 4 Sep 2024 07:56:53 +0300 Subject: [PATCH 16/21] refactor+ wip compliance code on blade parser, remove comment --- .../blade/editor/BladeDeclarationFinder.java | 3 +- .../php/blade/editor/BladeLanguage.java | 2 +- .../editor/parser/BladeParserResult.java | 88 +++++++------------ .../blade/syntax/BladeDirectivesUtils.java | 1 + 4 files changed, 36 insertions(+), 58 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index 210362eb64bf..af247662457c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; @@ -85,7 +86,7 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { String text = baseDoc.getText(0, baseDoc.getLength()); tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); } catch (BadLocationException ex) { - LOGGER.warning(ex.getMessage()); + LOGGER.log(Level.WARNING, "Invalid offset: {0}", ex.offsetRequested()); // NOI18N } if (tokens == null || tokens.isEmpty()) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index f06567555346..99cb095427ef 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -79,7 +79,7 @@ @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), path = ACTIONS, separatorBefore = 1700, position = 1800), - @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), // @ActionReference(id = @ActionID(category = "DebugAntlrActions", id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens"), path = ACTIONS, position = 2000), + @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), } ) public class BladeLanguage extends DefaultLanguageConfig { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index c778365e5fd4..2468b5504aa1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -51,6 +51,7 @@ import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem; import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveBlockStructureItem; import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveInlineStructureItem; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; @@ -107,7 +108,7 @@ protected BladeAntlrParser createParser(Snapshot snapshot) { public BladeParserResult get(String taskClass) { long startTime = System.currentTimeMillis(); if (debugMode){ - LOGGER.log(Level.INFO, "PARSER TRIGGERED BY {0}", taskClass); + LOGGER.log(Level.INFO, "PARSER TRIGGERED BY {0}", taskClass); // NOI18N } if (!finished) { BladeAntlrParser parser = createParser(getSnapshot()); @@ -116,25 +117,25 @@ public BladeParserResult get(String taskClass) { parser.addParseListener(createDeclarationReferencesListener()); parser.addParseListener(createPhpElementsOccurencesListener()); - if (taskClass.toLowerCase().contains("completion")) { + if (taskClass.toLowerCase().contains("completion")) { // NOI18N parser.addParseListener(createVariableListener()); } parser.addParseListener(createStructureListener()); - if (taskClass.toLowerCase().contains("hints")) { + if (taskClass.toLowerCase().contains("hints")) { // NOI18N parser.addParseListener(createSemanticsListener()); } evaluateParser(parser); if (debugMode){ - LOGGER.info(String.format("Parser evaluated in %d ms " + taskClass + " | " + this.getFileObject().getNameExt(), System.currentTimeMillis() - startTime)); + LOGGER.info(String.format("Parser evaluated in %d ms " + taskClass + " | " + this.getFileObject().getNameExt(), System.currentTimeMillis() - startTime)); // NOI18N } finished = true; } long time = System.currentTimeMillis() - startTime; if (debugMode){ - LOGGER.info(String.format("finished parser took %d ms " + this.getFileObject().getNameExt(), time)); + LOGGER.info(String.format("finished parser took %d ms " + this.getFileObject().getNameExt(), time)); // NOI18N } return this; } @@ -244,12 +245,8 @@ private void addIdentifiableOccurenceForDeclaration(Token directive, //used for indexing switch (directive.getType()) { - case D_STACK: - addStackReference(ReferenceType.STACK, bladeParamText, range); - break; - case D_YIELD: - addYieldReference(ReferenceType.YIELD, bladeParamText, range); - break; + case D_STACK -> addStackReference(ReferenceType.STACK, bladeParamText, range); + case D_YIELD -> addYieldReference(ReferenceType.YIELD, bladeParamText, range); } ReferenceType type = getReferenceType(directive.getType()); @@ -260,7 +257,7 @@ private void addIdentifiableOccurenceForDeclaration(Token directive, Reference ref; if (type.equals(ReferenceType.USE) || type.equals(ReferenceType.INJECT)) { - int lastSlashPos = bladeParamText.lastIndexOf("\\"); + int lastSlashPos = bladeParamText.lastIndexOf(EditorStringUtils.NAMESPACE_SEPARATOR); if (lastSlashPos < 0 || lastSlashPos >= bladeParamText.length() - 1) { return; } @@ -274,18 +271,13 @@ private void addIdentifiableOccurenceForDeclaration(Token directive, occurancesForDeclaration.put(range, ref); switch (directive.getType()) { - case D_EACH: - case D_INCLUDE_WHEN: - case D_INCLUDE_UNLESS: - case D_INCLUDE: - case D_INCLUDE_IF: - case D_INCLUDE_FIRST: - if (bladeParamText.contains("::")) { + case D_EACH, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_FIRST -> { + if (bladeParamText.contains("::")) { // NOI18N //don't include package resources break; } markIncludeBladeOccurrence(bladeParamText, range); - break; + } } } @@ -627,7 +619,7 @@ public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { blockItem.nestedItems.addAll(lexerStructure); lexerStructure.clear(); - if (blockBalance > 0 && !directiveName.startsWith("@else")) { + if (blockBalance > 0 && !directiveName.startsWith(BladeDirectivesUtils.DIRECTIVE_ELSE)) { lexerStructure.add(blockItem); } else { structure.add(blockItem); @@ -648,34 +640,21 @@ public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } private ReferenceType getReferenceType(int type) { - switch (type) { - case D_INCLUDE: - return ReferenceType.INCLUDE; - case D_INCLUDE_IF: - return ReferenceType.INCLUDE_IF; - case D_EXTENDS: - return ReferenceType.EXTENDS; - case D_USE: - return ReferenceType.USE; - case D_INJECT: - return ReferenceType.INJECT; - case D_SECTION: - return ReferenceType.SECTION; - case D_HAS_SECTION: - return ReferenceType.HAS_SECTION; - case D_SECTION_MISSING: - return ReferenceType.SECTION_MISSING; - case D_PUSH: - return ReferenceType.PUSH; - case D_PUSH_IF: - return ReferenceType.PUSH_IF; - case D_PREPEND: - return ReferenceType.PREPEND; - case D_EACH: - return ReferenceType.EACH; - default: - return null; - } + return switch (type) { + case D_INCLUDE -> ReferenceType.INCLUDE; + case D_INCLUDE_IF -> ReferenceType.INCLUDE_IF; + case D_EXTENDS -> ReferenceType.EXTENDS; + case D_USE -> ReferenceType.USE; + case D_INJECT -> ReferenceType.INJECT; + case D_SECTION -> ReferenceType.SECTION; + case D_HAS_SECTION -> ReferenceType.HAS_SECTION; + case D_SECTION_MISSING -> ReferenceType.SECTION_MISSING; + case D_PUSH -> ReferenceType.PUSH; + case D_PUSH_IF -> ReferenceType.PUSH_IF; + case D_PREPEND -> ReferenceType.PREPEND; + case D_EACH -> ReferenceType.EACH; + default -> null; + }; } /** @@ -899,8 +878,7 @@ protected ANTLRErrorListener createErrorListener() { @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { int errorPosition = 0; - if (offendingSymbol instanceof Token) { - Token offendingToken = (Token) offendingSymbol; + if (offendingSymbol instanceof Token offendingToken) { errorPosition = offendingToken.getStartIndex(); } errors.add(new BladeError(null, msg, null, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); @@ -975,13 +953,11 @@ public class ForeachVariables { public String itemVariable; } - /** - * seems that java caches only this class ? BladeError is not found in some - * occasions - */ public static class BladeError extends DefaultError implements org.netbeans.modules.csl.api.Error.Badging { - public BladeError(@NullAllowed String key, @NonNull String displayName, @NullAllowed String description, @NonNull FileObject file, @NonNull int start, @NonNull int end, @NonNull Severity severity) { + public BladeError(@NullAllowed String key, @NonNull String displayName, + @NullAllowed String description, @NonNull FileObject file, + @NonNull int start, @NonNull int end, @NonNull Severity severity) { super(key, displayName, description, file, start, end, severity); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 193bd15432b1..77ef049327e3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -36,6 +36,7 @@ public final class BladeDirectivesUtils { public static final String DIRECTIVE_STOP = "@stop"; // NOI18N public static final String DIRECTIVE_APPEND = "@append"; // NOI18N public static final String DIRECTIVE_IF = "@if"; // NOI18N + public static final String DIRECTIVE_ELSE = "@else"; // NOI18N public static final String DIRECTIVE_ENDIF = "@endif"; // NOI18N public static String[] directiveStart2EndPair(String directive){ From 235ff63ee8c2f209ff3f448335e9f0cac925c953 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 13 Sep 2024 16:38:52 +0300 Subject: [PATCH 17/21] refactor, code compliance, update lexer for css at rules, embedding tests, added more lexer tests --- .../completion/BladeCompletionBuilder.java | 56 + .../completion/BladeCompletionHandler.java | 23 +- .../completion/BladeCompletionItem.java | 132 +- .../completion/BladeCompletionProposal.java | 1 - .../completion/BladeCompletionProvider.java | 55 +- .../BladePhpCompletionProvider.java | 2 +- .../DirectiveCompletionBuilder.java | 10 +- .../php/blade/editor/parser/BladeParser.java | 4 +- .../php/blade/project/ComponentsSupport.java | 2 + .../php/blade/resources/icons/icon.png | Bin 973 -> 0 bytes .../blade/syntax/BladeDirectivesUtils.java | 3 + .../php/blade/syntax/BladeVariables.java | 32 + .../antlr4/v10/BladeAntlrColoringLexer.java | 1643 ++++++------ .../syntax/antlr4/v10/BladeAntlrLexer.java | 2231 +++++++++-------- .../antlr4/v10/BladeColoringCommonLexer.g4 | 20 +- .../syntax/antlr4/v10/BladeCommonLexer.g4 | 20 +- .../lexer/BladeLexerTest/css_at_rules.pass | 65 + .../BladeLexerTest/html_javascript_01.pass | 14 + .../testCompletion_loop_endtag_01.blade.php | 3 + ...p.testCompletion_loop_endtag_01.completion | 4 + .../embedding/html_embedding_01.blade.php | 5 + ...1.blade.php.testHtmlEmbedding_01.embedding | 5 + .../embedding/php_freeze_nekudo_01.blade.php | 1 + ...01.blade.php.testFreezeNekudo_01.embedding | 1 + .../blade/content_tag_tertiary_expr.blade.php | 3 + .../lexer/blade/css_at_rules.blade.php | 34 + .../lexer/blade/escaped_directive.blade.php | 3 + .../lexer/blade/html_javascript_01.blade.php | 6 + .../lexer/blade/include_01.blade.php | 1 + .../completion/BladeCompletionTest.java | 4 + .../BladeHtmlEmbeddingProviderTest.java | 61 + .../BladePhpEmbeddingProviderTest.java | 68 + .../blade/editor/lexer/BladeLexerTest.java | 21 + 33 files changed, 2450 insertions(+), 2083 deletions(-) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java new file mode 100644 index 000000000000..b16ea8e5d3e0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +/** + * + * @author bogdan + */ +public class BladeCompletionBuilder { + + //----------- Factory methods -------------- + public static BladeCompletionItem createTag(String name, int substitutionOffset) { + return new BladeCompletionItem.BladeTag(name, substitutionOffset); + } + + public static BladeCompletionItem createViewPath(String name, + int substitutionOffset, boolean isFolder, String path) { + return new BladeCompletionItem.ViewPath(name, substitutionOffset, isFolder, path); + } + + public static BladeCompletionItem createInlineDirective(String directive, + int substitutionOffset, String description) { + return new BladeCompletionItem.InlineDirective(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createDirectiveWithArg(String directive, + int substitutionOffset, String description) { + return new BladeCompletionItem.DirectiveWithArg(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirective(String directive, + String endTag, int substitutionOffset, String description) { + return new BladeCompletionItem.BlockDirective(directive, endTag, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirectiveWithArg(String directive, + String endTag, int substitutionOffset, String description) { + return new BladeCompletionItem.BlockDirectiveWithArg(directive, endTag, substitutionOffset, description); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index c8b51115359d..cee2cc5167f7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -52,6 +52,7 @@ import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.BladeTags; +import org.netbeans.modules.php.blade.syntax.BladeVariables; import org.netbeans.modules.php.blade.syntax.annotation.Directive; import org.netbeans.modules.php.blade.syntax.annotation.Tag; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; @@ -165,8 +166,8 @@ private void completeScopedVariables(final List completionPr request.anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); request.carretOffset = completionContext.getCaretOffset(); request.prefix = variablePrefix; - if ("$loop".startsWith(variablePrefix)) { - String variableName = "$loop"; // NOI18N + if (BladeVariables.LOOP_VAR.startsWith(variablePrefix)) { + String variableName = BladeVariables.LOOP_VAR; NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); } @@ -274,12 +275,10 @@ public CodeCompletionHandler.QueryType getAutoQuery(JTextComponent component, St char lastChar = typedText.charAt(typedText.length() - 1); - switch (lastChar) { - case '\n': - return CodeCompletionHandler.QueryType.STOP; - default: - return CodeCompletionHandler.QueryType.ALL_COMPLETION; - } + return switch (lastChar) { + case '\n' -> CodeCompletionHandler.QueryType.STOP; + default -> CodeCompletionHandler.QueryType.ALL_COMPLETION; + }; } @Override @@ -309,12 +308,12 @@ public ParameterInfo parameters(ParserResult pr, int i, CompletionProposal cp) { @Override public Documentation documentElement(ParserResult parserResult, ElementHandle elementHandle, Callable cancel) { Documentation result = null; - if (elementHandle instanceof PhpFunctionElement) { - return TooltipDoc.generateFunctionDoc((PhpFunctionElement) elementHandle); + if (elementHandle instanceof PhpFunctionElement phpFunctionElement) { + return TooltipDoc.generateFunctionDoc(phpFunctionElement); } else if (elementHandle instanceof DirectiveElement) { return result; - } else if (elementHandle instanceof NamedElement) { - return TooltipDoc.generateDoc((NamedElement) elementHandle); + } else if (elementHandle instanceof NamedElement namedElement) { + return TooltipDoc.generateDoc(namedElement); } return result; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index be17635232b7..c3c406956285 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -26,10 +26,12 @@ import javax.swing.text.BadLocationException; import javax.swing.text.Caret; import javax.swing.text.JTextComponent; +import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.api.editor.completion.Completion; import org.netbeans.editor.BaseDocument; import org.netbeans.lib.editor.codetemplates.api.CodeTemplateManager; import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionTask; import org.netbeans.spi.editor.completion.support.CompletionUtilities; @@ -39,43 +41,29 @@ * * @author bhaidu */ -public class BladeCompletionItem implements CompletionItem { +public abstract class BladeCompletionItem implements CompletionItem { protected static final int DEFAULT_SORT_PRIORITY = 20; - protected int substitutionOffset; - protected String text; - protected boolean shift; - - //----------- Factory methods -------------- - public static BladeCompletionItem createTag(String name, int substitutionOffset) { - return new BladeTag(name, substitutionOffset); - } - - public static BladeCompletionItem createViewPath(String name, - int substitutionOffset, boolean isFolder, String path) { - return new ViewPath(name, substitutionOffset, isFolder, path); - } - - public static BladeCompletionItem createInlineDirective(String directive, - int substitutionOffset, String description) { - return new InlineDirective(directive, substitutionOffset, description); + private final int substitutionOffset; + private final String name; + @NullAllowed + private final String description; + private boolean shift; + + BladeCompletionItem(String name, int substitutionOffset, String description) { + this.name = name; + this.substitutionOffset = substitutionOffset; + this.description = description; } - public static BladeCompletionItem createDirectiveWithArg(String directive, - int substitutionOffset, String description) { - return new DirectiveWithArg(directive, substitutionOffset, description); + public String getName() { + return this.name; } - public static BladeCompletionItem createBlockDirective(String directive, - String endTag, int substitutionOffset, String description) { - return new BlockDirective(directive, endTag, substitutionOffset, description); + public String getDescription() { + return this.description; } - public static BladeCompletionItem createBlockDirectiveWithArg(String directive, - String endTag, int substitutionOffset, String description) { - return new BlockDirectiveWithArg(directive, endTag, substitutionOffset, description); - } - @Override public void defaultAction(JTextComponent component) { if (component != null) { @@ -101,22 +89,11 @@ public int getPreferredWidth(Graphics grphcs, Font font) { return CompletionUtilities.getPreferredWidth(getLeftHtmlText(), getRightHtmlText(), grphcs, font); } - protected String getLeftHtmlText() { - return text; - } - - protected String getRightHtmlText() { - return null; - } - @Override public void render(Graphics g, Font defaultFont, Color defaultColor, Color backgroundColor, int width, int height, boolean selected) { CompletionUtilities.renderHtml(getIcon(), getLeftHtmlText(), getRightHtmlText(), g, defaultFont, defaultColor, width, height, selected); } - protected ImageIcon getIcon() { - return null; - } @Override public CompletionTask createDocumentationTask() { @@ -160,13 +137,25 @@ public CharSequence getSortText() { public CharSequence getInsertPrefix() { return getItemText(); } + + protected ImageIcon getIcon() { + return null; + } + + protected String getLeftHtmlText() { + return name; + } + + protected String getRightHtmlText() { + return null; + } protected String getSubstituteText() { return getItemText(); } public String getItemText() { - return text; + return name; } private boolean substituteText(JTextComponent component, int len) { @@ -222,25 +211,20 @@ protected void reindent(JTextComponent c) { public static class BladeTag extends BladeCompletionItem { public BladeTag(String name, int substitutionOffset) { - this.text = name; - this.substitutionOffset = substitutionOffset; + super(name, substitutionOffset, null); } } public static class InlineDirective extends BladeCompletionItem { - protected String description; - public InlineDirective(String directive, int substitutionOffset, String description) { - this.text = directive; - this.substitutionOffset = substitutionOffset; - this.description = description; + super(directive, substitutionOffset, description); } @Override protected String getRightHtmlText() { - return description; + return getDescription(); } @Override @@ -260,18 +244,17 @@ public DirectiveWithArg(String directive, int substitutionOffset, @Override protected String getSubstituteText() { String template = getItemText() + "($$${arg})"; // NOI18N - switch (text){ - case "@include": // NOI18N - case "@extends": // NOI18N + switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, + BladeDirectivesUtils.DIRECTIVE_EXTENDS -> template = getItemText() + "('${path}')"; // NOI18N - break; } return template; } @Override protected String getLeftHtmlText() { - return text + "()"; + return getName() + "()"; // NOI18N } @Override @@ -284,30 +267,27 @@ protected void insertString(BaseDocument doc, int substitutionOffset, public static class BlockDirective extends BladeCompletionItem { - protected String description; - protected String endTag; + private final String endTag; public BlockDirective(String directive, String endTag, int substitutionOffset, String description) { - this.text = directive; - this.substitutionOffset = substitutionOffset; - this.description = description; + super(directive, substitutionOffset, description); this.endTag = endTag; } @Override protected String getSubstituteText() { - return getItemText() + "\n${selection}${cursor}\n" + endTag; + return getItemText() + "\n${selection}${cursor}\n" + endTag; // NOI18N } @Override protected String getLeftHtmlText() { - return text + " ... " + endTag; + return getName() + " ... " + endTag; // NOI18N } @Override protected String getRightHtmlText() { - return description; + return getDescription(); } @Override @@ -322,8 +302,12 @@ protected void insertString(BaseDocument doc, int substitutionOffset, ctx.setCaretPosition(substitutionOffset); CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); } + + public String getEndTag() { + return endTag; + } } - + public static class BlockDirectiveWithArg extends BlockDirective { public BlockDirectiveWithArg(String directive, String endTag, int substitutionOffset, String description) { @@ -332,33 +316,31 @@ public BlockDirectiveWithArg(String directive, String endTag, int substitutionOf @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; // NOI18N - - switch (text){ - case "@foreach": - template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; // NOI18N - break; + String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + getEndTag(); // NOI18N + + switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_FOREACH -> + template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + getEndTag(); // NOI18N } - + return template; } @Override protected String getLeftHtmlText() { - return text + "() ... " + endTag; + return getName() + "() ... " + getEndTag(); // NOI18N } } public static class ViewPath extends BladeCompletionItem { - protected boolean isFolder; - protected String filePath; + private final boolean isFolder; + private final String filePath; public ViewPath(String name, int substitutionOffset, boolean isFolder, String filePath) { - this.text = name; - this.substitutionOffset = substitutionOffset; + super(name, substitutionOffset, null); this.isFolder = isFolder; this.filePath = filePath; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index b4566b493a57..1514c460a43e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -40,7 +40,6 @@ */ public class BladeCompletionProposal implements CompletionProposal { - //@StaticResource final CompletionRequest request; protected final ElementHandle element; final String previewValue; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index b76830d256f6..4fb960ec83bd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -38,6 +38,7 @@ import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.project.ComponentsSupport; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.modules.php.blade.syntax.annotation.Directive; @@ -163,30 +164,24 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse } switch (currentToken.getType()) { - case HTML_IDENTIFIER: - completeAttributes(currentToken.getText(), caretOffset, resultSet); - break; - case HTML: + case HTML_IDENTIFIER -> completeAttributes(currentToken.getText(), caretOffset, resultSet); + case HTML -> { String nText = currentToken.getText(); - if ("livewire".startsWith(nText)) { - //quick implementation - //?? - addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); // NOI18N + if (ComponentsSupport.LIVEWIRE_NAME.startsWith(nText)) { + addHtmlTagCompletionItem(nText, ComponentsSupport.LIVEWIRE_NAME, caretOffset, resultSet); } - break; - case HTML_COMPONENT_PREFIX: + } + case HTML_COMPONENT_PREFIX -> { String compPrefix = currentToken.getText().length() > 3 ? StringUtils.kebabToCamel(currentToken.getText().substring(3)) : ""; completeComponents(compPrefix, fo, caretOffset, resultSet); - break; - case D_UNKNOWN_ATTR_ENC: - completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); - break; - default: - break; + } + case D_UNKNOWN_ATTR_ENC -> completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); + default -> { + } } } finally { long time = System.currentTimeMillis() - startTime; - if (time > 2000){ + if (time > 2000) { LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); } resultSet.finish(); @@ -229,19 +224,21 @@ public void filterDirectiveName(CustomDirective customDirective, FileObject file if (customDirective.name.startsWith(prefix)) { resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( startOffset, carretOffset, prefix, customDirective.name, - "custom directive", doc, file)); + "custom directive", doc, file)); // NOI18N } } }); } - + private void completeComponents(String prefixIdentifier, FileObject fo, int caretOffset, CompletionResultSet resultSet) { int insertOffset = caretOffset - prefixIdentifier.length(); ComponentsCompletionService componentComplervice = new ComponentsCompletionService(); Collection indexedReferences = componentComplervice.queryComponents(prefixIdentifier, fo); - + if (indexedReferences == null) { + return; + } for (PhpIndexResult indexReference : indexedReferences) { addComponentIdCompletionItem(indexReference, insertOffset, resultSet); @@ -259,8 +256,7 @@ private void completeAttributes(String prefix, int caretOffset, CompletionResult } } - //?? - private void addHtmlTagCompletionItem(String prefix, String tagName, String plugin, + private void addHtmlTagCompletionItem(String prefix, String tagName, int caretOffset, CompletionResultSet resultSet) { int insertOffset = caretOffset - prefix.length(); @@ -293,13 +289,14 @@ private void addComponentIdCompletionItem(PhpIndexResult indexReference, } private static String getReferenceIcon(CompletionType type) { - switch (type) { - case HTML_COMPONENT_TAG: - return ResourceUtilities.COMPONENT_TAG; - case YIELD_ID: - return ResourceUtilities.LAYOUT_IDENTIFIER; - } - return ResourceUtilities.DIRECTIVE_ICON; + return switch (type) { + case HTML_COMPONENT_TAG -> + ResourceUtilities.COMPONENT_TAG; + case YIELD_ID -> + ResourceUtilities.LAYOUT_IDENTIFIER; + default -> + ResourceUtilities.DIRECTIVE_ICON; + }; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 92529fe16625..1234989407b6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -333,7 +333,7 @@ private void completeBladePath(String bladePath, FileObject originFile, String filePath = originFile.getPath(); - BladeCompletionItem item = BladeCompletionItem.createViewPath( + BladeCompletionItem item = BladeCompletionBuilder.createViewPath( bladePath, caretOffset, originFile.isFolder(), filePath); resultSet.addItem(item); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java index c73236b032b3..67091496f139 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java @@ -31,14 +31,14 @@ public class DirectiveCompletionBuilder { public static CompletionItem simpleItem(int startOffset, String directive, String description) { - return BladeCompletionItem.createInlineDirective(directive, startOffset, description); + return BladeCompletionBuilder.createInlineDirective(directive, startOffset, description); } public static CompletionItem simpleItem(int startOffset, int carretOffset, String prefix, String directive, String endtag, String description, Document doc) { - return BladeCompletionItem.createBlockDirective( + return BladeCompletionBuilder.createBlockDirective( directive, endtag, startOffset, description); } @@ -46,14 +46,14 @@ public static CompletionItem itemWithArg(int startOffset, int carretOffset, String prefix, String directive, String description, Document doc) { - return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + return BladeCompletionBuilder.createDirectiveWithArg(directive, startOffset, description); } public static CompletionItem itemWithArg(int startOffset, int carretOffset, String prefix, String directive, String endtag, String description, Document doc) { - return BladeCompletionItem.createBlockDirectiveWithArg( + return BladeCompletionBuilder.createBlockDirectiveWithArg( directive, endtag, startOffset, description); } @@ -61,6 +61,6 @@ public static CompletionItem itemWithArg(int startOffset, int carretOffset, String prefix, String directive, String description, Document doc, FileObject file) { - return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + return BladeCompletionBuilder.createDirectiveWithArg(directive, startOffset, description); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java index 0b30f60add97..49460a03eaec 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java @@ -40,8 +40,8 @@ public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) t if (snapshot == null) { return; } - LOGGER.info(String.format("Parsing request for for " + task.getClass().getName() + " event changed : " + event.sourceChanged())); - if (task.getClass().getName().contains("HtmlCssIndexContributor")) { + + if (task.getClass().getName().contains("HtmlCssIndexContributor")) { // NOI18N LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); return; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index 8d6e7b87458e..4c83efd79ce4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -38,6 +38,8 @@ @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) // NOI18N public class ComponentsSupport { + public static final String LIVEWIRE_NAME = "livewire"; // NOI18N + private static final Map INSTANCES = new HashMap<>(); private final Map installedComponentNamespace = new HashMap<>(); private boolean scanned = false; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png deleted file mode 100644 index 87ced4a74a8a75f28331705a6c368f8654294233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 77ef049327e3..40f5c037c103 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -38,6 +38,9 @@ public final class BladeDirectivesUtils { public static final String DIRECTIVE_IF = "@if"; // NOI18N public static final String DIRECTIVE_ELSE = "@else"; // NOI18N public static final String DIRECTIVE_ENDIF = "@endif"; // NOI18N + public static final String DIRECTIVE_FOREACH = "@foreach"; // NOI18N + public static final String DIRECTIVE_INCLUDE = "@include"; // NOI18N + public static final String DIRECTIVE_EXTENDS = "@extends"; // NOI18N public static String[] directiveStart2EndPair(String directive){ if (directive.equals(DIRECTIVE_SECTION)){ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java new file mode 100644 index 000000000000..331cd94dacbe --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +/** + * + * @author bogdan + */ +public final class BladeVariables { + + public static final String LOOP_VAR = "$loop"; // NOI18N + + private BladeVariables(){ + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java index 4fc35854e623..a38c002fd84d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -552,7 +552,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000+\u0735\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000+\u0742\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ @@ -715,466 +715,469 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) ".\u0001.\u0001.\u0003.\u047a\b.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ ".\u0001.\u0001.\u0005.\u0484\b.\n.\f.\u0487\t.\u0001.\u0003.\u048a\b."+ "\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0005.\u0496\b.\n.\f.\u0499\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0005.\u04a4\b.\n.\f.\u04a7\t.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ - ".\u04b5\b.\n.\f.\u04b8\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0005.\u04c5\b.\n.\f.\u04c8\t.\u0001.\u0001"+ ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0005.\u04d6\b.\n.\f.\u04d9\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0005.\u04e2\b.\n.\f.\u04e5\t.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04f2\b.\n.\f.\u04f5"+ - "\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04ff"+ - "\b.\n.\f.\u0502\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0005.\u050f\b.\n.\f.\u0512\t.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u051c\b.\n.\f.\u051f\t.\u0001"+ ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ - ".\u0535\b.\n.\f.\u0538\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u0546\b.\n.\f.\u0549\t.\u0003"+ - ".\u054b\b.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "0\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ - "2\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00014\u00014\u0003"+ - "4\u0569\b4\u00014\u00014\u00015\u00015\u00015\u00035\u0570\b5\u00015\u0001"+ - "5\u00016\u00046\u0575\b6\u000b6\f6\u0576\u00016\u00016\u00017\u00017\u0005"+ - "7\u057d\b7\n7\f7\u0580\t7\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ - "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ - ":\u0001;\u0001;\u0003;\u0595\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003"+ - "<\u059c\b<\u0001<\u0001<\u0001=\u0004=\u05a1\b=\u000b=\f=\u05a2\u0001"+ - "=\u0001=\u0001>\u0001>\u0005>\u05a9\b>\n>\f>\u05ac\t>\u0001>\u0001>\u0001"+ - "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0004@\u05b6\b@\u000b@\f@\u05b7\u0001"+ - "@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001"+ - "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001"+ - "I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ - "K\u0001K\u0001K\u0001L\u0001L\u0005L\u05fb\bL\nL\fL\u05fe\tL\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ - "O\u0001O\u0001O\u0001O\u0005O\u060f\bO\nO\fO\u0612\tO\u0001O\u0001O\u0001"+ - "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001"+ - "U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0550\b.\u0001.\u0005"+ + ".\u0553\b.\n.\f.\u0556\t.\u0003.\u0558\b.\u0001.\u0001.\u0001/\u0001/"+ + "\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u0001"+ + "1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ + "3\u00013\u00013\u00014\u00014\u00034\u0576\b4\u00014\u00014\u00015\u0001"+ + "5\u00015\u00035\u057d\b5\u00015\u00015\u00016\u00046\u0582\b6\u000b6\f"+ + "6\u0583\u00016\u00016\u00017\u00017\u00057\u058a\b7\n7\f7\u058d\t7\u0001"+ + "7\u00017\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001;\u0001;\u0003;\u05a2"+ + "\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003<\u05a9\b<\u0001<\u0001<\u0001"+ + "=\u0004=\u05ae\b=\u000b=\f=\u05af\u0001=\u0001=\u0001>\u0001>\u0005>\u05b6"+ + "\b>\n>\f>\u05b9\t>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "@\u0004@\u05c3\b@\u000b@\f@\u05c4\u0001@\u0001@\u0001@\u0001@\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ + "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0005"+ + "L\u0608\bL\nL\fL\u060b\tL\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001"+ + "M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0005O\u061c"+ + "\bO\nO\fO\u061f\tO\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ + "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ - "]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001"+ - "_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "d\u0001d\u0003d\u068f\bd\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001"+ - "e\u0001e\u0001e\u0001f\u0001f\u0003f\u069c\bf\u0001f\u0001f\u0003f\u06a0"+ - "\bf\u0001f\u0004f\u06a3\bf\u000bf\ff\u06a4\u0001f\u0003f\u06a8\bf\u0001"+ - "f\u0003f\u06ab\bf\u0001f\u0003f\u06ae\bf\u0001f\u0001f\u0003f\u06b2\b"+ - "f\u0001f\u0001f\u0003f\u06b6\bf\u0001f\u0004f\u06b9\bf\u000bf\ff\u06ba"+ - "\u0001f\u0003f\u06be\bf\u0001f\u0001f\u0003f\u06c2\bf\u0005f\u06c4\bf"+ - "\nf\ff\u06c7\tf\u0001f\u0003f\u06ca\bf\u0001f\u0001f\u0001f\u0001f\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0005g\u06d9"+ - "\bg\ng\fg\u06dc\tg\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u06ec\bh\u0001h\u0001"+ - "h\u0005h\u06f0\bh\nh\fh\u06f3\th\u0001h\u0001h\u0004h\u06f7\bh\u000bh"+ - "\fh\u06f8\u0001h\u0003h\u06fc\bh\u0001h\u0001h\u0003h\u0700\bh\u0004h"+ - "\u0702\bh\u000bh\fh\u0703\u0001h\u0001h\u0001h\u0001h\u0003h\u070a\bh"+ - "\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001"+ - "j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001"+ - "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ - "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+ - "p\u0001p\u0001p\u0006\u0183\u0198\u01a6\u0376\u0422\u0610\u0000q\f\u0000"+ - "\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016\u0000\u0018\n\u001a"+ - "\u0000\u001c\u0000\u001e\u0000 \u0000\"\u0000$(&\u0000(\u0000*\u0000,"+ - "\u000b.\u00000\u00002\u00004\f6\r8\u000e:\u0000<\u0000>\u0000@\u0000B"+ - "\u0000D\u0006F\u0000H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000"+ - "V\u0000X\u0000Z\u0000\\\u0000^\u0000`\u0000b\u000fd\u0000f\u0000h\u0000"+ - "j\u0000l\u0000n\u0000p\u0000r\u0010t\u0011v\u0012x\u0013z\u0014|\u0000"+ - "~\u0000\u0080\u0015\u0082\u0016\u0084\u0017\u0086\u0018\u0088\u0019\u008a"+ - "\u0000\u008c\u001a\u008e\u0000\u0090\u0000\u0092\u0000\u0094\u001b\u0096"+ - "\u0000\u0098\u001c\u009a\u001d\u009c\u0000\u009e)\u00a0\u001e\u00a2\u001f"+ - "\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000"+ - "\u00b6\u0000\u00b8\u0000\u00ba\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000"+ - "\u00c2\u0000\u00c4\u0000\u00c6*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce"+ - "\u0000\u00d0\u0000\u00d2\u0000\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da"+ - "\u0000\u00dc\u0000\u00de+\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6\'"+ - "\u00e8\u0000\u00ea\u0000\u00ec\u0000\f\u0000\u0001\u0002\u0003\u0004\u0005"+ - "\u0006\u0007\b\t\n\u000b-\u0002\u0000FFff\u0002\u0000OOoo\u0002\u0000"+ - "RRrr\u0002\u0000EEee\u0002\u0000AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002"+ - "\u0000IIii\u0002\u0000WWww\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000"+ - "TTtt\u0002\u0000NNnn\u0002\u0000PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002"+ - "\u0000GGgg\u0002\u0000DDdd\u0002\u0000MMmm\u0001\u0000::\u0004\u0000A"+ - "Z__az\u0080\u8000\ufffe\u0005\u0000-.0:AZaz\u0080\u8000\ufffe\u0002\u0000"+ - "XXxx\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002"+ - "\u0000JJjj\u0004\u0000\n\n\r\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n"+ - "\n\r\r\u0004\u0000,,..==__\u0001\u0000(;\u0002\u0000[[]]\u0002\u0000#"+ - "#..\u0003\u0000..==__\u0005\u000009AZ__az\u0080\u8000\ufffe\u0003\u0000"+ - "AZaz\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000\ufffe\u0006\u0000"+ - "--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001"+ - "\u0000 \u0005\u0000 \'\'::{{}}\u0005\u0000 !\'\'::{{}}\u07d1\u0000\u0018"+ - "\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c"+ - "\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001"+ - "\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000"+ - "\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000"+ - "\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000."+ - "\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000"+ - "\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000"+ - "\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<"+ - "\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000"+ - "\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000"+ - "\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J"+ - "\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000"+ - "\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000"+ - "\u0000h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l"+ - "\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000"+ - "\u0000\u0000\u0002r\u0001\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000"+ - "\u0002v\u0001\u0000\u0000\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z"+ - "\u0001\u0000\u0000\u0000\u0002|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000"+ - "\u0000\u0000\u0003\u0080\u0001\u0000\u0000\u0000\u0003\u0082\u0001\u0000"+ - "\u0000\u0000\u0003\u0084\u0001\u0000\u0000\u0000\u0003\u0086\u0001\u0000"+ - "\u0000\u0000\u0003\u0088\u0001\u0000\u0000\u0000\u0003\u008a\u0001\u0000"+ - "\u0000\u0000\u0004\u008c\u0001\u0000\u0000\u0000\u0004\u008e\u0001\u0000"+ - "\u0000\u0000\u0004\u0090\u0001\u0000\u0000\u0000\u0004\u0092\u0001\u0000"+ - "\u0000\u0000\u0005\u0094\u0001\u0000\u0000\u0000\u0005\u0096\u0001\u0000"+ - "\u0000\u0000\u0005\u0098\u0001\u0000\u0000\u0000\u0005\u009a\u0001\u0000"+ - "\u0000\u0000\u0005\u009c\u0001\u0000\u0000\u0000\u0005\u009e\u0001\u0000"+ - "\u0000\u0000\u0005\u00a0\u0001\u0000\u0000\u0000\u0005\u00a2\u0001\u0000"+ - "\u0000\u0000\u0005\u00a4\u0001\u0000\u0000\u0000\u0005\u00a6\u0001\u0000"+ - "\u0000\u0000\u0005\u00a8\u0001\u0000\u0000\u0000\u0005\u00aa\u0001\u0000"+ - "\u0000\u0000\u0005\u00ac\u0001\u0000\u0000\u0000\u0005\u00ae\u0001\u0000"+ - "\u0000\u0000\u0006\u00b0\u0001\u0000\u0000\u0000\u0006\u00b2\u0001\u0000"+ - "\u0000\u0000\u0006\u00b4\u0001\u0000\u0000\u0000\u0006\u00b6\u0001\u0000"+ - "\u0000\u0000\u0007\u00b8\u0001\u0000\u0000\u0000\u0007\u00ba\u0001\u0000"+ - "\u0000\u0000\u0007\u00bc\u0001\u0000\u0000\u0000\u0007\u00be\u0001\u0000"+ - "\u0000\u0000\b\u00c0\u0001\u0000\u0000\u0000\b\u00c2\u0001\u0000\u0000"+ - "\u0000\b\u00c4\u0001\u0000\u0000\u0000\b\u00c6\u0001\u0000\u0000\u0000"+ - "\b\u00c8\u0001\u0000\u0000\u0000\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc"+ - "\u0001\u0000\u0000\u0000\t\u00ce\u0001\u0000\u0000\u0000\t\u00d0\u0001"+ - "\u0000\u0000\u0000\t\u00d2\u0001\u0000\u0000\u0000\n\u00d4\u0001\u0000"+ - "\u0000\u0000\n\u00d6\u0001\u0000\u0000\u0000\n\u00d8\u0001\u0000\u0000"+ - "\u0000\n\u00da\u0001\u0000\u0000\u0000\n\u00dc\u0001\u0000\u0000\u0000"+ - "\n\u00de\u0001\u0000\u0000\u0000\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2"+ - "\u0001\u0000\u0000\u0000\n\u00e4\u0001\u0000\u0000\u0000\u000b\u00e6\u0001"+ - "\u0000\u0000\u0000\u000b\u00e8\u0001\u0000\u0000\u0000\u000b\u00ea\u0001"+ - "\u0000\u0000\u0000\u000b\u00ec\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000"+ - "\u0000\u0000\u000e\u015b\u0001\u0000\u0000\u0000\u0010\u015d\u0001\u0000"+ - "\u0000\u0000\u0012\u0179\u0001\u0000\u0000\u0000\u0014\u0188\u0001\u0000"+ - "\u0000\u0000\u0016\u018f\u0001\u0000\u0000\u0000\u0018\u01ae\u0001\u0000"+ - "\u0000\u0000\u001a\u01cc\u0001\u0000\u0000\u0000\u001c\u023e\u0001\u0000"+ - "\u0000\u0000\u001e\u0259\u0001\u0000\u0000\u0000 \u0288\u0001\u0000\u0000"+ - "\u0000\"\u028c\u0001\u0000\u0000\u0000$\u0299\u0001\u0000\u0000\u0000"+ - "&\u02bf\u0001\u0000\u0000\u0000(\u02e4\u0001\u0000\u0000\u0000*\u02e8"+ - "\u0001\u0000\u0000\u0000,\u02f5\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000"+ - "\u0000\u00000\u0349\u0001\u0000\u0000\u00002\u034d\u0001\u0000\u0000\u0000"+ - "4\u0356\u0001\u0000\u0000\u00006\u035c\u0001\u0000\u0000\u00008\u035f"+ - "\u0001\u0000\u0000\u0000:\u0363\u0001\u0000\u0000\u0000<\u0369\u0001\u0000"+ - "\u0000\u0000>\u037d\u0001\u0000\u0000\u0000@\u0390\u0001\u0000\u0000\u0000"+ - "B\u03a0\u0001\u0000\u0000\u0000D\u03c1\u0001\u0000\u0000\u0000F\u03e5"+ - "\u0001\u0000\u0000\u0000H\u03f5\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000"+ - "\u0000\u0000L\u0402\u0001\u0000\u0000\u0000N\u0406\u0001\u0000\u0000\u0000"+ - "P\u040d\u0001\u0000\u0000\u0000R\u0414\u0001\u0000\u0000\u0000T\u041b"+ - "\u0001\u0000\u0000\u0000V\u041d\u0001\u0000\u0000\u0000X\u0427\u0001\u0000"+ - "\u0000\u0000Z\u0432\u0001\u0000\u0000\u0000\\\u043b\u0001\u0000\u0000"+ - "\u0000^\u0450\u0001\u0000\u0000\u0000`\u0452\u0001\u0000\u0000\u0000b"+ - "\u0454\u0001\u0000\u0000\u0000d\u045b\u0001\u0000\u0000\u0000f\u0461\u0001"+ - "\u0000\u0000\u0000h\u054a\u0001\u0000\u0000\u0000j\u054e\u0001\u0000\u0000"+ - "\u0000l\u0554\u0001\u0000\u0000\u0000n\u0558\u0001\u0000\u0000\u0000p"+ - "\u055d\u0001\u0000\u0000\u0000r\u0563\u0001\u0000\u0000\u0000t\u0568\u0001"+ - "\u0000\u0000\u0000v\u056f\u0001\u0000\u0000\u0000x\u0574\u0001\u0000\u0000"+ - "\u0000z\u057a\u0001\u0000\u0000\u0000|\u0583\u0001\u0000\u0000\u0000~"+ - "\u0588\u0001\u0000\u0000\u0000\u0080\u058f\u0001\u0000\u0000\u0000\u0082"+ - "\u0594\u0001\u0000\u0000\u0000\u0084\u059b\u0001\u0000\u0000\u0000\u0086"+ - "\u05a0\u0001\u0000\u0000\u0000\u0088\u05a6\u0001\u0000\u0000\u0000\u008a"+ - "\u05af\u0001\u0000\u0000\u0000\u008c\u05b5\u0001\u0000\u0000\u0000\u008e"+ - "\u05bd\u0001\u0000\u0000\u0000\u0090\u05c3\u0001\u0000\u0000\u0000\u0092"+ - "\u05c8\u0001\u0000\u0000\u0000\u0094\u05cd\u0001\u0000\u0000\u0000\u0096"+ - "\u05d2\u0001\u0000\u0000\u0000\u0098\u05d9\u0001\u0000\u0000\u0000\u009a"+ - "\u05de\u0001\u0000\u0000\u0000\u009c\u05e3\u0001\u0000\u0000\u0000\u009e"+ - "\u05e9\u0001\u0000\u0000\u0000\u00a0\u05ee\u0001\u0000\u0000\u0000\u00a2"+ - "\u05f3\u0001\u0000\u0000\u0000\u00a4\u05f8\u0001\u0000\u0000\u0000\u00a6"+ - "\u0601\u0001\u0000\u0000\u0000\u00a8\u0606\u0001\u0000\u0000\u0000\u00aa"+ - "\u060a\u0001\u0000\u0000\u0000\u00ac\u0618\u0001\u0000\u0000\u0000\u00ae"+ - "\u061b\u0001\u0000\u0000\u0000\u00b0\u0620\u0001\u0000\u0000\u0000\u00b2"+ - "\u062a\u0001\u0000\u0000\u0000\u00b4\u062f\u0001\u0000\u0000\u0000\u00b6"+ - "\u0633\u0001\u0000\u0000\u0000\u00b8\u0638\u0001\u0000\u0000\u0000\u00ba"+ - "\u0648\u0001\u0000\u0000\u0000\u00bc\u064d\u0001\u0000\u0000\u0000\u00be"+ - "\u0651\u0001\u0000\u0000\u0000\u00c0\u0656\u0001\u0000\u0000\u0000\u00c2"+ - "\u065e\u0001\u0000\u0000\u0000\u00c4\u0664\u0001\u0000\u0000\u0000\u00c6"+ - "\u066b\u0001\u0000\u0000\u0000\u00c8\u0670\u0001\u0000\u0000\u0000\u00ca"+ - "\u0674\u0001\u0000\u0000\u0000\u00cc\u0679\u0001\u0000\u0000\u0000\u00ce"+ - "\u067e\u0001\u0000\u0000\u0000\u00d0\u0683\u0001\u0000\u0000\u0000\u00d2"+ - "\u0687\u0001\u0000\u0000\u0000\u00d4\u068c\u0001\u0000\u0000\u0000\u00d6"+ - "\u0695\u0001\u0000\u0000\u0000\u00d8\u0699\u0001\u0000\u0000\u0000\u00da"+ - "\u06cf\u0001\u0000\u0000\u0000\u00dc\u0709\u0001\u0000\u0000\u0000\u00de"+ - "\u070d\u0001\u0000\u0000\u0000\u00e0\u0712\u0001\u0000\u0000\u0000\u00e2"+ - "\u0717\u0001\u0000\u0000\u0000\u00e4\u071b\u0001\u0000\u0000\u0000\u00e6"+ - "\u0720\u0001\u0000\u0000\u0000\u00e8\u0727\u0001\u0000\u0000\u0000\u00ea"+ - "\u072c\u0001\u0000\u0000\u0000\u00ec\u0730\u0001\u0000\u0000\u0000\u00ee"+ - "\u00ef\u0005:\u0000\u0000\u00ef\u00f6\u0005:\u0000\u0000\u00f0\u00f1\u0005"+ - "?\u0000\u0000\u00f1\u00f6\u0005:\u0000\u0000\u00f2\u00f3\u0005 \u0000"+ - "\u0000\u00f3\u00f4\u0005:\u0000\u0000\u00f4\u00f6\u0005 \u0000\u0000\u00f5"+ - "\u00ee\u0001\u0000\u0000\u0000\u00f5\u00f0\u0001\u0000\u0000\u0000\u00f5"+ - "\u00f2\u0001\u0000\u0000\u0000\u00f6\r\u0001\u0000\u0000\u0000\u00f7\u00f8"+ - "\u0007\u0000\u0000\u0000\u00f8\u00f9\u0007\u0001\u0000\u0000\u00f9\u00fa"+ - "\u0007\u0002\u0000\u0000\u00fa\u00ff\u0001\u0000\u0000\u0000\u00fb\u00fc"+ - "\u0007\u0003\u0000\u0000\u00fc\u00fd\u0007\u0004\u0000\u0000\u00fd\u00fe"+ - "\u0007\u0005\u0000\u0000\u00fe\u0100\u0007\u0006\u0000\u0000\u00ff\u00fb"+ - "\u0001\u0000\u0000\u0000\u00ff\u0100\u0001\u0000\u0000\u0000\u0100\u015c"+ - "\u0001\u0000\u0000\u0000\u0101\u0102\u0007\u0007\u0000\u0000\u0102\u015c"+ - "\u0007\u0000\u0000\u0000\u0103\u0104\u0007\b\u0000\u0000\u0104\u0105\u0007"+ - "\u0006\u0000\u0000\u0105\u0106\u0007\u0007\u0000\u0000\u0106\u0107\u0007"+ - "\t\u0000\u0000\u0107\u015c\u0007\u0003\u0000\u0000\u0108\u0109\u0007\n"+ - "\u0000\u0000\u0109\u010a\u0007\u0003\u0000\u0000\u010a\u010b\u0007\u0005"+ - "\u0000\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c\u010d\u0007\u0007"+ - "\u0000\u0000\u010d\u010e\u0007\u0001\u0000\u0000\u010e\u015c\u0007\f\u0000"+ - "\u0000\u010f\u0110\u0007\n\u0000\u0000\u0110\u0111\u0007\u0003\u0000\u0000"+ - "\u0111\u0112\u0007\n\u0000\u0000\u0112\u0113\u0007\n\u0000\u0000\u0113"+ - "\u0114\u0007\u0007\u0000\u0000\u0114\u0115\u0007\u0001\u0000\u0000\u0115"+ - "\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007\u0001\u0000\u0000\u0117\u0118"+ - "\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005\u0000\u0000\u0119\u015c\u0007"+ - "\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000\u0000\u011b\u011c\u0007\u000e"+ - "\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000\u011d\u015c\u0007\u0006\u0000"+ - "\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f\u0120\u0007\u000e\u0000\u0000"+ - "\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122\u0007\u0006\u0000\u0000\u0122"+ - "\u0123\u0007\u0001\u0000\u0000\u0123\u0124\u0007\f\u0000\u0000\u0124\u0125"+ - "\u0007\u0005\u0000\u0000\u0125\u015c\u0007\u0003\u0000\u0000\u0126\u0127"+ - "\u0007\n\u0000\u0000\u0127\u0128\u0007\b\u0000\u0000\u0128\u0129\u0007"+ - "\u0007\u0000\u0000\u0129\u012a\u0007\u000b\u0000\u0000\u012a\u012b\u0007"+ - "\u0005\u0000\u0000\u012b\u015c\u0007\u0006\u0000\u0000\u012c\u012d\u0007"+ - "\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000\u0000\u012e\u012f\u0007\t"+ - "\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000\u0130\u0131\u0007\n\u0000"+ - "\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132\u0133\u0007\u0005\u0000\u0000"+ - "\u0133\u0134\u0007\u0004\u0000\u0000\u0134\u0135\u0007\f\u0000\u0000\u0135"+ - "\u013c\u0001\u0000\u0000\u0000\u0136\u0137\u0007\u0004\u0000\u0000\u0137"+ - "\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007\u000f\u0000\u0000\u0139\u013a"+ - "\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001\u0000\u0000\u013b\u013d\u0007"+ - "\u000b\u0000\u0000\u013c\u0136\u0001\u0000\u0000\u0000\u013c\u0139\u0001"+ - "\u0000\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u015c\u0001"+ - "\u0000\u0000\u0000\u013e\u013f\u0007\u0004\u0000\u0000\u013f\u0140\u0007"+ - "\u000e\u0000\u0000\u0140\u0141\u0007\u000b\u0000\u0000\u0141\u015c\u0007"+ - "\u0006\u0000\u0000\u0142\u0143\u0007\u0010\u0000\u0000\u0143\u0144\u0007"+ - "\u000e\u0000\u0000\u0144\u0145\u0007\u0003\u0000\u0000\u0145\u0146\u0007"+ - "\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000\u0000\u0147\u0148\u0007\u0003"+ - "\u0000\u0000\u0148\u0149\u0007\u0002\u0000\u0000\u0149\u014a\u0007\u0002"+ - "\u0000\u0000\u014a\u014b\u0007\u0001\u0000\u0000\u014b\u015c\u0007\u0002"+ - "\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000\u014d\u014e\u0007\u0002\u0000"+ - "\u0000\u014e\u014f\u0007\u0001\u0000\u0000\u014f\u0150\u0007\u0011\u0000"+ - "\u0000\u0150\u0151\u0007\u000e\u0000\u0000\u0151\u0152\u0007\u0005\u0000"+ - "\u0000\u0152\u0153\u0007\u000b\u0000\u0000\u0153\u0154\u0007\u0007\u0000"+ - "\u0000\u0154\u0155\u0007\u0001\u0000\u0000\u0155\u015c\u0007\f\u0000\u0000"+ - "\u0156\u0157\u0007\u0003\u0000\u0000\u0157\u0158\u0007\u0012\u0000\u0000"+ - "\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a\u0007\u000b\u0000\u0000\u015a"+ - "\u015c\u0007\u000f\u0000\u0000\u015b\u00f7\u0001\u0000\u0000\u0000\u015b"+ - "\u0101\u0001\u0000\u0000\u0000\u015b\u0103\u0001\u0000\u0000\u0000\u015b"+ - "\u0108\u0001\u0000\u0000\u0000\u015b\u010f\u0001\u0000\u0000\u0000\u015b"+ - "\u0116\u0001\u0000\u0000\u0000\u015b\u011a\u0001\u0000\u0000\u0000\u015b"+ - "\u011e\u0001\u0000\u0000\u0000\u015b\u0126\u0001\u0000\u0000\u0000\u015b"+ - "\u012c\u0001\u0000\u0000\u0000\u015b\u0132\u0001\u0000\u0000\u0000\u015b"+ - "\u013e\u0001\u0000\u0000\u0000\u015b\u0142\u0001\u0000\u0000\u0000\u015b"+ - "\u0147\u0001\u0000\u0000\u0000\u015b\u014c\u0001\u0000\u0000\u0000\u015b"+ - "\u0156\u0001\u0000\u0000\u0000\u015c\u000f\u0001\u0000\u0000\u0000\u015d"+ - "\u015e\u0005@\u0000\u0000\u015e\u015f\u0007\u0007\u0000\u0000\u015f\u0160"+ - "\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005\u0000\u0000\u0161\u0162\u0007"+ - "\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000\u0000\u0163\u0164\u0007\u0011"+ - "\u0000\u0000\u0164\u0165\u0007\u0003\u0000\u0000\u0165\u0177\u0001\u0000"+ - "\u0000\u0000\u0166\u0167\u0007\u0007\u0000\u0000\u0167\u0178\u0007\u0000"+ - "\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000\u0169\u016a\u0007\u0006\u0000"+ - "\u0000\u016a\u016b\u0007\u0003\u0000\u0000\u016b\u0178\u0007\f\u0000\u0000"+ - "\u016c\u016d\u0007\u0000\u0000\u0000\u016d\u016e\u0007\u0007\u0000\u0000"+ - "\u016e\u016f\u0007\u0002\u0000\u0000\u016f\u0170\u0007\n\u0000\u0000\u0170"+ - "\u0178\u0007\u000b\u0000\u0000\u0171\u0172\u0007\u000e\u0000\u0000\u0172"+ - "\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007\t\u0000\u0000\u0174\u0175"+ - "\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n\u0000\u0000\u0176\u0178\u0007"+ - "\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000\u0000\u0177\u0168\u0001\u0000"+ - "\u0000\u0000\u0177\u016c\u0001\u0000\u0000\u0000\u0177\u0171\u0001\u0000"+ - "\u0000\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0011\u0001\u0000"+ - "\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000\u017a\u0182\u0003T$\u0000"+ - "\u017b\u017c\u0005{\u0000\u0000\u017c\u017d\u0003\\(\u0000\u017d\u017e"+ - "\u0005}\u0000\u0000\u017e\u0182\u0001\u0000\u0000\u0000\u017f\u0182\t"+ - "\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000\u0000\u0181\u017a\u0001\u0000"+ - "\u0000\u0000\u0181\u017b\u0001\u0000\u0000\u0000\u0181\u017f\u0001\u0000"+ - "\u0000\u0000\u0181\u0180\u0001\u0000\u0000\u0000\u0182\u0185\u0001\u0000"+ - "\u0000\u0000\u0183\u0184\u0001\u0000\u0000\u0000\u0183\u0181\u0001\u0000"+ - "\u0000\u0000\u0184\u0186\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000"+ - "\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000\u0187\u0013\u0001\u0000\u0000"+ - "\u0000\u0188\u018c\u0007\u0014\u0000\u0000\u0189\u018b\u0007\u0015\u0000"+ - "\u0000\u018a\u0189\u0001\u0000\u0000\u0000\u018b\u018e\u0001\u0000\u0000"+ - "\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018c\u018d\u0001\u0000\u0000"+ - "\u0000\u018d\u0015\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000"+ - "\u0000\u018f\u0190\u0005\u00b0\u0000\u0000\u0190\u0017\u0001\u0000\u0000"+ - "\u0000\u0191\u0192\u0005<\u0000\u0000\u0192\u0193\u0005?\u0000\u0000\u0193"+ - "\u0194\u0005=\u0000\u0000\u0194\u0198\u0001\u0000\u0000\u0000\u0195\u0197"+ - "\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ - "\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0198\u0196\u0001"+ - "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ - "\u0000\u0000\u0000\u019b\u019c\u0005?\u0000\u0000\u019c\u01af\u0005>\u0000"+ - "\u0000\u019d\u019e\u0005<\u0000\u0000\u019e\u019f\u0005?\u0000\u0000\u019f"+ - "\u01a0\u0007\r\u0000\u0000\u01a0\u01a1\u0007\u0006\u0000\u0000\u01a1\u01a2"+ - "\u0007\r\u0000\u0000\u01a2\u01a6\u0001\u0000\u0000\u0000\u01a3\u01a5\t"+ - "\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000\u0000\u0000\u01a5\u01a8\u0001"+ - "\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+ - "\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001"+ - "\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000\u0000\u01aa\u01ad\u0005>\u0000"+ - "\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001\u01ac\u01a9\u0001\u0000\u0000"+ - "\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ad\u01af\u0001\u0000\u0000"+ - "\u0000\u01ae\u0191\u0001\u0000\u0000\u0000\u01ae\u019d\u0001\u0000\u0000"+ - "\u0000\u01af\u0019\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005@\u0000\u0000"+ - "\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2\u01b3\u0005@\u0000\u0000\u01b3"+ - "\u01b4\u0007\n\u0000\u0000\u01b4\u01b5\u0007\u0003\u0000\u0000\u01b5\u01b6"+ - "\u0007\u0005\u0000\u0000\u01b6\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8"+ - "\u0007\u0007\u0000\u0000\u01b8\u01b9\u0007\u0001\u0000\u0000\u01b9\u01ba"+ - "\u0007\f\u0000\u0000\u01ba\u01bb\u0007\u0012\u0000\u0000\u01bb\u01bc\u0007"+ - "\u0007\u0000\u0000\u01bc\u01bd\u0007\n\u0000\u0000\u01bd\u01be\u0007\n"+ - "\u0000\u0000\u01be\u01bf\u0007\u0007\u0000\u0000\u01bf\u01c0\u0007\f\u0000"+ - "\u0000\u01c0\u01cd\u0007\u0010\u0000\u0000\u01c1\u01c2\u0005@\u0000\u0000"+ - "\u01c2\u01c3\u0007\u0006\u0000\u0000\u01c3\u01c4\u0007\u0004\u0000\u0000"+ - "\u01c4\u01c5\u0007\n\u0000\u0000\u01c5\u01c6\u0007\n\u0000\u0000\u01c6"+ - "\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8\u0007\u0005\u0000\u0000\u01c8"+ - "\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca\u0007\u0007\u0000\u0000\u01ca"+ - "\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd\u0007\f\u0000\u0000\u01cc\u01b0"+ - "\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001\u0000\u0000\u0000\u01cc\u01c1"+ - "\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ce\u01cf"+ - "\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006\u0007\u0001\u0000\u01d0\u001b"+ - "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005@\u0000\u0000\u01d2\u01d3\u0007"+ - "\u0003\u0000\u0000\u01d3\u01d4\u0007\t\u0000\u0000\u01d4\u01d5\u0007\n"+ - "\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000\u0000\u01d6\u01d7\u0007\u0007"+ - "\u0000\u0000\u01d7\u023f\u0007\u0000\u0000\u0000\u01d8\u023f\u0003\u0010"+ - "\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000\u01da\u01db\u0007\u0003\u0000"+ - "\u0000\u01db\u01dc\u0007\u0016\u0000\u0000\u01dc\u01dd\u0007\u000b\u0000"+ - "\u0000\u01dd\u01de\u0007\u0003\u0000\u0000\u01de\u01df\u0007\f\u0000\u0000"+ - "\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0\u023f\u0007\n\u0000\u0000\u01e1"+ - "\u01e2\u0005@\u0000\u0000\u01e2\u01e3\u0007\u0003\u0000\u0000\u01e3\u01e4"+ - "\u0007\u0004\u0000\u0000\u01e4\u01e5\u0007\u0005\u0000\u0000\u01e5\u023f"+ - "\u0007\u0006\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007"+ - "\u000f\u0000\u0000\u01e8\u01e9\u0007\u0007\u0000\u0000\u01e9\u01ea\u0007"+ - "\u0003\u0000\u0000\u01ea\u01eb\u0007\t\u0000\u0000\u01eb\u023f\u0007\u0011"+ - "\u0000\u0000\u01ec\u01ed\u0005@\u0000\u0000\u01ed\u01ee\u0007\r\u0000"+ - "\u0000\u01ee\u01ef\u0007\u0002\u0000\u0000\u01ef\u01f0\u0007\u0001\u0000"+ - "\u0000\u01f0\u01f1\u0007\r\u0000\u0000\u01f1\u023f\u0007\n\u0000\u0000"+ - "\u01f2\u01f3\u0005@\u0000\u0000\u01f3\u01f4\u0007\u0012\u0000\u0000\u01f4"+ - "\u01f5\u0007\u0003\u0000\u0000\u01f5\u01f6\u0007\u000b\u0000\u0000\u01f6"+ - "\u01f7\u0007\u0006\u0000\u0000\u01f7\u01f8\u0007\u0001\u0000\u0000\u01f8"+ - "\u023f\u0007\u0011\u0000\u0000\u01f9\u01fa\u0005@\u0000\u0000\u01fa\u01fb"+ - "\u0007\u0005\u0000\u0000\u01fb\u01fc\u0007\t\u0000\u0000\u01fc\u01fd\u0007"+ - "\u0004\u0000\u0000\u01fd\u01fe\u0007\n\u0000\u0000\u01fe\u023f\u0007\n"+ - "\u0000\u0000\u01ff\u0200\u0005@\u0000\u0000\u0200\u0201\u0007\n\u0000"+ - "\u0000\u0201\u0202\u0007\u000b\u0000\u0000\u0202\u0203\u0007\u000f\u0000"+ - "\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204\u023f\u0007\u0003\u0000\u0000"+ - "\u0205\u0206\u0005@\u0000\u0000\u0206\u0207\u0007\u0004\u0000\u0000\u0207"+ - "\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007\u0004\u0000\u0000\u0209\u020a"+ - "\u0007\u0002\u0000\u0000\u020a\u023f\u0007\u0003\u0000\u0000\u020b\u020c"+ - "\u0005@\u0000\u0000\u020c\u020d\u0007\u0017\u0000\u0000\u020d\u020e\u0007"+ - "\u0002\u0000\u0000\u020e\u020f\u0007\u0003\u0000\u0000\u020f\u0210\u0007"+ - "\u0004\u0000\u0000\u0210\u023f\u0007\u0018\u0000\u0000\u0211\u0212\u0005"+ - "@\u0000\u0000\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0001"+ - "\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000\u0215\u0216\u0007\u000b\u0000"+ - "\u0000\u0216\u0217\u0007\u0007\u0000\u0000\u0217\u0218\u0007\f\u0000\u0000"+ - "\u0218\u0219\u0007\u000e\u0000\u0000\u0219\u023f\u0007\u0003\u0000\u0000"+ - "\u021a\u021b\u0005@\u0000\u0000\u021b\u021c\u0007\n\u0000\u0000\u021c"+ - "\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007\t\u0000\u0000\u021e\u021f"+ - "\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005\u0000\u0000\u0220\u0221"+ - "\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003\u0000\u0000\u0222\u023f"+ - "\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000\u0000\u0224\u0225\u0007"+ - "\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000\u0000\u0226\u0227\u0007"+ - "\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000\u0228\u0229\u0007\u0017"+ - "\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a\u022b\u0007\u0003\u0000"+ - "\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c\u022d\u0005@\u0000\u0000"+ - "\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f\u0007\u0003\u0000\u0000"+ - "\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231\u0007\u0011\u0000\u0000"+ - "\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233\u0007\f\u0000\u0000\u0233"+ - "\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007\u000f\u0000\u0000\u0235\u0236"+ - "\u0005@\u0000\u0000\u0236\u0237\u0007\u0002\u0000\u0000\u0237\u0238\u0007"+ - "\u0003\u0000\u0000\u0238\u0239\u0007\u0019\u0000\u0000\u0239\u023a\u0007"+ - "\u000e\u0000\u0000\u023a\u023b\u0007\u0007\u0000\u0000\u023b\u023c\u0007"+ - "\u0002\u0000\u0000\u023c\u023d\u0007\u0003\u0000\u0000\u023d\u023f\u0007"+ - "\u0011\u0000\u0000\u023e\u01d1\u0001\u0000\u0000\u0000\u023e\u01d8\u0001"+ - "\u0000\u0000\u0000\u023e\u01d9\u0001\u0000\u0000\u0000\u023e\u01e1\u0001"+ - "\u0000\u0000\u0000\u023e\u01e6\u0001\u0000\u0000\u0000\u023e\u01ec\u0001"+ - "\u0000\u0000\u0000\u023e\u01f2\u0001\u0000\u0000\u0000\u023e\u01f9\u0001"+ - "\u0000\u0000\u0000\u023e\u01ff\u0001\u0000\u0000\u0000\u023e\u0205\u0001"+ - "\u0000\u0000\u0000\u023e\u020b\u0001\u0000\u0000\u0000\u023e\u0211\u0001"+ - "\u0000\u0000\u0000\u023e\u021a\u0001\u0000\u0000\u0000\u023e\u0223\u0001"+ - "\u0000\u0000\u0000\u023e\u022c\u0001\u0000\u0000\u0000\u023e\u0235\u0001"+ - "\u0000\u0000\u0000\u023f\u0241\u0001\u0000\u0000\u0000\u0240\u0242\u0005"+ - " \u0000\u0000\u0241\u0240\u0001\u0000\u0000\u0000\u0242\u0243\u0001\u0000"+ - "\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000"+ - "\u0000\u0000\u0244\u0245\u0001\u0000\u0000\u0000\u0245\u0246\u0004\b\u0000"+ - "\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0006\b\u0000\u0000"+ - "\u0248\u0249\u0006\b\u0001\u0000\u0249\u001d\u0001\u0000\u0000\u0000\u024a"+ - "\u024b\u0005@\u0000\u0000\u024b\u024c\u0007\u0017\u0000\u0000\u024c\u024d"+ - "\u0007\u0002\u0000\u0000\u024d\u024e\u0007\u0003\u0000\u0000\u024e\u024f"+ - "\u0007\u0004\u0000\u0000\u024f\u025a\u0007\u0018\u0000\u0000\u0250\u0251"+ - "\u0005@\u0000\u0000\u0251\u0252\u0007\u0005\u0000\u0000\u0252\u0253\u0007"+ - "\u0001\u0000\u0000\u0253\u0254\u0007\f\u0000\u0000\u0254\u0255\u0007\u000b"+ - "\u0000\u0000\u0255\u0256\u0007\u0007\u0000\u0000\u0256\u0257\u0007\f\u0000"+ - "\u0000\u0257\u0258\u0007\u000e\u0000\u0000\u0258\u025a\u0007\u0003\u0000"+ - "\u0000\u0259\u024a\u0001\u0000\u0000\u0000\u0259\u0250\u0001\u0000\u0000"+ - "\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b\u025c\u0006\t\u0001\u0000"+ - "\u025c\u001f\u0001\u0000\u0000\u0000\u025d\u025e\u0005@\u0000\u0000\u025e"+ - "\u025f\u0007\n\u0000\u0000\u025f\u0260\u0007\u000b\u0000\u0000\u0260\u0261"+ - "\u0007\u0001\u0000\u0000\u0261\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005"+ - "@\u0000\u0000\u0263\u0264\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006"+ - "\u0000\u0000\u0265\u0266\u0007\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000"+ - "\u0000\u0267\u0268\u0005@\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000"+ - "\u0269\u026a\u0007\u001a\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000"+ - "\u026b\u026c\u0007\u0002\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d"+ - "\u026e\u0007\u0002\u0000\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f"+ - "\u0270\u0007\u000b\u0000\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271"+ - "\u0272\u0005@\u0000\u0000\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274"+ - "\u0007\u0007\u0000\u0000\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276"+ - "\u0007\u0003\u0000\u0000\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278"+ - "\u0007\u0003\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a"+ - "\u0007\u0005\u0000\u0000\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c"+ - "\u0007\u0002\u0000\u0000\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e"+ - "\u0007\u0000\u0000\u0000\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280"+ - "\u0007\u0003\u0000\u0000\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007"+ - "\u0006\u0000\u0000\u0282\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003"+ - "\u0000\u0000\u0284\u0285\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000"+ - "\u0000\u0286\u0287\u0001\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001"+ - "\u0000\u0288\u025d\u0001\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000"+ - "\u0000\u0288\u0267\u0001\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000"+ - "\u0000\u0288\u0282\u0001\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000"+ - "\u0000\u028a\u028b\u0006\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000"+ - "\u028c\u028d\u0005@\u0000\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e"+ - "\u028f\u0007\u0003\u0000\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290"+ - "\u0291\u0007\u0017\u0000\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292"+ - "\u0293\u0007\u000b\u0000\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294"+ - "\u0295\u0007\u0012\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296"+ - "\u0297\u0006\u000b\u0002\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298"+ - "#\u0001\u0000\u0000\u0000\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007"+ - "\u0003\u0000\u0000\u029b\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011"+ - "\u0000\u0000\u029d\u029e\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003"+ - "\u0000\u0000\u029f\u02a0\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017"+ - "\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b"+ - "\u0000\u0000\u02a3\u02a4\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012"+ - "\u0000\u0000\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001"+ - "\u0000\u02a7%\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9"+ - "\u02aa\u0007\u0011\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab"+ - "\u02ac\u0005@\u0000\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae"+ - "\u0007\u000e\u0000\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0"+ - "\u0007\r\u0000\u0000\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007"+ - "\u001b\u0000\u0000\u02b2\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@"+ - "\u0000\u0000\u02b4\u02b5\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000"+ - "\u0000\u02b6\u02b7\u0007\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000"+ - "\u02b8\u02b9\u0005@\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba"+ - "\u02bb\u0007\f\u0000\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd"+ - "\u0007\u0003\u0000\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0"+ - "\u0007\u000b\u0000\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab"+ - "\u0001\u0000\u0000\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3"+ - "\u0001\u0000\u0000\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1"+ - "\u0001\u0000\u0000\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006"+ - "\r\u0001\u0000\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000"+ - "\u0000\u02c5\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000"+ - "\u02c7\u02c8\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9"+ - "\u02ca\u0005@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc"+ - "\u0007\n\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007"+ - "\u0000\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011"+ - "\u0000\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000"+ - "\u0000\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e"+ - "\u0000\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000"+ - "\u0000\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000"+ - "\u02d8\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da"+ - "\u02db\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5"+ - "\u0007\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007"+ - "\r\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ + "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\"+ + "\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ + "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+ + "`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0003d\u069c\bd\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0003"+ + "f\u06a9\bf\u0001f\u0001f\u0003f\u06ad\bf\u0001f\u0004f\u06b0\bf\u000b"+ + "f\ff\u06b1\u0001f\u0003f\u06b5\bf\u0001f\u0003f\u06b8\bf\u0001f\u0003"+ + "f\u06bb\bf\u0001f\u0001f\u0003f\u06bf\bf\u0001f\u0001f\u0003f\u06c3\b"+ + "f\u0001f\u0004f\u06c6\bf\u000bf\ff\u06c7\u0001f\u0003f\u06cb\bf\u0001"+ + "f\u0001f\u0003f\u06cf\bf\u0005f\u06d1\bf\nf\ff\u06d4\tf\u0001f\u0003f"+ + "\u06d7\bf\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001"+ + "g\u0001g\u0001g\u0001g\u0001g\u0005g\u06e6\bg\ng\fg\u06e9\tg\u0001g\u0001"+ + "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001"+ + "h\u0001h\u0001h\u0003h\u06f9\bh\u0001h\u0001h\u0005h\u06fd\bh\nh\fh\u0700"+ + "\th\u0001h\u0001h\u0004h\u0704\bh\u000bh\fh\u0705\u0001h\u0003h\u0709"+ + "\bh\u0001h\u0001h\u0003h\u070d\bh\u0004h\u070f\bh\u000bh\fh\u0710\u0001"+ + "h\u0001h\u0001h\u0001h\u0003h\u0717\bh\u0001h\u0001h\u0001i\u0001i\u0001"+ + "i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001"+ + "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+ + "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001"+ + "o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0006\u0183\u0198\u01a6"+ + "\u0376\u0422\u061d\u0000q\f\u0000\u000e\u0000\u0010\u0000\u0012\u0000"+ + "\u0014\u0000\u0016\u0000\u0018\n\u001a\u0000\u001c\u0000\u001e\u0000 "+ + "\u0000\"\u0000$(&\u0000(\u0000*\u0000,\u000b.\u00000\u00002\u00004\f6"+ + "\r8\u000e:\u0000<\u0000>\u0000@\u0000B\u0000D\u0006F\u0000H\u0000J\u0000"+ + "L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z\u0000\\\u0000^\u0000"+ + "`\u0000b\u000fd\u0000f\u0000h\u0000j\u0000l\u0000n\u0000p\u0000r\u0010"+ + "t\u0011v\u0012x\u0013z\u0014|\u0000~\u0000\u0080\u0015\u0082\u0016\u0084"+ + "\u0017\u0086\u0018\u0088\u0019\u008a\u0000\u008c\u001a\u008e\u0000\u0090"+ + "\u0000\u0092\u0000\u0094\u001b\u0096\u0000\u0098\u001c\u009a\u001d\u009c"+ + "\u0000\u009e)\u00a0\u001e\u00a2\u001f\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac"+ + "$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000\u00b6\u0000\u00b8\u0000\u00ba"+ + "\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000\u00c2\u0000\u00c4\u0000\u00c6"+ + "*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce\u0000\u00d0\u0000\u00d2\u0000"+ + "\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc\u0000\u00de+\u00e0"+ + "\u0000\u00e2\u0000\u00e4\u0000\u00e6\'\u00e8\u0000\u00ea\u0000\u00ec\u0000"+ + "\f\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b-\u0002"+ + "\u0000FFff\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000EEee\u0002\u0000"+ + "AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000IIii\u0002\u0000WWww\u0002"+ + "\u0000LLll\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000NNnn\u0002\u0000"+ + "PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002\u0000GGgg\u0002\u0000DDdd\u0002"+ + "\u0000MMmm\u0001\u0000::\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u0000"+ + "-.0:AZaz\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002\u0000JJjj\u0004\u0000\n\n\r"+ + "\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000,,..==__\u0001"+ + "\u0000(;\u0002\u0000[[]]\u0002\u0000##..\u0003\u0000..==__\u0005\u0000"+ + "09AZ__az\u0080\u8000\ufffe\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000"+ + "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ + "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0005\u0000 \'\'::{"+ + "{}}\u0005\u0000 !\'\'::{{}}\u07da\u0000\u0018\u0001\u0000\u0000\u0000"+ + "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+ + "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+ + "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+ + "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+ + "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+ + "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+ + "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+ + "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+ + ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001"+ + "\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000"+ + "\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000"+ + "L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001"+ + "\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000"+ + "\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000\u0001"+ + "n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000\u0000\u0000\u0002r\u0001"+ + "\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000\u0000"+ + "\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000\u0002"+ + "|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000\u0000\u0000\u0003\u0080\u0001"+ + "\u0000\u0000\u0000\u0003\u0082\u0001\u0000\u0000\u0000\u0003\u0084\u0001"+ + "\u0000\u0000\u0000\u0003\u0086\u0001\u0000\u0000\u0000\u0003\u0088\u0001"+ + "\u0000\u0000\u0000\u0003\u008a\u0001\u0000\u0000\u0000\u0004\u008c\u0001"+ + "\u0000\u0000\u0000\u0004\u008e\u0001\u0000\u0000\u0000\u0004\u0090\u0001"+ + "\u0000\u0000\u0000\u0004\u0092\u0001\u0000\u0000\u0000\u0005\u0094\u0001"+ + "\u0000\u0000\u0000\u0005\u0096\u0001\u0000\u0000\u0000\u0005\u0098\u0001"+ + "\u0000\u0000\u0000\u0005\u009a\u0001\u0000\u0000\u0000\u0005\u009c\u0001"+ + "\u0000\u0000\u0000\u0005\u009e\u0001\u0000\u0000\u0000\u0005\u00a0\u0001"+ + "\u0000\u0000\u0000\u0005\u00a2\u0001\u0000\u0000\u0000\u0005\u00a4\u0001"+ + "\u0000\u0000\u0000\u0005\u00a6\u0001\u0000\u0000\u0000\u0005\u00a8\u0001"+ + "\u0000\u0000\u0000\u0005\u00aa\u0001\u0000\u0000\u0000\u0005\u00ac\u0001"+ + "\u0000\u0000\u0000\u0005\u00ae\u0001\u0000\u0000\u0000\u0006\u00b0\u0001"+ + "\u0000\u0000\u0000\u0006\u00b2\u0001\u0000\u0000\u0000\u0006\u00b4\u0001"+ + "\u0000\u0000\u0000\u0006\u00b6\u0001\u0000\u0000\u0000\u0007\u00b8\u0001"+ + "\u0000\u0000\u0000\u0007\u00ba\u0001\u0000\u0000\u0000\u0007\u00bc\u0001"+ + "\u0000\u0000\u0000\u0007\u00be\u0001\u0000\u0000\u0000\b\u00c0\u0001\u0000"+ + "\u0000\u0000\b\u00c2\u0001\u0000\u0000\u0000\b\u00c4\u0001\u0000\u0000"+ + "\u0000\b\u00c6\u0001\u0000\u0000\u0000\b\u00c8\u0001\u0000\u0000\u0000"+ + "\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc\u0001\u0000\u0000\u0000\t\u00ce"+ + "\u0001\u0000\u0000\u0000\t\u00d0\u0001\u0000\u0000\u0000\t\u00d2\u0001"+ + "\u0000\u0000\u0000\n\u00d4\u0001\u0000\u0000\u0000\n\u00d6\u0001\u0000"+ + "\u0000\u0000\n\u00d8\u0001\u0000\u0000\u0000\n\u00da\u0001\u0000\u0000"+ + "\u0000\n\u00dc\u0001\u0000\u0000\u0000\n\u00de\u0001\u0000\u0000\u0000"+ + "\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2\u0001\u0000\u0000\u0000\n\u00e4"+ + "\u0001\u0000\u0000\u0000\u000b\u00e6\u0001\u0000\u0000\u0000\u000b\u00e8"+ + "\u0001\u0000\u0000\u0000\u000b\u00ea\u0001\u0000\u0000\u0000\u000b\u00ec"+ + "\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000\u0000\u0000\u000e\u015b\u0001"+ + "\u0000\u0000\u0000\u0010\u015d\u0001\u0000\u0000\u0000\u0012\u0179\u0001"+ + "\u0000\u0000\u0000\u0014\u0188\u0001\u0000\u0000\u0000\u0016\u018f\u0001"+ + "\u0000\u0000\u0000\u0018\u01ae\u0001\u0000\u0000\u0000\u001a\u01cc\u0001"+ + "\u0000\u0000\u0000\u001c\u023e\u0001\u0000\u0000\u0000\u001e\u0259\u0001"+ + "\u0000\u0000\u0000 \u0288\u0001\u0000\u0000\u0000\"\u028c\u0001\u0000"+ + "\u0000\u0000$\u0299\u0001\u0000\u0000\u0000&\u02bf\u0001\u0000\u0000\u0000"+ + "(\u02e4\u0001\u0000\u0000\u0000*\u02e8\u0001\u0000\u0000\u0000,\u02f5"+ + "\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000\u0000\u00000\u0349\u0001\u0000"+ + "\u0000\u00002\u034d\u0001\u0000\u0000\u00004\u0356\u0001\u0000\u0000\u0000"+ + "6\u035c\u0001\u0000\u0000\u00008\u035f\u0001\u0000\u0000\u0000:\u0363"+ + "\u0001\u0000\u0000\u0000<\u0369\u0001\u0000\u0000\u0000>\u037d\u0001\u0000"+ + "\u0000\u0000@\u0390\u0001\u0000\u0000\u0000B\u03a0\u0001\u0000\u0000\u0000"+ + "D\u03c1\u0001\u0000\u0000\u0000F\u03e5\u0001\u0000\u0000\u0000H\u03f5"+ + "\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000\u0000\u0000L\u0402\u0001\u0000"+ + "\u0000\u0000N\u0406\u0001\u0000\u0000\u0000P\u040d\u0001\u0000\u0000\u0000"+ + "R\u0414\u0001\u0000\u0000\u0000T\u041b\u0001\u0000\u0000\u0000V\u041d"+ + "\u0001\u0000\u0000\u0000X\u0427\u0001\u0000\u0000\u0000Z\u0432\u0001\u0000"+ + "\u0000\u0000\\\u043b\u0001\u0000\u0000\u0000^\u0450\u0001\u0000\u0000"+ + "\u0000`\u0452\u0001\u0000\u0000\u0000b\u0454\u0001\u0000\u0000\u0000d"+ + "\u045b\u0001\u0000\u0000\u0000f\u0461\u0001\u0000\u0000\u0000h\u0557\u0001"+ + "\u0000\u0000\u0000j\u055b\u0001\u0000\u0000\u0000l\u0561\u0001\u0000\u0000"+ + "\u0000n\u0565\u0001\u0000\u0000\u0000p\u056a\u0001\u0000\u0000\u0000r"+ + "\u0570\u0001\u0000\u0000\u0000t\u0575\u0001\u0000\u0000\u0000v\u057c\u0001"+ + "\u0000\u0000\u0000x\u0581\u0001\u0000\u0000\u0000z\u0587\u0001\u0000\u0000"+ + "\u0000|\u0590\u0001\u0000\u0000\u0000~\u0595\u0001\u0000\u0000\u0000\u0080"+ + "\u059c\u0001\u0000\u0000\u0000\u0082\u05a1\u0001\u0000\u0000\u0000\u0084"+ + "\u05a8\u0001\u0000\u0000\u0000\u0086\u05ad\u0001\u0000\u0000\u0000\u0088"+ + "\u05b3\u0001\u0000\u0000\u0000\u008a\u05bc\u0001\u0000\u0000\u0000\u008c"+ + "\u05c2\u0001\u0000\u0000\u0000\u008e\u05ca\u0001\u0000\u0000\u0000\u0090"+ + "\u05d0\u0001\u0000\u0000\u0000\u0092\u05d5\u0001\u0000\u0000\u0000\u0094"+ + "\u05da\u0001\u0000\u0000\u0000\u0096\u05df\u0001\u0000\u0000\u0000\u0098"+ + "\u05e6\u0001\u0000\u0000\u0000\u009a\u05eb\u0001\u0000\u0000\u0000\u009c"+ + "\u05f0\u0001\u0000\u0000\u0000\u009e\u05f6\u0001\u0000\u0000\u0000\u00a0"+ + "\u05fb\u0001\u0000\u0000\u0000\u00a2\u0600\u0001\u0000\u0000\u0000\u00a4"+ + "\u0605\u0001\u0000\u0000\u0000\u00a6\u060e\u0001\u0000\u0000\u0000\u00a8"+ + "\u0613\u0001\u0000\u0000\u0000\u00aa\u0617\u0001\u0000\u0000\u0000\u00ac"+ + "\u0625\u0001\u0000\u0000\u0000\u00ae\u0628\u0001\u0000\u0000\u0000\u00b0"+ + "\u062d\u0001\u0000\u0000\u0000\u00b2\u0637\u0001\u0000\u0000\u0000\u00b4"+ + "\u063c\u0001\u0000\u0000\u0000\u00b6\u0640\u0001\u0000\u0000\u0000\u00b8"+ + "\u0645\u0001\u0000\u0000\u0000\u00ba\u0655\u0001\u0000\u0000\u0000\u00bc"+ + "\u065a\u0001\u0000\u0000\u0000\u00be\u065e\u0001\u0000\u0000\u0000\u00c0"+ + "\u0663\u0001\u0000\u0000\u0000\u00c2\u066b\u0001\u0000\u0000\u0000\u00c4"+ + "\u0671\u0001\u0000\u0000\u0000\u00c6\u0678\u0001\u0000\u0000\u0000\u00c8"+ + "\u067d\u0001\u0000\u0000\u0000\u00ca\u0681\u0001\u0000\u0000\u0000\u00cc"+ + "\u0686\u0001\u0000\u0000\u0000\u00ce\u068b\u0001\u0000\u0000\u0000\u00d0"+ + "\u0690\u0001\u0000\u0000\u0000\u00d2\u0694\u0001\u0000\u0000\u0000\u00d4"+ + "\u0699\u0001\u0000\u0000\u0000\u00d6\u06a2\u0001\u0000\u0000\u0000\u00d8"+ + "\u06a6\u0001\u0000\u0000\u0000\u00da\u06dc\u0001\u0000\u0000\u0000\u00dc"+ + "\u0716\u0001\u0000\u0000\u0000\u00de\u071a\u0001\u0000\u0000\u0000\u00e0"+ + "\u071f\u0001\u0000\u0000\u0000\u00e2\u0724\u0001\u0000\u0000\u0000\u00e4"+ + "\u0728\u0001\u0000\u0000\u0000\u00e6\u072d\u0001\u0000\u0000\u0000\u00e8"+ + "\u0734\u0001\u0000\u0000\u0000\u00ea\u0739\u0001\u0000\u0000\u0000\u00ec"+ + "\u073d\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005:\u0000\u0000\u00ef\u00f6"+ + "\u0005:\u0000\u0000\u00f0\u00f1\u0005?\u0000\u0000\u00f1\u00f6\u0005:"+ + "\u0000\u0000\u00f2\u00f3\u0005 \u0000\u0000\u00f3\u00f4\u0005:\u0000\u0000"+ + "\u00f4\u00f6\u0005 \u0000\u0000\u00f5\u00ee\u0001\u0000\u0000\u0000\u00f5"+ + "\u00f0\u0001\u0000\u0000\u0000\u00f5\u00f2\u0001\u0000\u0000\u0000\u00f6"+ + "\r\u0001\u0000\u0000\u0000\u00f7\u00f8\u0007\u0000\u0000\u0000\u00f8\u00f9"+ + "\u0007\u0001\u0000\u0000\u00f9\u00fa\u0007\u0002\u0000\u0000\u00fa\u00ff"+ + "\u0001\u0000\u0000\u0000\u00fb\u00fc\u0007\u0003\u0000\u0000\u00fc\u00fd"+ + "\u0007\u0004\u0000\u0000\u00fd\u00fe\u0007\u0005\u0000\u0000\u00fe\u0100"+ + "\u0007\u0006\u0000\u0000\u00ff\u00fb\u0001\u0000\u0000\u0000\u00ff\u0100"+ + "\u0001\u0000\u0000\u0000\u0100\u015c\u0001\u0000\u0000\u0000\u0101\u0102"+ + "\u0007\u0007\u0000\u0000\u0102\u015c\u0007\u0000\u0000\u0000\u0103\u0104"+ + "\u0007\b\u0000\u0000\u0104\u0105\u0007\u0006\u0000\u0000\u0105\u0106\u0007"+ + "\u0007\u0000\u0000\u0106\u0107\u0007\t\u0000\u0000\u0107\u015c\u0007\u0003"+ + "\u0000\u0000\u0108\u0109\u0007\n\u0000\u0000\u0109\u010a\u0007\u0003\u0000"+ + "\u0000\u010a\u010b\u0007\u0005\u0000\u0000\u010b\u010c\u0007\u000b\u0000"+ + "\u0000\u010c\u010d\u0007\u0007\u0000\u0000\u010d\u010e\u0007\u0001\u0000"+ + "\u0000\u010e\u015c\u0007\f\u0000\u0000\u010f\u0110\u0007\n\u0000\u0000"+ + "\u0110\u0111\u0007\u0003\u0000\u0000\u0111\u0112\u0007\n\u0000\u0000\u0112"+ + "\u0113\u0007\n\u0000\u0000\u0113\u0114\u0007\u0007\u0000\u0000\u0114\u0115"+ + "\u0007\u0001\u0000\u0000\u0115\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007"+ + "\u0001\u0000\u0000\u0117\u0118\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005"+ + "\u0000\u0000\u0119\u015c\u0007\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000"+ + "\u0000\u011b\u011c\u0007\u000e\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000"+ + "\u011d\u015c\u0007\u0006\u0000\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f"+ + "\u0120\u0007\u000e\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122"+ + "\u0007\u0006\u0000\u0000\u0122\u0123\u0007\u0001\u0000\u0000\u0123\u0124"+ + "\u0007\f\u0000\u0000\u0124\u0125\u0007\u0005\u0000\u0000\u0125\u015c\u0007"+ + "\u0003\u0000\u0000\u0126\u0127\u0007\n\u0000\u0000\u0127\u0128\u0007\b"+ + "\u0000\u0000\u0128\u0129\u0007\u0007\u0000\u0000\u0129\u012a\u0007\u000b"+ + "\u0000\u0000\u012a\u012b\u0007\u0005\u0000\u0000\u012b\u015c\u0007\u0006"+ + "\u0000\u0000\u012c\u012d\u0007\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000"+ + "\u0000\u012e\u012f\u0007\t\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000"+ + "\u0130\u0131\u0007\n\u0000\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132"+ + "\u0133\u0007\u0005\u0000\u0000\u0133\u0134\u0007\u0004\u0000\u0000\u0134"+ + "\u0135\u0007\f\u0000\u0000\u0135\u013c\u0001\u0000\u0000\u0000\u0136\u0137"+ + "\u0007\u0004\u0000\u0000\u0137\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007"+ + "\u000f\u0000\u0000\u0139\u013a\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001"+ + "\u0000\u0000\u013b\u013d\u0007\u000b\u0000\u0000\u013c\u0136\u0001\u0000"+ + "\u0000\u0000\u013c\u0139\u0001\u0000\u0000\u0000\u013c\u013d\u0001\u0000"+ + "\u0000\u0000\u013d\u015c\u0001\u0000\u0000\u0000\u013e\u013f\u0007\u0004"+ + "\u0000\u0000\u013f\u0140\u0007\u000e\u0000\u0000\u0140\u0141\u0007\u000b"+ + "\u0000\u0000\u0141\u015c\u0007\u0006\u0000\u0000\u0142\u0143\u0007\u0010"+ + "\u0000\u0000\u0143\u0144\u0007\u000e\u0000\u0000\u0144\u0145\u0007\u0003"+ + "\u0000\u0000\u0145\u0146\u0007\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000"+ + "\u0000\u0147\u0148\u0007\u0003\u0000\u0000\u0148\u0149\u0007\u0002\u0000"+ + "\u0000\u0149\u014a\u0007\u0002\u0000\u0000\u014a\u014b\u0007\u0001\u0000"+ + "\u0000\u014b\u015c\u0007\u0002\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000"+ + "\u014d\u014e\u0007\u0002\u0000\u0000\u014e\u014f\u0007\u0001\u0000\u0000"+ + "\u014f\u0150\u0007\u0011\u0000\u0000\u0150\u0151\u0007\u000e\u0000\u0000"+ + "\u0151\u0152\u0007\u0005\u0000\u0000\u0152\u0153\u0007\u000b\u0000\u0000"+ + "\u0153\u0154\u0007\u0007\u0000\u0000\u0154\u0155\u0007\u0001\u0000\u0000"+ + "\u0155\u015c\u0007\f\u0000\u0000\u0156\u0157\u0007\u0003\u0000\u0000\u0157"+ + "\u0158\u0007\u0012\u0000\u0000\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a"+ + "\u0007\u000b\u0000\u0000\u015a\u015c\u0007\u000f\u0000\u0000\u015b\u00f7"+ + "\u0001\u0000\u0000\u0000\u015b\u0101\u0001\u0000\u0000\u0000\u015b\u0103"+ + "\u0001\u0000\u0000\u0000\u015b\u0108\u0001\u0000\u0000\u0000\u015b\u010f"+ + "\u0001\u0000\u0000\u0000\u015b\u0116\u0001\u0000\u0000\u0000\u015b\u011a"+ + "\u0001\u0000\u0000\u0000\u015b\u011e\u0001\u0000\u0000\u0000\u015b\u0126"+ + "\u0001\u0000\u0000\u0000\u015b\u012c\u0001\u0000\u0000\u0000\u015b\u0132"+ + "\u0001\u0000\u0000\u0000\u015b\u013e\u0001\u0000\u0000\u0000\u015b\u0142"+ + "\u0001\u0000\u0000\u0000\u015b\u0147\u0001\u0000\u0000\u0000\u015b\u014c"+ + "\u0001\u0000\u0000\u0000\u015b\u0156\u0001\u0000\u0000\u0000\u015c\u000f"+ + "\u0001\u0000\u0000\u0000\u015d\u015e\u0005@\u0000\u0000\u015e\u015f\u0007"+ + "\u0007\u0000\u0000\u015f\u0160\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005"+ + "\u0000\u0000\u0161\u0162\u0007\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000"+ + "\u0000\u0163\u0164\u0007\u0011\u0000\u0000\u0164\u0165\u0007\u0003\u0000"+ + "\u0000\u0165\u0177\u0001\u0000\u0000\u0000\u0166\u0167\u0007\u0007\u0000"+ + "\u0000\u0167\u0178\u0007\u0000\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000"+ + "\u0169\u016a\u0007\u0006\u0000\u0000\u016a\u016b\u0007\u0003\u0000\u0000"+ + "\u016b\u0178\u0007\f\u0000\u0000\u016c\u016d\u0007\u0000\u0000\u0000\u016d"+ + "\u016e\u0007\u0007\u0000\u0000\u016e\u016f\u0007\u0002\u0000\u0000\u016f"+ + "\u0170\u0007\n\u0000\u0000\u0170\u0178\u0007\u000b\u0000\u0000\u0171\u0172"+ + "\u0007\u000e\u0000\u0000\u0172\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007"+ + "\t\u0000\u0000\u0174\u0175\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n"+ + "\u0000\u0000\u0176\u0178\u0007\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000"+ + "\u0000\u0177\u0168\u0001\u0000\u0000\u0000\u0177\u016c\u0001\u0000\u0000"+ + "\u0000\u0177\u0171\u0001\u0000\u0000\u0000\u0177\u0178\u0001\u0000\u0000"+ + "\u0000\u0178\u0011\u0001\u0000\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000"+ + "\u017a\u0182\u0003T$\u0000\u017b\u017c\u0005{\u0000\u0000\u017c\u017d"+ + "\u0003\\(\u0000\u017d\u017e\u0005}\u0000\u0000\u017e\u0182\u0001\u0000"+ + "\u0000\u0000\u017f\u0182\t\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000"+ + "\u0000\u0181\u017a\u0001\u0000\u0000\u0000\u0181\u017b\u0001\u0000\u0000"+ + "\u0000\u0181\u017f\u0001\u0000\u0000\u0000\u0181\u0180\u0001\u0000\u0000"+ + "\u0000\u0182\u0185\u0001\u0000\u0000\u0000\u0183\u0184\u0001\u0000\u0000"+ + "\u0000\u0183\u0181\u0001\u0000\u0000\u0000\u0184\u0186\u0001\u0000\u0000"+ + "\u0000\u0185\u0183\u0001\u0000\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000"+ + "\u0187\u0013\u0001\u0000\u0000\u0000\u0188\u018c\u0007\u0014\u0000\u0000"+ + "\u0189\u018b\u0007\u0015\u0000\u0000\u018a\u0189\u0001\u0000\u0000\u0000"+ + "\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000\u0000"+ + "\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u0015\u0001\u0000\u0000\u0000"+ + "\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0005\u00b0\u0000\u0000"+ + "\u0190\u0017\u0001\u0000\u0000\u0000\u0191\u0192\u0005<\u0000\u0000\u0192"+ + "\u0193\u0005?\u0000\u0000\u0193\u0194\u0005=\u0000\u0000\u0194\u0198\u0001"+ + "\u0000\u0000\u0000\u0195\u0197\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000"+ + "\u0000\u0000\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000"+ + "\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0199\u019b\u0001\u0000"+ + "\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019c\u0005?\u0000"+ + "\u0000\u019c\u01af\u0005>\u0000\u0000\u019d\u019e\u0005<\u0000\u0000\u019e"+ + "\u019f\u0005?\u0000\u0000\u019f\u01a0\u0007\r\u0000\u0000\u01a0\u01a1"+ + "\u0007\u0006\u0000\u0000\u01a1\u01a2\u0007\r\u0000\u0000\u01a2\u01a6\u0001"+ + "\u0000\u0000\u0000\u01a3\u01a5\t\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000"+ + "\u0000\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000"+ + "\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000"+ + "\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000"+ + "\u0000\u01aa\u01ad\u0005>\u0000\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001"+ + "\u01ac\u01a9\u0001\u0000\u0000\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000"+ + "\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae\u0191\u0001\u0000\u0000\u0000"+ + "\u01ae\u019d\u0001\u0000\u0000\u0000\u01af\u0019\u0001\u0000\u0000\u0000"+ + "\u01b0\u01b1\u0005@\u0000\u0000\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2"+ + "\u01b3\u0005@\u0000\u0000\u01b3\u01b4\u0007\n\u0000\u0000\u01b4\u01b5"+ + "\u0007\u0003\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6\u01b7"+ + "\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0007\u0000\u0000\u01b8\u01b9"+ + "\u0007\u0001\u0000\u0000\u01b9\u01ba\u0007\f\u0000\u0000\u01ba\u01bb\u0007"+ + "\u0012\u0000\u0000\u01bb\u01bc\u0007\u0007\u0000\u0000\u01bc\u01bd\u0007"+ + "\n\u0000\u0000\u01bd\u01be\u0007\n\u0000\u0000\u01be\u01bf\u0007\u0007"+ + "\u0000\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01cd\u0007\u0010\u0000"+ + "\u0000\u01c1\u01c2\u0005@\u0000\u0000\u01c2\u01c3\u0007\u0006\u0000\u0000"+ + "\u01c3\u01c4\u0007\u0004\u0000\u0000\u01c4\u01c5\u0007\n\u0000\u0000\u01c5"+ + "\u01c6\u0007\n\u0000\u0000\u01c6\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8"+ + "\u0007\u0005\u0000\u0000\u01c8\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca"+ + "\u0007\u0007\u0000\u0000\u01ca\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd"+ + "\u0007\f\u0000\u0000\u01cc\u01b0\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001"+ + "\u0000\u0000\u0000\u01cc\u01c1\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001"+ + "\u0000\u0000\u0000\u01ce\u01cf\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006"+ + "\u0007\u0001\u0000\u01d0\u001b\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005"+ + "@\u0000\u0000\u01d2\u01d3\u0007\u0003\u0000\u0000\u01d3\u01d4\u0007\t"+ + "\u0000\u0000\u01d4\u01d5\u0007\n\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000"+ + "\u0000\u01d6\u01d7\u0007\u0007\u0000\u0000\u01d7\u023f\u0007\u0000\u0000"+ + "\u0000\u01d8\u023f\u0003\u0010\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000"+ + "\u01da\u01db\u0007\u0003\u0000\u0000\u01db\u01dc\u0007\u0016\u0000\u0000"+ + "\u01dc\u01dd\u0007\u000b\u0000\u0000\u01dd\u01de\u0007\u0003\u0000\u0000"+ + "\u01de\u01df\u0007\f\u0000\u0000\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0"+ + "\u023f\u0007\n\u0000\u0000\u01e1\u01e2\u0005@\u0000\u0000\u01e2\u01e3"+ + "\u0007\u0003\u0000\u0000\u01e3\u01e4\u0007\u0004\u0000\u0000\u01e4\u01e5"+ + "\u0007\u0005\u0000\u0000\u01e5\u023f\u0007\u0006\u0000\u0000\u01e6\u01e7"+ + "\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000f\u0000\u0000\u01e8\u01e9\u0007"+ + "\u0007\u0000\u0000\u01e9\u01ea\u0007\u0003\u0000\u0000\u01ea\u01eb\u0007"+ + "\t\u0000\u0000\u01eb\u023f\u0007\u0011\u0000\u0000\u01ec\u01ed\u0005@"+ + "\u0000\u0000\u01ed\u01ee\u0007\r\u0000\u0000\u01ee\u01ef\u0007\u0002\u0000"+ + "\u0000\u01ef\u01f0\u0007\u0001\u0000\u0000\u01f0\u01f1\u0007\r\u0000\u0000"+ + "\u01f1\u023f\u0007\n\u0000\u0000\u01f2\u01f3\u0005@\u0000\u0000\u01f3"+ + "\u01f4\u0007\u0012\u0000\u0000\u01f4\u01f5\u0007\u0003\u0000\u0000\u01f5"+ + "\u01f6\u0007\u000b\u0000\u0000\u01f6\u01f7\u0007\u0006\u0000\u0000\u01f7"+ + "\u01f8\u0007\u0001\u0000\u0000\u01f8\u023f\u0007\u0011\u0000\u0000\u01f9"+ + "\u01fa\u0005@\u0000\u0000\u01fa\u01fb\u0007\u0005\u0000\u0000\u01fb\u01fc"+ + "\u0007\t\u0000\u0000\u01fc\u01fd\u0007\u0004\u0000\u0000\u01fd\u01fe\u0007"+ + "\n\u0000\u0000\u01fe\u023f\u0007\n\u0000\u0000\u01ff\u0200\u0005@\u0000"+ + "\u0000\u0200\u0201\u0007\n\u0000\u0000\u0201\u0202\u0007\u000b\u0000\u0000"+ + "\u0202\u0203\u0007\u000f\u0000\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204"+ + "\u023f\u0007\u0003\u0000\u0000\u0205\u0206\u0005@\u0000\u0000\u0206\u0207"+ + "\u0007\u0004\u0000\u0000\u0207\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007"+ + "\u0004\u0000\u0000\u0209\u020a\u0007\u0002\u0000\u0000\u020a\u023f\u0007"+ + "\u0003\u0000\u0000\u020b\u020c\u0005@\u0000\u0000\u020c\u020d\u0007\u0017"+ + "\u0000\u0000\u020d\u020e\u0007\u0002\u0000\u0000\u020e\u020f\u0007\u0003"+ + "\u0000\u0000\u020f\u0210\u0007\u0004\u0000\u0000\u0210\u023f\u0007\u0018"+ + "\u0000\u0000\u0211\u0212\u0005@\u0000\u0000\u0212\u0213\u0007\u0005\u0000"+ + "\u0000\u0213\u0214\u0007\u0001\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000"+ + "\u0215\u0216\u0007\u000b\u0000\u0000\u0216\u0217\u0007\u0007\u0000\u0000"+ + "\u0217\u0218\u0007\f\u0000\u0000\u0218\u0219\u0007\u000e\u0000\u0000\u0219"+ + "\u023f\u0007\u0003\u0000\u0000\u021a\u021b\u0005@\u0000\u0000\u021b\u021c"+ + "\u0007\n\u0000\u0000\u021c\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007"+ + "\t\u0000\u0000\u021e\u021f\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005"+ + "\u0000\u0000\u0220\u0221\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003"+ + "\u0000\u0000\u0222\u023f\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000"+ + "\u0000\u0224\u0225\u0007\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000"+ + "\u0000\u0226\u0227\u0007\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000"+ + "\u0228\u0229\u0007\u0017\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a"+ + "\u022b\u0007\u0003\u0000\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c"+ + "\u022d\u0005@\u0000\u0000\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f"+ + "\u0007\u0003\u0000\u0000\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231"+ + "\u0007\u0011\u0000\u0000\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233"+ + "\u0007\f\u0000\u0000\u0233\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007"+ + "\u000f\u0000\u0000\u0235\u0236\u0005@\u0000\u0000\u0236\u0237\u0007\u0002"+ + "\u0000\u0000\u0237\u0238\u0007\u0003\u0000\u0000\u0238\u0239\u0007\u0019"+ + "\u0000\u0000\u0239\u023a\u0007\u000e\u0000\u0000\u023a\u023b\u0007\u0007"+ + "\u0000\u0000\u023b\u023c\u0007\u0002\u0000\u0000\u023c\u023d\u0007\u0003"+ + "\u0000\u0000\u023d\u023f\u0007\u0011\u0000\u0000\u023e\u01d1\u0001\u0000"+ + "\u0000\u0000\u023e\u01d8\u0001\u0000\u0000\u0000\u023e\u01d9\u0001\u0000"+ + "\u0000\u0000\u023e\u01e1\u0001\u0000\u0000\u0000\u023e\u01e6\u0001\u0000"+ + "\u0000\u0000\u023e\u01ec\u0001\u0000\u0000\u0000\u023e\u01f2\u0001\u0000"+ + "\u0000\u0000\u023e\u01f9\u0001\u0000\u0000\u0000\u023e\u01ff\u0001\u0000"+ + "\u0000\u0000\u023e\u0205\u0001\u0000\u0000\u0000\u023e\u020b\u0001\u0000"+ + "\u0000\u0000\u023e\u0211\u0001\u0000\u0000\u0000\u023e\u021a\u0001\u0000"+ + "\u0000\u0000\u023e\u0223\u0001\u0000\u0000\u0000\u023e\u022c\u0001\u0000"+ + "\u0000\u0000\u023e\u0235\u0001\u0000\u0000\u0000\u023f\u0241\u0001\u0000"+ + "\u0000\u0000\u0240\u0242\u0005 \u0000\u0000\u0241\u0240\u0001\u0000\u0000"+ + "\u0000\u0242\u0243\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ + "\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0245\u0001\u0000\u0000"+ + "\u0000\u0245\u0246\u0004\b\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ + "\u0247\u0248\u0006\b\u0000\u0000\u0248\u0249\u0006\b\u0001\u0000\u0249"+ + "\u001d\u0001\u0000\u0000\u0000\u024a\u024b\u0005@\u0000\u0000\u024b\u024c"+ + "\u0007\u0017\u0000\u0000\u024c\u024d\u0007\u0002\u0000\u0000\u024d\u024e"+ + "\u0007\u0003\u0000\u0000\u024e\u024f\u0007\u0004\u0000\u0000\u024f\u025a"+ + "\u0007\u0018\u0000\u0000\u0250\u0251\u0005@\u0000\u0000\u0251\u0252\u0007"+ + "\u0005\u0000\u0000\u0252\u0253\u0007\u0001\u0000\u0000\u0253\u0254\u0007"+ + "\f\u0000\u0000\u0254\u0255\u0007\u000b\u0000\u0000\u0255\u0256\u0007\u0007"+ + "\u0000\u0000\u0256\u0257\u0007\f\u0000\u0000\u0257\u0258\u0007\u000e\u0000"+ + "\u0000\u0258\u025a\u0007\u0003\u0000\u0000\u0259\u024a\u0001\u0000\u0000"+ + "\u0000\u0259\u0250\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000"+ + "\u0000\u025b\u025c\u0006\t\u0001\u0000\u025c\u001f\u0001\u0000\u0000\u0000"+ + "\u025d\u025e\u0005@\u0000\u0000\u025e\u025f\u0007\n\u0000\u0000\u025f"+ + "\u0260\u0007\u000b\u0000\u0000\u0260\u0261\u0007\u0001\u0000\u0000\u0261"+ + "\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005@\u0000\u0000\u0263\u0264"+ + "\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006\u0000\u0000\u0265\u0266\u0007"+ + "\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000\u0000\u0267\u0268\u0005@"+ + "\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000\u0269\u026a\u0007\u001a"+ + "\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000\u026b\u026c\u0007\u0002"+ + "\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d\u026e\u0007\u0002\u0000"+ + "\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f\u0270\u0007\u000b\u0000"+ + "\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271\u0272\u0005@\u0000\u0000"+ + "\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274\u0007\u0007\u0000\u0000"+ + "\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276\u0007\u0003\u0000\u0000"+ + "\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278\u0007\u0003\u0000\u0000"+ + "\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a\u0007\u0005\u0000\u0000"+ + "\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c\u0007\u0002\u0000\u0000"+ + "\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e\u0007\u0000\u0000\u0000"+ + "\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280\u0007\u0003\u0000\u0000"+ + "\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007\u0006\u0000\u0000\u0282"+ + "\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285"+ + "\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000\u0000\u0286\u0287\u0001"+ + "\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001\u0000\u0288\u025d\u0001"+ + "\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000\u0000\u0288\u0267\u0001"+ + "\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000\u0000\u0288\u0282\u0001"+ + "\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000\u0000\u028a\u028b\u0006"+ + "\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000\u028c\u028d\u0005@\u0000"+ + "\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e\u028f\u0007\u0003\u0000"+ + "\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290\u0291\u0007\u0017\u0000"+ + "\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292\u0293\u0007\u000b\u0000"+ + "\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294\u0295\u0007\u0012\u0000"+ + "\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0297\u0006\u000b\u0002"+ + "\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298#\u0001\u0000\u0000\u0000"+ + "\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007\u0003\u0000\u0000\u029b"+ + "\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011\u0000\u0000\u029d\u029e"+ + "\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003\u0000\u0000\u029f\u02a0"+ + "\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017\u0000\u0000\u02a1\u02a2"+ + "\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b\u0000\u0000\u02a3\u02a4"+ + "\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012\u0000\u0000\u02a5\u02a6"+ + "\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001\u0000\u02a7%\u0001"+ + "\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9\u02aa\u0007\u0011"+ + "\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab\u02ac\u0005@\u0000"+ + "\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae\u0007\u000e\u0000"+ + "\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0\u0007\r\u0000\u0000"+ + "\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007\u001b\u0000\u0000\u02b2"+ + "\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@\u0000\u0000\u02b4\u02b5"+ + "\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000\u0000\u02b6\u02b7\u0007"+ + "\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000\u02b8\u02b9\u0005@"+ + "\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba\u02bb\u0007\f\u0000"+ + "\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd\u0007\u0003\u0000"+ + "\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0\u0007\u000b\u0000"+ + "\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab\u0001\u0000\u0000"+ + "\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3\u0001\u0000\u0000"+ + "\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000"+ + "\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006\r\u0001\u0000"+ + "\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000\u0000\u02c5"+ + "\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000\u02c7\u02c8"+ + "\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9\u02ca\u0005"+ + "@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc\u0007\n"+ + "\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007\u0000"+ + "\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011\u0000"+ + "\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000\u0000"+ + "\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e\u0000"+ + "\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000\u0000"+ + "\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000\u02d8"+ + "\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da\u02db"+ + "\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5\u0007"+ + "\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007\r"+ + "\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ "\u0000\u0000\u02e1\u02e2\u0007\u0003\u0000\u0000\u02e2\u02e3\u0007\f\u0000"+ "\u0000\u02e3\u02e5\u0007\u000b\u0000\u0000\u02e4\u02c4\u0001\u0000\u0000"+ "\u0000\u02e4\u02c9\u0001\u0000\u0000\u0000\u02e4\u02ce\u0001\u0000\u0000"+ @@ -1391,13 +1394,13 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0001\u0000\u0000\u0000\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a"+ "\u0001\u0000\u0000\u0000\u046a\u046b\u0006-\t\u0000\u046bg\u0001\u0000"+ "\u0000\u0000\u046c\u046d\u0005{\u0000\u0000\u046d\u046e\u0005{\u0000\u0000"+ - "\u046e\u054b\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ + "\u046e\u0558\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ "\u0005@\u0000\u0000\u0471\u0473\u0001\u0000\u0000\u0000\u0472\u0474\u0005"+ "@\u0000\u0000\u0473\u0472\u0001\u0000\u0000\u0000\u0473\u0474\u0001\u0000"+ - "\u0000\u0000\u0474\u054b\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ + "\u0000\u0000\u0474\u0558\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ "\u0000\u0476\u0477\u0005{\u0000\u0000\u0477\u0479\u0001\u0000\u0000\u0000"+ "\u0478\u047a\u0005{\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u0479"+ - "\u047a\u0001\u0000\u0000\u0000\u047a\u054b\u0001\u0000\u0000\u0000\u047b"+ + "\u047a\u0001\u0000\u0000\u0000\u047a\u0558\u0001\u0000\u0000\u0000\u047b"+ "\u047c\u0005@\u0000\u0000\u047c\u047d\u0007\u0012\u0000\u0000\u047d\u047e"+ "\u0007\u0003\u0000\u0000\u047e\u047f\u0007\u0011\u0000\u0000\u047f\u0480"+ "\u0007\u0007\u0000\u0000\u0480\u0481\u0007\u0004\u0000\u0000\u0481\u0485"+ @@ -1406,372 +1409,374 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0489\u0001"+ "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0488\u048a\u0005"+ "(\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u0489\u048a\u0001\u0000"+ - "\u0000\u0000\u048a\u054b\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ + "\u0000\u0000\u048a\u0558\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ "\u0000\u048c\u048d\u0007\u0005\u0000\u0000\u048d\u048e\u0007\u0006\u0000"+ "\u0000\u048e\u048f\u0007\u0004\u0000\u0000\u048f\u0490\u0007\u0002\u0000"+ "\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u0003\u0000\u0000"+ - "\u0492\u0493\u0007\u000b\u0000\u0000\u0493\u0497\u0001\u0000\u0000\u0000"+ - "\u0494\u0496\u0007*\u0000\u0000\u0495\u0494\u0001\u0000\u0000\u0000\u0496"+ - "\u0499\u0001\u0000\u0000\u0000\u0497\u0495\u0001\u0000\u0000\u0000\u0497"+ - "\u0498\u0001\u0000\u0000\u0000\u0498\u054b\u0001\u0000\u0000\u0000\u0499"+ - "\u0497\u0001\u0000\u0000\u0000\u049a\u049b\u0005@\u0000\u0000\u049b\u049c"+ - "\u0007\u0007\u0000\u0000\u049c\u049d\u0007\u0012\u0000\u0000\u049d\u049e"+ - "\u0007\r\u0000\u0000\u049e\u049f\u0007\u0001\u0000\u0000\u049f\u04a0\u0007"+ - "\u0002\u0000\u0000\u04a0\u04a1\u0007\u000b\u0000\u0000\u04a1\u04a5\u0001"+ - "\u0000\u0000\u0000\u04a2\u04a4\u0007*\u0000\u0000\u04a3\u04a2\u0001\u0000"+ - "\u0000\u0000\u04a4\u04a7\u0001\u0000\u0000\u0000\u04a5\u04a3\u0001\u0000"+ - "\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000\u04a6\u054b\u0001\u0000"+ - "\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000\u0000\u04a8\u04a9\u0005@\u0000"+ - "\u0000\u04a9\u04aa\u0007\f\u0000\u0000\u04aa\u04ab\u0007\u0004\u0000\u0000"+ - "\u04ab\u04ac\u0007\u0012\u0000\u0000\u04ac\u04ad\u0007\u0003\u0000\u0000"+ - "\u04ad\u04ae\u0007\n\u0000\u0000\u04ae\u04af\u0007\r\u0000\u0000\u04af"+ - "\u04b0\u0007\u0004\u0000\u0000\u04b0\u04b1\u0007\u0005\u0000\u0000\u04b1"+ - "\u04b2\u0007\u0003\u0000\u0000\u04b2\u04b6\u0001\u0000\u0000\u0000\u04b3"+ - "\u04b5\u0007*\u0000\u0000\u04b4\u04b3\u0001\u0000\u0000\u0000\u04b5\u04b8"+ - "\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6\u04b7"+ - "\u0001\u0000\u0000\u0000\u04b7\u054b\u0001\u0000\u0000\u0000\u04b8\u04b6"+ - "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005@\u0000\u0000\u04ba\u04bb\u0007"+ - "\u0011\u0000\u0000\u04bb\u04bc\u0007\u0001\u0000\u0000\u04bc\u04bd\u0007"+ - "\u0005\u0000\u0000\u04bd\u04be\u0007\u000e\u0000\u0000\u04be\u04bf\u0007"+ - "\u0012\u0000\u0000\u04bf\u04c0\u0007\u0003\u0000\u0000\u04c0\u04c1\u0007"+ - "\f\u0000\u0000\u04c1\u04c2\u0007\u000b\u0000\u0000\u04c2\u04c6\u0001\u0000"+ - "\u0000\u0000\u04c3\u04c5\u0007*\u0000\u0000\u04c4\u04c3\u0001\u0000\u0000"+ - "\u0000\u04c5\u04c8\u0001\u0000\u0000\u0000\u04c6\u04c4\u0001\u0000\u0000"+ - "\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7\u054b\u0001\u0000\u0000"+ - "\u0000\u04c8\u04c6\u0001\u0000\u0000\u0000\u04c9\u04ca\u0005@\u0000\u0000"+ - "\u04ca\u04cb\u0007\u0000\u0000\u0000\u04cb\u04cc\u0007\u0001\u0000\u0000"+ - "\u04cc\u04cd\u0007\f\u0000\u0000\u04cd\u04ce\u0007\u000b\u0000\u0000\u04ce"+ - "\u04cf\u0005-\u0000\u0000\u04cf\u04d0\u0007\u0000\u0000\u0000\u04d0\u04d1"+ - "\u0007\u0004\u0000\u0000\u04d1\u04d2\u0007\u0005\u0000\u0000\u04d2\u04d3"+ - "\u0007\u0003\u0000\u0000\u04d3\u04d7\u0001\u0000\u0000\u0000\u04d4\u04d6"+ - "\u0007*\u0000\u0000\u04d5\u04d4\u0001\u0000\u0000\u0000\u04d6\u04d9\u0001"+ - "\u0000\u0000\u0000\u04d7\u04d5\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ - "\u0000\u0000\u0000\u04d8\u054b\u0001\u0000\u0000\u0000\u04d9\u04d7\u0001"+ - "\u0000\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0007\r"+ - "\u0000\u0000\u04dc\u04dd\u0007\u0004\u0000\u0000\u04dd\u04de\u0007\u0010"+ - "\u0000\u0000\u04de\u04df\u0007\u0003\u0000\u0000\u04df\u04e3\u0001\u0000"+ - "\u0000\u0000\u04e0\u04e2\u0007*\u0000\u0000\u04e1\u04e0\u0001\u0000\u0000"+ - "\u0000\u04e2\u04e5\u0001\u0000\u0000\u0000\u04e3\u04e1\u0001\u0000\u0000"+ - "\u0000\u04e3\u04e4\u0001\u0000\u0000\u0000\u04e4\u054b\u0001\u0000\u0000"+ - "\u0000\u04e5\u04e3\u0001\u0000\u0000\u0000\u04e6\u04e7\u0005@\u0000\u0000"+ - "\u04e7\u04e8\u0007\n\u0000\u0000\u04e8\u04e9\u0007\u000e\u0000\u0000\u04e9"+ - "\u04ea\u0007\r\u0000\u0000\u04ea\u04eb\u0007\r\u0000\u0000\u04eb\u04ec"+ - "\u0007\u0001\u0000\u0000\u04ec\u04ed\u0007\u0002\u0000\u0000\u04ed\u04ee"+ - "\u0007\u000b\u0000\u0000\u04ee\u04ef\u0007\n\u0000\u0000\u04ef\u04f3\u0001"+ - "\u0000\u0000\u0000\u04f0\u04f2\u0007*\u0000\u0000\u04f1\u04f0\u0001\u0000"+ - "\u0000\u0000\u04f2\u04f5\u0001\u0000\u0000\u0000\u04f3\u04f1\u0001\u0000"+ - "\u0000\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u054b\u0001\u0000"+ - "\u0000\u0000\u04f5\u04f3\u0001\u0000\u0000\u0000\u04f6\u04f7\u0005@\u0000"+ - "\u0000\u04f7\u04f8\u0007\t\u0000\u0000\u04f8\u04f9\u0007\u0004\u0000\u0000"+ - "\u04f9\u04fa\u0007\u000f\u0000\u0000\u04fa\u04fb\u0007\u0003\u0000\u0000"+ - "\u04fb\u04fc\u0007\u0002\u0000\u0000\u04fc\u0500\u0001\u0000\u0000\u0000"+ - "\u04fd\u04ff\u0007*\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04ff"+ - "\u0502\u0001\u0000\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0500"+ - "\u0501\u0001\u0000\u0000\u0000\u0501\u054b\u0001\u0000\u0000\u0000\u0502"+ - "\u0500\u0001\u0000\u0000\u0000\u0503\u0504\u0005@\u0000\u0000\u0504\u0505"+ - "\u0007\u000b\u0000\u0000\u0505\u0506\u0007\u0004\u0000\u0000\u0506\u0507"+ - "\u0007\u0007\u0000\u0000\u0507\u0508\u0007\t\u0000\u0000\u0508\u0509\u0007"+ - "\b\u0000\u0000\u0509\u050a\u0007\u0007\u0000\u0000\u050a\u050b\u0007\f"+ - "\u0000\u0000\u050b\u050c\u0007\u0011\u0000\u0000\u050c\u0510\u0001\u0000"+ - "\u0000\u0000\u050d\u050f\u0007*\u0000\u0000\u050e\u050d\u0001\u0000\u0000"+ - "\u0000\u050f\u0512\u0001\u0000\u0000\u0000\u0510\u050e\u0001\u0000\u0000"+ - "\u0000\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u054b\u0001\u0000\u0000"+ - "\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0513\u0514\u0005@\u0000\u0000"+ - "\u0514\u0515\u0007\u0004\u0000\u0000\u0515\u0516\u0007\r\u0000\u0000\u0516"+ - "\u0517\u0007\r\u0000\u0000\u0517\u0518\u0007\t\u0000\u0000\u0518\u0519"+ - "\u0007\u000f\u0000\u0000\u0519\u051d\u0001\u0000\u0000\u0000\u051a\u051c"+ - "\u0007*\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u051f\u0001"+ - "\u0000\u0000\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051d\u051e\u0001"+ - "\u0000\u0000\u0000\u051e\u054b\u0001\u0000\u0000\u0000\u051f\u051d\u0001"+ - "\u0000\u0000\u0000\u0520\u0521\u0005@\u0000\u0000\u0521\u0522\u0005-\u0000"+ - "\u0000\u0522\u0523\u0007\b\u0000\u0000\u0523\u0524\u0007\u0003\u0000\u0000"+ - "\u0524\u0525\u0007\u0017\u0000\u0000\u0525\u0526\u0007\u0018\u0000\u0000"+ - "\u0526\u0527\u0007\u0007\u0000\u0000\u0527\u0528\u0007\u000b\u0000\u0000"+ - "\u0528\u0529\u0005-\u0000\u0000\u0529\u052a\u0007\u0018\u0000\u0000\u052a"+ - "\u052b\u0007\u0003\u0000\u0000\u052b\u052c\u0007\u000f\u0000\u0000\u052c"+ - "\u052d\u0007\u0000\u0000\u0000\u052d\u052e\u0007\u0002\u0000\u0000\u052e"+ - "\u052f\u0007\u0004\u0000\u0000\u052f\u0530\u0007\u0012\u0000\u0000\u0530"+ - "\u0531\u0007\u0003\u0000\u0000\u0531\u0532\u0007\n\u0000\u0000\u0532\u0536"+ - "\u0001\u0000\u0000\u0000\u0533\u0535\u0007*\u0000\u0000\u0534\u0533\u0001"+ - "\u0000\u0000\u0000\u0535\u0538\u0001\u0000\u0000\u0000\u0536\u0534\u0001"+ - "\u0000\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537\u054b\u0001"+ - "\u0000\u0000\u0000\u0538\u0536\u0001\u0000\u0000\u0000\u0539\u053a\u0005"+ - "@\u0000\u0000\u053a\u053b\u0007\u0018\u0000\u0000\u053b\u053c\u0007\u0003"+ - "\u0000\u0000\u053c\u053d\u0007\u000f\u0000\u0000\u053d\u053e\u0007\u0000"+ - "\u0000\u0000\u053e\u053f\u0007\u0002\u0000\u0000\u053f\u0540\u0007\u0004"+ - "\u0000\u0000\u0540\u0541\u0007\u0012\u0000\u0000\u0541\u0542\u0007\u0003"+ - "\u0000\u0000\u0542\u0543\u0007\n\u0000\u0000\u0543\u0547\u0001\u0000\u0000"+ - "\u0000\u0544\u0546\u0007*\u0000\u0000\u0545\u0544\u0001\u0000\u0000\u0000"+ - "\u0546\u0549\u0001\u0000\u0000\u0000\u0547\u0545\u0001\u0000\u0000\u0000"+ - "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u054b\u0001\u0000\u0000\u0000"+ - "\u0549\u0547\u0001\u0000\u0000\u0000\u054a\u046c\u0001\u0000\u0000\u0000"+ - "\u054a\u046f\u0001\u0000\u0000\u0000\u054a\u0475\u0001\u0000\u0000\u0000"+ - "\u054a\u047b\u0001\u0000\u0000\u0000\u054a\u048b\u0001\u0000\u0000\u0000"+ - "\u054a\u049a\u0001\u0000\u0000\u0000\u054a\u04a8\u0001\u0000\u0000\u0000"+ - "\u054a\u04b9\u0001\u0000\u0000\u0000\u054a\u04c9\u0001\u0000\u0000\u0000"+ - "\u054a\u04da\u0001\u0000\u0000\u0000\u054a\u04e6\u0001\u0000\u0000\u0000"+ - "\u054a\u04f6\u0001\u0000\u0000\u0000\u054a\u0503\u0001\u0000\u0000\u0000"+ - "\u054a\u0513\u0001\u0000\u0000\u0000\u054a\u0520\u0001\u0000\u0000\u0000"+ - "\u054a\u0539\u0001\u0000\u0000\u0000\u054b\u054c\u0001\u0000\u0000\u0000"+ - "\u054c\u054d\u0006.\t\u0000\u054di\u0001\u0000\u0000\u0000\u054e\u054f"+ - "\t\u0000\u0000\u0000\u054f\u0550\u0004/\u0007\u0000\u0550\u0551\u0001"+ - "\u0000\u0000\u0000\u0551\u0552\u0006/\u000e\u0000\u0552\u0553\u0006/\u000f"+ - "\u0000\u0553k\u0001\u0000\u0000\u0000\u0554\u0555\t\u0000\u0000\u0000"+ - "\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u00060\f\u0000\u0557"+ - "m\u0001\u0000\u0000\u0000\u0558\u0559\u0005\u0000\u0000\u0001\u0559\u055a"+ - "\u0001\u0000\u0000\u0000\u055a\u055b\u00061\u000e\u0000\u055b\u055c\u0006"+ - "1\u000f\u0000\u055co\u0001\u0000\u0000\u0000\u055d\u055e\u0005}\u0000"+ - "\u0000\u055e\u055f\u0005}\u0000\u0000\u055f\u0560\u0001\u0000\u0000\u0000"+ - "\u0560\u0561\u00062\u000f\u0000\u0561\u0562\u00062\u0006\u0000\u0562q"+ - "\u0001\u0000\u0000\u0000\u0563\u0564\u0003\f\u0000\u0000\u0564\u0565\u0006"+ - "3\u0010\u0000\u0565s\u0001\u0000\u0000\u0000\u0566\u0569\u0003X&\u0000"+ - "\u0567\u0569\u0003\u0012\u0003\u0000\u0568\u0566\u0001\u0000\u0000\u0000"+ - "\u0568\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000"+ - "\u056a\u056b\u00064\u0011\u0000\u056bu\u0001\u0000\u0000\u0000\u056c\u056d"+ - "\u0005:\u0000\u0000\u056d\u0570\u0005)\u0000\u0000\u056e\u0570\u0005:"+ - "\u0000\u0000\u056f\u056c\u0001\u0000\u0000\u0000\u056f\u056e\u0001\u0000"+ - "\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u00065\u0012"+ - "\u0000\u0572w\u0001\u0000\u0000\u0000\u0573\u0575\b+\u0000\u0000\u0574"+ - "\u0573\u0001\u0000\u0000\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576"+ - "\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577"+ - "\u0578\u0001\u0000\u0000\u0000\u0578\u0579\u00066\u0013\u0000\u0579y\u0001"+ - "\u0000\u0000\u0000\u057a\u057e\t\u0000\u0000\u0000\u057b\u057d\u0007*"+ - "\u0000\u0000\u057c\u057b\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000"+ - "\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000"+ - "\u0000\u0000\u057f\u0581\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000"+ - "\u0000\u0000\u0581\u0582\u00067\u0014\u0000\u0582{\u0001\u0000\u0000\u0000"+ - "\u0583\u0584\u0005\u0000\u0000\u0001\u0584\u0585\u0001\u0000\u0000\u0000"+ - "\u0585\u0586\u00068\u0015\u0000\u0586\u0587\u00068\u000f\u0000\u0587}"+ - "\u0001\u0000\u0000\u0000\u0588\u0589\u0005!\u0000\u0000\u0589\u058a\u0005"+ - "!\u0000\u0000\u058a\u058b\u0005}\u0000\u0000\u058b\u058c\u0001\u0000\u0000"+ - "\u0000\u058c\u058d\u00069\u000f\u0000\u058d\u058e\u00069\b\u0000\u058e"+ - "\u007f\u0001\u0000\u0000\u0000\u058f\u0590\u0003\f\u0000\u0000\u0590\u0591"+ - "\u0006:\u0016\u0000\u0591\u0081\u0001\u0000\u0000\u0000\u0592\u0595\u0003"+ - "X&\u0000\u0593\u0595\u0003\u0012\u0003\u0000\u0594\u0592\u0001\u0000\u0000"+ - "\u0000\u0594\u0593\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000"+ - "\u0000\u0596\u0597\u0006;\u0017\u0000\u0597\u0083\u0001\u0000\u0000\u0000"+ - "\u0598\u0599\u0005:\u0000\u0000\u0599\u059c\u0005)\u0000\u0000\u059a\u059c"+ - "\u0005:\u0000\u0000\u059b\u0598\u0001\u0000\u0000\u0000\u059b\u059a\u0001"+ - "\u0000\u0000\u0000\u059c\u059d\u0001\u0000\u0000\u0000\u059d\u059e\u0006"+ - "<\u0012\u0000\u059e\u0085\u0001\u0000\u0000\u0000\u059f\u05a1\b,\u0000"+ - "\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000"+ - "\u0000\u05a2\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ - "\u0000\u05a3\u05a4\u0001\u0000\u0000\u0000\u05a4\u05a5\u0006=\u0018\u0000"+ - "\u05a5\u0087\u0001\u0000\u0000\u0000\u05a6\u05aa\t\u0000\u0000\u0000\u05a7"+ - "\u05a9\u0007*\u0000\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000\u05a9\u05ac"+ - "\u0001\u0000\u0000\u0000\u05aa\u05a8\u0001\u0000\u0000\u0000\u05aa\u05ab"+ - "\u0001\u0000\u0000\u0000\u05ab\u05ad\u0001\u0000\u0000\u0000\u05ac\u05aa"+ - "\u0001\u0000\u0000\u0000\u05ad\u05ae\u0006>\u0019\u0000\u05ae\u0089\u0001"+ - "\u0000\u0000\u0000\u05af\u05b0\u0005\u0000\u0000\u0001\u05b0\u05b1\u0001"+ - "\u0000\u0000\u0000\u05b1\u05b2\u0006?\u0015\u0000\u05b2\u05b3\u0006?\u000f"+ - "\u0000\u05b3\u008b\u0001\u0000\u0000\u0000\u05b4\u05b6\u0007*\u0000\u0000"+ - "\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000"+ - "\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000"+ - "\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba\u0004@\b\u0000\u05ba"+ - "\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bc\u0006@\u001a\u0000\u05bc\u008d"+ - "\u0001\u0000\u0000\u0000\u05bd\u05be\u0005(\u0000\u0000\u05be\u05bf\u0006"+ - "A\u001b\u0000\u05bf\u05c0\u0001\u0000\u0000\u0000\u05c0\u05c1\u0006A\f"+ - "\u0000\u05c1\u05c2\u0006A\u001a\u0000\u05c2\u008f\u0001\u0000\u0000\u0000"+ - "\u05c3\u05c4\u0003N!\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000\u05c5\u05c6"+ - "\u0006B\u0015\u0000\u05c6\u05c7\u0006B\u000f\u0000\u05c7\u0091\u0001\u0000"+ - "\u0000\u0000\u05c8\u05c9\t\u0000\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000"+ - "\u0000\u05ca\u05cb\u0006C\u0015\u0000\u05cb\u05cc\u0006C\u000f\u0000\u05cc"+ - "\u0093\u0001\u0000\u0000\u0000\u05cd\u05ce\u0004D\t\u0000\u05ce\u05cf"+ - "\u0005(\u0000\u0000\u05cf\u05d0\u0006D\u001c\u0000\u05d0\u05d1\u0006D"+ - "\u001d\u0000\u05d1\u0095\u0001\u0000\u0000\u0000\u05d2\u05d3\u0004E\n"+ - "\u0000\u05d3\u05d4\u0005)\u0000\u0000\u05d4\u05d5\u0006E\u001e\u0000\u05d5"+ - "\u05d6\u0001\u0000\u0000\u0000\u05d6\u05d7\u0006E\u001f\u0000\u05d7\u05d8"+ - "\u0006E \u0000\u05d8\u0097\u0001\u0000\u0000\u0000\u05d9\u05da\u0004F"+ - "\u000b\u0000\u05da\u05db\u0005(\u0000\u0000\u05db\u05dc\u0006F!\u0000"+ - "\u05dc\u05dd\u0006F\"\u0000\u05dd\u0099\u0001\u0000\u0000\u0000\u05de"+ - "\u05df\u0004G\f\u0000\u05df\u05e0\u0005)\u0000\u0000\u05e0\u05e1\u0006"+ - "G#\u0000\u05e1\u05e2\u0006G$\u0000\u05e2\u009b\u0001\u0000\u0000\u0000"+ - "\u05e3\u05e4\u0005)\u0000\u0000\u05e4\u05e5\u0004H\r\u0000\u05e5\u05e6"+ - "\u0001\u0000\u0000\u0000\u05e6\u05e7\u0006H\u001f\u0000\u05e7\u05e8\u0006"+ - "H \u0000\u05e8\u009d\u0001\u0000\u0000\u0000\u05e9\u05ea\u0005\"\u0000"+ - "\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0006I\f\u0000"+ - "\u05ec\u05ed\u0006I%\u0000\u05ed\u009f\u0001\u0000\u0000\u0000\u05ee\u05ef"+ - "\u0005?\u0000\u0000\u05ef\u05f0\u0005:\u0000\u0000\u05f0\u05f1\u0001\u0000"+ - "\u0000\u0000\u05f1\u05f2\u0006J&\u0000\u05f2\u00a1\u0001\u0000\u0000\u0000"+ - "\u05f3\u05f4\u0005:\u0000\u0000\u05f4\u05f5\u0005:\u0000\u0000\u05f5\u05f6"+ - "\u0001\u0000\u0000\u0000\u05f6\u05f7\u0006K\'\u0000\u05f7\u00a3\u0001"+ - "\u0000\u0000\u0000\u05f8\u05fc\u0003X&\u0000\u05f9\u05fb\u0005 \u0000"+ - "\u0000\u05fa\u05f9\u0001\u0000\u0000\u0000\u05fb\u05fe\u0001\u0000\u0000"+ - "\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000"+ - "\u0000\u05fd\u05ff\u0001\u0000\u0000\u0000\u05fe\u05fc\u0001\u0000\u0000"+ - "\u0000\u05ff\u0600\u0006L(\u0000\u0600\u00a5\u0001\u0000\u0000\u0000\u0601"+ - "\u0602\u0005:\u0000\u0000\u0602\u0603\u0004M\u000e\u0000\u0603\u0604\u0001"+ - "\u0000\u0000\u0000\u0604\u0605\u0006M\u0012\u0000\u0605\u00a7\u0001\u0000"+ - "\u0000\u0000\u0606\u0607\u0005:\u0000\u0000\u0607\u0608\u0001\u0000\u0000"+ - "\u0000\u0608\u0609\u0006N\u0012\u0000\u0609\u00a9\u0001\u0000\u0000\u0000"+ - "\u060a\u060b\u0005/\u0000\u0000\u060b\u060c\u0005*\u0000\u0000\u060c\u0610"+ - "\u0001\u0000\u0000\u0000\u060d\u060f\t\u0000\u0000\u0000\u060e\u060d\u0001"+ - "\u0000\u0000\u0000\u060f\u0612\u0001\u0000\u0000\u0000\u0610\u0611\u0001"+ - "\u0000\u0000\u0000\u0610\u060e\u0001\u0000\u0000\u0000\u0611\u0613\u0001"+ - "\u0000\u0000\u0000\u0612\u0610\u0001\u0000\u0000\u0000\u0613\u0614\u0005"+ - "*\u0000\u0000\u0614\u0615\u0005/\u0000\u0000\u0615\u0616\u0001\u0000\u0000"+ - "\u0000\u0616\u0617\u0006O\u0012\u0000\u0617\u00ab\u0001\u0000\u0000\u0000"+ - "\u0618\u0619\t\u0000\u0000\u0000\u0619\u061a\u0006P)\u0000\u061a\u00ad"+ - "\u0001\u0000\u0000\u0000\u061b\u061c\u0005\u0000\u0000\u0001\u061c\u061d"+ - "\u0001\u0000\u0000\u0000\u061d\u061e\u0006Q\u0015\u0000\u061e\u061f\u0006"+ - "Q \u0000\u061f\u00af\u0001\u0000\u0000\u0000\u0620\u0621\u0005@\u0000"+ - "\u0000\u0621\u0622\u0007\u0003\u0000\u0000\u0622\u0623\u0007\f\u0000\u0000"+ - "\u0623\u0624\u0007\u0011\u0000\u0000\u0624\u0625\u0007\r\u0000\u0000\u0625"+ - "\u0626\u0007\u0006\u0000\u0000\u0626\u0627\u0007\r\u0000\u0000\u0627\u0628"+ - "\u0001\u0000\u0000\u0000\u0628\u0629\u0006R\u000f\u0000\u0629\u00b1\u0001"+ - "\u0000\u0000\u0000\u062a\u062b\t\u0000\u0000\u0000\u062b\u062c\u0004S"+ - "\u000f\u0000\u062c\u062d\u0001\u0000\u0000\u0000\u062d\u062e\u0006S*\u0000"+ - "\u062e\u00b3\u0001\u0000\u0000\u0000\u062f\u0630\t\u0000\u0000\u0000\u0630"+ - "\u0631\u0001\u0000\u0000\u0000\u0631\u0632\u0006T\f\u0000\u0632\u00b5"+ - "\u0001\u0000\u0000\u0000\u0633\u0634\u0005\u0000\u0000\u0001\u0634\u0635"+ - "\u0001\u0000\u0000\u0000\u0635\u0636\u0006U\u0015\u0000\u0636\u0637\u0006"+ - "U\u000f\u0000\u0637\u00b7\u0001\u0000\u0000\u0000\u0638\u0639\u0005@\u0000"+ - "\u0000\u0639\u063a\u0007\u0003\u0000\u0000\u063a\u063b\u0007\f\u0000\u0000"+ - "\u063b\u063c\u0007\u0011\u0000\u0000\u063c\u063d\u0007\u001a\u0000\u0000"+ - "\u063d\u063e\u0007\u0003\u0000\u0000\u063e\u063f\u0007\u0002\u0000\u0000"+ - "\u063f\u0640\u0007\u0017\u0000\u0000\u0640\u0641\u0007\u0004\u0000\u0000"+ - "\u0641\u0642\u0007\u000b\u0000\u0000\u0642\u0643\u0007\u0007\u0000\u0000"+ - "\u0643\u0644\u0007\u0012\u0000\u0000\u0644\u0645\u0001\u0000\u0000\u0000"+ - "\u0645\u0646\u0006V\u0001\u0000\u0646\u0647\u0006V\u000f\u0000\u0647\u00b9"+ - "\u0001\u0000\u0000\u0000\u0648\u0649\t\u0000\u0000\u0000\u0649\u064a\u0004"+ - "W\u0010\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0006W\t"+ - "\u0000\u064c\u00bb\u0001\u0000\u0000\u0000\u064d\u064e\t\u0000\u0000\u0000"+ - "\u064e\u064f\u0001\u0000\u0000\u0000\u064f\u0650\u0006X\f\u0000\u0650"+ - "\u00bd\u0001\u0000\u0000\u0000\u0651\u0652\u0005\u0000\u0000\u0001\u0652"+ - "\u0653\u0001\u0000\u0000\u0000\u0653\u0654\u0006Y\u0015\u0000\u0654\u0655"+ - "\u0006Y\u000f\u0000\u0655\u00bf\u0001\u0000\u0000\u0000\u0656\u0657\u0005"+ - ":\u0000\u0000\u0657\u0658\u0003R#\u0000\u0658\u0659\u0005=\u0000\u0000"+ - "\u0659\u065a\u0005\"\u0000\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b"+ - "\u065c\u0006Z\t\u0000\u065c\u065d\u0006Z+\u0000\u065d\u00c1\u0001\u0000"+ - "\u0000\u0000\u065e\u065f\u0005{\u0000\u0000\u065f\u0660\u0005{\u0000\u0000"+ - "\u0660\u0661\u0001\u0000\u0000\u0000\u0661\u0662\u0006[\u0005\u0000\u0662"+ - "\u0663\u0006[\u0006\u0000\u0663\u00c3\u0001\u0000\u0000\u0000\u0664\u0665"+ - "\u0005{\u0000\u0000\u0665\u0666\u0005!\u0000\u0000\u0666\u0667\u0005!"+ - "\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0669\u0006\\\u0007"+ - "\u0000\u0669\u066a\u0006\\\b\u0000\u066a\u00c5\u0001\u0000\u0000\u0000"+ - "\u066b\u066c\u0005>\u0000\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d"+ - "\u066e\u0006]\t\u0000\u066e\u066f\u0006]\u000f\u0000\u066f\u00c7\u0001"+ - "\u0000\u0000\u0000\u0670\u0671\t\u0000\u0000\u0000\u0671\u0672\u0001\u0000"+ - "\u0000\u0000\u0672\u0673\u0006^\t\u0000\u0673\u00c9\u0001\u0000\u0000"+ - "\u0000\u0674\u0675\u0005\u0000\u0000\u0001\u0675\u0676\u0001\u0000\u0000"+ - "\u0000\u0676\u0677\u0006_\u0015\u0000\u0677\u0678\u0006_\u000f\u0000\u0678"+ - "\u00cb\u0001\u0000\u0000\u0000\u0679\u067a\u0005\"\u0000\u0000\u067a\u067b"+ - "\u0001\u0000\u0000\u0000\u067b\u067c\u0006`\t\u0000\u067c\u067d\u0006"+ - "`\u000f\u0000\u067d\u00cd\u0001\u0000\u0000\u0000\u067e\u067f\t\u0000"+ - "\u0000\u0000\u067f\u0680\u0004a\u0011\u0000\u0680\u0681\u0001\u0000\u0000"+ - "\u0000\u0681\u0682\u0006a\u001f\u0000\u0682\u00cf\u0001\u0000\u0000\u0000"+ - "\u0683\u0684\t\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685"+ - "\u0686\u0006b\f\u0000\u0686\u00d1\u0001\u0000\u0000\u0000\u0687\u0688"+ - "\u0005\u0000\u0000\u0001\u0688\u0689\u0001\u0000\u0000\u0000\u0689\u068a"+ - "\u0006c\u0015\u0000\u068a\u068b\u0006c\u000f\u0000\u068b\u00d3\u0001\u0000"+ - "\u0000\u0000\u068c\u068e\u0003\f\u0000\u0000\u068d\u068f\u0005$\u0000"+ - "\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000\u0000"+ - "\u0000\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0691\u0003R#\u0000\u0691"+ - "\u0692\u0005}\u0000\u0000\u0692\u0693\u0001\u0000\u0000\u0000\u0693\u0694"+ - "\u0006d\f\u0000\u0694\u00d5\u0001\u0000\u0000\u0000\u0695\u0696\u0003"+ - "\f\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u0698\u0006e"+ - "\f\u0000\u0698\u00d7\u0001\u0000\u0000\u0000\u0699\u069b\u0005{\u0000"+ - "\u0000\u069a\u069c\u0007)\u0000\u0000\u069b\u069a\u0001\u0000\u0000\u0000"+ - "\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000"+ - "\u069d\u069f\u0003R#\u0000\u069e\u06a0\u0007)\u0000\u0000\u069f\u069e"+ - "\u0001\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a2"+ - "\u0001\u0000\u0000\u0000\u06a1\u06a3\u0005:\u0000\u0000\u06a2\u06a1\u0001"+ - "\u0000\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a2\u0001"+ - "\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000\u0000\u06a5\u06a7\u0001"+ - "\u0000\u0000\u0000\u06a6\u06a8\u0007)\u0000\u0000\u06a7\u06a6\u0001\u0000"+ - "\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06aa\u0001\u0000"+ - "\u0000\u0000\u06a9\u06ab\u0003R#\u0000\u06aa\u06a9\u0001\u0000\u0000\u0000"+ - "\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab\u06ad\u0001\u0000\u0000\u0000"+ - "\u06ac\u06ae\u0007)\u0000\u0000\u06ad\u06ac\u0001\u0000\u0000\u0000\u06ad"+ - "\u06ae\u0001\u0000\u0000\u0000\u06ae\u06c5\u0001\u0000\u0000\u0000\u06af"+ - "\u06b1\u0005,\u0000\u0000\u06b0\u06b2\u0007)\u0000\u0000\u06b1\u06b0\u0001"+ - "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b3\u0001"+ - "\u0000\u0000\u0000\u06b3\u06b5\u0003R#\u0000\u06b4\u06b6\u0007)\u0000"+ - "\u0000\u06b5\u06b4\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ - "\u0000\u06b6\u06b8\u0001\u0000\u0000\u0000\u06b7\u06b9\u0005:\u0000\u0000"+ - "\u06b8\u06b7\u0001\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000"+ - "\u06ba\u06b8\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000"+ - "\u06bb\u06bd\u0001\u0000\u0000\u0000\u06bc\u06be\u0007)\u0000\u0000\u06bd"+ - "\u06bc\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be"+ - "\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c1\u0003R#\u0000\u06c0\u06c2\u0007"+ - ")\u0000\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000"+ - "\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06af\u0001\u0000"+ - "\u0000\u0000\u06c4\u06c7\u0001\u0000\u0000\u0000\u06c5\u06c3\u0001\u0000"+ - "\u0000\u0000\u06c5\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c9\u0001\u0000"+ - "\u0000\u0000\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c8\u06ca\u0005,\u0000"+ - "\u0000\u06c9\u06c8\u0001\u0000\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000"+ - "\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb\u06cc\u0005}\u0000\u0000"+ - "\u06cc\u06cd\u0001\u0000\u0000\u0000\u06cd\u06ce\u0006f\f\u0000\u06ce"+ - "\u00d9\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005{\u0000\u0000\u06d0\u06d1"+ - "\u0005$\u0000\u0000\u06d1\u06da\u0003R#\u0000\u06d2\u06d3\u0005[\u0000"+ - "\u0000\u06d3\u06d4\u0007)\u0000\u0000\u06d4\u06d5\u0003R#\u0000\u06d5"+ - "\u06d6\u0007)\u0000\u0000\u06d6\u06d7\u0005]\u0000\u0000\u06d7\u06d9\u0001"+ - "\u0000\u0000\u0000\u06d8\u06d2\u0001\u0000\u0000\u0000\u06d9\u06dc\u0001"+ - "\u0000\u0000\u0000\u06da\u06d8\u0001\u0000\u0000\u0000\u06da\u06db\u0001"+ - "\u0000\u0000\u0000\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06da\u0001"+ - "\u0000\u0000\u0000\u06dd\u06de\u0005:\u0000\u0000\u06de\u06df\u0005:\u0000"+ - "\u0000\u06df\u06e0\u0001\u0000\u0000\u0000\u06e0\u06e1\u0003R#\u0000\u06e1"+ - "\u06e2\u0005}\u0000\u0000\u06e2\u06e3\u0001\u0000\u0000\u0000\u06e3\u06e4"+ - "\u0006g\f\u0000\u06e4\u00db\u0001\u0000\u0000\u0000\u06e5\u06e6\u0005"+ - "{\u0000\u0000\u06e6\u06e7\u0005$\u0000\u0000\u06e7\u06f1\u0003R#\u0000"+ - "\u06e8\u06e9\u0005[\u0000\u0000\u06e9\u06eb\u0007)\u0000\u0000\u06ea\u06ec"+ - "\u0003R#\u0000\u06eb\u06ea\u0001\u0000\u0000\u0000\u06eb\u06ec\u0001\u0000"+ - "\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0007)\u0000"+ - "\u0000\u06ee\u06f0\u0005]\u0000\u0000\u06ef\u06e8\u0001\u0000\u0000\u0000"+ - "\u06f0\u06f3\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001\u0000\u0000\u0000"+ - "\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06fb\u0001\u0000\u0000\u0000"+ - "\u06f3\u06f1\u0001\u0000\u0000\u0000\u06f4\u06f5\u0005:\u0000\u0000\u06f5"+ - "\u06f7\u0005:\u0000\u0000\u06f6\u06f4\u0001\u0000\u0000\u0000\u06f7\u06f8"+ - "\u0001\u0000\u0000\u0000\u06f8\u06f6\u0001\u0000\u0000\u0000\u06f8\u06f9"+ - "\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fc"+ - "\u0003R#\u0000\u06fb\u06f6\u0001\u0000\u0000\u0000\u06fb\u06fc\u0001\u0000"+ - "\u0000\u0000\u06fc\u0701\u0001\u0000\u0000\u0000\u06fd\u06ff\u0005:\u0000"+ - "\u0000\u06fe\u0700\u0003R#\u0000\u06ff\u06fe\u0001\u0000\u0000\u0000\u06ff"+ - "\u0700\u0001\u0000\u0000\u0000\u0700\u0702\u0001\u0000\u0000\u0000\u0701"+ - "\u06fd\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703"+ - "\u0701\u0001\u0000\u0000\u0000\u0703\u0704\u0001\u0000\u0000\u0000\u0704"+ - "\u0705\u0001\u0000\u0000\u0000\u0705\u0706\u0005}\u0000\u0000\u0706\u070a"+ - "\u0001\u0000\u0000\u0000\u0707\u0708\u0005:\u0000\u0000\u0708\u070a\u0005"+ - "$\u0000\u0000\u0709\u06e5\u0001\u0000\u0000\u0000\u0709\u0707\u0001\u0000"+ - "\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u070c\u0006h\u0015"+ - "\u0000\u070c\u00dd\u0001\u0000\u0000\u0000\u070d\u070e\u0005\\\u0000\u0000"+ - "\u070e\u070f\u0005\"\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ - "\u0711\u0006i\f\u0000\u0711\u00df\u0001\u0000\u0000\u0000\u0712\u0713"+ - "\u0005\"\u0000\u0000\u0713\u0714\u0001\u0000\u0000\u0000\u0714\u0715\u0006"+ - "j\f\u0000\u0715\u0716\u0006j\u000f\u0000\u0716\u00e1\u0001\u0000\u0000"+ - "\u0000\u0717\u0718\t\u0000\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000"+ - "\u0719\u071a\u0006k\f\u0000\u071a\u00e3\u0001\u0000\u0000\u0000\u071b"+ - "\u071c\u0005\u0000\u0000\u0001\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ - "\u071e\u0006l\u0015\u0000\u071e\u071f\u0006l\u000f\u0000\u071f\u00e5\u0001"+ - "\u0000\u0000\u0000\u0720\u0721\u0005-\u0000\u0000\u0721\u0722\u0005-\u0000"+ - "\u0000\u0722\u0723\u0005}\u0000\u0000\u0723\u0724\u0005}\u0000\u0000\u0724"+ - "\u0725\u0001\u0000\u0000\u0000\u0725\u0726\u0006m\u000f\u0000\u0726\u00e7"+ - "\u0001\u0000\u0000\u0000\u0727\u0728\t\u0000\u0000\u0000\u0728\u0729\u0004"+ - "n\u0012\u0000\u0729\u072a\u0001\u0000\u0000\u0000\u072a\u072b\u0006n,"+ - "\u0000\u072b\u00e9\u0001\u0000\u0000\u0000\u072c\u072d\t\u0000\u0000\u0000"+ - "\u072d\u072e\u0001\u0000\u0000\u0000\u072e\u072f\u0006o\f\u0000\u072f"+ - "\u00eb\u0001\u0000\u0000\u0000\u0730\u0731\u0005\u0000\u0000\u0001\u0731"+ - "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006p,\u0000\u0733\u0734\u0006"+ - "p\u000f\u0000\u0734\u00ed\u0001\u0000\u0000\u0000u\u0000\u0001\u0002\u0003"+ + "\u0492\u0550\u0007\u000b\u0000\u0000\u0493\u0494\u0005@\u0000\u0000\u0494"+ + "\u0495\u0007\u0007\u0000\u0000\u0495\u0496\u0007\u0012\u0000\u0000\u0496"+ + "\u0497\u0007\r\u0000\u0000\u0497\u0498\u0007\u0001\u0000\u0000\u0498\u0499"+ + "\u0007\u0002\u0000\u0000\u0499\u0550\u0007\u000b\u0000\u0000\u049a\u049b"+ + "\u0005@\u0000\u0000\u049b\u049c\u0007\f\u0000\u0000\u049c\u049d\u0007"+ + "\u0004\u0000\u0000\u049d\u049e\u0007\u0012\u0000\u0000\u049e\u049f\u0007"+ + "\u0003\u0000\u0000\u049f\u04a0\u0007\n\u0000\u0000\u04a0\u04a1\u0007\r"+ + "\u0000\u0000\u04a1\u04a2\u0007\u0004\u0000\u0000\u04a2\u04a3\u0007\u0005"+ + "\u0000\u0000\u04a3\u0550\u0007\u0003\u0000\u0000\u04a4\u04a5\u0005@\u0000"+ + "\u0000\u04a5\u04a6\u0007\u0011\u0000\u0000\u04a6\u04a7\u0007\u0001\u0000"+ + "\u0000\u04a7\u04a8\u0007\u0005\u0000\u0000\u04a8\u04a9\u0007\u000e\u0000"+ + "\u0000\u04a9\u04aa\u0007\u0012\u0000\u0000\u04aa\u04ab\u0007\u0003\u0000"+ + "\u0000\u04ab\u04ac\u0007\f\u0000\u0000\u04ac\u0550\u0007\u000b\u0000\u0000"+ + "\u04ad\u04ae\u0005@\u0000\u0000\u04ae\u04af\u0007\u0000\u0000\u0000\u04af"+ + "\u04b0\u0007\u0001\u0000\u0000\u04b0\u04b1\u0007\f\u0000\u0000\u04b1\u04b2"+ + "\u0007\u000b\u0000\u0000\u04b2\u04b3\u0005-\u0000\u0000\u04b3\u04b4\u0007"+ + "\u0000\u0000\u0000\u04b4\u04b5\u0007\u0004\u0000\u0000\u04b5\u04b6\u0007"+ + "\u0005\u0000\u0000\u04b6\u0550\u0007\u0003\u0000\u0000\u04b7\u04b8\u0005"+ + "@\u0000\u0000\u04b8\u04b9\u0007\r\u0000\u0000\u04b9\u04ba\u0007\u0004"+ + "\u0000\u0000\u04ba\u04bb\u0007\u0010\u0000\u0000\u04bb\u0550\u0007\u0003"+ + "\u0000\u0000\u04bc\u04bd\u0005@\u0000\u0000\u04bd\u04be\u0007\t\u0000"+ + "\u0000\u04be\u04bf\u0007\u0004\u0000\u0000\u04bf\u04c0\u0007\u000f\u0000"+ + "\u0000\u04c0\u04c1\u0007\u0003\u0000\u0000\u04c1\u0550\u0007\u0002\u0000"+ + "\u0000\u04c2\u04c3\u0005@\u0000\u0000\u04c3\u04c4\u0007\n\u0000\u0000"+ + "\u04c4\u04c5\u0007\u000e\u0000\u0000\u04c5\u04c6\u0007\r\u0000\u0000\u04c6"+ + "\u04c7\u0007\r\u0000\u0000\u04c7\u04c8\u0007\u0001\u0000\u0000\u04c8\u04c9"+ + "\u0007\u0002\u0000\u0000\u04c9\u04ca\u0007\u000b\u0000\u0000\u04ca\u0550"+ + "\u0007\n\u0000\u0000\u04cb\u04cc\u0005@\u0000\u0000\u04cc\u04cd\u0007"+ + "\u000b\u0000\u0000\u04cd\u04ce\u0007\u0004\u0000\u0000\u04ce\u04cf\u0007"+ + "\u0007\u0000\u0000\u04cf\u04d0\u0007\t\u0000\u0000\u04d0\u04d1\u0007\b"+ + "\u0000\u0000\u04d1\u04d2\u0007\u0007\u0000\u0000\u04d2\u04d3\u0007\f\u0000"+ + "\u0000\u04d3\u0550\u0007\u0011\u0000\u0000\u04d4\u04d5\u0005@\u0000\u0000"+ + "\u04d5\u04d6\u0007\u0004\u0000\u0000\u04d6\u04d7\u0007\r\u0000\u0000\u04d7"+ + "\u04d8\u0007\r\u0000\u0000\u04d8\u04d9\u0007\t\u0000\u0000\u04d9\u0550"+ + "\u0007\u000f\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0005"+ + "-\u0000\u0000\u04dc\u04dd\u0007\b\u0000\u0000\u04dd\u04de\u0007\u0003"+ + "\u0000\u0000\u04de\u04df\u0007\u0017\u0000\u0000\u04df\u04e0\u0007\u0018"+ + "\u0000\u0000\u04e0\u04e1\u0007\u0007\u0000\u0000\u04e1\u04e2\u0007\u000b"+ + "\u0000\u0000\u04e2\u04e3\u0005-\u0000\u0000\u04e3\u04e4\u0007\u0018\u0000"+ + "\u0000\u04e4\u04e5\u0007\u0003\u0000\u0000\u04e5\u04e6\u0007\u000f\u0000"+ + "\u0000\u04e6\u04e7\u0007\u0000\u0000\u0000\u04e7\u04e8\u0007\u0002\u0000"+ + "\u0000\u04e8\u04e9\u0007\u0004\u0000\u0000\u04e9\u04ea\u0007\u0012\u0000"+ + "\u0000\u04ea\u04eb\u0007\u0003\u0000\u0000\u04eb\u0550\u0007\n\u0000\u0000"+ + "\u04ec\u04ed\u0005@\u0000\u0000\u04ed\u04ee\u0007\u0018\u0000\u0000\u04ee"+ + "\u04ef\u0007\u0003\u0000\u0000\u04ef\u04f0\u0007\u000f\u0000\u0000\u04f0"+ + "\u04f1\u0007\u0000\u0000\u0000\u04f1\u04f2\u0007\u0002\u0000\u0000\u04f2"+ + "\u04f3\u0007\u0004\u0000\u0000\u04f3\u04f4\u0007\u0012\u0000\u0000\u04f4"+ + "\u04f5\u0007\u0003\u0000\u0000\u04f5\u0550\u0007\n\u0000\u0000\u04f6\u04f7"+ + "\u0005@\u0000\u0000\u04f7\u04f8\u0007\u0005\u0000\u0000\u04f8\u04f9\u0007"+ + "\u0001\u0000\u0000\u04f9\u04fa\u0007\u000e\u0000\u0000\u04fa\u04fb\u0007"+ + "\f\u0000\u0000\u04fb\u04fc\u0007\u000b\u0000\u0000\u04fc\u04fd\u0007\u0003"+ + "\u0000\u0000\u04fd\u04fe\u0007\u0002\u0000\u0000\u04fe\u04ff\u0005-\u0000"+ + "\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501\u0007\u000b\u0000\u0000"+ + "\u0501\u0502\u0007\u000f\u0000\u0000\u0502\u0503\u0007\t\u0000\u0000\u0503"+ + "\u0550\u0007\u0003\u0000\u0000\u0504\u0505\u0005@\u0000\u0000\u0505\u0506"+ + "\u0007\u0000\u0000\u0000\u0506\u0507\u0007\u0001\u0000\u0000\u0507\u0508"+ + "\u0007\f\u0000\u0000\u0508\u0509\u0007\u000b\u0000\u0000\u0509\u050a\u0005"+ + "-\u0000\u0000\u050a\u050b\u0007\u0000\u0000\u0000\u050b\u050c\u0007\u0003"+ + "\u0000\u0000\u050c\u050d\u0007\u0004\u0000\u0000\u050d\u050e\u0007\u000b"+ + "\u0000\u0000\u050e\u050f\u0007\u000e\u0000\u0000\u050f\u0510\u0007\u0002"+ + "\u0000\u0000\u0510\u0511\u0007\u0003\u0000\u0000\u0511\u0512\u0005-\u0000"+ + "\u0000\u0512\u0513\u0007\u001a\u0000\u0000\u0513\u0514\u0007\u0004\u0000"+ + "\u0000\u0514\u0515\u0007\t\u0000\u0000\u0515\u0516\u0007\u000e\u0000\u0000"+ + "\u0516\u0517\u0007\u0003\u0000\u0000\u0517\u0550\u0007\n\u0000\u0000\u0518"+ + "\u0519\u0005@\u0000\u0000\u0519\u051a\u0007\r\u0000\u0000\u051a\u051b"+ + "\u0007\u0002\u0000\u0000\u051b\u051c\u0007\u0001\u0000\u0000\u051c\u051d"+ + "\u0007\r\u0000\u0000\u051d\u051e\u0007\u0003\u0000\u0000\u051e\u051f\u0007"+ + "\u0002\u0000\u0000\u051f\u0520\u0007\u000b\u0000\u0000\u0520\u0550\u0007"+ + "\u000f\u0000\u0000\u0521\u0522\u0005@\u0000\u0000\u0522\u0523\u0007\n"+ + "\u0000\u0000\u0523\u0524\u0007\u0005\u0000\u0000\u0524\u0525\u0007\u0001"+ + "\u0000\u0000\u0525\u0526\u0007\r\u0000\u0000\u0526\u0550\u0007\u0003\u0000"+ + "\u0000\u0527\u0528\u0005@\u0000\u0000\u0528\u0529\u0007\n\u0000\u0000"+ + "\u0529\u052a\u0007\u000b\u0000\u0000\u052a\u052b\u0007\u0004\u0000\u0000"+ + "\u052b\u052c\u0007\u0002\u0000\u0000\u052c\u052d\u0007\u000b\u0000\u0000"+ + "\u052d\u052e\u0007\u0007\u0000\u0000\u052e\u052f\u0007\f\u0000\u0000\u052f"+ + "\u0530\u0007\u0010\u0000\u0000\u0530\u0531\u0005-\u0000\u0000\u0531\u0532"+ + "\u0007\n\u0000\u0000\u0532\u0533\u0007\u000b\u0000\u0000\u0533\u0534\u0007"+ + "\u000f\u0000\u0000\u0534\u0535\u0007\t\u0000\u0000\u0535\u0550\u0007\u0003"+ + "\u0000\u0000\u0536\u0537\u0005@\u0000\u0000\u0537\u0538\u0007\n\u0000"+ + "\u0000\u0538\u0539\u0007\u000e\u0000\u0000\u0539\u053a\u0007\r\u0000\u0000"+ + "\u053a\u053b\u0007\r\u0000\u0000\u053b\u053c\u0007\u0001\u0000\u0000\u053c"+ + "\u053d\u0007\u0002\u0000\u0000\u053d\u053e\u0007\u000b\u0000\u0000\u053e"+ + "\u0550\u0007\n\u0000\u0000\u053f\u0540\u0005@\u0000\u0000\u0540\u0541"+ + "\u0007\u001a\u0000\u0000\u0541\u0542\u0007\u0007\u0000\u0000\u0542\u0543"+ + "\u0007\u0003\u0000\u0000\u0543\u0544\u0007\b\u0000\u0000\u0544\u0545\u0005"+ + "-\u0000\u0000\u0545\u0546\u0007\u000b\u0000\u0000\u0546\u0547\u0007\u0002"+ + "\u0000\u0000\u0547\u0548\u0007\u0004\u0000\u0000\u0548\u0549\u0007\f\u0000"+ + "\u0000\u0549\u054a\u0007\n\u0000\u0000\u054a\u054b\u0007\u0007\u0000\u0000"+ + "\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d\u0007\u0007\u0000\u0000"+ + "\u054d\u054e\u0007\u0001\u0000\u0000\u054e\u0550\u0007\f\u0000\u0000\u054f"+ + "\u048b\u0001\u0000\u0000\u0000\u054f\u0493\u0001\u0000\u0000\u0000\u054f"+ + "\u049a\u0001\u0000\u0000\u0000\u054f\u04a4\u0001\u0000\u0000\u0000\u054f"+ + "\u04ad\u0001\u0000\u0000\u0000\u054f\u04b7\u0001\u0000\u0000\u0000\u054f"+ + "\u04bc\u0001\u0000\u0000\u0000\u054f\u04c2\u0001\u0000\u0000\u0000\u054f"+ + "\u04cb\u0001\u0000\u0000\u0000\u054f\u04d4\u0001\u0000\u0000\u0000\u054f"+ + "\u04da\u0001\u0000\u0000\u0000\u054f\u04ec\u0001\u0000\u0000\u0000\u054f"+ + "\u04f6\u0001\u0000\u0000\u0000\u054f\u0504\u0001\u0000\u0000\u0000\u054f"+ + "\u0518\u0001\u0000\u0000\u0000\u054f\u0521\u0001\u0000\u0000\u0000\u054f"+ + "\u0527\u0001\u0000\u0000\u0000\u054f\u0536\u0001\u0000\u0000\u0000\u054f"+ + "\u053f\u0001\u0000\u0000\u0000\u0550\u0554\u0001\u0000\u0000\u0000\u0551"+ + "\u0553\u0007*\u0000\u0000\u0552\u0551\u0001\u0000\u0000\u0000\u0553\u0556"+ + "\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000\u0000\u0000\u0554\u0555"+ + "\u0001\u0000\u0000\u0000\u0555\u0558\u0001\u0000\u0000\u0000\u0556\u0554"+ + "\u0001\u0000\u0000\u0000\u0557\u046c\u0001\u0000\u0000\u0000\u0557\u046f"+ + "\u0001\u0000\u0000\u0000\u0557\u0475\u0001\u0000\u0000\u0000\u0557\u047b"+ + "\u0001\u0000\u0000\u0000\u0557\u054f\u0001\u0000\u0000\u0000\u0558\u0559"+ + "\u0001\u0000\u0000\u0000\u0559\u055a\u0006.\t\u0000\u055ai\u0001\u0000"+ + "\u0000\u0000\u055b\u055c\t\u0000\u0000\u0000\u055c\u055d\u0004/\u0007"+ + "\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0006/\u000e\u0000"+ + "\u055f\u0560\u0006/\u000f\u0000\u0560k\u0001\u0000\u0000\u0000\u0561\u0562"+ + "\t\u0000\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0564\u0006"+ + "0\f\u0000\u0564m\u0001\u0000\u0000\u0000\u0565\u0566\u0005\u0000\u0000"+ + "\u0001\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568\u00061\u000e\u0000"+ + "\u0568\u0569\u00061\u000f\u0000\u0569o\u0001\u0000\u0000\u0000\u056a\u056b"+ + "\u0005}\u0000\u0000\u056b\u056c\u0005}\u0000\u0000\u056c\u056d\u0001\u0000"+ + "\u0000\u0000\u056d\u056e\u00062\u000f\u0000\u056e\u056f\u00062\u0006\u0000"+ + "\u056fq\u0001\u0000\u0000\u0000\u0570\u0571\u0003\f\u0000\u0000\u0571"+ + "\u0572\u00063\u0010\u0000\u0572s\u0001\u0000\u0000\u0000\u0573\u0576\u0003"+ + "X&\u0000\u0574\u0576\u0003\u0012\u0003\u0000\u0575\u0573\u0001\u0000\u0000"+ + "\u0000\u0575\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000"+ + "\u0000\u0577\u0578\u00064\u0011\u0000\u0578u\u0001\u0000\u0000\u0000\u0579"+ + "\u057a\u0005:\u0000\u0000\u057a\u057d\u0005)\u0000\u0000\u057b\u057d\u0005"+ + ":\u0000\u0000\u057c\u0579\u0001\u0000\u0000\u0000\u057c\u057b\u0001\u0000"+ + "\u0000\u0000\u057d\u057e\u0001\u0000\u0000\u0000\u057e\u057f\u00065\u0012"+ + "\u0000\u057fw\u0001\u0000\u0000\u0000\u0580\u0582\b+\u0000\u0000\u0581"+ + "\u0580\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000\u0000\u0000\u0583"+ + "\u0581\u0001\u0000\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584"+ + "\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u00066\u0013\u0000\u0586y\u0001"+ + "\u0000\u0000\u0000\u0587\u058b\t\u0000\u0000\u0000\u0588\u058a\u0007*"+ + "\u0000\u0000\u0589\u0588\u0001\u0000\u0000\u0000\u058a\u058d\u0001\u0000"+ + "\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058b\u058c\u0001\u0000"+ + "\u0000\u0000\u058c\u058e\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000"+ + "\u0000\u0000\u058e\u058f\u00067\u0014\u0000\u058f{\u0001\u0000\u0000\u0000"+ + "\u0590\u0591\u0005\u0000\u0000\u0001\u0591\u0592\u0001\u0000\u0000\u0000"+ + "\u0592\u0593\u00068\u0015\u0000\u0593\u0594\u00068\u000f\u0000\u0594}"+ + "\u0001\u0000\u0000\u0000\u0595\u0596\u0005!\u0000\u0000\u0596\u0597\u0005"+ + "!\u0000\u0000\u0597\u0598\u0005}\u0000\u0000\u0598\u0599\u0001\u0000\u0000"+ + "\u0000\u0599\u059a\u00069\u000f\u0000\u059a\u059b\u00069\b\u0000\u059b"+ + "\u007f\u0001\u0000\u0000\u0000\u059c\u059d\u0003\f\u0000\u0000\u059d\u059e"+ + "\u0006:\u0016\u0000\u059e\u0081\u0001\u0000\u0000\u0000\u059f\u05a2\u0003"+ + "X&\u0000\u05a0\u05a2\u0003\u0012\u0003\u0000\u05a1\u059f\u0001\u0000\u0000"+ + "\u0000\u05a1\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ + "\u0000\u05a3\u05a4\u0006;\u0017\u0000\u05a4\u0083\u0001\u0000\u0000\u0000"+ + "\u05a5\u05a6\u0005:\u0000\u0000\u05a6\u05a9\u0005)\u0000\u0000\u05a7\u05a9"+ + "\u0005:\u0000\u0000\u05a8\u05a5\u0001\u0000\u0000\u0000\u05a8\u05a7\u0001"+ + "\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05ab\u0006"+ + "<\u0012\u0000\u05ab\u0085\u0001\u0000\u0000\u0000\u05ac\u05ae\b,\u0000"+ + "\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ae\u05af\u0001\u0000\u0000"+ + "\u0000\u05af\u05ad\u0001\u0000\u0000\u0000\u05af\u05b0\u0001\u0000\u0000"+ + "\u0000\u05b0\u05b1\u0001\u0000\u0000\u0000\u05b1\u05b2\u0006=\u0018\u0000"+ + "\u05b2\u0087\u0001\u0000\u0000\u0000\u05b3\u05b7\t\u0000\u0000\u0000\u05b4"+ + "\u05b6\u0007*\u0000\u0000\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b9"+ + "\u0001\u0000\u0000\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8"+ + "\u0001\u0000\u0000\u0000\u05b8\u05ba\u0001\u0000\u0000\u0000\u05b9\u05b7"+ + "\u0001\u0000\u0000\u0000\u05ba\u05bb\u0006>\u0019\u0000\u05bb\u0089\u0001"+ + "\u0000\u0000\u0000\u05bc\u05bd\u0005\u0000\u0000\u0001\u05bd\u05be\u0001"+ + "\u0000\u0000\u0000\u05be\u05bf\u0006?\u0015\u0000\u05bf\u05c0\u0006?\u000f"+ + "\u0000\u05c0\u008b\u0001\u0000\u0000\u0000\u05c1\u05c3\u0007*\u0000\u0000"+ + "\u05c2\u05c1\u0001\u0000\u0000\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000"+ + "\u05c4\u05c2\u0001\u0000\u0000\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000"+ + "\u05c5\u05c6\u0001\u0000\u0000\u0000\u05c6\u05c7\u0004@\b\u0000\u05c7"+ + "\u05c8\u0001\u0000\u0000\u0000\u05c8\u05c9\u0006@\u001a\u0000\u05c9\u008d"+ + "\u0001\u0000\u0000\u0000\u05ca\u05cb\u0005(\u0000\u0000\u05cb\u05cc\u0006"+ + "A\u001b\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cd\u05ce\u0006A\f"+ + "\u0000\u05ce\u05cf\u0006A\u001a\u0000\u05cf\u008f\u0001\u0000\u0000\u0000"+ + "\u05d0\u05d1\u0003N!\u0000\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3"+ + "\u0006B\u0015\u0000\u05d3\u05d4\u0006B\u000f\u0000\u05d4\u0091\u0001\u0000"+ + "\u0000\u0000\u05d5\u05d6\t\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000"+ + "\u0000\u05d7\u05d8\u0006C\u0015\u0000\u05d8\u05d9\u0006C\u000f\u0000\u05d9"+ + "\u0093\u0001\u0000\u0000\u0000\u05da\u05db\u0004D\t\u0000\u05db\u05dc"+ + "\u0005(\u0000\u0000\u05dc\u05dd\u0006D\u001c\u0000\u05dd\u05de\u0006D"+ + "\u001d\u0000\u05de\u0095\u0001\u0000\u0000\u0000\u05df\u05e0\u0004E\n"+ + "\u0000\u05e0\u05e1\u0005)\u0000\u0000\u05e1\u05e2\u0006E\u001e\u0000\u05e2"+ + "\u05e3\u0001\u0000\u0000\u0000\u05e3\u05e4\u0006E\u001f\u0000\u05e4\u05e5"+ + "\u0006E \u0000\u05e5\u0097\u0001\u0000\u0000\u0000\u05e6\u05e7\u0004F"+ + "\u000b\u0000\u05e7\u05e8\u0005(\u0000\u0000\u05e8\u05e9\u0006F!\u0000"+ + "\u05e9\u05ea\u0006F\"\u0000\u05ea\u0099\u0001\u0000\u0000\u0000\u05eb"+ + "\u05ec\u0004G\f\u0000\u05ec\u05ed\u0005)\u0000\u0000\u05ed\u05ee\u0006"+ + "G#\u0000\u05ee\u05ef\u0006G$\u0000\u05ef\u009b\u0001\u0000\u0000\u0000"+ + "\u05f0\u05f1\u0005)\u0000\u0000\u05f1\u05f2\u0004H\r\u0000\u05f2\u05f3"+ + "\u0001\u0000\u0000\u0000\u05f3\u05f4\u0006H\u001f\u0000\u05f4\u05f5\u0006"+ + "H \u0000\u05f5\u009d\u0001\u0000\u0000\u0000\u05f6\u05f7\u0005\"\u0000"+ + "\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8\u05f9\u0006I\f\u0000"+ + "\u05f9\u05fa\u0006I%\u0000\u05fa\u009f\u0001\u0000\u0000\u0000\u05fb\u05fc"+ + "\u0005?\u0000\u0000\u05fc\u05fd\u0005:\u0000\u0000\u05fd\u05fe\u0001\u0000"+ + "\u0000\u0000\u05fe\u05ff\u0006J&\u0000\u05ff\u00a1\u0001\u0000\u0000\u0000"+ + "\u0600\u0601\u0005:\u0000\u0000\u0601\u0602\u0005:\u0000\u0000\u0602\u0603"+ + "\u0001\u0000\u0000\u0000\u0603\u0604\u0006K\'\u0000\u0604\u00a3\u0001"+ + "\u0000\u0000\u0000\u0605\u0609\u0003X&\u0000\u0606\u0608\u0005 \u0000"+ + "\u0000\u0607\u0606\u0001\u0000\u0000\u0000\u0608\u060b\u0001\u0000\u0000"+ + "\u0000\u0609\u0607\u0001\u0000\u0000\u0000\u0609\u060a\u0001\u0000\u0000"+ + "\u0000\u060a\u060c\u0001\u0000\u0000\u0000\u060b\u0609\u0001\u0000\u0000"+ + "\u0000\u060c\u060d\u0006L(\u0000\u060d\u00a5\u0001\u0000\u0000\u0000\u060e"+ + "\u060f\u0005:\u0000\u0000\u060f\u0610\u0004M\u000e\u0000\u0610\u0611\u0001"+ + "\u0000\u0000\u0000\u0611\u0612\u0006M\u0012\u0000\u0612\u00a7\u0001\u0000"+ + "\u0000\u0000\u0613\u0614\u0005:\u0000\u0000\u0614\u0615\u0001\u0000\u0000"+ + "\u0000\u0615\u0616\u0006N\u0012\u0000\u0616\u00a9\u0001\u0000\u0000\u0000"+ + "\u0617\u0618\u0005/\u0000\u0000\u0618\u0619\u0005*\u0000\u0000\u0619\u061d"+ + "\u0001\u0000\u0000\u0000\u061a\u061c\t\u0000\u0000\u0000\u061b\u061a\u0001"+ + "\u0000\u0000\u0000\u061c\u061f\u0001\u0000\u0000\u0000\u061d\u061e\u0001"+ + "\u0000\u0000\u0000\u061d\u061b\u0001\u0000\u0000\u0000\u061e\u0620\u0001"+ + "\u0000\u0000\u0000\u061f\u061d\u0001\u0000\u0000\u0000\u0620\u0621\u0005"+ + "*\u0000\u0000\u0621\u0622\u0005/\u0000\u0000\u0622\u0623\u0001\u0000\u0000"+ + "\u0000\u0623\u0624\u0006O\u0012\u0000\u0624\u00ab\u0001\u0000\u0000\u0000"+ + "\u0625\u0626\t\u0000\u0000\u0000\u0626\u0627\u0006P)\u0000\u0627\u00ad"+ + "\u0001\u0000\u0000\u0000\u0628\u0629\u0005\u0000\u0000\u0001\u0629\u062a"+ + "\u0001\u0000\u0000\u0000\u062a\u062b\u0006Q\u0015\u0000\u062b\u062c\u0006"+ + "Q \u0000\u062c\u00af\u0001\u0000\u0000\u0000\u062d\u062e\u0005@\u0000"+ + "\u0000\u062e\u062f\u0007\u0003\u0000\u0000\u062f\u0630\u0007\f\u0000\u0000"+ + "\u0630\u0631\u0007\u0011\u0000\u0000\u0631\u0632\u0007\r\u0000\u0000\u0632"+ + "\u0633\u0007\u0006\u0000\u0000\u0633\u0634\u0007\r\u0000\u0000\u0634\u0635"+ + "\u0001\u0000\u0000\u0000\u0635\u0636\u0006R\u000f\u0000\u0636\u00b1\u0001"+ + "\u0000\u0000\u0000\u0637\u0638\t\u0000\u0000\u0000\u0638\u0639\u0004S"+ + "\u000f\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063b\u0006S*\u0000"+ + "\u063b\u00b3\u0001\u0000\u0000\u0000\u063c\u063d\t\u0000\u0000\u0000\u063d"+ + "\u063e\u0001\u0000\u0000\u0000\u063e\u063f\u0006T\f\u0000\u063f\u00b5"+ + "\u0001\u0000\u0000\u0000\u0640\u0641\u0005\u0000\u0000\u0001\u0641\u0642"+ + "\u0001\u0000\u0000\u0000\u0642\u0643\u0006U\u0015\u0000\u0643\u0644\u0006"+ + "U\u000f\u0000\u0644\u00b7\u0001\u0000\u0000\u0000\u0645\u0646\u0005@\u0000"+ + "\u0000\u0646\u0647\u0007\u0003\u0000\u0000\u0647\u0648\u0007\f\u0000\u0000"+ + "\u0648\u0649\u0007\u0011\u0000\u0000\u0649\u064a\u0007\u001a\u0000\u0000"+ + "\u064a\u064b\u0007\u0003\u0000\u0000\u064b\u064c\u0007\u0002\u0000\u0000"+ + "\u064c\u064d\u0007\u0017\u0000\u0000\u064d\u064e\u0007\u0004\u0000\u0000"+ + "\u064e\u064f\u0007\u000b\u0000\u0000\u064f\u0650\u0007\u0007\u0000\u0000"+ + "\u0650\u0651\u0007\u0012\u0000\u0000\u0651\u0652\u0001\u0000\u0000\u0000"+ + "\u0652\u0653\u0006V\u0001\u0000\u0653\u0654\u0006V\u000f\u0000\u0654\u00b9"+ + "\u0001\u0000\u0000\u0000\u0655\u0656\t\u0000\u0000\u0000\u0656\u0657\u0004"+ + "W\u0010\u0000\u0657\u0658\u0001\u0000\u0000\u0000\u0658\u0659\u0006W\t"+ + "\u0000\u0659\u00bb\u0001\u0000\u0000\u0000\u065a\u065b\t\u0000\u0000\u0000"+ + "\u065b\u065c\u0001\u0000\u0000\u0000\u065c\u065d\u0006X\f\u0000\u065d"+ + "\u00bd\u0001\u0000\u0000\u0000\u065e\u065f\u0005\u0000\u0000\u0001\u065f"+ + "\u0660\u0001\u0000\u0000\u0000\u0660\u0661\u0006Y\u0015\u0000\u0661\u0662"+ + "\u0006Y\u000f\u0000\u0662\u00bf\u0001\u0000\u0000\u0000\u0663\u0664\u0005"+ + ":\u0000\u0000\u0664\u0665\u0003R#\u0000\u0665\u0666\u0005=\u0000\u0000"+ + "\u0666\u0667\u0005\"\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668"+ + "\u0669\u0006Z\t\u0000\u0669\u066a\u0006Z+\u0000\u066a\u00c1\u0001\u0000"+ + "\u0000\u0000\u066b\u066c\u0005{\u0000\u0000\u066c\u066d\u0005{\u0000\u0000"+ + "\u066d\u066e\u0001\u0000\u0000\u0000\u066e\u066f\u0006[\u0005\u0000\u066f"+ + "\u0670\u0006[\u0006\u0000\u0670\u00c3\u0001\u0000\u0000\u0000\u0671\u0672"+ + "\u0005{\u0000\u0000\u0672\u0673\u0005!\u0000\u0000\u0673\u0674\u0005!"+ + "\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675\u0676\u0006\\\u0007"+ + "\u0000\u0676\u0677\u0006\\\b\u0000\u0677\u00c5\u0001\u0000\u0000\u0000"+ + "\u0678\u0679\u0005>\u0000\u0000\u0679\u067a\u0001\u0000\u0000\u0000\u067a"+ + "\u067b\u0006]\t\u0000\u067b\u067c\u0006]\u000f\u0000\u067c\u00c7\u0001"+ + "\u0000\u0000\u0000\u067d\u067e\t\u0000\u0000\u0000\u067e\u067f\u0001\u0000"+ + "\u0000\u0000\u067f\u0680\u0006^\t\u0000\u0680\u00c9\u0001\u0000\u0000"+ + "\u0000\u0681\u0682\u0005\u0000\u0000\u0001\u0682\u0683\u0001\u0000\u0000"+ + "\u0000\u0683\u0684\u0006_\u0015\u0000\u0684\u0685\u0006_\u000f\u0000\u0685"+ + "\u00cb\u0001\u0000\u0000\u0000\u0686\u0687\u0005\"\u0000\u0000\u0687\u0688"+ + "\u0001\u0000\u0000\u0000\u0688\u0689\u0006`\t\u0000\u0689\u068a\u0006"+ + "`\u000f\u0000\u068a\u00cd\u0001\u0000\u0000\u0000\u068b\u068c\t\u0000"+ + "\u0000\u0000\u068c\u068d\u0004a\u0011\u0000\u068d\u068e\u0001\u0000\u0000"+ + "\u0000\u068e\u068f\u0006a\u001f\u0000\u068f\u00cf\u0001\u0000\u0000\u0000"+ + "\u0690\u0691\t\u0000\u0000\u0000\u0691\u0692\u0001\u0000\u0000\u0000\u0692"+ + "\u0693\u0006b\f\u0000\u0693\u00d1\u0001\u0000\u0000\u0000\u0694\u0695"+ + "\u0005\u0000\u0000\u0001\u0695\u0696\u0001\u0000\u0000\u0000\u0696\u0697"+ + "\u0006c\u0015\u0000\u0697\u0698\u0006c\u000f\u0000\u0698\u00d3\u0001\u0000"+ + "\u0000\u0000\u0699\u069b\u0003\f\u0000\u0000\u069a\u069c\u0005$\u0000"+ + "\u0000\u069b\u069a\u0001\u0000\u0000\u0000\u069b\u069c\u0001\u0000\u0000"+ + "\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069e\u0003R#\u0000\u069e"+ + "\u069f\u0005}\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a1"+ + "\u0006d\f\u0000\u06a1\u00d5\u0001\u0000\u0000\u0000\u06a2\u06a3\u0003"+ + "\f\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a5\u0006e"+ + "\f\u0000\u06a5\u00d7\u0001\u0000\u0000\u0000\u06a6\u06a8\u0005{\u0000"+ + "\u0000\u06a7\u06a9\u0007)\u0000\u0000\u06a8\u06a7\u0001\u0000\u0000\u0000"+ + "\u06a8\u06a9\u0001\u0000\u0000\u0000\u06a9\u06aa\u0001\u0000\u0000\u0000"+ + "\u06aa\u06ac\u0003R#\u0000\u06ab\u06ad\u0007)\u0000\u0000\u06ac\u06ab"+ + "\u0001\u0000\u0000\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06af"+ + "\u0001\u0000\u0000\u0000\u06ae\u06b0\u0005:\u0000\u0000\u06af\u06ae\u0001"+ + "\u0000\u0000\u0000\u06b0\u06b1\u0001\u0000\u0000\u0000\u06b1\u06af\u0001"+ + "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b4\u0001"+ + "\u0000\u0000\u0000\u06b3\u06b5\u0007)\u0000\u0000\u06b4\u06b3\u0001\u0000"+ + "\u0000\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b7\u0001\u0000"+ + "\u0000\u0000\u06b6\u06b8\u0003R#\u0000\u06b7\u06b6\u0001\u0000\u0000\u0000"+ + "\u06b7\u06b8\u0001\u0000\u0000\u0000\u06b8\u06ba\u0001\u0000\u0000\u0000"+ + "\u06b9\u06bb\u0007)\u0000\u0000\u06ba\u06b9\u0001\u0000\u0000\u0000\u06ba"+ + "\u06bb\u0001\u0000\u0000\u0000\u06bb\u06d2\u0001\u0000\u0000\u0000\u06bc"+ + "\u06be\u0005,\u0000\u0000\u06bd\u06bf\u0007)\u0000\u0000\u06be\u06bd\u0001"+ + "\u0000\u0000\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c0\u0001"+ + "\u0000\u0000\u0000\u06c0\u06c2\u0003R#\u0000\u06c1\u06c3\u0007)\u0000"+ + "\u0000\u06c2\u06c1\u0001\u0000\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000"+ + "\u0000\u06c3\u06c5\u0001\u0000\u0000\u0000\u06c4\u06c6\u0005:\u0000\u0000"+ + "\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000"+ + "\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000"+ + "\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06cb\u0007)\u0000\u0000\u06ca"+ + "\u06c9\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb"+ + "\u06cc\u0001\u0000\u0000\u0000\u06cc\u06ce\u0003R#\u0000\u06cd\u06cf\u0007"+ + ")\u0000\u0000\u06ce\u06cd\u0001\u0000\u0000\u0000\u06ce\u06cf\u0001\u0000"+ + "\u0000\u0000\u06cf\u06d1\u0001\u0000\u0000\u0000\u06d0\u06bc\u0001\u0000"+ + "\u0000\u0000\u06d1\u06d4\u0001\u0000\u0000\u0000\u06d2\u06d0\u0001\u0000"+ + "\u0000\u0000\u06d2\u06d3\u0001\u0000\u0000\u0000\u06d3\u06d6\u0001\u0000"+ + "\u0000\u0000\u06d4\u06d2\u0001\u0000\u0000\u0000\u06d5\u06d7\u0005,\u0000"+ + "\u0000\u06d6\u06d5\u0001\u0000\u0000\u0000\u06d6\u06d7\u0001\u0000\u0000"+ + "\u0000\u06d7\u06d8\u0001\u0000\u0000\u0000\u06d8\u06d9\u0005}\u0000\u0000"+ + "\u06d9\u06da\u0001\u0000\u0000\u0000\u06da\u06db\u0006f\f\u0000\u06db"+ + "\u00d9\u0001\u0000\u0000\u0000\u06dc\u06dd\u0005{\u0000\u0000\u06dd\u06de"+ + "\u0005$\u0000\u0000\u06de\u06e7\u0003R#\u0000\u06df\u06e0\u0005[\u0000"+ + "\u0000\u06e0\u06e1\u0007)\u0000\u0000\u06e1\u06e2\u0003R#\u0000\u06e2"+ + "\u06e3\u0007)\u0000\u0000\u06e3\u06e4\u0005]\u0000\u0000\u06e4\u06e6\u0001"+ + "\u0000\u0000\u0000\u06e5\u06df\u0001\u0000\u0000\u0000\u06e6\u06e9\u0001"+ + "\u0000\u0000\u0000\u06e7\u06e5\u0001\u0000\u0000\u0000\u06e7\u06e8\u0001"+ + "\u0000\u0000\u0000\u06e8\u06ea\u0001\u0000\u0000\u0000\u06e9\u06e7\u0001"+ + "\u0000\u0000\u0000\u06ea\u06eb\u0005:\u0000\u0000\u06eb\u06ec\u0005:\u0000"+ + "\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0003R#\u0000\u06ee"+ + "\u06ef\u0005}\u0000\u0000\u06ef\u06f0\u0001\u0000\u0000\u0000\u06f0\u06f1"+ + "\u0006g\f\u0000\u06f1\u00db\u0001\u0000\u0000\u0000\u06f2\u06f3\u0005"+ + "{\u0000\u0000\u06f3\u06f4\u0005$\u0000\u0000\u06f4\u06fe\u0003R#\u0000"+ + "\u06f5\u06f6\u0005[\u0000\u0000\u06f6\u06f8\u0007)\u0000\u0000\u06f7\u06f9"+ + "\u0003R#\u0000\u06f8\u06f7\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001\u0000"+ + "\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb\u0007)\u0000"+ + "\u0000\u06fb\u06fd\u0005]\u0000\u0000\u06fc\u06f5\u0001\u0000\u0000\u0000"+ + "\u06fd\u0700\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000\u0000"+ + "\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff\u0708\u0001\u0000\u0000\u0000"+ + "\u0700\u06fe\u0001\u0000\u0000\u0000\u0701\u0702\u0005:\u0000\u0000\u0702"+ + "\u0704\u0005:\u0000\u0000\u0703\u0701\u0001\u0000\u0000\u0000\u0704\u0705"+ + "\u0001\u0000\u0000\u0000\u0705\u0703\u0001\u0000\u0000\u0000\u0705\u0706"+ + "\u0001\u0000\u0000\u0000\u0706\u0707\u0001\u0000\u0000\u0000\u0707\u0709"+ + "\u0003R#\u0000\u0708\u0703\u0001\u0000\u0000\u0000\u0708\u0709\u0001\u0000"+ + "\u0000\u0000\u0709\u070e\u0001\u0000\u0000\u0000\u070a\u070c\u0005:\u0000"+ + "\u0000\u070b\u070d\u0003R#\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c"+ + "\u070d\u0001\u0000\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e"+ + "\u070a\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ + "\u070e\u0001\u0000\u0000\u0000\u0710\u0711\u0001\u0000\u0000\u0000\u0711"+ + "\u0712\u0001\u0000\u0000\u0000\u0712\u0713\u0005}\u0000\u0000\u0713\u0717"+ + "\u0001\u0000\u0000\u0000\u0714\u0715\u0005:\u0000\u0000\u0715\u0717\u0005"+ + "$\u0000\u0000\u0716\u06f2\u0001\u0000\u0000\u0000\u0716\u0714\u0001\u0000"+ + "\u0000\u0000\u0717\u0718\u0001\u0000\u0000\u0000\u0718\u0719\u0006h\u0015"+ + "\u0000\u0719\u00dd\u0001\u0000\u0000\u0000\u071a\u071b\u0005\\\u0000\u0000"+ + "\u071b\u071c\u0005\"\u0000\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ + "\u071e\u0006i\f\u0000\u071e\u00df\u0001\u0000\u0000\u0000\u071f\u0720"+ + "\u0005\"\u0000\u0000\u0720\u0721\u0001\u0000\u0000\u0000\u0721\u0722\u0006"+ + "j\f\u0000\u0722\u0723\u0006j\u000f\u0000\u0723\u00e1\u0001\u0000\u0000"+ + "\u0000\u0724\u0725\t\u0000\u0000\u0000\u0725\u0726\u0001\u0000\u0000\u0000"+ + "\u0726\u0727\u0006k\f\u0000\u0727\u00e3\u0001\u0000\u0000\u0000\u0728"+ + "\u0729\u0005\u0000\u0000\u0001\u0729\u072a\u0001\u0000\u0000\u0000\u072a"+ + "\u072b\u0006l\u0015\u0000\u072b\u072c\u0006l\u000f\u0000\u072c\u00e5\u0001"+ + "\u0000\u0000\u0000\u072d\u072e\u0005-\u0000\u0000\u072e\u072f\u0005-\u0000"+ + "\u0000\u072f\u0730\u0005}\u0000\u0000\u0730\u0731\u0005}\u0000\u0000\u0731"+ + "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006m\u000f\u0000\u0733\u00e7"+ + "\u0001\u0000\u0000\u0000\u0734\u0735\t\u0000\u0000\u0000\u0735\u0736\u0004"+ + "n\u0012\u0000\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0738\u0006n,"+ + "\u0000\u0738\u00e9\u0001\u0000\u0000\u0000\u0739\u073a\t\u0000\u0000\u0000"+ + "\u073a\u073b\u0001\u0000\u0000\u0000\u073b\u073c\u0006o\f\u0000\u073c"+ + "\u00eb\u0001\u0000\u0000\u0000\u073d\u073e\u0005\u0000\u0000\u0001\u073e"+ + "\u073f\u0001\u0000\u0000\u0000\u073f\u0740\u0006p,\u0000\u0740\u0741\u0006"+ + "p\u000f\u0000\u0741\u00ed\u0001\u0000\u0000\u0000k\u0000\u0001\u0002\u0003"+ "\u0004\u0005\u0006\u0007\b\t\n\u000b\u00f5\u00ff\u013c\u015b\u0177\u0181"+ "\u0183\u018c\u0198\u01a6\u01ac\u01ae\u01cc\u023e\u0243\u0259\u0288\u02bf"+ "\u02e4\u02ee\u0346\u0349\u0361\u0376\u037d\u038e\u0390\u039d\u03a2\u03a9"+ "\u03ae\u03bc\u03bf\u03c1\u03cd\u03d2\u03d5\u03e2\u03e5\u03e7\u03ee\u03f3"+ "\u03f5\u03fe\u040a\u0411\u0418\u0420\u0422\u042b\u042d\u0438\u0450\u0464"+ - "\u0468\u0473\u0479\u0485\u0489\u0497\u04a5\u04b6\u04c6\u04d7\u04e3\u04f3"+ - "\u0500\u0510\u051d\u0536\u0547\u054a\u0568\u056f\u0576\u057e\u0594\u059b"+ - "\u05a2\u05aa\u05b7\u05fc\u0610\u068e\u069b\u069f\u06a4\u06a7\u06aa\u06ad"+ - "\u06b1\u06b5\u06ba\u06bd\u06c1\u06c5\u06c9\u06da\u06eb\u06f1\u06f8\u06fb"+ - "\u06ff\u0703\u0709-\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ - "\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0005\u0000"+ - "\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005\b\u0000\u0005"+ - "\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007\u0000\u0004"+ - "\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u00016\u0002"+ - "\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006\u0001"+ - ">\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b\u0007"+ - "\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001G\u000f"+ - "\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013\u0000"+ - "\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; + "\u0468\u0473\u0479\u0485\u0489\u054f\u0554\u0557\u0575\u057c\u0583\u058b"+ + "\u05a1\u05a8\u05af\u05b7\u05c4\u0609\u061d\u069b\u06a8\u06ac\u06b1\u06b4"+ + "\u06b7\u06ba\u06be\u06c2\u06c7\u06ca\u06ce\u06d2\u06d6\u06e7\u06f8\u06fe"+ + "\u0705\u0708\u070c\u0710\u0716-\u0005\u0004\u0000\u0007\u0001\u0000\u0005"+ + "\u0007\u0000\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007"+ + "\u0005\u0000\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005"+ + "\b\u0000\u0005\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007"+ + "\u0000\u0004\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u0001"+ + "6\u0002\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006"+ + "\u0001>\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b"+ + "\u0007\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001"+ + "G\u000f\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013"+ + "\u0000\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java index 352edb142fa4..3700e3d3786d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -719,7 +719,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } private static final String _serializedATNSegment0 = - "\u0004\u0000\u00ab\u0b3f\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\u0004\u0000\u00ab\u0b4c\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ @@ -966,654 +966,657 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\b~\u0001~\u0001~\u0001~\u0001~\u0003~\u07be\b~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07c8\b~\n~\f~\u07cb\t~\u0001~\u0003"+ "~\u07ce\b~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0005~\u07da\b~\n~\f~\u07dd\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07e8\b~\n~\f~\u07eb\t~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0005~\u07f9\b~\n~\f~\u07fc\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0809\b~\n~\f~\u080c\t~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0005~\u081a\b~\n~\f~\u081d\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0005~\u0826\b~\n~\f~\u0829\t~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0836\b~\n~"+ - "\f~\u0839\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005"+ - "~\u0843\b~\n~\f~\u0846\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0005~\u0853\b~\n~\f~\u0856\t~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0860\b~\n~\f~\u0863"+ - "\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0005~\u0879\b~\n~\f~\u087c\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u088a\b~\n~\f~\u088d"+ - "\t~\u0003~\u088f\b~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ - "\u0003\u0081\u089c\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0004\u0081"+ - "\u08a1\b\u0081\u000b\u0081\f\u0081\u08a2\u0001\u0081\u0001\u0081\u0001"+ - "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ - "\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ - "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ - "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ - "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ - "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ - "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08d4\b\u008c\u0001\u008c\u0001"+ - "\u008c\u0001\u008c\u0004\u008c\u08d9\b\u008c\u000b\u008c\f\u008c\u08da"+ - "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ - "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ - "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ - "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0004\u0095\u0905\b\u0095"+ - "\u000b\u0095\f\u0095\u0906\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ - "\u0001\u0095\u0001\u0096\u0004\u0096\u090f\b\u0096\u000b\u0096\f\u0096"+ - "\u0910\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ - "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ - "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004"+ - "\u00a1\u094e\b\u00a1\u000b\u00a1\f\u00a1\u094f\u0001\u00a1\u0001\u00a1"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ - "\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0974\b\u00a8\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00ab\u0003\u00ab\u097f\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0004\u00ab\u0984\b\u00ab\u000b\u00ab\f\u00ab\u0985\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ - "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ - "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ - "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0004\u00b2\u09a5\b\u00b2\u000b"+ - "\u00b2\f\u00b2\u09a6\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0004\u00b5\u09b7\b\u00b5\u000b"+ - "\u00b5\f\u00b5\u09b8\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001"+ - "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ - "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ - "\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u09d4\b\u00bc\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ - "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ - "\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001"+ - "\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ - "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ - "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+ - "\u00c6\u0001\u00c7\u0001\u00c7\u0003\u00c7\u0a04\b\u00c7\u0001\u00c8\u0001"+ - "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ - "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001"+ - "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0004\u00cd\u0a17\b\u00cd\u000b"+ - "\u00cd\f\u00cd\u0a18\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001"+ - "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001"+ - "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+ - "\u00d1\u0004\u00d1\u0a2c\b\u00d1\u000b\u00d1\f\u00d1\u0a2d\u0001\u00d1"+ - "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2"+ - "\u0a36\b\u00d2\n\u00d2\f\u00d2\u0a39\t\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ - "\u00d2\u0001\u00d2\u0005\u00d2\u0a3f\b\u00d2\n\u00d2\f\u00d2\u0a42\t\u00d2"+ - "\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ - "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ - "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ - "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ - "\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8"+ - "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9"+ - "\u0a67\b\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da"+ - "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ - "\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ - "\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ - "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a84\b\u00de"+ - "\u0001\u00de\u0001\u00de\u0001\u00de\u0004\u00de\u0a89\b\u00de\u000b\u00de"+ - "\f\u00de\u0a8a\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df"+ - "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ - "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2"+ - "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ - "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ - "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ - "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ - "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8"+ - "\u0abb\b\u00e8\u000b\u00e8\f\u00e8\u0abc\u0001\u00e8\u0001\u00e8\u0001"+ - "\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ac5\b\u00e9\n"+ - "\u00e9\f\u00e9\u0ac8\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ - "\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001"+ - "\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001"+ - "\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ - "\u00ee\u0001\u00ee\u0003\u00ee\u0ae1\b\u00ee\u0001\u00ee\u0001\u00ee\u0001"+ - "\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001"+ - "\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001"+ - "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001"+ - "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ - "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ - "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001"+ - "\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u0894\b~\u0001"+ + "~\u0005~\u0897\b~\n~\f~\u089a\t~\u0003~\u089c\b~\u0001~\u0001~\u0001\u007f"+ + "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ + "\u0001\u0080\u0001\u0081\u0003\u0081\u08a9\b\u0081\u0001\u0081\u0001\u0081"+ + "\u0001\u0081\u0004\u0081\u08ae\b\u0081\u000b\u0081\f\u0081\u08af\u0001"+ + "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ + "\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001"+ + "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ + "\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08e1"+ + "\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0004\u008c\u08e6\b\u008c"+ + "\u000b\u008c\f\u008c\u08e7\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+ + "\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091"+ + "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ + "\u0004\u0095\u0912\b\u0095\u000b\u0095\f\u0095\u0913\u0001\u0095\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0004\u0096\u091c"+ + "\b\u0096\u000b\u0096\f\u0096\u091d\u0001\u0096\u0001\u0096\u0001\u0097"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ + "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c"+ + "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ + "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ + "\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a1\u0004\u00a1\u095b\b\u00a1\u000b\u00a1\f\u00a1"+ + "\u095c\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+ + "\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001"+ + "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0981"+ + "\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001"+ + "\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0003\u00ab\u098c\b\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0004\u00ab\u0991\b\u00ab\u000b\u00ab\f"+ + "\u00ab\u0992\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ + "\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ + "\u0004\u00b2\u09b2\b\u00b2\u000b\u00b2\f\u00b2\u09b3\u0001\u00b2\u0001"+ + "\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b5\u0004\u00b5\u09c4\b\u00b5\u000b\u00b5\f\u00b5\u09c5\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ + "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ + "\u0003\u00bc\u09e1\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd"+ + "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be"+ + "\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf"+ + "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3"+ + "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4"+ + "\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5"+ + "\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7"+ + "\u0003\u00c7\u0a11\b\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ + "\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca"+ + "\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cc\u0001\u00cc\u0001\u00cc"+ + "\u0001\u00cd\u0004\u00cd\u0a24\b\u00cd\u000b\u00cd\f\u00cd\u0a25\u0001"+ + "\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00cf\u0001\u00cf\u0001"+ + "\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001"+ + "\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0004\u00d1\u0a39"+ + "\b\u00d1\u000b\u00d1\f\u00d1\u0a3a\u0001\u00d1\u0001\u00d1\u0001\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2\u0a43\b\u00d2\n\u00d2"+ + "\f\u00d2\u0a46\t\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ + "\u0005\u00d2\u0a4c\b\u00d2\n\u00d2\f\u00d2\u0a4f\t\u00d2\u0001\u00d2\u0001"+ + "\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001"+ + "\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001"+ + "\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001"+ + "\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001"+ + "\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001"+ + "\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9\u0a74\b\u00d9\u0001"+ + "\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001"+ + "\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001"+ + "\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001"+ + "\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001"+ + "\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a91\b\u00de\u0001\u00de\u0001"+ + "\u00de\u0001\u00de\u0004\u00de\u0a96\b\u00de\u000b\u00de\f\u00de\u0a97"+ + "\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8\u0ac8\b\u00e8"+ + "\u000b\u00e8\f\u00e8\u0ac9\u0001\u00e8\u0001\u00e8\u0001\u00e9\u0001\u00e9"+ + "\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ad2\b\u00e9\n\u00e9\f\u00e9\u0ad5"+ + "\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ + "\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001"+ + "\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001"+ + "\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0003"+ + "\u00ee\u0aee\b\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef\u0001\u00ef\u0001"+ + "\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001"+ + "\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2\u0001\u00f2\u0001"+ + "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001"+ + "\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001"+ + "\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001"+ + "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001"+ + "\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001"+ - "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001"+ - "\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ - "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ - "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001"+ - "\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ - "\u00ff\u0003\u0765\u0a37\u0ac6\u0000\u0100\u000e\u0000\u0010\u0000\u0012"+ - "\u0000\u0014\u0000\u0016\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e"+ - "\u001b \u001c\"\u001d$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/"+ - "H0J1L2N3P4R5T6V7X8Z9\\:^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082"+ - "M\u0084N\u0086O\u0088P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096"+ - "W\u0098X\u009aY\u009cZ\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aa"+ - "a\u00acb\u00aec\u00b0d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci"+ - "\u00bej\u00c0k\u00c2l\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0"+ - "\u00a4\u00d2r\u00d4s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0"+ - "\u0000\u00e2w\u00e4x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2"+ - "\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe"+ - "\u0000\u0100\u0000\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000"+ - "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f"+ - "\u0118\u00a6\u011a\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000"+ - "\u0124\u0000\u0126\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000"+ - "\u0130\u0000\u0132\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084"+ - "\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000"+ - "\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154"+ - "\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160"+ - "\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c"+ - "\u0087\u016e\u0088\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178"+ - "\u008a\u017a\u008b\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184"+ - "\u0000\u0186\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190"+ - "\u000f\u0192\u0090\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c"+ - "\u0011\u019e\u0000\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8"+ - "\u0094\u01aa\u0095\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4"+ - "\u0098\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0"+ - "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc"+ - "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8"+ - "\u0000\u01da\u009a\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4"+ - "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0"+ - "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ - "\u0000\u01fe\u0000\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208"+ - "\u00a0\u020a\u00a1\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005"+ - "\u0006\u0007\b\t\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006"+ - "\u0000-.0:AZ__az\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ_"+ - "_az\u0080\u8000\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000"+ - "FFff\u0002\u0000EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002"+ - "\u0000DDdd\u0002\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000"+ - "HHhh\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002"+ - "\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000"+ - "KKkk\u0002\u0000XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002"+ - "\u0000QQqq\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__a"+ - "z\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000"+ - "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ - "\u0000\"\"\\\\\u0001\u0000 \u0003\u0000\t\n\r\r \u0ba3\u0000\u001a\u0001"+ - "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ - "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ - "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ - "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ - "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ - "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ - "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ - "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ - "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ - "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ - "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ - "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ - "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ - "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ - "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ - "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ - "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ - "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ - "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ - "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ - "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ - "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ - "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ - "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ - "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ - "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ - "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ - "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ - "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ - "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ - "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ - "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ - "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ - "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ - "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ - "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ - "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ - "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ - "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ - "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ - "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ - "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ - "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ - "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ - "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ - "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ - "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ - "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ - "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ - "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ - "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ - "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001"+ - "\u010c\u0001\u0000\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001"+ - "\u0110\u0001\u0000\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001"+ - "\u0114\u0001\u0000\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001"+ - "\u0118\u0001\u0000\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001"+ - "\u011c\u0001\u0000\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001"+ - "\u0120\u0001\u0000\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002"+ - "\u0124\u0001\u0000\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002"+ - "\u0128\u0001\u0000\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002"+ - "\u012c\u0001\u0000\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002"+ - "\u0130\u0001\u0000\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002"+ - "\u0134\u0001\u0000\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003"+ - "\u0138\u0001\u0000\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003"+ - "\u013c\u0001\u0000\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003"+ - "\u0140\u0001\u0000\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004"+ - "\u0144\u0001\u0000\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004"+ - "\u0148\u0001\u0000\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004"+ - "\u014c\u0001\u0000\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005"+ - "\u0150\u0001\u0000\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005"+ - "\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006"+ - "\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006"+ - "\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006"+ - "\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006"+ - "\u0164\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006"+ - "\u0168\u0001\u0000\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006"+ - "\u016c\u0001\u0000\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006"+ - "\u0170\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007"+ - "\u0174\u0001\u0000\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178"+ - "\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001"+ - "\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000"+ - "\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000"+ - "\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000"+ - "\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e"+ - "\u0001\u0000\u0000\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001"+ - "\u0000\u0000\u0000\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000"+ - "\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000"+ - "\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000"+ - "\t\u01a0\u0001\u0000\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4"+ - "\u0001\u0000\u0000\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001"+ - "\u0000\u0000\u0000\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000"+ - "\u0000\u0000\t\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000"+ - "\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000"+ - "\n\u01b6\u0001\u0000\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba"+ - "\u0001\u0000\u0000\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001"+ - "\u0000\u0000\u0000\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000"+ - "\u0000\u0000\n\u01c4\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000"+ - "\u0000\n\u01c8\u0001\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000"+ - "\n\u01cc\u0001\u0000\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0"+ - "\u0001\u0000\u0000\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001"+ - "\u0000\u0000\u0000\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000"+ - "\u0000\u0000\n\u01da\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000"+ - "\u0000\u000b\u01de\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000"+ - "\u0000\u000b\u01e2\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000"+ - "\u0000\u000b\u01e6\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000"+ - "\u0000\u000b\u01ea\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000"+ - "\u0000\u000b\u01ee\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000"+ - "\u0000\u000b\u01f2\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000"+ - "\u0000\u000b\u01f6\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000"+ - "\u0000\u000b\u01fa\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000"+ - "\u0000\f\u01fe\u0001\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000"+ - "\f\u0202\u0001\u0000\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206"+ - "\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001"+ - "\u0000\u0000\u0000\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000"+ - "\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000"+ - "\u0000\u0000\u0014\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000"+ - "\u0000\u0000\u0018\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000"+ - "\u0000\u0000\u001c\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000"+ - "\u0000\u0000 \u0294\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000"+ - "\u0000$\u02a5\u0001\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000("+ - "\u02b6\u0001\u0000\u0000\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001"+ - "\u0000\u0000\u0000.\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000"+ - "\u00002\u02fa\u0001\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006"+ - "\u0311\u0001\u0000\u0000\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001"+ - "\u0000\u0000\u0000<\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000"+ - "\u0000@\u0340\u0001\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D"+ - "\u0353\u0001\u0000\u0000\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001"+ - "\u0000\u0000\u0000J\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000"+ - "\u0000N\u0396\u0001\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R"+ - "\u03af\u0001\u0000\u0000\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001"+ - "\u0000\u0000\u0000X\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000"+ - "\u0000\\\u03e1\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000"+ - "`\u03ff\u0001\u0000\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410"+ - "\u0001\u0000\u0000\u0000f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000"+ - "\u0000\u0000j\u0427\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000"+ - "n\u0435\u0001\u0000\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447"+ - "\u0001\u0000\u0000\u0000t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000"+ - "\u0000\u0000x\u0462\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000"+ - "|\u0479\u0001\u0000\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491"+ - "\u0001\u0000\u0000\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6"+ - "\u0001\u0000\u0000\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf"+ - "\u0001\u0000\u0000\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf"+ - "\u0001\u0000\u0000\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2"+ - "\u0001\u0000\u0000\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd"+ - "\u0001\u0000\u0000\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517"+ - "\u0001\u0000\u0000\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e"+ - "\u0001\u0000\u0000\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550"+ - "\u0001\u0000\u0000\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569"+ - "\u0001\u0000\u0000\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2"+ - "\u0001\u0000\u0000\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6"+ - "\u0001\u0000\u0000\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce"+ - "\u0001\u0000\u0000\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd"+ - "\u0001\u0000\u0000\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4"+ - "\u0001\u0000\u0000\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609"+ - "\u0001\u0000\u0000\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655"+ - "\u0001\u0000\u0000\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f"+ - "\u0001\u0000\u0000\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679"+ - "\u0001\u0000\u0000\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682"+ - "\u0001\u0000\u0000\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c"+ - "\u0001\u0000\u0000\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d"+ - "\u0001\u0000\u0000\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb"+ - "\u0001\u0000\u0000\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de"+ - "\u0001\u0000\u0000\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb"+ - "\u0001\u0000\u0000\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703"+ - "\u0001\u0000\u0000\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732"+ - "\u0001\u0000\u0000\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741"+ - "\u0001\u0000\u0000\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749"+ - "\u0001\u0000\u0000\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757"+ - "\u0001\u0000\u0000\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760"+ - "\u0001\u0000\u0000\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775"+ - "\u0001\u0000\u0000\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793"+ - "\u0001\u0000\u0000\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797"+ - "\u0001\u0000\u0000\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5"+ - "\u0001\u0000\u0000\u0000\u010a\u088e\u0001\u0000\u0000\u0000\u010c\u0892"+ - "\u0001\u0000\u0000\u0000\u010e\u0896\u0001\u0000\u0000\u0000\u0110\u089b"+ - "\u0001\u0000\u0000\u0000\u0112\u08a6\u0001\u0000\u0000\u0000\u0114\u08aa"+ - "\u0001\u0000\u0000\u0000\u0116\u08af\u0001\u0000\u0000\u0000\u0118\u08b4"+ - "\u0001\u0000\u0000\u0000\u011a\u08b8\u0001\u0000\u0000\u0000\u011c\u08bc"+ - "\u0001\u0000\u0000\u0000\u011e\u08c1\u0001\u0000\u0000\u0000\u0120\u08c5"+ - "\u0001\u0000\u0000\u0000\u0122\u08ca\u0001\u0000\u0000\u0000\u0124\u08ce"+ - "\u0001\u0000\u0000\u0000\u0126\u08d3\u0001\u0000\u0000\u0000\u0128\u08de"+ - "\u0001\u0000\u0000\u0000\u012a\u08e2\u0001\u0000\u0000\u0000\u012c\u08e7"+ - "\u0001\u0000\u0000\u0000\u012e\u08ed\u0001\u0000\u0000\u0000\u0130\u08f1"+ - "\u0001\u0000\u0000\u0000\u0132\u08f5\u0001\u0000\u0000\u0000\u0134\u08fa"+ - "\u0001\u0000\u0000\u0000\u0136\u08fe\u0001\u0000\u0000\u0000\u0138\u0904"+ - "\u0001\u0000\u0000\u0000\u013a\u090e\u0001\u0000\u0000\u0000\u013c\u0914"+ - "\u0001\u0000\u0000\u0000\u013e\u0919\u0001\u0000\u0000\u0000\u0140\u091f"+ - "\u0001\u0000\u0000\u0000\u0142\u0924\u0001\u0000\u0000\u0000\u0144\u092a"+ - "\u0001\u0000\u0000\u0000\u0146\u0931\u0001\u0000\u0000\u0000\u0148\u0937"+ - "\u0001\u0000\u0000\u0000\u014a\u093d\u0001\u0000\u0000\u0000\u014c\u0943"+ - "\u0001\u0000\u0000\u0000\u014e\u0947\u0001\u0000\u0000\u0000\u0150\u094d"+ - "\u0001\u0000\u0000\u0000\u0152\u0953\u0001\u0000\u0000\u0000\u0154\u0958"+ - "\u0001\u0000\u0000\u0000\u0156\u095d\u0001\u0000\u0000\u0000\u0158\u0962"+ - "\u0001\u0000\u0000\u0000\u015a\u0967\u0001\u0000\u0000\u0000\u015c\u096c"+ - "\u0001\u0000\u0000\u0000\u015e\u0973\u0001\u0000\u0000\u0000\u0160\u0975"+ - "\u0001\u0000\u0000\u0000\u0162\u0979\u0001\u0000\u0000\u0000\u0164\u097e"+ - "\u0001\u0000\u0000\u0000\u0166\u0989\u0001\u0000\u0000\u0000\u0168\u098d"+ - "\u0001\u0000\u0000\u0000\u016a\u0992\u0001\u0000\u0000\u0000\u016c\u0997"+ - "\u0001\u0000\u0000\u0000\u016e\u099a\u0001\u0000\u0000\u0000\u0170\u099e"+ - "\u0001\u0000\u0000\u0000\u0172\u09a4\u0001\u0000\u0000\u0000\u0174\u09aa"+ - "\u0001\u0000\u0000\u0000\u0176\u09b0\u0001\u0000\u0000\u0000\u0178\u09b6"+ - "\u0001\u0000\u0000\u0000\u017a\u09bc\u0001\u0000\u0000\u0000\u017c\u09bf"+ - "\u0001\u0000\u0000\u0000\u017e\u09c2\u0001\u0000\u0000\u0000\u0180\u09c5"+ - "\u0001\u0000\u0000\u0000\u0182\u09c9\u0001\u0000\u0000\u0000\u0184\u09cc"+ - "\u0001\u0000\u0000\u0000\u0186\u09d3\u0001\u0000\u0000\u0000\u0188\u09d7"+ - "\u0001\u0000\u0000\u0000\u018a\u09dc\u0001\u0000\u0000\u0000\u018c\u09e0"+ - "\u0001\u0000\u0000\u0000\u018e\u09e5\u0001\u0000\u0000\u0000\u0190\u09e9"+ - "\u0001\u0000\u0000\u0000\u0192\u09ec\u0001\u0000\u0000\u0000\u0194\u09ef"+ - "\u0001\u0000\u0000\u0000\u0196\u09f4\u0001\u0000\u0000\u0000\u0198\u09f9"+ - "\u0001\u0000\u0000\u0000\u019a\u09fe\u0001\u0000\u0000\u0000\u019c\u0a03"+ - "\u0001\u0000\u0000\u0000\u019e\u0a05\u0001\u0000\u0000\u0000\u01a0\u0a09"+ - "\u0001\u0000\u0000\u0000\u01a2\u0a0c\u0001\u0000\u0000\u0000\u01a4\u0a10"+ - "\u0001\u0000\u0000\u0000\u01a6\u0a12\u0001\u0000\u0000\u0000\u01a8\u0a16"+ - "\u0001\u0000\u0000\u0000\u01aa\u0a1c\u0001\u0000\u0000\u0000\u01ac\u0a1e"+ - "\u0001\u0000\u0000\u0000\u01ae\u0a22\u0001\u0000\u0000\u0000\u01b0\u0a27"+ - "\u0001\u0000\u0000\u0000\u01b2\u0a31\u0001\u0000\u0000\u0000\u01b4\u0a45"+ - "\u0001\u0000\u0000\u0000\u01b6\u0a4f\u0001\u0000\u0000\u0000\u01b8\u0a54"+ - "\u0001\u0000\u0000\u0000\u01ba\u0a58\u0001\u0000\u0000\u0000\u01bc\u0a5c"+ - "\u0001\u0000\u0000\u0000\u01be\u0a60\u0001\u0000\u0000\u0000\u01c0\u0a66"+ - "\u0001\u0000\u0000\u0000\u01c2\u0a6a\u0001\u0000\u0000\u0000\u01c4\u0a6e"+ - "\u0001\u0000\u0000\u0000\u01c6\u0a76\u0001\u0000\u0000\u0000\u01c8\u0a7e"+ - "\u0001\u0000\u0000\u0000\u01ca\u0a83\u0001\u0000\u0000\u0000\u01cc\u0a8e"+ - "\u0001\u0000\u0000\u0000\u01ce\u0a93\u0001\u0000\u0000\u0000\u01d0\u0a97"+ - "\u0001\u0000\u0000\u0000\u01d2\u0a9c\u0001\u0000\u0000\u0000\u01d4\u0aa0"+ - "\u0001\u0000\u0000\u0000\u01d6\u0aa4\u0001\u0000\u0000\u0000\u01d8\u0aa8"+ - "\u0001\u0000\u0000\u0000\u01da\u0aad\u0001\u0000\u0000\u0000\u01dc\u0ab1"+ - "\u0001\u0000\u0000\u0000\u01de\u0ab6\u0001\u0000\u0000\u0000\u01e0\u0ac0"+ - "\u0001\u0000\u0000\u0000\u01e2\u0ace\u0001\u0000\u0000\u0000\u01e4\u0ad2"+ - "\u0001\u0000\u0000\u0000\u01e6\u0ad6\u0001\u0000\u0000\u0000\u01e8\u0ada"+ - "\u0001\u0000\u0000\u0000\u01ea\u0ae0\u0001\u0000\u0000\u0000\u01ec\u0ae4"+ - "\u0001\u0000\u0000\u0000\u01ee\u0ae8\u0001\u0000\u0000\u0000\u01f0\u0aec"+ - "\u0001\u0000\u0000\u0000\u01f2\u0af0\u0001\u0000\u0000\u0000\u01f4\u0af5"+ - "\u0001\u0000\u0000\u0000\u01f6\u0afa\u0001\u0000\u0000\u0000\u01f8\u0afe"+ - "\u0001\u0000\u0000\u0000\u01fa\u0b02\u0001\u0000\u0000\u0000\u01fc\u0b07"+ - "\u0001\u0000\u0000\u0000\u01fe\u0b0b\u0001\u0000\u0000\u0000\u0200\u0b1b"+ - "\u0001\u0000\u0000\u0000\u0202\u0b20\u0001\u0000\u0000\u0000\u0204\u0b25"+ - "\u0001\u0000\u0000\u0000\u0206\u0b29\u0001\u0000\u0000\u0000\u0208\u0b31"+ - "\u0001\u0000\u0000\u0000\u020a\u0b36\u0001\u0000\u0000\u0000\u020c\u0b3a"+ - "\u0001\u0000\u0000\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211"+ - "\u0007\u0001\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214"+ - "\u0001\u0000\u0000\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213"+ - "\u0001\u0000\u0000\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212"+ - "\u0001\u0000\u0000\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215"+ - "\u0001\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218"+ - "\u0001\u0000\u0000\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b"+ - "\u0007\u0003\u0000\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e"+ - "\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d"+ - "\u0001\u0000\u0000\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c"+ - "\u0001\u0000\u0000\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216"+ - "\u0001\u0000\u0000\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011"+ - "\u0001\u0000\u0000\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005"+ - "(\u0000\u0000\u0224\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000"+ - "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ - "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000"+ - "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000"+ - "\u022b\u022d\u0005 \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ - "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ - "\u022f\u0001\u0000\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230"+ - "\u022e\u0001\u0000\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a"+ - "\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232"+ - "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a"+ - "\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239"+ - "\u0005 \u0000\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001"+ - "\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ - "\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ - "\u0000\u0000\u0000\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000"+ - "\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000"+ - "\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ - "\u0000\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ - "\u0000\u0244\u0245\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000"+ - "\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ - "\u0247\u0013\u0001\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000"+ - "\u0249\u0253\u0003\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b"+ - "\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d"+ - "\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e"+ - "\u0250\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250"+ - "\u0252\u0003\u0010\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252"+ - "\u0255\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253"+ - "\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255"+ - "\u0253\u0001\u0000\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257"+ - "\u026a\u0001\u0000\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263"+ - "\u0003\u0010\u0001\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001"+ - "\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001"+ - "\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001"+ - "\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003"+ - "\u0010\u0001\u0000\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001"+ - "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ - "\u0000\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ - "\u0000\u0000\u0000\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005"+ - "\"\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000"+ - "\u0000\u0000\u0269\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000"+ - "\u0000\u0000\u026b\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000"+ - "\u026d\u026e\u0003\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f"+ - "\u0271\u0001\u0000\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270"+ - "\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272"+ - "\u0273\u0005]\u0000\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275"+ - "\u0005\"\u0000\u0000\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005"+ - "\"\u0000\u0000\u0277\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004"+ - "\u0000\u0000\u0279\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000"+ - "\u0000\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000"+ - "\u0000\u027c\u0278\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000"+ - "\u0000\u027e\u027f\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000"+ - "\u0280\u0281\u0007\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000"+ - "\u0282\u0283\u0006\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000"+ - "\u0284\u0285\u0005@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286"+ - "\u0287\u0007\b\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289"+ - "\u0007\u0007\u0000\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b"+ - "\u0007\u0006\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+ - "\u0006\u0007\u0000\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f"+ - "\u0005@\u0000\u0000\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007"+ - "\b\u0000\u0000\u0291\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007"+ - "\u0000\u0000\u0293\u001f\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000"+ - "\u0000\u0295\u0296\u0007\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000"+ - "\u0297\u0298\u0007\u000b\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000"+ - "\u0299\u029a\u0007\u0006\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b"+ - "\u029c\u0005@\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e"+ - "\u0007\f\u0000\u0000\u029e\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007"+ - "\r\u0000\u0000\u02a0\u02a1\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f"+ - "\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001"+ - "\u0000\u02a4#\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6"+ - "\u02a7\u0007\u000e\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8"+ - "\u02a9\u0007\t\u0000\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab"+ - "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001"+ - "\u0000\u0000\u0000\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b"+ - "\u0000\u0000\u02af\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006"+ - "\u0000\u0000\u02b1\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011"+ - "\u0000\u0000\u02b3\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000"+ - "\u0000\u02b5\'\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000"+ - "\u02b7\u02b8\u0007\u0007\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9"+ - "\u02ba\u0007\u000b\u0000\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc"+ - "\u0007\f\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007"+ - "\r\u0000\u0000\u02be\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f"+ - "\u0000\u0000\u02c0)\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000"+ - "\u02c2\u02c3\u0007\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000"+ - "\u02c4\u02c5\u0007\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6"+ - "\u02c7\u0007\u0014\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8"+ - "\u02c9\u0006\u000e\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb"+ - "\u0005@\u0000\u0000\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007"+ - "\n\u0000\u0000\u02cd\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007"+ - "\u0000\u0000\u02cf\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013"+ - "\u0000\u0000\u02d1\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000"+ - "\u0000\u02d3-\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5"+ - "\u02d6\u0007\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8"+ - "\u0007\b\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007"+ - "\t\u0000\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000"+ - "\u0000\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000"+ - "\u02de\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0"+ - "\u02e2\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db"+ - "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4"+ - "\u0006\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ - "@\u0000\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n"+ - "\u0000\u0000\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011"+ - "\u0000\u0000\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000"+ - "\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000"+ - "\u02ee\u02f9\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0"+ - "\u02f1\u0007\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3"+ - "\u0007\u000b\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5"+ - "\u0007\t\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007"+ - "\u0007\u0000\u0000\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000"+ - "\u0000\u0000\u02f8\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000"+ - "\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000"+ - "\u02fc\u02fd\u0007\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000"+ - "\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000"+ - "\u0300\u0301\u0007\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000"+ - "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000"+ - "\u03043\u0001\u0000\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307"+ - "\u0007\u0007\u0000\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007"+ - "\u000b\u0000\u0000\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007"+ - "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ - "\u0007\u0000\u0000\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007"+ - "\u000e\u0000\u0000\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000"+ - "\u0000\u0000\u0311\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000"+ - "\u0000\u0313\u0314\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000"+ - "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001"+ - "\u0000\u03177\u0001\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319"+ - "\u031a\u0007\u0007\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c"+ - "\u0007\u000b\u0000\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e"+ - "\u0007\u0015\u0000\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001"+ - "\u0000\u0000\u0000\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006"+ - "\u0000\u0000\u0322\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016"+ - "\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000"+ - "\u0000\u0326\u0327\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000"+ - "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000"+ - "\u032a;\u0001\u0000\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d"+ - "\u0007\u0007\u0000\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007"+ - "\u000b\u0000\u0000\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007"+ - "\u0015\u0000\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007"+ - "\u0007\u0000\u0000\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t"+ - "\u0000\u0000\u0335\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000"+ - "\u0000\u0337\u0338\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000"+ - "\u0339\u033a\u0007\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000"+ - "\u033b\u033c\u0007\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d"+ - "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f"+ - "?\u0001\u0000\u0000\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007"+ - "\u0007\u0000\u0000\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b"+ - "\u0000\u0000\u0344\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000"+ - "\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000"+ - "\u0348\u0349\u0007\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a"+ - "\u034b\u0005@\u0000\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d"+ - "\u0007\u0016\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ - "\u0007\u0010\u0000\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351"+ - "\u0001\u0000\u0000\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001"+ - "\u0000\u0000\u0000\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e"+ - "\u0000\u0000\u0355\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000"+ - "\u0000\u0357\u0358\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000"+ - "\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b"+ - "\u035c\u0007\u0007\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d"+ - "\u035e\u0006\u001b\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360"+ - "\u0005@\u0000\u0000\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007"+ - "\n\u0000\u0000\u0362\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b"+ - "\u0000\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b"+ - "\u0000\u0000\u0366\u0367\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000"+ - "\u0000\u0000\u0368\u0369\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000"+ - "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000"+ - "\u036c\u036d\u0007\n\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e"+ - "\u036f\u0007\b\u0000\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371"+ - "\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373"+ - "\u0007\u0005\u0000\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375"+ - "\u0001\u0000\u0000\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001"+ - "\u0000\u0000\u0000\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005"+ - "\u0000\u0000\u0379\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000"+ - "\u0000\u037b\u037c\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000"+ - "\u037d\u037e\u0007\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000"+ - "\u037f\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381"+ - "\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384"+ - "\u0001\u0000\u0000\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001"+ - "\u0000\u0000\u0000\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005"+ - "\u0000\u0000\u0388\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000"+ - "\u0000\u038a\u038b\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000"+ - "\u038c\u038d\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000"+ - "\u038e\u038f\u0007\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000"+ - "\u0390\u0391\u0007\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392"+ - "\u0393\u0007\r\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ - "\u0006\u001f\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ - "@\u0000\u0000\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n"+ - "\u0000\u0000\u0399\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000"+ - "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ - "\u0000\u039d\u039e\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ - "\u0000\u039f\u03a0\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000"+ - "\u03a1\u03a2\u0007\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3"+ - "\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6"+ - "\u0006 \u0003\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@"+ - "\u0000\u0000\u03a8\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010"+ - "\u0000\u0000\u03aa\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f"+ - "\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003"+ - "\u0000\u03aeQ\u0001\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0"+ - "\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2"+ - "\u03b3\u0007\r\u0000\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5"+ - "\u0007\n\u0000\u0000\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007"+ - "\t\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\""+ - "\u0003\u0000\u03b9S\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000"+ - "\u03bb\u03bc\u0007\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd"+ - "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001"+ - "\u0000\u0000\u0000\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a"+ - "\u0000\u0000\u03c2\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000"+ - "\u0000\u03c4\u03c5\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000"+ - "\u03c6\u03c7\u0006$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9"+ - "\u0005@\u0000\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007"+ - "\u0007\u0000\u0000\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007"+ - "\r\u0000\u0000\u03cd\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015"+ - "\u0000\u0000\u03cf\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000"+ - "\u0000\u03d1\u03d2\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3"+ - "\u03d4\u0005@\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6"+ - "\u0007\u0010\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007"+ - "\t\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e"+ - "\u0000\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000"+ - "\u0000\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000"+ - "\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0"+ - "[\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007"+ - "\t\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001"+ + "\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa\u0001"+ + "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001"+ + "\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ + "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001"+ + "\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001"+ + "\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0003\u0765\u0a44"+ + "\u0ad3\u0000\u0100\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016"+ + "\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e\u001b \u001c\"\u001d"+ + "$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/H0J1L2N3P4R5T6V7X8Z9\\"+ + ":^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082M\u0084N\u0086O\u0088"+ + "P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096W\u0098X\u009aY\u009c"+ + "Z\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aaa\u00acb\u00aec\u00b0"+ + "d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci\u00bej\u00c0k\u00c2l"+ + "\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0\u00a4\u00d2r\u00d4"+ + "s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0\u0000\u00e2w\u00e4"+ + "x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2\u0000\u00f4\u0000"+ + "\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe\u0000\u0100\u0000"+ + "\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000\u010c\u0000\u010e"+ + "\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f\u0118\u00a6\u011a"+ + "\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000\u0124\u0000\u0126"+ + "\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000\u0130\u0000\u0132"+ + "\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084\u013c\u0000\u013e"+ + "\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a"+ + "\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154\u0000\u0156\u0000"+ + "\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160\u0000\u0162\u0000"+ + "\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c\u0087\u016e\u0088"+ + "\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178\u008a\u017a\u008b"+ + "\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184\u0000\u0186\u0000"+ + "\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190\u000f\u0192\u0090"+ + "\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c\u0011\u019e\u0000"+ + "\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8\u0094\u01aa\u0095"+ + "\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4\u0098\u01b6\u0000"+ + "\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0\u0000\u01c2\u0000"+ + "\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc\u0000\u01ce\u0000"+ + "\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8\u0000\u01da\u009a"+ + "\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4\u0000\u01e6\u0000"+ + "\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0\u0000\u01f2\u0000"+ + "\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc\u0000\u01fe\u0000"+ + "\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208\u00a0\u020a\u00a1"+ + "\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ + "\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000-.0:AZ__a"+ + "z\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ__az\u0080\u8000"+ + "\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ + "EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002\u0000DDdd\u0002"+ + "\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000"+ + "AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002\u0000YYyy\u0002"+ + "\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000"+ + "XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002\u0000QQqq\u0003"+ + "\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__az\u0080\u8000\ufffe"+ + "\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000"+ + "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0001"+ + "\u0000 \u0003\u0000\t\n\r\r \u0bac\u0000\u001a\u0001\u0000\u0000\u0000"+ + "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ + "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ + "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ + "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ + "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ + "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ + "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ + "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ + "@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001"+ + "\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000"+ + "\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000"+ + "N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001"+ + "\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000"+ + "\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000"+ + "\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001"+ + "\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000"+ + "\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000"+ + "j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001"+ + "\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000"+ + "\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000"+ + "x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001"+ + "\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000"+ + "\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000"+ + "\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000"+ + "\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000"+ + "\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000"+ + "\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000"+ + "\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000"+ + "\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000"+ + "\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000"+ + "\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000"+ + "\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000"+ + "\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000"+ + "\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000"+ + "\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000"+ + "\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000"+ + "\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000"+ + "\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000"+ + "\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000"+ + "\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000"+ + "\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000"+ + "\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000"+ + "\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000"+ + "\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000"+ + "\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000"+ + "\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000"+ + "\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000"+ + "\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000"+ + "\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000"+ + "\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000"+ + "\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000"+ + "\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001\u010c\u0001\u0000"+ + "\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001\u0110\u0001\u0000"+ + "\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001\u0114\u0001\u0000"+ + "\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001\u0118\u0001\u0000"+ + "\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001\u011c\u0001\u0000"+ + "\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001\u0120\u0001\u0000"+ + "\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002\u0124\u0001\u0000"+ + "\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002\u0128\u0001\u0000"+ + "\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002\u012c\u0001\u0000"+ + "\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002\u0130\u0001\u0000"+ + "\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002\u0134\u0001\u0000"+ + "\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003\u0138\u0001\u0000"+ + "\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003\u013c\u0001\u0000"+ + "\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003\u0140\u0001\u0000"+ + "\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004\u0144\u0001\u0000"+ + "\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004\u0148\u0001\u0000"+ + "\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004\u014c\u0001\u0000"+ + "\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005\u0150\u0001\u0000"+ + "\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005\u0154\u0001\u0000"+ + "\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006\u0158\u0001\u0000"+ + "\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006\u015c\u0001\u0000"+ + "\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006\u0160\u0001\u0000"+ + "\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006\u0164\u0001\u0000"+ + "\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006\u0168\u0001\u0000"+ + "\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006\u016c\u0001\u0000"+ + "\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006\u0170\u0001\u0000"+ + "\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007\u0174\u0001\u0000"+ + "\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178\u0001\u0000\u0000"+ + "\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001\u0000\u0000\u0000"+ + "\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000\u0000\u0000\b\u0182"+ + "\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000\u0000\b\u0186\u0001"+ + "\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000\b\u018a\u0001\u0000"+ + "\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e\u0001\u0000\u0000"+ + "\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001\u0000\u0000\u0000"+ + "\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000\u0000\u0000\t\u0198"+ + "\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000\u0000\t\u019c\u0001"+ + "\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000\t\u01a0\u0001\u0000"+ + "\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4\u0001\u0000\u0000"+ + "\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001\u0000\u0000\u0000"+ + "\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000\u0000\u0000\t\u01ae"+ + "\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000\u0000\n\u01b2\u0001"+ + "\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000\n\u01b6\u0001\u0000"+ + "\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba\u0001\u0000\u0000"+ + "\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001\u0000\u0000\u0000"+ + "\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000\u0000\u0000\n\u01c4"+ + "\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000\u0000\n\u01c8\u0001"+ + "\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000\n\u01cc\u0001\u0000"+ + "\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0\u0001\u0000\u0000"+ + "\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001\u0000\u0000\u0000"+ + "\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000\u0000\u0000\n\u01da"+ + "\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000\u0000\u000b\u01de"+ + "\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000\u0000\u000b\u01e2"+ + "\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000\u0000\u000b\u01e6"+ + "\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000\u0000\u000b\u01ea"+ + "\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000\u0000\u000b\u01ee"+ + "\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000\u0000\u000b\u01f2"+ + "\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000\u0000\u000b\u01f6"+ + "\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000\u0000\u000b\u01fa"+ + "\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000\u0000\f\u01fe\u0001"+ + "\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000\f\u0202\u0001\u0000"+ + "\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206\u0001\u0000\u0000"+ + "\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001\u0000\u0000\u0000"+ + "\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000\u0000\u0000\u0010"+ + "\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000\u0000\u0000\u0014"+ + "\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000\u0000\u0000\u0018"+ + "\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000\u0000\u0000\u001c"+ + "\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000\u0000\u0000 \u0294"+ + "\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000\u0000$\u02a5\u0001"+ + "\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000(\u02b6\u0001\u0000\u0000"+ + "\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001\u0000\u0000\u0000."+ + "\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000\u00002\u02fa\u0001"+ + "\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006\u0311\u0001\u0000\u0000"+ + "\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001\u0000\u0000\u0000<"+ + "\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000\u0000@\u0340\u0001"+ + "\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D\u0353\u0001\u0000\u0000"+ + "\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001\u0000\u0000\u0000J"+ + "\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000\u0000N\u0396\u0001"+ + "\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R\u03af\u0001\u0000\u0000"+ + "\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001\u0000\u0000\u0000X"+ + "\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000\u0000\\\u03e1"+ + "\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000`\u03ff\u0001\u0000"+ + "\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410\u0001\u0000\u0000\u0000"+ + "f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000\u0000\u0000j\u0427"+ + "\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000n\u0435\u0001\u0000"+ + "\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447\u0001\u0000\u0000\u0000"+ + "t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000\u0000\u0000x\u0462"+ + "\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000|\u0479\u0001\u0000"+ + "\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491\u0001\u0000\u0000"+ + "\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6\u0001\u0000\u0000"+ + "\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf\u0001\u0000\u0000"+ + "\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf\u0001\u0000\u0000"+ + "\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2\u0001\u0000\u0000"+ + "\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd\u0001\u0000\u0000"+ + "\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517\u0001\u0000\u0000"+ + "\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e\u0001\u0000\u0000"+ + "\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550\u0001\u0000\u0000"+ + "\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569\u0001\u0000\u0000"+ + "\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2\u0001\u0000\u0000"+ + "\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6\u0001\u0000\u0000"+ + "\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce\u0001\u0000\u0000"+ + "\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd\u0001\u0000\u0000"+ + "\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4\u0001\u0000\u0000"+ + "\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609\u0001\u0000\u0000"+ + "\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655\u0001\u0000\u0000"+ + "\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f\u0001\u0000\u0000"+ + "\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679\u0001\u0000\u0000"+ + "\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682\u0001\u0000\u0000"+ + "\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c\u0001\u0000\u0000"+ + "\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d\u0001\u0000\u0000"+ + "\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb\u0001\u0000\u0000"+ + "\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de\u0001\u0000\u0000"+ + "\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb\u0001\u0000\u0000"+ + "\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703\u0001\u0000\u0000"+ + "\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732\u0001\u0000\u0000"+ + "\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741\u0001\u0000\u0000"+ + "\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749\u0001\u0000\u0000"+ + "\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757\u0001\u0000\u0000"+ + "\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760\u0001\u0000\u0000"+ + "\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775\u0001\u0000\u0000"+ + "\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793\u0001\u0000\u0000"+ + "\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797\u0001\u0000\u0000"+ + "\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5\u0001\u0000\u0000"+ + "\u0000\u010a\u089b\u0001\u0000\u0000\u0000\u010c\u089f\u0001\u0000\u0000"+ + "\u0000\u010e\u08a3\u0001\u0000\u0000\u0000\u0110\u08a8\u0001\u0000\u0000"+ + "\u0000\u0112\u08b3\u0001\u0000\u0000\u0000\u0114\u08b7\u0001\u0000\u0000"+ + "\u0000\u0116\u08bc\u0001\u0000\u0000\u0000\u0118\u08c1\u0001\u0000\u0000"+ + "\u0000\u011a\u08c5\u0001\u0000\u0000\u0000\u011c\u08c9\u0001\u0000\u0000"+ + "\u0000\u011e\u08ce\u0001\u0000\u0000\u0000\u0120\u08d2\u0001\u0000\u0000"+ + "\u0000\u0122\u08d7\u0001\u0000\u0000\u0000\u0124\u08db\u0001\u0000\u0000"+ + "\u0000\u0126\u08e0\u0001\u0000\u0000\u0000\u0128\u08eb\u0001\u0000\u0000"+ + "\u0000\u012a\u08ef\u0001\u0000\u0000\u0000\u012c\u08f4\u0001\u0000\u0000"+ + "\u0000\u012e\u08fa\u0001\u0000\u0000\u0000\u0130\u08fe\u0001\u0000\u0000"+ + "\u0000\u0132\u0902\u0001\u0000\u0000\u0000\u0134\u0907\u0001\u0000\u0000"+ + "\u0000\u0136\u090b\u0001\u0000\u0000\u0000\u0138\u0911\u0001\u0000\u0000"+ + "\u0000\u013a\u091b\u0001\u0000\u0000\u0000\u013c\u0921\u0001\u0000\u0000"+ + "\u0000\u013e\u0926\u0001\u0000\u0000\u0000\u0140\u092c\u0001\u0000\u0000"+ + "\u0000\u0142\u0931\u0001\u0000\u0000\u0000\u0144\u0937\u0001\u0000\u0000"+ + "\u0000\u0146\u093e\u0001\u0000\u0000\u0000\u0148\u0944\u0001\u0000\u0000"+ + "\u0000\u014a\u094a\u0001\u0000\u0000\u0000\u014c\u0950\u0001\u0000\u0000"+ + "\u0000\u014e\u0954\u0001\u0000\u0000\u0000\u0150\u095a\u0001\u0000\u0000"+ + "\u0000\u0152\u0960\u0001\u0000\u0000\u0000\u0154\u0965\u0001\u0000\u0000"+ + "\u0000\u0156\u096a\u0001\u0000\u0000\u0000\u0158\u096f\u0001\u0000\u0000"+ + "\u0000\u015a\u0974\u0001\u0000\u0000\u0000\u015c\u0979\u0001\u0000\u0000"+ + "\u0000\u015e\u0980\u0001\u0000\u0000\u0000\u0160\u0982\u0001\u0000\u0000"+ + "\u0000\u0162\u0986\u0001\u0000\u0000\u0000\u0164\u098b\u0001\u0000\u0000"+ + "\u0000\u0166\u0996\u0001\u0000\u0000\u0000\u0168\u099a\u0001\u0000\u0000"+ + "\u0000\u016a\u099f\u0001\u0000\u0000\u0000\u016c\u09a4\u0001\u0000\u0000"+ + "\u0000\u016e\u09a7\u0001\u0000\u0000\u0000\u0170\u09ab\u0001\u0000\u0000"+ + "\u0000\u0172\u09b1\u0001\u0000\u0000\u0000\u0174\u09b7\u0001\u0000\u0000"+ + "\u0000\u0176\u09bd\u0001\u0000\u0000\u0000\u0178\u09c3\u0001\u0000\u0000"+ + "\u0000\u017a\u09c9\u0001\u0000\u0000\u0000\u017c\u09cc\u0001\u0000\u0000"+ + "\u0000\u017e\u09cf\u0001\u0000\u0000\u0000\u0180\u09d2\u0001\u0000\u0000"+ + "\u0000\u0182\u09d6\u0001\u0000\u0000\u0000\u0184\u09d9\u0001\u0000\u0000"+ + "\u0000\u0186\u09e0\u0001\u0000\u0000\u0000\u0188\u09e4\u0001\u0000\u0000"+ + "\u0000\u018a\u09e9\u0001\u0000\u0000\u0000\u018c\u09ed\u0001\u0000\u0000"+ + "\u0000\u018e\u09f2\u0001\u0000\u0000\u0000\u0190\u09f6\u0001\u0000\u0000"+ + "\u0000\u0192\u09f9\u0001\u0000\u0000\u0000\u0194\u09fc\u0001\u0000\u0000"+ + "\u0000\u0196\u0a01\u0001\u0000\u0000\u0000\u0198\u0a06\u0001\u0000\u0000"+ + "\u0000\u019a\u0a0b\u0001\u0000\u0000\u0000\u019c\u0a10\u0001\u0000\u0000"+ + "\u0000\u019e\u0a12\u0001\u0000\u0000\u0000\u01a0\u0a16\u0001\u0000\u0000"+ + "\u0000\u01a2\u0a19\u0001\u0000\u0000\u0000\u01a4\u0a1d\u0001\u0000\u0000"+ + "\u0000\u01a6\u0a1f\u0001\u0000\u0000\u0000\u01a8\u0a23\u0001\u0000\u0000"+ + "\u0000\u01aa\u0a29\u0001\u0000\u0000\u0000\u01ac\u0a2b\u0001\u0000\u0000"+ + "\u0000\u01ae\u0a2f\u0001\u0000\u0000\u0000\u01b0\u0a34\u0001\u0000\u0000"+ + "\u0000\u01b2\u0a3e\u0001\u0000\u0000\u0000\u01b4\u0a52\u0001\u0000\u0000"+ + "\u0000\u01b6\u0a5c\u0001\u0000\u0000\u0000\u01b8\u0a61\u0001\u0000\u0000"+ + "\u0000\u01ba\u0a65\u0001\u0000\u0000\u0000\u01bc\u0a69\u0001\u0000\u0000"+ + "\u0000\u01be\u0a6d\u0001\u0000\u0000\u0000\u01c0\u0a73\u0001\u0000\u0000"+ + "\u0000\u01c2\u0a77\u0001\u0000\u0000\u0000\u01c4\u0a7b\u0001\u0000\u0000"+ + "\u0000\u01c6\u0a83\u0001\u0000\u0000\u0000\u01c8\u0a8b\u0001\u0000\u0000"+ + "\u0000\u01ca\u0a90\u0001\u0000\u0000\u0000\u01cc\u0a9b\u0001\u0000\u0000"+ + "\u0000\u01ce\u0aa0\u0001\u0000\u0000\u0000\u01d0\u0aa4\u0001\u0000\u0000"+ + "\u0000\u01d2\u0aa9\u0001\u0000\u0000\u0000\u01d4\u0aad\u0001\u0000\u0000"+ + "\u0000\u01d6\u0ab1\u0001\u0000\u0000\u0000\u01d8\u0ab5\u0001\u0000\u0000"+ + "\u0000\u01da\u0aba\u0001\u0000\u0000\u0000\u01dc\u0abe\u0001\u0000\u0000"+ + "\u0000\u01de\u0ac3\u0001\u0000\u0000\u0000\u01e0\u0acd\u0001\u0000\u0000"+ + "\u0000\u01e2\u0adb\u0001\u0000\u0000\u0000\u01e4\u0adf\u0001\u0000\u0000"+ + "\u0000\u01e6\u0ae3\u0001\u0000\u0000\u0000\u01e8\u0ae7\u0001\u0000\u0000"+ + "\u0000\u01ea\u0aed\u0001\u0000\u0000\u0000\u01ec\u0af1\u0001\u0000\u0000"+ + "\u0000\u01ee\u0af5\u0001\u0000\u0000\u0000\u01f0\u0af9\u0001\u0000\u0000"+ + "\u0000\u01f2\u0afd\u0001\u0000\u0000\u0000\u01f4\u0b02\u0001\u0000\u0000"+ + "\u0000\u01f6\u0b07\u0001\u0000\u0000\u0000\u01f8\u0b0b\u0001\u0000\u0000"+ + "\u0000\u01fa\u0b0f\u0001\u0000\u0000\u0000\u01fc\u0b14\u0001\u0000\u0000"+ + "\u0000\u01fe\u0b18\u0001\u0000\u0000\u0000\u0200\u0b28\u0001\u0000\u0000"+ + "\u0000\u0202\u0b2d\u0001\u0000\u0000\u0000\u0204\u0b32\u0001\u0000\u0000"+ + "\u0000\u0206\u0b36\u0001\u0000\u0000\u0000\u0208\u0b3e\u0001\u0000\u0000"+ + "\u0000\u020a\u0b43\u0001\u0000\u0000\u0000\u020c\u0b47\u0001\u0000\u0000"+ + "\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211\u0007\u0001\u0000"+ + "\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214\u0001\u0000\u0000"+ + "\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213\u0001\u0000\u0000"+ + "\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000\u0000"+ + "\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215\u0001\u0000\u0000"+ + "\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218\u0001\u0000\u0000"+ + "\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b\u0007\u0003\u0000"+ + "\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e\u0001\u0000\u0000"+ + "\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d\u0001\u0000\u0000"+ + "\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c\u0001\u0000\u0000"+ + "\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216\u0001\u0000\u0000"+ + "\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011\u0001\u0000\u0000"+ + "\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005(\u0000\u0000\u0224"+ + "\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000\u0000\u0226\u0229"+ + "\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228"+ + "\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000\u0000\u0229\u0227"+ + "\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000\u022b\u022d\u0005"+ + " \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001\u0000"+ + "\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001\u0000"+ + "\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ + "\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a\u0001\u0000\u0000"+ + "\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000\u0000"+ + "\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a\u0001\u0000\u0000"+ + "\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239\u0005 \u0000\u0000"+ + "\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000"+ + "\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000"+ + "\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001\u0000\u0000\u0000"+ + "\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000\u0000\u023f\u023e"+ + "\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000\u0000\u0241\u023f"+ + "\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000\u0000\u0242\u0246"+ + "\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0244\u0245"+ + "\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000\u0246\u0244\u0001"+ + "\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0013\u0001"+ + "\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000\u0249\u0253\u0003"+ + "\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b\u024a\u0001\u0000"+ + "\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d\u024b\u0001\u0000"+ + "\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e\u0250\u0001\u0000"+ + "\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250\u0252\u0003\u0010"+ + "\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252\u0255\u0001\u0000"+ + "\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000"+ + "\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255\u0253\u0001\u0000"+ + "\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257\u026a\u0001\u0000"+ + "\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263\u0003\u0010\u0001"+ + "\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ + "\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001\u0000\u0000\u0000"+ + "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001\u0000\u0000\u0000"+ + "\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003\u0010\u0001\u0000"+ + "\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001\u0000\u0000\u0000"+ + "\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000"+ + "\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001\u0000\u0000\u0000"+ + "\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005\"\u0000\u0000\u0268"+ + "\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000\u0000\u0000\u0269"+ + "\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000\u0000\u0000\u026b"+ + "\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000\u026d\u026e\u0003"+ + "\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f\u0271\u0001\u0000"+ + "\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270\u0271\u0001\u0000"+ + "\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0005]\u0000"+ + "\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275\u0005\"\u0000\u0000"+ + "\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005\"\u0000\u0000\u0277"+ + "\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279"+ + "\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000\u0000\u027b\u027d"+ + "\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000\u0000\u027c\u0278"+ + "\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000\u0000\u027e\u027f"+ + "\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000\u0280\u0281\u0007"+ + "\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282\u0283\u0006"+ + "\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000\u0284\u0285\u0005"+ + "@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286\u0287\u0007\b"+ + "\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289\u0007\u0007\u0000"+ + "\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b\u0007\u0006\u0000"+ + "\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d\u0006\u0007\u0000"+ + "\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f\u0005@\u0000\u0000"+ + "\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007\b\u0000\u0000\u0291"+ + "\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007\u0000\u0000\u0293\u001f"+ + "\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000\u0000\u0295\u0296\u0007"+ + "\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000\u0297\u0298\u0007\u000b"+ + "\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000\u0299\u029a\u0007\u0006"+ + "\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b\u029c\u0005@\u0000\u0000"+ + "\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e\u0007\f\u0000\u0000\u029e"+ + "\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007\r\u0000\u0000\u02a0\u02a1"+ + "\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f\u0000\u0000\u02a2\u02a3"+ + "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001\u0000\u02a4#\u0001"+ + "\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6\u02a7\u0007\u000e"+ + "\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8\u02a9\u0007\t\u0000"+ + "\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000"+ + "\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001\u0000\u0000\u0000"+ + "\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b\u0000\u0000\u02af"+ + "\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006\u0000\u0000\u02b1"+ + "\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011\u0000\u0000\u02b3"+ + "\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000\u0000\u02b5\'\u0001"+ + "\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000\u02b7\u02b8\u0007\u0007"+ + "\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9\u02ba\u0007\u000b\u0000"+ + "\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc\u0007\f\u0000\u0000"+ + "\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007\r\u0000\u0000\u02be"+ + "\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f\u0000\u0000\u02c0"+ + ")\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000\u02c2\u02c3\u0007"+ + "\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000\u02c4\u02c5\u0007"+ + "\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6\u02c7\u0007\u0014"+ + "\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c9\u0006\u000e"+ + "\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb\u0005@\u0000\u0000"+ + "\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007\n\u0000\u0000\u02cd"+ + "\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007\u0000\u0000\u02cf"+ + "\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013\u0000\u0000\u02d1"+ + "\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000\u0000\u02d3-"+ + "\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5\u02d6\u0007"+ + "\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8\u0007\b"+ + "\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007\t\u0000"+ + "\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000\u0000"+ + "\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000\u02de"+ + "\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0\u02e2"+ + "\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db\u0001"+ + "\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4\u0006"+ + "\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005@\u0000"+ + "\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n\u0000\u0000"+ + "\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011\u0000\u0000"+ + "\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000\u0000\u02ec"+ + "\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000\u02ee\u02f9"+ + "\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0\u02f1\u0007"+ + "\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3\u0007\u000b"+ + "\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5\u0007\t\u0000"+ + "\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007\u0007\u0000\u0000"+ + "\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000\u0000\u0000\u02f8"+ + "\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000\u0000\u02fa\u02fb"+ + "\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000\u02fc\u02fd\u0007"+ + "\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000\u02fe\u02ff\u0007"+ + "\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000\u0300\u0301\u0007"+ + "\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000\u0302\u0303\u0001"+ + "\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000\u03043\u0001\u0000"+ + "\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307\u0007\u0007\u0000"+ + "\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007\u000b\u0000\u0000"+ + "\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007\u0015\u0000\u0000"+ + "\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007\u0007\u0000\u0000"+ + "\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007\u000e\u0000\u0000"+ + "\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000\u0000\u0000\u0311"+ + "\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000\u0000\u0313\u0314"+ + "\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000\u0000\u0315\u0316"+ + "\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001\u0000\u03177\u0001"+ + "\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319\u031a\u0007\u0007"+ + "\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c\u0007\u000b\u0000"+ + "\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e\u0007\u0015\u0000"+ + "\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001\u0000\u0000\u0000"+ + "\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006\u0000\u0000\u0322"+ + "\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016\u0000\u0000\u0324"+ + "\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000\u0000\u0326\u0327"+ + "\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000\u0328\u0329\u0001"+ + "\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000\u032a;\u0001\u0000"+ + "\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d\u0007\u0007\u0000"+ + "\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007\u000b\u0000\u0000"+ + "\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007\u0015\u0000\u0000"+ + "\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007\u0007\u0000\u0000"+ + "\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t\u0000\u0000\u0335"+ + "\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000\u0000\u0337\u0338"+ + "\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000\u0339\u033a\u0007"+ + "\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000\u033b\u033c\u0007"+ + "\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d\u033e\u0001\u0000"+ + "\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f?\u0001\u0000\u0000"+ + "\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007\u0007\u0000\u0000"+ + "\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b\u0000\u0000\u0344"+ + "\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000\u0000\u0346\u0347"+ + "\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000\u0348\u0349\u0007"+ + "\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a\u034b\u0005@\u0000"+ + "\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d\u0007\u0016\u0000"+ + "\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f\u0007\u0010\u0000"+ + "\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351\u0001\u0000\u0000"+ + "\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001\u0000\u0000\u0000"+ + "\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e\u0000\u0000\u0355"+ + "\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000\u0000\u0357\u0358"+ + "\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000\u0359\u035a\u0007"+ + "\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b\u035c\u0007\u0007"+ + "\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0006\u001b"+ + "\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360\u0005@\u0000\u0000"+ + "\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007\n\u0000\u0000\u0362"+ + "\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b\u0000\u0000\u0364\u0365"+ + "\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b\u0000\u0000\u0366\u0367"+ + "\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368\u0369"+ + "\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000\u0000\u036a\u036b\u0005"+ + "@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000\u036c\u036d\u0007\n"+ + "\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e\u036f\u0007\b\u0000"+ + "\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371\u0007\u000b\u0000"+ + "\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373\u0007\u0005\u0000"+ + "\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375\u0001\u0000\u0000"+ + "\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001\u0000\u0000\u0000"+ + "\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005\u0000\u0000\u0379"+ + "\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000\u0000\u037b\u037c"+ + "\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000\u037d\u037e\u0007"+ + "\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000\u037f\u0380\u0007"+ + "\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381\u0382\u0007\u0007"+ + "\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384\u0001\u0000\u0000"+ + "\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001\u0000\u0000\u0000"+ + "\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005\u0000\u0000\u0388"+ + "\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000\u0000\u038a\u038b"+ + "\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000\u038c\u038d\u0007"+ + "\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000\u038e\u038f\u0007"+ + "\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000\u0390\u0391\u0007"+ + "\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392\u0393\u0007\r"+ + "\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395\u0006\u001f"+ + "\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005@\u0000\u0000"+ + "\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n\u0000\u0000\u0399"+ + "\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000\u0000\u039b\u039c"+ + "\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000\u0000\u039d\u039e"+ + "\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000\u0000\u039f\u03a0"+ + "\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000\u03a1\u03a2\u0007"+ + "\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3\u03a4\u0007\t"+ + "\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0006 \u0003"+ + "\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@\u0000\u0000\u03a8"+ + "\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010\u0000\u0000\u03aa"+ + "\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f\u0000\u0000\u03ac"+ + "\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003\u0000\u03aeQ\u0001"+ + "\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0\u03b1\u0007\u0007"+ + "\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2\u03b3\u0007\r\u0000"+ + "\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5\u0007\n\u0000\u0000"+ + "\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007\t\u0000\u0000\u03b7"+ + "\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\"\u0003\u0000\u03b9S"+ + "\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000\u03bb\u03bc\u0007"+ + "\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd\u03be\u0001\u0000"+ + "\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001\u0000\u0000\u0000"+ + "\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a\u0000\u0000\u03c2"+ + "\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000\u0000\u03c4\u03c5"+ + "\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006"+ + "$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005@\u0000"+ + "\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007\u0007\u0000\u0000"+ + "\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007\r\u0000\u0000\u03cd"+ + "\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015\u0000\u0000\u03cf"+ + "\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1\u03d2"+ + "\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005@"+ + "\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6\u0007\u0010"+ + "\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007\t\u0000"+ + "\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e\u0000"+ + "\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000\u0000"+ + "\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000\u03de"+ + "\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0[\u0001"+ + "\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007\t"+ + "\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ "\u0000\u0000\u03e5\u03e6\u0007\r\u0000\u0000\u03e6\u03e7\u0007\u0005\u0000"+ "\u0000\u03e7\u03e8\u0007\u0015\u0000\u0000\u03e8\u03e9\u0007\n\u0000\u0000"+ "\u03e9\u03ea\u0007\u0012\u0000\u0000\u03ea\u03eb\u0007\u0005\u0000\u0000"+ @@ -2100,13 +2103,13 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0001\u0000"+ "\u0000\u0000\u07ae\u07af\u0006}\t\u0000\u07af\u0109\u0001\u0000\u0000"+ "\u0000\u07b0\u07b1\u0005{\u0000\u0000\u07b1\u07b2\u0005{\u0000\u0000\u07b2"+ - "\u088f\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ + "\u089c\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ "@\u0000\u0000\u07b5\u07b7\u0001\u0000\u0000\u0000\u07b6\u07b8\u0005@\u0000"+ "\u0000\u07b7\u07b6\u0001\u0000\u0000\u0000\u07b7\u07b8\u0001\u0000\u0000"+ - "\u0000\u07b8\u088f\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ + "\u0000\u07b8\u089c\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ "\u07ba\u07bb\u0005{\u0000\u0000\u07bb\u07bd\u0001\u0000\u0000\u0000\u07bc"+ "\u07be\u0005{\u0000\u0000\u07bd\u07bc\u0001\u0000\u0000\u0000\u07bd\u07be"+ - "\u0001\u0000\u0000\u0000\u07be\u088f\u0001\u0000\u0000\u0000\u07bf\u07c0"+ + "\u0001\u0000\u0000\u0000\u07be\u089c\u0001\u0000\u0000\u0000\u07bf\u07c0"+ "\u0005@\u0000\u0000\u07c0\u07c1\u0007\u0012\u0000\u0000\u07c1\u07c2\u0007"+ "\u0007\u0000\u0000\u07c2\u07c3\u0007\u000b\u0000\u0000\u07c3\u07c4\u0007"+ "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c9\u0001"+ @@ -2115,475 +2118,477 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07cd\u0001\u0000"+ "\u0000\u0000\u07cb\u07c9\u0001\u0000\u0000\u0000\u07cc\u07ce\u0005(\u0000"+ "\u0000\u07cd\u07cc\u0001\u0000\u0000\u0000\u07cd\u07ce\u0001\u0000\u0000"+ - "\u0000\u07ce\u088f\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ + "\u0000\u07ce\u089c\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ "\u07d0\u07d1\u0007\u000e\u0000\u0000\u07d1\u07d2\u0007\u000f\u0000\u0000"+ "\u07d2\u07d3\u0007\u0010\u0000\u0000\u07d3\u07d4\u0007\u0016\u0000\u0000"+ "\u07d4\u07d5\u0007\t\u0000\u0000\u07d5\u07d6\u0007\u0007\u0000\u0000\u07d6"+ - "\u07d7\u0007\r\u0000\u0000\u07d7\u07db\u0001\u0000\u0000\u0000\u07d8\u07da"+ - "\u0007%\u0000\u0000\u07d9\u07d8\u0001\u0000\u0000\u0000\u07da\u07dd\u0001"+ - "\u0000\u0000\u0000\u07db\u07d9\u0001\u0000\u0000\u0000\u07db\u07dc\u0001"+ - "\u0000\u0000\u0000\u07dc\u088f\u0001\u0000\u0000\u0000\u07dd\u07db\u0001"+ - "\u0000\u0000\u0000\u07de\u07df\u0005@\u0000\u0000\u07df\u07e0\u0007\u0005"+ - "\u0000\u0000\u07e0\u07e1\u0007\u0012\u0000\u0000\u07e1\u07e2\u0007\u0013"+ - "\u0000\u0000\u07e2\u07e3\u0007\u0015\u0000\u0000\u07e3\u07e4\u0007\u0016"+ - "\u0000\u0000\u07e4\u07e5\u0007\r\u0000\u0000\u07e5\u07e9\u0001\u0000\u0000"+ - "\u0000\u07e6\u07e8\u0007%\u0000\u0000\u07e7\u07e6\u0001\u0000\u0000\u0000"+ - "\u07e8\u07eb\u0001\u0000\u0000\u0000\u07e9\u07e7\u0001\u0000\u0000\u0000"+ - "\u07e9\u07ea\u0001\u0000\u0000\u0000\u07ea\u088f\u0001\u0000\u0000\u0000"+ - "\u07eb\u07e9\u0001\u0000\u0000\u0000\u07ec\u07ed\u0005@\u0000\u0000\u07ed"+ - "\u07ee\u0007\n\u0000\u0000\u07ee\u07ef\u0007\u0010\u0000\u0000\u07ef\u07f0"+ - "\u0007\u0012\u0000\u0000\u07f0\u07f1\u0007\u0007\u0000\u0000\u07f1\u07f2"+ - "\u0007\t\u0000\u0000\u07f2\u07f3\u0007\u0013\u0000\u0000\u07f3\u07f4\u0007"+ - "\u0010\u0000\u0000\u07f4\u07f5\u0007\u000e\u0000\u0000\u07f5\u07f6\u0007"+ - "\u0007\u0000\u0000\u07f6\u07fa\u0001\u0000\u0000\u0000\u07f7\u07f9\u0007"+ - "%\u0000\u0000\u07f8\u07f7\u0001\u0000\u0000\u0000\u07f9\u07fc\u0001\u0000"+ - "\u0000\u0000\u07fa\u07f8\u0001\u0000\u0000\u0000\u07fa\u07fb\u0001\u0000"+ - "\u0000\u0000\u07fb\u088f\u0001\u0000\u0000\u0000\u07fc\u07fa\u0001\u0000"+ - "\u0000\u0000\u07fd\u07fe\u0005@\u0000\u0000\u07fe\u07ff\u0007\u000b\u0000"+ - "\u0000\u07ff\u0800\u0007\u0015\u0000\u0000\u0800\u0801\u0007\u000e\u0000"+ - "\u0000\u0801\u0802\u0007\u0011\u0000\u0000\u0802\u0803\u0007\u0012\u0000"+ - "\u0000\u0803\u0804\u0007\u0007\u0000\u0000\u0804\u0805\u0007\n\u0000\u0000"+ - "\u0805\u0806\u0007\r\u0000\u0000\u0806\u080a\u0001\u0000\u0000\u0000\u0807"+ - "\u0809\u0007%\u0000\u0000\u0808\u0807\u0001\u0000\u0000\u0000\u0809\u080c"+ - "\u0001\u0000\u0000\u0000\u080a\u0808\u0001\u0000\u0000\u0000\u080a\u080b"+ - "\u0001\u0000\u0000\u0000\u080b\u088f\u0001\u0000\u0000\u0000\u080c\u080a"+ - "\u0001\u0000\u0000\u0000\u080d\u080e\u0005@\u0000\u0000\u080e\u080f\u0007"+ - "\u0006\u0000\u0000\u080f\u0810\u0007\u0015\u0000\u0000\u0810\u0811\u0007"+ - "\n\u0000\u0000\u0811\u0812\u0007\r\u0000\u0000\u0812\u0813\u0005-\u0000"+ - "\u0000\u0813\u0814\u0007\u0006\u0000\u0000\u0814\u0815\u0007\u0010\u0000"+ - "\u0000\u0815\u0816\u0007\u000e\u0000\u0000\u0816\u0817\u0007\u0007\u0000"+ - "\u0000\u0817\u081b\u0001\u0000\u0000\u0000\u0818\u081a\u0007%\u0000\u0000"+ - "\u0819\u0818\u0001\u0000\u0000\u0000\u081a\u081d\u0001\u0000\u0000\u0000"+ - "\u081b\u0819\u0001\u0000\u0000\u0000\u081b\u081c\u0001\u0000\u0000\u0000"+ - "\u081c\u088f\u0001\u0000\u0000\u0000\u081d\u081b\u0001\u0000\u0000\u0000"+ - "\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0007\u0013\u0000\u0000\u0820"+ - "\u0821\u0007\u0010\u0000\u0000\u0821\u0822\u0007\u001b\u0000\u0000\u0822"+ - "\u0823\u0007\u0007\u0000\u0000\u0823\u0827\u0001\u0000\u0000\u0000\u0824"+ - "\u0826\u0007%\u0000\u0000\u0825\u0824\u0001\u0000\u0000\u0000\u0826\u0829"+ - "\u0001\u0000\u0000\u0000\u0827\u0825\u0001\u0000\u0000\u0000\u0827\u0828"+ - "\u0001\u0000\u0000\u0000\u0828\u088f\u0001\u0000\u0000\u0000\u0829\u0827"+ - "\u0001\u0000\u0000\u0000\u082a\u082b\u0005@\u0000\u0000\u082b\u082c\u0007"+ - "\t\u0000\u0000\u082c\u082d\u0007\u0011\u0000\u0000\u082d\u082e\u0007\u0013"+ - "\u0000\u0000\u082e\u082f\u0007\u0013\u0000\u0000\u082f\u0830\u0007\u0015"+ - "\u0000\u0000\u0830\u0831\u0007\u0016\u0000\u0000\u0831\u0832\u0007\r\u0000"+ - "\u0000\u0832\u0833\u0007\t\u0000\u0000\u0833\u0837\u0001\u0000\u0000\u0000"+ - "\u0834\u0836\u0007%\u0000\u0000\u0835\u0834\u0001\u0000\u0000\u0000\u0836"+ - "\u0839\u0001\u0000\u0000\u0000\u0837\u0835\u0001\u0000\u0000\u0000\u0837"+ - "\u0838\u0001\u0000\u0000\u0000\u0838\u088f\u0001\u0000\u0000\u0000\u0839"+ - "\u0837\u0001\u0000\u0000\u0000\u083a\u083b\u0005@\u0000\u0000\u083b\u083c"+ - "\u0007\b\u0000\u0000\u083c\u083d\u0007\u0010\u0000\u0000\u083d\u083e\u0007"+ - "\u0014\u0000\u0000\u083e\u083f\u0007\u0007\u0000\u0000\u083f\u0840\u0007"+ - "\u0016\u0000\u0000\u0840\u0844\u0001\u0000\u0000\u0000\u0841\u0843\u0007"+ - "%\u0000\u0000\u0842\u0841\u0001\u0000\u0000\u0000\u0843\u0846\u0001\u0000"+ - "\u0000\u0000\u0844\u0842\u0001\u0000\u0000\u0000\u0844\u0845\u0001\u0000"+ - "\u0000\u0000\u0845\u088f\u0001\u0000\u0000\u0000\u0846\u0844\u0001\u0000"+ - "\u0000\u0000\u0847\u0848\u0005@\u0000\u0000\u0848\u0849\u0007\r\u0000"+ - "\u0000\u0849\u084a\u0007\u0010\u0000\u0000\u084a\u084b\u0007\u0005\u0000"+ - "\u0000\u084b\u084c\u0007\b\u0000\u0000\u084c\u084d\u0007\f\u0000\u0000"+ - "\u084d\u084e\u0007\u0005\u0000\u0000\u084e\u084f\u0007\n\u0000\u0000\u084f"+ - "\u0850\u0007\u000b\u0000\u0000\u0850\u0854\u0001\u0000\u0000\u0000\u0851"+ - "\u0853\u0007%\u0000\u0000\u0852\u0851\u0001\u0000\u0000\u0000\u0853\u0856"+ - "\u0001\u0000\u0000\u0000\u0854\u0852\u0001\u0000\u0000\u0000\u0854\u0855"+ - "\u0001\u0000\u0000\u0000\u0855\u088f\u0001\u0000\u0000\u0000\u0856\u0854"+ - "\u0001\u0000\u0000\u0000\u0857\u0858\u0005@\u0000\u0000\u0858\u0859\u0007"+ - "\u0010\u0000\u0000\u0859\u085a\u0007\u0013\u0000\u0000\u085a\u085b\u0007"+ - "\u0013\u0000\u0000\u085b\u085c\u0007\b\u0000\u0000\u085c\u085d\u0007\u0014"+ - "\u0000\u0000\u085d\u0861\u0001\u0000\u0000\u0000\u085e\u0860\u0007%\u0000"+ - "\u0000\u085f\u085e\u0001\u0000\u0000\u0000\u0860\u0863\u0001\u0000\u0000"+ - "\u0000\u0861\u085f\u0001\u0000\u0000\u0000\u0861\u0862\u0001\u0000\u0000"+ - "\u0000\u0862\u088f\u0001\u0000\u0000\u0000\u0863\u0861\u0001\u0000\u0000"+ - "\u0000\u0864\u0865\u0005@\u0000\u0000\u0865\u0866\u0005-\u0000\u0000\u0866"+ - "\u0867\u0007\f\u0000\u0000\u0867\u0868\u0007\u0007\u0000\u0000\u0868\u0869"+ - "\u0007\u0017\u0000\u0000\u0869\u086a\u0007\u0018\u0000\u0000\u086a\u086b"+ - "\u0007\u0005\u0000\u0000\u086b\u086c\u0007\r\u0000\u0000\u086c\u086d\u0005"+ - "-\u0000\u0000\u086d\u086e\u0007\u0018\u0000\u0000\u086e\u086f\u0007\u0007"+ - "\u0000\u0000\u086f\u0870\u0007\u0014\u0000\u0000\u0870\u0871\u0007\u0006"+ - "\u0000\u0000\u0871\u0872\u0007\u0016\u0000\u0000\u0872\u0873\u0007\u0010"+ - "\u0000\u0000\u0873\u0874\u0007\u0012\u0000\u0000\u0874\u0875\u0007\u0007"+ - "\u0000\u0000\u0875\u0876\u0007\t\u0000\u0000\u0876\u087a\u0001\u0000\u0000"+ - "\u0000\u0877\u0879\u0007%\u0000\u0000\u0878\u0877\u0001\u0000\u0000\u0000"+ - "\u0879\u087c\u0001\u0000\u0000\u0000\u087a\u0878\u0001\u0000\u0000\u0000"+ - "\u087a\u087b\u0001\u0000\u0000\u0000\u087b\u088f\u0001\u0000\u0000\u0000"+ - "\u087c\u087a\u0001\u0000\u0000\u0000\u087d\u087e\u0005@\u0000\u0000\u087e"+ - "\u087f\u0007\u0018\u0000\u0000\u087f\u0880\u0007\u0007\u0000\u0000\u0880"+ - "\u0881\u0007\u0014\u0000\u0000\u0881\u0882\u0007\u0006\u0000\u0000\u0882"+ - "\u0883\u0007\u0016\u0000\u0000\u0883\u0884\u0007\u0010\u0000\u0000\u0884"+ - "\u0885\u0007\u0012\u0000\u0000\u0885\u0886\u0007\u0007\u0000\u0000\u0886"+ - "\u0887\u0007\t\u0000\u0000\u0887\u088b\u0001\u0000\u0000\u0000\u0888\u088a"+ - "\u0007%\u0000\u0000\u0889\u0888\u0001\u0000\u0000\u0000\u088a\u088d\u0001"+ - "\u0000\u0000\u0000\u088b\u0889\u0001\u0000\u0000\u0000\u088b\u088c\u0001"+ - "\u0000\u0000\u0000\u088c\u088f\u0001\u0000\u0000\u0000\u088d\u088b\u0001"+ - "\u0000\u0000\u0000\u088e\u07b0\u0001\u0000\u0000\u0000\u088e\u07b3\u0001"+ - "\u0000\u0000\u0000\u088e\u07b9\u0001\u0000\u0000\u0000\u088e\u07bf\u0001"+ - "\u0000\u0000\u0000\u088e\u07cf\u0001\u0000\u0000\u0000\u088e\u07de\u0001"+ - "\u0000\u0000\u0000\u088e\u07ec\u0001\u0000\u0000\u0000\u088e\u07fd\u0001"+ - "\u0000\u0000\u0000\u088e\u080d\u0001\u0000\u0000\u0000\u088e\u081e\u0001"+ - "\u0000\u0000\u0000\u088e\u082a\u0001\u0000\u0000\u0000\u088e\u083a\u0001"+ - "\u0000\u0000\u0000\u088e\u0847\u0001\u0000\u0000\u0000\u088e\u0857\u0001"+ - "\u0000\u0000\u0000\u088e\u0864\u0001\u0000\u0000\u0000\u088e\u087d\u0001"+ - "\u0000\u0000\u0000\u088f\u0890\u0001\u0000\u0000\u0000\u0890\u0891\u0006"+ - "~\t\u0000\u0891\u010b\u0001\u0000\u0000\u0000\u0892\u0893\u0003\u00fe"+ - "x\u0000\u0893\u0894\u0001\u0000\u0000\u0000\u0894\u0895\u0006\u007f\u0012"+ - "\u0000\u0895\u010d\u0001\u0000\u0000\u0000\u0896\u0897\u0003\u0100y\u0000"+ - "\u0897\u0898\u0001\u0000\u0000\u0000\u0898\u0899\u0006\u0080\u0013\u0000"+ - "\u0899\u010f\u0001\u0000\u0000\u0000\u089a\u089c\u0005\\\u0000\u0000\u089b"+ - "\u089a\u0001\u0000\u0000\u0000\u089b\u089c\u0001\u0000\u0000\u0000\u089c"+ - "\u08a0\u0001\u0000\u0000\u0000\u089d\u089e\u0003\u00f0q\u0000\u089e\u089f"+ - "\u0005\\\u0000\u0000\u089f\u08a1\u0001\u0000\u0000\u0000\u08a0\u089d\u0001"+ - "\u0000\u0000\u0000\u08a1\u08a2\u0001\u0000\u0000\u0000\u08a2\u08a0\u0001"+ - "\u0000\u0000\u0000\u08a2\u08a3\u0001\u0000\u0000\u0000\u08a3\u08a4\u0001"+ - "\u0000\u0000\u0000\u08a4\u08a5\u0006\u0081\u0014\u0000\u08a5\u0111\u0001"+ - "\u0000\u0000\u0000\u08a6\u08a7\u0003\u00f0q\u0000\u08a7\u08a8\u0001\u0000"+ - "\u0000\u0000\u08a8\u08a9\u0006\u0082\u0015\u0000\u08a9\u0113\u0001\u0000"+ - "\u0000\u0000\u08aa\u08ab\u0005:\u0000\u0000\u08ab\u08ac\u0005:\u0000\u0000"+ - "\u08ac\u08ad\u0001\u0000\u0000\u0000\u08ad\u08ae\u0006\u0083\u0016\u0000"+ - "\u08ae\u0115\u0001\u0000\u0000\u0000\u08af\u08b0\u0005}\u0000\u0000\u08b0"+ - "\u08b1\u0005}\u0000\u0000\u08b1\u08b2\u0001\u0000\u0000\u0000\u08b2\u08b3"+ - "\u0006\u0084\u0017\u0000\u08b3\u0117\u0001\u0000\u0000\u0000\u08b4\u08b5"+ - "\u0005(\u0000\u0000\u08b5\u08b6\u0001\u0000\u0000\u0000\u08b6\u08b7\u0006"+ - "\u0085\u0018\u0000\u08b7\u0119\u0001\u0000\u0000\u0000\u08b8\u08b9\u0005"+ - ")\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba\u08bb\u0006\u0086"+ - "\u0019\u0000\u08bb\u011b\u0001\u0000\u0000\u0000\u08bc\u08bd\u0005-\u0000"+ - "\u0000\u08bd\u08be\u0005>\u0000\u0000\u08be\u08bf\u0001\u0000\u0000\u0000"+ - "\u08bf\u08c0\u0006\u0087\u001a\u0000\u08c0\u011d\u0001\u0000\u0000\u0000"+ - "\u08c1\u08c2\t\u0000\u0000\u0000\u08c2\u08c3\u0001\u0000\u0000\u0000\u08c3"+ - "\u08c4\u0006\u0088\r\u0000\u08c4\u011f\u0001\u0000\u0000\u0000\u08c5\u08c6"+ - "\u0005\u0000\u0000\u0001\u08c6\u08c7\u0001\u0000\u0000\u0000\u08c7\u08c8"+ - "\u0006\u0089\u001b\u0000\u08c8\u08c9\u0006\u0089\u0017\u0000\u08c9\u0121"+ - "\u0001\u0000\u0000\u0000\u08ca\u08cb\u0003\u00fex\u0000\u08cb\u08cc\u0001"+ - "\u0000\u0000\u0000\u08cc\u08cd\u0006\u008a\u0012\u0000\u08cd\u0123\u0001"+ - "\u0000\u0000\u0000\u08ce\u08cf\u0003\u0100y\u0000\u08cf\u08d0\u0001\u0000"+ - "\u0000\u0000\u08d0\u08d1\u0006\u008b\u0013\u0000\u08d1\u0125\u0001\u0000"+ - "\u0000\u0000\u08d2\u08d4\u0005\\\u0000\u0000\u08d3\u08d2\u0001\u0000\u0000"+ - "\u0000\u08d3\u08d4\u0001\u0000\u0000\u0000\u08d4\u08d8\u0001\u0000\u0000"+ - "\u0000\u08d5\u08d6\u0003\u00f0q\u0000\u08d6\u08d7\u0005\\\u0000\u0000"+ - "\u08d7\u08d9\u0001\u0000\u0000\u0000\u08d8\u08d5\u0001\u0000\u0000\u0000"+ - "\u08d9\u08da\u0001\u0000\u0000\u0000\u08da\u08d8\u0001\u0000\u0000\u0000"+ - "\u08da\u08db\u0001\u0000\u0000\u0000\u08db\u08dc\u0001\u0000\u0000\u0000"+ - "\u08dc\u08dd\u0006\u008c\u0014\u0000\u08dd\u0127\u0001\u0000\u0000\u0000"+ - "\u08de\u08df\u0003\u00f0q\u0000\u08df\u08e0\u0001\u0000\u0000\u0000\u08e0"+ - "\u08e1\u0006\u008d\u0015\u0000\u08e1\u0129\u0001\u0000\u0000\u0000\u08e2"+ - "\u08e3\u0005:\u0000\u0000\u08e3\u08e4\u0005:\u0000\u0000\u08e4\u08e5\u0001"+ - "\u0000\u0000\u0000\u08e5\u08e6\u0006\u008e\u0016\u0000\u08e6\u012b\u0001"+ - "\u0000\u0000\u0000\u08e7\u08e8\u0005!\u0000\u0000\u08e8\u08e9\u0005!\u0000"+ - "\u0000\u08e9\u08ea\u0005}\u0000\u0000\u08ea\u08eb\u0001\u0000\u0000\u0000"+ - "\u08eb\u08ec\u0006\u008f\u0017\u0000\u08ec\u012d\u0001\u0000\u0000\u0000"+ - "\u08ed\u08ee\u0005(\u0000\u0000\u08ee\u08ef\u0001\u0000\u0000\u0000\u08ef"+ - "\u08f0\u0006\u0090\u0018\u0000\u08f0\u012f\u0001\u0000\u0000\u0000\u08f1"+ - "\u08f2\u0005)\u0000\u0000\u08f2\u08f3\u0001\u0000\u0000\u0000\u08f3\u08f4"+ - "\u0006\u0091\u0019\u0000\u08f4\u0131\u0001\u0000\u0000\u0000\u08f5\u08f6"+ - "\u0005-\u0000\u0000\u08f6\u08f7\u0005>\u0000\u0000\u08f7\u08f8\u0001\u0000"+ - "\u0000\u0000\u08f8\u08f9\u0006\u0092\u001a\u0000\u08f9\u0133\u0001\u0000"+ - "\u0000\u0000\u08fa\u08fb\t\u0000\u0000\u0000\u08fb\u08fc\u0001\u0000\u0000"+ - "\u0000\u08fc\u08fd\u0006\u0093\r\u0000\u08fd\u0135\u0001\u0000\u0000\u0000"+ - "\u08fe\u08ff\u0005\u0000\u0000\u0001\u08ff\u0900\u0001\u0000\u0000\u0000"+ - "\u0900\u0901\u0006\u0094\u001b\u0000\u0901\u0902\u0006\u0094\u0017\u0000"+ - "\u0902\u0137\u0001\u0000\u0000\u0000\u0903\u0905\u0007%\u0000\u0000\u0904"+ - "\u0903\u0001\u0000\u0000\u0000\u0905\u0906\u0001\u0000\u0000\u0000\u0906"+ - "\u0904\u0001\u0000\u0000\u0000\u0906\u0907\u0001\u0000\u0000\u0000\u0907"+ - "\u0908\u0001\u0000\u0000\u0000\u0908\u0909\u0004\u0095\u0007\u0000\u0909"+ - "\u090a\u0001\u0000\u0000\u0000\u090a\u090b\u0006\u0095\r\u0000\u090b\u090c"+ - "\u0006\u0095\u0017\u0000\u090c\u0139\u0001\u0000\u0000\u0000\u090d\u090f"+ - "\u0007%\u0000\u0000\u090e\u090d\u0001\u0000\u0000\u0000\u090f\u0910\u0001"+ - "\u0000\u0000\u0000\u0910\u090e\u0001\u0000\u0000\u0000\u0910\u0911\u0001"+ - "\u0000\u0000\u0000\u0911\u0912\u0001\u0000\u0000\u0000\u0912\u0913\u0006"+ - "\u0096\r\u0000\u0913\u013b\u0001\u0000\u0000\u0000\u0914\u0915\u0005("+ - "\u0000\u0000\u0915\u0916\u0001\u0000\u0000\u0000\u0916\u0917\u0006\u0097"+ - "\u001c\u0000\u0917\u0918\u0006\u0097\u001d\u0000\u0918\u013d\u0001\u0000"+ - "\u0000\u0000\u0919\u091a\t\u0000\u0000\u0000\u091a\u091b\u0004\u0098\b"+ - "\u0000\u091b\u091c\u0001\u0000\u0000\u0000\u091c\u091d\u0006\u0098\t\u0000"+ - "\u091d\u091e\u0006\u0098\u0017\u0000\u091e\u013f\u0001\u0000\u0000\u0000"+ - "\u091f\u0920\t\u0000\u0000\u0000\u0920\u0921\u0001\u0000\u0000\u0000\u0921"+ - "\u0922\u0006\u0099\t\u0000\u0922\u0923\u0006\u0099\u0017\u0000\u0923\u0141"+ - "\u0001\u0000\u0000\u0000\u0924\u0925\u0004\u009a\t\u0000\u0925\u0926\u0005"+ - "(\u0000\u0000\u0926\u0927\u0006\u009a\u001e\u0000\u0927\u0928\u0001\u0000"+ - "\u0000\u0000\u0928\u0929\u0006\u009a\u001c\u0000\u0929\u0143\u0001\u0000"+ - "\u0000\u0000\u092a\u092b\u0004\u009b\n\u0000\u092b\u092c\u0005)\u0000"+ - "\u0000\u092c\u092d\u0006\u009b\u001f\u0000\u092d\u092e\u0001\u0000\u0000"+ - "\u0000\u092e\u092f\u0006\u009b \u0000\u092f\u0930\u0006\u009b!\u0000\u0930"+ - "\u0145\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009c\u000b\u0000\u0932"+ - "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009c\"\u0000\u0934\u0935"+ - "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009c\u001c\u0000\u0936\u0147"+ - "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009d\f\u0000\u0938\u0939\u0005"+ - ")\u0000\u0000\u0939\u093a\u0006\u009d#\u0000\u093a\u093b\u0001\u0000\u0000"+ - "\u0000\u093b\u093c\u0006\u009d\u001c\u0000\u093c\u0149\u0001\u0000\u0000"+ - "\u0000\u093d\u093e\u0005)\u0000\u0000\u093e\u093f\u0004\u009e\r\u0000"+ - "\u093f\u0940\u0001\u0000\u0000\u0000\u0940\u0941\u0006\u009e \u0000\u0941"+ - "\u0942\u0006\u009e!\u0000\u0942\u014b\u0001\u0000\u0000\u0000\u0943\u0944"+ - "\t\u0000\u0000\u0000\u0944\u0945\u0001\u0000\u0000\u0000\u0945\u0946\u0006"+ - "\u009f\u001c\u0000\u0946\u014d\u0001\u0000\u0000\u0000\u0947\u0948\u0005"+ - "\u0000\u0000\u0001\u0948\u0949\u0001\u0000\u0000\u0000\u0949\u094a\u0006"+ - "\u00a0\u001b\u0000\u094a\u094b\u0006\u00a0\u0017\u0000\u094b\u014f\u0001"+ - "\u0000\u0000\u0000\u094c\u094e\u0007%\u0000\u0000\u094d\u094c\u0001\u0000"+ - "\u0000\u0000\u094e\u094f\u0001\u0000\u0000\u0000\u094f\u094d\u0001\u0000"+ - "\u0000\u0000\u094f\u0950\u0001\u0000\u0000\u0000\u0950\u0951\u0001\u0000"+ - "\u0000\u0000\u0951\u0952\u0006\u00a1\r\u0000\u0952\u0151\u0001\u0000\u0000"+ - "\u0000\u0953\u0954\u0005(\u0000\u0000\u0954\u0955\u0006\u00a2$\u0000\u0955"+ - "\u0956\u0001\u0000\u0000\u0000\u0956\u0957\u0006\u00a2%\u0000\u0957\u0153"+ - "\u0001\u0000\u0000\u0000\u0958\u0959\t\u0000\u0000\u0000\u0959\u095a\u0001"+ - "\u0000\u0000\u0000\u095a\u095b\u0006\u00a3\t\u0000\u095b\u095c\u0006\u00a3"+ - "\u0017\u0000\u095c\u0155\u0001\u0000\u0000\u0000\u095d\u095e\u0005[\u0000"+ - "\u0000\u095e\u095f\u0006\u00a4&\u0000\u095f\u0960\u0001\u0000\u0000\u0000"+ - "\u0960\u0961\u0006\u00a4\'\u0000\u0961\u0157\u0001\u0000\u0000\u0000\u0962"+ - "\u0963\u0005]\u0000\u0000\u0963\u0964\u0006\u00a5(\u0000\u0964\u0965\u0001"+ - "\u0000\u0000\u0000\u0965\u0966\u0006\u00a5)\u0000\u0966\u0159\u0001\u0000"+ - "\u0000\u0000\u0967\u0968\u0005{\u0000\u0000\u0968\u0969\u0006\u00a6*\u0000"+ - "\u0969\u096a\u0001\u0000\u0000\u0000\u096a\u096b\u0006\u00a6 \u0000\u096b"+ - "\u015b\u0001\u0000\u0000\u0000\u096c\u096d\u0005}\u0000\u0000\u096d\u096e"+ - "\u0006\u00a7+\u0000\u096e\u096f\u0001\u0000\u0000\u0000\u096f\u0970\u0006"+ - "\u00a7 \u0000\u0970\u015d\u0001\u0000\u0000\u0000\u0971\u0974\u0003\u00f8"+ - "u\u0000\u0972\u0974\u0003\u00fav\u0000\u0973\u0971\u0001\u0000\u0000\u0000"+ - "\u0973\u0972\u0001\u0000\u0000\u0000\u0974\u015f\u0001\u0000\u0000\u0000"+ - "\u0975\u0976\u0003\u00fex\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977"+ - "\u0978\u0006\u00a9\u0012\u0000\u0978\u0161\u0001\u0000\u0000\u0000\u0979"+ - "\u097a\u0003\u0100y\u0000\u097a\u097b\u0001\u0000\u0000\u0000\u097b\u097c"+ - "\u0006\u00aa\u0013\u0000\u097c\u0163\u0001\u0000\u0000\u0000\u097d\u097f"+ - "\u0005\\\u0000\u0000\u097e\u097d\u0001\u0000\u0000\u0000\u097e\u097f\u0001"+ - "\u0000"; + "\u0894\u0007\r\u0000\u0000\u07d7\u07d8\u0005@\u0000\u0000\u07d8\u07d9"+ + "\u0007\u0005\u0000\u0000\u07d9\u07da\u0007\u0012\u0000\u0000\u07da\u07db"+ + "\u0007\u0013\u0000\u0000\u07db\u07dc\u0007\u0015\u0000\u0000\u07dc\u07dd"+ + "\u0007\u0016\u0000\u0000\u07dd\u0894\u0007\r\u0000\u0000\u07de\u07df\u0005"+ + "@\u0000\u0000\u07df\u07e0\u0007\n\u0000\u0000\u07e0\u07e1\u0007\u0010"+ + "\u0000\u0000\u07e1\u07e2\u0007\u0012\u0000\u0000\u07e2\u07e3\u0007\u0007"+ + "\u0000\u0000\u07e3\u07e4\u0007\t\u0000\u0000\u07e4\u07e5\u0007\u0013\u0000"+ + "\u0000\u07e5\u07e6\u0007\u0010\u0000\u0000\u07e6\u07e7\u0007\u000e\u0000"+ + "\u0000\u07e7\u0894\u0007\u0007\u0000\u0000\u07e8\u07e9\u0005@\u0000\u0000"+ + "\u07e9\u07ea\u0007\u000b\u0000\u0000\u07ea\u07eb\u0007\u0015\u0000\u0000"+ + "\u07eb\u07ec\u0007\u000e\u0000\u0000\u07ec\u07ed\u0007\u0011\u0000\u0000"+ + "\u07ed\u07ee\u0007\u0012\u0000\u0000\u07ee\u07ef\u0007\u0007\u0000\u0000"+ + "\u07ef\u07f0\u0007\n\u0000\u0000\u07f0\u0894\u0007\r\u0000\u0000\u07f1"+ + "\u07f2\u0005@\u0000\u0000\u07f2\u07f3\u0007\u0006\u0000\u0000\u07f3\u07f4"+ + "\u0007\u0015\u0000\u0000\u07f4\u07f5\u0007\n\u0000\u0000\u07f5\u07f6\u0007"+ + "\r\u0000\u0000\u07f6\u07f7\u0005-\u0000\u0000\u07f7\u07f8\u0007\u0006"+ + "\u0000\u0000\u07f8\u07f9\u0007\u0010\u0000\u0000\u07f9\u07fa\u0007\u000e"+ + "\u0000\u0000\u07fa\u0894\u0007\u0007\u0000\u0000\u07fb\u07fc\u0005@\u0000"+ + "\u0000\u07fc\u07fd\u0007\u0013\u0000\u0000\u07fd\u07fe\u0007\u0010\u0000"+ + "\u0000\u07fe\u07ff\u0007\u001b\u0000\u0000\u07ff\u0894\u0007\u0007\u0000"+ + "\u0000\u0800\u0801\u0005@\u0000\u0000\u0801\u0802\u0007\b\u0000\u0000"+ + "\u0802\u0803\u0007\u0010\u0000\u0000\u0803\u0804\u0007\u0014\u0000\u0000"+ + "\u0804\u0805\u0007\u0007\u0000\u0000\u0805\u0894\u0007\u0016\u0000\u0000"+ + "\u0806\u0807\u0005@\u0000\u0000\u0807\u0808\u0007\t\u0000\u0000\u0808"+ + "\u0809\u0007\u0011\u0000\u0000\u0809\u080a\u0007\u0013\u0000\u0000\u080a"+ + "\u080b\u0007\u0013\u0000\u0000\u080b\u080c\u0007\u0015\u0000\u0000\u080c"+ + "\u080d\u0007\u0016\u0000\u0000\u080d\u080e\u0007\r\u0000\u0000\u080e\u0894"+ + "\u0007\t\u0000\u0000\u080f\u0810\u0005@\u0000\u0000\u0810\u0811\u0007"+ + "\r\u0000\u0000\u0811\u0812\u0007\u0010\u0000\u0000\u0812\u0813\u0007\u0005"+ + "\u0000\u0000\u0813\u0814\u0007\b\u0000\u0000\u0814\u0815\u0007\f\u0000"+ + "\u0000\u0815\u0816\u0007\u0005\u0000\u0000\u0816\u0817\u0007\n\u0000\u0000"+ + "\u0817\u0894\u0007\u000b\u0000\u0000\u0818\u0819\u0005@\u0000\u0000\u0819"+ + "\u081a\u0007\u0010\u0000\u0000\u081a\u081b\u0007\u0013\u0000\u0000\u081b"+ + "\u081c\u0007\u0013\u0000\u0000\u081c\u081d\u0007\b\u0000\u0000\u081d\u0894"+ + "\u0007\u0014\u0000\u0000\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0005"+ + "-\u0000\u0000\u0820\u0821\u0007\f\u0000\u0000\u0821\u0822\u0007\u0007"+ + "\u0000\u0000\u0822\u0823\u0007\u0017\u0000\u0000\u0823\u0824\u0007\u0018"+ + "\u0000\u0000\u0824\u0825\u0007\u0005\u0000\u0000\u0825\u0826\u0007\r\u0000"+ + "\u0000\u0826\u0827\u0005-\u0000\u0000\u0827\u0828\u0007\u0018\u0000\u0000"+ + "\u0828\u0829\u0007\u0007\u0000\u0000\u0829\u082a\u0007\u0014\u0000\u0000"+ + "\u082a\u082b\u0007\u0006\u0000\u0000\u082b\u082c\u0007\u0016\u0000\u0000"+ + "\u082c\u082d\u0007\u0010\u0000\u0000\u082d\u082e\u0007\u0012\u0000\u0000"+ + "\u082e\u082f\u0007\u0007\u0000\u0000\u082f\u0894\u0007\t\u0000\u0000\u0830"+ + "\u0831\u0005@\u0000\u0000\u0831\u0832\u0007\u0018\u0000\u0000\u0832\u0833"+ + "\u0007\u0007\u0000\u0000\u0833\u0834\u0007\u0014\u0000\u0000\u0834\u0835"+ + "\u0007\u0006\u0000\u0000\u0835\u0836\u0007\u0016\u0000\u0000\u0836\u0837"+ + "\u0007\u0010\u0000\u0000\u0837\u0838\u0007\u0012\u0000\u0000\u0838\u0839"+ + "\u0007\u0007\u0000\u0000\u0839\u0894\u0007\t\u0000\u0000\u083a\u083b\u0005"+ + "@\u0000\u0000\u083b\u083c\u0007\u000e\u0000\u0000\u083c\u083d\u0007\u0015"+ + "\u0000\u0000\u083d\u083e\u0007\u0011\u0000\u0000\u083e\u083f\u0007\n\u0000"+ + "\u0000\u083f\u0840\u0007\r\u0000\u0000\u0840\u0841\u0007\u0007\u0000\u0000"+ + "\u0841\u0842\u0007\u0016\u0000\u0000\u0842\u0843\u0005-\u0000\u0000\u0843"+ + "\u0844\u0007\t\u0000\u0000\u0844\u0845\u0007\r\u0000\u0000\u0845\u0846"+ + "\u0007\u0014\u0000\u0000\u0846\u0847\u0007\b\u0000\u0000\u0847\u0894\u0007"+ + "\u0007\u0000\u0000\u0848\u0849\u0005@\u0000\u0000\u0849\u084a\u0007\u0006"+ + "\u0000\u0000\u084a\u084b\u0007\u0015\u0000\u0000\u084b\u084c\u0007\n\u0000"+ + "\u0000\u084c\u084d\u0007\r\u0000\u0000\u084d\u084e\u0005-\u0000\u0000"+ + "\u084e\u084f\u0007\u0006\u0000\u0000\u084f\u0850\u0007\u0007\u0000\u0000"+ + "\u0850\u0851\u0007\u0010\u0000\u0000\u0851\u0852\u0007\r\u0000\u0000\u0852"+ + "\u0853\u0007\u0011\u0000\u0000\u0853\u0854\u0007\u0016\u0000\u0000\u0854"+ + "\u0855\u0007\u0007\u0000\u0000\u0855\u0856\u0005-\u0000\u0000\u0856\u0857"+ + "\u0007\u001c\u0000\u0000\u0857\u0858\u0007\u0010\u0000\u0000\u0858\u0859"+ + "\u0007\b\u0000\u0000\u0859\u085a\u0007\u0011\u0000\u0000\u085a\u085b\u0007"+ + "\u0007\u0000\u0000\u085b\u0894\u0007\t\u0000\u0000\u085c\u085d\u0005@"+ + "\u0000\u0000\u085d\u085e\u0007\u0013\u0000\u0000\u085e\u085f\u0007\u0016"+ + "\u0000\u0000\u085f\u0860\u0007\u0015\u0000\u0000\u0860\u0861\u0007\u0013"+ + "\u0000\u0000\u0861\u0862\u0007\u0007\u0000\u0000\u0862\u0863\u0007\u0016"+ + "\u0000\u0000\u0863\u0864\u0007\r\u0000\u0000\u0864\u0894\u0007\u0014\u0000"+ + "\u0000\u0865\u0866\u0005@\u0000\u0000\u0866\u0867\u0007\t\u0000\u0000"+ + "\u0867\u0868\u0007\u000e\u0000\u0000\u0868\u0869\u0007\u0015\u0000\u0000"+ + "\u0869\u086a\u0007\u0013\u0000\u0000\u086a\u0894\u0007\u0007\u0000\u0000"+ + "\u086b\u086c\u0005@\u0000\u0000\u086c\u086d\u0007\t\u0000\u0000\u086d"+ + "\u086e\u0007\r\u0000\u0000\u086e\u086f\u0007\u0010\u0000\u0000\u086f\u0870"+ + "\u0007\u0016\u0000\u0000\u0870\u0871\u0007\r\u0000\u0000\u0871\u0872\u0007"+ + "\u0005\u0000\u0000\u0872\u0873\u0007\n\u0000\u0000\u0873\u0874\u0007\u001b"+ + "\u0000\u0000\u0874\u0875\u0005-\u0000\u0000\u0875\u0876\u0007\t\u0000"+ + "\u0000\u0876\u0877\u0007\r\u0000\u0000\u0877\u0878\u0007\u0014\u0000\u0000"+ + "\u0878\u0879\u0007\b\u0000\u0000\u0879\u0894\u0007\u0007\u0000\u0000\u087a"+ + "\u087b\u0005@\u0000\u0000\u087b\u087c\u0007\t\u0000\u0000\u087c\u087d"+ + "\u0007\u0011\u0000\u0000\u087d\u087e\u0007\u0013\u0000\u0000\u087e\u087f"+ + "\u0007\u0013\u0000\u0000\u087f\u0880\u0007\u0015\u0000\u0000\u0880\u0881"+ + "\u0007\u0016\u0000\u0000\u0881\u0882\u0007\r\u0000\u0000\u0882\u0894\u0007"+ + "\t\u0000\u0000\u0883\u0884\u0005@\u0000\u0000\u0884\u0885\u0007\u001c"+ + "\u0000\u0000\u0885\u0886\u0007\u0005\u0000\u0000\u0886\u0887\u0007\u0007"+ + "\u0000\u0000\u0887\u0888\u0007\f\u0000\u0000\u0888\u0889\u0005-\u0000"+ + "\u0000\u0889\u088a\u0007\r\u0000\u0000\u088a\u088b\u0007\u0016\u0000\u0000"+ + "\u088b\u088c\u0007\u0010\u0000\u0000\u088c\u088d\u0007\n\u0000\u0000\u088d"+ + "\u088e\u0007\t\u0000\u0000\u088e\u088f\u0007\u0005\u0000\u0000\u088f\u0890"+ + "\u0007\r\u0000\u0000\u0890\u0891\u0007\u0005\u0000\u0000\u0891\u0892\u0007"+ + "\u0015\u0000\u0000\u0892\u0894\u0007\n\u0000\u0000\u0893\u07cf\u0001\u0000"+ + "\u0000\u0000\u0893\u07d7\u0001\u0000\u0000\u0000\u0893\u07de\u0001\u0000"+ + "\u0000\u0000\u0893\u07e8\u0001\u0000\u0000\u0000\u0893\u07f1\u0001\u0000"+ + "\u0000\u0000\u0893\u07fb\u0001\u0000\u0000\u0000\u0893\u0800\u0001\u0000"+ + "\u0000\u0000\u0893\u0806\u0001\u0000\u0000\u0000\u0893\u080f\u0001\u0000"+ + "\u0000\u0000\u0893\u0818\u0001\u0000\u0000\u0000\u0893\u081e\u0001\u0000"+ + "\u0000\u0000\u0893\u0830\u0001\u0000\u0000\u0000\u0893\u083a\u0001\u0000"+ + "\u0000\u0000\u0893\u0848\u0001\u0000\u0000\u0000\u0893\u085c\u0001\u0000"+ + "\u0000\u0000\u0893\u0865\u0001\u0000\u0000\u0000\u0893\u086b\u0001\u0000"+ + "\u0000\u0000\u0893\u087a\u0001\u0000\u0000\u0000\u0893\u0883\u0001\u0000"+ + "\u0000\u0000\u0894\u0898\u0001\u0000\u0000\u0000\u0895\u0897\u0007%\u0000"+ + "\u0000\u0896\u0895\u0001\u0000\u0000\u0000\u0897\u089a\u0001\u0000\u0000"+ + "\u0000\u0898\u0896\u0001\u0000\u0000\u0000\u0898\u0899\u0001\u0000\u0000"+ + "\u0000\u0899\u089c\u0001\u0000\u0000\u0000\u089a\u0898\u0001\u0000\u0000"+ + "\u0000\u089b\u07b0\u0001\u0000\u0000\u0000\u089b\u07b3\u0001\u0000\u0000"+ + "\u0000\u089b\u07b9\u0001\u0000\u0000\u0000\u089b\u07bf\u0001\u0000\u0000"+ + "\u0000\u089b\u0893\u0001\u0000\u0000\u0000\u089c\u089d\u0001\u0000\u0000"+ + "\u0000\u089d\u089e\u0006~\t\u0000\u089e\u010b\u0001\u0000\u0000\u0000"+ + "\u089f\u08a0\u0003\u00fex\u0000\u08a0\u08a1\u0001\u0000\u0000\u0000\u08a1"+ + "\u08a2\u0006\u007f\u0012\u0000\u08a2\u010d\u0001\u0000\u0000\u0000\u08a3"+ + "\u08a4\u0003\u0100y\u0000\u08a4\u08a5\u0001\u0000\u0000\u0000\u08a5\u08a6"+ + "\u0006\u0080\u0013\u0000\u08a6\u010f\u0001\u0000\u0000\u0000\u08a7\u08a9"+ + "\u0005\\\u0000\u0000\u08a8\u08a7\u0001\u0000\u0000\u0000\u08a8\u08a9\u0001"+ + "\u0000\u0000\u0000\u08a9\u08ad\u0001\u0000\u0000\u0000\u08aa\u08ab\u0003"+ + "\u00f0q\u0000\u08ab\u08ac\u0005\\\u0000\u0000\u08ac\u08ae\u0001\u0000"+ + "\u0000\u0000\u08ad\u08aa\u0001\u0000\u0000\u0000\u08ae\u08af\u0001\u0000"+ + "\u0000\u0000\u08af\u08ad\u0001\u0000\u0000\u0000\u08af\u08b0\u0001\u0000"+ + "\u0000\u0000\u08b0\u08b1\u0001\u0000\u0000\u0000\u08b1\u08b2\u0006\u0081"+ + "\u0014\u0000\u08b2\u0111\u0001\u0000\u0000\u0000\u08b3\u08b4\u0003\u00f0"+ + "q\u0000\u08b4\u08b5\u0001\u0000\u0000\u0000\u08b5\u08b6\u0006\u0082\u0015"+ + "\u0000\u08b6\u0113\u0001\u0000\u0000\u0000\u08b7\u08b8\u0005:\u0000\u0000"+ + "\u08b8\u08b9\u0005:\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba"+ + "\u08bb\u0006\u0083\u0016\u0000\u08bb\u0115\u0001\u0000\u0000\u0000\u08bc"+ + "\u08bd\u0005}\u0000\u0000\u08bd\u08be\u0005}\u0000\u0000\u08be\u08bf\u0001"+ + "\u0000\u0000\u0000\u08bf\u08c0\u0006\u0084\u0017\u0000\u08c0\u0117\u0001"+ + "\u0000\u0000\u0000\u08c1\u08c2\u0005(\u0000\u0000\u08c2\u08c3\u0001\u0000"+ + "\u0000\u0000\u08c3\u08c4\u0006\u0085\u0018\u0000\u08c4\u0119\u0001\u0000"+ + "\u0000\u0000\u08c5\u08c6\u0005)\u0000\u0000\u08c6\u08c7\u0001\u0000\u0000"+ + "\u0000\u08c7\u08c8\u0006\u0086\u0019\u0000\u08c8\u011b\u0001\u0000\u0000"+ + "\u0000\u08c9\u08ca\u0005-\u0000\u0000\u08ca\u08cb\u0005>\u0000\u0000\u08cb"+ + "\u08cc\u0001\u0000\u0000\u0000\u08cc\u08cd\u0006\u0087\u001a\u0000\u08cd"+ + "\u011d\u0001\u0000\u0000\u0000\u08ce\u08cf\t\u0000\u0000\u0000\u08cf\u08d0"+ + "\u0001\u0000\u0000\u0000\u08d0\u08d1\u0006\u0088\r\u0000\u08d1\u011f\u0001"+ + "\u0000\u0000\u0000\u08d2\u08d3\u0005\u0000\u0000\u0001\u08d3\u08d4\u0001"+ + "\u0000\u0000\u0000\u08d4\u08d5\u0006\u0089\u001b\u0000\u08d5\u08d6\u0006"+ + "\u0089\u0017\u0000\u08d6\u0121\u0001\u0000\u0000\u0000\u08d7\u08d8\u0003"+ + "\u00fex\u0000\u08d8\u08d9\u0001\u0000\u0000\u0000\u08d9\u08da\u0006\u008a"+ + "\u0012\u0000\u08da\u0123\u0001\u0000\u0000\u0000\u08db\u08dc\u0003\u0100"+ + "y\u0000\u08dc\u08dd\u0001\u0000\u0000\u0000\u08dd\u08de\u0006\u008b\u0013"+ + "\u0000\u08de\u0125\u0001\u0000\u0000\u0000\u08df\u08e1\u0005\\\u0000\u0000"+ + "\u08e0\u08df\u0001\u0000\u0000\u0000\u08e0\u08e1\u0001\u0000\u0000\u0000"+ + "\u08e1\u08e5\u0001\u0000\u0000\u0000\u08e2\u08e3\u0003\u00f0q\u0000\u08e3"+ + "\u08e4\u0005\\\u0000\u0000\u08e4\u08e6\u0001\u0000\u0000\u0000\u08e5\u08e2"+ + "\u0001\u0000\u0000\u0000\u08e6\u08e7\u0001\u0000\u0000\u0000\u08e7\u08e5"+ + "\u0001\u0000\u0000\u0000\u08e7\u08e8\u0001\u0000\u0000\u0000\u08e8\u08e9"+ + "\u0001\u0000\u0000\u0000\u08e9\u08ea\u0006\u008c\u0014\u0000\u08ea\u0127"+ + "\u0001\u0000\u0000\u0000\u08eb\u08ec\u0003\u00f0q\u0000\u08ec\u08ed\u0001"+ + "\u0000\u0000\u0000\u08ed\u08ee\u0006\u008d\u0015\u0000\u08ee\u0129\u0001"+ + "\u0000\u0000\u0000\u08ef\u08f0\u0005:\u0000\u0000\u08f0\u08f1\u0005:\u0000"+ + "\u0000\u08f1\u08f2\u0001\u0000\u0000\u0000\u08f2\u08f3\u0006\u008e\u0016"+ + "\u0000\u08f3\u012b\u0001\u0000\u0000\u0000\u08f4\u08f5\u0005!\u0000\u0000"+ + "\u08f5\u08f6\u0005!\u0000\u0000\u08f6\u08f7\u0005}\u0000\u0000\u08f7\u08f8"+ + "\u0001\u0000\u0000\u0000\u08f8\u08f9\u0006\u008f\u0017\u0000\u08f9\u012d"+ + "\u0001\u0000\u0000\u0000\u08fa\u08fb\u0005(\u0000\u0000\u08fb\u08fc\u0001"+ + "\u0000\u0000\u0000\u08fc\u08fd\u0006\u0090\u0018\u0000\u08fd\u012f\u0001"+ + "\u0000\u0000\u0000\u08fe\u08ff\u0005)\u0000\u0000\u08ff\u0900\u0001\u0000"+ + "\u0000\u0000\u0900\u0901\u0006\u0091\u0019\u0000\u0901\u0131\u0001\u0000"+ + "\u0000\u0000\u0902\u0903\u0005-\u0000\u0000\u0903\u0904\u0005>\u0000\u0000"+ + "\u0904\u0905\u0001\u0000\u0000\u0000\u0905\u0906\u0006\u0092\u001a\u0000"+ + "\u0906\u0133\u0001\u0000\u0000\u0000\u0907\u0908\t\u0000\u0000\u0000\u0908"+ + "\u0909\u0001\u0000\u0000\u0000\u0909\u090a\u0006\u0093\r\u0000\u090a\u0135"+ + "\u0001\u0000\u0000\u0000\u090b\u090c\u0005\u0000\u0000\u0001\u090c\u090d"+ + "\u0001\u0000\u0000\u0000\u090d\u090e\u0006\u0094\u001b\u0000\u090e\u090f"+ + "\u0006\u0094\u0017\u0000\u090f\u0137\u0001\u0000\u0000\u0000\u0910\u0912"+ + "\u0007%\u0000\u0000\u0911\u0910\u0001\u0000\u0000\u0000\u0912\u0913\u0001"+ + "\u0000\u0000\u0000\u0913\u0911\u0001\u0000\u0000\u0000\u0913\u0914\u0001"+ + "\u0000\u0000\u0000\u0914\u0915\u0001\u0000\u0000\u0000\u0915\u0916\u0004"+ + "\u0095\u0007\u0000\u0916\u0917\u0001\u0000\u0000\u0000\u0917\u0918\u0006"+ + "\u0095\r\u0000\u0918\u0919\u0006\u0095\u0017\u0000\u0919\u0139\u0001\u0000"+ + "\u0000\u0000\u091a\u091c\u0007%\u0000\u0000\u091b\u091a\u0001\u0000\u0000"+ + "\u0000\u091c\u091d\u0001\u0000\u0000\u0000\u091d\u091b\u0001\u0000\u0000"+ + "\u0000\u091d\u091e\u0001\u0000\u0000\u0000\u091e\u091f\u0001\u0000\u0000"+ + "\u0000\u091f\u0920\u0006\u0096\r\u0000\u0920\u013b\u0001\u0000\u0000\u0000"+ + "\u0921\u0922\u0005(\u0000\u0000\u0922\u0923\u0001\u0000\u0000\u0000\u0923"+ + "\u0924\u0006\u0097\u001c\u0000\u0924\u0925\u0006\u0097\u001d\u0000\u0925"+ + "\u013d\u0001\u0000\u0000\u0000\u0926\u0927\t\u0000\u0000\u0000\u0927\u0928"+ + "\u0004\u0098\b\u0000\u0928\u0929\u0001\u0000\u0000\u0000\u0929\u092a\u0006"+ + "\u0098\t\u0000\u092a\u092b\u0006\u0098\u0017\u0000\u092b\u013f\u0001\u0000"+ + "\u0000\u0000\u092c\u092d\t\u0000\u0000\u0000\u092d\u092e\u0001\u0000\u0000"+ + "\u0000\u092e\u092f\u0006\u0099\t\u0000\u092f\u0930\u0006\u0099\u0017\u0000"+ + "\u0930\u0141\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009a\t\u0000\u0932"+ + "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009a\u001e\u0000\u0934\u0935"+ + "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009a\u001c\u0000\u0936\u0143"+ + "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009b\n\u0000\u0938\u0939\u0005"+ + ")\u0000\u0000\u0939\u093a\u0006\u009b\u001f\u0000\u093a\u093b\u0001\u0000"+ + "\u0000\u0000\u093b\u093c\u0006\u009b \u0000\u093c\u093d\u0006\u009b!\u0000"+ + "\u093d\u0145\u0001\u0000\u0000\u0000\u093e\u093f\u0004\u009c\u000b\u0000"+ + "\u093f\u0940\u0005(\u0000\u0000\u0940\u0941\u0006\u009c\"\u0000\u0941"+ + "\u0942\u0001\u0000\u0000\u0000\u0942\u0943\u0006\u009c\u001c\u0000\u0943"+ + "\u0147\u0001\u0000\u0000\u0000\u0944\u0945\u0004\u009d\f\u0000\u0945\u0946"+ + "\u0005)\u0000\u0000\u0946\u0947\u0006\u009d#\u0000\u0947\u0948\u0001\u0000"+ + "\u0000\u0000\u0948\u0949\u0006\u009d\u001c\u0000\u0949\u0149\u0001\u0000"+ + "\u0000\u0000\u094a\u094b\u0005)\u0000\u0000\u094b\u094c\u0004\u009e\r"+ + "\u0000\u094c\u094d\u0001\u0000\u0000\u0000\u094d\u094e\u0006\u009e \u0000"+ + "\u094e\u094f\u0006\u009e!\u0000\u094f\u014b\u0001\u0000\u0000\u0000\u0950"+ + "\u0951\t\u0000\u0000\u0000\u0951\u0952\u0001\u0000\u0000\u0000\u0952\u0953"+ + "\u0006\u009f\u001c\u0000\u0953\u014d\u0001\u0000\u0000\u0000\u0954\u0955"+ + "\u0005\u0000\u0000\u0001\u0955\u0956\u0001\u0000\u0000\u0000\u0956\u0957"+ + "\u0006\u00a0\u001b\u0000\u0957\u0958\u0006\u00a0\u0017\u0000\u0958\u014f"+ + "\u0001\u0000\u0000\u0000\u0959\u095b\u0007%\u0000\u0000\u095a\u0959\u0001"+ + "\u0000\u0000\u0000\u095b\u095c\u0001\u0000\u0000\u0000\u095c\u095a\u0001"+ + "\u0000\u0000\u0000\u095c\u095d\u0001\u0000\u0000\u0000\u095d\u095e\u0001"+ + "\u0000\u0000\u0000\u095e\u095f\u0006\u00a1\r\u0000\u095f\u0151\u0001\u0000"+ + "\u0000\u0000\u0960\u0961\u0005(\u0000\u0000\u0961\u0962\u0006\u00a2$\u0000"+ + "\u0962\u0963\u0001\u0000\u0000\u0000\u0963\u0964\u0006\u00a2%\u0000\u0964"+ + "\u0153\u0001\u0000\u0000\u0000\u0965\u0966\t\u0000\u0000\u0000\u0966\u0967"+ + "\u0001\u0000\u0000\u0000\u0967\u0968\u0006\u00a3\t\u0000\u0968\u0969\u0006"+ + "\u00a3\u0017\u0000\u0969\u0155\u0001\u0000\u0000\u0000\u096a\u096b\u0005"+ + "[\u0000\u0000\u096b\u096c\u0006\u00a4&\u0000\u096c\u096d\u0001\u0000\u0000"+ + "\u0000\u096d\u096e\u0006\u00a4\'\u0000\u096e\u0157\u0001\u0000\u0000\u0000"+ + "\u096f\u0970\u0005]\u0000\u0000\u0970\u0971\u0006\u00a5(\u0000\u0971\u0972"+ + "\u0001\u0000\u0000\u0000\u0972\u0973\u0006\u00a5)\u0000\u0973\u0159\u0001"+ + "\u0000\u0000\u0000\u0974\u0975\u0005{\u0000\u0000\u0975\u0976\u0006\u00a6"+ + "*\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977\u0978\u0006\u00a6 \u0000"+ + "\u0978\u015b\u0001\u0000\u0000\u0000\u0979\u097a\u0005}\u0000\u0000\u097a"+ + "\u097b\u0006\u00a7+\u0000\u097b\u097c\u0001\u0000\u0000\u0000\u097c\u097d"+ + "\u0006\u00a7 \u0000\u097d\u015d\u0001\u0000\u0000\u0000\u097e\u0981\u0003"+ + "\u00f8u\u0000\u097f\u0981\u0003\u00fav\u0000\u0980\u097e\u0001\u0000\u0000"+ + "\u0000\u0980\u097f\u0001\u0000\u0000\u0000\u0981\u015f\u0001\u0000\u0000"+ + "\u0000\u0982\u0983\u0003\u00fex"; private static final String _serializedATNSegment1 = - "\u0000\u0000\u097f\u0983\u0001\u0000\u0000\u0000\u0980\u0981\u0003\u00f0"+ - "q\u0000\u0981\u0982\u0005\\\u0000\u0000\u0982\u0984\u0001\u0000\u0000"+ - "\u0000\u0983\u0980\u0001\u0000\u0000\u0000\u0984\u0985\u0001\u0000\u0000"+ - "\u0000\u0985\u0983\u0001\u0000\u0000\u0000\u0985\u0986\u0001\u0000\u0000"+ - "\u0000\u0986\u0987\u0001\u0000\u0000\u0000\u0987\u0988\u0006\u00ab\u0014"+ - "\u0000\u0988\u0165\u0001\u0000\u0000\u0000\u0989\u098a\u0003\u00f0q\u0000"+ - "\u098a\u098b\u0001\u0000\u0000\u0000\u098b\u098c\u0006\u00ac\u0015\u0000"+ - "\u098c\u0167\u0001\u0000\u0000\u0000\u098d\u098e\u0005:\u0000\u0000\u098e"+ - "\u098f\u0005:\u0000\u0000\u098f\u0990\u0001\u0000\u0000\u0000\u0990\u0991"+ - "\u0006\u00ad\u0016\u0000\u0991\u0169\u0001\u0000\u0000\u0000\u0992\u0993"+ - "\u0005(\u0000\u0000\u0993\u0994\u0006\u00ae,\u0000\u0994\u0995\u0001\u0000"+ - "\u0000\u0000\u0995\u0996\u0006\u00ae\u0018\u0000\u0996\u016b\u0001\u0000"+ - "\u0000\u0000\u0997\u0998\u0005)\u0000\u0000\u0998\u0999\u0006\u00af-\u0000"+ - "\u0999\u016d\u0001\u0000\u0000\u0000\u099a\u099b\t\u0000\u0000\u0000\u099b"+ - "\u099c\u0001\u0000\u0000\u0000\u099c\u099d\u0006\u00b0\r\u0000\u099d\u016f"+ - "\u0001\u0000\u0000\u0000\u099e\u099f\u0005\u0000\u0000\u0001\u099f\u09a0"+ - "\u0001\u0000\u0000\u0000\u09a0\u09a1\u0006\u00b1\u001b\u0000\u09a1\u09a2"+ - "\u0006\u00b1\u0017\u0000\u09a2\u0171\u0001\u0000\u0000\u0000\u09a3\u09a5"+ - "\u0007%\u0000\u0000\u09a4\u09a3\u0001\u0000\u0000\u0000\u09a5\u09a6\u0001"+ - "\u0000\u0000\u0000\u09a6\u09a4\u0001\u0000\u0000\u0000\u09a6\u09a7\u0001"+ - "\u0000\u0000\u0000\u09a7\u09a8\u0001\u0000\u0000\u0000\u09a8\u09a9\u0006"+ - "\u00b2\r\u0000\u09a9\u0173\u0001\u0000\u0000\u0000\u09aa\u09ab\u0005("+ - "\u0000\u0000\u09ab\u09ac\u0006\u00b3.\u0000\u09ac\u09ad\u0001\u0000\u0000"+ - "\u0000\u09ad\u09ae\u0006\u00b3/\u0000\u09ae\u09af\u0006\u00b30\u0000\u09af"+ - "\u0175\u0001\u0000\u0000\u0000\u09b0\u09b1\t\u0000\u0000\u0000\u09b1\u09b2"+ - "\u0001\u0000\u0000\u0000\u09b2\u09b3\u0006\u00b4\t\u0000\u09b3\u09b4\u0006"+ - "\u00b4\u0017\u0000\u09b4\u0177\u0001\u0000\u0000\u0000\u09b5\u09b7\u0007"+ - "%\u0000\u0000\u09b6\u09b5\u0001\u0000\u0000\u0000\u09b7\u09b8\u0001\u0000"+ - "\u0000\u0000\u09b8\u09b6\u0001\u0000\u0000\u0000\u09b8\u09b9\u0001\u0000"+ - "\u0000\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b5"+ - "\r\u0000\u09bb\u0179\u0001\u0000\u0000\u0000\u09bc\u09bd\u0005(\u0000"+ - "\u0000\u09bd\u09be\u0006\u00b61\u0000\u09be\u017b\u0001\u0000\u0000\u0000"+ - "\u09bf\u09c0\u0005)\u0000\u0000\u09c0\u09c1\u0006\u00b72\u0000\u09c1\u017d"+ - "\u0001\u0000\u0000\u0000\u09c2\u09c3\u0007\u0010\u0000\u0000\u09c3\u09c4"+ - "\u0007\t\u0000\u0000\u09c4\u017f\u0001\u0000\u0000\u0000\u09c5\u09c6\u0003"+ - "\u00fex\u0000\u09c6\u09c7\u0001\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b9"+ - "\u0012\u0000\u09c8\u0181\u0001\u0000\u0000\u0000\u09c9\u09ca\u0005=\u0000"+ - "\u0000\u09ca\u09cb\u0005>\u0000\u0000\u09cb\u0183\u0001\u0000\u0000\u0000"+ - "\u09cc\u09cd\u0003\u0100y\u0000\u09cd\u09ce\u0001\u0000\u0000\u0000\u09ce"+ - "\u09cf\u0006\u00bb \u0000\u09cf\u0185\u0001\u0000\u0000\u0000\u09d0\u09d4"+ - "\u0003\u00f8u\u0000\u09d1\u09d4\u0003\u00fav\u0000\u09d2\u09d4\u0003\u00f0"+ - "q\u0000\u09d3\u09d0\u0001\u0000\u0000\u0000\u09d3\u09d1\u0001\u0000\u0000"+ - "\u0000\u09d3\u09d2\u0001\u0000\u0000\u0000\u09d4\u09d5\u0001\u0000\u0000"+ - "\u0000\u09d5\u09d6\u0006\u00bc \u0000\u09d6\u0187\u0001\u0000\u0000\u0000"+ - "\u09d7\u09d8\u0005:\u0000\u0000\u09d8\u09d9\u0005:\u0000\u0000\u09d9\u09da"+ - "\u0001\u0000\u0000\u0000\u09da\u09db\u0006\u00bd \u0000\u09db\u0189\u0001"+ - "\u0000\u0000\u0000\u09dc\u09dd\t\u0000\u0000\u0000\u09dd\u09de\u0001\u0000"+ - "\u0000\u0000\u09de\u09df\u0006\u00be \u0000\u09df\u018b\u0001\u0000\u0000"+ - "\u0000\u09e0\u09e1\u0005\u0000\u0000\u0001\u09e1\u09e2\u0001\u0000\u0000"+ - "\u0000\u09e2\u09e3\u0006\u00bf\u001b\u0000\u09e3\u09e4\u0006\u00bf\u0017"+ - "\u0000\u09e4\u018d\u0001\u0000\u0000\u0000\u09e5\u09e6\u0003\u00fcw\u0000"+ - "\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8\u0006\u00c03\u0000\u09e8"+ - "\u018f\u0001\u0000\u0000\u0000\u09e9\u09ea\u0005[\u0000\u0000\u09ea\u09eb"+ - "\u0006\u00c14\u0000\u09eb\u0191\u0001\u0000\u0000\u0000\u09ec\u09ed\u0005"+ - "]\u0000\u0000\u09ed\u09ee\u0006\u00c25\u0000\u09ee\u0193\u0001\u0000\u0000"+ - "\u0000\u09ef\u09f0\u0005{\u0000\u0000\u09f0\u09f1\u0006\u00c36\u0000\u09f1"+ - "\u09f2\u0001\u0000\u0000\u0000\u09f2\u09f3\u0006\u00c37\u0000\u09f3\u0195"+ - "\u0001\u0000\u0000\u0000\u09f4\u09f5\u0005}\u0000\u0000\u09f5\u09f6\u0006"+ - "\u00c48\u0000\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006\u00c4"+ - "7\u0000\u09f8\u0197\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005(\u0000\u0000"+ - "\u09fa\u09fb\u0006\u00c59\u0000\u09fb\u09fc\u0001\u0000\u0000\u0000\u09fc"+ - "\u09fd\u0006\u00c57\u0000\u09fd\u0199\u0001\u0000\u0000\u0000\u09fe\u09ff"+ - "\u0005)\u0000\u0000\u09ff\u0a00\u0006\u00c6:\u0000\u0a00\u019b\u0001\u0000"+ - "\u0000\u0000\u0a01\u0a04\u0003\u00f8u\u0000\u0a02\u0a04\u0003\u00fav\u0000"+ - "\u0a03\u0a01\u0001\u0000\u0000\u0000\u0a03\u0a02\u0001\u0000\u0000\u0000"+ - "\u0a04\u019d\u0001\u0000\u0000\u0000\u0a05\u0a06\u0003\u00fex\u0000\u0a06"+ - "\u0a07\u0001\u0000\u0000\u0000\u0a07\u0a08\u0006\u00c8\u0012\u0000\u0a08"+ - "\u019f\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0005=\u0000\u0000\u0a0a\u0a0b"+ - "\u0005>\u0000\u0000\u0a0b\u01a1\u0001\u0000\u0000\u0000\u0a0c\u0a0d\u0003"+ - "\u0100y\u0000\u0a0d\u0a0e\u0001\u0000\u0000\u0000\u0a0e\u0a0f\u0006\u00ca"+ - "\u0013\u0000\u0a0f\u01a3\u0001\u0000\u0000\u0000\u0a10\u0a11\u0005.\u0000"+ - "\u0000\u0a11\u01a5\u0001\u0000\u0000\u0000\u0a12\u0a13\u0005,\u0000\u0000"+ - "\u0a13\u0a14\u0006\u00cc;\u0000\u0a14\u01a7\u0001\u0000\u0000\u0000\u0a15"+ - "\u0a17\u0007&\u0000\u0000\u0a16\u0a15\u0001\u0000\u0000\u0000\u0a17\u0a18"+ - "\u0001\u0000\u0000\u0000\u0a18\u0a16\u0001\u0000\u0000\u0000\u0a18\u0a19"+ - "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0001\u0000\u0000\u0000\u0a1a\u0a1b"+ - "\u0006\u00cd\r\u0000\u0a1b\u01a9\u0001\u0000\u0000\u0000\u0a1c\u0a1d\u0003"+ - "\u00f0q\u0000\u0a1d\u01ab\u0001\u0000\u0000\u0000\u0a1e\u0a1f\t\u0000"+ - "\u0000\u0000\u0a1f\u0a20\u0001\u0000\u0000\u0000\u0a20\u0a21\u0006\u00cf"+ - "7\u0000\u0a21\u01ad\u0001\u0000\u0000\u0000\u0a22\u0a23\u0005\u0000\u0000"+ - "\u0001\u0a23\u0a24\u0001\u0000\u0000\u0000\u0a24\u0a25\u0006\u00d0\u001b"+ - "\u0000\u0a25\u0a26\u0006\u00d0\u0017\u0000\u0a26\u01af\u0001\u0000\u0000"+ - "\u0000\u0a27\u0a28\u0005/\u0000\u0000\u0a28\u0a29\u0005/\u0000\u0000\u0a29"+ - "\u0a2b\u0001\u0000\u0000\u0000\u0a2a\u0a2c\b\u001f\u0000\u0000\u0a2b\u0a2a"+ - "\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000\u0000\u0000\u0a2d\u0a2b"+ - "\u0001\u0000\u0000\u0000\u0a2d\u0a2e\u0001\u0000\u0000\u0000\u0a2e\u0a2f"+ - "\u0001\u0000\u0000\u0000\u0a2f\u0a30\u0006\u00d1\r\u0000\u0a30\u01b1\u0001"+ - "\u0000\u0000\u0000\u0a31\u0a32\u0005/\u0000\u0000\u0a32\u0a33\u0005*\u0000"+ - "\u0000\u0a33\u0a37\u0001\u0000\u0000\u0000\u0a34\u0a36\t\u0000\u0000\u0000"+ - "\u0a35\u0a34\u0001\u0000\u0000\u0000\u0a36\u0a39\u0001\u0000\u0000\u0000"+ - "\u0a37\u0a38\u0001\u0000\u0000\u0000\u0a37\u0a35\u0001\u0000\u0000\u0000"+ - "\u0a38\u0a3a\u0001\u0000\u0000\u0000\u0a39\u0a37\u0001\u0000\u0000\u0000"+ - "\u0a3a\u0a3b\u0005*\u0000\u0000\u0a3b\u0a3c\u0005/\u0000\u0000\u0a3c\u0a40"+ - "\u0001\u0000\u0000\u0000\u0a3d\u0a3f\u0007\u001f\u0000\u0000\u0a3e\u0a3d"+ - "\u0001\u0000\u0000\u0000\u0a3f\u0a42\u0001\u0000\u0000\u0000\u0a40\u0a3e"+ - "\u0001\u0000\u0000\u0000\u0a40\u0a41\u0001\u0000\u0000\u0000\u0a41\u0a43"+ - "\u0001\u0000\u0000\u0000\u0a42\u0a40\u0001\u0000\u0000\u0000\u0a43\u0a44"+ - "\u0006\u00d2\r\u0000\u0a44\u01b3\u0001\u0000\u0000\u0000\u0a45\u0a46\u0005"+ - "@\u0000\u0000\u0a46\u0a47\u0007\u0007\u0000\u0000\u0a47\u0a48\u0007\n"+ - "\u0000\u0000\u0a48\u0a49\u0007\u000b\u0000\u0000\u0a49\u0a4a\u0007\u0013"+ - "\u0000\u0000\u0a4a\u0a4b\u0007\u000f\u0000\u0000\u0a4b\u0a4c\u0007\u0013"+ - "\u0000\u0000\u0a4c\u0a4d\u0001\u0000\u0000\u0000\u0a4d\u0a4e\u0006\u00d3"+ - "\u0017\u0000\u0a4e\u01b5\u0001\u0000\u0000\u0000\u0a4f\u0a50\u0005@\u0000"+ - "\u0000\u0a50\u0a51\u0001\u0000\u0000\u0000\u0a51\u0a52\u0006\u00d4\t\u0000"+ - "\u0a52\u0a53\u0006\u00d4\u0017\u0000\u0a53\u01b7\u0001\u0000\u0000\u0000"+ - "\u0a54\u0a55\u0005[\u0000\u0000\u0a55\u0a56\u0001\u0000\u0000\u0000\u0a56"+ - "\u0a57\u0006\u00d5 \u0000\u0a57\u01b9\u0001\u0000\u0000\u0000\u0a58\u0a59"+ - "\u0005]\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000\u0000\u0a5a\u0a5b\u0006"+ - "\u00d6 \u0000\u0a5b\u01bb\u0001\u0000\u0000\u0000\u0a5c\u0a5d\u0005{\u0000"+ - "\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000\u0a5e\u0a5f\u0006\u00d7 \u0000"+ - "\u0a5f\u01bd\u0001\u0000\u0000\u0000\u0a60\u0a61\u0005}\u0000\u0000\u0a61"+ - "\u0a62\u0001\u0000\u0000\u0000\u0a62\u0a63\u0006\u00d8 \u0000\u0a63\u01bf"+ - "\u0001\u0000\u0000\u0000\u0a64\u0a67\u0003\u00f8u\u0000\u0a65\u0a67\u0003"+ - "\u00fav\u0000\u0a66\u0a64\u0001\u0000\u0000\u0000\u0a66\u0a65\u0001\u0000"+ - "\u0000\u0000\u0a67\u0a68\u0001\u0000\u0000\u0000\u0a68\u0a69\u0006\u00d9"+ - "<\u0000\u0a69\u01c1\u0001\u0000\u0000\u0000\u0a6a\u0a6b\u0003\u00fex\u0000"+ - "\u0a6b\u0a6c\u0001\u0000\u0000\u0000\u0a6c\u0a6d\u0006\u00da\u0012\u0000"+ - "\u0a6d\u01c3\u0001\u0000\u0000\u0000\u0a6e\u0a6f\u0007\n\u0000\u0000\u0a6f"+ - "\u0a70\u0007\u0007\u0000\u0000\u0a70\u0a71\u0007\f\u0000\u0000\u0a71\u0a72"+ - "\u0001\u0000\u0000\u0000\u0a72\u0a73\u0004\u00db\u000e\u0000\u0a73\u0a74"+ - "\u0001\u0000\u0000\u0000\u0a74\u0a75\u0006\u00db=\u0000\u0a75\u01c5\u0001"+ - "\u0000\u0000\u0000\u0a76\u0a77\u0007\u000e\u0000\u0000\u0a77\u0a78\u0007"+ - "\b\u0000\u0000\u0a78\u0a79\u0007\u0010\u0000\u0000\u0a79\u0a7a\u0007\t"+ - "\u0000\u0000\u0a7a\u0a7b\u0007\t\u0000\u0000\u0a7b\u0a7c\u0001\u0000\u0000"+ - "\u0000\u0a7c\u0a7d\u0006\u00dc>\u0000\u0a7d\u01c7\u0001\u0000\u0000\u0000"+ - "\u0a7e\u0a7f\u0003\u0100y\u0000\u0a7f\u0a80\u0001\u0000\u0000\u0000\u0a80"+ - "\u0a81\u0006\u00dd\u0013\u0000\u0a81\u01c9\u0001\u0000\u0000\u0000\u0a82"+ - "\u0a84\u0005\\\u0000\u0000\u0a83\u0a82\u0001\u0000\u0000\u0000\u0a83\u0a84"+ - "\u0001\u0000\u0000\u0000\u0a84\u0a88\u0001\u0000\u0000\u0000\u0a85\u0a86"+ - "\u0003\u00f0q\u0000\u0a86\u0a87\u0005\\\u0000\u0000\u0a87\u0a89\u0001"+ - "\u0000\u0000\u0000\u0a88\u0a85\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0001"+ - "\u0000\u0000\u0000\u0a8a\u0a88\u0001\u0000\u0000\u0000\u0a8a\u0a8b\u0001"+ - "\u0000\u0000\u0000\u0a8b\u0a8c\u0001\u0000\u0000\u0000\u0a8c\u0a8d\u0006"+ - "\u00de\u0014\u0000\u0a8d\u01cb\u0001\u0000\u0000\u0000\u0a8e\u0a8f\u0005"+ - "\\\u0000\u0000\u0a8f\u0a90\u0003\u00f0q\u0000\u0a90\u0a91\u0001\u0000"+ - "\u0000\u0000\u0a91\u0a92\u0006\u00df\u0015\u0000\u0a92\u01cd\u0001\u0000"+ - "\u0000\u0000\u0a93\u0a94\u0003\u00f0q\u0000\u0a94\u0a95\u0001\u0000\u0000"+ - "\u0000\u0a95\u0a96\u0006\u00e0\u0015\u0000\u0a96\u01cf\u0001\u0000\u0000"+ - "\u0000\u0a97\u0a98\u0005:\u0000\u0000\u0a98\u0a99\u0005:\u0000\u0000\u0a99"+ - "\u0a9a\u0001\u0000\u0000\u0000\u0a9a\u0a9b\u0006\u00e1\u0016\u0000\u0a9b"+ - "\u01d1\u0001\u0000\u0000\u0000\u0a9c\u0a9d\u0005(\u0000\u0000\u0a9d\u0a9e"+ - "\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00e2\u0018\u0000\u0a9f\u01d3"+ - "\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0005)\u0000\u0000\u0aa1\u0aa2\u0001"+ - "\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e3\u0019\u0000\u0aa3\u01d5\u0001"+ - "\u0000\u0000\u0000\u0aa4\u0aa5\u0005 \u0000\u0000\u0aa5\u0aa6\u0001\u0000"+ - "\u0000\u0000\u0aa6\u0aa7\u0006\u00e4\r\u0000\u0aa7\u01d7\u0001\u0000\u0000"+ - "\u0000\u0aa8\u0aa9\u0005\u0000\u0000\u0001\u0aa9\u0aaa\u0001\u0000\u0000"+ - "\u0000\u0aaa\u0aab\u0006\u00e5\u001b\u0000\u0aab\u0aac\u0006\u00e5\u0017"+ - "\u0000\u0aac\u01d9\u0001\u0000\u0000\u0000\u0aad\u0aae\t\u0000\u0000\u0000"+ - "\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e6\r\u0000\u0ab0"+ - "\u01db\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005?\u0000\u0000\u0ab2\u0ab3"+ - "\u0005>\u0000\u0000\u0ab3\u0ab4\u0001\u0000\u0000\u0000\u0ab4\u0ab5\u0006"+ - "\u00e7\u0017\u0000\u0ab5\u01dd\u0001\u0000\u0000\u0000\u0ab6\u0ab7\u0005"+ - "/\u0000\u0000\u0ab7\u0ab8\u0005/\u0000\u0000\u0ab8\u0aba\u0001\u0000\u0000"+ - "\u0000\u0ab9\u0abb\b\u001f\u0000\u0000\u0aba\u0ab9\u0001\u0000\u0000\u0000"+ - "\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc\u0aba\u0001\u0000\u0000\u0000"+ - "\u0abc\u0abd\u0001\u0000\u0000\u0000\u0abd\u0abe\u0001\u0000\u0000\u0000"+ - "\u0abe\u0abf\u0006\u00e8\r\u0000\u0abf\u01df\u0001\u0000\u0000\u0000\u0ac0"+ - "\u0ac1\u0005/\u0000\u0000\u0ac1\u0ac2\u0005*\u0000\u0000\u0ac2\u0ac6\u0001"+ - "\u0000\u0000\u0000\u0ac3\u0ac5\t\u0000\u0000\u0000\u0ac4\u0ac3\u0001\u0000"+ - "\u0000\u0000\u0ac5\u0ac8\u0001\u0000\u0000\u0000\u0ac6\u0ac7\u0001\u0000"+ - "\u0000\u0000\u0ac6\u0ac4\u0001\u0000\u0000\u0000\u0ac7\u0ac9\u0001\u0000"+ - "\u0000\u0000\u0ac8\u0ac6\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0005*\u0000"+ - "\u0000\u0aca\u0acb\u0005/\u0000\u0000\u0acb\u0acc\u0001\u0000\u0000\u0000"+ - "\u0acc\u0acd\u0006\u00e9\r\u0000\u0acd\u01e1\u0001\u0000\u0000\u0000\u0ace"+ - "\u0acf\u0005[\u0000\u0000\u0acf\u0ad0\u0001\u0000\u0000\u0000\u0ad0\u0ad1"+ - "\u0006\u00ea \u0000\u0ad1\u01e3\u0001\u0000\u0000\u0000\u0ad2\u0ad3\u0005"+ - "]\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad4\u0ad5\u0006\u00eb"+ - " \u0000\u0ad5\u01e5\u0001\u0000\u0000\u0000\u0ad6\u0ad7\u0005{\u0000\u0000"+ - "\u0ad7\u0ad8\u0001\u0000\u0000\u0000\u0ad8\u0ad9\u0006\u00ec \u0000\u0ad9"+ - "\u01e7\u0001\u0000\u0000\u0000\u0ada\u0adb\u0005}\u0000\u0000\u0adb\u0adc"+ - "\u0001\u0000\u0000\u0000\u0adc\u0add\u0006\u00ed \u0000\u0add\u01e9\u0001"+ - "\u0000\u0000\u0000\u0ade\u0ae1\u0003\u00f8u\u0000\u0adf\u0ae1\u0003\u00fa"+ - "v\u0000\u0ae0\u0ade\u0001\u0000\u0000\u0000\u0ae0\u0adf\u0001\u0000\u0000"+ - "\u0000\u0ae1\u0ae2\u0001\u0000\u0000\u0000\u0ae2\u0ae3\u0006\u00ee<\u0000"+ - "\u0ae3\u01eb\u0001\u0000\u0000\u0000\u0ae4\u0ae5\u0003\u00fex\u0000\u0ae5"+ - "\u0ae6\u0001\u0000\u0000\u0000\u0ae6\u0ae7\u0006\u00ef\u0012\u0000\u0ae7"+ - "\u01ed\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0003\u0100y\u0000\u0ae9\u0aea"+ - "\u0001\u0000\u0000\u0000\u0aea\u0aeb\u0006\u00f0\u0013\u0000\u0aeb\u01ef"+ - "\u0001\u0000\u0000\u0000\u0aec\u0aed\u0003\u00f0q\u0000\u0aed\u0aee\u0001"+ - "\u0000\u0000\u0000\u0aee\u0aef\u0006\u00f1\u0015\u0000\u0aef\u01f1\u0001"+ - "\u0000\u0000\u0000\u0af0\u0af1\u0005:\u0000\u0000\u0af1\u0af2\u0005:\u0000"+ - "\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3\u0af4\u0006\u00f2\u0016"+ - "\u0000\u0af4\u01f3\u0001\u0000\u0000\u0000\u0af5\u0af6\u0005-\u0000\u0000"+ - "\u0af6\u0af7\u0005>\u0000\u0000\u0af7\u0af8\u0001\u0000\u0000\u0000\u0af8"+ - "\u0af9\u0006\u00f3\u001a\u0000\u0af9\u01f5\u0001\u0000\u0000\u0000\u0afa"+ - "\u0afb\u0005(\u0000\u0000\u0afb\u0afc\u0001\u0000\u0000\u0000\u0afc\u0afd"+ - "\u0006\u00f4\u0018\u0000\u0afd\u01f7\u0001\u0000\u0000\u0000\u0afe\u0aff"+ - "\u0005)\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000\u0000\u0b00\u0b01\u0006"+ - "\u00f5\u0019\u0000\u0b01\u01f9\u0001\u0000\u0000\u0000\u0b02\u0b03\u0005"+ - "\u0000\u0000\u0001\u0b03\u0b04\u0001\u0000\u0000\u0000\u0b04\u0b05\u0006"+ - "\u00f6 \u0000\u0b05\u0b06\u0006\u00f6\u0017\u0000\u0b06\u01fb\u0001\u0000"+ - "\u0000\u0000\u0b07\u0b08\t\u0000\u0000\u0000\u0b08\u0b09\u0001\u0000\u0000"+ - "\u0000\u0b09\u0b0a\u0006\u00f7 \u0000\u0b0a\u01fd\u0001\u0000\u0000\u0000"+ - "\u0b0b\u0b0c\u0005@\u0000\u0000\u0b0c\u0b0d\u0007\u0007\u0000\u0000\u0b0d"+ - "\u0b0e\u0007\n\u0000\u0000\u0b0e\u0b0f\u0007\u000b\u0000\u0000\u0b0f\u0b10"+ - "\u0007\u001c\u0000\u0000\u0b10\u0b11\u0007\u0007\u0000\u0000\u0b11\u0b12"+ - "\u0007\u0016\u0000\u0000\u0b12\u0b13\u0007\u0017\u0000\u0000\u0b13\u0b14"+ - "\u0007\u0010\u0000\u0000\u0b14\u0b15\u0007\r\u0000\u0000\u0b15\u0b16\u0007"+ - "\u0005\u0000\u0000\u0b16\u0b17\u0007\u0012\u0000\u0000\u0b17\u0b18\u0001"+ - "\u0000\u0000\u0000\u0b18\u0b19\u0006\u00f8?\u0000\u0b19\u0b1a\u0006\u00f8"+ - "!\u0000\u0b1a\u01ff\u0001\u0000\u0000\u0000\u0b1b\u0b1c\t\u0000\u0000"+ - "\u0000\u0b1c\u0b1d\u0004\u00f9\u000f\u0000\u0b1d\u0b1e\u0001\u0000\u0000"+ - "\u0000\u0b1e\u0b1f\u0006\u00f9\r\u0000\u0b1f\u0201\u0001\u0000\u0000\u0000"+ - "\u0b20\u0b21\u0005\u0000\u0000\u0001\u0b21\u0b22\u0001\u0000\u0000\u0000"+ - "\u0b22\u0b23\u0006\u00fa\u001b\u0000\u0b23\u0b24\u0006\u00fa!\u0000\u0b24"+ - "\u0203\u0001\u0000\u0000\u0000\u0b25\u0b26\t\u0000\u0000\u0000\u0b26\u0b27"+ - "\u0001\u0000\u0000\u0000\u0b27\u0b28\u0006\u00fb\u001c\u0000\u0b28\u0205"+ - "\u0001\u0000\u0000\u0000\u0b29\u0b2a\u0005-\u0000\u0000\u0b2a\u0b2b\u0005"+ - "-\u0000\u0000\u0b2b\u0b2c\u0005}\u0000\u0000\u0b2c\u0b2d\u0005}\u0000"+ - "\u0000\u0b2d\u0b2e\u0001\u0000\u0000\u0000\u0b2e\u0b2f\u0006\u00fc\u0017"+ - "\u0000\u0b2f\u0b30\u0006\u00fc\r\u0000\u0b30\u0207\u0001\u0000\u0000\u0000"+ - "\u0b31\u0b32\t\u0000\u0000\u0000\u0b32\u0b33\u0004\u00fd\u0010\u0000\u0b33"+ - "\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006\u00fd\r\u0000\u0b35\u0209"+ - "\u0001\u0000\u0000\u0000\u0b36\u0b37\t\u0000\u0000\u0000\u0b37\u0b38\u0001"+ - "\u0000\u0000\u0000\u0b38\u0b39\u0006\u00fe\r\u0000\u0b39\u020b\u0001\u0000"+ - "\u0000\u0000\u0b3a\u0b3b\u0005\u0000\u0000\u0001\u0b3b\u0b3c\u0001\u0000"+ - "\u0000\u0000\u0b3c\u0b3d\u0006\u00ff\u0017\u0000\u0b3d\u0b3e\u0006\u00ff"+ - "\r\u0000\u0b3e\u020d\u0001\u0000\u0000\u0000t\u0000\u0001\u0002\u0003"+ - "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u0212\u0216\u021c\u0220\u0227"+ - "\u022e\u0234\u023a\u0241\u0246\u024d\u0253\u025d\u0263\u0269\u0270\u027c"+ - "\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e\u059e\u05ca\u05ed\u0653\u0699"+ - "\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9\u06e0\u06f4\u06fc\u0703\u070b"+ - "\u070f\u0718\u071b\u0722\u0729\u072e\u073a\u073f\u0741\u074d\u0754\u075b"+ - "\u0763\u0765\u076e\u0770\u077b\u0793\u07a8\u07ac\u07b7\u07bd\u07c9\u07cd"+ - "\u07db\u07e9\u07fa\u080a\u081b\u0827\u0837\u0844\u0854\u0861\u087a\u088b"+ - "\u088e\u089b\u08a2\u08d3\u08da\u0906\u0910\u094f\u0973\u097e\u0985\u09a6"+ - "\u09b8\u09d3\u0a03\u0a18\u0a2d\u0a37\u0a40\u0a66\u0a83\u0a8a\u0abc\u0ac6"+ - "\u0ae0@\u0005\u0005\u0000\u0005\u0003\u0000\u0005\b\u0000\u0005\u0007"+ - "\u0000\u0007g\u0000\u0005\n\u0000\u0005\f\u0000\u0005\u0001\u0000\u0005"+ - "\u0002\u0000\u0007\u0017\u0000\u0005\u000b\u0000\u0001c\u0000\u0007s\u0000"+ - "\u0006\u0000\u0000\u0001h\u0001\u0001i\u0002\u0001m\u0003\u0005\r\u0000"+ - "\u0007\u0002\u0000\u0007\u0003\u0000\u0007\u0006\u0000\u0007\u0005\u0000"+ - "\u0007\u0007\u0000\u0004\u0000\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007"+ - "\t\u0000\u0007\u0016\u0000\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a"+ - "\u0004\u0001\u009b\u0005\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c"+ - "\u0006\u0001\u009d\u0007\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t"+ - "\u0007\u000f\u0000\u0001\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001"+ - "\u00a7\f\u0001\u00ae\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b"+ - "\u0000\u0005\t\u0000\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000"+ - "\u0001\u00c1\u0012\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001"+ - "\u00c4\u0015\u0001\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007"+ - "\u0015\u0000\u0007\u0004\u0000\u0007\b\u0000\u0007i\u0000"; + "\u0000\u0983\u0984\u0001\u0000\u0000\u0000\u0984\u0985\u0006\u00a9\u0012"+ + "\u0000\u0985\u0161\u0001\u0000\u0000\u0000\u0986\u0987\u0003\u0100y\u0000"+ + "\u0987\u0988\u0001\u0000\u0000\u0000\u0988\u0989\u0006\u00aa\u0013\u0000"+ + "\u0989\u0163\u0001\u0000\u0000\u0000\u098a\u098c\u0005\\\u0000\u0000\u098b"+ + "\u098a\u0001\u0000\u0000\u0000\u098b\u098c\u0001\u0000\u0000\u0000\u098c"+ + "\u0990\u0001\u0000\u0000\u0000\u098d\u098e\u0003\u00f0q\u0000\u098e\u098f"+ + "\u0005\\\u0000\u0000\u098f\u0991\u0001\u0000\u0000\u0000\u0990\u098d\u0001"+ + "\u0000\u0000\u0000\u0991\u0992\u0001\u0000\u0000\u0000\u0992\u0990\u0001"+ + "\u0000\u0000\u0000\u0992\u0993\u0001\u0000\u0000\u0000\u0993\u0994\u0001"+ + "\u0000\u0000\u0000\u0994\u0995\u0006\u00ab\u0014\u0000\u0995\u0165\u0001"+ + "\u0000\u0000\u0000\u0996\u0997\u0003\u00f0q\u0000\u0997\u0998\u0001\u0000"+ + "\u0000\u0000\u0998\u0999\u0006\u00ac\u0015\u0000\u0999\u0167\u0001\u0000"+ + "\u0000\u0000\u099a\u099b\u0005:\u0000\u0000\u099b\u099c\u0005:\u0000\u0000"+ + "\u099c\u099d\u0001\u0000\u0000\u0000\u099d\u099e\u0006\u00ad\u0016\u0000"+ + "\u099e\u0169\u0001\u0000\u0000\u0000\u099f\u09a0\u0005(\u0000\u0000\u09a0"+ + "\u09a1\u0006\u00ae,\u0000\u09a1\u09a2\u0001\u0000\u0000\u0000\u09a2\u09a3"+ + "\u0006\u00ae\u0018\u0000\u09a3\u016b\u0001\u0000\u0000\u0000\u09a4\u09a5"+ + "\u0005)\u0000\u0000\u09a5\u09a6\u0006\u00af-\u0000\u09a6\u016d\u0001\u0000"+ + "\u0000\u0000\u09a7\u09a8\t\u0000\u0000\u0000\u09a8\u09a9\u0001\u0000\u0000"+ + "\u0000\u09a9\u09aa\u0006\u00b0\r\u0000\u09aa\u016f\u0001\u0000\u0000\u0000"+ + "\u09ab\u09ac\u0005\u0000\u0000\u0001\u09ac\u09ad\u0001\u0000\u0000\u0000"+ + "\u09ad\u09ae\u0006\u00b1\u001b\u0000\u09ae\u09af\u0006\u00b1\u0017\u0000"+ + "\u09af\u0171\u0001\u0000\u0000\u0000\u09b0\u09b2\u0007%\u0000\u0000\u09b1"+ + "\u09b0\u0001\u0000\u0000\u0000\u09b2\u09b3\u0001\u0000\u0000\u0000\u09b3"+ + "\u09b1\u0001\u0000\u0000\u0000\u09b3\u09b4\u0001\u0000\u0000\u0000\u09b4"+ + "\u09b5\u0001\u0000\u0000\u0000\u09b5\u09b6\u0006\u00b2\r\u0000\u09b6\u0173"+ + "\u0001\u0000\u0000\u0000\u09b7\u09b8\u0005(\u0000\u0000\u09b8\u09b9\u0006"+ + "\u00b3.\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b3"+ + "/\u0000\u09bb\u09bc\u0006\u00b30\u0000\u09bc\u0175\u0001\u0000\u0000\u0000"+ + "\u09bd\u09be\t\u0000\u0000\u0000\u09be\u09bf\u0001\u0000\u0000\u0000\u09bf"+ + "\u09c0\u0006\u00b4\t\u0000\u09c0\u09c1\u0006\u00b4\u0017\u0000\u09c1\u0177"+ + "\u0001\u0000\u0000\u0000\u09c2\u09c4\u0007%\u0000\u0000\u09c3\u09c2\u0001"+ + "\u0000\u0000\u0000\u09c4\u09c5\u0001\u0000\u0000\u0000\u09c5\u09c3\u0001"+ + "\u0000\u0000\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6\u09c7\u0001"+ + "\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b5\r\u0000\u09c8\u0179\u0001\u0000"+ + "\u0000\u0000\u09c9\u09ca\u0005(\u0000\u0000\u09ca\u09cb\u0006\u00b61\u0000"+ + "\u09cb\u017b\u0001\u0000\u0000\u0000\u09cc\u09cd\u0005)\u0000\u0000\u09cd"+ + "\u09ce\u0006\u00b72\u0000\u09ce\u017d\u0001\u0000\u0000\u0000\u09cf\u09d0"+ + "\u0007\u0010\u0000\u0000\u09d0\u09d1\u0007\t\u0000\u0000\u09d1\u017f\u0001"+ + "\u0000\u0000\u0000\u09d2\u09d3\u0003\u00fex\u0000\u09d3\u09d4\u0001\u0000"+ + "\u0000\u0000\u09d4\u09d5\u0006\u00b9\u0012\u0000\u09d5\u0181\u0001\u0000"+ + "\u0000\u0000\u09d6\u09d7\u0005=\u0000\u0000\u09d7\u09d8\u0005>\u0000\u0000"+ + "\u09d8\u0183\u0001\u0000\u0000\u0000\u09d9\u09da\u0003\u0100y\u0000\u09da"+ + "\u09db\u0001\u0000\u0000\u0000\u09db\u09dc\u0006\u00bb \u0000\u09dc\u0185"+ + "\u0001\u0000\u0000\u0000\u09dd\u09e1\u0003\u00f8u\u0000\u09de\u09e1\u0003"+ + "\u00fav\u0000\u09df\u09e1\u0003\u00f0q\u0000\u09e0\u09dd\u0001\u0000\u0000"+ + "\u0000\u09e0\u09de\u0001\u0000\u0000\u0000\u09e0\u09df\u0001\u0000\u0000"+ + "\u0000\u09e1\u09e2\u0001\u0000\u0000\u0000\u09e2\u09e3\u0006\u00bc \u0000"+ + "\u09e3\u0187\u0001\u0000\u0000\u0000\u09e4\u09e5\u0005:\u0000\u0000\u09e5"+ + "\u09e6\u0005:\u0000\u0000\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8"+ + "\u0006\u00bd \u0000\u09e8\u0189\u0001\u0000\u0000\u0000\u09e9\u09ea\t"+ + "\u0000\u0000\u0000\u09ea\u09eb\u0001\u0000\u0000\u0000\u09eb\u09ec\u0006"+ + "\u00be \u0000\u09ec\u018b\u0001\u0000\u0000\u0000\u09ed\u09ee\u0005\u0000"+ + "\u0000\u0001\u09ee\u09ef\u0001\u0000\u0000\u0000\u09ef\u09f0\u0006\u00bf"+ + "\u001b\u0000\u09f0\u09f1\u0006\u00bf\u0017\u0000\u09f1\u018d\u0001\u0000"+ + "\u0000\u0000\u09f2\u09f3\u0003\u00fcw\u0000\u09f3\u09f4\u0001\u0000\u0000"+ + "\u0000\u09f4\u09f5\u0006\u00c03\u0000\u09f5\u018f\u0001\u0000\u0000\u0000"+ + "\u09f6\u09f7\u0005[\u0000\u0000\u09f7\u09f8\u0006\u00c14\u0000\u09f8\u0191"+ + "\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005]\u0000\u0000\u09fa\u09fb\u0006"+ + "\u00c25\u0000\u09fb\u0193\u0001\u0000\u0000\u0000\u09fc\u09fd\u0005{\u0000"+ + "\u0000\u09fd\u09fe\u0006\u00c36\u0000\u09fe\u09ff\u0001\u0000\u0000\u0000"+ + "\u09ff\u0a00\u0006\u00c37\u0000\u0a00\u0195\u0001\u0000\u0000\u0000\u0a01"+ + "\u0a02\u0005}\u0000\u0000\u0a02\u0a03\u0006\u00c48\u0000\u0a03\u0a04\u0001"+ + "\u0000\u0000\u0000\u0a04\u0a05\u0006\u00c47\u0000\u0a05\u0197\u0001\u0000"+ + "\u0000\u0000\u0a06\u0a07\u0005(\u0000\u0000\u0a07\u0a08\u0006\u00c59\u0000"+ + "\u0a08\u0a09\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0006\u00c57\u0000\u0a0a"+ + "\u0199\u0001\u0000\u0000\u0000\u0a0b\u0a0c\u0005)\u0000\u0000\u0a0c\u0a0d"+ + "\u0006\u00c6:\u0000\u0a0d\u019b\u0001\u0000\u0000\u0000\u0a0e\u0a11\u0003"+ + "\u00f8u\u0000\u0a0f\u0a11\u0003\u00fav\u0000\u0a10\u0a0e\u0001\u0000\u0000"+ + "\u0000\u0a10\u0a0f\u0001\u0000\u0000\u0000\u0a11\u019d\u0001\u0000\u0000"+ + "\u0000\u0a12\u0a13\u0003\u00fex\u0000\u0a13\u0a14\u0001\u0000\u0000\u0000"+ + "\u0a14\u0a15\u0006\u00c8\u0012\u0000\u0a15\u019f\u0001\u0000\u0000\u0000"+ + "\u0a16\u0a17\u0005=\u0000\u0000\u0a17\u0a18\u0005>\u0000\u0000\u0a18\u01a1"+ + "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0003\u0100y\u0000\u0a1a\u0a1b\u0001"+ + "\u0000\u0000\u0000\u0a1b\u0a1c\u0006\u00ca\u0013\u0000\u0a1c\u01a3\u0001"+ + "\u0000\u0000\u0000\u0a1d\u0a1e\u0005.\u0000\u0000\u0a1e\u01a5\u0001\u0000"+ + "\u0000\u0000\u0a1f\u0a20\u0005,\u0000\u0000\u0a20\u0a21\u0006\u00cc;\u0000"+ + "\u0a21\u01a7\u0001\u0000\u0000\u0000\u0a22\u0a24\u0007&\u0000\u0000\u0a23"+ + "\u0a22\u0001\u0000\u0000\u0000\u0a24\u0a25\u0001\u0000\u0000\u0000\u0a25"+ + "\u0a23\u0001\u0000\u0000\u0000\u0a25\u0a26\u0001\u0000\u0000\u0000\u0a26"+ + "\u0a27\u0001\u0000\u0000\u0000\u0a27\u0a28\u0006\u00cd\r\u0000\u0a28\u01a9"+ + "\u0001\u0000\u0000\u0000\u0a29\u0a2a\u0003\u00f0q\u0000\u0a2a\u01ab\u0001"+ + "\u0000\u0000\u0000\u0a2b\u0a2c\t\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000"+ + "\u0000\u0000\u0a2d\u0a2e\u0006\u00cf7\u0000\u0a2e\u01ad\u0001\u0000\u0000"+ + "\u0000\u0a2f\u0a30\u0005\u0000\u0000\u0001\u0a30\u0a31\u0001\u0000\u0000"+ + "\u0000\u0a31\u0a32\u0006\u00d0\u001b\u0000\u0a32\u0a33\u0006\u00d0\u0017"+ + "\u0000\u0a33\u01af\u0001\u0000\u0000\u0000\u0a34\u0a35\u0005/\u0000\u0000"+ + "\u0a35\u0a36\u0005/\u0000\u0000\u0a36\u0a38\u0001\u0000\u0000\u0000\u0a37"+ + "\u0a39\b\u001f\u0000\u0000\u0a38\u0a37\u0001\u0000\u0000\u0000\u0a39\u0a3a"+ + "\u0001\u0000\u0000\u0000\u0a3a\u0a38\u0001\u0000\u0000\u0000\u0a3a\u0a3b"+ + "\u0001\u0000\u0000\u0000\u0a3b\u0a3c\u0001\u0000\u0000\u0000\u0a3c\u0a3d"+ + "\u0006\u00d1\r\u0000\u0a3d\u01b1\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0005"+ + "/\u0000\u0000\u0a3f\u0a40\u0005*\u0000\u0000\u0a40\u0a44\u0001\u0000\u0000"+ + "\u0000\u0a41\u0a43\t\u0000\u0000\u0000\u0a42\u0a41\u0001\u0000\u0000\u0000"+ + "\u0a43\u0a46\u0001\u0000\u0000\u0000\u0a44\u0a45\u0001\u0000\u0000\u0000"+ + "\u0a44\u0a42\u0001\u0000\u0000\u0000\u0a45\u0a47\u0001\u0000\u0000\u0000"+ + "\u0a46\u0a44\u0001\u0000\u0000\u0000\u0a47\u0a48\u0005*\u0000\u0000\u0a48"+ + "\u0a49\u0005/\u0000\u0000\u0a49\u0a4d\u0001\u0000\u0000\u0000\u0a4a\u0a4c"+ + "\u0007\u001f\u0000\u0000\u0a4b\u0a4a\u0001\u0000\u0000\u0000\u0a4c\u0a4f"+ + "\u0001\u0000\u0000\u0000\u0a4d\u0a4b\u0001\u0000\u0000\u0000\u0a4d\u0a4e"+ + "\u0001\u0000\u0000\u0000\u0a4e\u0a50\u0001\u0000\u0000\u0000\u0a4f\u0a4d"+ + "\u0001\u0000\u0000\u0000\u0a50\u0a51\u0006\u00d2\r\u0000\u0a51\u01b3\u0001"+ + "\u0000\u0000\u0000\u0a52\u0a53\u0005@\u0000\u0000\u0a53\u0a54\u0007\u0007"+ + "\u0000\u0000\u0a54\u0a55\u0007\n\u0000\u0000\u0a55\u0a56\u0007\u000b\u0000"+ + "\u0000\u0a56\u0a57\u0007\u0013\u0000\u0000\u0a57\u0a58\u0007\u000f\u0000"+ + "\u0000\u0a58\u0a59\u0007\u0013\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000"+ + "\u0000\u0a5a\u0a5b\u0006\u00d3\u0017\u0000\u0a5b\u01b5\u0001\u0000\u0000"+ + "\u0000\u0a5c\u0a5d\u0005@\u0000\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000"+ + "\u0a5e\u0a5f\u0006\u00d4\t\u0000\u0a5f\u0a60\u0006\u00d4\u0017\u0000\u0a60"+ + "\u01b7\u0001\u0000\u0000\u0000\u0a61\u0a62\u0005[\u0000\u0000\u0a62\u0a63"+ + "\u0001\u0000\u0000\u0000\u0a63\u0a64\u0006\u00d5 \u0000\u0a64\u01b9\u0001"+ + "\u0000\u0000\u0000\u0a65\u0a66\u0005]\u0000\u0000\u0a66\u0a67\u0001\u0000"+ + "\u0000\u0000\u0a67\u0a68\u0006\u00d6 \u0000\u0a68\u01bb\u0001\u0000\u0000"+ + "\u0000\u0a69\u0a6a\u0005{\u0000\u0000\u0a6a\u0a6b\u0001\u0000\u0000\u0000"+ + "\u0a6b\u0a6c\u0006\u00d7 \u0000\u0a6c\u01bd\u0001\u0000\u0000\u0000\u0a6d"+ + "\u0a6e\u0005}\u0000\u0000\u0a6e\u0a6f\u0001\u0000\u0000\u0000\u0a6f\u0a70"+ + "\u0006\u00d8 \u0000\u0a70\u01bf\u0001\u0000\u0000\u0000\u0a71\u0a74\u0003"+ + "\u00f8u\u0000\u0a72\u0a74\u0003\u00fav\u0000\u0a73\u0a71\u0001\u0000\u0000"+ + "\u0000\u0a73\u0a72\u0001\u0000\u0000\u0000\u0a74\u0a75\u0001\u0000\u0000"+ + "\u0000\u0a75\u0a76\u0006\u00d9<\u0000\u0a76\u01c1\u0001\u0000\u0000\u0000"+ + "\u0a77\u0a78\u0003\u00fex\u0000\u0a78\u0a79\u0001\u0000\u0000\u0000\u0a79"+ + "\u0a7a\u0006\u00da\u0012\u0000\u0a7a\u01c3\u0001\u0000\u0000\u0000\u0a7b"+ + "\u0a7c\u0007\n\u0000\u0000\u0a7c\u0a7d\u0007\u0007\u0000\u0000\u0a7d\u0a7e"+ + "\u0007\f\u0000\u0000\u0a7e\u0a7f\u0001\u0000\u0000\u0000\u0a7f\u0a80\u0004"+ + "\u00db\u000e\u0000\u0a80\u0a81\u0001\u0000\u0000\u0000\u0a81\u0a82\u0006"+ + "\u00db=\u0000\u0a82\u01c5\u0001\u0000\u0000\u0000\u0a83\u0a84\u0007\u000e"+ + "\u0000\u0000\u0a84\u0a85\u0007\b\u0000\u0000\u0a85\u0a86\u0007\u0010\u0000"+ + "\u0000\u0a86\u0a87\u0007\t\u0000\u0000\u0a87\u0a88\u0007\t\u0000\u0000"+ + "\u0a88\u0a89\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0006\u00dc>\u0000\u0a8a"+ + "\u01c7\u0001\u0000\u0000\u0000\u0a8b\u0a8c\u0003\u0100y\u0000\u0a8c\u0a8d"+ + "\u0001\u0000\u0000\u0000\u0a8d\u0a8e\u0006\u00dd\u0013\u0000\u0a8e\u01c9"+ + "\u0001\u0000\u0000\u0000\u0a8f\u0a91\u0005\\\u0000\u0000\u0a90\u0a8f\u0001"+ + "\u0000\u0000\u0000\u0a90\u0a91\u0001\u0000\u0000\u0000\u0a91\u0a95\u0001"+ + "\u0000\u0000\u0000\u0a92\u0a93\u0003\u00f0q\u0000\u0a93\u0a94\u0005\\"+ + "\u0000\u0000\u0a94\u0a96\u0001\u0000\u0000\u0000\u0a95\u0a92\u0001\u0000"+ + "\u0000\u0000\u0a96\u0a97\u0001\u0000\u0000\u0000\u0a97\u0a95\u0001\u0000"+ + "\u0000\u0000\u0a97\u0a98\u0001\u0000\u0000\u0000\u0a98\u0a99\u0001\u0000"+ + "\u0000\u0000\u0a99\u0a9a\u0006\u00de\u0014\u0000\u0a9a\u01cb\u0001\u0000"+ + "\u0000\u0000\u0a9b\u0a9c\u0005\\\u0000\u0000\u0a9c\u0a9d\u0003\u00f0q"+ + "\u0000\u0a9d\u0a9e\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00df\u0015"+ + "\u0000\u0a9f\u01cd\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0003\u00f0q\u0000"+ + "\u0aa1\u0aa2\u0001\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e0\u0015\u0000"+ + "\u0aa3\u01cf\u0001\u0000\u0000\u0000\u0aa4\u0aa5\u0005:\u0000\u0000\u0aa5"+ + "\u0aa6\u0005:\u0000\u0000\u0aa6\u0aa7\u0001\u0000\u0000\u0000\u0aa7\u0aa8"+ + "\u0006\u00e1\u0016\u0000\u0aa8\u01d1\u0001\u0000\u0000\u0000\u0aa9\u0aaa"+ + "\u0005(\u0000\u0000\u0aaa\u0aab\u0001\u0000\u0000\u0000\u0aab\u0aac\u0006"+ + "\u00e2\u0018\u0000\u0aac\u01d3\u0001\u0000\u0000\u0000\u0aad\u0aae\u0005"+ + ")\u0000\u0000\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e3"+ + "\u0019\u0000\u0ab0\u01d5\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005 \u0000"+ + "\u0000\u0ab2\u0ab3\u0001\u0000\u0000\u0000\u0ab3\u0ab4\u0006\u00e4\r\u0000"+ + "\u0ab4\u01d7\u0001\u0000\u0000\u0000\u0ab5\u0ab6\u0005\u0000\u0000\u0001"+ + "\u0ab6\u0ab7\u0001\u0000\u0000\u0000\u0ab7\u0ab8\u0006\u00e5\u001b\u0000"+ + "\u0ab8\u0ab9\u0006\u00e5\u0017\u0000\u0ab9\u01d9\u0001\u0000\u0000\u0000"+ + "\u0aba\u0abb\t\u0000\u0000\u0000\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc"+ + "\u0abd\u0006\u00e6\r\u0000\u0abd\u01db\u0001\u0000\u0000\u0000\u0abe\u0abf"+ + "\u0005?\u0000\u0000\u0abf\u0ac0\u0005>\u0000\u0000\u0ac0\u0ac1\u0001\u0000"+ + "\u0000\u0000\u0ac1\u0ac2\u0006\u00e7\u0017\u0000\u0ac2\u01dd\u0001\u0000"+ + "\u0000\u0000\u0ac3\u0ac4\u0005/\u0000\u0000\u0ac4\u0ac5\u0005/\u0000\u0000"+ + "\u0ac5\u0ac7\u0001\u0000\u0000\u0000\u0ac6\u0ac8\b\u001f\u0000\u0000\u0ac7"+ + "\u0ac6\u0001\u0000\u0000\u0000\u0ac8\u0ac9\u0001\u0000\u0000\u0000\u0ac9"+ + "\u0ac7\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0001\u0000\u0000\u0000\u0aca"+ + "\u0acb\u0001\u0000\u0000\u0000\u0acb\u0acc\u0006\u00e8\r\u0000\u0acc\u01df"+ + "\u0001\u0000\u0000\u0000\u0acd\u0ace\u0005/\u0000\u0000\u0ace\u0acf\u0005"+ + "*\u0000\u0000\u0acf\u0ad3\u0001\u0000\u0000\u0000\u0ad0\u0ad2\t\u0000"+ + "\u0000\u0000\u0ad1\u0ad0\u0001\u0000\u0000\u0000\u0ad2\u0ad5\u0001\u0000"+ + "\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad3\u0ad1\u0001\u0000"+ + "\u0000\u0000\u0ad4\u0ad6\u0001\u0000\u0000\u0000\u0ad5\u0ad3\u0001\u0000"+ + "\u0000\u0000\u0ad6\u0ad7\u0005*\u0000\u0000\u0ad7\u0ad8\u0005/\u0000\u0000"+ + "\u0ad8\u0ad9\u0001\u0000\u0000\u0000\u0ad9\u0ada\u0006\u00e9\r\u0000\u0ada"+ + "\u01e1\u0001\u0000\u0000\u0000\u0adb\u0adc\u0005[\u0000\u0000\u0adc\u0add"+ + "\u0001\u0000\u0000\u0000\u0add\u0ade\u0006\u00ea \u0000\u0ade\u01e3\u0001"+ + "\u0000\u0000\u0000\u0adf\u0ae0\u0005]\u0000\u0000\u0ae0\u0ae1\u0001\u0000"+ + "\u0000\u0000\u0ae1\u0ae2\u0006\u00eb \u0000\u0ae2\u01e5\u0001\u0000\u0000"+ + "\u0000\u0ae3\u0ae4\u0005{\u0000\u0000\u0ae4\u0ae5\u0001\u0000\u0000\u0000"+ + "\u0ae5\u0ae6\u0006\u00ec \u0000\u0ae6\u01e7\u0001\u0000\u0000\u0000\u0ae7"+ + "\u0ae8\u0005}\u0000\u0000\u0ae8\u0ae9\u0001\u0000\u0000\u0000\u0ae9\u0aea"+ + "\u0006\u00ed \u0000\u0aea\u01e9\u0001\u0000\u0000\u0000\u0aeb\u0aee\u0003"+ + "\u00f8u\u0000\u0aec\u0aee\u0003\u00fav\u0000\u0aed\u0aeb\u0001\u0000\u0000"+ + "\u0000\u0aed\u0aec\u0001\u0000\u0000\u0000\u0aee\u0aef\u0001\u0000\u0000"+ + "\u0000\u0aef\u0af0\u0006\u00ee<\u0000\u0af0\u01eb\u0001\u0000\u0000\u0000"+ + "\u0af1\u0af2\u0003\u00fex\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3"+ + "\u0af4\u0006\u00ef\u0012\u0000\u0af4\u01ed\u0001\u0000\u0000\u0000\u0af5"+ + "\u0af6\u0003\u0100y\u0000\u0af6\u0af7\u0001\u0000\u0000\u0000\u0af7\u0af8"+ + "\u0006\u00f0\u0013\u0000\u0af8\u01ef\u0001\u0000\u0000\u0000\u0af9\u0afa"+ + "\u0003\u00f0q\u0000\u0afa\u0afb\u0001\u0000\u0000\u0000\u0afb\u0afc\u0006"+ + "\u00f1\u0015\u0000\u0afc\u01f1\u0001\u0000\u0000\u0000\u0afd\u0afe\u0005"+ + ":\u0000\u0000\u0afe\u0aff\u0005:\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000"+ + "\u0000\u0b00\u0b01\u0006\u00f2\u0016\u0000\u0b01\u01f3\u0001\u0000\u0000"+ + "\u0000\u0b02\u0b03\u0005-\u0000\u0000\u0b03\u0b04\u0005>\u0000\u0000\u0b04"+ + "\u0b05\u0001\u0000\u0000\u0000\u0b05\u0b06\u0006\u00f3\u001a\u0000\u0b06"+ + "\u01f5\u0001\u0000\u0000\u0000\u0b07\u0b08\u0005(\u0000\u0000\u0b08\u0b09"+ + "\u0001\u0000\u0000\u0000\u0b09\u0b0a\u0006\u00f4\u0018\u0000\u0b0a\u01f7"+ + "\u0001\u0000\u0000\u0000\u0b0b\u0b0c\u0005)\u0000\u0000\u0b0c\u0b0d\u0001"+ + "\u0000\u0000\u0000\u0b0d\u0b0e\u0006\u00f5\u0019\u0000\u0b0e\u01f9\u0001"+ + "\u0000\u0000\u0000\u0b0f\u0b10\u0005\u0000\u0000\u0001\u0b10\u0b11\u0001"+ + "\u0000\u0000\u0000\u0b11\u0b12\u0006\u00f6 \u0000\u0b12\u0b13\u0006\u00f6"+ + "\u0017\u0000\u0b13\u01fb\u0001\u0000\u0000\u0000\u0b14\u0b15\t\u0000\u0000"+ + "\u0000\u0b15\u0b16\u0001\u0000\u0000\u0000\u0b16\u0b17\u0006\u00f7 \u0000"+ + "\u0b17\u01fd\u0001\u0000\u0000\u0000\u0b18\u0b19\u0005@\u0000\u0000\u0b19"+ + "\u0b1a\u0007\u0007\u0000\u0000\u0b1a\u0b1b\u0007\n\u0000\u0000\u0b1b\u0b1c"+ + "\u0007\u000b\u0000\u0000\u0b1c\u0b1d\u0007\u001c\u0000\u0000\u0b1d\u0b1e"+ + "\u0007\u0007\u0000\u0000\u0b1e\u0b1f\u0007\u0016\u0000\u0000\u0b1f\u0b20"+ + "\u0007\u0017\u0000\u0000\u0b20\u0b21\u0007\u0010\u0000\u0000\u0b21\u0b22"+ + "\u0007\r\u0000\u0000\u0b22\u0b23\u0007\u0005\u0000\u0000\u0b23\u0b24\u0007"+ + "\u0012\u0000\u0000\u0b24\u0b25\u0001\u0000\u0000\u0000\u0b25\u0b26\u0006"+ + "\u00f8?\u0000\u0b26\u0b27\u0006\u00f8!\u0000\u0b27\u01ff\u0001\u0000\u0000"+ + "\u0000\u0b28\u0b29\t\u0000\u0000\u0000\u0b29\u0b2a\u0004\u00f9\u000f\u0000"+ + "\u0b2a\u0b2b\u0001\u0000\u0000\u0000\u0b2b\u0b2c\u0006\u00f9\r\u0000\u0b2c"+ + "\u0201\u0001\u0000\u0000\u0000\u0b2d\u0b2e\u0005\u0000\u0000\u0001\u0b2e"+ + "\u0b2f\u0001\u0000\u0000\u0000\u0b2f\u0b30\u0006\u00fa\u001b\u0000\u0b30"+ + "\u0b31\u0006\u00fa!\u0000\u0b31\u0203\u0001\u0000\u0000\u0000\u0b32\u0b33"+ + "\t\u0000\u0000\u0000\u0b33\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006"+ + "\u00fb\u001c\u0000\u0b35\u0205\u0001\u0000\u0000\u0000\u0b36\u0b37\u0005"+ + "-\u0000\u0000\u0b37\u0b38\u0005-\u0000\u0000\u0b38\u0b39\u0005}\u0000"+ + "\u0000\u0b39\u0b3a\u0005}\u0000\u0000\u0b3a\u0b3b\u0001\u0000\u0000\u0000"+ + "\u0b3b\u0b3c\u0006\u00fc\u0017\u0000\u0b3c\u0b3d\u0006\u00fc\r\u0000\u0b3d"+ + "\u0207\u0001\u0000\u0000\u0000\u0b3e\u0b3f\t\u0000\u0000\u0000\u0b3f\u0b40"+ + "\u0004\u00fd\u0010\u0000\u0b40\u0b41\u0001\u0000\u0000\u0000\u0b41\u0b42"+ + "\u0006\u00fd\r\u0000\u0b42\u0209\u0001\u0000\u0000\u0000\u0b43\u0b44\t"+ + "\u0000\u0000\u0000\u0b44\u0b45\u0001\u0000\u0000\u0000\u0b45\u0b46\u0006"+ + "\u00fe\r\u0000\u0b46\u020b\u0001\u0000\u0000\u0000\u0b47\u0b48\u0005\u0000"+ + "\u0000\u0001\u0b48\u0b49\u0001\u0000\u0000\u0000\u0b49\u0b4a\u0006\u00ff"+ + "\u0017\u0000\u0b4a\u0b4b\u0006\u00ff\r\u0000\u0b4b\u020d\u0001\u0000\u0000"+ + "\u0000j\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+ + "\r\u0212\u0216\u021c\u0220\u0227\u022e\u0234\u023a\u0241\u0246\u024d\u0253"+ + "\u025d\u0263\u0269\u0270\u027c\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e"+ + "\u059e\u05ca\u05ed\u0653\u0699\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9"+ + "\u06e0\u06f4\u06fc\u0703\u070b\u070f\u0718\u071b\u0722\u0729\u072e\u073a"+ + "\u073f\u0741\u074d\u0754\u075b\u0763\u0765\u076e\u0770\u077b\u0793\u07a8"+ + "\u07ac\u07b7\u07bd\u07c9\u07cd\u0893\u0898\u089b\u08a8\u08af\u08e0\u08e7"+ + "\u0913\u091d\u095c\u0980\u098b\u0992\u09b3\u09c5\u09e0\u0a10\u0a25\u0a3a"+ + "\u0a44\u0a4d\u0a73\u0a90\u0a97\u0ac9\u0ad3\u0aed@\u0005\u0005\u0000\u0005"+ + "\u0003\u0000\u0005\b\u0000\u0005\u0007\u0000\u0007g\u0000\u0005\n\u0000"+ + "\u0005\f\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0007\u0017\u0000\u0005"+ + "\u000b\u0000\u0001c\u0000\u0007s\u0000\u0006\u0000\u0000\u0001h\u0001"+ + "\u0001i\u0002\u0001m\u0003\u0005\r\u0000\u0007\u0002\u0000\u0007\u0003"+ + "\u0000\u0007\u0006\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0004\u0000"+ + "\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007\t\u0000\u0007\u0016\u0000"+ + "\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a\u0004\u0001\u009b\u0005"+ + "\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c\u0006\u0001\u009d\u0007"+ + "\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t\u0007\u000f\u0000\u0001"+ + "\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001\u00a7\f\u0001\u00ae"+ + "\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b\u0000\u0005\t\u0000"+ + "\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000\u0001\u00c1\u0012"+ + "\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001\u00c4\u0015\u0001"+ + "\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007\u0015\u0000\u0007"+ + "\u0004\u0000\u0007\b\u0000\u0007i\u0000"; public static final String _serializedATN = Utils.join( new String[] { _serializedATNSegment0, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 index 5fe43ce485d2..fdbbb0e423a0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 @@ -66,19 +66,13 @@ D_ESCAPES '{{{' | '@@' '@'? | '@{' '{'? - | '@media' [ ]* '('? - | '@charset' [ ]* - | '@import' [ ]* - | '@namespace' [ ]* - | '@document' [ ]* - | '@font-face' [ ]* - | '@page' [ ]* - | '@supports' [ ]* - | '@layer' [ ]* - | '@tailwind' [ ]* - | '@apply' [ ]* - | '@-webkit-keyframes' [ ]* - | '@keyframes' [ ]* + | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' + | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' + | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' + | '@scope' | '@starting-style' | '@supports' | '@view-transition' + | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' + ) [ ]* )->type(HTML); mode INSIDE_BLADE_COMMENT; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 index e54c30072a04..2187e993a73a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 @@ -66,19 +66,13 @@ D_ESCAPES '{{{' | '@@' '@'? | '@{' '{'? - | '@media' [ ]* '('? - | '@charset' [ ]* - | '@import' [ ]* - | '@namespace' [ ]* - | '@document' [ ]* - | '@font-face' [ ]* - | '@page' [ ]* - | '@supports' [ ]* - | '@layer' [ ]* - | '@tailwind' [ ]* - | '@apply' [ ]* - | '@-webkit-keyframes' [ ]* - | '@keyframes' [ ]* + | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' + | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' + | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' + | '@scope' | '@starting-style' | '@supports' | '@view-transition' + | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' + ) [ ]* )->type(HTML); mode INSIDE_BLADE_COMMENT; diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass new file mode 100644 index 000000000000..92bccf4919c8 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass @@ -0,0 +1,65 @@ +Token #0 HTML [\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass new file mode 100644 index 000000000000..6b24efbaf2bd --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass @@ -0,0 +1,14 @@ +Token #0 HTML [\n] diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php new file mode 100644 index 000000000000..8cae35352261 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php @@ -0,0 +1,3 @@ +@foreach($array as $key => $item) + +@endforeach \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion new file mode 100644 index 000000000000..6b2aed7586db --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion @@ -0,0 +1,4 @@ +Code completion result for source line: +@endfor|each +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +CONSTRUCTO @endforeach + {{ $variable }} + +@endsection diff --git a/php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding b/php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding new file mode 100644 index 000000000000..c25eb44b044c --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding @@ -0,0 +1,5 @@ + +
      + +
      + diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php new file mode 100644 index 000000000000..e88b2e19617f --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php @@ -0,0 +1 @@ +@test($test ?: $default) diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding new file mode 100644 index 000000000000..c4a12f80a96a --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding @@ -0,0 +1 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php new file mode 100644 index 000000000000..59cdf28239f7 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php @@ -0,0 +1,3 @@ +
      + {{ $isTrue ? 'x' : 'z' }} +
      \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php new file mode 100644 index 000000000000..53b7eccd67fc --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php @@ -0,0 +1,34 @@ + diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php new file mode 100644 index 000000000000..3f8b5b71ac71 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php @@ -0,0 +1,3 @@ +
      + @@escapedDirective +
      diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php new file mode 100644 index 000000000000..d195ba0d8de1 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php new file mode 100644 index 000000000000..7b441c67f4b2 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php @@ -0,0 +1 @@ +@include('path', ['key' => 'value']) diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java index 364729eb19fd..ed9d9048a18f 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java @@ -33,4 +33,8 @@ public BladeCompletionTest(String testName) { public void testCompletion_01() throws Exception { checkCompletion("testfiles/completion/testCompletion_01.blade.php", "@^", false); } + + public void testCompletion_loop_endtag_01() throws Exception { + checkCompletion("testfiles/completion/testCompletion_loop_endtag_01.blade.php", "@endfor^", false); + } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java new file mode 100644 index 000000000000..56e8e8ac1ca7 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.List; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeTestBase; + +/** + * + * @author Ondrej Brejla + */ +public class BladeHtmlEmbeddingProviderTest extends BladeTestBase { + + public BladeHtmlEmbeddingProviderTest(String testName) { + super(testName); + } + + private void checkPhpEmbedding(final String relFilePath) throws Exception { + checkEmbedding(relFilePath, new BladeHtmlEmbeddingProvider()); + } + + private void checkEmbedding(final String relFilePath, EmbeddingProvider embeddingProvider) throws Exception { + assertNotNull(embeddingProvider); + String testedFilePath = "testfiles/embedding/" + relFilePath + ".blade.php"; + Source testSource = getTestSource(getTestFile(testedFilePath)); + List embeddings = embeddingProvider.getEmbeddings(testSource.createSnapshot()); + assertDescriptionMatches(testedFilePath, serializableEmbeddings(embeddings), true, ".embedding"); + } + + private String serializableEmbeddings(List embeddings) { + StringBuilder sb = new StringBuilder(); + for (Embedding embedding : embeddings) { + sb.append(embedding.getSnapshot().getText()); + } + return sb.toString(); + } + + public void testHtmlEmbedding_01() throws Exception { + checkPhpEmbedding("html_embedding_01"); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java new file mode 100644 index 000000000000..37eab8eb00df --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.List; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeTestBase; + +/** + * + * @author Ondrej Brejla + */ +public class BladePhpEmbeddingProviderTest extends BladeTestBase { + + public BladePhpEmbeddingProviderTest(String testName) { + super(testName); + } + + private void checkPhpEmbedding(final String relFilePath) throws Exception { + checkEmbedding(relFilePath, new BladePhpEmbeddingProvider()); + } + + private void checkEmbedding(final String relFilePath, EmbeddingProvider embeddingProvider) throws Exception { + assertNotNull(embeddingProvider); + String testedFilePath = "testfiles/embedding/" + relFilePath + ".blade.php"; + Source testSource = getTestSource(getTestFile(testedFilePath)); + List embeddings = embeddingProvider.getEmbeddings(testSource.createSnapshot()); + assertDescriptionMatches(testedFilePath, serializableEmbeddings(embeddings), true, ".embedding"); + } + + private String serializableEmbeddings(List embeddings) { + StringBuilder sb = new StringBuilder(); + for (Embedding embedding : embeddings) { + sb.append(embedding.getSnapshot().getText()); + } + return sb.toString(); + } + + /** + * php embeddings freezes for syntax like $var:test or tertiary operation ?: + * + * solution is to skip full php embedd or hide ":" characters + * + * @throws Exception + */ + public void testFreezeNekudo_01() throws Exception { + checkPhpEmbedding("php_freeze_nekudo_01"); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java index a58a52384c8e..1b71690ffeb7 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java @@ -42,11 +42,32 @@ public void testRawTag_01() throws Exception { public void testContentTag_01() throws Exception { performTest("content_tag"); } + + public void testContentTag_tertiary_expr() throws Exception { + performTest("content_tag_tertiary_expr"); + } public void testEscapedTag_01() throws Exception { performTest("escaped_tag"); } + + public void testEscapedDirective() throws Exception { + performTest("escaped_directive"); + } + + public void testInclude_01() throws Exception { + performTest("include_01"); + } + + + public void testCssAtRules_01() throws Exception { + performTest("css_at_rules"); + } + public void testHtmlJavascript_01() throws Exception { + performTest("html_javascript_01"); + } + @Override protected String getTestResult(String filename) throws Exception { String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/lexer/blade/" + filename + ".blade.php")); From be1b8b4eb2bb4874d6a71792f0a3c78dea0d2476 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 27 Sep 2024 07:38:00 +0300 Subject: [PATCH 18/21] improve embedded php brace matcher freeze issue, remove hyperlink, php embedded test --- .../blade/editor/HyperlinkProviderImpl.java | 1 + .../embedding/BladePhpEmbeddingProvider.java | 8 +- .../php/blade/editor/lexer/BladeTokenId.java | 81 +- .../resources/FlatLafDark-FlatLafDark.xml | 2 +- .../php/blade/resources/FontAndColors.xml | 2 +- .../antlr4/v10/BladeAntlrColoringLexer.g4 | 52 +- .../antlr4/v10/BladeAntlrColoringLexer.java | 2630 ++++++++--------- .../syntax/antlr4/v10/BladeAntlrLexer.java | 2272 +++++++------- .../antlr4/v10/ColoringLexerAdaptor.java | 34 +- .../content_tag_tertiary_expr.pass | 5 + .../lexer/BladeLexerTest/css_at_rules.pass | 8 +- .../BladeLexerTest/escaped_directive.pass | 3 + .../lexer/BladeLexerTest/include_01.pass | 3 + .../embedding/php_freeze_nekudo_01.blade.php | 1 - ...01.blade.php.testFreezeNekudo_01.embedding | 1 - .../php_inline_embedding_01.blade.php | 5 + ...de.php.testPhpInlineEmbedding_01.embedding | 3 + .../php_inline_embedding_02.blade.php | 5 + ...de.php.testPhpInlineEmbedding_02.embedding | 4 + .../BladeHtmlEmbeddingProviderTest.java | 4 +- .../BladePhpEmbeddingProviderTest.java | 15 +- 21 files changed, 2543 insertions(+), 2596 deletions(-) create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass delete mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php delete mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php.testPhpInlineEmbedding_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 1c33ec4cd8fd..a8cc5b2fda94 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -46,6 +46,7 @@ /** * Similar to a declaration finder + * causes ordinal error * * @author bhaidu */ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java index d7df7529180f..7d88ddc83b16 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java @@ -30,11 +30,9 @@ import org.netbeans.modules.parsing.spi.EmbeddingProvider; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; - /** - * this will enable braces matches of html elements - * - * @author bhaidu + * + * @author bogdan */ @EmbeddingProvider.Registration( mimeType = BladeLanguage.MIME_TYPE, @@ -88,6 +86,6 @@ public int getPriority() { @Override public void cancel() { - //TODO see html implementation + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java index 795605937553..a69f39d90e80 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -76,19 +76,72 @@ protected LanguageEmbedding embedding(Token tok LanguagePath languagePath, InputAttributes inputAttributes) { boolean joinHtml = true; switch (token.id()) { - case PHP_INLINE: + case PHP_BLADE_INLINE_CODE, PHP_BLADE_EXPRESSION -> { + Language phpLanguage = PHPTokenId.languageInPHP(); + if (phpLanguage == null || token.text() == null){ + return null; + } + + //php brace matcher freeze issue patch + String tokenText = token.text().toString(); + int startOffset = 1; + int endOffset = 1; + + if (tokenText.startsWith("((") && tokenText.endsWith("))")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") && tokenText.endsWith("])")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([")){ //NOI18N + startOffset = 2; + } + return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + } + case PHP_BLADE_ECHO_EXPR -> { + Language phpLanguage = PHPTokenId.languageInPHP(); + if (phpLanguage == null || token.text() == null){ + return null; + } + String tokenText = token.text().toString(); + int startOffset = 0; + int endOffset = 0; + + if (!tokenText.startsWith("(") && !tokenText.startsWith("[")){ + return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + } + + //php brace matcher freeze issue patch + if (tokenText.startsWith("((") && tokenText.endsWith("))")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("[[") && tokenText.endsWith("]]")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") && tokenText.endsWith("])")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("[(") && tokenText.endsWith(")]")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") || tokenText.startsWith("[(")){ //NOI18N + startOffset = 2; + } else if (tokenText.startsWith("(") && tokenText.endsWith(")")){ //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("[") && tokenText.endsWith("]")){ //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("(") || tokenText.startsWith("[")){ //NOI18N + startOffset = 1; + } + return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + } + case PHP_INLINE -> { Language phpLanguageCode = PHPTokenId.language(); return phpLanguageCode != null ? LanguageEmbedding.create(phpLanguageCode, 0, 0, false) : null; - case PHP_BLADE_EXPRESSION: - case PHP_BLADE_ECHO_EXPR: - case PHP_BLADE_INLINE_CODE: - /** - * troubleshooting php embedding freeze (?:, ::) - * force a return null; - */ - Language phpLanguage = PHPTokenId.languageInPHP(); - return phpLanguage != null ? LanguageEmbedding.create(phpLanguage, 0, 0, false) : null; - case HTML: + } + case HTML -> { LanguageEmbedding lang; if (tokenLangCache.containsKey(token.id())) { @@ -97,7 +150,7 @@ protected LanguageEmbedding embedding(Token tok Language htmlLanguage = null; @SuppressWarnings("unchecked") - Collection providers = (Collection) Lookup.getDefault().lookupAll(LanguageProvider.class); + Collection providers = (Collection) Lookup.getDefault().lookupAll(LanguageProvider.class); for (LanguageProvider provider : providers) { htmlLanguage = (Language) provider.findLanguage("text/html"); //NOI18N if (htmlLanguage != null) { @@ -110,8 +163,10 @@ protected LanguageEmbedding embedding(Token tok } return lang; - default: + } + default -> { return null; + } } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml index 8533ed78b169..9a2984df1644 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml @@ -22,7 +22,7 @@ - + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml index 18c86c64419a..5a2bc684ff0a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml @@ -22,7 +22,7 @@ - + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index 0955308d73e5..be75c6f37770 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -59,8 +59,6 @@ tokens { ERROR } -fragment NekudoWithelistMatch : '::' | '?:' | ' : '; - fragment DirectivesWithEndTag : 'for' ('each')? | 'if' | 'while' | 'section' | 'session' | 'once' | 'push' | 'PushOnce' | 'switch' | 'unless' | 'can' ('any' | 'not')? @@ -69,10 +67,6 @@ fragment DirectivesWithEndTag : 'for' ('each')? | 'if' | 'while' fragment Include : '@include' ('If' | 'When' | 'First' | 'Unless')?; -//to remove -fragment DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP - : '"' (ESC_DOUBLE_QUOTED_STRING | '{' PhpVariable '}' | . | ~[:])*? '"'; - fragment ComponentTagIdentifier : [a-z_\u0080-\ufffe][a-z0-9.:\u0080-\ufffe-]*; @@ -84,7 +78,7 @@ PHP_INLINE : '' | '' | EOF); D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' - | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')+ {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue')->type(DIRECTIVE); @@ -154,12 +148,8 @@ HTML_EOF : EOF->type(HTML_TAG),popMode; mode INSIDE_REGULAR_ECHO; CONTENT_TAG_CLOSE : ('}}')->popMode,type(CONTENT_TAG); -//hack due to a netbeans php embedding issue when adding or deleting ':' chars -ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeEscapedEchoToken();}; -ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeEscapedEchoToken();}; -ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; -GREEDY_REGULAR_ECHO_EXPR : ~[ ':{}]+ {this.consumeEscapedEchoToken();}; +GREEDY_REGULAR_ECHO_EXPR : ~[ {}]+ {this.consumeEscapedEchoToken();}; ESCAPED_ECHO_EXPR : . [ ]* {this.consumeEscapedEchoToken();}; EXIT_ECHO_EOF : EOF->type(ERROR),popMode; @@ -168,11 +158,8 @@ EXIT_ECHO_EOF : EOF->type(ERROR),popMode; mode INSIDE_RAW_ECHO; RAW_TAG_CLOSE : ('!!}')->popMode, type(RAW_TAG); -//hack due to a netbeans php embedding issue when adding or deleting ':' chars -RAW_ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeNotEscapedEchoToken();}; -RAW_ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeNotEscapedEchoToken();}; -RAW_ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; -RAW_ECHO_EXPR : ~[ ':!{}]+ {this.consumeNotEscapedEchoToken();}; + +RAW_ECHO_EXPR : ~[ !{}]+ {this.consumeNotEscapedEchoToken();}; RAW_ECHO_EXPR_MORE : . [ ]* {this.consumeNotEscapedEchoToken();}; EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; @@ -188,31 +175,15 @@ L_OTHER : . ->type(ERROR), popMode; // @directive (?) mode INSIDE_PHP_EXPRESSION; -OPEN_EXPR_PAREN : {this.roundParenBalance == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; -CLOSE_EXPR_PAREN : {this.roundParenBalance == 1}? ')' +OPEN_EXPR_PAREN : {this.getRoundParenBalance() == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +CLOSE_EXPR_PAREN : {this.getRoundParenBalance() == 1}? ')' {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); -LPAREN : {this.roundParenBalance > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; -RPAREN : {this.roundParenBalance > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; +LPAREN : {this.getRoundParenBalance() > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +RPAREN : {this.getRoundParenBalance() > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; //in case of lexer restart context -EXIT_RPAREN : ')' {this.roundParenBalance == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); - -DB_STRING_OPEN : '"' ->more,pushMode(DB_STRING_MODE); -//hack due to a netbeans php embedding issue when adding or deleting ':' chars - -SHORT_IF_EXPR_ERR : ('?:') {this.testForFreezeCombination();}; - -DOUBLE_NEKODU : ('::') {this.consumeExprToken();}; - - -EXPR_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT (' ')*) {this.consumeExprToken();}; - -//STATIC_STRING : //check if start of token ... check if bracket and - -FREEZE_NEKUDO_GREEDY : ':' {this._input.LA(1) != ':'}?->skip; - -FREEZE_NEKUDO : ':'->skip; +EXIT_RPAREN : ')' {this.getRoundParenBalance() == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->skip; @@ -279,11 +250,6 @@ COMPONENT_PHP_EXPRESSION : . ->more; EXIT_COMPONENT_PHP_EXPRESSION_EOF : EOF->type(ERROR),popMode; -mode DB_STRING_MODE; - -DB_STRING_NEKUDO_GREEDY : NekudoWithelistMatch '$'? FullIdentifier '}' ->more; - -DB_STRING_NEKUDO : NekudoWithelistMatch ->more; //TODO numeric DB_JSON_PAIR : '{' [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier? [\\']? (',' ( [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier [\\']? ))* ','? '}' ->more; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java index a38c002fd84d..365fae37718d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -39,21 +39,17 @@ public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { public static final int DIRECTIVE=1, PHP_EXPRESSION=2, BLADE_PHP_ECHO_EXPR=3, RAW_TAG=4, CONTENT_TAG=5, HTML=6, HTML_TAG=7, ERROR=8, BLADE_COMMENT=9, PHP_INLINE=10, D_PHP=11, - D_CUSTOM=12, D_UNKNOWN=13, D_AT=14, BLADE_COMMENT_START=15, ECHO_DOUBLE_NEKODU=16, - ECHO_STRING_LITERAL=17, ECHO_PHP_FREEZE_SYNTAX=18, GREEDY_REGULAR_ECHO_EXPR=19, - ESCAPED_ECHO_EXPR=20, RAW_ECHO_DOUBLE_NEKODU=21, RAW_ECHO_STRING_LITERAL=22, - RAW_ECHO_PHP_FREEZE_SYNTAX=23, RAW_ECHO_EXPR=24, RAW_ECHO_EXPR_MORE=25, - WS_EXPR=26, OPEN_EXPR_PAREN=27, LPAREN=28, RPAREN=29, SHORT_IF_EXPR_ERR=30, - DOUBLE_NEKODU=31, EXPR_STRING_LITERAL=32, FREEZE_NEKUDO_GREEDY=33, FREEZE_NEKUDO=34, - PHP_EXPRESSION_COMMENT=35, PHP_EXPRESSION_MORE=36, D_ENDPHP=37, BLADE_PHP_INLINE=38, - BLADE_COMMENT_END=39, D_ENDVERBATIM=40, DB_STRING_OPEN=41, EXIT_HTML_COMPONENT=42, - DB_QUOTE_MORE=43; + D_CUSTOM=12, D_UNKNOWN=13, D_AT=14, BLADE_COMMENT_START=15, GREEDY_REGULAR_ECHO_EXPR=16, + ESCAPED_ECHO_EXPR=17, RAW_ECHO_EXPR=18, RAW_ECHO_EXPR_MORE=19, WS_EXPR=20, + OPEN_EXPR_PAREN=21, LPAREN=22, RPAREN=23, PHP_EXPRESSION_COMMENT=24, PHP_EXPRESSION_MORE=25, + D_ENDPHP=26, BLADE_PHP_INLINE=27, BLADE_COMMENT_END=28, D_ENDVERBATIM=29, + EXIT_HTML_COMPONENT=30, EXIT_COMPONENT_PHP_EXPRESSION=31, DB_QUOTE_MORE=32; public static final int PHP_CODE=2; public static final int INSIDE_HTML_TAG=1, INSIDE_REGULAR_ECHO=2, INSIDE_RAW_ECHO=3, LOOK_FOR_PHP_EXPRESSION=4, INSIDE_PHP_EXPRESSION=5, BLADE_INLINE_PHP=6, VERBATIM_MODE=7, INSIDE_HTML_COMPONENT_TAG=8, - COMPONENT_PHP_EXPRESSION=9, DB_STRING_MODE=10, INSIDE_BLADE_COMMENT=11; + COMPONENT_PHP_EXPRESSION=9, INSIDE_BLADE_COMMENT=10; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "PHP_CODE" }; @@ -62,39 +58,35 @@ public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { "DEFAULT_MODE", "INSIDE_HTML_TAG", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", "LOOK_FOR_PHP_EXPRESSION", "INSIDE_PHP_EXPRESSION", "BLADE_INLINE_PHP", "VERBATIM_MODE", "INSIDE_HTML_COMPONENT_TAG", "COMPONENT_PHP_EXPRESSION", - "DB_STRING_MODE", "INSIDE_BLADE_COMMENT" + "INSIDE_BLADE_COMMENT" }; private static String[] makeRuleNames() { return new String[] { - "NekudoWithelistMatch", "DirectivesWithEndTag", "Include", "DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP", - "ComponentTagIdentifier", "SpecialChars", "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", - "D_GENERIC_INLINE_DIRECTIVES", "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", - "D_VERBATIM", "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", - "D_END", "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", - "CONTENT_TAG_OPEN", "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", - "HTML", "HTML_MISC", "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", - "BladeLabel", "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "DirectivesWithEndTag", "Include", "ComponentTagIdentifier", "SpecialChars", + "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", "D_GENERIC_INLINE_DIRECTIVES", + "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", "D_VERBATIM", + "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", "D_END", + "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", "HTML", "HTML_MISC", + "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", "BladeLabel", + "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", "D_ESCAPES", "OTHER_HTML_POP", "OTHER_HTML", "HTML_EOF", "CONTENT_TAG_CLOSE", - "ECHO_DOUBLE_NEKODU", "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "EXIT_ECHO_EOF", "RAW_TAG_CLOSE", - "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", "RAW_ECHO_PHP_FREEZE_SYNTAX", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", "WS_EXPR", "OPEN_EXPR_PAREN_MORE", "AFTER_DIRECTIVE", "L_OTHER", "OPEN_EXPR_PAREN", - "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", "EXIT_RPAREN", "DB_STRING_OPEN", - "SHORT_IF_EXPR_ERR", "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", - "FREEZE_NEKUDO", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "EXIT_EOF", - "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", "EXIT_INLINE_PHP_EOF", - "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", "EXIT_VERBATIM_MOD_EOF", - "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", "COMPONENT_RAW_TAG_OPEN", - "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", "EXIT_HTML_COMPONENT_EOF", - "EXIT_COMPONENT_PHP_EXPRESSION", "COMPONENT_PHP_EXPRESSION_LAST", "COMPONENT_PHP_EXPRESSION", - "EXIT_COMPONENT_PHP_EXPRESSION_EOF", "DB_STRING_NEKUDO_GREEDY", "DB_STRING_NEKUDO", - "DB_JSON_PAIR", "PHP_INTERCALATED", "DB_POINT", "DB_QUOTE_MORE", "DB_QUOTE_EXIT", - "DB_QUOTE_ANY", "DB_QUOTE_EOF", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", - "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" + "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", "EXIT_RPAREN", "PHP_EXPRESSION_COMMENT", + "PHP_EXPRESSION_MORE", "EXIT_EOF", "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", + "EXIT_INLINE_PHP_EOF", "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", + "EXIT_VERBATIM_MOD_EOF", "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", + "COMPONENT_RAW_TAG_OPEN", "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", + "EXIT_HTML_COMPONENT_EOF", "EXIT_COMPONENT_PHP_EXPRESSION", "COMPONENT_PHP_EXPRESSION_LAST", + "COMPONENT_PHP_EXPRESSION", "EXIT_COMPONENT_PHP_EXPRESSION_EOF", "DB_JSON_PAIR", + "PHP_INTERCALATED", "DB_POINT", "DB_QUOTE_MORE", "DB_QUOTE_EXIT", "DB_QUOTE_ANY", + "DB_QUOTE_EOF", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" }; } public static final String[] ruleNames = makeRuleNames(); @@ -103,8 +95,7 @@ private static String[] makeLiteralNames() { return new String[] { null, null, null, null, null, null, null, null, null, null, null, "'@php'", null, null, null, "'{{--'", null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, "':'", - null, null, "'@endphp'", null, "'--}}'", null, null, "'>'", "'\\\"'" + null, null, null, "'@endphp'", null, "'--}}'", null, "'>'", null, "'\\\"'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -112,15 +103,11 @@ private static String[] makeSymbolicNames() { return new String[] { null, "DIRECTIVE", "PHP_EXPRESSION", "BLADE_PHP_ECHO_EXPR", "RAW_TAG", "CONTENT_TAG", "HTML", "HTML_TAG", "ERROR", "BLADE_COMMENT", "PHP_INLINE", - "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", "ECHO_DOUBLE_NEKODU", - "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", "GREEDY_REGULAR_ECHO_EXPR", - "ESCAPED_ECHO_EXPR", "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", - "RAW_ECHO_PHP_FREEZE_SYNTAX", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", - "WS_EXPR", "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "SHORT_IF_EXPR_ERR", - "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", "FREEZE_NEKUDO", - "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "D_ENDPHP", "BLADE_PHP_INLINE", - "BLADE_COMMENT_END", "D_ENDVERBATIM", "DB_STRING_OPEN", "EXIT_HTML_COMPONENT", - "DB_QUOTE_MORE" + "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", "GREEDY_REGULAR_ECHO_EXPR", + "ESCAPED_ECHO_EXPR", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "WS_EXPR", + "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", + "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_COMMENT_END", "D_ENDVERBATIM", + "EXIT_HTML_COMPONENT", "EXIT_COMPONENT_PHP_EXPRESSION", "DB_QUOTE_MORE" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -184,183 +171,113 @@ public BladeAntlrColoringLexer(CharStream input) { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 51: - ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); - break; - case 52: - ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); - break; - case 54: + case 49: GREEDY_REGULAR_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 55: + case 50: ESCAPED_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 58: - RAW_ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); - break; - case 59: - RAW_ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); - break; - case 61: + case 53: RAW_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 62: + case 54: RAW_ECHO_EXPR_MORE_action((RuleContext)_localctx, actionIndex); break; - case 65: + case 57: OPEN_EXPR_PAREN_MORE_action((RuleContext)_localctx, actionIndex); break; - case 68: + case 60: OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); break; - case 69: + case 61: CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); break; - case 70: + case 62: LPAREN_action((RuleContext)_localctx, actionIndex); break; - case 71: + case 63: RPAREN_action((RuleContext)_localctx, actionIndex); break; - case 74: - SHORT_IF_EXPR_ERR_action((RuleContext)_localctx, actionIndex); - break; - case 75: - DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); - break; - case 76: - EXPR_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); - break; - case 80: + case 66: PHP_EXPRESSION_MORE_action((RuleContext)_localctx, actionIndex); break; } } - private void ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 0: - this.consumeEscapedEchoToken(); - break; - } - } - private void ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 1: - this.consumeEscapedEchoToken(); - break; - } - } private void GREEDY_REGULAR_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 2: + case 0: this.consumeEscapedEchoToken(); break; } } private void ESCAPED_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 3: + case 1: this.consumeEscapedEchoToken(); break; } } - private void RAW_ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 4: - this.consumeNotEscapedEchoToken(); - break; - } - } - private void RAW_ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 5: - this.consumeNotEscapedEchoToken(); - break; - } - } private void RAW_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 6: + case 2: this.consumeNotEscapedEchoToken(); break; } } private void RAW_ECHO_EXPR_MORE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 7: + case 3: this.consumeNotEscapedEchoToken(); break; } } private void OPEN_EXPR_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 8: + case 4: this.increaseRoundParenBalance(); break; } } private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 9: + case 5: this.increaseRoundParenBalance(); break; - case 10: + case 6: this.consumeExprToken(); break; } } private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 11: + case 7: this.decreaseRoundParenBalance(); break; } } private void LPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 12: + case 8: this.increaseRoundParenBalance(); break; - case 13: + case 9: this.consumeExprToken(); break; } } private void RPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 14: + case 10: this.decreaseRoundParenBalance(); break; - case 15: - this.consumeExprToken(); - break; - } - } - private void SHORT_IF_EXPR_ERR_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 16: - this.testForFreezeCombination(); - break; - } - } - private void DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 17: - this.consumeExprToken(); - break; - } - } - private void EXPR_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 18: + case 11: this.consumeExprToken(); break; } } private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 19: + case 12: this.consumeExprToken(); break; } @@ -368,39 +285,37 @@ private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) @Override public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 8: + case 6: return D_GENERIC_INLINE_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); - case 15: + case 13: return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); - case 20: + case 18: return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); - case 28: + case 26: return HTML_sempred((RuleContext)_localctx, predIndex); - case 29: + case 27: return HTML_MISC_sempred((RuleContext)_localctx, predIndex); - case 47: + case 45: return OTHER_HTML_POP_sempred((RuleContext)_localctx, predIndex); - case 64: + case 56: return WS_EXPR_sempred((RuleContext)_localctx, predIndex); - case 68: + case 60: return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 69: + case 61: return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 70: + case 62: return LPAREN_sempred((RuleContext)_localctx, predIndex); - case 71: + case 63: return RPAREN_sempred((RuleContext)_localctx, predIndex); - case 72: + case 64: return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); - case 77: - return FREEZE_NEKUDO_GREEDY_sempred((RuleContext)_localctx, predIndex); - case 83: + case 69: return BLADE_PHP_INLINE_sempred((RuleContext)_localctx, predIndex); - case 87: + case 73: return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); - case 97: + case 83: return COMPONENT_PHP_EXPRESSION_LAST_sempred((RuleContext)_localctx, predIndex); - case 110: + case 94: return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); } return true; @@ -462,48 +377,41 @@ private boolean WS_EXPR_sempred(RuleContext _localctx, int predIndex) { private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 9: - return this.roundParenBalance == 0; + return this.getRoundParenBalance() == 0; } return true; } private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 10: - return this.roundParenBalance == 1; + return this.getRoundParenBalance() == 1; } return true; } private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 11: - return this.roundParenBalance > 0; + return this.getRoundParenBalance() > 0; } return true; } private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 12: - return this.roundParenBalance > 0; + return this.getRoundParenBalance() > 0; } return true; } private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 13: - return this.roundParenBalance == 0; - } - return true; - } - private boolean FREEZE_NEKUDO_GREEDY_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 14: - return this._input.LA(1) != ':'; + return this.getRoundParenBalance() == 0; } return true; } private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 15: + case 14: return this._input.LA(1) == '@' && this._input.LA(2) == 'e' && @@ -518,7 +426,7 @@ private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { } private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 16: + case 15: return this._input.LA(1) == '@' && this._input.LA(2) == 'e' && @@ -533,14 +441,14 @@ private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { } private boolean COMPONENT_PHP_EXPRESSION_LAST_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 17: + case 16: return this._input.LA(1) == '"'; } return true; } private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 18: + case 17: return this._input.LA(1) == '-' && this._input.LA(2) == '-' && @@ -552,1231 +460,1199 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000+\u0742\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000 \u0706\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ - "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ - "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ - "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ - "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ - "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ - "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ - "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ - "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ - "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ - "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ - "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ - "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ - "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ - "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+ - "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+ - "A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002"+ - "F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002"+ - "K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002"+ - "P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002"+ - "U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002"+ - "Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002"+ - "_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002"+ - "d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002"+ - "i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002"+ - "n\u0007n\u0002o\u0007o\u0002p\u0007p\u0001\u0000\u0001\u0000\u0001\u0000"+ - "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0003\u0001\u0100\b\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002"+ + "\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005"+ + "\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002"+ + "\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002"+ + "\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010"+ + "\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013"+ + "\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016"+ + "\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019"+ + "\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c"+ + "\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f"+ + "\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007"+ + "#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007"+ + "(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007"+ + "-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u00022\u0007"+ + "2\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u00027\u0007"+ + "7\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007"+ + "<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007"+ + "A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007"+ + "F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007"+ + "K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007"+ + "P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007"+ + "U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007"+ + "Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007"+ + "_\u0002`\u0007`\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00d6\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u0113"+ + "\b\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003"+ + "\u0000\u0132\b\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u013d\b\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u015c\b\u0001"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0003\u0002\u0178\b\u0002\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0005\u0003\u0182\b\u0003\n\u0003\f\u0003\u0185\t\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0004\u0001\u0004\u0005\u0004\u018b\b\u0004\n\u0004\f\u0004"+ - "\u018e\t\u0004\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0005\u0006\u0197\b\u0006\n\u0006\f\u0006\u019a"+ - "\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01a5\b\u0006\n"+ - "\u0006\f\u0006\u01a8\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ - "\u0006\u01ad\b\u0006\u0003\u0006\u01af\b\u0006\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0003\u0007\u01cd\b\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u014e\b\u0001\u0001"+ + "\u0002\u0001\u0002\u0005\u0002\u0152\b\u0002\n\u0002\f\u0002\u0155\t\u0002"+ + "\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0004\u0005\u0004\u015e\b\u0004\n\u0004\f\u0004\u0161\t\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0005\u0004\u016c\b\u0004\n\u0004\f\u0004"+ + "\u016f\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0174\b"+ + "\u0004\u0003\u0004\u0176\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0003\u0005\u0194\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0003\u0006\u0206\b\u0006\u0001\u0006\u0005\u0006\u0209\b\u0006"+ + "\n\u0006\f\u0006\u020c\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u0222"+ + "\b\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0003\b\u023f\b\b\u0001\b\u0004\b\u0242\b\b\u000b\b"+ - "\f\b\u0243\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\b\u0001\b\u0001\b\u0003\b\u0251\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0003\t\u025a\b\t\u0001\t\u0001\t\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0289\b\n\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b"+ "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0003\r\u02c0\b\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u0288\b\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0003\f\u02ad\b\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0003\r\u02b7\b\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0003\u000e\u02e5\b\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003"+ - "\u000f\u02ef\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u030f\b\u0010\u0001\u0010\u0003"+ + "\u0010\u0312\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0347\b\u0012\u0001"+ - "\u0012\u0003\u0012\u034a\b\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001"+ - "\u0016\u0003\u0016\u0362\b\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0005\u0019\u0375\b\u0019\n\u0019\f\u0019\u0378\t\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u037e\b\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0004\u001a\u038d\b\u001a\u000b\u001a\f\u001a\u038e\u0003"+ - "\u001a\u0391\b\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u039c"+ - "\b\u001b\n\u001b\f\u001b\u039f\t\u001b\u0004\u001b\u03a1\b\u001b\u000b"+ - "\u001b\f\u001b\u03a2\u0001\u001b\u0001\u001b\u0001\u001c\u0004\u001c\u03a8"+ - "\b\u001c\u000b\u001c\f\u001c\u03a9\u0001\u001c\u0004\u001c\u03ad\b\u001c"+ - "\u000b\u001c\f\u001c\u03ae\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0004\u001c\u03bb\b\u001c\u000b\u001c\f\u001c\u03bc\u0001\u001c\u0005"+ - "\u001c\u03c0\b\u001c\n\u001c\f\u001c\u03c3\t\u001c\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0004\u001d"+ - "\u03cc\b\u001d\u000b\u001d\f\u001d\u03cd\u0001\u001d\u0004\u001d\u03d1"+ - "\b\u001d\u000b\u001d\f\u001d\u03d2\u0001\u001d\u0003\u001d\u03d6\b\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0004\u001d\u03e1\b\u001d\u000b\u001d"+ - "\f\u001d\u03e2\u0001\u001d\u0004\u001d\u03e6\b\u001d\u000b\u001d\f\u001d"+ - "\u03e7\u0001\u001d\u0001\u001d\u0001\u001e\u0004\u001e\u03ed\b\u001e\u000b"+ - "\u001e\f\u001e\u03ee\u0001\u001e\u0004\u001e\u03f2\b\u001e\u000b\u001e"+ - "\f\u001e\u03f3\u0003\u001e\u03f6\b\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u03ff"+ - "\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ - "!\u0005!\u0409\b!\n!\f!\u040c\t!\u0001\"\u0001\"\u0005\"\u0410\b\"\n\""+ - "\f\"\u0413\t\"\u0001#\u0001#\u0005#\u0417\b#\n#\f#\u041a\t#\u0001$\u0001"+ - "$\u0001%\u0001%\u0001%\u0005%\u0421\b%\n%\f%\u0424\t%\u0001%\u0001%\u0001"+ - "&\u0001&\u0001&\u0001&\u0005&\u042c\b&\n&\f&\u042f\t&\u0001&\u0001&\u0001"+ - "\'\u0001\'\u0001\'\u0001\'\u0005\'\u0437\b\'\n\'\f\'\u043a\t\'\u0001("+ - "\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0003)\u0451\b)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ - "+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001"+ - "-\u0003-\u0465\b-\u0004-\u0467\b-\u000b-\f-\u0468\u0001-\u0001-\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0474\b.\u0001.\u0001"+ - ".\u0001.\u0001.\u0003.\u047a\b.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0005.\u0484\b.\n.\f.\u0487\t.\u0001.\u0003.\u048a\b."+ - "\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0550\b.\u0001.\u0005"+ - ".\u0553\b.\n.\f.\u0556\t.\u0003.\u0558\b.\u0001.\u0001.\u0001/\u0001/"+ - "\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u0001"+ - "1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ - "3\u00013\u00013\u00014\u00014\u00034\u0576\b4\u00014\u00014\u00015\u0001"+ - "5\u00015\u00035\u057d\b5\u00015\u00015\u00016\u00046\u0582\b6\u000b6\f"+ - "6\u0583\u00016\u00016\u00017\u00017\u00057\u058a\b7\n7\f7\u058d\t7\u0001"+ - "7\u00017\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001;\u0001;\u0003;\u05a2"+ - "\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003<\u05a9\b<\u0001<\u0001<\u0001"+ - "=\u0004=\u05ae\b=\u000b=\f=\u05af\u0001=\u0001=\u0001>\u0001>\u0005>\u05b6"+ - "\b>\n>\f>\u05b9\t>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ - "@\u0004@\u05c3\b@\u000b@\f@\u05c4\u0001@\u0001@\u0001@\u0001@\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+ - "F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0005"+ - "L\u0608\bL\nL\fL\u060b\tL\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001"+ - "M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0005O\u061c"+ - "\bO\nO\fO\u061f\tO\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ + "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0003"+ + "\u0014\u032a\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0005\u0017\u033d\b\u0017\n\u0017\f\u0017\u0340\t\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0003\u0017\u0346\b\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0004\u0018\u0355\b\u0018\u000b\u0018\f\u0018\u0356\u0003\u0018\u0359"+ + "\b\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0364\b\u0019\n"+ + "\u0019\f\u0019\u0367\t\u0019\u0004\u0019\u0369\b\u0019\u000b\u0019\f\u0019"+ + "\u036a\u0001\u0019\u0001\u0019\u0001\u001a\u0004\u001a\u0370\b\u001a\u000b"+ + "\u001a\f\u001a\u0371\u0001\u001a\u0004\u001a\u0375\b\u001a\u000b\u001a"+ + "\f\u001a\u0376\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0004\u001a"+ + "\u0383\b\u001a\u000b\u001a\f\u001a\u0384\u0001\u001a\u0005\u001a\u0388"+ + "\b\u001a\n\u001a\f\u001a\u038b\t\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0004\u001b\u0394\b\u001b"+ + "\u000b\u001b\f\u001b\u0395\u0001\u001b\u0004\u001b\u0399\b\u001b\u000b"+ + "\u001b\f\u001b\u039a\u0001\u001b\u0003\u001b\u039e\b\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0004\u001b\u03a9\b\u001b\u000b\u001b\f\u001b"+ + "\u03aa\u0001\u001b\u0004\u001b\u03ae\b\u001b\u000b\u001b\f\u001b\u03af"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0004\u001c\u03b5\b\u001c\u000b\u001c"+ + "\f\u001c\u03b6\u0001\u001c\u0004\u001c\u03ba\b\u001c\u000b\u001c\f\u001c"+ + "\u03bb\u0003\u001c\u03be\b\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0003\u001d\u03c7\b\u001d\u0001"+ + "\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001f\u0001\u001f\u0005\u001f\u03d1\b\u001f\n\u001f\f\u001f\u03d4\t\u001f"+ + "\u0001 \u0001 \u0005 \u03d8\b \n \f \u03db\t \u0001!\u0001!\u0005!\u03df"+ + "\b!\n!\f!\u03e2\t!\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0005#\u03e9\b"+ + "#\n#\f#\u03ec\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0005$\u03f4"+ + "\b$\n$\f$\u03f7\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005%\u03ff"+ + "\b%\n%\f%\u0402\t%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003\'\u0419\b\'\u0001(\u0001"+ + "(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0003+\u042d\b+\u0004+\u042f"+ + "\b+\u000b+\f+\u0430\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0003,\u043c\b,\u0001,\u0001,\u0001,\u0001,\u0003,\u0442\b,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0004,\u044c\b,\u000b"+ + ",\f,\u044d\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0004"+ + ",\u0458\b,\u000b,\f,\u0459\u0001,\u0001,\u0001,\u0003,\u045f\b,\u0003"+ + ",\u0461\b,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u0562\b,\u0001,\u0005"+ + ",\u0565\b,\n,\f,\u0568\t,\u0003,\u056a\b,\u0001,\u0001,\u0001-\u0001-"+ + "\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "1\u00041\u0584\b1\u000b1\f1\u0585\u00011\u00011\u00012\u00012\u00052\u058c"+ + "\b2\n2\f2\u058f\t2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00045\u05a0\b5\u000b"+ + "5\f5\u05a1\u00015\u00015\u00016\u00016\u00056\u05a8\b6\n6\f6\u05ab\t6"+ + "\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00018\u00048\u05b5"+ + "\b8\u000b8\f8\u05b6\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001A\u0001A\u0001A\u0001A\u0005A\u05ed\bA\nA\fA\u05f0\tA\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+ + "F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ + "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+ + "O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ "S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ - "W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\"+ - "\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ - "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001"+ - "c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0003d\u069c\bd\u0001d\u0001"+ - "d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0003"+ - "f\u06a9\bf\u0001f\u0001f\u0003f\u06ad\bf\u0001f\u0004f\u06b0\bf\u000b"+ - "f\ff\u06b1\u0001f\u0003f\u06b5\bf\u0001f\u0003f\u06b8\bf\u0001f\u0003"+ - "f\u06bb\bf\u0001f\u0001f\u0003f\u06bf\bf\u0001f\u0001f\u0003f\u06c3\b"+ - "f\u0001f\u0004f\u06c6\bf\u000bf\ff\u06c7\u0001f\u0003f\u06cb\bf\u0001"+ - "f\u0001f\u0003f\u06cf\bf\u0005f\u06d1\bf\nf\ff\u06d4\tf\u0001f\u0003f"+ - "\u06d7\bf\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0005g\u06e6\bg\ng\fg\u06e9\tg\u0001g\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001"+ - "h\u0001h\u0001h\u0003h\u06f9\bh\u0001h\u0001h\u0005h\u06fd\bh\nh\fh\u0700"+ - "\th\u0001h\u0001h\u0004h\u0704\bh\u000bh\fh\u0705\u0001h\u0003h\u0709"+ - "\bh\u0001h\u0001h\u0003h\u070d\bh\u0004h\u070f\bh\u000bh\fh\u0710\u0001"+ - "h\u0001h\u0001h\u0001h\u0003h\u0717\bh\u0001h\u0001h\u0001i\u0001i\u0001"+ - "i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001"+ - "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+ - "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001"+ - "o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0006\u0183\u0198\u01a6"+ - "\u0376\u0422\u061d\u0000q\f\u0000\u000e\u0000\u0010\u0000\u0012\u0000"+ - "\u0014\u0000\u0016\u0000\u0018\n\u001a\u0000\u001c\u0000\u001e\u0000 "+ - "\u0000\"\u0000$(&\u0000(\u0000*\u0000,\u000b.\u00000\u00002\u00004\f6"+ - "\r8\u000e:\u0000<\u0000>\u0000@\u0000B\u0000D\u0006F\u0000H\u0000J\u0000"+ - "L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z\u0000\\\u0000^\u0000"+ - "`\u0000b\u000fd\u0000f\u0000h\u0000j\u0000l\u0000n\u0000p\u0000r\u0010"+ - "t\u0011v\u0012x\u0013z\u0014|\u0000~\u0000\u0080\u0015\u0082\u0016\u0084"+ - "\u0017\u0086\u0018\u0088\u0019\u008a\u0000\u008c\u001a\u008e\u0000\u0090"+ - "\u0000\u0092\u0000\u0094\u001b\u0096\u0000\u0098\u001c\u009a\u001d\u009c"+ - "\u0000\u009e)\u00a0\u001e\u00a2\u001f\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac"+ - "$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000\u00b6\u0000\u00b8\u0000\u00ba"+ - "\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000\u00c2\u0000\u00c4\u0000\u00c6"+ - "*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce\u0000\u00d0\u0000\u00d2\u0000"+ - "\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc\u0000\u00de+\u00e0"+ - "\u0000\u00e2\u0000\u00e4\u0000\u00e6\'\u00e8\u0000\u00ea\u0000\u00ec\u0000"+ - "\f\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b-\u0002"+ - "\u0000FFff\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000EEee\u0002\u0000"+ - "AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000IIii\u0002\u0000WWww\u0002"+ - "\u0000LLll\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000NNnn\u0002\u0000"+ - "PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002\u0000GGgg\u0002\u0000DDdd\u0002"+ - "\u0000MMmm\u0001\u0000::\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u0000"+ - "-.0:AZaz\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000BBbb\u0002\u0000"+ + "V\u0001V\u0003V\u066d\bV\u0001V\u0001V\u0003V\u0671\bV\u0001V\u0004V\u0674"+ + "\bV\u000bV\fV\u0675\u0001V\u0003V\u0679\bV\u0001V\u0003V\u067c\bV\u0001"+ + "V\u0003V\u067f\bV\u0001V\u0001V\u0003V\u0683\bV\u0001V\u0001V\u0003V\u0687"+ + "\bV\u0001V\u0004V\u068a\bV\u000bV\fV\u068b\u0001V\u0003V\u068f\bV\u0001"+ + "V\u0001V\u0003V\u0693\bV\u0005V\u0695\bV\nV\fV\u0698\tV\u0001V\u0003V"+ + "\u069b\bV\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0005W\u06aa\bW\nW\fW\u06ad\tW\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0003X\u06bd\bX\u0001X\u0001X\u0005X\u06c1\bX\nX\fX\u06c4"+ + "\tX\u0001X\u0001X\u0004X\u06c8\bX\u000bX\fX\u06c9\u0001X\u0003X\u06cd"+ + "\bX\u0001X\u0001X\u0003X\u06d1\bX\u0004X\u06d3\bX\u000bX\fX\u06d4\u0001"+ + "X\u0001X\u0001X\u0001X\u0003X\u06db\bX\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ + "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]"+ + "\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ + "_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0005\u015f"+ + "\u016d\u033e\u03ea\u05ee\u0000a\u000b\u0000\r\u0000\u000f\u0000\u0011"+ + "\u0000\u0013\n\u0015\u0000\u0017\u0000\u0019\u0000\u001b\u0000\u001d\u0000"+ + "\u001f\u001d!\u0000#\u0000%\u0000\'\u000b)\u0000+\u0000-\u0000/\f1\r3"+ + "\u000e5\u00007\u00009\u0000;\u0000=\u0000?\u0006A\u0000C\u0000E\u0000"+ + "G\u0000I\u0000K\u0000M\u0000O\u0000Q\u0000S\u0000U\u0000W\u0000Y\u0000"+ + "[\u0000]\u000f_\u0000a\u0000c\u0000e\u0000g\u0000i\u0000k\u0000m\u0010"+ + "o\u0011q\u0000s\u0000u\u0012w\u0013y\u0000{\u0014}\u0000\u007f\u0000\u0081"+ + "\u0000\u0083\u0015\u0085\u0000\u0087\u0016\u0089\u0017\u008b\u0000\u008d"+ + "\u0018\u008f\u0019\u0091\u0000\u0093\u001a\u0095\u001b\u0097\u0000\u0099"+ + "\u0000\u009b\u0000\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3\u0000\u00a5"+ + "\u0000\u00a7\u0000\u00a9\u001e\u00ab\u0000\u00ad\u0000\u00af\u001f\u00b1"+ + "\u0000\u00b3\u0000\u00b5\u0000\u00b7\u0000\u00b9\u0000\u00bb\u0000\u00bd"+ + " \u00bf\u0000\u00c1\u0000\u00c3\u0000\u00c5\u001c\u00c7\u0000\u00c9\u0000"+ + "\u00cb\u0000\u000b\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ + "\n,\u0002\u0000FFff\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000EEee\u0002"+ + "\u0000AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000IIii\u0002\u0000"+ + "WWww\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000NNnn\u0002"+ + "\u0000PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002\u0000GGgg\u0002\u0000"+ + "DDdd\u0002\u0000MMmm\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u0000-"+ + ".0:AZaz\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000BBbb\u0002\u0000"+ "KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002\u0000JJjj\u0004\u0000\n\n\r"+ "\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000,,..==__\u0001"+ "\u0000(;\u0002\u0000[[]]\u0002\u0000##..\u0003\u0000..==__\u0005\u0000"+ "09AZ__az\u0080\u8000\ufffe\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000"+ "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ - "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0005\u0000 \'\'::{"+ - "{}}\u0005\u0000 !\'\'::{{}}\u07da\u0000\u0018\u0001\u0000\u0000\u0000"+ - "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+ - "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+ - "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+ - "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+ - "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+ - "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+ - "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+ - "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+ - ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001"+ - "\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000"+ - "\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000"+ - "L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001"+ - "\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000"+ - "\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000\u0001"+ - "n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000\u0000\u0000\u0002r\u0001"+ - "\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000\u0000"+ - "\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000\u0002"+ - "|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000\u0000\u0000\u0003\u0080\u0001"+ - "\u0000\u0000\u0000\u0003\u0082\u0001\u0000\u0000\u0000\u0003\u0084\u0001"+ - "\u0000\u0000\u0000\u0003\u0086\u0001\u0000\u0000\u0000\u0003\u0088\u0001"+ - "\u0000\u0000\u0000\u0003\u008a\u0001\u0000\u0000\u0000\u0004\u008c\u0001"+ - "\u0000\u0000\u0000\u0004\u008e\u0001\u0000\u0000\u0000\u0004\u0090\u0001"+ - "\u0000\u0000\u0000\u0004\u0092\u0001\u0000\u0000\u0000\u0005\u0094\u0001"+ - "\u0000\u0000\u0000\u0005\u0096\u0001\u0000\u0000\u0000\u0005\u0098\u0001"+ - "\u0000\u0000\u0000\u0005\u009a\u0001\u0000\u0000\u0000\u0005\u009c\u0001"+ - "\u0000\u0000\u0000\u0005\u009e\u0001\u0000\u0000\u0000\u0005\u00a0\u0001"+ - "\u0000\u0000\u0000\u0005\u00a2\u0001\u0000\u0000\u0000\u0005\u00a4\u0001"+ - "\u0000\u0000\u0000\u0005\u00a6\u0001\u0000\u0000\u0000\u0005\u00a8\u0001"+ - "\u0000\u0000\u0000\u0005\u00aa\u0001\u0000\u0000\u0000\u0005\u00ac\u0001"+ - "\u0000\u0000\u0000\u0005\u00ae\u0001\u0000\u0000\u0000\u0006\u00b0\u0001"+ - "\u0000\u0000\u0000\u0006\u00b2\u0001\u0000\u0000\u0000\u0006\u00b4\u0001"+ - "\u0000\u0000\u0000\u0006\u00b6\u0001\u0000\u0000\u0000\u0007\u00b8\u0001"+ - "\u0000\u0000\u0000\u0007\u00ba\u0001\u0000\u0000\u0000\u0007\u00bc\u0001"+ - "\u0000\u0000\u0000\u0007\u00be\u0001\u0000\u0000\u0000\b\u00c0\u0001\u0000"+ - "\u0000\u0000\b\u00c2\u0001\u0000\u0000\u0000\b\u00c4\u0001\u0000\u0000"+ - "\u0000\b\u00c6\u0001\u0000\u0000\u0000\b\u00c8\u0001\u0000\u0000\u0000"+ - "\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc\u0001\u0000\u0000\u0000\t\u00ce"+ - "\u0001\u0000\u0000\u0000\t\u00d0\u0001\u0000\u0000\u0000\t\u00d2\u0001"+ - "\u0000\u0000\u0000\n\u00d4\u0001\u0000\u0000\u0000\n\u00d6\u0001\u0000"+ - "\u0000\u0000\n\u00d8\u0001\u0000\u0000\u0000\n\u00da\u0001\u0000\u0000"+ - "\u0000\n\u00dc\u0001\u0000\u0000\u0000\n\u00de\u0001\u0000\u0000\u0000"+ - "\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2\u0001\u0000\u0000\u0000\n\u00e4"+ - "\u0001\u0000\u0000\u0000\u000b\u00e6\u0001\u0000\u0000\u0000\u000b\u00e8"+ - "\u0001\u0000\u0000\u0000\u000b\u00ea\u0001\u0000\u0000\u0000\u000b\u00ec"+ - "\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000\u0000\u0000\u000e\u015b\u0001"+ - "\u0000\u0000\u0000\u0010\u015d\u0001\u0000\u0000\u0000\u0012\u0179\u0001"+ - "\u0000\u0000\u0000\u0014\u0188\u0001\u0000\u0000\u0000\u0016\u018f\u0001"+ - "\u0000\u0000\u0000\u0018\u01ae\u0001\u0000\u0000\u0000\u001a\u01cc\u0001"+ - "\u0000\u0000\u0000\u001c\u023e\u0001\u0000\u0000\u0000\u001e\u0259\u0001"+ - "\u0000\u0000\u0000 \u0288\u0001\u0000\u0000\u0000\"\u028c\u0001\u0000"+ - "\u0000\u0000$\u0299\u0001\u0000\u0000\u0000&\u02bf\u0001\u0000\u0000\u0000"+ - "(\u02e4\u0001\u0000\u0000\u0000*\u02e8\u0001\u0000\u0000\u0000,\u02f5"+ - "\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000\u0000\u00000\u0349\u0001\u0000"+ - "\u0000\u00002\u034d\u0001\u0000\u0000\u00004\u0356\u0001\u0000\u0000\u0000"+ - "6\u035c\u0001\u0000\u0000\u00008\u035f\u0001\u0000\u0000\u0000:\u0363"+ - "\u0001\u0000\u0000\u0000<\u0369\u0001\u0000\u0000\u0000>\u037d\u0001\u0000"+ - "\u0000\u0000@\u0390\u0001\u0000\u0000\u0000B\u03a0\u0001\u0000\u0000\u0000"+ - "D\u03c1\u0001\u0000\u0000\u0000F\u03e5\u0001\u0000\u0000\u0000H\u03f5"+ - "\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000\u0000\u0000L\u0402\u0001\u0000"+ - "\u0000\u0000N\u0406\u0001\u0000\u0000\u0000P\u040d\u0001\u0000\u0000\u0000"+ - "R\u0414\u0001\u0000\u0000\u0000T\u041b\u0001\u0000\u0000\u0000V\u041d"+ - "\u0001\u0000\u0000\u0000X\u0427\u0001\u0000\u0000\u0000Z\u0432\u0001\u0000"+ - "\u0000\u0000\\\u043b\u0001\u0000\u0000\u0000^\u0450\u0001\u0000\u0000"+ - "\u0000`\u0452\u0001\u0000\u0000\u0000b\u0454\u0001\u0000\u0000\u0000d"+ - "\u045b\u0001\u0000\u0000\u0000f\u0461\u0001\u0000\u0000\u0000h\u0557\u0001"+ - "\u0000\u0000\u0000j\u055b\u0001\u0000\u0000\u0000l\u0561\u0001\u0000\u0000"+ - "\u0000n\u0565\u0001\u0000\u0000\u0000p\u056a\u0001\u0000\u0000\u0000r"+ - "\u0570\u0001\u0000\u0000\u0000t\u0575\u0001\u0000\u0000\u0000v\u057c\u0001"+ - "\u0000\u0000\u0000x\u0581\u0001\u0000\u0000\u0000z\u0587\u0001\u0000\u0000"+ - "\u0000|\u0590\u0001\u0000\u0000\u0000~\u0595\u0001\u0000\u0000\u0000\u0080"+ - "\u059c\u0001\u0000\u0000\u0000\u0082\u05a1\u0001\u0000\u0000\u0000\u0084"+ - "\u05a8\u0001\u0000\u0000\u0000\u0086\u05ad\u0001\u0000\u0000\u0000\u0088"+ - "\u05b3\u0001\u0000\u0000\u0000\u008a\u05bc\u0001\u0000\u0000\u0000\u008c"+ - "\u05c2\u0001\u0000\u0000\u0000\u008e\u05ca\u0001\u0000\u0000\u0000\u0090"+ - "\u05d0\u0001\u0000\u0000\u0000\u0092\u05d5\u0001\u0000\u0000\u0000\u0094"+ - "\u05da\u0001\u0000\u0000\u0000\u0096\u05df\u0001\u0000\u0000\u0000\u0098"+ - "\u05e6\u0001\u0000\u0000\u0000\u009a\u05eb\u0001\u0000\u0000\u0000\u009c"+ - "\u05f0\u0001\u0000\u0000\u0000\u009e\u05f6\u0001\u0000\u0000\u0000\u00a0"+ - "\u05fb\u0001\u0000\u0000\u0000\u00a2\u0600\u0001\u0000\u0000\u0000\u00a4"+ - "\u0605\u0001\u0000\u0000\u0000\u00a6\u060e\u0001\u0000\u0000\u0000\u00a8"+ - "\u0613\u0001\u0000\u0000\u0000\u00aa\u0617\u0001\u0000\u0000\u0000\u00ac"+ - "\u0625\u0001\u0000\u0000\u0000\u00ae\u0628\u0001\u0000\u0000\u0000\u00b0"+ - "\u062d\u0001\u0000\u0000\u0000\u00b2\u0637\u0001\u0000\u0000\u0000\u00b4"+ - "\u063c\u0001\u0000\u0000\u0000\u00b6\u0640\u0001\u0000\u0000\u0000\u00b8"+ - "\u0645\u0001\u0000\u0000\u0000\u00ba\u0655\u0001\u0000\u0000\u0000\u00bc"+ - "\u065a\u0001\u0000\u0000\u0000\u00be\u065e\u0001\u0000\u0000\u0000\u00c0"+ - "\u0663\u0001\u0000\u0000\u0000\u00c2\u066b\u0001\u0000\u0000\u0000\u00c4"+ - "\u0671\u0001\u0000\u0000\u0000\u00c6\u0678\u0001\u0000\u0000\u0000\u00c8"+ - "\u067d\u0001\u0000\u0000\u0000\u00ca\u0681\u0001\u0000\u0000\u0000\u00cc"+ - "\u0686\u0001\u0000\u0000\u0000\u00ce\u068b\u0001\u0000\u0000\u0000\u00d0"+ - "\u0690\u0001\u0000\u0000\u0000\u00d2\u0694\u0001\u0000\u0000\u0000\u00d4"+ - "\u0699\u0001\u0000\u0000\u0000\u00d6\u06a2\u0001\u0000\u0000\u0000\u00d8"+ - "\u06a6\u0001\u0000\u0000\u0000\u00da\u06dc\u0001\u0000\u0000\u0000\u00dc"+ - "\u0716\u0001\u0000\u0000\u0000\u00de\u071a\u0001\u0000\u0000\u0000\u00e0"+ - "\u071f\u0001\u0000\u0000\u0000\u00e2\u0724\u0001\u0000\u0000\u0000\u00e4"+ - "\u0728\u0001\u0000\u0000\u0000\u00e6\u072d\u0001\u0000\u0000\u0000\u00e8"+ - "\u0734\u0001\u0000\u0000\u0000\u00ea\u0739\u0001\u0000\u0000\u0000\u00ec"+ - "\u073d\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005:\u0000\u0000\u00ef\u00f6"+ - "\u0005:\u0000\u0000\u00f0\u00f1\u0005?\u0000\u0000\u00f1\u00f6\u0005:"+ - "\u0000\u0000\u00f2\u00f3\u0005 \u0000\u0000\u00f3\u00f4\u0005:\u0000\u0000"+ - "\u00f4\u00f6\u0005 \u0000\u0000\u00f5\u00ee\u0001\u0000\u0000\u0000\u00f5"+ - "\u00f0\u0001\u0000\u0000\u0000\u00f5\u00f2\u0001\u0000\u0000\u0000\u00f6"+ - "\r\u0001\u0000\u0000\u0000\u00f7\u00f8\u0007\u0000\u0000\u0000\u00f8\u00f9"+ - "\u0007\u0001\u0000\u0000\u00f9\u00fa\u0007\u0002\u0000\u0000\u00fa\u00ff"+ - "\u0001\u0000\u0000\u0000\u00fb\u00fc\u0007\u0003\u0000\u0000\u00fc\u00fd"+ - "\u0007\u0004\u0000\u0000\u00fd\u00fe\u0007\u0005\u0000\u0000\u00fe\u0100"+ - "\u0007\u0006\u0000\u0000\u00ff\u00fb\u0001\u0000\u0000\u0000\u00ff\u0100"+ - "\u0001\u0000\u0000\u0000\u0100\u015c\u0001\u0000\u0000\u0000\u0101\u0102"+ - "\u0007\u0007\u0000\u0000\u0102\u015c\u0007\u0000\u0000\u0000\u0103\u0104"+ - "\u0007\b\u0000\u0000\u0104\u0105\u0007\u0006\u0000\u0000\u0105\u0106\u0007"+ - "\u0007\u0000\u0000\u0106\u0107\u0007\t\u0000\u0000\u0107\u015c\u0007\u0003"+ - "\u0000\u0000\u0108\u0109\u0007\n\u0000\u0000\u0109\u010a\u0007\u0003\u0000"+ - "\u0000\u010a\u010b\u0007\u0005\u0000\u0000\u010b\u010c\u0007\u000b\u0000"+ - "\u0000\u010c\u010d\u0007\u0007\u0000\u0000\u010d\u010e\u0007\u0001\u0000"+ - "\u0000\u010e\u015c\u0007\f\u0000\u0000\u010f\u0110\u0007\n\u0000\u0000"+ - "\u0110\u0111\u0007\u0003\u0000\u0000\u0111\u0112\u0007\n\u0000\u0000\u0112"+ - "\u0113\u0007\n\u0000\u0000\u0113\u0114\u0007\u0007\u0000\u0000\u0114\u0115"+ - "\u0007\u0001\u0000\u0000\u0115\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007"+ - "\u0001\u0000\u0000\u0117\u0118\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005"+ - "\u0000\u0000\u0119\u015c\u0007\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000"+ - "\u0000\u011b\u011c\u0007\u000e\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000"+ - "\u011d\u015c\u0007\u0006\u0000\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f"+ - "\u0120\u0007\u000e\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122"+ - "\u0007\u0006\u0000\u0000\u0122\u0123\u0007\u0001\u0000\u0000\u0123\u0124"+ - "\u0007\f\u0000\u0000\u0124\u0125\u0007\u0005\u0000\u0000\u0125\u015c\u0007"+ - "\u0003\u0000\u0000\u0126\u0127\u0007\n\u0000\u0000\u0127\u0128\u0007\b"+ - "\u0000\u0000\u0128\u0129\u0007\u0007\u0000\u0000\u0129\u012a\u0007\u000b"+ - "\u0000\u0000\u012a\u012b\u0007\u0005\u0000\u0000\u012b\u015c\u0007\u0006"+ - "\u0000\u0000\u012c\u012d\u0007\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000"+ - "\u0000\u012e\u012f\u0007\t\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000"+ - "\u0130\u0131\u0007\n\u0000\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132"+ - "\u0133\u0007\u0005\u0000\u0000\u0133\u0134\u0007\u0004\u0000\u0000\u0134"+ - "\u0135\u0007\f\u0000\u0000\u0135\u013c\u0001\u0000\u0000\u0000\u0136\u0137"+ - "\u0007\u0004\u0000\u0000\u0137\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007"+ - "\u000f\u0000\u0000\u0139\u013a\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001"+ - "\u0000\u0000\u013b\u013d\u0007\u000b\u0000\u0000\u013c\u0136\u0001\u0000"+ - "\u0000\u0000\u013c\u0139\u0001\u0000\u0000\u0000\u013c\u013d\u0001\u0000"+ - "\u0000\u0000\u013d\u015c\u0001\u0000\u0000\u0000\u013e\u013f\u0007\u0004"+ - "\u0000\u0000\u013f\u0140\u0007\u000e\u0000\u0000\u0140\u0141\u0007\u000b"+ - "\u0000\u0000\u0141\u015c\u0007\u0006\u0000\u0000\u0142\u0143\u0007\u0010"+ - "\u0000\u0000\u0143\u0144\u0007\u000e\u0000\u0000\u0144\u0145\u0007\u0003"+ - "\u0000\u0000\u0145\u0146\u0007\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000"+ - "\u0000\u0147\u0148\u0007\u0003\u0000\u0000\u0148\u0149\u0007\u0002\u0000"+ - "\u0000\u0149\u014a\u0007\u0002\u0000\u0000\u014a\u014b\u0007\u0001\u0000"+ - "\u0000\u014b\u015c\u0007\u0002\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000"+ - "\u014d\u014e\u0007\u0002\u0000\u0000\u014e\u014f\u0007\u0001\u0000\u0000"+ - "\u014f\u0150\u0007\u0011\u0000\u0000\u0150\u0151\u0007\u000e\u0000\u0000"+ - "\u0151\u0152\u0007\u0005\u0000\u0000\u0152\u0153\u0007\u000b\u0000\u0000"+ - "\u0153\u0154\u0007\u0007\u0000\u0000\u0154\u0155\u0007\u0001\u0000\u0000"+ - "\u0155\u015c\u0007\f\u0000\u0000\u0156\u0157\u0007\u0003\u0000\u0000\u0157"+ - "\u0158\u0007\u0012\u0000\u0000\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a"+ - "\u0007\u000b\u0000\u0000\u015a\u015c\u0007\u000f\u0000\u0000\u015b\u00f7"+ - "\u0001\u0000\u0000\u0000\u015b\u0101\u0001\u0000\u0000\u0000\u015b\u0103"+ - "\u0001\u0000\u0000\u0000\u015b\u0108\u0001\u0000\u0000\u0000\u015b\u010f"+ - "\u0001\u0000\u0000\u0000\u015b\u0116\u0001\u0000\u0000\u0000\u015b\u011a"+ - "\u0001\u0000\u0000\u0000\u015b\u011e\u0001\u0000\u0000\u0000\u015b\u0126"+ - "\u0001\u0000\u0000\u0000\u015b\u012c\u0001\u0000\u0000\u0000\u015b\u0132"+ - "\u0001\u0000\u0000\u0000\u015b\u013e\u0001\u0000\u0000\u0000\u015b\u0142"+ - "\u0001\u0000\u0000\u0000\u015b\u0147\u0001\u0000\u0000\u0000\u015b\u014c"+ - "\u0001\u0000\u0000\u0000\u015b\u0156\u0001\u0000\u0000\u0000\u015c\u000f"+ - "\u0001\u0000\u0000\u0000\u015d\u015e\u0005@\u0000\u0000\u015e\u015f\u0007"+ - "\u0007\u0000\u0000\u015f\u0160\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005"+ - "\u0000\u0000\u0161\u0162\u0007\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000"+ - "\u0000\u0163\u0164\u0007\u0011\u0000\u0000\u0164\u0165\u0007\u0003\u0000"+ - "\u0000\u0165\u0177\u0001\u0000\u0000\u0000\u0166\u0167\u0007\u0007\u0000"+ - "\u0000\u0167\u0178\u0007\u0000\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000"+ - "\u0169\u016a\u0007\u0006\u0000\u0000\u016a\u016b\u0007\u0003\u0000\u0000"+ - "\u016b\u0178\u0007\f\u0000\u0000\u016c\u016d\u0007\u0000\u0000\u0000\u016d"+ - "\u016e\u0007\u0007\u0000\u0000\u016e\u016f\u0007\u0002\u0000\u0000\u016f"+ - "\u0170\u0007\n\u0000\u0000\u0170\u0178\u0007\u000b\u0000\u0000\u0171\u0172"+ - "\u0007\u000e\u0000\u0000\u0172\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007"+ - "\t\u0000\u0000\u0174\u0175\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n"+ - "\u0000\u0000\u0176\u0178\u0007\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000"+ - "\u0000\u0177\u0168\u0001\u0000\u0000\u0000\u0177\u016c\u0001\u0000\u0000"+ - "\u0000\u0177\u0171\u0001\u0000\u0000\u0000\u0177\u0178\u0001\u0000\u0000"+ - "\u0000\u0178\u0011\u0001\u0000\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000"+ - "\u017a\u0182\u0003T$\u0000\u017b\u017c\u0005{\u0000\u0000\u017c\u017d"+ - "\u0003\\(\u0000\u017d\u017e\u0005}\u0000\u0000\u017e\u0182\u0001\u0000"+ - "\u0000\u0000\u017f\u0182\t\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000"+ - "\u0000\u0181\u017a\u0001\u0000\u0000\u0000\u0181\u017b\u0001\u0000\u0000"+ - "\u0000\u0181\u017f\u0001\u0000\u0000\u0000\u0181\u0180\u0001\u0000\u0000"+ - "\u0000\u0182\u0185\u0001\u0000\u0000\u0000\u0183\u0184\u0001\u0000\u0000"+ - "\u0000\u0183\u0181\u0001\u0000\u0000\u0000\u0184\u0186\u0001\u0000\u0000"+ - "\u0000\u0185\u0183\u0001\u0000\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000"+ - "\u0187\u0013\u0001\u0000\u0000\u0000\u0188\u018c\u0007\u0014\u0000\u0000"+ - "\u0189\u018b\u0007\u0015\u0000\u0000\u018a\u0189\u0001\u0000\u0000\u0000"+ - "\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000\u0000"+ - "\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u0015\u0001\u0000\u0000\u0000"+ - "\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0005\u00b0\u0000\u0000"+ - "\u0190\u0017\u0001\u0000\u0000\u0000\u0191\u0192\u0005<\u0000\u0000\u0192"+ - "\u0193\u0005?\u0000\u0000\u0193\u0194\u0005=\u0000\u0000\u0194\u0198\u0001"+ - "\u0000\u0000\u0000\u0195\u0197\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000"+ - "\u0000\u0000\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000"+ - "\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0199\u019b\u0001\u0000"+ - "\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019c\u0005?\u0000"+ - "\u0000\u019c\u01af\u0005>\u0000\u0000\u019d\u019e\u0005<\u0000\u0000\u019e"+ - "\u019f\u0005?\u0000\u0000\u019f\u01a0\u0007\r\u0000\u0000\u01a0\u01a1"+ - "\u0007\u0006\u0000\u0000\u01a1\u01a2\u0007\r\u0000\u0000\u01a2\u01a6\u0001"+ - "\u0000\u0000\u0000\u01a3\u01a5\t\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000"+ - "\u0000\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000"+ - "\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000"+ - "\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000"+ - "\u0000\u01aa\u01ad\u0005>\u0000\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001"+ - "\u01ac\u01a9\u0001\u0000\u0000\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000"+ - "\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae\u0191\u0001\u0000\u0000\u0000"+ - "\u01ae\u019d\u0001\u0000\u0000\u0000\u01af\u0019\u0001\u0000\u0000\u0000"+ - "\u01b0\u01b1\u0005@\u0000\u0000\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2"+ - "\u01b3\u0005@\u0000\u0000\u01b3\u01b4\u0007\n\u0000\u0000\u01b4\u01b5"+ - "\u0007\u0003\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6\u01b7"+ - "\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0007\u0000\u0000\u01b8\u01b9"+ - "\u0007\u0001\u0000\u0000\u01b9\u01ba\u0007\f\u0000\u0000\u01ba\u01bb\u0007"+ - "\u0012\u0000\u0000\u01bb\u01bc\u0007\u0007\u0000\u0000\u01bc\u01bd\u0007"+ - "\n\u0000\u0000\u01bd\u01be\u0007\n\u0000\u0000\u01be\u01bf\u0007\u0007"+ - "\u0000\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01cd\u0007\u0010\u0000"+ - "\u0000\u01c1\u01c2\u0005@\u0000\u0000\u01c2\u01c3\u0007\u0006\u0000\u0000"+ - "\u01c3\u01c4\u0007\u0004\u0000\u0000\u01c4\u01c5\u0007\n\u0000\u0000\u01c5"+ - "\u01c6\u0007\n\u0000\u0000\u01c6\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8"+ - "\u0007\u0005\u0000\u0000\u01c8\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca"+ - "\u0007\u0007\u0000\u0000\u01ca\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd"+ - "\u0007\f\u0000\u0000\u01cc\u01b0\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001"+ - "\u0000\u0000\u0000\u01cc\u01c1\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001"+ - "\u0000\u0000\u0000\u01ce\u01cf\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006"+ - "\u0007\u0001\u0000\u01d0\u001b\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005"+ - "@\u0000\u0000\u01d2\u01d3\u0007\u0003\u0000\u0000\u01d3\u01d4\u0007\t"+ - "\u0000\u0000\u01d4\u01d5\u0007\n\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000"+ - "\u0000\u01d6\u01d7\u0007\u0007\u0000\u0000\u01d7\u023f\u0007\u0000\u0000"+ - "\u0000\u01d8\u023f\u0003\u0010\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000"+ - "\u01da\u01db\u0007\u0003\u0000\u0000\u01db\u01dc\u0007\u0016\u0000\u0000"+ - "\u01dc\u01dd\u0007\u000b\u0000\u0000\u01dd\u01de\u0007\u0003\u0000\u0000"+ - "\u01de\u01df\u0007\f\u0000\u0000\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0"+ - "\u023f\u0007\n\u0000\u0000\u01e1\u01e2\u0005@\u0000\u0000\u01e2\u01e3"+ - "\u0007\u0003\u0000\u0000\u01e3\u01e4\u0007\u0004\u0000\u0000\u01e4\u01e5"+ - "\u0007\u0005\u0000\u0000\u01e5\u023f\u0007\u0006\u0000\u0000\u01e6\u01e7"+ - "\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000f\u0000\u0000\u01e8\u01e9\u0007"+ - "\u0007\u0000\u0000\u01e9\u01ea\u0007\u0003\u0000\u0000\u01ea\u01eb\u0007"+ - "\t\u0000\u0000\u01eb\u023f\u0007\u0011\u0000\u0000\u01ec\u01ed\u0005@"+ - "\u0000\u0000\u01ed\u01ee\u0007\r\u0000\u0000\u01ee\u01ef\u0007\u0002\u0000"+ - "\u0000\u01ef\u01f0\u0007\u0001\u0000\u0000\u01f0\u01f1\u0007\r\u0000\u0000"+ - "\u01f1\u023f\u0007\n\u0000\u0000\u01f2\u01f3\u0005@\u0000\u0000\u01f3"+ - "\u01f4\u0007\u0012\u0000\u0000\u01f4\u01f5\u0007\u0003\u0000\u0000\u01f5"+ - "\u01f6\u0007\u000b\u0000\u0000\u01f6\u01f7\u0007\u0006\u0000\u0000\u01f7"+ - "\u01f8\u0007\u0001\u0000\u0000\u01f8\u023f\u0007\u0011\u0000\u0000\u01f9"+ - "\u01fa\u0005@\u0000\u0000\u01fa\u01fb\u0007\u0005\u0000\u0000\u01fb\u01fc"+ - "\u0007\t\u0000\u0000\u01fc\u01fd\u0007\u0004\u0000\u0000\u01fd\u01fe\u0007"+ - "\n\u0000\u0000\u01fe\u023f\u0007\n\u0000\u0000\u01ff\u0200\u0005@\u0000"+ - "\u0000\u0200\u0201\u0007\n\u0000\u0000\u0201\u0202\u0007\u000b\u0000\u0000"+ - "\u0202\u0203\u0007\u000f\u0000\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204"+ - "\u023f\u0007\u0003\u0000\u0000\u0205\u0206\u0005@\u0000\u0000\u0206\u0207"+ - "\u0007\u0004\u0000\u0000\u0207\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007"+ - "\u0004\u0000\u0000\u0209\u020a\u0007\u0002\u0000\u0000\u020a\u023f\u0007"+ - "\u0003\u0000\u0000\u020b\u020c\u0005@\u0000\u0000\u020c\u020d\u0007\u0017"+ - "\u0000\u0000\u020d\u020e\u0007\u0002\u0000\u0000\u020e\u020f\u0007\u0003"+ - "\u0000\u0000\u020f\u0210\u0007\u0004\u0000\u0000\u0210\u023f\u0007\u0018"+ - "\u0000\u0000\u0211\u0212\u0005@\u0000\u0000\u0212\u0213\u0007\u0005\u0000"+ - "\u0000\u0213\u0214\u0007\u0001\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000"+ - "\u0215\u0216\u0007\u000b\u0000\u0000\u0216\u0217\u0007\u0007\u0000\u0000"+ - "\u0217\u0218\u0007\f\u0000\u0000\u0218\u0219\u0007\u000e\u0000\u0000\u0219"+ - "\u023f\u0007\u0003\u0000\u0000\u021a\u021b\u0005@\u0000\u0000\u021b\u021c"+ - "\u0007\n\u0000\u0000\u021c\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007"+ - "\t\u0000\u0000\u021e\u021f\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005"+ - "\u0000\u0000\u0220\u0221\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003"+ - "\u0000\u0000\u0222\u023f\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000"+ - "\u0000\u0224\u0225\u0007\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000"+ - "\u0000\u0226\u0227\u0007\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000"+ - "\u0228\u0229\u0007\u0017\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a"+ - "\u022b\u0007\u0003\u0000\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c"+ - "\u022d\u0005@\u0000\u0000\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f"+ - "\u0007\u0003\u0000\u0000\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231"+ - "\u0007\u0011\u0000\u0000\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233"+ - "\u0007\f\u0000\u0000\u0233\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007"+ - "\u000f\u0000\u0000\u0235\u0236\u0005@\u0000\u0000\u0236\u0237\u0007\u0002"+ - "\u0000\u0000\u0237\u0238\u0007\u0003\u0000\u0000\u0238\u0239\u0007\u0019"+ - "\u0000\u0000\u0239\u023a\u0007\u000e\u0000\u0000\u023a\u023b\u0007\u0007"+ - "\u0000\u0000\u023b\u023c\u0007\u0002\u0000\u0000\u023c\u023d\u0007\u0003"+ - "\u0000\u0000\u023d\u023f\u0007\u0011\u0000\u0000\u023e\u01d1\u0001\u0000"+ - "\u0000\u0000\u023e\u01d8\u0001\u0000\u0000\u0000\u023e\u01d9\u0001\u0000"+ - "\u0000\u0000\u023e\u01e1\u0001\u0000\u0000\u0000\u023e\u01e6\u0001\u0000"+ - "\u0000\u0000\u023e\u01ec\u0001\u0000\u0000\u0000\u023e\u01f2\u0001\u0000"+ - "\u0000\u0000\u023e\u01f9\u0001\u0000\u0000\u0000\u023e\u01ff\u0001\u0000"+ - "\u0000\u0000\u023e\u0205\u0001\u0000\u0000\u0000\u023e\u020b\u0001\u0000"+ - "\u0000\u0000\u023e\u0211\u0001\u0000\u0000\u0000\u023e\u021a\u0001\u0000"+ - "\u0000\u0000\u023e\u0223\u0001\u0000\u0000\u0000\u023e\u022c\u0001\u0000"+ - "\u0000\u0000\u023e\u0235\u0001\u0000\u0000\u0000\u023f\u0241\u0001\u0000"+ - "\u0000\u0000\u0240\u0242\u0005 \u0000\u0000\u0241\u0240\u0001\u0000\u0000"+ - "\u0000\u0242\u0243\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ - "\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0245\u0001\u0000\u0000"+ - "\u0000\u0245\u0246\u0004\b\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ - "\u0247\u0248\u0006\b\u0000\u0000\u0248\u0249\u0006\b\u0001\u0000\u0249"+ - "\u001d\u0001\u0000\u0000\u0000\u024a\u024b\u0005@\u0000\u0000\u024b\u024c"+ - "\u0007\u0017\u0000\u0000\u024c\u024d\u0007\u0002\u0000\u0000\u024d\u024e"+ - "\u0007\u0003\u0000\u0000\u024e\u024f\u0007\u0004\u0000\u0000\u024f\u025a"+ - "\u0007\u0018\u0000\u0000\u0250\u0251\u0005@\u0000\u0000\u0251\u0252\u0007"+ - "\u0005\u0000\u0000\u0252\u0253\u0007\u0001\u0000\u0000\u0253\u0254\u0007"+ - "\f\u0000\u0000\u0254\u0255\u0007\u000b\u0000\u0000\u0255\u0256\u0007\u0007"+ - "\u0000\u0000\u0256\u0257\u0007\f\u0000\u0000\u0257\u0258\u0007\u000e\u0000"+ - "\u0000\u0258\u025a\u0007\u0003\u0000\u0000\u0259\u024a\u0001\u0000\u0000"+ - "\u0000\u0259\u0250\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000"+ - "\u0000\u025b\u025c\u0006\t\u0001\u0000\u025c\u001f\u0001\u0000\u0000\u0000"+ - "\u025d\u025e\u0005@\u0000\u0000\u025e\u025f\u0007\n\u0000\u0000\u025f"+ - "\u0260\u0007\u000b\u0000\u0000\u0260\u0261\u0007\u0001\u0000\u0000\u0261"+ - "\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005@\u0000\u0000\u0263\u0264"+ - "\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006\u0000\u0000\u0265\u0266\u0007"+ - "\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000\u0000\u0267\u0268\u0005@"+ - "\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000\u0269\u026a\u0007\u001a"+ - "\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000\u026b\u026c\u0007\u0002"+ - "\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d\u026e\u0007\u0002\u0000"+ - "\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f\u0270\u0007\u000b\u0000"+ - "\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271\u0272\u0005@\u0000\u0000"+ - "\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274\u0007\u0007\u0000\u0000"+ - "\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276\u0007\u0003\u0000\u0000"+ - "\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278\u0007\u0003\u0000\u0000"+ - "\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a\u0007\u0005\u0000\u0000"+ - "\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c\u0007\u0002\u0000\u0000"+ - "\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e\u0007\u0000\u0000\u0000"+ - "\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280\u0007\u0003\u0000\u0000"+ - "\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007\u0006\u0000\u0000\u0282"+ - "\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285"+ - "\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000\u0000\u0286\u0287\u0001"+ - "\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001\u0000\u0288\u025d\u0001"+ - "\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000\u0000\u0288\u0267\u0001"+ - "\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000\u0000\u0288\u0282\u0001"+ - "\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000\u0000\u028a\u028b\u0006"+ - "\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000\u028c\u028d\u0005@\u0000"+ - "\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e\u028f\u0007\u0003\u0000"+ - "\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290\u0291\u0007\u0017\u0000"+ - "\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292\u0293\u0007\u000b\u0000"+ - "\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294\u0295\u0007\u0012\u0000"+ - "\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0297\u0006\u000b\u0002"+ - "\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298#\u0001\u0000\u0000\u0000"+ - "\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007\u0003\u0000\u0000\u029b"+ - "\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011\u0000\u0000\u029d\u029e"+ - "\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003\u0000\u0000\u029f\u02a0"+ - "\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017\u0000\u0000\u02a1\u02a2"+ - "\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b\u0000\u0000\u02a3\u02a4"+ - "\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012\u0000\u0000\u02a5\u02a6"+ - "\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001\u0000\u02a7%\u0001"+ - "\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9\u02aa\u0007\u0011"+ - "\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab\u02ac\u0005@\u0000"+ - "\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae\u0007\u000e\u0000"+ - "\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0\u0007\r\u0000\u0000"+ - "\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007\u001b\u0000\u0000\u02b2"+ - "\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@\u0000\u0000\u02b4\u02b5"+ - "\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000\u0000\u02b6\u02b7\u0007"+ - "\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000\u02b8\u02b9\u0005@"+ - "\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba\u02bb\u0007\f\u0000"+ - "\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd\u0007\u0003\u0000"+ - "\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0\u0007\u000b\u0000"+ - "\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab\u0001\u0000\u0000"+ - "\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3\u0001\u0000\u0000"+ - "\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000"+ - "\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006\r\u0001\u0000"+ - "\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000\u0000\u02c5"+ - "\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000\u02c7\u02c8"+ - "\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9\u02ca\u0005"+ - "@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc\u0007\n"+ - "\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007\u0000"+ - "\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011\u0000"+ - "\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000\u0000"+ - "\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e\u0000"+ - "\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000\u0000"+ - "\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000\u02d8"+ - "\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da\u02db"+ - "\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5\u0007"+ - "\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007\r"+ - "\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ - "\u0000\u0000\u02e1\u02e2\u0007\u0003\u0000\u0000\u02e2\u02e3\u0007\f\u0000"+ - "\u0000\u02e3\u02e5\u0007\u000b\u0000\u0000\u02e4\u02c4\u0001\u0000\u0000"+ - "\u0000\u02e4\u02c9\u0001\u0000\u0000\u0000\u02e4\u02ce\u0001\u0000\u0000"+ - "\u0000\u02e4\u02d6\u0001\u0000\u0000\u0000\u02e4\u02dd\u0001\u0000\u0000"+ - "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0006\u000e\u0001"+ - "\u0000\u02e7)\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005@\u0000\u0000\u02e9"+ - "\u02ea\u0007\r\u0000\u0000\u02ea\u02eb\u0007\u0006\u0000\u0000\u02eb\u02ec"+ - "\u0007\r\u0000\u0000\u02ec\u02ee\u0001\u0000\u0000\u0000\u02ed\u02ef\u0005"+ - " \u0000\u0000\u02ee\u02ed\u0001\u0000\u0000\u0000\u02ee\u02ef\u0001\u0000"+ - "\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1\u0004\u000f"+ - "\u0001\u0000\u02f1\u02f2\u0001\u0000\u0000\u0000\u02f2\u02f3\u0006\u000f"+ - "\u0003\u0000\u02f3\u02f4\u0006\u000f\u0000\u0000\u02f4+\u0001\u0000\u0000"+ - "\u0000\u02f5\u02f6\u0005@\u0000\u0000\u02f6\u02f7\u0007\r\u0000\u0000"+ - "\u02f7\u02f8\u0007\u0006\u0000\u0000\u02f8\u02f9\u0007\r\u0000\u0000\u02f9"+ - "\u02fa\u0001\u0000\u0000\u0000\u02fa\u02fb\u0006\u0010\u0004\u0000\u02fb"+ - "-\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005@\u0000\u0000\u02fd\u02fe\u0007"+ - "\u0003\u0000\u0000\u02fe\u02ff\u0007\f\u0000\u0000\u02ff\u0300\u0007\u0011"+ - "\u0000\u0000\u0300\u0301\u0001\u0000\u0000\u0000\u0301\u0302\u0003N!\u0000"+ - "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0011\u0000\u0000"+ - "\u0304\u0305\u0006\u0011\u0001\u0000\u0305/\u0001\u0000\u0000\u0000\u0306"+ - "\u0307\u0005@\u0000\u0000\u0307\u0308\u0007\t\u0000\u0000\u0308\u0309"+ - "\u0007\u0007\u0000\u0000\u0309\u030a\u0007\u001a\u0000\u0000\u030a\u030b"+ - "\u0007\u0003\u0000\u0000\u030b\u030c\u0007\b\u0000\u0000\u030c\u030d\u0007"+ - "\u0007\u0000\u0000\u030d\u030e\u0007\u0002\u0000\u0000\u030e\u030f\u0007"+ - "\u0003\u0000\u0000\u030f\u0310\u0007\n\u0000\u0000\u0310\u0311\u0007\u000b"+ - "\u0000\u0000\u0311\u0312\u0007\u000f\u0000\u0000\u0312\u0313\u0007\t\u0000"+ - "\u0000\u0313\u0314\u0007\u0003\u0000\u0000\u0314\u034a\u0007\n\u0000\u0000"+ - "\u0315\u0316\u0005@\u0000\u0000\u0316\u0317\u0007\u0017\u0000\u0000\u0317"+ - "\u0318\u0007\u000e\u0000\u0000\u0318\u0319\u0007\u0018\u0000\u0000\u0319"+ - "\u031a\u0007\n\u0000\u0000\u031a\u031b\u0007\u000b\u0000\u0000\u031b\u031c"+ - "\u0007\u000f\u0000\u0000\u031c\u031d\u0007\t\u0000\u0000\u031d\u031e\u0007"+ - "\u0003\u0000\u0000\u031e\u034a\u0007\n\u0000\u0000\u031f\u0320\u0005@"+ - "\u0000\u0000\u0320\u0321\u0007\t\u0000\u0000\u0321\u0322\u0007\u0007\u0000"+ - "\u0000\u0322\u0323\u0007\u001a\u0000\u0000\u0323\u0324\u0007\u0003\u0000"+ - "\u0000\u0324\u0325\u0007\b\u0000\u0000\u0325\u0326\u0007\u0007\u0000\u0000"+ - "\u0326\u0327\u0007\u0002\u0000\u0000\u0327\u0328\u0007\u0003\u0000\u0000"+ - "\u0328\u0329\u0007\n\u0000\u0000\u0329\u032a\u0007\u0005\u0000\u0000\u032a"+ - "\u032b\u0007\u0002\u0000\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c"+ - "\u032d\u0007\r\u0000\u0000\u032d\u032e\u0007\u000b\u0000\u0000\u032e\u034a"+ - "\u0007\n\u0000\u0000\u032f\u0330\u0005@\u0000\u0000\u0330\u0331\u0007"+ - "\u0017\u0000\u0000\u0331\u0332\u0007\u000e\u0000\u0000\u0332\u0333\u0007"+ - "\u0018\u0000\u0000\u0333\u0334\u0007\n\u0000\u0000\u0334\u0335\u0007\u0005"+ - "\u0000\u0000\u0335\u0336\u0007\u0002\u0000\u0000\u0336\u0337\u0007\u0007"+ - "\u0000\u0000\u0337\u0338\u0007\r\u0000\u0000\u0338\u0339\u0007\u000b\u0000"+ - "\u0000\u0339\u034a\u0007\n\u0000\u0000\u033a\u033b\u0005@\u0000\u0000"+ - "\u033b\u033c\u0007\u0005\u0000\u0000\u033c\u033d\u0007\t\u0000\u0000\u033d"+ - "\u033e\u0007\u0007\u0000\u0000\u033e\u033f\u0007\u0005\u0000\u0000\u033f"+ - "\u0340\u0007\u0018\u0000\u0000\u0340\u0346\u0001\u0000\u0000\u0000\u0341"+ - "\u0342\u0005.\u0000\u0000\u0342\u0343\u0007\u0004\u0000\u0000\u0343\u0344"+ - "\u0007\b\u0000\u0000\u0344\u0345\u0007\u0004\u0000\u0000\u0345\u0347\u0007"+ - "\u000f\u0000\u0000\u0346\u0341\u0001\u0000\u0000\u0000\u0346\u0347\u0001"+ - "\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000\u0000\u0348\u034a\u0005"+ - "=\u0000\u0000\u0349\u0306\u0001\u0000\u0000\u0000\u0349\u0315\u0001\u0000"+ - "\u0000\u0000\u0349\u031f\u0001\u0000\u0000\u0000\u0349\u032f\u0001\u0000"+ - "\u0000\u0000\u0349\u033a\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000"+ - "\u0000\u0000\u034b\u034c\u0006\u0012\u0001\u0000\u034c1\u0001\u0000\u0000"+ - "\u0000\u034d\u034e\u0005@\u0000\u0000\u034e\u034f\u0007\u001a\u0000\u0000"+ - "\u034f\u0350\u0007\u0007\u0000\u0000\u0350\u0351\u0007\u000b\u0000\u0000"+ - "\u0351\u0352\u0007\u0003\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000"+ - "\u0353\u0354\u0006\u0013\u0000\u0000\u0354\u0355\u0006\u0013\u0001\u0000"+ - "\u03553\u0001\u0000\u0000\u0000\u0356\u0357\u0005@\u0000\u0000\u0357\u0358"+ - "\u0003N!\u0000\u0358\u0359\u0004\u0014\u0002\u0000\u0359\u035a\u0001\u0000"+ - "\u0000\u0000\u035a\u035b\u0006\u0014\u0000\u0000\u035b5\u0001\u0000\u0000"+ - "\u0000\u035c\u035d\u0005@\u0000\u0000\u035d\u035e\u0003N!\u0000\u035e"+ - "7\u0001\u0000\u0000\u0000\u035f\u0361\u0005@\u0000\u0000\u0360\u0362\u0007"+ - "\u001c\u0000\u0000\u0361\u0360\u0001\u0000\u0000\u0000\u0361\u0362\u0001"+ - "\u0000\u0000\u0000\u03629\u0001\u0000\u0000\u0000\u0363\u0364\u0005{\u0000"+ - "\u0000\u0364\u0365\u0005{\u0000\u0000\u0365\u0366\u0001\u0000\u0000\u0000"+ - "\u0366\u0367\u0006\u0017\u0005\u0000\u0367\u0368\u0006\u0017\u0006\u0000"+ - "\u0368;\u0001\u0000\u0000\u0000\u0369\u036a\u0005{\u0000\u0000\u036a\u036b"+ - "\u0005!\u0000\u0000\u036b\u036c\u0005!\u0000\u0000\u036c\u036d\u0001\u0000"+ - "\u0000\u0000\u036d\u036e\u0006\u0018\u0007\u0000\u036e\u036f\u0006\u0018"+ - "\b\u0000\u036f=\u0001\u0000\u0000\u0000\u0370\u0371\u0005/\u0000\u0000"+ - "\u0371\u0372\u0005*\u0000\u0000\u0372\u0376\u0001\u0000\u0000\u0000\u0373"+ - "\u0375\t\u0000\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375\u0378"+ - "\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0376\u0374"+ - "\u0001\u0000\u0000\u0000\u0377\u0379\u0001\u0000\u0000\u0000\u0378\u0376"+ - "\u0001\u0000\u0000\u0000\u0379\u037a\u0005*\u0000\u0000\u037a\u037e\u0005"+ - "/\u0000\u0000\u037b\u037c\u0005/\u0000\u0000\u037c\u037e\u0005/\u0000"+ - "\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000"+ - "\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u0380\u0006\u0019\t\u0000"+ - "\u0380?\u0001\u0000\u0000\u0000\u0381\u0382\u0005<\u0000\u0000\u0382\u0383"+ - "\u0007\u0016\u0000\u0000\u0383\u0384\u0005-\u0000\u0000\u0384\u0385\u0001"+ - "\u0000\u0000\u0000\u0385\u0391\u0003\u0014\u0004\u0000\u0386\u0387\u0005"+ - "<\u0000\u0000\u0387\u038c\u0003\u0014\u0004\u0000\u0388\u0389\u0005:\u0000"+ - "\u0000\u0389\u038a\u0005:\u0000\u0000\u038a\u038b\u0001\u0000\u0000\u0000"+ - "\u038b\u038d\u0003\u0014\u0004\u0000\u038c\u0388\u0001\u0000\u0000\u0000"+ - "\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000\u0000\u0000"+ - "\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0391\u0001\u0000\u0000\u0000"+ - "\u0390\u0381\u0001\u0000\u0000\u0000\u0390\u0386\u0001\u0000\u0000\u0000"+ - "\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0006\u001a\t\u0000\u0393"+ - "\u0394\u0006\u001a\n\u0000\u0394A\u0001\u0000\u0000\u0000\u0395\u0396"+ - "\u0005<\u0000\u0000\u0396\u0397\u0005/\u0000\u0000\u0397\u0398\u0001\u0000"+ - "\u0000\u0000\u0398\u0399\u0003R#\u0000\u0399\u039d\u0005>\u0000\u0000"+ - "\u039a\u039c\u0007\u001d\u0000\u0000\u039b\u039a\u0001\u0000\u0000\u0000"+ - "\u039c\u039f\u0001\u0000\u0000\u0000\u039d\u039b\u0001\u0000\u0000\u0000"+ - "\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a1\u0001\u0000\u0000\u0000"+ - "\u039f\u039d\u0001\u0000\u0000\u0000\u03a0\u0395\u0001\u0000\u0000\u0000"+ - "\u03a1\u03a2\u0001\u0000\u0000\u0000\u03a2\u03a0\u0001\u0000\u0000\u0000"+ - "\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000"+ - "\u03a4\u03a5\u0006\u001b\t\u0000\u03a5C\u0001\u0000\u0000\u0000\u03a6"+ - "\u03a8\u0005 \u0000\u0000\u03a7\u03a6\u0001\u0000\u0000\u0000\u03a8\u03a9"+ - "\u0001\u0000\u0000\u0000\u03a9\u03a7\u0001\u0000\u0000\u0000\u03a9\u03aa"+ - "\u0001\u0000\u0000\u0000\u03aa\u03c0\u0001\u0000\u0000\u0000\u03ab\u03ad"+ - "\u0007\u001e\u0000\u0000\u03ac\u03ab\u0001\u0000\u0000\u0000\u03ad\u03ae"+ - "\u0001\u0000\u0000\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000\u03ae\u03af"+ - "\u0001\u0000\u0000\u0000\u03af\u03c0\u0001\u0000\u0000\u0000\u03b0\u03c0"+ - "\u0003\u0014\u0004\u0000\u03b1\u03c0\u0003\u0016\u0005\u0000\u03b2\u03b3"+ - "\u0005\"\u0000\u0000\u03b3\u03c0\u0004\u001c\u0003\u0000\u03b4\u03b5\u0005"+ - "\\\u0000\u0000\u03b5\u03b6\u0005\'\u0000\u0000\u03b6\u03b7\u0001\u0000"+ - "\u0000\u0000\u03b7\u03c0\u0004\u001c\u0004\u0000\u03b8\u03c0\u0007\u001f"+ - "\u0000\u0000\u03b9\u03bb\u0007 \u0000\u0000\u03ba\u03b9\u0001\u0000\u0000"+ - "\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03ba\u0001\u0000\u0000"+ - "\u0000\u03bc\u03bd\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ - "\u0000\u03be\u03c0\u0007!\u0000\u0000\u03bf\u03a7\u0001\u0000\u0000\u0000"+ - "\u03bf\u03ac\u0001\u0000\u0000\u0000\u03bf\u03b0\u0001\u0000\u0000\u0000"+ - "\u03bf\u03b1\u0001\u0000\u0000\u0000\u03bf\u03b2\u0001\u0000\u0000\u0000"+ - "\u03bf\u03b4\u0001\u0000\u0000\u0000\u03bf\u03b8\u0001\u0000\u0000\u0000"+ - "\u03bf\u03ba\u0001\u0000\u0000\u0000\u03bf\u03be\u0001\u0000\u0000\u0000"+ - "\u03c0\u03c3\u0001\u0000\u0000\u0000\u03c1\u03bf\u0001\u0000\u0000\u0000"+ - "\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2\u03c4\u0001\u0000\u0000\u0000"+ - "\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005<\u0000\u0000\u03c5"+ - "\u03c6\u0004\u001c\u0005\u0000\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7"+ - "\u03c8\u0006\u001c\u000b\u0000\u03c8\u03c9\u0006\u001c\f\u0000\u03c9E"+ - "\u0001\u0000\u0000\u0000\u03ca\u03cc\u0005 \u0000\u0000\u03cb\u03ca\u0001"+ - "\u0000\u0000\u0000\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u03cb\u0001"+ - "\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03e6\u0001"+ - "\u0000\u0000\u0000\u03cf\u03d1\u0007\u001e\u0000\u0000\u03d0\u03cf\u0001"+ - "\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000\u0000\u0000\u03d2\u03d0\u0001"+ - "\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u03e6\u0001"+ - "\u0000\u0000\u0000\u03d4\u03d6\u0007\"\u0000\u0000\u03d5\u03d4\u0001\u0000"+ - "\u0000\u0000\u03d5\u03d6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0001\u0000"+ - "\u0000\u0000\u03d7\u03e6\u0003\u0014\u0004\u0000\u03d8\u03e6\u0003\u0016"+ - "\u0005\u0000\u03d9\u03da\u0005\"\u0000\u0000\u03da\u03e6\u0004\u001d\u0006"+ - "\u0000\u03db\u03e6\u0005,\u0000\u0000\u03dc\u03dd\u0005\\\u0000\u0000"+ - "\u03dd\u03e6\u0005\'\u0000\u0000\u03de\u03e6\u0007#\u0000\u0000\u03df"+ - "\u03e1\u0007 \u0000\u0000\u03e0\u03df\u0001\u0000\u0000\u0000\u03e1\u03e2"+ - "\u0001\u0000\u0000\u0000\u03e2\u03e0\u0001\u0000\u0000\u0000\u03e2\u03e3"+ - "\u0001\u0000\u0000\u0000\u03e3\u03e6\u0001\u0000\u0000\u0000\u03e4\u03e6"+ - "\u0007!\u0000\u0000\u03e5\u03cb\u0001\u0000\u0000\u0000\u03e5\u03d0\u0001"+ - "\u0000\u0000\u0000\u03e5\u03d5\u0001\u0000\u0000\u0000\u03e5\u03d8\u0001"+ - "\u0000\u0000\u0000\u03e5\u03d9\u0001\u0000\u0000\u0000\u03e5\u03db\u0001"+ - "\u0000\u0000\u0000\u03e5\u03dc\u0001\u0000\u0000\u0000\u03e5\u03de\u0001"+ - "\u0000\u0000\u0000\u03e5\u03e0\u0001\u0000\u0000\u0000\u03e5\u03e4\u0001"+ - "\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e5\u0001"+ - "\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03e9\u0001"+ - "\u0000\u0000\u0000\u03e9\u03ea\u0006\u001d\t\u0000\u03eaG\u0001\u0000"+ - "\u0000\u0000\u03eb\u03ed\u0005 \u0000\u0000\u03ec\u03eb\u0001\u0000\u0000"+ - "\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee\u03ec\u0001\u0000\u0000"+ - "\u0000\u03ee\u03ef\u0001\u0000\u0000\u0000\u03ef\u03f6\u0001\u0000\u0000"+ - "\u0000\u03f0\u03f2\u0007\u001e\u0000\u0000\u03f1\u03f0\u0001\u0000\u0000"+ - "\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000\u0000"+ - "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f6\u0001\u0000\u0000"+ - "\u0000\u03f5\u03ec\u0001\u0000\u0000\u0000\u03f5\u03f1\u0001\u0000\u0000"+ - "\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006\u001e\t\u0000"+ - "\u03f8I\u0001\u0000\u0000\u0000\u03f9\u03fa\u0005{\u0000\u0000\u03fa\u03ff"+ - "\u0005!\u0000\u0000\u03fb\u03fc\u0005{\u0000\u0000\u03fc\u03fd\u0005{"+ - "\u0000\u0000\u03fd\u03ff\u0005-\u0000\u0000\u03fe\u03f9\u0001\u0000\u0000"+ - "\u0000\u03fe\u03fb\u0001\u0000\u0000\u0000\u03ff\u0400\u0001\u0000\u0000"+ - "\u0000\u0400\u0401\u0006\u001f\t\u0000\u0401K\u0001\u0000\u0000\u0000"+ - "\u0402\u0403\t\u0000\u0000\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404"+ - "\u0405\u0006 \t\u0000\u0405M\u0001\u0000\u0000\u0000\u0406\u040a\u0007"+ - "\u0014\u0000\u0000\u0407\u0409\u0007$\u0000\u0000\u0408\u0407\u0001\u0000"+ - "\u0000\u0000\u0409\u040c\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000"+ - "\u0000\u0000\u040a\u040b\u0001\u0000\u0000\u0000\u040bO\u0001\u0000\u0000"+ - "\u0000\u040c\u040a\u0001\u0000\u0000\u0000\u040d\u0411\u0007%\u0000\u0000"+ - "\u040e\u0410\u0007&\u0000\u0000\u040f\u040e\u0001\u0000\u0000\u0000\u0410"+ - "\u0413\u0001\u0000\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0411"+ - "\u0412\u0001\u0000\u0000\u0000\u0412Q\u0001\u0000\u0000\u0000\u0413\u0411"+ - "\u0001\u0000\u0000\u0000\u0414\u0418\u0007\u0014\u0000\u0000\u0415\u0417"+ - "\u0007\'\u0000\u0000\u0416\u0415\u0001\u0000\u0000\u0000\u0417\u041a\u0001"+ - "\u0000\u0000\u0000\u0418\u0416\u0001\u0000\u0000\u0000\u0418\u0419\u0001"+ - "\u0000\u0000\u0000\u0419S\u0001\u0000\u0000\u0000\u041a\u0418\u0001\u0000"+ - "\u0000\u0000\u041b\u041c\u0007(\u0000\u0000\u041cU\u0001\u0000\u0000\u0000"+ - "\u041d\u0422\u0005\"\u0000\u0000\u041e\u0421\u0003T$\u0000\u041f\u0421"+ - "\t\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u041f\u0001"+ - "\u0000\u0000\u0000\u0421\u0424\u0001\u0000\u0000\u0000\u0422\u0423\u0001"+ - "\u0000\u0000\u0000\u0422\u0420\u0001\u0000\u0000\u0000\u0423\u0425\u0001"+ - "\u0000\u0000\u0000\u0424\u0422\u0001\u0000\u0000\u0000\u0425\u0426\u0005"+ - "\"\u0000\u0000\u0426W\u0001\u0000\u0000\u0000\u0427\u042d\u0005\'\u0000"+ - "\u0000\u0428\u042c\b)\u0000\u0000\u0429\u042a\u0005\\\u0000\u0000\u042a"+ - "\u042c\t\u0000\u0000\u0000\u042b\u0428\u0001\u0000\u0000\u0000\u042b\u0429"+ - "\u0001\u0000\u0000\u0000\u042c\u042f\u0001\u0000\u0000\u0000\u042d\u042b"+ - "\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u0430"+ - "\u0001\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u0430\u0431"+ - "\u0005\'\u0000\u0000\u0431Y\u0001\u0000\u0000\u0000\u0432\u0433\u0005"+ - "/\u0000\u0000\u0433\u0434\u0005/\u0000\u0000\u0434\u0438\u0001\u0000\u0000"+ - "\u0000\u0435\u0437\b\u001e\u0000\u0000\u0436\u0435\u0001\u0000\u0000\u0000"+ - "\u0437\u043a\u0001\u0000\u0000\u0000\u0438\u0436\u0001\u0000\u0000\u0000"+ - "\u0438\u0439\u0001\u0000\u0000\u0000\u0439[\u0001\u0000\u0000\u0000\u043a"+ - "\u0438\u0001\u0000\u0000\u0000\u043b\u043c\u0005$\u0000\u0000\u043c\u043d"+ - "\u0003N!\u0000\u043d]\u0001\u0000\u0000\u0000\u043e\u043f\u0007\u0004"+ - "\u0000\u0000\u043f\u0440\u0007\u0002\u0000\u0000\u0440\u0441\u0007\u0002"+ - "\u0000\u0000\u0441\u0442\u0007\u0004\u0000\u0000\u0442\u0451\u0007\u000f"+ - "\u0000\u0000\u0443\u0444\u0007\u0005\u0000\u0000\u0444\u0445\u0007\t\u0000"+ - "\u0000\u0445\u0446\u0007\u0004\u0000\u0000\u0446\u0447\u0007\n\u0000\u0000"+ - "\u0447\u0451\u0007\n\u0000\u0000\u0448\u0449\u0007\u0003\u0000\u0000\u0449"+ - "\u044a\u0007\u0012\u0000\u0000\u044a\u044b\u0007\r\u0000\u0000\u044b\u044c"+ - "\u0007\u000b\u0000\u0000\u044c\u0451\u0007\u000f\u0000\u0000\u044d\u044e"+ - "\u0007\u000e\u0000\u0000\u044e\u044f\u0007\n\u0000\u0000\u044f\u0451\u0007"+ - "\u0003\u0000\u0000\u0450\u043e\u0001\u0000\u0000\u0000\u0450\u0443\u0001"+ - "\u0000\u0000\u0000\u0450\u0448\u0001\u0000\u0000\u0000\u0450\u044d\u0001"+ - "\u0000\u0000\u0000\u0451_\u0001\u0000\u0000\u0000\u0452\u0453\u000209"+ - "\u0000\u0453a\u0001\u0000\u0000\u0000\u0454\u0455\u0005{\u0000\u0000\u0455"+ - "\u0456\u0005{\u0000\u0000\u0456\u0457\u0005-\u0000\u0000\u0457\u0458\u0005"+ - "-\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006+\r"+ - "\u0000\u045ac\u0001\u0000\u0000\u0000\u045b\u045c\u0005@\u0000\u0000\u045c"+ - "\u045d\u0003R#\u0000\u045d\u045e\u0005.\u0000\u0000\u045e\u045f\u0001"+ - "\u0000\u0000\u0000\u045f\u0460\u0006,\t\u0000\u0460e\u0001\u0000\u0000"+ - "\u0000\u0461\u0466\u0005@\u0000\u0000\u0462\u0464\u0003`*\u0000\u0463"+ - "\u0465\u0005.\u0000\u0000\u0464\u0463\u0001\u0000\u0000\u0000\u0464\u0465"+ - "\u0001\u0000\u0000\u0000\u0465\u0467\u0001\u0000\u0000\u0000\u0466\u0462"+ - "\u0001\u0000\u0000\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0466"+ - "\u0001\u0000\u0000\u0000\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a"+ - "\u0001\u0000\u0000\u0000\u046a\u046b\u0006-\t\u0000\u046bg\u0001\u0000"+ - "\u0000\u0000\u046c\u046d\u0005{\u0000\u0000\u046d\u046e\u0005{\u0000\u0000"+ - "\u046e\u0558\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ - "\u0005@\u0000\u0000\u0471\u0473\u0001\u0000\u0000\u0000\u0472\u0474\u0005"+ - "@\u0000\u0000\u0473\u0472\u0001\u0000\u0000\u0000\u0473\u0474\u0001\u0000"+ - "\u0000\u0000\u0474\u0558\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ - "\u0000\u0476\u0477\u0005{\u0000\u0000\u0477\u0479\u0001\u0000\u0000\u0000"+ - "\u0478\u047a\u0005{\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u0479"+ - "\u047a\u0001\u0000\u0000\u0000\u047a\u0558\u0001\u0000\u0000\u0000\u047b"+ - "\u047c\u0005@\u0000\u0000\u047c\u047d\u0007\u0012\u0000\u0000\u047d\u047e"+ - "\u0007\u0003\u0000\u0000\u047e\u047f\u0007\u0011\u0000\u0000\u047f\u0480"+ - "\u0007\u0007\u0000\u0000\u0480\u0481\u0007\u0004\u0000\u0000\u0481\u0485"+ - "\u0001\u0000\u0000\u0000\u0482\u0484\u0007*\u0000\u0000\u0483\u0482\u0001"+ - "\u0000\u0000\u0000\u0484\u0487\u0001\u0000\u0000\u0000\u0485\u0483\u0001"+ - "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0489\u0001"+ - "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0488\u048a\u0005"+ - "(\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u0489\u048a\u0001\u0000"+ - "\u0000\u0000\u048a\u0558\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ - "\u0000\u048c\u048d\u0007\u0005\u0000\u0000\u048d\u048e\u0007\u0006\u0000"+ - "\u0000\u048e\u048f\u0007\u0004\u0000\u0000\u048f\u0490\u0007\u0002\u0000"+ - "\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u0003\u0000\u0000"+ - "\u0492\u0550\u0007\u000b\u0000\u0000\u0493\u0494\u0005@\u0000\u0000\u0494"+ - "\u0495\u0007\u0007\u0000\u0000\u0495\u0496\u0007\u0012\u0000\u0000\u0496"+ - "\u0497\u0007\r\u0000\u0000\u0497\u0498\u0007\u0001\u0000\u0000\u0498\u0499"+ - "\u0007\u0002\u0000\u0000\u0499\u0550\u0007\u000b\u0000\u0000\u049a\u049b"+ - "\u0005@\u0000\u0000\u049b\u049c\u0007\f\u0000\u0000\u049c\u049d\u0007"+ - "\u0004\u0000\u0000\u049d\u049e\u0007\u0012\u0000\u0000\u049e\u049f\u0007"+ - "\u0003\u0000\u0000\u049f\u04a0\u0007\n\u0000\u0000\u04a0\u04a1\u0007\r"+ - "\u0000\u0000\u04a1\u04a2\u0007\u0004\u0000\u0000\u04a2\u04a3\u0007\u0005"+ - "\u0000\u0000\u04a3\u0550\u0007\u0003\u0000\u0000\u04a4\u04a5\u0005@\u0000"+ - "\u0000\u04a5\u04a6\u0007\u0011\u0000\u0000\u04a6\u04a7\u0007\u0001\u0000"+ - "\u0000\u04a7\u04a8\u0007\u0005\u0000\u0000\u04a8\u04a9\u0007\u000e\u0000"+ - "\u0000\u04a9\u04aa\u0007\u0012\u0000\u0000\u04aa\u04ab\u0007\u0003\u0000"+ - "\u0000\u04ab\u04ac\u0007\f\u0000\u0000\u04ac\u0550\u0007\u000b\u0000\u0000"+ - "\u04ad\u04ae\u0005@\u0000\u0000\u04ae\u04af\u0007\u0000\u0000\u0000\u04af"+ - "\u04b0\u0007\u0001\u0000\u0000\u04b0\u04b1\u0007\f\u0000\u0000\u04b1\u04b2"+ - "\u0007\u000b\u0000\u0000\u04b2\u04b3\u0005-\u0000\u0000\u04b3\u04b4\u0007"+ - "\u0000\u0000\u0000\u04b4\u04b5\u0007\u0004\u0000\u0000\u04b5\u04b6\u0007"+ - "\u0005\u0000\u0000\u04b6\u0550\u0007\u0003\u0000\u0000\u04b7\u04b8\u0005"+ - "@\u0000\u0000\u04b8\u04b9\u0007\r\u0000\u0000\u04b9\u04ba\u0007\u0004"+ - "\u0000\u0000\u04ba\u04bb\u0007\u0010\u0000\u0000\u04bb\u0550\u0007\u0003"+ - "\u0000\u0000\u04bc\u04bd\u0005@\u0000\u0000\u04bd\u04be\u0007\t\u0000"+ - "\u0000\u04be\u04bf\u0007\u0004\u0000\u0000\u04bf\u04c0\u0007\u000f\u0000"+ - "\u0000\u04c0\u04c1\u0007\u0003\u0000\u0000\u04c1\u0550\u0007\u0002\u0000"+ - "\u0000\u04c2\u04c3\u0005@\u0000\u0000\u04c3\u04c4\u0007\n\u0000\u0000"+ - "\u04c4\u04c5\u0007\u000e\u0000\u0000\u04c5\u04c6\u0007\r\u0000\u0000\u04c6"+ - "\u04c7\u0007\r\u0000\u0000\u04c7\u04c8\u0007\u0001\u0000\u0000\u04c8\u04c9"+ - "\u0007\u0002\u0000\u0000\u04c9\u04ca\u0007\u000b\u0000\u0000\u04ca\u0550"+ - "\u0007\n\u0000\u0000\u04cb\u04cc\u0005@\u0000\u0000\u04cc\u04cd\u0007"+ - "\u000b\u0000\u0000\u04cd\u04ce\u0007\u0004\u0000\u0000\u04ce\u04cf\u0007"+ - "\u0007\u0000\u0000\u04cf\u04d0\u0007\t\u0000\u0000\u04d0\u04d1\u0007\b"+ - "\u0000\u0000\u04d1\u04d2\u0007\u0007\u0000\u0000\u04d2\u04d3\u0007\f\u0000"+ - "\u0000\u04d3\u0550\u0007\u0011\u0000\u0000\u04d4\u04d5\u0005@\u0000\u0000"+ - "\u04d5\u04d6\u0007\u0004\u0000\u0000\u04d6\u04d7\u0007\r\u0000\u0000\u04d7"+ - "\u04d8\u0007\r\u0000\u0000\u04d8\u04d9\u0007\t\u0000\u0000\u04d9\u0550"+ - "\u0007\u000f\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0005"+ - "-\u0000\u0000\u04dc\u04dd\u0007\b\u0000\u0000\u04dd\u04de\u0007\u0003"+ - "\u0000\u0000\u04de\u04df\u0007\u0017\u0000\u0000\u04df\u04e0\u0007\u0018"+ - "\u0000\u0000\u04e0\u04e1\u0007\u0007\u0000\u0000\u04e1\u04e2\u0007\u000b"+ - "\u0000\u0000\u04e2\u04e3\u0005-\u0000\u0000\u04e3\u04e4\u0007\u0018\u0000"+ - "\u0000\u04e4\u04e5\u0007\u0003\u0000\u0000\u04e5\u04e6\u0007\u000f\u0000"+ - "\u0000\u04e6\u04e7\u0007\u0000\u0000\u0000\u04e7\u04e8\u0007\u0002\u0000"+ - "\u0000\u04e8\u04e9\u0007\u0004\u0000\u0000\u04e9\u04ea\u0007\u0012\u0000"+ - "\u0000\u04ea\u04eb\u0007\u0003\u0000\u0000\u04eb\u0550\u0007\n\u0000\u0000"+ - "\u04ec\u04ed\u0005@\u0000\u0000\u04ed\u04ee\u0007\u0018\u0000\u0000\u04ee"+ - "\u04ef\u0007\u0003\u0000\u0000\u04ef\u04f0\u0007\u000f\u0000\u0000\u04f0"+ - "\u04f1\u0007\u0000\u0000\u0000\u04f1\u04f2\u0007\u0002\u0000\u0000\u04f2"+ - "\u04f3\u0007\u0004\u0000\u0000\u04f3\u04f4\u0007\u0012\u0000\u0000\u04f4"+ - "\u04f5\u0007\u0003\u0000\u0000\u04f5\u0550\u0007\n\u0000\u0000\u04f6\u04f7"+ - "\u0005@\u0000\u0000\u04f7\u04f8\u0007\u0005\u0000\u0000\u04f8\u04f9\u0007"+ - "\u0001\u0000\u0000\u04f9\u04fa\u0007\u000e\u0000\u0000\u04fa\u04fb\u0007"+ - "\f\u0000\u0000\u04fb\u04fc\u0007\u000b\u0000\u0000\u04fc\u04fd\u0007\u0003"+ - "\u0000\u0000\u04fd\u04fe\u0007\u0002\u0000\u0000\u04fe\u04ff\u0005-\u0000"+ - "\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501\u0007\u000b\u0000\u0000"+ - "\u0501\u0502\u0007\u000f\u0000\u0000\u0502\u0503\u0007\t\u0000\u0000\u0503"+ - "\u0550\u0007\u0003\u0000\u0000\u0504\u0505\u0005@\u0000\u0000\u0505\u0506"+ - "\u0007\u0000\u0000\u0000\u0506\u0507\u0007\u0001\u0000\u0000\u0507\u0508"+ - "\u0007\f\u0000\u0000\u0508\u0509\u0007\u000b\u0000\u0000\u0509\u050a\u0005"+ - "-\u0000\u0000\u050a\u050b\u0007\u0000\u0000\u0000\u050b\u050c\u0007\u0003"+ - "\u0000\u0000\u050c\u050d\u0007\u0004\u0000\u0000\u050d\u050e\u0007\u000b"+ - "\u0000\u0000\u050e\u050f\u0007\u000e\u0000\u0000\u050f\u0510\u0007\u0002"+ - "\u0000\u0000\u0510\u0511\u0007\u0003\u0000\u0000\u0511\u0512\u0005-\u0000"+ - "\u0000\u0512\u0513\u0007\u001a\u0000\u0000\u0513\u0514\u0007\u0004\u0000"+ - "\u0000\u0514\u0515\u0007\t\u0000\u0000\u0515\u0516\u0007\u000e\u0000\u0000"+ - "\u0516\u0517\u0007\u0003\u0000\u0000\u0517\u0550\u0007\n\u0000\u0000\u0518"+ - "\u0519\u0005@\u0000\u0000\u0519\u051a\u0007\r\u0000\u0000\u051a\u051b"+ - "\u0007\u0002\u0000\u0000\u051b\u051c\u0007\u0001\u0000\u0000\u051c\u051d"+ - "\u0007\r\u0000\u0000\u051d\u051e\u0007\u0003\u0000\u0000\u051e\u051f\u0007"+ - "\u0002\u0000\u0000\u051f\u0520\u0007\u000b\u0000\u0000\u0520\u0550\u0007"+ - "\u000f\u0000\u0000\u0521\u0522\u0005@\u0000\u0000\u0522\u0523\u0007\n"+ - "\u0000\u0000\u0523\u0524\u0007\u0005\u0000\u0000\u0524\u0525\u0007\u0001"+ - "\u0000\u0000\u0525\u0526\u0007\r\u0000\u0000\u0526\u0550\u0007\u0003\u0000"+ - "\u0000\u0527\u0528\u0005@\u0000\u0000\u0528\u0529\u0007\n\u0000\u0000"+ - "\u0529\u052a\u0007\u000b\u0000\u0000\u052a\u052b\u0007\u0004\u0000\u0000"+ - "\u052b\u052c\u0007\u0002\u0000\u0000\u052c\u052d\u0007\u000b\u0000\u0000"+ - "\u052d\u052e\u0007\u0007\u0000\u0000\u052e\u052f\u0007\f\u0000\u0000\u052f"+ - "\u0530\u0007\u0010\u0000\u0000\u0530\u0531\u0005-\u0000\u0000\u0531\u0532"+ - "\u0007\n\u0000\u0000\u0532\u0533\u0007\u000b\u0000\u0000\u0533\u0534\u0007"+ - "\u000f\u0000\u0000\u0534\u0535\u0007\t\u0000\u0000\u0535\u0550\u0007\u0003"+ - "\u0000\u0000\u0536\u0537\u0005@\u0000\u0000\u0537\u0538\u0007\n\u0000"+ - "\u0000\u0538\u0539\u0007\u000e\u0000\u0000\u0539\u053a\u0007\r\u0000\u0000"+ - "\u053a\u053b\u0007\r\u0000\u0000\u053b\u053c\u0007\u0001\u0000\u0000\u053c"+ - "\u053d\u0007\u0002\u0000\u0000\u053d\u053e\u0007\u000b\u0000\u0000\u053e"+ - "\u0550\u0007\n\u0000\u0000\u053f\u0540\u0005@\u0000\u0000\u0540\u0541"+ - "\u0007\u001a\u0000\u0000\u0541\u0542\u0007\u0007\u0000\u0000\u0542\u0543"+ - "\u0007\u0003\u0000\u0000\u0543\u0544\u0007\b\u0000\u0000\u0544\u0545\u0005"+ - "-\u0000\u0000\u0545\u0546\u0007\u000b\u0000\u0000\u0546\u0547\u0007\u0002"+ - "\u0000\u0000\u0547\u0548\u0007\u0004\u0000\u0000\u0548\u0549\u0007\f\u0000"+ - "\u0000\u0549\u054a\u0007\n\u0000\u0000\u054a\u054b\u0007\u0007\u0000\u0000"+ - "\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d\u0007\u0007\u0000\u0000"+ - "\u054d\u054e\u0007\u0001\u0000\u0000\u054e\u0550\u0007\f\u0000\u0000\u054f"+ - "\u048b\u0001\u0000\u0000\u0000\u054f\u0493\u0001\u0000\u0000\u0000\u054f"+ - "\u049a\u0001\u0000\u0000\u0000\u054f\u04a4\u0001\u0000\u0000\u0000\u054f"+ - "\u04ad\u0001\u0000\u0000\u0000\u054f\u04b7\u0001\u0000\u0000\u0000\u054f"+ - "\u04bc\u0001\u0000\u0000\u0000\u054f\u04c2\u0001\u0000\u0000\u0000\u054f"+ - "\u04cb\u0001\u0000\u0000\u0000\u054f\u04d4\u0001\u0000\u0000\u0000\u054f"+ - "\u04da\u0001\u0000\u0000\u0000\u054f\u04ec\u0001\u0000\u0000\u0000\u054f"+ - "\u04f6\u0001\u0000\u0000\u0000\u054f\u0504\u0001\u0000\u0000\u0000\u054f"+ - "\u0518\u0001\u0000\u0000\u0000\u054f\u0521\u0001\u0000\u0000\u0000\u054f"+ - "\u0527\u0001\u0000\u0000\u0000\u054f\u0536\u0001\u0000\u0000\u0000\u054f"+ - "\u053f\u0001\u0000\u0000\u0000\u0550\u0554\u0001\u0000\u0000\u0000\u0551"+ - "\u0553\u0007*\u0000\u0000\u0552\u0551\u0001\u0000\u0000\u0000\u0553\u0556"+ - "\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000\u0000\u0000\u0554\u0555"+ - "\u0001\u0000\u0000\u0000\u0555\u0558\u0001\u0000\u0000\u0000\u0556\u0554"+ - "\u0001\u0000\u0000\u0000\u0557\u046c\u0001\u0000\u0000\u0000\u0557\u046f"+ - "\u0001\u0000\u0000\u0000\u0557\u0475\u0001\u0000\u0000\u0000\u0557\u047b"+ - "\u0001\u0000\u0000\u0000\u0557\u054f\u0001\u0000\u0000\u0000\u0558\u0559"+ - "\u0001\u0000\u0000\u0000\u0559\u055a\u0006.\t\u0000\u055ai\u0001\u0000"+ - "\u0000\u0000\u055b\u055c\t\u0000\u0000\u0000\u055c\u055d\u0004/\u0007"+ - "\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0006/\u000e\u0000"+ - "\u055f\u0560\u0006/\u000f\u0000\u0560k\u0001\u0000\u0000\u0000\u0561\u0562"+ - "\t\u0000\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0564\u0006"+ - "0\f\u0000\u0564m\u0001\u0000\u0000\u0000\u0565\u0566\u0005\u0000\u0000"+ - "\u0001\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568\u00061\u000e\u0000"+ - "\u0568\u0569\u00061\u000f\u0000\u0569o\u0001\u0000\u0000\u0000\u056a\u056b"+ - "\u0005}\u0000\u0000\u056b\u056c\u0005}\u0000\u0000\u056c\u056d\u0001\u0000"+ - "\u0000\u0000\u056d\u056e\u00062\u000f\u0000\u056e\u056f\u00062\u0006\u0000"+ - "\u056fq\u0001\u0000\u0000\u0000\u0570\u0571\u0003\f\u0000\u0000\u0571"+ - "\u0572\u00063\u0010\u0000\u0572s\u0001\u0000\u0000\u0000\u0573\u0576\u0003"+ - "X&\u0000\u0574\u0576\u0003\u0012\u0003\u0000\u0575\u0573\u0001\u0000\u0000"+ - "\u0000\u0575\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000"+ - "\u0000\u0577\u0578\u00064\u0011\u0000\u0578u\u0001\u0000\u0000\u0000\u0579"+ - "\u057a\u0005:\u0000\u0000\u057a\u057d\u0005)\u0000\u0000\u057b\u057d\u0005"+ - ":\u0000\u0000\u057c\u0579\u0001\u0000\u0000\u0000\u057c\u057b\u0001\u0000"+ - "\u0000\u0000\u057d\u057e\u0001\u0000\u0000\u0000\u057e\u057f\u00065\u0012"+ - "\u0000\u057fw\u0001\u0000\u0000\u0000\u0580\u0582\b+\u0000\u0000\u0581"+ - "\u0580\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000\u0000\u0000\u0583"+ - "\u0581\u0001\u0000\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584"+ - "\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u00066\u0013\u0000\u0586y\u0001"+ - "\u0000\u0000\u0000\u0587\u058b\t\u0000\u0000\u0000\u0588\u058a\u0007*"+ - "\u0000\u0000\u0589\u0588\u0001\u0000\u0000\u0000\u058a\u058d\u0001\u0000"+ - "\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058b\u058c\u0001\u0000"+ - "\u0000\u0000\u058c\u058e\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000"+ - "\u0000\u0000\u058e\u058f\u00067\u0014\u0000\u058f{\u0001\u0000\u0000\u0000"+ - "\u0590\u0591\u0005\u0000\u0000\u0001\u0591\u0592\u0001\u0000\u0000\u0000"+ - "\u0592\u0593\u00068\u0015\u0000\u0593\u0594\u00068\u000f\u0000\u0594}"+ - "\u0001\u0000\u0000\u0000\u0595\u0596\u0005!\u0000\u0000\u0596\u0597\u0005"+ - "!\u0000\u0000\u0597\u0598\u0005}\u0000\u0000\u0598\u0599\u0001\u0000\u0000"+ - "\u0000\u0599\u059a\u00069\u000f\u0000\u059a\u059b\u00069\b\u0000\u059b"+ - "\u007f\u0001\u0000\u0000\u0000\u059c\u059d\u0003\f\u0000\u0000\u059d\u059e"+ - "\u0006:\u0016\u0000\u059e\u0081\u0001\u0000\u0000\u0000\u059f\u05a2\u0003"+ - "X&\u0000\u05a0\u05a2\u0003\u0012\u0003\u0000\u05a1\u059f\u0001\u0000\u0000"+ - "\u0000\u05a1\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ - "\u0000\u05a3\u05a4\u0006;\u0017\u0000\u05a4\u0083\u0001\u0000\u0000\u0000"+ - "\u05a5\u05a6\u0005:\u0000\u0000\u05a6\u05a9\u0005)\u0000\u0000\u05a7\u05a9"+ - "\u0005:\u0000\u0000\u05a8\u05a5\u0001\u0000\u0000\u0000\u05a8\u05a7\u0001"+ - "\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05ab\u0006"+ - "<\u0012\u0000\u05ab\u0085\u0001\u0000\u0000\u0000\u05ac\u05ae\b,\u0000"+ - "\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ae\u05af\u0001\u0000\u0000"+ - "\u0000\u05af\u05ad\u0001\u0000\u0000\u0000\u05af\u05b0\u0001\u0000\u0000"+ - "\u0000\u05b0\u05b1\u0001\u0000\u0000\u0000\u05b1\u05b2\u0006=\u0018\u0000"+ - "\u05b2\u0087\u0001\u0000\u0000\u0000\u05b3\u05b7\t\u0000\u0000\u0000\u05b4"+ - "\u05b6\u0007*\u0000\u0000\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b9"+ - "\u0001\u0000\u0000\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8"+ - "\u0001\u0000\u0000\u0000\u05b8\u05ba\u0001\u0000\u0000\u0000\u05b9\u05b7"+ - "\u0001\u0000\u0000\u0000\u05ba\u05bb\u0006>\u0019\u0000\u05bb\u0089\u0001"+ - "\u0000\u0000\u0000\u05bc\u05bd\u0005\u0000\u0000\u0001\u05bd\u05be\u0001"+ - "\u0000\u0000\u0000\u05be\u05bf\u0006?\u0015\u0000\u05bf\u05c0\u0006?\u000f"+ - "\u0000\u05c0\u008b\u0001\u0000\u0000\u0000\u05c1\u05c3\u0007*\u0000\u0000"+ - "\u05c2\u05c1\u0001\u0000\u0000\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000"+ - "\u05c4\u05c2\u0001\u0000\u0000\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000"+ - "\u05c5\u05c6\u0001\u0000\u0000\u0000\u05c6\u05c7\u0004@\b\u0000\u05c7"+ - "\u05c8\u0001\u0000\u0000\u0000\u05c8\u05c9\u0006@\u001a\u0000\u05c9\u008d"+ - "\u0001\u0000\u0000\u0000\u05ca\u05cb\u0005(\u0000\u0000\u05cb\u05cc\u0006"+ - "A\u001b\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cd\u05ce\u0006A\f"+ - "\u0000\u05ce\u05cf\u0006A\u001a\u0000\u05cf\u008f\u0001\u0000\u0000\u0000"+ - "\u05d0\u05d1\u0003N!\u0000\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3"+ - "\u0006B\u0015\u0000\u05d3\u05d4\u0006B\u000f\u0000\u05d4\u0091\u0001\u0000"+ - "\u0000\u0000\u05d5\u05d6\t\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000"+ - "\u0000\u05d7\u05d8\u0006C\u0015\u0000\u05d8\u05d9\u0006C\u000f\u0000\u05d9"+ - "\u0093\u0001\u0000\u0000\u0000\u05da\u05db\u0004D\t\u0000\u05db\u05dc"+ - "\u0005(\u0000\u0000\u05dc\u05dd\u0006D\u001c\u0000\u05dd\u05de\u0006D"+ - "\u001d\u0000\u05de\u0095\u0001\u0000\u0000\u0000\u05df\u05e0\u0004E\n"+ - "\u0000\u05e0\u05e1\u0005)\u0000\u0000\u05e1\u05e2\u0006E\u001e\u0000\u05e2"+ - "\u05e3\u0001\u0000\u0000\u0000\u05e3\u05e4\u0006E\u001f\u0000\u05e4\u05e5"+ - "\u0006E \u0000\u05e5\u0097\u0001\u0000\u0000\u0000\u05e6\u05e7\u0004F"+ - "\u000b\u0000\u05e7\u05e8\u0005(\u0000\u0000\u05e8\u05e9\u0006F!\u0000"+ - "\u05e9\u05ea\u0006F\"\u0000\u05ea\u0099\u0001\u0000\u0000\u0000\u05eb"+ - "\u05ec\u0004G\f\u0000\u05ec\u05ed\u0005)\u0000\u0000\u05ed\u05ee\u0006"+ - "G#\u0000\u05ee\u05ef\u0006G$\u0000\u05ef\u009b\u0001\u0000\u0000\u0000"+ - "\u05f0\u05f1\u0005)\u0000\u0000\u05f1\u05f2\u0004H\r\u0000\u05f2\u05f3"+ - "\u0001\u0000\u0000\u0000\u05f3\u05f4\u0006H\u001f\u0000\u05f4\u05f5\u0006"+ - "H \u0000\u05f5\u009d\u0001\u0000\u0000\u0000\u05f6\u05f7\u0005\"\u0000"+ - "\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8\u05f9\u0006I\f\u0000"+ - "\u05f9\u05fa\u0006I%\u0000\u05fa\u009f\u0001\u0000\u0000\u0000\u05fb\u05fc"+ - "\u0005?\u0000\u0000\u05fc\u05fd\u0005:\u0000\u0000\u05fd\u05fe\u0001\u0000"+ - "\u0000\u0000\u05fe\u05ff\u0006J&\u0000\u05ff\u00a1\u0001\u0000\u0000\u0000"+ - "\u0600\u0601\u0005:\u0000\u0000\u0601\u0602\u0005:\u0000\u0000\u0602\u0603"+ - "\u0001\u0000\u0000\u0000\u0603\u0604\u0006K\'\u0000\u0604\u00a3\u0001"+ - "\u0000\u0000\u0000\u0605\u0609\u0003X&\u0000\u0606\u0608\u0005 \u0000"+ - "\u0000\u0607\u0606\u0001\u0000\u0000\u0000\u0608\u060b\u0001\u0000\u0000"+ - "\u0000\u0609\u0607\u0001\u0000\u0000\u0000\u0609\u060a\u0001\u0000\u0000"+ - "\u0000\u060a\u060c\u0001\u0000\u0000\u0000\u060b\u0609\u0001\u0000\u0000"+ - "\u0000\u060c\u060d\u0006L(\u0000\u060d\u00a5\u0001\u0000\u0000\u0000\u060e"+ - "\u060f\u0005:\u0000\u0000\u060f\u0610\u0004M\u000e\u0000\u0610\u0611\u0001"+ - "\u0000\u0000\u0000\u0611\u0612\u0006M\u0012\u0000\u0612\u00a7\u0001\u0000"+ - "\u0000\u0000\u0613\u0614\u0005:\u0000\u0000\u0614\u0615\u0001\u0000\u0000"+ - "\u0000\u0615\u0616\u0006N\u0012\u0000\u0616\u00a9\u0001\u0000\u0000\u0000"+ - "\u0617\u0618\u0005/\u0000\u0000\u0618\u0619\u0005*\u0000\u0000\u0619\u061d"+ - "\u0001\u0000\u0000\u0000\u061a\u061c\t\u0000\u0000\u0000\u061b\u061a\u0001"+ - "\u0000\u0000\u0000\u061c\u061f\u0001\u0000\u0000\u0000\u061d\u061e\u0001"+ - "\u0000\u0000\u0000\u061d\u061b\u0001\u0000\u0000\u0000\u061e\u0620\u0001"+ - "\u0000\u0000\u0000\u061f\u061d\u0001\u0000\u0000\u0000\u0620\u0621\u0005"+ - "*\u0000\u0000\u0621\u0622\u0005/\u0000\u0000\u0622\u0623\u0001\u0000\u0000"+ - "\u0000\u0623\u0624\u0006O\u0012\u0000\u0624\u00ab\u0001\u0000\u0000\u0000"+ - "\u0625\u0626\t\u0000\u0000\u0000\u0626\u0627\u0006P)\u0000\u0627\u00ad"+ - "\u0001\u0000\u0000\u0000\u0628\u0629\u0005\u0000\u0000\u0001\u0629\u062a"+ - "\u0001\u0000\u0000\u0000\u062a\u062b\u0006Q\u0015\u0000\u062b\u062c\u0006"+ - "Q \u0000\u062c\u00af\u0001\u0000\u0000\u0000\u062d\u062e\u0005@\u0000"+ - "\u0000\u062e\u062f\u0007\u0003\u0000\u0000\u062f\u0630\u0007\f\u0000\u0000"+ - "\u0630\u0631\u0007\u0011\u0000\u0000\u0631\u0632\u0007\r\u0000\u0000\u0632"+ - "\u0633\u0007\u0006\u0000\u0000\u0633\u0634\u0007\r\u0000\u0000\u0634\u0635"+ - "\u0001\u0000\u0000\u0000\u0635\u0636\u0006R\u000f\u0000\u0636\u00b1\u0001"+ - "\u0000\u0000\u0000\u0637\u0638\t\u0000\u0000\u0000\u0638\u0639\u0004S"+ - "\u000f\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063b\u0006S*\u0000"+ - "\u063b\u00b3\u0001\u0000\u0000\u0000\u063c\u063d\t\u0000\u0000\u0000\u063d"+ - "\u063e\u0001\u0000\u0000\u0000\u063e\u063f\u0006T\f\u0000\u063f\u00b5"+ - "\u0001\u0000\u0000\u0000\u0640\u0641\u0005\u0000\u0000\u0001\u0641\u0642"+ - "\u0001\u0000\u0000\u0000\u0642\u0643\u0006U\u0015\u0000\u0643\u0644\u0006"+ - "U\u000f\u0000\u0644\u00b7\u0001\u0000\u0000\u0000\u0645\u0646\u0005@\u0000"+ - "\u0000\u0646\u0647\u0007\u0003\u0000\u0000\u0647\u0648\u0007\f\u0000\u0000"+ - "\u0648\u0649\u0007\u0011\u0000\u0000\u0649\u064a\u0007\u001a\u0000\u0000"+ - "\u064a\u064b\u0007\u0003\u0000\u0000\u064b\u064c\u0007\u0002\u0000\u0000"+ - "\u064c\u064d\u0007\u0017\u0000\u0000\u064d\u064e\u0007\u0004\u0000\u0000"+ - "\u064e\u064f\u0007\u000b\u0000\u0000\u064f\u0650\u0007\u0007\u0000\u0000"+ - "\u0650\u0651\u0007\u0012\u0000\u0000\u0651\u0652\u0001\u0000\u0000\u0000"+ - "\u0652\u0653\u0006V\u0001\u0000\u0653\u0654\u0006V\u000f\u0000\u0654\u00b9"+ - "\u0001\u0000\u0000\u0000\u0655\u0656\t\u0000\u0000\u0000\u0656\u0657\u0004"+ - "W\u0010\u0000\u0657\u0658\u0001\u0000\u0000\u0000\u0658\u0659\u0006W\t"+ - "\u0000\u0659\u00bb\u0001\u0000\u0000\u0000\u065a\u065b\t\u0000\u0000\u0000"+ - "\u065b\u065c\u0001\u0000\u0000\u0000\u065c\u065d\u0006X\f\u0000\u065d"+ - "\u00bd\u0001\u0000\u0000\u0000\u065e\u065f\u0005\u0000\u0000\u0001\u065f"+ - "\u0660\u0001\u0000\u0000\u0000\u0660\u0661\u0006Y\u0015\u0000\u0661\u0662"+ - "\u0006Y\u000f\u0000\u0662\u00bf\u0001\u0000\u0000\u0000\u0663\u0664\u0005"+ - ":\u0000\u0000\u0664\u0665\u0003R#\u0000\u0665\u0666\u0005=\u0000\u0000"+ - "\u0666\u0667\u0005\"\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668"+ - "\u0669\u0006Z\t\u0000\u0669\u066a\u0006Z+\u0000\u066a\u00c1\u0001\u0000"+ - "\u0000\u0000\u066b\u066c\u0005{\u0000\u0000\u066c\u066d\u0005{\u0000\u0000"+ - "\u066d\u066e\u0001\u0000\u0000\u0000\u066e\u066f\u0006[\u0005\u0000\u066f"+ - "\u0670\u0006[\u0006\u0000\u0670\u00c3\u0001\u0000\u0000\u0000\u0671\u0672"+ - "\u0005{\u0000\u0000\u0672\u0673\u0005!\u0000\u0000\u0673\u0674\u0005!"+ - "\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675\u0676\u0006\\\u0007"+ - "\u0000\u0676\u0677\u0006\\\b\u0000\u0677\u00c5\u0001\u0000\u0000\u0000"+ - "\u0678\u0679\u0005>\u0000\u0000\u0679\u067a\u0001\u0000\u0000\u0000\u067a"+ - "\u067b\u0006]\t\u0000\u067b\u067c\u0006]\u000f\u0000\u067c\u00c7\u0001"+ - "\u0000\u0000\u0000\u067d\u067e\t\u0000\u0000\u0000\u067e\u067f\u0001\u0000"+ - "\u0000\u0000\u067f\u0680\u0006^\t\u0000\u0680\u00c9\u0001\u0000\u0000"+ - "\u0000\u0681\u0682\u0005\u0000\u0000\u0001\u0682\u0683\u0001\u0000\u0000"+ - "\u0000\u0683\u0684\u0006_\u0015\u0000\u0684\u0685\u0006_\u000f\u0000\u0685"+ - "\u00cb\u0001\u0000\u0000\u0000\u0686\u0687\u0005\"\u0000\u0000\u0687\u0688"+ - "\u0001\u0000\u0000\u0000\u0688\u0689\u0006`\t\u0000\u0689\u068a\u0006"+ - "`\u000f\u0000\u068a\u00cd\u0001\u0000\u0000\u0000\u068b\u068c\t\u0000"+ - "\u0000\u0000\u068c\u068d\u0004a\u0011\u0000\u068d\u068e\u0001\u0000\u0000"+ - "\u0000\u068e\u068f\u0006a\u001f\u0000\u068f\u00cf\u0001\u0000\u0000\u0000"+ - "\u0690\u0691\t\u0000\u0000\u0000\u0691\u0692\u0001\u0000\u0000\u0000\u0692"+ - "\u0693\u0006b\f\u0000\u0693\u00d1\u0001\u0000\u0000\u0000\u0694\u0695"+ - "\u0005\u0000\u0000\u0001\u0695\u0696\u0001\u0000\u0000\u0000\u0696\u0697"+ - "\u0006c\u0015\u0000\u0697\u0698\u0006c\u000f\u0000\u0698\u00d3\u0001\u0000"+ - "\u0000\u0000\u0699\u069b\u0003\f\u0000\u0000\u069a\u069c\u0005$\u0000"+ - "\u0000\u069b\u069a\u0001\u0000\u0000\u0000\u069b\u069c\u0001\u0000\u0000"+ - "\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069e\u0003R#\u0000\u069e"+ - "\u069f\u0005}\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a1"+ - "\u0006d\f\u0000\u06a1\u00d5\u0001\u0000\u0000\u0000\u06a2\u06a3\u0003"+ - "\f\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a5\u0006e"+ - "\f\u0000\u06a5\u00d7\u0001\u0000\u0000\u0000\u06a6\u06a8\u0005{\u0000"+ - "\u0000\u06a7\u06a9\u0007)\u0000\u0000\u06a8\u06a7\u0001\u0000\u0000\u0000"+ - "\u06a8\u06a9\u0001\u0000\u0000\u0000\u06a9\u06aa\u0001\u0000\u0000\u0000"+ - "\u06aa\u06ac\u0003R#\u0000\u06ab\u06ad\u0007)\u0000\u0000\u06ac\u06ab"+ - "\u0001\u0000\u0000\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06af"+ - "\u0001\u0000\u0000\u0000\u06ae\u06b0\u0005:\u0000\u0000\u06af\u06ae\u0001"+ - "\u0000\u0000\u0000\u06b0\u06b1\u0001\u0000\u0000\u0000\u06b1\u06af\u0001"+ - "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b4\u0001"+ - "\u0000\u0000\u0000\u06b3\u06b5\u0007)\u0000\u0000\u06b4\u06b3\u0001\u0000"+ - "\u0000\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b7\u0001\u0000"+ - "\u0000\u0000\u06b6\u06b8\u0003R#\u0000\u06b7\u06b6\u0001\u0000\u0000\u0000"+ - "\u06b7\u06b8\u0001\u0000\u0000\u0000\u06b8\u06ba\u0001\u0000\u0000\u0000"+ - "\u06b9\u06bb\u0007)\u0000\u0000\u06ba\u06b9\u0001\u0000\u0000\u0000\u06ba"+ - "\u06bb\u0001\u0000\u0000\u0000\u06bb\u06d2\u0001\u0000\u0000\u0000\u06bc"+ - "\u06be\u0005,\u0000\u0000\u06bd\u06bf\u0007)\u0000\u0000\u06be\u06bd\u0001"+ - "\u0000\u0000\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c0\u0001"+ - "\u0000\u0000\u0000\u06c0\u06c2\u0003R#\u0000\u06c1\u06c3\u0007)\u0000"+ - "\u0000\u06c2\u06c1\u0001\u0000\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000"+ - "\u0000\u06c3\u06c5\u0001\u0000\u0000\u0000\u06c4\u06c6\u0005:\u0000\u0000"+ - "\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000"+ - "\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000"+ - "\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06cb\u0007)\u0000\u0000\u06ca"+ - "\u06c9\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb"+ - "\u06cc\u0001\u0000\u0000\u0000\u06cc\u06ce\u0003R#\u0000\u06cd\u06cf\u0007"+ - ")\u0000\u0000\u06ce\u06cd\u0001\u0000\u0000\u0000\u06ce\u06cf\u0001\u0000"+ - "\u0000\u0000\u06cf\u06d1\u0001\u0000\u0000\u0000\u06d0\u06bc\u0001\u0000"+ - "\u0000\u0000\u06d1\u06d4\u0001\u0000\u0000\u0000\u06d2\u06d0\u0001\u0000"+ - "\u0000\u0000\u06d2\u06d3\u0001\u0000\u0000\u0000\u06d3\u06d6\u0001\u0000"+ - "\u0000\u0000\u06d4\u06d2\u0001\u0000\u0000\u0000\u06d5\u06d7\u0005,\u0000"+ - "\u0000\u06d6\u06d5\u0001\u0000\u0000\u0000\u06d6\u06d7\u0001\u0000\u0000"+ - "\u0000\u06d7\u06d8\u0001\u0000\u0000\u0000\u06d8\u06d9\u0005}\u0000\u0000"+ - "\u06d9\u06da\u0001\u0000\u0000\u0000\u06da\u06db\u0006f\f\u0000\u06db"+ - "\u00d9\u0001\u0000\u0000\u0000\u06dc\u06dd\u0005{\u0000\u0000\u06dd\u06de"+ - "\u0005$\u0000\u0000\u06de\u06e7\u0003R#\u0000\u06df\u06e0\u0005[\u0000"+ - "\u0000\u06e0\u06e1\u0007)\u0000\u0000\u06e1\u06e2\u0003R#\u0000\u06e2"+ - "\u06e3\u0007)\u0000\u0000\u06e3\u06e4\u0005]\u0000\u0000\u06e4\u06e6\u0001"+ - "\u0000\u0000\u0000\u06e5\u06df\u0001\u0000\u0000\u0000\u06e6\u06e9\u0001"+ - "\u0000\u0000\u0000\u06e7\u06e5\u0001\u0000\u0000\u0000\u06e7\u06e8\u0001"+ - "\u0000\u0000\u0000\u06e8\u06ea\u0001\u0000\u0000\u0000\u06e9\u06e7\u0001"+ - "\u0000\u0000\u0000\u06ea\u06eb\u0005:\u0000\u0000\u06eb\u06ec\u0005:\u0000"+ - "\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0003R#\u0000\u06ee"+ - "\u06ef\u0005}\u0000\u0000\u06ef\u06f0\u0001\u0000\u0000\u0000\u06f0\u06f1"+ - "\u0006g\f\u0000\u06f1\u00db\u0001\u0000\u0000\u0000\u06f2\u06f3\u0005"+ - "{\u0000\u0000\u06f3\u06f4\u0005$\u0000\u0000\u06f4\u06fe\u0003R#\u0000"+ - "\u06f5\u06f6\u0005[\u0000\u0000\u06f6\u06f8\u0007)\u0000\u0000\u06f7\u06f9"+ - "\u0003R#\u0000\u06f8\u06f7\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001\u0000"+ - "\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb\u0007)\u0000"+ - "\u0000\u06fb\u06fd\u0005]\u0000\u0000\u06fc\u06f5\u0001\u0000\u0000\u0000"+ - "\u06fd\u0700\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000\u0000"+ - "\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff\u0708\u0001\u0000\u0000\u0000"+ - "\u0700\u06fe\u0001\u0000\u0000\u0000\u0701\u0702\u0005:\u0000\u0000\u0702"+ - "\u0704\u0005:\u0000\u0000\u0703\u0701\u0001\u0000\u0000\u0000\u0704\u0705"+ - "\u0001\u0000\u0000\u0000\u0705\u0703\u0001\u0000\u0000\u0000\u0705\u0706"+ - "\u0001\u0000\u0000\u0000\u0706\u0707\u0001\u0000\u0000\u0000\u0707\u0709"+ - "\u0003R#\u0000\u0708\u0703\u0001\u0000\u0000\u0000\u0708\u0709\u0001\u0000"+ - "\u0000\u0000\u0709\u070e\u0001\u0000\u0000\u0000\u070a\u070c\u0005:\u0000"+ - "\u0000\u070b\u070d\u0003R#\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c"+ - "\u070d\u0001\u0000\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e"+ - "\u070a\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ - "\u070e\u0001\u0000\u0000\u0000\u0710\u0711\u0001\u0000\u0000\u0000\u0711"+ - "\u0712\u0001\u0000\u0000\u0000\u0712\u0713\u0005}\u0000\u0000\u0713\u0717"+ - "\u0001\u0000\u0000\u0000\u0714\u0715\u0005:\u0000\u0000\u0715\u0717\u0005"+ - "$\u0000\u0000\u0716\u06f2\u0001\u0000\u0000\u0000\u0716\u0714\u0001\u0000"+ - "\u0000\u0000\u0717\u0718\u0001\u0000\u0000\u0000\u0718\u0719\u0006h\u0015"+ - "\u0000\u0719\u00dd\u0001\u0000\u0000\u0000\u071a\u071b\u0005\\\u0000\u0000"+ - "\u071b\u071c\u0005\"\u0000\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ - "\u071e\u0006i\f\u0000\u071e\u00df\u0001\u0000\u0000\u0000\u071f\u0720"+ - "\u0005\"\u0000\u0000\u0720\u0721\u0001\u0000\u0000\u0000\u0721\u0722\u0006"+ - "j\f\u0000\u0722\u0723\u0006j\u000f\u0000\u0723\u00e1\u0001\u0000\u0000"+ - "\u0000\u0724\u0725\t\u0000\u0000\u0000\u0725\u0726\u0001\u0000\u0000\u0000"+ - "\u0726\u0727\u0006k\f\u0000\u0727\u00e3\u0001\u0000\u0000\u0000\u0728"+ - "\u0729\u0005\u0000\u0000\u0001\u0729\u072a\u0001\u0000\u0000\u0000\u072a"+ - "\u072b\u0006l\u0015\u0000\u072b\u072c\u0006l\u000f\u0000\u072c\u00e5\u0001"+ - "\u0000\u0000\u0000\u072d\u072e\u0005-\u0000\u0000\u072e\u072f\u0005-\u0000"+ - "\u0000\u072f\u0730\u0005}\u0000\u0000\u0730\u0731\u0005}\u0000\u0000\u0731"+ - "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006m\u000f\u0000\u0733\u00e7"+ - "\u0001\u0000\u0000\u0000\u0734\u0735\t\u0000\u0000\u0000\u0735\u0736\u0004"+ - "n\u0012\u0000\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0738\u0006n,"+ - "\u0000\u0738\u00e9\u0001\u0000\u0000\u0000\u0739\u073a\t\u0000\u0000\u0000"+ - "\u073a\u073b\u0001\u0000\u0000\u0000\u073b\u073c\u0006o\f\u0000\u073c"+ - "\u00eb\u0001\u0000\u0000\u0000\u073d\u073e\u0005\u0000\u0000\u0001\u073e"+ - "\u073f\u0001\u0000\u0000\u0000\u073f\u0740\u0006p,\u0000\u0740\u0741\u0006"+ - "p\u000f\u0000\u0741\u00ed\u0001\u0000\u0000\u0000k\u0000\u0001\u0002\u0003"+ - "\u0004\u0005\u0006\u0007\b\t\n\u000b\u00f5\u00ff\u013c\u015b\u0177\u0181"+ - "\u0183\u018c\u0198\u01a6\u01ac\u01ae\u01cc\u023e\u0243\u0259\u0288\u02bf"+ - "\u02e4\u02ee\u0346\u0349\u0361\u0376\u037d\u038e\u0390\u039d\u03a2\u03a9"+ - "\u03ae\u03bc\u03bf\u03c1\u03cd\u03d2\u03d5\u03e2\u03e5\u03e7\u03ee\u03f3"+ - "\u03f5\u03fe\u040a\u0411\u0418\u0420\u0422\u042b\u042d\u0438\u0450\u0464"+ - "\u0468\u0473\u0479\u0485\u0489\u054f\u0554\u0557\u0575\u057c\u0583\u058b"+ - "\u05a1\u05a8\u05af\u05b7\u05c4\u0609\u061d\u069b\u06a8\u06ac\u06b1\u06b4"+ - "\u06b7\u06ba\u06be\u06c2\u06c7\u06ca\u06ce\u06d2\u06d6\u06e7\u06f8\u06fe"+ - "\u0705\u0708\u070c\u0710\u0716-\u0005\u0004\u0000\u0007\u0001\u0000\u0005"+ - "\u0007\u0000\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007"+ - "\u0005\u0000\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005"+ - "\b\u0000\u0005\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007"+ - "\u0000\u0004\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u0001"+ - "6\u0002\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006"+ - "\u0001>\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b"+ - "\u0007\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001"+ - "G\u000f\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013"+ - "\u0000\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; + "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0003\u0000 {{}}\u0003"+ + "\u0000 !{{}}\u079c\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001"+ + "\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001"+ + "\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001"+ + "\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000"+ + "\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000"+ + "\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000"+ + "+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001"+ + "\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000"+ + "\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u0000"+ + "9\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001"+ + "\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000"+ + "\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000"+ + "G\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_\u0001"+ + "\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000\u0000"+ + "\u0000\u0001e\u0001\u0000\u0000\u0000\u0001g\u0001\u0000\u0000\u0000\u0001"+ + "i\u0001\u0000\u0000\u0000\u0002k\u0001\u0000\u0000\u0000\u0002m\u0001"+ + "\u0000\u0000\u0000\u0002o\u0001\u0000\u0000\u0000\u0002q\u0001\u0000\u0000"+ + "\u0000\u0003s\u0001\u0000\u0000\u0000\u0003u\u0001\u0000\u0000\u0000\u0003"+ + "w\u0001\u0000\u0000\u0000\u0003y\u0001\u0000\u0000\u0000\u0004{\u0001"+ + "\u0000\u0000\u0000\u0004}\u0001\u0000\u0000\u0000\u0004\u007f\u0001\u0000"+ + "\u0000\u0000\u0004\u0081\u0001\u0000\u0000\u0000\u0005\u0083\u0001\u0000"+ + "\u0000\u0000\u0005\u0085\u0001\u0000\u0000\u0000\u0005\u0087\u0001\u0000"+ + "\u0000\u0000\u0005\u0089\u0001\u0000\u0000\u0000\u0005\u008b\u0001\u0000"+ + "\u0000\u0000\u0005\u008d\u0001\u0000\u0000\u0000\u0005\u008f\u0001\u0000"+ + "\u0000\u0000\u0005\u0091\u0001\u0000\u0000\u0000\u0006\u0093\u0001\u0000"+ + "\u0000\u0000\u0006\u0095\u0001\u0000\u0000\u0000\u0006\u0097\u0001\u0000"+ + "\u0000\u0000\u0006\u0099\u0001\u0000\u0000\u0000\u0007\u009b\u0001\u0000"+ + "\u0000\u0000\u0007\u009d\u0001\u0000\u0000\u0000\u0007\u009f\u0001\u0000"+ + "\u0000\u0000\u0007\u00a1\u0001\u0000\u0000\u0000\b\u00a3\u0001\u0000\u0000"+ + "\u0000\b\u00a5\u0001\u0000\u0000\u0000\b\u00a7\u0001\u0000\u0000\u0000"+ + "\b\u00a9\u0001\u0000\u0000\u0000\b\u00ab\u0001\u0000\u0000\u0000\b\u00ad"+ + "\u0001\u0000\u0000\u0000\t\u00af\u0001\u0000\u0000\u0000\t\u00b1\u0001"+ + "\u0000\u0000\u0000\t\u00b3\u0001\u0000\u0000\u0000\t\u00b5\u0001\u0000"+ + "\u0000\u0000\t\u00b7\u0001\u0000\u0000\u0000\t\u00b9\u0001\u0000\u0000"+ + "\u0000\t\u00bb\u0001\u0000\u0000\u0000\t\u00bd\u0001\u0000\u0000\u0000"+ + "\t\u00bf\u0001\u0000\u0000\u0000\t\u00c1\u0001\u0000\u0000\u0000\t\u00c3"+ + "\u0001\u0000\u0000\u0000\n\u00c5\u0001\u0000\u0000\u0000\n\u00c7\u0001"+ + "\u0000\u0000\u0000\n\u00c9\u0001\u0000\u0000\u0000\n\u00cb\u0001\u0000"+ + "\u0000\u0000\u000b\u0131\u0001\u0000\u0000\u0000\r\u0133\u0001\u0000\u0000"+ + "\u0000\u000f\u014f\u0001\u0000\u0000\u0000\u0011\u0156\u0001\u0000\u0000"+ + "\u0000\u0013\u0175\u0001\u0000\u0000\u0000\u0015\u0193\u0001\u0000\u0000"+ + "\u0000\u0017\u0205\u0001\u0000\u0000\u0000\u0019\u0221\u0001\u0000\u0000"+ + "\u0000\u001b\u0250\u0001\u0000\u0000\u0000\u001d\u0254\u0001\u0000\u0000"+ + "\u0000\u001f\u0261\u0001\u0000\u0000\u0000!\u0287\u0001\u0000\u0000\u0000"+ + "#\u02ac\u0001\u0000\u0000\u0000%\u02b0\u0001\u0000\u0000\u0000\'\u02bd"+ + "\u0001\u0000\u0000\u0000)\u02c4\u0001\u0000\u0000\u0000+\u0311\u0001\u0000"+ + "\u0000\u0000-\u0315\u0001\u0000\u0000\u0000/\u031e\u0001\u0000\u0000\u0000"+ + "1\u0324\u0001\u0000\u0000\u00003\u0327\u0001\u0000\u0000\u00005\u032b"+ + "\u0001\u0000\u0000\u00007\u0331\u0001\u0000\u0000\u00009\u0345\u0001\u0000"+ + "\u0000\u0000;\u0358\u0001\u0000\u0000\u0000=\u0368\u0001\u0000\u0000\u0000"+ + "?\u0389\u0001\u0000\u0000\u0000A\u03ad\u0001\u0000\u0000\u0000C\u03bd"+ + "\u0001\u0000\u0000\u0000E\u03c6\u0001\u0000\u0000\u0000G\u03ca\u0001\u0000"+ + "\u0000\u0000I\u03ce\u0001\u0000\u0000\u0000K\u03d5\u0001\u0000\u0000\u0000"+ + "M\u03dc\u0001\u0000\u0000\u0000O\u03e3\u0001\u0000\u0000\u0000Q\u03e5"+ + "\u0001\u0000\u0000\u0000S\u03ef\u0001\u0000\u0000\u0000U\u03fa\u0001\u0000"+ + "\u0000\u0000W\u0403\u0001\u0000\u0000\u0000Y\u0418\u0001\u0000\u0000\u0000"+ + "[\u041a\u0001\u0000\u0000\u0000]\u041c\u0001\u0000\u0000\u0000_\u0423"+ + "\u0001\u0000\u0000\u0000a\u0429\u0001\u0000\u0000\u0000c\u0569\u0001\u0000"+ + "\u0000\u0000e\u056d\u0001\u0000\u0000\u0000g\u0573\u0001\u0000\u0000\u0000"+ + "i\u0577\u0001\u0000\u0000\u0000k\u057c\u0001\u0000\u0000\u0000m\u0583"+ + "\u0001\u0000\u0000\u0000o\u0589\u0001\u0000\u0000\u0000q\u0592\u0001\u0000"+ + "\u0000\u0000s\u0597\u0001\u0000\u0000\u0000u\u059f\u0001\u0000\u0000\u0000"+ + "w\u05a5\u0001\u0000\u0000\u0000y\u05ae\u0001\u0000\u0000\u0000{\u05b4"+ + "\u0001\u0000\u0000\u0000}\u05bc\u0001\u0000\u0000\u0000\u007f\u05c2\u0001"+ + "\u0000\u0000\u0000\u0081\u05c7\u0001\u0000\u0000\u0000\u0083\u05cc\u0001"+ + "\u0000\u0000\u0000\u0085\u05d1\u0001\u0000\u0000\u0000\u0087\u05d8\u0001"+ + "\u0000\u0000\u0000\u0089\u05dd\u0001\u0000\u0000\u0000\u008b\u05e2\u0001"+ + "\u0000\u0000\u0000\u008d\u05e8\u0001\u0000\u0000\u0000\u008f\u05f6\u0001"+ + "\u0000\u0000\u0000\u0091\u05f9\u0001\u0000\u0000\u0000\u0093\u05fe\u0001"+ + "\u0000\u0000\u0000\u0095\u0608\u0001\u0000\u0000\u0000\u0097\u060d\u0001"+ + "\u0000\u0000\u0000\u0099\u0611\u0001\u0000\u0000\u0000\u009b\u0616\u0001"+ + "\u0000\u0000\u0000\u009d\u0626\u0001\u0000\u0000\u0000\u009f\u062b\u0001"+ + "\u0000\u0000\u0000\u00a1\u062f\u0001\u0000\u0000\u0000\u00a3\u0634\u0001"+ + "\u0000\u0000\u0000\u00a5\u063c\u0001\u0000\u0000\u0000\u00a7\u0642\u0001"+ + "\u0000\u0000\u0000\u00a9\u0649\u0001\u0000\u0000\u0000\u00ab\u064e\u0001"+ + "\u0000\u0000\u0000\u00ad\u0652\u0001\u0000\u0000\u0000\u00af\u0657\u0001"+ + "\u0000\u0000\u0000\u00b1\u065c\u0001\u0000\u0000\u0000\u00b3\u0661\u0001"+ + "\u0000\u0000\u0000\u00b5\u0665\u0001\u0000\u0000\u0000\u00b7\u066a\u0001"+ + "\u0000\u0000\u0000\u00b9\u06a0\u0001\u0000\u0000\u0000\u00bb\u06da\u0001"+ + "\u0000\u0000\u0000\u00bd\u06de\u0001\u0000\u0000\u0000\u00bf\u06e3\u0001"+ + "\u0000\u0000\u0000\u00c1\u06e8\u0001\u0000\u0000\u0000\u00c3\u06ec\u0001"+ + "\u0000\u0000\u0000\u00c5\u06f1\u0001\u0000\u0000\u0000\u00c7\u06f8\u0001"+ + "\u0000\u0000\u0000\u00c9\u06fd\u0001\u0000\u0000\u0000\u00cb\u0701\u0001"+ + "\u0000\u0000\u0000\u00cd\u00ce\u0007\u0000\u0000\u0000\u00ce\u00cf\u0007"+ + "\u0001\u0000\u0000\u00cf\u00d0\u0007\u0002\u0000\u0000\u00d0\u00d5\u0001"+ + "\u0000\u0000\u0000\u00d1\u00d2\u0007\u0003\u0000\u0000\u00d2\u00d3\u0007"+ + "\u0004\u0000\u0000\u00d3\u00d4\u0007\u0005\u0000\u0000\u00d4\u00d6\u0007"+ + "\u0006\u0000\u0000\u00d5\u00d1\u0001\u0000\u0000\u0000\u00d5\u00d6\u0001"+ + "\u0000\u0000\u0000\u00d6\u0132\u0001\u0000\u0000\u0000\u00d7\u00d8\u0007"+ + "\u0007\u0000\u0000\u00d8\u0132\u0007\u0000\u0000\u0000\u00d9\u00da\u0007"+ + "\b\u0000\u0000\u00da\u00db\u0007\u0006\u0000\u0000\u00db\u00dc\u0007\u0007"+ + "\u0000\u0000\u00dc\u00dd\u0007\t\u0000\u0000\u00dd\u0132\u0007\u0003\u0000"+ + "\u0000\u00de\u00df\u0007\n\u0000\u0000\u00df\u00e0\u0007\u0003\u0000\u0000"+ + "\u00e0\u00e1\u0007\u0005\u0000\u0000\u00e1\u00e2\u0007\u000b\u0000\u0000"+ + "\u00e2\u00e3\u0007\u0007\u0000\u0000\u00e3\u00e4\u0007\u0001\u0000\u0000"+ + "\u00e4\u0132\u0007\f\u0000\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6"+ + "\u00e7\u0007\u0003\u0000\u0000\u00e7\u00e8\u0007\n\u0000\u0000\u00e8\u00e9"+ + "\u0007\n\u0000\u0000\u00e9\u00ea\u0007\u0007\u0000\u0000\u00ea\u00eb\u0007"+ + "\u0001\u0000\u0000\u00eb\u0132\u0007\f\u0000\u0000\u00ec\u00ed\u0007\u0001"+ + "\u0000\u0000\u00ed\u00ee\u0007\f\u0000\u0000\u00ee\u00ef\u0007\u0005\u0000"+ + "\u0000\u00ef\u0132\u0007\u0003\u0000\u0000\u00f0\u00f1\u0007\r\u0000\u0000"+ + "\u00f1\u00f2\u0007\u000e\u0000\u0000\u00f2\u00f3\u0007\n\u0000\u0000\u00f3"+ + "\u0132\u0007\u0006\u0000\u0000\u00f4\u00f5\u0007\r\u0000\u0000\u00f5\u00f6"+ + "\u0007\u000e\u0000\u0000\u00f6\u00f7\u0007\n\u0000\u0000\u00f7\u00f8\u0007"+ + "\u0006\u0000\u0000\u00f8\u00f9\u0007\u0001\u0000\u0000\u00f9\u00fa\u0007"+ + "\f\u0000\u0000\u00fa\u00fb\u0007\u0005\u0000\u0000\u00fb\u0132\u0007\u0003"+ + "\u0000\u0000\u00fc\u00fd\u0007\n\u0000\u0000\u00fd\u00fe\u0007\b\u0000"+ + "\u0000\u00fe\u00ff\u0007\u0007\u0000\u0000\u00ff\u0100\u0007\u000b\u0000"+ + "\u0000\u0100\u0101\u0007\u0005\u0000\u0000\u0101\u0132\u0007\u0006\u0000"+ + "\u0000\u0102\u0103\u0007\u000e\u0000\u0000\u0103\u0104\u0007\f\u0000\u0000"+ + "\u0104\u0105\u0007\t\u0000\u0000\u0105\u0106\u0007\u0003\u0000\u0000\u0106"+ + "\u0107\u0007\n\u0000\u0000\u0107\u0132\u0007\n\u0000\u0000\u0108\u0109"+ + "\u0007\u0005\u0000\u0000\u0109\u010a\u0007\u0004\u0000\u0000\u010a\u010b"+ + "\u0007\f\u0000\u0000\u010b\u0112\u0001\u0000\u0000\u0000\u010c\u010d\u0007"+ + "\u0004\u0000\u0000\u010d\u010e\u0007\f\u0000\u0000\u010e\u0113\u0007\u000f"+ + "\u0000\u0000\u010f\u0110\u0007\f\u0000\u0000\u0110\u0111\u0007\u0001\u0000"+ + "\u0000\u0111\u0113\u0007\u000b\u0000\u0000\u0112\u010c\u0001\u0000\u0000"+ + "\u0000\u0112\u010f\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000"+ + "\u0000\u0113\u0132\u0001\u0000\u0000\u0000\u0114\u0115\u0007\u0004\u0000"+ + "\u0000\u0115\u0116\u0007\u000e\u0000\u0000\u0116\u0117\u0007\u000b\u0000"+ + "\u0000\u0117\u0132\u0007\u0006\u0000\u0000\u0118\u0119\u0007\u0010\u0000"+ + "\u0000\u0119\u011a\u0007\u000e\u0000\u0000\u011a\u011b\u0007\u0003\u0000"+ + "\u0000\u011b\u011c\u0007\n\u0000\u0000\u011c\u0132\u0007\u000b\u0000\u0000"+ + "\u011d\u011e\u0007\u0003\u0000\u0000\u011e\u011f\u0007\u0002\u0000\u0000"+ + "\u011f\u0120\u0007\u0002\u0000\u0000\u0120\u0121\u0007\u0001\u0000\u0000"+ + "\u0121\u0132\u0007\u0002\u0000\u0000\u0122\u0123\u0007\r\u0000\u0000\u0123"+ + "\u0124\u0007\u0002\u0000\u0000\u0124\u0125\u0007\u0001\u0000\u0000\u0125"+ + "\u0126\u0007\u0011\u0000\u0000\u0126\u0127\u0007\u000e\u0000\u0000\u0127"+ + "\u0128\u0007\u0005\u0000\u0000\u0128\u0129\u0007\u000b\u0000\u0000\u0129"+ + "\u012a\u0007\u0007\u0000\u0000\u012a\u012b\u0007\u0001\u0000\u0000\u012b"+ + "\u0132\u0007\f\u0000\u0000\u012c\u012d\u0007\u0003\u0000\u0000\u012d\u012e"+ + "\u0007\u0012\u0000\u0000\u012e\u012f\u0007\r\u0000\u0000\u012f\u0130\u0007"+ + "\u000b\u0000\u0000\u0130\u0132\u0007\u000f\u0000\u0000\u0131\u00cd\u0001"+ + "\u0000\u0000\u0000\u0131\u00d7\u0001\u0000\u0000\u0000\u0131\u00d9\u0001"+ + "\u0000\u0000\u0000\u0131\u00de\u0001\u0000\u0000\u0000\u0131\u00e5\u0001"+ + "\u0000\u0000\u0000\u0131\u00ec\u0001\u0000\u0000\u0000\u0131\u00f0\u0001"+ + "\u0000\u0000\u0000\u0131\u00f4\u0001\u0000\u0000\u0000\u0131\u00fc\u0001"+ + "\u0000\u0000\u0000\u0131\u0102\u0001\u0000\u0000\u0000\u0131\u0108\u0001"+ + "\u0000\u0000\u0000\u0131\u0114\u0001\u0000\u0000\u0000\u0131\u0118\u0001"+ + "\u0000\u0000\u0000\u0131\u011d\u0001\u0000\u0000\u0000\u0131\u0122\u0001"+ + "\u0000\u0000\u0000\u0131\u012c\u0001\u0000\u0000\u0000\u0132\f\u0001\u0000"+ + "\u0000\u0000\u0133\u0134\u0005@\u0000\u0000\u0134\u0135\u0007\u0007\u0000"+ + "\u0000\u0135\u0136\u0007\f\u0000\u0000\u0136\u0137\u0007\u0005\u0000\u0000"+ + "\u0137\u0138\u0007\t\u0000\u0000\u0138\u0139\u0007\u000e\u0000\u0000\u0139"+ + "\u013a\u0007\u0011\u0000\u0000\u013a\u013b\u0007\u0003\u0000\u0000\u013b"+ + "\u014d\u0001\u0000\u0000\u0000\u013c\u013d\u0007\u0007\u0000\u0000\u013d"+ + "\u014e\u0007\u0000\u0000\u0000\u013e\u013f\u0007\b\u0000\u0000\u013f\u0140"+ + "\u0007\u0006\u0000\u0000\u0140\u0141\u0007\u0003\u0000\u0000\u0141\u014e"+ + "\u0007\f\u0000\u0000\u0142\u0143\u0007\u0000\u0000\u0000\u0143\u0144\u0007"+ + "\u0007\u0000\u0000\u0144\u0145\u0007\u0002\u0000\u0000\u0145\u0146\u0007"+ + "\n\u0000\u0000\u0146\u014e\u0007\u000b\u0000\u0000\u0147\u0148\u0007\u000e"+ + "\u0000\u0000\u0148\u0149\u0007\f\u0000\u0000\u0149\u014a\u0007\t\u0000"+ + "\u0000\u014a\u014b\u0007\u0003\u0000\u0000\u014b\u014c\u0007\n\u0000\u0000"+ + "\u014c\u014e\u0007\n\u0000\u0000\u014d\u013c\u0001\u0000\u0000\u0000\u014d"+ + "\u013e\u0001\u0000\u0000\u0000\u014d\u0142\u0001\u0000\u0000\u0000\u014d"+ + "\u0147\u0001\u0000\u0000\u0000\u014d\u014e\u0001\u0000\u0000\u0000\u014e"+ + "\u000e\u0001\u0000\u0000\u0000\u014f\u0153\u0007\u0013\u0000\u0000\u0150"+ + "\u0152\u0007\u0014\u0000\u0000\u0151\u0150\u0001\u0000\u0000\u0000\u0152"+ + "\u0155\u0001\u0000\u0000\u0000\u0153\u0151\u0001\u0000\u0000\u0000\u0153"+ + "\u0154\u0001\u0000\u0000\u0000\u0154\u0010\u0001\u0000\u0000\u0000\u0155"+ + "\u0153\u0001\u0000\u0000\u0000\u0156\u0157\u0005\u00b0\u0000\u0000\u0157"+ + "\u0012\u0001\u0000\u0000\u0000\u0158\u0159\u0005<\u0000\u0000\u0159\u015a"+ + "\u0005?\u0000\u0000\u015a\u015b\u0005=\u0000\u0000\u015b\u015f\u0001\u0000"+ + "\u0000\u0000\u015c\u015e\t\u0000\u0000\u0000\u015d\u015c\u0001\u0000\u0000"+ + "\u0000\u015e\u0161\u0001\u0000\u0000\u0000\u015f\u0160\u0001\u0000\u0000"+ + "\u0000\u015f\u015d\u0001\u0000\u0000\u0000\u0160\u0162\u0001\u0000\u0000"+ + "\u0000\u0161\u015f\u0001\u0000\u0000\u0000\u0162\u0163\u0005?\u0000\u0000"+ + "\u0163\u0176\u0005>\u0000\u0000\u0164\u0165\u0005<\u0000\u0000\u0165\u0166"+ + "\u0005?\u0000\u0000\u0166\u0167\u0007\r\u0000\u0000\u0167\u0168\u0007"+ + "\u0006\u0000\u0000\u0168\u0169\u0007\r\u0000\u0000\u0169\u016d\u0001\u0000"+ + "\u0000\u0000\u016a\u016c\t\u0000\u0000\u0000\u016b\u016a\u0001\u0000\u0000"+ + "\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000"+ + "\u0000\u016d\u016b\u0001\u0000\u0000\u0000\u016e\u0173\u0001\u0000\u0000"+ + "\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170\u0171\u0005?\u0000\u0000"+ + "\u0171\u0174\u0005>\u0000\u0000\u0172\u0174\u0005\u0000\u0000\u0001\u0173"+ + "\u0170\u0001\u0000\u0000\u0000\u0173\u0172\u0001\u0000\u0000\u0000\u0174"+ + "\u0176\u0001\u0000\u0000\u0000\u0175\u0158\u0001\u0000\u0000\u0000\u0175"+ + "\u0164\u0001\u0000\u0000\u0000\u0176\u0014\u0001\u0000\u0000\u0000\u0177"+ + "\u0178\u0005@\u0000\u0000\u0178\u0194\u0003\u000b\u0000\u0000\u0179\u017a"+ + "\u0005@\u0000\u0000\u017a\u017b\u0007\n\u0000\u0000\u017b\u017c\u0007"+ + "\u0003\u0000\u0000\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e\u0007"+ + "\u000b\u0000\u0000\u017e\u017f\u0007\u0007\u0000\u0000\u017f\u0180\u0007"+ + "\u0001\u0000\u0000\u0180\u0181\u0007\f\u0000\u0000\u0181\u0182\u0007\u0012"+ + "\u0000\u0000\u0182\u0183\u0007\u0007\u0000\u0000\u0183\u0184\u0007\n\u0000"+ + "\u0000\u0184\u0185\u0007\n\u0000\u0000\u0185\u0186\u0007\u0007\u0000\u0000"+ + "\u0186\u0187\u0007\f\u0000\u0000\u0187\u0194\u0007\u0010\u0000\u0000\u0188"+ + "\u0189\u0005@\u0000\u0000\u0189\u018a\u0007\u0006\u0000\u0000\u018a\u018b"+ + "\u0007\u0004\u0000\u0000\u018b\u018c\u0007\n\u0000\u0000\u018c\u018d\u0007"+ + "\n\u0000\u0000\u018d\u018e\u0007\u0003\u0000\u0000\u018e\u018f\u0007\u0005"+ + "\u0000\u0000\u018f\u0190\u0007\u000b\u0000\u0000\u0190\u0191\u0007\u0007"+ + "\u0000\u0000\u0191\u0192\u0007\u0001\u0000\u0000\u0192\u0194\u0007\f\u0000"+ + "\u0000\u0193\u0177\u0001\u0000\u0000\u0000\u0193\u0179\u0001\u0000\u0000"+ + "\u0000\u0193\u0188\u0001\u0000\u0000\u0000\u0194\u0195\u0001\u0000\u0000"+ + "\u0000\u0195\u0196\u0006\u0005\u0000\u0000\u0196\u0197\u0006\u0005\u0001"+ + "\u0000\u0197\u0016\u0001\u0000\u0000\u0000\u0198\u0199\u0005@\u0000\u0000"+ + "\u0199\u019a\u0007\u0003\u0000\u0000\u019a\u019b\u0007\t\u0000\u0000\u019b"+ + "\u019c\u0007\n\u0000\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d\u019e"+ + "\u0007\u0007\u0000\u0000\u019e\u0206\u0007\u0000\u0000\u0000\u019f\u0206"+ + "\u0003\r\u0001\u0000\u01a0\u01a1\u0005@\u0000\u0000\u01a1\u01a2\u0007"+ + "\u0003\u0000\u0000\u01a2\u01a3\u0007\u0015\u0000\u0000\u01a3\u01a4\u0007"+ + "\u000b\u0000\u0000\u01a4\u01a5\u0007\u0003\u0000\u0000\u01a5\u01a6\u0007"+ + "\f\u0000\u0000\u01a6\u01a7\u0007\u0011\u0000\u0000\u01a7\u0206\u0007\n"+ + "\u0000\u0000\u01a8\u01a9\u0005@\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000"+ + "\u0000\u01aa\u01ab\u0007\u0004\u0000\u0000\u01ab\u01ac\u0007\u0005\u0000"+ + "\u0000\u01ac\u0206\u0007\u0006\u0000\u0000\u01ad\u01ae\u0005@\u0000\u0000"+ + "\u01ae\u01af\u0007\u000f\u0000\u0000\u01af\u01b0\u0007\u0007\u0000\u0000"+ + "\u01b0\u01b1\u0007\u0003\u0000\u0000\u01b1\u01b2\u0007\t\u0000\u0000\u01b2"+ + "\u0206\u0007\u0011\u0000\u0000\u01b3\u01b4\u0005@\u0000\u0000\u01b4\u01b5"+ + "\u0007\r\u0000\u0000\u01b5\u01b6\u0007\u0002\u0000\u0000\u01b6\u01b7\u0007"+ + "\u0001\u0000\u0000\u01b7\u01b8\u0007\r\u0000\u0000\u01b8\u0206\u0007\n"+ + "\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba\u01bb\u0007\u0012\u0000"+ + "\u0000\u01bb\u01bc\u0007\u0003\u0000\u0000\u01bc\u01bd\u0007\u000b\u0000"+ + "\u0000\u01bd\u01be\u0007\u0006\u0000\u0000\u01be\u01bf\u0007\u0001\u0000"+ + "\u0000\u01bf\u0206\u0007\u0011\u0000\u0000\u01c0\u01c1\u0005@\u0000\u0000"+ + "\u01c1\u01c2\u0007\u0005\u0000\u0000\u01c2\u01c3\u0007\t\u0000\u0000\u01c3"+ + "\u01c4\u0007\u0004\u0000\u0000\u01c4\u01c5\u0007\n\u0000\u0000\u01c5\u0206"+ + "\u0007\n\u0000\u0000\u01c6\u01c7\u0005@\u0000\u0000\u01c7\u01c8\u0007"+ + "\n\u0000\u0000\u01c8\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca\u0007\u000f"+ + "\u0000\u0000\u01ca\u01cb\u0007\t\u0000\u0000\u01cb\u0206\u0007\u0003\u0000"+ + "\u0000\u01cc\u01cd\u0005@\u0000\u0000\u01cd\u01ce\u0007\u0004\u0000\u0000"+ + "\u01ce\u01cf\u0007\b\u0000\u0000\u01cf\u01d0\u0007\u0004\u0000\u0000\u01d0"+ + "\u01d1\u0007\u0002\u0000\u0000\u01d1\u0206\u0007\u0003\u0000\u0000\u01d2"+ + "\u01d3\u0005@\u0000\u0000\u01d3\u01d4\u0007\u0016\u0000\u0000\u01d4\u01d5"+ + "\u0007\u0002\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000\u0000\u01d6\u01d7"+ + "\u0007\u0004\u0000\u0000\u01d7\u0206\u0007\u0017\u0000\u0000\u01d8\u01d9"+ + "\u0005@\u0000\u0000\u01d9\u01da\u0007\u0005\u0000\u0000\u01da\u01db\u0007"+ + "\u0001\u0000\u0000\u01db\u01dc\u0007\f\u0000\u0000\u01dc\u01dd\u0007\u000b"+ + "\u0000\u0000\u01dd\u01de\u0007\u0007\u0000\u0000\u01de\u01df\u0007\f\u0000"+ + "\u0000\u01df\u01e0\u0007\u000e\u0000\u0000\u01e0\u0206\u0007\u0003\u0000"+ + "\u0000\u01e1\u01e2\u0005@\u0000\u0000\u01e2\u01e3\u0007\n\u0000\u0000"+ + "\u01e3\u01e4\u0007\u0003\u0000\u0000\u01e4\u01e5\u0007\t\u0000\u0000\u01e5"+ + "\u01e6\u0007\u0003\u0000\u0000\u01e6\u01e7\u0007\u0005\u0000\u0000\u01e7"+ + "\u01e8\u0007\u000b\u0000\u0000\u01e8\u01e9\u0007\u0003\u0000\u0000\u01e9"+ + "\u0206\u0007\u0011\u0000\u0000\u01ea\u01eb\u0005@\u0000\u0000\u01eb\u01ec"+ + "\u0007\u0011\u0000\u0000\u01ec\u01ed\u0007\u0007\u0000\u0000\u01ed\u01ee"+ + "\u0007\n\u0000\u0000\u01ee\u01ef\u0007\u0004\u0000\u0000\u01ef\u01f0\u0007"+ + "\u0016\u0000\u0000\u01f0\u01f1\u0007\t\u0000\u0000\u01f1\u01f2\u0007\u0003"+ + "\u0000\u0000\u01f2\u0206\u0007\u0011\u0000\u0000\u01f3\u01f4\u0005@\u0000"+ + "\u0000\u01f4\u01f5\u0007\u0002\u0000\u0000\u01f5\u01f6\u0007\u0003\u0000"+ + "\u0000\u01f6\u01f7\u0007\u0004\u0000\u0000\u01f7\u01f8\u0007\u0011\u0000"+ + "\u0000\u01f8\u01f9\u0007\u0001\u0000\u0000\u01f9\u01fa\u0007\f\u0000\u0000"+ + "\u01fa\u01fb\u0007\t\u0000\u0000\u01fb\u0206\u0007\u000f\u0000\u0000\u01fc"+ + "\u01fd\u0005@\u0000\u0000\u01fd\u01fe\u0007\u0002\u0000\u0000\u01fe\u01ff"+ + "\u0007\u0003\u0000\u0000\u01ff\u0200\u0007\u0018\u0000\u0000\u0200\u0201"+ + "\u0007\u000e\u0000\u0000\u0201\u0202\u0007\u0007\u0000\u0000\u0202\u0203"+ + "\u0007\u0002\u0000\u0000\u0203\u0204\u0007\u0003\u0000\u0000\u0204\u0206"+ + "\u0007\u0011\u0000\u0000\u0205\u0198\u0001\u0000\u0000\u0000\u0205\u019f"+ + "\u0001\u0000\u0000\u0000\u0205\u01a0\u0001\u0000\u0000\u0000\u0205\u01a8"+ + "\u0001\u0000\u0000\u0000\u0205\u01ad\u0001\u0000\u0000\u0000\u0205\u01b3"+ + "\u0001\u0000\u0000\u0000\u0205\u01b9\u0001\u0000\u0000\u0000\u0205\u01c0"+ + "\u0001\u0000\u0000\u0000\u0205\u01c6\u0001\u0000\u0000\u0000\u0205\u01cc"+ + "\u0001\u0000\u0000\u0000\u0205\u01d2\u0001\u0000\u0000\u0000\u0205\u01d8"+ + "\u0001\u0000\u0000\u0000\u0205\u01e1\u0001\u0000\u0000\u0000\u0205\u01ea"+ + "\u0001\u0000\u0000\u0000\u0205\u01f3\u0001\u0000\u0000\u0000\u0205\u01fc"+ + "\u0001\u0000\u0000\u0000\u0206\u020a\u0001\u0000\u0000\u0000\u0207\u0209"+ + "\u0005 \u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0209\u020c\u0001"+ + "\u0000\u0000\u0000\u020a\u0208\u0001\u0000\u0000\u0000\u020a\u020b\u0001"+ + "\u0000\u0000\u0000\u020b\u020d\u0001\u0000\u0000\u0000\u020c\u020a\u0001"+ + "\u0000\u0000\u0000\u020d\u020e\u0004\u0006\u0000\u0000\u020e\u020f\u0001"+ + "\u0000\u0000\u0000\u020f\u0210\u0006\u0006\u0000\u0000\u0210\u0211\u0006"+ + "\u0006\u0001\u0000\u0211\u0018\u0001\u0000\u0000\u0000\u0212\u0213\u0005"+ + "@\u0000\u0000\u0213\u0214\u0007\u0016\u0000\u0000\u0214\u0215\u0007\u0002"+ + "\u0000\u0000\u0215\u0216\u0007\u0003\u0000\u0000\u0216\u0217\u0007\u0004"+ + "\u0000\u0000\u0217\u0222\u0007\u0017\u0000\u0000\u0218\u0219\u0005@\u0000"+ + "\u0000\u0219\u021a\u0007\u0005\u0000\u0000\u021a\u021b\u0007\u0001\u0000"+ + "\u0000\u021b\u021c\u0007\f\u0000\u0000\u021c\u021d\u0007\u000b\u0000\u0000"+ + "\u021d\u021e\u0007\u0007\u0000\u0000\u021e\u021f\u0007\f\u0000\u0000\u021f"+ + "\u0220\u0007\u000e\u0000\u0000\u0220\u0222\u0007\u0003\u0000\u0000\u0221"+ + "\u0212\u0001\u0000\u0000\u0000\u0221\u0218\u0001\u0000\u0000\u0000\u0222"+ + "\u0223\u0001\u0000\u0000\u0000\u0223\u0224\u0006\u0007\u0001\u0000\u0224"+ + "\u001a\u0001\u0000\u0000\u0000\u0225\u0226\u0005@\u0000\u0000\u0226\u0227"+ + "\u0007\n\u0000\u0000\u0227\u0228\u0007\u000b\u0000\u0000\u0228\u0229\u0007"+ + "\u0001\u0000\u0000\u0229\u0251\u0007\r\u0000\u0000\u022a\u022b\u0005@"+ + "\u0000\u0000\u022b\u022c\u0007\n\u0000\u0000\u022c\u022d\u0007\u0006\u0000"+ + "\u0000\u022d\u022e\u0007\u0001\u0000\u0000\u022e\u0251\u0007\b\u0000\u0000"+ + "\u022f\u0230\u0005@\u0000\u0000\u0230\u0231\u0007\u0001\u0000\u0000\u0231"+ + "\u0232\u0007\u0019\u0000\u0000\u0232\u0233\u0007\u0003\u0000\u0000\u0233"+ + "\u0234\u0007\u0002\u0000\u0000\u0234\u0235\u0007\b\u0000\u0000\u0235\u0236"+ + "\u0007\u0002\u0000\u0000\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238"+ + "\u0007\u000b\u0000\u0000\u0238\u0251\u0007\u0003\u0000\u0000\u0239\u023a"+ + "\u0005@\u0000\u0000\u023a\u023b\u0007\u0019\u0000\u0000\u023b\u023c\u0007"+ + "\u0007\u0000\u0000\u023c\u023d\u0007\u000b\u0000\u0000\u023d\u023e\u0007"+ + "\u0003\u0000\u0000\u023e\u023f\u0007\u0002\u0000\u0000\u023f\u0240\u0007"+ + "\u0003\u0000\u0000\u0240\u0241\u0007\u0004\u0000\u0000\u0241\u0242\u0007"+ + "\u0005\u0000\u0000\u0242\u0243\u0007\u000b\u0000\u0000\u0243\u0244\u0007"+ + "\u0002\u0000\u0000\u0244\u0245\u0007\u0003\u0000\u0000\u0245\u0246\u0007"+ + "\u0000\u0000\u0000\u0246\u0247\u0007\u0002\u0000\u0000\u0247\u0248\u0007"+ + "\u0003\u0000\u0000\u0248\u0249\u0007\n\u0000\u0000\u0249\u0251\u0007\u0006"+ + "\u0000\u0000\u024a\u024b\u0005@\u0000\u0000\u024b\u024c\u0007\u0003\u0000"+ + "\u0000\u024c\u024d\u0007\f\u0000\u0000\u024d\u024e\u0007\u0011\u0000\u0000"+ + "\u024e\u024f\u0001\u0000\u0000\u0000\u024f\u0251\u0003\u000b\u0000\u0000"+ + "\u0250\u0225\u0001\u0000\u0000\u0000\u0250\u022a\u0001\u0000\u0000\u0000"+ + "\u0250\u022f\u0001\u0000\u0000\u0000\u0250\u0239\u0001\u0000\u0000\u0000"+ + "\u0250\u024a\u0001\u0000\u0000\u0000\u0251\u0252\u0001\u0000\u0000\u0000"+ + "\u0252\u0253\u0006\b\u0001\u0000\u0253\u001c\u0001\u0000\u0000\u0000\u0254"+ + "\u0255\u0005@\u0000\u0000\u0255\u0256\u0007\u0019\u0000\u0000\u0256\u0257"+ + "\u0007\u0003\u0000\u0000\u0257\u0258\u0007\u0002\u0000\u0000\u0258\u0259"+ + "\u0007\u0016\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b"+ + "\u0007\u000b\u0000\u0000\u025b\u025c\u0007\u0007\u0000\u0000\u025c\u025d"+ + "\u0007\u0012\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f"+ + "\u0006\t\u0002\u0000\u025f\u0260\u0006\t\u0001\u0000\u0260\u001e\u0001"+ + "\u0000\u0000\u0000\u0261\u0262\u0005@\u0000\u0000\u0262\u0263\u0007\u0003"+ + "\u0000\u0000\u0263\u0264\u0007\f\u0000\u0000\u0264\u0265\u0007\u0011\u0000"+ + "\u0000\u0265\u0266\u0007\u0019\u0000\u0000\u0266\u0267\u0007\u0003\u0000"+ + "\u0000\u0267\u0268\u0007\u0002\u0000\u0000\u0268\u0269\u0007\u0016\u0000"+ + "\u0000\u0269\u026a\u0007\u0004\u0000\u0000\u026a\u026b\u0007\u000b\u0000"+ + "\u0000\u026b\u026c\u0007\u0007\u0000\u0000\u026c\u026d\u0007\u0012\u0000"+ + "\u0000\u026d\u026e\u0001\u0000\u0000\u0000\u026e\u026f\u0006\n\u0001\u0000"+ + "\u026f \u0001\u0000\u0000\u0000\u0270\u0271\u0005@\u0000\u0000\u0271\u0272"+ + "\u0007\u0011\u0000\u0000\u0272\u0288\u0007\u0011\u0000\u0000\u0273\u0274"+ + "\u0005@\u0000\u0000\u0274\u0275\u0007\u0011\u0000\u0000\u0275\u0276\u0007"+ + "\u000e\u0000\u0000\u0276\u0277\u0007\u0012\u0000\u0000\u0277\u0288\u0007"+ + "\r\u0000\u0000\u0278\u0279\u0005@\u0000\u0000\u0279\u027a\u0007\u001a"+ + "\u0000\u0000\u027a\u0288\u0007\n\u0000\u0000\u027b\u027c\u0005@\u0000"+ + "\u0000\u027c\u027d\u0007\u001a\u0000\u0000\u027d\u027e\u0007\n\u0000\u0000"+ + "\u027e\u027f\u0007\u0001\u0000\u0000\u027f\u0288\u0007\f\u0000\u0000\u0280"+ + "\u0281\u0005@\u0000\u0000\u0281\u0282\u0007\u0007\u0000\u0000\u0282\u0283"+ + "\u0007\f\u0000\u0000\u0283\u0284\u0007\u001a\u0000\u0000\u0284\u0285\u0007"+ + "\u0003\u0000\u0000\u0285\u0286\u0007\u0005\u0000\u0000\u0286\u0288\u0007"+ + "\u000b\u0000\u0000\u0287\u0270\u0001\u0000\u0000\u0000\u0287\u0273\u0001"+ + "\u0000\u0000\u0000\u0287\u0278\u0001\u0000\u0000\u0000\u0287\u027b\u0001"+ + "\u0000\u0000\u0000\u0287\u0280\u0001\u0000\u0000\u0000\u0288\u0289\u0001"+ + "\u0000\u0000\u0000\u0289\u028a\u0006\u000b\u0000\u0000\u028a\u028b\u0006"+ + "\u000b\u0001\u0000\u028b\"\u0001\u0000\u0000\u0000\u028c\u028d\u0005@"+ + "\u0000\u0000\u028d\u028e\u0007\u0003\u0000\u0000\u028e\u028f\u0007\t\u0000"+ + "\u0000\u028f\u0290\u0007\n\u0000\u0000\u0290\u02ad\u0007\u0003\u0000\u0000"+ + "\u0291\u0292\u0005@\u0000\u0000\u0292\u0293\u0007\u0005\u0000\u0000\u0293"+ + "\u0294\u0007\n\u0000\u0000\u0294\u0295\u0007\u0002\u0000\u0000\u0295\u02ad"+ + "\u0007\u0000\u0000\u0000\u0296\u0297\u0005@\u0000\u0000\u0297\u0298\u0007"+ + "\u0011\u0000\u0000\u0298\u0299\u0007\u0003\u0000\u0000\u0299\u029a\u0007"+ + "\u0000\u0000\u0000\u029a\u029b\u0007\u0004\u0000\u0000\u029b\u029c\u0007"+ + "\u000e\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u02ad\u0007\u000b"+ + "\u0000\u0000\u029e\u029f\u0005@\u0000\u0000\u029f\u02a0\u0007\u0004\u0000"+ + "\u0000\u02a0\u02a1\u0007\r\u0000\u0000\u02a1\u02a2\u0007\r\u0000\u0000"+ + "\u02a2\u02a3\u0007\u0003\u0000\u0000\u02a3\u02a4\u0007\f\u0000\u0000\u02a4"+ + "\u02ad\u0007\u0011\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6\u02a7"+ + "\u0007\r\u0000\u0000\u02a7\u02a8\u0007\u0004\u0000\u0000\u02a8\u02a9\u0007"+ + "\u0002\u0000\u0000\u02a9\u02aa\u0007\u0003\u0000\u0000\u02aa\u02ab\u0007"+ + "\f\u0000\u0000\u02ab\u02ad\u0007\u000b\u0000\u0000\u02ac\u028c\u0001\u0000"+ + "\u0000\u0000\u02ac\u0291\u0001\u0000\u0000\u0000\u02ac\u0296\u0001\u0000"+ + "\u0000\u0000\u02ac\u029e\u0001\u0000\u0000\u0000\u02ac\u02a5\u0001\u0000"+ + "\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae\u02af\u0006\f\u0001"+ + "\u0000\u02af$\u0001\u0000\u0000\u0000\u02b0\u02b1\u0005@\u0000\u0000\u02b1"+ + "\u02b2\u0007\r\u0000\u0000\u02b2\u02b3\u0007\u0006\u0000\u0000\u02b3\u02b4"+ + "\u0007\r\u0000\u0000\u02b4\u02b6\u0001\u0000\u0000\u0000\u02b5\u02b7\u0005"+ + " \u0000\u0000\u02b6\u02b5\u0001\u0000\u0000\u0000\u02b6\u02b7\u0001\u0000"+ + "\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000\u0000\u02b8\u02b9\u0004\r\u0001"+ + "\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u0006\r\u0003\u0000"+ + "\u02bb\u02bc\u0006\r\u0000\u0000\u02bc&\u0001\u0000\u0000\u0000\u02bd"+ + "\u02be\u0005@\u0000\u0000\u02be\u02bf\u0007\r\u0000\u0000\u02bf\u02c0"+ + "\u0007\u0006\u0000\u0000\u02c0\u02c1\u0007\r\u0000\u0000\u02c1\u02c2\u0001"+ + "\u0000\u0000\u0000\u02c2\u02c3\u0006\u000e\u0004\u0000\u02c3(\u0001\u0000"+ + "\u0000\u0000\u02c4\u02c5\u0005@\u0000\u0000\u02c5\u02c6\u0007\u0003\u0000"+ + "\u0000\u02c6\u02c7\u0007\f\u0000\u0000\u02c7\u02c8\u0007\u0011\u0000\u0000"+ + "\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca\u0003I\u001f\u0000\u02ca"+ + "\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cc\u0006\u000f\u0000\u0000\u02cc"+ + "\u02cd\u0006\u000f\u0001\u0000\u02cd*\u0001\u0000\u0000\u0000\u02ce\u02cf"+ + "\u0005@\u0000\u0000\u02cf\u02d0\u0007\t\u0000\u0000\u02d0\u02d1\u0007"+ + "\u0007\u0000\u0000\u02d1\u02d2\u0007\u0019\u0000\u0000\u02d2\u02d3\u0007"+ + "\u0003\u0000\u0000\u02d3\u02d4\u0007\b\u0000\u0000\u02d4\u02d5\u0007\u0007"+ + "\u0000\u0000\u02d5\u02d6\u0007\u0002\u0000\u0000\u02d6\u02d7\u0007\u0003"+ + "\u0000\u0000\u02d7\u02d8\u0007\n\u0000\u0000\u02d8\u02d9\u0007\u000b\u0000"+ + "\u0000\u02d9\u02da\u0007\u000f\u0000\u0000\u02da\u02db\u0007\t\u0000\u0000"+ + "\u02db\u02dc\u0007\u0003\u0000\u0000\u02dc\u0312\u0007\n\u0000\u0000\u02dd"+ + "\u02de\u0005@\u0000\u0000\u02de\u02df\u0007\u0016\u0000\u0000\u02df\u02e0"+ + "\u0007\u000e\u0000\u0000\u02e0\u02e1\u0007\u0017\u0000\u0000\u02e1\u02e2"+ + "\u0007\n\u0000\u0000\u02e2\u02e3\u0007\u000b\u0000\u0000\u02e3\u02e4\u0007"+ + "\u000f\u0000\u0000\u02e4\u02e5\u0007\t\u0000\u0000\u02e5\u02e6\u0007\u0003"+ + "\u0000\u0000\u02e6\u0312\u0007\n\u0000\u0000\u02e7\u02e8\u0005@\u0000"+ + "\u0000\u02e8\u02e9\u0007\t\u0000\u0000\u02e9\u02ea\u0007\u0007\u0000\u0000"+ + "\u02ea\u02eb\u0007\u0019\u0000\u0000\u02eb\u02ec\u0007\u0003\u0000\u0000"+ + "\u02ec\u02ed\u0007\b\u0000\u0000\u02ed\u02ee\u0007\u0007\u0000\u0000\u02ee"+ + "\u02ef\u0007\u0002\u0000\u0000\u02ef\u02f0\u0007\u0003\u0000\u0000\u02f0"+ + "\u02f1\u0007\n\u0000\u0000\u02f1\u02f2\u0007\u0005\u0000\u0000\u02f2\u02f3"+ + "\u0007\u0002\u0000\u0000\u02f3\u02f4\u0007\u0007\u0000\u0000\u02f4\u02f5"+ + "\u0007\r\u0000\u0000\u02f5\u02f6\u0007\u000b\u0000\u0000\u02f6\u0312\u0007"+ + "\n\u0000\u0000\u02f7\u02f8\u0005@\u0000\u0000\u02f8\u02f9\u0007\u0016"+ + "\u0000\u0000\u02f9\u02fa\u0007\u000e\u0000\u0000\u02fa\u02fb\u0007\u0017"+ + "\u0000\u0000\u02fb\u02fc\u0007\n\u0000\u0000\u02fc\u02fd\u0007\u0005\u0000"+ + "\u0000\u02fd\u02fe\u0007\u0002\u0000\u0000\u02fe\u02ff\u0007\u0007\u0000"+ + "\u0000\u02ff\u0300\u0007\r\u0000\u0000\u0300\u0301\u0007\u000b\u0000\u0000"+ + "\u0301\u0312\u0007\n\u0000\u0000\u0302\u0303\u0005@\u0000\u0000\u0303"+ + "\u0304\u0007\u0005\u0000\u0000\u0304\u0305\u0007\t\u0000\u0000\u0305\u0306"+ + "\u0007\u0007\u0000\u0000\u0306\u0307\u0007\u0005\u0000\u0000\u0307\u0308"+ + "\u0007\u0017\u0000\u0000\u0308\u030e\u0001\u0000\u0000\u0000\u0309\u030a"+ + "\u0005.\u0000\u0000\u030a\u030b\u0007\u0004\u0000\u0000\u030b\u030c\u0007"+ + "\b\u0000\u0000\u030c\u030d\u0007\u0004\u0000\u0000\u030d\u030f\u0007\u000f"+ + "\u0000\u0000\u030e\u0309\u0001\u0000\u0000\u0000\u030e\u030f\u0001\u0000"+ + "\u0000\u0000\u030f\u0310\u0001\u0000\u0000\u0000\u0310\u0312\u0005=\u0000"+ + "\u0000\u0311\u02ce\u0001\u0000\u0000\u0000\u0311\u02dd\u0001\u0000\u0000"+ + "\u0000\u0311\u02e7\u0001\u0000\u0000\u0000\u0311\u02f7\u0001\u0000\u0000"+ + "\u0000\u0311\u0302\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000"+ + "\u0000\u0313\u0314\u0006\u0010\u0001\u0000\u0314,\u0001\u0000\u0000\u0000"+ + "\u0315\u0316\u0005@\u0000\u0000\u0316\u0317\u0007\u0019\u0000\u0000\u0317"+ + "\u0318\u0007\u0007\u0000\u0000\u0318\u0319\u0007\u000b\u0000\u0000\u0319"+ + "\u031a\u0007\u0003\u0000\u0000\u031a\u031b\u0001\u0000\u0000\u0000\u031b"+ + "\u031c\u0006\u0011\u0000\u0000\u031c\u031d\u0006\u0011\u0001\u0000\u031d"+ + ".\u0001\u0000\u0000\u0000\u031e\u031f\u0005@\u0000\u0000\u031f\u0320\u0003"+ + "I\u001f\u0000\u0320\u0321\u0004\u0012\u0002\u0000\u0321\u0322\u0001\u0000"+ + "\u0000\u0000\u0322\u0323\u0006\u0012\u0000\u0000\u03230\u0001\u0000\u0000"+ + "\u0000\u0324\u0325\u0005@\u0000\u0000\u0325\u0326\u0003I\u001f\u0000\u0326"+ + "2\u0001\u0000\u0000\u0000\u0327\u0329\u0005@\u0000\u0000\u0328\u032a\u0007"+ + "\u001b\u0000\u0000\u0329\u0328\u0001\u0000\u0000\u0000\u0329\u032a\u0001"+ + "\u0000\u0000\u0000\u032a4\u0001\u0000\u0000\u0000\u032b\u032c\u0005{\u0000"+ + "\u0000\u032c\u032d\u0005{\u0000\u0000\u032d\u032e\u0001\u0000\u0000\u0000"+ + "\u032e\u032f\u0006\u0015\u0005\u0000\u032f\u0330\u0006\u0015\u0006\u0000"+ + "\u03306\u0001\u0000\u0000\u0000\u0331\u0332\u0005{\u0000\u0000\u0332\u0333"+ + "\u0005!\u0000\u0000\u0333\u0334\u0005!\u0000\u0000\u0334\u0335\u0001\u0000"+ + "\u0000\u0000\u0335\u0336\u0006\u0016\u0007\u0000\u0336\u0337\u0006\u0016"+ + "\b\u0000\u03378\u0001\u0000\u0000\u0000\u0338\u0339\u0005/\u0000\u0000"+ + "\u0339\u033a\u0005*\u0000\u0000\u033a\u033e\u0001\u0000\u0000\u0000\u033b"+ + "\u033d\t\u0000\u0000\u0000\u033c\u033b\u0001\u0000\u0000\u0000\u033d\u0340"+ + "\u0001\u0000\u0000\u0000\u033e\u033f\u0001\u0000\u0000\u0000\u033e\u033c"+ + "\u0001\u0000\u0000\u0000\u033f\u0341\u0001\u0000\u0000\u0000\u0340\u033e"+ + "\u0001\u0000\u0000\u0000\u0341\u0342\u0005*\u0000\u0000\u0342\u0346\u0005"+ + "/\u0000\u0000\u0343\u0344\u0005/\u0000\u0000\u0344\u0346\u0005/\u0000"+ + "\u0000\u0345\u0338\u0001\u0000\u0000\u0000\u0345\u0343\u0001\u0000\u0000"+ + "\u0000\u0346\u0347\u0001\u0000\u0000\u0000\u0347\u0348\u0006\u0017\t\u0000"+ + "\u0348:\u0001\u0000\u0000\u0000\u0349\u034a\u0005<\u0000\u0000\u034a\u034b"+ + "\u0007\u0015\u0000\u0000\u034b\u034c\u0005-\u0000\u0000\u034c\u034d\u0001"+ + "\u0000\u0000\u0000\u034d\u0359\u0003\u000f\u0002\u0000\u034e\u034f\u0005"+ + "<\u0000\u0000\u034f\u0354\u0003\u000f\u0002\u0000\u0350\u0351\u0005:\u0000"+ + "\u0000\u0351\u0352\u0005:\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000"+ + "\u0353\u0355\u0003\u000f\u0002\u0000\u0354\u0350\u0001\u0000\u0000\u0000"+ + "\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0354\u0001\u0000\u0000\u0000"+ + "\u0356\u0357\u0001\u0000\u0000\u0000\u0357\u0359\u0001\u0000\u0000\u0000"+ + "\u0358\u0349\u0001\u0000\u0000\u0000\u0358\u034e\u0001\u0000\u0000\u0000"+ + "\u0359\u035a\u0001\u0000\u0000\u0000\u035a\u035b\u0006\u0018\t\u0000\u035b"+ + "\u035c\u0006\u0018\n\u0000\u035c<\u0001\u0000\u0000\u0000\u035d\u035e"+ + "\u0005<\u0000\u0000\u035e\u035f\u0005/\u0000\u0000\u035f\u0360\u0001\u0000"+ + "\u0000\u0000\u0360\u0361\u0003M!\u0000\u0361\u0365\u0005>\u0000\u0000"+ + "\u0362\u0364\u0007\u001c\u0000\u0000\u0363\u0362\u0001\u0000\u0000\u0000"+ + "\u0364\u0367\u0001\u0000\u0000\u0000\u0365\u0363\u0001\u0000\u0000\u0000"+ + "\u0365\u0366\u0001\u0000\u0000\u0000\u0366\u0369\u0001\u0000\u0000\u0000"+ + "\u0367\u0365\u0001\u0000\u0000\u0000\u0368\u035d\u0001\u0000\u0000\u0000"+ + "\u0369\u036a\u0001\u0000\u0000\u0000\u036a\u0368\u0001\u0000\u0000\u0000"+ + "\u036a\u036b\u0001\u0000\u0000\u0000\u036b\u036c\u0001\u0000\u0000\u0000"+ + "\u036c\u036d\u0006\u0019\t\u0000\u036d>\u0001\u0000\u0000\u0000\u036e"+ + "\u0370\u0005 \u0000\u0000\u036f\u036e\u0001\u0000\u0000\u0000\u0370\u0371"+ + "\u0001\u0000\u0000\u0000\u0371\u036f\u0001\u0000\u0000\u0000\u0371\u0372"+ + "\u0001\u0000\u0000\u0000\u0372\u0388\u0001\u0000\u0000\u0000\u0373\u0375"+ + "\u0007\u001d\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375\u0376"+ + "\u0001\u0000\u0000\u0000\u0376\u0374\u0001\u0000\u0000\u0000\u0376\u0377"+ + "\u0001\u0000\u0000\u0000\u0377\u0388\u0001\u0000\u0000\u0000\u0378\u0388"+ + "\u0003\u000f\u0002\u0000\u0379\u0388\u0003\u0011\u0003\u0000\u037a\u037b"+ + "\u0005\"\u0000\u0000\u037b\u0388\u0004\u001a\u0003\u0000\u037c\u037d\u0005"+ + "\\\u0000\u0000\u037d\u037e\u0005\'\u0000\u0000\u037e\u037f\u0001\u0000"+ + "\u0000\u0000\u037f\u0388\u0004\u001a\u0004\u0000\u0380\u0388\u0007\u001e"+ + "\u0000\u0000\u0381\u0383\u0007\u001f\u0000\u0000\u0382\u0381\u0001\u0000"+ + "\u0000\u0000\u0383\u0384\u0001\u0000\u0000\u0000\u0384\u0382\u0001\u0000"+ + "\u0000\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385\u0388\u0001\u0000"+ + "\u0000\u0000\u0386\u0388\u0007 \u0000\u0000\u0387\u036f\u0001\u0000\u0000"+ + "\u0000\u0387\u0374\u0001\u0000\u0000\u0000\u0387\u0378\u0001\u0000\u0000"+ + "\u0000\u0387\u0379\u0001\u0000\u0000\u0000\u0387\u037a\u0001\u0000\u0000"+ + "\u0000\u0387\u037c\u0001\u0000\u0000\u0000\u0387\u0380\u0001\u0000\u0000"+ + "\u0000\u0387\u0382\u0001\u0000\u0000\u0000\u0387\u0386\u0001\u0000\u0000"+ + "\u0000\u0388\u038b\u0001\u0000\u0000\u0000\u0389\u0387\u0001\u0000\u0000"+ + "\u0000\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u038c\u0001\u0000\u0000"+ + "\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038c\u038d\u0005<\u0000\u0000"+ + "\u038d\u038e\u0004\u001a\u0005\u0000\u038e\u038f\u0001\u0000\u0000\u0000"+ + "\u038f\u0390\u0006\u001a\u000b\u0000\u0390\u0391\u0006\u001a\f\u0000\u0391"+ + "@\u0001\u0000\u0000\u0000\u0392\u0394\u0005 \u0000\u0000\u0393\u0392\u0001"+ + "\u0000\u0000\u0000\u0394\u0395\u0001\u0000\u0000\u0000\u0395\u0393\u0001"+ + "\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u03ae\u0001"+ + "\u0000\u0000\u0000\u0397\u0399\u0007\u001d\u0000\u0000\u0398\u0397\u0001"+ + "\u0000\u0000\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u0398\u0001"+ + "\u0000\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u03ae\u0001"+ + "\u0000\u0000\u0000\u039c\u039e\u0007!\u0000\u0000\u039d\u039c\u0001\u0000"+ + "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039f\u0001\u0000"+ + "\u0000\u0000\u039f\u03ae\u0003\u000f\u0002\u0000\u03a0\u03ae\u0003\u0011"+ + "\u0003\u0000\u03a1\u03a2\u0005\"\u0000\u0000\u03a2\u03ae\u0004\u001b\u0006"+ + "\u0000\u03a3\u03ae\u0005,\u0000\u0000\u03a4\u03a5\u0005\\\u0000\u0000"+ + "\u03a5\u03ae\u0005\'\u0000\u0000\u03a6\u03ae\u0007\"\u0000\u0000\u03a7"+ + "\u03a9\u0007\u001f\u0000\u0000\u03a8\u03a7\u0001\u0000\u0000\u0000\u03a9"+ + "\u03aa\u0001\u0000\u0000\u0000\u03aa\u03a8\u0001\u0000\u0000\u0000\u03aa"+ + "\u03ab\u0001\u0000\u0000\u0000\u03ab\u03ae\u0001\u0000\u0000\u0000\u03ac"+ + "\u03ae\u0007 \u0000\u0000\u03ad\u0393\u0001\u0000\u0000\u0000\u03ad\u0398"+ + "\u0001\u0000\u0000\u0000\u03ad\u039d\u0001\u0000\u0000\u0000\u03ad\u03a0"+ + "\u0001\u0000\u0000\u0000\u03ad\u03a1\u0001\u0000\u0000\u0000\u03ad\u03a3"+ + "\u0001\u0000\u0000\u0000\u03ad\u03a4\u0001\u0000\u0000\u0000\u03ad\u03a6"+ + "\u0001\u0000\u0000\u0000\u03ad\u03a8\u0001\u0000\u0000\u0000\u03ad\u03ac"+ + "\u0001\u0000\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03ad"+ + "\u0001\u0000\u0000\u0000\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1"+ + "\u0001\u0000\u0000\u0000\u03b1\u03b2\u0006\u001b\t\u0000\u03b2B\u0001"+ + "\u0000\u0000\u0000\u03b3\u03b5\u0005 \u0000\u0000\u03b4\u03b3\u0001\u0000"+ + "\u0000\u0000\u03b5\u03b6\u0001\u0000\u0000\u0000\u03b6\u03b4\u0001\u0000"+ + "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03be\u0001\u0000"+ + "\u0000\u0000\u03b8\u03ba\u0007\u001d\u0000\u0000\u03b9\u03b8\u0001\u0000"+ + "\u0000\u0000\u03ba\u03bb\u0001\u0000\u0000\u0000\u03bb\u03b9\u0001\u0000"+ + "\u0000\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03be\u0001\u0000"+ + "\u0000\u0000\u03bd\u03b4\u0001\u0000\u0000\u0000\u03bd\u03b9\u0001\u0000"+ + "\u0000\u0000\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u03c0\u0006\u001c"+ + "\t\u0000\u03c0D\u0001\u0000\u0000\u0000\u03c1\u03c2\u0005{\u0000\u0000"+ + "\u03c2\u03c7\u0005!\u0000\u0000\u03c3\u03c4\u0005{\u0000\u0000\u03c4\u03c5"+ + "\u0005{\u0000\u0000\u03c5\u03c7\u0005-\u0000\u0000\u03c6\u03c1\u0001\u0000"+ + "\u0000\u0000\u03c6\u03c3\u0001\u0000\u0000\u0000\u03c7\u03c8\u0001\u0000"+ + "\u0000\u0000\u03c8\u03c9\u0006\u001d\t\u0000\u03c9F\u0001\u0000\u0000"+ + "\u0000\u03ca\u03cb\t\u0000\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000"+ + "\u03cc\u03cd\u0006\u001e\t\u0000\u03cdH\u0001\u0000\u0000\u0000\u03ce"+ + "\u03d2\u0007\u0013\u0000\u0000\u03cf\u03d1\u0007#\u0000\u0000\u03d0\u03cf"+ + "\u0001\u0000\u0000\u0000\u03d1\u03d4\u0001\u0000\u0000\u0000\u03d2\u03d0"+ + "\u0001\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3J\u0001"+ + "\u0000\u0000\u0000\u03d4\u03d2\u0001\u0000\u0000\u0000\u03d5\u03d9\u0007"+ + "$\u0000\u0000\u03d6\u03d8\u0007%\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ + "\u0000\u03d8\u03db\u0001\u0000\u0000\u0000\u03d9\u03d7\u0001\u0000\u0000"+ + "\u0000\u03d9\u03da\u0001\u0000\u0000\u0000\u03daL\u0001\u0000\u0000\u0000"+ + "\u03db\u03d9\u0001\u0000\u0000\u0000\u03dc\u03e0\u0007\u0013\u0000\u0000"+ + "\u03dd\u03df\u0007&\u0000\u0000\u03de\u03dd\u0001\u0000\u0000\u0000\u03df"+ + "\u03e2\u0001\u0000\u0000\u0000\u03e0\u03de\u0001\u0000\u0000\u0000\u03e0"+ + "\u03e1\u0001\u0000\u0000\u0000\u03e1N\u0001\u0000\u0000\u0000\u03e2\u03e0"+ + "\u0001\u0000\u0000\u0000\u03e3\u03e4\u0007\'\u0000\u0000\u03e4P\u0001"+ + "\u0000\u0000\u0000\u03e5\u03ea\u0005\"\u0000\u0000\u03e6\u03e9\u0003O"+ + "\"\u0000\u03e7\u03e9\t\u0000\u0000\u0000\u03e8\u03e6\u0001\u0000\u0000"+ + "\u0000\u03e8\u03e7\u0001\u0000\u0000\u0000\u03e9\u03ec\u0001\u0000\u0000"+ + "\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03ea\u03e8\u0001\u0000\u0000"+ + "\u0000\u03eb\u03ed\u0001\u0000\u0000\u0000\u03ec\u03ea\u0001\u0000\u0000"+ + "\u0000\u03ed\u03ee\u0005\"\u0000\u0000\u03eeR\u0001\u0000\u0000\u0000"+ + "\u03ef\u03f5\u0005\'\u0000\u0000\u03f0\u03f4\b(\u0000\u0000\u03f1\u03f2"+ + "\u0005\\\u0000\u0000\u03f2\u03f4\t\u0000\u0000\u0000\u03f3\u03f0\u0001"+ + "\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000\u0000\u0000\u03f4\u03f7\u0001"+ + "\u0000\u0000\u0000\u03f5\u03f3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0001"+ + "\u0000\u0000\u0000\u03f6\u03f8\u0001\u0000\u0000\u0000\u03f7\u03f5\u0001"+ + "\u0000\u0000\u0000\u03f8\u03f9\u0005\'\u0000\u0000\u03f9T\u0001\u0000"+ + "\u0000\u0000\u03fa\u03fb\u0005/\u0000\u0000\u03fb\u03fc\u0005/\u0000\u0000"+ + "\u03fc\u0400\u0001\u0000\u0000\u0000\u03fd\u03ff\b\u001d\u0000\u0000\u03fe"+ + "\u03fd\u0001\u0000\u0000\u0000\u03ff\u0402\u0001\u0000\u0000\u0000\u0400"+ + "\u03fe\u0001\u0000\u0000\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401"+ + "V\u0001\u0000\u0000\u0000\u0402\u0400\u0001\u0000\u0000\u0000\u0403\u0404"+ + "\u0005$\u0000\u0000\u0404\u0405\u0003I\u001f\u0000\u0405X\u0001\u0000"+ + "\u0000\u0000\u0406\u0407\u0007\u0004\u0000\u0000\u0407\u0408\u0007\u0002"+ + "\u0000\u0000\u0408\u0409\u0007\u0002\u0000\u0000\u0409\u040a\u0007\u0004"+ + "\u0000\u0000\u040a\u0419\u0007\u000f\u0000\u0000\u040b\u040c\u0007\u0005"+ + "\u0000\u0000\u040c\u040d\u0007\t\u0000\u0000\u040d\u040e\u0007\u0004\u0000"+ + "\u0000\u040e\u040f\u0007\n\u0000\u0000\u040f\u0419\u0007\n\u0000\u0000"+ + "\u0410\u0411\u0007\u0003\u0000\u0000\u0411\u0412\u0007\u0012\u0000\u0000"+ + "\u0412\u0413\u0007\r\u0000\u0000\u0413\u0414\u0007\u000b\u0000\u0000\u0414"+ + "\u0419\u0007\u000f\u0000\u0000\u0415\u0416\u0007\u000e\u0000\u0000\u0416"+ + "\u0417\u0007\n\u0000\u0000\u0417\u0419\u0007\u0003\u0000\u0000\u0418\u0406"+ + "\u0001\u0000\u0000\u0000\u0418\u040b\u0001\u0000\u0000\u0000\u0418\u0410"+ + "\u0001\u0000\u0000\u0000\u0418\u0415\u0001\u0000\u0000\u0000\u0419Z\u0001"+ + "\u0000\u0000\u0000\u041a\u041b\u000209\u0000\u041b\\\u0001\u0000\u0000"+ + "\u0000\u041c\u041d\u0005{\u0000\u0000\u041d\u041e\u0005{\u0000\u0000\u041e"+ + "\u041f\u0005-\u0000\u0000\u041f\u0420\u0005-\u0000\u0000\u0420\u0421\u0001"+ + "\u0000\u0000\u0000\u0421\u0422\u0006)\r\u0000\u0422^\u0001\u0000\u0000"+ + "\u0000\u0423\u0424\u0005@\u0000\u0000\u0424\u0425\u0003M!\u0000\u0425"+ + "\u0426\u0005.\u0000\u0000\u0426\u0427\u0001\u0000\u0000\u0000\u0427\u0428"+ + "\u0006*\t\u0000\u0428`\u0001\u0000\u0000\u0000\u0429\u042e\u0005@\u0000"+ + "\u0000\u042a\u042c\u0003[(\u0000\u042b\u042d\u0005.\u0000\u0000\u042c"+ + "\u042b\u0001\u0000\u0000\u0000\u042c\u042d\u0001\u0000\u0000\u0000\u042d"+ + "\u042f\u0001\u0000\u0000\u0000\u042e\u042a\u0001\u0000\u0000\u0000\u042f"+ + "\u0430\u0001\u0000\u0000\u0000\u0430\u042e\u0001\u0000\u0000\u0000\u0430"+ + "\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0001\u0000\u0000\u0000\u0432"+ + "\u0433\u0006+\t\u0000\u0433b\u0001\u0000\u0000\u0000\u0434\u0435\u0005"+ + "{\u0000\u0000\u0435\u0436\u0005{\u0000\u0000\u0436\u056a\u0005{\u0000"+ + "\u0000\u0437\u0438\u0005@\u0000\u0000\u0438\u0439\u0005@\u0000\u0000\u0439"+ + "\u043b\u0001\u0000\u0000\u0000\u043a\u043c\u0005@\u0000\u0000\u043b\u043a"+ + "\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000\u043c\u056a"+ + "\u0001\u0000\u0000\u0000\u043d\u043e\u0005@\u0000\u0000\u043e\u043f\u0005"+ + "{\u0000\u0000\u043f\u0441\u0001\u0000\u0000\u0000\u0440\u0442\u0005{\u0000"+ + "\u0000\u0441\u0440\u0001\u0000\u0000\u0000\u0441\u0442\u0001\u0000\u0000"+ + "\u0000\u0442\u056a\u0001\u0000\u0000\u0000\u0443\u0444\u0005@\u0000\u0000"+ + "\u0444\u0445\u0007\u0012\u0000\u0000\u0445\u0446\u0007\u0003\u0000\u0000"+ + "\u0446\u0447\u0007\u0011\u0000\u0000\u0447\u0448\u0007\u0007\u0000\u0000"+ + "\u0448\u0449\u0007\u0004\u0000\u0000\u0449\u044b\u0001\u0000\u0000\u0000"+ + "\u044a\u044c\u0007)\u0000\u0000\u044b\u044a\u0001\u0000\u0000\u0000\u044c"+ + "\u044d\u0001\u0000\u0000\u0000\u044d\u044b\u0001\u0000\u0000\u0000\u044d"+ + "\u044e\u0001\u0000\u0000\u0000\u044e\u0460\u0001\u0000\u0000\u0000\u044f"+ + "\u0450\u0007\n\u0000\u0000\u0450\u0451\u0007\u0005\u0000\u0000\u0451\u0452"+ + "\u0007\u0002\u0000\u0000\u0452\u0453\u0007\u0003\u0000\u0000\u0453\u0454"+ + "\u0007\u0003\u0000\u0000\u0454\u0455\u0007\f\u0000\u0000\u0455\u0457\u0001"+ + "\u0000\u0000\u0000\u0456\u0458\u0007)\u0000\u0000\u0457\u0456\u0001\u0000"+ + "\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u0457\u0001\u0000"+ + "\u0000\u0000\u0459\u045a\u0001\u0000\u0000\u0000\u045a\u045e\u0001\u0000"+ + "\u0000\u0000\u045b\u045c\u0007\u0004\u0000\u0000\u045c\u045d\u0007\f\u0000"+ + "\u0000\u045d\u045f\u0007\u0011\u0000\u0000\u045e\u045b\u0001\u0000\u0000"+ + "\u0000\u045e\u045f\u0001\u0000\u0000\u0000\u045f\u0461\u0001\u0000\u0000"+ + "\u0000\u0460\u044f\u0001\u0000\u0000\u0000\u0460\u0461\u0001\u0000\u0000"+ + "\u0000\u0461\u056a\u0001\u0000\u0000\u0000\u0462\u0463\u0005@\u0000\u0000"+ + "\u0463\u0464\u0007\u0005\u0000\u0000\u0464\u0465\u0007\u0006\u0000\u0000"+ + "\u0465\u0466\u0007\u0004\u0000\u0000\u0466\u0467\u0007\u0002\u0000\u0000"+ + "\u0467\u0468\u0007\n\u0000\u0000\u0468\u0469\u0007\u0003\u0000\u0000\u0469"+ + "\u0562\u0007\u000b\u0000\u0000\u046a\u046b\u0005@\u0000\u0000\u046b\u046c"+ + "\u0007\u0007\u0000\u0000\u046c\u046d\u0007\u0012\u0000\u0000\u046d\u046e"+ + "\u0007\r\u0000\u0000\u046e\u046f\u0007\u0001\u0000\u0000\u046f\u0470\u0007"+ + "\u0002\u0000\u0000\u0470\u0562\u0007\u000b\u0000\u0000\u0471\u0472\u0005"+ + "@\u0000\u0000\u0472\u0473\u0007\f\u0000\u0000\u0473\u0474\u0007\u0004"+ + "\u0000\u0000\u0474\u0475\u0007\u0012\u0000\u0000\u0475\u0476\u0007\u0003"+ + "\u0000\u0000\u0476\u0477\u0007\n\u0000\u0000\u0477\u0478\u0007\r\u0000"+ + "\u0000\u0478\u0479\u0007\u0004\u0000\u0000\u0479\u047a\u0007\u0005\u0000"+ + "\u0000\u047a\u0562\u0007\u0003\u0000\u0000\u047b\u047c\u0005@\u0000\u0000"+ + "\u047c\u047d\u0007\u0011\u0000\u0000\u047d\u047e\u0007\u0001\u0000\u0000"+ + "\u047e\u047f\u0007\u0005\u0000\u0000\u047f\u0480\u0007\u000e\u0000\u0000"+ + "\u0480\u0481\u0007\u0012\u0000\u0000\u0481\u0482\u0007\u0003\u0000\u0000"+ + "\u0482\u0483\u0007\f\u0000\u0000\u0483\u0562\u0007\u000b\u0000\u0000\u0484"+ + "\u0485\u0005@\u0000\u0000\u0485\u0486\u0007\u0000\u0000\u0000\u0486\u0487"+ + "\u0007\u0001\u0000\u0000\u0487\u0488\u0007\f\u0000\u0000\u0488\u0489\u0007"+ + "\u000b\u0000\u0000\u0489\u048a\u0005-\u0000\u0000\u048a\u048b\u0007\u0000"+ + "\u0000\u0000\u048b\u048c\u0007\u0004\u0000\u0000\u048c\u048d\u0007\u0005"+ + "\u0000\u0000\u048d\u0562\u0007\u0003\u0000\u0000\u048e\u048f\u0005@\u0000"+ + "\u0000\u048f\u0490\u0007\r\u0000\u0000\u0490\u0491\u0007\u0004\u0000\u0000"+ + "\u0491\u0492\u0007\u0010\u0000\u0000\u0492\u0562\u0007\u0003\u0000\u0000"+ + "\u0493\u0494\u0005@\u0000\u0000\u0494\u0495\u0007\t\u0000\u0000\u0495"+ + "\u0496\u0007\u0004\u0000\u0000\u0496\u0497\u0007\u000f\u0000\u0000\u0497"+ + "\u0498\u0007\u0003\u0000\u0000\u0498\u0562\u0007\u0002\u0000\u0000\u0499"+ + "\u049a\u0005@\u0000\u0000\u049a\u049b\u0007\n\u0000\u0000\u049b\u049c"+ + "\u0007\u000e\u0000\u0000\u049c\u049d\u0007\r\u0000\u0000\u049d\u049e\u0007"+ + "\r\u0000\u0000\u049e\u049f\u0007\u0001\u0000\u0000\u049f\u04a0\u0007\u0002"+ + "\u0000\u0000\u04a0\u04a1\u0007\u000b\u0000\u0000\u04a1\u0562\u0007\n\u0000"+ + "\u0000\u04a2\u04a3\u0005@\u0000\u0000\u04a3\u04a4\u0007\u000b\u0000\u0000"+ + "\u04a4\u04a5\u0007\u0004\u0000\u0000\u04a5\u04a6\u0007\u0007\u0000\u0000"+ + "\u04a6\u04a7\u0007\t\u0000\u0000\u04a7\u04a8\u0007\b\u0000\u0000\u04a8"+ + "\u04a9\u0007\u0007\u0000\u0000\u04a9\u04aa\u0007\f\u0000\u0000\u04aa\u0562"+ + "\u0007\u0011\u0000\u0000\u04ab\u04ac\u0005@\u0000\u0000\u04ac\u04ad\u0007"+ + "\u0004\u0000\u0000\u04ad\u04ae\u0007\r\u0000\u0000\u04ae\u04af\u0007\r"+ + "\u0000\u0000\u04af\u04b0\u0007\t\u0000\u0000\u04b0\u0562\u0007\u000f\u0000"+ + "\u0000\u04b1\u04b2\u0005@\u0000\u0000\u04b2\u04b3\u0005-\u0000\u0000\u04b3"+ + "\u04b4\u0007\b\u0000\u0000\u04b4\u04b5\u0007\u0003\u0000\u0000\u04b5\u04b6"+ + "\u0007\u0016\u0000\u0000\u04b6\u04b7\u0007\u0017\u0000\u0000\u04b7\u04b8"+ + "\u0007\u0007\u0000\u0000\u04b8\u04b9\u0007\u000b\u0000\u0000\u04b9\u04ba"+ + "\u0005-\u0000\u0000\u04ba\u04bb\u0007\u0017\u0000\u0000\u04bb\u04bc\u0007"+ + "\u0003\u0000\u0000\u04bc\u04bd\u0007\u000f\u0000\u0000\u04bd\u04be\u0007"+ + "\u0000\u0000\u0000\u04be\u04bf\u0007\u0002\u0000\u0000\u04bf\u04c0\u0007"+ + "\u0004\u0000\u0000\u04c0\u04c1\u0007\u0012\u0000\u0000\u04c1\u04c2\u0007"+ + "\u0003\u0000\u0000\u04c2\u0562\u0007\n\u0000\u0000\u04c3\u04c4\u0005@"+ + "\u0000\u0000\u04c4\u04c5\u0007\u0017\u0000\u0000\u04c5\u04c6\u0007\u0003"+ + "\u0000\u0000\u04c6\u04c7\u0007\u000f\u0000\u0000\u04c7\u04c8\u0007\u0000"+ + "\u0000\u0000\u04c8\u04c9\u0007\u0002\u0000\u0000\u04c9\u04ca\u0007\u0004"+ + "\u0000\u0000\u04ca\u04cb\u0007\u0012\u0000\u0000\u04cb\u04cc\u0007\u0003"+ + "\u0000\u0000\u04cc\u0562\u0007\n\u0000\u0000\u04cd\u04ce\u0005@\u0000"+ + "\u0000\u04ce\u04cf\u0007\u0005\u0000\u0000\u04cf\u04d0\u0007\u0001\u0000"+ + "\u0000\u04d0\u04d1\u0007\u000e\u0000\u0000\u04d1\u04d2\u0007\f\u0000\u0000"+ + "\u04d2\u04d3\u0007\u000b\u0000\u0000\u04d3\u04d4\u0007\u0003\u0000\u0000"+ + "\u04d4\u04d5\u0007\u0002\u0000\u0000\u04d5\u04d6\u0005-\u0000\u0000\u04d6"+ + "\u04d7\u0007\n\u0000\u0000\u04d7\u04d8\u0007\u000b\u0000\u0000\u04d8\u04d9"+ + "\u0007\u000f\u0000\u0000\u04d9\u04da\u0007\t\u0000\u0000\u04da\u0562\u0007"+ + "\u0003\u0000\u0000\u04db\u04dc\u0005@\u0000\u0000\u04dc\u04dd\u0007\u0000"+ + "\u0000\u0000\u04dd\u04de\u0007\u0001\u0000\u0000\u04de\u04df\u0007\f\u0000"+ + "\u0000\u04df\u04e0\u0007\u000b\u0000\u0000\u04e0\u04e1\u0005-\u0000\u0000"+ + "\u04e1\u04e2\u0007\u0000\u0000\u0000\u04e2\u04e3\u0007\u0003\u0000\u0000"+ + "\u04e3\u04e4\u0007\u0004\u0000\u0000\u04e4\u04e5\u0007\u000b\u0000\u0000"+ + "\u04e5\u04e6\u0007\u000e\u0000\u0000\u04e6\u04e7\u0007\u0002\u0000\u0000"+ + "\u04e7\u04e8\u0007\u0003\u0000\u0000\u04e8\u04e9\u0005-\u0000\u0000\u04e9"+ + "\u04ea\u0007\u0019\u0000\u0000\u04ea\u04eb\u0007\u0004\u0000\u0000\u04eb"+ + "\u04ec\u0007\t\u0000\u0000\u04ec\u04ed\u0007\u000e\u0000\u0000\u04ed\u04ee"+ + "\u0007\u0003\u0000\u0000\u04ee\u0562\u0007\n\u0000\u0000\u04ef\u04f0\u0005"+ + "@\u0000\u0000\u04f0\u04f1\u0007\r\u0000\u0000\u04f1\u04f2\u0007\u0002"+ + "\u0000\u0000\u04f2\u04f3\u0007\u0001\u0000\u0000\u04f3\u04f4\u0007\r\u0000"+ + "\u0000\u04f4\u04f5\u0007\u0003\u0000\u0000\u04f5\u04f6\u0007\u0002\u0000"+ + "\u0000\u04f6\u04f7\u0007\u000b\u0000\u0000\u04f7\u0562\u0007\u000f\u0000"+ + "\u0000\u04f8\u04f9\u0005@\u0000\u0000\u04f9\u04fa\u0007\n\u0000\u0000"+ + "\u04fa\u04fb\u0007\u0005\u0000\u0000\u04fb\u04fc\u0007\u0001\u0000\u0000"+ + "\u04fc\u04fd\u0007\r\u0000\u0000\u04fd\u0562\u0007\u0003\u0000\u0000\u04fe"+ + "\u04ff\u0005@\u0000\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501"+ + "\u0007\u000b\u0000\u0000\u0501\u0502\u0007\u0004\u0000\u0000\u0502\u0503"+ + "\u0007\u0002\u0000\u0000\u0503\u0504\u0007\u000b\u0000\u0000\u0504\u0505"+ + "\u0007\u0007\u0000\u0000\u0505\u0506\u0007\f\u0000\u0000\u0506\u0507\u0007"+ + "\u0010\u0000\u0000\u0507\u0508\u0005-\u0000\u0000\u0508\u0509\u0007\n"+ + "\u0000\u0000\u0509\u050a\u0007\u000b\u0000\u0000\u050a\u050b\u0007\u000f"+ + "\u0000\u0000\u050b\u050c\u0007\t\u0000\u0000\u050c\u0562\u0007\u0003\u0000"+ + "\u0000\u050d\u050e\u0005@\u0000\u0000\u050e\u050f\u0007\n\u0000\u0000"+ + "\u050f\u0510\u0007\u000e\u0000\u0000\u0510\u0511\u0007\r\u0000\u0000\u0511"+ + "\u0512\u0007\r\u0000\u0000\u0512\u0513\u0007\u0001\u0000\u0000\u0513\u0514"+ + "\u0007\u0002\u0000\u0000\u0514\u0515\u0007\u000b\u0000\u0000\u0515\u0562"+ + "\u0007\n\u0000\u0000\u0516\u0517\u0005@\u0000\u0000\u0517\u0518\u0007"+ + "\u0019\u0000\u0000\u0518\u0519\u0007\u0007\u0000\u0000\u0519\u051a\u0007"+ + "\u0003\u0000\u0000\u051a\u051b\u0007\b\u0000\u0000\u051b\u051c\u0005-"+ + "\u0000\u0000\u051c\u051d\u0007\u000b\u0000\u0000\u051d\u051e\u0007\u0002"+ + "\u0000\u0000\u051e\u051f\u0007\u0004\u0000\u0000\u051f\u0520\u0007\f\u0000"+ + "\u0000\u0520\u0521\u0007\n\u0000\u0000\u0521\u0522\u0007\u0007\u0000\u0000"+ + "\u0522\u0523\u0007\u000b\u0000\u0000\u0523\u0524\u0007\u0007\u0000\u0000"+ + "\u0524\u0525\u0007\u0001\u0000\u0000\u0525\u0562\u0007\f\u0000\u0000\u0526"+ + "\u0527\u0005@\u0000\u0000\u0527\u0528\u0007\u0005\u0000\u0000\u0528\u0529"+ + "\u0007\u0001\u0000\u0000\u0529\u052a\u0007\f\u0000\u0000\u052a\u052b\u0007"+ + "\u000b\u0000\u0000\u052b\u052c\u0007\u0004\u0000\u0000\u052c\u052d\u0007"+ + "\u0007\u0000\u0000\u052d\u052e\u0007\f\u0000\u0000\u052e\u052f\u0007\u0003"+ + "\u0000\u0000\u052f\u0562\u0007\u0002\u0000\u0000\u0530\u0531\u0005@\u0000"+ + "\u0000\u0531\u0532\u0007\u0005\u0000\u0000\u0532\u0533\u0007\u0001\u0000"+ + "\u0000\u0533\u0534\u0007\t\u0000\u0000\u0534\u0535\u0007\u0001\u0000\u0000"+ + "\u0535\u0536\u0007\u0002\u0000\u0000\u0536\u0537\u0005-\u0000\u0000\u0537"+ + "\u0538\u0007\r\u0000\u0000\u0538\u0539\u0007\u0002\u0000\u0000\u0539\u053a"+ + "\u0007\u0001\u0000\u0000\u053a\u053b\u0007\u0000\u0000\u0000\u053b\u053c"+ + "\u0007\u0007\u0000\u0000\u053c\u053d\u0007\t\u0000\u0000\u053d\u0562\u0007"+ + "\u0003\u0000\u0000\u053e\u053f\u0005@\u0000\u0000\u053f\u0540\u0007\n"+ + "\u0000\u0000\u0540\u0541\u0007\u000b\u0000\u0000\u0541\u0542\u0007\u000f"+ + "\u0000\u0000\u0542\u0543\u0007\t\u0000\u0000\u0543\u0544\u0007\u0003\u0000"+ + "\u0000\u0544\u0545\u0007\n\u0000\u0000\u0545\u0546\u0007\u0003\u0000\u0000"+ + "\u0546\u0562\u0007\u000b\u0000\u0000\u0547\u0548\u0005@\u0000\u0000\u0548"+ + "\u0549\u0007\u0000\u0000\u0000\u0549\u054a\u0007\u0001\u0000\u0000\u054a"+ + "\u054b\u0007\f\u0000\u0000\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d"+ + "\u0005-\u0000\u0000\u054d\u054e\u0007\r\u0000\u0000\u054e\u054f\u0007"+ + "\u0004\u0000\u0000\u054f\u0550\u0007\t\u0000\u0000\u0550\u0551\u0007\u0003"+ + "\u0000\u0000\u0551\u0552\u0007\u000b\u0000\u0000\u0552\u0553\u0007\u000b"+ + "\u0000\u0000\u0553\u0554\u0007\u0003\u0000\u0000\u0554\u0555\u0005-\u0000"+ + "\u0000\u0555\u0556\u0007\u0019\u0000\u0000\u0556\u0557\u0007\u0004\u0000"+ + "\u0000\u0557\u0558\u0007\t\u0000\u0000\u0558\u0559\u0007\u000e\u0000\u0000"+ + "\u0559\u055a\u0007\u0003\u0000\u0000\u055a\u0562\u0007\n\u0000\u0000\u055b"+ + "\u055c\u0005@\u0000\u0000\u055c\u055d\u0007\u0012\u0000\u0000\u055d\u055e"+ + "\u0007\u0003\u0000\u0000\u055e\u055f\u0007\u0011\u0000\u0000\u055f\u0560"+ + "\u0007\u0007\u0000\u0000\u0560\u0562\u0007\u0004\u0000\u0000\u0561\u0462"+ + "\u0001\u0000\u0000\u0000\u0561\u046a\u0001\u0000\u0000\u0000\u0561\u0471"+ + "\u0001\u0000\u0000\u0000\u0561\u047b\u0001\u0000\u0000\u0000\u0561\u0484"+ + "\u0001\u0000\u0000\u0000\u0561\u048e\u0001\u0000\u0000\u0000\u0561\u0493"+ + "\u0001\u0000\u0000\u0000\u0561\u0499\u0001\u0000\u0000\u0000\u0561\u04a2"+ + "\u0001\u0000\u0000\u0000\u0561\u04ab\u0001\u0000\u0000\u0000\u0561\u04b1"+ + "\u0001\u0000\u0000\u0000\u0561\u04c3\u0001\u0000\u0000\u0000\u0561\u04cd"+ + "\u0001\u0000\u0000\u0000\u0561\u04db\u0001\u0000\u0000\u0000\u0561\u04ef"+ + "\u0001\u0000\u0000\u0000\u0561\u04f8\u0001\u0000\u0000\u0000\u0561\u04fe"+ + "\u0001\u0000\u0000\u0000\u0561\u050d\u0001\u0000\u0000\u0000\u0561\u0516"+ + "\u0001\u0000\u0000\u0000\u0561\u0526\u0001\u0000\u0000\u0000\u0561\u0530"+ + "\u0001\u0000\u0000\u0000\u0561\u053e\u0001\u0000\u0000\u0000\u0561\u0547"+ + "\u0001\u0000\u0000\u0000\u0561\u055b\u0001\u0000\u0000\u0000\u0562\u0566"+ + "\u0001\u0000\u0000\u0000\u0563\u0565\u0007)\u0000\u0000\u0564\u0563\u0001"+ + "\u0000\u0000\u0000\u0565\u0568\u0001\u0000\u0000\u0000\u0566\u0564\u0001"+ + "\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u056a\u0001"+ + "\u0000\u0000\u0000\u0568\u0566\u0001\u0000\u0000\u0000\u0569\u0434\u0001"+ + "\u0000\u0000\u0000\u0569\u0437\u0001\u0000\u0000\u0000\u0569\u043d\u0001"+ + "\u0000\u0000\u0000\u0569\u0443\u0001\u0000\u0000\u0000\u0569\u0561\u0001"+ + "\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b\u056c\u0006"+ + ",\t\u0000\u056cd\u0001\u0000\u0000\u0000\u056d\u056e\t\u0000\u0000\u0000"+ + "\u056e\u056f\u0004-\u0007\u0000\u056f\u0570\u0001\u0000\u0000\u0000\u0570"+ + "\u0571\u0006-\u000e\u0000\u0571\u0572\u0006-\u000f\u0000\u0572f\u0001"+ + "\u0000\u0000\u0000\u0573\u0574\t\u0000\u0000\u0000\u0574\u0575\u0001\u0000"+ + "\u0000\u0000\u0575\u0576\u0006.\f\u0000\u0576h\u0001\u0000\u0000\u0000"+ + "\u0577\u0578\u0005\u0000\u0000\u0001\u0578\u0579\u0001\u0000\u0000\u0000"+ + "\u0579\u057a\u0006/\u000e\u0000\u057a\u057b\u0006/\u000f\u0000\u057bj"+ + "\u0001\u0000\u0000\u0000\u057c\u057d\u0005}\u0000\u0000\u057d\u057e\u0005"+ + "}\u0000\u0000\u057e\u057f\u0001\u0000\u0000\u0000\u057f\u0580\u00060\u000f"+ + "\u0000\u0580\u0581\u00060\u0006\u0000\u0581l\u0001\u0000\u0000\u0000\u0582"+ + "\u0584\b*\u0000\u0000\u0583\u0582\u0001\u0000\u0000\u0000\u0584\u0585"+ + "\u0001\u0000\u0000\u0000\u0585\u0583\u0001\u0000\u0000\u0000\u0585\u0586"+ + "\u0001\u0000\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0588"+ + "\u00061\u0010\u0000\u0588n\u0001\u0000\u0000\u0000\u0589\u058d\t\u0000"+ + "\u0000\u0000\u058a\u058c\u0007)\u0000\u0000\u058b\u058a\u0001\u0000\u0000"+ + "\u0000\u058c\u058f\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000\u0000"+ + "\u0000\u058d\u058e\u0001\u0000\u0000\u0000\u058e\u0590\u0001\u0000\u0000"+ + "\u0000\u058f\u058d\u0001\u0000\u0000\u0000\u0590\u0591\u00062\u0011\u0000"+ + "\u0591p\u0001\u0000\u0000\u0000\u0592\u0593\u0005\u0000\u0000\u0001\u0593"+ + "\u0594\u0001\u0000\u0000\u0000\u0594\u0595\u00063\u0012\u0000\u0595\u0596"+ + "\u00063\u000f\u0000\u0596r\u0001\u0000\u0000\u0000\u0597\u0598\u0005!"+ + "\u0000\u0000\u0598\u0599\u0005!\u0000\u0000\u0599\u059a\u0005}\u0000\u0000"+ + "\u059a\u059b\u0001\u0000\u0000\u0000\u059b\u059c\u00064\u000f\u0000\u059c"+ + "\u059d\u00064\b\u0000\u059dt\u0001\u0000\u0000\u0000\u059e\u05a0\b+\u0000"+ + "\u0000\u059f\u059e\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000"+ + "\u0000\u05a1\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000"+ + "\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3\u05a4\u00065\u0013\u0000"+ + "\u05a4v\u0001\u0000\u0000\u0000\u05a5\u05a9\t\u0000\u0000\u0000\u05a6"+ + "\u05a8\u0007)\u0000\u0000\u05a7\u05a6\u0001\u0000\u0000\u0000\u05a8\u05ab"+ + "\u0001\u0000\u0000\u0000\u05a9\u05a7\u0001\u0000\u0000\u0000\u05a9\u05aa"+ + "\u0001\u0000\u0000\u0000\u05aa\u05ac\u0001\u0000\u0000\u0000\u05ab\u05a9"+ + "\u0001\u0000\u0000\u0000\u05ac\u05ad\u00066\u0014\u0000\u05adx\u0001\u0000"+ + "\u0000\u0000\u05ae\u05af\u0005\u0000\u0000\u0001\u05af\u05b0\u0001\u0000"+ + "\u0000\u0000\u05b0\u05b1\u00067\u0012\u0000\u05b1\u05b2\u00067\u000f\u0000"+ + "\u05b2z\u0001\u0000\u0000\u0000\u05b3\u05b5\u0007)\u0000\u0000\u05b4\u05b3"+ + "\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b4"+ + "\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b8"+ + "\u0001\u0000\u0000\u0000\u05b8\u05b9\u00048\b\u0000\u05b9\u05ba\u0001"+ + "\u0000\u0000\u0000\u05ba\u05bb\u00068\u0015\u0000\u05bb|\u0001\u0000\u0000"+ + "\u0000\u05bc\u05bd\u0005(\u0000\u0000\u05bd\u05be\u00069\u0016\u0000\u05be"+ + "\u05bf\u0001\u0000\u0000\u0000\u05bf\u05c0\u00069\f\u0000\u05c0\u05c1"+ + "\u00069\u0015\u0000\u05c1~\u0001\u0000\u0000\u0000\u05c2\u05c3\u0003I"+ + "\u001f\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u05c5\u0006:\u0012"+ + "\u0000\u05c5\u05c6\u0006:\u000f\u0000\u05c6\u0080\u0001\u0000\u0000\u0000"+ + "\u05c7\u05c8\t\u0000\u0000\u0000\u05c8\u05c9\u0001\u0000\u0000\u0000\u05c9"+ + "\u05ca\u0006;\u0012\u0000\u05ca\u05cb\u0006;\u000f\u0000\u05cb\u0082\u0001"+ + "\u0000\u0000\u0000\u05cc\u05cd\u0004<\t\u0000\u05cd\u05ce\u0005(\u0000"+ + "\u0000\u05ce\u05cf\u0006<\u0017\u0000\u05cf\u05d0\u0006<\u0018\u0000\u05d0"+ + "\u0084\u0001\u0000\u0000\u0000\u05d1\u05d2\u0004=\n\u0000\u05d2\u05d3"+ + "\u0005)\u0000\u0000\u05d3\u05d4\u0006=\u0019\u0000\u05d4\u05d5\u0001\u0000"+ + "\u0000\u0000\u05d5\u05d6\u0006=\u001a\u0000\u05d6\u05d7\u0006=\u001b\u0000"+ + "\u05d7\u0086\u0001\u0000\u0000\u0000\u05d8\u05d9\u0004>\u000b\u0000\u05d9"+ + "\u05da\u0005(\u0000\u0000\u05da\u05db\u0006>\u001c\u0000\u05db\u05dc\u0006"+ + ">\u001d\u0000\u05dc\u0088\u0001\u0000\u0000\u0000\u05dd\u05de\u0004?\f"+ + "\u0000\u05de\u05df\u0005)\u0000\u0000\u05df\u05e0\u0006?\u001e\u0000\u05e0"+ + "\u05e1\u0006?\u001f\u0000\u05e1\u008a\u0001\u0000\u0000\u0000\u05e2\u05e3"+ + "\u0005)\u0000\u0000\u05e3\u05e4\u0004@\r\u0000\u05e4\u05e5\u0001\u0000"+ + "\u0000\u0000\u05e5\u05e6\u0006@\u001a\u0000\u05e6\u05e7\u0006@\u001b\u0000"+ + "\u05e7\u008c\u0001\u0000\u0000\u0000\u05e8\u05e9\u0005/\u0000\u0000\u05e9"+ + "\u05ea\u0005*\u0000\u0000\u05ea\u05ee\u0001\u0000\u0000\u0000\u05eb\u05ed"+ + "\t\u0000\u0000\u0000\u05ec\u05eb\u0001\u0000\u0000\u0000\u05ed\u05f0\u0001"+ + "\u0000\u0000\u0000\u05ee\u05ef\u0001\u0000\u0000\u0000\u05ee\u05ec\u0001"+ + "\u0000\u0000\u0000\u05ef\u05f1\u0001\u0000\u0000\u0000\u05f0\u05ee\u0001"+ + "\u0000\u0000\u0000\u05f1\u05f2\u0005*\u0000\u0000\u05f2\u05f3\u0005/\u0000"+ + "\u0000\u05f3\u05f4\u0001\u0000\u0000\u0000\u05f4\u05f5\u0006A \u0000\u05f5"+ + "\u008e\u0001\u0000\u0000\u0000\u05f6\u05f7\t\u0000\u0000\u0000\u05f7\u05f8"+ + "\u0006B!\u0000\u05f8\u0090\u0001\u0000\u0000\u0000\u05f9\u05fa\u0005\u0000"+ + "\u0000\u0001\u05fa\u05fb\u0001\u0000\u0000\u0000\u05fb\u05fc\u0006C\u0012"+ + "\u0000\u05fc\u05fd\u0006C\u001b\u0000\u05fd\u0092\u0001\u0000\u0000\u0000"+ + "\u05fe\u05ff\u0005@\u0000\u0000\u05ff\u0600\u0007\u0003\u0000\u0000\u0600"+ + "\u0601\u0007\f\u0000\u0000\u0601\u0602\u0007\u0011\u0000\u0000\u0602\u0603"+ + "\u0007\r\u0000\u0000\u0603\u0604\u0007\u0006\u0000\u0000\u0604\u0605\u0007"+ + "\r\u0000\u0000\u0605\u0606\u0001\u0000\u0000\u0000\u0606\u0607\u0006D"+ + "\u000f\u0000\u0607\u0094\u0001\u0000\u0000\u0000\u0608\u0609\t\u0000\u0000"+ + "\u0000\u0609\u060a\u0004E\u000e\u0000\u060a\u060b\u0001\u0000\u0000\u0000"+ + "\u060b\u060c\u0006E\"\u0000\u060c\u0096\u0001\u0000\u0000\u0000\u060d"+ + "\u060e\t\u0000\u0000\u0000\u060e\u060f\u0001\u0000\u0000\u0000\u060f\u0610"+ + "\u0006F\f\u0000\u0610\u0098\u0001\u0000\u0000\u0000\u0611\u0612\u0005"+ + "\u0000\u0000\u0001\u0612\u0613\u0001\u0000\u0000\u0000\u0613\u0614\u0006"+ + "G\u0012\u0000\u0614\u0615\u0006G\u000f\u0000\u0615\u009a\u0001\u0000\u0000"+ + "\u0000\u0616\u0617\u0005@\u0000\u0000\u0617\u0618\u0007\u0003\u0000\u0000"+ + "\u0618\u0619\u0007\f\u0000\u0000\u0619\u061a\u0007\u0011\u0000\u0000\u061a"+ + "\u061b\u0007\u0019\u0000\u0000\u061b\u061c\u0007\u0003\u0000\u0000\u061c"+ + "\u061d\u0007\u0002\u0000\u0000\u061d\u061e\u0007\u0016\u0000\u0000\u061e"+ + "\u061f\u0007\u0004\u0000\u0000\u061f\u0620\u0007\u000b\u0000\u0000\u0620"+ + "\u0621\u0007\u0007\u0000\u0000\u0621\u0622\u0007\u0012\u0000\u0000\u0622"+ + "\u0623\u0001\u0000\u0000\u0000\u0623\u0624\u0006H\u0001\u0000\u0624\u0625"+ + "\u0006H\u000f\u0000\u0625\u009c\u0001\u0000\u0000\u0000\u0626\u0627\t"+ + "\u0000\u0000\u0000\u0627\u0628\u0004I\u000f\u0000\u0628\u0629\u0001\u0000"+ + "\u0000\u0000\u0629\u062a\u0006I\t\u0000\u062a\u009e\u0001\u0000\u0000"+ + "\u0000\u062b\u062c\t\u0000\u0000\u0000\u062c\u062d\u0001\u0000\u0000\u0000"+ + "\u062d\u062e\u0006J\f\u0000\u062e\u00a0\u0001\u0000\u0000\u0000\u062f"+ + "\u0630\u0005\u0000\u0000\u0001\u0630\u0631\u0001\u0000\u0000\u0000\u0631"+ + "\u0632\u0006K\u0012\u0000\u0632\u0633\u0006K\u000f\u0000\u0633\u00a2\u0001"+ + "\u0000\u0000\u0000\u0634\u0635\u0005:\u0000\u0000\u0635\u0636\u0003M!"+ + "\u0000\u0636\u0637\u0005=\u0000\u0000\u0637\u0638\u0005\"\u0000\u0000"+ + "\u0638\u0639\u0001\u0000\u0000\u0000\u0639\u063a\u0006L\t\u0000\u063a"+ + "\u063b\u0006L#\u0000\u063b\u00a4\u0001\u0000\u0000\u0000\u063c\u063d\u0005"+ + "{\u0000\u0000\u063d\u063e\u0005{\u0000\u0000\u063e\u063f\u0001\u0000\u0000"+ + "\u0000\u063f\u0640\u0006M\u0005\u0000\u0640\u0641\u0006M\u0006\u0000\u0641"+ + "\u00a6\u0001\u0000\u0000\u0000\u0642\u0643\u0005{\u0000\u0000\u0643\u0644"+ + "\u0005!\u0000\u0000\u0644\u0645\u0005!\u0000\u0000\u0645\u0646\u0001\u0000"+ + "\u0000\u0000\u0646\u0647\u0006N\u0007\u0000\u0647\u0648\u0006N\b\u0000"+ + "\u0648\u00a8\u0001\u0000\u0000\u0000\u0649\u064a\u0005>\u0000\u0000\u064a"+ + "\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0006O\t\u0000\u064c\u064d"+ + "\u0006O\u000f\u0000\u064d\u00aa\u0001\u0000\u0000\u0000\u064e\u064f\t"+ + "\u0000\u0000\u0000\u064f\u0650\u0001\u0000\u0000\u0000\u0650\u0651\u0006"+ + "P\t\u0000\u0651\u00ac\u0001\u0000\u0000\u0000\u0652\u0653\u0005\u0000"+ + "\u0000\u0001\u0653\u0654\u0001\u0000\u0000\u0000\u0654\u0655\u0006Q\u0012"+ + "\u0000\u0655\u0656\u0006Q\u000f\u0000\u0656\u00ae\u0001\u0000\u0000\u0000"+ + "\u0657\u0658\u0005\"\u0000\u0000\u0658\u0659\u0001\u0000\u0000\u0000\u0659"+ + "\u065a\u0006R\t\u0000\u065a\u065b\u0006R\u000f\u0000\u065b\u00b0\u0001"+ + "\u0000\u0000\u0000\u065c\u065d\t\u0000\u0000\u0000\u065d\u065e\u0004S"+ + "\u0010\u0000\u065e\u065f\u0001\u0000\u0000\u0000\u065f\u0660\u0006S\u001a"+ + "\u0000\u0660\u00b2\u0001\u0000\u0000\u0000\u0661\u0662\t\u0000\u0000\u0000"+ + "\u0662\u0663\u0001\u0000\u0000\u0000\u0663\u0664\u0006T\f\u0000\u0664"+ + "\u00b4\u0001\u0000\u0000\u0000\u0665\u0666\u0005\u0000\u0000\u0001\u0666"+ + "\u0667\u0001\u0000\u0000\u0000\u0667\u0668\u0006U\u0012\u0000\u0668\u0669"+ + "\u0006U\u000f\u0000\u0669\u00b6\u0001\u0000\u0000\u0000\u066a\u066c\u0005"+ + "{\u0000\u0000\u066b\u066d\u0007(\u0000\u0000\u066c\u066b\u0001\u0000\u0000"+ + "\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066e\u0001\u0000\u0000"+ + "\u0000\u066e\u0670\u0003M!\u0000\u066f\u0671\u0007(\u0000\u0000\u0670"+ + "\u066f\u0001\u0000\u0000\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671"+ + "\u0673\u0001\u0000\u0000\u0000\u0672\u0674\u0005:\u0000\u0000\u0673\u0672"+ + "\u0001\u0000\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675\u0673"+ + "\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000\u0000\u0676\u0678"+ + "\u0001\u0000\u0000\u0000\u0677\u0679\u0007(\u0000\u0000\u0678\u0677\u0001"+ + "\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679\u067b\u0001"+ + "\u0000\u0000\u0000\u067a\u067c\u0003M!\u0000\u067b\u067a\u0001\u0000\u0000"+ + "\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c\u067e\u0001\u0000\u0000"+ + "\u0000\u067d\u067f\u0007(\u0000\u0000\u067e\u067d\u0001\u0000\u0000\u0000"+ + "\u067e\u067f\u0001\u0000\u0000\u0000\u067f\u0696\u0001\u0000\u0000\u0000"+ + "\u0680\u0682\u0005,\u0000\u0000\u0681\u0683\u0007(\u0000\u0000\u0682\u0681"+ + "\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000\u0683\u0684"+ + "\u0001\u0000\u0000\u0000\u0684\u0686\u0003M!\u0000\u0685\u0687\u0007("+ + "\u0000\u0000\u0686\u0685\u0001\u0000\u0000\u0000\u0686\u0687\u0001\u0000"+ + "\u0000\u0000\u0687\u0689\u0001\u0000\u0000\u0000\u0688\u068a\u0005:\u0000"+ + "\u0000\u0689\u0688\u0001\u0000\u0000\u0000\u068a\u068b\u0001\u0000\u0000"+ + "\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068c\u0001\u0000\u0000"+ + "\u0000\u068c\u068e\u0001\u0000\u0000\u0000\u068d\u068f\u0007(\u0000\u0000"+ + "\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000\u0000\u0000"+ + "\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0692\u0003M!\u0000\u0691\u0693"+ + "\u0007(\u0000\u0000\u0692\u0691\u0001\u0000\u0000\u0000\u0692\u0693\u0001"+ + "\u0000\u0000\u0000\u0693\u0695\u0001\u0000\u0000\u0000\u0694\u0680\u0001"+ + "\u0000\u0000\u0000\u0695\u0698\u0001\u0000\u0000\u0000\u0696\u0694\u0001"+ + "\u0000\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u069a\u0001"+ + "\u0000\u0000\u0000\u0698\u0696\u0001\u0000\u0000\u0000\u0699\u069b\u0005"+ + ",\u0000\u0000\u069a\u0699\u0001\u0000\u0000\u0000\u069a\u069b\u0001\u0000"+ + "\u0000\u0000\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0005}\u0000"+ + "\u0000\u069d\u069e\u0001\u0000\u0000\u0000\u069e\u069f\u0006V\f\u0000"+ + "\u069f\u00b8\u0001\u0000\u0000\u0000\u06a0\u06a1\u0005{\u0000\u0000\u06a1"+ + "\u06a2\u0005$\u0000\u0000\u06a2\u06ab\u0003M!\u0000\u06a3\u06a4\u0005"+ + "[\u0000\u0000\u06a4\u06a5\u0007(\u0000\u0000\u06a5\u06a6\u0003M!\u0000"+ + "\u06a6\u06a7\u0007(\u0000\u0000\u06a7\u06a8\u0005]\u0000\u0000\u06a8\u06aa"+ + "\u0001\u0000\u0000\u0000\u06a9\u06a3\u0001\u0000\u0000\u0000\u06aa\u06ad"+ + "\u0001\u0000\u0000\u0000\u06ab\u06a9\u0001\u0000\u0000\u0000\u06ab\u06ac"+ + "\u0001\u0000\u0000\u0000\u06ac\u06ae\u0001\u0000\u0000\u0000\u06ad\u06ab"+ + "\u0001\u0000\u0000\u0000\u06ae\u06af\u0005:\u0000\u0000\u06af\u06b0\u0005"+ + ":\u0000\u0000\u06b0\u06b1\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003M!"+ + "\u0000\u06b2\u06b3\u0005}\u0000\u0000\u06b3\u06b4\u0001\u0000\u0000\u0000"+ + "\u06b4\u06b5\u0006W\f\u0000\u06b5\u00ba\u0001\u0000\u0000\u0000\u06b6"+ + "\u06b7\u0005{\u0000\u0000\u06b7\u06b8\u0005$\u0000\u0000\u06b8\u06c2\u0003"+ + "M!\u0000\u06b9\u06ba\u0005[\u0000\u0000\u06ba\u06bc\u0007(\u0000\u0000"+ + "\u06bb\u06bd\u0003M!\u0000\u06bc\u06bb\u0001\u0000\u0000\u0000\u06bc\u06bd"+ + "\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06bf"+ + "\u0007(\u0000\u0000\u06bf\u06c1\u0005]\u0000\u0000\u06c0\u06b9\u0001\u0000"+ + "\u0000\u0000\u06c1\u06c4\u0001\u0000\u0000\u0000\u06c2\u06c0\u0001\u0000"+ + "\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000\u0000\u06c3\u06cc\u0001\u0000"+ + "\u0000\u0000\u06c4\u06c2\u0001\u0000\u0000\u0000\u06c5\u06c6\u0005:\u0000"+ + "\u0000\u06c6\u06c8\u0005:\u0000\u0000\u06c7\u06c5\u0001\u0000\u0000\u0000"+ + "\u06c8\u06c9\u0001\u0000\u0000\u0000\u06c9\u06c7\u0001\u0000\u0000\u0000"+ + "\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000"+ + "\u06cb\u06cd\u0003M!\u0000\u06cc\u06c7\u0001\u0000\u0000\u0000\u06cc\u06cd"+ + "\u0001\u0000\u0000\u0000\u06cd\u06d2\u0001\u0000\u0000\u0000\u06ce\u06d0"+ + "\u0005:\u0000\u0000\u06cf\u06d1\u0003M!\u0000\u06d0\u06cf\u0001\u0000"+ + "\u0000\u0000\u06d0\u06d1\u0001\u0000\u0000\u0000\u06d1\u06d3\u0001\u0000"+ + "\u0000\u0000\u06d2\u06ce\u0001\u0000\u0000\u0000\u06d3\u06d4\u0001\u0000"+ + "\u0000\u0000\u06d4\u06d2\u0001\u0000\u0000\u0000\u06d4\u06d5\u0001\u0000"+ + "\u0000\u0000\u06d5\u06d6\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005}\u0000"+ + "\u0000\u06d7\u06db\u0001\u0000\u0000\u0000\u06d8\u06d9\u0005:\u0000\u0000"+ + "\u06d9\u06db\u0005$\u0000\u0000\u06da\u06b6\u0001\u0000\u0000\u0000\u06da"+ + "\u06d8\u0001\u0000\u0000\u0000\u06db\u06dc\u0001\u0000\u0000\u0000\u06dc"+ + "\u06dd\u0006X\u0012\u0000\u06dd\u00bc\u0001\u0000\u0000\u0000\u06de\u06df"+ + "\u0005\\\u0000\u0000\u06df\u06e0\u0005\"\u0000\u0000\u06e0\u06e1\u0001"+ + "\u0000\u0000\u0000\u06e1\u06e2\u0006Y\f\u0000\u06e2\u00be\u0001\u0000"+ + "\u0000\u0000\u06e3\u06e4\u0005\"\u0000\u0000\u06e4\u06e5\u0001\u0000\u0000"+ + "\u0000\u06e5\u06e6\u0006Z\f\u0000\u06e6\u06e7\u0006Z\u000f\u0000\u06e7"+ + "\u00c0\u0001\u0000\u0000\u0000\u06e8\u06e9\t\u0000\u0000\u0000\u06e9\u06ea"+ + "\u0001\u0000\u0000\u0000\u06ea\u06eb\u0006[\f\u0000\u06eb\u00c2\u0001"+ + "\u0000\u0000\u0000\u06ec\u06ed\u0005\u0000\u0000\u0001\u06ed\u06ee\u0001"+ + "\u0000\u0000\u0000\u06ee\u06ef\u0006\\\u0012\u0000\u06ef\u06f0\u0006\\"+ + "\u000f\u0000\u06f0\u00c4\u0001\u0000\u0000\u0000\u06f1\u06f2\u0005-\u0000"+ + "\u0000\u06f2\u06f3\u0005-\u0000\u0000\u06f3\u06f4\u0005}\u0000\u0000\u06f4"+ + "\u06f5\u0005}\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6\u06f7"+ + "\u0006]\u000f\u0000\u06f7\u00c6\u0001\u0000\u0000\u0000\u06f8\u06f9\t"+ + "\u0000\u0000\u0000\u06f9\u06fa\u0004^\u0011\u0000\u06fa\u06fb\u0001\u0000"+ + "\u0000\u0000\u06fb\u06fc\u0006^$\u0000\u06fc\u00c8\u0001\u0000\u0000\u0000"+ + "\u06fd\u06fe\t\u0000\u0000\u0000\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff"+ + "\u0700\u0006_\f\u0000\u0700\u00ca\u0001\u0000\u0000\u0000\u0701\u0702"+ + "\u0005\u0000\u0000\u0001\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0704"+ + "\u0006`$\u0000\u0704\u0705\u0006`\u000f\u0000\u0705\u00cc\u0001\u0000"+ + "\u0000\u0000c\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u00d5"+ + "\u0112\u0131\u014d\u0153\u015f\u016d\u0173\u0175\u0193\u0205\u020a\u0221"+ + "\u0250\u0287\u02ac\u02b6\u030e\u0311\u0329\u033e\u0345\u0356\u0358\u0365"+ + "\u036a\u0371\u0376\u0384\u0387\u0389\u0395\u039a\u039d\u03aa\u03ad\u03af"+ + "\u03b6\u03bb\u03bd\u03c6\u03d2\u03d9\u03e0\u03e8\u03ea\u03f3\u03f5\u0400"+ + "\u0418\u042c\u0430\u043b\u0441\u044d\u0459\u045e\u0460\u0561\u0566\u0569"+ + "\u0585\u058d\u05a1\u05a9\u05b6\u05ee\u066c\u0670\u0675\u0678\u067b\u067e"+ + "\u0682\u0686\u068b\u068e\u0692\u0696\u069a\u06ab\u06bc\u06c2\u06c9\u06cc"+ + "\u06d0\u06d4\u06da%\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ + "\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0005\u0000"+ + "\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005\b\u0000\u0005"+ + "\u0001\u0000\u0003\u0000\u0000\u0005\n\u0000\u0007\u0007\u0000\u0004\u0000"+ + "\u0000\u00011\u0000\u00012\u0001\u0007\b\u0000\u00015\u0002\u00016\u0003"+ + "\u0005\u0005\u0000\u00019\u0004\u0001<\u0005\u0001<\u0006\u0001=\u0007"+ + "\u0007\u0002\u0000\u0002\u0000\u0000\u0001>\b\u0001>\t\u0001?\n\u0001"+ + "?\u000b\u0006\u0000\u0000\u0001B\f\u0000\u0002\u0000\u0005\t\u0000\u0007"+ + "\t\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java index 3700e3d3786d..fa2bf4287735 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -719,7 +719,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } private static final String _serializedATNSegment0 = - "\u0004\u0000\u00ab\u0b4c\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\u0004\u0000\u00ab\u0b96\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ @@ -964,8 +964,9 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "}\u0001}\u0001}\u0003}\u07a9\b}\u0004}\u07ab\b}\u000b}\f}\u07ac\u0001"+ "}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u07b8"+ "\b~\u0001~\u0001~\u0001~\u0001~\u0003~\u07be\b~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07c8\b~\n~\f~\u07cb\t~\u0001~\u0003"+ - "~\u07ce\b~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0004~\u07c8\b~\u000b~\f~\u07c9\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0004~\u07d4\b~\u000b~\f~"+ + "\u07d5\u0001~\u0001~\u0001~\u0003~\u07db\b~\u0003~\u07dd\b~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ @@ -984,639 +985,645 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u0894\b~\u0001"+ - "~\u0005~\u0897\b~\n~\f~\u089a\t~\u0003~\u089c\b~\u0001~\u0001~\u0001\u007f"+ - "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ - "\u0001\u0080\u0001\u0081\u0003\u0081\u08a9\b\u0081\u0001\u0081\u0001\u0081"+ - "\u0001\u0081\u0004\u0081\u08ae\b\u0081\u000b\u0081\f\u0081\u08af\u0001"+ - "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+ - "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ - "\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ - "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ - "\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ - "\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ - "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08e1"+ - "\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0004\u008c\u08e6\b\u008c"+ - "\u000b\u008c\f\u008c\u08e7\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d"+ - "\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ - "\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091"+ - "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ - "\u0004\u0095\u0912\b\u0095\u000b\u0095\f\u0095\u0913\u0001\u0095\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0004\u0096\u091c"+ - "\b\u0096\u000b\u0096\f\u0096\u091d\u0001\u0096\u0001\u0096\u0001\u0097"+ - "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ - "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c"+ - "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ - "\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ - "\u0001\u00a0\u0001\u00a1\u0004\u00a1\u095b\b\u00a1\u000b\u00a1\f\u00a1"+ - "\u095c\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ - "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+ - "\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001"+ - "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0981"+ - "\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001"+ - "\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0003\u00ab\u098c\b\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ab\u0004\u00ab\u0991\b\u00ab\u000b\u00ab\f"+ - "\u00ab\u0992\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ - "\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ - "\u0004\u00b2\u09b2\b\u00b2\u000b\u00b2\f\u00b2\u09b3\u0001\u00b2\u0001"+ - "\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b5\u0004\u00b5\u09c4\b\u00b5\u000b\u00b5\f\u00b5\u09c5\u0001\u00b5"+ - "\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7"+ - "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ - "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ - "\u0003\u00bc\u09e1\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd"+ - "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be"+ - "\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf"+ - "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1"+ - "\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3"+ - "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4"+ - "\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5"+ - "\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7"+ - "\u0003\u00c7\u0a11\b\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ - "\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca"+ - "\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cc\u0001\u00cc\u0001\u00cc"+ - "\u0001\u00cd\u0004\u00cd\u0a24\b\u00cd\u000b\u00cd\f\u00cd\u0a25\u0001"+ - "\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00cf\u0001\u00cf\u0001"+ - "\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001"+ - "\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0004\u00d1\u0a39"+ - "\b\u00d1\u000b\u00d1\f\u00d1\u0a3a\u0001\u00d1\u0001\u00d1\u0001\u00d2"+ - "\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2\u0a43\b\u00d2\n\u00d2"+ - "\f\u00d2\u0a46\t\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ - "\u0005\u00d2\u0a4c\b\u00d2\n\u00d2\f\u00d2\u0a4f\t\u00d2\u0001\u00d2\u0001"+ - "\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001"+ - "\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001"+ - "\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001"+ - "\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001"+ - "\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001"+ - "\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9\u0a74\b\u00d9\u0001"+ - "\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001"+ - "\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001"+ - "\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001"+ - "\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001"+ - "\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a91\b\u00de\u0001\u00de\u0001"+ - "\u00de\u0001\u00de\u0004\u00de\u0a96\b\u00de\u000b\u00de\f\u00de\u0a97"+ - "\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df"+ - "\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1"+ - "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2"+ - "\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ - "\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001\u00e5"+ - "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ - "\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ - "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8\u0ac8\b\u00e8"+ - "\u000b\u00e8\f\u00e8\u0ac9\u0001\u00e8\u0001\u00e8\u0001\u00e9\u0001\u00e9"+ - "\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ad2\b\u00e9\n\u00e9\f\u00e9\u0ad5"+ - "\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ - "\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001"+ - "\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001"+ - "\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0003"+ - "\u00ee\u0aee\b\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef\u0001\u00ef\u0001"+ - "\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001"+ - "\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2\u0001\u00f2\u0001"+ - "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001"+ - "\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001"+ - "\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001"+ - "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001"+ - "\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0003~\u08de\b~\u0001~\u0005~\u08e1\b~\n~\f~\u08e4"+ + "\t~\u0003~\u08e6\b~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ + "\u0003\u0081\u08f3\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0004\u0081"+ + "\u08f8\b\u0081\u000b\u0081\f\u0081\u08f9\u0001\u0081\u0001\u0081\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ + "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ + "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u092b\b\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0004\u008c\u0930\b\u008c\u000b\u008c\f\u008c\u0931"+ + "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ + "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0004\u0095\u095c\b\u0095"+ + "\u000b\u0095\f\u0095\u095d\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0096\u0004\u0096\u0966\b\u0096\u000b\u0096\f\u0096"+ + "\u0967\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ + "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004"+ + "\u00a1\u09a5\b\u00a1\u000b\u00a1\f\u00a1\u09a6\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a8\u0001\u00a8\u0003\u00a8\u09cb\b\u00a8\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00ab\u0003\u00ab\u09d6\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0004\u00ab\u09db\b\u00ab\u000b\u00ab\f\u00ab\u09dc\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ + "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ + "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0004\u00b2\u09fc\b\u00b2\u000b"+ + "\u00b2\f\u00b2\u09fd\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0004\u00b5\u0a0e\b\u00b5\u000b"+ + "\u00b5\f\u00b5\u0a0f\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ + "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u0a2b\b\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ + "\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001"+ + "\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ + "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ + "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+ + "\u00c6\u0001\u00c7\u0001\u00c7\u0003\u00c7\u0a5b\b\u00c7\u0001\u00c8\u0001"+ + "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ + "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001"+ + "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0004\u00cd\u0a6e\b\u00cd\u000b"+ + "\u00cd\f\u00cd\u0a6f\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001"+ + "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001"+ + "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+ + "\u00d1\u0004\u00d1\u0a83\b\u00d1\u000b\u00d1\f\u00d1\u0a84\u0001\u00d1"+ + "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2"+ + "\u0a8d\b\u00d2\n\u00d2\f\u00d2\u0a90\t\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ + "\u00d2\u0001\u00d2\u0005\u00d2\u0a96\b\u00d2\n\u00d2\f\u00d2\u0a99\t\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ + "\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9"+ + "\u0abe\b\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da"+ + "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ + "\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ + "\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0adb\b\u00de"+ + "\u0001\u00de\u0001\u00de\u0001\u00de\u0004\u00de\u0ae0\b\u00de\u000b\u00de"+ + "\f\u00de\u0ae1\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8"+ + "\u0b12\b\u00e8\u000b\u00e8\f\u00e8\u0b13\u0001\u00e8\u0001\u00e8\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0b1c\b\u00e9\n"+ + "\u00e9\f\u00e9\u0b1f\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001"+ + "\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001"+ + "\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ + "\u00ee\u0001\u00ee\u0003\u00ee\u0b38\b\u00ee\u0001\u00ee\u0001\u00ee\u0001"+ + "\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001"+ + "\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001"+ + "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001"+ + "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ + "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ + "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001"+ + "\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001"+ - "\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa\u0001"+ - "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001"+ - "\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ - "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001"+ - "\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001"+ - "\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0003\u0765\u0a44"+ - "\u0ad3\u0000\u0100\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016"+ - "\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e\u001b \u001c\"\u001d"+ - "$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/H0J1L2N3P4R5T6V7X8Z9\\"+ - ":^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082M\u0084N\u0086O\u0088"+ - "P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096W\u0098X\u009aY\u009c"+ - "Z\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aaa\u00acb\u00aec\u00b0"+ - "d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci\u00bej\u00c0k\u00c2l"+ - "\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0\u00a4\u00d2r\u00d4"+ - "s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0\u0000\u00e2w\u00e4"+ - "x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2\u0000\u00f4\u0000"+ - "\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe\u0000\u0100\u0000"+ - "\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000\u010c\u0000\u010e"+ - "\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f\u0118\u00a6\u011a"+ - "\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000\u0124\u0000\u0126"+ - "\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000\u0130\u0000\u0132"+ - "\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084\u013c\u0000\u013e"+ - "\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a"+ - "\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154\u0000\u0156\u0000"+ - "\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160\u0000\u0162\u0000"+ - "\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c\u0087\u016e\u0088"+ - "\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178\u008a\u017a\u008b"+ - "\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184\u0000\u0186\u0000"+ - "\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190\u000f\u0192\u0090"+ - "\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c\u0011\u019e\u0000"+ - "\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8\u0094\u01aa\u0095"+ - "\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4\u0098\u01b6\u0000"+ - "\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0\u0000\u01c2\u0000"+ - "\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc\u0000\u01ce\u0000"+ - "\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8\u0000\u01da\u009a"+ - "\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4\u0000\u01e6\u0000"+ - "\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0\u0000\u01f2\u0000"+ - "\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc\u0000\u01fe\u0000"+ - "\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208\u00a0\u020a\u00a1"+ - "\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ - "\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000-.0:AZ__a"+ - "z\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ__az\u0080\u8000"+ - "\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ - "EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002\u0000DDdd\u0002"+ - "\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000"+ - "AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002\u0000YYyy\u0002"+ - "\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000"+ - "XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002\u0000QQqq\u0003"+ - "\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__az\u0080\u8000\ufffe"+ - "\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000"+ - "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0001"+ - "\u0000 \u0003\u0000\t\n\r\r \u0bac\u0000\u001a\u0001\u0000\u0000\u0000"+ - "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ - "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ - "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ - "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ - "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ - "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ - "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ - "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ - "@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001"+ - "\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000"+ - "\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000"+ - "N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001"+ - "\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000"+ - "\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000"+ - "\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001"+ - "\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000"+ - "\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000"+ - "j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001"+ - "\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000"+ - "\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000"+ - "x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001"+ - "\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000"+ - "\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000"+ - "\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000"+ - "\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000"+ - "\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000"+ - "\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000"+ - "\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000"+ - "\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000"+ - "\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000"+ - "\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000"+ - "\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000"+ - "\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000"+ - "\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000"+ - "\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000"+ - "\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000"+ - "\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000"+ - "\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000"+ - "\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000"+ - "\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000"+ - "\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000"+ - "\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000"+ - "\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000"+ - "\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000"+ - "\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000"+ - "\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000"+ - "\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000"+ - "\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000"+ - "\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000"+ - "\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000"+ - "\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000"+ - "\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001\u010c\u0001\u0000"+ - "\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001\u0110\u0001\u0000"+ - "\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001\u0114\u0001\u0000"+ - "\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001\u0118\u0001\u0000"+ - "\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001\u011c\u0001\u0000"+ - "\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001\u0120\u0001\u0000"+ - "\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002\u0124\u0001\u0000"+ - "\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002\u0128\u0001\u0000"+ - "\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002\u012c\u0001\u0000"+ - "\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002\u0130\u0001\u0000"+ - "\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002\u0134\u0001\u0000"+ - "\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003\u0138\u0001\u0000"+ - "\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003\u013c\u0001\u0000"+ - "\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003\u0140\u0001\u0000"+ - "\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004\u0144\u0001\u0000"+ - "\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004\u0148\u0001\u0000"+ - "\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004\u014c\u0001\u0000"+ - "\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005\u0150\u0001\u0000"+ - "\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005\u0154\u0001\u0000"+ - "\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006\u0158\u0001\u0000"+ - "\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006\u015c\u0001\u0000"+ - "\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006\u0160\u0001\u0000"+ - "\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006\u0164\u0001\u0000"+ - "\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006\u0168\u0001\u0000"+ - "\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006\u016c\u0001\u0000"+ - "\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006\u0170\u0001\u0000"+ - "\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007\u0174\u0001\u0000"+ - "\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178\u0001\u0000\u0000"+ - "\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001\u0000\u0000\u0000"+ - "\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000\u0000\u0000\b\u0182"+ - "\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000\u0000\b\u0186\u0001"+ - "\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000\b\u018a\u0001\u0000"+ - "\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e\u0001\u0000\u0000"+ - "\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001\u0000\u0000\u0000"+ - "\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000\u0000\u0000\t\u0198"+ - "\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000\u0000\t\u019c\u0001"+ - "\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000\t\u01a0\u0001\u0000"+ - "\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4\u0001\u0000\u0000"+ - "\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001\u0000\u0000\u0000"+ - "\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000\u0000\u0000\t\u01ae"+ - "\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000\u0000\n\u01b2\u0001"+ - "\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000\n\u01b6\u0001\u0000"+ - "\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba\u0001\u0000\u0000"+ - "\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001\u0000\u0000\u0000"+ - "\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000\u0000\u0000\n\u01c4"+ - "\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000\u0000\n\u01c8\u0001"+ - "\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000\n\u01cc\u0001\u0000"+ - "\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0\u0001\u0000\u0000"+ - "\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001\u0000\u0000\u0000"+ - "\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000\u0000\u0000\n\u01da"+ - "\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000\u0000\u000b\u01de"+ - "\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000\u0000\u000b\u01e2"+ - "\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000\u0000\u000b\u01e6"+ - "\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000\u0000\u000b\u01ea"+ - "\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000\u0000\u000b\u01ee"+ - "\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000\u0000\u000b\u01f2"+ - "\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000\u0000\u000b\u01f6"+ - "\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000\u0000\u000b\u01fa"+ - "\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000\u0000\f\u01fe\u0001"+ - "\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000\f\u0202\u0001\u0000"+ - "\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206\u0001\u0000\u0000"+ - "\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001\u0000\u0000\u0000"+ - "\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000\u0000\u0000\u0010"+ - "\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000\u0000\u0000\u0014"+ - "\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000\u0000\u0000\u0018"+ - "\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000\u0000\u0000\u001c"+ - "\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000\u0000\u0000 \u0294"+ - "\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000\u0000$\u02a5\u0001"+ - "\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000(\u02b6\u0001\u0000\u0000"+ - "\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001\u0000\u0000\u0000."+ - "\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000\u00002\u02fa\u0001"+ - "\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006\u0311\u0001\u0000\u0000"+ - "\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001\u0000\u0000\u0000<"+ - "\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000\u0000@\u0340\u0001"+ - "\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D\u0353\u0001\u0000\u0000"+ - "\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001\u0000\u0000\u0000J"+ - "\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000\u0000N\u0396\u0001"+ - "\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R\u03af\u0001\u0000\u0000"+ - "\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001\u0000\u0000\u0000X"+ - "\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000\u0000\\\u03e1"+ - "\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000`\u03ff\u0001\u0000"+ - "\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410\u0001\u0000\u0000\u0000"+ - "f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000\u0000\u0000j\u0427"+ - "\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000n\u0435\u0001\u0000"+ - "\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447\u0001\u0000\u0000\u0000"+ - "t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000\u0000\u0000x\u0462"+ - "\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000|\u0479\u0001\u0000"+ - "\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491\u0001\u0000\u0000"+ - "\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6\u0001\u0000\u0000"+ - "\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf\u0001\u0000\u0000"+ - "\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf\u0001\u0000\u0000"+ - "\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2\u0001\u0000\u0000"+ - "\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd\u0001\u0000\u0000"+ - "\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517\u0001\u0000\u0000"+ - "\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e\u0001\u0000\u0000"+ - "\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550\u0001\u0000\u0000"+ - "\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569\u0001\u0000\u0000"+ - "\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2\u0001\u0000\u0000"+ - "\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6\u0001\u0000\u0000"+ - "\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce\u0001\u0000\u0000"+ - "\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd\u0001\u0000\u0000"+ - "\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4\u0001\u0000\u0000"+ - "\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609\u0001\u0000\u0000"+ - "\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655\u0001\u0000\u0000"+ - "\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f\u0001\u0000\u0000"+ - "\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679\u0001\u0000\u0000"+ - "\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682\u0001\u0000\u0000"+ - "\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c\u0001\u0000\u0000"+ - "\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d\u0001\u0000\u0000"+ - "\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb\u0001\u0000\u0000"+ - "\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de\u0001\u0000\u0000"+ - "\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb\u0001\u0000\u0000"+ - "\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703\u0001\u0000\u0000"+ - "\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732\u0001\u0000\u0000"+ - "\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741\u0001\u0000\u0000"+ - "\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749\u0001\u0000\u0000"+ - "\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757\u0001\u0000\u0000"+ - "\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760\u0001\u0000\u0000"+ - "\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775\u0001\u0000\u0000"+ - "\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793\u0001\u0000\u0000"+ - "\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797\u0001\u0000\u0000"+ - "\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5\u0001\u0000\u0000"+ - "\u0000\u010a\u089b\u0001\u0000\u0000\u0000\u010c\u089f\u0001\u0000\u0000"+ - "\u0000\u010e\u08a3\u0001\u0000\u0000\u0000\u0110\u08a8\u0001\u0000\u0000"+ - "\u0000\u0112\u08b3\u0001\u0000\u0000\u0000\u0114\u08b7\u0001\u0000\u0000"+ - "\u0000\u0116\u08bc\u0001\u0000\u0000\u0000\u0118\u08c1\u0001\u0000\u0000"+ - "\u0000\u011a\u08c5\u0001\u0000\u0000\u0000\u011c\u08c9\u0001\u0000\u0000"+ - "\u0000\u011e\u08ce\u0001\u0000\u0000\u0000\u0120\u08d2\u0001\u0000\u0000"+ - "\u0000\u0122\u08d7\u0001\u0000\u0000\u0000\u0124\u08db\u0001\u0000\u0000"+ - "\u0000\u0126\u08e0\u0001\u0000\u0000\u0000\u0128\u08eb\u0001\u0000\u0000"+ - "\u0000\u012a\u08ef\u0001\u0000\u0000\u0000\u012c\u08f4\u0001\u0000\u0000"+ - "\u0000\u012e\u08fa\u0001\u0000\u0000\u0000\u0130\u08fe\u0001\u0000\u0000"+ - "\u0000\u0132\u0902\u0001\u0000\u0000\u0000\u0134\u0907\u0001\u0000\u0000"+ - "\u0000\u0136\u090b\u0001\u0000\u0000\u0000\u0138\u0911\u0001\u0000\u0000"+ - "\u0000\u013a\u091b\u0001\u0000\u0000\u0000\u013c\u0921\u0001\u0000\u0000"+ - "\u0000\u013e\u0926\u0001\u0000\u0000\u0000\u0140\u092c\u0001\u0000\u0000"+ - "\u0000\u0142\u0931\u0001\u0000\u0000\u0000\u0144\u0937\u0001\u0000\u0000"+ - "\u0000\u0146\u093e\u0001\u0000\u0000\u0000\u0148\u0944\u0001\u0000\u0000"+ - "\u0000\u014a\u094a\u0001\u0000\u0000\u0000\u014c\u0950\u0001\u0000\u0000"+ - "\u0000\u014e\u0954\u0001\u0000\u0000\u0000\u0150\u095a\u0001\u0000\u0000"+ - "\u0000\u0152\u0960\u0001\u0000\u0000\u0000\u0154\u0965\u0001\u0000\u0000"+ - "\u0000\u0156\u096a\u0001\u0000\u0000\u0000\u0158\u096f\u0001\u0000\u0000"+ - "\u0000\u015a\u0974\u0001\u0000\u0000\u0000\u015c\u0979\u0001\u0000\u0000"+ - "\u0000\u015e\u0980\u0001\u0000\u0000\u0000\u0160\u0982\u0001\u0000\u0000"+ - "\u0000\u0162\u0986\u0001\u0000\u0000\u0000\u0164\u098b\u0001\u0000\u0000"+ - "\u0000\u0166\u0996\u0001\u0000\u0000\u0000\u0168\u099a\u0001\u0000\u0000"+ - "\u0000\u016a\u099f\u0001\u0000\u0000\u0000\u016c\u09a4\u0001\u0000\u0000"+ - "\u0000\u016e\u09a7\u0001\u0000\u0000\u0000\u0170\u09ab\u0001\u0000\u0000"+ - "\u0000\u0172\u09b1\u0001\u0000\u0000\u0000\u0174\u09b7\u0001\u0000\u0000"+ - "\u0000\u0176\u09bd\u0001\u0000\u0000\u0000\u0178\u09c3\u0001\u0000\u0000"+ - "\u0000\u017a\u09c9\u0001\u0000\u0000\u0000\u017c\u09cc\u0001\u0000\u0000"+ - "\u0000\u017e\u09cf\u0001\u0000\u0000\u0000\u0180\u09d2\u0001\u0000\u0000"+ - "\u0000\u0182\u09d6\u0001\u0000\u0000\u0000\u0184\u09d9\u0001\u0000\u0000"+ - "\u0000\u0186\u09e0\u0001\u0000\u0000\u0000\u0188\u09e4\u0001\u0000\u0000"+ - "\u0000\u018a\u09e9\u0001\u0000\u0000\u0000\u018c\u09ed\u0001\u0000\u0000"+ - "\u0000\u018e\u09f2\u0001\u0000\u0000\u0000\u0190\u09f6\u0001\u0000\u0000"+ - "\u0000\u0192\u09f9\u0001\u0000\u0000\u0000\u0194\u09fc\u0001\u0000\u0000"+ - "\u0000\u0196\u0a01\u0001\u0000\u0000\u0000\u0198\u0a06\u0001\u0000\u0000"+ - "\u0000\u019a\u0a0b\u0001\u0000\u0000\u0000\u019c\u0a10\u0001\u0000\u0000"+ - "\u0000\u019e\u0a12\u0001\u0000\u0000\u0000\u01a0\u0a16\u0001\u0000\u0000"+ - "\u0000\u01a2\u0a19\u0001\u0000\u0000\u0000\u01a4\u0a1d\u0001\u0000\u0000"+ - "\u0000\u01a6\u0a1f\u0001\u0000\u0000\u0000\u01a8\u0a23\u0001\u0000\u0000"+ - "\u0000\u01aa\u0a29\u0001\u0000\u0000\u0000\u01ac\u0a2b\u0001\u0000\u0000"+ - "\u0000\u01ae\u0a2f\u0001\u0000\u0000\u0000\u01b0\u0a34\u0001\u0000\u0000"+ - "\u0000\u01b2\u0a3e\u0001\u0000\u0000\u0000\u01b4\u0a52\u0001\u0000\u0000"+ - "\u0000\u01b6\u0a5c\u0001\u0000\u0000\u0000\u01b8\u0a61\u0001\u0000\u0000"+ - "\u0000\u01ba\u0a65\u0001\u0000\u0000\u0000\u01bc\u0a69\u0001\u0000\u0000"+ - "\u0000\u01be\u0a6d\u0001\u0000\u0000\u0000\u01c0\u0a73\u0001\u0000\u0000"+ - "\u0000\u01c2\u0a77\u0001\u0000\u0000\u0000\u01c4\u0a7b\u0001\u0000\u0000"+ - "\u0000\u01c6\u0a83\u0001\u0000\u0000\u0000\u01c8\u0a8b\u0001\u0000\u0000"+ - "\u0000\u01ca\u0a90\u0001\u0000\u0000\u0000\u01cc\u0a9b\u0001\u0000\u0000"+ - "\u0000\u01ce\u0aa0\u0001\u0000\u0000\u0000\u01d0\u0aa4\u0001\u0000\u0000"+ - "\u0000\u01d2\u0aa9\u0001\u0000\u0000\u0000\u01d4\u0aad\u0001\u0000\u0000"+ - "\u0000\u01d6\u0ab1\u0001\u0000\u0000\u0000\u01d8\u0ab5\u0001\u0000\u0000"+ - "\u0000\u01da\u0aba\u0001\u0000\u0000\u0000\u01dc\u0abe\u0001\u0000\u0000"+ - "\u0000\u01de\u0ac3\u0001\u0000\u0000\u0000\u01e0\u0acd\u0001\u0000\u0000"+ - "\u0000\u01e2\u0adb\u0001\u0000\u0000\u0000\u01e4\u0adf\u0001\u0000\u0000"+ - "\u0000\u01e6\u0ae3\u0001\u0000\u0000\u0000\u01e8\u0ae7\u0001\u0000\u0000"+ - "\u0000\u01ea\u0aed\u0001\u0000\u0000\u0000\u01ec\u0af1\u0001\u0000\u0000"+ - "\u0000\u01ee\u0af5\u0001\u0000\u0000\u0000\u01f0\u0af9\u0001\u0000\u0000"+ - "\u0000\u01f2\u0afd\u0001\u0000\u0000\u0000\u01f4\u0b02\u0001\u0000\u0000"+ - "\u0000\u01f6\u0b07\u0001\u0000\u0000\u0000\u01f8\u0b0b\u0001\u0000\u0000"+ - "\u0000\u01fa\u0b0f\u0001\u0000\u0000\u0000\u01fc\u0b14\u0001\u0000\u0000"+ - "\u0000\u01fe\u0b18\u0001\u0000\u0000\u0000\u0200\u0b28\u0001\u0000\u0000"+ - "\u0000\u0202\u0b2d\u0001\u0000\u0000\u0000\u0204\u0b32\u0001\u0000\u0000"+ - "\u0000\u0206\u0b36\u0001\u0000\u0000\u0000\u0208\u0b3e\u0001\u0000\u0000"+ - "\u0000\u020a\u0b43\u0001\u0000\u0000\u0000\u020c\u0b47\u0001\u0000\u0000"+ - "\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211\u0007\u0001\u0000"+ - "\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214\u0001\u0000\u0000"+ - "\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213\u0001\u0000\u0000"+ - "\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000\u0000"+ - "\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215\u0001\u0000\u0000"+ - "\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218\u0001\u0000\u0000"+ - "\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b\u0007\u0003\u0000"+ - "\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e\u0001\u0000\u0000"+ - "\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d\u0001\u0000\u0000"+ - "\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c\u0001\u0000\u0000"+ - "\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216\u0001\u0000\u0000"+ - "\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011\u0001\u0000\u0000"+ - "\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005(\u0000\u0000\u0224"+ - "\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000\u0000\u0226\u0229"+ - "\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228"+ - "\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000\u0000\u0229\u0227"+ - "\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000\u022b\u022d\u0005"+ - " \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001\u0000"+ - "\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001\u0000"+ - "\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ - "\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a\u0001\u0000\u0000"+ - "\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000\u0000"+ - "\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a\u0001\u0000\u0000"+ - "\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239\u0005 \u0000\u0000"+ - "\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000"+ - "\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000"+ - "\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001\u0000\u0000\u0000"+ - "\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000\u0000\u023f\u023e"+ - "\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000\u0000\u0241\u023f"+ - "\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000\u0000\u0242\u0246"+ - "\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0244\u0245"+ - "\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000\u0246\u0244\u0001"+ - "\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0013\u0001"+ - "\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000\u0249\u0253\u0003"+ - "\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b\u024a\u0001\u0000"+ - "\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d\u024b\u0001\u0000"+ - "\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e\u0250\u0001\u0000"+ - "\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250\u0252\u0003\u0010"+ - "\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252\u0255\u0001\u0000"+ - "\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000"+ - "\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255\u0253\u0001\u0000"+ - "\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257\u026a\u0001\u0000"+ - "\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263\u0003\u0010\u0001"+ - "\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ - "\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001\u0000\u0000\u0000"+ - "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001\u0000\u0000\u0000"+ - "\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003\u0010\u0001\u0000"+ - "\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001\u0000\u0000\u0000"+ - "\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000"+ - "\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001\u0000\u0000\u0000"+ - "\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005\"\u0000\u0000\u0268"+ - "\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000\u0000\u0000\u0269"+ - "\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000\u0000\u0000\u026b"+ - "\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000\u026d\u026e\u0003"+ - "\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f\u0271\u0001\u0000"+ - "\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270\u0271\u0001\u0000"+ - "\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0005]\u0000"+ - "\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275\u0005\"\u0000\u0000"+ - "\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005\"\u0000\u0000\u0277"+ - "\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279"+ - "\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000\u0000\u027b\u027d"+ - "\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000\u0000\u027c\u0278"+ - "\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000\u0000\u027e\u027f"+ - "\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000\u0280\u0281\u0007"+ - "\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282\u0283\u0006"+ - "\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000\u0284\u0285\u0005"+ - "@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286\u0287\u0007\b"+ - "\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289\u0007\u0007\u0000"+ - "\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b\u0007\u0006\u0000"+ - "\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d\u0006\u0007\u0000"+ - "\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f\u0005@\u0000\u0000"+ - "\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007\b\u0000\u0000\u0291"+ - "\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007\u0000\u0000\u0293\u001f"+ - "\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000\u0000\u0295\u0296\u0007"+ - "\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000\u0297\u0298\u0007\u000b"+ - "\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000\u0299\u029a\u0007\u0006"+ - "\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b\u029c\u0005@\u0000\u0000"+ - "\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e\u0007\f\u0000\u0000\u029e"+ - "\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007\r\u0000\u0000\u02a0\u02a1"+ - "\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f\u0000\u0000\u02a2\u02a3"+ - "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001\u0000\u02a4#\u0001"+ - "\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6\u02a7\u0007\u000e"+ - "\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8\u02a9\u0007\t\u0000"+ - "\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000"+ - "\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001\u0000\u0000\u0000"+ - "\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b\u0000\u0000\u02af"+ - "\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006\u0000\u0000\u02b1"+ - "\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011\u0000\u0000\u02b3"+ - "\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000\u0000\u02b5\'\u0001"+ - "\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000\u02b7\u02b8\u0007\u0007"+ - "\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9\u02ba\u0007\u000b\u0000"+ - "\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc\u0007\f\u0000\u0000"+ - "\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007\r\u0000\u0000\u02be"+ - "\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f\u0000\u0000\u02c0"+ - ")\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000\u02c2\u02c3\u0007"+ - "\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000\u02c4\u02c5\u0007"+ - "\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6\u02c7\u0007\u0014"+ - "\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c9\u0006\u000e"+ - "\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb\u0005@\u0000\u0000"+ - "\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007\n\u0000\u0000\u02cd"+ - "\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007\u0000\u0000\u02cf"+ - "\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013\u0000\u0000\u02d1"+ - "\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000\u0000\u02d3-"+ - "\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5\u02d6\u0007"+ - "\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8\u0007\b"+ - "\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007\t\u0000"+ - "\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000\u0000"+ - "\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000\u02de"+ - "\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0\u02e2"+ - "\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db\u0001"+ - "\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4\u0006"+ - "\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005@\u0000"+ - "\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n\u0000\u0000"+ - "\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011\u0000\u0000"+ - "\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000\u0000\u02ec"+ - "\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000\u02ee\u02f9"+ - "\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0\u02f1\u0007"+ - "\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3\u0007\u000b"+ - "\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5\u0007\t\u0000"+ - "\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007\u0007\u0000\u0000"+ - "\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000\u0000\u0000\u02f8"+ - "\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000\u0000\u02fa\u02fb"+ - "\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000\u02fc\u02fd\u0007"+ - "\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000\u02fe\u02ff\u0007"+ - "\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000\u0300\u0301\u0007"+ - "\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000\u0302\u0303\u0001"+ - "\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000\u03043\u0001\u0000"+ - "\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307\u0007\u0007\u0000"+ - "\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007\u000b\u0000\u0000"+ - "\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007\u0015\u0000\u0000"+ - "\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007\u0007\u0000\u0000"+ - "\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007\u000e\u0000\u0000"+ - "\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000\u0000\u0000\u0311"+ - "\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000\u0000\u0313\u0314"+ - "\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000\u0000\u0315\u0316"+ - "\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001\u0000\u03177\u0001"+ - "\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319\u031a\u0007\u0007"+ - "\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c\u0007\u000b\u0000"+ - "\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e\u0007\u0015\u0000"+ - "\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001\u0000\u0000\u0000"+ - "\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006\u0000\u0000\u0322"+ - "\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016\u0000\u0000\u0324"+ - "\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000\u0000\u0326\u0327"+ - "\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000\u0328\u0329\u0001"+ - "\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000\u032a;\u0001\u0000"+ - "\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d\u0007\u0007\u0000"+ - "\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007\u000b\u0000\u0000"+ - "\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007\u0015\u0000\u0000"+ - "\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007\u0007\u0000\u0000"+ - "\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t\u0000\u0000\u0335"+ - "\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000\u0000\u0337\u0338"+ - "\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000\u0339\u033a\u0007"+ - "\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000\u033b\u033c\u0007"+ - "\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d\u033e\u0001\u0000"+ - "\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f?\u0001\u0000\u0000"+ - "\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007\u0007\u0000\u0000"+ - "\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b\u0000\u0000\u0344"+ - "\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000\u0000\u0346\u0347"+ - "\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000\u0348\u0349\u0007"+ - "\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a\u034b\u0005@\u0000"+ - "\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d\u0007\u0016\u0000"+ - "\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f\u0007\u0010\u0000"+ - "\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351\u0001\u0000\u0000"+ - "\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001\u0000\u0000\u0000"+ - "\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e\u0000\u0000\u0355"+ - "\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000\u0000\u0357\u0358"+ - "\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000\u0359\u035a\u0007"+ - "\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b\u035c\u0007\u0007"+ - "\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0006\u001b"+ - "\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360\u0005@\u0000\u0000"+ - "\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007\n\u0000\u0000\u0362"+ - "\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b\u0000\u0000\u0364\u0365"+ - "\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b\u0000\u0000\u0366\u0367"+ - "\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368\u0369"+ - "\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000\u0000\u036a\u036b\u0005"+ - "@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000\u036c\u036d\u0007\n"+ - "\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e\u036f\u0007\b\u0000"+ - "\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371\u0007\u000b\u0000"+ - "\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373\u0007\u0005\u0000"+ - "\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375\u0001\u0000\u0000"+ - "\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001\u0000\u0000\u0000"+ - "\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005\u0000\u0000\u0379"+ - "\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000\u0000\u037b\u037c"+ - "\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000\u037d\u037e\u0007"+ - "\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000\u037f\u0380\u0007"+ - "\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381\u0382\u0007\u0007"+ - "\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384\u0001\u0000\u0000"+ - "\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001\u0000\u0000\u0000"+ - "\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005\u0000\u0000\u0388"+ - "\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000\u0000\u038a\u038b"+ - "\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000\u038c\u038d\u0007"+ - "\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000\u038e\u038f\u0007"+ - "\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000\u0390\u0391\u0007"+ - "\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392\u0393\u0007\r"+ - "\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395\u0006\u001f"+ - "\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005@\u0000\u0000"+ - "\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n\u0000\u0000\u0399"+ - "\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000\u0000\u039b\u039c"+ - "\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000\u0000\u039d\u039e"+ - "\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000\u0000\u039f\u03a0"+ - "\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000\u03a1\u03a2\u0007"+ - "\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3\u03a4\u0007\t"+ - "\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0006 \u0003"+ - "\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@\u0000\u0000\u03a8"+ - "\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010\u0000\u0000\u03aa"+ - "\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f\u0000\u0000\u03ac"+ - "\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003\u0000\u03aeQ\u0001"+ - "\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0\u03b1\u0007\u0007"+ - "\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2\u03b3\u0007\r\u0000"+ - "\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5\u0007\n\u0000\u0000"+ - "\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007\t\u0000\u0000\u03b7"+ - "\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\"\u0003\u0000\u03b9S"+ - "\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000\u03bb\u03bc\u0007"+ - "\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd\u03be\u0001\u0000"+ - "\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001\u0000\u0000\u0000"+ - "\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a\u0000\u0000\u03c2"+ - "\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000\u0000\u03c4\u03c5"+ - "\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006"+ - "$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005@\u0000"+ - "\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007\u0007\u0000\u0000"+ - "\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007\r\u0000\u0000\u03cd"+ - "\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015\u0000\u0000\u03cf"+ - "\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1\u03d2"+ - "\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005@"+ - "\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6\u0007\u0010"+ - "\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007\t\u0000"+ - "\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e\u0000"+ - "\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000\u0000"+ - "\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000\u03de"+ - "\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0[\u0001"+ - "\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007\t"+ - "\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ + "\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001"+ + "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001"+ + "\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ + "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ + "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001"+ + "\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ + "\u00ff\u0003\u0765\u0a8e\u0b1d\u0000\u0100\u000e\u0000\u0010\u0000\u0012"+ + "\u0000\u0014\u0000\u0016\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e"+ + "\u001b \u001c\"\u001d$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/"+ + "H0J1L2N3P4R5T6V7X8Z9\\:^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082"+ + "M\u0084N\u0086O\u0088P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096"+ + "W\u0098X\u009aY\u009cZ\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aa"+ + "a\u00acb\u00aec\u00b0d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci"+ + "\u00bej\u00c0k\u00c2l\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0"+ + "\u00a4\u00d2r\u00d4s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0"+ + "\u0000\u00e2w\u00e4x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2"+ + "\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe"+ + "\u0000\u0100\u0000\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000"+ + "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f"+ + "\u0118\u00a6\u011a\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000"+ + "\u0124\u0000\u0126\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000"+ + "\u0130\u0000\u0132\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084"+ + "\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000"+ + "\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154"+ + "\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160"+ + "\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c"+ + "\u0087\u016e\u0088\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178"+ + "\u008a\u017a\u008b\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184"+ + "\u0000\u0186\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190"+ + "\u000f\u0192\u0090\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c"+ + "\u0011\u019e\u0000\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8"+ + "\u0094\u01aa\u0095\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4"+ + "\u0098\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0"+ + "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc"+ + "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8"+ + "\u0000\u01da\u009a\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4"+ + "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0"+ + "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ + "\u0000\u01fe\u0000\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208"+ + "\u00a0\u020a\u00a1\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005"+ + "\u0006\u0007\b\t\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006"+ + "\u0000-.0:AZ__az\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ_"+ + "_az\u0080\u8000\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000"+ + "FFff\u0002\u0000EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002"+ + "\u0000DDdd\u0002\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000"+ + "HHhh\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002"+ + "\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002"+ + "\u0000QQqq\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__a"+ + "z\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000"+ + "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ + "\u0000\"\"\\\\\u0001\u0000 \u0003\u0000\t\n\r\r \u0bfd\u0000\u001a\u0001"+ + "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ + "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ + "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ + "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ + "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ + "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ + "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ + "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ + "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ + "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ + "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ + "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ + "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ + "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ + "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ + "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ + "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ + "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ + "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ + "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ + "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ + "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ + "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ + "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ + "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ + "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ + "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ + "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ + "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ + "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ + "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ + "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ + "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ + "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ + "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ + "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ + "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ + "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ + "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ + "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ + "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ + "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ + "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ + "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ + "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ + "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ + "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ + "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ + "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ + "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ + "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ + "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001"+ + "\u010c\u0001\u0000\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001"+ + "\u0110\u0001\u0000\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001"+ + "\u0114\u0001\u0000\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001"+ + "\u0118\u0001\u0000\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001"+ + "\u011c\u0001\u0000\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001"+ + "\u0120\u0001\u0000\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002"+ + "\u0124\u0001\u0000\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002"+ + "\u0128\u0001\u0000\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002"+ + "\u012c\u0001\u0000\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002"+ + "\u0130\u0001\u0000\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002"+ + "\u0134\u0001\u0000\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003"+ + "\u0138\u0001\u0000\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003"+ + "\u013c\u0001\u0000\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003"+ + "\u0140\u0001\u0000\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004"+ + "\u0144\u0001\u0000\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004"+ + "\u0148\u0001\u0000\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004"+ + "\u014c\u0001\u0000\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005"+ + "\u0150\u0001\u0000\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005"+ + "\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006"+ + "\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006"+ + "\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006"+ + "\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006"+ + "\u0164\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006"+ + "\u0168\u0001\u0000\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006"+ + "\u016c\u0001\u0000\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006"+ + "\u0170\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007"+ + "\u0174\u0001\u0000\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178"+ + "\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001"+ + "\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000"+ + "\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000"+ + "\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000"+ + "\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e"+ + "\u0001\u0000\u0000\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001"+ + "\u0000\u0000\u0000\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000"+ + "\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000"+ + "\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000"+ + "\t\u01a0\u0001\u0000\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4"+ + "\u0001\u0000\u0000\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001"+ + "\u0000\u0000\u0000\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000"+ + "\u0000\u0000\t\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000"+ + "\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000"+ + "\n\u01b6\u0001\u0000\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba"+ + "\u0001\u0000\u0000\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001"+ + "\u0000\u0000\u0000\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000"+ + "\u0000\u0000\n\u01c4\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000"+ + "\u0000\n\u01c8\u0001\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000"+ + "\n\u01cc\u0001\u0000\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0"+ + "\u0001\u0000\u0000\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001"+ + "\u0000\u0000\u0000\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000"+ + "\u0000\u0000\n\u01da\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000"+ + "\u0000\u000b\u01de\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000"+ + "\u0000\u000b\u01e2\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000"+ + "\u0000\u000b\u01e6\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000"+ + "\u0000\u000b\u01ea\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000"+ + "\u0000\u000b\u01ee\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000"+ + "\u0000\u000b\u01f2\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000"+ + "\u0000\u000b\u01f6\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000"+ + "\u0000\u000b\u01fa\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000"+ + "\u0000\f\u01fe\u0001\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000"+ + "\f\u0202\u0001\u0000\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206"+ + "\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001"+ + "\u0000\u0000\u0000\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000"+ + "\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000"+ + "\u0000\u0000\u0014\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000"+ + "\u0000\u0000\u0018\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000"+ + "\u0000\u0000\u001c\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000"+ + "\u0000\u0000 \u0294\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000"+ + "\u0000$\u02a5\u0001\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000("+ + "\u02b6\u0001\u0000\u0000\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001"+ + "\u0000\u0000\u0000.\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000"+ + "\u00002\u02fa\u0001\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006"+ + "\u0311\u0001\u0000\u0000\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001"+ + "\u0000\u0000\u0000<\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000"+ + "\u0000@\u0340\u0001\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D"+ + "\u0353\u0001\u0000\u0000\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001"+ + "\u0000\u0000\u0000J\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000"+ + "\u0000N\u0396\u0001\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R"+ + "\u03af\u0001\u0000\u0000\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001"+ + "\u0000\u0000\u0000X\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000"+ + "\u0000\\\u03e1\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000"+ + "`\u03ff\u0001\u0000\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410"+ + "\u0001\u0000\u0000\u0000f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000"+ + "\u0000\u0000j\u0427\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000"+ + "n\u0435\u0001\u0000\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447"+ + "\u0001\u0000\u0000\u0000t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000"+ + "\u0000\u0000x\u0462\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000"+ + "|\u0479\u0001\u0000\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491"+ + "\u0001\u0000\u0000\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6"+ + "\u0001\u0000\u0000\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf"+ + "\u0001\u0000\u0000\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf"+ + "\u0001\u0000\u0000\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2"+ + "\u0001\u0000\u0000\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd"+ + "\u0001\u0000\u0000\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517"+ + "\u0001\u0000\u0000\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e"+ + "\u0001\u0000\u0000\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550"+ + "\u0001\u0000\u0000\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569"+ + "\u0001\u0000\u0000\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2"+ + "\u0001\u0000\u0000\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6"+ + "\u0001\u0000\u0000\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce"+ + "\u0001\u0000\u0000\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd"+ + "\u0001\u0000\u0000\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4"+ + "\u0001\u0000\u0000\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609"+ + "\u0001\u0000\u0000\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655"+ + "\u0001\u0000\u0000\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f"+ + "\u0001\u0000\u0000\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679"+ + "\u0001\u0000\u0000\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682"+ + "\u0001\u0000\u0000\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c"+ + "\u0001\u0000\u0000\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d"+ + "\u0001\u0000\u0000\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb"+ + "\u0001\u0000\u0000\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de"+ + "\u0001\u0000\u0000\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb"+ + "\u0001\u0000\u0000\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703"+ + "\u0001\u0000\u0000\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732"+ + "\u0001\u0000\u0000\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741"+ + "\u0001\u0000\u0000\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749"+ + "\u0001\u0000\u0000\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757"+ + "\u0001\u0000\u0000\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760"+ + "\u0001\u0000\u0000\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775"+ + "\u0001\u0000\u0000\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793"+ + "\u0001\u0000\u0000\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797"+ + "\u0001\u0000\u0000\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5"+ + "\u0001\u0000\u0000\u0000\u010a\u08e5\u0001\u0000\u0000\u0000\u010c\u08e9"+ + "\u0001\u0000\u0000\u0000\u010e\u08ed\u0001\u0000\u0000\u0000\u0110\u08f2"+ + "\u0001\u0000\u0000\u0000\u0112\u08fd\u0001\u0000\u0000\u0000\u0114\u0901"+ + "\u0001\u0000\u0000\u0000\u0116\u0906\u0001\u0000\u0000\u0000\u0118\u090b"+ + "\u0001\u0000\u0000\u0000\u011a\u090f\u0001\u0000\u0000\u0000\u011c\u0913"+ + "\u0001\u0000\u0000\u0000\u011e\u0918\u0001\u0000\u0000\u0000\u0120\u091c"+ + "\u0001\u0000\u0000\u0000\u0122\u0921\u0001\u0000\u0000\u0000\u0124\u0925"+ + "\u0001\u0000\u0000\u0000\u0126\u092a\u0001\u0000\u0000\u0000\u0128\u0935"+ + "\u0001\u0000\u0000\u0000\u012a\u0939\u0001\u0000\u0000\u0000\u012c\u093e"+ + "\u0001\u0000\u0000\u0000\u012e\u0944\u0001\u0000\u0000\u0000\u0130\u0948"+ + "\u0001\u0000\u0000\u0000\u0132\u094c\u0001\u0000\u0000\u0000\u0134\u0951"+ + "\u0001\u0000\u0000\u0000\u0136\u0955\u0001\u0000\u0000\u0000\u0138\u095b"+ + "\u0001\u0000\u0000\u0000\u013a\u0965\u0001\u0000\u0000\u0000\u013c\u096b"+ + "\u0001\u0000\u0000\u0000\u013e\u0970\u0001\u0000\u0000\u0000\u0140\u0976"+ + "\u0001\u0000\u0000\u0000\u0142\u097b\u0001\u0000\u0000\u0000\u0144\u0981"+ + "\u0001\u0000\u0000\u0000\u0146\u0988\u0001\u0000\u0000\u0000\u0148\u098e"+ + "\u0001\u0000\u0000\u0000\u014a\u0994\u0001\u0000\u0000\u0000\u014c\u099a"+ + "\u0001\u0000\u0000\u0000\u014e\u099e\u0001\u0000\u0000\u0000\u0150\u09a4"+ + "\u0001\u0000\u0000\u0000\u0152\u09aa\u0001\u0000\u0000\u0000\u0154\u09af"+ + "\u0001\u0000\u0000\u0000\u0156\u09b4\u0001\u0000\u0000\u0000\u0158\u09b9"+ + "\u0001\u0000\u0000\u0000\u015a\u09be\u0001\u0000\u0000\u0000\u015c\u09c3"+ + "\u0001\u0000\u0000\u0000\u015e\u09ca\u0001\u0000\u0000\u0000\u0160\u09cc"+ + "\u0001\u0000\u0000\u0000\u0162\u09d0\u0001\u0000\u0000\u0000\u0164\u09d5"+ + "\u0001\u0000\u0000\u0000\u0166\u09e0\u0001\u0000\u0000\u0000\u0168\u09e4"+ + "\u0001\u0000\u0000\u0000\u016a\u09e9\u0001\u0000\u0000\u0000\u016c\u09ee"+ + "\u0001\u0000\u0000\u0000\u016e\u09f1\u0001\u0000\u0000\u0000\u0170\u09f5"+ + "\u0001\u0000\u0000\u0000\u0172\u09fb\u0001\u0000\u0000\u0000\u0174\u0a01"+ + "\u0001\u0000\u0000\u0000\u0176\u0a07\u0001\u0000\u0000\u0000\u0178\u0a0d"+ + "\u0001\u0000\u0000\u0000\u017a\u0a13\u0001\u0000\u0000\u0000\u017c\u0a16"+ + "\u0001\u0000\u0000\u0000\u017e\u0a19\u0001\u0000\u0000\u0000\u0180\u0a1c"+ + "\u0001\u0000\u0000\u0000\u0182\u0a20\u0001\u0000\u0000\u0000\u0184\u0a23"+ + "\u0001\u0000\u0000\u0000\u0186\u0a2a\u0001\u0000\u0000\u0000\u0188\u0a2e"+ + "\u0001\u0000\u0000\u0000\u018a\u0a33\u0001\u0000\u0000\u0000\u018c\u0a37"+ + "\u0001\u0000\u0000\u0000\u018e\u0a3c\u0001\u0000\u0000\u0000\u0190\u0a40"+ + "\u0001\u0000\u0000\u0000\u0192\u0a43\u0001\u0000\u0000\u0000\u0194\u0a46"+ + "\u0001\u0000\u0000\u0000\u0196\u0a4b\u0001\u0000\u0000\u0000\u0198\u0a50"+ + "\u0001\u0000\u0000\u0000\u019a\u0a55\u0001\u0000\u0000\u0000\u019c\u0a5a"+ + "\u0001\u0000\u0000\u0000\u019e\u0a5c\u0001\u0000\u0000\u0000\u01a0\u0a60"+ + "\u0001\u0000\u0000\u0000\u01a2\u0a63\u0001\u0000\u0000\u0000\u01a4\u0a67"+ + "\u0001\u0000\u0000\u0000\u01a6\u0a69\u0001\u0000\u0000\u0000\u01a8\u0a6d"+ + "\u0001\u0000\u0000\u0000\u01aa\u0a73\u0001\u0000\u0000\u0000\u01ac\u0a75"+ + "\u0001\u0000\u0000\u0000\u01ae\u0a79\u0001\u0000\u0000\u0000\u01b0\u0a7e"+ + "\u0001\u0000\u0000\u0000\u01b2\u0a88\u0001\u0000\u0000\u0000\u01b4\u0a9c"+ + "\u0001\u0000\u0000\u0000\u01b6\u0aa6\u0001\u0000\u0000\u0000\u01b8\u0aab"+ + "\u0001\u0000\u0000\u0000\u01ba\u0aaf\u0001\u0000\u0000\u0000\u01bc\u0ab3"+ + "\u0001\u0000\u0000\u0000\u01be\u0ab7\u0001\u0000\u0000\u0000\u01c0\u0abd"+ + "\u0001\u0000\u0000\u0000\u01c2\u0ac1\u0001\u0000\u0000\u0000\u01c4\u0ac5"+ + "\u0001\u0000\u0000\u0000\u01c6\u0acd\u0001\u0000\u0000\u0000\u01c8\u0ad5"+ + "\u0001\u0000\u0000\u0000\u01ca\u0ada\u0001\u0000\u0000\u0000\u01cc\u0ae5"+ + "\u0001\u0000\u0000\u0000\u01ce\u0aea\u0001\u0000\u0000\u0000\u01d0\u0aee"+ + "\u0001\u0000\u0000\u0000\u01d2\u0af3\u0001\u0000\u0000\u0000\u01d4\u0af7"+ + "\u0001\u0000\u0000\u0000\u01d6\u0afb\u0001\u0000\u0000\u0000\u01d8\u0aff"+ + "\u0001\u0000\u0000\u0000\u01da\u0b04\u0001\u0000\u0000\u0000\u01dc\u0b08"+ + "\u0001\u0000\u0000\u0000\u01de\u0b0d\u0001\u0000\u0000\u0000\u01e0\u0b17"+ + "\u0001\u0000\u0000\u0000\u01e2\u0b25\u0001\u0000\u0000\u0000\u01e4\u0b29"+ + "\u0001\u0000\u0000\u0000\u01e6\u0b2d\u0001\u0000\u0000\u0000\u01e8\u0b31"+ + "\u0001\u0000\u0000\u0000\u01ea\u0b37\u0001\u0000\u0000\u0000\u01ec\u0b3b"+ + "\u0001\u0000\u0000\u0000\u01ee\u0b3f\u0001\u0000\u0000\u0000\u01f0\u0b43"+ + "\u0001\u0000\u0000\u0000\u01f2\u0b47\u0001\u0000\u0000\u0000\u01f4\u0b4c"+ + "\u0001\u0000\u0000\u0000\u01f6\u0b51\u0001\u0000\u0000\u0000\u01f8\u0b55"+ + "\u0001\u0000\u0000\u0000\u01fa\u0b59\u0001\u0000\u0000\u0000\u01fc\u0b5e"+ + "\u0001\u0000\u0000\u0000\u01fe\u0b62\u0001\u0000\u0000\u0000\u0200\u0b72"+ + "\u0001\u0000\u0000\u0000\u0202\u0b77\u0001\u0000\u0000\u0000\u0204\u0b7c"+ + "\u0001\u0000\u0000\u0000\u0206\u0b80\u0001\u0000\u0000\u0000\u0208\u0b88"+ + "\u0001\u0000\u0000\u0000\u020a\u0b8d\u0001\u0000\u0000\u0000\u020c\u0b91"+ + "\u0001\u0000\u0000\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211"+ + "\u0007\u0001\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214"+ + "\u0001\u0000\u0000\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213"+ + "\u0001\u0000\u0000\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212"+ + "\u0001\u0000\u0000\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215"+ + "\u0001\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218"+ + "\u0001\u0000\u0000\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b"+ + "\u0007\u0003\u0000\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e"+ + "\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d"+ + "\u0001\u0000\u0000\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c"+ + "\u0001\u0000\u0000\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216"+ + "\u0001\u0000\u0000\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011"+ + "\u0001\u0000\u0000\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005"+ + "(\u0000\u0000\u0224\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000"+ + "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ + "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000"+ + "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000"+ + "\u022b\u022d\u0005 \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ + "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ + "\u022f\u0001\u0000\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230"+ + "\u022e\u0001\u0000\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a"+ + "\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232"+ + "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a"+ + "\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239"+ + "\u0005 \u0000\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001"+ + "\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ + "\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ + "\u0000\u0000\u0000\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000"+ + "\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000"+ + "\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ + "\u0000\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ + "\u0000\u0244\u0245\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000"+ + "\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ + "\u0247\u0013\u0001\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000"+ + "\u0249\u0253\u0003\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b"+ + "\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d"+ + "\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e"+ + "\u0250\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250"+ + "\u0252\u0003\u0010\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252"+ + "\u0255\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253"+ + "\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255"+ + "\u0253\u0001\u0000\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257"+ + "\u026a\u0001\u0000\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263"+ + "\u0003\u0010\u0001\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001"+ + "\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001"+ + "\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001"+ + "\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003"+ + "\u0010\u0001\u0000\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001"+ + "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ + "\u0000\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ + "\u0000\u0000\u0000\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005"+ + "\"\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000"+ + "\u0000\u0000\u0269\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000"+ + "\u0000\u0000\u026b\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000"+ + "\u026d\u026e\u0003\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f"+ + "\u0271\u0001\u0000\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272"+ + "\u0273\u0005]\u0000\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275"+ + "\u0005\"\u0000\u0000\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005"+ + "\"\u0000\u0000\u0277\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004"+ + "\u0000\u0000\u0279\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000"+ + "\u0000\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000"+ + "\u0000\u027c\u0278\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000"+ + "\u0000\u027e\u027f\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000"+ + "\u0280\u0281\u0007\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000"+ + "\u0282\u0283\u0006\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000"+ + "\u0284\u0285\u0005@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286"+ + "\u0287\u0007\b\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289"+ + "\u0007\u0007\u0000\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b"+ + "\u0007\u0006\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+ + "\u0006\u0007\u0000\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f"+ + "\u0005@\u0000\u0000\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007"+ + "\b\u0000\u0000\u0291\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007"+ + "\u0000\u0000\u0293\u001f\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000"+ + "\u0000\u0295\u0296\u0007\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000"+ + "\u0297\u0298\u0007\u000b\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000"+ + "\u0299\u029a\u0007\u0006\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b"+ + "\u029c\u0005@\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e"+ + "\u0007\f\u0000\u0000\u029e\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007"+ + "\r\u0000\u0000\u02a0\u02a1\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f"+ + "\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001"+ + "\u0000\u02a4#\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6"+ + "\u02a7\u0007\u000e\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8"+ + "\u02a9\u0007\t\u0000\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab"+ + "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001"+ + "\u0000\u0000\u0000\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b"+ + "\u0000\u0000\u02af\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006"+ + "\u0000\u0000\u02b1\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011"+ + "\u0000\u0000\u02b3\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000"+ + "\u0000\u02b5\'\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000"+ + "\u02b7\u02b8\u0007\u0007\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9"+ + "\u02ba\u0007\u000b\u0000\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc"+ + "\u0007\f\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007"+ + "\r\u0000\u0000\u02be\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f"+ + "\u0000\u0000\u02c0)\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000"+ + "\u02c2\u02c3\u0007\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000"+ + "\u02c4\u02c5\u0007\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6"+ + "\u02c7\u0007\u0014\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8"+ + "\u02c9\u0006\u000e\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb"+ + "\u0005@\u0000\u0000\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007"+ + "\n\u0000\u0000\u02cd\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007"+ + "\u0000\u0000\u02cf\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013"+ + "\u0000\u0000\u02d1\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000"+ + "\u0000\u02d3-\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5"+ + "\u02d6\u0007\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8"+ + "\u0007\b\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007"+ + "\t\u0000\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000"+ + "\u0000\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000"+ + "\u02de\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0"+ + "\u02e2\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4"+ + "\u0006\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ + "@\u0000\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n"+ + "\u0000\u0000\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011"+ + "\u0000\u0000\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000"+ + "\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000"+ + "\u02ee\u02f9\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0"+ + "\u02f1\u0007\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3"+ + "\u0007\u000b\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5"+ + "\u0007\t\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007"+ + "\u0007\u0000\u0000\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000"+ + "\u0000\u0000\u02f8\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000"+ + "\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000"+ + "\u02fc\u02fd\u0007\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000"+ + "\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000"+ + "\u0300\u0301\u0007\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000"+ + "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000"+ + "\u03043\u0001\u0000\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307"+ + "\u0007\u0007\u0000\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007"+ + "\u000b\u0000\u0000\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007"+ + "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ + "\u0007\u0000\u0000\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007"+ + "\u000e\u0000\u0000\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000"+ + "\u0000\u0000\u0311\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000"+ + "\u0000\u0313\u0314\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000"+ + "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001"+ + "\u0000\u03177\u0001\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319"+ + "\u031a\u0007\u0007\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c"+ + "\u0007\u000b\u0000\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e"+ + "\u0007\u0015\u0000\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001"+ + "\u0000\u0000\u0000\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006"+ + "\u0000\u0000\u0322\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016"+ + "\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000"+ + "\u0000\u0326\u0327\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000"+ + "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000"+ + "\u032a;\u0001\u0000\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d"+ + "\u0007\u0007\u0000\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007"+ + "\u000b\u0000\u0000\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007"+ + "\u0015\u0000\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007"+ + "\u0007\u0000\u0000\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t"+ + "\u0000\u0000\u0335\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000"+ + "\u0000\u0337\u0338\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000"+ + "\u0339\u033a\u0007\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000"+ + "\u033b\u033c\u0007\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d"+ + "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f"+ + "?\u0001\u0000\u0000\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007"+ + "\u0007\u0000\u0000\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b"+ + "\u0000\u0000\u0344\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000"+ + "\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000"+ + "\u0348\u0349\u0007\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a"+ + "\u034b\u0005@\u0000\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d"+ + "\u0007\u0016\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ + "\u0007\u0010\u0000\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351"+ + "\u0001\u0000\u0000\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001"+ + "\u0000\u0000\u0000\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e"+ + "\u0000\u0000\u0355\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000"+ + "\u0000\u0357\u0358\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000"+ + "\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b"+ + "\u035c\u0007\u0007\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d"+ + "\u035e\u0006\u001b\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360"+ + "\u0005@\u0000\u0000\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007"+ + "\n\u0000\u0000\u0362\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b"+ + "\u0000\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b"+ + "\u0000\u0000\u0366\u0367\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000"+ + "\u0000\u0000\u0368\u0369\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000"+ + "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000"+ + "\u036c\u036d\u0007\n\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e"+ + "\u036f\u0007\b\u0000\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371"+ + "\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373"+ + "\u0007\u0005\u0000\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375"+ + "\u0001\u0000\u0000\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001"+ + "\u0000\u0000\u0000\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005"+ + "\u0000\u0000\u0379\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000"+ + "\u0000\u037b\u037c\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000"+ + "\u037d\u037e\u0007\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000"+ + "\u037f\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381"+ + "\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384"+ + "\u0001\u0000\u0000\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001"+ + "\u0000\u0000\u0000\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005"+ + "\u0000\u0000\u0388\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000"+ + "\u0000\u038a\u038b\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000"+ + "\u038c\u038d\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000"+ + "\u038e\u038f\u0007\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000"+ + "\u0390\u0391\u0007\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392"+ + "\u0393\u0007\r\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ + "\u0006\u001f\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ + "@\u0000\u0000\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n"+ + "\u0000\u0000\u0399\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000"+ + "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ + "\u0000\u039d\u039e\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ + "\u0000\u039f\u03a0\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000"+ + "\u03a1\u03a2\u0007\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3"+ + "\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6"+ + "\u0006 \u0003\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@"+ + "\u0000\u0000\u03a8\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010"+ + "\u0000\u0000\u03aa\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f"+ + "\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003"+ + "\u0000\u03aeQ\u0001\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0"+ + "\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2"+ + "\u03b3\u0007\r\u0000\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5"+ + "\u0007\n\u0000\u0000\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007"+ + "\t\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\""+ + "\u0003\u0000\u03b9S\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000"+ + "\u03bb\u03bc\u0007\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd"+ + "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001"+ + "\u0000\u0000\u0000\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a"+ + "\u0000\u0000\u03c2\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000"+ + "\u0000\u03c4\u03c5\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000"+ + "\u03c6\u03c7\u0006$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9"+ + "\u0005@\u0000\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007"+ + "\u0007\u0000\u0000\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007"+ + "\r\u0000\u0000\u03cd\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015"+ + "\u0000\u0000\u03cf\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000"+ + "\u0000\u03d1\u03d2\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3"+ + "\u03d4\u0005@\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6"+ + "\u0007\u0010\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007"+ + "\t\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e"+ + "\u0000\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000"+ + "\u0000\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000"+ + "\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0"+ + "[\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007"+ + "\t\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ "\u0000\u0000\u03e5\u03e6\u0007\r\u0000\u0000\u03e6\u03e7\u0007\u0005\u0000"+ "\u0000\u03e7\u03e8\u0007\u0015\u0000\u0000\u03e8\u03e9\u0007\n\u0000\u0000"+ "\u03e9\u03ea\u0007\u0012\u0000\u0000\u03ea\u03eb\u0007\u0005\u0000\u0000"+ @@ -2103,492 +2110,531 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0001\u0000"+ "\u0000\u0000\u07ae\u07af\u0006}\t\u0000\u07af\u0109\u0001\u0000\u0000"+ "\u0000\u07b0\u07b1\u0005{\u0000\u0000\u07b1\u07b2\u0005{\u0000\u0000\u07b2"+ - "\u089c\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ + "\u08e6\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ "@\u0000\u0000\u07b5\u07b7\u0001\u0000\u0000\u0000\u07b6\u07b8\u0005@\u0000"+ "\u0000\u07b7\u07b6\u0001\u0000\u0000\u0000\u07b7\u07b8\u0001\u0000\u0000"+ - "\u0000\u07b8\u089c\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ + "\u0000\u07b8\u08e6\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ "\u07ba\u07bb\u0005{\u0000\u0000\u07bb\u07bd\u0001\u0000\u0000\u0000\u07bc"+ "\u07be\u0005{\u0000\u0000\u07bd\u07bc\u0001\u0000\u0000\u0000\u07bd\u07be"+ - "\u0001\u0000\u0000\u0000\u07be\u089c\u0001\u0000\u0000\u0000\u07bf\u07c0"+ + "\u0001\u0000\u0000\u0000\u07be\u08e6\u0001\u0000\u0000\u0000\u07bf\u07c0"+ "\u0005@\u0000\u0000\u07c0\u07c1\u0007\u0012\u0000\u0000\u07c1\u07c2\u0007"+ "\u0007\u0000\u0000\u07c2\u07c3\u0007\u000b\u0000\u0000\u07c3\u07c4\u0007"+ - "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c9\u0001"+ + "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c7\u0001"+ "\u0000\u0000\u0000\u07c6\u07c8\u0007%\u0000\u0000\u07c7\u07c6\u0001\u0000"+ - "\u0000\u0000\u07c8\u07cb\u0001\u0000\u0000\u0000\u07c9\u07c7\u0001\u0000"+ - "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07cd\u0001\u0000"+ - "\u0000\u0000\u07cb\u07c9\u0001\u0000\u0000\u0000\u07cc\u07ce\u0005(\u0000"+ - "\u0000\u07cd\u07cc\u0001\u0000\u0000\u0000\u07cd\u07ce\u0001\u0000\u0000"+ - "\u0000\u07ce\u089c\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ - "\u07d0\u07d1\u0007\u000e\u0000\u0000\u07d1\u07d2\u0007\u000f\u0000\u0000"+ - "\u07d2\u07d3\u0007\u0010\u0000\u0000\u07d3\u07d4\u0007\u0016\u0000\u0000"+ - "\u07d4\u07d5\u0007\t\u0000\u0000\u07d5\u07d6\u0007\u0007\u0000\u0000\u07d6"+ - "\u0894\u0007\r\u0000\u0000\u07d7\u07d8\u0005@\u0000\u0000\u07d8\u07d9"+ - "\u0007\u0005\u0000\u0000\u07d9\u07da\u0007\u0012\u0000\u0000\u07da\u07db"+ - "\u0007\u0013\u0000\u0000\u07db\u07dc\u0007\u0015\u0000\u0000\u07dc\u07dd"+ - "\u0007\u0016\u0000\u0000\u07dd\u0894\u0007\r\u0000\u0000\u07de\u07df\u0005"+ - "@\u0000\u0000\u07df\u07e0\u0007\n\u0000\u0000\u07e0\u07e1\u0007\u0010"+ - "\u0000\u0000\u07e1\u07e2\u0007\u0012\u0000\u0000\u07e2\u07e3\u0007\u0007"+ - "\u0000\u0000\u07e3\u07e4\u0007\t\u0000\u0000\u07e4\u07e5\u0007\u0013\u0000"+ - "\u0000\u07e5\u07e6\u0007\u0010\u0000\u0000\u07e6\u07e7\u0007\u000e\u0000"+ - "\u0000\u07e7\u0894\u0007\u0007\u0000\u0000\u07e8\u07e9\u0005@\u0000\u0000"+ - "\u07e9\u07ea\u0007\u000b\u0000\u0000\u07ea\u07eb\u0007\u0015\u0000\u0000"+ - "\u07eb\u07ec\u0007\u000e\u0000\u0000\u07ec\u07ed\u0007\u0011\u0000\u0000"+ - "\u07ed\u07ee\u0007\u0012\u0000\u0000\u07ee\u07ef\u0007\u0007\u0000\u0000"+ - "\u07ef\u07f0\u0007\n\u0000\u0000\u07f0\u0894\u0007\r\u0000\u0000\u07f1"+ - "\u07f2\u0005@\u0000\u0000\u07f2\u07f3\u0007\u0006\u0000\u0000\u07f3\u07f4"+ - "\u0007\u0015\u0000\u0000\u07f4\u07f5\u0007\n\u0000\u0000\u07f5\u07f6\u0007"+ - "\r\u0000\u0000\u07f6\u07f7\u0005-\u0000\u0000\u07f7\u07f8\u0007\u0006"+ - "\u0000\u0000\u07f8\u07f9\u0007\u0010\u0000\u0000\u07f9\u07fa\u0007\u000e"+ - "\u0000\u0000\u07fa\u0894\u0007\u0007\u0000\u0000\u07fb\u07fc\u0005@\u0000"+ - "\u0000\u07fc\u07fd\u0007\u0013\u0000\u0000\u07fd\u07fe\u0007\u0010\u0000"+ - "\u0000\u07fe\u07ff\u0007\u001b\u0000\u0000\u07ff\u0894\u0007\u0007\u0000"+ - "\u0000\u0800\u0801\u0005@\u0000\u0000\u0801\u0802\u0007\b\u0000\u0000"+ - "\u0802\u0803\u0007\u0010\u0000\u0000\u0803\u0804\u0007\u0014\u0000\u0000"+ - "\u0804\u0805\u0007\u0007\u0000\u0000\u0805\u0894\u0007\u0016\u0000\u0000"+ - "\u0806\u0807\u0005@\u0000\u0000\u0807\u0808\u0007\t\u0000\u0000\u0808"+ - "\u0809\u0007\u0011\u0000\u0000\u0809\u080a\u0007\u0013\u0000\u0000\u080a"+ - "\u080b\u0007\u0013\u0000\u0000\u080b\u080c\u0007\u0015\u0000\u0000\u080c"+ - "\u080d\u0007\u0016\u0000\u0000\u080d\u080e\u0007\r\u0000\u0000\u080e\u0894"+ - "\u0007\t\u0000\u0000\u080f\u0810\u0005@\u0000\u0000\u0810\u0811\u0007"+ - "\r\u0000\u0000\u0811\u0812\u0007\u0010\u0000\u0000\u0812\u0813\u0007\u0005"+ - "\u0000\u0000\u0813\u0814\u0007\b\u0000\u0000\u0814\u0815\u0007\f\u0000"+ - "\u0000\u0815\u0816\u0007\u0005\u0000\u0000\u0816\u0817\u0007\n\u0000\u0000"+ - "\u0817\u0894\u0007\u000b\u0000\u0000\u0818\u0819\u0005@\u0000\u0000\u0819"+ - "\u081a\u0007\u0010\u0000\u0000\u081a\u081b\u0007\u0013\u0000\u0000\u081b"+ - "\u081c\u0007\u0013\u0000\u0000\u081c\u081d\u0007\b\u0000\u0000\u081d\u0894"+ - "\u0007\u0014\u0000\u0000\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0005"+ - "-\u0000\u0000\u0820\u0821\u0007\f\u0000\u0000\u0821\u0822\u0007\u0007"+ - "\u0000\u0000\u0822\u0823\u0007\u0017\u0000\u0000\u0823\u0824\u0007\u0018"+ - "\u0000\u0000\u0824\u0825\u0007\u0005\u0000\u0000\u0825\u0826\u0007\r\u0000"+ - "\u0000\u0826\u0827\u0005-\u0000\u0000\u0827\u0828\u0007\u0018\u0000\u0000"+ - "\u0828\u0829\u0007\u0007\u0000\u0000\u0829\u082a\u0007\u0014\u0000\u0000"+ - "\u082a\u082b\u0007\u0006\u0000\u0000\u082b\u082c\u0007\u0016\u0000\u0000"+ - "\u082c\u082d\u0007\u0010\u0000\u0000\u082d\u082e\u0007\u0012\u0000\u0000"+ - "\u082e\u082f\u0007\u0007\u0000\u0000\u082f\u0894\u0007\t\u0000\u0000\u0830"+ - "\u0831\u0005@\u0000\u0000\u0831\u0832\u0007\u0018\u0000\u0000\u0832\u0833"+ - "\u0007\u0007\u0000\u0000\u0833\u0834\u0007\u0014\u0000\u0000\u0834\u0835"+ - "\u0007\u0006\u0000\u0000\u0835\u0836\u0007\u0016\u0000\u0000\u0836\u0837"+ - "\u0007\u0010\u0000\u0000\u0837\u0838\u0007\u0012\u0000\u0000\u0838\u0839"+ - "\u0007\u0007\u0000\u0000\u0839\u0894\u0007\t\u0000\u0000\u083a\u083b\u0005"+ - "@\u0000\u0000\u083b\u083c\u0007\u000e\u0000\u0000\u083c\u083d\u0007\u0015"+ - "\u0000\u0000\u083d\u083e\u0007\u0011\u0000\u0000\u083e\u083f\u0007\n\u0000"+ - "\u0000\u083f\u0840\u0007\r\u0000\u0000\u0840\u0841\u0007\u0007\u0000\u0000"+ - "\u0841\u0842\u0007\u0016\u0000\u0000\u0842\u0843\u0005-\u0000\u0000\u0843"+ - "\u0844\u0007\t\u0000\u0000\u0844\u0845\u0007\r\u0000\u0000\u0845\u0846"+ - "\u0007\u0014\u0000\u0000\u0846\u0847\u0007\b\u0000\u0000\u0847\u0894\u0007"+ - "\u0007\u0000\u0000\u0848\u0849\u0005@\u0000\u0000\u0849\u084a\u0007\u0006"+ - "\u0000\u0000\u084a\u084b\u0007\u0015\u0000\u0000\u084b\u084c\u0007\n\u0000"+ - "\u0000\u084c\u084d\u0007\r\u0000\u0000\u084d\u084e\u0005-\u0000\u0000"+ - "\u084e\u084f\u0007\u0006\u0000\u0000\u084f\u0850\u0007\u0007\u0000\u0000"+ - "\u0850\u0851\u0007\u0010\u0000\u0000\u0851\u0852\u0007\r\u0000\u0000\u0852"+ - "\u0853\u0007\u0011\u0000\u0000\u0853\u0854\u0007\u0016\u0000\u0000\u0854"+ - "\u0855\u0007\u0007\u0000\u0000\u0855\u0856\u0005-\u0000\u0000\u0856\u0857"+ - "\u0007\u001c\u0000\u0000\u0857\u0858\u0007\u0010\u0000\u0000\u0858\u0859"+ - "\u0007\b\u0000\u0000\u0859\u085a\u0007\u0011\u0000\u0000\u085a\u085b\u0007"+ - "\u0007\u0000\u0000\u085b\u0894\u0007\t\u0000\u0000\u085c\u085d\u0005@"+ - "\u0000\u0000\u085d\u085e\u0007\u0013\u0000\u0000\u085e\u085f\u0007\u0016"+ - "\u0000\u0000\u085f\u0860\u0007\u0015\u0000\u0000\u0860\u0861\u0007\u0013"+ - "\u0000\u0000\u0861\u0862\u0007\u0007\u0000\u0000\u0862\u0863\u0007\u0016"+ - "\u0000\u0000\u0863\u0864\u0007\r\u0000\u0000\u0864\u0894\u0007\u0014\u0000"+ - "\u0000\u0865\u0866\u0005@\u0000\u0000\u0866\u0867\u0007\t\u0000\u0000"+ - "\u0867\u0868\u0007\u000e\u0000\u0000\u0868\u0869\u0007\u0015\u0000\u0000"+ - "\u0869\u086a\u0007\u0013\u0000\u0000\u086a\u0894\u0007\u0007\u0000\u0000"+ - "\u086b\u086c\u0005@\u0000\u0000\u086c\u086d\u0007\t\u0000\u0000\u086d"+ - "\u086e\u0007\r\u0000\u0000\u086e\u086f\u0007\u0010\u0000\u0000\u086f\u0870"+ - "\u0007\u0016\u0000\u0000\u0870\u0871\u0007\r\u0000\u0000\u0871\u0872\u0007"+ - "\u0005\u0000\u0000\u0872\u0873\u0007\n\u0000\u0000\u0873\u0874\u0007\u001b"+ - "\u0000\u0000\u0874\u0875\u0005-\u0000\u0000\u0875\u0876\u0007\t\u0000"+ - "\u0000\u0876\u0877\u0007\r\u0000\u0000\u0877\u0878\u0007\u0014\u0000\u0000"+ - "\u0878\u0879\u0007\b\u0000\u0000\u0879\u0894\u0007\u0007\u0000\u0000\u087a"+ - "\u087b\u0005@\u0000\u0000\u087b\u087c\u0007\t\u0000\u0000\u087c\u087d"+ - "\u0007\u0011\u0000\u0000\u087d\u087e\u0007\u0013\u0000\u0000\u087e\u087f"+ - "\u0007\u0013\u0000\u0000\u087f\u0880\u0007\u0015\u0000\u0000\u0880\u0881"+ - "\u0007\u0016\u0000\u0000\u0881\u0882\u0007\r\u0000\u0000\u0882\u0894\u0007"+ - "\t\u0000\u0000\u0883\u0884\u0005@\u0000\u0000\u0884\u0885\u0007\u001c"+ - "\u0000\u0000\u0885\u0886\u0007\u0005\u0000\u0000\u0886\u0887\u0007\u0007"+ - "\u0000\u0000\u0887\u0888\u0007\f\u0000\u0000\u0888\u0889\u0005-\u0000"+ - "\u0000\u0889\u088a\u0007\r\u0000\u0000\u088a\u088b\u0007\u0016\u0000\u0000"+ - "\u088b\u088c\u0007\u0010\u0000\u0000\u088c\u088d\u0007\n\u0000\u0000\u088d"+ - "\u088e\u0007\t\u0000\u0000\u088e\u088f\u0007\u0005\u0000\u0000\u088f\u0890"+ - "\u0007\r\u0000\u0000\u0890\u0891\u0007\u0005\u0000\u0000\u0891\u0892\u0007"+ - "\u0015\u0000\u0000\u0892\u0894\u0007\n\u0000\u0000\u0893\u07cf\u0001\u0000"+ - "\u0000\u0000\u0893\u07d7\u0001\u0000\u0000\u0000\u0893\u07de\u0001\u0000"+ - "\u0000\u0000\u0893\u07e8\u0001\u0000\u0000\u0000\u0893\u07f1\u0001\u0000"+ - "\u0000\u0000\u0893\u07fb\u0001\u0000\u0000\u0000\u0893\u0800\u0001\u0000"+ - "\u0000\u0000\u0893\u0806\u0001\u0000\u0000\u0000\u0893\u080f\u0001\u0000"+ - "\u0000\u0000\u0893\u0818\u0001\u0000\u0000\u0000\u0893\u081e\u0001\u0000"+ - "\u0000\u0000\u0893\u0830\u0001\u0000\u0000\u0000\u0893\u083a\u0001\u0000"+ - "\u0000\u0000\u0893\u0848\u0001\u0000\u0000\u0000\u0893\u085c\u0001\u0000"+ - "\u0000\u0000\u0893\u0865\u0001\u0000\u0000\u0000\u0893\u086b\u0001\u0000"+ - "\u0000\u0000\u0893\u087a\u0001\u0000\u0000\u0000\u0893\u0883\u0001\u0000"+ - "\u0000\u0000\u0894\u0898\u0001\u0000\u0000\u0000\u0895\u0897\u0007%\u0000"+ - "\u0000\u0896\u0895\u0001\u0000\u0000\u0000\u0897\u089a\u0001\u0000\u0000"+ - "\u0000\u0898\u0896\u0001\u0000\u0000\u0000\u0898\u0899\u0001\u0000\u0000"+ - "\u0000\u0899\u089c\u0001\u0000\u0000\u0000\u089a\u0898\u0001\u0000\u0000"+ - "\u0000\u089b\u07b0\u0001\u0000\u0000\u0000\u089b\u07b3\u0001\u0000\u0000"+ - "\u0000\u089b\u07b9\u0001\u0000\u0000\u0000\u089b\u07bf\u0001\u0000\u0000"+ - "\u0000\u089b\u0893\u0001\u0000\u0000\u0000\u089c\u089d\u0001\u0000\u0000"+ - "\u0000\u089d\u089e\u0006~\t\u0000\u089e\u010b\u0001\u0000\u0000\u0000"+ - "\u089f\u08a0\u0003\u00fex\u0000\u08a0\u08a1\u0001\u0000\u0000\u0000\u08a1"+ - "\u08a2\u0006\u007f\u0012\u0000\u08a2\u010d\u0001\u0000\u0000\u0000\u08a3"+ - "\u08a4\u0003\u0100y\u0000\u08a4\u08a5\u0001\u0000\u0000\u0000\u08a5\u08a6"+ - "\u0006\u0080\u0013\u0000\u08a6\u010f\u0001\u0000\u0000\u0000\u08a7\u08a9"+ - "\u0005\\\u0000\u0000\u08a8\u08a7\u0001\u0000\u0000\u0000\u08a8\u08a9\u0001"+ - "\u0000\u0000\u0000\u08a9\u08ad\u0001\u0000\u0000\u0000\u08aa\u08ab\u0003"+ - "\u00f0q\u0000\u08ab\u08ac\u0005\\\u0000\u0000\u08ac\u08ae\u0001\u0000"+ - "\u0000\u0000\u08ad\u08aa\u0001\u0000\u0000\u0000\u08ae\u08af\u0001\u0000"+ - "\u0000\u0000\u08af\u08ad\u0001\u0000\u0000\u0000\u08af\u08b0\u0001\u0000"+ - "\u0000\u0000\u08b0\u08b1\u0001\u0000\u0000\u0000\u08b1\u08b2\u0006\u0081"+ - "\u0014\u0000\u08b2\u0111\u0001\u0000\u0000\u0000\u08b3\u08b4\u0003\u00f0"+ - "q\u0000\u08b4\u08b5\u0001\u0000\u0000\u0000\u08b5\u08b6\u0006\u0082\u0015"+ - "\u0000\u08b6\u0113\u0001\u0000\u0000\u0000\u08b7\u08b8\u0005:\u0000\u0000"+ - "\u08b8\u08b9\u0005:\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba"+ - "\u08bb\u0006\u0083\u0016\u0000\u08bb\u0115\u0001\u0000\u0000\u0000\u08bc"+ - "\u08bd\u0005}\u0000\u0000\u08bd\u08be\u0005}\u0000\u0000\u08be\u08bf\u0001"+ - "\u0000\u0000\u0000\u08bf\u08c0\u0006\u0084\u0017\u0000\u08c0\u0117\u0001"+ - "\u0000\u0000\u0000\u08c1\u08c2\u0005(\u0000\u0000\u08c2\u08c3\u0001\u0000"+ - "\u0000\u0000\u08c3\u08c4\u0006\u0085\u0018\u0000\u08c4\u0119\u0001\u0000"+ - "\u0000\u0000\u08c5\u08c6\u0005)\u0000\u0000\u08c6\u08c7\u0001\u0000\u0000"+ - "\u0000\u08c7\u08c8\u0006\u0086\u0019\u0000\u08c8\u011b\u0001\u0000\u0000"+ - "\u0000\u08c9\u08ca\u0005-\u0000\u0000\u08ca\u08cb\u0005>\u0000\u0000\u08cb"+ - "\u08cc\u0001\u0000\u0000\u0000\u08cc\u08cd\u0006\u0087\u001a\u0000\u08cd"+ - "\u011d\u0001\u0000\u0000\u0000\u08ce\u08cf\t\u0000\u0000\u0000\u08cf\u08d0"+ - "\u0001\u0000\u0000\u0000\u08d0\u08d1\u0006\u0088\r\u0000\u08d1\u011f\u0001"+ - "\u0000\u0000\u0000\u08d2\u08d3\u0005\u0000\u0000\u0001\u08d3\u08d4\u0001"+ - "\u0000\u0000\u0000\u08d4\u08d5\u0006\u0089\u001b\u0000\u08d5\u08d6\u0006"+ - "\u0089\u0017\u0000\u08d6\u0121\u0001\u0000\u0000\u0000\u08d7\u08d8\u0003"+ - "\u00fex\u0000\u08d8\u08d9\u0001\u0000\u0000\u0000\u08d9\u08da\u0006\u008a"+ - "\u0012\u0000\u08da\u0123\u0001\u0000\u0000\u0000\u08db\u08dc\u0003\u0100"+ - "y\u0000\u08dc\u08dd\u0001\u0000\u0000\u0000\u08dd\u08de\u0006\u008b\u0013"+ - "\u0000\u08de\u0125\u0001\u0000\u0000\u0000\u08df\u08e1\u0005\\\u0000\u0000"+ - "\u08e0\u08df\u0001\u0000\u0000\u0000\u08e0\u08e1\u0001\u0000\u0000\u0000"+ - "\u08e1\u08e5\u0001\u0000\u0000\u0000\u08e2\u08e3\u0003\u00f0q\u0000\u08e3"+ - "\u08e4\u0005\\\u0000\u0000\u08e4\u08e6\u0001\u0000\u0000\u0000\u08e5\u08e2"+ - "\u0001\u0000\u0000\u0000\u08e6\u08e7\u0001\u0000\u0000\u0000\u08e7\u08e5"+ - "\u0001\u0000\u0000\u0000\u08e7\u08e8\u0001\u0000\u0000\u0000\u08e8\u08e9"+ - "\u0001\u0000\u0000\u0000\u08e9\u08ea\u0006\u008c\u0014\u0000\u08ea\u0127"+ - "\u0001\u0000\u0000\u0000\u08eb\u08ec\u0003\u00f0q\u0000\u08ec\u08ed\u0001"+ - "\u0000\u0000\u0000\u08ed\u08ee\u0006\u008d\u0015\u0000\u08ee\u0129\u0001"+ - "\u0000\u0000\u0000\u08ef\u08f0\u0005:\u0000\u0000\u08f0\u08f1\u0005:\u0000"+ - "\u0000\u08f1\u08f2\u0001\u0000\u0000\u0000\u08f2\u08f3\u0006\u008e\u0016"+ - "\u0000\u08f3\u012b\u0001\u0000\u0000\u0000\u08f4\u08f5\u0005!\u0000\u0000"+ - "\u08f5\u08f6\u0005!\u0000\u0000\u08f6\u08f7\u0005}\u0000\u0000\u08f7\u08f8"+ - "\u0001\u0000\u0000\u0000\u08f8\u08f9\u0006\u008f\u0017\u0000\u08f9\u012d"+ - "\u0001\u0000\u0000\u0000\u08fa\u08fb\u0005(\u0000\u0000\u08fb\u08fc\u0001"+ - "\u0000\u0000\u0000\u08fc\u08fd\u0006\u0090\u0018\u0000\u08fd\u012f\u0001"+ - "\u0000\u0000\u0000\u08fe\u08ff\u0005)\u0000\u0000\u08ff\u0900\u0001\u0000"+ - "\u0000\u0000\u0900\u0901\u0006\u0091\u0019\u0000\u0901\u0131\u0001\u0000"+ - "\u0000\u0000\u0902\u0903\u0005-\u0000\u0000\u0903\u0904\u0005>\u0000\u0000"+ - "\u0904\u0905\u0001\u0000\u0000\u0000\u0905\u0906\u0006\u0092\u001a\u0000"+ - "\u0906\u0133\u0001\u0000\u0000\u0000\u0907\u0908\t\u0000\u0000\u0000\u0908"+ - "\u0909\u0001\u0000\u0000\u0000\u0909\u090a\u0006\u0093\r\u0000\u090a\u0135"+ - "\u0001\u0000\u0000\u0000\u090b\u090c\u0005\u0000\u0000\u0001\u090c\u090d"+ - "\u0001\u0000\u0000\u0000\u090d\u090e\u0006\u0094\u001b\u0000\u090e\u090f"+ - "\u0006\u0094\u0017\u0000\u090f\u0137\u0001\u0000\u0000\u0000\u0910\u0912"+ - "\u0007%\u0000\u0000\u0911\u0910\u0001\u0000\u0000\u0000\u0912\u0913\u0001"+ - "\u0000\u0000\u0000\u0913\u0911\u0001\u0000\u0000\u0000\u0913\u0914\u0001"+ - "\u0000\u0000\u0000\u0914\u0915\u0001\u0000\u0000\u0000\u0915\u0916\u0004"+ - "\u0095\u0007\u0000\u0916\u0917\u0001\u0000\u0000\u0000\u0917\u0918\u0006"+ - "\u0095\r\u0000\u0918\u0919\u0006\u0095\u0017\u0000\u0919\u0139\u0001\u0000"+ - "\u0000\u0000\u091a\u091c\u0007%\u0000\u0000\u091b\u091a\u0001\u0000\u0000"+ - "\u0000\u091c\u091d\u0001\u0000\u0000\u0000\u091d\u091b\u0001\u0000\u0000"+ - "\u0000\u091d\u091e\u0001\u0000\u0000\u0000\u091e\u091f\u0001\u0000\u0000"+ - "\u0000\u091f\u0920\u0006\u0096\r\u0000\u0920\u013b\u0001\u0000\u0000\u0000"+ - "\u0921\u0922\u0005(\u0000\u0000\u0922\u0923\u0001\u0000\u0000\u0000\u0923"+ - "\u0924\u0006\u0097\u001c\u0000\u0924\u0925\u0006\u0097\u001d\u0000\u0925"+ - "\u013d\u0001\u0000\u0000\u0000\u0926\u0927\t\u0000\u0000\u0000\u0927\u0928"+ - "\u0004\u0098\b\u0000\u0928\u0929\u0001\u0000\u0000\u0000\u0929\u092a\u0006"+ - "\u0098\t\u0000\u092a\u092b\u0006\u0098\u0017\u0000\u092b\u013f\u0001\u0000"+ - "\u0000\u0000\u092c\u092d\t\u0000\u0000\u0000\u092d\u092e\u0001\u0000\u0000"+ - "\u0000\u092e\u092f\u0006\u0099\t\u0000\u092f\u0930\u0006\u0099\u0017\u0000"+ - "\u0930\u0141\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009a\t\u0000\u0932"+ - "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009a\u001e\u0000\u0934\u0935"+ - "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009a\u001c\u0000\u0936\u0143"+ - "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009b\n\u0000\u0938\u0939\u0005"+ - ")\u0000\u0000\u0939\u093a\u0006\u009b\u001f\u0000\u093a\u093b\u0001\u0000"+ - "\u0000\u0000\u093b\u093c\u0006\u009b \u0000\u093c\u093d\u0006\u009b!\u0000"+ - "\u093d\u0145\u0001\u0000\u0000\u0000\u093e\u093f\u0004\u009c\u000b\u0000"+ - "\u093f\u0940\u0005(\u0000\u0000\u0940\u0941\u0006\u009c\"\u0000\u0941"+ - "\u0942\u0001\u0000\u0000\u0000\u0942\u0943\u0006\u009c\u001c\u0000\u0943"+ - "\u0147\u0001\u0000\u0000\u0000\u0944\u0945\u0004\u009d\f\u0000\u0945\u0946"+ - "\u0005)\u0000\u0000\u0946\u0947\u0006\u009d#\u0000\u0947\u0948\u0001\u0000"+ - "\u0000\u0000\u0948\u0949\u0006\u009d\u001c\u0000\u0949\u0149\u0001\u0000"+ - "\u0000\u0000\u094a\u094b\u0005)\u0000\u0000\u094b\u094c\u0004\u009e\r"+ - "\u0000\u094c\u094d\u0001\u0000\u0000\u0000\u094d\u094e\u0006\u009e \u0000"+ - "\u094e\u094f\u0006\u009e!\u0000\u094f\u014b\u0001\u0000\u0000\u0000\u0950"+ - "\u0951\t\u0000\u0000\u0000\u0951\u0952\u0001\u0000\u0000\u0000\u0952\u0953"+ - "\u0006\u009f\u001c\u0000\u0953\u014d\u0001\u0000\u0000\u0000\u0954\u0955"+ - "\u0005\u0000\u0000\u0001\u0955\u0956\u0001\u0000\u0000\u0000\u0956\u0957"+ - "\u0006\u00a0\u001b\u0000\u0957\u0958\u0006\u00a0\u0017\u0000\u0958\u014f"+ - "\u0001\u0000\u0000\u0000\u0959\u095b\u0007%\u0000\u0000\u095a\u0959\u0001"+ - "\u0000\u0000\u0000\u095b\u095c\u0001\u0000\u0000\u0000\u095c\u095a\u0001"+ - "\u0000\u0000\u0000\u095c\u095d\u0001\u0000\u0000\u0000\u095d\u095e\u0001"+ - "\u0000\u0000\u0000\u095e\u095f\u0006\u00a1\r\u0000\u095f\u0151\u0001\u0000"+ - "\u0000\u0000\u0960\u0961\u0005(\u0000\u0000\u0961\u0962\u0006\u00a2$\u0000"+ - "\u0962\u0963\u0001\u0000\u0000\u0000\u0963\u0964\u0006\u00a2%\u0000\u0964"+ - "\u0153\u0001\u0000\u0000\u0000\u0965\u0966\t\u0000\u0000\u0000\u0966\u0967"+ - "\u0001\u0000\u0000\u0000\u0967\u0968\u0006\u00a3\t\u0000\u0968\u0969\u0006"+ - "\u00a3\u0017\u0000\u0969\u0155\u0001\u0000\u0000\u0000\u096a\u096b\u0005"+ - "[\u0000\u0000\u096b\u096c\u0006\u00a4&\u0000\u096c\u096d\u0001\u0000\u0000"+ - "\u0000\u096d\u096e\u0006\u00a4\'\u0000\u096e\u0157\u0001\u0000\u0000\u0000"+ - "\u096f\u0970\u0005]\u0000\u0000\u0970\u0971\u0006\u00a5(\u0000\u0971\u0972"+ - "\u0001\u0000\u0000\u0000\u0972\u0973\u0006\u00a5)\u0000\u0973\u0159\u0001"+ - "\u0000\u0000\u0000\u0974\u0975\u0005{\u0000\u0000\u0975\u0976\u0006\u00a6"+ - "*\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977\u0978\u0006\u00a6 \u0000"+ - "\u0978\u015b\u0001\u0000\u0000\u0000\u0979\u097a\u0005}\u0000\u0000\u097a"+ - "\u097b\u0006\u00a7+\u0000\u097b\u097c\u0001\u0000\u0000\u0000\u097c\u097d"+ - "\u0006\u00a7 \u0000\u097d\u015d\u0001\u0000\u0000\u0000\u097e\u0981\u0003"+ - "\u00f8u\u0000\u097f\u0981\u0003\u00fav\u0000\u0980\u097e\u0001\u0000\u0000"+ - "\u0000\u0980\u097f\u0001\u0000\u0000\u0000\u0981\u015f\u0001\u0000\u0000"+ - "\u0000\u0982\u0983\u0003\u00fex"; + "\u0000\u0000\u07c8\u07c9\u0001\u0000\u0000\u0000\u07c9\u07c7\u0001\u0000"+ + "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07dc\u0001\u0000"+ + "\u0000\u0000\u07cb\u07cc\u0007\t\u0000\u0000\u07cc\u07cd\u0007\u000e\u0000"+ + "\u0000\u07cd\u07ce\u0007\u0016\u0000\u0000\u07ce\u07cf\u0007\u0007\u0000"+ + "\u0000\u07cf\u07d0\u0007\u0007\u0000\u0000\u07d0\u07d1\u0007\n\u0000\u0000"+ + "\u07d1\u07d3\u0001\u0000\u0000\u0000\u07d2\u07d4\u0007%\u0000\u0000\u07d3"+ + "\u07d2\u0001\u0000\u0000\u0000\u07d4\u07d5\u0001\u0000\u0000\u0000\u07d5"+ + "\u07d3\u0001\u0000\u0000\u0000\u07d5\u07d6\u0001\u0000\u0000\u0000\u07d6"+ + "\u07da\u0001\u0000\u0000\u0000\u07d7\u07d8\u0007\u0010\u0000\u0000\u07d8"+ + "\u07d9\u0007\n\u0000\u0000\u07d9\u07db\u0007\u000b\u0000\u0000\u07da\u07d7"+ + "\u0001\u0000\u0000\u0000\u07da\u07db\u0001\u0000\u0000\u0000\u07db\u07dd"+ + "\u0001\u0000\u0000\u0000\u07dc\u07cb\u0001\u0000\u0000\u0000\u07dc\u07dd"+ + "\u0001\u0000\u0000\u0000\u07dd\u08e6\u0001\u0000\u0000\u0000\u07de\u07df"+ + "\u0005@\u0000\u0000\u07df\u07e0\u0007\u000e\u0000\u0000\u07e0\u07e1\u0007"+ + "\u000f\u0000\u0000\u07e1\u07e2\u0007\u0010\u0000\u0000\u07e2\u07e3\u0007"+ + "\u0016\u0000\u0000\u07e3\u07e4\u0007\t\u0000\u0000\u07e4\u07e5\u0007\u0007"+ + "\u0000\u0000\u07e5\u08de\u0007\r\u0000\u0000\u07e6\u07e7\u0005@\u0000"+ + "\u0000\u07e7\u07e8\u0007\u0005\u0000\u0000\u07e8\u07e9\u0007\u0012\u0000"+ + "\u0000\u07e9\u07ea\u0007\u0013\u0000\u0000\u07ea\u07eb\u0007\u0015\u0000"+ + "\u0000\u07eb\u07ec\u0007\u0016\u0000\u0000\u07ec\u08de\u0007\r\u0000\u0000"+ + "\u07ed\u07ee\u0005@\u0000\u0000\u07ee\u07ef\u0007\n\u0000\u0000\u07ef"+ + "\u07f0\u0007\u0010\u0000\u0000\u07f0\u07f1\u0007\u0012\u0000\u0000\u07f1"+ + "\u07f2\u0007\u0007\u0000\u0000\u07f2\u07f3\u0007\t\u0000\u0000\u07f3\u07f4"+ + "\u0007\u0013\u0000\u0000\u07f4\u07f5\u0007\u0010\u0000\u0000\u07f5\u07f6"+ + "\u0007\u000e\u0000\u0000\u07f6\u08de\u0007\u0007\u0000\u0000\u07f7\u07f8"+ + "\u0005@\u0000\u0000\u07f8\u07f9\u0007\u000b\u0000\u0000\u07f9\u07fa\u0007"+ + "\u0015\u0000\u0000\u07fa\u07fb\u0007\u000e\u0000\u0000\u07fb\u07fc\u0007"+ + "\u0011\u0000\u0000\u07fc\u07fd\u0007\u0012\u0000\u0000\u07fd\u07fe\u0007"+ + "\u0007\u0000\u0000\u07fe\u07ff\u0007\n\u0000\u0000\u07ff\u08de\u0007\r"+ + "\u0000\u0000\u0800\u0801\u0005@\u0000\u0000\u0801\u0802\u0007\u0006\u0000"+ + "\u0000\u0802\u0803\u0007\u0015\u0000\u0000\u0803\u0804\u0007\n\u0000\u0000"+ + "\u0804\u0805\u0007\r\u0000\u0000\u0805\u0806\u0005-\u0000\u0000\u0806"+ + "\u0807\u0007\u0006\u0000\u0000\u0807\u0808\u0007\u0010\u0000\u0000\u0808"+ + "\u0809\u0007\u000e\u0000\u0000\u0809\u08de\u0007\u0007\u0000\u0000\u080a"+ + "\u080b\u0005@\u0000\u0000\u080b\u080c\u0007\u0013\u0000\u0000\u080c\u080d"+ + "\u0007\u0010\u0000\u0000\u080d\u080e\u0007\u001b\u0000\u0000\u080e\u08de"+ + "\u0007\u0007\u0000\u0000\u080f\u0810\u0005@\u0000\u0000\u0810\u0811\u0007"+ + "\b\u0000\u0000\u0811\u0812\u0007\u0010\u0000\u0000\u0812\u0813\u0007\u0014"+ + "\u0000\u0000\u0813\u0814\u0007\u0007\u0000\u0000\u0814\u08de\u0007\u0016"+ + "\u0000\u0000\u0815\u0816\u0005@\u0000\u0000\u0816\u0817\u0007\t\u0000"+ + "\u0000\u0817\u0818\u0007\u0011\u0000\u0000\u0818\u0819\u0007\u0013\u0000"+ + "\u0000\u0819\u081a\u0007\u0013\u0000\u0000\u081a\u081b\u0007\u0015\u0000"+ + "\u0000\u081b\u081c\u0007\u0016\u0000\u0000\u081c\u081d\u0007\r\u0000\u0000"+ + "\u081d\u08de\u0007\t\u0000\u0000\u081e\u081f\u0005@\u0000\u0000\u081f"+ + "\u0820\u0007\r\u0000\u0000\u0820\u0821\u0007\u0010\u0000\u0000\u0821\u0822"+ + "\u0007\u0005\u0000\u0000\u0822\u0823\u0007\b\u0000\u0000\u0823\u0824\u0007"+ + "\f\u0000\u0000\u0824\u0825\u0007\u0005\u0000\u0000\u0825\u0826\u0007\n"+ + "\u0000\u0000\u0826\u08de\u0007\u000b\u0000\u0000\u0827\u0828\u0005@\u0000"+ + "\u0000\u0828\u0829\u0007\u0010\u0000\u0000\u0829\u082a\u0007\u0013\u0000"+ + "\u0000\u082a\u082b\u0007\u0013\u0000\u0000\u082b\u082c\u0007\b\u0000\u0000"+ + "\u082c\u08de\u0007\u0014\u0000\u0000\u082d\u082e\u0005@\u0000\u0000\u082e"+ + "\u082f\u0005-\u0000\u0000\u082f\u0830\u0007\f\u0000\u0000\u0830\u0831"+ + "\u0007\u0007\u0000\u0000\u0831\u0832\u0007\u0017\u0000\u0000\u0832\u0833"+ + "\u0007\u0018\u0000\u0000\u0833\u0834\u0007\u0005\u0000\u0000\u0834\u0835"+ + "\u0007\r\u0000\u0000\u0835\u0836\u0005-\u0000\u0000\u0836\u0837\u0007"+ + "\u0018\u0000\u0000\u0837\u0838\u0007\u0007\u0000\u0000\u0838\u0839\u0007"+ + "\u0014\u0000\u0000\u0839\u083a\u0007\u0006\u0000\u0000\u083a\u083b\u0007"+ + "\u0016\u0000\u0000\u083b\u083c\u0007\u0010\u0000\u0000\u083c\u083d\u0007"+ + "\u0012\u0000\u0000\u083d\u083e\u0007\u0007\u0000\u0000\u083e\u08de\u0007"+ + "\t\u0000\u0000\u083f\u0840\u0005@\u0000\u0000\u0840\u0841\u0007\u0018"+ + "\u0000\u0000\u0841\u0842\u0007\u0007\u0000\u0000\u0842\u0843\u0007\u0014"+ + "\u0000\u0000\u0843\u0844\u0007\u0006\u0000\u0000\u0844\u0845\u0007\u0016"+ + "\u0000\u0000\u0845\u0846\u0007\u0010\u0000\u0000\u0846\u0847\u0007\u0012"+ + "\u0000\u0000\u0847\u0848\u0007\u0007\u0000\u0000\u0848\u08de\u0007\t\u0000"+ + "\u0000\u0849\u084a\u0005@\u0000\u0000\u084a\u084b\u0007\u000e\u0000\u0000"+ + "\u084b\u084c\u0007\u0015\u0000\u0000\u084c\u084d\u0007\u0011\u0000\u0000"+ + "\u084d\u084e\u0007\n\u0000\u0000\u084e\u084f\u0007\r\u0000\u0000\u084f"+ + "\u0850\u0007\u0007\u0000\u0000\u0850\u0851\u0007\u0016\u0000\u0000\u0851"+ + "\u0852\u0005-\u0000\u0000\u0852\u0853\u0007\t\u0000\u0000\u0853\u0854"+ + "\u0007\r\u0000\u0000\u0854\u0855\u0007\u0014\u0000\u0000\u0855\u0856\u0007"+ + "\b\u0000\u0000\u0856\u08de\u0007\u0007\u0000\u0000\u0857\u0858\u0005@"+ + "\u0000\u0000\u0858\u0859\u0007\u0006\u0000\u0000\u0859\u085a\u0007\u0015"+ + "\u0000\u0000\u085a\u085b\u0007\n\u0000\u0000\u085b\u085c\u0007\r\u0000"+ + "\u0000\u085c\u085d\u0005-\u0000\u0000\u085d\u085e\u0007\u0006\u0000\u0000"+ + "\u085e\u085f\u0007\u0007\u0000\u0000\u085f\u0860\u0007\u0010\u0000\u0000"+ + "\u0860\u0861\u0007\r\u0000\u0000\u0861\u0862\u0007\u0011\u0000\u0000\u0862"+ + "\u0863\u0007\u0016\u0000\u0000\u0863\u0864\u0007\u0007\u0000\u0000\u0864"+ + "\u0865\u0005-\u0000\u0000\u0865\u0866\u0007\u001c\u0000\u0000\u0866\u0867"+ + "\u0007\u0010\u0000\u0000\u0867\u0868\u0007\b\u0000\u0000\u0868\u0869\u0007"+ + "\u0011\u0000\u0000\u0869\u086a\u0007\u0007\u0000\u0000\u086a\u08de\u0007"+ + "\t\u0000\u0000\u086b\u086c\u0005@\u0000\u0000\u086c\u086d\u0007\u0013"+ + "\u0000\u0000\u086d\u086e\u0007\u0016\u0000\u0000\u086e\u086f\u0007\u0015"+ + "\u0000\u0000\u086f\u0870\u0007\u0013\u0000\u0000\u0870\u0871\u0007\u0007"+ + "\u0000\u0000\u0871\u0872\u0007\u0016\u0000\u0000\u0872\u0873\u0007\r\u0000"+ + "\u0000\u0873\u08de\u0007\u0014\u0000\u0000\u0874\u0875\u0005@\u0000\u0000"+ + "\u0875\u0876\u0007\t\u0000\u0000\u0876\u0877\u0007\u000e\u0000\u0000\u0877"+ + "\u0878\u0007\u0015\u0000\u0000\u0878\u0879\u0007\u0013\u0000\u0000\u0879"+ + "\u08de\u0007\u0007\u0000\u0000\u087a\u087b\u0005@\u0000\u0000\u087b\u087c"+ + "\u0007\t\u0000\u0000\u087c\u087d\u0007\r\u0000\u0000\u087d\u087e\u0007"+ + "\u0010\u0000\u0000\u087e\u087f\u0007\u0016\u0000\u0000\u087f\u0880\u0007"+ + "\r\u0000\u0000\u0880\u0881\u0007\u0005\u0000\u0000\u0881\u0882\u0007\n"+ + "\u0000\u0000\u0882\u0883\u0007\u001b\u0000\u0000\u0883\u0884\u0005-\u0000"+ + "\u0000\u0884\u0885\u0007\t\u0000\u0000\u0885\u0886\u0007\r\u0000\u0000"+ + "\u0886\u0887\u0007\u0014\u0000\u0000\u0887\u0888\u0007\b\u0000\u0000\u0888"+ + "\u08de\u0007\u0007\u0000\u0000\u0889\u088a\u0005@\u0000\u0000\u088a\u088b"+ + "\u0007\t\u0000\u0000\u088b\u088c\u0007\u0011\u0000\u0000\u088c\u088d\u0007"+ + "\u0013\u0000\u0000\u088d\u088e\u0007\u0013\u0000\u0000\u088e\u088f\u0007"+ + "\u0015\u0000\u0000\u088f\u0890\u0007\u0016\u0000\u0000\u0890\u0891\u0007"+ + "\r\u0000\u0000\u0891\u08de\u0007\t\u0000\u0000\u0892\u0893\u0005@\u0000"+ + "\u0000\u0893\u0894\u0007\u001c\u0000\u0000\u0894\u0895\u0007\u0005\u0000"+ + "\u0000\u0895\u0896\u0007\u0007\u0000\u0000\u0896\u0897\u0007\f\u0000\u0000"+ + "\u0897\u0898\u0005-\u0000\u0000\u0898\u0899\u0007\r\u0000\u0000\u0899"+ + "\u089a\u0007\u0016\u0000\u0000\u089a\u089b\u0007\u0010\u0000\u0000\u089b"+ + "\u089c\u0007\n\u0000\u0000\u089c\u089d\u0007\t\u0000\u0000\u089d\u089e"+ + "\u0007\u0005\u0000\u0000\u089e\u089f\u0007\r\u0000\u0000\u089f\u08a0\u0007"+ + "\u0005\u0000\u0000\u08a0\u08a1\u0007\u0015\u0000\u0000\u08a1\u08de\u0007"+ + "\n\u0000\u0000\u08a2\u08a3\u0005@\u0000\u0000\u08a3\u08a4\u0007\u000e"+ + "\u0000\u0000\u08a4\u08a5\u0007\u0015\u0000\u0000\u08a5\u08a6\u0007\n\u0000"+ + "\u0000\u08a6\u08a7\u0007\r\u0000\u0000\u08a7\u08a8\u0007\u0010\u0000\u0000"+ + "\u08a8\u08a9\u0007\u0005\u0000\u0000\u08a9\u08aa\u0007\n\u0000\u0000\u08aa"+ + "\u08ab\u0007\u0007\u0000\u0000\u08ab\u08de\u0007\u0016\u0000\u0000\u08ac"+ + "\u08ad\u0005@\u0000\u0000\u08ad\u08ae\u0007\u000e\u0000\u0000\u08ae\u08af"+ + "\u0007\u0015\u0000\u0000\u08af\u08b0\u0007\b\u0000\u0000\u08b0\u08b1\u0007"+ + "\u0015\u0000\u0000\u08b1\u08b2\u0007\u0016\u0000\u0000\u08b2\u08b3\u0005"+ + "-\u0000\u0000\u08b3\u08b4\u0007\u0013\u0000\u0000\u08b4\u08b5\u0007\u0016"+ + "\u0000\u0000\u08b5\u08b6\u0007\u0015\u0000\u0000\u08b6\u08b7\u0007\u0006"+ + "\u0000\u0000\u08b7\u08b8\u0007\u0005\u0000\u0000\u08b8\u08b9\u0007\b\u0000"+ + "\u0000\u08b9\u08de\u0007\u0007\u0000\u0000\u08ba\u08bb\u0005@\u0000\u0000"+ + "\u08bb\u08bc\u0007\t\u0000\u0000\u08bc\u08bd\u0007\r\u0000\u0000\u08bd"+ + "\u08be\u0007\u0014\u0000\u0000\u08be\u08bf\u0007\b\u0000\u0000\u08bf\u08c0"+ + "\u0007\u0007\u0000\u0000\u08c0\u08c1\u0007\t\u0000\u0000\u08c1\u08c2\u0007"+ + "\u0007\u0000\u0000\u08c2\u08de\u0007\r\u0000\u0000\u08c3\u08c4\u0005@"+ + "\u0000\u0000\u08c4\u08c5\u0007\u0006\u0000\u0000\u08c5\u08c6\u0007\u0015"+ + "\u0000\u0000\u08c6\u08c7\u0007\n\u0000\u0000\u08c7\u08c8\u0007\r\u0000"+ + "\u0000\u08c8\u08c9\u0005-\u0000\u0000\u08c9\u08ca\u0007\u0013\u0000\u0000"+ + "\u08ca\u08cb\u0007\u0010\u0000\u0000\u08cb\u08cc\u0007\b\u0000\u0000\u08cc"+ + "\u08cd\u0007\u0007\u0000\u0000\u08cd\u08ce\u0007\r\u0000\u0000\u08ce\u08cf"+ + "\u0007\r\u0000\u0000\u08cf\u08d0\u0007\u0007\u0000\u0000\u08d0\u08d1\u0005"+ + "-\u0000\u0000\u08d1\u08d2\u0007\u001c\u0000\u0000\u08d2\u08d3\u0007\u0010"+ + "\u0000\u0000\u08d3\u08d4\u0007\b\u0000\u0000\u08d4\u08d5\u0007\u0011\u0000"+ + "\u0000\u08d5\u08d6\u0007\u0007\u0000\u0000\u08d6\u08de\u0007\t\u0000\u0000"+ + "\u08d7\u08d8\u0005@\u0000\u0000\u08d8\u08d9\u0007\u0012\u0000\u0000\u08d9"+ + "\u08da\u0007\u0007\u0000\u0000\u08da\u08db\u0007\u000b\u0000\u0000\u08db"+ + "\u08dc\u0007\u0005\u0000\u0000\u08dc\u08de\u0007\u0010\u0000\u0000\u08dd"+ + "\u07de\u0001\u0000\u0000\u0000\u08dd\u07e6\u0001\u0000\u0000\u0000\u08dd"+ + "\u07ed\u0001\u0000\u0000\u0000\u08dd\u07f7\u0001\u0000\u0000\u0000\u08dd"+ + "\u0800\u0001\u0000\u0000\u0000\u08dd\u080a\u0001\u0000\u0000\u0000\u08dd"+ + "\u080f\u0001\u0000\u0000\u0000\u08dd\u0815\u0001\u0000\u0000\u0000\u08dd"+ + "\u081e\u0001\u0000\u0000\u0000\u08dd\u0827\u0001\u0000\u0000\u0000\u08dd"+ + "\u082d\u0001\u0000\u0000\u0000\u08dd\u083f\u0001\u0000\u0000\u0000\u08dd"+ + "\u0849\u0001\u0000\u0000\u0000\u08dd\u0857\u0001\u0000\u0000\u0000\u08dd"+ + "\u086b\u0001\u0000\u0000\u0000\u08dd\u0874\u0001\u0000\u0000\u0000\u08dd"+ + "\u087a\u0001\u0000\u0000\u0000\u08dd\u0889\u0001\u0000\u0000\u0000\u08dd"+ + "\u0892\u0001\u0000\u0000\u0000\u08dd\u08a2\u0001\u0000\u0000\u0000\u08dd"+ + "\u08ac\u0001\u0000\u0000\u0000\u08dd\u08ba\u0001\u0000\u0000\u0000\u08dd"+ + "\u08c3\u0001\u0000\u0000\u0000\u08dd\u08d7\u0001\u0000\u0000\u0000\u08de"+ + "\u08e2\u0001\u0000\u0000\u0000\u08df\u08e1\u0007%\u0000\u0000\u08e0\u08df"+ + "\u0001\u0000\u0000\u0000\u08e1\u08e4\u0001\u0000\u0000\u0000\u08e2\u08e0"+ + "\u0001\u0000\u0000\u0000\u08e2\u08e3\u0001\u0000\u0000\u0000\u08e3\u08e6"+ + "\u0001\u0000\u0000\u0000\u08e4\u08e2\u0001\u0000\u0000\u0000\u08e5\u07b0"+ + "\u0001\u0000\u0000\u0000\u08e5\u07b3\u0001\u0000\u0000\u0000\u08e5\u07b9"+ + "\u0001\u0000\u0000\u0000\u08e5\u07bf\u0001\u0000\u0000\u0000\u08e5\u08dd"+ + "\u0001\u0000\u0000\u0000\u08e6\u08e7\u0001\u0000\u0000\u0000\u08e7\u08e8"+ + "\u0006~\t\u0000\u08e8\u010b\u0001\u0000\u0000\u0000\u08e9\u08ea\u0003"+ + "\u00fex\u0000\u08ea\u08eb\u0001\u0000\u0000\u0000\u08eb\u08ec\u0006\u007f"+ + "\u0012\u0000\u08ec\u010d\u0001\u0000\u0000\u0000\u08ed\u08ee\u0003\u0100"+ + "y\u0000\u08ee\u08ef\u0001\u0000\u0000\u0000\u08ef\u08f0\u0006\u0080\u0013"+ + "\u0000\u08f0\u010f\u0001\u0000\u0000\u0000\u08f1\u08f3\u0005\\\u0000\u0000"+ + "\u08f2\u08f1\u0001\u0000\u0000\u0000\u08f2\u08f3\u0001\u0000\u0000\u0000"+ + "\u08f3\u08f7\u0001\u0000\u0000\u0000\u08f4\u08f5\u0003\u00f0q\u0000\u08f5"+ + "\u08f6\u0005\\\u0000\u0000\u08f6\u08f8\u0001\u0000\u0000\u0000\u08f7\u08f4"+ + "\u0001\u0000\u0000\u0000\u08f8\u08f9\u0001\u0000\u0000\u0000\u08f9\u08f7"+ + "\u0001\u0000\u0000\u0000\u08f9\u08fa\u0001\u0000\u0000\u0000\u08fa\u08fb"+ + "\u0001\u0000\u0000\u0000\u08fb\u08fc\u0006\u0081\u0014\u0000\u08fc\u0111"+ + "\u0001\u0000\u0000\u0000\u08fd\u08fe\u0003\u00f0q\u0000\u08fe\u08ff\u0001"+ + "\u0000\u0000\u0000\u08ff\u0900\u0006\u0082\u0015\u0000\u0900\u0113\u0001"+ + "\u0000\u0000\u0000\u0901\u0902\u0005:\u0000\u0000\u0902\u0903\u0005:\u0000"+ + "\u0000\u0903\u0904\u0001\u0000\u0000\u0000\u0904\u0905\u0006\u0083\u0016"+ + "\u0000\u0905\u0115\u0001\u0000\u0000\u0000\u0906\u0907\u0005}\u0000\u0000"+ + "\u0907\u0908\u0005}\u0000\u0000\u0908\u0909\u0001\u0000\u0000\u0000\u0909"+ + "\u090a\u0006\u0084\u0017\u0000\u090a\u0117\u0001\u0000\u0000\u0000\u090b"+ + "\u090c\u0005(\u0000\u0000\u090c\u090d\u0001\u0000\u0000\u0000\u090d\u090e"+ + "\u0006\u0085\u0018\u0000\u090e\u0119\u0001\u0000\u0000\u0000\u090f\u0910"+ + "\u0005)\u0000\u0000\u0910\u0911\u0001\u0000\u0000\u0000\u0911\u0912\u0006"+ + "\u0086\u0019\u0000\u0912\u011b\u0001\u0000\u0000\u0000\u0913\u0914\u0005"+ + "-\u0000\u0000\u0914\u0915\u0005>\u0000\u0000\u0915\u0916\u0001\u0000\u0000"+ + "\u0000\u0916\u0917\u0006\u0087\u001a\u0000\u0917\u011d\u0001\u0000\u0000"+ + "\u0000\u0918\u0919\t\u0000\u0000\u0000\u0919\u091a\u0001\u0000\u0000\u0000"+ + "\u091a\u091b\u0006\u0088\r\u0000\u091b\u011f\u0001\u0000\u0000\u0000\u091c"+ + "\u091d\u0005\u0000\u0000\u0001\u091d\u091e\u0001\u0000\u0000\u0000\u091e"+ + "\u091f\u0006\u0089\u001b\u0000\u091f\u0920\u0006\u0089\u0017\u0000\u0920"+ + "\u0121\u0001\u0000\u0000\u0000\u0921\u0922\u0003\u00fex\u0000\u0922\u0923"+ + "\u0001\u0000\u0000\u0000\u0923\u0924\u0006\u008a\u0012\u0000\u0924\u0123"+ + "\u0001\u0000\u0000\u0000\u0925\u0926\u0003\u0100y\u0000\u0926\u0927\u0001"+ + "\u0000\u0000\u0000\u0927\u0928\u0006\u008b\u0013\u0000\u0928\u0125\u0001"+ + "\u0000\u0000\u0000\u0929\u092b\u0005\\\u0000\u0000\u092a\u0929\u0001\u0000"+ + "\u0000\u0000\u092a\u092b\u0001\u0000\u0000\u0000\u092b\u092f\u0001\u0000"+ + "\u0000\u0000\u092c\u092d\u0003\u00f0q\u0000\u092d\u092e\u0005\\\u0000"+ + "\u0000\u092e\u0930\u0001\u0000\u0000\u0000\u092f\u092c\u0001\u0000\u0000"+ + "\u0000\u0930\u0931\u0001\u0000\u0000\u0000\u0931\u092f\u0001\u0000\u0000"+ + "\u0000\u0931\u0932\u0001\u0000\u0000\u0000\u0932\u0933\u0001\u0000\u0000"+ + "\u0000\u0933\u0934\u0006\u008c\u0014\u0000\u0934\u0127\u0001\u0000\u0000"+ + "\u0000\u0935\u0936\u0003\u00f0q\u0000\u0936\u0937\u0001\u0000\u0000\u0000"+ + "\u0937\u0938\u0006\u008d\u0015\u0000\u0938\u0129\u0001\u0000\u0000\u0000"+ + "\u0939\u093a\u0005:\u0000\u0000\u093a\u093b\u0005:\u0000\u0000\u093b\u093c"+ + "\u0001\u0000\u0000\u0000\u093c\u093d\u0006\u008e\u0016\u0000\u093d\u012b"+ + "\u0001\u0000\u0000\u0000\u093e\u093f\u0005!\u0000\u0000\u093f\u0940\u0005"+ + "!\u0000\u0000\u0940\u0941\u0005}\u0000\u0000\u0941\u0942\u0001\u0000\u0000"+ + "\u0000\u0942\u0943\u0006\u008f\u0017\u0000\u0943\u012d\u0001\u0000\u0000"+ + "\u0000\u0944\u0945\u0005(\u0000\u0000\u0945\u0946\u0001\u0000\u0000\u0000"+ + "\u0946\u0947\u0006\u0090\u0018\u0000\u0947\u012f\u0001\u0000\u0000\u0000"+ + "\u0948\u0949\u0005)\u0000\u0000\u0949\u094a\u0001\u0000\u0000\u0000\u094a"+ + "\u094b\u0006\u0091\u0019\u0000\u094b\u0131\u0001\u0000\u0000\u0000\u094c"+ + "\u094d\u0005-\u0000\u0000\u094d\u094e\u0005>\u0000\u0000\u094e\u094f\u0001"+ + "\u0000\u0000\u0000\u094f\u0950\u0006\u0092\u001a\u0000\u0950\u0133\u0001"+ + "\u0000\u0000\u0000\u0951\u0952\t\u0000\u0000\u0000\u0952\u0953\u0001\u0000"+ + "\u0000\u0000\u0953\u0954\u0006\u0093\r\u0000\u0954\u0135\u0001\u0000\u0000"+ + "\u0000\u0955\u0956\u0005\u0000\u0000\u0001\u0956\u0957\u0001\u0000\u0000"+ + "\u0000\u0957\u0958\u0006\u0094\u001b\u0000\u0958\u0959\u0006\u0094\u0017"+ + "\u0000\u0959\u0137\u0001\u0000\u0000\u0000\u095a\u095c\u0007%\u0000\u0000"+ + "\u095b\u095a\u0001\u0000\u0000\u0000\u095c\u095d\u0001\u0000\u0000\u0000"+ + "\u095d\u095b\u0001\u0000\u0000\u0000\u095d\u095e\u0001\u0000\u0000\u0000"+ + "\u095e\u095f\u0001\u0000\u0000\u0000\u095f\u0960\u0004\u0095\u0007\u0000"+ + "\u0960\u0961\u0001\u0000\u0000\u0000\u0961\u0962\u0006\u0095\r\u0000\u0962"+ + "\u0963\u0006\u0095\u0017\u0000\u0963\u0139\u0001\u0000\u0000\u0000\u0964"+ + "\u0966\u0007%\u0000\u0000\u0965\u0964\u0001\u0000"; private static final String _serializedATNSegment1 = - "\u0000\u0983\u0984\u0001\u0000\u0000\u0000\u0984\u0985\u0006\u00a9\u0012"+ - "\u0000\u0985\u0161\u0001\u0000\u0000\u0000\u0986\u0987\u0003\u0100y\u0000"+ - "\u0987\u0988\u0001\u0000\u0000\u0000\u0988\u0989\u0006\u00aa\u0013\u0000"+ - "\u0989\u0163\u0001\u0000\u0000\u0000\u098a\u098c\u0005\\\u0000\u0000\u098b"+ - "\u098a\u0001\u0000\u0000\u0000\u098b\u098c\u0001\u0000\u0000\u0000\u098c"+ - "\u0990\u0001\u0000\u0000\u0000\u098d\u098e\u0003\u00f0q\u0000\u098e\u098f"+ - "\u0005\\\u0000\u0000\u098f\u0991\u0001\u0000\u0000\u0000\u0990\u098d\u0001"+ - "\u0000\u0000\u0000\u0991\u0992\u0001\u0000\u0000\u0000\u0992\u0990\u0001"+ - "\u0000\u0000\u0000\u0992\u0993\u0001\u0000\u0000\u0000\u0993\u0994\u0001"+ - "\u0000\u0000\u0000\u0994\u0995\u0006\u00ab\u0014\u0000\u0995\u0165\u0001"+ - "\u0000\u0000\u0000\u0996\u0997\u0003\u00f0q\u0000\u0997\u0998\u0001\u0000"+ - "\u0000\u0000\u0998\u0999\u0006\u00ac\u0015\u0000\u0999\u0167\u0001\u0000"+ - "\u0000\u0000\u099a\u099b\u0005:\u0000\u0000\u099b\u099c\u0005:\u0000\u0000"+ - "\u099c\u099d\u0001\u0000\u0000\u0000\u099d\u099e\u0006\u00ad\u0016\u0000"+ - "\u099e\u0169\u0001\u0000\u0000\u0000\u099f\u09a0\u0005(\u0000\u0000\u09a0"+ - "\u09a1\u0006\u00ae,\u0000\u09a1\u09a2\u0001\u0000\u0000\u0000\u09a2\u09a3"+ - "\u0006\u00ae\u0018\u0000\u09a3\u016b\u0001\u0000\u0000\u0000\u09a4\u09a5"+ - "\u0005)\u0000\u0000\u09a5\u09a6\u0006\u00af-\u0000\u09a6\u016d\u0001\u0000"+ - "\u0000\u0000\u09a7\u09a8\t\u0000\u0000\u0000\u09a8\u09a9\u0001\u0000\u0000"+ - "\u0000\u09a9\u09aa\u0006\u00b0\r\u0000\u09aa\u016f\u0001\u0000\u0000\u0000"+ - "\u09ab\u09ac\u0005\u0000\u0000\u0001\u09ac\u09ad\u0001\u0000\u0000\u0000"+ - "\u09ad\u09ae\u0006\u00b1\u001b\u0000\u09ae\u09af\u0006\u00b1\u0017\u0000"+ - "\u09af\u0171\u0001\u0000\u0000\u0000\u09b0\u09b2\u0007%\u0000\u0000\u09b1"+ - "\u09b0\u0001\u0000\u0000\u0000\u09b2\u09b3\u0001\u0000\u0000\u0000\u09b3"+ - "\u09b1\u0001\u0000\u0000\u0000\u09b3\u09b4\u0001\u0000\u0000\u0000\u09b4"+ - "\u09b5\u0001\u0000\u0000\u0000\u09b5\u09b6\u0006\u00b2\r\u0000\u09b6\u0173"+ - "\u0001\u0000\u0000\u0000\u09b7\u09b8\u0005(\u0000\u0000\u09b8\u09b9\u0006"+ - "\u00b3.\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b3"+ - "/\u0000\u09bb\u09bc\u0006\u00b30\u0000\u09bc\u0175\u0001\u0000\u0000\u0000"+ - "\u09bd\u09be\t\u0000\u0000\u0000\u09be\u09bf\u0001\u0000\u0000\u0000\u09bf"+ - "\u09c0\u0006\u00b4\t\u0000\u09c0\u09c1\u0006\u00b4\u0017\u0000\u09c1\u0177"+ - "\u0001\u0000\u0000\u0000\u09c2\u09c4\u0007%\u0000\u0000\u09c3\u09c2\u0001"+ - "\u0000\u0000\u0000\u09c4\u09c5\u0001\u0000\u0000\u0000\u09c5\u09c3\u0001"+ - "\u0000\u0000\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6\u09c7\u0001"+ - "\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b5\r\u0000\u09c8\u0179\u0001\u0000"+ - "\u0000\u0000\u09c9\u09ca\u0005(\u0000\u0000\u09ca\u09cb\u0006\u00b61\u0000"+ - "\u09cb\u017b\u0001\u0000\u0000\u0000\u09cc\u09cd\u0005)\u0000\u0000\u09cd"+ - "\u09ce\u0006\u00b72\u0000\u09ce\u017d\u0001\u0000\u0000\u0000\u09cf\u09d0"+ - "\u0007\u0010\u0000\u0000\u09d0\u09d1\u0007\t\u0000\u0000\u09d1\u017f\u0001"+ - "\u0000\u0000\u0000\u09d2\u09d3\u0003\u00fex\u0000\u09d3\u09d4\u0001\u0000"+ - "\u0000\u0000\u09d4\u09d5\u0006\u00b9\u0012\u0000\u09d5\u0181\u0001\u0000"+ - "\u0000\u0000\u09d6\u09d7\u0005=\u0000\u0000\u09d7\u09d8\u0005>\u0000\u0000"+ - "\u09d8\u0183\u0001\u0000\u0000\u0000\u09d9\u09da\u0003\u0100y\u0000\u09da"+ - "\u09db\u0001\u0000\u0000\u0000\u09db\u09dc\u0006\u00bb \u0000\u09dc\u0185"+ - "\u0001\u0000\u0000\u0000\u09dd\u09e1\u0003\u00f8u\u0000\u09de\u09e1\u0003"+ - "\u00fav\u0000\u09df\u09e1\u0003\u00f0q\u0000\u09e0\u09dd\u0001\u0000\u0000"+ - "\u0000\u09e0\u09de\u0001\u0000\u0000\u0000\u09e0\u09df\u0001\u0000\u0000"+ - "\u0000\u09e1\u09e2\u0001\u0000\u0000\u0000\u09e2\u09e3\u0006\u00bc \u0000"+ - "\u09e3\u0187\u0001\u0000\u0000\u0000\u09e4\u09e5\u0005:\u0000\u0000\u09e5"+ - "\u09e6\u0005:\u0000\u0000\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8"+ - "\u0006\u00bd \u0000\u09e8\u0189\u0001\u0000\u0000\u0000\u09e9\u09ea\t"+ - "\u0000\u0000\u0000\u09ea\u09eb\u0001\u0000\u0000\u0000\u09eb\u09ec\u0006"+ - "\u00be \u0000\u09ec\u018b\u0001\u0000\u0000\u0000\u09ed\u09ee\u0005\u0000"+ - "\u0000\u0001\u09ee\u09ef\u0001\u0000\u0000\u0000\u09ef\u09f0\u0006\u00bf"+ - "\u001b\u0000\u09f0\u09f1\u0006\u00bf\u0017\u0000\u09f1\u018d\u0001\u0000"+ - "\u0000\u0000\u09f2\u09f3\u0003\u00fcw\u0000\u09f3\u09f4\u0001\u0000\u0000"+ - "\u0000\u09f4\u09f5\u0006\u00c03\u0000\u09f5\u018f\u0001\u0000\u0000\u0000"+ - "\u09f6\u09f7\u0005[\u0000\u0000\u09f7\u09f8\u0006\u00c14\u0000\u09f8\u0191"+ - "\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005]\u0000\u0000\u09fa\u09fb\u0006"+ - "\u00c25\u0000\u09fb\u0193\u0001\u0000\u0000\u0000\u09fc\u09fd\u0005{\u0000"+ - "\u0000\u09fd\u09fe\u0006\u00c36\u0000\u09fe\u09ff\u0001\u0000\u0000\u0000"+ - "\u09ff\u0a00\u0006\u00c37\u0000\u0a00\u0195\u0001\u0000\u0000\u0000\u0a01"+ - "\u0a02\u0005}\u0000\u0000\u0a02\u0a03\u0006\u00c48\u0000\u0a03\u0a04\u0001"+ - "\u0000\u0000\u0000\u0a04\u0a05\u0006\u00c47\u0000\u0a05\u0197\u0001\u0000"+ - "\u0000\u0000\u0a06\u0a07\u0005(\u0000\u0000\u0a07\u0a08\u0006\u00c59\u0000"+ - "\u0a08\u0a09\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0006\u00c57\u0000\u0a0a"+ - "\u0199\u0001\u0000\u0000\u0000\u0a0b\u0a0c\u0005)\u0000\u0000\u0a0c\u0a0d"+ - "\u0006\u00c6:\u0000\u0a0d\u019b\u0001\u0000\u0000\u0000\u0a0e\u0a11\u0003"+ - "\u00f8u\u0000\u0a0f\u0a11\u0003\u00fav\u0000\u0a10\u0a0e\u0001\u0000\u0000"+ - "\u0000\u0a10\u0a0f\u0001\u0000\u0000\u0000\u0a11\u019d\u0001\u0000\u0000"+ - "\u0000\u0a12\u0a13\u0003\u00fex\u0000\u0a13\u0a14\u0001\u0000\u0000\u0000"+ - "\u0a14\u0a15\u0006\u00c8\u0012\u0000\u0a15\u019f\u0001\u0000\u0000\u0000"+ - "\u0a16\u0a17\u0005=\u0000\u0000\u0a17\u0a18\u0005>\u0000\u0000\u0a18\u01a1"+ - "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0003\u0100y\u0000\u0a1a\u0a1b\u0001"+ - "\u0000\u0000\u0000\u0a1b\u0a1c\u0006\u00ca\u0013\u0000\u0a1c\u01a3\u0001"+ - "\u0000\u0000\u0000\u0a1d\u0a1e\u0005.\u0000\u0000\u0a1e\u01a5\u0001\u0000"+ - "\u0000\u0000\u0a1f\u0a20\u0005,\u0000\u0000\u0a20\u0a21\u0006\u00cc;\u0000"+ - "\u0a21\u01a7\u0001\u0000\u0000\u0000\u0a22\u0a24\u0007&\u0000\u0000\u0a23"+ - "\u0a22\u0001\u0000\u0000\u0000\u0a24\u0a25\u0001\u0000\u0000\u0000\u0a25"+ - "\u0a23\u0001\u0000\u0000\u0000\u0a25\u0a26\u0001\u0000\u0000\u0000\u0a26"+ - "\u0a27\u0001\u0000\u0000\u0000\u0a27\u0a28\u0006\u00cd\r\u0000\u0a28\u01a9"+ - "\u0001\u0000\u0000\u0000\u0a29\u0a2a\u0003\u00f0q\u0000\u0a2a\u01ab\u0001"+ - "\u0000\u0000\u0000\u0a2b\u0a2c\t\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000"+ - "\u0000\u0000\u0a2d\u0a2e\u0006\u00cf7\u0000\u0a2e\u01ad\u0001\u0000\u0000"+ - "\u0000\u0a2f\u0a30\u0005\u0000\u0000\u0001\u0a30\u0a31\u0001\u0000\u0000"+ - "\u0000\u0a31\u0a32\u0006\u00d0\u001b\u0000\u0a32\u0a33\u0006\u00d0\u0017"+ - "\u0000\u0a33\u01af\u0001\u0000\u0000\u0000\u0a34\u0a35\u0005/\u0000\u0000"+ - "\u0a35\u0a36\u0005/\u0000\u0000\u0a36\u0a38\u0001\u0000\u0000\u0000\u0a37"+ - "\u0a39\b\u001f\u0000\u0000\u0a38\u0a37\u0001\u0000\u0000\u0000\u0a39\u0a3a"+ - "\u0001\u0000\u0000\u0000\u0a3a\u0a38\u0001\u0000\u0000\u0000\u0a3a\u0a3b"+ - "\u0001\u0000\u0000\u0000\u0a3b\u0a3c\u0001\u0000\u0000\u0000\u0a3c\u0a3d"+ - "\u0006\u00d1\r\u0000\u0a3d\u01b1\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0005"+ - "/\u0000\u0000\u0a3f\u0a40\u0005*\u0000\u0000\u0a40\u0a44\u0001\u0000\u0000"+ - "\u0000\u0a41\u0a43\t\u0000\u0000\u0000\u0a42\u0a41\u0001\u0000\u0000\u0000"+ - "\u0a43\u0a46\u0001\u0000\u0000\u0000\u0a44\u0a45\u0001\u0000\u0000\u0000"+ - "\u0a44\u0a42\u0001\u0000\u0000\u0000\u0a45\u0a47\u0001\u0000\u0000\u0000"+ - "\u0a46\u0a44\u0001\u0000\u0000\u0000\u0a47\u0a48\u0005*\u0000\u0000\u0a48"+ - "\u0a49\u0005/\u0000\u0000\u0a49\u0a4d\u0001\u0000\u0000\u0000\u0a4a\u0a4c"+ - "\u0007\u001f\u0000\u0000\u0a4b\u0a4a\u0001\u0000\u0000\u0000\u0a4c\u0a4f"+ - "\u0001\u0000\u0000\u0000\u0a4d\u0a4b\u0001\u0000\u0000\u0000\u0a4d\u0a4e"+ - "\u0001\u0000\u0000\u0000\u0a4e\u0a50\u0001\u0000\u0000\u0000\u0a4f\u0a4d"+ - "\u0001\u0000\u0000\u0000\u0a50\u0a51\u0006\u00d2\r\u0000\u0a51\u01b3\u0001"+ - "\u0000\u0000\u0000\u0a52\u0a53\u0005@\u0000\u0000\u0a53\u0a54\u0007\u0007"+ - "\u0000\u0000\u0a54\u0a55\u0007\n\u0000\u0000\u0a55\u0a56\u0007\u000b\u0000"+ - "\u0000\u0a56\u0a57\u0007\u0013\u0000\u0000\u0a57\u0a58\u0007\u000f\u0000"+ - "\u0000\u0a58\u0a59\u0007\u0013\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000"+ - "\u0000\u0a5a\u0a5b\u0006\u00d3\u0017\u0000\u0a5b\u01b5\u0001\u0000\u0000"+ - "\u0000\u0a5c\u0a5d\u0005@\u0000\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000"+ - "\u0a5e\u0a5f\u0006\u00d4\t\u0000\u0a5f\u0a60\u0006\u00d4\u0017\u0000\u0a60"+ - "\u01b7\u0001\u0000\u0000\u0000\u0a61\u0a62\u0005[\u0000\u0000\u0a62\u0a63"+ - "\u0001\u0000\u0000\u0000\u0a63\u0a64\u0006\u00d5 \u0000\u0a64\u01b9\u0001"+ - "\u0000\u0000\u0000\u0a65\u0a66\u0005]\u0000\u0000\u0a66\u0a67\u0001\u0000"+ - "\u0000\u0000\u0a67\u0a68\u0006\u00d6 \u0000\u0a68\u01bb\u0001\u0000\u0000"+ - "\u0000\u0a69\u0a6a\u0005{\u0000\u0000\u0a6a\u0a6b\u0001\u0000\u0000\u0000"+ - "\u0a6b\u0a6c\u0006\u00d7 \u0000\u0a6c\u01bd\u0001\u0000\u0000\u0000\u0a6d"+ - "\u0a6e\u0005}\u0000\u0000\u0a6e\u0a6f\u0001\u0000\u0000\u0000\u0a6f\u0a70"+ - "\u0006\u00d8 \u0000\u0a70\u01bf\u0001\u0000\u0000\u0000\u0a71\u0a74\u0003"+ - "\u00f8u\u0000\u0a72\u0a74\u0003\u00fav\u0000\u0a73\u0a71\u0001\u0000\u0000"+ - "\u0000\u0a73\u0a72\u0001\u0000\u0000\u0000\u0a74\u0a75\u0001\u0000\u0000"+ - "\u0000\u0a75\u0a76\u0006\u00d9<\u0000\u0a76\u01c1\u0001\u0000\u0000\u0000"+ - "\u0a77\u0a78\u0003\u00fex\u0000\u0a78\u0a79\u0001\u0000\u0000\u0000\u0a79"+ - "\u0a7a\u0006\u00da\u0012\u0000\u0a7a\u01c3\u0001\u0000\u0000\u0000\u0a7b"+ - "\u0a7c\u0007\n\u0000\u0000\u0a7c\u0a7d\u0007\u0007\u0000\u0000\u0a7d\u0a7e"+ - "\u0007\f\u0000\u0000\u0a7e\u0a7f\u0001\u0000\u0000\u0000\u0a7f\u0a80\u0004"+ - "\u00db\u000e\u0000\u0a80\u0a81\u0001\u0000\u0000\u0000\u0a81\u0a82\u0006"+ - "\u00db=\u0000\u0a82\u01c5\u0001\u0000\u0000\u0000\u0a83\u0a84\u0007\u000e"+ - "\u0000\u0000\u0a84\u0a85\u0007\b\u0000\u0000\u0a85\u0a86\u0007\u0010\u0000"+ - "\u0000\u0a86\u0a87\u0007\t\u0000\u0000\u0a87\u0a88\u0007\t\u0000\u0000"+ - "\u0a88\u0a89\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0006\u00dc>\u0000\u0a8a"+ - "\u01c7\u0001\u0000\u0000\u0000\u0a8b\u0a8c\u0003\u0100y\u0000\u0a8c\u0a8d"+ - "\u0001\u0000\u0000\u0000\u0a8d\u0a8e\u0006\u00dd\u0013\u0000\u0a8e\u01c9"+ - "\u0001\u0000\u0000\u0000\u0a8f\u0a91\u0005\\\u0000\u0000\u0a90\u0a8f\u0001"+ - "\u0000\u0000\u0000\u0a90\u0a91\u0001\u0000\u0000\u0000\u0a91\u0a95\u0001"+ - "\u0000\u0000\u0000\u0a92\u0a93\u0003\u00f0q\u0000\u0a93\u0a94\u0005\\"+ - "\u0000\u0000\u0a94\u0a96\u0001\u0000\u0000\u0000\u0a95\u0a92\u0001\u0000"+ - "\u0000\u0000\u0a96\u0a97\u0001\u0000\u0000\u0000\u0a97\u0a95\u0001\u0000"+ - "\u0000\u0000\u0a97\u0a98\u0001\u0000\u0000\u0000\u0a98\u0a99\u0001\u0000"+ - "\u0000\u0000\u0a99\u0a9a\u0006\u00de\u0014\u0000\u0a9a\u01cb\u0001\u0000"+ - "\u0000\u0000\u0a9b\u0a9c\u0005\\\u0000\u0000\u0a9c\u0a9d\u0003\u00f0q"+ - "\u0000\u0a9d\u0a9e\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00df\u0015"+ - "\u0000\u0a9f\u01cd\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0003\u00f0q\u0000"+ - "\u0aa1\u0aa2\u0001\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e0\u0015\u0000"+ - "\u0aa3\u01cf\u0001\u0000\u0000\u0000\u0aa4\u0aa5\u0005:\u0000\u0000\u0aa5"+ - "\u0aa6\u0005:\u0000\u0000\u0aa6\u0aa7\u0001\u0000\u0000\u0000\u0aa7\u0aa8"+ - "\u0006\u00e1\u0016\u0000\u0aa8\u01d1\u0001\u0000\u0000\u0000\u0aa9\u0aaa"+ - "\u0005(\u0000\u0000\u0aaa\u0aab\u0001\u0000\u0000\u0000\u0aab\u0aac\u0006"+ - "\u00e2\u0018\u0000\u0aac\u01d3\u0001\u0000\u0000\u0000\u0aad\u0aae\u0005"+ - ")\u0000\u0000\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e3"+ - "\u0019\u0000\u0ab0\u01d5\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005 \u0000"+ - "\u0000\u0ab2\u0ab3\u0001\u0000\u0000\u0000\u0ab3\u0ab4\u0006\u00e4\r\u0000"+ - "\u0ab4\u01d7\u0001\u0000\u0000\u0000\u0ab5\u0ab6\u0005\u0000\u0000\u0001"+ - "\u0ab6\u0ab7\u0001\u0000\u0000\u0000\u0ab7\u0ab8\u0006\u00e5\u001b\u0000"+ - "\u0ab8\u0ab9\u0006\u00e5\u0017\u0000\u0ab9\u01d9\u0001\u0000\u0000\u0000"+ - "\u0aba\u0abb\t\u0000\u0000\u0000\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc"+ - "\u0abd\u0006\u00e6\r\u0000\u0abd\u01db\u0001\u0000\u0000\u0000\u0abe\u0abf"+ - "\u0005?\u0000\u0000\u0abf\u0ac0\u0005>\u0000\u0000\u0ac0\u0ac1\u0001\u0000"+ - "\u0000\u0000\u0ac1\u0ac2\u0006\u00e7\u0017\u0000\u0ac2\u01dd\u0001\u0000"+ - "\u0000\u0000\u0ac3\u0ac4\u0005/\u0000\u0000\u0ac4\u0ac5\u0005/\u0000\u0000"+ - "\u0ac5\u0ac7\u0001\u0000\u0000\u0000\u0ac6\u0ac8\b\u001f\u0000\u0000\u0ac7"+ - "\u0ac6\u0001\u0000\u0000\u0000\u0ac8\u0ac9\u0001\u0000\u0000\u0000\u0ac9"+ - "\u0ac7\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0001\u0000\u0000\u0000\u0aca"+ - "\u0acb\u0001\u0000\u0000\u0000\u0acb\u0acc\u0006\u00e8\r\u0000\u0acc\u01df"+ - "\u0001\u0000\u0000\u0000\u0acd\u0ace\u0005/\u0000\u0000\u0ace\u0acf\u0005"+ - "*\u0000\u0000\u0acf\u0ad3\u0001\u0000\u0000\u0000\u0ad0\u0ad2\t\u0000"+ - "\u0000\u0000\u0ad1\u0ad0\u0001\u0000\u0000\u0000\u0ad2\u0ad5\u0001\u0000"+ - "\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad3\u0ad1\u0001\u0000"+ - "\u0000\u0000\u0ad4\u0ad6\u0001\u0000\u0000\u0000\u0ad5\u0ad3\u0001\u0000"+ - "\u0000\u0000\u0ad6\u0ad7\u0005*\u0000\u0000\u0ad7\u0ad8\u0005/\u0000\u0000"+ - "\u0ad8\u0ad9\u0001\u0000\u0000\u0000\u0ad9\u0ada\u0006\u00e9\r\u0000\u0ada"+ - "\u01e1\u0001\u0000\u0000\u0000\u0adb\u0adc\u0005[\u0000\u0000\u0adc\u0add"+ - "\u0001\u0000\u0000\u0000\u0add\u0ade\u0006\u00ea \u0000\u0ade\u01e3\u0001"+ - "\u0000\u0000\u0000\u0adf\u0ae0\u0005]\u0000\u0000\u0ae0\u0ae1\u0001\u0000"+ - "\u0000\u0000\u0ae1\u0ae2\u0006\u00eb \u0000\u0ae2\u01e5\u0001\u0000\u0000"+ - "\u0000\u0ae3\u0ae4\u0005{\u0000\u0000\u0ae4\u0ae5\u0001\u0000\u0000\u0000"+ - "\u0ae5\u0ae6\u0006\u00ec \u0000\u0ae6\u01e7\u0001\u0000\u0000\u0000\u0ae7"+ - "\u0ae8\u0005}\u0000\u0000\u0ae8\u0ae9\u0001\u0000\u0000\u0000\u0ae9\u0aea"+ - "\u0006\u00ed \u0000\u0aea\u01e9\u0001\u0000\u0000\u0000\u0aeb\u0aee\u0003"+ - "\u00f8u\u0000\u0aec\u0aee\u0003\u00fav\u0000\u0aed\u0aeb\u0001\u0000\u0000"+ - "\u0000\u0aed\u0aec\u0001\u0000\u0000\u0000\u0aee\u0aef\u0001\u0000\u0000"+ - "\u0000\u0aef\u0af0\u0006\u00ee<\u0000\u0af0\u01eb\u0001\u0000\u0000\u0000"+ - "\u0af1\u0af2\u0003\u00fex\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3"+ - "\u0af4\u0006\u00ef\u0012\u0000\u0af4\u01ed\u0001\u0000\u0000\u0000\u0af5"+ - "\u0af6\u0003\u0100y\u0000\u0af6\u0af7\u0001\u0000\u0000\u0000\u0af7\u0af8"+ - "\u0006\u00f0\u0013\u0000\u0af8\u01ef\u0001\u0000\u0000\u0000\u0af9\u0afa"+ - "\u0003\u00f0q\u0000\u0afa\u0afb\u0001\u0000\u0000\u0000\u0afb\u0afc\u0006"+ - "\u00f1\u0015\u0000\u0afc\u01f1\u0001\u0000\u0000\u0000\u0afd\u0afe\u0005"+ - ":\u0000\u0000\u0afe\u0aff\u0005:\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000"+ - "\u0000\u0b00\u0b01\u0006\u00f2\u0016\u0000\u0b01\u01f3\u0001\u0000\u0000"+ - "\u0000\u0b02\u0b03\u0005-\u0000\u0000\u0b03\u0b04\u0005>\u0000\u0000\u0b04"+ - "\u0b05\u0001\u0000\u0000\u0000\u0b05\u0b06\u0006\u00f3\u001a\u0000\u0b06"+ - "\u01f5\u0001\u0000\u0000\u0000\u0b07\u0b08\u0005(\u0000\u0000\u0b08\u0b09"+ - "\u0001\u0000\u0000\u0000\u0b09\u0b0a\u0006\u00f4\u0018\u0000\u0b0a\u01f7"+ - "\u0001\u0000\u0000\u0000\u0b0b\u0b0c\u0005)\u0000\u0000\u0b0c\u0b0d\u0001"+ - "\u0000\u0000\u0000\u0b0d\u0b0e\u0006\u00f5\u0019\u0000\u0b0e\u01f9\u0001"+ - "\u0000\u0000\u0000\u0b0f\u0b10\u0005\u0000\u0000\u0001\u0b10\u0b11\u0001"+ - "\u0000\u0000\u0000\u0b11\u0b12\u0006\u00f6 \u0000\u0b12\u0b13\u0006\u00f6"+ - "\u0017\u0000\u0b13\u01fb\u0001\u0000\u0000\u0000\u0b14\u0b15\t\u0000\u0000"+ - "\u0000\u0b15\u0b16\u0001\u0000\u0000\u0000\u0b16\u0b17\u0006\u00f7 \u0000"+ - "\u0b17\u01fd\u0001\u0000\u0000\u0000\u0b18\u0b19\u0005@\u0000\u0000\u0b19"+ - "\u0b1a\u0007\u0007\u0000\u0000\u0b1a\u0b1b\u0007\n\u0000\u0000\u0b1b\u0b1c"+ - "\u0007\u000b\u0000\u0000\u0b1c\u0b1d\u0007\u001c\u0000\u0000\u0b1d\u0b1e"+ - "\u0007\u0007\u0000\u0000\u0b1e\u0b1f\u0007\u0016\u0000\u0000\u0b1f\u0b20"+ - "\u0007\u0017\u0000\u0000\u0b20\u0b21\u0007\u0010\u0000\u0000\u0b21\u0b22"+ - "\u0007\r\u0000\u0000\u0b22\u0b23\u0007\u0005\u0000\u0000\u0b23\u0b24\u0007"+ - "\u0012\u0000\u0000\u0b24\u0b25\u0001\u0000\u0000\u0000\u0b25\u0b26\u0006"+ - "\u00f8?\u0000\u0b26\u0b27\u0006\u00f8!\u0000\u0b27\u01ff\u0001\u0000\u0000"+ - "\u0000\u0b28\u0b29\t\u0000\u0000\u0000\u0b29\u0b2a\u0004\u00f9\u000f\u0000"+ - "\u0b2a\u0b2b\u0001\u0000\u0000\u0000\u0b2b\u0b2c\u0006\u00f9\r\u0000\u0b2c"+ - "\u0201\u0001\u0000\u0000\u0000\u0b2d\u0b2e\u0005\u0000\u0000\u0001\u0b2e"+ - "\u0b2f\u0001\u0000\u0000\u0000\u0b2f\u0b30\u0006\u00fa\u001b\u0000\u0b30"+ - "\u0b31\u0006\u00fa!\u0000\u0b31\u0203\u0001\u0000\u0000\u0000\u0b32\u0b33"+ - "\t\u0000\u0000\u0000\u0b33\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006"+ - "\u00fb\u001c\u0000\u0b35\u0205\u0001\u0000\u0000\u0000\u0b36\u0b37\u0005"+ - "-\u0000\u0000\u0b37\u0b38\u0005-\u0000\u0000\u0b38\u0b39\u0005}\u0000"+ - "\u0000\u0b39\u0b3a\u0005}\u0000\u0000\u0b3a\u0b3b\u0001\u0000\u0000\u0000"+ - "\u0b3b\u0b3c\u0006\u00fc\u0017\u0000\u0b3c\u0b3d\u0006\u00fc\r\u0000\u0b3d"+ - "\u0207\u0001\u0000\u0000\u0000\u0b3e\u0b3f\t\u0000\u0000\u0000\u0b3f\u0b40"+ - "\u0004\u00fd\u0010\u0000\u0b40\u0b41\u0001\u0000\u0000\u0000\u0b41\u0b42"+ - "\u0006\u00fd\r\u0000\u0b42\u0209\u0001\u0000\u0000\u0000\u0b43\u0b44\t"+ - "\u0000\u0000\u0000\u0b44\u0b45\u0001\u0000\u0000\u0000\u0b45\u0b46\u0006"+ - "\u00fe\r\u0000\u0b46\u020b\u0001\u0000\u0000\u0000\u0b47\u0b48\u0005\u0000"+ - "\u0000\u0001\u0b48\u0b49\u0001\u0000\u0000\u0000\u0b49\u0b4a\u0006\u00ff"+ - "\u0017\u0000\u0b4a\u0b4b\u0006\u00ff\r\u0000\u0b4b\u020d\u0001\u0000\u0000"+ - "\u0000j\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+ - "\r\u0212\u0216\u021c\u0220\u0227\u022e\u0234\u023a\u0241\u0246\u024d\u0253"+ - "\u025d\u0263\u0269\u0270\u027c\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e"+ - "\u059e\u05ca\u05ed\u0653\u0699\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9"+ - "\u06e0\u06f4\u06fc\u0703\u070b\u070f\u0718\u071b\u0722\u0729\u072e\u073a"+ - "\u073f\u0741\u074d\u0754\u075b\u0763\u0765\u076e\u0770\u077b\u0793\u07a8"+ - "\u07ac\u07b7\u07bd\u07c9\u07cd\u0893\u0898\u089b\u08a8\u08af\u08e0\u08e7"+ - "\u0913\u091d\u095c\u0980\u098b\u0992\u09b3\u09c5\u09e0\u0a10\u0a25\u0a3a"+ - "\u0a44\u0a4d\u0a73\u0a90\u0a97\u0ac9\u0ad3\u0aed@\u0005\u0005\u0000\u0005"+ - "\u0003\u0000\u0005\b\u0000\u0005\u0007\u0000\u0007g\u0000\u0005\n\u0000"+ - "\u0005\f\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0007\u0017\u0000\u0005"+ - "\u000b\u0000\u0001c\u0000\u0007s\u0000\u0006\u0000\u0000\u0001h\u0001"+ - "\u0001i\u0002\u0001m\u0003\u0005\r\u0000\u0007\u0002\u0000\u0007\u0003"+ - "\u0000\u0007\u0006\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0004\u0000"+ - "\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007\t\u0000\u0007\u0016\u0000"+ - "\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a\u0004\u0001\u009b\u0005"+ - "\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c\u0006\u0001\u009d\u0007"+ - "\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t\u0007\u000f\u0000\u0001"+ - "\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001\u00a7\f\u0001\u00ae"+ - "\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b\u0000\u0005\t\u0000"+ - "\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000\u0001\u00c1\u0012"+ - "\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001\u00c4\u0015\u0001"+ - "\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007\u0015\u0000\u0007"+ - "\u0004\u0000\u0007\b\u0000\u0007i\u0000"; + "\u0000\u0000\u0966\u0967\u0001\u0000\u0000\u0000\u0967\u0965\u0001\u0000"+ + "\u0000\u0000\u0967\u0968\u0001\u0000\u0000\u0000\u0968\u0969\u0001\u0000"+ + "\u0000\u0000\u0969\u096a\u0006\u0096\r\u0000\u096a\u013b\u0001\u0000\u0000"+ + "\u0000\u096b\u096c\u0005(\u0000\u0000\u096c\u096d\u0001\u0000\u0000\u0000"+ + "\u096d\u096e\u0006\u0097\u001c\u0000\u096e\u096f\u0006\u0097\u001d\u0000"+ + "\u096f\u013d\u0001\u0000\u0000\u0000\u0970\u0971\t\u0000\u0000\u0000\u0971"+ + "\u0972\u0004\u0098\b\u0000\u0972\u0973\u0001\u0000\u0000\u0000\u0973\u0974"+ + "\u0006\u0098\t\u0000\u0974\u0975\u0006\u0098\u0017\u0000\u0975\u013f\u0001"+ + "\u0000\u0000\u0000\u0976\u0977\t\u0000\u0000\u0000\u0977\u0978\u0001\u0000"+ + "\u0000\u0000\u0978\u0979\u0006\u0099\t\u0000\u0979\u097a\u0006\u0099\u0017"+ + "\u0000\u097a\u0141\u0001\u0000\u0000\u0000\u097b\u097c\u0004\u009a\t\u0000"+ + "\u097c\u097d\u0005(\u0000\u0000\u097d\u097e\u0006\u009a\u001e\u0000\u097e"+ + "\u097f\u0001\u0000\u0000\u0000\u097f\u0980\u0006\u009a\u001c\u0000\u0980"+ + "\u0143\u0001\u0000\u0000\u0000\u0981\u0982\u0004\u009b\n\u0000\u0982\u0983"+ + "\u0005)\u0000\u0000\u0983\u0984\u0006\u009b\u001f\u0000\u0984\u0985\u0001"+ + "\u0000\u0000\u0000\u0985\u0986\u0006\u009b \u0000\u0986\u0987\u0006\u009b"+ + "!\u0000\u0987\u0145\u0001\u0000\u0000\u0000\u0988\u0989\u0004\u009c\u000b"+ + "\u0000\u0989\u098a\u0005(\u0000\u0000\u098a\u098b\u0006\u009c\"\u0000"+ + "\u098b\u098c\u0001\u0000\u0000\u0000\u098c\u098d\u0006\u009c\u001c\u0000"+ + "\u098d\u0147\u0001\u0000\u0000\u0000\u098e\u098f\u0004\u009d\f\u0000\u098f"+ + "\u0990\u0005)\u0000\u0000\u0990\u0991\u0006\u009d#\u0000\u0991\u0992\u0001"+ + "\u0000\u0000\u0000\u0992\u0993\u0006\u009d\u001c\u0000\u0993\u0149\u0001"+ + "\u0000\u0000\u0000\u0994\u0995\u0005)\u0000\u0000\u0995\u0996\u0004\u009e"+ + "\r\u0000\u0996\u0997\u0001\u0000\u0000\u0000\u0997\u0998\u0006\u009e "+ + "\u0000\u0998\u0999\u0006\u009e!\u0000\u0999\u014b\u0001\u0000\u0000\u0000"+ + "\u099a\u099b\t\u0000\u0000\u0000\u099b\u099c\u0001\u0000\u0000\u0000\u099c"+ + "\u099d\u0006\u009f\u001c\u0000\u099d\u014d\u0001\u0000\u0000\u0000\u099e"+ + "\u099f\u0005\u0000\u0000\u0001\u099f\u09a0\u0001\u0000\u0000\u0000\u09a0"+ + "\u09a1\u0006\u00a0\u001b\u0000\u09a1\u09a2\u0006\u00a0\u0017\u0000\u09a2"+ + "\u014f\u0001\u0000\u0000\u0000\u09a3\u09a5\u0007%\u0000\u0000\u09a4\u09a3"+ + "\u0001\u0000\u0000\u0000\u09a5\u09a6\u0001\u0000\u0000\u0000\u09a6\u09a4"+ + "\u0001\u0000\u0000\u0000\u09a6\u09a7\u0001\u0000\u0000\u0000\u09a7\u09a8"+ + "\u0001\u0000\u0000\u0000\u09a8\u09a9\u0006\u00a1\r\u0000\u09a9\u0151\u0001"+ + "\u0000\u0000\u0000\u09aa\u09ab\u0005(\u0000\u0000\u09ab\u09ac\u0006\u00a2"+ + "$\u0000\u09ac\u09ad\u0001\u0000\u0000\u0000\u09ad\u09ae\u0006\u00a2%\u0000"+ + "\u09ae\u0153\u0001\u0000\u0000\u0000\u09af\u09b0\t\u0000\u0000\u0000\u09b0"+ + "\u09b1\u0001\u0000\u0000\u0000\u09b1\u09b2\u0006\u00a3\t\u0000\u09b2\u09b3"+ + "\u0006\u00a3\u0017\u0000\u09b3\u0155\u0001\u0000\u0000\u0000\u09b4\u09b5"+ + "\u0005[\u0000\u0000\u09b5\u09b6\u0006\u00a4&\u0000\u09b6\u09b7\u0001\u0000"+ + "\u0000\u0000\u09b7\u09b8\u0006\u00a4\'\u0000\u09b8\u0157\u0001\u0000\u0000"+ + "\u0000\u09b9\u09ba\u0005]\u0000\u0000\u09ba\u09bb\u0006\u00a5(\u0000\u09bb"+ + "\u09bc\u0001\u0000\u0000\u0000\u09bc\u09bd\u0006\u00a5)\u0000\u09bd\u0159"+ + "\u0001\u0000\u0000\u0000\u09be\u09bf\u0005{\u0000\u0000\u09bf\u09c0\u0006"+ + "\u00a6*\u0000\u09c0\u09c1\u0001\u0000\u0000\u0000\u09c1\u09c2\u0006\u00a6"+ + " \u0000\u09c2\u015b\u0001\u0000\u0000\u0000\u09c3\u09c4\u0005}\u0000\u0000"+ + "\u09c4\u09c5\u0006\u00a7+\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6"+ + "\u09c7\u0006\u00a7 \u0000\u09c7\u015d\u0001\u0000\u0000\u0000\u09c8\u09cb"+ + "\u0003\u00f8u\u0000\u09c9\u09cb\u0003\u00fav\u0000\u09ca\u09c8\u0001\u0000"+ + "\u0000\u0000\u09ca\u09c9\u0001\u0000\u0000\u0000\u09cb\u015f\u0001\u0000"+ + "\u0000\u0000\u09cc\u09cd\u0003\u00fex\u0000\u09cd\u09ce\u0001\u0000\u0000"+ + "\u0000\u09ce\u09cf\u0006\u00a9\u0012\u0000\u09cf\u0161\u0001\u0000\u0000"+ + "\u0000\u09d0\u09d1\u0003\u0100y\u0000\u09d1\u09d2\u0001\u0000\u0000\u0000"+ + "\u09d2\u09d3\u0006\u00aa\u0013\u0000\u09d3\u0163\u0001\u0000\u0000\u0000"+ + "\u09d4\u09d6\u0005\\\u0000\u0000\u09d5\u09d4\u0001\u0000\u0000\u0000\u09d5"+ + "\u09d6\u0001\u0000\u0000\u0000\u09d6\u09da\u0001\u0000\u0000\u0000\u09d7"+ + "\u09d8\u0003\u00f0q\u0000\u09d8\u09d9\u0005\\\u0000\u0000\u09d9\u09db"+ + "\u0001\u0000\u0000\u0000\u09da\u09d7\u0001\u0000\u0000\u0000\u09db\u09dc"+ + "\u0001\u0000\u0000\u0000\u09dc\u09da\u0001\u0000\u0000\u0000\u09dc\u09dd"+ + "\u0001\u0000\u0000\u0000\u09dd\u09de\u0001\u0000\u0000\u0000\u09de\u09df"+ + "\u0006\u00ab\u0014\u0000\u09df\u0165\u0001\u0000\u0000\u0000\u09e0\u09e1"+ + "\u0003\u00f0q\u0000\u09e1\u09e2\u0001\u0000\u0000\u0000\u09e2\u09e3\u0006"+ + "\u00ac\u0015\u0000\u09e3\u0167\u0001\u0000\u0000\u0000\u09e4\u09e5\u0005"+ + ":\u0000\u0000\u09e5\u09e6\u0005:\u0000\u0000\u09e6\u09e7\u0001\u0000\u0000"+ + "\u0000\u09e7\u09e8\u0006\u00ad\u0016\u0000\u09e8\u0169\u0001\u0000\u0000"+ + "\u0000\u09e9\u09ea\u0005(\u0000\u0000\u09ea\u09eb\u0006\u00ae,\u0000\u09eb"+ + "\u09ec\u0001\u0000\u0000\u0000\u09ec\u09ed\u0006\u00ae\u0018\u0000\u09ed"+ + "\u016b\u0001\u0000\u0000\u0000\u09ee\u09ef\u0005)\u0000\u0000\u09ef\u09f0"+ + "\u0006\u00af-\u0000\u09f0\u016d\u0001\u0000\u0000\u0000\u09f1\u09f2\t"+ + "\u0000\u0000\u0000\u09f2\u09f3\u0001\u0000\u0000\u0000\u09f3\u09f4\u0006"+ + "\u00b0\r\u0000\u09f4\u016f\u0001\u0000\u0000\u0000\u09f5\u09f6\u0005\u0000"+ + "\u0000\u0001\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006\u00b1"+ + "\u001b\u0000\u09f8\u09f9\u0006\u00b1\u0017\u0000\u09f9\u0171\u0001\u0000"+ + "\u0000\u0000\u09fa\u09fc\u0007%\u0000\u0000\u09fb\u09fa\u0001\u0000\u0000"+ + "\u0000\u09fc\u09fd\u0001\u0000\u0000\u0000\u09fd\u09fb\u0001\u0000\u0000"+ + "\u0000\u09fd\u09fe\u0001\u0000\u0000\u0000\u09fe\u09ff\u0001\u0000\u0000"+ + "\u0000\u09ff\u0a00\u0006\u00b2\r\u0000\u0a00\u0173\u0001\u0000\u0000\u0000"+ + "\u0a01\u0a02\u0005(\u0000\u0000\u0a02\u0a03\u0006\u00b3.\u0000\u0a03\u0a04"+ + "\u0001\u0000\u0000\u0000\u0a04\u0a05\u0006\u00b3/\u0000\u0a05\u0a06\u0006"+ + "\u00b30\u0000\u0a06\u0175\u0001\u0000\u0000\u0000\u0a07\u0a08\t\u0000"+ + "\u0000\u0000\u0a08\u0a09\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0006\u00b4"+ + "\t\u0000\u0a0a\u0a0b\u0006\u00b4\u0017\u0000\u0a0b\u0177\u0001\u0000\u0000"+ + "\u0000\u0a0c\u0a0e\u0007%\u0000\u0000\u0a0d\u0a0c\u0001\u0000\u0000\u0000"+ + "\u0a0e\u0a0f\u0001\u0000\u0000\u0000\u0a0f\u0a0d\u0001\u0000\u0000\u0000"+ + "\u0a0f\u0a10\u0001\u0000\u0000\u0000\u0a10\u0a11\u0001\u0000\u0000\u0000"+ + "\u0a11\u0a12\u0006\u00b5\r\u0000\u0a12\u0179\u0001\u0000\u0000\u0000\u0a13"+ + "\u0a14\u0005(\u0000\u0000\u0a14\u0a15\u0006\u00b61\u0000\u0a15\u017b\u0001"+ + "\u0000\u0000\u0000\u0a16\u0a17\u0005)\u0000\u0000\u0a17\u0a18\u0006\u00b7"+ + "2\u0000\u0a18\u017d\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0007\u0010\u0000"+ + "\u0000\u0a1a\u0a1b\u0007\t\u0000\u0000\u0a1b\u017f\u0001\u0000\u0000\u0000"+ + "\u0a1c\u0a1d\u0003\u00fex\u0000\u0a1d\u0a1e\u0001\u0000\u0000\u0000\u0a1e"+ + "\u0a1f\u0006\u00b9\u0012\u0000\u0a1f\u0181\u0001\u0000\u0000\u0000\u0a20"+ + "\u0a21\u0005=\u0000\u0000\u0a21\u0a22\u0005>\u0000\u0000\u0a22\u0183\u0001"+ + "\u0000\u0000\u0000\u0a23\u0a24\u0003\u0100y\u0000\u0a24\u0a25\u0001\u0000"+ + "\u0000\u0000\u0a25\u0a26\u0006\u00bb \u0000\u0a26\u0185\u0001\u0000\u0000"+ + "\u0000\u0a27\u0a2b\u0003\u00f8u\u0000\u0a28\u0a2b\u0003\u00fav\u0000\u0a29"+ + "\u0a2b\u0003\u00f0q\u0000\u0a2a\u0a27\u0001\u0000\u0000\u0000\u0a2a\u0a28"+ + "\u0001\u0000\u0000\u0000\u0a2a\u0a29\u0001\u0000\u0000\u0000\u0a2b\u0a2c"+ + "\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0006\u00bc \u0000\u0a2d\u0187\u0001"+ + "\u0000\u0000\u0000\u0a2e\u0a2f\u0005:\u0000\u0000\u0a2f\u0a30\u0005:\u0000"+ + "\u0000\u0a30\u0a31\u0001\u0000\u0000\u0000\u0a31\u0a32\u0006\u00bd \u0000"+ + "\u0a32\u0189\u0001\u0000\u0000\u0000\u0a33\u0a34\t\u0000\u0000\u0000\u0a34"+ + "\u0a35\u0001\u0000\u0000\u0000\u0a35\u0a36\u0006\u00be \u0000\u0a36\u018b"+ + "\u0001\u0000\u0000\u0000\u0a37\u0a38\u0005\u0000\u0000\u0001\u0a38\u0a39"+ + "\u0001\u0000\u0000\u0000\u0a39\u0a3a\u0006\u00bf\u001b\u0000\u0a3a\u0a3b"+ + "\u0006\u00bf\u0017\u0000\u0a3b\u018d\u0001\u0000\u0000\u0000\u0a3c\u0a3d"+ + "\u0003\u00fcw\u0000\u0a3d\u0a3e\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0006"+ + "\u00c03\u0000\u0a3f\u018f\u0001\u0000\u0000\u0000\u0a40\u0a41\u0005[\u0000"+ + "\u0000\u0a41\u0a42\u0006\u00c14\u0000\u0a42\u0191\u0001\u0000\u0000\u0000"+ + "\u0a43\u0a44\u0005]\u0000\u0000\u0a44\u0a45\u0006\u00c25\u0000\u0a45\u0193"+ + "\u0001\u0000\u0000\u0000\u0a46\u0a47\u0005{\u0000\u0000\u0a47\u0a48\u0006"+ + "\u00c36\u0000\u0a48\u0a49\u0001\u0000\u0000\u0000\u0a49\u0a4a\u0006\u00c3"+ + "7\u0000\u0a4a\u0195\u0001\u0000\u0000\u0000\u0a4b\u0a4c\u0005}\u0000\u0000"+ + "\u0a4c\u0a4d\u0006\u00c48\u0000\u0a4d\u0a4e\u0001\u0000\u0000\u0000\u0a4e"+ + "\u0a4f\u0006\u00c47\u0000\u0a4f\u0197\u0001\u0000\u0000\u0000\u0a50\u0a51"+ + "\u0005(\u0000\u0000\u0a51\u0a52\u0006\u00c59\u0000\u0a52\u0a53\u0001\u0000"+ + "\u0000\u0000\u0a53\u0a54\u0006\u00c57\u0000\u0a54\u0199\u0001\u0000\u0000"+ + "\u0000\u0a55\u0a56\u0005)\u0000\u0000\u0a56\u0a57\u0006\u00c6:\u0000\u0a57"+ + "\u019b\u0001\u0000\u0000\u0000\u0a58\u0a5b\u0003\u00f8u\u0000\u0a59\u0a5b"+ + "\u0003\u00fav\u0000\u0a5a\u0a58\u0001\u0000\u0000\u0000\u0a5a\u0a59\u0001"+ + "\u0000\u0000\u0000\u0a5b\u019d\u0001\u0000\u0000\u0000\u0a5c\u0a5d\u0003"+ + "\u00fex\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000\u0a5e\u0a5f\u0006\u00c8"+ + "\u0012\u0000\u0a5f\u019f\u0001\u0000\u0000\u0000\u0a60\u0a61\u0005=\u0000"+ + "\u0000\u0a61\u0a62\u0005>\u0000\u0000\u0a62\u01a1\u0001\u0000\u0000\u0000"+ + "\u0a63\u0a64\u0003\u0100y\u0000\u0a64\u0a65\u0001\u0000\u0000\u0000\u0a65"+ + "\u0a66\u0006\u00ca\u0013\u0000\u0a66\u01a3\u0001\u0000\u0000\u0000\u0a67"+ + "\u0a68\u0005.\u0000\u0000\u0a68\u01a5\u0001\u0000\u0000\u0000\u0a69\u0a6a"+ + "\u0005,\u0000\u0000\u0a6a\u0a6b\u0006\u00cc;\u0000\u0a6b\u01a7\u0001\u0000"+ + "\u0000\u0000\u0a6c\u0a6e\u0007&\u0000\u0000\u0a6d\u0a6c\u0001\u0000\u0000"+ + "\u0000\u0a6e\u0a6f\u0001\u0000\u0000\u0000\u0a6f\u0a6d\u0001\u0000\u0000"+ + "\u0000\u0a6f\u0a70\u0001\u0000\u0000\u0000\u0a70\u0a71\u0001\u0000\u0000"+ + "\u0000\u0a71\u0a72\u0006\u00cd\r\u0000\u0a72\u01a9\u0001\u0000\u0000\u0000"+ + "\u0a73\u0a74\u0003\u00f0q\u0000\u0a74\u01ab\u0001\u0000\u0000\u0000\u0a75"+ + "\u0a76\t\u0000\u0000\u0000\u0a76\u0a77\u0001\u0000\u0000\u0000\u0a77\u0a78"+ + "\u0006\u00cf7\u0000\u0a78\u01ad\u0001\u0000\u0000\u0000\u0a79\u0a7a\u0005"+ + "\u0000\u0000\u0001\u0a7a\u0a7b\u0001\u0000\u0000\u0000\u0a7b\u0a7c\u0006"+ + "\u00d0\u001b\u0000\u0a7c\u0a7d\u0006\u00d0\u0017\u0000\u0a7d\u01af\u0001"+ + "\u0000\u0000\u0000\u0a7e\u0a7f\u0005/\u0000\u0000\u0a7f\u0a80\u0005/\u0000"+ + "\u0000\u0a80\u0a82\u0001\u0000\u0000\u0000\u0a81\u0a83\b\u001f\u0000\u0000"+ + "\u0a82\u0a81\u0001\u0000\u0000\u0000\u0a83\u0a84\u0001\u0000\u0000\u0000"+ + "\u0a84\u0a82\u0001\u0000\u0000\u0000\u0a84\u0a85\u0001\u0000\u0000\u0000"+ + "\u0a85\u0a86\u0001\u0000\u0000\u0000\u0a86\u0a87\u0006\u00d1\r\u0000\u0a87"+ + "\u01b1\u0001\u0000\u0000\u0000\u0a88\u0a89\u0005/\u0000\u0000\u0a89\u0a8a"+ + "\u0005*\u0000\u0000\u0a8a\u0a8e\u0001\u0000\u0000\u0000\u0a8b\u0a8d\t"+ + "\u0000\u0000\u0000\u0a8c\u0a8b\u0001\u0000\u0000\u0000\u0a8d\u0a90\u0001"+ + "\u0000\u0000\u0000\u0a8e\u0a8f\u0001\u0000\u0000\u0000\u0a8e\u0a8c\u0001"+ + "\u0000\u0000\u0000\u0a8f\u0a91\u0001\u0000\u0000\u0000\u0a90\u0a8e\u0001"+ + "\u0000\u0000\u0000\u0a91\u0a92\u0005*\u0000\u0000\u0a92\u0a93\u0005/\u0000"+ + "\u0000\u0a93\u0a97\u0001\u0000\u0000\u0000\u0a94\u0a96\u0007\u001f\u0000"+ + "\u0000\u0a95\u0a94\u0001\u0000\u0000\u0000\u0a96\u0a99\u0001\u0000\u0000"+ + "\u0000\u0a97\u0a95\u0001\u0000\u0000\u0000\u0a97\u0a98\u0001\u0000\u0000"+ + "\u0000\u0a98\u0a9a\u0001\u0000\u0000\u0000\u0a99\u0a97\u0001\u0000\u0000"+ + "\u0000\u0a9a\u0a9b\u0006\u00d2\r\u0000\u0a9b\u01b3\u0001\u0000\u0000\u0000"+ + "\u0a9c\u0a9d\u0005@\u0000\u0000\u0a9d\u0a9e\u0007\u0007\u0000\u0000\u0a9e"+ + "\u0a9f\u0007\n\u0000\u0000\u0a9f\u0aa0\u0007\u000b\u0000\u0000\u0aa0\u0aa1"+ + "\u0007\u0013\u0000\u0000\u0aa1\u0aa2\u0007\u000f\u0000\u0000\u0aa2\u0aa3"+ + "\u0007\u0013\u0000\u0000\u0aa3\u0aa4\u0001\u0000\u0000\u0000\u0aa4\u0aa5"+ + "\u0006\u00d3\u0017\u0000\u0aa5\u01b5\u0001\u0000\u0000\u0000\u0aa6\u0aa7"+ + "\u0005@\u0000\u0000\u0aa7\u0aa8\u0001\u0000\u0000\u0000\u0aa8\u0aa9\u0006"+ + "\u00d4\t\u0000\u0aa9\u0aaa\u0006\u00d4\u0017\u0000\u0aaa\u01b7\u0001\u0000"+ + "\u0000\u0000\u0aab\u0aac\u0005[\u0000\u0000\u0aac\u0aad\u0001\u0000\u0000"+ + "\u0000\u0aad\u0aae\u0006\u00d5 \u0000\u0aae\u01b9\u0001\u0000\u0000\u0000"+ + "\u0aaf\u0ab0\u0005]\u0000\u0000\u0ab0\u0ab1\u0001\u0000\u0000\u0000\u0ab1"+ + "\u0ab2\u0006\u00d6 \u0000\u0ab2\u01bb\u0001\u0000\u0000\u0000\u0ab3\u0ab4"+ + "\u0005{\u0000\u0000\u0ab4\u0ab5\u0001\u0000\u0000\u0000\u0ab5\u0ab6\u0006"+ + "\u00d7 \u0000\u0ab6\u01bd\u0001\u0000\u0000\u0000\u0ab7\u0ab8\u0005}\u0000"+ + "\u0000\u0ab8\u0ab9\u0001\u0000\u0000\u0000\u0ab9\u0aba\u0006\u00d8 \u0000"+ + "\u0aba\u01bf\u0001\u0000\u0000\u0000\u0abb\u0abe\u0003\u00f8u\u0000\u0abc"+ + "\u0abe\u0003\u00fav\u0000\u0abd\u0abb\u0001\u0000\u0000\u0000\u0abd\u0abc"+ + "\u0001\u0000\u0000\u0000\u0abe\u0abf\u0001\u0000\u0000\u0000\u0abf\u0ac0"+ + "\u0006\u00d9<\u0000\u0ac0\u01c1\u0001\u0000\u0000\u0000\u0ac1\u0ac2\u0003"+ + "\u00fex\u0000\u0ac2\u0ac3\u0001\u0000\u0000\u0000\u0ac3\u0ac4\u0006\u00da"+ + "\u0012\u0000\u0ac4\u01c3\u0001\u0000\u0000\u0000\u0ac5\u0ac6\u0007\n\u0000"+ + "\u0000\u0ac6\u0ac7\u0007\u0007\u0000\u0000\u0ac7\u0ac8\u0007\f\u0000\u0000"+ + "\u0ac8\u0ac9\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0004\u00db\u000e\u0000"+ + "\u0aca\u0acb\u0001\u0000\u0000\u0000\u0acb\u0acc\u0006\u00db=\u0000\u0acc"+ + "\u01c5\u0001\u0000\u0000\u0000\u0acd\u0ace\u0007\u000e\u0000\u0000\u0ace"+ + "\u0acf\u0007\b\u0000\u0000\u0acf\u0ad0\u0007\u0010\u0000\u0000\u0ad0\u0ad1"+ + "\u0007\t\u0000\u0000\u0ad1\u0ad2\u0007\t\u0000\u0000\u0ad2\u0ad3\u0001"+ + "\u0000\u0000\u0000\u0ad3\u0ad4\u0006\u00dc>\u0000\u0ad4\u01c7\u0001\u0000"+ + "\u0000\u0000\u0ad5\u0ad6\u0003\u0100y\u0000\u0ad6\u0ad7\u0001\u0000\u0000"+ + "\u0000\u0ad7\u0ad8\u0006\u00dd\u0013\u0000\u0ad8\u01c9\u0001\u0000\u0000"+ + "\u0000\u0ad9\u0adb\u0005\\\u0000\u0000\u0ada\u0ad9\u0001\u0000\u0000\u0000"+ + "\u0ada\u0adb\u0001\u0000\u0000\u0000\u0adb\u0adf\u0001\u0000\u0000\u0000"+ + "\u0adc\u0add\u0003\u00f0q\u0000\u0add\u0ade\u0005\\\u0000\u0000\u0ade"+ + "\u0ae0\u0001\u0000\u0000\u0000\u0adf\u0adc\u0001\u0000\u0000\u0000\u0ae0"+ + "\u0ae1\u0001\u0000\u0000\u0000\u0ae1\u0adf\u0001\u0000\u0000\u0000\u0ae1"+ + "\u0ae2\u0001\u0000\u0000\u0000\u0ae2\u0ae3\u0001\u0000\u0000\u0000\u0ae3"+ + "\u0ae4\u0006\u00de\u0014\u0000\u0ae4\u01cb\u0001\u0000\u0000\u0000\u0ae5"+ + "\u0ae6\u0005\\\u0000\u0000\u0ae6\u0ae7\u0003\u00f0q\u0000\u0ae7\u0ae8"+ + "\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0006\u00df\u0015\u0000\u0ae9\u01cd"+ + "\u0001\u0000\u0000\u0000\u0aea\u0aeb\u0003\u00f0q\u0000\u0aeb\u0aec\u0001"+ + "\u0000\u0000\u0000\u0aec\u0aed\u0006\u00e0\u0015\u0000\u0aed\u01cf\u0001"+ + "\u0000\u0000\u0000\u0aee\u0aef\u0005:\u0000\u0000\u0aef\u0af0\u0005:\u0000"+ + "\u0000\u0af0\u0af1\u0001\u0000\u0000\u0000\u0af1\u0af2\u0006\u00e1\u0016"+ + "\u0000\u0af2\u01d1\u0001\u0000\u0000\u0000\u0af3\u0af4\u0005(\u0000\u0000"+ + "\u0af4\u0af5\u0001\u0000\u0000\u0000\u0af5\u0af6\u0006\u00e2\u0018\u0000"+ + "\u0af6\u01d3\u0001\u0000\u0000\u0000\u0af7\u0af8\u0005)\u0000\u0000\u0af8"+ + "\u0af9\u0001\u0000\u0000\u0000\u0af9\u0afa\u0006\u00e3\u0019\u0000\u0afa"+ + "\u01d5\u0001\u0000\u0000\u0000\u0afb\u0afc\u0005 \u0000\u0000\u0afc\u0afd"+ + "\u0001\u0000\u0000\u0000\u0afd\u0afe\u0006\u00e4\r\u0000\u0afe\u01d7\u0001"+ + "\u0000\u0000\u0000\u0aff\u0b00\u0005\u0000\u0000\u0001\u0b00\u0b01\u0001"+ + "\u0000\u0000\u0000\u0b01\u0b02\u0006\u00e5\u001b\u0000\u0b02\u0b03\u0006"+ + "\u00e5\u0017\u0000\u0b03\u01d9\u0001\u0000\u0000\u0000\u0b04\u0b05\t\u0000"+ + "\u0000\u0000\u0b05\u0b06\u0001\u0000\u0000\u0000\u0b06\u0b07\u0006\u00e6"+ + "\r\u0000\u0b07\u01db\u0001\u0000\u0000\u0000\u0b08\u0b09\u0005?\u0000"+ + "\u0000\u0b09\u0b0a\u0005>\u0000\u0000\u0b0a\u0b0b\u0001\u0000\u0000\u0000"+ + "\u0b0b\u0b0c\u0006\u00e7\u0017\u0000\u0b0c\u01dd\u0001\u0000\u0000\u0000"+ + "\u0b0d\u0b0e\u0005/\u0000\u0000\u0b0e\u0b0f\u0005/\u0000\u0000\u0b0f\u0b11"+ + "\u0001\u0000\u0000\u0000\u0b10\u0b12\b\u001f\u0000\u0000\u0b11\u0b10\u0001"+ + "\u0000\u0000\u0000\u0b12\u0b13\u0001\u0000\u0000\u0000\u0b13\u0b11\u0001"+ + "\u0000\u0000\u0000\u0b13\u0b14\u0001\u0000\u0000\u0000\u0b14\u0b15\u0001"+ + "\u0000\u0000\u0000\u0b15\u0b16\u0006\u00e8\r\u0000\u0b16\u01df\u0001\u0000"+ + "\u0000\u0000\u0b17\u0b18\u0005/\u0000\u0000\u0b18\u0b19\u0005*\u0000\u0000"+ + "\u0b19\u0b1d\u0001\u0000\u0000\u0000\u0b1a\u0b1c\t\u0000\u0000\u0000\u0b1b"+ + "\u0b1a\u0001\u0000\u0000\u0000\u0b1c\u0b1f\u0001\u0000\u0000\u0000\u0b1d"+ + "\u0b1e\u0001\u0000\u0000\u0000\u0b1d\u0b1b\u0001\u0000\u0000\u0000\u0b1e"+ + "\u0b20\u0001\u0000\u0000\u0000\u0b1f\u0b1d\u0001\u0000\u0000\u0000\u0b20"+ + "\u0b21\u0005*\u0000\u0000\u0b21\u0b22\u0005/\u0000\u0000\u0b22\u0b23\u0001"+ + "\u0000\u0000\u0000\u0b23\u0b24\u0006\u00e9\r\u0000\u0b24\u01e1\u0001\u0000"+ + "\u0000\u0000\u0b25\u0b26\u0005[\u0000\u0000\u0b26\u0b27\u0001\u0000\u0000"+ + "\u0000\u0b27\u0b28\u0006\u00ea \u0000\u0b28\u01e3\u0001\u0000\u0000\u0000"+ + "\u0b29\u0b2a\u0005]\u0000\u0000\u0b2a\u0b2b\u0001\u0000\u0000\u0000\u0b2b"+ + "\u0b2c\u0006\u00eb \u0000\u0b2c\u01e5\u0001\u0000\u0000\u0000\u0b2d\u0b2e"+ + "\u0005{\u0000\u0000\u0b2e\u0b2f\u0001\u0000\u0000\u0000\u0b2f\u0b30\u0006"+ + "\u00ec \u0000\u0b30\u01e7\u0001\u0000\u0000\u0000\u0b31\u0b32\u0005}\u0000"+ + "\u0000\u0b32\u0b33\u0001\u0000\u0000\u0000\u0b33\u0b34\u0006\u00ed \u0000"+ + "\u0b34\u01e9\u0001\u0000\u0000\u0000\u0b35\u0b38\u0003\u00f8u\u0000\u0b36"+ + "\u0b38\u0003\u00fav\u0000\u0b37\u0b35\u0001\u0000\u0000\u0000\u0b37\u0b36"+ + "\u0001\u0000\u0000\u0000\u0b38\u0b39\u0001\u0000\u0000\u0000\u0b39\u0b3a"+ + "\u0006\u00ee<\u0000\u0b3a\u01eb\u0001\u0000\u0000\u0000\u0b3b\u0b3c\u0003"+ + "\u00fex\u0000\u0b3c\u0b3d\u0001\u0000\u0000\u0000\u0b3d\u0b3e\u0006\u00ef"+ + "\u0012\u0000\u0b3e\u01ed\u0001\u0000\u0000\u0000\u0b3f\u0b40\u0003\u0100"+ + "y\u0000\u0b40\u0b41\u0001\u0000\u0000\u0000\u0b41\u0b42\u0006\u00f0\u0013"+ + "\u0000\u0b42\u01ef\u0001\u0000\u0000\u0000\u0b43\u0b44\u0003\u00f0q\u0000"+ + "\u0b44\u0b45\u0001\u0000\u0000\u0000\u0b45\u0b46\u0006\u00f1\u0015\u0000"+ + "\u0b46\u01f1\u0001\u0000\u0000\u0000\u0b47\u0b48\u0005:\u0000\u0000\u0b48"+ + "\u0b49\u0005:\u0000\u0000\u0b49\u0b4a\u0001\u0000\u0000\u0000\u0b4a\u0b4b"+ + "\u0006\u00f2\u0016\u0000\u0b4b\u01f3\u0001\u0000\u0000\u0000\u0b4c\u0b4d"+ + "\u0005-\u0000\u0000\u0b4d\u0b4e\u0005>\u0000\u0000\u0b4e\u0b4f\u0001\u0000"+ + "\u0000\u0000\u0b4f\u0b50\u0006\u00f3\u001a\u0000\u0b50\u01f5\u0001\u0000"+ + "\u0000\u0000\u0b51\u0b52\u0005(\u0000\u0000\u0b52\u0b53\u0001\u0000\u0000"+ + "\u0000\u0b53\u0b54\u0006\u00f4\u0018\u0000\u0b54\u01f7\u0001\u0000\u0000"+ + "\u0000\u0b55\u0b56\u0005)\u0000\u0000\u0b56\u0b57\u0001\u0000\u0000\u0000"+ + "\u0b57\u0b58\u0006\u00f5\u0019\u0000\u0b58\u01f9\u0001\u0000\u0000\u0000"+ + "\u0b59\u0b5a\u0005\u0000\u0000\u0001\u0b5a\u0b5b\u0001\u0000\u0000\u0000"+ + "\u0b5b\u0b5c\u0006\u00f6 \u0000\u0b5c\u0b5d\u0006\u00f6\u0017\u0000\u0b5d"+ + "\u01fb\u0001\u0000\u0000\u0000\u0b5e\u0b5f\t\u0000\u0000\u0000\u0b5f\u0b60"+ + "\u0001\u0000\u0000\u0000\u0b60\u0b61\u0006\u00f7 \u0000\u0b61\u01fd\u0001"+ + "\u0000\u0000\u0000\u0b62\u0b63\u0005@\u0000\u0000\u0b63\u0b64\u0007\u0007"+ + "\u0000\u0000\u0b64\u0b65\u0007\n\u0000\u0000\u0b65\u0b66\u0007\u000b\u0000"+ + "\u0000\u0b66\u0b67\u0007\u001c\u0000\u0000\u0b67\u0b68\u0007\u0007\u0000"+ + "\u0000\u0b68\u0b69\u0007\u0016\u0000\u0000\u0b69\u0b6a\u0007\u0017\u0000"+ + "\u0000\u0b6a\u0b6b\u0007\u0010\u0000\u0000\u0b6b\u0b6c\u0007\r\u0000\u0000"+ + "\u0b6c\u0b6d\u0007\u0005\u0000\u0000\u0b6d\u0b6e\u0007\u0012\u0000\u0000"+ + "\u0b6e\u0b6f\u0001\u0000\u0000\u0000\u0b6f\u0b70\u0006\u00f8?\u0000\u0b70"+ + "\u0b71\u0006\u00f8!\u0000\u0b71\u01ff\u0001\u0000\u0000\u0000\u0b72\u0b73"+ + "\t\u0000\u0000\u0000\u0b73\u0b74\u0004\u00f9\u000f\u0000\u0b74\u0b75\u0001"+ + "\u0000\u0000\u0000\u0b75\u0b76\u0006\u00f9\r\u0000\u0b76\u0201\u0001\u0000"+ + "\u0000\u0000\u0b77\u0b78\u0005\u0000\u0000\u0001\u0b78\u0b79\u0001\u0000"+ + "\u0000\u0000\u0b79\u0b7a\u0006\u00fa\u001b\u0000\u0b7a\u0b7b\u0006\u00fa"+ + "!\u0000\u0b7b\u0203\u0001\u0000\u0000\u0000\u0b7c\u0b7d\t\u0000\u0000"+ + "\u0000\u0b7d\u0b7e\u0001\u0000\u0000\u0000\u0b7e\u0b7f\u0006\u00fb\u001c"+ + "\u0000\u0b7f\u0205\u0001\u0000\u0000\u0000\u0b80\u0b81\u0005-\u0000\u0000"+ + "\u0b81\u0b82\u0005-\u0000\u0000\u0b82\u0b83\u0005}\u0000\u0000\u0b83\u0b84"+ + "\u0005}\u0000\u0000\u0b84\u0b85\u0001\u0000\u0000\u0000\u0b85\u0b86\u0006"+ + "\u00fc\u0017\u0000\u0b86\u0b87\u0006\u00fc\r\u0000\u0b87\u0207\u0001\u0000"+ + "\u0000\u0000\u0b88\u0b89\t\u0000\u0000\u0000\u0b89\u0b8a\u0004\u00fd\u0010"+ + "\u0000\u0b8a\u0b8b\u0001\u0000\u0000\u0000\u0b8b\u0b8c\u0006\u00fd\r\u0000"+ + "\u0b8c\u0209\u0001\u0000\u0000\u0000\u0b8d\u0b8e\t\u0000\u0000\u0000\u0b8e"+ + "\u0b8f\u0001\u0000\u0000\u0000\u0b8f\u0b90\u0006\u00fe\r\u0000\u0b90\u020b"+ + "\u0001\u0000\u0000\u0000\u0b91\u0b92\u0005\u0000\u0000\u0001\u0b92\u0b93"+ + "\u0001\u0000\u0000\u0000\u0b93\u0b94\u0006\u00ff\u0017\u0000\u0b94\u0b95"+ + "\u0006\u00ff\r\u0000\u0b95\u020d\u0001\u0000\u0000\u0000l\u0000\u0001"+ + "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u0212\u0216\u021c"+ + "\u0220\u0227\u022e\u0234\u023a\u0241\u0246\u024d\u0253\u025d\u0263\u0269"+ + "\u0270\u027c\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e\u059e\u05ca\u05ed"+ + "\u0653\u0699\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9\u06e0\u06f4\u06fc"+ + "\u0703\u070b\u070f\u0718\u071b\u0722\u0729\u072e\u073a\u073f\u0741\u074d"+ + "\u0754\u075b\u0763\u0765\u076e\u0770\u077b\u0793\u07a8\u07ac\u07b7\u07bd"+ + "\u07c9\u07d5\u07da\u07dc\u08dd\u08e2\u08e5\u08f2\u08f9\u092a\u0931\u095d"+ + "\u0967\u09a6\u09ca\u09d5\u09dc\u09fd\u0a0f\u0a2a\u0a5a\u0a6f\u0a84\u0a8e"+ + "\u0a97\u0abd\u0ada\u0ae1\u0b13\u0b1d\u0b37@\u0005\u0005\u0000\u0005\u0003"+ + "\u0000\u0005\b\u0000\u0005\u0007\u0000\u0007g\u0000\u0005\n\u0000\u0005"+ + "\f\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0007\u0017\u0000\u0005\u000b"+ + "\u0000\u0001c\u0000\u0007s\u0000\u0006\u0000\u0000\u0001h\u0001\u0001"+ + "i\u0002\u0001m\u0003\u0005\r\u0000\u0007\u0002\u0000\u0007\u0003\u0000"+ + "\u0007\u0006\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0004\u0000\u0000"+ + "\u0007\r\u0000\u0007\u000e\u0000\u0007\t\u0000\u0007\u0016\u0000\u0003"+ + "\u0000\u0000\u0005\u0004\u0000\u0001\u009a\u0004\u0001\u009b\u0005\u0007"+ + "\u0001\u0000\u0002\u0000\u0000\u0001\u009c\u0006\u0001\u009d\u0007\u0001"+ + "\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t\u0007\u000f\u0000\u0001\u00a5"+ + "\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001\u00a7\f\u0001\u00ae\r\u0001"+ + "\u00af\u000e\u0001\u00b3\u000f\u0007\u000b\u0000\u0005\t\u0000\u0001\u00b6"+ + "\u0010\u0001\u00b7\u0011\u0000\u0002\u0000\u0001\u00c1\u0012\u0001\u00c2"+ + "\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001\u00c4\u0015\u0001\u00c5\u0016"+ + "\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007\u0015\u0000\u0007\u0004\u0000"+ + "\u0007\b\u0000\u0007i\u0000"; public static final String _serializedATN = Utils.join( new String[] { _serializedATNSegment0, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java index 8dde751fa163..6724a8c447d2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -29,12 +29,7 @@ public abstract class ColoringLexerAdaptor extends Lexer { private int _currentRuleType = Token.INVALID_TYPE; - public int roundParenBalance = 0; - public int squareParenBalance = 0; - public int curlyParenBalance = 0; - public int exitIfModePosition = 0; - public int phpExpressionOffset = -1; - public boolean hasPhpExprContent = false; + private int roundParenBalance = 0; public ColoringLexerAdaptor(CharStream input) { super(input); @@ -47,6 +42,10 @@ public int getCurrentRuleType() { public void setCurrentRuleType(int ruleType) { this._currentRuleType = ruleType; } + + public int getRoundParenBalance(){ + return this.roundParenBalance; + } @Override public Token emit() { @@ -84,6 +83,7 @@ public boolean peekNextChars(char peekChar, int number) { public void increaseRoundParenBalance() { this.roundParenBalance++; } + public void decreaseRoundParenBalance() { this.roundParenBalance--; @@ -99,12 +99,6 @@ public boolean endsWith(char ch1, char ch2, char ch3) { && this._input.LA(3) == ch3; } - public boolean hasNoBladeParamOpenBracket() { - return this.roundParenBalance > 0 - && this.squareParenBalance == 0 - && this.curlyParenBalance == 0; - } - //blade coloring lexer public void consumeEscapedEchoToken() { if (this._input.LA(1) == '}' && this._input.LA(2) == '}') { @@ -124,11 +118,7 @@ public void consumeNotEscapedEchoToken() { } public void consumeExprToken(){ - if (this._input.LA(1) == ':' && this._input.LA(2) != ':'){ - this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); - } else { - this.more(); - } + this.more(); } public void testForFreezeCombination(){ @@ -140,14 +130,6 @@ public void testForFreezeCombination(){ this.consumeExprToken(); } } - -// to continue when the sepparation of PHP_EXPRESSION can be implemented -// public void setPhpExpressionOffset(){ -// this.phpExpressionOffset = this.getCharIndex(); -// } -// -// public boolean isFirstElement() { -// return this._tokenStartCharIndex <= this.phpExpressionOffset; -// } + } diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass new file mode 100644 index 000000000000..4b2717c21e0c --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass @@ -0,0 +1,5 @@ +Token #0 HTML [
      \n ] +Token #1 BLADE_ECHO_DELIMITOR [{{] +Token #2 PHP_BLADE_ECHO_EXPR [ $isTrue ? 'x' : 'z' ] +Token #3 BLADE_ECHO_DELIMITOR [}}] +Token #4 HTML [\n
      \n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass index 92bccf4919c8..5e37b1080811 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass @@ -24,10 +24,10 @@ Token #22 HTML [{] Token #23 HTML [\n ] Token #24 HTML [}] Token #25 HTML [\n ] -Token #26 BLADE_DIRECTIVE [@container] -Token #27 WS_D [ ] -Token #28 PHP_BLADE_EXPRESSION [(width > 400px)] -Token #29 HTML [ ] +Token #26 HTML [@container ] +Token #27 HTML [(width ] +Token #28 HTML [>] +Token #29 HTML [ 400px) ] Token #30 HTML [{] Token #31 HTML [\n h2 ] Token #32 HTML [{] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass new file mode 100644 index 000000000000..99fb032c25e1 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass @@ -0,0 +1,3 @@ +Token #0 HTML [
      \n ] +Token #1 HTML [@@] +Token #2 HTML [escapedDirective\n
      \n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass new file mode 100644 index 000000000000..990d06c4a62e --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass @@ -0,0 +1,3 @@ +Token #0 BLADE_DIRECTIVE [@include] +Token #1 PHP_BLADE_EXPRESSION [('path', ['key' => 'value'])] +Token #2 HTML [\n] diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php deleted file mode 100644 index e88b2e19617f..000000000000 --- a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php +++ /dev/null @@ -1 +0,0 @@ -@test($test ?: $default) diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding deleted file mode 100644 index c4a12f80a96a..000000000000 --- a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding +++ /dev/null @@ -1 +0,0 @@ -@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php new file mode 100644 index 000000000000..e3d154236e27 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php @@ -0,0 +1,5 @@ +{{ $x }} + + +
      \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding new file mode 100644 index 000000000000..cea1fe38161c --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding @@ -0,0 +1,4 @@ +@@@@@@@@@@@@ \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java index 56e8e8ac1ca7..83cd72aa41c1 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java @@ -34,7 +34,7 @@ public BladeHtmlEmbeddingProviderTest(String testName) { super(testName); } - private void checkPhpEmbedding(final String relFilePath) throws Exception { + private void checkHtmlEmbedding(final String relFilePath) throws Exception { checkEmbedding(relFilePath, new BladeHtmlEmbeddingProvider()); } @@ -55,7 +55,7 @@ private String serializableEmbeddings(List embeddings) { } public void testHtmlEmbedding_01() throws Exception { - checkPhpEmbedding("html_embedding_01"); + checkHtmlEmbedding("html_embedding_01"); } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java index 37eab8eb00df..58286bc6fdfe 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java @@ -54,15 +54,12 @@ private String serializableEmbeddings(List embeddings) { return sb.toString(); } - /** - * php embeddings freezes for syntax like $var:test or tertiary operation ?: - * - * solution is to skip full php embedd or hide ":" characters - * - * @throws Exception - */ - public void testFreezeNekudo_01() throws Exception { - checkPhpEmbedding("php_freeze_nekudo_01"); + public void testPhpInlineEmbedding_01() throws Exception { + checkPhpEmbedding("php_inline_embedding_01"); + } + + public void testPhpInlineEmbedding_02() throws Exception { + checkPhpEmbedding("php_inline_embedding_02"); } } From 052177fe323857e8a599aad29eb704c78ef3c234 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 30 Sep 2024 09:26:20 +0300 Subject: [PATCH 19/21] internationalization comments, remove unecessary CompletionRequest container class + refactor --- .../completion/BladeCompletionHandler.java | 43 ++--- .../completion/BladeCompletionProposal.java | 162 ++++++++---------- .../completion/BladeCompletionProvider.java | 4 +- .../BladePhpCompletionProvider.java | 28 ++- .../completion/PhpCodeCompletionService.java | 73 ++++---- .../editor/components/ComponentElement.java | 34 ---- .../editor/components/ComponentModel.java | 51 ------ .../ComponentsCompletionService.java | 2 - .../ComponentDeclarationService.java | 4 +- .../editor/directives/CustomDirectives.java | 12 +- .../embedding/BladePhpEmbeddingProvider.java | 5 +- .../php/blade/editor/parser/ParsingUtils.java | 3 +- .../php/blade/editor/path/BladePathUtils.java | 16 +- .../blade/syntax/BladeDirectivesUtils.java | 1 + .../modules/php/blade/syntax/StringUtils.java | 3 + 15 files changed, 172 insertions(+), 269 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index cee2cc5167f7..26d84bea25cf 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -29,6 +29,7 @@ import javax.swing.text.Document; import javax.swing.text.JTextComponent; import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.CodeCompletionContext; import org.netbeans.modules.csl.api.CodeCompletionHandler; @@ -46,7 +47,6 @@ import org.netbeans.modules.php.blade.csl.elements.NamedElement; import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; import org.netbeans.modules.php.blade.csl.elements.TagElement; -import org.netbeans.modules.php.blade.editor.completion.BladeCompletionProposal.CompletionRequest; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; @@ -149,7 +149,7 @@ private void completePhpSnippet(final List completionProposa PhpCodeCompletionService phpCodeCompletion = new PhpCodeCompletionService(); for (CompletionProposal proposal : phpCodeCompletion.getCompletionProposal(offset, currentToken)) { String proposalPrefix = proposal.getInsertPrefix(); - if (proposalPrefix.startsWith(phpCodeCompletion.prefix)) { + if (proposalPrefix.startsWith(phpCodeCompletion.getPrefix())) { completionProposals.add(proposal); } } @@ -162,19 +162,17 @@ private void completeScopedVariables(final List completionPr FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); if (scopedVariables != null && !scopedVariables.isEmpty()) { - CompletionRequest request = new CompletionRequest(); - request.anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); - request.carretOffset = completionContext.getCaretOffset(); - request.prefix = variablePrefix; + int anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); + if (BladeVariables.LOOP_VAR.startsWith(variablePrefix)) { String variableName = BladeVariables.LOOP_VAR; NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); - completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); + completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, anchorOffset, variableName)); } for (String variableName : scopedVariables) { if (variableName.startsWith(variablePrefix)) { NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); - completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, request, variableName)); + completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, anchorOffset, variableName)); } } } @@ -192,13 +190,13 @@ private void completeBladeTags(final List completionProposal CodeCompletionContext completionContext, Token currentToken) { String tagStart = currentToken.getText(); - CompletionRequest request = completionRequest(tagStart, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(tagStart, completionContext.getCaretOffset()); BladeTags tagsContainer = new BladeTags(); Tag[] tags = tagsContainer.getTags(); for (Tag tag : tags) { if (tag.openTag().startsWith(tagStart)) { TagElement tagElement = new TagElement(tag.closeTag()); - completionProposals.add(new BladeCompletionProposal.BladeTag(tagElement, request, tag)); + completionProposals.add(new BladeCompletionProposal.BladeTag(tagElement, anchorOffset, tag)); } } } @@ -208,7 +206,7 @@ private void completeDirectives(final List completionProposa String prefix = currentToken.getText(); DirectiveCompletionList completionList = new DirectiveCompletionList(); - CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(prefix, completionContext.getCaretOffset()); for (Directive directive : completionList.getDirectives()) { String directiveName = directive.name(); @@ -216,15 +214,15 @@ private void completeDirectives(final List completionProposa DirectiveElement directiveEl = new DirectiveElement(directiveName, fo); if (directive.params()) { - completionProposals.add(new BladeCompletionProposal.DirectiveWithArg(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.DirectiveWithArg(directiveEl, anchorOffset, directive)); if (!directive.endtag().isEmpty()) { - completionProposals.add(new BladeCompletionProposal.BlockDirectiveWithArg(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.BlockDirectiveWithArg(directiveEl, anchorOffset, directive)); } } else { - completionProposals.add(new BladeCompletionProposal.InlineDirective(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.InlineDirective(directiveEl, anchorOffset, directive)); if (!directive.endtag().isEmpty()) { - completionProposals.add(new BladeCompletionProposal.BlockDirective(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.BlockDirective(directiveEl, anchorOffset, directive)); } } } @@ -236,11 +234,11 @@ private void completeDirectives(final List completionProposa public void filterDirectiveName(CustomDirectives.CustomDirective directive, FileObject file) { DirectiveElement directiveEl = new DirectiveElement(directive.name, file); if (directive.name.startsWith(prefix)) { - CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(prefix, completionContext.getCaretOffset()); completionProposals.add( new BladeCompletionProposal.CustomDirective( directiveEl, - request, + anchorOffset, directive.name )); } @@ -317,13 +315,8 @@ public Documentation documentElement(ParserResult parserResult, ElementHandle el } return result; } - - public static CompletionRequest completionRequest(String prefix, int offset) { - CompletionRequest request = new CompletionRequest(); - request.anchorOffset = offset - prefix.length(); - request.carretOffset = offset; - request.prefix = prefix; - - return request; + + public static int computeAnchorOffset(@NonNull String prefix, int offset){ + return offset - prefix.length(); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 1514c460a43e..7394f019fa75 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.Set; import javax.swing.ImageIcon; +import org.netbeans.api.annotations.common.NonNull; import org.netbeans.modules.csl.api.CompletionProposal; import org.netbeans.modules.csl.api.ElementHandle; import org.netbeans.modules.csl.api.ElementKind; @@ -28,6 +29,7 @@ import org.netbeans.modules.csl.api.Modifier; import org.netbeans.modules.php.blade.csl.elements.ClassElement; import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.modules.php.blade.syntax.annotation.Directive; import org.netbeans.modules.php.blade.syntax.annotation.Tag; @@ -40,27 +42,27 @@ */ public class BladeCompletionProposal implements CompletionProposal { - final CompletionRequest request; - protected final ElementHandle element; - final String previewValue; - protected Directive directive; + private final ElementHandle element; + private final String previewValue; + private int anchorOffset; + private Directive directive; - public BladeCompletionProposal(ElementHandle element, CompletionRequest request, String previewValue) { + public BladeCompletionProposal(ElementHandle element, int anchorOffset, String previewValue) { this.element = element; - this.request = request; + this.anchorOffset = anchorOffset; this.previewValue = previewValue; } - public BladeCompletionProposal(ElementHandle element, CompletionRequest request, Directive directive) { + public BladeCompletionProposal(ElementHandle element, int anchorOffset, Directive directive) { this.element = element; - this.request = request; + this.anchorOffset = anchorOffset; this.previewValue = directive.name(); this.directive = directive; } @Override public int getAnchorOffset() { - return request.anchorOffset; + return anchorOffset; } @Override @@ -86,12 +88,12 @@ public int getSortPrioOverride() { @Override public String getLhsHtml(HtmlFormatter formatter) { formatter.name(getKind(), true); - formatter.appendHtml(""); - formatter.appendHtml(""); + formatter.appendHtml(""); // NOI18N + formatter.appendHtml(""); // NOI18N formatter.appendText(previewValue); - formatter.appendHtml(""); - formatter.appendHtml(""); - formatter.name(getKind(), false); + formatter.appendHtml(""); // NOI18N + formatter.appendHtml(""); // NOI18N + formatter.name(getKind(), false); // NOI18N return formatter.getText(); } @@ -141,11 +143,15 @@ public ElementKind getKind() { public boolean isSmart() { return true; } + + public Directive getDirective(){ + return directive; + } public static class PhpElementItem extends BladeCompletionProposal { - public PhpElementItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public PhpElementItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -165,8 +171,8 @@ public String getRhsHtml(HtmlFormatter formatter) { public static class NamespaceItem extends PhpElementItem { - public NamespaceItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public NamespaceItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -182,8 +188,8 @@ public int getSortPrioOverride() { public static class DirectiveItem extends BladeCompletionProposal { - public DirectiveItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public DirectiveItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } } @@ -192,8 +198,8 @@ public static class ClassItem extends PhpElementItem { protected String namespace = null; - public ClassItem(ClassElement element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public ClassItem(ClassElement element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); this.namespace = element.getNamespace(); } @@ -218,9 +224,9 @@ public int getSortPrioOverride() { @Override public String getCustomInsertTemplate() { if (namespace != null && namespace.length() > 0) { - return "\\" + namespace + "\\" + element.getName(); + return "\\" + namespace + "\\" + getElement().getName(); } - return element.getName(); + return getElement().getName(); } } @@ -228,15 +234,15 @@ public static class FunctionItem extends PhpElementItem { protected final String namespace; - public FunctionItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public FunctionItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); this.namespace = null; } - public FunctionItem(ElementHandle element, CompletionRequest request, + public FunctionItem(ElementHandle element, int anchorOffset, String namespace, String previewValue) { - super(element, request, previewValue); + super(element, anchorOffset, previewValue); this.namespace = namespace; } @@ -262,8 +268,8 @@ public String getRhsHtml(HtmlFormatter formatter) { public static class ConstantItem extends PhpElementItem { - public ConstantItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public ConstantItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -275,8 +281,8 @@ public ElementKind getKind() { public static class VariableItem extends BladeCompletionProposal { - public VariableItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public VariableItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -288,8 +294,8 @@ public ElementKind getKind() { public static class BladeVariableItem extends BladeCompletionProposal { - public BladeVariableItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public BladeVariableItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -299,29 +305,22 @@ public ElementKind getKind() { @Override public String getRhsHtml(HtmlFormatter formatter) { - return "blade"; + return "blade"; // NOI18N } } - public static class CompletionRequest { - - public int anchorOffset; - public int carretOffset; - public String prefix; - } - public static class BladeTag extends BladeCompletionProposal { - protected Tag tag; + private Tag tag; - public BladeTag(ElementHandle element, CompletionRequest request, Tag tag) { - super(element, request, ""); + public BladeTag(ElementHandle element, int anchorOffset, Tag tag) { + super(element, anchorOffset, ""); // NOI18N this.tag = tag; } @Override public String getCustomInsertTemplate() { - return tag.openTag() + " ${cursor} " + tag.closeTag(); + return tag.openTag() + " ${cursor} " + tag.closeTag(); // NOI18N } @Override @@ -342,12 +341,12 @@ public int getSortPrioOverride() { public static class DirectiveProposal extends BladeCompletionProposal { - public DirectiveProposal(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public DirectiveProposal(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } - public DirectiveProposal(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public DirectiveProposal(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -358,22 +357,22 @@ public ImageIcon getIcon() { @Override public String getRhsHtml(HtmlFormatter formatter) { - if (this.directive == null) { + if (this.getDirective() == null) { return null; } - if (directive.description().isEmpty() && !this.directive.since().isEmpty()) { - return "v" + this.directive.since(); + if (getDirective().description().isEmpty() && !getDirective().since().isEmpty()) { + return "v" + getDirective().since(); // NOI18N } - return this.directive.description(); + return getDirective().description(); } } public static class CustomDirective extends DirectiveProposal { - public CustomDirective(ElementHandle element, CompletionRequest request, String preview) { - super(element, request, preview); + public CustomDirective(ElementHandle element, int anchorOffset, String preview) { + super(element, anchorOffset, preview); } @Override @@ -381,87 +380,78 @@ public String getRhsHtml(HtmlFormatter formatter) { if (this.getElement().getFileObject() != null) { return this.getElement().getFileObject().getNameExt(); } - return "custom directive"; + return "custom directive"; // NOI18N } } public static class InlineDirective extends DirectiveProposal { - public InlineDirective(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public InlineDirective(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } } public static class DirectiveWithArg extends InlineDirective { - public DirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public DirectiveWithArg(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } @Override public String getCustomInsertTemplate() { String template = getName() + "($$${arg})"; switch (getName()) { - case "@include": - case "@extends": - template = getName() + "('${path}')"; - break; + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> template = getName() + "('${path}')"; // NOI18N } return template; } @Override public String getLhsHtml(HtmlFormatter formatter) { - return getName() + "()"; + return getName() + "()"; // NOI18N } } public static class BlockDirective extends DirectiveProposal { - public BlockDirective(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public BlockDirective(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } @Override public String getLhsHtml(HtmlFormatter formatter) { - return getName() + " ... " + directive.endtag(); + return getName() + " ... " + getDirective().endtag(); // NOI18N } @Override public String getCustomInsertTemplate() { - return getName() + "\n ${selection} ${cursor}\n" + directive.endtag(); + return getName() + "\n ${selection} ${cursor}\n" + getDirective().endtag(); // NOI18N } } public static class BlockDirectiveWithArg extends DirectiveProposal { - public BlockDirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public BlockDirectiveWithArg(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } @Override public String getLhsHtml(HtmlFormatter formatter) { - return getName() + "() ... " + directive.endtag(); + return getName() + "() ... " + getDirective().endtag(); // NOI18N } @Override public String getCustomInsertTemplate() { - String template = getName() + "($$${arg})\n ${cursor}\n" + directive.endtag(); - - switch (getName()) { - case "@foreach": // NOI18N - template = getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + directive.endtag(); - break; - case "@section": // NOI18N - case "@session": // NOI18N - template = getName() + "('${id}')\n ${cursor}\n" + directive.endtag(); - break; - } - - return template; + return switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_FOREACH -> // NOI18N + getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + getDirective().endtag(); // NOI18N + case BladeDirectivesUtils.DIRECTIVE_SECTION, BladeDirectivesUtils.DIRECTIVE_SESSION -> // NOI18N + getName() + "('${id}')\n ${cursor}\n" + getDirective().endtag(); // NOI18N + default -> getName() + "($$${arg})\n ${cursor}\n" + getDirective().endtag(); // NOI18N + }; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index 4fb960ec83bd..f79e213448c8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -62,7 +62,7 @@ */ @MimeRegistrations(value = { @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class), - @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class) + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = CompletionProvider.class) }) public class BladeCompletionProvider implements CompletionProvider { @@ -182,7 +182,7 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse } finally { long time = System.currentTimeMillis() - startTime; if (time > 2000) { - LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); // NOI18N } resultSet.finish(); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 1234989407b6..58799632cac4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -31,7 +31,9 @@ import org.netbeans.api.editor.document.EditorDocumentUtils; import org.netbeans.api.editor.mimelookup.MimeRegistration; import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.netbeans.api.project.Project; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.EditorStringUtils; import org.netbeans.modules.php.blade.editor.ResourceUtilities; @@ -40,7 +42,6 @@ import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionProvider; @@ -58,7 +59,7 @@ * @author bhaidu */ @MimeRegistrations(value = { - @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), + @MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = CompletionProvider.class, position = 102), } ) public class BladePhpCompletionProvider implements CompletionProvider { @@ -99,15 +100,10 @@ public int getAutoQueryTypes(JTextComponent component, String typedText) { } char lastChar = typedText.charAt(typedText.length() - 1); - switch (lastChar) { - case ')': - case '\n': - case '<': - case '>': - return 0; - } - - return COMPLETION_QUERY_TYPE; + return switch (lastChar) { + case ')', '\n', '<', '>' -> 0; + default -> COMPLETION_QUERY_TYPE; + }; } private class BladeCompletionQuery extends AsyncCompletionQuery { @@ -121,7 +117,7 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse doQuery(resultSet, doc, caretOffset); long time = System.currentTimeMillis() - startTime; if (time > 2000) { - LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); // NOI18N } resultSet.finish(); } @@ -212,7 +208,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse for (FileObject file : childrenFiles) { String pathFileName = file.getName(); if (!file.isFolder()) { - pathFileName = pathFileName.replace(".blade", ""); + pathFileName = pathFileName.replace(".blade", ""); // NOI18N } completeBladePath(pathFileName, file, pathOffset, resultSet); } @@ -232,10 +228,8 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse case EXPR_STRING: { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); - if (!pathName.contains("resources")) { - if (!"resources".startsWith(pathName)) { - break; - } + if (!pathName.contains(BladePathUtils.LARAVEL_RESOURCES)) { + break; } int lastSlash = pathName.lastIndexOf("/"); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index 1d3c146ee7f1..f91f70e8cdbd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.List; import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.CodeCompletionContext; import org.netbeans.modules.csl.api.CodeCompletionHandler; @@ -33,7 +34,6 @@ import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; import org.netbeans.modules.php.blade.editor.EditorStringUtils; -import static org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler.completionRequest; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; @@ -50,9 +50,13 @@ * * @author bogdan */ -public class PhpCodeCompletionService { +public final class PhpCodeCompletionService { - public String prefix = ""; + private String prefix = ""; + + public String getPrefix() { + return prefix; + } public List getCompletionProposal(int offset, Token currentToken) { List proposals = new ArrayList<>(); @@ -100,7 +104,7 @@ public static void completePhpCode(final List completionProp BladeParserResult.FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(offset); FileObject fo = parserResult.getSnapshot().getSource().getFileObject(); - + if (fieldAccessReference != null) { completeClassConstants(prefix, fieldAccessReference.ownerClass.identifier, offset, completionProposals, fo); completeClassMethods(prefix, fieldAccessReference, offset, completionProposals, fo); @@ -139,42 +143,41 @@ public static void completePhpCode(final List completionProp Collection indexedNamespaces = PhpIndexUtils.queryNamespaces( fo, namespacePath, QuerySupport.Kind.PREFIX ); - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexedNamespaces) { completionProposals.add(new BladeCompletionProposal.NamespaceItem( - namespaceElement(indexResult), request, indexResult.name)); + namespaceElement(indexResult), anchorOffset, indexResult.name)); } } else if (prefix.endsWith("\\")) { //the identifier is the namespace int substringOffset = elementReference.identifier.startsWith("\\") ? 1 : 0; String namespacePath = elementReference.identifier.substring(substringOffset, elementReference.identifier.length() - 1); Collection indexClassResults = PhpIndexUtils.queryAllNamespaceClasses(fo, namespacePath); - BladeCompletionProposal.CompletionRequest request = completionRequest(namespacePath, offset + namespacePath.length()); + int anchorOffset = computeAnchorOffset(namespacePath, offset + namespacePath.length()); for (PhpIndexResult indexResult : indexClassResults) { - completionProposals.add(new BladeCompletionProposal.ClassItem(classElement(indexResult), request, indexResult.name)); + completionProposals.add(new BladeCompletionProposal.ClassItem(classElement(indexResult), anchorOffset, indexResult.name)); } - //completeNamespacedPhpClasses("", namespace, offset, completionProposals, parserResult); } break; } } - private static void completePhpClasses(String prefix, int offset, + private static void completePhpClasses(String prefix, int offset, final List completionProposals, - FileObject fo) - { + FileObject fo) { Collection indexClassResults = PhpIndexUtils.queryClass(fo, prefix); if (indexClassResults.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ClassItem( - classElement(indexResult), request, indexResult.name)); + classElement(indexResult), anchorOffset, indexResult.name)); } } @@ -186,14 +189,14 @@ private static void completePhpFunctions(String prefix, int offset, if (indexedFunctions.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexFunctionResult indexResult : indexedFunctions) { //to be completed //might add syntax completion cursor String preview = indexResult.name + indexResult.getParamsAsString(); completionProposals.add(new BladeCompletionProposal.FunctionItem( functionElement(indexResult), - request, + anchorOffset, preview) ); } @@ -219,7 +222,7 @@ private static void completeClassMethods(String prefix, BladeParserResult.FieldA return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexFunctionResult indexResult : indexedFunctions) { //to be completed @@ -227,7 +230,7 @@ private static void completeClassMethods(String prefix, BladeParserResult.FieldA String preview = indexResult.name + indexResult.getParamsAsString(); completionProposals.add(new BladeCompletionProposal.FunctionItem( functionElement(indexResult), - request, + anchorOffset, indexResult.getClassNamespace(), preview) ); @@ -256,34 +259,33 @@ private static void completeNamespace(String prefix, int offset, return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset + substringOffset); + int anchorOffset = computeAnchorOffset(prefix, offset + substringOffset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.NamespaceItem( - namespaceElement(indexResult), request, indexResult.name)); + namespaceElement(indexResult), anchorOffset, indexResult.name)); } } private static void completeConstants(String prefix, int offset, final List completionProposals, - FileObject fo) - { + FileObject fo) { Collection indexClassResults = PhpIndexUtils.queryConstants(fo, prefix); //treat only uppercase strings - if (!Character.isUpperCase(prefix.charAt(0))){ + if (!Character.isUpperCase(prefix.charAt(0))) { return; } - + if (indexClassResults.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ConstantItem( - constantElement(indexResult), request, indexResult.name)); + constantElement(indexResult), anchorOffset, indexResult.name)); } } @@ -295,30 +297,29 @@ private static void completeClassConstants(String prefix, String ownerClass, int fo, prefix, ownerClass); //treat only uppercase strings - if (!Character.isUpperCase(prefix.charAt(0))){ + if (!Character.isUpperCase(prefix.charAt(0))) { return; } - + if (indexClassResults.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ConstantItem( - constantElement(indexResult), request, indexResult.name)); + constantElement(indexResult), anchorOffset, indexResult.name)); } } //TODO might move in a factory for NamedElement - private static ClassElement classElement(PhpIndexResult indexResult) { return new ClassElement(indexResult.name, indexResult.namespace, indexResult.declarationFile); } - + private static NamedElement namespaceElement(PhpIndexResult indexResult) { return namedElement(indexResult, ElementType.PHP_NAMESPACE); } @@ -331,12 +332,16 @@ private static NamedElement functionElement(PhpIndexResult indexResult) { private static NamedElement constantElement(PhpIndexResult indexResult) { return namedElement(indexResult, ElementType.PHP_CONSTANT); } - + private static NamedElement namedElement(PhpIndexResult indexResult, ElementType type) { return new NamedElement(indexResult.name, indexResult.declarationFile, type); } - + private static NamedElement namedElement(String preview, PhpIndexResult indexResult, ElementType type) { return new NamedElement(preview, indexResult.declarationFile, type); } + + public static int computeAnchorOffset(@NonNull String prefix, int offset) { + return offset - prefix.length(); + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java deleted file mode 100644 index fa9628c37714..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.components; - -import java.util.HashSet; -import java.util.Set; - -/** - * TO use in implementation with ComponentModel - * - * @author bhaidu - */ -public class ComponentElement { - public String name; - public String qualifiedClassName; - - public Set properties = new HashSet<>(); -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java deleted file mode 100644 index 32aa0b7b9ec9..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.components; - -import java.util.Map; -import java.util.WeakHashMap; -import org.netbeans.api.project.Project; -import org.netbeans.spi.project.ui.support.ProjectConvertors; -import org.openide.filesystems.FileObject; - -/** - * TO BE CONTINUED - * - * @author bhaidu - */ -public class ComponentModel { - - private static final Map MODEL_INSTANCE = new WeakHashMap<>(); - - protected static ComponentModel getModel(FileObject fo, String prefix) { - ComponentModel selfModel = new ComponentModel(); - Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); - if (projectOwner == null) { - return null; - } - int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); - if (ComponentModel.MODEL_INSTANCE.containsKey(pathHash)) { - selfModel = MODEL_INSTANCE.get(pathHash); - - } else { - MODEL_INSTANCE.put(pathHash, selfModel); - } - return selfModel; - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java index ac2a2deabc01..b6e47db5a3fc 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; -import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; @@ -39,7 +38,6 @@ public class ComponentsCompletionService { - @CheckForNull public Collection queryComponents(String prefix, FileObject fo) { Collection results = new ArrayList<>(); Project project = ProjectUtils.getMainOwner(fo); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java index 13c01e4e9351..3892b5a3115f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -57,7 +57,7 @@ public Collection queryComponents(String prefix, FileObject fo) } public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { - if (classQualifiedName.toLowerCase().contains("livewire")){ + if (classQualifiedName.toLowerCase().contains(ComponentsSupport.LIVEWIRE_NAME)){ return getLivewireComponentResourceFile(componentId, sourceFo); } @@ -70,7 +70,7 @@ public FileObject getLivewireComponentResourceFile(String componentId, FileObjec return null; } - FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + ".blade.php"); + FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + ".blade.php"); // NOI18N if (componentResource != null && componentResource.isValid()){ return componentResource; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java index aef8df37b541..d6cbc41a7a00 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -90,7 +90,7 @@ private CustomDirectives(Project project) { private void extractCustomDirectives() { LOGGER.info("Extracting custom directives"); String[] compilerPathList = BladeProjectProperties.getInstance(project).getCompilerPathList(); - FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); + FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); // NOI18N String defaultAppPath = ""; if (defaultAppProvider != null){ @@ -171,7 +171,7 @@ public List getList() { * directive name */ private class FunctionInvocationVisitor extends org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor { - private final String[] validFunctions = new String[]{"directive", "if"}; + private final String[] validFunctions = new String[]{"directive", "if"}; // NOI18N private final List directives; public FunctionInvocationVisitor() { @@ -196,13 +196,13 @@ public void visit(FunctionInvocation node) { Expression directiveName = (Expression) iter.next(); if (directiveName != null && directiveName instanceof Scalar) { Scalar name = (Scalar) directiveName; - String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); + String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); // NOI18N directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset())); //Custom If Statements if (functionName.equals("if")){ - directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); - directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); - directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); + directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); // NOI18N + directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); // NOI18N + directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); // NOI18N } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java index 7d88ddc83b16..7493ad3274bd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java @@ -28,6 +28,7 @@ import org.netbeans.modules.parsing.api.Embedding; import org.netbeans.modules.parsing.api.Snapshot; import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; /** @@ -36,9 +37,9 @@ */ @EmbeddingProvider.Registration( mimeType = BladeLanguage.MIME_TYPE, - targetMimeType = "text/x-php5") + targetMimeType = FileUtils.PHP_MIME_TYPE) public class BladePhpEmbeddingProvider extends EmbeddingProvider { - public static final String TARGET_MIME_TYPE = "text/x-php5"; //NOI18N + public static final String TARGET_MIME_TYPE = FileUtils.PHP_MIME_TYPE; //NOI18N @Override public List getEmbeddings(final Snapshot snapshot) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java index 16c6fd6e8e66..7d9e2974419d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java @@ -34,6 +34,7 @@ import org.netbeans.modules.parsing.api.UserTask; import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.editor.parser.PHPParseResult; import org.openide.filesystems.AbstractFileSystem; import org.openide.filesystems.DefaultAttributes; @@ -299,7 +300,7 @@ public boolean readOnly(String name) { @Override public String mimeType(String name) { - return "text/x-php5"; + return FileUtils.PHP_MIME_TYPE; } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index 6d660dbb8e3d..05d10e00d11a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -28,6 +28,7 @@ import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.spi.project.ui.support.ProjectConvertors; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; @@ -38,6 +39,7 @@ */ public final class BladePathUtils { + public static final String LARAVEL_RESOURCES = "resources"; //NOI18N public static final String LARAVEL_VIEW_PATH = "resources/views"; //NOI18N public static final String BLADE_EXT = ".blade.php"; //NOI18N @@ -133,11 +135,11 @@ public static List getParentChildrenFromPrefixPath(FileObject contex return list; } - String unixPath = prefixViewPath.replace(".", "/"); + String unixPath = prefixViewPath.replace(StringUtils.DOT, StringUtils.FORWARD_SLASH); int relativeSlash; //fix issues with lastIndexOf search - relativeSlash = unixPath.lastIndexOf("/"); + relativeSlash = unixPath.lastIndexOf(StringUtils.FORWARD_SLASH); HashSet filteredViewRoots = new HashSet<>(); @@ -179,7 +181,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex //filter by filename in relative context for (FileObject rootFolder : filteredViewRoots) { for (FileObject file : rootFolder.getChildren()) { - String filePath = file.getPath().replace(rootFolder.getPath() + "/", ""); + String filePath = file.getPath().replace(rootFolder.getPath() + StringUtils.FORWARD_SLASH, ""); if (filePath.startsWith(relativePrefixToCompare)) { list.add(file); } @@ -269,7 +271,7 @@ public static String toBladeViewPath(FileObject file) { String viewFileAbsPath = viewFile.getPath(); if (filePath.startsWith(viewFileAbsPath)) { String relativePath = filePath.replace(viewFileAbsPath, ""); - if (!relativePath.startsWith("/")) { + if (!relativePath.startsWith(StringUtils.FORWARD_SLASH)) { //it doesn't belong to the folder continue; } @@ -298,11 +300,11 @@ public static String getRelativeProjectPath(FileObject currentFile) { } public static String toBladeViewPath(String filePath) { - return filePath.replace(BLADE_EXT, "").replace("/", "."); + return filePath.replace(BLADE_EXT, "").replace(StringUtils.FORWARD_SLASH, StringUtils.DOT); } public static String viewPathToFilePath(String viewPath) { - return viewPath.replace(".", "/") + BLADE_EXT; + return viewPath.replace(StringUtils.DOT, StringUtils.FORWARD_SLASH) + BLADE_EXT; } public static HashSet getDefaultRoots(Project project) { @@ -317,6 +319,6 @@ public static HashSet getDefaultRoots(Project project) { } public static String toBladeToProjectFilePath(String path) { - return LARAVEL_VIEW_PATH + "/" + viewPathToFilePath(path); + return LARAVEL_VIEW_PATH + StringUtils.FORWARD_SLASH + viewPathToFilePath(path); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 40f5c037c103..ceaad59fc130 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -41,6 +41,7 @@ public final class BladeDirectivesUtils { public static final String DIRECTIVE_FOREACH = "@foreach"; // NOI18N public static final String DIRECTIVE_INCLUDE = "@include"; // NOI18N public static final String DIRECTIVE_EXTENDS = "@extends"; // NOI18N + public static final String DIRECTIVE_SESSION = "@session"; // NOI18N public static String[] directiveStart2EndPair(String directive){ if (directive.equals(DIRECTIVE_SECTION)){ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java index 42b6b9eda961..bfd222d49388 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -24,6 +24,9 @@ */ public final class StringUtils { + public static final String DOT = "."; + public static final String FORWARD_SLASH = "/"; //NOI18N + private StringUtils() { } From 3bbf32ea1c08c270937891cae516af28d27582a4 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 1 Oct 2024 20:41:47 +0300 Subject: [PATCH 20/21] switch case code review, NOI18N, use Set instead of List for contains operations --- .../php/blade/editor/BladeBracesMatcher.java | 18 ++++--- .../blade/editor/BladeDeclarationFinder.java | 6 ++- .../php/blade/editor/BladeLanguage.java | 36 ++++++------- .../php/blade/editor/cache/QueryCache.java | 2 +- .../completion/BladeCompletionItem.java | 29 +++++----- .../completion/BladeCompletionProposal.java | 17 +++--- .../BladePhpCompletionProvider.java | 53 ++++++------------- .../ComponentDeclarationService.java | 3 ++ .../blade/editor/lexer/BladeLexerUtils.java | 8 +-- .../editor/ui/customizer/BladeDirectives.java | 4 +- .../ui/customizer/BladeViewsFoldersPanel.java | 13 ++--- .../editor/ui/customizer/UiOptionsUtils.java | 10 +--- .../syntax/antlr4/v10/BladeAntlrUtils.java | 44 +++------------ 13 files changed, 92 insertions(+), 151 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 18e8a1ec9605..b222001ff6d9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -20,7 +20,9 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.swing.text.BadLocationException; import org.antlr.v4.runtime.Token; import org.netbeans.api.annotations.common.CheckForNull; @@ -155,7 +157,7 @@ private BraceDirectionType findBraceDirectionType(String tokenText, Token token) private int[] findOpenTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); - List skipableTokenTypes = new ArrayList<>(); + Set skipableTokenTypes = new HashSet<>(); skipableTokenTypes.add(HTML); Token startToken = BladeAntlrUtils.findBackwardWithStop(context.getDocument(), originToken, @@ -173,7 +175,7 @@ private int[] findOpenTag() { private int[] findCloseTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); - List skipableTokenTypes = new ArrayList<>(); + Set skipableTokenTypes = new HashSet<>(); skipableTokenTypes.add(HTML); Token endToken = BladeAntlrUtils.findForwardWithStop(context.getDocument(), originToken, @@ -195,8 +197,8 @@ private int[] findDirectiveEnd(String directive) { if (pair == null){ return null; } - List startDirectiveForBalance = new ArrayList<>(); - List stopDirectives = Arrays.asList(pair); + Set startDirectiveForBalance = new HashSet<>(); + Set stopDirectives = new HashSet<>(Arrays.asList(pair)); for (String endDirective : pair) { String[] startDirectives = BladeDirectivesUtils.directiveEnd2StartPair(endDirective); @@ -224,8 +226,8 @@ private int[] findDirectiveEnd(String directive) { private int[] findCustomDirectiveEnd(String directive) { String endPrefix = BladeDirectivesUtils.END_DIRECTIVE_PREFIX; String[] pair = new String[]{endPrefix + directive.substring(1)}; - List stopDirectives = Arrays.asList(pair); - List startDirectiveForBalance = Arrays.asList(new String[]{directive}); + Set stopDirectives = new HashSet<>(Arrays.asList(pair)); + Set startDirectiveForBalance = new HashSet<>(Arrays.asList(new String[]{directive})); Token endToken = BladeAntlrUtils.findForward(context.getDocument(), originToken, @@ -244,8 +246,8 @@ private int[] findCustomDirectiveEnd(String directive) { @CheckForNull private int[] findOriginForDirectiveEnd(String directive) { String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); - List endDirectivesForBalance = new ArrayList<>(); - List openDirectives = Arrays.asList(pair); + Set endDirectivesForBalance = new HashSet<>(); + Set openDirectives = new HashSet<>(Arrays.asList(pair)); for (String startDirective : pair) { String[] endDirectives = BladeDirectivesUtils.directiveStart2EndPair(startDirective); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index af247662457c..3f452202a779 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -20,7 +20,9 @@ import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; @@ -121,8 +123,8 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { } if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { - List tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; - List tokensStop = Arrays.asList(new Integer[]{HTML}); + Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; + Set tokensStop = new HashSet<>(Arrays.asList(new Integer[]{HTML})); org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); int offsetCorrection = caretOffset - lineOffset; if (matchedToken != null) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index 99cb095427ef..4fa2390239f7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -56,30 +56,30 @@ * @author Haidu Bogdan */ @MIMEResolver.Registration( - resource = "../resources/mime-resolver.xml", - displayName = "#LBL_Blade_LOADER", + resource = "../resources/mime-resolver.xml", //NOI18N + displayName = "#LBL_Blade_LOADER", //NOI18N position = 1 ) @NbBundle.Messages({ "LBL_Blade_LOADER=Blade template files" }) -@LanguageRegistration(mimeType = "text/x-blade", useMultiview = true) +@LanguageRegistration(mimeType = "text/x-blade", useMultiview = true) //NOI18N @ActionReferences({ - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), - @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), //NOI18N + @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), //NOI18N path = ACTIONS, separatorBefore = 1700, position = 1800), - @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), + @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), //NOI18N } ) public class BladeLanguage extends DefaultLanguageConfig { @@ -203,10 +203,10 @@ protected Lexer createLexer(LexerRestartInfo info) { @NbBundle.Messages("Source=&Source Blade") @MultiViewElement.Registration( - displayName = "#Source", + displayName = "#Source", //NOI18N persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, mimeType = BladeLanguage.MIME_TYPE, - preferredID = "blade.source", + preferredID = "blade.source", //NOI18N position = 100 ) public static MultiViewEditorElement createMultiViewEditorElement(Lookup context) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java index e6568f2153b0..e971d6dfbaa5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java @@ -59,7 +59,7 @@ public boolean containsKey(K key) { } protected Set getExpiredKeys() { - return this.cacheMap.keySet().parallelStream() + return this.cacheMap.keySet().stream() .filter(this::isExpired) .collect(Collectors.toSet()); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index c3c406956285..2e55d0209b18 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -94,7 +94,6 @@ public void render(Graphics g, Font defaultFont, Color defaultColor, Color backg CompletionUtilities.renderHtml(getIcon(), getLeftHtmlText(), getRightHtmlText(), g, defaultFont, defaultColor, width, height, selected); } - @Override public CompletionTask createDocumentationTask() { return null; @@ -137,11 +136,11 @@ public CharSequence getSortText() { public CharSequence getInsertPrefix() { return getItemText(); } - + protected ImageIcon getIcon() { return null; } - + protected String getLeftHtmlText() { return name; } @@ -243,13 +242,12 @@ public DirectiveWithArg(String directive, int substitutionOffset, @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})"; // NOI18N - switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_INCLUDE, - BladeDirectivesUtils.DIRECTIVE_EXTENDS -> - template = getItemText() + "('${path}')"; // NOI18N - } - return template; + return switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> + getItemText() + "('${path}')"; // NOI18N + default -> + getItemText() + "($$${arg})"; // NOI18N + }; } @Override @@ -316,14 +314,11 @@ public BlockDirectiveWithArg(String directive, String endTag, int substitutionOf @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + getEndTag(); // NOI18N - - switch (getName()) { + return switch (getName()) { case BladeDirectivesUtils.DIRECTIVE_FOREACH -> - template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + getEndTag(); // NOI18N - } - - return template; + getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + getEndTag(); // NOI18N + default -> getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + getEndTag(); // NOI18N + }; } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 7394f019fa75..a2f2a2729694 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -128,7 +128,7 @@ public String getRhsHtml(HtmlFormatter formatter) { } if (file != null) { formatter.reset(); - formatter.appendText(" "); + formatter.appendText(" "); // NOI18N formatter.appendText(file.getName()); } return formatter.getText(); @@ -162,7 +162,7 @@ public String getRhsHtml(HtmlFormatter formatter) { } if (file != null) { formatter.reset(); - formatter.appendText(" "); + formatter.appendText(" "); // NOI18N formatter.appendText(file.getNameExt()); } return formatter.getText(); @@ -196,7 +196,7 @@ public DirectiveItem(ElementHandle element, int anchorOffset, String previewValu public static class ClassItem extends PhpElementItem { - protected String namespace = null; + private String namespace = null; public ClassItem(ClassElement element, int anchorOffset, String previewValue) { super(element, anchorOffset, previewValue); @@ -224,7 +224,7 @@ public int getSortPrioOverride() { @Override public String getCustomInsertTemplate() { if (namespace != null && namespace.length() > 0) { - return "\\" + namespace + "\\" + getElement().getName(); + return "\\" + namespace + "\\" + getElement().getName(); // NOI18N } return getElement().getName(); } @@ -401,11 +401,10 @@ public DirectiveWithArg(ElementHandle element, int anchorOffset, Directive direc @Override public String getCustomInsertTemplate() { - String template = getName() + "($$${arg})"; - switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> template = getName() + "('${path}')"; // NOI18N - } - return template; + return switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> getName() + "('${path}')"; // NOI18N + default -> getName() + "($$${arg})"; // NOI18N + }; } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 58799632cac4..8f248c5f8cc7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -20,7 +20,9 @@ import java.io.IOException; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; @@ -39,6 +41,7 @@ import org.netbeans.modules.php.blade.editor.ResourceUtilities; import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; import org.netbeans.modules.php.blade.editor.indexing.BladeIndex.IndexedReferenceId; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; @@ -169,26 +172,17 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse } switch (currentToken.getType()) { - case BL_PARAM_STRING: { + case BL_PARAM_STRING -> { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); - List tokensMatch = Arrays.asList(new Integer[]{ - D_EXTENDS, D_INCLUDE, D_SECTION, D_HAS_SECTION, - D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, - D_EACH, D_PUSH, D_PUSH_IF, D_PREPEND - }); - - List tokensStop = Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR}); - Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensMatch, tokensStop); + Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; + Set tokensStop = new HashSet<>(Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR})); + + Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); if (directiveToken == null) { - break; + return; } switch (directiveToken.getType()) { - case D_EXTENDS: - case D_INCLUDE: - case D_INCLUDE_IF: - case D_INCLUDE_WHEN: - case D_INCLUDE_UNLESS: - case D_EACH: + case D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_EACH -> { int lastDotPos; if (pathName.endsWith(".")) { @@ -213,23 +207,15 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse completeBladePath(pathFileName, file, pathOffset, resultSet); } return; - case D_SECTION: - case D_HAS_SECTION: - completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); - break; - case D_PUSH: - case D_PUSH_IF: - case D_PREPEND: - completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); - break; } - break; + case D_SECTION, D_HAS_SECTION -> completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); + case D_PUSH, D_PUSH_IF, D_PREPEND -> completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); + } } - case EXPR_STRING: { + case EXPR_STRING -> { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); if (!pathName.contains(BladePathUtils.LARAVEL_RESOURCES)) { - break; } int lastSlash = pathName.lastIndexOf("/"); @@ -237,7 +223,6 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse FileObject projectDir = ProjectUtils.getProjectDirectory(fo); if (projectDir == null) { - break; } int pathOffset = caretOffset - pathName.length(); @@ -249,7 +234,6 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse String cssDirRoot = CSS_ASSET_FOLDER; FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); addAssetPathCompletionItem(cssDirRoot, cssFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); - break; } boolean isJsPath = JS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(JS_ASSET_FOLDER); @@ -258,7 +242,6 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse if (isJsPath) { FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); if (jsFolder == null || !jsFolder.isValid()) { - break; } for (FileObject file : jsFolder.getChildren()) { String jsPath = JS_ASSET_FOLDER + "/" + file.getNameExt(); @@ -266,12 +249,10 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.JS_FILE); } } - break; } if (isCssPath) { FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); if (cssFolder == null || !cssFolder.isValid()) { - break; } for (FileObject file : cssFolder.getChildren()) { String jsPath = CSS_ASSET_FOLDER + "/" + file.getNameExt(); @@ -279,12 +260,10 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.CSS_FILE); } } - break; } - break; } - default: - break; + default -> { + } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java index 3892b5a3115f..6551a264860f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; @@ -56,6 +57,7 @@ public Collection queryComponents(String prefix, FileObject fo) return results; } + @CheckForNull public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { if (classQualifiedName.toLowerCase().contains(ComponentsSupport.LIVEWIRE_NAME)){ return getLivewireComponentResourceFile(componentId, sourceFo); @@ -64,6 +66,7 @@ public FileObject getComponentResourceFile(String componentId, String classQuali return null; } + @CheckForNull public FileObject getLivewireComponentResourceFile(String componentId, FileObject sourceFo) { Project project = ProjectUtils.getMainOwner(sourceFo); if (project == null) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java index d9e5de511063..79e347faee77 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -19,7 +19,9 @@ package org.netbeans.modules.php.blade.editor.lexer; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.swing.text.Document; import org.netbeans.api.lexer.Language; import org.netbeans.api.lexer.TokenHierarchy; @@ -36,12 +38,12 @@ public final class BladeLexerUtils { private BladeLexerUtils() { } - - public static final List TOKENS_WITH_IDENTIFIABLE_PARAM = Arrays.asList(new Integer[]{ + public static final Integer[] TOKENS_WITH_IDENTIFIABLE_PARAM_VALUES = new Integer[] { D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER - }); + }; + public static final Set TOKENS_WITH_IDENTIFIABLE_PARAM = new HashSet<>(Arrays.asList(TOKENS_WITH_IDENTIFIABLE_PARAM_VALUES)); public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { return getTokenSequence(th, offset, PHPTokenId.language()); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java index 78f0e75981d8..e98d5d043f08 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java @@ -38,7 +38,7 @@ public class BladeDirectives extends javax.swing.JPanel { private final Project project; - BladeProjectProperties bladeProperties; + private final BladeProjectProperties bladeProperties; /** * Creates new form CustomizerIncludePath @@ -177,7 +177,7 @@ private void removePathButtonActionPerformed(java.awt.event.ActionEvent evt) {// private void jLabel3MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel3MouseClicked try { - Desktop.getDesktop().browse(new URI("https://laravel.com/docs/10.x/blade#extending-blade")); + Desktop.getDesktop().browse(new URI("https://laravel.com/docs/10.x/blade#extending-blade")); // NOI18N } catch (URISyntaxException | IOException ex) { Exceptions.printStackTrace(ex); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java index 3d28314d3b43..ccf258fdd723 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java @@ -22,7 +22,6 @@ import java.io.File; import javax.swing.event.ChangeListener; import org.netbeans.api.project.Project; -import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; import org.netbeans.modules.php.blade.editor.indexing.IndexManager; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.spi.options.OptionsPanelController; @@ -33,17 +32,17 @@ @NbBundle.Messages("BladePanel.options.keywords.tabTitle=Frameworks & Tools") @OptionsPanelController.Keywords( keywords = { - "php", "blade" + "php", "blade" // NOI18N }, - location = "Html5", - tabTitle = "#BladePanel.options.keywords.tabTitle" + location = "Html5", // NOI18N + tabTitle = "#BladePanel.options.keywords.tabTitle" // NOI18N ) public final class BladeViewsFoldersPanel extends javax.swing.JPanel { private final ChangeSupport changeSupport = new ChangeSupport(this); private final Project project; - BladeProjectProperties bladeProperties; + private final BladeProjectProperties bladeProperties; BladeViewsFoldersPanel(Project project) { assert project != null; @@ -66,10 +65,6 @@ public void storeData(){ public void addChangeListener(ChangeListener listener) { changeSupport.addChangeListener(listener); } - - void fireChange() { - changeSupport.fireChange(); - } /** * This method is called from within the constructor to initialize the form. diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java index 194a751d7fb6..fb8a7989e195 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java @@ -18,9 +18,8 @@ */ package org.netbeans.modules.php.blade.editor.ui.customizer; -import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; -import java.util.List; /** @@ -30,11 +29,6 @@ public class UiOptionsUtils { public static String encodeToStrings(Enumeration list) { - List result = new ArrayList<>(); - while (list.hasMoreElements()) { - result.add(list.nextElement()); - } - - return String.join("|", result); + return String.join("|", Collections.list(list)); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java index ae688538e85c..181cf362d0ce 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -19,6 +19,7 @@ package org.netbeans.modules.php.blade.syntax.antlr4.v10; import java.util.List; +import java.util.Set; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import org.antlr.v4.runtime.CharStreams; @@ -70,7 +71,7 @@ public static Token getToken(Document doc, int offset) { } public static Token findForward(Document doc, Token start, - List stopTokenText, List openTokensText) { + Set stopTokenText, Set openTokensText) { AntlrTokenSequence tokens = getTokens(doc); @@ -128,7 +129,7 @@ public static Token findForward(AntlrTokenSequence tokens, } public static Token findBackward(Document doc, Token start, - List stopTokenText, List openTokensText) { + Set stopTokenText, Set openTokensText) { AntlrTokenSequence tokens = getTokens(doc); @@ -165,7 +166,7 @@ public static Token findBackward(Document doc, Token start, } public static Token findBackward(AntlrTokenSequence tokens, - List tokensMatch, List tokensStop) { + Set tokensMatch, Set tokensStop) { while (tokens.hasPrevious()) { Token pt = tokens.previous().get(); @@ -185,39 +186,8 @@ public static Token findBackward(AntlrTokenSequence tokens, return null; } - public static Token findForward(Document doc, Token start, - int tokensMatch, List skipableTokens) { - AntlrTokenSequence tokens = getTokens(doc); - - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(start.getStopIndex() + 1); - - while (tokens.hasNext()) { - Token pt = tokens.next().get(); - if (pt == null) { - continue; - } - - if (pt.getType() == tokensMatch) { - return pt; - } - - if (skipableTokens.contains(pt.getType())) { - continue; - } - - return null; - } - - return null; - - } - public static Token findForwardWithStop(Document doc, Token start, - int tokensMatch, List stopTokens) { + int tokensMatch, Set stopTokens) { AntlrTokenSequence tokens = getTokens(doc); if (tokens == null || tokens.isEmpty()) { @@ -246,7 +216,7 @@ public static Token findForwardWithStop(Document doc, Token start, } public static Token findBackward(Document doc, Token start, - int tokensMatch, List skipableTokens) { + int tokensMatch, Set skipableTokens) { AntlrTokenSequence tokens = getTokens(doc); if (tokens == null || tokens.isEmpty()) { @@ -277,7 +247,7 @@ public static Token findBackward(Document doc, Token start, } public static Token findBackwardWithStop(Document doc, Token start, - int tokensMatch, List stopTokens) { + int tokensMatch, Set stopTokens) { AntlrTokenSequence tokens = getTokens(doc); if (tokens == null || tokens.isEmpty()) { From 9649e830252822ca669e61401f9cea76453c8ece Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 1 Oct 2024 21:17:46 +0300 Subject: [PATCH 21/21] add test action for php module workflow, add sample files in license list, add license header in form files --- .github/workflows/main.yml | 3 +++ php/php.blade/licenseinfo.xml | 4 +++- .../editor/ui/customizer/BladeDirectives.form | 17 +++++++++++++++++ .../ui/customizer/BladeGeneralSettings.form | 17 +++++++++++++++++ .../ui/customizer/BladeViewsFoldersPanel.form | 17 +++++++++++++++++ .../resources/NewBladeFileDescription.html | 19 ++++++++++++++++++- .../blade/ui/options/BladeOptionsPanel.form | 17 +++++++++++++++++ 7 files changed, 92 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6befecbe2b53..9cbf960926ad 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2377,6 +2377,9 @@ jobs: - name: php.atoum run: ant $OPTS -f php/php.atoum test + - name: php.blade + run: ant $OPTS -f php/php.blade test + - name: php.code.analysis run: ant $OPTS -f php/php.code.analysis test diff --git a/php/php.blade/licenseinfo.xml b/php/php.blade/licenseinfo.xml index b832d133ad7a..d9ccbc4a7538 100644 --- a/php/php.blade/licenseinfo.xml +++ b/php/php.blade/licenseinfo.xml @@ -21,12 +21,14 @@ --> + src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php + src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php + src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html - tools/skeleton.netbeans src/org/netbeans/modules/php/blade/resources/icon.png src/org/netbeans/modules/php/blade/resources/icons/at.png src/org/netbeans/modules/php/blade/resources/icons/blade_file.png diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form index b92b5b851cd8..fdee705ee27b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form @@ -1,5 +1,22 @@ +
      diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form index 6c452fb0787d..6b535800c4d6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form @@ -1,5 +1,22 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form index 0fbe951aaca2..0d1b60f1b72a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form @@ -1,5 +1,22 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html index 8bc99c49c5ae..64aba5479af0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html @@ -1,5 +1,22 @@ - + Blade wizard diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form index ec263c1cdaf6..9d55b8541585 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form @@ -1,5 +1,22 @@ +