You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2021/03/23 03:00:21 UTC

[incubator-nlpcraft] branch master updated (0bd7b03 -> 38732c8)

This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git.


    from 0bd7b03  Minor improvements.
     new 04ea452  WIP.
     new da438d4  WIP.
     new b32a375  WIP.
     new 4d38bd0  WIP.
     new bb99559  WIP.
     new 9754314  WIP.
     new 8f2937c  WIP.
     new 38732c8  Update test_ok.idl

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/nlpcraft/examples/alarm/intents.idl |    8 +-
 .../nlpcraft/examples/weather/WeatherModel.java    |   11 +-
 .../nlpcraft/model/NCTokenPredicateContext.java    |    2 +-
 .../nlpcraft/model/NCTokenPredicateResult.java     |    2 +-
 .../nlpcraft/model/intent/NCIdlContext.scala       |    6 +-
 ...IdlTokenPredicate.scala => NCIdlFunction.scala} |    2 +-
 .../model/intent/{compiler => }/NCIdlStack.scala   |    2 +-
 .../nlpcraft/model/intent/NCIdlSynonym.scala       |    4 +-
 .../apache/nlpcraft/model/intent/NCIdlTerm.scala   |    7 +-
 .../model/intent/compiler/NCIdlCompiler.scala      |   88 +-
 .../model/intent/compiler/NCIdlCompilerBase.scala  |  295 +++---
 .../nlpcraft/model/intent/compiler/antlr4/NCIdl.g4 |   33 +-
 .../model/intent/compiler/antlr4/NCIdl.interp      |   14 +-
 .../model/intent/compiler/antlr4/NCIdl.tokens      |   20 +-
 .../intent/compiler/antlr4/NCIdlBaseListener.java  |   52 +-
 .../model/intent/compiler/antlr4/NCIdlLexer.interp |    5 +-
 .../model/intent/compiler/antlr4/NCIdlLexer.java   |  758 +++++++-------
 .../model/intent/compiler/antlr4/NCIdlLexer.tokens |   20 +-
 .../intent/compiler/antlr4/NCIdlListener.java      |   64 +-
 .../model/intent/compiler/antlr4/NCIdlParser.java  | 1040 ++++++++++++--------
 .../model/intent/solver/NCIntentSolverEngine.scala |   29 +-
 .../nlpcraft/probe/mgrs/NCProbeSynonym.scala       |    2 +-
 .../nlpcraft/probe/mgrs/NCProbeSynonymChunk.scala  |    4 +-
 .../intent/idl/compiler/NCIdlCompilerSpec.scala    |   30 +-
 .../nlpcraft/model/intent/idl/compiler/test_ok.idl |   12 +-
 25 files changed, 1433 insertions(+), 1077 deletions(-)
 rename nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/{NCIdlTokenPredicate.scala => NCIdlFunction.scala} (86%)
 rename nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/{compiler => }/NCIdlStack.scala (96%)

[incubator-nlpcraft] 04/08: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 4d38bd0130912f537f943e764a7e1e1ffb191cc0
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 18:53:58 2021 -0700

    WIP.
---
 .../model/intent/compiler/NCIdlCompiler.scala      |  4 +--
 .../intent/idl/compiler/NCIdlCompilerSpec.scala    | 30 ++++++++++++++++++++--
 .../nlpcraft/model/intent/idl/compiler/test_ok.idl | 11 ++++++--
 3 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
index a03ea3d..1dfc42b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
@@ -132,7 +132,7 @@ object NCIdlCompiler extends LazyLogging {
             val varName = ctx.id().getText
 
             if (!vars.contains(varName))
-                throw newSyntaxError(s"Unknown variable: $varName")(ctx)
+                throw newSyntaxError(s"Unknown variable: @$varName")(ctx)
 
             val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒
                 stack.push(() ⇒ idlCtx.vars(varName)(tok, idlCtx))
@@ -144,7 +144,7 @@ object NCIdlCompiler extends LazyLogging {
             val varName = ctx.id().getText
 
             if (vars.contains(varName))
-                throw newSyntaxError(s"Duplicate variable: $varName")(ctx)
+                throw newSyntaxError(s"Duplicate variable: @$varName")(ctx)
 
             vars += varName → exprToFunction("Variable declaration", _ ⇒ true)(ctx)
 
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/NCIdlCompilerSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/NCIdlCompilerSpec.scala
index b627609..fd6e8e5 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/NCIdlCompilerSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/NCIdlCompilerSpec.scala
@@ -32,6 +32,7 @@ class NCIdlCompilerSpec {
         override val getId: String = MODEL_ID
         override val getName: String = MODEL_ID
         override val getVersion: String = "1.0.0"
+        override def getOrigin: String = "test"
     }
     
     /**
@@ -145,8 +146,10 @@ class NCIdlCompilerSpec {
         checkCompileError(
             """
               |intent=i1
-              |     meta={'a': true1, 'b': {'arr': [1, 2, 3]}}
-              |     term(t1)={2 == 2 && size(id()) != -25}
+              |     meta={'a': true, 'b': {'arr': [1, 2, 3]}}
+              |     term(t1)={
+              |         @x == 2 && size(id()) != -25
+              |     }
               |""".stripMargin
         )
         checkCompileError(
@@ -159,6 +162,29 @@ class NCIdlCompilerSpec {
         checkCompileError(
             """
               |intent=i1
+              |     flow="a[^0-9b]"
+              |     term(t1)={
+              |         @x = 2
+              |         @x = 2
+              |
+              |         true
+              |     }
+              |""".stripMargin
+        )
+        checkCompileError(
+            """
+              |intent=i1
+              |     flow="a[^0-9b]"
+              |     term(t1)={
+              |         true
+              |
+              |         @x = 2
+              |     }
+              |""".stripMargin
+        )
+        checkCompileError(
+            """
+              |intent=i1
               |     term(t1)={true}[2,1]
               |""".stripMargin
         )
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl
index 890cf8c..8f06881 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl
@@ -38,12 +38,19 @@ intent=i2
     flow="a[^0-9]b"
     meta={'a': 42, 'b': {'Москва': [1, 2, 3]}}
     term(t1)={2 == 2 && !(id()) != -25 && meta_model('a') == 42}
-    term(t2)={meta_model('a') == 42}
+    term(t2)={
+        @a = meta_model('a')
+
+        @a == 42
+    }
 
 intent=i3
     flow="a[^0-9]b"
     term(t1)={
-        has(
+        @x = 2
+        @xx = @x * 2
+
+        @xx == 4 && has(
             json(meta_req('user_json_payload')),
             list("موسكو\"", 'v1\'v1', "k2", "v2")
         )

[incubator-nlpcraft] 08/08: Update test_ok.idl

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 38732c8ad62cf9b5066530fa9d04739e9620963f
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 19:59:10 2021 -0700

    Update test_ok.idl
---
 .../org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl      | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl
index 8f06881..9830ca5 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/test_ok.idl
@@ -40,17 +40,18 @@ intent=i2
     term(t1)={2 == 2 && !(id()) != -25 && meta_model('a') == 42}
     term(t2)={
         @a = meta_model('a')
+        @list = list(1, 2, 3, 4)
 
-        @a == 42
+        @a == 42 && has_all(@list, list(3, 2))
     }
 
 intent=i3
     flow="a[^0-9]b"
     term(t1)={
         @x = 2
-        @xx = @x * 2
+        @xx = ((@x * @x) / 2) * 3
 
-        @xx == 4 && has(
+        @xx == 6 && has(
             json(meta_req('user_json_payload')),
             list("موسكو\"", 'v1\'v1', "k2", "v2")
         )

[incubator-nlpcraft] 02/08: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit da438d47189c4b749fc8410b0fcdead1229bcc51
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 17:33:03 2021 -0700

    WIP.
---
 .../nlpcraft/model/intent/NCIdlContext.scala       |  7 +-
 ...IdlTokenPredicate.scala => NCIdlFunction.scala} |  2 +-
 .../nlpcraft/model/intent/NCIdlSynonym.scala       |  4 +-
 .../apache/nlpcraft/model/intent/NCIdlTerm.scala   |  7 +-
 .../model/intent/compiler/NCIdlCompiler.scala      | 87 ++++++++++++++++------
 .../model/intent/solver/NCIntentSolverEngine.scala |  4 +-
 .../nlpcraft/probe/mgrs/NCProbeSynonymChunk.scala  |  4 +-
 7 files changed, 82 insertions(+), 33 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala
index 1d09238..32fa895 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala
@@ -19,6 +19,9 @@ package org.apache.nlpcraft.model.intent
 
 import org.apache.nlpcraft.common.ScalaMeta
 import org.apache.nlpcraft.model.NCRequest
+import org.apache.nlpcraft.model.intent.compiler.NCIdlStackItem
+
+import scala.collection.mutable
 
 /**
  *
@@ -26,11 +29,13 @@ import org.apache.nlpcraft.model.NCRequest
  * @param convMeta Conversation metadata.
  * @param fragMeta Optional fragment (argument) metadata passed during intent fragment reference.
  * @param req Server request holder.
+ * @param vars Variable storage.
  */
 case class NCIdlContext(
     intentMeta: ScalaMeta = Map.empty[String, Object],
     convMeta: ScalaMeta = Map.empty[String, Object],
     fragMeta: ScalaMeta = Map.empty[String, Object],
-    req: NCRequest
+    req: NCRequest,
+    vars: mutable.Map[String, NCIdlStackItem]
 )
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTokenPredicate.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlFunction.scala
similarity index 86%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTokenPredicate.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlFunction.scala
index d585a8a..a876960 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTokenPredicate.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlFunction.scala
@@ -22,4 +22,4 @@ import org.apache.nlpcraft.model.NCToken
 /**
  *
  */
-trait NCIdlTokenPredicate extends ((NCToken, NCIdlContext) ⇒ (Boolean /* Predicate. */ , Int /* How many times a token was used. */ ))
+trait NCIdlFunction[T] extends ((NCToken, NCIdlContext) ⇒ (T , Int /* How many times a token was used. */ ))
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala
index 4abe52a..c092801 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala
@@ -17,8 +17,6 @@
 
 package org.apache.nlpcraft.model.intent
 
-import org.apache.nlpcraft.model.NCToken
-
 /**
  * DSl synonym.
  *
@@ -28,7 +26,7 @@ import org.apache.nlpcraft.model.NCToken
 case class NCIdlSynonym(
     origin: String,
     alias: Option[String],
-    pred: NCIdlTokenPredicate,
+    pred: NCIdlFunction[Boolean],
 ) {
     require(origin != null)
     require(pred != null)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
index 5e24e8c..8d33c1a 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
@@ -24,7 +24,8 @@ import org.apache.nlpcraft.common._
  *
  * @param idl
  * @param id Optional ID of this term.
- * @param pred
+ * @param decls Term optional declarations.
+ * @param pred Term predicate.
  * @param min
  * @param max
  * @param conv
@@ -33,7 +34,8 @@ import org.apache.nlpcraft.common._
 case class NCIdlTerm(
     idl: String,
     id: Option[String],
-    pred: NCIdlTokenPredicate,
+    decls: List[NCIdlFunction[Object]],
+    pred: NCIdlFunction[Boolean],
     min: Int,
     max: Int,
     conv: Boolean,
@@ -51,6 +53,7 @@ case class NCIdlTerm(
         NCIdlTerm(
             idl,
             id,
+            decls,
             pred,
             min,
             max,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
index a49a71c..356288f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
@@ -22,10 +22,10 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker
 import org.antlr.v4.runtime._
 import org.antlr.v4.runtime.{ParserRuleContext ⇒ PRC}
 import org.apache.nlpcraft.common._
-import org.apache.nlpcraft.model.intent.compiler.antlr4.{NCIdlBaseListener, NCIdlLexer, NCIdlParser ⇒ IDP}
+import org.apache.nlpcraft.model.intent.compiler.antlr4.{NCIdlBaseListener, NCIdlLexer, NCIdlParser, NCIdlParser ⇒ IDP}
 import org.apache.nlpcraft.model.intent.compiler.{NCIdlCompilerGlobal ⇒ Global}
 import org.apache.nlpcraft.model._
-import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlIntent, NCIdlSynonym, NCIdlTerm, NCIdlTokenPredicate}
+import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlIntent, NCIdlSynonym, NCIdlTerm, NCIdlFunction}
 
 import java.io._
 import java.net._
@@ -71,6 +71,7 @@ object NCIdlCompiler extends LazyLogging {
         private val terms = ArrayBuffer.empty[NCIdlTerm]
 
         // Currently term.
+        private var vars = mutable.HashMap.empty[String, NCIdlFunction[Object]]
         private var termId: String = _
         private var termConv: Boolean = _
         private var min = 1
@@ -81,7 +82,7 @@ object NCIdlCompiler extends LazyLogging {
         private var refMtdName: Option[String] = None
 
         // List of instructions for the current expression.
-        private var instrs = mutable.Buffer.empty[I]
+        private var expr = mutable.Buffer.empty[I]
 
 
         /**
@@ -99,14 +100,14 @@ object NCIdlCompiler extends LazyLogging {
         /*
          * Shared/common implementation.
          */
-        override def exitUnaryExpr(ctx: IDP.UnaryExprContext): Unit = instrs += parseUnaryExpr(ctx.MINUS(), ctx.NOT())(ctx)
-        override def exitMultDivModExpr(ctx: IDP.MultDivModExprContext): Unit = instrs += parseMultDivModExpr(ctx.MULT(), ctx.MOD(), ctx.DIV())(ctx)
-        override def exitPlusMinusExpr(ctx: IDP.PlusMinusExprContext): Unit = instrs += parsePlusMinusExpr(ctx.PLUS(), ctx.MINUS())(ctx)
-        override def exitCompExpr(ctx: IDP.CompExprContext): Unit = instrs += parseCompExpr(ctx.LT(), ctx.GT(), ctx.LTEQ(), ctx.GTEQ())(ctx)
-        override def exitAndOrExpr(ctx: IDP.AndOrExprContext): Unit = instrs += parseAndOrExpr(ctx.AND, ctx.OR())(ctx)
-        override def exitEqNeqExpr(ctx: IDP.EqNeqExprContext): Unit = instrs += parseEqNeqExpr(ctx.EQ, ctx.NEQ())(ctx)
-        override def exitCallExpr(ctx: IDP.CallExprContext): Unit = instrs += parseCallExpr(ctx.FUN_NAME())(ctx)
-        override def exitAtom(ctx: IDP.AtomContext): Unit = instrs += parseAtom(ctx.getText)(ctx)
+        override def exitUnaryExpr(ctx: IDP.UnaryExprContext): Unit = expr += parseUnaryExpr(ctx.MINUS(), ctx.NOT())(ctx)
+        override def exitMultDivModExpr(ctx: IDP.MultDivModExprContext): Unit = expr += parseMultDivModExpr(ctx.MULT(), ctx.MOD(), ctx.DIV())(ctx)
+        override def exitPlusMinusExpr(ctx: IDP.PlusMinusExprContext): Unit = expr += parsePlusMinusExpr(ctx.PLUS(), ctx.MINUS())(ctx)
+        override def exitCompExpr(ctx: IDP.CompExprContext): Unit = expr += parseCompExpr(ctx.LT(), ctx.GT(), ctx.LTEQ(), ctx.GTEQ())(ctx)
+        override def exitAndOrExpr(ctx: IDP.AndOrExprContext): Unit = expr += parseAndOrExpr(ctx.AND, ctx.OR())(ctx)
+        override def exitEqNeqExpr(ctx: IDP.EqNeqExprContext): Unit = expr += parseEqNeqExpr(ctx.EQ, ctx.NEQ())(ctx)
+        override def exitCallExpr(ctx: IDP.CallExprContext): Unit = expr += parseCallExpr(ctx.FUN_NAME())(ctx)
+        override def exitAtom(ctx: IDP.AtomContext): Unit = expr += parseAtom(ctx.getText)(ctx)
         override def exitTermEq(ctx: IDP.TermEqContext): Unit = termConv = ctx.TILDA() != null
         override def exitFragMeta(ctx: IDP.FragMetaContext): Unit = fragMeta = U.jsonToScalaMap(ctx.jsonObj().getText)
         override def exitMetaDecl(ctx: IDP.MetaDeclContext): Unit = intentMeta = U.jsonToScalaMap(ctx.jsonObj().getText)
@@ -115,7 +116,7 @@ object NCIdlCompiler extends LazyLogging {
         override def exitAlias(ctx: IDP.AliasContext): Unit = alias = ctx.id().getText
 
         override def enterCallExpr(ctx: IDP.CallExprContext): Unit =
-            instrs += ((_, stack: NCIdlStack, _) ⇒ stack.push(stack.PLIST_MARKER))
+            expr += ((_, stack: NCIdlStack, _) ⇒ stack.push(stack.PLIST_MARKER))
 
         /**
          *
@@ -127,6 +128,34 @@ object NCIdlCompiler extends LazyLogging {
             this.max = max
         }
 
+        override def exitVarRef(ctx: NCIdlParser.VarRefContext): Unit = {
+
+        }
+
+        override def exitVarDecl(ctx: NCIdlParser.VarDeclContext): Unit = {
+            val varName = ctx.id().getText
+
+            if (vars.contains(varName))
+                throw newSyntaxError(s"Duplicate variable: $varName")(ctx)
+
+            vars += varName
+
+            val fun = exprToFunction[Object]("Variable declaration", _ ⇒ true, x ⇒ x)(ctx)
+
+            val instr = (tok: NCToken, ctx: NCIdlContext) ⇒ {
+                val (res, tokUses) = fun(tok, ctx)
+
+                (null, 0)
+            }
+
+
+
+
+
+
+            expr.clear()
+        }
+
         override def exitMinMaxShortcut(ctx: IDP.MinMaxShortcutContext): Unit = {
             if (ctx.PLUS() != null)
                 setMinMax(1, MINMAX_MAX)
@@ -178,9 +207,9 @@ object NCIdlCompiler extends LazyLogging {
         override def exitSynonym(ctx: IDP.SynonymContext): Unit = {
             implicit val evidence: PRC = ctx
 
-            val pred = instrToPredicate("Synonym")
+            val pred = exprToFunction("Synonym", isBool, asBool)
             val capture = alias
-            val wrapper: NCIdlTokenPredicate = (tok: NCToken, ctx: NCIdlContext) ⇒ {
+            val wrapper: NCIdlFunction[Boolean] = (tok: NCToken, ctx: NCIdlContext) ⇒ {
                 val (res, tokUses) = pred(tok, ctx)
 
                 // Store predicate's alias, if any, in token metadata if this token satisfies this predicate.
@@ -202,7 +231,7 @@ object NCIdlCompiler extends LazyLogging {
             synonym = NCIdlSynonym(origin, Option(alias), wrapper)
 
             alias = null
-            instrs.clear()
+            expr.clear()
         }
 
         override def exitFragId(ctx: IDP.FragIdContext): Unit = {
@@ -254,7 +283,7 @@ object NCIdlCompiler extends LazyLogging {
             if (max < 1)
                 throw newSyntaxError(s"Invalid intent term max quantifiers: $max (must be max >= 1).")(ctx.minMax())
 
-            val pred: NCIdlTokenPredicate = if (refMtdName.isDefined) { // User-code defined term.
+            val pred: NCIdlFunction[Boolean] = if (refMtdName.isDefined) { // User-code defined term.
                 // Closure copies.
                 val clsName = refClsName.orNull
                 val mtdName = refMtdName.orNull
@@ -289,7 +318,7 @@ object NCIdlCompiler extends LazyLogging {
                 }
             }
             else  // IDL term.
-                instrToPredicate("Intent term")(ctx.expr())
+                exprToFunction("Intent term", isBool, asBool)(ctx.expr())
 
             // Add term.
             terms += NCIdlTerm(
@@ -304,7 +333,8 @@ object NCIdlCompiler extends LazyLogging {
             // Reset term vars.
             setMinMax(1, 1)
             termId = null
-            instrs.clear()
+            expr.clear()
+            vars.clear()
             refClsName = None
             refMtdName = None
         }
@@ -312,12 +342,23 @@ object NCIdlCompiler extends LazyLogging {
         /**
          *
          * @param subj
+         * @param check
+         * @param cast
+         * @param ctx
+         * @tparam T
          * @return
          */
-        private def instrToPredicate(subj: String)(implicit ctx: PRC): NCIdlTokenPredicate = {
+        private def exprToFunction[T](
+            subj: String,
+            check: Object ⇒ Boolean,
+            cast: Object ⇒ T
+        )
+        (
+            implicit ctx: PRC
+        ): NCIdlFunction[T] = {
             val code = mutable.Buffer.empty[I]
 
-            code ++= instrs
+            code ++= expr
 
             (tok: NCToken, termCtx: NCIdlContext) ⇒ {
                 val stack = new S()
@@ -329,10 +370,10 @@ object NCIdlCompiler extends LazyLogging {
                 val x = stack.pop()()
                 val v = x.value
 
-                if (!isBool(v))
-                    throw newRuntimeError(s"$subj did not return boolean value: ${ctx.getText}")
+                if (!check(v))
+                    throw newRuntimeError(s"$subj returned value of unexpected type '$v' in: ${ctx.getText}")
 
-                (asBool(v), x.tokUse)
+                (cast(v), x.tokUse)
             }
         }
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index 99f8576..6cd92b5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -26,6 +26,7 @@ import org.apache.nlpcraft.model.impl.NCTokenLogger
 import org.apache.nlpcraft.model.{NCContext, NCDialogFlowItem, NCIntentMatch, NCResult, NCToken}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
 import org.apache.nlpcraft.model.impl.NCTokenPimp._
+import org.apache.nlpcraft.model.intent.compiler.NCIdlStackItem
 import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlIntent, NCIdlTerm}
 
 import java.util.function.Function
@@ -494,7 +495,8 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             val termCtx = NCIdlContext(
                 intentMeta = intent.meta,
                 convMeta = if (x.isEmpty) Map.empty[String, Object] else x.asScala.toMap[String, Object],
-                req = ctx.getRequest
+                req = ctx.getRequest,
+                vars = mutable.HashMap.empty[String, NCIdlStackItem]
             )
 
             // Check terms.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonymChunk.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonymChunk.scala
index cefb16a..ebc1d8e 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonymChunk.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonymChunk.scala
@@ -17,7 +17,7 @@
 
 package org.apache.nlpcraft.probe.mgrs
 
-import org.apache.nlpcraft.model.intent.NCIdlTokenPredicate
+import org.apache.nlpcraft.model.intent.NCIdlFunction
 import org.apache.nlpcraft.probe.mgrs.NCProbeSynonymChunkKind._
 
 import java.util.regex.Pattern
@@ -39,7 +39,7 @@ case class NCProbeSynonymChunk(
     wordStem: String = null, // Only for kind == TEXT.
     posTag: String = null,
     regex: Pattern = null,
-    idlPred: NCIdlTokenPredicate = null
+    idlPred: NCIdlFunction = null
 ) {
     require(origText != null)
     require(kind != null)

[incubator-nlpcraft] 06/08: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 975431411d2c9c52534f7991f350d675aaf1bd2f
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 19:49:01 2021 -0700

    WIP.
---
 .../org/apache/nlpcraft/examples/alarm/intents.idl |  1 +
 .../nlpcraft/examples/weather/WeatherModel.java    | 11 +++--
 .../apache/nlpcraft/model/intent/NCIdlTerm.scala   |  2 +-
 .../model/intent/compiler/NCIdlCompiler.scala      |  6 +--
 .../model/intent/compiler/NCIdlCompilerBase.scala  | 50 ++++++++--------------
 .../model/intent/solver/NCIntentSolverEngine.scala | 10 +++--
 6 files changed, 37 insertions(+), 43 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
index cb28dc4..391b9de 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
@@ -19,6 +19,7 @@
 fragment=buzz term~{id() == 'x:alarm'}
 fragment=when
     term(nums)~{
+        // Demonstrating term variable.
         @type = meta_token('nlpcraft:num:unittype')
         @iseq = meta_token('nlpcraft:num:isequalcondition')
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
index 34b2065..c3e22f1 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
@@ -122,21 +122,24 @@ public class WeatherModel extends NCModelFileAdapter {
     @NCIntent(
         "intent=req " +
         "term~{id() == 'wt:phen'}* " + // Zero or more weather phenomenon.
-        "term(ind)~{has(groups(), 'indicator')}* " + // Optional indicator words (zero or more).
+        "term(ind)~{" +
+            "@isIndicator = has(groups(), 'indicator') " + // Just to demo term variable usage.
+            "@isIndicator" +
+        "}* " + // Optional indicator words (zero or more).
         "term(city)~{id() == 'nlpcraft:city'}? " + // Optional city.
         "term(date)~{id() == 'nlpcraft:date'}?" // Optional date (overrides indicator words).
     )
-    // NOTE: each samples group will reset conversation STM.
+    // NOTE: each samples group will reset conversation STM during auto-testing.
     @NCIntentSample({
         "Current forecast?",
         "Chance of rain in Berlin now?"
     })
-    // NOTE: each samples group will reset conversation STM.
+    // NOTE: each samples group will reset conversation STM during auto-testing.
     @NCIntentSample({
         "Moscow forecast?",
         "Chicago history"
     })
-    // NOTE: each samples group will reset conversation STM.
+    // NOTE: each samples group will reset conversation STM during auto-testing.
     @NCIntentSample({
         "What's the local weather forecast?",
         "What's the weather in Moscow?",
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
index cdc8494..e3aa3b4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
@@ -34,7 +34,7 @@ import org.apache.nlpcraft.common._
 case class NCIdlTerm(
     idl: String,
     id: Option[String],
-    decls: List[NCIdlFunction],
+    decls: Map[String, NCIdlFunction],
     pred: NCIdlFunction,
     min: Int,
     max: Int,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
index c3613ee..d27133c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
@@ -134,9 +134,7 @@ object NCIdlCompiler extends LazyLogging {
             if (!vars.contains(varName))
                 throw newSyntaxError(s"Unknown variable: @$varName")(ctx)
 
-            val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒
-                 stack.push(() ⇒
-                     idlCtx.vars(varName)(tok, idlCtx))
+            val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒ stack.push(() ⇒ idlCtx.vars(varName)(tok, idlCtx))
 
             expr += instr
         }
@@ -320,7 +318,7 @@ object NCIdlCompiler extends LazyLogging {
             terms += NCIdlTerm(
                 ctx.getText,
                 Option(termId),
-                vars.values.toList,
+                vars.toMap,
                 pred,
                 min,
                 max,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
index 826d6a2..538871b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
@@ -285,27 +285,21 @@ trait NCIdlCompilerBase {
                 val Z(v1, n1) = x1()
                 val Z(v2, n2) = x2()
 
-                val f =
-                    if (isInt(v1) && isInt(v2)) asInt(v1) * asInt(v2)
-                    else if (isInt(v1) && isReal(v2)) asInt(v1) * asReal(v2)
-                    else if (isReal(v1) && isInt(v2)) asReal(v1) * asInt(v2)
-                    else if (isReal(v1) && isReal(v2)) asReal(v1) * asReal(v2)
-                    else
-                        throw rtBinaryOpError("*", v1, v2)
-
-                Z(f, n1 + n2)
+                if (isInt(v1) && isInt(v2)) Z(asInt(v1) * asInt(v2), n1 + n2)
+                else if (isInt(v1) && isReal(v2)) Z(asInt(v1) * asReal(v2), n1 + n2)
+                else if (isReal(v1) && isInt(v2)) Z(asReal(v1) * asInt(v2), n1 + n2)
+                else if (isReal(v1) && isReal(v2)) Z(asReal(v1) * asReal(v2), n1 + n2)
+                else
+                    throw rtBinaryOpError("*", v1, v2)
             })
         else if (mod != null)
             stack.push(() ⇒ {
                 val Z(v1, n1) = x1()
                 val Z(v2, n2) = x2()
 
-                val f =
-                    if (isInt(v1) && isInt(v2)) asInt(v1) % asInt(v2)
-                    else
-                        throw rtBinaryOpError("%", v1, v2)
-
-                Z(f, n1 + n2)
+                if (isInt(v1) && isInt(v2)) Z(asInt(v1) % asInt(v2), n1 + n2)
+                else
+                    throw rtBinaryOpError("%", v1, v2)
             })
         else {
             assert(div != null)
@@ -314,15 +308,12 @@ trait NCIdlCompilerBase {
                 val Z(v1, n1) = x1()
                 val Z(v2, n2) = x2()
 
-                val f =
-                    if (isInt(v1) && isInt(v2)) asInt(v1) / asInt(v2)
-                    else if (isInt(v1) && isReal(v2)) asInt(v1) / asReal(v2)
-                    else if (isReal(v1) && isInt(v2)) asReal(v1) / asInt(v2)
-                    else if (isReal(v1) && isReal(v2)) asReal(v1) / asReal(v2)
-                    else
-                        throw rtBinaryOpError("/", v1, v2)
-
-                Z(f, n1 + n2)
+                if (isInt(v1) && isInt(v2)) Z(asInt(v1) / asInt(v2), n1 + n2)
+                else if (isInt(v1) && isReal(v2)) Z(asInt(v1) / asReal(v2), n1 + n2)
+                else if (isReal(v1) && isInt(v2)) Z(asReal(v1) / asInt(v2), n1 + n2)
+                else if (isReal(v1) && isReal(v2)) Z(asReal(v1) / asReal(v2), n1 + n2)
+                else
+                    throw rtBinaryOpError("/", v1, v2)
             })
         }
     }
@@ -454,13 +445,10 @@ trait NCIdlCompilerBase {
             stack.push(() ⇒ {
                 val Z(v, n) = x()
 
-                val z =
-                    if (isReal(v)) -asReal(v)
-                    else if (isInt(v)) -asInt(v)
-                    else
-                        throw rtUnaryOpError("-", v)
-
-                Z(z, n)
+                if (isReal(v)) Z(-asReal(v), n)
+                else if (isInt(v)) Z(-asInt(v), n)
+                else
+                    throw rtUnaryOpError("-", v)
             })
         else {
             assert(not != null)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index b7675ca..b9d0de5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -488,16 +488,19 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             var abort = false
             val ordered = intent.ordered
             var lastTermMatch: TermMatch = null
-            
+
+            // Conversation metadata (shared across all terms).
             val x = ctx.getConversation.getMetadata
             val convMeta = if (x.isEmpty) Map.empty[String, Object] else x.asScala.toMap[String, Object]
 
             // Check terms.
             for (term ← intent.terms if !abort) {
+                // Fresh context for each term.
                 val termCtx = NCIdlContext(
                     intentMeta = intent.meta,
                     convMeta = convMeta,
-                    req = ctx.getRequest
+                    req = ctx.getRequest,
+                    vars = mutable.HashMap.empty[String, NCIdlFunction] ++ term.decls
                 )
 
                 solveTerm(
@@ -604,7 +607,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         ctx: NCIdlContext,
         senToks: Seq[UsedToken],
         convToks: Seq[UsedToken]
-    ): Option[TermMatch] =
+    ): Option[TermMatch] = {
         solvePredicate(term.pred, ctx, term.min, term.max, senToks, convToks) match {
             case Some((usedToks, predWeight)) ⇒ Some(
                 TermMatch(
@@ -636,6 +639,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             // Term not found at all.
             case None ⇒ None
         }
+    }
 
     /**
      * Solves term's predicate.

[incubator-nlpcraft] 01/08: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 04ea452234883e1d6ca7e253d19f088628702783
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 12:53:32 2021 -0700

    WIP.
---
 .../nlpcraft/model/intent/compiler/antlr4/NCIdl.g4 |   33 +-
 .../model/intent/compiler/antlr4/NCIdl.interp      |   14 +-
 .../model/intent/compiler/antlr4/NCIdl.tokens      |   20 +-
 .../intent/compiler/antlr4/NCIdlBaseListener.java  |   52 +-
 .../model/intent/compiler/antlr4/NCIdlLexer.interp |    5 +-
 .../model/intent/compiler/antlr4/NCIdlLexer.java   |  758 +++++++-------
 .../model/intent/compiler/antlr4/NCIdlLexer.tokens |   20 +-
 .../intent/compiler/antlr4/NCIdlListener.java      |   64 +-
 .../model/intent/compiler/antlr4/NCIdlParser.java  | 1040 ++++++++++++--------
 9 files changed, 1146 insertions(+), 860 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4 b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4
index 51072a0..6f8e57c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4
@@ -18,24 +18,24 @@
 grammar NCIdl;
 
 // Parser.
-idl: idlItems EOF; // Intent enty point.
-synonym: alias? LBRACE expr RBRACE EOF; // Synonym entry point.
+idl: idlDecls EOF; // Intent enty point.
+synonym: alias? LBRACE vars? expr RBRACE EOF; // Synonym entry point.
 alias: LBR id RBR;
-idlItems
-    : idlItem
-    | idlItems idlItem
+idlDecls
+    : idlDecl
+    | idlDecls idlDecl
     ;
-idlItem
+idlDecl
     : intent // Intent declaration.
     | frag // Fragment declaration.
     | imp // External URL containing IDL declarations (recursive parsing).
     ;
 imp: 'import' LPAR qstring RPAR;
-frag: fragId terms;
+frag: fragId termDecls;
 fragId: FRAG ASSIGN id;
 fragRef: FRAG LPAR id fragMeta? RPAR;
 fragMeta: COMMA jsonObj;
-intent: intentId orderedDecl? flowDecl? metaDecl? terms;
+intent: intentId orderedDecl? flowDecl? metaDecl? termDecls;
 intentId: 'intent' ASSIGN id;
 orderedDecl: 'ordered' ASSIGN BOOL;
 mtdDecl: DIV mtdRef DIV;
@@ -58,10 +58,10 @@ jsonArr
     : LBR jsonVal (COMMA jsonVal)* RBR
     | LBR RBR
     ;
-terms
-    : termItem
-    | terms termItem;
-termItem
+termDecls
+    : termDecl
+    | termDecls termDecl;
+termDecl
     : term
     | fragRef
     ;
@@ -69,7 +69,7 @@ termEq
     : ASSIGN // Do not use conversation.
     | TILDA // Use conversation.
     ;
-term: 'term' termId? termEq ((LBRACE expr RBRACE) | mtdDecl) minMax?;
+term: 'term' termId? termEq ((LBRACE vars? expr RBRACE) | mtdDecl) minMax?;
 mtdRef: javaFqn? POUND id;
 javaFqn
     : id
@@ -87,7 +87,13 @@ expr
     | expr op=(AND | OR) expr # andOrExpr
     | atom # atomExpr
     | FUN_NAME LPAR paramList? RPAR # callExpr
+    | AT id # varRef
     ;
+vars
+    : varDecl
+    | vars varDecl
+    ;
+varDecl: AT id ASSIGN expr;
 paramList
     : expr
     | paramList COMMA expr
@@ -273,6 +279,7 @@ QUESTION: '?';
 MULT: '*';
 DIV: '/';
 MOD: '%';
+AT: '@';
 DOLLAR: '$';
 INT: '0' | [1-9] [_0-9]*;
 REAL: DOT [0-9]+;
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp
index d305c17..1926b19 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp
@@ -43,6 +43,7 @@ null
 '*'
 '/'
 '%'
+'@'
 '$'
 null
 null
@@ -97,6 +98,7 @@ QUESTION
 MULT
 DIV
 MOD
+AT
 DOLLAR
 INT
 REAL
@@ -110,8 +112,8 @@ rule names:
 idl
 synonym
 alias
-idlItems
-idlItem
+idlDecls
+idlDecl
 imp
 frag
 fragId
@@ -127,14 +129,16 @@ jsonObj
 jsonPair
 jsonVal
 jsonArr
-terms
-termItem
+termDecls
+termDecl
 termEq
 term
 mtdRef
 javaFqn
 termId
 expr
+vars
+varDecl
 paramList
 atom
 qstring
@@ -145,4 +149,4 @@ id
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 53, 338, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 54, 365, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, [...]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.tokens
index 5680142..b3d7bda 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.tokens
@@ -41,14 +41,15 @@ QUESTION=40
 MULT=41
 DIV=42
 MOD=43
-DOLLAR=44
-INT=45
-REAL=46
-EXP=47
-ID=48
-COMMENT=49
-WS=50
-ErrorChar=51
+AT=44
+DOLLAR=45
+INT=46
+REAL=47
+EXP=48
+ID=49
+COMMENT=50
+WS=51
+ErrorChar=52
 'import'=1
 'intent'=2
 'ordered'=3
@@ -88,4 +89,5 @@ ErrorChar=51
 '*'=41
 '/'=42
 '%'=43
-'$'=44
+'@'=44
+'$'=45
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java
index 9cc72e6..9f6e068 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java
@@ -52,25 +52,25 @@ public class NCIdlBaseListener implements NCIdlListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterIdlItems(NCIdlParser.IdlItemsContext ctx) { }
+	@Override public void enterIdlDecls(NCIdlParser.IdlDeclsContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitIdlItems(NCIdlParser.IdlItemsContext ctx) { }
+	@Override public void exitIdlDecls(NCIdlParser.IdlDeclsContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterIdlItem(NCIdlParser.IdlItemContext ctx) { }
+	@Override public void enterIdlDecl(NCIdlParser.IdlDeclContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitIdlItem(NCIdlParser.IdlItemContext ctx) { }
+	@Override public void exitIdlDecl(NCIdlParser.IdlDeclContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
@@ -256,25 +256,25 @@ public class NCIdlBaseListener implements NCIdlListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterTerms(NCIdlParser.TermsContext ctx) { }
+	@Override public void enterTermDecls(NCIdlParser.TermDeclsContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitTerms(NCIdlParser.TermsContext ctx) { }
+	@Override public void exitTermDecls(NCIdlParser.TermDeclsContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterTermItem(NCIdlParser.TermItemContext ctx) { }
+	@Override public void enterTermDecl(NCIdlParser.TermDeclContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitTermItem(NCIdlParser.TermItemContext ctx) { }
+	@Override public void exitTermDecl(NCIdlParser.TermDeclContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
@@ -400,6 +400,18 @@ public class NCIdlBaseListener implements NCIdlListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
+	@Override public void enterVarRef(NCIdlParser.VarRefContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitVarRef(NCIdlParser.VarRefContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
 	@Override public void enterMultDivModExpr(NCIdlParser.MultDivModExprContext ctx) { }
 	/**
 	 * {@inheritDoc}
@@ -448,6 +460,30 @@ public class NCIdlBaseListener implements NCIdlListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
+	@Override public void enterVars(NCIdlParser.VarsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitVars(NCIdlParser.VarsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterVarDecl(NCIdlParser.VarDeclContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitVarDecl(NCIdlParser.VarDeclContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
 	@Override public void enterParamList(NCIdlParser.ParamListContext ctx) { }
 	/**
 	 * {@inheritDoc}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.interp
index 724cfb8..09212a9 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.interp
@@ -43,6 +43,7 @@ null
 '*'
 '/'
 '%'
+'@'
 '$'
 null
 null
@@ -97,6 +98,7 @@ QUESTION
 MULT
 DIV
 MOD
+AT
 DOLLAR
 INT
 REAL
@@ -150,6 +152,7 @@ QUESTION
 MULT
 DIV
 MOD
+AT
 DOLLAR
 INT
 REAL
@@ -169,4 +172,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 53, 1165, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 54, 1169, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, [...]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.java
index 5b58777..da60634 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.java
@@ -22,8 +22,8 @@ public class NCIdlLexer extends Lexer {
 		LT=18, AND=19, OR=20, VERT=21, NOT=22, LPAR=23, RPAR=24, LBRACE=25, RBRACE=26, 
 		SQUOTE=27, DQUOTE=28, TILDA=29, LBR=30, RBR=31, POUND=32, COMMA=33, COLON=34, 
 		MINUS=35, DOT=36, UNDERSCORE=37, ASSIGN=38, PLUS=39, QUESTION=40, MULT=41, 
-		DIV=42, MOD=43, DOLLAR=44, INT=45, REAL=46, EXP=47, ID=48, COMMENT=49, 
-		WS=50, ErrorChar=51;
+		DIV=42, MOD=43, AT=44, DOLLAR=45, INT=46, REAL=47, EXP=48, ID=49, COMMENT=50, 
+		WS=51, ErrorChar=52;
 	public static String[] channelNames = {
 		"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
 	};
@@ -39,7 +39,7 @@ public class NCIdlLexer extends Lexer {
 			"AND", "OR", "VERT", "NOT", "LPAR", "RPAR", "LBRACE", "RBRACE", "SQUOTE", 
 			"DQUOTE", "TILDA", "LBR", "RBR", "POUND", "COMMA", "COLON", "MINUS", 
 			"DOT", "UNDERSCORE", "ASSIGN", "PLUS", "QUESTION", "MULT", "DIV", "MOD", 
-			"DOLLAR", "INT", "REAL", "EXP", "UNI_CHAR", "LETTER", "ID", "COMMENT", 
+			"AT", "DOLLAR", "INT", "REAL", "EXP", "UNI_CHAR", "LETTER", "ID", "COMMENT", 
 			"WS", "ErrorChar"
 		};
 	}
@@ -51,7 +51,7 @@ public class NCIdlLexer extends Lexer {
 			null, "'fragment'", null, null, null, "'null'", "'=='", "'!='", "'>='", 
 			"'<='", "'>'", "'<'", "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", 
 			"'}'", "'''", "'\"'", "'~'", "'['", "']'", "'#'", "','", "':'", "'-'", 
-			"'.'", "'_'", "'='", "'+'", "'?'", "'*'", "'/'", "'%'", "'$'"
+			"'.'", "'_'", "'='", "'+'", "'?'", "'*'", "'/'", "'%'", "'@'", "'$'"
 		};
 	}
 	private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -62,7 +62,7 @@ public class NCIdlLexer extends Lexer {
 			"AND", "OR", "VERT", "NOT", "LPAR", "RPAR", "LBRACE", "RBRACE", "SQUOTE", 
 			"DQUOTE", "TILDA", "LBR", "RBR", "POUND", "COMMA", "COLON", "MINUS", 
 			"DOT", "UNDERSCORE", "ASSIGN", "PLUS", "QUESTION", "MULT", "DIV", "MOD", 
-			"DOLLAR", "INT", "REAL", "EXP", "ID", "COMMENT", "WS", "ErrorChar"
+			"AT", "DOLLAR", "INT", "REAL", "EXP", "ID", "COMMENT", "WS", "ErrorChar"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -124,17 +124,16 @@ public class NCIdlLexer extends Lexer {
 	public ATN getATN() { return _ATN; }
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\65\u048d\b\1\4\2"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\66\u0491\b\1\4\2"+
 		"\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4"+
 		"\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
 		"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
 		"\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+
 		" \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+
 		"+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+
-		"\t\64\4\65\t\65\4\66\t\66\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3"+
-		"\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3"+
-		"\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
-		"\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
+		"\t\64\4\65\t\65\4\66\t\66\4\67\t\67\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3"+
+		"\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5"+
+		"\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3"+
 		"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
 		"\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
 		"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
@@ -180,374 +179,377 @@ public class NCIdlLexer extends Lexer {
 		"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
 		"\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
 		"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
-		"\3\b\5\b\u03c2\n\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n"+
-		"\7\n\u03d1\n\n\f\n\16\n\u03d4\13\n\3\n\3\n\3\13\3\13\3\13\3\13\7\13\u03dc"+
-		"\n\13\f\13\16\13\u03df\13\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
-		"\3\f\5\f\u03ec\n\f\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3"+
-		"\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\23\3\23\3\24\3\24\3\24\3\25\3"+
-		"\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3"+
-		"\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3\"\3\"\3#\3#\3$\3"+
-		"$\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3.\7."+
-		"\u043c\n.\f.\16.\u043f\13.\5.\u0441\n.\3/\3/\6/\u0445\n/\r/\16/\u0446"+
-		"\3\60\3\60\5\60\u044b\n\60\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3\63"+
-		"\3\63\6\63\u0457\n\63\r\63\16\63\u0458\3\63\3\63\3\63\3\63\3\63\3\63\3"+
-		"\63\7\63\u0462\n\63\f\63\16\63\u0465\13\63\3\64\3\64\3\64\3\64\7\64\u046b"+
-		"\n\64\f\64\16\64\u046e\13\64\3\64\5\64\u0471\n\64\3\64\5\64\u0474\n\64"+
-		"\3\64\3\64\3\64\3\64\7\64\u047a\n\64\f\64\16\64\u047d\13\64\3\64\3\64"+
-		"\5\64\u0481\n\64\3\64\3\64\3\65\6\65\u0486\n\65\r\65\16\65\u0487\3\65"+
-		"\3\65\3\66\3\66\3\u047b\2\67\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13"+
-		"\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61"+
-		"\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61"+
-		"a\2c\2e\62g\63i\64k\65\3\2\16\3\2))\3\2$$\3\2\63;\4\2\62;aa\3\2\62;\4"+
-		"\2GGgg\4\2--//\17\2\u00a2\u0251\u025b\u0294\u02b2\u0371\u0402\u0501\u1e04"+
-		"\u1ef5\u1f03\u2001\u200e\u200f\u2041\u2042\u2072\u2191\u2c02\u2ff1\u3003"+
-		"\ud801\uf902\ufdd1\ufdf2\uffff\4\2C\\c|\4\2\f\f\17\17\3\3\f\f\5\2\13\f"+
-		"\16\17\"\"\2\u0517\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13"+
-		"\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2"+
-		"\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2"+
-		"!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+
-		"\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+
-		"\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+
-		"\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+
-		"\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+
-		"\2_\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\3m\3\2\2\2\5t"+
-		"\3\2\2\2\7{\3\2\2\2\t\u0083\3\2\2\2\13\u0088\3\2\2\2\r\u008d\3\2\2\2\17"+
-		"\u03c1\3\2\2\2\21\u03c3\3\2\2\2\23\u03cc\3\2\2\2\25\u03d7\3\2\2\2\27\u03eb"+
-		"\3\2\2\2\31\u03ed\3\2\2\2\33\u03f2\3\2\2\2\35\u03f5\3\2\2\2\37\u03f8\3"+
-		"\2\2\2!\u03fb\3\2\2\2#\u03fe\3\2\2\2%\u0400\3\2\2\2\'\u0402\3\2\2\2)\u0405"+
-		"\3\2\2\2+\u0408\3\2\2\2-\u040a\3\2\2\2/\u040c\3\2\2\2\61\u040e\3\2\2\2"+
-		"\63\u0410\3\2\2\2\65\u0412\3\2\2\2\67\u0414\3\2\2\29\u0416\3\2\2\2;\u0418"+
-		"\3\2\2\2=\u041a\3\2\2\2?\u041c\3\2\2\2A\u041e\3\2\2\2C\u0420\3\2\2\2E"+
-		"\u0422\3\2\2\2G\u0424\3\2\2\2I\u0426\3\2\2\2K\u0428\3\2\2\2M\u042a\3\2"+
-		"\2\2O\u042c\3\2\2\2Q\u042e\3\2\2\2S\u0430\3\2\2\2U\u0432\3\2\2\2W\u0434"+
-		"\3\2\2\2Y\u0436\3\2\2\2[\u0440\3\2\2\2]\u0442\3\2\2\2_\u0448\3\2\2\2a"+
-		"\u044e\3\2\2\2c\u0450\3\2\2\2e\u0456\3\2\2\2g\u0480\3\2\2\2i\u0485\3\2"+
-		"\2\2k\u048b\3\2\2\2mn\7k\2\2no\7o\2\2op\7r\2\2pq\7q\2\2qr\7t\2\2rs\7v"+
-		"\2\2s\4\3\2\2\2tu\7k\2\2uv\7p\2\2vw\7v\2\2wx\7g\2\2xy\7p\2\2yz\7v\2\2"+
-		"z\6\3\2\2\2{|\7q\2\2|}\7t\2\2}~\7f\2\2~\177\7g\2\2\177\u0080\7t\2\2\u0080"+
-		"\u0081\7g\2\2\u0081\u0082\7f\2\2\u0082\b\3\2\2\2\u0083\u0084\7h\2\2\u0084"+
-		"\u0085\7n\2\2\u0085\u0086\7q\2\2\u0086\u0087\7y\2\2\u0087\n\3\2\2\2\u0088"+
-		"\u0089\7o\2\2\u0089\u008a\7g\2\2\u008a\u008b\7v\2\2\u008b\u008c\7c\2\2"+
-		"\u008c\f\3\2\2\2\u008d\u008e\7v\2\2\u008e\u008f\7g\2\2\u008f\u0090\7t"+
-		"\2\2\u0090\u0091\7o\2\2\u0091\16\3\2\2\2\u0092\u0093\7o\2\2\u0093\u0094"+
-		"\7g\2\2\u0094\u0095\7v\2\2\u0095\u0096\7c\2\2\u0096\u0097\7a\2\2\u0097"+
-		"\u0098\7v\2\2\u0098\u0099\7q\2\2\u0099\u009a\7m\2\2\u009a\u009b\7g\2\2"+
-		"\u009b\u03c2\7p\2\2\u009c\u009d\7o\2\2\u009d\u009e\7g\2\2\u009e\u009f"+
-		"\7v\2\2\u009f\u00a0\7c\2\2\u00a0\u00a1\7a\2\2\u00a1\u00a2\7r\2\2\u00a2"+
-		"\u00a3\7c\2\2\u00a3\u00a4\7t\2\2\u00a4\u03c2\7v\2\2\u00a5\u00a6\7o\2\2"+
-		"\u00a6\u00a7\7g\2\2\u00a7\u00a8\7v\2\2\u00a8\u00a9\7c\2\2\u00a9\u00aa"+
-		"\7a\2\2\u00aa\u00ab\7o\2\2\u00ab\u00ac\7q\2\2\u00ac\u00ad\7f\2\2\u00ad"+
-		"\u00ae\7g\2\2\u00ae\u03c2\7n\2\2\u00af\u00b0\7o\2\2\u00b0\u00b1\7g\2\2"+
-		"\u00b1\u00b2\7v\2\2\u00b2\u00b3\7c\2\2\u00b3\u00b4\7a\2\2\u00b4\u00b5"+
-		"\7k\2\2\u00b5\u00b6\7p\2\2\u00b6\u00b7\7v\2\2\u00b7\u00b8\7g\2\2\u00b8"+
-		"\u00b9\7p\2\2\u00b9\u03c2\7v\2\2\u00ba\u00bb\7o\2\2\u00bb\u00bc\7g\2\2"+
-		"\u00bc\u00bd\7v\2\2\u00bd\u00be\7c\2\2\u00be\u00bf\7a\2\2\u00bf\u00c0"+
-		"\7t\2\2\u00c0\u00c1\7g\2\2\u00c1\u03c2\7s\2\2\u00c2\u00c3\7o\2\2\u00c3"+
-		"\u00c4\7g\2\2\u00c4\u00c5\7v\2\2\u00c5\u00c6\7c\2\2\u00c6\u00c7\7a\2\2"+
-		"\u00c7\u00c8\7w\2\2\u00c8\u00c9\7u\2\2\u00c9\u00ca\7g\2\2\u00ca\u03c2"+
-		"\7t\2\2\u00cb\u00cc\7o\2\2\u00cc\u00cd\7g\2\2\u00cd\u00ce\7v\2\2\u00ce"+
-		"\u00cf\7c\2\2\u00cf\u00d0\7a\2\2\u00d0\u00d1\7e\2\2\u00d1\u00d2\7q\2\2"+
-		"\u00d2\u00d3\7o\2\2\u00d3\u00d4\7r\2\2\u00d4\u00d5\7c\2\2\u00d5\u00d6"+
-		"\7p\2\2\u00d6\u03c2\7{\2\2\u00d7\u00d8\7o\2\2\u00d8\u00d9\7g\2\2\u00d9"+
-		"\u00da\7v\2\2\u00da\u00db\7c\2\2\u00db\u00dc\7a\2\2\u00dc\u00dd\7u\2\2"+
-		"\u00dd\u00de\7{\2\2\u00de\u03c2\7u\2\2\u00df\u00e0\7o\2\2\u00e0\u00e1"+
-		"\7g\2\2\u00e1\u00e2\7v\2\2\u00e2\u00e3\7c\2\2\u00e3\u00e4\7a\2\2\u00e4"+
-		"\u00e5\7e\2\2\u00e5\u00e6\7q\2\2\u00e6\u00e7\7p\2\2\u00e7\u03c2\7x\2\2"+
-		"\u00e8\u00e9\7o\2\2\u00e9\u00ea\7g\2\2\u00ea\u00eb\7v\2\2\u00eb\u00ec"+
-		"\7c\2\2\u00ec\u00ed\7a\2\2\u00ed\u00ee\7h\2\2\u00ee\u00ef\7t\2\2\u00ef"+
-		"\u00f0\7c\2\2\u00f0\u03c2\7i\2\2\u00f1\u00f2\7l\2\2\u00f2\u00f3\7u\2\2"+
-		"\u00f3\u00f4\7q\2\2\u00f4\u03c2\7p\2\2\u00f5\u00f6\7k\2\2\u00f6\u03c2"+
-		"\7h\2\2\u00f7\u00f8\7k\2\2\u00f8\u03c2\7f\2\2\u00f9\u00fa\7v\2\2\u00fa"+
-		"\u00fb\7q\2\2\u00fb\u00fc\7m\2\2\u00fc\u00fd\7g\2\2\u00fd\u03c2\7p\2\2"+
-		"\u00fe\u00ff\7h\2\2\u00ff\u0100\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102"+
-		"\7f\2\2\u0102\u0103\7a\2\2\u0103\u0104\7r\2\2\u0104\u0105\7c\2\2\u0105"+
-		"\u0106\7t\2\2\u0106\u03c2\7v\2\2\u0107\u0108\7h\2\2\u0108\u0109\7k\2\2"+
-		"\u0109\u010a\7p\2\2\u010a\u010b\7f\2\2\u010b\u010c\7a\2\2\u010c\u010d"+
-		"\7r\2\2\u010d\u010e\7c\2\2\u010e\u010f\7t\2\2\u010f\u0110\7v\2\2\u0110"+
-		"\u03c2\7u\2\2\u0111\u0112\7c\2\2\u0112\u0113\7p\2\2\u0113\u0114\7e\2\2"+
-		"\u0114\u0115\7g\2\2\u0115\u0116\7u\2\2\u0116\u0117\7v\2\2\u0117\u0118"+
-		"\7q\2\2\u0118\u0119\7t\2\2\u0119\u03c2\7u\2\2\u011a\u011b\7r\2\2\u011b"+
-		"\u011c\7c\2\2\u011c\u011d\7t\2\2\u011d\u011e\7g\2\2\u011e\u011f\7p\2\2"+
-		"\u011f\u03c2\7v\2\2\u0120\u0121\7i\2\2\u0121\u0122\7t\2\2\u0122\u0123"+
-		"\7q\2\2\u0123\u0124\7w\2\2\u0124\u0125\7r\2\2\u0125\u03c2\7u\2\2\u0126"+
-		"\u0127\7x\2\2\u0127\u0128\7c\2\2\u0128\u0129\7n\2\2\u0129\u012a\7w\2\2"+
-		"\u012a\u03c2\7g\2\2\u012b\u012c\7c\2\2\u012c\u012d\7n\2\2\u012d\u012e"+
-		"\7k\2\2\u012e\u012f\7c\2\2\u012f\u0130\7u\2\2\u0130\u0131\7g\2\2\u0131"+
-		"\u03c2\7u\2\2\u0132\u0133\7u\2\2\u0133\u0134\7v\2\2\u0134\u0135\7c\2\2"+
-		"\u0135\u0136\7t\2\2\u0136\u0137\7v\2\2\u0137\u0138\7a\2\2\u0138\u0139"+
-		"\7k\2\2\u0139\u013a\7f\2\2\u013a\u03c2\7z\2\2\u013b\u013c\7g\2\2\u013c"+
-		"\u013d\7p\2\2\u013d\u013e\7f\2\2\u013e\u013f\7a\2\2\u013f\u0140\7k\2\2"+
-		"\u0140\u0141\7f\2\2\u0141\u03c2\7z\2\2\u0142\u0143\7t\2\2\u0143\u0144"+
-		"\7g\2\2\u0144\u0145\7s\2\2\u0145\u0146\7a\2\2\u0146\u0147\7k\2\2\u0147"+
-		"\u03c2\7f\2\2\u0148\u0149\7t\2\2\u0149\u014a\7g\2\2\u014a\u014b\7s\2\2"+
-		"\u014b\u014c\7a\2\2\u014c\u014d\7p\2\2\u014d\u014e\7q\2\2\u014e\u014f"+
-		"\7t\2\2\u014f\u0150\7o\2\2\u0150\u0151\7v\2\2\u0151\u0152\7g\2\2\u0152"+
-		"\u0153\7z\2\2\u0153\u03c2\7v\2\2\u0154\u0155\7t\2\2\u0155\u0156\7g\2\2"+
-		"\u0156\u0157\7s\2\2\u0157\u0158\7a\2\2\u0158\u0159\7v\2\2\u0159\u015a"+
-		"\7u\2\2\u015a\u015b\7v\2\2\u015b\u015c\7c\2\2\u015c\u015d\7o\2\2\u015d"+
-		"\u03c2\7r\2\2\u015e\u015f\7t\2\2\u015f\u0160\7g\2\2\u0160\u0161\7s\2\2"+
-		"\u0161\u0162\7a\2\2\u0162\u0163\7c\2\2\u0163\u0164\7f\2\2\u0164\u0165"+
-		"\7f\2\2\u0165\u03c2\7t\2\2\u0166\u0167\7t\2\2\u0167\u0168\7g\2\2\u0168"+
-		"\u0169\7s\2\2\u0169\u016a\7a\2\2\u016a\u016b\7c\2\2\u016b\u016c\7i\2\2"+
-		"\u016c\u016d\7g\2\2\u016d\u016e\7p\2\2\u016e\u03c2\7v\2\2\u016f\u0170"+
-		"\7w\2\2\u0170\u0171\7u\2\2\u0171\u0172\7g\2\2\u0172\u0173\7t\2\2\u0173"+
-		"\u0174\7a\2\2\u0174\u0175\7k\2\2\u0175\u03c2\7f\2\2\u0176\u0177\7w\2\2"+
-		"\u0177\u0178\7u\2\2\u0178\u0179\7g\2\2\u0179\u017a\7t\2\2\u017a\u017b"+
-		"\7a\2\2\u017b\u017c\7h\2\2\u017c\u017d\7p\2\2\u017d\u017e\7c\2\2\u017e"+
-		"\u017f\7o\2\2\u017f\u03c2\7g\2\2\u0180\u0181\7w\2\2\u0181\u0182\7u\2\2"+
-		"\u0182\u0183\7g\2\2\u0183\u0184\7t\2\2\u0184\u0185\7a\2\2\u0185\u0186"+
-		"\7n\2\2\u0186\u0187\7p\2\2\u0187\u0188\7c\2\2\u0188\u0189\7o\2\2\u0189"+
-		"\u03c2\7g\2\2\u018a\u018b\7w\2\2\u018b\u018c\7u\2\2\u018c\u018d\7g\2\2"+
-		"\u018d\u018e\7t\2\2\u018e\u018f\7a\2\2\u018f\u0190\7g\2\2\u0190\u0191"+
-		"\7o\2\2\u0191\u0192\7c\2\2\u0192\u0193\7k\2\2\u0193\u03c2\7n\2\2\u0194"+
-		"\u0195\7w\2\2\u0195\u0196\7u\2\2\u0196\u0197\7g\2\2\u0197\u0198\7t\2\2"+
-		"\u0198\u0199\7a\2\2\u0199\u019a\7c\2\2\u019a\u019b\7f\2\2\u019b\u019c"+
-		"\7o\2\2\u019c\u019d\7k\2\2\u019d\u03c2\7p\2\2\u019e\u019f\7w\2\2\u019f"+
-		"\u01a0\7u\2\2\u01a0\u01a1\7g\2\2\u01a1\u01a2\7t\2\2\u01a2\u01a3\7a\2\2"+
-		"\u01a3\u01a4\7u\2\2\u01a4\u01a5\7k\2\2\u01a5\u01a6\7i\2\2\u01a6\u01a7"+
-		"\7p\2\2\u01a7\u01a8\7w\2\2\u01a8\u01a9\7r\2\2\u01a9\u01aa\7a\2\2\u01aa"+
-		"\u01ab\7v\2\2\u01ab\u01ac\7u\2\2\u01ac\u01ad\7v\2\2\u01ad\u01ae\7c\2\2"+
-		"\u01ae\u01af\7o\2\2\u01af\u03c2\7r\2\2\u01b0\u01b1\7e\2\2\u01b1\u01b2"+
-		"\7q\2\2\u01b2\u01b3\7o\2\2\u01b3\u01b4\7r\2\2\u01b4\u01b5\7a\2\2\u01b5"+
-		"\u01b6\7k\2\2\u01b6\u03c2\7f\2\2\u01b7\u01b8\7e\2\2\u01b8\u01b9\7q\2\2"+
-		"\u01b9\u01ba\7o\2\2\u01ba\u01bb\7r\2\2\u01bb\u01bc\7a\2\2\u01bc\u01bd"+
-		"\7p\2\2\u01bd\u01be\7c\2\2\u01be\u01bf\7o\2\2\u01bf\u03c2\7g\2\2\u01c0"+
-		"\u01c1\7e\2\2\u01c1\u01c2\7q\2\2\u01c2\u01c3\7o\2\2\u01c3\u01c4\7r\2\2"+
-		"\u01c4\u01c5\7a\2\2\u01c5\u01c6\7y\2\2\u01c6\u01c7\7g\2\2\u01c7\u01c8"+
-		"\7d\2\2\u01c8\u01c9\7u\2\2\u01c9\u01ca\7k\2\2\u01ca\u01cb\7v\2\2\u01cb"+
-		"\u03c2\7g\2\2\u01cc\u01cd\7e\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf\7o\2\2"+
-		"\u01cf\u01d0\7r\2\2\u01d0\u01d1\7a\2\2\u01d1\u01d2\7e\2\2\u01d2\u01d3"+
-		"\7q\2\2\u01d3\u01d4\7w\2\2\u01d4\u01d5\7p\2\2\u01d5\u01d6\7v\2\2\u01d6"+
-		"\u01d7\7t\2\2\u01d7\u03c2\7{\2\2\u01d8\u01d9\7e\2\2\u01d9\u01da\7q\2\2"+
-		"\u01da\u01db\7o\2\2\u01db\u01dc\7r\2\2\u01dc\u01dd\7a\2\2\u01dd\u01de"+
-		"\7t\2\2\u01de\u01df\7g\2\2\u01df\u01e0\7i\2\2\u01e0\u01e1\7k\2\2\u01e1"+
-		"\u01e2\7q\2\2\u01e2\u03c2\7p\2\2\u01e3\u01e4\7e\2\2\u01e4\u01e5\7q\2\2"+
-		"\u01e5\u01e6\7o\2\2\u01e6\u01e7\7r\2\2\u01e7\u01e8\7a\2\2\u01e8\u01e9"+
-		"\7e\2\2\u01e9\u01ea\7k\2\2\u01ea\u01eb\7v\2\2\u01eb\u03c2\7{\2\2\u01ec"+
-		"\u01ed\7e\2\2\u01ed\u01ee\7q\2\2\u01ee\u01ef\7o\2\2\u01ef\u01f0\7r\2\2"+
-		"\u01f0\u01f1\7a\2\2\u01f1\u01f2\7c\2\2\u01f2\u01f3\7f\2\2\u01f3\u01f4"+
-		"\7f\2\2\u01f4\u03c2\7t\2\2\u01f5\u01f6\7e\2\2\u01f6\u01f7\7q\2\2\u01f7"+
-		"\u01f8\7o\2\2\u01f8\u01f9\7r\2\2\u01f9\u01fa\7a\2\2\u01fa\u01fb\7r\2\2"+
-		"\u01fb\u01fc\7q\2\2\u01fc\u01fd\7u\2\2\u01fd\u01fe\7v\2\2\u01fe\u01ff"+
-		"\7e\2\2\u01ff\u0200\7q\2\2\u0200\u0201\7f\2\2\u0201\u03c2\7g\2\2\u0202"+
-		"\u0203\7v\2\2\u0203\u0204\7t\2\2\u0204\u0205\7k\2\2\u0205\u03c2\7o\2\2"+
-		"\u0206\u0207\7u\2\2\u0207\u0208\7v\2\2\u0208\u0209\7t\2\2\u0209\u020a"+
-		"\7k\2\2\u020a\u03c2\7r\2\2\u020b\u020c\7w\2\2\u020c\u020d\7r\2\2\u020d"+
-		"\u020e\7r\2\2\u020e\u020f\7g\2\2\u020f\u0210\7t\2\2\u0210\u0211\7e\2\2"+
-		"\u0211\u0212\7c\2\2\u0212\u0213\7u\2\2\u0213\u03c2\7g\2\2\u0214\u0215"+
-		"\7n\2\2\u0215\u0216\7q\2\2\u0216\u0217\7y\2\2\u0217\u0218\7g\2\2\u0218"+
-		"\u0219\7t\2\2\u0219\u021a\7e\2\2\u021a\u021b\7c\2\2\u021b\u021c\7u\2\2"+
-		"\u021c\u03c2\7g\2\2\u021d\u021e\7k\2\2\u021e\u021f\7u\2\2\u021f\u0220"+
-		"\7a\2\2\u0220\u0221\7c\2\2\u0221\u0222\7n\2\2\u0222\u0223\7r\2\2\u0223"+
-		"\u0224\7j\2\2\u0224\u03c2\7c\2\2\u0225\u0226\7k\2\2\u0226\u0227\7u\2\2"+
-		"\u0227\u0228\7a\2\2\u0228\u0229\7c\2\2\u0229\u022a\7n\2\2\u022a\u022b"+
-		"\7r\2\2\u022b\u022c\7j\2\2\u022c\u022d\7c\2\2\u022d\u022e\7p\2\2\u022e"+
-		"\u022f\7w\2\2\u022f\u03c2\7o\2\2\u0230\u0231\7k\2\2\u0231\u0232\7u\2\2"+
-		"\u0232\u0233\7a\2\2\u0233\u0234\7y\2\2\u0234\u0235\7j\2\2\u0235\u0236"+
-		"\7k\2\2\u0236\u0237\7v\2\2\u0237\u0238\7g\2\2\u0238\u0239\7u\2\2\u0239"+
-		"\u023a\7r\2\2\u023a\u023b\7c\2\2\u023b\u023c\7e\2\2\u023c\u03c2\7g\2\2"+
-		"\u023d\u023e\7k\2\2\u023e\u023f\7u\2\2\u023f\u0240\7a\2\2\u0240\u0241"+
-		"\7p\2\2\u0241\u0242\7w\2\2\u0242\u03c2\7o\2\2\u0243\u0244\7k\2\2\u0244"+
-		"\u0245\7u\2\2\u0245\u0246\7a\2\2\u0246\u0247\7p\2\2\u0247\u0248\7w\2\2"+
-		"\u0248\u0249\7o\2\2\u0249\u024a\7u\2\2\u024a\u024b\7r\2\2\u024b\u024c"+
-		"\7c\2\2\u024c\u024d\7e\2\2\u024d\u03c2\7g\2\2\u024e\u024f\7k\2\2\u024f"+
-		"\u0250\7u\2\2\u0250\u0251\7a\2\2\u0251\u0252\7c\2\2\u0252\u0253\7n\2\2"+
-		"\u0253\u0254\7r\2\2\u0254\u0255\7j\2\2\u0255\u0256\7c\2\2\u0256\u0257"+
-		"\7u\2\2\u0257\u0258\7r\2\2\u0258\u0259\7c\2\2\u0259\u025a\7e\2\2\u025a"+
-		"\u03c2\7g\2\2\u025b\u025c\7k\2\2\u025c\u025d\7u\2\2\u025d\u025e\7a\2\2"+
-		"\u025e\u025f\7c\2\2\u025f\u0260\7n\2\2\u0260\u0261\7r\2\2\u0261\u0262"+
-		"\7j\2\2\u0262\u0263\7c\2\2\u0263\u0264\7p\2\2\u0264\u0265\7w\2\2\u0265"+
-		"\u0266\7o\2\2\u0266\u0267\7u\2\2\u0267\u0268\7r\2\2\u0268\u0269\7c\2\2"+
-		"\u0269\u026a\7e\2\2\u026a\u03c2\7g\2\2\u026b\u026c\7u\2\2\u026c\u026d"+
-		"\7r\2\2\u026d\u026e\7n\2\2\u026e\u026f\7k\2\2\u026f\u03c2\7v\2\2\u0270"+
-		"\u0271\7u\2\2\u0271\u0272\7r\2\2\u0272\u0273\7n\2\2\u0273\u0274\7k\2\2"+
-		"\u0274\u0275\7v\2\2\u0275\u0276\7a\2\2\u0276\u0277\7v\2\2\u0277\u0278"+
-		"\7t\2\2\u0278\u0279\7k\2\2\u0279\u03c2\7o\2\2\u027a\u027b\7c\2\2\u027b"+
-		"\u027c\7d\2\2\u027c\u03c2\7u\2\2\u027d\u027e\7e\2\2\u027e\u027f\7g\2\2"+
-		"\u027f\u0280\7k\2\2\u0280\u03c2\7n\2\2\u0281\u0282\7h\2\2\u0282\u0283"+
-		"\7n\2\2\u0283\u0284\7q\2\2\u0284\u0285\7q\2\2\u0285\u03c2\7t\2\2\u0286"+
-		"\u0287\7t\2\2\u0287\u0288\7k\2\2\u0288\u0289\7p\2\2\u0289\u03c2\7v\2\2"+
-		"\u028a\u028b\7t\2\2\u028b\u028c\7q\2\2\u028c\u028d\7w\2\2\u028d\u028e"+
-		"\7p\2\2\u028e\u03c2\7f\2\2\u028f\u0290\7u\2\2\u0290\u0291\7k\2\2\u0291"+
-		"\u0292\7i\2\2\u0292\u0293\7p\2\2\u0293\u0294\7w\2\2\u0294\u03c2\7o\2\2"+
-		"\u0295\u0296\7u\2\2\u0296\u0297\7s\2\2\u0297\u0298\7t\2\2\u0298\u03c2"+
-		"\7v\2\2\u0299\u029a\7e\2\2\u029a\u029b\7d\2\2\u029b\u029c\7t\2\2\u029c"+
-		"\u03c2\7v\2\2\u029d\u029e\7r\2\2\u029e\u03c2\7k\2\2\u029f\u02a0\7g\2\2"+
-		"\u02a0\u02a1\7w\2\2\u02a1\u02a2\7n\2\2\u02a2\u02a3\7g\2\2\u02a3\u03c2"+
-		"\7t\2\2\u02a4\u02a5\7c\2\2\u02a5\u02a6\7e\2\2\u02a6\u02a7\7q\2\2\u02a7"+
-		"\u03c2\7u\2\2\u02a8\u02a9\7c\2\2\u02a9\u02aa\7u\2\2\u02aa\u02ab\7k\2\2"+
-		"\u02ab\u03c2\7p\2\2\u02ac\u02ad\7c\2\2\u02ad\u02ae\7v\2\2\u02ae\u02af"+
-		"\7c\2\2\u02af\u03c2\7p\2\2\u02b0\u02b1\7e\2\2\u02b1\u02b2\7q\2\2\u02b2"+
-		"\u03c2\7u\2\2\u02b3\u02b4\7u\2\2\u02b4\u02b5\7k\2\2\u02b5\u03c2\7p\2\2"+
-		"\u02b6\u02b7\7v\2\2\u02b7\u02b8\7c\2\2\u02b8\u03c2\7p\2\2\u02b9\u02ba"+
-		"\7e\2\2\u02ba\u02bb\7q\2\2\u02bb\u02bc\7u\2\2\u02bc\u03c2\7j\2\2\u02bd"+
-		"\u02be\7u\2\2\u02be\u02bf\7k\2\2\u02bf\u02c0\7p\2\2\u02c0\u03c2\7j\2\2"+
-		"\u02c1\u02c2\7v\2\2\u02c2\u02c3\7c\2\2\u02c3\u02c4\7p\2\2\u02c4\u03c2"+
-		"\7j\2\2\u02c5\u02c6\7c\2\2\u02c6\u02c7\7v\2\2\u02c7\u02c8\7p\2\2\u02c8"+
-		"\u03c2\7\64\2\2\u02c9\u02ca\7f\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7i\2"+
-		"\2\u02cc\u02cd\7t\2\2\u02cd\u02ce\7g\2\2\u02ce\u02cf\7g\2\2\u02cf\u03c2"+
-		"\7u\2\2\u02d0\u02d1\7t\2\2\u02d1\u02d2\7c\2\2\u02d2\u02d3\7f\2\2\u02d3"+
-		"\u02d4\7k\2\2\u02d4\u02d5\7c\2\2\u02d5\u02d6\7p\2\2\u02d6\u03c2\7u\2\2"+
-		"\u02d7\u02d8\7g\2\2\u02d8\u02d9\7z\2\2\u02d9\u03c2\7r\2\2\u02da\u02db"+
-		"\7g\2\2\u02db\u02dc\7z\2\2\u02dc\u02dd\7r\2\2\u02dd\u02de\7o\2\2\u02de"+
-		"\u03c2\7\63\2\2\u02df\u02e0\7j\2\2\u02e0\u02e1\7{\2\2\u02e1\u02e2\7r\2"+
-		"\2\u02e2\u02e3\7q\2\2\u02e3\u03c2\7v\2\2\u02e4\u02e5\7n\2\2\u02e5\u02e6"+
-		"\7q\2\2\u02e6\u03c2\7i\2\2\u02e7\u02e8\7n\2\2\u02e8\u02e9\7q\2\2\u02e9"+
-		"\u02ea\7i\2\2\u02ea\u02eb\7\63\2\2\u02eb\u03c2\7\62\2\2\u02ec\u02ed\7"+
-		"n\2\2\u02ed\u02ee\7q\2\2\u02ee\u02ef\7i\2\2\u02ef\u02f0\7\63\2\2\u02f0"+
-		"\u03c2\7r\2\2\u02f1\u02f2\7r\2\2\u02f2\u02f3\7q\2\2\u02f3\u03c2\7y\2\2"+
-		"\u02f4\u02f5\7t\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7\7p\2\2\u02f7\u03c2"+
-		"\7f\2\2\u02f8\u02f9\7u\2\2\u02f9\u02fa\7s\2\2\u02fa\u02fb\7w\2\2\u02fb"+
-		"\u02fc\7c\2\2\u02fc\u02fd\7t\2\2\u02fd\u03c2\7g\2\2\u02fe\u02ff\7n\2\2"+
-		"\u02ff\u0300\7k\2\2\u0300\u0301\7u\2\2\u0301\u03c2\7v\2\2\u0302\u0303"+
-		"\7i\2\2\u0303\u0304\7g\2\2\u0304\u03c2\7v\2\2\u0305\u0306\7j\2\2\u0306"+
-		"\u0307\7c\2\2\u0307\u03c2\7u\2\2\u0308\u0309\7j\2\2\u0309\u030a\7c\2\2"+
-		"\u030a\u030b\7u\2\2\u030b\u030c\7a\2\2\u030c\u030d\7c\2\2\u030d\u030e"+
-		"\7p\2\2\u030e\u03c2\7{\2\2\u030f\u0310\7j\2\2\u0310\u0311\7c\2\2\u0311"+
-		"\u0312\7u\2\2\u0312\u0313\7a\2\2\u0313\u0314\7c\2\2\u0314\u0315\7n\2\2"+
-		"\u0315\u03c2\7n\2\2\u0316\u0317\7h\2\2\u0317\u0318\7k\2\2\u0318\u0319"+
-		"\7t\2\2\u0319\u031a\7u\2\2\u031a\u03c2\7v\2\2\u031b\u031c\7n\2\2\u031c"+
-		"\u031d\7c\2\2\u031d\u031e\7u\2\2\u031e\u03c2\7v\2\2\u031f\u0320\7m\2\2"+
-		"\u0320\u0321\7g\2\2\u0321\u0322\7{\2\2\u0322\u03c2\7u\2\2\u0323\u0324"+
-		"\7x\2\2\u0324\u0325\7c\2\2\u0325\u0326\7n\2\2\u0326\u0327\7w\2\2\u0327"+
-		"\u0328\7g\2\2\u0328\u03c2\7u\2\2\u0329\u032a\7n\2\2\u032a\u032b\7g\2\2"+
-		"\u032b\u032c\7p\2\2\u032c\u032d\7i\2\2\u032d\u032e\7v\2\2\u032e\u03c2"+
-		"\7j\2\2\u032f\u0330\7e\2\2\u0330\u0331\7q\2\2\u0331\u0332\7w\2\2\u0332"+
-		"\u0333\7p\2\2\u0333\u03c2\7v\2\2\u0334\u0335\7u\2\2\u0335\u0336\7k\2\2"+
-		"\u0336\u0337\7|\2\2\u0337\u03c2\7g\2\2\u0338\u0339\7u\2\2\u0339\u033a"+
-		"\7q\2\2\u033a\u033b\7t\2\2\u033b\u03c2\7v\2\2\u033c\u033d\7t\2\2\u033d"+
-		"\u033e\7g\2\2\u033e\u033f\7x\2\2\u033f\u0340\7g\2\2\u0340\u0341\7t\2\2"+
-		"\u0341\u0342\7u\2\2\u0342\u03c2\7g\2\2\u0343\u0344\7k\2\2\u0344\u0345"+
-		"\7u\2\2\u0345\u0346\7a\2\2\u0346\u0347\7g\2\2\u0347\u0348\7o\2\2\u0348"+
-		"\u0349\7r\2\2\u0349\u034a\7v\2\2\u034a\u03c2\7{\2\2\u034b\u034c\7p\2\2"+
-		"\u034c\u034d\7q\2\2\u034d\u034e\7p\2\2\u034e\u034f\7a\2\2\u034f\u0350"+
-		"\7g\2\2\u0350\u0351\7o\2\2\u0351\u0352\7r\2\2\u0352\u0353\7v\2\2\u0353"+
-		"\u03c2\7{\2\2\u0354\u0355\7v\2\2\u0355\u0356\7q\2\2\u0356\u0357\7a\2\2"+
-		"\u0357\u0358\7u\2\2\u0358\u0359\7v\2\2\u0359\u035a\7t\2\2\u035a\u035b"+
-		"\7k\2\2\u035b\u035c\7p\2\2\u035c\u03c2\7i\2\2\u035d\u035e\7o\2\2\u035e"+
-		"\u035f\7c\2\2\u035f\u03c2\7z\2\2\u0360\u0361\7o\2\2\u0361\u0362\7k\2\2"+
-		"\u0362\u03c2\7p\2\2\u0363\u0364\7{\2\2\u0364\u0365\7g\2\2\u0365\u0366"+
-		"\7c\2\2\u0366\u03c2\7t\2\2\u0367\u0368\7o\2\2\u0368\u0369\7q\2\2\u0369"+
-		"\u036a\7p\2\2\u036a\u036b\7v\2\2\u036b\u03c2\7j\2\2\u036c\u036d\7f\2\2"+
-		"\u036d\u036e\7c\2\2\u036e\u036f\7{\2\2\u036f\u0370\7a\2\2\u0370\u0371"+
-		"\7q\2\2\u0371\u0372\7h\2\2\u0372\u0373\7a\2\2\u0373\u0374\7o\2\2\u0374"+
-		"\u0375\7q\2\2\u0375\u0376\7p\2\2\u0376\u0377\7v\2\2\u0377\u03c2\7j\2\2"+
-		"\u0378\u0379\7f\2\2\u0379\u037a\7c\2\2\u037a\u037b\7{\2\2\u037b\u037c"+
-		"\7a\2\2\u037c\u037d\7q\2\2\u037d\u037e\7h\2\2\u037e\u037f\7a\2\2\u037f"+
-		"\u0380\7y\2\2\u0380\u0381\7g\2\2\u0381\u0382\7g\2\2\u0382\u03c2\7m\2\2"+
-		"\u0383\u0384\7f\2\2\u0384\u0385\7c\2\2\u0385\u0386\7{\2\2\u0386\u0387"+
-		"\7a\2\2\u0387\u0388\7q\2\2\u0388\u0389\7h\2\2\u0389\u038a\7a\2\2\u038a"+
-		"\u038b\7{\2\2\u038b\u038c\7g\2\2\u038c\u038d\7c\2\2\u038d\u03c2\7t\2\2"+
-		"\u038e\u038f\7j\2\2\u038f\u0390\7q\2\2\u0390\u0391\7w\2\2\u0391\u03c2"+
-		"\7t\2\2\u0392\u0393\7o\2\2\u0393\u0394\7k\2\2\u0394\u0395\7p\2\2\u0395"+
-		"\u0396\7w\2\2\u0396\u0397\7v\2\2\u0397\u03c2\7g\2\2\u0398\u0399\7u\2\2"+
-		"\u0399\u039a\7g\2\2\u039a\u039b\7e\2\2\u039b\u039c\7q\2\2\u039c\u039d"+
-		"\7p\2\2\u039d\u03c2\7f\2\2\u039e\u039f\7y\2\2\u039f\u03a0\7g\2\2\u03a0"+
-		"\u03a1\7g\2\2\u03a1\u03a2\7m\2\2\u03a2\u03a3\7a\2\2\u03a3\u03a4\7q\2\2"+
-		"\u03a4\u03a5\7h\2\2\u03a5\u03a6\7a\2\2\u03a6\u03a7\7o\2\2\u03a7\u03a8"+
-		"\7q\2\2\u03a8\u03a9\7p\2\2\u03a9\u03aa\7v\2\2\u03aa\u03c2\7j\2\2\u03ab"+
-		"\u03ac\7y\2\2\u03ac\u03ad\7g\2\2\u03ad\u03ae\7g\2\2\u03ae\u03af\7m\2\2"+
-		"\u03af\u03b0\7a\2\2\u03b0\u03b1\7q\2\2\u03b1\u03b2\7h\2\2\u03b2\u03b3"+
-		"\7a\2\2\u03b3\u03b4\7{\2\2\u03b4\u03b5\7g\2\2\u03b5\u03b6\7c\2\2\u03b6"+
-		"\u03c2\7t\2\2\u03b7\u03b8\7s\2\2\u03b8\u03b9\7w\2\2\u03b9\u03ba\7c\2\2"+
-		"\u03ba\u03bb\7t\2\2\u03bb\u03bc\7v\2\2\u03bc\u03bd\7g\2\2\u03bd\u03c2"+
-		"\7t\2\2\u03be\u03bf\7p\2\2\u03bf\u03c0\7q\2\2\u03c0\u03c2\7y\2\2\u03c1"+
-		"\u0092\3\2\2\2\u03c1\u009c\3\2\2\2\u03c1\u00a5\3\2\2\2\u03c1\u00af\3\2"+
-		"\2\2\u03c1\u00ba\3\2\2\2\u03c1\u00c2\3\2\2\2\u03c1\u00cb\3\2\2\2\u03c1"+
-		"\u00d7\3\2\2\2\u03c1\u00df\3\2\2\2\u03c1\u00e8\3\2\2\2\u03c1\u00f1\3\2"+
-		"\2\2\u03c1\u00f5\3\2\2\2\u03c1\u00f7\3\2\2\2\u03c1\u00f9\3\2\2\2\u03c1"+
-		"\u00fe\3\2\2\2\u03c1\u0107\3\2\2\2\u03c1\u0111\3\2\2\2\u03c1\u011a\3\2"+
-		"\2\2\u03c1\u0120\3\2\2\2\u03c1\u0126\3\2\2\2\u03c1\u012b\3\2\2\2\u03c1"+
-		"\u0132\3\2\2\2\u03c1\u013b\3\2\2\2\u03c1\u0142\3\2\2\2\u03c1\u0148\3\2"+
-		"\2\2\u03c1\u0154\3\2\2\2\u03c1\u015e\3\2\2\2\u03c1\u0166\3\2\2\2\u03c1"+
-		"\u016f\3\2\2\2\u03c1\u0176\3\2\2\2\u03c1\u0180\3\2\2\2\u03c1\u018a\3\2"+
-		"\2\2\u03c1\u0194\3\2\2\2\u03c1\u019e\3\2\2\2\u03c1\u01b0\3\2\2\2\u03c1"+
-		"\u01b7\3\2\2\2\u03c1\u01c0\3\2\2\2\u03c1\u01cc\3\2\2\2\u03c1\u01d8\3\2"+
-		"\2\2\u03c1\u01e3\3\2\2\2\u03c1\u01ec\3\2\2\2\u03c1\u01f5\3\2\2\2\u03c1"+
-		"\u0202\3\2\2\2\u03c1\u0206\3\2\2\2\u03c1\u020b\3\2\2\2\u03c1\u0214\3\2"+
-		"\2\2\u03c1\u021d\3\2\2\2\u03c1\u0225\3\2\2\2\u03c1\u0230\3\2\2\2\u03c1"+
-		"\u023d\3\2\2\2\u03c1\u0243\3\2\2\2\u03c1\u024e\3\2\2\2\u03c1\u025b\3\2"+
-		"\2\2\u03c1\u026b\3\2\2\2\u03c1\u0270\3\2\2\2\u03c1\u027a\3\2\2\2\u03c1"+
-		"\u027d\3\2\2\2\u03c1\u0281\3\2\2\2\u03c1\u0286\3\2\2\2\u03c1\u028a\3\2"+
-		"\2\2\u03c1\u028f\3\2\2\2\u03c1\u0295\3\2\2\2\u03c1\u0299\3\2\2\2\u03c1"+
-		"\u029d\3\2\2\2\u03c1\u029f\3\2\2\2\u03c1\u02a4\3\2\2\2\u03c1\u02a8\3\2"+
-		"\2\2\u03c1\u02ac\3\2\2\2\u03c1\u02b0\3\2\2\2\u03c1\u02b3\3\2\2\2\u03c1"+
-		"\u02b6\3\2\2\2\u03c1\u02b9\3\2\2\2\u03c1\u02bd\3\2\2\2\u03c1\u02c1\3\2"+
-		"\2\2\u03c1\u02c5\3\2\2\2\u03c1\u02c9\3\2\2\2\u03c1\u02d0\3\2\2\2\u03c1"+
-		"\u02d7\3\2\2\2\u03c1\u02da\3\2\2\2\u03c1\u02df\3\2\2\2\u03c1\u02e4\3\2"+
-		"\2\2\u03c1\u02e7\3\2\2\2\u03c1\u02ec\3\2\2\2\u03c1\u02f1\3\2\2\2\u03c1"+
-		"\u02f4\3\2\2\2\u03c1\u02f8\3\2\2\2\u03c1\u02fe\3\2\2\2\u03c1\u0302\3\2"+
-		"\2\2\u03c1\u0305\3\2\2\2\u03c1\u0308\3\2\2\2\u03c1\u030f\3\2\2\2\u03c1"+
-		"\u0316\3\2\2\2\u03c1\u031b\3\2\2\2\u03c1\u031f\3\2\2\2\u03c1\u0323\3\2"+
-		"\2\2\u03c1\u0329\3\2\2\2\u03c1\u032f\3\2\2\2\u03c1\u0334\3\2\2\2\u03c1"+
-		"\u0338\3\2\2\2\u03c1\u033c\3\2\2\2\u03c1\u0343\3\2\2\2\u03c1\u034b\3\2"+
-		"\2\2\u03c1\u0354\3\2\2\2\u03c1\u035d\3\2\2\2\u03c1\u0360\3\2\2\2\u03c1"+
-		"\u0363\3\2\2\2\u03c1\u0367\3\2\2\2\u03c1\u036c\3\2\2\2\u03c1\u0378\3\2"+
-		"\2\2\u03c1\u0383\3\2\2\2\u03c1\u038e\3\2\2\2\u03c1\u0392\3\2\2\2\u03c1"+
-		"\u0398\3\2\2\2\u03c1\u039e\3\2\2\2\u03c1\u03ab\3\2\2\2\u03c1\u03b7\3\2"+
-		"\2\2\u03c1\u03be\3\2\2\2\u03c2\20\3\2\2\2\u03c3\u03c4\7h\2\2\u03c4\u03c5"+
-		"\7t\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7i\2\2\u03c7\u03c8\7o\2\2\u03c8"+
-		"\u03c9\7g\2\2\u03c9\u03ca\7p\2\2\u03ca\u03cb\7v\2\2\u03cb\22\3\2\2\2\u03cc"+
-		"\u03d2\5\67\34\2\u03cd\u03d1\n\2\2\2\u03ce\u03cf\7^\2\2\u03cf\u03d1\7"+
-		")\2\2\u03d0\u03cd\3\2\2\2\u03d0\u03ce\3\2\2\2\u03d1\u03d4\3\2\2\2\u03d2"+
-		"\u03d0\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\3\2\2\2\u03d4\u03d2\3\2"+
-		"\2\2\u03d5\u03d6\5\67\34\2\u03d6\24\3\2\2\2\u03d7\u03dd\59\35\2\u03d8"+
-		"\u03dc\n\3\2\2\u03d9\u03da\7^\2\2\u03da\u03dc\7$\2\2\u03db\u03d8\3\2\2"+
-		"\2\u03db\u03d9\3\2\2\2\u03dc\u03df\3\2\2\2\u03dd\u03db\3\2\2\2\u03dd\u03de"+
-		"\3\2\2\2\u03de\u03e0\3\2\2\2\u03df\u03dd\3\2\2\2\u03e0\u03e1\59\35\2\u03e1"+
-		"\26\3\2\2\2\u03e2\u03e3\7v\2\2\u03e3\u03e4\7t\2\2\u03e4\u03e5\7w\2\2\u03e5"+
-		"\u03ec\7g\2\2\u03e6\u03e7\7h\2\2\u03e7\u03e8\7c\2\2\u03e8\u03e9\7n\2\2"+
-		"\u03e9\u03ea\7u\2\2\u03ea\u03ec\7g\2\2\u03eb\u03e2\3\2\2\2\u03eb\u03e6"+
-		"\3\2\2\2\u03ec\30\3\2\2\2\u03ed\u03ee\7p\2\2\u03ee\u03ef\7w\2\2\u03ef"+
-		"\u03f0\7n\2\2\u03f0\u03f1\7n\2\2\u03f1\32\3\2\2\2\u03f2\u03f3\7?\2\2\u03f3"+
-		"\u03f4\7?\2\2\u03f4\34\3\2\2\2\u03f5\u03f6\7#\2\2\u03f6\u03f7\7?\2\2\u03f7"+
-		"\36\3\2\2\2\u03f8\u03f9\7@\2\2\u03f9\u03fa\7?\2\2\u03fa \3\2\2\2\u03fb"+
-		"\u03fc\7>\2\2\u03fc\u03fd\7?\2\2\u03fd\"\3\2\2\2\u03fe\u03ff\7@\2\2\u03ff"+
-		"$\3\2\2\2\u0400\u0401\7>\2\2\u0401&\3\2\2\2\u0402\u0403\7(\2\2\u0403\u0404"+
-		"\7(\2\2\u0404(\3\2\2\2\u0405\u0406\7~\2\2\u0406\u0407\7~\2\2\u0407*\3"+
-		"\2\2\2\u0408\u0409\7~\2\2\u0409,\3\2\2\2\u040a\u040b\7#\2\2\u040b.\3\2"+
-		"\2\2\u040c\u040d\7*\2\2\u040d\60\3\2\2\2\u040e\u040f\7+\2\2\u040f\62\3"+
-		"\2\2\2\u0410\u0411\7}\2\2\u0411\64\3\2\2\2\u0412\u0413\7\177\2\2\u0413"+
-		"\66\3\2\2\2\u0414\u0415\7)\2\2\u04158\3\2\2\2\u0416\u0417\7$\2\2\u0417"+
-		":\3\2\2\2\u0418\u0419\7\u0080\2\2\u0419<\3\2\2\2\u041a\u041b\7]\2\2\u041b"+
-		">\3\2\2\2\u041c\u041d\7_\2\2\u041d@\3\2\2\2\u041e\u041f\7%\2\2\u041fB"+
-		"\3\2\2\2\u0420\u0421\7.\2\2\u0421D\3\2\2\2\u0422\u0423\7<\2\2\u0423F\3"+
-		"\2\2\2\u0424\u0425\7/\2\2\u0425H\3\2\2\2\u0426\u0427\7\60\2\2\u0427J\3"+
-		"\2\2\2\u0428\u0429\7a\2\2\u0429L\3\2\2\2\u042a\u042b\7?\2\2\u042bN\3\2"+
-		"\2\2\u042c\u042d\7-\2\2\u042dP\3\2\2\2\u042e\u042f\7A\2\2\u042fR\3\2\2"+
-		"\2\u0430\u0431\7,\2\2\u0431T\3\2\2\2\u0432\u0433\7\61\2\2\u0433V\3\2\2"+
-		"\2\u0434\u0435\7\'\2\2\u0435X\3\2\2\2\u0436\u0437\7&\2\2\u0437Z\3\2\2"+
-		"\2\u0438\u0441\7\62\2\2\u0439\u043d\t\4\2\2\u043a\u043c\t\5\2\2\u043b"+
-		"\u043a\3\2\2\2\u043c\u043f\3\2\2\2\u043d\u043b\3\2\2\2\u043d\u043e\3\2"+
-		"\2\2\u043e\u0441\3\2\2\2\u043f\u043d\3\2\2\2\u0440\u0438\3\2\2\2\u0440"+
-		"\u0439\3\2\2\2\u0441\\\3\2\2\2\u0442\u0444\5I%\2\u0443\u0445\t\6\2\2\u0444"+
-		"\u0443\3\2\2\2\u0445\u0446\3\2\2\2\u0446\u0444\3\2\2\2\u0446\u0447\3\2"+
-		"\2\2\u0447^\3\2\2\2\u0448\u044a\t\7\2\2\u0449\u044b\t\b\2\2\u044a\u0449"+
-		"\3\2\2\2\u044a\u044b\3\2\2\2\u044b\u044c\3\2\2\2\u044c\u044d\5[.\2\u044d"+
-		"`\3\2\2\2\u044e\u044f\t\t\2\2\u044fb\3\2\2\2\u0450\u0451\t\n\2\2\u0451"+
-		"d\3\2\2\2\u0452\u0457\5a\61\2\u0453\u0457\5K&\2\u0454\u0457\5c\62\2\u0455"+
-		"\u0457\5Y-\2\u0456\u0452\3\2\2\2\u0456\u0453\3\2\2\2\u0456\u0454\3\2\2"+
-		"\2\u0456\u0455\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u0456\3\2\2\2\u0458\u0459"+
-		"\3\2\2\2\u0459\u0463\3\2\2\2\u045a\u0462\5a\61\2\u045b\u0462\5Y-\2\u045c"+
-		"\u0462\5c\62\2\u045d\u0462\t\6\2\2\u045e\u0462\5E#\2\u045f\u0462\5G$\2"+
-		"\u0460\u0462\5K&\2\u0461\u045a\3\2\2\2\u0461\u045b\3\2\2\2\u0461\u045c"+
-		"\3\2\2\2\u0461\u045d\3\2\2\2\u0461\u045e\3\2\2\2\u0461\u045f\3\2\2\2\u0461"+
-		"\u0460\3\2\2\2\u0462\u0465\3\2\2\2\u0463\u0461\3\2\2\2\u0463\u0464\3\2"+
-		"\2\2\u0464f\3\2\2\2\u0465\u0463\3\2\2\2\u0466\u0467\7\61\2\2\u0467\u0468"+
-		"\7\61\2\2\u0468\u046c\3\2\2\2\u0469\u046b\n\13\2\2\u046a\u0469\3\2\2\2"+
-		"\u046b\u046e\3\2\2\2\u046c\u046a\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u0470"+
-		"\3\2\2\2\u046e\u046c\3\2\2\2\u046f\u0471\7\17\2\2\u0470\u046f\3\2\2\2"+
-		"\u0470\u0471\3\2\2\2\u0471\u0473\3\2\2\2\u0472\u0474\t\f\2\2\u0473\u0472"+
-		"\3\2\2\2\u0474\u0481\3\2\2\2\u0475\u0476\7\61\2\2\u0476\u0477\7,\2\2\u0477"+
-		"\u047b\3\2\2\2\u0478\u047a\13\2\2\2\u0479\u0478\3\2\2\2\u047a\u047d\3"+
-		"\2\2\2\u047b\u047c\3\2\2\2\u047b\u0479\3\2\2\2\u047c\u047e\3\2\2\2\u047d"+
-		"\u047b\3\2\2\2\u047e\u047f\7,\2\2\u047f\u0481\7\61\2\2\u0480\u0466\3\2"+
-		"\2\2\u0480\u0475\3\2\2\2\u0481\u0482\3\2\2\2\u0482\u0483\b\64\2\2\u0483"+
-		"h\3\2\2\2\u0484\u0486\t\r\2\2\u0485\u0484\3\2\2\2\u0486\u0487\3\2\2\2"+
-		"\u0487\u0485\3\2\2\2\u0487\u0488\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048a"+
-		"\b\65\2\2\u048aj\3\2\2\2\u048b\u048c\13\2\2\2\u048cl\3\2\2\2\27\2\u03c1"+
-		"\u03d0\u03d2\u03db\u03dd\u03eb\u043d\u0440\u0446\u044a\u0456\u0458\u0461"+
-		"\u0463\u046c\u0470\u0473\u047b\u0480\u0487\3\b\2\2";
+		"\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
+		"\b\3\b\3\b\3\b\5\b\u03c4\n\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+
+		"\n\3\n\3\n\7\n\u03d3\n\n\f\n\16\n\u03d6\13\n\3\n\3\n\3\13\3\13\3\13\3"+
+		"\13\7\13\u03de\n\13\f\13\16\13\u03e1\13\13\3\13\3\13\3\f\3\f\3\f\3\f\3"+
+		"\f\3\f\3\f\3\f\3\f\5\f\u03ee\n\f\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3"+
+		"\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\23\3\23\3\24\3"+
+		"\24\3\24\3\25\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\32\3"+
+		"\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3\""+
+		"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3-"+
+		"\3-\3.\3.\3/\3/\3/\7/\u0440\n/\f/\16/\u0443\13/\5/\u0445\n/\3\60\3\60"+
+		"\6\60\u0449\n\60\r\60\16\60\u044a\3\61\3\61\5\61\u044f\n\61\3\61\3\61"+
+		"\3\62\3\62\3\63\3\63\3\64\3\64\3\64\3\64\6\64\u045b\n\64\r\64\16\64\u045c"+
+		"\3\64\3\64\3\64\3\64\3\64\3\64\3\64\7\64\u0466\n\64\f\64\16\64\u0469\13"+
+		"\64\3\65\3\65\3\65\3\65\7\65\u046f\n\65\f\65\16\65\u0472\13\65\3\65\5"+
+		"\65\u0475\n\65\3\65\5\65\u0478\n\65\3\65\3\65\3\65\3\65\7\65\u047e\n\65"+
+		"\f\65\16\65\u0481\13\65\3\65\3\65\5\65\u0485\n\65\3\65\3\65\3\66\6\66"+
+		"\u048a\n\66\r\66\16\66\u048b\3\66\3\66\3\67\3\67\3\u047f\28\3\3\5\4\7"+
+		"\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22"+
+		"#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C"+
+		"#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\2e\2g\63i\64k\65m\66\3\2\16\3"+
+		"\2))\3\2$$\3\2\63;\4\2\62;aa\3\2\62;\4\2GGgg\4\2--//\17\2\u00a2\u0251"+
+		"\u025b\u0294\u02b2\u0371\u0402\u0501\u1e04\u1ef5\u1f03\u2001\u200e\u200f"+
+		"\u2041\u2042\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff"+
+		"\4\2C\\c|\4\2\f\f\17\17\3\3\f\f\5\2\13\f\16\17\"\"\2\u051b\2\3\3\2\2\2"+
+		"\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2"+
+		"\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2"+
+		"\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2"+
+		"\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2"+
+		"\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2"+
+		"\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2"+
+		"\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W"+
+		"\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2g\3\2"+
+		"\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\3o\3\2\2\2\5v\3\2\2\2\7}\3\2\2\2"+
+		"\t\u0085\3\2\2\2\13\u008a\3\2\2\2\r\u008f\3\2\2\2\17\u03c3\3\2\2\2\21"+
+		"\u03c5\3\2\2\2\23\u03ce\3\2\2\2\25\u03d9\3\2\2\2\27\u03ed\3\2\2\2\31\u03ef"+
+		"\3\2\2\2\33\u03f4\3\2\2\2\35\u03f7\3\2\2\2\37\u03fa\3\2\2\2!\u03fd\3\2"+
+		"\2\2#\u0400\3\2\2\2%\u0402\3\2\2\2\'\u0404\3\2\2\2)\u0407\3\2\2\2+\u040a"+
+		"\3\2\2\2-\u040c\3\2\2\2/\u040e\3\2\2\2\61\u0410\3\2\2\2\63\u0412\3\2\2"+
+		"\2\65\u0414\3\2\2\2\67\u0416\3\2\2\29\u0418\3\2\2\2;\u041a\3\2\2\2=\u041c"+
+		"\3\2\2\2?\u041e\3\2\2\2A\u0420\3\2\2\2C\u0422\3\2\2\2E\u0424\3\2\2\2G"+
+		"\u0426\3\2\2\2I\u0428\3\2\2\2K\u042a\3\2\2\2M\u042c\3\2\2\2O\u042e\3\2"+
+		"\2\2Q\u0430\3\2\2\2S\u0432\3\2\2\2U\u0434\3\2\2\2W\u0436\3\2\2\2Y\u0438"+
+		"\3\2\2\2[\u043a\3\2\2\2]\u0444\3\2\2\2_\u0446\3\2\2\2a\u044c\3\2\2\2c"+
+		"\u0452\3\2\2\2e\u0454\3\2\2\2g\u045a\3\2\2\2i\u0484\3\2\2\2k\u0489\3\2"+
+		"\2\2m\u048f\3\2\2\2op\7k\2\2pq\7o\2\2qr\7r\2\2rs\7q\2\2st\7t\2\2tu\7v"+
+		"\2\2u\4\3\2\2\2vw\7k\2\2wx\7p\2\2xy\7v\2\2yz\7g\2\2z{\7p\2\2{|\7v\2\2"+
+		"|\6\3\2\2\2}~\7q\2\2~\177\7t\2\2\177\u0080\7f\2\2\u0080\u0081\7g\2\2\u0081"+
+		"\u0082\7t\2\2\u0082\u0083\7g\2\2\u0083\u0084\7f\2\2\u0084\b\3\2\2\2\u0085"+
+		"\u0086\7h\2\2\u0086\u0087\7n\2\2\u0087\u0088\7q\2\2\u0088\u0089\7y\2\2"+
+		"\u0089\n\3\2\2\2\u008a\u008b\7o\2\2\u008b\u008c\7g\2\2\u008c\u008d\7v"+
+		"\2\2\u008d\u008e\7c\2\2\u008e\f\3\2\2\2\u008f\u0090\7v\2\2\u0090\u0091"+
+		"\7g\2\2\u0091\u0092\7t\2\2\u0092\u0093\7o\2\2\u0093\16\3\2\2\2\u0094\u0095"+
+		"\7o\2\2\u0095\u0096\7g\2\2\u0096\u0097\7v\2\2\u0097\u0098\7c\2\2\u0098"+
+		"\u0099\7a\2\2\u0099\u009a\7v\2\2\u009a\u009b\7q\2\2\u009b\u009c\7m\2\2"+
+		"\u009c\u009d\7g\2\2\u009d\u03c4\7p\2\2\u009e\u009f\7o\2\2\u009f\u00a0"+
+		"\7g\2\2\u00a0\u00a1\7v\2\2\u00a1\u00a2\7c\2\2\u00a2\u00a3\7a\2\2\u00a3"+
+		"\u00a4\7r\2\2\u00a4\u00a5\7c\2\2\u00a5\u00a6\7t\2\2\u00a6\u03c4\7v\2\2"+
+		"\u00a7\u00a8\7o\2\2\u00a8\u00a9\7g\2\2\u00a9\u00aa\7v\2\2\u00aa\u00ab"+
+		"\7c\2\2\u00ab\u00ac\7a\2\2\u00ac\u00ad\7o\2\2\u00ad\u00ae\7q\2\2\u00ae"+
+		"\u00af\7f\2\2\u00af\u00b0\7g\2\2\u00b0\u03c4\7n\2\2\u00b1\u00b2\7o\2\2"+
+		"\u00b2\u00b3\7g\2\2\u00b3\u00b4\7v\2\2\u00b4\u00b5\7c\2\2\u00b5\u00b6"+
+		"\7a\2\2\u00b6\u00b7\7k\2\2\u00b7\u00b8\7p\2\2\u00b8\u00b9\7v\2\2\u00b9"+
+		"\u00ba\7g\2\2\u00ba\u00bb\7p\2\2\u00bb\u03c4\7v\2\2\u00bc\u00bd\7o\2\2"+
+		"\u00bd\u00be\7g\2\2\u00be\u00bf\7v\2\2\u00bf\u00c0\7c\2\2\u00c0\u00c1"+
+		"\7a\2\2\u00c1\u00c2\7t\2\2\u00c2\u00c3\7g\2\2\u00c3\u03c4\7s\2\2\u00c4"+
+		"\u00c5\7o\2\2\u00c5\u00c6\7g\2\2\u00c6\u00c7\7v\2\2\u00c7\u00c8\7c\2\2"+
+		"\u00c8\u00c9\7a\2\2\u00c9\u00ca\7w\2\2\u00ca\u00cb\7u\2\2\u00cb\u00cc"+
+		"\7g\2\2\u00cc\u03c4\7t\2\2\u00cd\u00ce\7o\2\2\u00ce\u00cf\7g\2\2\u00cf"+
+		"\u00d0\7v\2\2\u00d0\u00d1\7c\2\2\u00d1\u00d2\7a\2\2\u00d2\u00d3\7e\2\2"+
+		"\u00d3\u00d4\7q\2\2\u00d4\u00d5\7o\2\2\u00d5\u00d6\7r\2\2\u00d6\u00d7"+
+		"\7c\2\2\u00d7\u00d8\7p\2\2\u00d8\u03c4\7{\2\2\u00d9\u00da\7o\2\2\u00da"+
+		"\u00db\7g\2\2\u00db\u00dc\7v\2\2\u00dc\u00dd\7c\2\2\u00dd\u00de\7a\2\2"+
+		"\u00de\u00df\7u\2\2\u00df\u00e0\7{\2\2\u00e0\u03c4\7u\2\2\u00e1\u00e2"+
+		"\7o\2\2\u00e2\u00e3\7g\2\2\u00e3\u00e4\7v\2\2\u00e4\u00e5\7c\2\2\u00e5"+
+		"\u00e6\7a\2\2\u00e6\u00e7\7e\2\2\u00e7\u00e8\7q\2\2\u00e8\u00e9\7p\2\2"+
+		"\u00e9\u03c4\7x\2\2\u00ea\u00eb\7o\2\2\u00eb\u00ec\7g\2\2\u00ec\u00ed"+
+		"\7v\2\2\u00ed\u00ee\7c\2\2\u00ee\u00ef\7a\2\2\u00ef\u00f0\7h\2\2\u00f0"+
+		"\u00f1\7t\2\2\u00f1\u00f2\7c\2\2\u00f2\u03c4\7i\2\2\u00f3\u00f4\7l\2\2"+
+		"\u00f4\u00f5\7u\2\2\u00f5\u00f6\7q\2\2\u00f6\u03c4\7p\2\2\u00f7\u00f8"+
+		"\7k\2\2\u00f8\u03c4\7h\2\2\u00f9\u00fa\7k\2\2\u00fa\u03c4\7f\2\2\u00fb"+
+		"\u00fc\7v\2\2\u00fc\u00fd\7q\2\2\u00fd\u00fe\7m\2\2\u00fe\u00ff\7g\2\2"+
+		"\u00ff\u03c4\7p\2\2\u0100\u0101\7h\2\2\u0101\u0102\7k\2\2\u0102\u0103"+
+		"\7p\2\2\u0103\u0104\7f\2\2\u0104\u0105\7a\2\2\u0105\u0106\7r\2\2\u0106"+
+		"\u0107\7c\2\2\u0107\u0108\7t\2\2\u0108\u03c4\7v\2\2\u0109\u010a\7h\2\2"+
+		"\u010a\u010b\7k\2\2\u010b\u010c\7p\2\2\u010c\u010d\7f\2\2\u010d\u010e"+
+		"\7a\2\2\u010e\u010f\7r\2\2\u010f\u0110\7c\2\2\u0110\u0111\7t\2\2\u0111"+
+		"\u0112\7v\2\2\u0112\u03c4\7u\2\2\u0113\u0114\7c\2\2\u0114\u0115\7p\2\2"+
+		"\u0115\u0116\7e\2\2\u0116\u0117\7g\2\2\u0117\u0118\7u\2\2\u0118\u0119"+
+		"\7v\2\2\u0119\u011a\7q\2\2\u011a\u011b\7t\2\2\u011b\u03c4\7u\2\2\u011c"+
+		"\u011d\7r\2\2\u011d\u011e\7c\2\2\u011e\u011f\7t\2\2\u011f\u0120\7g\2\2"+
+		"\u0120\u0121\7p\2\2\u0121\u03c4\7v\2\2\u0122\u0123\7i\2\2\u0123\u0124"+
+		"\7t\2\2\u0124\u0125\7q\2\2\u0125\u0126\7w\2\2\u0126\u0127\7r\2\2\u0127"+
+		"\u03c4\7u\2\2\u0128\u0129\7x\2\2\u0129\u012a\7c\2\2\u012a\u012b\7n\2\2"+
+		"\u012b\u012c\7w\2\2\u012c\u03c4\7g\2\2\u012d\u012e\7c\2\2\u012e\u012f"+
+		"\7n\2\2\u012f\u0130\7k\2\2\u0130\u0131\7c\2\2\u0131\u0132\7u\2\2\u0132"+
+		"\u0133\7g\2\2\u0133\u03c4\7u\2\2\u0134\u0135\7u\2\2\u0135\u0136\7v\2\2"+
+		"\u0136\u0137\7c\2\2\u0137\u0138\7t\2\2\u0138\u0139\7v\2\2\u0139\u013a"+
+		"\7a\2\2\u013a\u013b\7k\2\2\u013b\u013c\7f\2\2\u013c\u03c4\7z\2\2\u013d"+
+		"\u013e\7g\2\2\u013e\u013f\7p\2\2\u013f\u0140\7f\2\2\u0140\u0141\7a\2\2"+
+		"\u0141\u0142\7k\2\2\u0142\u0143\7f\2\2\u0143\u03c4\7z\2\2\u0144\u0145"+
+		"\7t\2\2\u0145\u0146\7g\2\2\u0146\u0147\7s\2\2\u0147\u0148\7a\2\2\u0148"+
+		"\u0149\7k\2\2\u0149\u03c4\7f\2\2\u014a\u014b\7t\2\2\u014b\u014c\7g\2\2"+
+		"\u014c\u014d\7s\2\2\u014d\u014e\7a\2\2\u014e\u014f\7p\2\2\u014f\u0150"+
+		"\7q\2\2\u0150\u0151\7t\2\2\u0151\u0152\7o\2\2\u0152\u0153\7v\2\2\u0153"+
+		"\u0154\7g\2\2\u0154\u0155\7z\2\2\u0155\u03c4\7v\2\2\u0156\u0157\7t\2\2"+
+		"\u0157\u0158\7g\2\2\u0158\u0159\7s\2\2\u0159\u015a\7a\2\2\u015a\u015b"+
+		"\7v\2\2\u015b\u015c\7u\2\2\u015c\u015d\7v\2\2\u015d\u015e\7c\2\2\u015e"+
+		"\u015f\7o\2\2\u015f\u03c4\7r\2\2\u0160\u0161\7t\2\2\u0161\u0162\7g\2\2"+
+		"\u0162\u0163\7s\2\2\u0163\u0164\7a\2\2\u0164\u0165\7c\2\2\u0165\u0166"+
+		"\7f\2\2\u0166\u0167\7f\2\2\u0167\u03c4\7t\2\2\u0168\u0169\7t\2\2\u0169"+
+		"\u016a\7g\2\2\u016a\u016b\7s\2\2\u016b\u016c\7a\2\2\u016c\u016d\7c\2\2"+
+		"\u016d\u016e\7i\2\2\u016e\u016f\7g\2\2\u016f\u0170\7p\2\2\u0170\u03c4"+
+		"\7v\2\2\u0171\u0172\7w\2\2\u0172\u0173\7u\2\2\u0173\u0174\7g\2\2\u0174"+
+		"\u0175\7t\2\2\u0175\u0176\7a\2\2\u0176\u0177\7k\2\2\u0177\u03c4\7f\2\2"+
+		"\u0178\u0179\7w\2\2\u0179\u017a\7u\2\2\u017a\u017b\7g\2\2\u017b\u017c"+
+		"\7t\2\2\u017c\u017d\7a\2\2\u017d\u017e\7h\2\2\u017e\u017f\7p\2\2\u017f"+
+		"\u0180\7c\2\2\u0180\u0181\7o\2\2\u0181\u03c4\7g\2\2\u0182\u0183\7w\2\2"+
+		"\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2\u0185\u0186\7t\2\2\u0186\u0187"+
+		"\7a\2\2\u0187\u0188\7n\2\2\u0188\u0189\7p\2\2\u0189\u018a\7c\2\2\u018a"+
+		"\u018b\7o\2\2\u018b\u03c4\7g\2\2\u018c\u018d\7w\2\2\u018d\u018e\7u\2\2"+
+		"\u018e\u018f\7g\2\2\u018f\u0190\7t\2\2\u0190\u0191\7a\2\2\u0191\u0192"+
+		"\7g\2\2\u0192\u0193\7o\2\2\u0193\u0194\7c\2\2\u0194\u0195\7k\2\2\u0195"+
+		"\u03c4\7n\2\2\u0196\u0197\7w\2\2\u0197\u0198\7u\2\2\u0198\u0199\7g\2\2"+
+		"\u0199\u019a\7t\2\2\u019a\u019b\7a\2\2\u019b\u019c\7c\2\2\u019c\u019d"+
+		"\7f\2\2\u019d\u019e\7o\2\2\u019e\u019f\7k\2\2\u019f\u03c4\7p\2\2\u01a0"+
+		"\u01a1\7w\2\2\u01a1\u01a2\7u\2\2\u01a2\u01a3\7g\2\2\u01a3\u01a4\7t\2\2"+
+		"\u01a4\u01a5\7a\2\2\u01a5\u01a6\7u\2\2\u01a6\u01a7\7k\2\2\u01a7\u01a8"+
+		"\7i\2\2\u01a8\u01a9\7p\2\2\u01a9\u01aa\7w\2\2\u01aa\u01ab\7r\2\2\u01ab"+
+		"\u01ac\7a\2\2\u01ac\u01ad\7v\2\2\u01ad\u01ae\7u\2\2\u01ae\u01af\7v\2\2"+
+		"\u01af\u01b0\7c\2\2\u01b0\u01b1\7o\2\2\u01b1\u03c4\7r\2\2\u01b2\u01b3"+
+		"\7e\2\2\u01b3\u01b4\7q\2\2\u01b4\u01b5\7o\2\2\u01b5\u01b6\7r\2\2\u01b6"+
+		"\u01b7\7a\2\2\u01b7\u01b8\7k\2\2\u01b8\u03c4\7f\2\2\u01b9\u01ba\7e\2\2"+
+		"\u01ba\u01bb\7q\2\2\u01bb\u01bc\7o\2\2\u01bc\u01bd\7r\2\2\u01bd\u01be"+
+		"\7a\2\2\u01be\u01bf\7p\2\2\u01bf\u01c0\7c\2\2\u01c0\u01c1\7o\2\2\u01c1"+
+		"\u03c4\7g\2\2\u01c2\u01c3\7e\2\2\u01c3\u01c4\7q\2\2\u01c4\u01c5\7o\2\2"+
+		"\u01c5\u01c6\7r\2\2\u01c6\u01c7\7a\2\2\u01c7\u01c8\7y\2\2\u01c8\u01c9"+
+		"\7g\2\2\u01c9\u01ca\7d\2\2\u01ca\u01cb\7u\2\2\u01cb\u01cc\7k\2\2\u01cc"+
+		"\u01cd\7v\2\2\u01cd\u03c4\7g\2\2\u01ce\u01cf\7e\2\2\u01cf\u01d0\7q\2\2"+
+		"\u01d0\u01d1\7o\2\2\u01d1\u01d2\7r\2\2\u01d2\u01d3\7a\2\2\u01d3\u01d4"+
+		"\7e\2\2\u01d4\u01d5\7q\2\2\u01d5\u01d6\7w\2\2\u01d6\u01d7\7p\2\2\u01d7"+
+		"\u01d8\7v\2\2\u01d8\u01d9\7t\2\2\u01d9\u03c4\7{\2\2\u01da\u01db\7e\2\2"+
+		"\u01db\u01dc\7q\2\2\u01dc\u01dd\7o\2\2\u01dd\u01de\7r\2\2\u01de\u01df"+
+		"\7a\2\2\u01df\u01e0\7t\2\2\u01e0\u01e1\7g\2\2\u01e1\u01e2\7i\2\2\u01e2"+
+		"\u01e3\7k\2\2\u01e3\u01e4\7q\2\2\u01e4\u03c4\7p\2\2\u01e5\u01e6\7e\2\2"+
+		"\u01e6\u01e7\7q\2\2\u01e7\u01e8\7o\2\2\u01e8\u01e9\7r\2\2\u01e9\u01ea"+
+		"\7a\2\2\u01ea\u01eb\7e\2\2\u01eb\u01ec\7k\2\2\u01ec\u01ed\7v\2\2\u01ed"+
+		"\u03c4\7{\2\2\u01ee\u01ef\7e\2\2\u01ef\u01f0\7q\2\2\u01f0\u01f1\7o\2\2"+
+		"\u01f1\u01f2\7r\2\2\u01f2\u01f3\7a\2\2\u01f3\u01f4\7c\2\2\u01f4\u01f5"+
+		"\7f\2\2\u01f5\u01f6\7f\2\2\u01f6\u03c4\7t\2\2\u01f7\u01f8\7e\2\2\u01f8"+
+		"\u01f9\7q\2\2\u01f9\u01fa\7o\2\2\u01fa\u01fb\7r\2\2\u01fb\u01fc\7a\2\2"+
+		"\u01fc\u01fd\7r\2\2\u01fd\u01fe\7q\2\2\u01fe\u01ff\7u\2\2\u01ff\u0200"+
+		"\7v\2\2\u0200\u0201\7e\2\2\u0201\u0202\7q\2\2\u0202\u0203\7f\2\2\u0203"+
+		"\u03c4\7g\2\2\u0204\u0205\7v\2\2\u0205\u0206\7t\2\2\u0206\u0207\7k\2\2"+
+		"\u0207\u03c4\7o\2\2\u0208\u0209\7u\2\2\u0209\u020a\7v\2\2\u020a\u020b"+
+		"\7t\2\2\u020b\u020c\7k\2\2\u020c\u03c4\7r\2\2\u020d\u020e\7w\2\2\u020e"+
+		"\u020f\7r\2\2\u020f\u0210\7r\2\2\u0210\u0211\7g\2\2\u0211\u0212\7t\2\2"+
+		"\u0212\u0213\7e\2\2\u0213\u0214\7c\2\2\u0214\u0215\7u\2\2\u0215\u03c4"+
+		"\7g\2\2\u0216\u0217\7n\2\2\u0217\u0218\7q\2\2\u0218\u0219\7y\2\2\u0219"+
+		"\u021a\7g\2\2\u021a\u021b\7t\2\2\u021b\u021c\7e\2\2\u021c\u021d\7c\2\2"+
+		"\u021d\u021e\7u\2\2\u021e\u03c4\7g\2\2\u021f\u0220\7k\2\2\u0220\u0221"+
+		"\7u\2\2\u0221\u0222\7a\2\2\u0222\u0223\7c\2\2\u0223\u0224\7n\2\2\u0224"+
+		"\u0225\7r\2\2\u0225\u0226\7j\2\2\u0226\u03c4\7c\2\2\u0227\u0228\7k\2\2"+
+		"\u0228\u0229\7u\2\2\u0229\u022a\7a\2\2\u022a\u022b\7c\2\2\u022b\u022c"+
+		"\7n\2\2\u022c\u022d\7r\2\2\u022d\u022e\7j\2\2\u022e\u022f\7c\2\2\u022f"+
+		"\u0230\7p\2\2\u0230\u0231\7w\2\2\u0231\u03c4\7o\2\2\u0232\u0233\7k\2\2"+
+		"\u0233\u0234\7u\2\2\u0234\u0235\7a\2\2\u0235\u0236\7y\2\2\u0236\u0237"+
+		"\7j\2\2\u0237\u0238\7k\2\2\u0238\u0239\7v\2\2\u0239\u023a\7g\2\2\u023a"+
+		"\u023b\7u\2\2\u023b\u023c\7r\2\2\u023c\u023d\7c\2\2\u023d\u023e\7e\2\2"+
+		"\u023e\u03c4\7g\2\2\u023f\u0240\7k\2\2\u0240\u0241\7u\2\2\u0241\u0242"+
+		"\7a\2\2\u0242\u0243\7p\2\2\u0243\u0244\7w\2\2\u0244\u03c4\7o\2\2\u0245"+
+		"\u0246\7k\2\2\u0246\u0247\7u\2\2\u0247\u0248\7a\2\2\u0248\u0249\7p\2\2"+
+		"\u0249\u024a\7w\2\2\u024a\u024b\7o\2\2\u024b\u024c\7u\2\2\u024c\u024d"+
+		"\7r\2\2\u024d\u024e\7c\2\2\u024e\u024f\7e\2\2\u024f\u03c4\7g\2\2\u0250"+
+		"\u0251\7k\2\2\u0251\u0252\7u\2\2\u0252\u0253\7a\2\2\u0253\u0254\7c\2\2"+
+		"\u0254\u0255\7n\2\2\u0255\u0256\7r\2\2\u0256\u0257\7j\2\2\u0257\u0258"+
+		"\7c\2\2\u0258\u0259\7u\2\2\u0259\u025a\7r\2\2\u025a\u025b\7c\2\2\u025b"+
+		"\u025c\7e\2\2\u025c\u03c4\7g\2\2\u025d\u025e\7k\2\2\u025e\u025f\7u\2\2"+
+		"\u025f\u0260\7a\2\2\u0260\u0261\7c\2\2\u0261\u0262\7n\2\2\u0262\u0263"+
+		"\7r\2\2\u0263\u0264\7j\2\2\u0264\u0265\7c\2\2\u0265\u0266\7p\2\2\u0266"+
+		"\u0267\7w\2\2\u0267\u0268\7o\2\2\u0268\u0269\7u\2\2\u0269\u026a\7r\2\2"+
+		"\u026a\u026b\7c\2\2\u026b\u026c\7e\2\2\u026c\u03c4\7g\2\2\u026d\u026e"+
+		"\7u\2\2\u026e\u026f\7r\2\2\u026f\u0270\7n\2\2\u0270\u0271\7k\2\2\u0271"+
+		"\u03c4\7v\2\2\u0272\u0273\7u\2\2\u0273\u0274\7r\2\2\u0274\u0275\7n\2\2"+
+		"\u0275\u0276\7k\2\2\u0276\u0277\7v\2\2\u0277\u0278\7a\2\2\u0278\u0279"+
+		"\7v\2\2\u0279\u027a\7t\2\2\u027a\u027b\7k\2\2\u027b\u03c4\7o\2\2\u027c"+
+		"\u027d\7c\2\2\u027d\u027e\7d\2\2\u027e\u03c4\7u\2\2\u027f\u0280\7e\2\2"+
+		"\u0280\u0281\7g\2\2\u0281\u0282\7k\2\2\u0282\u03c4\7n\2\2\u0283\u0284"+
+		"\7h\2\2\u0284\u0285\7n\2\2\u0285\u0286\7q\2\2\u0286\u0287\7q\2\2\u0287"+
+		"\u03c4\7t\2\2\u0288\u0289\7t\2\2\u0289\u028a\7k\2\2\u028a\u028b\7p\2\2"+
+		"\u028b\u03c4\7v\2\2\u028c\u028d\7t\2\2\u028d\u028e\7q\2\2\u028e\u028f"+
+		"\7w\2\2\u028f\u0290\7p\2\2\u0290\u03c4\7f\2\2\u0291\u0292\7u\2\2\u0292"+
+		"\u0293\7k\2\2\u0293\u0294\7i\2\2\u0294\u0295\7p\2\2\u0295\u0296\7w\2\2"+
+		"\u0296\u03c4\7o\2\2\u0297\u0298\7u\2\2\u0298\u0299\7s\2\2\u0299\u029a"+
+		"\7t\2\2\u029a\u03c4\7v\2\2\u029b\u029c\7e\2\2\u029c\u029d\7d\2\2\u029d"+
+		"\u029e\7t\2\2\u029e\u03c4\7v\2\2\u029f\u02a0\7r\2\2\u02a0\u03c4\7k\2\2"+
+		"\u02a1\u02a2\7g\2\2\u02a2\u02a3\7w\2\2\u02a3\u02a4\7n\2\2\u02a4\u02a5"+
+		"\7g\2\2\u02a5\u03c4\7t\2\2\u02a6\u02a7\7c\2\2\u02a7\u02a8\7e\2\2\u02a8"+
+		"\u02a9\7q\2\2\u02a9\u03c4\7u\2\2\u02aa\u02ab\7c\2\2\u02ab\u02ac\7u\2\2"+
+		"\u02ac\u02ad\7k\2\2\u02ad\u03c4\7p\2\2\u02ae\u02af\7c\2\2\u02af\u02b0"+
+		"\7v\2\2\u02b0\u02b1\7c\2\2\u02b1\u03c4\7p\2\2\u02b2\u02b3\7e\2\2\u02b3"+
+		"\u02b4\7q\2\2\u02b4\u03c4\7u\2\2\u02b5\u02b6\7u\2\2\u02b6\u02b7\7k\2\2"+
+		"\u02b7\u03c4\7p\2\2\u02b8\u02b9\7v\2\2\u02b9\u02ba\7c\2\2\u02ba\u03c4"+
+		"\7p\2\2\u02bb\u02bc\7e\2\2\u02bc\u02bd\7q\2\2\u02bd\u02be\7u\2\2\u02be"+
+		"\u03c4\7j\2\2\u02bf\u02c0\7u\2\2\u02c0\u02c1\7k\2\2\u02c1\u02c2\7p\2\2"+
+		"\u02c2\u03c4\7j\2\2\u02c3\u02c4\7v\2\2\u02c4\u02c5\7c\2\2\u02c5\u02c6"+
+		"\7p\2\2\u02c6\u03c4\7j\2\2\u02c7\u02c8\7c\2\2\u02c8\u02c9\7v\2\2\u02c9"+
+		"\u02ca\7p\2\2\u02ca\u03c4\7\64\2\2\u02cb\u02cc\7f\2\2\u02cc\u02cd\7g\2"+
+		"\2\u02cd\u02ce\7i\2\2\u02ce\u02cf\7t\2\2\u02cf\u02d0\7g\2\2\u02d0\u02d1"+
+		"\7g\2\2\u02d1\u03c4\7u\2\2\u02d2\u02d3\7t\2\2\u02d3\u02d4\7c\2\2\u02d4"+
+		"\u02d5\7f\2\2\u02d5\u02d6\7k\2\2\u02d6\u02d7\7c\2\2\u02d7\u02d8\7p\2\2"+
+		"\u02d8\u03c4\7u\2\2\u02d9\u02da\7g\2\2\u02da\u02db\7z\2\2\u02db\u03c4"+
+		"\7r\2\2\u02dc\u02dd\7g\2\2\u02dd\u02de\7z\2\2\u02de\u02df\7r\2\2\u02df"+
+		"\u02e0\7o\2\2\u02e0\u03c4\7\63\2\2\u02e1\u02e2\7j\2\2\u02e2\u02e3\7{\2"+
+		"\2\u02e3\u02e4\7r\2\2\u02e4\u02e5\7q\2\2\u02e5\u03c4\7v\2\2\u02e6\u02e7"+
+		"\7n\2\2\u02e7\u02e8\7q\2\2\u02e8\u03c4\7i\2\2\u02e9\u02ea\7n\2\2\u02ea"+
+		"\u02eb\7q\2\2\u02eb\u02ec\7i\2\2\u02ec\u02ed\7\63\2\2\u02ed\u03c4\7\62"+
+		"\2\2\u02ee\u02ef\7n\2\2\u02ef\u02f0\7q\2\2\u02f0\u02f1\7i\2\2\u02f1\u02f2"+
+		"\7\63\2\2\u02f2\u03c4\7r\2\2\u02f3\u02f4\7r\2\2\u02f4\u02f5\7q\2\2\u02f5"+
+		"\u03c4\7y\2\2\u02f6\u02f7\7t\2\2\u02f7\u02f8\7c\2\2\u02f8\u02f9\7p\2\2"+
+		"\u02f9\u03c4\7f\2\2\u02fa\u02fb\7u\2\2\u02fb\u02fc\7s\2\2\u02fc\u02fd"+
+		"\7w\2\2\u02fd\u02fe\7c\2\2\u02fe\u02ff\7t\2\2\u02ff\u03c4\7g\2\2\u0300"+
+		"\u0301\7n\2\2\u0301\u0302\7k\2\2\u0302\u0303\7u\2\2\u0303\u03c4\7v\2\2"+
+		"\u0304\u0305\7i\2\2\u0305\u0306\7g\2\2\u0306\u03c4\7v\2\2\u0307\u0308"+
+		"\7j\2\2\u0308\u0309\7c\2\2\u0309\u03c4\7u\2\2\u030a\u030b\7j\2\2\u030b"+
+		"\u030c\7c\2\2\u030c\u030d\7u\2\2\u030d\u030e\7a\2\2\u030e\u030f\7c\2\2"+
+		"\u030f\u0310\7p\2\2\u0310\u03c4\7{\2\2\u0311\u0312\7j\2\2\u0312\u0313"+
+		"\7c\2\2\u0313\u0314\7u\2\2\u0314\u0315\7a\2\2\u0315\u0316\7c\2\2\u0316"+
+		"\u0317\7n\2\2\u0317\u03c4\7n\2\2\u0318\u0319\7h\2\2\u0319\u031a\7k\2\2"+
+		"\u031a\u031b\7t\2\2\u031b\u031c\7u\2\2\u031c\u03c4\7v\2\2\u031d\u031e"+
+		"\7n\2\2\u031e\u031f\7c\2\2\u031f\u0320\7u\2\2\u0320\u03c4\7v\2\2\u0321"+
+		"\u0322\7m\2\2\u0322\u0323\7g\2\2\u0323\u0324\7{\2\2\u0324\u03c4\7u\2\2"+
+		"\u0325\u0326\7x\2\2\u0326\u0327\7c\2\2\u0327\u0328\7n\2\2\u0328\u0329"+
+		"\7w\2\2\u0329\u032a\7g\2\2\u032a\u03c4\7u\2\2\u032b\u032c\7n\2\2\u032c"+
+		"\u032d\7g\2\2\u032d\u032e\7p\2\2\u032e\u032f\7i\2\2\u032f\u0330\7v\2\2"+
+		"\u0330\u03c4\7j\2\2\u0331\u0332\7e\2\2\u0332\u0333\7q\2\2\u0333\u0334"+
+		"\7w\2\2\u0334\u0335\7p\2\2\u0335\u03c4\7v\2\2\u0336\u0337\7u\2\2\u0337"+
+		"\u0338\7k\2\2\u0338\u0339\7|\2\2\u0339\u03c4\7g\2\2\u033a\u033b\7u\2\2"+
+		"\u033b\u033c\7q\2\2\u033c\u033d\7t\2\2\u033d\u03c4\7v\2\2\u033e\u033f"+
+		"\7t\2\2\u033f\u0340\7g\2\2\u0340\u0341\7x\2\2\u0341\u0342\7g\2\2\u0342"+
+		"\u0343\7t\2\2\u0343\u0344\7u\2\2\u0344\u03c4\7g\2\2\u0345\u0346\7k\2\2"+
+		"\u0346\u0347\7u\2\2\u0347\u0348\7a\2\2\u0348\u0349\7g\2\2\u0349\u034a"+
+		"\7o\2\2\u034a\u034b\7r\2\2\u034b\u034c\7v\2\2\u034c\u03c4\7{\2\2\u034d"+
+		"\u034e\7p\2\2\u034e\u034f\7q\2\2\u034f\u0350\7p\2\2\u0350\u0351\7a\2\2"+
+		"\u0351\u0352\7g\2\2\u0352\u0353\7o\2\2\u0353\u0354\7r\2\2\u0354\u0355"+
+		"\7v\2\2\u0355\u03c4\7{\2\2\u0356\u0357\7v\2\2\u0357\u0358\7q\2\2\u0358"+
+		"\u0359\7a\2\2\u0359\u035a\7u\2\2\u035a\u035b\7v\2\2\u035b\u035c\7t\2\2"+
+		"\u035c\u035d\7k\2\2\u035d\u035e\7p\2\2\u035e\u03c4\7i\2\2\u035f\u0360"+
+		"\7o\2\2\u0360\u0361\7c\2\2\u0361\u03c4\7z\2\2\u0362\u0363\7o\2\2\u0363"+
+		"\u0364\7k\2\2\u0364\u03c4\7p\2\2\u0365\u0366\7{\2\2\u0366\u0367\7g\2\2"+
+		"\u0367\u0368\7c\2\2\u0368\u03c4\7t\2\2\u0369\u036a\7o\2\2\u036a\u036b"+
+		"\7q\2\2\u036b\u036c\7p\2\2\u036c\u036d\7v\2\2\u036d\u03c4\7j\2\2\u036e"+
+		"\u036f\7f\2\2\u036f\u0370\7c\2\2\u0370\u0371\7{\2\2\u0371\u0372\7a\2\2"+
+		"\u0372\u0373\7q\2\2\u0373\u0374\7h\2\2\u0374\u0375\7a\2\2\u0375\u0376"+
+		"\7o\2\2\u0376\u0377\7q\2\2\u0377\u0378\7p\2\2\u0378\u0379\7v\2\2\u0379"+
+		"\u03c4\7j\2\2\u037a\u037b\7f\2\2\u037b\u037c\7c\2\2\u037c\u037d\7{\2\2"+
+		"\u037d\u037e\7a\2\2\u037e\u037f\7q\2\2\u037f\u0380\7h\2\2\u0380\u0381"+
+		"\7a\2\2\u0381\u0382\7y\2\2\u0382\u0383\7g\2\2\u0383\u0384\7g\2\2\u0384"+
+		"\u03c4\7m\2\2\u0385\u0386\7f\2\2\u0386\u0387\7c\2\2\u0387\u0388\7{\2\2"+
+		"\u0388\u0389\7a\2\2\u0389\u038a\7q\2\2\u038a\u038b\7h\2\2\u038b\u038c"+
+		"\7a\2\2\u038c\u038d\7{\2\2\u038d\u038e\7g\2\2\u038e\u038f\7c\2\2\u038f"+
+		"\u03c4\7t\2\2\u0390\u0391\7j\2\2\u0391\u0392\7q\2\2\u0392\u0393\7w\2\2"+
+		"\u0393\u03c4\7t\2\2\u0394\u0395\7o\2\2\u0395\u0396\7k\2\2\u0396\u0397"+
+		"\7p\2\2\u0397\u0398\7w\2\2\u0398\u0399\7v\2\2\u0399\u03c4\7g\2\2\u039a"+
+		"\u039b\7u\2\2\u039b\u039c\7g\2\2\u039c\u039d\7e\2\2\u039d\u039e\7q\2\2"+
+		"\u039e\u039f\7p\2\2\u039f\u03c4\7f\2\2\u03a0\u03a1\7y\2\2\u03a1\u03a2"+
+		"\7g\2\2\u03a2\u03a3\7g\2\2\u03a3\u03a4\7m\2\2\u03a4\u03a5\7a\2\2\u03a5"+
+		"\u03a6\7q\2\2\u03a6\u03a7\7h\2\2\u03a7\u03a8\7a\2\2\u03a8\u03a9\7o\2\2"+
+		"\u03a9\u03aa\7q\2\2\u03aa\u03ab\7p\2\2\u03ab\u03ac\7v\2\2\u03ac\u03c4"+
+		"\7j\2\2\u03ad\u03ae\7y\2\2\u03ae\u03af\7g\2\2\u03af\u03b0\7g\2\2\u03b0"+
+		"\u03b1\7m\2\2\u03b1\u03b2\7a\2\2\u03b2\u03b3\7q\2\2\u03b3\u03b4\7h\2\2"+
+		"\u03b4\u03b5\7a\2\2\u03b5\u03b6\7{\2\2\u03b6\u03b7\7g\2\2\u03b7\u03b8"+
+		"\7c\2\2\u03b8\u03c4\7t\2\2\u03b9\u03ba\7s\2\2\u03ba\u03bb\7w\2\2\u03bb"+
+		"\u03bc\7c\2\2\u03bc\u03bd\7t\2\2\u03bd\u03be\7v\2\2\u03be\u03bf\7g\2\2"+
+		"\u03bf\u03c4\7t\2\2\u03c0\u03c1\7p\2\2\u03c1\u03c2\7q\2\2\u03c2\u03c4"+
+		"\7y\2\2\u03c3\u0094\3\2\2\2\u03c3\u009e\3\2\2\2\u03c3\u00a7\3\2\2\2\u03c3"+
+		"\u00b1\3\2\2\2\u03c3\u00bc\3\2\2\2\u03c3\u00c4\3\2\2\2\u03c3\u00cd\3\2"+
+		"\2\2\u03c3\u00d9\3\2\2\2\u03c3\u00e1\3\2\2\2\u03c3\u00ea\3\2\2\2\u03c3"+
+		"\u00f3\3\2\2\2\u03c3\u00f7\3\2\2\2\u03c3\u00f9\3\2\2\2\u03c3\u00fb\3\2"+
+		"\2\2\u03c3\u0100\3\2\2\2\u03c3\u0109\3\2\2\2\u03c3\u0113\3\2\2\2\u03c3"+
+		"\u011c\3\2\2\2\u03c3\u0122\3\2\2\2\u03c3\u0128\3\2\2\2\u03c3\u012d\3\2"+
+		"\2\2\u03c3\u0134\3\2\2\2\u03c3\u013d\3\2\2\2\u03c3\u0144\3\2\2\2\u03c3"+
+		"\u014a\3\2\2\2\u03c3\u0156\3\2\2\2\u03c3\u0160\3\2\2\2\u03c3\u0168\3\2"+
+		"\2\2\u03c3\u0171\3\2\2\2\u03c3\u0178\3\2\2\2\u03c3\u0182\3\2\2\2\u03c3"+
+		"\u018c\3\2\2\2\u03c3\u0196\3\2\2\2\u03c3\u01a0\3\2\2\2\u03c3\u01b2\3\2"+
+		"\2\2\u03c3\u01b9\3\2\2\2\u03c3\u01c2\3\2\2\2\u03c3\u01ce\3\2\2\2\u03c3"+
+		"\u01da\3\2\2\2\u03c3\u01e5\3\2\2\2\u03c3\u01ee\3\2\2\2\u03c3\u01f7\3\2"+
+		"\2\2\u03c3\u0204\3\2\2\2\u03c3\u0208\3\2\2\2\u03c3\u020d\3\2\2\2\u03c3"+
+		"\u0216\3\2\2\2\u03c3\u021f\3\2\2\2\u03c3\u0227\3\2\2\2\u03c3\u0232\3\2"+
+		"\2\2\u03c3\u023f\3\2\2\2\u03c3\u0245\3\2\2\2\u03c3\u0250\3\2\2\2\u03c3"+
+		"\u025d\3\2\2\2\u03c3\u026d\3\2\2\2\u03c3\u0272\3\2\2\2\u03c3\u027c\3\2"+
+		"\2\2\u03c3\u027f\3\2\2\2\u03c3\u0283\3\2\2\2\u03c3\u0288\3\2\2\2\u03c3"+
+		"\u028c\3\2\2\2\u03c3\u0291\3\2\2\2\u03c3\u0297\3\2\2\2\u03c3\u029b\3\2"+
+		"\2\2\u03c3\u029f\3\2\2\2\u03c3\u02a1\3\2\2\2\u03c3\u02a6\3\2\2\2\u03c3"+
+		"\u02aa\3\2\2\2\u03c3\u02ae\3\2\2\2\u03c3\u02b2\3\2\2\2\u03c3\u02b5\3\2"+
+		"\2\2\u03c3\u02b8\3\2\2\2\u03c3\u02bb\3\2\2\2\u03c3\u02bf\3\2\2\2\u03c3"+
+		"\u02c3\3\2\2\2\u03c3\u02c7\3\2\2\2\u03c3\u02cb\3\2\2\2\u03c3\u02d2\3\2"+
+		"\2\2\u03c3\u02d9\3\2\2\2\u03c3\u02dc\3\2\2\2\u03c3\u02e1\3\2\2\2\u03c3"+
+		"\u02e6\3\2\2\2\u03c3\u02e9\3\2\2\2\u03c3\u02ee\3\2\2\2\u03c3\u02f3\3\2"+
+		"\2\2\u03c3\u02f6\3\2\2\2\u03c3\u02fa\3\2\2\2\u03c3\u0300\3\2\2\2\u03c3"+
+		"\u0304\3\2\2\2\u03c3\u0307\3\2\2\2\u03c3\u030a\3\2\2\2\u03c3\u0311\3\2"+
+		"\2\2\u03c3\u0318\3\2\2\2\u03c3\u031d\3\2\2\2\u03c3\u0321\3\2\2\2\u03c3"+
+		"\u0325\3\2\2\2\u03c3\u032b\3\2\2\2\u03c3\u0331\3\2\2\2\u03c3\u0336\3\2"+
+		"\2\2\u03c3\u033a\3\2\2\2\u03c3\u033e\3\2\2\2\u03c3\u0345\3\2\2\2\u03c3"+
+		"\u034d\3\2\2\2\u03c3\u0356\3\2\2\2\u03c3\u035f\3\2\2\2\u03c3\u0362\3\2"+
+		"\2\2\u03c3\u0365\3\2\2\2\u03c3\u0369\3\2\2\2\u03c3\u036e\3\2\2\2\u03c3"+
+		"\u037a\3\2\2\2\u03c3\u0385\3\2\2\2\u03c3\u0390\3\2\2\2\u03c3\u0394\3\2"+
+		"\2\2\u03c3\u039a\3\2\2\2\u03c3\u03a0\3\2\2\2\u03c3\u03ad\3\2\2\2\u03c3"+
+		"\u03b9\3\2\2\2\u03c3\u03c0\3\2\2\2\u03c4\20\3\2\2\2\u03c5\u03c6\7h\2\2"+
+		"\u03c6\u03c7\7t\2\2\u03c7\u03c8\7c\2\2\u03c8\u03c9\7i\2\2\u03c9\u03ca"+
+		"\7o\2\2\u03ca\u03cb\7g\2\2\u03cb\u03cc\7p\2\2\u03cc\u03cd\7v\2\2\u03cd"+
+		"\22\3\2\2\2\u03ce\u03d4\5\67\34\2\u03cf\u03d3\n\2\2\2\u03d0\u03d1\7^\2"+
+		"\2\u03d1\u03d3\7)\2\2\u03d2\u03cf\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d3\u03d6"+
+		"\3\2\2\2\u03d4\u03d2\3\2\2\2\u03d4\u03d5\3\2\2\2\u03d5\u03d7\3\2\2\2\u03d6"+
+		"\u03d4\3\2\2\2\u03d7\u03d8\5\67\34\2\u03d8\24\3\2\2\2\u03d9\u03df\59\35"+
+		"\2\u03da\u03de\n\3\2\2\u03db\u03dc\7^\2\2\u03dc\u03de\7$\2\2\u03dd\u03da"+
+		"\3\2\2\2\u03dd\u03db\3\2\2\2\u03de\u03e1\3\2\2\2\u03df\u03dd\3\2\2\2\u03df"+
+		"\u03e0\3\2\2\2\u03e0\u03e2\3\2\2\2\u03e1\u03df\3\2\2\2\u03e2\u03e3\59"+
+		"\35\2\u03e3\26\3\2\2\2\u03e4\u03e5\7v\2\2\u03e5\u03e6\7t\2\2\u03e6\u03e7"+
+		"\7w\2\2\u03e7\u03ee\7g\2\2\u03e8\u03e9\7h\2\2\u03e9\u03ea\7c\2\2\u03ea"+
+		"\u03eb\7n\2\2\u03eb\u03ec\7u\2\2\u03ec\u03ee\7g\2\2\u03ed\u03e4\3\2\2"+
+		"\2\u03ed\u03e8\3\2\2\2\u03ee\30\3\2\2\2\u03ef\u03f0\7p\2\2\u03f0\u03f1"+
+		"\7w\2\2\u03f1\u03f2\7n\2\2\u03f2\u03f3\7n\2\2\u03f3\32\3\2\2\2\u03f4\u03f5"+
+		"\7?\2\2\u03f5\u03f6\7?\2\2\u03f6\34\3\2\2\2\u03f7\u03f8\7#\2\2\u03f8\u03f9"+
+		"\7?\2\2\u03f9\36\3\2\2\2\u03fa\u03fb\7@\2\2\u03fb\u03fc\7?\2\2\u03fc "+
+		"\3\2\2\2\u03fd\u03fe\7>\2\2\u03fe\u03ff\7?\2\2\u03ff\"\3\2\2\2\u0400\u0401"+
+		"\7@\2\2\u0401$\3\2\2\2\u0402\u0403\7>\2\2\u0403&\3\2\2\2\u0404\u0405\7"+
+		"(\2\2\u0405\u0406\7(\2\2\u0406(\3\2\2\2\u0407\u0408\7~\2\2\u0408\u0409"+
+		"\7~\2\2\u0409*\3\2\2\2\u040a\u040b\7~\2\2\u040b,\3\2\2\2\u040c\u040d\7"+
+		"#\2\2\u040d.\3\2\2\2\u040e\u040f\7*\2\2\u040f\60\3\2\2\2\u0410\u0411\7"+
+		"+\2\2\u0411\62\3\2\2\2\u0412\u0413\7}\2\2\u0413\64\3\2\2\2\u0414\u0415"+
+		"\7\177\2\2\u0415\66\3\2\2\2\u0416\u0417\7)\2\2\u04178\3\2\2\2\u0418\u0419"+
+		"\7$\2\2\u0419:\3\2\2\2\u041a\u041b\7\u0080\2\2\u041b<\3\2\2\2\u041c\u041d"+
+		"\7]\2\2\u041d>\3\2\2\2\u041e\u041f\7_\2\2\u041f@\3\2\2\2\u0420\u0421\7"+
+		"%\2\2\u0421B\3\2\2\2\u0422\u0423\7.\2\2\u0423D\3\2\2\2\u0424\u0425\7<"+
+		"\2\2\u0425F\3\2\2\2\u0426\u0427\7/\2\2\u0427H\3\2\2\2\u0428\u0429\7\60"+
+		"\2\2\u0429J\3\2\2\2\u042a\u042b\7a\2\2\u042bL\3\2\2\2\u042c\u042d\7?\2"+
+		"\2\u042dN\3\2\2\2\u042e\u042f\7-\2\2\u042fP\3\2\2\2\u0430\u0431\7A\2\2"+
+		"\u0431R\3\2\2\2\u0432\u0433\7,\2\2\u0433T\3\2\2\2\u0434\u0435\7\61\2\2"+
+		"\u0435V\3\2\2\2\u0436\u0437\7\'\2\2\u0437X\3\2\2\2\u0438\u0439\7B\2\2"+
+		"\u0439Z\3\2\2\2\u043a\u043b\7&\2\2\u043b\\\3\2\2\2\u043c\u0445\7\62\2"+
+		"\2\u043d\u0441\t\4\2\2\u043e\u0440\t\5\2\2\u043f\u043e\3\2\2\2\u0440\u0443"+
+		"\3\2\2\2\u0441\u043f\3\2\2\2\u0441\u0442\3\2\2\2\u0442\u0445\3\2\2\2\u0443"+
+		"\u0441\3\2\2\2\u0444\u043c\3\2\2\2\u0444\u043d\3\2\2\2\u0445^\3\2\2\2"+
+		"\u0446\u0448\5I%\2\u0447\u0449\t\6\2\2\u0448\u0447\3\2\2\2\u0449\u044a"+
+		"\3\2\2\2\u044a\u0448\3\2\2\2\u044a\u044b\3\2\2\2\u044b`\3\2\2\2\u044c"+
+		"\u044e\t\7\2\2\u044d\u044f\t\b\2\2\u044e\u044d\3\2\2\2\u044e\u044f\3\2"+
+		"\2\2\u044f\u0450\3\2\2\2\u0450\u0451\5]/\2\u0451b\3\2\2\2\u0452\u0453"+
+		"\t\t\2\2\u0453d\3\2\2\2\u0454\u0455\t\n\2\2\u0455f\3\2\2\2\u0456\u045b"+
+		"\5c\62\2\u0457\u045b\5K&\2\u0458\u045b\5e\63\2\u0459\u045b\5[.\2\u045a"+
+		"\u0456\3\2\2\2\u045a\u0457\3\2\2\2\u045a\u0458\3\2\2\2\u045a\u0459\3\2"+
+		"\2\2\u045b\u045c\3\2\2\2\u045c\u045a\3\2\2\2\u045c\u045d\3\2\2\2\u045d"+
+		"\u0467\3\2\2\2\u045e\u0466\5c\62\2\u045f\u0466\5[.\2\u0460\u0466\5e\63"+
+		"\2\u0461\u0466\t\6\2\2\u0462\u0466\5E#\2\u0463\u0466\5G$\2\u0464\u0466"+
+		"\5K&\2\u0465\u045e\3\2\2\2\u0465\u045f\3\2\2\2\u0465\u0460\3\2\2\2\u0465"+
+		"\u0461\3\2\2\2\u0465\u0462\3\2\2\2\u0465\u0463\3\2\2\2\u0465\u0464\3\2"+
+		"\2\2\u0466\u0469\3\2\2\2\u0467\u0465\3\2\2\2\u0467\u0468\3\2\2\2\u0468"+
+		"h\3\2\2\2\u0469\u0467\3\2\2\2\u046a\u046b\7\61\2\2\u046b\u046c\7\61\2"+
+		"\2\u046c\u0470\3\2\2\2\u046d\u046f\n\13\2\2\u046e\u046d\3\2\2\2\u046f"+
+		"\u0472\3\2\2\2\u0470\u046e\3\2\2\2\u0470\u0471\3\2\2\2\u0471\u0474\3\2"+
+		"\2\2\u0472\u0470\3\2\2\2\u0473\u0475\7\17\2\2\u0474\u0473\3\2\2\2\u0474"+
+		"\u0475\3\2\2\2\u0475\u0477\3\2\2\2\u0476\u0478\t\f\2\2\u0477\u0476\3\2"+
+		"\2\2\u0478\u0485\3\2\2\2\u0479\u047a\7\61\2\2\u047a\u047b\7,\2\2\u047b"+
+		"\u047f\3\2\2\2\u047c\u047e\13\2\2\2\u047d\u047c\3\2\2\2\u047e\u0481\3"+
+		"\2\2\2\u047f\u0480\3\2\2\2\u047f\u047d\3\2\2\2\u0480\u0482\3\2\2\2\u0481"+
+		"\u047f\3\2\2\2\u0482\u0483\7,\2\2\u0483\u0485\7\61\2\2\u0484\u046a\3\2"+
+		"\2\2\u0484\u0479\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0487\b\65\2\2\u0487"+
+		"j\3\2\2\2\u0488\u048a\t\r\2\2\u0489\u0488\3\2\2\2\u048a\u048b\3\2\2\2"+
+		"\u048b\u0489\3\2\2\2\u048b\u048c\3\2\2\2\u048c\u048d\3\2\2\2\u048d\u048e"+
+		"\b\66\2\2\u048el\3\2\2\2\u048f\u0490\13\2\2\2\u0490n\3\2\2\2\27\2\u03c3"+
+		"\u03d2\u03d4\u03dd\u03df\u03ed\u0441\u0444\u044a\u044e\u045a\u045c\u0465"+
+		"\u0467\u0470\u0474\u0477\u047f\u0484\u048b\3\b\2\2";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.tokens
index 5680142..b3d7bda 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlLexer.tokens
@@ -41,14 +41,15 @@ QUESTION=40
 MULT=41
 DIV=42
 MOD=43
-DOLLAR=44
-INT=45
-REAL=46
-EXP=47
-ID=48
-COMMENT=49
-WS=50
-ErrorChar=51
+AT=44
+DOLLAR=45
+INT=46
+REAL=47
+EXP=48
+ID=49
+COMMENT=50
+WS=51
+ErrorChar=52
 'import'=1
 'intent'=2
 'ordered'=3
@@ -88,4 +89,5 @@ ErrorChar=51
 '*'=41
 '/'=42
 '%'=43
-'$'=44
+'@'=44
+'$'=45
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java
index 1e48fdb..7ad1ddb 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java
@@ -38,25 +38,25 @@ public interface NCIdlListener extends ParseTreeListener {
 	 */
 	void exitAlias(NCIdlParser.AliasContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIdlParser#idlItems}.
+	 * Enter a parse tree produced by {@link NCIdlParser#idlDecls}.
 	 * @param ctx the parse tree
 	 */
-	void enterIdlItems(NCIdlParser.IdlItemsContext ctx);
+	void enterIdlDecls(NCIdlParser.IdlDeclsContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIdlParser#idlItems}.
+	 * Exit a parse tree produced by {@link NCIdlParser#idlDecls}.
 	 * @param ctx the parse tree
 	 */
-	void exitIdlItems(NCIdlParser.IdlItemsContext ctx);
+	void exitIdlDecls(NCIdlParser.IdlDeclsContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIdlParser#idlItem}.
+	 * Enter a parse tree produced by {@link NCIdlParser#idlDecl}.
 	 * @param ctx the parse tree
 	 */
-	void enterIdlItem(NCIdlParser.IdlItemContext ctx);
+	void enterIdlDecl(NCIdlParser.IdlDeclContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIdlParser#idlItem}.
+	 * Exit a parse tree produced by {@link NCIdlParser#idlDecl}.
 	 * @param ctx the parse tree
 	 */
-	void exitIdlItem(NCIdlParser.IdlItemContext ctx);
+	void exitIdlDecl(NCIdlParser.IdlDeclContext ctx);
 	/**
 	 * Enter a parse tree produced by {@link NCIdlParser#imp}.
 	 * @param ctx the parse tree
@@ -208,25 +208,25 @@ public interface NCIdlListener extends ParseTreeListener {
 	 */
 	void exitJsonArr(NCIdlParser.JsonArrContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIdlParser#terms}.
+	 * Enter a parse tree produced by {@link NCIdlParser#termDecls}.
 	 * @param ctx the parse tree
 	 */
-	void enterTerms(NCIdlParser.TermsContext ctx);
+	void enterTermDecls(NCIdlParser.TermDeclsContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIdlParser#terms}.
+	 * Exit a parse tree produced by {@link NCIdlParser#termDecls}.
 	 * @param ctx the parse tree
 	 */
-	void exitTerms(NCIdlParser.TermsContext ctx);
+	void exitTermDecls(NCIdlParser.TermDeclsContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIdlParser#termItem}.
+	 * Enter a parse tree produced by {@link NCIdlParser#termDecl}.
 	 * @param ctx the parse tree
 	 */
-	void enterTermItem(NCIdlParser.TermItemContext ctx);
+	void enterTermDecl(NCIdlParser.TermDeclContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIdlParser#termItem}.
+	 * Exit a parse tree produced by {@link NCIdlParser#termDecl}.
 	 * @param ctx the parse tree
 	 */
-	void exitTermItem(NCIdlParser.TermItemContext ctx);
+	void exitTermDecl(NCIdlParser.TermDeclContext ctx);
 	/**
 	 * Enter a parse tree produced by {@link NCIdlParser#termEq}.
 	 * @param ctx the parse tree
@@ -338,6 +338,18 @@ public interface NCIdlListener extends ParseTreeListener {
 	 */
 	void exitAtomExpr(NCIdlParser.AtomExprContext ctx);
 	/**
+	 * Enter a parse tree produced by the {@code varRef}
+	 * labeled alternative in {@link NCIdlParser#expr}.
+	 * @param ctx the parse tree
+	 */
+	void enterVarRef(NCIdlParser.VarRefContext ctx);
+	/**
+	 * Exit a parse tree produced by the {@code varRef}
+	 * labeled alternative in {@link NCIdlParser#expr}.
+	 * @param ctx the parse tree
+	 */
+	void exitVarRef(NCIdlParser.VarRefContext ctx);
+	/**
 	 * Enter a parse tree produced by the {@code multDivModExpr}
 	 * labeled alternative in {@link NCIdlParser#expr}.
 	 * @param ctx the parse tree
@@ -386,6 +398,26 @@ public interface NCIdlListener extends ParseTreeListener {
 	 */
 	void exitEqNeqExpr(NCIdlParser.EqNeqExprContext ctx);
 	/**
+	 * Enter a parse tree produced by {@link NCIdlParser#vars}.
+	 * @param ctx the parse tree
+	 */
+	void enterVars(NCIdlParser.VarsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIdlParser#vars}.
+	 * @param ctx the parse tree
+	 */
+	void exitVars(NCIdlParser.VarsContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link NCIdlParser#varDecl}.
+	 * @param ctx the parse tree
+	 */
+	void enterVarDecl(NCIdlParser.VarDeclContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIdlParser#varDecl}.
+	 * @param ctx the parse tree
+	 */
+	void exitVarDecl(NCIdlParser.VarDeclContext ctx);
+	/**
 	 * Enter a parse tree produced by {@link NCIdlParser#paramList}.
 	 * @param ctx the parse tree
 	 */
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java
index 9f99f85..0bcfed5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java
@@ -22,26 +22,26 @@ public class NCIdlParser extends Parser {
 		LT=18, AND=19, OR=20, VERT=21, NOT=22, LPAR=23, RPAR=24, LBRACE=25, RBRACE=26, 
 		SQUOTE=27, DQUOTE=28, TILDA=29, LBR=30, RBR=31, POUND=32, COMMA=33, COLON=34, 
 		MINUS=35, DOT=36, UNDERSCORE=37, ASSIGN=38, PLUS=39, QUESTION=40, MULT=41, 
-		DIV=42, MOD=43, DOLLAR=44, INT=45, REAL=46, EXP=47, ID=48, COMMENT=49, 
-		WS=50, ErrorChar=51;
+		DIV=42, MOD=43, AT=44, DOLLAR=45, INT=46, REAL=47, EXP=48, ID=49, COMMENT=50, 
+		WS=51, ErrorChar=52;
 	public static final int
-		RULE_idl = 0, RULE_synonym = 1, RULE_alias = 2, RULE_idlItems = 3, RULE_idlItem = 4, 
+		RULE_idl = 0, RULE_synonym = 1, RULE_alias = 2, RULE_idlDecls = 3, RULE_idlDecl = 4, 
 		RULE_imp = 5, RULE_frag = 6, RULE_fragId = 7, RULE_fragRef = 8, RULE_fragMeta = 9, 
 		RULE_intent = 10, RULE_intentId = 11, RULE_orderedDecl = 12, RULE_mtdDecl = 13, 
 		RULE_flowDecl = 14, RULE_metaDecl = 15, RULE_jsonObj = 16, RULE_jsonPair = 17, 
-		RULE_jsonVal = 18, RULE_jsonArr = 19, RULE_terms = 20, RULE_termItem = 21, 
+		RULE_jsonVal = 18, RULE_jsonArr = 19, RULE_termDecls = 20, RULE_termDecl = 21, 
 		RULE_termEq = 22, RULE_term = 23, RULE_mtdRef = 24, RULE_javaFqn = 25, 
-		RULE_termId = 26, RULE_expr = 27, RULE_paramList = 28, RULE_atom = 29, 
-		RULE_qstring = 30, RULE_minMax = 31, RULE_minMaxShortcut = 32, RULE_minMaxRange = 33, 
-		RULE_id = 34;
+		RULE_termId = 26, RULE_expr = 27, RULE_vars = 28, RULE_varDecl = 29, RULE_paramList = 30, 
+		RULE_atom = 31, RULE_qstring = 32, RULE_minMax = 33, RULE_minMaxShortcut = 34, 
+		RULE_minMaxRange = 35, RULE_id = 36;
 	private static String[] makeRuleNames() {
 		return new String[] {
-			"idl", "synonym", "alias", "idlItems", "idlItem", "imp", "frag", "fragId", 
+			"idl", "synonym", "alias", "idlDecls", "idlDecl", "imp", "frag", "fragId", 
 			"fragRef", "fragMeta", "intent", "intentId", "orderedDecl", "mtdDecl", 
 			"flowDecl", "metaDecl", "jsonObj", "jsonPair", "jsonVal", "jsonArr", 
-			"terms", "termItem", "termEq", "term", "mtdRef", "javaFqn", "termId", 
-			"expr", "paramList", "atom", "qstring", "minMax", "minMaxShortcut", "minMaxRange", 
-			"id"
+			"termDecls", "termDecl", "termEq", "term", "mtdRef", "javaFqn", "termId", 
+			"expr", "vars", "varDecl", "paramList", "atom", "qstring", "minMax", 
+			"minMaxShortcut", "minMaxRange", "id"
 		};
 	}
 	public static final String[] ruleNames = makeRuleNames();
@@ -52,7 +52,7 @@ public class NCIdlParser extends Parser {
 			null, "'fragment'", null, null, null, "'null'", "'=='", "'!='", "'>='", 
 			"'<='", "'>'", "'<'", "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", 
 			"'}'", "'''", "'\"'", "'~'", "'['", "']'", "'#'", "','", "':'", "'-'", 
-			"'.'", "'_'", "'='", "'+'", "'?'", "'*'", "'/'", "'%'", "'$'"
+			"'.'", "'_'", "'='", "'+'", "'?'", "'*'", "'/'", "'%'", "'@'", "'$'"
 		};
 	}
 	private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -63,7 +63,7 @@ public class NCIdlParser extends Parser {
 			"AND", "OR", "VERT", "NOT", "LPAR", "RPAR", "LBRACE", "RBRACE", "SQUOTE", 
 			"DQUOTE", "TILDA", "LBR", "RBR", "POUND", "COMMA", "COLON", "MINUS", 
 			"DOT", "UNDERSCORE", "ASSIGN", "PLUS", "QUESTION", "MULT", "DIV", "MOD", 
-			"DOLLAR", "INT", "REAL", "EXP", "ID", "COMMENT", "WS", "ErrorChar"
+			"AT", "DOLLAR", "INT", "REAL", "EXP", "ID", "COMMENT", "WS", "ErrorChar"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -118,8 +118,8 @@ public class NCIdlParser extends Parser {
 	}
 
 	public static class IdlContext extends ParserRuleContext {
-		public IdlItemsContext idlItems() {
-			return getRuleContext(IdlItemsContext.class,0);
+		public IdlDeclsContext idlDecls() {
+			return getRuleContext(IdlDeclsContext.class,0);
 		}
 		public TerminalNode EOF() { return getToken(NCIdlParser.EOF, 0); }
 		public IdlContext(ParserRuleContext parent, int invokingState) {
@@ -142,9 +142,9 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(70);
-			idlItems(0);
-			setState(71);
+			setState(74);
+			idlDecls(0);
+			setState(75);
 			match(EOF);
 			}
 		}
@@ -169,6 +169,9 @@ public class NCIdlParser extends Parser {
 		public AliasContext alias() {
 			return getRuleContext(AliasContext.class,0);
 		}
+		public VarsContext vars() {
+			return getRuleContext(VarsContext.class,0);
+		}
 		public SynonymContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -190,23 +193,33 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(74);
+			setState(78);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==LBR) {
 				{
-				setState(73);
+				setState(77);
 				alias();
 				}
 			}
 
-			setState(76);
+			setState(80);
 			match(LBRACE);
-			setState(77);
+			setState(82);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) {
+			case 1:
+				{
+				setState(81);
+				vars(0);
+				}
+				break;
+			}
+			setState(84);
 			expr(0);
-			setState(78);
+			setState(85);
 			match(RBRACE);
-			setState(79);
+			setState(86);
 			match(EOF);
 			}
 		}
@@ -247,11 +260,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(81);
+			setState(88);
 			match(LBR);
-			setState(82);
+			setState(89);
 			id();
-			setState(83);
+			setState(90);
 			match(RBR);
 			}
 		}
@@ -266,68 +279,68 @@ public class NCIdlParser extends Parser {
 		return _localctx;
 	}
 
-	public static class IdlItemsContext extends ParserRuleContext {
-		public IdlItemContext idlItem() {
-			return getRuleContext(IdlItemContext.class,0);
+	public static class IdlDeclsContext extends ParserRuleContext {
+		public IdlDeclContext idlDecl() {
+			return getRuleContext(IdlDeclContext.class,0);
 		}
-		public IdlItemsContext idlItems() {
-			return getRuleContext(IdlItemsContext.class,0);
+		public IdlDeclsContext idlDecls() {
+			return getRuleContext(IdlDeclsContext.class,0);
 		}
-		public IdlItemsContext(ParserRuleContext parent, int invokingState) {
+		public IdlDeclsContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_idlItems; }
+		@Override public int getRuleIndex() { return RULE_idlDecls; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterIdlItems(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterIdlDecls(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitIdlItems(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitIdlDecls(this);
 		}
 	}
 
-	public final IdlItemsContext idlItems() throws RecognitionException {
-		return idlItems(0);
+	public final IdlDeclsContext idlDecls() throws RecognitionException {
+		return idlDecls(0);
 	}
 
-	private IdlItemsContext idlItems(int _p) throws RecognitionException {
+	private IdlDeclsContext idlDecls(int _p) throws RecognitionException {
 		ParserRuleContext _parentctx = _ctx;
 		int _parentState = getState();
-		IdlItemsContext _localctx = new IdlItemsContext(_ctx, _parentState);
-		IdlItemsContext _prevctx = _localctx;
+		IdlDeclsContext _localctx = new IdlDeclsContext(_ctx, _parentState);
+		IdlDeclsContext _prevctx = _localctx;
 		int _startState = 6;
-		enterRecursionRule(_localctx, 6, RULE_idlItems, _p);
+		enterRecursionRule(_localctx, 6, RULE_idlDecls, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(86);
-			idlItem();
+			setState(93);
+			idlDecl();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(92);
+			setState(99);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,1,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,2,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
 					{
-					_localctx = new IdlItemsContext(_parentctx, _parentState);
-					pushNewRecursionContext(_localctx, _startState, RULE_idlItems);
-					setState(88);
+					_localctx = new IdlDeclsContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_idlDecls);
+					setState(95);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(89);
-					idlItem();
+					setState(96);
+					idlDecl();
 					}
 					} 
 				}
-				setState(94);
+				setState(101);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,1,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,2,_ctx);
 			}
 			}
 		}
@@ -342,7 +355,7 @@ public class NCIdlParser extends Parser {
 		return _localctx;
 	}
 
-	public static class IdlItemContext extends ParserRuleContext {
+	public static class IdlDeclContext extends ParserRuleContext {
 		public IntentContext intent() {
 			return getRuleContext(IntentContext.class,0);
 		}
@@ -352,45 +365,45 @@ public class NCIdlParser extends Parser {
 		public ImpContext imp() {
 			return getRuleContext(ImpContext.class,0);
 		}
-		public IdlItemContext(ParserRuleContext parent, int invokingState) {
+		public IdlDeclContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_idlItem; }
+		@Override public int getRuleIndex() { return RULE_idlDecl; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterIdlItem(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterIdlDecl(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitIdlItem(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitIdlDecl(this);
 		}
 	}
 
-	public final IdlItemContext idlItem() throws RecognitionException {
-		IdlItemContext _localctx = new IdlItemContext(_ctx, getState());
-		enterRule(_localctx, 8, RULE_idlItem);
+	public final IdlDeclContext idlDecl() throws RecognitionException {
+		IdlDeclContext _localctx = new IdlDeclContext(_ctx, getState());
+		enterRule(_localctx, 8, RULE_idlDecl);
 		try {
-			setState(98);
+			setState(105);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case T__1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(95);
+				setState(102);
 				intent();
 				}
 				break;
 			case FRAG:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(96);
+				setState(103);
 				frag();
 				}
 				break;
 			case T__0:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(97);
+				setState(104);
 				imp();
 				}
 				break;
@@ -435,13 +448,13 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(100);
+			setState(107);
 			match(T__0);
-			setState(101);
+			setState(108);
 			match(LPAR);
-			setState(102);
+			setState(109);
 			qstring();
-			setState(103);
+			setState(110);
 			match(RPAR);
 			}
 		}
@@ -460,8 +473,8 @@ public class NCIdlParser extends Parser {
 		public FragIdContext fragId() {
 			return getRuleContext(FragIdContext.class,0);
 		}
-		public TermsContext terms() {
-			return getRuleContext(TermsContext.class,0);
+		public TermDeclsContext termDecls() {
+			return getRuleContext(TermDeclsContext.class,0);
 		}
 		public FragContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
@@ -483,10 +496,10 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(105);
+			setState(112);
 			fragId();
-			setState(106);
-			terms(0);
+			setState(113);
+			termDecls(0);
 			}
 		}
 		catch (RecognitionException re) {
@@ -526,11 +539,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(108);
+			setState(115);
 			match(FRAG);
-			setState(109);
+			setState(116);
 			match(ASSIGN);
-			setState(110);
+			setState(117);
 			id();
 			}
 		}
@@ -576,23 +589,23 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(112);
+			setState(119);
 			match(FRAG);
-			setState(113);
+			setState(120);
 			match(LPAR);
-			setState(114);
+			setState(121);
 			id();
-			setState(116);
+			setState(123);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==COMMA) {
 				{
-				setState(115);
+				setState(122);
 				fragMeta();
 				}
 			}
 
-			setState(118);
+			setState(125);
 			match(RPAR);
 			}
 		}
@@ -632,9 +645,9 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(120);
+			setState(127);
 			match(COMMA);
-			setState(121);
+			setState(128);
 			jsonObj();
 			}
 		}
@@ -653,8 +666,8 @@ public class NCIdlParser extends Parser {
 		public IntentIdContext intentId() {
 			return getRuleContext(IntentIdContext.class,0);
 		}
-		public TermsContext terms() {
-			return getRuleContext(TermsContext.class,0);
+		public TermDeclsContext termDecls() {
+			return getRuleContext(TermDeclsContext.class,0);
 		}
 		public OrderedDeclContext orderedDecl() {
 			return getRuleContext(OrderedDeclContext.class,0);
@@ -686,40 +699,40 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(123);
+			setState(130);
 			intentId();
-			setState(125);
+			setState(132);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==T__2) {
 				{
-				setState(124);
+				setState(131);
 				orderedDecl();
 				}
 			}
 
-			setState(128);
+			setState(135);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==T__3) {
 				{
-				setState(127);
+				setState(134);
 				flowDecl();
 				}
 			}
 
-			setState(131);
+			setState(138);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==T__4) {
 				{
-				setState(130);
+				setState(137);
 				metaDecl();
 				}
 			}
 
-			setState(133);
-			terms(0);
+			setState(140);
+			termDecls(0);
 			}
 		}
 		catch (RecognitionException re) {
@@ -758,11 +771,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(135);
+			setState(142);
 			match(T__1);
-			setState(136);
+			setState(143);
 			match(ASSIGN);
-			setState(137);
+			setState(144);
 			id();
 			}
 		}
@@ -800,11 +813,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(139);
+			setState(146);
 			match(T__2);
-			setState(140);
+			setState(147);
 			match(ASSIGN);
-			setState(141);
+			setState(148);
 			match(BOOL);
 			}
 		}
@@ -847,11 +860,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(143);
+			setState(150);
 			match(DIV);
-			setState(144);
+			setState(151);
 			mtdRef();
-			setState(145);
+			setState(152);
 			match(DIV);
 			}
 		}
@@ -894,23 +907,23 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(147);
+			setState(154);
 			match(T__3);
-			setState(148);
+			setState(155);
 			match(ASSIGN);
-			setState(151);
+			setState(158);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case SQSTRING:
 			case DQSTRING:
 				{
-				setState(149);
+				setState(156);
 				qstring();
 				}
 				break;
 			case DIV:
 				{
-				setState(150);
+				setState(157);
 				mtdDecl();
 				}
 				break;
@@ -955,11 +968,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(153);
+			setState(160);
 			match(T__4);
-			setState(154);
+			setState(161);
 			match(ASSIGN);
-			setState(155);
+			setState(162);
 			jsonObj();
 			}
 		}
@@ -1006,42 +1019,42 @@ public class NCIdlParser extends Parser {
 		enterRule(_localctx, 32, RULE_jsonObj);
 		int _la;
 		try {
-			setState(170);
+			setState(177);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(157);
+				setState(164);
 				match(LBRACE);
-				setState(158);
+				setState(165);
 				jsonPair();
-				setState(163);
+				setState(170);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				while (_la==COMMA) {
 					{
 					{
-					setState(159);
+					setState(166);
 					match(COMMA);
-					setState(160);
+					setState(167);
 					jsonPair();
 					}
 					}
-					setState(165);
+					setState(172);
 					_errHandler.sync(this);
 					_la = _input.LA(1);
 				}
-				setState(166);
+				setState(173);
 				match(RBRACE);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(168);
+				setState(175);
 				match(LBRACE);
-				setState(169);
+				setState(176);
 				match(RBRACE);
 				}
 				break;
@@ -1086,11 +1099,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(172);
+			setState(179);
 			qstring();
-			setState(173);
+			setState(180);
 			match(COLON);
-			setState(174);
+			setState(181);
 			jsonVal();
 			}
 		}
@@ -1140,14 +1153,14 @@ public class NCIdlParser extends Parser {
 		enterRule(_localctx, 36, RULE_jsonVal);
 		int _la;
 		try {
-			setState(191);
+			setState(198);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case SQSTRING:
 			case DQSTRING:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(176);
+				setState(183);
 				qstring();
 				}
 				break;
@@ -1155,34 +1168,34 @@ public class NCIdlParser extends Parser {
 			case INT:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(178);
+				setState(185);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if (_la==MINUS) {
 					{
-					setState(177);
+					setState(184);
 					match(MINUS);
 					}
 				}
 
-				setState(180);
+				setState(187);
 				match(INT);
-				setState(182);
+				setState(189);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if (_la==REAL) {
 					{
-					setState(181);
+					setState(188);
 					match(REAL);
 					}
 				}
 
-				setState(185);
+				setState(192);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if (_la==EXP) {
 					{
-					setState(184);
+					setState(191);
 					match(EXP);
 					}
 				}
@@ -1192,28 +1205,28 @@ public class NCIdlParser extends Parser {
 			case LBRACE:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(187);
+				setState(194);
 				jsonObj();
 				}
 				break;
 			case LBR:
 				enterOuterAlt(_localctx, 4);
 				{
-				setState(188);
+				setState(195);
 				jsonArr();
 				}
 				break;
 			case BOOL:
 				enterOuterAlt(_localctx, 5);
 				{
-				setState(189);
+				setState(196);
 				match(BOOL);
 				}
 				break;
 			case NULL:
 				enterOuterAlt(_localctx, 6);
 				{
-				setState(190);
+				setState(197);
 				match(NULL);
 				}
 				break;
@@ -1264,42 +1277,42 @@ public class NCIdlParser extends Parser {
 		enterRule(_localctx, 38, RULE_jsonArr);
 		int _la;
 		try {
-			setState(206);
+			setState(213);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(193);
+				setState(200);
 				match(LBR);
-				setState(194);
+				setState(201);
 				jsonVal();
-				setState(199);
+				setState(206);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				while (_la==COMMA) {
 					{
 					{
-					setState(195);
+					setState(202);
 					match(COMMA);
-					setState(196);
+					setState(203);
 					jsonVal();
 					}
 					}
-					setState(201);
+					setState(208);
 					_errHandler.sync(this);
 					_la = _input.LA(1);
 				}
-				setState(202);
+				setState(209);
 				match(RBR);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(204);
+				setState(211);
 				match(LBR);
-				setState(205);
+				setState(212);
 				match(RBR);
 				}
 				break;
@@ -1316,68 +1329,68 @@ public class NCIdlParser extends Parser {
 		return _localctx;
 	}
 
-	public static class TermsContext extends ParserRuleContext {
-		public TermItemContext termItem() {
-			return getRuleContext(TermItemContext.class,0);
+	public static class TermDeclsContext extends ParserRuleContext {
+		public TermDeclContext termDecl() {
+			return getRuleContext(TermDeclContext.class,0);
 		}
-		public TermsContext terms() {
-			return getRuleContext(TermsContext.class,0);
+		public TermDeclsContext termDecls() {
+			return getRuleContext(TermDeclsContext.class,0);
 		}
-		public TermsContext(ParserRuleContext parent, int invokingState) {
+		public TermDeclsContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_terms; }
+		@Override public int getRuleIndex() { return RULE_termDecls; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterTerms(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterTermDecls(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitTerms(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitTermDecls(this);
 		}
 	}
 
-	public final TermsContext terms() throws RecognitionException {
-		return terms(0);
+	public final TermDeclsContext termDecls() throws RecognitionException {
+		return termDecls(0);
 	}
 
-	private TermsContext terms(int _p) throws RecognitionException {
+	private TermDeclsContext termDecls(int _p) throws RecognitionException {
 		ParserRuleContext _parentctx = _ctx;
 		int _parentState = getState();
-		TermsContext _localctx = new TermsContext(_ctx, _parentState);
-		TermsContext _prevctx = _localctx;
+		TermDeclsContext _localctx = new TermDeclsContext(_ctx, _parentState);
+		TermDeclsContext _prevctx = _localctx;
 		int _startState = 40;
-		enterRecursionRule(_localctx, 40, RULE_terms, _p);
+		enterRecursionRule(_localctx, 40, RULE_termDecls, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(209);
-			termItem();
+			setState(216);
+			termDecl();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(215);
+			setState(222);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,16,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
 					{
-					_localctx = new TermsContext(_parentctx, _parentState);
-					pushNewRecursionContext(_localctx, _startState, RULE_terms);
-					setState(211);
+					_localctx = new TermDeclsContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_termDecls);
+					setState(218);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(212);
-					termItem();
+					setState(219);
+					termDecl();
 					}
 					} 
 				}
-				setState(217);
+				setState(224);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,16,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
 			}
 			}
 		}
@@ -1392,45 +1405,45 @@ public class NCIdlParser extends Parser {
 		return _localctx;
 	}
 
-	public static class TermItemContext extends ParserRuleContext {
+	public static class TermDeclContext extends ParserRuleContext {
 		public TermContext term() {
 			return getRuleContext(TermContext.class,0);
 		}
 		public FragRefContext fragRef() {
 			return getRuleContext(FragRefContext.class,0);
 		}
-		public TermItemContext(ParserRuleContext parent, int invokingState) {
+		public TermDeclContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_termItem; }
+		@Override public int getRuleIndex() { return RULE_termDecl; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterTermItem(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterTermDecl(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitTermItem(this);
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitTermDecl(this);
 		}
 	}
 
-	public final TermItemContext termItem() throws RecognitionException {
-		TermItemContext _localctx = new TermItemContext(_ctx, getState());
-		enterRule(_localctx, 42, RULE_termItem);
+	public final TermDeclContext termDecl() throws RecognitionException {
+		TermDeclContext _localctx = new TermDeclContext(_ctx, getState());
+		enterRule(_localctx, 42, RULE_termDecl);
 		try {
-			setState(220);
+			setState(227);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case T__5:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(218);
+				setState(225);
 				term();
 				}
 				break;
 			case FRAG:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(219);
+				setState(226);
 				fragRef();
 				}
 				break;
@@ -1473,7 +1486,7 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(222);
+			setState(229);
 			_la = _input.LA(1);
 			if ( !(_la==TILDA || _la==ASSIGN) ) {
 			_errHandler.recoverInline(this);
@@ -1514,6 +1527,9 @@ public class NCIdlParser extends Parser {
 			return getRuleContext(ExprContext.class,0);
 		}
 		public TerminalNode RBRACE() { return getToken(NCIdlParser.RBRACE, 0); }
+		public VarsContext vars() {
+			return getRuleContext(VarsContext.class,0);
+		}
 		public TermContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -1535,50 +1551,60 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(224);
+			setState(231);
 			match(T__5);
-			setState(226);
+			setState(233);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==LPAR) {
 				{
-				setState(225);
+				setState(232);
 				termId();
 				}
 			}
 
-			setState(228);
+			setState(235);
 			termEq();
-			setState(234);
+			setState(244);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case LBRACE:
 				{
 				{
-				setState(229);
+				setState(236);
 				match(LBRACE);
-				setState(230);
+				setState(238);
+				_errHandler.sync(this);
+				switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) {
+				case 1:
+					{
+					setState(237);
+					vars(0);
+					}
+					break;
+				}
+				setState(240);
 				expr(0);
-				setState(231);
+				setState(241);
 				match(RBRACE);
 				}
 				}
 				break;
 			case DIV:
 				{
-				setState(233);
+				setState(243);
 				mtdDecl();
 				}
 				break;
 			default:
 				throw new NoViableAltException(this);
 			}
-			setState(237);
+			setState(247);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) {
 			case 1:
 				{
-				setState(236);
+				setState(246);
 				minMax();
 				}
 				break;
@@ -1625,19 +1651,19 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(240);
+			setState(250);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==FUN_NAME || _la==ID) {
 				{
-				setState(239);
+				setState(249);
 				javaFqn(0);
 				}
 			}
 
-			setState(242);
+			setState(252);
 			match(POUND);
-			setState(243);
+			setState(253);
 			id();
 			}
 		}
@@ -1690,13 +1716,13 @@ public class NCIdlParser extends Parser {
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(246);
+			setState(256);
 			id();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(253);
+			setState(263);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,22,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,24,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1705,18 +1731,18 @@ public class NCIdlParser extends Parser {
 					{
 					_localctx = new JavaFqnContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_javaFqn);
-					setState(248);
+					setState(258);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(249);
+					setState(259);
 					match(DOT);
-					setState(250);
+					setState(260);
 					id();
 					}
 					} 
 				}
-				setState(255);
+				setState(265);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,22,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,24,_ctx);
 			}
 			}
 		}
@@ -1757,11 +1783,11 @@ public class NCIdlParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(256);
+			setState(266);
 			match(LPAR);
-			setState(257);
+			setState(267);
 			id();
-			setState(258);
+			setState(268);
 			match(RPAR);
 			}
 		}
@@ -1876,6 +1902,21 @@ public class NCIdlParser extends Parser {
 			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitAtomExpr(this);
 		}
 	}
+	public static class VarRefContext extends ExprContext {
+		public TerminalNode AT() { return getToken(NCIdlParser.AT, 0); }
+		public IdContext id() {
+			return getRuleContext(IdContext.class,0);
+		}
+		public VarRefContext(ExprContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterVarRef(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitVarRef(this);
+		}
+	}
 	public static class MultDivModExprContext extends ExprContext {
 		public Token op;
 		public List<ExprContext> expr() {
@@ -1971,7 +2012,7 @@ public class NCIdlParser extends Parser {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(274);
+			setState(286);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case NOT:
@@ -1981,7 +2022,7 @@ public class NCIdlParser extends Parser {
 				_ctx = _localctx;
 				_prevctx = _localctx;
 
-				setState(261);
+				setState(271);
 				((UnaryExprContext)_localctx).op = _input.LT(1);
 				_la = _input.LA(1);
 				if ( !(_la==NOT || _la==MINUS) ) {
@@ -1992,8 +2033,8 @@ public class NCIdlParser extends Parser {
 					_errHandler.reportMatch(this);
 					consume();
 				}
-				setState(262);
-				expr(9);
+				setState(272);
+				expr(10);
 				}
 				break;
 			case LPAR:
@@ -2001,11 +2042,11 @@ public class NCIdlParser extends Parser {
 				_localctx = new ParExprContext(_localctx);
 				_ctx = _localctx;
 				_prevctx = _localctx;
-				setState(263);
+				setState(273);
 				match(LPAR);
-				setState(264);
+				setState(274);
 				expr(0);
-				setState(265);
+				setState(275);
 				match(RPAR);
 				}
 				break;
@@ -2018,7 +2059,7 @@ public class NCIdlParser extends Parser {
 				_localctx = new AtomExprContext(_localctx);
 				_ctx = _localctx;
 				_prevctx = _localctx;
-				setState(267);
+				setState(277);
 				atom();
 				}
 				break;
@@ -2027,46 +2068,57 @@ public class NCIdlParser extends Parser {
 				_localctx = new CallExprContext(_localctx);
 				_ctx = _localctx;
 				_prevctx = _localctx;
-				setState(268);
+				setState(278);
 				match(FUN_NAME);
-				setState(269);
+				setState(279);
 				match(LPAR);
-				setState(271);
+				setState(281);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
-				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FUN_NAME) | (1L << SQSTRING) | (1L << DQSTRING) | (1L << BOOL) | (1L << NULL) | (1L << NOT) | (1L << LPAR) | (1L << MINUS) | (1L << INT))) != 0)) {
+				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FUN_NAME) | (1L << SQSTRING) | (1L << DQSTRING) | (1L << BOOL) | (1L << NULL) | (1L << NOT) | (1L << LPAR) | (1L << MINUS) | (1L << AT) | (1L << INT))) != 0)) {
 					{
-					setState(270);
+					setState(280);
 					paramList(0);
 					}
 				}
 
-				setState(273);
+				setState(283);
 				match(RPAR);
 				}
 				break;
+			case AT:
+				{
+				_localctx = new VarRefContext(_localctx);
+				_ctx = _localctx;
+				_prevctx = _localctx;
+				setState(284);
+				match(AT);
+				setState(285);
+				id();
+				}
+				break;
 			default:
 				throw new NoViableAltException(this);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(293);
+			setState(305);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,26,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,28,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
-					setState(291);
+					setState(303);
 					_errHandler.sync(this);
-					switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) {
+					switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
 					case 1:
 						{
 						_localctx = new MultDivModExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(276);
-						if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
-						setState(277);
+						setState(288);
+						if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
+						setState(289);
 						((MultDivModExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << MULT) | (1L << DIV) | (1L << MOD))) != 0)) ) {
@@ -2077,17 +2129,17 @@ public class NCIdlParser extends Parser {
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(278);
-						expr(8);
+						setState(290);
+						expr(9);
 						}
 						break;
 					case 2:
 						{
 						_localctx = new PlusMinusExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(279);
-						if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
-						setState(280);
+						setState(291);
+						if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
+						setState(292);
 						((PlusMinusExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !(_la==MINUS || _la==PLUS) ) {
@@ -2098,17 +2150,17 @@ public class NCIdlParser extends Parser {
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(281);
-						expr(7);
+						setState(293);
+						expr(8);
 						}
 						break;
 					case 3:
 						{
 						_localctx = new CompExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(282);
-						if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
-						setState(283);
+						setState(294);
+						if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
+						setState(295);
 						((CompExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GTEQ) | (1L << LTEQ) | (1L << GT) | (1L << LT))) != 0)) ) {
@@ -2119,17 +2171,17 @@ public class NCIdlParser extends Parser {
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(284);
-						expr(6);
+						setState(296);
+						expr(7);
 						}
 						break;
 					case 4:
 						{
 						_localctx = new EqNeqExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(285);
-						if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
-						setState(286);
+						setState(297);
+						if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
+						setState(298);
 						((EqNeqExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !(_la==EQ || _la==NEQ) ) {
@@ -2140,17 +2192,17 @@ public class NCIdlParser extends Parser {
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(287);
-						expr(5);
+						setState(299);
+						expr(6);
 						}
 						break;
 					case 5:
 						{
 						_localctx = new AndOrExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(288);
-						if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
-						setState(289);
+						setState(300);
+						if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
+						setState(301);
 						((AndOrExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !(_la==AND || _la==OR) ) {
@@ -2161,16 +2213,92 @@ public class NCIdlParser extends Parser {
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(290);
-						expr(4);
+						setState(302);
+						expr(5);
 						}
 						break;
 					}
 					} 
 				}
-				setState(295);
+				setState(307);
+				_errHandler.sync(this);
+				_alt = getInterpreter().adaptivePredict(_input,28,_ctx);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			unrollRecursionContexts(_parentctx);
+		}
+		return _localctx;
+	}
+
+	public static class VarsContext extends ParserRuleContext {
+		public VarDeclContext varDecl() {
+			return getRuleContext(VarDeclContext.class,0);
+		}
+		public VarsContext vars() {
+			return getRuleContext(VarsContext.class,0);
+		}
+		public VarsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_vars; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterVars(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitVars(this);
+		}
+	}
+
+	public final VarsContext vars() throws RecognitionException {
+		return vars(0);
+	}
+
+	private VarsContext vars(int _p) throws RecognitionException {
+		ParserRuleContext _parentctx = _ctx;
+		int _parentState = getState();
+		VarsContext _localctx = new VarsContext(_ctx, _parentState);
+		VarsContext _prevctx = _localctx;
+		int _startState = 56;
+		enterRecursionRule(_localctx, 56, RULE_vars, _p);
+		try {
+			int _alt;
+			enterOuterAlt(_localctx, 1);
+			{
+			{
+			setState(309);
+			varDecl();
+			}
+			_ctx.stop = _input.LT(-1);
+			setState(315);
+			_errHandler.sync(this);
+			_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
+			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+				if ( _alt==1 ) {
+					if ( _parseListeners!=null ) triggerExitRuleEvent();
+					_prevctx = _localctx;
+					{
+					{
+					_localctx = new VarsContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_vars);
+					setState(311);
+					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+					setState(312);
+					varDecl();
+					}
+					} 
+				}
+				setState(317);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,26,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
 			}
 			}
 		}
@@ -2185,6 +2313,56 @@ public class NCIdlParser extends Parser {
 		return _localctx;
 	}
 
+	public static class VarDeclContext extends ParserRuleContext {
+		public TerminalNode AT() { return getToken(NCIdlParser.AT, 0); }
+		public IdContext id() {
+			return getRuleContext(IdContext.class,0);
+		}
+		public TerminalNode ASSIGN() { return getToken(NCIdlParser.ASSIGN, 0); }
+		public ExprContext expr() {
+			return getRuleContext(ExprContext.class,0);
+		}
+		public VarDeclContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_varDecl; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterVarDecl(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitVarDecl(this);
+		}
+	}
+
+	public final VarDeclContext varDecl() throws RecognitionException {
+		VarDeclContext _localctx = new VarDeclContext(_ctx, getState());
+		enterRule(_localctx, 58, RULE_varDecl);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(318);
+			match(AT);
+			setState(319);
+			id();
+			setState(320);
+			match(ASSIGN);
+			setState(321);
+			expr(0);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
 	public static class ParamListContext extends ParserRuleContext {
 		public ExprContext expr() {
 			return getRuleContext(ExprContext.class,0);
@@ -2216,20 +2394,20 @@ public class NCIdlParser extends Parser {
 		int _parentState = getState();
 		ParamListContext _localctx = new ParamListContext(_ctx, _parentState);
 		ParamListContext _prevctx = _localctx;
-		int _startState = 56;
-		enterRecursionRule(_localctx, 56, RULE_paramList, _p);
+		int _startState = 60;
+		enterRecursionRule(_localctx, 60, RULE_paramList, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(297);
+			setState(324);
 			expr(0);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(304);
+			setState(331);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,27,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -2238,18 +2416,18 @@ public class NCIdlParser extends Parser {
 					{
 					_localctx = new ParamListContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_paramList);
-					setState(299);
+					setState(326);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(300);
+					setState(327);
 					match(COMMA);
-					setState(301);
+					setState(328);
 					expr(0);
 					}
 					} 
 				}
-				setState(306);
+				setState(333);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,27,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			}
 			}
 		}
@@ -2289,39 +2467,39 @@ public class NCIdlParser extends Parser {
 
 	public final AtomContext atom() throws RecognitionException {
 		AtomContext _localctx = new AtomContext(_ctx, getState());
-		enterRule(_localctx, 58, RULE_atom);
+		enterRule(_localctx, 62, RULE_atom);
 		try {
-			setState(317);
+			setState(344);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case NULL:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(307);
+				setState(334);
 				match(NULL);
 				}
 				break;
 			case INT:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(308);
+				setState(335);
 				match(INT);
-				setState(310);
+				setState(337);
 				_errHandler.sync(this);
-				switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
+				switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) {
 				case 1:
 					{
-					setState(309);
+					setState(336);
 					match(REAL);
 					}
 					break;
 				}
-				setState(313);
+				setState(340);
 				_errHandler.sync(this);
-				switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) {
+				switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
 				case 1:
 					{
-					setState(312);
+					setState(339);
 					match(EXP);
 					}
 					break;
@@ -2331,7 +2509,7 @@ public class NCIdlParser extends Parser {
 			case BOOL:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(315);
+				setState(342);
 				match(BOOL);
 				}
 				break;
@@ -2339,7 +2517,7 @@ public class NCIdlParser extends Parser {
 			case DQSTRING:
 				enterOuterAlt(_localctx, 4);
 				{
-				setState(316);
+				setState(343);
 				qstring();
 				}
 				break;
@@ -2377,12 +2555,12 @@ public class NCIdlParser extends Parser {
 
 	public final QstringContext qstring() throws RecognitionException {
 		QstringContext _localctx = new QstringContext(_ctx, getState());
-		enterRule(_localctx, 60, RULE_qstring);
+		enterRule(_localctx, 64, RULE_qstring);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(319);
+			setState(346);
 			_la = _input.LA(1);
 			if ( !(_la==SQSTRING || _la==DQSTRING) ) {
 			_errHandler.recoverInline(this);
@@ -2428,9 +2606,9 @@ public class NCIdlParser extends Parser {
 
 	public final MinMaxContext minMax() throws RecognitionException {
 		MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
-		enterRule(_localctx, 62, RULE_minMax);
+		enterRule(_localctx, 66, RULE_minMax);
 		try {
-			setState(323);
+			setState(350);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case PLUS:
@@ -2438,14 +2616,14 @@ public class NCIdlParser extends Parser {
 			case MULT:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(321);
+				setState(348);
 				minMaxShortcut();
 				}
 				break;
 			case LBR:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(322);
+				setState(349);
 				minMaxRange();
 				}
 				break;
@@ -2484,12 +2662,12 @@ public class NCIdlParser extends Parser {
 
 	public final MinMaxShortcutContext minMaxShortcut() throws RecognitionException {
 		MinMaxShortcutContext _localctx = new MinMaxShortcutContext(_ctx, getState());
-		enterRule(_localctx, 64, RULE_minMaxShortcut);
+		enterRule(_localctx, 68, RULE_minMaxShortcut);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(325);
+			setState(352);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PLUS) | (1L << QUESTION) | (1L << MULT))) != 0)) ) {
 			_errHandler.recoverInline(this);
@@ -2536,19 +2714,19 @@ public class NCIdlParser extends Parser {
 
 	public final MinMaxRangeContext minMaxRange() throws RecognitionException {
 		MinMaxRangeContext _localctx = new MinMaxRangeContext(_ctx, getState());
-		enterRule(_localctx, 66, RULE_minMaxRange);
+		enterRule(_localctx, 70, RULE_minMaxRange);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(327);
+			setState(354);
 			match(LBR);
-			setState(328);
+			setState(355);
 			match(INT);
-			setState(329);
+			setState(356);
 			match(COMMA);
-			setState(330);
+			setState(357);
 			match(INT);
-			setState(331);
+			setState(358);
 			match(RBR);
 			}
 		}
@@ -2582,12 +2760,12 @@ public class NCIdlParser extends Parser {
 
 	public final IdContext id() throws RecognitionException {
 		IdContext _localctx = new IdContext(_ctx, getState());
-		enterRule(_localctx, 68, RULE_id);
+		enterRule(_localctx, 72, RULE_id);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(333);
+			setState(360);
 			_la = _input.LA(1);
 			if ( !(_la==FUN_NAME || _la==ID) ) {
 			_errHandler.recoverInline(this);
@@ -2613,26 +2791,28 @@ public class NCIdlParser extends Parser {
 	public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
 		switch (ruleIndex) {
 		case 3:
-			return idlItems_sempred((IdlItemsContext)_localctx, predIndex);
+			return idlDecls_sempred((IdlDeclsContext)_localctx, predIndex);
 		case 20:
-			return terms_sempred((TermsContext)_localctx, predIndex);
+			return termDecls_sempred((TermDeclsContext)_localctx, predIndex);
 		case 25:
 			return javaFqn_sempred((JavaFqnContext)_localctx, predIndex);
 		case 27:
 			return expr_sempred((ExprContext)_localctx, predIndex);
 		case 28:
+			return vars_sempred((VarsContext)_localctx, predIndex);
+		case 30:
 			return paramList_sempred((ParamListContext)_localctx, predIndex);
 		}
 		return true;
 	}
-	private boolean idlItems_sempred(IdlItemsContext _localctx, int predIndex) {
+	private boolean idlDecls_sempred(IdlDeclsContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 0:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
-	private boolean terms_sempred(TermsContext _localctx, int predIndex) {
+	private boolean termDecls_sempred(TermDeclsContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 1:
 			return precpred(_ctx, 1);
@@ -2649,143 +2829,161 @@ public class NCIdlParser extends Parser {
 	private boolean expr_sempred(ExprContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 3:
-			return precpred(_ctx, 7);
+			return precpred(_ctx, 8);
 		case 4:
-			return precpred(_ctx, 6);
+			return precpred(_ctx, 7);
 		case 5:
-			return precpred(_ctx, 5);
+			return precpred(_ctx, 6);
 		case 6:
-			return precpred(_ctx, 4);
+			return precpred(_ctx, 5);
 		case 7:
-			return precpred(_ctx, 3);
+			return precpred(_ctx, 4);
 		}
 		return true;
 	}
-	private boolean paramList_sempred(ParamListContext _localctx, int predIndex) {
+	private boolean vars_sempred(VarsContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 8:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
+	private boolean paramList_sempred(ParamListContext _localctx, int predIndex) {
+		switch (predIndex) {
+		case 9:
+			return precpred(_ctx, 1);
+		}
+		return true;
+	}
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\65\u0152\4\2\t\2"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\66\u016d\4\2\t\2"+
 		"\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
 		"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
 		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
-		"\t!\4\"\t\"\4#\t#\4$\t$\3\2\3\2\3\2\3\3\5\3M\n\3\3\3\3\3\3\3\3\3\3\3\3"+
-		"\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\7\5]\n\5\f\5\16\5`\13\5\3\6\3\6\3\6"+
-		"\5\6e\n\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n"+
-		"\3\n\5\nw\n\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\5\f\u0080\n\f\3\f\5\f\u0083"+
-		"\n\f\3\f\5\f\u0086\n\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17"+
-		"\3\17\3\17\3\17\3\20\3\20\3\20\3\20\5\20\u009a\n\20\3\21\3\21\3\21\3\21"+
-		"\3\22\3\22\3\22\3\22\7\22\u00a4\n\22\f\22\16\22\u00a7\13\22\3\22\3\22"+
-		"\3\22\3\22\5\22\u00ad\n\22\3\23\3\23\3\23\3\23\3\24\3\24\5\24\u00b5\n"+
-		"\24\3\24\3\24\5\24\u00b9\n\24\3\24\5\24\u00bc\n\24\3\24\3\24\3\24\3\24"+
-		"\5\24\u00c2\n\24\3\25\3\25\3\25\3\25\7\25\u00c8\n\25\f\25\16\25\u00cb"+
-		"\13\25\3\25\3\25\3\25\3\25\5\25\u00d1\n\25\3\26\3\26\3\26\3\26\3\26\7"+
-		"\26\u00d8\n\26\f\26\16\26\u00db\13\26\3\27\3\27\5\27\u00df\n\27\3\30\3"+
-		"\30\3\31\3\31\5\31\u00e5\n\31\3\31\3\31\3\31\3\31\3\31\3\31\5\31\u00ed"+
-		"\n\31\3\31\5\31\u00f0\n\31\3\32\5\32\u00f3\n\32\3\32\3\32\3\32\3\33\3"+
-		"\33\3\33\3\33\3\33\3\33\7\33\u00fe\n\33\f\33\16\33\u0101\13\33\3\34\3"+
-		"\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5"+
-		"\35\u0112\n\35\3\35\5\35\u0115\n\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
-		"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\7\35\u0126\n\35\f\35\16\35\u0129"+
-		"\13\35\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0131\n\36\f\36\16\36\u0134"+
-		"\13\36\3\37\3\37\3\37\5\37\u0139\n\37\3\37\5\37\u013c\n\37\3\37\3\37\5"+
-		"\37\u0140\n\37\3 \3 \3!\3!\5!\u0146\n!\3\"\3\"\3#\3#\3#\3#\3#\3#\3$\3"+
-		"$\3$\2\7\b*\648:%\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62"+
-		"\64\668:<>@BDF\2\f\4\2\37\37((\4\2\30\30%%\3\2+-\4\2%%))\3\2\21\24\3\2"+
-		"\17\20\3\2\25\26\3\2\13\f\3\2)+\4\2\t\t\62\62\2\u015a\2H\3\2\2\2\4L\3"+
-		"\2\2\2\6S\3\2\2\2\bW\3\2\2\2\nd\3\2\2\2\ff\3\2\2\2\16k\3\2\2\2\20n\3\2"+
-		"\2\2\22r\3\2\2\2\24z\3\2\2\2\26}\3\2\2\2\30\u0089\3\2\2\2\32\u008d\3\2"+
-		"\2\2\34\u0091\3\2\2\2\36\u0095\3\2\2\2 \u009b\3\2\2\2\"\u00ac\3\2\2\2"+
-		"$\u00ae\3\2\2\2&\u00c1\3\2\2\2(\u00d0\3\2\2\2*\u00d2\3\2\2\2,\u00de\3"+
-		"\2\2\2.\u00e0\3\2\2\2\60\u00e2\3\2\2\2\62\u00f2\3\2\2\2\64\u00f7\3\2\2"+
-		"\2\66\u0102\3\2\2\28\u0114\3\2\2\2:\u012a\3\2\2\2<\u013f\3\2\2\2>\u0141"+
-		"\3\2\2\2@\u0145\3\2\2\2B\u0147\3\2\2\2D\u0149\3\2\2\2F\u014f\3\2\2\2H"+
-		"I\5\b\5\2IJ\7\2\2\3J\3\3\2\2\2KM\5\6\4\2LK\3\2\2\2LM\3\2\2\2MN\3\2\2\2"+
-		"NO\7\33\2\2OP\58\35\2PQ\7\34\2\2QR\7\2\2\3R\5\3\2\2\2ST\7 \2\2TU\5F$\2"+
-		"UV\7!\2\2V\7\3\2\2\2WX\b\5\1\2XY\5\n\6\2Y^\3\2\2\2Z[\f\3\2\2[]\5\n\6\2"+
-		"\\Z\3\2\2\2]`\3\2\2\2^\\\3\2\2\2^_\3\2\2\2_\t\3\2\2\2`^\3\2\2\2ae\5\26"+
-		"\f\2be\5\16\b\2ce\5\f\7\2da\3\2\2\2db\3\2\2\2dc\3\2\2\2e\13\3\2\2\2fg"+
-		"\7\3\2\2gh\7\31\2\2hi\5> \2ij\7\32\2\2j\r\3\2\2\2kl\5\20\t\2lm\5*\26\2"+
-		"m\17\3\2\2\2no\7\n\2\2op\7(\2\2pq\5F$\2q\21\3\2\2\2rs\7\n\2\2st\7\31\2"+
-		"\2tv\5F$\2uw\5\24\13\2vu\3\2\2\2vw\3\2\2\2wx\3\2\2\2xy\7\32\2\2y\23\3"+
-		"\2\2\2z{\7#\2\2{|\5\"\22\2|\25\3\2\2\2}\177\5\30\r\2~\u0080\5\32\16\2"+
-		"\177~\3\2\2\2\177\u0080\3\2\2\2\u0080\u0082\3\2\2\2\u0081\u0083\5\36\20"+
-		"\2\u0082\u0081\3\2\2\2\u0082\u0083\3\2\2\2\u0083\u0085\3\2\2\2\u0084\u0086"+
-		"\5 \21\2\u0085\u0084\3\2\2\2\u0085\u0086\3\2\2\2\u0086\u0087\3\2\2\2\u0087"+
-		"\u0088\5*\26\2\u0088\27\3\2\2\2\u0089\u008a\7\4\2\2\u008a\u008b\7(\2\2"+
-		"\u008b\u008c\5F$\2\u008c\31\3\2\2\2\u008d\u008e\7\5\2\2\u008e\u008f\7"+
-		"(\2\2\u008f\u0090\7\r\2\2\u0090\33\3\2\2\2\u0091\u0092\7,\2\2\u0092\u0093"+
-		"\5\62\32\2\u0093\u0094\7,\2\2\u0094\35\3\2\2\2\u0095\u0096\7\6\2\2\u0096"+
-		"\u0099\7(\2\2\u0097\u009a\5> \2\u0098\u009a\5\34\17\2\u0099\u0097\3\2"+
-		"\2\2\u0099\u0098\3\2\2\2\u009a\37\3\2\2\2\u009b\u009c\7\7\2\2\u009c\u009d"+
-		"\7(\2\2\u009d\u009e\5\"\22\2\u009e!\3\2\2\2\u009f\u00a0\7\33\2\2\u00a0"+
-		"\u00a5\5$\23\2\u00a1\u00a2\7#\2\2\u00a2\u00a4\5$\23\2\u00a3\u00a1\3\2"+
-		"\2\2\u00a4\u00a7\3\2\2\2\u00a5\u00a3\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6"+
-		"\u00a8\3\2\2\2\u00a7\u00a5\3\2\2\2\u00a8\u00a9\7\34\2\2\u00a9\u00ad\3"+
-		"\2\2\2\u00aa\u00ab\7\33\2\2\u00ab\u00ad\7\34\2\2\u00ac\u009f\3\2\2\2\u00ac"+
-		"\u00aa\3\2\2\2\u00ad#\3\2\2\2\u00ae\u00af\5> \2\u00af\u00b0\7$\2\2\u00b0"+
-		"\u00b1\5&\24\2\u00b1%\3\2\2\2\u00b2\u00c2\5> \2\u00b3\u00b5\7%\2\2\u00b4"+
-		"\u00b3\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8\7/"+
-		"\2\2\u00b7\u00b9\7\60\2\2\u00b8\u00b7\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9"+
-		"\u00bb\3\2\2\2\u00ba\u00bc\7\61\2\2\u00bb\u00ba\3\2\2\2\u00bb\u00bc\3"+
-		"\2\2\2\u00bc\u00c2\3\2\2\2\u00bd\u00c2\5\"\22\2\u00be\u00c2\5(\25\2\u00bf"+
-		"\u00c2\7\r\2\2\u00c0\u00c2\7\16\2\2\u00c1\u00b2\3\2\2\2\u00c1\u00b4\3"+
-		"\2\2\2\u00c1\u00bd\3\2\2\2\u00c1\u00be\3\2\2\2\u00c1\u00bf\3\2\2\2\u00c1"+
-		"\u00c0\3\2\2\2\u00c2\'\3\2\2\2\u00c3\u00c4\7 \2\2\u00c4\u00c9\5&\24\2"+
-		"\u00c5\u00c6\7#\2\2\u00c6\u00c8\5&\24\2\u00c7\u00c5\3\2\2\2\u00c8\u00cb"+
-		"\3\2\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cc\3\2\2\2\u00cb"+
-		"\u00c9\3\2\2\2\u00cc\u00cd\7!\2\2\u00cd\u00d1\3\2\2\2\u00ce\u00cf\7 \2"+
-		"\2\u00cf\u00d1\7!\2\2\u00d0\u00c3\3\2\2\2\u00d0\u00ce\3\2\2\2\u00d1)\3"+
-		"\2\2\2\u00d2\u00d3\b\26\1\2\u00d3\u00d4\5,\27\2\u00d4\u00d9\3\2\2\2\u00d5"+
-		"\u00d6\f\3\2\2\u00d6\u00d8\5,\27\2\u00d7\u00d5\3\2\2\2\u00d8\u00db\3\2"+
-		"\2\2\u00d9\u00d7\3\2\2\2\u00d9\u00da\3\2\2\2\u00da+\3\2\2\2\u00db\u00d9"+
-		"\3\2\2\2\u00dc\u00df\5\60\31\2\u00dd\u00df\5\22\n\2\u00de\u00dc\3\2\2"+
-		"\2\u00de\u00dd\3\2\2\2\u00df-\3\2\2\2\u00e0\u00e1\t\2\2\2\u00e1/\3\2\2"+
-		"\2\u00e2\u00e4\7\b\2\2\u00e3\u00e5\5\66\34\2\u00e4\u00e3\3\2\2\2\u00e4"+
-		"\u00e5\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u00ec\5.\30\2\u00e7\u00e8\7\33"+
-		"\2\2\u00e8\u00e9\58\35\2\u00e9\u00ea\7\34\2\2\u00ea\u00ed\3\2\2\2\u00eb"+
-		"\u00ed\5\34\17\2\u00ec\u00e7\3\2\2\2\u00ec\u00eb\3\2\2\2\u00ed\u00ef\3"+
-		"\2\2\2\u00ee\u00f0\5@!\2\u00ef\u00ee\3\2\2\2\u00ef\u00f0\3\2\2\2\u00f0"+
-		"\61\3\2\2\2\u00f1\u00f3\5\64\33\2\u00f2\u00f1\3\2\2\2\u00f2\u00f3\3\2"+
-		"\2\2\u00f3\u00f4\3\2\2\2\u00f4\u00f5\7\"\2\2\u00f5\u00f6\5F$\2\u00f6\63"+
-		"\3\2\2\2\u00f7\u00f8\b\33\1\2\u00f8\u00f9\5F$\2\u00f9\u00ff\3\2\2\2\u00fa"+
-		"\u00fb\f\3\2\2\u00fb\u00fc\7&\2\2\u00fc\u00fe\5F$\2\u00fd\u00fa\3\2\2"+
-		"\2\u00fe\u0101\3\2\2\2\u00ff\u00fd\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\65"+
-		"\3\2\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\7\31\2\2\u0103\u0104\5F$\2\u0104"+
-		"\u0105\7\32\2\2\u0105\67\3\2\2\2\u0106\u0107\b\35\1\2\u0107\u0108\t\3"+
-		"\2\2\u0108\u0115\58\35\13\u0109\u010a\7\31\2\2\u010a\u010b\58\35\2\u010b"+
-		"\u010c\7\32\2\2\u010c\u0115\3\2\2\2\u010d\u0115\5<\37\2\u010e\u010f\7"+
-		"\t\2\2\u010f\u0111\7\31\2\2\u0110\u0112\5:\36\2\u0111\u0110\3\2\2\2\u0111"+
-		"\u0112\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0115\7\32\2\2\u0114\u0106\3"+
-		"\2\2\2\u0114\u0109\3\2\2\2\u0114\u010d\3\2\2\2\u0114\u010e\3\2\2\2\u0115"+
-		"\u0127\3\2\2\2\u0116\u0117\f\t\2\2\u0117\u0118\t\4\2\2\u0118\u0126\58"+
-		"\35\n\u0119\u011a\f\b\2\2\u011a\u011b\t\5\2\2\u011b\u0126\58\35\t\u011c"+
-		"\u011d\f\7\2\2\u011d\u011e\t\6\2\2\u011e\u0126\58\35\b\u011f\u0120\f\6"+
-		"\2\2\u0120\u0121\t\7\2\2\u0121\u0126\58\35\7\u0122\u0123\f\5\2\2\u0123"+
-		"\u0124\t\b\2\2\u0124\u0126\58\35\6\u0125\u0116\3\2\2\2\u0125\u0119\3\2"+
-		"\2\2\u0125\u011c\3\2\2\2\u0125\u011f\3\2\2\2\u0125\u0122\3\2\2\2\u0126"+
-		"\u0129\3\2\2\2\u0127\u0125\3\2\2\2\u0127\u0128\3\2\2\2\u01289\3\2\2\2"+
-		"\u0129\u0127\3\2\2\2\u012a\u012b\b\36\1\2\u012b\u012c\58\35\2\u012c\u0132"+
-		"\3\2\2\2\u012d\u012e\f\3\2\2\u012e\u012f\7#\2\2\u012f\u0131\58\35\2\u0130"+
-		"\u012d\3\2\2\2\u0131\u0134\3\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2"+
-		"\2\2\u0133;\3\2\2\2\u0134\u0132\3\2\2\2\u0135\u0140\7\16\2\2\u0136\u0138"+
-		"\7/\2\2\u0137\u0139\7\60\2\2\u0138\u0137\3\2\2\2\u0138\u0139\3\2\2\2\u0139"+
-		"\u013b\3\2\2\2\u013a\u013c\7\61\2\2\u013b\u013a\3\2\2\2\u013b\u013c\3"+
-		"\2\2\2\u013c\u0140\3\2\2\2\u013d\u0140\7\r\2\2\u013e\u0140\5> \2\u013f"+
-		"\u0135\3\2\2\2\u013f\u0136\3\2\2\2\u013f\u013d\3\2\2\2\u013f\u013e\3\2"+
-		"\2\2\u0140=\3\2\2\2\u0141\u0142\t\t\2\2\u0142?\3\2\2\2\u0143\u0146\5B"+
-		"\"\2\u0144\u0146\5D#\2\u0145\u0143\3\2\2\2\u0145\u0144\3\2\2\2\u0146A"+
-		"\3\2\2\2\u0147\u0148\t\n\2\2\u0148C\3\2\2\2\u0149\u014a\7 \2\2\u014a\u014b"+
-		"\7/\2\2\u014b\u014c\7#\2\2\u014c\u014d\7/\2\2\u014d\u014e\7!\2\2\u014e"+
-		"E\3\2\2\2\u014f\u0150\t\13\2\2\u0150G\3\2\2\2\"L^dv\177\u0082\u0085\u0099"+
-		"\u00a5\u00ac\u00b4\u00b8\u00bb\u00c1\u00c9\u00d0\u00d9\u00de\u00e4\u00ec"+
-		"\u00ef\u00f2\u00ff\u0111\u0114\u0125\u0127\u0132\u0138\u013b\u013f\u0145";
+		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\3\2\3\2\3\2\3\3\5\3Q\n\3\3\3\3\3\5"+
+		"\3U\n\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\7\5d\n\5\f"+
+		"\5\16\5g\13\5\3\6\3\6\3\6\5\6l\n\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\t"+
+		"\3\t\3\t\3\t\3\n\3\n\3\n\3\n\5\n~\n\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\5"+
+		"\f\u0087\n\f\3\f\5\f\u008a\n\f\3\f\5\f\u008d\n\f\3\f\3\f\3\r\3\r\3\r\3"+
+		"\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\5\20\u00a1"+
+		"\n\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\7\22\u00ab\n\22\f\22\16"+
+		"\22\u00ae\13\22\3\22\3\22\3\22\3\22\5\22\u00b4\n\22\3\23\3\23\3\23\3\23"+
+		"\3\24\3\24\5\24\u00bc\n\24\3\24\3\24\5\24\u00c0\n\24\3\24\5\24\u00c3\n"+
+		"\24\3\24\3\24\3\24\3\24\5\24\u00c9\n\24\3\25\3\25\3\25\3\25\7\25\u00cf"+
+		"\n\25\f\25\16\25\u00d2\13\25\3\25\3\25\3\25\3\25\5\25\u00d8\n\25\3\26"+
+		"\3\26\3\26\3\26\3\26\7\26\u00df\n\26\f\26\16\26\u00e2\13\26\3\27\3\27"+
+		"\5\27\u00e6\n\27\3\30\3\30\3\31\3\31\5\31\u00ec\n\31\3\31\3\31\3\31\5"+
+		"\31\u00f1\n\31\3\31\3\31\3\31\3\31\5\31\u00f7\n\31\3\31\5\31\u00fa\n\31"+
+		"\3\32\5\32\u00fd\n\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\7\33"+
+		"\u0108\n\33\f\33\16\33\u010b\13\33\3\34\3\34\3\34\3\34\3\35\3\35\3\35"+
+		"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u011c\n\35\3\35\3\35\3\35"+
+		"\5\35\u0121\n\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
+		"\3\35\3\35\3\35\3\35\7\35\u0132\n\35\f\35\16\35\u0135\13\35\3\36\3\36"+
+		"\3\36\3\36\3\36\7\36\u013c\n\36\f\36\16\36\u013f\13\36\3\37\3\37\3\37"+
+		"\3\37\3\37\3 \3 \3 \3 \3 \3 \7 \u014c\n \f \16 \u014f\13 \3!\3!\3!\5!"+
+		"\u0154\n!\3!\5!\u0157\n!\3!\3!\5!\u015b\n!\3\"\3\"\3#\3#\5#\u0161\n#\3"+
+		"$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3&\2\b\b*\648:>\'\2\4\6\b\n\f\16\20\22\24"+
+		"\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJ\2\f\4\2\37\37((\4\2\30"+
+		"\30%%\3\2+-\4\2%%))\3\2\21\24\3\2\17\20\3\2\25\26\3\2\13\f\3\2)+\4\2\t"+
+		"\t\63\63\2\u0177\2L\3\2\2\2\4P\3\2\2\2\6Z\3\2\2\2\b^\3\2\2\2\nk\3\2\2"+
+		"\2\fm\3\2\2\2\16r\3\2\2\2\20u\3\2\2\2\22y\3\2\2\2\24\u0081\3\2\2\2\26"+
+		"\u0084\3\2\2\2\30\u0090\3\2\2\2\32\u0094\3\2\2\2\34\u0098\3\2\2\2\36\u009c"+
+		"\3\2\2\2 \u00a2\3\2\2\2\"\u00b3\3\2\2\2$\u00b5\3\2\2\2&\u00c8\3\2\2\2"+
+		"(\u00d7\3\2\2\2*\u00d9\3\2\2\2,\u00e5\3\2\2\2.\u00e7\3\2\2\2\60\u00e9"+
+		"\3\2\2\2\62\u00fc\3\2\2\2\64\u0101\3\2\2\2\66\u010c\3\2\2\28\u0120\3\2"+
+		"\2\2:\u0136\3\2\2\2<\u0140\3\2\2\2>\u0145\3\2\2\2@\u015a\3\2\2\2B\u015c"+
+		"\3\2\2\2D\u0160\3\2\2\2F\u0162\3\2\2\2H\u0164\3\2\2\2J\u016a\3\2\2\2L"+
+		"M\5\b\5\2MN\7\2\2\3N\3\3\2\2\2OQ\5\6\4\2PO\3\2\2\2PQ\3\2\2\2QR\3\2\2\2"+
+		"RT\7\33\2\2SU\5:\36\2TS\3\2\2\2TU\3\2\2\2UV\3\2\2\2VW\58\35\2WX\7\34\2"+
+		"\2XY\7\2\2\3Y\5\3\2\2\2Z[\7 \2\2[\\\5J&\2\\]\7!\2\2]\7\3\2\2\2^_\b\5\1"+
+		"\2_`\5\n\6\2`e\3\2\2\2ab\f\3\2\2bd\5\n\6\2ca\3\2\2\2dg\3\2\2\2ec\3\2\2"+
+		"\2ef\3\2\2\2f\t\3\2\2\2ge\3\2\2\2hl\5\26\f\2il\5\16\b\2jl\5\f\7\2kh\3"+
+		"\2\2\2ki\3\2\2\2kj\3\2\2\2l\13\3\2\2\2mn\7\3\2\2no\7\31\2\2op\5B\"\2p"+
+		"q\7\32\2\2q\r\3\2\2\2rs\5\20\t\2st\5*\26\2t\17\3\2\2\2uv\7\n\2\2vw\7("+
+		"\2\2wx\5J&\2x\21\3\2\2\2yz\7\n\2\2z{\7\31\2\2{}\5J&\2|~\5\24\13\2}|\3"+
+		"\2\2\2}~\3\2\2\2~\177\3\2\2\2\177\u0080\7\32\2\2\u0080\23\3\2\2\2\u0081"+
+		"\u0082\7#\2\2\u0082\u0083\5\"\22\2\u0083\25\3\2\2\2\u0084\u0086\5\30\r"+
+		"\2\u0085\u0087\5\32\16\2\u0086\u0085\3\2\2\2\u0086\u0087\3\2\2\2\u0087"+
+		"\u0089\3\2\2\2\u0088\u008a\5\36\20\2\u0089\u0088\3\2\2\2\u0089\u008a\3"+
+		"\2\2\2\u008a\u008c\3\2\2\2\u008b\u008d\5 \21\2\u008c\u008b\3\2\2\2\u008c"+
+		"\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f\5*\26\2\u008f\27\3\2\2"+
+		"\2\u0090\u0091\7\4\2\2\u0091\u0092\7(\2\2\u0092\u0093\5J&\2\u0093\31\3"+
+		"\2\2\2\u0094\u0095\7\5\2\2\u0095\u0096\7(\2\2\u0096\u0097\7\r\2\2\u0097"+
+		"\33\3\2\2\2\u0098\u0099\7,\2\2\u0099\u009a\5\62\32\2\u009a\u009b\7,\2"+
+		"\2\u009b\35\3\2\2\2\u009c\u009d\7\6\2\2\u009d\u00a0\7(\2\2\u009e\u00a1"+
+		"\5B\"\2\u009f\u00a1\5\34\17\2\u00a0\u009e\3\2\2\2\u00a0\u009f\3\2\2\2"+
+		"\u00a1\37\3\2\2\2\u00a2\u00a3\7\7\2\2\u00a3\u00a4\7(\2\2\u00a4\u00a5\5"+
+		"\"\22\2\u00a5!\3\2\2\2\u00a6\u00a7\7\33\2\2\u00a7\u00ac\5$\23\2\u00a8"+
+		"\u00a9\7#\2\2\u00a9\u00ab\5$\23\2\u00aa\u00a8\3\2\2\2\u00ab\u00ae\3\2"+
+		"\2\2\u00ac\u00aa\3\2\2\2\u00ac\u00ad\3\2\2\2\u00ad\u00af\3\2\2\2\u00ae"+
+		"\u00ac\3\2\2\2\u00af\u00b0\7\34\2\2\u00b0\u00b4\3\2\2\2\u00b1\u00b2\7"+
+		"\33\2\2\u00b2\u00b4\7\34\2\2\u00b3\u00a6\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4"+
+		"#\3\2\2\2\u00b5\u00b6\5B\"\2\u00b6\u00b7\7$\2\2\u00b7\u00b8\5&\24\2\u00b8"+
+		"%\3\2\2\2\u00b9\u00c9\5B\"\2\u00ba\u00bc\7%\2\2\u00bb\u00ba\3\2\2\2\u00bb"+
+		"\u00bc\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\u00bf\7\60\2\2\u00be\u00c0\7"+
+		"\61\2\2\u00bf\u00be\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c2\3\2\2\2\u00c1"+
+		"\u00c3\7\62\2\2\u00c2\u00c1\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3\u00c9\3"+
+		"\2\2\2\u00c4\u00c9\5\"\22\2\u00c5\u00c9\5(\25\2\u00c6\u00c9\7\r\2\2\u00c7"+
+		"\u00c9\7\16\2\2\u00c8\u00b9\3\2\2\2\u00c8\u00bb\3\2\2\2\u00c8\u00c4\3"+
+		"\2\2\2\u00c8\u00c5\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c7\3\2\2\2\u00c9"+
+		"\'\3\2\2\2\u00ca\u00cb\7 \2\2\u00cb\u00d0\5&\24\2\u00cc\u00cd\7#\2\2\u00cd"+
+		"\u00cf\5&\24\2\u00ce\u00cc\3\2\2\2\u00cf\u00d2\3\2\2\2\u00d0\u00ce\3\2"+
+		"\2\2\u00d0\u00d1\3\2\2\2\u00d1\u00d3\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d3"+
+		"\u00d4\7!\2\2\u00d4\u00d8\3\2\2\2\u00d5\u00d6\7 \2\2\u00d6\u00d8\7!\2"+
+		"\2\u00d7\u00ca\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d8)\3\2\2\2\u00d9\u00da"+
+		"\b\26\1\2\u00da\u00db\5,\27\2\u00db\u00e0\3\2\2\2\u00dc\u00dd\f\3\2\2"+
+		"\u00dd\u00df\5,\27\2\u00de\u00dc\3\2\2\2\u00df\u00e2\3\2\2\2\u00e0\u00de"+
+		"\3\2\2\2\u00e0\u00e1\3\2\2\2\u00e1+\3\2\2\2\u00e2\u00e0\3\2\2\2\u00e3"+
+		"\u00e6\5\60\31\2\u00e4\u00e6\5\22\n\2\u00e5\u00e3\3\2\2\2\u00e5\u00e4"+
+		"\3\2\2\2\u00e6-\3\2\2\2\u00e7\u00e8\t\2\2\2\u00e8/\3\2\2\2\u00e9\u00eb"+
+		"\7\b\2\2\u00ea\u00ec\5\66\34\2\u00eb\u00ea\3\2\2\2\u00eb\u00ec\3\2\2\2"+
+		"\u00ec\u00ed\3\2\2\2\u00ed\u00f6\5.\30\2\u00ee\u00f0\7\33\2\2\u00ef\u00f1"+
+		"\5:\36\2\u00f0\u00ef\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2"+
+		"\u00f3\58\35\2\u00f3\u00f4\7\34\2\2\u00f4\u00f7\3\2\2\2\u00f5\u00f7\5"+
+		"\34\17\2\u00f6\u00ee\3\2\2\2\u00f6\u00f5\3\2\2\2\u00f7\u00f9\3\2\2\2\u00f8"+
+		"\u00fa\5D#\2\u00f9\u00f8\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\61\3\2\2\2"+
+		"\u00fb\u00fd\5\64\33\2\u00fc\u00fb\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00fe"+
+		"\3\2\2\2\u00fe\u00ff\7\"\2\2\u00ff\u0100\5J&\2\u0100\63\3\2\2\2\u0101"+
+		"\u0102\b\33\1\2\u0102\u0103\5J&\2\u0103\u0109\3\2\2\2\u0104\u0105\f\3"+
+		"\2\2\u0105\u0106\7&\2\2\u0106\u0108\5J&\2\u0107\u0104\3\2\2\2\u0108\u010b"+
+		"\3\2\2\2\u0109\u0107\3\2\2\2\u0109\u010a\3\2\2\2\u010a\65\3\2\2\2\u010b"+
+		"\u0109\3\2\2\2\u010c\u010d\7\31\2\2\u010d\u010e\5J&\2\u010e\u010f\7\32"+
+		"\2\2\u010f\67\3\2\2\2\u0110\u0111\b\35\1\2\u0111\u0112\t\3\2\2\u0112\u0121"+
+		"\58\35\f\u0113\u0114\7\31\2\2\u0114\u0115\58\35\2\u0115\u0116\7\32\2\2"+
+		"\u0116\u0121\3\2\2\2\u0117\u0121\5@!\2\u0118\u0119\7\t\2\2\u0119\u011b"+
+		"\7\31\2\2\u011a\u011c\5> \2\u011b\u011a\3\2\2\2\u011b\u011c\3\2\2\2\u011c"+
+		"\u011d\3\2\2\2\u011d\u0121\7\32\2\2\u011e\u011f\7.\2\2\u011f\u0121\5J"+
+		"&\2\u0120\u0110\3\2\2\2\u0120\u0113\3\2\2\2\u0120\u0117\3\2\2\2\u0120"+
+		"\u0118\3\2\2\2\u0120\u011e\3\2\2\2\u0121\u0133\3\2\2\2\u0122\u0123\f\n"+
+		"\2\2\u0123\u0124\t\4\2\2\u0124\u0132\58\35\13\u0125\u0126\f\t\2\2\u0126"+
+		"\u0127\t\5\2\2\u0127\u0132\58\35\n\u0128\u0129\f\b\2\2\u0129\u012a\t\6"+
+		"\2\2\u012a\u0132\58\35\t\u012b\u012c\f\7\2\2\u012c\u012d\t\7\2\2\u012d"+
+		"\u0132\58\35\b\u012e\u012f\f\6\2\2\u012f\u0130\t\b\2\2\u0130\u0132\58"+
+		"\35\7\u0131\u0122\3\2\2\2\u0131\u0125\3\2\2\2\u0131\u0128\3\2\2\2\u0131"+
+		"\u012b\3\2\2\2\u0131\u012e\3\2\2\2\u0132\u0135\3\2\2\2\u0133\u0131\3\2"+
+		"\2\2\u0133\u0134\3\2\2\2\u01349\3\2\2\2\u0135\u0133\3\2\2\2\u0136\u0137"+
+		"\b\36\1\2\u0137\u0138\5<\37\2\u0138\u013d\3\2\2\2\u0139\u013a\f\3\2\2"+
+		"\u013a\u013c\5<\37\2\u013b\u0139\3\2\2\2\u013c\u013f\3\2\2\2\u013d\u013b"+
+		"\3\2\2\2\u013d\u013e\3\2\2\2\u013e;\3\2\2\2\u013f\u013d\3\2\2\2\u0140"+
+		"\u0141\7.\2\2\u0141\u0142\5J&\2\u0142\u0143\7(\2\2\u0143\u0144\58\35\2"+
+		"\u0144=\3\2\2\2\u0145\u0146\b \1\2\u0146\u0147\58\35\2\u0147\u014d\3\2"+
+		"\2\2\u0148\u0149\f\3\2\2\u0149\u014a\7#\2\2\u014a\u014c\58\35\2\u014b"+
+		"\u0148\3\2\2\2\u014c\u014f\3\2\2\2\u014d\u014b\3\2\2\2\u014d\u014e\3\2"+
+		"\2\2\u014e?\3\2\2\2\u014f\u014d\3\2\2\2\u0150\u015b\7\16\2\2\u0151\u0153"+
+		"\7\60\2\2\u0152\u0154\7\61\2\2\u0153\u0152\3\2\2\2\u0153\u0154\3\2\2\2"+
+		"\u0154\u0156\3\2\2\2\u0155\u0157\7\62\2\2\u0156\u0155\3\2\2\2\u0156\u0157"+
+		"\3\2\2\2\u0157\u015b\3\2\2\2\u0158\u015b\7\r\2\2\u0159\u015b\5B\"\2\u015a"+
+		"\u0150\3\2\2\2\u015a\u0151\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u0159\3\2"+
+		"\2\2\u015bA\3\2\2\2\u015c\u015d\t\t\2\2\u015dC\3\2\2\2\u015e\u0161\5F"+
+		"$\2\u015f\u0161\5H%\2\u0160\u015e\3\2\2\2\u0160\u015f\3\2\2\2\u0161E\3"+
+		"\2\2\2\u0162\u0163\t\n\2\2\u0163G\3\2\2\2\u0164\u0165\7 \2\2\u0165\u0166"+
+		"\7\60\2\2\u0166\u0167\7#\2\2\u0167\u0168\7\60\2\2\u0168\u0169\7!\2\2\u0169"+
+		"I\3\2\2\2\u016a\u016b\t\13\2\2\u016bK\3\2\2\2%PTek}\u0086\u0089\u008c"+
+		"\u00a0\u00ac\u00b3\u00bb\u00bf\u00c2\u00c8\u00d0\u00d7\u00e0\u00e5\u00eb"+
+		"\u00f0\u00f6\u00f9\u00fc\u0109\u011b\u0120\u0131\u0133\u013d\u014d\u0153"+
+		"\u0156\u015a\u0160";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {

[incubator-nlpcraft] 07/08: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 8f2937c7fe1f88c18430689a3a1fa47a27c1831d
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 19:51:05 2021 -0700

    WIP.
---
 .../main/scala/org/apache/nlpcraft/model/NCTokenPredicateContext.java   | 2 +-
 .../main/scala/org/apache/nlpcraft/model/NCTokenPredicateResult.java    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateContext.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateContext.java
index 2841e23..1f45736 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateContext.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateContext.java
@@ -21,7 +21,7 @@ import java.util.Optional;
 
 /**
  * Context passed into custom user-defined token predicate. Custom token predicates can be used in
- * intent IDL.
+ * IDL.
  * <p>
  * Read full documentation in <a target=_ href="https://nlpcraft.apache.org/intent-matching.html">Intent Matching</a> section and review
  * <a target=_ href="https://github.com/apache/incubator-nlpcraft/tree/master/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/">examples</a>.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateResult.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateResult.java
index b6a3e17..07c3b99 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateResult.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCTokenPredicateResult.java
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.model;
 
 /**
- * Result value of user-defined token predicate. Token predicates can be used in intent IDL.
+ * Result value of user-defined token predicate. Token predicates can be used in IDL.
  * <p>
  * Read full documentation in <a target=_ href="https://nlpcraft.apache.org/intent-matching.html">Intent Matching</a> section and review
  * <a target=_ href="https://github.com/apache/incubator-nlpcraft/tree/master/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/">examples</a>.

[incubator-nlpcraft] 05/08: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit bb995591f3d339ab7d56fc84ef4ef33248709a10
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 19:17:05 2021 -0700

    WIP.
---
 .../scala/org/apache/nlpcraft/examples/alarm/intents.idl  |  7 ++++---
 .../nlpcraft/model/intent/compiler/NCIdlCompiler.scala    |  3 ++-
 .../model/intent/solver/NCIntentSolverEngine.scala        | 15 ++++++++-------
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
index f51d281..cb28dc4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
@@ -19,9 +19,10 @@
 fragment=buzz term~{id() == 'x:alarm'}
 fragment=when
     term(nums)~{
-        id() == 'nlpcraft:num' &&
-        meta_token('nlpcraft:num:unittype') == 'datetime' &&
-        meta_token('nlpcraft:num:isequalcondition') == true
+        @type = meta_token('nlpcraft:num:unittype')
+        @iseq = meta_token('nlpcraft:num:isequalcondition')
+
+        id() == 'nlpcraft:num' && @type == 'datetime' && @iseq == true
     }[0,7]
 
 // Intents
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
index 1dfc42b..c3613ee 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
@@ -135,7 +135,8 @@ object NCIdlCompiler extends LazyLogging {
                 throw newSyntaxError(s"Unknown variable: @$varName")(ctx)
 
             val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒
-                stack.push(() ⇒ idlCtx.vars(varName)(tok, idlCtx))
+                 stack.push(() ⇒
+                     idlCtx.vars(varName)(tok, idlCtx))
 
             expr += instr
         }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index e7ce6b3..b7675ca 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -26,7 +26,7 @@ import org.apache.nlpcraft.model.impl.NCTokenLogger
 import org.apache.nlpcraft.model.{NCContext, NCDialogFlowItem, NCIntentMatch, NCResult, NCToken}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
 import org.apache.nlpcraft.model.impl.NCTokenPimp._
-import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlIntent, NCIdlStackItem ⇒ Z, NCIdlTerm}
+import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlFunction, NCIdlIntent, NCIdlTerm, NCIdlStackItem ⇒ Z}
 
 import java.util.function.Function
 import scala.collection.JavaConverters._
@@ -490,15 +490,16 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             var lastTermMatch: TermMatch = null
             
             val x = ctx.getConversation.getMetadata
-
-            val termCtx = NCIdlContext(
-                intentMeta = intent.meta,
-                convMeta = if (x.isEmpty) Map.empty[String, Object] else x.asScala.toMap[String, Object],
-                req = ctx.getRequest
-            )
+            val convMeta = if (x.isEmpty) Map.empty[String, Object] else x.asScala.toMap[String, Object]
 
             // Check terms.
             for (term ← intent.terms if !abort) {
+                val termCtx = NCIdlContext(
+                    intentMeta = intent.meta,
+                    convMeta = convMeta,
+                    req = ctx.getRequest
+                )
+
                 solveTerm(
                     term,
                     termCtx,

[incubator-nlpcraft] 03/08: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit b32a3759fbd68299b51c751dc9f3bd74ef4bd3b8
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 18:46:22 2021 -0700

    WIP.
---
 .../nlpcraft/model/intent/NCIdlContext.scala       |   3 +-
 .../nlpcraft/model/intent/NCIdlFunction.scala      |   2 +-
 .../model/intent/{compiler => }/NCIdlStack.scala   |   2 +-
 .../nlpcraft/model/intent/NCIdlSynonym.scala       |   2 +-
 .../apache/nlpcraft/model/intent/NCIdlTerm.scala   |   4 +-
 .../model/intent/compiler/NCIdlCompiler.scala      |  66 +++---
 .../model/intent/compiler/NCIdlCompilerBase.scala  | 245 ++++++++++-----------
 .../model/intent/solver/NCIntentSolverEngine.scala |  12 +-
 .../nlpcraft/probe/mgrs/NCProbeSynonym.scala       |   2 +-
 9 files changed, 164 insertions(+), 174 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala
index 32fa895..c5b11ae 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlContext.scala
@@ -19,7 +19,6 @@ package org.apache.nlpcraft.model.intent
 
 import org.apache.nlpcraft.common.ScalaMeta
 import org.apache.nlpcraft.model.NCRequest
-import org.apache.nlpcraft.model.intent.compiler.NCIdlStackItem
 
 import scala.collection.mutable
 
@@ -36,6 +35,6 @@ case class NCIdlContext(
     convMeta: ScalaMeta = Map.empty[String, Object],
     fragMeta: ScalaMeta = Map.empty[String, Object],
     req: NCRequest,
-    vars: mutable.Map[String, NCIdlStackItem]
+    vars: mutable.Map[String, NCIdlFunction] = mutable.HashMap.empty[String, NCIdlFunction]
 )
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlFunction.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlFunction.scala
index a876960..da7e8a6 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlFunction.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlFunction.scala
@@ -22,4 +22,4 @@ import org.apache.nlpcraft.model.NCToken
 /**
  *
  */
-trait NCIdlFunction[T] extends ((NCToken, NCIdlContext) ⇒ (T , Int /* How many times a token was used. */ ))
+trait NCIdlFunction extends ((NCToken, NCIdlContext) ⇒ NCIdlStackItem)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlStack.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlStack.scala
similarity index 96%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlStack.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlStack.scala
index ba36546..60011fe 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlStack.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlStack.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.compiler
+package org.apache.nlpcraft.model.intent
 
 import scala.collection.mutable
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala
index c092801..14eaba9 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlSynonym.scala
@@ -26,7 +26,7 @@ package org.apache.nlpcraft.model.intent
 case class NCIdlSynonym(
     origin: String,
     alias: Option[String],
-    pred: NCIdlFunction[Boolean],
+    pred: NCIdlFunction,
 ) {
     require(origin != null)
     require(pred != null)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
index 8d33c1a..cdc8494 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
@@ -34,8 +34,8 @@ import org.apache.nlpcraft.common._
 case class NCIdlTerm(
     idl: String,
     id: Option[String],
-    decls: List[NCIdlFunction[Object]],
-    pred: NCIdlFunction[Boolean],
+    decls: List[NCIdlFunction],
+    pred: NCIdlFunction,
     min: Int,
     max: Int,
     conv: Boolean,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
index 356288f..a03ea3d 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
@@ -22,10 +22,10 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker
 import org.antlr.v4.runtime._
 import org.antlr.v4.runtime.{ParserRuleContext ⇒ PRC}
 import org.apache.nlpcraft.common._
-import org.apache.nlpcraft.model.intent.compiler.antlr4.{NCIdlBaseListener, NCIdlLexer, NCIdlParser, NCIdlParser ⇒ IDP}
+import org.apache.nlpcraft.model.intent.compiler.antlr4.{NCIdlBaseListener, NCIdlLexer, NCIdlParser ⇒ IDP}
 import org.apache.nlpcraft.model.intent.compiler.{NCIdlCompilerGlobal ⇒ Global}
 import org.apache.nlpcraft.model._
-import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlIntent, NCIdlSynonym, NCIdlTerm, NCIdlFunction}
+import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlFunction, NCIdlIntent, NCIdlStack, NCIdlStackItem ⇒ Z, NCIdlSynonym, NCIdlTerm}
 
 import java.io._
 import java.net._
@@ -71,7 +71,7 @@ object NCIdlCompiler extends LazyLogging {
         private val terms = ArrayBuffer.empty[NCIdlTerm]
 
         // Currently term.
-        private var vars = mutable.HashMap.empty[String, NCIdlFunction[Object]]
+        private var vars = mutable.HashMap.empty[String, NCIdlFunction]
         private var termId: String = _
         private var termConv: Boolean = _
         private var min = 1
@@ -82,7 +82,7 @@ object NCIdlCompiler extends LazyLogging {
         private var refMtdName: Option[String] = None
 
         // List of instructions for the current expression.
-        private var expr = mutable.Buffer.empty[I]
+        private var expr = mutable.Buffer.empty[SI]
 
 
         /**
@@ -128,30 +128,25 @@ object NCIdlCompiler extends LazyLogging {
             this.max = max
         }
 
-        override def exitVarRef(ctx: NCIdlParser.VarRefContext): Unit = {
+        override def exitVarRef(ctx: IDP.VarRefContext): Unit = {
+            val varName = ctx.id().getText
+
+            if (!vars.contains(varName))
+                throw newSyntaxError(s"Unknown variable: $varName")(ctx)
+
+            val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒
+                stack.push(() ⇒ idlCtx.vars(varName)(tok, idlCtx))
 
+            expr += instr
         }
 
-        override def exitVarDecl(ctx: NCIdlParser.VarDeclContext): Unit = {
+        override def exitVarDecl(ctx: IDP.VarDeclContext): Unit = {
             val varName = ctx.id().getText
 
             if (vars.contains(varName))
                 throw newSyntaxError(s"Duplicate variable: $varName")(ctx)
 
-            vars += varName
-
-            val fun = exprToFunction[Object]("Variable declaration", _ ⇒ true, x ⇒ x)(ctx)
-
-            val instr = (tok: NCToken, ctx: NCIdlContext) ⇒ {
-                val (res, tokUses) = fun(tok, ctx)
-
-                (null, 0)
-            }
-
-
-
-
-
+            vars += varName → exprToFunction("Variable declaration", _ ⇒ true)(ctx)
 
             expr.clear()
         }
@@ -207,14 +202,14 @@ object NCIdlCompiler extends LazyLogging {
         override def exitSynonym(ctx: IDP.SynonymContext): Unit = {
             implicit val evidence: PRC = ctx
 
-            val pred = exprToFunction("Synonym", isBool, asBool)
+            val pred = exprToFunction("Synonym", isBool)
             val capture = alias
-            val wrapper: NCIdlFunction[Boolean] = (tok: NCToken, ctx: NCIdlContext) ⇒ {
-                val (res, tokUses) = pred(tok, ctx)
+            val wrapper: NCIdlFunction = (tok: NCToken, ctx: NCIdlContext) ⇒ {
+                val Z(res, tokUses) = pred(tok, ctx)
 
                 // Store predicate's alias, if any, in token metadata if this token satisfies this predicate.
                 // NOTE: token can have multiple aliases associated with it.
-                if (res && capture != null) { // NOTE: we ignore 'tokUses' here on purpose.
+                if (asBool(res) && capture != null) { // NOTE: we ignore 'tokUses' here on purpose.
                     val meta = tok.getMetadata
 
                     if (!meta.containsKey(TOK_META_ALIASES_KEY))
@@ -225,7 +220,7 @@ object NCIdlCompiler extends LazyLogging {
                     aliases.add(capture)
                 }
 
-                (res, tokUses)
+                Z(res, tokUses)
             }
 
             synonym = NCIdlSynonym(origin, Option(alias), wrapper)
@@ -283,7 +278,7 @@ object NCIdlCompiler extends LazyLogging {
             if (max < 1)
                 throw newSyntaxError(s"Invalid intent term max quantifiers: $max (must be max >= 1).")(ctx.minMax())
 
-            val pred: NCIdlFunction[Boolean] = if (refMtdName.isDefined) { // User-code defined term.
+            val pred: NCIdlFunction = if (refMtdName.isDefined) { // User-code defined term.
                 // Closure copies.
                 val clsName = refClsName.orNull
                 val mtdName = refMtdName.orNull
@@ -309,7 +304,7 @@ object NCIdlCompiler extends LazyLogging {
                             javaCtx
                         )
 
-                        (res.getResult, res.getTokenUses)
+                        Z(res.getResult, res.getTokenUses)
                     }
                     catch {
                         case e: Exception ⇒
@@ -318,12 +313,13 @@ object NCIdlCompiler extends LazyLogging {
                 }
             }
             else  // IDL term.
-                exprToFunction("Intent term", isBool, asBool)(ctx.expr())
+                exprToFunction("Intent term", isBool)(ctx.expr())
 
             // Add term.
             terms += NCIdlTerm(
                 ctx.getText,
                 Option(termId),
+                vars.values.toList,
                 pred,
                 min,
                 max,
@@ -343,20 +339,17 @@ object NCIdlCompiler extends LazyLogging {
          *
          * @param subj
          * @param check
-         * @param cast
          * @param ctx
-         * @tparam T
          * @return
          */
-        private def exprToFunction[T](
+        private def exprToFunction(
             subj: String,
-            check: Object ⇒ Boolean,
-            cast: Object ⇒ T
+            check: Object ⇒ Boolean
         )
         (
             implicit ctx: PRC
-        ): NCIdlFunction[T] = {
-            val code = mutable.Buffer.empty[I]
+        ): NCIdlFunction = {
+            val code = mutable.Buffer.empty[SI]
 
             code ++= expr
 
@@ -370,10 +363,11 @@ object NCIdlCompiler extends LazyLogging {
                 val x = stack.pop()()
                 val v = x.value
 
+                // Check final value's type.
                 if (!check(v))
                     throw newRuntimeError(s"$subj returned value of unexpected type '$v' in: ${ctx.getText}")
 
-                (cast(v), x.tokUse)
+                Z(v, x.tokUse)
             }
         }
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
index ffe0257..826d6a2 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
@@ -23,8 +23,7 @@ import org.apache.nlpcraft.model.NCToken
 import org.antlr.v4.runtime.{ParserRuleContext ⇒ PRC}
 import org.antlr.v4.runtime.tree.{TerminalNode ⇒ TN}
 import org.apache.commons.collections.CollectionUtils
-import org.apache.nlpcraft.model.intent.NCIdlContext
-import org.apache.nlpcraft.model.intent.compiler.{NCIdlStackItem ⇒ Z}
+import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlStack, NCIdlStackItem ⇒ Z, NCIdlStackType}
 
 import java.lang.{Byte ⇒ JByte, Double ⇒ JDouble, Float ⇒ JFloat, Integer ⇒ JInt, Long ⇒ JLong, Number ⇒ JNumber, Short ⇒ JShort}
 import java.time.temporal.IsoFields
@@ -35,8 +34,8 @@ import scala.collection.JavaConverters._
 
 trait NCIdlCompilerBase {
     type S = NCIdlStack
-    type T = NCIdlStackType
-    type I = (NCToken, S, NCIdlContext) ⇒ Unit
+    type ST = NCIdlStackType
+    type SI = (NCToken, S, NCIdlContext) ⇒ Unit
 
     def syntaxError(errMsg: String, srcName: String, line: Int, pos: Int): NCE
     def runtimeError(errMsg: String, srcName: String, line: Int, pos: Int, cause: Exception = null): NCE
@@ -160,7 +159,7 @@ trait NCIdlCompilerBase {
      * @param stack
      * @return
      */
-    def pop1()(implicit stack: S, ctx: PRC): T = {
+    def pop1()(implicit stack: S, ctx: PRC): ST = {
         require(stack.nonEmpty, ctx.getText)
 
         stack.pop()
@@ -171,7 +170,7 @@ trait NCIdlCompilerBase {
      * @param stack
      * @return
      */
-    def pop2()(implicit stack: S, ctx: PRC): (T, T) = {
+    def pop2()(implicit stack: S, ctx: PRC): (ST, ST) = {
         require(stack.size >= 2, ctx.getText)
 
         // Stack pops in reverse order of push...
@@ -186,7 +185,7 @@ trait NCIdlCompilerBase {
      * @param stack
      * @return
      */
-    def pop3()(implicit stack: S, ctx: PRC): (T, T, T) = {
+    def pop3()(implicit stack: S, ctx: PRC): (ST, ST, ST) = {
         require(stack.size >= 3, ctx.getText)
 
         // Stack pops in reverse order of push...
@@ -204,13 +203,13 @@ trait NCIdlCompilerBase {
      * @param lteq
      * @param gteq
      */
-    def parseCompExpr(lt: TN, gt: TN, lteq: TN, gteq: TN)(implicit ctx: PRC): I = (_, stack: S, _) ⇒ {
+    def parseCompExpr(lt: TN, gt: TN, lteq: TN, gteq: TN)(implicit ctx: PRC): SI = (_, stack: S, _) ⇒ {
         val (x1, x2) = pop2()(stack, ctx)
 
         if (lt != null)
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v1, n1) = x1()
+                val Z(v2, n2) = x2()
 
                 val f =
                     if (isInt(v1) && isInt(v2)) asInt(v1) < asInt(v2)
@@ -224,8 +223,8 @@ trait NCIdlCompilerBase {
             })
         else if (gt != null)
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v1, n1) = x1()
+                val Z(v2, n2) = x2()
 
                 val f =
                     if (isInt(v1) && isInt(v2)) asInt(v1) > asInt(v2)
@@ -239,8 +238,8 @@ trait NCIdlCompilerBase {
             })
         else if (lteq != null)
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v1, n1) = x1()
+                val Z(v2, n2) = x2()
 
                 val f =
                     if (isInt(v1) && isInt(v2)) asInt(v1) <= asInt(v2)
@@ -256,8 +255,8 @@ trait NCIdlCompilerBase {
             require(gteq != null)
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v1, n1) = x1()
+                val Z(v2, n2) = x2()
 
                 val f =
                     if (isInt(v1) && isInt(v2)) asInt(v1) >= asInt(v2)
@@ -278,13 +277,13 @@ trait NCIdlCompilerBase {
      * @param mod
      * @param div
      */
-    def parseMultDivModExpr(mult: TN, mod: TN, div: TN)(implicit ctx: PRC): I = (_, stack: S, _) ⇒ {
+    def parseMultDivModExpr(mult: TN, mod: TN, div: TN)(implicit ctx: PRC): SI = (_, stack: S, _) ⇒ {
         val (x1, x2) = pop2()(stack, ctx)
 
         if (mult != null)
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v1, n1) = x1()
+                val Z(v2, n2) = x2()
 
                 val f =
                     if (isInt(v1) && isInt(v2)) asInt(v1) * asInt(v2)
@@ -298,8 +297,8 @@ trait NCIdlCompilerBase {
             })
         else if (mod != null)
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v1, n1) = x1()
+                val Z(v2, n2) = x2()
 
                 val f =
                     if (isInt(v1) && isInt(v2)) asInt(v1) % asInt(v2)
@@ -312,8 +311,8 @@ trait NCIdlCompilerBase {
             assert(div != null)
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v1, n1) = x1()
+                val Z(v2, n2) = x2()
 
                 val f =
                     if (isInt(v1) && isInt(v2)) asInt(v1) / asInt(v2)
@@ -334,13 +333,13 @@ trait NCIdlCompilerBase {
      * @param or
      * @return
      */
-    def parseAndOrExpr(and: TN, or: TN)(implicit ctx: PRC): I = (_, stack: S, _) ⇒ {
+    def parseAndOrExpr(and: TN, or: TN)(implicit ctx: PRC): SI = (_, stack: S, _) ⇒ {
         val (x1, x2) = pop2()(stack, ctx)
 
         stack.push(() ⇒ {
             val (op, flag) = if (and != null) ("&&", false) else ("||", true)
 
-            val NCIdlStackItem(v1, n1) = x1()
+            val Z(v1, n1) = x1()
 
             if (!isBool(v1))
                 throw rtBinaryOpError(op, v1, x2().value)
@@ -349,7 +348,7 @@ trait NCIdlCompilerBase {
             if (asBool(v1) == flag)
                 Z(flag, n1)
             else {
-                val NCIdlStackItem(v2, n2) = x2()
+                val Z(v2, n2) = x2()
 
                 if (!isBool(v2))
                     throw rtBinaryOpError(op, v2, v1)
@@ -365,7 +364,7 @@ trait NCIdlCompilerBase {
      * @param neq
      * @return
      */
-    def parseEqNeqExpr(eq: TN, neq: TN)(implicit ctx: PRC): I = (_, stack: S, _) ⇒ {
+    def parseEqNeqExpr(eq: TN, neq: TN)(implicit ctx: PRC): SI = (_, stack: S, _) ⇒ {
         val (x1, x2) = pop2()(stack, ctx)
 
         def doEq(op: String, v1: Object, v2: Object): Boolean = {
@@ -381,8 +380,8 @@ trait NCIdlCompilerBase {
         }
 
         stack.push(() ⇒ {
-            val NCIdlStackItem(v1, n1) = x1()
-            val NCIdlStackItem(v2, n2) = x2()
+            val Z(v1, n1) = x1()
+            val Z(v2, n2) = x2()
 
             val f =
                 if (eq != null)
@@ -402,12 +401,12 @@ trait NCIdlCompilerBase {
      * @param plus
      * @param minus
      */
-    def parsePlusMinusExpr(plus: TN, minus: TN)(implicit ctx: PRC): I = (_, stack: S, _) ⇒ {
+    def parsePlusMinusExpr(plus: TN, minus: TN)(implicit ctx: PRC): SI = (_, stack: S, _) ⇒ {
         val (x1, x2) = pop2()(stack, ctx)
 
         def extract(): (Object, Object, Int) = {
-            val NCIdlStackItem(v1, n1) = x1()
-            val NCIdlStackItem(v2, n2) = x2()
+            val Z(v1, n1) = x1()
+            val Z(v2, n2) = x2()
 
             (v1, v2, n1 + n2)
         }
@@ -448,12 +447,12 @@ trait NCIdlCompilerBase {
      * @param not
      * @return
      */
-    def parseUnaryExpr(minus: TN, not: TN)(implicit ctx: PRC): I = (_, stack: S, _) ⇒ {
+    def parseUnaryExpr(minus: TN, not: TN)(implicit ctx: PRC): SI = (_, stack: S, _) ⇒ {
         val x = pop1()(stack, ctx)
 
         if (minus != null)
             stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
 
                 val z =
                     if (isReal(v)) -asReal(v)
@@ -467,7 +466,7 @@ trait NCIdlCompilerBase {
             assert(not != null)
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
 
                 if (isBool(v)) Z(!asBool(v), n)
                 else
@@ -481,7 +480,7 @@ trait NCIdlCompilerBase {
      * @param txt
      * @return
      */
-    def parseAtom(txt: String)(implicit ctx: PRC): I = {
+    def parseAtom(txt: String)(implicit ctx: PRC): SI = {
         val atom =
             if (txt == "null") null // Try 'null'.
             else if (txt == "true") Boolean.box(true) // Try 'boolean'.
@@ -511,7 +510,7 @@ trait NCIdlCompilerBase {
      * @param id
      * @return
      */
-    def parseCallExpr(id: TN)(implicit ctx: PRC): I = (tok, stack: S, termCtx) ⇒ {
+    def parseCallExpr(id: TN)(implicit ctx: PRC): SI = (tok, stack: S, termCtx) ⇒ {
         implicit val evidence: S = stack
     
         val fun = id.getText
@@ -528,10 +527,10 @@ trait NCIdlCompilerBase {
             
             x
         }
-        def arg1(): T = arg(1, pop1)
-        def arg2(): (T, T) = arg(2, pop2)
-        def arg3(): (T, T, T) = arg(3, pop3)
-        def arg1Tok(): T =
+        def arg1(): ST = arg(1, pop1)
+        def arg2(): (ST, ST) = arg(2, pop2)
+        def arg3(): (ST, ST, ST) = arg(3, pop3)
+        def arg1Tok(): ST =
             if (stack.nonEmpty && stack.top == stack.PLIST_MARKER) {
                 popMarker()
             
@@ -557,8 +556,8 @@ trait NCIdlCompilerBase {
 
             stack.push(
                 () ⇒ {
-                    val NCIdlStackItem(v1, n1) = x1()
-                    val NCIdlStackItem(v2, n2) = x2()
+                    val Z(v1, n1) = x1()
+                    val Z(v2, n2) = x2()
 
                    Z(util.Arrays.asList(toStr(v1).split(toStr(v2))), n1 + n2)
                 }
@@ -570,8 +569,8 @@ trait NCIdlCompilerBase {
 
             stack.push(
                 () ⇒ {
-                    val NCIdlStackItem(v1, n1) = x1()
-                    val NCIdlStackItem(v2, n2) = x2()
+                    val Z(v1, n1) = x1()
+                    val Z(v2, n2) = x2()
 
                     Z(util.Arrays.asList(toStr(v1).split(toStr(v2)).toList.map(_.strip)), n1 + n2)
                 }
@@ -591,7 +590,7 @@ trait NCIdlCompilerBase {
                 var z = 0
 
                 dump.reverse.foreach { x ⇒
-                    val NCIdlStackItem(v, n) = x()
+                    val Z(v, n) = x()
 
                     z += n
 
@@ -606,7 +605,7 @@ trait NCIdlCompilerBase {
             val x = arg1()
             
             stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
         
                 val jl = toJList(v)
         
@@ -620,7 +619,7 @@ trait NCIdlCompilerBase {
             val x = arg1()
     
             stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
                 
                 val lst = toJList(v).asInstanceOf[util.List[Object]]
                 
@@ -639,7 +638,7 @@ trait NCIdlCompilerBase {
             val x = arg1()
         
             stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
             
                 val lst = toJList(v).asInstanceOf[util.List[Object]]
             
@@ -658,7 +657,7 @@ trait NCIdlCompilerBase {
             val x = arg1()
         
             stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
             
                 val jl = toJList(v)
                 
@@ -672,8 +671,8 @@ trait NCIdlCompilerBase {
             val (x1, x2) = arg2()
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(lst, n1) = x1()
-                val NCIdlStackItem(obj, n2) = x2()
+                val Z(lst, n1) = x1()
+                val Z(obj, n2) = x2()
 
                 Z(toJList(lst).contains(box(obj)), n1 + n2)
             })
@@ -683,8 +682,8 @@ trait NCIdlCompilerBase {
             val (x1, x2) = arg2()
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(lst1, n1) = x1()
-                val NCIdlStackItem(lst2, n2) = x2()
+                val Z(lst1, n1) = x1()
+                val Z(lst2, n2) = x2()
 
                 Z(toJList(lst1).containsAll(toJList(lst2)), n1 + n2)
             })
@@ -694,8 +693,8 @@ trait NCIdlCompilerBase {
             val (x1, x2) = arg2()
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(lst1, n1) = x1()
-                val NCIdlStackItem(lst2, n2) = x2()
+                val Z(lst1, n1) = x1()
+                val Z(lst2, n2) = x2()
 
                 Z(CollectionUtils.containsAny(toJList(lst1), toJList(lst2)), n1 + n2)
             })
@@ -705,8 +704,8 @@ trait NCIdlCompilerBase {
             val (x1, x2) = arg2()
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(col, n1) = x1()
-                val NCIdlStackItem(key, n2) = x2()
+                val Z(col, n1) = x1()
+                val Z(key, n2) = x2()
                 val n = n1 + n2
 
                 if (isJList(col)) {
@@ -724,7 +723,7 @@ trait NCIdlCompilerBase {
 
         def doAbs(): Unit = arg1() match {
             case x ⇒ stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
 
                 v match {
                     case a: JLong ⇒ Z(Math.abs(a), n)
@@ -736,7 +735,7 @@ trait NCIdlCompilerBase {
 
         def doSquare(): Unit = arg1() match {
             case x ⇒ stack.push(() ⇒ {
-                val NCIdlStackItem(v, n) = x()
+                val Z(v, n) = x()
 
                 v match {
                     case a: JLong ⇒ Z(a * a, n)
@@ -750,15 +749,15 @@ trait NCIdlCompilerBase {
             val (x1, x2, x3) = arg3()
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(v1, n1) = x1()
+                val Z(v1, n1) = x1()
 
                 if (toBool(v1)) {
-                    val NCIdlStackItem(v2, n2) = x2()
+                    val Z(v2, n2) = x2()
 
                     Z(v2, n1 + n2)
                 }
                 else {
-                    val NCIdlStackItem(v3, n3) = x3()
+                    val Z(v3, n3) = x3()
 
                     Z(v3, n1 + n3)
                 }
@@ -794,8 +793,8 @@ trait NCIdlCompilerBase {
             val (x1, x2) = arg2()
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(tok, n1) = x1()
-                val NCIdlStackItem(aliasId, n2) = x2() // Token alias or token ID.
+                val Z(tok, n1) = x1()
+                val Z(aliasId, n2) = x2() // Token alias or token ID.
 
                 Z(box(findPart(toToken(tok), toStr(aliasId))), n1 + n2)
             })
@@ -805,8 +804,8 @@ trait NCIdlCompilerBase {
             val (x1, x2) = arg2()
     
             stack.push(() ⇒ {
-                val NCIdlStackItem(aliasId, n1) = x1() // Token alias or token ID.
-                val NCIdlStackItem(key, n2) = x2()
+                val Z(aliasId, n1) = x1() // Token alias or token ID.
+                val Z(key, n2) = x2()
 
                 Z(box(findPart(tok, toStr(aliasId)).meta[Object](toStr(key))), n1 + n2)
             })
@@ -817,8 +816,8 @@ trait NCIdlCompilerBase {
             val (x1, x2) = arg2()
 
             stack.push(() ⇒ {
-                val NCIdlStackItem(t, n1) = x1()
-                val NCIdlStackItem(a, n2) = x2()
+                val Z(t, n1) = x1()
+                val Z(a, n2) = x2()
 
                 val tok = toToken(t)
                 val aliasId = toStr(a)
@@ -833,18 +832,18 @@ trait NCIdlCompilerBase {
         fun match {
             // Metadata access.
             case "meta_part" ⇒ doPartMeta()
-            case "meta_token" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(tok.meta[Object](toStr(v))), 1) })
-            case "meta_model" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(tok.getModel.meta[Object](toStr(v))), 0) })
-            case "meta_req" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(termCtx.req.getRequestData.get(toStr(v))), 0) })
-            case "meta_user" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(termCtx.req.getUser.meta(toStr(v))), 0) })
-            case "meta_company" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(termCtx.req.getCompany.meta(toStr(v))), 0) })
-            case "meta_intent" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(termCtx.intentMeta.get(toStr(v)).orNull), 0) })
-            case "meta_conv" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(termCtx.convMeta.get(toStr(v)).orNull), 0) })
-            case "meta_frag" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(box(termCtx.fragMeta.get(toStr(v)).orNull), f) })
-            case "meta_sys" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, _) = x(); Z(box(U.sysEnv(toStr(v)).orNull), 0) })
+            case "meta_token" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(tok.meta[Object](toStr(v))), 1) })
+            case "meta_model" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(tok.getModel.meta[Object](toStr(v))), 0) })
+            case "meta_req" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(termCtx.req.getRequestData.get(toStr(v))), 0) })
+            case "meta_user" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(termCtx.req.getUser.meta(toStr(v))), 0) })
+            case "meta_company" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(termCtx.req.getCompany.meta(toStr(v))), 0) })
+            case "meta_intent" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(termCtx.intentMeta.get(toStr(v)).orNull), 0) })
+            case "meta_conv" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(termCtx.convMeta.get(toStr(v)).orNull), 0) })
+            case "meta_frag" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(box(termCtx.fragMeta.get(toStr(v)).orNull), f) })
+            case "meta_sys" ⇒ z[ST](arg1, { x ⇒ val Z(v, _) = x(); Z(box(U.sysEnv(toStr(v)).orNull), 0) })
 
             // Converts JSON to map.
-            case "json" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(U.jsonToJavaMap(asStr(v)), f) })
+            case "json" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(U.jsonToJavaMap(asStr(v)), f) })
 
             // Inline if-statement.
             case "if" ⇒ doIf()
@@ -888,51 +887,51 @@ trait NCIdlCompilerBase {
             case "comp_postcode" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getPostalCode, 0))
 
             // String functions.
-            case "trim" | "strip" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(toStr(v).trim, f) })
-            case "uppercase" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(toStr(v).toUpperCase, f) })
-            case "lowercase" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(toStr(v).toLowerCase, f) })
-            case "is_alpha" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(StringUtils.isAlpha(toStr(v)), f) })
-            case "is_alphanum" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(StringUtils.isAlphanumeric(toStr(v)), f) })
-            case "is_whitespace" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(StringUtils.isWhitespace(toStr(v)), f) })
-            case "is_num" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(StringUtils.isNumeric(toStr(v)), f) })
-            case "is_numspace" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(StringUtils.isNumericSpace(toStr(v)), f) })
-            case "is_alphaspace" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(StringUtils.isAlphaSpace(toStr(v)), f) })
-            case "is_alphanumspace" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(StringUtils.isAlphanumericSpace(toStr(v)), f) })
+            case "trim" | "strip" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(toStr(v).trim, f) })
+            case "uppercase" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(toStr(v).toUpperCase, f) })
+            case "lowercase" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(toStr(v).toLowerCase, f) })
+            case "is_alpha" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(StringUtils.isAlpha(toStr(v)), f) })
+            case "is_alphanum" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(StringUtils.isAlphanumeric(toStr(v)), f) })
+            case "is_whitespace" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(StringUtils.isWhitespace(toStr(v)), f) })
+            case "is_num" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(StringUtils.isNumeric(toStr(v)), f) })
+            case "is_numspace" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(StringUtils.isNumericSpace(toStr(v)), f) })
+            case "is_alphaspace" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(StringUtils.isAlphaSpace(toStr(v)), f) })
+            case "is_alphanumspace" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(StringUtils.isAlphanumericSpace(toStr(v)), f) })
             case "split" ⇒ doSplit()
             case "split_trim" ⇒ doSplitTrim()
 
             // Math functions.
             case "abs" ⇒ doAbs()
             case "ceil" ⇒ arg1() match { case item ⇒ stack.push(() ⇒ {
-                val NCIdlStackItem(v, f) = item()
+                val Z(v, f) = item()
 
                 Z(Math.ceil(toJDouble(v)), f)
             }) }
-            case "floor" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.floor(toJDouble(v)), f) })
-            case "rint" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.rint(toJDouble(v)), f) })
-            case "round" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.round(toJDouble(v)), f) })
-            case "signum" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.signum(toJDouble(v)), f) })
-            case "sqrt" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.sqrt(toJDouble(v)), f) })
-            case "cbrt" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.cbrt(toJDouble(v)), f) })
-            case "acos" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.acos(toJDouble(v)), f) })
-            case "asin" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.asin(toJDouble(v)), f) })
-            case "atan" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z( Math.atan(toJDouble(v)), f) })
-            case "cos" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.cos(toJDouble(v)), f) })
-            case "sin" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.sin(toJDouble(v)), f) })
-            case "tan" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.tan(toJDouble(v)), f) })
-            case "cosh" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.cosh(toJDouble(v)), f) })
-            case "sinh" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.sinh(toJDouble(v)), f) })
-            case "tanh" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.tanh(toJDouble(v)), f) })
-            case "atn2" ⇒ z[(T, T)](arg2, { x ⇒ val NCIdlStackItem(v1, n1) = x._1(); val NCIdlStackItem(v2, n2) = x._2(); Z(Math.atan2(toJDouble(v1), toJDouble(v2)), n1 + n2) })
-            case "degrees" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.toDegrees(toJDouble(v)), f) })
-            case "radians" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z( Math.toRadians(toJDouble(v)), f) })
-            case "exp" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.exp(toJDouble(v)), f) })
-            case "expm1" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.expm1(toJDouble(v)), f) })
-            case "hypot" ⇒ z[(T, T)](arg2, { x ⇒ val NCIdlStackItem(v1, n1) = x._1(); val NCIdlStackItem(v2, n2) = x._2(); Z(Math.hypot(toJDouble(v1), toJDouble(v2)), n1 + n2) })
-            case "log" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.log(toJDouble(v)), f) })
-            case "log10" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.log10(toJDouble(v)), f) })
-            case "log1p" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(Math.log1p(toJDouble(v)), f) })
-            case "pow" ⇒ z[(T, T)](arg2, { x ⇒ val NCIdlStackItem(v1, f1) = x._1(); val NCIdlStackItem(v2, f2) = x._2(); Z(Math.pow(toJDouble(v1), toJDouble(v2)), f1 + f2 + 1) })
+            case "floor" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.floor(toJDouble(v)), f) })
+            case "rint" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.rint(toJDouble(v)), f) })
+            case "round" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.round(toJDouble(v)), f) })
+            case "signum" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.signum(toJDouble(v)), f) })
+            case "sqrt" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.sqrt(toJDouble(v)), f) })
+            case "cbrt" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.cbrt(toJDouble(v)), f) })
+            case "acos" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.acos(toJDouble(v)), f) })
+            case "asin" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.asin(toJDouble(v)), f) })
+            case "atan" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z( Math.atan(toJDouble(v)), f) })
+            case "cos" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.cos(toJDouble(v)), f) })
+            case "sin" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.sin(toJDouble(v)), f) })
+            case "tan" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.tan(toJDouble(v)), f) })
+            case "cosh" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.cosh(toJDouble(v)), f) })
+            case "sinh" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.sinh(toJDouble(v)), f) })
+            case "tanh" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.tanh(toJDouble(v)), f) })
+            case "atn2" ⇒ z[(ST, ST)](arg2, { x ⇒ val Z(v1, n1) = x._1(); val Z(v2, n2) = x._2(); Z(Math.atan2(toJDouble(v1), toJDouble(v2)), n1 + n2) })
+            case "degrees" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.toDegrees(toJDouble(v)), f) })
+            case "radians" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z( Math.toRadians(toJDouble(v)), f) })
+            case "exp" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.exp(toJDouble(v)), f) })
+            case "expm1" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.expm1(toJDouble(v)), f) })
+            case "hypot" ⇒ z[(ST, ST)](arg2, { x ⇒ val Z(v1, n1) = x._1(); val Z(v2, n2) = x._2(); Z(Math.hypot(toJDouble(v1), toJDouble(v2)), n1 + n2) })
+            case "log" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.log(toJDouble(v)), f) })
+            case "log10" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.log10(toJDouble(v)), f) })
+            case "log1p" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(Math.log1p(toJDouble(v)), f) })
+            case "pow" ⇒ z[(ST, ST)](arg2, { x ⇒ val Z(v1, f1) = x._1(); val Z(v2, f2) = x._2(); Z(Math.pow(toJDouble(v1), toJDouble(v2)), f1 + f2 + 1) })
             case "square" ⇒ doSquare()
             case "pi" ⇒ z0(() ⇒ Z(Math.PI, 0))
             case "euler" ⇒ z0(() ⇒ Z(Math.E, 0))
@@ -944,16 +943,16 @@ trait NCIdlCompilerBase {
             case "has" ⇒ doHas()
             case "has_any" ⇒ doHasAny()
             case "has_all" ⇒ doHasAll()
-            case "first" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); val lst = toJList(v); Z(if (lst.isEmpty) null else lst.get(0).asInstanceOf[Object], f)})
-            case "last" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); val lst = toJList(v); Z(if (lst.isEmpty) null else lst.get(lst.size() - 1).asInstanceOf[Object], f)})
-            case "keys" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(new util.ArrayList(toJMap(v).keySet()), f) })
-            case "values" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(new util.ArrayList(toJMap(v).values()), f) })
-            case "size" | "count" | "length" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(toJList(v).size(), f)})
+            case "first" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); val lst = toJList(v); Z(if (lst.isEmpty) null else lst.get(0).asInstanceOf[Object], f)})
+            case "last" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); val lst = toJList(v); Z(if (lst.isEmpty) null else lst.get(lst.size() - 1).asInstanceOf[Object], f)})
+            case "keys" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(new util.ArrayList(toJMap(v).keySet()), f) })
+            case "values" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(new util.ArrayList(toJMap(v).values()), f) })
+            case "size" | "count" | "length" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(toJList(v).size(), f)})
             case "reverse" ⇒ doReverse()
             case "sort" ⇒ doSort()
-            case "is_empty" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(toJList(v).isEmpty, f) })
-            case "non_empty" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(!toJList(v).isEmpty, f) })
-            case "to_string" ⇒ z[T](arg1, { x ⇒ val NCIdlStackItem(v, f) = x(); Z(toJList(v).asScala.map(_.toString).asJava, f) })
+            case "is_empty" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(toJList(v).isEmpty, f) })
+            case "non_empty" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(!toJList(v).isEmpty, f) })
+            case "to_string" ⇒ z[ST](arg1, { x ⇒ val Z(v, f) = x(); Z(toJList(v).asScala.map(_.toString).asJava, f) })
 
             // Statistical operations on lists.
             case "max" ⇒ doMin()
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index 6cd92b5..e7ce6b3 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -26,8 +26,7 @@ import org.apache.nlpcraft.model.impl.NCTokenLogger
 import org.apache.nlpcraft.model.{NCContext, NCDialogFlowItem, NCIntentMatch, NCResult, NCToken}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
 import org.apache.nlpcraft.model.impl.NCTokenPimp._
-import org.apache.nlpcraft.model.intent.compiler.NCIdlStackItem
-import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlIntent, NCIdlTerm}
+import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlIntent, NCIdlStackItem ⇒ Z, NCIdlTerm}
 
 import java.util.function.Function
 import scala.collection.JavaConverters._
@@ -495,8 +494,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             val termCtx = NCIdlContext(
                 intentMeta = intent.meta,
                 convMeta = if (x.isEmpty) Map.empty[String, Object] else x.asScala.toMap[String, Object],
-                req = ctx.getRequest,
-                vars = mutable.HashMap.empty[String, NCIdlStackItem]
+                req = ctx.getRequest
             )
 
             // Check terms.
@@ -651,7 +649,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
      */
     @throws[NCE]
     private def solvePredicate(
-        pred: (NCToken, NCIdlContext) ⇒ (Boolean /*Predicate.*/ , Int /*How many times a token was used.*/ ),
+        pred: (NCToken, NCIdlContext) ⇒ Z,
         ctx: NCIdlContext,
         min: Int,
         max: Int,
@@ -669,9 +667,9 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
 
         // Collect to the 'max' from sentence & conversation, if possible.
         for (col ← Seq(senToks, convToks); tok ← col.filter(!_.used) if usedToks.lengthCompare(max) < 0) {
-            val (res, uses) = pred.apply(tok.token, ctx)
+            val Z(res, uses) = pred.apply(tok.token, ctx)
 
-            if (res) {
+            if (res.asInstanceOf[Boolean]) {
                 matches += 1
 
                 if (uses > 0) {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonym.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonym.scala
index 9b56deb..1e9095b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonym.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeSynonym.scala
@@ -117,7 +117,7 @@ class NCProbeSynonym(
                             r.matcher(get0(_.origText, _.origText)).matches() || r.matcher(get0(_.normText, _.normText)).matches()
 
                         case IDL ⇒
-                            get0(t ⇒ chunk.idlPred.apply(t, NCIdlContext(req = req))._1, _ ⇒ false)
+                            get0(t ⇒ chunk.idlPred.apply(t, NCIdlContext(req = req)).value.asInstanceOf[Boolean], _ ⇒ false)
 
                         case _ ⇒ throw new AssertionError()
                     }