diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..13109b4af
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+version: 2
+
+updates:
+ - package-ecosystem: github-actions
+ directory: "/"
+ schedule:
+ interval: monthly
+ day: monday
+ groups:
+ all:
+ patterns:
+ - "*"
diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml
index cd73512f3..6c4e7b8dd 100644
--- a/.github/workflows/license-check.yml
+++ b/.github/workflows/license-check.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Gobra
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Check license headers
uses: viperproject/check-license-header@v2
with:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 0b3d56f37..dc3743fb0 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -15,7 +15,15 @@ jobs:
build-test-deploy-container:
runs-on: ubuntu-latest
env:
- IMAGE_NAME: gobra
+ IMAGE_ID: ghcr.io/${{ github.repository_owner }}/gobra
+ # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/):
+ IMAGE_LABELS: |
+ org.opencontainers.image.authors=Viper Project
+ org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra
+ org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
+ org.opencontainers.image.revision=${{ github.sha }}
+ org.opencontainers.image.licenses=MPL-2.0
+ org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}
CONCLUSION_SUCCESS: "success"
CONCLUSION_FAILURE: "failure"
# Output levels according to severity.
@@ -25,7 +33,7 @@ jobs:
FAILURE_LEVEL: "error"
steps:
- name: Checkout Gobra
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Check that silicon & carbon reference same silver commit
@@ -33,35 +41,51 @@ jobs:
SILICON_SILVER_REF=$(git -C viperserver/silicon/silver rev-parse HEAD) && \
CARBON_SILVER_REF=$(git -C viperserver/carbon/silver rev-parse HEAD) && \
if [ "$SILICON_SILVER_REF" != "$CARBON_SILVER_REF" ]; then echo "Silicon and Carbon reference different Silver commits ($SILICON_SILVER_REF and $CARBON_SILVER_REF)" && exit 1 ; fi
- - name: Create image tag
- run: |
- IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME
-
- # Change all uppercase to lowercase
- IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
- # Strip git ref prefix from version
- VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
- # Strip "v" prefix from tag name
- [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v\.?//')
- # Use Docker `latest` tag convention
- [ "$VERSION" == "master" ] && VERSION=latest
- echo "IMAGE_TAG=$IMAGE_ID:$VERSION" >> $GITHUB_ENV
# used to enable Docker caching (see https://github.com/docker/build-push-action)
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
+ uses: docker/setup-buildx-action@v3
+
+ - name: Create image creation label
+ run: |
+ CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)"
+ echo "CREATED_LABEL=$CREATED_LABEL" >> $GITHUB_ENV
+
+ - name: Create image metadata
+ id: image-metadata
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ env.IMAGE_ID }}
+ labels: |
+ ${{ env.IMAGE_LABELS }}
+ ${{ env.CREATED_LABEL }}
+ tags: |
+ # the first 4 tags correspond to the default options
+ type=schedule
+ type=ref,event=branch
+ type=ref,event=tag
+ type=ref,event=pr
+ # use (short) commit hash as tag:
+ type=sha
+ # use latest tag for default branch and with highest priority (1000 is the highest default priority for the other types):
+ type=raw,value=latest,priority=1100,enable={{is_default_branch}}
+
+ - name: Get first tag
+ run: echo "IMAGE_TAG=$(echo "${{ steps.image-metadata.outputs.tags }}" | head -1)" >> $GITHUB_ENV
- name: Build image up to including stage 'build'
+ id: image-build
# note that the action's name is misleading: this step does NOT push
- uses: docker/build-push-action@v3
+ uses: docker/build-push-action@v5
with:
context: .
load: true # make the built image available in docker (locally)
target: build # only build up to and including stage 'build'
file: workflow-container/Dockerfile
- tags: ${{ env.IMAGE_TAG }}
- labels: "runnumber=${{ github.run_id }}"
+ tags: ${{ steps.image-metadata.outputs.tags }}
+ labels: ${{ steps.image-metadata.outputs.labels }}
push: false
+ provenance: false # without this, GH displays 2 architecture (unknown/unknown) and omits labels
# use GitHub cache:
cache-from: type=gha, scope=${{ github.workflow }}
cache-to: type=gha, scope=${{ github.workflow }}
@@ -161,20 +185,21 @@ jobs:
- name: Upload RAM usage
if: ${{ always() }}
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: pidstat.txt
path: sync/pidstat.txt
- name: Build entire image
- uses: docker/build-push-action@v3
+ uses: docker/build-push-action@v5
with:
context: .
load: true # make the built image available in docker (locally)
file: workflow-container/Dockerfile
- tags: ${{ env.IMAGE_TAG }}
- labels: "runnumber=${{ github.run_id }}"
+ tags: ${{ steps.image-metadata.outputs.tags }}
+ labels: ${{ steps.image-metadata.outputs.labels }}
push: false
+ provenance: false # without this, GH displays 2 architecture (unknown/unknown) and omits labels
# use GitHub cache:
cache-from: type=gha, scope=${{ github.workflow }}
cache-to: type=gha, scope=${{ github.workflow }}
@@ -203,7 +228,7 @@ jobs:
- name: Login to Github Packages
if: env.SHOULD_DEPLOY == 'true'
- uses: docker/login-action@v2
+ uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -211,13 +236,14 @@ jobs:
- name: Push entire image
if: env.SHOULD_DEPLOY == 'true'
- uses: docker/build-push-action@v3
+ uses: docker/build-push-action@v5
with:
context: .
file: workflow-container/Dockerfile
- tags: ${{ env.IMAGE_TAG }}
- labels: "runnumber=${{ github.run_id }}"
+ tags: ${{ steps.image-metadata.outputs.tags }}
+ labels: ${{ steps.image-metadata.outputs.labels }}
push: true
+ provenance: false # without this, GH displays 2 architecture (unknown/unknown) and omits labels
# use GitHub cache:
cache-from: type=gha, scope=${{ github.workflow }}
cache-to: type=gha, scope=${{ github.workflow }}
diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml
index efc59dc7d..209c54f00 100644
--- a/.github/workflows/update-submodules.yml
+++ b/.github/workflows/update-submodules.yml
@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out the repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
submodules: true
@@ -35,7 +35,7 @@ jobs:
- name: Open a pull request
id: pr
- uses: peter-evans/create-pull-request@v4
+ uses: peter-evans/create-pull-request@v6
if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF
with:
# Use viper-admin's token to workaround a restriction of GitHub.
diff --git a/README.md b/README.md
index 2d7f4ce32..e63cfd4c2 100644
--- a/README.md
+++ b/README.md
@@ -67,6 +67,11 @@ are two workarounds:
Note however that the debugger must be running/listening as otherwise the JVM will emit a connection
refused error.
+## Projects verified with Gobra
+- [VerifiedSCION](https://github.com/viperproject/VerifiedSCION)
+- [Security of protocol implementations via refinement w.r.t. a Tamarin model](https://github.com/viperproject/protocol-verification-refinement). In particular, implementations of the signed Diffie-Hellman and WireGuard protocols have been verified.
+- [Security of protocol implementations verified entirely within Gobra](https://github.com/viperproject/SecurityProtocolImplementations). In particular, implementations of the Needham-Schroeder-Lowe, signed Diffie-Hellman, and WireGuard protocols have been verified.
+
## Licensing
Most Gobra sources are licensed under the Mozilla Public License Version 2.0.
The [LICENSE](./LICENSE) lists the exceptions to this rule.
diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4
index 92ba16144..1ad56280d 100644
--- a/src/main/antlr4/GobraLexer.g4
+++ b/src/main/antlr4/GobraLexer.g4
@@ -91,3 +91,6 @@ PROOF : 'proof';
GHOST_EQUALS : '===';
GHOST_NOT_EQUALS : '!==';
WITH : 'with';
+OPAQUE : 'opaque' -> mode(NLSEMI);
+REVEAL : 'reveal';
+BACKEND : '#backend';
\ No newline at end of file
diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4
index 9833960ab..ea3fd2938 100644
--- a/src/main/antlr4/GobraParser.g4
+++ b/src/main/antlr4/GobraParser.g4
@@ -25,7 +25,6 @@ stmtOnly: statement EOF;
typeOnly: type_ EOF;
-
// Identifier lists with added addressability modifiers
maybeAddressableIdentifierList: maybeAddressableIdentifier (COMMA maybeAddressableIdentifier)*;
@@ -167,10 +166,17 @@ sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET)
// Specifications
-specification returns[boolean trusted = false, boolean pure = false;]:
- ((specStatement | PURE {$pure = true;} | TRUSTED {$trusted = true;}) eos)*? (PURE {$pure = true;})? // Non-greedily match PURE to avoid missing eos errors.
+specification returns[boolean trusted = false, boolean pure = false, boolean opaque = false;]:
+ // Non-greedily match PURE to avoid missing eos errors.
+ ((specStatement | OPAQUE {$opaque = true;} | PURE {$pure = true;} | TRUSTED {$trusted = true;}) eos)*? (PURE {$pure = true;})? backendAnnotation?
;
+backendAnnotationEntry: ~('('|')'|',')+;
+listOfValues: backendAnnotationEntry (COMMA backendAnnotationEntry)*;
+singleBackendAnnotation: backendAnnotationEntry L_PAREN listOfValues? R_PAREN;
+backendAnnotationList: singleBackendAnnotation (COMMA singleBackendAnnotation)*;
+backendAnnotation: BACKEND L_BRACKET backendAnnotationList? R_BRACKET eos;
+
specStatement
: kind=PRE assertion
| kind=PRESERVES assertion
@@ -232,11 +238,11 @@ new_: NEW L_PAREN type_ R_PAREN;
// Added specifications and parameter info
-specMember: specification (functionDecl[$specification.trusted, $specification.pure] | methodDecl[$specification.trusted, $specification.pure]);
+specMember: specification (functionDecl[$specification.trusted, $specification.pure, $specification.opaque] | methodDecl[$specification.trusted, $specification.pure, $specification.opaque]);
-functionDecl[boolean trusted, boolean pure]: FUNC IDENTIFIER (signature blockWithBodyParameterInfo?);
+functionDecl[boolean trusted, boolean pure, boolean opaque]: FUNC IDENTIFIER (signature blockWithBodyParameterInfo?);
-methodDecl[boolean trusted, boolean pure]: FUNC receiver IDENTIFIER (signature blockWithBodyParameterInfo?);
+methodDecl[boolean trusted, boolean pure, boolean opaque]: FUNC receiver IDENTIFIER (signature blockWithBodyParameterInfo?);
@@ -382,7 +388,9 @@ primaryExpr:
| primaryExpr slice_ #slicePrimaryExpr
| primaryExpr seqUpdExp #seqUpdPrimaryExpr
| primaryExpr typeAssertion #typeAssertionPrimaryExpr
+ // "REVEAL? primaryExpr arguments" doesn't work due to mutual left recursion
| primaryExpr arguments #invokePrimaryExpr
+ | REVEAL primaryExpr arguments #revealInvokePrimaryExpr
| primaryExpr arguments AS closureSpecInstance #invokePrimaryExprWithSpec
| primaryExpr predConstructArgs #predConstrPrimaryExpr
| call_op=(
diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java
index 7ea912639..f8ea9438e 100644
--- a/src/main/java/viper/gobra/frontend/GobraLexer.java
+++ b/src/main/java/viper/gobra/frontend/GobraLexer.java
@@ -27,22 +27,22 @@ public class GobraLexer extends Lexer {
MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, LOW=59, LOWC=60,
SHARE=61, ADDR_MOD=62, DOT_DOT=63, SHARED=64, EXCLUSIVE=65, PREDICATE=66,
WRITEPERM=67, NOPERM=68, TRUSTED=69, OUTLINE=70, INIT_POST=71, IMPORT_PRE=72,
- PROOF=73, GHOST_EQUALS=74, GHOST_NOT_EQUALS=75, WITH=76, BREAK=77, DEFAULT=78,
- FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86,
- CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93,
- IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100,
- VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106,
- R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112,
- COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117,
- ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122,
- LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127,
- DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133,
- PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139,
- DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144,
- IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148,
- HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152,
- INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157,
- WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162;
+ PROOF=73, GHOST_EQUALS=74, GHOST_NOT_EQUALS=75, WITH=76, OPAQUE=77, REVEAL=78,
+ BACKEND=79, BREAK=80, DEFAULT=81, FUNC=82, INTERFACE=83, SELECT=84, CASE=85,
+ DEFER=86, GO=87, MAP=88, STRUCT=89, CHAN=90, ELSE=91, GOTO=92, PACKAGE=93,
+ SWITCH=94, CONST=95, FALLTHROUGH=96, IF=97, RANGE=98, TYPE=99, CONTINUE=100,
+ FOR=101, IMPORT=102, RETURN=103, VAR=104, NIL_LIT=105, IDENTIFIER=106,
+ L_PAREN=107, R_PAREN=108, L_CURLY=109, R_CURLY=110, L_BRACKET=111, R_BRACKET=112,
+ ASSIGN=113, COMMA=114, SEMI=115, COLON=116, DOT=117, PLUS_PLUS=118, MINUS_MINUS=119,
+ DECLARE_ASSIGN=120, ELLIPSIS=121, LOGICAL_OR=122, LOGICAL_AND=123, EQUALS=124,
+ NOT_EQUALS=125, LESS=126, LESS_OR_EQUALS=127, GREATER=128, GREATER_OR_EQUALS=129,
+ OR=130, DIV=131, MOD=132, LSHIFT=133, RSHIFT=134, BIT_CLEAR=135, EXCLAMATION=136,
+ PLUS=137, MINUS=138, CARET=139, STAR=140, AMPERSAND=141, RECEIVE=142,
+ DECIMAL_LIT=143, BINARY_LIT=144, OCTAL_LIT=145, HEX_LIT=146, HEX_FLOAT_LIT=147,
+ IMAGINARY_LIT=148, RUNE_LIT=149, BYTE_VALUE=150, OCTAL_BYTE_VALUE=151,
+ HEX_BYTE_VALUE=152, LITTLE_U_VALUE=153, BIG_U_VALUE=154, RAW_STRING_LIT=155,
+ INTERPRETED_STRING_LIT=156, WS=157, COMMENT=158, TERMINATOR=159, LINE_COMMENT=160,
+ WS_NLSEMI=161, COMMENT_NLSEMI=162, LINE_COMMENT_NLSEMI=163, EOS=164, OTHER=165;
public static final int
NLSEMI=1;
public static String[] channelNames = {
@@ -65,22 +65,22 @@ private static String[] makeRuleNames() {
"TYPE_OF", "IS_COMPARABLE", "LOW", "LOWC", "SHARE", "ADDR_MOD", "DOT_DOT",
"SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED",
"OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS",
- "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER",
- "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST",
- "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN",
- "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY",
- "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT",
- "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR",
- "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER",
- "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR",
- "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE",
- "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT",
- "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", "RUNE", "RUNE_LIT",
- "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE",
- "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT",
- "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE", "DECIMALS",
- "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER", "UNICODE_DIGIT",
- "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI",
+ "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
+ "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
+ "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
+ "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS",
+ "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD",
+ "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET",
+ "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT",
+ "HEX_LIT", "HEX_FLOAT_LIT", "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT",
+ "RUNE", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE",
+ "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT",
+ "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE",
+ "DECIMALS", "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER",
+ "UNICODE_DIGIT", "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI",
"EOS", "OTHER"
};
}
@@ -99,14 +99,15 @@ private static String[] makeLiteralNames() {
"'none'", "'pred'", "'typeOf'", "'isComparable'", "'low'", "'lowContext'",
"'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'",
"'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'",
- "'proof'", "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'",
- "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'",
- "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'",
- "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'",
- "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='",
- "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'",
- "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'",
- "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
+ "'proof'", "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'#backend'",
+ "'break'", "'default'", "'func'", "'interface'", "'select'", "'case'",
+ "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'",
+ "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", "'range'",
+ "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'",
+ null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'",
+ "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='",
+ "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'",
+ "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -122,20 +123,21 @@ private static String[] makeSymbolicNames() {
"TYPE_OF", "IS_COMPARABLE", "LOW", "LOWC", "SHARE", "ADDR_MOD", "DOT_DOT",
"SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED",
"OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS",
- "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER",
- "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST",
- "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN",
- "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY",
- "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT",
- "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR",
- "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER",
- "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR",
- "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE",
- "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT",
- "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE",
- "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT",
- "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI",
- "LINE_COMMENT_NLSEMI", "EOS", "OTHER"
+ "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
+ "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
+ "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
+ "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS",
+ "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD",
+ "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET",
+ "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT",
+ "HEX_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE",
+ "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE",
+ "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR",
+ "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI",
+ "EOS", "OTHER"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -215,7 +217,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
}
public static final String _serializedATN =
- "\u0004\u0000\u00a2\u05f2\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+
+ "\u0004\u0000\u00a5\u0611\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+
"\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+
"\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+
"\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+
@@ -260,12 +262,13 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
"\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+
"\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+
"\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+
- "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0001"+
- "\u0000\u0001\u0000\u0003\u0000\u0163\b\u0000\u0001\u0000\u0001\u0000\u0001"+
- "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u016b\b\u0001\u0001"+
- "\u0001\u0003\u0001\u016e\b\u0001\u0001\u0001\u0003\u0001\u0171\b\u0001"+
- "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0177\b\u0001"+
- "\u0003\u0001\u0179\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
+ "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+
+ "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0001"+
+ "\u0000\u0001\u0000\u0003\u0000\u0169\b\u0000\u0001\u0000\u0001\u0000\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0171\b\u0001\u0001"+
+ "\u0001\u0003\u0001\u0174\b\u0001\u0001\u0001\u0003\u0001\u0177\b\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u017d\b\u0001"+
+ "\u0003\u0001\u017f\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
"\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+
"\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
@@ -331,1027 +334,1044 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
"G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001"+
"H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+
"J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+
- "L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+
- "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+
- "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001"+
- "P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001"+
- "R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001T\u0001T\u0001"+
- "T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001"+
- "V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+
- "X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+
- "Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001"+
- "[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\"+
- "\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+
- "\\\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+
- "_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+
- "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+
- "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001"+
- "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+
- "e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0005f\u043b"+
- "\bf\nf\ff\u043e\tf\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001h\u0001"+
- "h\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001"+
- "l\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001"+
- "p\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001"+
- "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001"+
- "v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001"+
- "y\u0001y\u0001z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001"+
- "}\u0001}\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080"+
- "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082"+
- "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085"+
- "\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088"+
- "\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a"+
- "\u0001\u008b\u0001\u008b\u0001\u008b\u0003\u008b\u04a6\b\u008b\u0001\u008b"+
- "\u0005\u008b\u04a9\b\u008b\n\u008b\f\u008b\u04ac\t\u008b\u0003\u008b\u04ae"+
- "\b\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003"+
- "\u008c\u04b5\b\u008c\u0001\u008c\u0004\u008c\u04b8\b\u008c\u000b\u008c"+
- "\f\u008c\u04b9\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0003\u008d"+
- "\u04c0\b\u008d\u0001\u008d\u0003\u008d\u04c3\b\u008d\u0001\u008d\u0004"+
- "\u008d\u04c6\b\u008d\u000b\u008d\f\u008d\u04c7\u0001\u008d\u0001\u008d"+
- "\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u04cf\b\u008e\u0001\u008e"+
- "\u0004\u008e\u04d2\b\u008e\u000b\u008e\f\u008e\u04d3\u0001\u008e\u0001"+
- "\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001"+
- "\u0090\u0003\u0090\u04de\b\u0090\u0001\u0090\u0004\u0090\u04e1\b\u0090"+
- "\u000b\u0090\f\u0090\u04e2\u0001\u0090\u0001\u0090\u0003\u0090\u04e7\b"+
- "\u0090\u0001\u0090\u0005\u0090\u04ea\b\u0090\n\u0090\f\u0090\u04ed\t\u0090"+
- "\u0003\u0090\u04ef\b\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090"+
- "\u04f4\b\u0090\u0001\u0090\u0005\u0090\u04f7\b\u0090\n\u0090\f\u0090\u04fa"+
- "\t\u0090\u0003\u0090\u04fc\b\u0090\u0001\u0091\u0001\u0091\u0003\u0091"+
- "\u0500\b\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092"+
- "\u0001\u0092\u0001\u0092\u0003\u0092\u0509\b\u0092\u0001\u0092\u0001\u0092"+
- "\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093"+
- "\u0512\b\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094"+
- "\u0001\u0094\u0001\u0095\u0001\u0095\u0003\u0095\u051c\b\u0095\u0001\u0096"+
- "\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097"+
- "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098"+
- "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099"+
- "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+
- "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0005\u009a"+
- "\u053c\b\u009a\n\u009a\f\u009a\u053f\t\u009a\u0001\u009a\u0001\u009a\u0001"+
- "\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0005\u009b\u0548"+
- "\b\u009b\n\u009b\f\u009b\u054b\t\u009b\u0001\u009b\u0001\u009b\u0001\u009b"+
- "\u0001\u009b\u0001\u009c\u0004\u009c\u0552\b\u009c\u000b\u009c\f\u009c"+
- "\u0553\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+
- "\u009d\u0005\u009d\u055c\b\u009d\n\u009d\f\u009d\u055f\t\u009d\u0001\u009d"+
- "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0004\u009e"+
- "\u0567\b\u009e\u000b\u009e\f\u009e\u0568\u0001\u009e\u0001\u009e\u0001"+
- "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0005\u009f\u0571\b\u009f\n"+
- "\u009f\f\u009f\u0574\t\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001"+
- "\u00a0\u0001\u00a0\u0001\u00a0\u0003\u00a0\u057c\b\u00a0\u0001\u00a1\u0001"+
- "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+
- "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+
- "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+
- "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+
- "\u00a1\u0003\u00a1\u0598\b\u00a1\u0001\u00a2\u0001\u00a2\u0003\u00a2\u059c"+
- "\b\u00a2\u0001\u00a2\u0005\u00a2\u059f\b\u00a2\n\u00a2\f\u00a2\u05a2\t"+
- "\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001"+
- "\u00a5\u0001\u00a6\u0001\u00a6\u0003\u00a6\u05ac\b\u00a6\u0001\u00a6\u0001"+
- "\u00a6\u0001\u00a7\u0001\u00a7\u0003\u00a7\u05b2\b\u00a7\u0001\u00a8\u0001"+
- "\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0004\u00aa\u05b9\b\u00aa\u000b"+
- "\u00aa\f\u00aa\u05ba\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+
- "\u00ab\u0001\u00ab\u0005\u00ab\u05c3\b\u00ab\n\u00ab\f\u00ab\u05c6\t\u00ab"+
- "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac"+
- "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0005\u00ac\u05d1\b\u00ac\n\u00ac"+
- "\f\u00ac\u05d4\t\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0004\u00ad"+
- "\u05d9\b\u00ad\u000b\u00ad\f\u00ad\u05da\u0001\u00ad\u0001\u00ad\u0001"+
- "\u00ad\u0001\u00ad\u0001\u00ad\u0005\u00ad\u05e2\b\u00ad\n\u00ad\f\u00ad"+
- "\u05e5\t\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003\u00ad\u05ea\b"+
- "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001"+
- "\u00ae\u0001\u00ae\u0003\u055d\u05c4\u05e3\u0000\u00af\u0002\u0001\u0004"+
- "\u0002\u0006\u0003\b\u0004\n\u0005\f\u0006\u000e\u0007\u0010\b\u0012\t"+
- "\u0014\n\u0016\u000b\u0018\f\u001a\r\u001c\u000e\u001e\u000f \u0010\""+
- "\u0011$\u0012&\u0013(\u0014*\u0015,\u0016.\u00170\u00182\u00194\u001a"+
- "6\u001b8\u001c:\u001d<\u001e>\u001f@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^"+
- "/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080@\u0082A\u0084B\u0086C\u0088D\u008a"+
- "E\u008cF\u008eG\u0090H\u0092I\u0094J\u0096K\u0098L\u009aM\u009cN\u009e"+
- "O\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8T\u00aaU\u00acV\u00aeW\u00b0X\u00b2"+
- "Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc^\u00be_\u00c0`\u00c2a\u00c4b\u00c6"+
- "c\u00c8d\u00cae\u00ccf\u00ceg\u00d0h\u00d2i\u00d4j\u00d6k\u00d8l\u00da"+
- "m\u00dcn\u00deo\u00e0p\u00e2q\u00e4r\u00e6s\u00e8t\u00eau\u00ecv\u00ee"+
- "w\u00f0x\u00f2y\u00f4z\u00f6{\u00f8|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080"+
- "\u0102\u0081\u0104\u0082\u0106\u0083\u0108\u0084\u010a\u0085\u010c\u0086"+
- "\u010e\u0087\u0110\u0088\u0112\u0089\u0114\u008a\u0116\u008b\u0118\u008c"+
- "\u011a\u008d\u011c\u008e\u011e\u008f\u0120\u0090\u0122\u0000\u0124\u0000"+
- "\u0126\u0091\u0128\u0000\u012a\u0092\u012c\u0093\u012e\u0094\u0130\u0095"+
- "\u0132\u0096\u0134\u0097\u0136\u0098\u0138\u0099\u013a\u009a\u013c\u009b"+
- "\u013e\u009c\u0140\u009d\u0142\u0000\u0144\u0000\u0146\u0000\u0148\u0000"+
- "\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0000\u0152\u0000\u0154\u0000"+
- "\u0156\u009e\u0158\u009f\u015a\u00a0\u015c\u00a1\u015e\u00a2\u0002\u0000"+
- "\u0001\u0013\u0001\u000019\u0001\u000009\u0002\u0000BBbb\u0002\u0000O"+
- "Ooo\u0002\u0000XXxx\u0002\u0000PPpp\u0002\u0000++--\u0001\u0000``\u0002"+
- "\u0000\"\"\\\\\u0002\u0000\t\t \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r"+
- "\r\'\'\t\u0000\"\"\'\'\\\\abffnnrrttvv\u0001\u000007\u0003\u000009AFa"+
- "f\u0001\u000001\u0002\u0000EEee@\u000009\u0660\u0669\u06f0\u06f9\u07c0"+
- "\u07c9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6"+
- "\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0"+
- "\u0ed9\u0f20\u0f29\u1040\u1049\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946"+
- "\u194f\u19d0\u19d9\u1a80\u1a89\u1a90\u1a99\u1b50\u1b59\u1bb0\u1bb9\u1c40"+
- "\u1c49\u1c50\u1c59\u8000\ua620\u8000\ua629\u8000\ua8d0\u8000\ua8d9\u8000"+
- "\ua900\u8000\ua909\u8000\ua9d0\u8000\ua9d9\u8000\ua9f0\u8000\ua9f9\u8000"+
- "\uaa50\u8000\uaa59\u8000\uabf0\u8000\uabf9\u8000\uff10\u8000\uff19\u8001"+
- "\u04a0\u8001\u04a9\u8001\u0d30\u8001\u0d39\u8001\u1066\u8001\u106f\u8001"+
- "\u10f0\u8001\u10f9\u8001\u1136\u8001\u113f\u8001\u11d0\u8001\u11d9\u8001"+
- "\u12f0\u8001\u12f9\u8001\u1450\u8001\u1459\u8001\u14d0\u8001\u14d9\u8001"+
- "\u1650\u8001\u1659\u8001\u16c0\u8001\u16c9\u8001\u1730\u8001\u1739\u8001"+
- "\u18e0\u8001\u18e9\u8001\u1950\u8001\u1959\u8001\u1c50\u8001\u1c59\u8001"+
- "\u1d50\u8001\u1d59\u8001\u1da0\u8001\u1da9\u8001\u1f50\u8001\u1f59\u8001"+
- "\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001"+
- "\ud7ce\u8001\ud7ff\u8001\ue140\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001"+
- "\ue4f0\u8001\ue4f9\u8001\ue950\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0293"+
- "\u0000AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6"+
- "\u00f8\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374"+
- "\u0376\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c\u038c"+
- "\u038e\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0559\u0559"+
- "\u0560\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3"+
- "\u06d5\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710"+
- "\u0712\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa"+
- "\u0800\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858\u0860\u086a"+
- "\u0870\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d\u0950\u0950"+
- "\u0958\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0"+
- "\u09b2\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1"+
- "\u09f0\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30"+
- "\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74"+
- "\u0a85\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9"+
- "\u0abd\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10"+
- "\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d"+
- "\u0b5f\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95"+
- "\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9"+
- "\u0bd0\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d"+
- "\u0c58\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90"+
- "\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1"+
- "\u0cf1\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e"+
- "\u0d54\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb"+
- "\u0dbd\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82"+
- "\u0e84\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3"+
- "\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47"+
- "\u0f49\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055\u105a\u105d"+
- "\u1061\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5"+
- "\u10c7\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256"+
- "\u1258\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5"+
- "\u12b8\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315"+
- "\u1318\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f"+
- "\u1681\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731\u1740\u1751"+
- "\u1760\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878"+
- "\u1880\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d"+
- "\u1970\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7"+
- "\u1b05\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23"+
- "\u1c4d\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec"+
- "\u1cee\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d"+
- "\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d"+
- "\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc"+
- "\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071"+
- "\u207f\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113\u2115\u2115"+
- "\u2119\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d\u212f\u2139"+
- "\u213c\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee"+
- "\u2cf2\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f"+
- "\u2d80\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6"+
- "\u2dc8\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035"+
- "\u303b\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f"+
- "\u3131\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000"+
- "\ua4d0\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000"+
- "\ua62a\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000"+
- "\ua6a0\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000\ua788\u8000"+
- "\ua78b\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000"+
- "\ua7d5\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000\ua805\u8000"+
- "\ua807\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000\ua873\u8000"+
- "\ua882\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000"+
- "\ua8fd\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000\ua946\u8000"+
- "\ua960\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000"+
- "\ua9e0\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000"+
- "\uaa00\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000"+
- "\uaa60\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000"+
- "\uaab1\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000"+
- "\uaac0\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000"+
- "\uaae0\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000"+
- "\uab09\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000\uab26\u8000"+
- "\uab28\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000"+
- "\uab70\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000"+
- "\ud7cb\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000"+
- "\ufb00\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000"+
- "\ufb1f\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000"+
- "\ufb3e\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000"+
- "\ufb46\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000"+
- "\ufd92\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000"+
- "\ufe76\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000"+
- "\uff66\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000"+
- "\uffd2\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001\u000b\u8001"+
- "\r\u8001&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001"+
- "\u0080\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001"+
- "\u0300\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001\u0349\u8001"+
- "\u0350\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001"+
- "\u03c8\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001"+
- "\u04d8\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563\u8001"+
- "\u0570\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592\u8001"+
- "\u0594\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001"+
- "\u05b3\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736\u8001"+
- "\u0740\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001\u0785\u8001"+
- "\u0787\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001\u0805\u8001"+
- "\u0808\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838\u8001"+
- "\u083c\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876\u8001"+
- "\u0880\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001"+
- "\u0900\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7\u8001"+
- "\u09be\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001"+
- "\u0a15\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001"+
- "\u0a80\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001"+
- "\u0b00\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001"+
- "\u0b80\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001"+
- "\u0cc0\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001"+
- "\u0eb0\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001"+
- "\u0f30\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001"+
- "\u0fe0\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072\u8001"+
- "\u1075\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001"+
- "\u1103\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147\u8001"+
- "\u1150\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2\u8001"+
- "\u11c1\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001"+
- "\u1200\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u123f\u8001\u1240\u8001"+
- "\u1280\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001\u128d\u8001"+
- "\u128f\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001"+
- "\u1305\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001\u1328\u8001"+
- "\u132a\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001\u1339\u8001"+
- "\u133d\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001\u1361\u8001"+
- "\u1400\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001\u1461\u8001"+
- "\u1480\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001"+
- "\u1580\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001\u162f\u8001"+
- "\u1644\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001"+
- "\u1700\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001\u182b\u8001"+
- "\u18a0\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001\u1909\u8001"+
- "\u190c\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001\u192f\u8001"+
- "\u193f\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001"+
- "\u19aa\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001"+
- "\u1a00\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001"+
- "\u1a50\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001"+
- "\u1ab0\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001"+
- "\u1c40\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001"+
- "\u1d08\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001"+
- "\u1d60\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001"+
- "\u1d98\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001"+
- "\u1f04\u8001\u1f10\u8001\u1f12\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001"+
- "\u2000\u8001\u2399\u8001\u2480\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001"+
- "\u3000\u8001\u342f\u8001\u3441\u8001\u3446\u8001\u4400\u8001\u4646\u8001"+
- "\u6800\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001"+
- "\u6ad0\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001"+
- "\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001"+
- "\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001"+
- "\u6fe0\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001"+
- "\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001"+
- "\uaff5\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000\u8001\ub122\u8001"+
- "\ub132\u8001\ub132\u8001\ub150\u8001\ub152\u8001\ub155\u8001\ub155\u8001"+
- "\ub164\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001"+
- "\ubc70\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001"+
- "\ud400\u8001\ud454\u8001\ud456\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001"+
- "\ud4a2\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001"+
- "\ud4ae\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001"+
- "\ud4c5\u8001\ud505\u8001\ud507\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001"+
- "\ud516\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001"+
- "\ud540\u8001\ud544\u8001\ud546\u8001\ud546\u8001\ud54a\u8001\ud550\u8001"+
- "\ud552\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001"+
- "\ud6dc\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001\ud716\u8001\ud734\u8001"+
- "\ud736\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001\ud770\u8001\ud788\u8001"+
- "\ud78a\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001"+
- "\udf00\u8001\udf1e\u8001\udf25\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001"+
- "\ue100\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001"+
- "\ue290\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001"+
- "\ue7e0\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001"+
- "\ue7f0\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001"+
- "\ue94b\u8001\ue94b\u8001\uee00\u8001\uee03\u8001\uee05\u8001\uee1f\u8001"+
- "\uee21\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001\uee27\u8001"+
- "\uee29\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001\uee39\u8001"+
- "\uee3b\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001\uee47\u8001"+
- "\uee49\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001"+
- "\uee51\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001\uee57\u8001"+
- "\uee59\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001"+
- "\uee5f\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001\uee64\u8001"+
- "\uee67\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001\uee77\u8001"+
- "\uee79\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001\uee89\u8001"+
- "\uee8b\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001"+
- "\ueeab\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002\ub739\u8002"+
- "\ub740\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002"+
- "\uf800\u8002\ufa1d\u8003\u0000\u8003\u134a\u8003\u1350\u8003\u23af\u061e"+
- "\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004\u0001\u0000\u0000\u0000"+
- "\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000"+
- "\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e"+
- "\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012"+
- "\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016"+
- "\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a"+
- "\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e"+
- "\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001"+
- "\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000"+
- "\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000"+
- ",\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001"+
- "\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000"+
- "\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000"+
- ":\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001"+
- "\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000"+
- "\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000"+
- "H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001"+
- "\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000"+
- "\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000"+
- "V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001"+
- "\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000"+
- "\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000"+
- "\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h"+
- "\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000"+
- "\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000"+
- "\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v"+
- "\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000"+
- "\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000"+
- "\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000"+
- "\u0000\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000"+
- "\u0000\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000"+
- "\u0000\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000"+
- "\u0000\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000"+
- "\u0000\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000"+
- "\u0000\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000"+
- "\u0000\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000"+
- "\u0000\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000"+
- "\u0000\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000"+
- "\u0000\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000"+
- "\u0000\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000"+
- "\u0000\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000"+
- "\u0000\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000"+
- "\u0000\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000"+
- "\u0000\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000"+
- "\u0000\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000"+
- "\u0000\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000"+
- "\u0000\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000"+
- "\u0000\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000"+
- "\u0000\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000"+
- "\u0000\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000"+
- "\u0000\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000"+
- "\u0000\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000"+
- "\u0000\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000"+
- "\u0000\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000"+
- "\u0000\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000"+
- "\u0000\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000"+
- "\u0000\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2\u0001\u0000\u0000\u0000"+
- "\u0000\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6\u0001\u0000\u0000\u0000"+
- "\u0000\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa\u0001\u0000\u0000\u0000"+
- "\u0000\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe\u0001\u0000\u0000\u0000"+
- "\u0000\u0100\u0001\u0000\u0000\u0000\u0000\u0102\u0001\u0000\u0000\u0000"+
- "\u0000\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000"+
- "\u0000\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000"+
- "\u0000\u010c\u0001\u0000\u0000\u0000\u0000\u010e\u0001\u0000\u0000\u0000"+
- "\u0000\u0110\u0001\u0000\u0000\u0000\u0000\u0112\u0001\u0000\u0000\u0000"+
- "\u0000\u0114\u0001\u0000\u0000\u0000\u0000\u0116\u0001\u0000\u0000\u0000"+
- "\u0000\u0118\u0001\u0000\u0000\u0000\u0000\u011a\u0001\u0000\u0000\u0000"+
- "\u0000\u011c\u0001\u0000\u0000\u0000\u0000\u011e\u0001\u0000\u0000\u0000"+
- "\u0000\u0120\u0001\u0000\u0000\u0000\u0000\u0126\u0001\u0000\u0000\u0000"+
- "\u0000\u012a\u0001\u0000\u0000\u0000\u0000\u012c\u0001\u0000\u0000\u0000"+
- "\u0000\u012e\u0001\u0000\u0000\u0000\u0000\u0130\u0001\u0000\u0000\u0000"+
- "\u0000\u0132\u0001\u0000\u0000\u0000\u0000\u0134\u0001\u0000\u0000\u0000"+
- "\u0000\u0136\u0001\u0000\u0000\u0000\u0000\u0138\u0001\u0000\u0000\u0000"+
- "\u0000\u013a\u0001\u0000\u0000\u0000\u0000\u013c\u0001\u0000\u0000\u0000"+
- "\u0000\u013e\u0001\u0000\u0000\u0000\u0000\u0140\u0001\u0000\u0000\u0000"+
- "\u0001\u0156\u0001\u0000\u0000\u0000\u0001\u0158\u0001\u0000\u0000\u0000"+
- "\u0001\u015a\u0001\u0000\u0000\u0000\u0001\u015c\u0001\u0000\u0000\u0000"+
- "\u0001\u015e\u0001\u0000\u0000\u0000\u0002\u0162\u0001\u0000\u0000\u0000"+
- "\u0004\u0178\u0001\u0000\u0000\u0000\u0006\u017a\u0001\u0000\u0000\u0000"+
- "\b\u0181\u0001\u0000\u0000\u0000\n\u0189\u0001\u0000\u0000\u0000\f\u0190"+
- "\u0001\u0000\u0000\u0000\u000e\u0197\u0001\u0000\u0000\u0000\u0010\u019e"+
- "\u0001\u0000\u0000\u0000\u0012\u01a5\u0001\u0000\u0000\u0000\u0014\u01ae"+
- "\u0001\u0000\u0000\u0000\u0016\u01b8\u0001\u0000\u0000\u0000\u0018\u01c0"+
- "\u0001\u0000\u0000\u0000\u001a\u01ca\u0001\u0000\u0000\u0000\u001c\u01d6"+
- "\u0001\u0000\u0000\u0000\u001e\u01dd\u0001\u0000\u0000\u0000 \u01e8\u0001"+
- "\u0000\u0000\u0000\"\u01eb\u0001\u0000\u0000\u0000$\u01f1\u0001\u0000"+
- "\u0000\u0000&\u01fa\u0001\u0000\u0000\u0000(\u01ff\u0001\u0000\u0000\u0000"+
- "*\u0206\u0001\u0000\u0000\u0000,\u020d\u0001\u0000\u0000\u0000.\u0213"+
- "\u0001\u0000\u0000\u00000\u0218\u0001\u0000\u0000\u00002\u021f\u0001\u0000"+
- "\u0000\u00004\u0229\u0001\u0000\u0000\u00006\u022d\u0001\u0000\u0000\u0000"+
- "8\u0233\u0001\u0000\u0000\u0000:\u0236\u0001\u0000\u0000\u0000<\u0238"+
- "\u0001\u0000\u0000\u0000>\u023f\u0001\u0000\u0000\u0000@\u0245\u0001\u0000"+
- "\u0000\u0000B\u0252\u0001\u0000\u0000\u0000D\u025b\u0001\u0000\u0000\u0000"+
- "F\u025f\u0001\u0000\u0000\u0000H\u0263\u0001\u0000\u0000\u0000J\u0269"+
- "\u0001\u0000\u0000\u0000L\u026b\u0001\u0000\u0000\u0000N\u026e\u0001\u0000"+
- "\u0000\u0000P\u0273\u0001\u0000\u0000\u0000R\u0279\u0001\u0000\u0000\u0000"+
- "T\u027f\u0001\u0000\u0000\u0000V\u0286\u0001\u0000\u0000\u0000X\u028d"+
- "\u0001\u0000\u0000\u0000Z\u0296\u0001\u0000\u0000\u0000\\\u029c\u0001"+
- "\u0000\u0000\u0000^\u02a2\u0001\u0000\u0000\u0000`\u02a9\u0001\u0000\u0000"+
- "\u0000b\u02af\u0001\u0000\u0000\u0000d\u02b6\u0001\u0000\u0000\u0000f"+
- "\u02bc\u0001\u0000\u0000\u0000h\u02c5\u0001\u0000\u0000\u0000j\u02cd\u0001"+
- "\u0000\u0000\u0000l\u02d3\u0001\u0000\u0000\u0000n\u02db\u0001\u0000\u0000"+
- "\u0000p\u02e2\u0001\u0000\u0000\u0000r\u02e7\u0001\u0000\u0000\u0000t"+
- "\u02f0\u0001\u0000\u0000\u0000v\u02ff\u0001\u0000\u0000\u0000x\u0305\u0001"+
- "\u0000\u0000\u0000z\u0312\u0001\u0000\u0000\u0000|\u0318\u0001\u0000\u0000"+
- "\u0000~\u031c\u0001\u0000\u0000\u0000\u0080\u031f\u0001\u0000\u0000\u0000"+
- "\u0082\u0326\u0001\u0000\u0000\u0000\u0084\u0330\u0001\u0000\u0000\u0000"+
- "\u0086\u033a\u0001\u0000\u0000\u0000\u0088\u0346\u0001\u0000\u0000\u0000"+
- "\u008a\u034f\u0001\u0000\u0000\u0000\u008c\u0359\u0001\u0000\u0000\u0000"+
- "\u008e\u0361\u0001\u0000\u0000\u0000\u0090\u036d\u0001\u0000\u0000\u0000"+
- "\u0092\u037c\u0001\u0000\u0000\u0000\u0094\u0382\u0001\u0000\u0000\u0000"+
- "\u0096\u0386\u0001\u0000\u0000\u0000\u0098\u038a\u0001\u0000\u0000\u0000"+
- "\u009a\u038f\u0001\u0000\u0000\u0000\u009c\u0397\u0001\u0000\u0000\u0000"+
- "\u009e\u039f\u0001\u0000\u0000\u0000\u00a0\u03a4\u0001\u0000\u0000\u0000"+
- "\u00a2\u03ae\u0001\u0000\u0000\u0000\u00a4\u03b5\u0001\u0000\u0000\u0000"+
- "\u00a6\u03ba\u0001\u0000\u0000\u0000\u00a8\u03c0\u0001\u0000\u0000\u0000"+
- "\u00aa\u03c3\u0001\u0000\u0000\u0000\u00ac\u03c7\u0001\u0000\u0000\u0000"+
- "\u00ae\u03ce\u0001\u0000\u0000\u0000\u00b0\u03d3\u0001\u0000\u0000\u0000"+
- "\u00b2\u03d8\u0001\u0000\u0000\u0000\u00b4\u03dd\u0001\u0000\u0000\u0000"+
- "\u00b6\u03e5\u0001\u0000\u0000\u0000\u00b8\u03ec\u0001\u0000\u0000\u0000"+
- "\u00ba\u03f2\u0001\u0000\u0000\u0000\u00bc\u0400\u0001\u0000\u0000\u0000"+
- "\u00be\u0403\u0001\u0000\u0000\u0000\u00c0\u0409\u0001\u0000\u0000\u0000"+
- "\u00c2\u040e\u0001\u0000\u0000\u0000\u00c4\u0419\u0001\u0000\u0000\u0000"+
- "\u00c6\u041d\u0001\u0000\u0000\u0000\u00c8\u0424\u0001\u0000\u0000\u0000"+
- "\u00ca\u042d\u0001\u0000\u0000\u0000\u00cc\u0431\u0001\u0000\u0000\u0000"+
- "\u00ce\u0437\u0001\u0000\u0000\u0000\u00d0\u0441\u0001\u0000\u0000\u0000"+
- "\u00d2\u0443\u0001\u0000\u0000\u0000\u00d4\u0447\u0001\u0000\u0000\u0000"+
- "\u00d6\u0449\u0001\u0000\u0000\u0000\u00d8\u044d\u0001\u0000\u0000\u0000"+
- "\u00da\u044f\u0001\u0000\u0000\u0000\u00dc\u0453\u0001\u0000\u0000\u0000"+
- "\u00de\u0455\u0001\u0000\u0000\u0000\u00e0\u0457\u0001\u0000\u0000\u0000"+
- "\u00e2\u0459\u0001\u0000\u0000\u0000\u00e4\u045b\u0001\u0000\u0000\u0000"+
- "\u00e6\u045d\u0001\u0000\u0000\u0000\u00e8\u0462\u0001\u0000\u0000\u0000"+
- "\u00ea\u0467\u0001\u0000\u0000\u0000\u00ec\u046a\u0001\u0000\u0000\u0000"+
- "\u00ee\u046e\u0001\u0000\u0000\u0000\u00f0\u0471\u0001\u0000\u0000\u0000"+
- "\u00f2\u0474\u0001\u0000\u0000\u0000\u00f4\u0477\u0001\u0000\u0000\u0000"+
- "\u00f6\u047a\u0001\u0000\u0000\u0000\u00f8\u047c\u0001\u0000\u0000\u0000"+
- "\u00fa\u047f\u0001\u0000\u0000\u0000\u00fc\u0481\u0001\u0000\u0000\u0000"+
- "\u00fe\u0484\u0001\u0000\u0000\u0000\u0100\u0486\u0001\u0000\u0000\u0000"+
- "\u0102\u0488\u0001\u0000\u0000\u0000\u0104\u048a\u0001\u0000\u0000\u0000"+
- "\u0106\u048d\u0001\u0000\u0000\u0000\u0108\u0490\u0001\u0000\u0000\u0000"+
- "\u010a\u0493\u0001\u0000\u0000\u0000\u010c\u0495\u0001\u0000\u0000\u0000"+
- "\u010e\u0497\u0001\u0000\u0000\u0000\u0110\u0499\u0001\u0000\u0000\u0000"+
- "\u0112\u049b\u0001\u0000\u0000\u0000\u0114\u049d\u0001\u0000\u0000\u0000"+
- "\u0116\u049f\u0001\u0000\u0000\u0000\u0118\u04ad\u0001\u0000\u0000\u0000"+
- "\u011a\u04b1\u0001\u0000\u0000\u0000\u011c\u04bd\u0001\u0000\u0000\u0000"+
- "\u011e\u04cb\u0001\u0000\u0000\u0000\u0120\u04d7\u0001\u0000\u0000\u0000"+
- "\u0122\u04fb\u0001\u0000\u0000\u0000\u0124\u04fd\u0001\u0000\u0000\u0000"+
- "\u0126\u0508\u0001\u0000\u0000\u0000\u0128\u050e\u0001\u0000\u0000\u0000"+
- "\u012a\u0515\u0001\u0000\u0000\u0000\u012c\u051b\u0001\u0000\u0000\u0000"+
- "\u012e\u051d\u0001\u0000\u0000\u0000\u0130\u0522\u0001\u0000\u0000\u0000"+
- "\u0132\u0527\u0001\u0000\u0000\u0000\u0134\u052e\u0001\u0000\u0000\u0000"+
- "\u0136\u0539\u0001\u0000\u0000\u0000\u0138\u0544\u0001\u0000\u0000\u0000"+
- "\u013a\u0551\u0001\u0000\u0000\u0000\u013c\u0557\u0001\u0000\u0000\u0000"+
- "\u013e\u0566\u0001\u0000\u0000\u0000\u0140\u056c\u0001\u0000\u0000\u0000"+
- "\u0142\u057b\u0001\u0000\u0000\u0000\u0144\u057d\u0001\u0000\u0000\u0000"+
- "\u0146\u0599\u0001\u0000\u0000\u0000\u0148\u05a3\u0001\u0000\u0000\u0000"+
- "\u014a\u05a5\u0001\u0000\u0000\u0000\u014c\u05a7\u0001\u0000\u0000\u0000"+
- "\u014e\u05a9\u0001\u0000\u0000\u0000\u0150\u05b1\u0001\u0000\u0000\u0000"+
- "\u0152\u05b3\u0001\u0000\u0000\u0000\u0154\u05b5\u0001\u0000\u0000\u0000"+
- "\u0156\u05b8\u0001\u0000\u0000\u0000\u0158\u05be\u0001\u0000\u0000\u0000"+
- "\u015a\u05cc\u0001\u0000\u0000\u0000\u015c\u05e9\u0001\u0000\u0000\u0000"+
- "\u015e\u05ed\u0001\u0000\u0000\u0000\u0160\u0163\u0003\u0004\u0001\u0000"+
- "\u0161\u0163\u0003\u0120\u008f\u0000\u0162\u0160\u0001\u0000\u0000\u0000"+
- "\u0162\u0161\u0001\u0000\u0000\u0000\u0163\u0164\u0001\u0000\u0000\u0000"+
- "\u0164\u0165\u0006\u0000\u0000\u0000\u0165\u0003\u0001\u0000\u0000\u0000"+
- "\u0166\u0170\u0003\u0146\u00a2\u0000\u0167\u0168\u0005.\u0000\u0000\u0168"+
- "\u016a\u0004\u0001\u0000\u0000\u0169\u016b\u0003\u0146\u00a2\u0000\u016a"+
- "\u0169\u0001\u0000\u0000\u0000\u016a\u016b\u0001\u0000\u0000\u0000\u016b"+
- "\u016d\u0001\u0000\u0000\u0000\u016c\u016e\u0003\u014e\u00a6\u0000\u016d"+
- "\u016c\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000\u0000\u016e"+
- "\u0171\u0001\u0000\u0000\u0000\u016f\u0171\u0003\u014e\u00a6\u0000\u0170"+
- "\u0167\u0001\u0000\u0000\u0000\u0170\u016f\u0001\u0000\u0000\u0000\u0171"+
- "\u0179\u0001\u0000\u0000\u0000\u0172\u0173\u0005.\u0000\u0000\u0173\u0174"+
- "\u0004\u0001\u0001\u0000\u0174\u0176\u0003\u0146\u00a2\u0000\u0175\u0177"+
- "\u0003\u014e\u00a6\u0000\u0176\u0175\u0001\u0000\u0000\u0000\u0176\u0177"+
- "\u0001\u0000\u0000\u0000\u0177\u0179\u0001\u0000\u0000\u0000\u0178\u0166"+
- "\u0001\u0000\u0000\u0000\u0178\u0172\u0001\u0000\u0000\u0000\u0179\u0005"+
- "\u0001\u0000\u0000\u0000\u017a\u017b\u0005t\u0000\u0000\u017b\u017c\u0005"+
- "r\u0000\u0000\u017c\u017d\u0005u\u0000\u0000\u017d\u017e\u0005e\u0000"+
- "\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u0180\u0006\u0002\u0000"+
- "\u0000\u0180\u0007\u0001\u0000\u0000\u0000\u0181\u0182\u0005f\u0000\u0000"+
- "\u0182\u0183\u0005a\u0000\u0000\u0183\u0184\u0005l\u0000\u0000\u0184\u0185"+
- "\u0005s\u0000\u0000\u0185\u0186\u0005e\u0000\u0000\u0186\u0187\u0001\u0000"+
- "\u0000\u0000\u0187\u0188\u0006\u0003\u0000\u0000\u0188\t\u0001\u0000\u0000"+
- "\u0000\u0189\u018a\u0005a\u0000\u0000\u018a\u018b\u0005s\u0000\u0000\u018b"+
- "\u018c\u0005s\u0000\u0000\u018c\u018d\u0005e\u0000\u0000\u018d\u018e\u0005"+
- "r\u0000\u0000\u018e\u018f\u0005t\u0000\u0000\u018f\u000b\u0001\u0000\u0000"+
- "\u0000\u0190\u0191\u0005a\u0000\u0000\u0191\u0192\u0005s\u0000\u0000\u0192"+
- "\u0193\u0005s\u0000\u0000\u0193\u0194\u0005u\u0000\u0000\u0194\u0195\u0005"+
- "m\u0000\u0000\u0195\u0196\u0005e\u0000\u0000\u0196\r\u0001\u0000\u0000"+
- "\u0000\u0197\u0198\u0005i\u0000\u0000\u0198\u0199\u0005n\u0000\u0000\u0199"+
- "\u019a\u0005h\u0000\u0000\u019a\u019b\u0005a\u0000\u0000\u019b\u019c\u0005"+
- "l\u0000\u0000\u019c\u019d\u0005e\u0000\u0000\u019d\u000f\u0001\u0000\u0000"+
- "\u0000\u019e\u019f\u0005e\u0000\u0000\u019f\u01a0\u0005x\u0000\u0000\u01a0"+
- "\u01a1\u0005h\u0000\u0000\u01a1\u01a2\u0005a\u0000\u0000\u01a2\u01a3\u0005"+
- "l\u0000\u0000\u01a3\u01a4\u0005e\u0000\u0000\u01a4\u0011\u0001\u0000\u0000"+
- "\u0000\u01a5\u01a6\u0005r\u0000\u0000\u01a6\u01a7\u0005e\u0000\u0000\u01a7"+
- "\u01a8\u0005q\u0000\u0000\u01a8\u01a9\u0005u\u0000\u0000\u01a9\u01aa\u0005"+
- "i\u0000\u0000\u01aa\u01ab\u0005r\u0000\u0000\u01ab\u01ac\u0005e\u0000"+
- "\u0000\u01ac\u01ad\u0005s\u0000\u0000\u01ad\u0013\u0001\u0000\u0000\u0000"+
- "\u01ae\u01af\u0005p\u0000\u0000\u01af\u01b0\u0005r\u0000\u0000\u01b0\u01b1"+
- "\u0005e\u0000\u0000\u01b1\u01b2\u0005s\u0000\u0000\u01b2\u01b3\u0005e"+
- "\u0000\u0000\u01b3\u01b4\u0005r\u0000\u0000\u01b4\u01b5\u0005v\u0000\u0000"+
- "\u01b5\u01b6\u0005e\u0000\u0000\u01b6\u01b7\u0005s\u0000\u0000\u01b7\u0015"+
- "\u0001\u0000\u0000\u0000\u01b8\u01b9\u0005e\u0000\u0000\u01b9\u01ba\u0005"+
- "n\u0000\u0000\u01ba\u01bb\u0005s\u0000\u0000\u01bb\u01bc\u0005u\u0000"+
- "\u0000\u01bc\u01bd\u0005r\u0000\u0000\u01bd\u01be\u0005e\u0000\u0000\u01be"+
- "\u01bf\u0005s\u0000\u0000\u01bf\u0017\u0001\u0000\u0000\u0000\u01c0\u01c1"+
- "\u0005i\u0000\u0000\u01c1\u01c2\u0005n\u0000\u0000\u01c2\u01c3\u0005v"+
- "\u0000\u0000\u01c3\u01c4\u0005a\u0000\u0000\u01c4\u01c5\u0005r\u0000\u0000"+
- "\u01c5\u01c6\u0005i\u0000\u0000\u01c6\u01c7\u0005a\u0000\u0000\u01c7\u01c8"+
- "\u0005n\u0000\u0000\u01c8\u01c9\u0005t\u0000\u0000\u01c9\u0019\u0001\u0000"+
- "\u0000\u0000\u01ca\u01cb\u0005d\u0000\u0000\u01cb\u01cc\u0005e\u0000\u0000"+
- "\u01cc\u01cd\u0005c\u0000\u0000\u01cd\u01ce\u0005r\u0000\u0000\u01ce\u01cf"+
- "\u0005e\u0000\u0000\u01cf\u01d0\u0005a\u0000\u0000\u01d0\u01d1\u0005s"+
- "\u0000\u0000\u01d1\u01d2\u0005e\u0000\u0000\u01d2\u01d3\u0005s\u0000\u0000"+
- "\u01d3\u01d4\u0001\u0000\u0000\u0000\u01d4\u01d5\u0006\f\u0000\u0000\u01d5"+
- "\u001b\u0001\u0000\u0000\u0000\u01d6\u01d7\u0005p\u0000\u0000\u01d7\u01d8"+
- "\u0005u\u0000\u0000\u01d8\u01d9\u0005r\u0000\u0000\u01d9\u01da\u0005e"+
- "\u0000\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01db\u01dc\u0006\r\u0000"+
- "\u0000\u01dc\u001d\u0001\u0000\u0000\u0000\u01dd\u01de\u0005i\u0000\u0000"+
- "\u01de\u01df\u0005m\u0000\u0000\u01df\u01e0\u0005p\u0000\u0000\u01e0\u01e1"+
- "\u0005l\u0000\u0000\u01e1\u01e2\u0005e\u0000\u0000\u01e2\u01e3\u0005m"+
- "\u0000\u0000\u01e3\u01e4\u0005e\u0000\u0000\u01e4\u01e5\u0005n\u0000\u0000"+
- "\u01e5\u01e6\u0005t\u0000\u0000\u01e6\u01e7\u0005s\u0000\u0000\u01e7\u001f"+
- "\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005a\u0000\u0000\u01e9\u01ea\u0005"+
- "s\u0000\u0000\u01ea!\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005o\u0000"+
- "\u0000\u01ec\u01ed\u0005l\u0000\u0000\u01ed\u01ee\u0005d\u0000\u0000\u01ee"+
- "\u01ef\u0001\u0000\u0000\u0000\u01ef\u01f0\u0006\u0010\u0000\u0000\u01f0"+
- "#\u0001\u0000\u0000\u0000\u01f1\u01f2\u0005b\u0000\u0000\u01f2\u01f3\u0005"+
- "e\u0000\u0000\u01f3\u01f4\u0005f\u0000\u0000\u01f4\u01f5\u0005o\u0000"+
- "\u0000\u01f5\u01f6\u0005r\u0000\u0000\u01f6\u01f7\u0005e\u0000\u0000\u01f7"+
- "\u01f8\u0001\u0000\u0000\u0000\u01f8\u01f9\u0006\u0011\u0000\u0000\u01f9"+
- "%\u0001\u0000\u0000\u0000\u01fa\u01fb\u0005#\u0000\u0000\u01fb\u01fc\u0005"+
- "l\u0000\u0000\u01fc\u01fd\u0005h\u0000\u0000\u01fd\u01fe\u0005s\u0000"+
- "\u0000\u01fe\'\u0001\u0000\u0000\u0000\u01ff\u0200\u0005f\u0000\u0000"+
- "\u0200\u0201\u0005o\u0000\u0000\u0201\u0202\u0005r\u0000\u0000\u0202\u0203"+
- "\u0005a\u0000\u0000\u0203\u0204\u0005l\u0000\u0000\u0204\u0205\u0005l"+
- "\u0000\u0000\u0205)\u0001\u0000\u0000\u0000\u0206\u0207\u0005e\u0000\u0000"+
- "\u0207\u0208\u0005x\u0000\u0000\u0208\u0209\u0005i\u0000\u0000\u0209\u020a"+
- "\u0005s\u0000\u0000\u020a\u020b\u0005t\u0000\u0000\u020b\u020c\u0005s"+
- "\u0000\u0000\u020c+\u0001\u0000\u0000\u0000\u020d\u020e\u0005a\u0000\u0000"+
- "\u020e\u020f\u0005c\u0000\u0000\u020f\u0210\u0005c\u0000\u0000\u0210\u0211"+
- "\u0001\u0000\u0000\u0000\u0211\u0212\u0006\u0015\u0000\u0000\u0212-\u0001"+
- "\u0000\u0000\u0000\u0213\u0214\u0005f\u0000\u0000\u0214\u0215\u0005o\u0000"+
- "\u0000\u0215\u0216\u0005l\u0000\u0000\u0216\u0217\u0005d\u0000\u0000\u0217"+
- "/\u0001\u0000\u0000\u0000\u0218\u0219\u0005u\u0000\u0000\u0219\u021a\u0005"+
- "n\u0000\u0000\u021a\u021b\u0005f\u0000\u0000\u021b\u021c\u0005o\u0000"+
- "\u0000\u021c\u021d\u0005l\u0000\u0000\u021d\u021e\u0005d\u0000\u0000\u021e"+
- "1\u0001\u0000\u0000\u0000\u021f\u0220\u0005u\u0000\u0000\u0220\u0221\u0005"+
- "n\u0000\u0000\u0221\u0222\u0005f\u0000\u0000\u0222\u0223\u0005o\u0000"+
- "\u0000\u0223\u0224\u0005l\u0000\u0000\u0224\u0225\u0005d\u0000\u0000\u0225"+
- "\u0226\u0005i\u0000\u0000\u0226\u0227\u0005n\u0000\u0000\u0227\u0228\u0005"+
- "g\u0000\u0000\u02283\u0001\u0000\u0000\u0000\u0229\u022a\u0005l\u0000"+
- "\u0000\u022a\u022b\u0005e\u0000\u0000\u022b\u022c\u0005t\u0000\u0000\u022c"+
- "5\u0001\u0000\u0000\u0000\u022d\u022e\u0005g\u0000\u0000\u022e\u022f\u0005"+
- "h\u0000\u0000\u022f\u0230\u0005o\u0000\u0000\u0230\u0231\u0005s\u0000"+
- "\u0000\u0231\u0232\u0005t\u0000\u0000\u02327\u0001\u0000\u0000\u0000\u0233"+
- "\u0234\u0005i\u0000\u0000\u0234\u0235\u0005n\u0000\u0000\u02359\u0001"+
- "\u0000\u0000\u0000\u0236\u0237\u0005#\u0000\u0000\u0237;\u0001\u0000\u0000"+
- "\u0000\u0238\u0239\u0005s\u0000\u0000\u0239\u023a\u0005u\u0000\u0000\u023a"+
- "\u023b\u0005b\u0000\u0000\u023b\u023c\u0005s\u0000\u0000\u023c\u023d\u0005"+
- "e\u0000\u0000\u023d\u023e\u0005t\u0000\u0000\u023e=\u0001\u0000\u0000"+
- "\u0000\u023f\u0240\u0005u\u0000\u0000\u0240\u0241\u0005n\u0000\u0000\u0241"+
- "\u0242\u0005i\u0000\u0000\u0242\u0243\u0005o\u0000\u0000\u0243\u0244\u0005"+
- "n\u0000\u0000\u0244?\u0001\u0000\u0000\u0000\u0245\u0246\u0005i\u0000"+
- "\u0000\u0246\u0247\u0005n\u0000\u0000\u0247\u0248\u0005t\u0000\u0000\u0248"+
- "\u0249\u0005e\u0000\u0000\u0249\u024a\u0005r\u0000\u0000\u024a\u024b\u0005"+
- "s\u0000\u0000\u024b\u024c\u0005e\u0000\u0000\u024c\u024d\u0005c\u0000"+
- "\u0000\u024d\u024e\u0005t\u0000\u0000\u024e\u024f\u0005i\u0000\u0000\u024f"+
- "\u0250\u0005o\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251A\u0001"+
- "\u0000\u0000\u0000\u0252\u0253\u0005s\u0000\u0000\u0253\u0254\u0005e\u0000"+
- "\u0000\u0254\u0255\u0005t\u0000\u0000\u0255\u0256\u0005m\u0000\u0000\u0256"+
- "\u0257\u0005i\u0000\u0000\u0257\u0258\u0005n\u0000\u0000\u0258\u0259\u0005"+
- "u\u0000\u0000\u0259\u025a\u0005s\u0000\u0000\u025aC\u0001\u0000\u0000"+
- "\u0000\u025b\u025c\u0005=\u0000\u0000\u025c\u025d\u0005=\u0000\u0000\u025d"+
- "\u025e\u0005>\u0000\u0000\u025eE\u0001\u0000\u0000\u0000\u025f\u0260\u0005"+
- "-\u0000\u0000\u0260\u0261\u0005-\u0000\u0000\u0261\u0262\u0005*\u0000"+
- "\u0000\u0262G\u0001\u0000\u0000\u0000\u0263\u0264\u0005a\u0000\u0000\u0264"+
- "\u0265\u0005p\u0000\u0000\u0265\u0266\u0005p\u0000\u0000\u0266\u0267\u0005"+
- "l\u0000\u0000\u0267\u0268\u0005y\u0000\u0000\u0268I\u0001\u0000\u0000"+
- "\u0000\u0269\u026a\u0005?\u0000\u0000\u026aK\u0001\u0000\u0000\u0000\u026b"+
- "\u026c\u0005!\u0000\u0000\u026c\u026d\u0005<\u0000\u0000\u026dM\u0001"+
- "\u0000\u0000\u0000\u026e\u026f\u0005!\u0000\u0000\u026f\u0270\u0005>\u0000"+
- "\u0000\u0270\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0006&\u0000\u0000"+
- "\u0272O\u0001\u0000\u0000\u0000\u0273\u0274\u0005s\u0000\u0000\u0274\u0275"+
- "\u0005e\u0000\u0000\u0275\u0276\u0005q\u0000\u0000\u0276\u0277\u0001\u0000"+
- "\u0000\u0000\u0277\u0278\u0006\'\u0000\u0000\u0278Q\u0001\u0000\u0000"+
- "\u0000\u0279\u027a\u0005s\u0000\u0000\u027a\u027b\u0005e\u0000\u0000\u027b"+
- "\u027c\u0005t\u0000\u0000\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u027e"+
- "\u0006(\u0000\u0000\u027eS\u0001\u0000\u0000\u0000\u027f\u0280\u0005m"+
- "\u0000\u0000\u0280\u0281\u0005s\u0000\u0000\u0281\u0282\u0005e\u0000\u0000"+
- "\u0282\u0283\u0005t\u0000\u0000\u0283\u0284\u0001\u0000\u0000\u0000\u0284"+
- "\u0285\u0006)\u0000\u0000\u0285U\u0001\u0000\u0000\u0000\u0286\u0287\u0005"+
- "d\u0000\u0000\u0287\u0288\u0005i\u0000\u0000\u0288\u0289\u0005c\u0000"+
- "\u0000\u0289\u028a\u0005t\u0000\u0000\u028a\u028b\u0001\u0000\u0000\u0000"+
- "\u028b\u028c\u0006*\u0000\u0000\u028cW\u0001\u0000\u0000\u0000\u028d\u028e"+
- "\u0005o\u0000\u0000\u028e\u028f\u0005p\u0000\u0000\u028f\u0290\u0005t"+
- "\u0000\u0000\u0290\u0291\u0005i\u0000\u0000\u0291\u0292\u0005o\u0000\u0000"+
- "\u0292\u0293\u0005n\u0000\u0000\u0293\u0294\u0001\u0000\u0000\u0000\u0294"+
- "\u0295\u0006+\u0000\u0000\u0295Y\u0001\u0000\u0000\u0000\u0296\u0297\u0005"+
- "l\u0000\u0000\u0297\u0298\u0005e\u0000\u0000\u0298\u0299\u0005n\u0000"+
- "\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a\u029b\u0006,\u0000\u0000"+
- "\u029b[\u0001\u0000\u0000\u0000\u029c\u029d\u0005n\u0000\u0000\u029d\u029e"+
- "\u0005e\u0000\u0000\u029e\u029f\u0005w\u0000\u0000\u029f\u02a0\u0001\u0000"+
- "\u0000\u0000\u02a0\u02a1\u0006-\u0000\u0000\u02a1]\u0001\u0000\u0000\u0000"+
- "\u02a2\u02a3\u0005m\u0000\u0000\u02a3\u02a4\u0005a\u0000\u0000\u02a4\u02a5"+
- "\u0005k\u0000\u0000\u02a5\u02a6\u0005e\u0000\u0000\u02a6\u02a7\u0001\u0000"+
- "\u0000\u0000\u02a7\u02a8\u0006.\u0000\u0000\u02a8_\u0001\u0000\u0000\u0000"+
- "\u02a9\u02aa\u0005c\u0000\u0000\u02aa\u02ab\u0005a\u0000\u0000\u02ab\u02ac"+
- "\u0005p\u0000\u0000\u02ac\u02ad\u0001\u0000\u0000\u0000\u02ad\u02ae\u0006"+
- "/\u0000\u0000\u02aea\u0001\u0000\u0000\u0000\u02af\u02b0\u0005s\u0000"+
- "\u0000\u02b0\u02b1\u0005o\u0000\u0000\u02b1\u02b2\u0005m\u0000\u0000\u02b2"+
- "\u02b3\u0005e\u0000\u0000\u02b3\u02b4\u0001\u0000\u0000\u0000\u02b4\u02b5"+
- "\u00060\u0000\u0000\u02b5c\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005g"+
- "\u0000\u0000\u02b7\u02b8\u0005e\u0000\u0000\u02b8\u02b9\u0005t\u0000\u0000"+
- "\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u00061\u0000\u0000\u02bb"+
- "e\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005d\u0000\u0000\u02bd\u02be\u0005"+
- "o\u0000\u0000\u02be\u02bf\u0005m\u0000\u0000\u02bf\u02c0\u0005a\u0000"+
- "\u0000\u02c0\u02c1\u0005i\u0000\u0000\u02c1\u02c2\u0005n\u0000\u0000\u02c2"+
- "\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c4\u00062\u0000\u0000\u02c4g\u0001"+
- "\u0000\u0000\u0000\u02c5\u02c6\u0005a\u0000\u0000\u02c6\u02c7\u0005x\u0000"+
- "\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8\u02c9\u0005o\u0000\u0000\u02c9"+
- "\u02ca\u0005m\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cc"+
- "\u00063\u0000\u0000\u02cci\u0001\u0000\u0000\u0000\u02cd\u02ce\u0005a"+
- "\u0000\u0000\u02ce\u02cf\u0005d\u0000\u0000\u02cf\u02d0\u0005t\u0000\u0000"+
- "\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d2\u00064\u0000\u0000\u02d2"+
- "k\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005m\u0000\u0000\u02d4\u02d5\u0005"+
- "a\u0000\u0000\u02d5\u02d6\u0005t\u0000\u0000\u02d6\u02d7\u0005c\u0000"+
- "\u0000\u02d7\u02d8\u0005h\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000"+
- "\u02d9\u02da\u00065\u0000\u0000\u02dam\u0001\u0000\u0000\u0000\u02db\u02dc"+
- "\u0005n\u0000\u0000\u02dc\u02dd\u0005o\u0000\u0000\u02dd\u02de\u0005n"+
- "\u0000\u0000\u02de\u02df\u0005e\u0000\u0000\u02df\u02e0\u0001\u0000\u0000"+
- "\u0000\u02e0\u02e1\u00066\u0000\u0000\u02e1o\u0001\u0000\u0000\u0000\u02e2"+
- "\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005r\u0000\u0000\u02e4\u02e5\u0005"+
- "e\u0000\u0000\u02e5\u02e6\u0005d\u0000\u0000\u02e6q\u0001\u0000\u0000"+
- "\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9\u0005y\u0000\u0000\u02e9"+
- "\u02ea\u0005p\u0000\u0000\u02ea\u02eb\u0005e\u0000\u0000\u02eb\u02ec\u0005"+
- "O\u0000\u0000\u02ec\u02ed\u0005f\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000"+
- "\u0000\u02ee\u02ef\u00068\u0000\u0000\u02efs\u0001\u0000\u0000\u0000\u02f0"+
- "\u02f1\u0005i\u0000\u0000\u02f1\u02f2\u0005s\u0000\u0000\u02f2\u02f3\u0005"+
- "C\u0000\u0000\u02f3\u02f4\u0005o\u0000\u0000\u02f4\u02f5\u0005m\u0000"+
- "\u0000\u02f5\u02f6\u0005p\u0000\u0000\u02f6\u02f7\u0005a\u0000\u0000\u02f7"+
- "\u02f8\u0005r\u0000\u0000\u02f8\u02f9\u0005a\u0000\u0000\u02f9\u02fa\u0005"+
- "b\u0000\u0000\u02fa\u02fb\u0005l\u0000\u0000\u02fb\u02fc\u0005e\u0000"+
- "\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000\u02fd\u02fe\u00069\u0000\u0000"+
- "\u02feu\u0001\u0000\u0000\u0000\u02ff\u0300\u0005l\u0000\u0000\u0300\u0301"+
- "\u0005o\u0000\u0000\u0301\u0302\u0005w\u0000\u0000\u0302\u0303\u0001\u0000"+
- "\u0000\u0000\u0303\u0304\u0006:\u0000\u0000\u0304w\u0001\u0000\u0000\u0000"+
- "\u0305\u0306\u0005l\u0000\u0000\u0306\u0307\u0005o\u0000\u0000\u0307\u0308"+
- "\u0005w\u0000\u0000\u0308\u0309\u0005C\u0000\u0000\u0309\u030a\u0005o"+
- "\u0000\u0000\u030a\u030b\u0005n\u0000\u0000\u030b\u030c\u0005t\u0000\u0000"+
- "\u030c\u030d\u0005e\u0000\u0000\u030d\u030e\u0005x\u0000\u0000\u030e\u030f"+
- "\u0005t\u0000\u0000\u030f\u0310\u0001\u0000\u0000\u0000\u0310\u0311\u0006"+
- ";\u0000\u0000\u0311y\u0001\u0000\u0000\u0000\u0312\u0313\u0005s\u0000"+
- "\u0000\u0313\u0314\u0005h\u0000\u0000\u0314\u0315\u0005a\u0000\u0000\u0315"+
- "\u0316\u0005r\u0000\u0000\u0316\u0317\u0005e\u0000\u0000\u0317{\u0001"+
- "\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319\u031a\u0001\u0000"+
- "\u0000\u0000\u031a\u031b\u0006=\u0000\u0000\u031b}\u0001\u0000\u0000\u0000"+
- "\u031c\u031d\u0005.\u0000\u0000\u031d\u031e\u0005.\u0000\u0000\u031e\u007f"+
- "\u0001\u0000\u0000\u0000\u031f\u0320\u0005s\u0000\u0000\u0320\u0321\u0005"+
- "h\u0000\u0000\u0321\u0322\u0005a\u0000\u0000\u0322\u0323\u0005r\u0000"+
- "\u0000\u0323\u0324\u0005e\u0000\u0000\u0324\u0325\u0005d\u0000\u0000\u0325"+
- "\u0081\u0001\u0000\u0000\u0000\u0326\u0327\u0005e\u0000\u0000\u0327\u0328"+
- "\u0005x\u0000\u0000\u0328\u0329\u0005c\u0000\u0000\u0329\u032a\u0005l"+
- "\u0000\u0000\u032a\u032b\u0005u\u0000\u0000\u032b\u032c\u0005s\u0000\u0000"+
- "\u032c\u032d\u0005i\u0000\u0000\u032d\u032e\u0005v\u0000\u0000\u032e\u032f"+
- "\u0005e\u0000\u0000\u032f\u0083\u0001\u0000\u0000\u0000\u0330\u0331\u0005"+
- "p\u0000\u0000\u0331\u0332\u0005r\u0000\u0000\u0332\u0333\u0005e\u0000"+
- "\u0000\u0333\u0334\u0005d\u0000\u0000\u0334\u0335\u0005i\u0000\u0000\u0335"+
- "\u0336\u0005c\u0000\u0000\u0336\u0337\u0005a\u0000\u0000\u0337\u0338\u0005"+
- "t\u0000\u0000\u0338\u0339\u0005e\u0000\u0000\u0339\u0085\u0001\u0000\u0000"+
- "\u0000\u033a\u033b\u0005w\u0000\u0000\u033b\u033c\u0005r\u0000\u0000\u033c"+
- "\u033d\u0005i\u0000\u0000\u033d\u033e\u0005t\u0000\u0000\u033e\u033f\u0005"+
- "e\u0000\u0000\u033f\u0340\u0005P\u0000\u0000\u0340\u0341\u0005e\u0000"+
- "\u0000\u0341\u0342\u0005r\u0000\u0000\u0342\u0343\u0005m\u0000\u0000\u0343"+
- "\u0344\u0001\u0000\u0000\u0000\u0344\u0345\u0006B\u0000\u0000\u0345\u0087"+
- "\u0001\u0000\u0000\u0000\u0346\u0347\u0005n\u0000\u0000\u0347\u0348\u0005"+
- "o\u0000\u0000\u0348\u0349\u0005P\u0000\u0000\u0349\u034a\u0005e\u0000"+
- "\u0000\u034a\u034b\u0005r\u0000\u0000\u034b\u034c\u0005m\u0000\u0000\u034c"+
- "\u034d\u0001\u0000\u0000\u0000\u034d\u034e\u0006C\u0000\u0000\u034e\u0089"+
- "\u0001\u0000\u0000\u0000\u034f\u0350\u0005t\u0000\u0000\u0350\u0351\u0005"+
- "r\u0000\u0000\u0351\u0352\u0005u\u0000\u0000\u0352\u0353\u0005s\u0000"+
- "\u0000\u0353\u0354\u0005t\u0000\u0000\u0354\u0355\u0005e\u0000\u0000\u0355"+
- "\u0356\u0005d\u0000\u0000\u0356\u0357\u0001\u0000\u0000\u0000\u0357\u0358"+
- "\u0006D\u0000\u0000\u0358\u008b\u0001\u0000\u0000\u0000\u0359\u035a\u0005"+
- "o\u0000\u0000\u035a\u035b\u0005u\u0000\u0000\u035b\u035c\u0005t\u0000"+
- "\u0000\u035c\u035d\u0005l\u0000\u0000\u035d\u035e\u0005i\u0000\u0000\u035e"+
- "\u035f\u0005n\u0000\u0000\u035f\u0360\u0005e\u0000\u0000\u0360\u008d\u0001"+
- "\u0000\u0000\u0000\u0361\u0362\u0005i\u0000\u0000\u0362\u0363\u0005n\u0000"+
- "\u0000\u0363\u0364\u0005i\u0000\u0000\u0364\u0365\u0005t\u0000\u0000\u0365"+
- "\u0366\u0005E\u0000\u0000\u0366\u0367\u0005n\u0000\u0000\u0367\u0368\u0005"+
- "s\u0000\u0000\u0368\u0369\u0005u\u0000\u0000\u0369\u036a\u0005r\u0000"+
- "\u0000\u036a\u036b\u0005e\u0000\u0000\u036b\u036c\u0005s\u0000\u0000\u036c"+
- "\u008f\u0001\u0000\u0000\u0000\u036d\u036e\u0005i\u0000\u0000\u036e\u036f"+
- "\u0005m\u0000\u0000\u036f\u0370\u0005p\u0000\u0000\u0370\u0371\u0005o"+
- "\u0000\u0000\u0371\u0372\u0005r\u0000\u0000\u0372\u0373\u0005t\u0000\u0000"+
- "\u0373\u0374\u0005R\u0000\u0000\u0374\u0375\u0005e\u0000\u0000\u0375\u0376"+
- "\u0005q\u0000\u0000\u0376\u0377\u0005u\u0000\u0000\u0377\u0378\u0005i"+
- "\u0000\u0000\u0378\u0379\u0005r\u0000\u0000\u0379\u037a\u0005e\u0000\u0000"+
- "\u037a\u037b\u0005s\u0000\u0000\u037b\u0091\u0001\u0000\u0000\u0000\u037c"+
- "\u037d\u0005p\u0000\u0000\u037d\u037e\u0005r\u0000\u0000\u037e\u037f\u0005"+
- "o\u0000\u0000\u037f\u0380\u0005o\u0000\u0000\u0380\u0381\u0005f\u0000"+
- "\u0000\u0381\u0093\u0001\u0000\u0000\u0000\u0382\u0383\u0005=\u0000\u0000"+
- "\u0383\u0384\u0005=\u0000\u0000\u0384\u0385\u0005=\u0000\u0000\u0385\u0095"+
- "\u0001\u0000\u0000\u0000\u0386\u0387\u0005!\u0000\u0000\u0387\u0388\u0005"+
- "=\u0000\u0000\u0388\u0389\u0005=\u0000\u0000\u0389\u0097\u0001\u0000\u0000"+
- "\u0000\u038a\u038b\u0005w\u0000\u0000\u038b\u038c\u0005i\u0000\u0000\u038c"+
- "\u038d\u0005t\u0000\u0000\u038d\u038e\u0005h\u0000\u0000\u038e\u0099\u0001"+
- "\u0000\u0000\u0000\u038f\u0390\u0005b\u0000\u0000\u0390\u0391\u0005r\u0000"+
- "\u0000\u0391\u0392\u0005e\u0000\u0000\u0392\u0393\u0005a\u0000\u0000\u0393"+
- "\u0394\u0005k\u0000\u0000\u0394\u0395\u0001\u0000\u0000\u0000\u0395\u0396"+
- "\u0006L\u0000\u0000\u0396\u009b\u0001\u0000\u0000\u0000\u0397\u0398\u0005"+
- "d\u0000\u0000\u0398\u0399\u0005e\u0000\u0000\u0399\u039a\u0005f\u0000"+
- "\u0000\u039a\u039b\u0005a\u0000\u0000\u039b\u039c\u0005u\u0000\u0000\u039c"+
- "\u039d\u0005l\u0000\u0000\u039d\u039e\u0005t\u0000\u0000\u039e\u009d\u0001"+
- "\u0000\u0000\u0000\u039f\u03a0\u0005f\u0000\u0000\u03a0\u03a1\u0005u\u0000"+
- "\u0000\u03a1\u03a2\u0005n\u0000\u0000\u03a2\u03a3\u0005c\u0000\u0000\u03a3"+
- "\u009f\u0001\u0000\u0000\u0000\u03a4\u03a5\u0005i\u0000\u0000\u03a5\u03a6"+
- "\u0005n\u0000\u0000\u03a6\u03a7\u0005t\u0000\u0000\u03a7\u03a8\u0005e"+
- "\u0000\u0000\u03a8\u03a9\u0005r\u0000\u0000\u03a9\u03aa\u0005f\u0000\u0000"+
- "\u03aa\u03ab\u0005a\u0000\u0000\u03ab\u03ac\u0005c\u0000\u0000\u03ac\u03ad"+
- "\u0005e\u0000\u0000\u03ad\u00a1\u0001\u0000\u0000\u0000\u03ae\u03af\u0005"+
- "s\u0000\u0000\u03af\u03b0\u0005e\u0000\u0000\u03b0\u03b1\u0005l\u0000"+
- "\u0000\u03b1\u03b2\u0005e\u0000\u0000\u03b2\u03b3\u0005c\u0000\u0000\u03b3"+
- "\u03b4\u0005t\u0000\u0000\u03b4\u00a3\u0001\u0000\u0000\u0000\u03b5\u03b6"+
- "\u0005c\u0000\u0000\u03b6\u03b7\u0005a\u0000\u0000\u03b7\u03b8\u0005s"+
- "\u0000\u0000\u03b8\u03b9\u0005e\u0000\u0000\u03b9\u00a5\u0001\u0000\u0000"+
- "\u0000\u03ba\u03bb\u0005d\u0000\u0000\u03bb\u03bc\u0005e\u0000\u0000\u03bc"+
- "\u03bd\u0005f\u0000\u0000\u03bd\u03be\u0005e\u0000\u0000\u03be\u03bf\u0005"+
- "r\u0000\u0000\u03bf\u00a7\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005g\u0000"+
- "\u0000\u03c1\u03c2\u0005o\u0000\u0000\u03c2\u00a9\u0001\u0000\u0000\u0000"+
- "\u03c3\u03c4\u0005m\u0000\u0000\u03c4\u03c5\u0005a\u0000\u0000\u03c5\u03c6"+
- "\u0005p\u0000\u0000\u03c6\u00ab\u0001\u0000\u0000\u0000\u03c7\u03c8\u0005"+
- "s\u0000\u0000\u03c8\u03c9\u0005t\u0000\u0000\u03c9\u03ca\u0005r\u0000"+
- "\u0000\u03ca\u03cb\u0005u\u0000\u0000\u03cb\u03cc\u0005c\u0000\u0000\u03cc"+
- "\u03cd\u0005t\u0000\u0000\u03cd\u00ad\u0001\u0000\u0000\u0000\u03ce\u03cf"+
- "\u0005c\u0000\u0000\u03cf\u03d0\u0005h\u0000\u0000\u03d0\u03d1\u0005a"+
- "\u0000\u0000\u03d1\u03d2\u0005n\u0000\u0000\u03d2\u00af\u0001\u0000\u0000"+
- "\u0000\u03d3\u03d4\u0005e\u0000\u0000\u03d4\u03d5\u0005l\u0000\u0000\u03d5"+
- "\u03d6\u0005s\u0000\u0000\u03d6\u03d7\u0005e\u0000\u0000\u03d7\u00b1\u0001"+
- "\u0000\u0000\u0000\u03d8\u03d9\u0005g\u0000\u0000\u03d9\u03da\u0005o\u0000"+
- "\u0000\u03da\u03db\u0005t\u0000\u0000\u03db\u03dc\u0005o\u0000\u0000\u03dc"+
- "\u00b3\u0001\u0000\u0000\u0000\u03dd\u03de\u0005p\u0000\u0000\u03de\u03df"+
- "\u0005a\u0000\u0000\u03df\u03e0\u0005c\u0000\u0000\u03e0\u03e1\u0005k"+
- "\u0000\u0000\u03e1\u03e2\u0005a\u0000\u0000\u03e2\u03e3\u0005g\u0000\u0000"+
- "\u03e3\u03e4\u0005e\u0000\u0000\u03e4\u00b5\u0001\u0000\u0000\u0000\u03e5"+
- "\u03e6\u0005s\u0000\u0000\u03e6\u03e7\u0005w\u0000\u0000\u03e7\u03e8\u0005"+
- "i\u0000\u0000\u03e8\u03e9\u0005t\u0000\u0000\u03e9\u03ea\u0005c\u0000"+
- "\u0000\u03ea\u03eb\u0005h\u0000\u0000\u03eb\u00b7\u0001\u0000\u0000\u0000"+
- "\u03ec\u03ed\u0005c\u0000\u0000\u03ed\u03ee\u0005o\u0000\u0000\u03ee\u03ef"+
- "\u0005n\u0000\u0000\u03ef\u03f0\u0005s\u0000\u0000\u03f0\u03f1\u0005t"+
- "\u0000\u0000\u03f1\u00b9\u0001\u0000\u0000\u0000\u03f2\u03f3\u0005f\u0000"+
- "\u0000\u03f3\u03f4\u0005a\u0000\u0000\u03f4\u03f5\u0005l\u0000\u0000\u03f5"+
- "\u03f6\u0005l\u0000\u0000\u03f6\u03f7\u0005t\u0000\u0000\u03f7\u03f8\u0005"+
- "h\u0000\u0000\u03f8\u03f9\u0005r\u0000\u0000\u03f9\u03fa\u0005o\u0000"+
- "\u0000\u03fa\u03fb\u0005u\u0000\u0000\u03fb\u03fc\u0005g\u0000\u0000\u03fc"+
- "\u03fd\u0005h\u0000\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe\u03ff"+
- "\u0006\\\u0000\u0000\u03ff\u00bb\u0001\u0000\u0000\u0000\u0400\u0401\u0005"+
- "i\u0000\u0000\u0401\u0402\u0005f\u0000\u0000\u0402\u00bd\u0001\u0000\u0000"+
- "\u0000\u0403\u0404\u0005r\u0000\u0000\u0404\u0405\u0005a\u0000\u0000\u0405"+
- "\u0406\u0005n\u0000\u0000\u0406\u0407\u0005g\u0000\u0000\u0407\u0408\u0005"+
- "e\u0000\u0000\u0408\u00bf\u0001\u0000\u0000\u0000\u0409\u040a\u0005t\u0000"+
- "\u0000\u040a\u040b\u0005y\u0000\u0000\u040b\u040c\u0005p\u0000\u0000\u040c"+
- "\u040d\u0005e\u0000\u0000\u040d\u00c1\u0001\u0000\u0000\u0000\u040e\u040f"+
- "\u0005c\u0000\u0000\u040f\u0410\u0005o\u0000\u0000\u0410\u0411\u0005n"+
- "\u0000\u0000\u0411\u0412\u0005t\u0000\u0000\u0412\u0413\u0005i\u0000\u0000"+
- "\u0413\u0414\u0005n\u0000\u0000\u0414\u0415\u0005u\u0000\u0000\u0415\u0416"+
- "\u0005e\u0000\u0000\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u0418\u0006"+
- "`\u0000\u0000\u0418\u00c3\u0001\u0000\u0000\u0000\u0419\u041a\u0005f\u0000"+
- "\u0000\u041a\u041b\u0005o\u0000\u0000\u041b\u041c\u0005r\u0000\u0000\u041c"+
- "\u00c5\u0001\u0000\u0000\u0000\u041d\u041e\u0005i\u0000\u0000\u041e\u041f"+
- "\u0005m\u0000\u0000\u041f\u0420\u0005p\u0000\u0000\u0420\u0421\u0005o"+
- "\u0000\u0000\u0421\u0422\u0005r\u0000\u0000\u0422\u0423\u0005t\u0000\u0000"+
- "\u0423\u00c7\u0001\u0000\u0000\u0000\u0424\u0425\u0005r\u0000\u0000\u0425"+
- "\u0426\u0005e\u0000\u0000\u0426\u0427\u0005t\u0000\u0000\u0427\u0428\u0005"+
- "u\u0000\u0000\u0428\u0429\u0005r\u0000\u0000\u0429\u042a\u0005n\u0000"+
- "\u0000\u042a\u042b\u0001\u0000\u0000\u0000\u042b\u042c\u0006c\u0000\u0000"+
- "\u042c\u00c9\u0001\u0000\u0000\u0000\u042d\u042e\u0005v\u0000\u0000\u042e"+
- "\u042f\u0005a\u0000\u0000\u042f\u0430\u0005r\u0000\u0000\u0430\u00cb\u0001"+
- "\u0000\u0000\u0000\u0431\u0432\u0005n\u0000\u0000\u0432\u0433\u0005i\u0000"+
- "\u0000\u0433\u0434\u0005l\u0000\u0000\u0434\u0435\u0001\u0000\u0000\u0000"+
- "\u0435\u0436\u0006e\u0000\u0000\u0436\u00cd\u0001\u0000\u0000\u0000\u0437"+
- "\u043c\u0003\u0150\u00a7\u0000\u0438\u043b\u0003\u0150\u00a7\u0000\u0439"+
- "\u043b\u0003\u0152\u00a8\u0000\u043a\u0438\u0001\u0000\u0000\u0000\u043a"+
- "\u0439\u0001\u0000\u0000\u0000\u043b\u043e\u0001\u0000\u0000\u0000\u043c"+
- "\u043a\u0001\u0000\u0000\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d"+
- "\u043f\u0001\u0000\u0000\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043f"+
- "\u0440\u0006f\u0000\u0000\u0440\u00cf\u0001\u0000\u0000\u0000\u0441\u0442"+
- "\u0005(\u0000\u0000\u0442\u00d1\u0001\u0000\u0000\u0000\u0443\u0444\u0005"+
- ")\u0000\u0000\u0444\u0445\u0001\u0000\u0000\u0000\u0445\u0446\u0006h\u0000"+
- "\u0000\u0446\u00d3\u0001\u0000\u0000\u0000\u0447\u0448\u0005{\u0000\u0000"+
- "\u0448\u00d5\u0001\u0000\u0000\u0000\u0449\u044a\u0005}\u0000\u0000\u044a"+
- "\u044b\u0001\u0000\u0000\u0000\u044b\u044c\u0006j\u0000\u0000\u044c\u00d7"+
- "\u0001\u0000\u0000\u0000\u044d\u044e\u0005[\u0000\u0000\u044e\u00d9\u0001"+
- "\u0000\u0000\u0000\u044f\u0450\u0005]\u0000\u0000\u0450\u0451\u0001\u0000"+
- "\u0000\u0000\u0451\u0452\u0006l\u0000\u0000\u0452\u00db\u0001\u0000\u0000"+
- "\u0000\u0453\u0454\u0005=\u0000\u0000\u0454\u00dd\u0001\u0000\u0000\u0000"+
- "\u0455\u0456\u0005,\u0000\u0000\u0456\u00df\u0001\u0000\u0000\u0000\u0457"+
- "\u0458\u0005;\u0000\u0000\u0458\u00e1\u0001\u0000\u0000\u0000\u0459\u045a"+
- "\u0005:\u0000\u0000\u045a\u00e3\u0001\u0000\u0000\u0000\u045b\u045c\u0005"+
- ".\u0000\u0000\u045c\u00e5\u0001\u0000\u0000\u0000\u045d\u045e\u0005+\u0000"+
- "\u0000\u045e\u045f\u0005+\u0000\u0000\u045f\u0460\u0001\u0000\u0000\u0000"+
- "\u0460\u0461\u0006r\u0000\u0000\u0461\u00e7\u0001\u0000\u0000\u0000\u0462"+
- "\u0463\u0005-\u0000\u0000\u0463\u0464\u0005-\u0000\u0000\u0464\u0465\u0001"+
- "\u0000\u0000\u0000\u0465\u0466\u0006s\u0000\u0000\u0466\u00e9\u0001\u0000"+
- "\u0000\u0000\u0467\u0468\u0005:\u0000\u0000\u0468\u0469\u0005=\u0000\u0000"+
- "\u0469\u00eb\u0001\u0000\u0000\u0000\u046a\u046b\u0005.\u0000\u0000\u046b"+
- "\u046c\u0005.\u0000\u0000\u046c\u046d\u0005.\u0000\u0000\u046d\u00ed\u0001"+
- "\u0000\u0000\u0000\u046e\u046f\u0005|\u0000\u0000\u046f\u0470\u0005|\u0000"+
- "\u0000\u0470\u00ef\u0001\u0000\u0000\u0000\u0471\u0472\u0005&\u0000\u0000"+
- "\u0472\u0473\u0005&\u0000\u0000\u0473\u00f1\u0001\u0000\u0000\u0000\u0474"+
- "\u0475\u0005=\u0000\u0000\u0475\u0476\u0005=\u0000\u0000\u0476\u00f3\u0001"+
- "\u0000\u0000\u0000\u0477\u0478\u0005!\u0000\u0000\u0478\u0479\u0005=\u0000"+
- "\u0000\u0479\u00f5\u0001\u0000\u0000\u0000\u047a\u047b\u0005<\u0000\u0000"+
- "\u047b\u00f7\u0001\u0000\u0000\u0000\u047c\u047d\u0005<\u0000\u0000\u047d"+
- "\u047e\u0005=\u0000\u0000\u047e\u00f9\u0001\u0000\u0000\u0000\u047f\u0480"+
- "\u0005>\u0000\u0000\u0480\u00fb\u0001\u0000\u0000\u0000\u0481\u0482\u0005"+
- ">\u0000\u0000\u0482\u0483\u0005=\u0000\u0000\u0483\u00fd\u0001\u0000\u0000"+
- "\u0000\u0484\u0485\u0005|\u0000\u0000\u0485\u00ff\u0001\u0000\u0000\u0000"+
- "\u0486\u0487\u0005/\u0000\u0000\u0487\u0101\u0001\u0000\u0000\u0000\u0488"+
- "\u0489\u0005%\u0000\u0000\u0489\u0103\u0001\u0000\u0000\u0000\u048a\u048b"+
- "\u0005<\u0000\u0000\u048b\u048c\u0005<\u0000\u0000\u048c\u0105\u0001\u0000"+
- "\u0000\u0000\u048d\u048e\u0005>\u0000\u0000\u048e\u048f\u0005>\u0000\u0000"+
- "\u048f\u0107\u0001\u0000\u0000\u0000\u0490\u0491\u0005&\u0000\u0000\u0491"+
- "\u0492\u0005^\u0000\u0000\u0492\u0109\u0001\u0000\u0000\u0000\u0493\u0494"+
- "\u0005!\u0000\u0000\u0494\u010b\u0001\u0000\u0000\u0000\u0495\u0496\u0005"+
- "+\u0000\u0000\u0496\u010d\u0001\u0000\u0000\u0000\u0497\u0498\u0005-\u0000"+
- "\u0000\u0498\u010f\u0001\u0000\u0000\u0000\u0499\u049a\u0005^\u0000\u0000"+
- "\u049a\u0111\u0001\u0000\u0000\u0000\u049b\u049c\u0005*\u0000\u0000\u049c"+
- "\u0113\u0001\u0000\u0000\u0000\u049d\u049e\u0005&\u0000\u0000\u049e\u0115"+
- "\u0001\u0000\u0000\u0000\u049f\u04a0\u0005<\u0000\u0000\u04a0\u04a1\u0005"+
- "-\u0000\u0000\u04a1\u0117\u0001\u0000\u0000\u0000\u04a2\u04ae\u00050\u0000"+
- "\u0000\u04a3\u04aa\u0007\u0000\u0000\u0000\u04a4\u04a6\u0005_\u0000\u0000"+
- "\u04a5\u04a4\u0001\u0000\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000"+
- "\u04a6\u04a7\u0001\u0000\u0000\u0000\u04a7\u04a9\u0007\u0001\u0000\u0000"+
- "\u04a8\u04a5\u0001\u0000\u0000\u0000\u04a9\u04ac\u0001\u0000\u0000\u0000"+
- "\u04aa\u04a8\u0001\u0000\u0000\u0000\u04aa\u04ab\u0001\u0000\u0000\u0000"+
- "\u04ab\u04ae\u0001\u0000\u0000\u0000\u04ac\u04aa\u0001\u0000\u0000\u0000"+
- "\u04ad\u04a2\u0001\u0000\u0000\u0000\u04ad\u04a3\u0001\u0000\u0000\u0000"+
- "\u04ae\u04af\u0001\u0000\u0000\u0000\u04af\u04b0\u0006\u008b\u0000\u0000"+
- "\u04b0\u0119\u0001\u0000\u0000\u0000\u04b1\u04b2\u00050\u0000\u0000\u04b2"+
- "\u04b7\u0007\u0002\u0000\u0000\u04b3\u04b5\u0005_\u0000\u0000\u04b4\u04b3"+
- "\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6"+
- "\u0001\u0000\u0000\u0000\u04b6\u04b8\u0003\u014c\u00a5\u0000\u04b7\u04b4"+
- "\u0001\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9\u04b7"+
- "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba\u04bb"+
- "\u0001\u0000\u0000\u0000\u04bb\u04bc\u0006\u008c\u0000\u0000\u04bc\u011b"+
- "\u0001\u0000\u0000\u0000\u04bd\u04bf\u00050\u0000\u0000\u04be\u04c0\u0007"+
- "\u0003\u0000\u0000\u04bf\u04be\u0001\u0000\u0000\u0000\u04bf\u04c0\u0001"+
- "\u0000\u0000\u0000\u04c0\u04c5\u0001\u0000\u0000\u0000\u04c1\u04c3\u0005"+
- "_\u0000\u0000\u04c2\u04c1\u0001\u0000\u0000\u0000\u04c2\u04c3\u0001\u0000"+
- "\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c6\u0003\u0148"+
- "\u00a3\u0000\u04c5\u04c2\u0001\u0000\u0000\u0000\u04c6\u04c7\u0001\u0000"+
- "\u0000\u0000\u04c7\u04c5\u0001\u0000\u0000\u0000\u04c7\u04c8\u0001\u0000"+
- "\u0000\u0000\u04c8\u04c9\u0001\u0000\u0000\u0000\u04c9\u04ca\u0006\u008d"+
- "\u0000\u0000\u04ca\u011d\u0001\u0000\u0000\u0000\u04cb\u04cc\u00050\u0000"+
- "\u0000\u04cc\u04d1\u0007\u0004\u0000\u0000\u04cd\u04cf\u0005_\u0000\u0000"+
- "\u04ce\u04cd\u0001\u0000\u0000\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000"+
- "\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04d2\u0003\u014a\u00a4\u0000"+
- "\u04d1\u04ce\u0001\u0000\u0000\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000"+
- "\u04d3\u04d1\u0001\u0000\u0000\u0000\u04d3\u04d4\u0001\u0000\u0000\u0000"+
- "\u04d4\u04d5\u0001\u0000\u0000\u0000\u04d5\u04d6\u0006\u008e\u0000\u0000"+
- "\u04d6\u011f\u0001\u0000\u0000\u0000\u04d7\u04d8\u00050\u0000\u0000\u04d8"+
- "\u04d9\u0007\u0004\u0000\u0000\u04d9\u04da\u0003\u0122\u0090\u0000\u04da"+
- "\u04db\u0003\u0124\u0091\u0000\u04db\u0121\u0001\u0000\u0000\u0000\u04dc"+
- "\u04de\u0005_\u0000\u0000\u04dd\u04dc\u0001\u0000\u0000\u0000\u04dd\u04de"+
- "\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000\u0000\u04df\u04e1"+
- "\u0003\u014a\u00a4\u0000\u04e0\u04dd\u0001\u0000\u0000\u0000\u04e1\u04e2"+
- "\u0001\u0000\u0000\u0000\u04e2\u04e0\u0001\u0000\u0000\u0000\u04e2\u04e3"+
- "\u0001\u0000\u0000\u0000\u04e3\u04ee\u0001\u0000\u0000\u0000\u04e4\u04eb"+
- "\u0005.\u0000\u0000\u04e5\u04e7\u0005_\u0000\u0000\u04e6\u04e5\u0001\u0000"+
- "\u0000\u0000\u04e6\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001\u0000"+
- "\u0000\u0000\u04e8\u04ea\u0003\u014a\u00a4\u0000\u04e9\u04e6\u0001\u0000"+
- "\u0000\u0000\u04ea\u04ed\u0001\u0000\u0000\u0000\u04eb\u04e9\u0001\u0000"+
- "\u0000\u0000\u04eb\u04ec\u0001\u0000\u0000\u0000\u04ec\u04ef\u0001\u0000"+
- "\u0000\u0000\u04ed\u04eb\u0001\u0000\u0000\u0000\u04ee\u04e4\u0001\u0000"+
- "\u0000\u0000\u04ee\u04ef\u0001\u0000\u0000\u0000\u04ef\u04fc\u0001\u0000"+
- "\u0000\u0000\u04f0\u04f1\u0005.\u0000\u0000\u04f1\u04f8\u0003\u014a\u00a4"+
- "\u0000\u04f2\u04f4\u0005_\u0000\u0000\u04f3\u04f2\u0001\u0000\u0000\u0000"+
- "\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000"+
- "\u04f5\u04f7\u0003\u014a\u00a4\u0000\u04f6\u04f3\u0001\u0000\u0000\u0000"+
- "\u04f7\u04fa\u0001\u0000\u0000\u0000\u04f8\u04f6\u0001\u0000\u0000\u0000"+
- "\u04f8\u04f9\u0001\u0000\u0000\u0000\u04f9\u04fc\u0001\u0000\u0000\u0000"+
- "\u04fa\u04f8\u0001\u0000\u0000\u0000\u04fb\u04e0\u0001\u0000\u0000\u0000"+
- "\u04fb\u04f0\u0001\u0000\u0000\u0000\u04fc\u0123\u0001\u0000\u0000\u0000"+
- "\u04fd\u04ff\u0007\u0005\u0000\u0000\u04fe\u0500\u0007\u0006\u0000\u0000"+
- "\u04ff\u04fe\u0001\u0000\u0000\u0000\u04ff\u0500\u0001\u0000\u0000\u0000"+
- "\u0500\u0501\u0001\u0000\u0000\u0000\u0501\u0502\u0003\u0146\u00a2\u0000"+
- "\u0502\u0125\u0001\u0000\u0000\u0000\u0503\u0509\u0003\u0118\u008b\u0000"+
- "\u0504\u0509\u0003\u011a\u008c\u0000\u0505\u0509\u0003\u011c\u008d\u0000"+
- "\u0506\u0509\u0003\u011e\u008e\u0000\u0507\u0509\u0003\u0002\u0000\u0000"+
- "\u0508\u0503\u0001\u0000\u0000\u0000\u0508\u0504\u0001\u0000\u0000\u0000"+
- "\u0508\u0505\u0001\u0000\u0000\u0000\u0508\u0506\u0001\u0000\u0000\u0000"+
- "\u0508\u0507\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000\u0000\u0000"+
- "\u050a\u050b\u0005i\u0000\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c"+
- "\u050d\u0006\u0092\u0000\u0000\u050d\u0127\u0001\u0000\u0000\u0000\u050e"+
- "\u0511\u0005\'\u0000\u0000\u050f\u0512\u0003\u0142\u00a0\u0000\u0510\u0512"+
- "\u0003\u012c\u0095\u0000\u0511\u050f\u0001\u0000\u0000\u0000\u0511\u0510"+
- "\u0001\u0000\u0000\u0000\u0512\u0513\u0001\u0000\u0000\u0000\u0513\u0514"+
- "\u0005\'\u0000\u0000\u0514\u0129\u0001\u0000\u0000\u0000\u0515\u0516\u0003"+
- "\u0128\u0093\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u0518\u0006"+
- "\u0094\u0000\u0000\u0518\u012b\u0001\u0000\u0000\u0000\u0519\u051c\u0003"+
- "\u012e\u0096\u0000\u051a\u051c\u0003\u0130\u0097\u0000\u051b\u0519\u0001"+
- "\u0000\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u012d\u0001"+
- "\u0000\u0000\u0000\u051d\u051e\u0005\\\u0000\u0000\u051e\u051f\u0003\u0148"+
- "\u00a3\u0000\u051f\u0520\u0003\u0148\u00a3\u0000\u0520\u0521\u0003\u0148"+
- "\u00a3\u0000\u0521\u012f\u0001\u0000\u0000\u0000\u0522\u0523\u0005\\\u0000"+
- "\u0000\u0523\u0524\u0005x\u0000\u0000\u0524\u0525\u0003\u014a\u00a4\u0000"+
- "\u0525\u0526\u0003\u014a\u00a4\u0000\u0526\u0131\u0001\u0000\u0000\u0000"+
- "\u0527\u0528\u0005\\\u0000\u0000\u0528\u0529\u0005u\u0000\u0000\u0529"+
- "\u052a\u0003\u014a\u00a4\u0000\u052a\u052b\u0003\u014a\u00a4\u0000\u052b"+
- "\u052c\u0003\u014a\u00a4\u0000\u052c\u052d\u0003\u014a\u00a4\u0000\u052d"+
- "\u0133\u0001\u0000\u0000\u0000\u052e\u052f\u0005\\\u0000\u0000\u052f\u0530"+
- "\u0005U\u0000\u0000\u0530\u0531\u0003\u014a\u00a4\u0000\u0531\u0532\u0003"+
- "\u014a\u00a4\u0000\u0532\u0533\u0003\u014a\u00a4\u0000\u0533\u0534\u0003"+
- "\u014a\u00a4\u0000\u0534\u0535\u0003\u014a\u00a4\u0000\u0535\u0536\u0003"+
- "\u014a\u00a4\u0000\u0536\u0537\u0003\u014a\u00a4\u0000\u0537\u0538\u0003"+
- "\u014a\u00a4\u0000\u0538\u0135\u0001\u0000\u0000\u0000\u0539\u053d\u0005"+
- "`\u0000\u0000\u053a\u053c\b\u0007\u0000\u0000\u053b\u053a\u0001\u0000"+
- "\u0000\u0000\u053c\u053f\u0001\u0000\u0000\u0000\u053d\u053b\u0001\u0000"+
- "\u0000\u0000\u053d\u053e\u0001\u0000\u0000\u0000\u053e\u0540\u0001\u0000"+
- "\u0000\u0000\u053f\u053d\u0001\u0000\u0000\u0000\u0540\u0541\u0005`\u0000"+
- "\u0000\u0541\u0542\u0001\u0000\u0000\u0000\u0542\u0543\u0006\u009a\u0000"+
- "\u0000\u0543\u0137\u0001\u0000\u0000\u0000\u0544\u0549\u0005\"\u0000\u0000"+
- "\u0545\u0548\b\b\u0000\u0000\u0546\u0548\u0003\u0144\u00a1\u0000\u0547"+
- "\u0545\u0001\u0000\u0000\u0000\u0547\u0546\u0001\u0000\u0000\u0000\u0548"+
- "\u054b\u0001\u0000\u0000\u0000\u0549\u0547\u0001\u0000\u0000\u0000\u0549"+
- "\u054a\u0001\u0000\u0000\u0000\u054a\u054c\u0001\u0000\u0000\u0000\u054b"+
- "\u0549\u0001\u0000\u0000\u0000\u054c\u054d\u0005\"\u0000\u0000\u054d\u054e"+
- "\u0001\u0000\u0000\u0000\u054e\u054f\u0006\u009b\u0000\u0000\u054f\u0139"+
- "\u0001\u0000\u0000\u0000\u0550\u0552\u0007\t\u0000\u0000\u0551\u0550\u0001"+
- "\u0000\u0000\u0000\u0552\u0553\u0001\u0000\u0000\u0000\u0553\u0551\u0001"+
- "\u0000\u0000\u0000\u0553\u0554\u0001\u0000\u0000\u0000\u0554\u0555\u0001"+
- "\u0000\u0000\u0000\u0555\u0556\u0006\u009c\u0001\u0000\u0556\u013b\u0001"+
- "\u0000\u0000\u0000\u0557\u0558\u0005/\u0000\u0000\u0558\u0559\u0005*\u0000"+
- "\u0000\u0559\u055d\u0001\u0000\u0000\u0000\u055a\u055c\t\u0000\u0000\u0000"+
- "\u055b\u055a\u0001\u0000\u0000\u0000\u055c\u055f\u0001\u0000\u0000\u0000"+
- "\u055d\u055e\u0001\u0000\u0000\u0000\u055d\u055b\u0001\u0000\u0000\u0000"+
- "\u055e\u0560\u0001\u0000\u0000\u0000\u055f\u055d\u0001\u0000\u0000\u0000"+
- "\u0560\u0561\u0005*\u0000\u0000\u0561\u0562\u0005/\u0000\u0000\u0562\u0563"+
- "\u0001\u0000\u0000\u0000\u0563\u0564\u0006\u009d\u0001\u0000\u0564\u013d"+
- "\u0001\u0000\u0000\u0000\u0565\u0567\u0007\n\u0000\u0000\u0566\u0565\u0001"+
- "\u0000\u0000\u0000\u0567\u0568\u0001\u0000\u0000\u0000\u0568\u0566\u0001"+
- "\u0000\u0000\u0000\u0568\u0569\u0001\u0000\u0000\u0000\u0569\u056a\u0001"+
- "\u0000\u0000\u0000\u056a\u056b\u0006\u009e\u0001\u0000\u056b\u013f\u0001"+
- "\u0000\u0000\u0000\u056c\u056d\u0005/\u0000\u0000\u056d\u056e\u0005/\u0000"+
- "\u0000\u056e\u0572\u0001\u0000\u0000\u0000\u056f\u0571\b\n\u0000\u0000"+
- "\u0570\u056f\u0001\u0000\u0000\u0000\u0571\u0574\u0001\u0000\u0000\u0000"+
- "\u0572\u0570\u0001\u0000\u0000\u0000\u0572\u0573\u0001\u0000\u0000\u0000"+
- "\u0573\u0575\u0001\u0000\u0000\u0000\u0574\u0572\u0001\u0000\u0000\u0000"+
- "\u0575\u0576\u0006\u009f\u0001\u0000\u0576\u0141\u0001\u0000\u0000\u0000"+
- "\u0577\u057c\b\u000b\u0000\u0000\u0578\u057c\u0003\u0132\u0098\u0000\u0579"+
- "\u057c\u0003\u0134\u0099\u0000\u057a\u057c\u0003\u0144\u00a1\u0000\u057b"+
- "\u0577\u0001\u0000\u0000\u0000\u057b\u0578\u0001\u0000\u0000\u0000\u057b"+
- "\u0579\u0001\u0000\u0000\u0000\u057b\u057a\u0001\u0000\u0000\u0000\u057c"+
- "\u0143\u0001\u0000\u0000\u0000\u057d\u0597\u0005\\\u0000\u0000\u057e\u057f"+
- "\u0005u\u0000\u0000\u057f\u0580\u0003\u014a\u00a4\u0000\u0580\u0581\u0003"+
- "\u014a\u00a4\u0000\u0581\u0582\u0003\u014a\u00a4\u0000\u0582\u0583\u0003"+
- "\u014a\u00a4\u0000\u0583\u0598\u0001\u0000\u0000\u0000\u0584\u0585\u0005"+
- "U\u0000\u0000\u0585\u0586\u0003\u014a\u00a4\u0000\u0586\u0587\u0003\u014a"+
- "\u00a4\u0000\u0587\u0588\u0003\u014a\u00a4\u0000\u0588\u0589\u0003\u014a"+
- "\u00a4\u0000\u0589\u058a\u0003\u014a\u00a4\u0000\u058a\u058b\u0003\u014a"+
- "\u00a4\u0000\u058b\u058c\u0003\u014a\u00a4\u0000\u058c\u058d\u0003\u014a"+
- "\u00a4\u0000\u058d\u0598\u0001\u0000\u0000\u0000\u058e\u0598\u0007\f\u0000"+
- "\u0000\u058f\u0590\u0003\u0148\u00a3\u0000\u0590\u0591\u0003\u0148\u00a3"+
- "\u0000\u0591\u0592\u0003\u0148\u00a3\u0000\u0592\u0598\u0001\u0000\u0000"+
- "\u0000\u0593\u0594\u0005x\u0000\u0000\u0594\u0595\u0003\u014a\u00a4\u0000"+
- "\u0595\u0596\u0003\u014a\u00a4\u0000\u0596\u0598\u0001\u0000\u0000\u0000"+
- "\u0597\u057e\u0001\u0000\u0000\u0000\u0597\u0584\u0001\u0000\u0000\u0000"+
- "\u0597\u058e\u0001\u0000\u0000\u0000\u0597\u058f\u0001\u0000\u0000\u0000"+
- "\u0597\u0593\u0001\u0000\u0000\u0000\u0598\u0145\u0001\u0000\u0000\u0000"+
- "\u0599\u05a0\u0007\u0001\u0000\u0000\u059a\u059c\u0005_\u0000\u0000\u059b"+
- "\u059a\u0001\u0000\u0000\u0000\u059b\u059c\u0001\u0000\u0000\u0000\u059c"+
- "\u059d\u0001\u0000\u0000\u0000\u059d\u059f\u0007\u0001\u0000\u0000\u059e"+
- "\u059b\u0001\u0000\u0000\u0000\u059f\u05a2\u0001\u0000\u0000\u0000\u05a0"+
- "\u059e\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1"+
- "\u0147\u0001\u0000\u0000\u0000\u05a2\u05a0\u0001\u0000\u0000\u0000\u05a3"+
- "\u05a4\u0007\r\u0000\u0000\u05a4\u0149\u0001\u0000\u0000\u0000\u05a5\u05a6"+
- "\u0007\u000e\u0000\u0000\u05a6\u014b\u0001\u0000\u0000\u0000\u05a7\u05a8"+
- "\u0007\u000f\u0000\u0000\u05a8\u014d\u0001\u0000\u0000\u0000\u05a9\u05ab"+
- "\u0007\u0010\u0000\u0000\u05aa\u05ac\u0007\u0006\u0000\u0000\u05ab\u05aa"+
- "\u0001\u0000\u0000\u0000\u05ab\u05ac\u0001\u0000\u0000\u0000\u05ac\u05ad"+
- "\u0001\u0000\u0000\u0000\u05ad\u05ae\u0003\u0146\u00a2\u0000\u05ae\u014f"+
- "\u0001\u0000\u0000\u0000\u05af\u05b2\u0003\u0154\u00a9\u0000\u05b0\u05b2"+
- "\u0005_\u0000\u0000\u05b1\u05af\u0001\u0000\u0000\u0000\u05b1\u05b0\u0001"+
- "\u0000\u0000\u0000\u05b2\u0151\u0001\u0000\u0000\u0000\u05b3\u05b4\u0007"+
- "\u0011\u0000\u0000\u05b4\u0153\u0001\u0000\u0000\u0000\u05b5\u05b6\u0007"+
- "\u0012\u0000\u0000\u05b6\u0155\u0001\u0000\u0000\u0000\u05b7\u05b9\u0007"+
- "\t\u0000\u0000\u05b8\u05b7\u0001\u0000\u0000\u0000\u05b9\u05ba\u0001\u0000"+
- "\u0000\u0000\u05ba\u05b8\u0001\u0000\u0000\u0000\u05ba\u05bb\u0001\u0000"+
- "\u0000\u0000\u05bb\u05bc\u0001\u0000\u0000\u0000\u05bc\u05bd\u0006\u00aa"+
- "\u0001\u0000\u05bd\u0157\u0001\u0000\u0000\u0000\u05be\u05bf\u0005/\u0000"+
- "\u0000\u05bf\u05c0\u0005*\u0000\u0000\u05c0\u05c4\u0001\u0000\u0000\u0000"+
- "\u05c1\u05c3\b\n\u0000\u0000\u05c2\u05c1\u0001\u0000\u0000\u0000\u05c3"+
- "\u05c6\u0001\u0000\u0000\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000\u05c4"+
- "\u05c2\u0001\u0000\u0000\u0000\u05c5\u05c7\u0001\u0000\u0000\u0000\u05c6"+
- "\u05c4\u0001\u0000\u0000\u0000\u05c7\u05c8\u0005*\u0000\u0000\u05c8\u05c9"+
- "\u0005/\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000\u0000\u05ca\u05cb\u0006"+
- "\u00ab\u0001\u0000\u05cb\u0159\u0001\u0000\u0000\u0000\u05cc\u05cd\u0005"+
- "/\u0000\u0000\u05cd\u05ce\u0005/\u0000\u0000\u05ce\u05d2\u0001\u0000\u0000"+
- "\u0000\u05cf\u05d1\b\n\u0000\u0000\u05d0\u05cf\u0001\u0000\u0000\u0000"+
- "\u05d1\u05d4\u0001\u0000\u0000\u0000\u05d2\u05d0\u0001\u0000\u0000\u0000"+
- "\u05d2\u05d3\u0001\u0000\u0000\u0000\u05d3\u05d5\u0001\u0000\u0000\u0000"+
- "\u05d4\u05d2\u0001\u0000\u0000\u0000\u05d5\u05d6\u0006\u00ac\u0001\u0000"+
- "\u05d6\u015b\u0001\u0000\u0000\u0000\u05d7\u05d9\u0007\n\u0000\u0000\u05d8"+
- "\u05d7\u0001\u0000\u0000\u0000\u05d9\u05da\u0001\u0000\u0000\u0000\u05da"+
- "\u05d8\u0001\u0000\u0000\u0000\u05da\u05db\u0001\u0000\u0000\u0000\u05db"+
- "\u05ea\u0001\u0000\u0000\u0000\u05dc\u05ea\u0005;\u0000\u0000\u05dd\u05de"+
- "\u0005/\u0000\u0000\u05de\u05df\u0005*\u0000\u0000\u05df\u05e3\u0001\u0000"+
- "\u0000\u0000\u05e0\u05e2\t\u0000\u0000\u0000\u05e1\u05e0\u0001\u0000\u0000"+
- "\u0000\u05e2\u05e5\u0001\u0000\u0000\u0000\u05e3\u05e4\u0001\u0000\u0000"+
- "\u0000\u05e3\u05e1\u0001\u0000\u0000\u0000\u05e4\u05e6\u0001\u0000\u0000"+
- "\u0000\u05e5\u05e3\u0001\u0000\u0000\u0000\u05e6\u05e7\u0005*\u0000\u0000"+
- "\u05e7\u05ea\u0005/\u0000\u0000\u05e8\u05ea\u0005\u0000\u0000\u0001\u05e9"+
- "\u05d8\u0001\u0000\u0000\u0000\u05e9\u05dc\u0001\u0000\u0000\u0000\u05e9"+
- "\u05dd\u0001\u0000\u0000\u0000\u05e9\u05e8\u0001\u0000\u0000\u0000\u05ea"+
- "\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0006\u00ad\u0002\u0000\u05ec"+
- "\u015d\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee"+
- "\u05ef\u0001\u0000\u0000\u0000\u05ef\u05f0\u0006\u00ae\u0002\u0000\u05f0"+
- "\u05f1\u0006\u00ae\u0001\u0000\u05f1\u015f\u0001\u0000\u0000\u00003\u0000"+
- "\u0001\u0162\u016a\u016d\u0170\u0176\u0178\u043a\u043c\u04a5\u04aa\u04ad"+
- "\u04b4\u04b9\u04bf\u04c2\u04c7\u04ce\u04d3\u04dd\u04e2\u04e6\u04eb\u04ee"+
- "\u04f3\u04f8\u04fb\u04ff\u0508\u0511\u051b\u053d\u0547\u0549\u0553\u055d"+
- "\u0568\u0572\u057b\u0597\u059b\u05a0\u05ab\u05b1\u05ba\u05c4\u05d2\u05da"+
- "\u05e3\u05e9\u0003\u0002\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000";
+ "L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+
+ "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001"+
+ "N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001"+
+ "P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001"+
+ "Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+
+ "R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001"+
+ "T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+
+ "V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+
+ "X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+
+ "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001"+
+ "]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+
+ "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+
+ "_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001a\u0001a\u0001"+
+ "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001"+
+ "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+
+ "d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+
+ "e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+
+ "g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+
+ "i\u0001i\u0001i\u0005i\u045a\bi\ni\fi\u045d\ti\u0001i\u0001i\u0001j\u0001"+
+ "j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+
+ "m\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001q\u0001"+
+ "q\u0001r\u0001r\u0001s\u0001s\u0001t\u0001t\u0001u\u0001u\u0001u\u0001"+
+ "u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001"+
+ "x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001"+
+ "{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001~\u0001~\u0001"+
+ "~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+
+ "\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0084"+
+ "\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0086"+
+ "\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088"+
+ "\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b"+
+ "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e"+
+ "\u0001\u008e\u0001\u008e\u0003\u008e\u04c5\b\u008e\u0001\u008e\u0005\u008e"+
+ "\u04c8\b\u008e\n\u008e\f\u008e\u04cb\t\u008e\u0003\u008e\u04cd\b\u008e"+
+ "\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0003\u008f"+
+ "\u04d4\b\u008f\u0001\u008f\u0004\u008f\u04d7\b\u008f\u000b\u008f\f\u008f"+
+ "\u04d8\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0003\u0090\u04df"+
+ "\b\u0090\u0001\u0090\u0003\u0090\u04e2\b\u0090\u0001\u0090\u0004\u0090"+
+ "\u04e5\b\u0090\u000b\u0090\f\u0090\u04e6\u0001\u0090\u0001\u0090\u0001"+
+ "\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u04ee\b\u0091\u0001\u0091\u0004"+
+ "\u0091\u04f1\b\u0091\u000b\u0091\f\u0091\u04f2\u0001\u0091\u0001\u0091"+
+ "\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0093"+
+ "\u0003\u0093\u04fd\b\u0093\u0001\u0093\u0004\u0093\u0500\b\u0093\u000b"+
+ "\u0093\f\u0093\u0501\u0001\u0093\u0001\u0093\u0003\u0093\u0506\b\u0093"+
+ "\u0001\u0093\u0005\u0093\u0509\b\u0093\n\u0093\f\u0093\u050c\t\u0093\u0003"+
+ "\u0093\u050e\b\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u0513"+
+ "\b\u0093\u0001\u0093\u0005\u0093\u0516\b\u0093\n\u0093\f\u0093\u0519\t"+
+ "\u0093\u0003\u0093\u051b\b\u0093\u0001\u0094\u0001\u0094\u0003\u0094\u051f"+
+ "\b\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001"+
+ "\u0095\u0001\u0095\u0003\u0095\u0528\b\u0095\u0001\u0095\u0001\u0095\u0001"+
+ "\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0531"+
+ "\b\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+
+ "\u0097\u0001\u0098\u0001\u0098\u0003\u0098\u053b\b\u0098\u0001\u0099\u0001"+
+ "\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001"+
+ "\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+
+ "\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001"+
+ "\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+
+ "\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0005\u009d\u055b"+
+ "\b\u009d\n\u009d\f\u009d\u055e\t\u009d\u0001\u009d\u0001\u009d\u0001\u009d"+
+ "\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0005\u009e\u0567\b\u009e"+
+ "\n\u009e\f\u009e\u056a\t\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+
+ "\u009e\u0001\u009f\u0004\u009f\u0571\b\u009f\u000b\u009f\f\u009f\u0572"+
+ "\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+
+ "\u0005\u00a0\u057b\b\u00a0\n\u00a0\f\u00a0\u057e\t\u00a0\u0001\u00a0\u0001"+
+ "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004\u00a1\u0586"+
+ "\b\u00a1\u000b\u00a1\f\u00a1\u0587\u0001\u00a1\u0001\u00a1\u0001\u00a2"+
+ "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0005\u00a2\u0590\b\u00a2\n\u00a2"+
+ "\f\u00a2\u0593\t\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3"+
+ "\u0001\u00a3\u0001\u00a3\u0003\u00a3\u059b\b\u00a3\u0001\u00a4\u0001\u00a4"+
+ "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+
+ "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+
+ "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+
+ "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+
+ "\u0003\u00a4\u05b7\b\u00a4\u0001\u00a5\u0001\u00a5\u0003\u00a5\u05bb\b"+
+ "\u00a5\u0001\u00a5\u0005\u00a5\u05be\b\u00a5\n\u00a5\f\u00a5\u05c1\t\u00a5"+
+ "\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8"+
+ "\u0001\u00a9\u0001\u00a9\u0003\u00a9\u05cb\b\u00a9\u0001\u00a9\u0001\u00a9"+
+ "\u0001\u00aa\u0001\u00aa\u0003\u00aa\u05d1\b\u00aa\u0001\u00ab\u0001\u00ab"+
+ "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0004\u00ad\u05d8\b\u00ad\u000b\u00ad"+
+ "\f\u00ad\u05d9\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae"+
+ "\u0001\u00ae\u0005\u00ae\u05e2\b\u00ae\n\u00ae\f\u00ae\u05e5\t\u00ae\u0001"+
+ "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001"+
+ "\u00af\u0001\u00af\u0001\u00af\u0005\u00af\u05f0\b\u00af\n\u00af\f\u00af"+
+ "\u05f3\t\u00af\u0001\u00af\u0001\u00af\u0001\u00b0\u0004\u00b0\u05f8\b"+
+ "\u00b0\u000b\u00b0\f\u00b0\u05f9\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001"+
+ "\u00b0\u0001\u00b0\u0005\u00b0\u0601\b\u00b0\n\u00b0\f\u00b0\u0604\t\u00b0"+
+ "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003\u00b0\u0609\b\u00b0\u0001\u00b0"+
+ "\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1"+
+ "\u0003\u057c\u05e3\u0602\u0000\u00b2\u0002\u0001\u0004\u0002\u0006\u0003"+
+ "\b\u0004\n\u0005\f\u0006\u000e\u0007\u0010\b\u0012\t\u0014\n\u0016\u000b"+
+ "\u0018\f\u001a\r\u001c\u000e\u001e\u000f \u0010\"\u0011$\u0012&\u0013"+
+ "(\u0014*\u0015,\u0016.\u00170\u00182\u00194\u001a6\u001b8\u001c:\u001d"+
+ "<\u001e>\u001f@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^/`0b1d2f3h4j5l6n7p8r9"+
+ "t:v;x~?\u0080@\u0082A\u0084B\u0086C\u0088D\u008aE\u008cF\u008eG\u0090"+
+ "H\u0092I\u0094J\u0096K\u0098L\u009aM\u009cN\u009eO\u00a0P\u00a2Q\u00a4"+
+ "R\u00a6S\u00a8T\u00aaU\u00acV\u00aeW\u00b0X\u00b2Y\u00b4Z\u00b6[\u00b8"+
+ "\\\u00ba]\u00bc^\u00be_\u00c0`\u00c2a\u00c4b\u00c6c\u00c8d\u00cae\u00cc"+
+ "f\u00ceg\u00d0h\u00d2i\u00d4j\u00d6k\u00d8l\u00dam\u00dcn\u00deo\u00e0"+
+ "p\u00e2q\u00e4r\u00e6s\u00e8t\u00eau\u00ecv\u00eew\u00f0x\u00f2y\u00f4"+
+ "z\u00f6{\u00f8|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080\u0102\u0081\u0104"+
+ "\u0082\u0106\u0083\u0108\u0084\u010a\u0085\u010c\u0086\u010e\u0087\u0110"+
+ "\u0088\u0112\u0089\u0114\u008a\u0116\u008b\u0118\u008c\u011a\u008d\u011c"+
+ "\u008e\u011e\u008f\u0120\u0090\u0122\u0091\u0124\u0092\u0126\u0093\u0128"+
+ "\u0000\u012a\u0000\u012c\u0094\u012e\u0000\u0130\u0095\u0132\u0096\u0134"+
+ "\u0097\u0136\u0098\u0138\u0099\u013a\u009a\u013c\u009b\u013e\u009c\u0140"+
+ "\u009d\u0142\u009e\u0144\u009f\u0146\u00a0\u0148\u0000\u014a\u0000\u014c"+
+ "\u0000\u014e\u0000\u0150\u0000\u0152\u0000\u0154\u0000\u0156\u0000\u0158"+
+ "\u0000\u015a\u0000\u015c\u00a1\u015e\u00a2\u0160\u00a3\u0162\u00a4\u0164"+
+ "\u00a5\u0002\u0000\u0001\u0013\u0001\u000019\u0001\u000009\u0002\u0000"+
+ "BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002\u0000PPpp\u0002\u0000++--\u0001"+
+ "\u0000``\u0002\u0000\"\"\\\\\u0002\u0000\t\t \u0002\u0000\n\n\r\r\u0003"+
+ "\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abffnnrrttvv\u0001\u000007\u0003"+
+ "\u000009AFaf\u0001\u000001\u0002\u0000EEee@\u000009\u0660\u0669\u06f0"+
+ "\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6\u0aef\u0b66"+
+ "\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0de6\u0def\u0e50"+
+ "\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049\u1090\u1099\u17e0\u17e9\u1810"+
+ "\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89\u1a90\u1a99\u1b50\u1b59\u1bb0"+
+ "\u1bb9\u1c40\u1c49\u1c50\u1c59\u8000\ua620\u8000\ua629\u8000\ua8d0\u8000"+
+ "\ua8d9\u8000\ua900\u8000\ua909\u8000\ua9d0\u8000\ua9d9\u8000\ua9f0\u8000"+
+ "\ua9f9\u8000\uaa50\u8000\uaa59\u8000\uabf0\u8000\uabf9\u8000\uff10\u8000"+
+ "\uff19\u8001\u04a0\u8001\u04a9\u8001\u0d30\u8001\u0d39\u8001\u1066\u8001"+
+ "\u106f\u8001\u10f0\u8001\u10f9\u8001\u1136\u8001\u113f\u8001\u11d0\u8001"+
+ "\u11d9\u8001\u12f0\u8001\u12f9\u8001\u1450\u8001\u1459\u8001\u14d0\u8001"+
+ "\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0\u8001\u16c9\u8001\u1730\u8001"+
+ "\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950\u8001\u1959\u8001\u1c50\u8001"+
+ "\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0\u8001\u1da9\u8001\u1f50\u8001"+
+ "\u1f59\u8001\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6b50\u8001"+
+ "\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140\u8001\ue149\u8001\ue2f0\u8001"+
+ "\ue2f9\u8001\ue4f0\u8001\ue4f9\u8001\ue950\u8001\ue959\u8001\ufbf0\u8001"+
+ "\ufbf9\u0293\u0000AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6"+
+ "\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee"+
+ "\u0370\u0374\u0376\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a"+
+ "\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556"+
+ "\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f"+
+ "\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff"+
+ "\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5"+
+ "\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858"+
+ "\u0860\u086a\u0870\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d"+
+ "\u0950\u0950\u0958\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8"+
+ "\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd"+
+ "\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28"+
+ "\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e"+
+ "\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3"+
+ "\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c"+
+ "\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d"+
+ "\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90"+
+ "\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa"+
+ "\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39"+
+ "\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c"+
+ "\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde"+
+ "\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d"+
+ "\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1"+
+ "\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46"+
+ "\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0"+
+ "\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00"+
+ "\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055"+
+ "\u105a\u105d\u1061\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e"+
+ "\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d"+
+ "\u1250\u1256\u1258\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0"+
+ "\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310"+
+ "\u1312\u1315\u1318\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c"+
+ "\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731"+
+ "\u1740\u1751\u1760\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc"+
+ "\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e"+
+ "\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54"+
+ "\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5"+
+ "\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf"+
+ "\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15"+
+ "\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b"+
+ "\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4"+
+ "\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc"+
+ "\u2071\u2071\u207f\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113"+
+ "\u2115\u2115\u2119\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d"+
+ "\u212f\u2139\u213c\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4"+
+ "\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67"+
+ "\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe"+
+ "\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006"+
+ "\u3031\u3035\u303b\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff"+
+ "\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000"+
+ "\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000"+
+ "\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000"+
+ "\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000"+
+ "\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000"+
+ "\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000"+
+ "\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000"+
+ "\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000"+
+ "\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000"+
+ "\ua946\u8000\ua960\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000"+
+ "\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000"+
+ "\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000"+
+ "\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000"+
+ "\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000"+
+ "\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000"+
+ "\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000"+
+ "\uab06\u8000\uab09\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000"+
+ "\uab26\u8000\uab28\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000"+
+ "\uab69\u8000\uab70\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000"+
+ "\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000"+
+ "\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000"+
+ "\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000"+
+ "\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000"+
+ "\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000"+
+ "\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000"+
+ "\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000"+
+ "\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000"+
+ "\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001"+
+ "\u000b\u8001\r\u8001&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001"+
+ "P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001"+
+ "\u02d0\u8001\u0300\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001"+
+ "\u0349\u8001\u0350\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001"+
+ "\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001"+
+ "\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001"+
+ "\u0563\u8001\u0570\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001"+
+ "\u0592\u8001\u0594\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001"+
+ "\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001"+
+ "\u0736\u8001\u0740\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001"+
+ "\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001"+
+ "\u0805\u8001\u0808\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001"+
+ "\u0838\u8001\u083c\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001"+
+ "\u0876\u8001\u0880\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001"+
+ "\u08f5\u8001\u0900\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001"+
+ "\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001"+
+ "\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001"+
+ "\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001"+
+ "\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001"+
+ "\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001"+
+ "\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001"+
+ "\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001"+
+ "\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001"+
+ "\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001"+
+ "\u1072\u8001\u1075\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001"+
+ "\u10e8\u8001\u1103\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001"+
+ "\u1147\u8001\u1150\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001"+
+ "\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001"+
+ "\u11dc\u8001\u1200\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u123f\u8001"+
+ "\u1240\u8001\u1280\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001"+
+ "\u128d\u8001\u128f\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001"+
+ "\u12de\u8001\u1305\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001"+
+ "\u1328\u8001\u132a\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001"+
+ "\u1339\u8001\u133d\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001"+
+ "\u1361\u8001\u1400\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001"+
+ "\u1461\u8001\u1480\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001"+
+ "\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001"+
+ "\u162f\u8001\u1644\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001"+
+ "\u16b8\u8001\u1700\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001"+
+ "\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001"+
+ "\u1909\u8001\u190c\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001"+
+ "\u192f\u8001\u193f\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001"+
+ "\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001"+
+ "\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001"+
+ "\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001"+
+ "\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001"+
+ "\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001"+
+ "\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001"+
+ "\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001"+
+ "\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1f02\u8001"+
+ "\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12\u8001\u1f33\u8001\u1fb0\u8001"+
+ "\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480\u8001\u2543\u8001\u2f90\u8001"+
+ "\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441\u8001\u3446\u8001\u4400\u8001"+
+ "\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70\u8001"+
+ "\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40\u8001"+
+ "\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40\u8001"+
+ "\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93\u8001"+
+ "\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000\u8001"+
+ "\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0\u8001"+
+ "\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000\u8001"+
+ "\ub122\u8001\ub132\u8001\ub132\u8001\ub150\u8001\ub152\u8001\ub155\u8001"+
+ "\ub155\u8001\ub164\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001\ubc00\u8001"+
+ "\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001\ubc90\u8001"+
+ "\ubc99\u8001\ud400\u8001\ud454\u8001\ud456\u8001\ud49c\u8001\ud49e\u8001"+
+ "\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001\ud4a9\u8001"+
+ "\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001\ud4bd\u8001"+
+ "\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507\u8001\ud50a\u8001\ud50d\u8001"+
+ "\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001\ud53b\u8001"+
+ "\ud53e\u8001\ud540\u8001\ud544\u8001\ud546\u8001\ud546\u8001\ud54a\u8001"+
+ "\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001\ud6c2\u8001"+
+ "\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001\ud716\u8001"+
+ "\ud734\u8001\ud736\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001\ud770\u8001"+
+ "\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001\ud7c4\u8001"+
+ "\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25\u8001\udf2a\u8001\ue030\u8001"+
+ "\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001"+
+ "\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue4d0\u8001"+
+ "\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001"+
+ "\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001"+
+ "\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00\u8001\uee03\u8001\uee05\u8001"+
+ "\uee1f\u8001\uee21\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001"+
+ "\uee27\u8001\uee29\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001"+
+ "\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001"+
+ "\uee47\u8001\uee49\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001"+
+ "\uee4f\u8001\uee51\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001"+
+ "\uee57\u8001\uee59\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001"+
+ "\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001"+
+ "\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001"+
+ "\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001"+
+ "\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001"+
+ "\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002"+
+ "\ub739\u8002\ub740\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002"+
+ "\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000\u8003\u134a\u8003\u1350\u8003"+
+ "\u23af\u063d\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004\u0001\u0000"+
+ "\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000"+
+ "\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000"+
+ "\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000"+
+ "\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000"+
+ "\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000"+
+ "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+
+ "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+
+ "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+
+ "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+
+ "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+
+ "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+
+ "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+
+ "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+
+ ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001"+
+ "\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000"+
+ "\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000"+
+ "L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001"+
+ "\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000"+
+ "\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000"+
+ "Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001"+
+ "\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000"+
+ "\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000"+
+ "h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001"+
+ "\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000"+
+ "\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000"+
+ "v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001"+
+ "\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000"+
+ "\u0000\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000"+
+ "\u0000\u0000\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000"+
+ "\u0000\u0000\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000"+
+ "\u0000\u0000\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000"+
+ "\u0000\u0000\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000"+
+ "\u0000\u0000\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000"+
+ "\u0000\u0000\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000"+
+ "\u0000\u0000\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000"+
+ "\u0000\u0000\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000"+
+ "\u0000\u0000\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000"+
+ "\u0000\u0000\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000"+
+ "\u0000\u0000\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000"+
+ "\u0000\u0000\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000"+
+ "\u0000\u0000\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000"+
+ "\u0000\u0000\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000"+
+ "\u0000\u0000\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000"+
+ "\u0000\u0000\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000"+
+ "\u0000\u0000\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000"+
+ "\u0000\u0000\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000"+
+ "\u0000\u0000\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000"+
+ "\u0000\u0000\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000"+
+ "\u0000\u0000\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000"+
+ "\u0000\u0000\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000"+
+ "\u0000\u0000\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000"+
+ "\u0000\u0000\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000"+
+ "\u0000\u0000\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000"+
+ "\u0000\u0000\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000"+
+ "\u0000\u0000\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000"+
+ "\u0000\u0000\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2\u0001\u0000\u0000"+
+ "\u0000\u0000\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6\u0001\u0000\u0000"+
+ "\u0000\u0000\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa\u0001\u0000\u0000"+
+ "\u0000\u0000\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe\u0001\u0000\u0000"+
+ "\u0000\u0000\u0100\u0001\u0000\u0000\u0000\u0000\u0102\u0001\u0000\u0000"+
+ "\u0000\u0000\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000"+
+ "\u0000\u0000\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000"+
+ "\u0000\u0000\u010c\u0001\u0000\u0000\u0000\u0000\u010e\u0001\u0000\u0000"+
+ "\u0000\u0000\u0110\u0001\u0000\u0000\u0000\u0000\u0112\u0001\u0000\u0000"+
+ "\u0000\u0000\u0114\u0001\u0000\u0000\u0000\u0000\u0116\u0001\u0000\u0000"+
+ "\u0000\u0000\u0118\u0001\u0000\u0000\u0000\u0000\u011a\u0001\u0000\u0000"+
+ "\u0000\u0000\u011c\u0001\u0000\u0000\u0000\u0000\u011e\u0001\u0000\u0000"+
+ "\u0000\u0000\u0120\u0001\u0000\u0000\u0000\u0000\u0122\u0001\u0000\u0000"+
+ "\u0000\u0000\u0124\u0001\u0000\u0000\u0000\u0000\u0126\u0001\u0000\u0000"+
+ "\u0000\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u0130\u0001\u0000\u0000"+
+ "\u0000\u0000\u0132\u0001\u0000\u0000\u0000\u0000\u0134\u0001\u0000\u0000"+
+ "\u0000\u0000\u0136\u0001\u0000\u0000\u0000\u0000\u0138\u0001\u0000\u0000"+
+ "\u0000\u0000\u013a\u0001\u0000\u0000\u0000\u0000\u013c\u0001\u0000\u0000"+
+ "\u0000\u0000\u013e\u0001\u0000\u0000\u0000\u0000\u0140\u0001\u0000\u0000"+
+ "\u0000\u0000\u0142\u0001\u0000\u0000\u0000\u0000\u0144\u0001\u0000\u0000"+
+ "\u0000\u0000\u0146\u0001\u0000\u0000\u0000\u0001\u015c\u0001\u0000\u0000"+
+ "\u0000\u0001\u015e\u0001\u0000\u0000\u0000\u0001\u0160\u0001\u0000\u0000"+
+ "\u0000\u0001\u0162\u0001\u0000\u0000\u0000\u0001\u0164\u0001\u0000\u0000"+
+ "\u0000\u0002\u0168\u0001\u0000\u0000\u0000\u0004\u017e\u0001\u0000\u0000"+
+ "\u0000\u0006\u0180\u0001\u0000\u0000\u0000\b\u0187\u0001\u0000\u0000\u0000"+
+ "\n\u018f\u0001\u0000\u0000\u0000\f\u0196\u0001\u0000\u0000\u0000\u000e"+
+ "\u019d\u0001\u0000\u0000\u0000\u0010\u01a4\u0001\u0000\u0000\u0000\u0012"+
+ "\u01ab\u0001\u0000\u0000\u0000\u0014\u01b4\u0001\u0000\u0000\u0000\u0016"+
+ "\u01be\u0001\u0000\u0000\u0000\u0018\u01c6\u0001\u0000\u0000\u0000\u001a"+
+ "\u01d0\u0001\u0000\u0000\u0000\u001c\u01dc\u0001\u0000\u0000\u0000\u001e"+
+ "\u01e3\u0001\u0000\u0000\u0000 \u01ee\u0001\u0000\u0000\u0000\"\u01f1"+
+ "\u0001\u0000\u0000\u0000$\u01f7\u0001\u0000\u0000\u0000&\u0200\u0001\u0000"+
+ "\u0000\u0000(\u0205\u0001\u0000\u0000\u0000*\u020c\u0001\u0000\u0000\u0000"+
+ ",\u0213\u0001\u0000\u0000\u0000.\u0219\u0001\u0000\u0000\u00000\u021e"+
+ "\u0001\u0000\u0000\u00002\u0225\u0001\u0000\u0000\u00004\u022f\u0001\u0000"+
+ "\u0000\u00006\u0233\u0001\u0000\u0000\u00008\u0239\u0001\u0000\u0000\u0000"+
+ ":\u023c\u0001\u0000\u0000\u0000<\u023e\u0001\u0000\u0000\u0000>\u0245"+
+ "\u0001\u0000\u0000\u0000@\u024b\u0001\u0000\u0000\u0000B\u0258\u0001\u0000"+
+ "\u0000\u0000D\u0261\u0001\u0000\u0000\u0000F\u0265\u0001\u0000\u0000\u0000"+
+ "H\u0269\u0001\u0000\u0000\u0000J\u026f\u0001\u0000\u0000\u0000L\u0271"+
+ "\u0001\u0000\u0000\u0000N\u0274\u0001\u0000\u0000\u0000P\u0279\u0001\u0000"+
+ "\u0000\u0000R\u027f\u0001\u0000\u0000\u0000T\u0285\u0001\u0000\u0000\u0000"+
+ "V\u028c\u0001\u0000\u0000\u0000X\u0293\u0001\u0000\u0000\u0000Z\u029c"+
+ "\u0001\u0000\u0000\u0000\\\u02a2\u0001\u0000\u0000\u0000^\u02a8\u0001"+
+ "\u0000\u0000\u0000`\u02af\u0001\u0000\u0000\u0000b\u02b5\u0001\u0000\u0000"+
+ "\u0000d\u02bc\u0001\u0000\u0000\u0000f\u02c2\u0001\u0000\u0000\u0000h"+
+ "\u02cb\u0001\u0000\u0000\u0000j\u02d3\u0001\u0000\u0000\u0000l\u02d9\u0001"+
+ "\u0000\u0000\u0000n\u02e1\u0001\u0000\u0000\u0000p\u02e8\u0001\u0000\u0000"+
+ "\u0000r\u02ed\u0001\u0000\u0000\u0000t\u02f6\u0001\u0000\u0000\u0000v"+
+ "\u0305\u0001\u0000\u0000\u0000x\u030b\u0001\u0000\u0000\u0000z\u0318\u0001"+
+ "\u0000\u0000\u0000|\u031e\u0001\u0000\u0000\u0000~\u0322\u0001\u0000\u0000"+
+ "\u0000\u0080\u0325\u0001\u0000\u0000\u0000\u0082\u032c\u0001\u0000\u0000"+
+ "\u0000\u0084\u0336\u0001\u0000\u0000\u0000\u0086\u0340\u0001\u0000\u0000"+
+ "\u0000\u0088\u034c\u0001\u0000\u0000\u0000\u008a\u0355\u0001\u0000\u0000"+
+ "\u0000\u008c\u035f\u0001\u0000\u0000\u0000\u008e\u0367\u0001\u0000\u0000"+
+ "\u0000\u0090\u0373\u0001\u0000\u0000\u0000\u0092\u0382\u0001\u0000\u0000"+
+ "\u0000\u0094\u0388\u0001\u0000\u0000\u0000\u0096\u038c\u0001\u0000\u0000"+
+ "\u0000\u0098\u0390\u0001\u0000\u0000\u0000\u009a\u0395\u0001\u0000\u0000"+
+ "\u0000\u009c\u039e\u0001\u0000\u0000\u0000\u009e\u03a5\u0001\u0000\u0000"+
+ "\u0000\u00a0\u03ae\u0001\u0000\u0000\u0000\u00a2\u03b6\u0001\u0000\u0000"+
+ "\u0000\u00a4\u03be\u0001\u0000\u0000\u0000\u00a6\u03c3\u0001\u0000\u0000"+
+ "\u0000\u00a8\u03cd\u0001\u0000\u0000\u0000\u00aa\u03d4\u0001\u0000\u0000"+
+ "\u0000\u00ac\u03d9\u0001\u0000\u0000\u0000\u00ae\u03df\u0001\u0000\u0000"+
+ "\u0000\u00b0\u03e2\u0001\u0000\u0000\u0000\u00b2\u03e6\u0001\u0000\u0000"+
+ "\u0000\u00b4\u03ed\u0001\u0000\u0000\u0000\u00b6\u03f2\u0001\u0000\u0000"+
+ "\u0000\u00b8\u03f7\u0001\u0000\u0000\u0000\u00ba\u03fc\u0001\u0000\u0000"+
+ "\u0000\u00bc\u0404\u0001\u0000\u0000\u0000\u00be\u040b\u0001\u0000\u0000"+
+ "\u0000\u00c0\u0411\u0001\u0000\u0000\u0000\u00c2\u041f\u0001\u0000\u0000"+
+ "\u0000\u00c4\u0422\u0001\u0000\u0000\u0000\u00c6\u0428\u0001\u0000\u0000"+
+ "\u0000\u00c8\u042d\u0001\u0000\u0000\u0000\u00ca\u0438\u0001\u0000\u0000"+
+ "\u0000\u00cc\u043c\u0001\u0000\u0000\u0000\u00ce\u0443\u0001\u0000\u0000"+
+ "\u0000\u00d0\u044c\u0001\u0000\u0000\u0000\u00d2\u0450\u0001\u0000\u0000"+
+ "\u0000\u00d4\u0456\u0001\u0000\u0000\u0000\u00d6\u0460\u0001\u0000\u0000"+
+ "\u0000\u00d8\u0462\u0001\u0000\u0000\u0000\u00da\u0466\u0001\u0000\u0000"+
+ "\u0000\u00dc\u0468\u0001\u0000\u0000\u0000\u00de\u046c\u0001\u0000\u0000"+
+ "\u0000\u00e0\u046e\u0001\u0000\u0000\u0000\u00e2\u0472\u0001\u0000\u0000"+
+ "\u0000\u00e4\u0474\u0001\u0000\u0000\u0000\u00e6\u0476\u0001\u0000\u0000"+
+ "\u0000\u00e8\u0478\u0001\u0000\u0000\u0000\u00ea\u047a\u0001\u0000\u0000"+
+ "\u0000\u00ec\u047c\u0001\u0000\u0000\u0000\u00ee\u0481\u0001\u0000\u0000"+
+ "\u0000\u00f0\u0486\u0001\u0000\u0000\u0000\u00f2\u0489\u0001\u0000\u0000"+
+ "\u0000\u00f4\u048d\u0001\u0000\u0000\u0000\u00f6\u0490\u0001\u0000\u0000"+
+ "\u0000\u00f8\u0493\u0001\u0000\u0000\u0000\u00fa\u0496\u0001\u0000\u0000"+
+ "\u0000\u00fc\u0499\u0001\u0000\u0000\u0000\u00fe\u049b\u0001\u0000\u0000"+
+ "\u0000\u0100\u049e\u0001\u0000\u0000\u0000\u0102\u04a0\u0001\u0000\u0000"+
+ "\u0000\u0104\u04a3\u0001\u0000\u0000\u0000\u0106\u04a5\u0001\u0000\u0000"+
+ "\u0000\u0108\u04a7\u0001\u0000\u0000\u0000\u010a\u04a9\u0001\u0000\u0000"+
+ "\u0000\u010c\u04ac\u0001\u0000\u0000\u0000\u010e\u04af\u0001\u0000\u0000"+
+ "\u0000\u0110\u04b2\u0001\u0000\u0000\u0000\u0112\u04b4\u0001\u0000\u0000"+
+ "\u0000\u0114\u04b6\u0001\u0000\u0000\u0000\u0116\u04b8\u0001\u0000\u0000"+
+ "\u0000\u0118\u04ba\u0001\u0000\u0000\u0000\u011a\u04bc\u0001\u0000\u0000"+
+ "\u0000\u011c\u04be\u0001\u0000\u0000\u0000\u011e\u04cc\u0001\u0000\u0000"+
+ "\u0000\u0120\u04d0\u0001\u0000\u0000\u0000\u0122\u04dc\u0001\u0000\u0000"+
+ "\u0000\u0124\u04ea\u0001\u0000\u0000\u0000\u0126\u04f6\u0001\u0000\u0000"+
+ "\u0000\u0128\u051a\u0001\u0000\u0000\u0000\u012a\u051c\u0001\u0000\u0000"+
+ "\u0000\u012c\u0527\u0001\u0000\u0000\u0000\u012e\u052d\u0001\u0000\u0000"+
+ "\u0000\u0130\u0534\u0001\u0000\u0000\u0000\u0132\u053a\u0001\u0000\u0000"+
+ "\u0000\u0134\u053c\u0001\u0000\u0000\u0000\u0136\u0541\u0001\u0000\u0000"+
+ "\u0000\u0138\u0546\u0001\u0000\u0000\u0000\u013a\u054d\u0001\u0000\u0000"+
+ "\u0000\u013c\u0558\u0001\u0000\u0000\u0000\u013e\u0563\u0001\u0000\u0000"+
+ "\u0000\u0140\u0570\u0001\u0000\u0000\u0000\u0142\u0576\u0001\u0000\u0000"+
+ "\u0000\u0144\u0585\u0001\u0000\u0000\u0000\u0146\u058b\u0001\u0000\u0000"+
+ "\u0000\u0148\u059a\u0001\u0000\u0000\u0000\u014a\u059c\u0001\u0000\u0000"+
+ "\u0000\u014c\u05b8\u0001\u0000\u0000\u0000\u014e\u05c2\u0001\u0000\u0000"+
+ "\u0000\u0150\u05c4\u0001\u0000\u0000\u0000\u0152\u05c6\u0001\u0000\u0000"+
+ "\u0000\u0154\u05c8\u0001\u0000\u0000\u0000\u0156\u05d0\u0001\u0000\u0000"+
+ "\u0000\u0158\u05d2\u0001\u0000\u0000\u0000\u015a\u05d4\u0001\u0000\u0000"+
+ "\u0000\u015c\u05d7\u0001\u0000\u0000\u0000\u015e\u05dd\u0001\u0000\u0000"+
+ "\u0000\u0160\u05eb\u0001\u0000\u0000\u0000\u0162\u0608\u0001\u0000\u0000"+
+ "\u0000\u0164\u060c\u0001\u0000\u0000\u0000\u0166\u0169\u0003\u0004\u0001"+
+ "\u0000\u0167\u0169\u0003\u0126\u0092\u0000\u0168\u0166\u0001\u0000\u0000"+
+ "\u0000\u0168\u0167\u0001\u0000\u0000\u0000\u0169\u016a\u0001\u0000\u0000"+
+ "\u0000\u016a\u016b\u0006\u0000\u0000\u0000\u016b\u0003\u0001\u0000\u0000"+
+ "\u0000\u016c\u0176\u0003\u014c\u00a5\u0000\u016d\u016e\u0005.\u0000\u0000"+
+ "\u016e\u0170\u0004\u0001\u0000\u0000\u016f\u0171\u0003\u014c\u00a5\u0000"+
+ "\u0170\u016f\u0001\u0000\u0000\u0000\u0170\u0171\u0001\u0000\u0000\u0000"+
+ "\u0171\u0173\u0001\u0000\u0000\u0000\u0172\u0174\u0003\u0154\u00a9\u0000"+
+ "\u0173\u0172\u0001\u0000\u0000\u0000\u0173\u0174\u0001\u0000\u0000\u0000"+
+ "\u0174\u0177\u0001\u0000\u0000\u0000\u0175\u0177\u0003\u0154\u00a9\u0000"+
+ "\u0176\u016d\u0001\u0000\u0000\u0000\u0176\u0175\u0001\u0000\u0000\u0000"+
+ "\u0177\u017f\u0001\u0000\u0000\u0000\u0178\u0179\u0005.\u0000\u0000\u0179"+
+ "\u017a\u0004\u0001\u0001\u0000\u017a\u017c\u0003\u014c\u00a5\u0000\u017b"+
+ "\u017d\u0003\u0154\u00a9\u0000\u017c\u017b\u0001\u0000\u0000\u0000\u017c"+
+ "\u017d\u0001\u0000\u0000\u0000\u017d\u017f\u0001\u0000\u0000\u0000\u017e"+
+ "\u016c\u0001\u0000\u0000\u0000\u017e\u0178\u0001\u0000\u0000\u0000\u017f"+
+ "\u0005\u0001\u0000\u0000\u0000\u0180\u0181\u0005t\u0000\u0000\u0181\u0182"+
+ "\u0005r\u0000\u0000\u0182\u0183\u0005u\u0000\u0000\u0183\u0184\u0005e"+
+ "\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0186\u0006\u0002"+
+ "\u0000\u0000\u0186\u0007\u0001\u0000\u0000\u0000\u0187\u0188\u0005f\u0000"+
+ "\u0000\u0188\u0189\u0005a\u0000\u0000\u0189\u018a\u0005l\u0000\u0000\u018a"+
+ "\u018b\u0005s\u0000\u0000\u018b\u018c\u0005e\u0000\u0000\u018c\u018d\u0001"+
+ "\u0000\u0000\u0000\u018d\u018e\u0006\u0003\u0000\u0000\u018e\t\u0001\u0000"+
+ "\u0000\u0000\u018f\u0190\u0005a\u0000\u0000\u0190\u0191\u0005s\u0000\u0000"+
+ "\u0191\u0192\u0005s\u0000\u0000\u0192\u0193\u0005e\u0000\u0000\u0193\u0194"+
+ "\u0005r\u0000\u0000\u0194\u0195\u0005t\u0000\u0000\u0195\u000b\u0001\u0000"+
+ "\u0000\u0000\u0196\u0197\u0005a\u0000\u0000\u0197\u0198\u0005s\u0000\u0000"+
+ "\u0198\u0199\u0005s\u0000\u0000\u0199\u019a\u0005u\u0000\u0000\u019a\u019b"+
+ "\u0005m\u0000\u0000\u019b\u019c\u0005e\u0000\u0000\u019c\r\u0001\u0000"+
+ "\u0000\u0000\u019d\u019e\u0005i\u0000\u0000\u019e\u019f\u0005n\u0000\u0000"+
+ "\u019f\u01a0\u0005h\u0000\u0000\u01a0\u01a1\u0005a\u0000\u0000\u01a1\u01a2"+
+ "\u0005l\u0000\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3\u000f\u0001\u0000"+
+ "\u0000\u0000\u01a4\u01a5\u0005e\u0000\u0000\u01a5\u01a6\u0005x\u0000\u0000"+
+ "\u01a6\u01a7\u0005h\u0000\u0000\u01a7\u01a8\u0005a\u0000\u0000\u01a8\u01a9"+
+ "\u0005l\u0000\u0000\u01a9\u01aa\u0005e\u0000\u0000\u01aa\u0011\u0001\u0000"+
+ "\u0000\u0000\u01ab\u01ac\u0005r\u0000\u0000\u01ac\u01ad\u0005e\u0000\u0000"+
+ "\u01ad\u01ae\u0005q\u0000\u0000\u01ae\u01af\u0005u\u0000\u0000\u01af\u01b0"+
+ "\u0005i\u0000\u0000\u01b0\u01b1\u0005r\u0000\u0000\u01b1\u01b2\u0005e"+
+ "\u0000\u0000\u01b2\u01b3\u0005s\u0000\u0000\u01b3\u0013\u0001\u0000\u0000"+
+ "\u0000\u01b4\u01b5\u0005p\u0000\u0000\u01b5\u01b6\u0005r\u0000\u0000\u01b6"+
+ "\u01b7\u0005e\u0000\u0000\u01b7\u01b8\u0005s\u0000\u0000\u01b8\u01b9\u0005"+
+ "e\u0000\u0000\u01b9\u01ba\u0005r\u0000\u0000\u01ba\u01bb\u0005v\u0000"+
+ "\u0000\u01bb\u01bc\u0005e\u0000\u0000\u01bc\u01bd\u0005s\u0000\u0000\u01bd"+
+ "\u0015\u0001\u0000\u0000\u0000\u01be\u01bf\u0005e\u0000\u0000\u01bf\u01c0"+
+ "\u0005n\u0000\u0000\u01c0\u01c1\u0005s\u0000\u0000\u01c1\u01c2\u0005u"+
+ "\u0000\u0000\u01c2\u01c3\u0005r\u0000\u0000\u01c3\u01c4\u0005e\u0000\u0000"+
+ "\u01c4\u01c5\u0005s\u0000\u0000\u01c5\u0017\u0001\u0000\u0000\u0000\u01c6"+
+ "\u01c7\u0005i\u0000\u0000\u01c7\u01c8\u0005n\u0000\u0000\u01c8\u01c9\u0005"+
+ "v\u0000\u0000\u01c9\u01ca\u0005a\u0000\u0000\u01ca\u01cb\u0005r\u0000"+
+ "\u0000\u01cb\u01cc\u0005i\u0000\u0000\u01cc\u01cd\u0005a\u0000\u0000\u01cd"+
+ "\u01ce\u0005n\u0000\u0000\u01ce\u01cf\u0005t\u0000\u0000\u01cf\u0019\u0001"+
+ "\u0000\u0000\u0000\u01d0\u01d1\u0005d\u0000\u0000\u01d1\u01d2\u0005e\u0000"+
+ "\u0000\u01d2\u01d3\u0005c\u0000\u0000\u01d3\u01d4\u0005r\u0000\u0000\u01d4"+
+ "\u01d5\u0005e\u0000\u0000\u01d5\u01d6\u0005a\u0000\u0000\u01d6\u01d7\u0005"+
+ "s\u0000\u0000\u01d7\u01d8\u0005e\u0000\u0000\u01d8\u01d9\u0005s\u0000"+
+ "\u0000\u01d9\u01da\u0001\u0000\u0000\u0000\u01da\u01db\u0006\f\u0000\u0000"+
+ "\u01db\u001b\u0001\u0000\u0000\u0000\u01dc\u01dd\u0005p\u0000\u0000\u01dd"+
+ "\u01de\u0005u\u0000\u0000\u01de\u01df\u0005r\u0000\u0000\u01df\u01e0\u0005"+
+ "e\u0000\u0000\u01e0\u01e1\u0001\u0000\u0000\u0000\u01e1\u01e2\u0006\r"+
+ "\u0000\u0000\u01e2\u001d\u0001\u0000\u0000\u0000\u01e3\u01e4\u0005i\u0000"+
+ "\u0000\u01e4\u01e5\u0005m\u0000\u0000\u01e5\u01e6\u0005p\u0000\u0000\u01e6"+
+ "\u01e7\u0005l\u0000\u0000\u01e7\u01e8\u0005e\u0000\u0000\u01e8\u01e9\u0005"+
+ "m\u0000\u0000\u01e9\u01ea\u0005e\u0000\u0000\u01ea\u01eb\u0005n\u0000"+
+ "\u0000\u01eb\u01ec\u0005t\u0000\u0000\u01ec\u01ed\u0005s\u0000\u0000\u01ed"+
+ "\u001f\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005a\u0000\u0000\u01ef\u01f0"+
+ "\u0005s\u0000\u0000\u01f0!\u0001\u0000\u0000\u0000\u01f1\u01f2\u0005o"+
+ "\u0000\u0000\u01f2\u01f3\u0005l\u0000\u0000\u01f3\u01f4\u0005d\u0000\u0000"+
+ "\u01f4\u01f5\u0001\u0000\u0000\u0000\u01f5\u01f6\u0006\u0010\u0000\u0000"+
+ "\u01f6#\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005b\u0000\u0000\u01f8\u01f9"+
+ "\u0005e\u0000\u0000\u01f9\u01fa\u0005f\u0000\u0000\u01fa\u01fb\u0005o"+
+ "\u0000\u0000\u01fb\u01fc\u0005r\u0000\u0000\u01fc\u01fd\u0005e\u0000\u0000"+
+ "\u01fd\u01fe\u0001\u0000\u0000\u0000\u01fe\u01ff\u0006\u0011\u0000\u0000"+
+ "\u01ff%\u0001\u0000\u0000\u0000\u0200\u0201\u0005#\u0000\u0000\u0201\u0202"+
+ "\u0005l\u0000\u0000\u0202\u0203\u0005h\u0000\u0000\u0203\u0204\u0005s"+
+ "\u0000\u0000\u0204\'\u0001\u0000\u0000\u0000\u0205\u0206\u0005f\u0000"+
+ "\u0000\u0206\u0207\u0005o\u0000\u0000\u0207\u0208\u0005r\u0000\u0000\u0208"+
+ "\u0209\u0005a\u0000\u0000\u0209\u020a\u0005l\u0000\u0000\u020a\u020b\u0005"+
+ "l\u0000\u0000\u020b)\u0001\u0000\u0000\u0000\u020c\u020d\u0005e\u0000"+
+ "\u0000\u020d\u020e\u0005x\u0000\u0000\u020e\u020f\u0005i\u0000\u0000\u020f"+
+ "\u0210\u0005s\u0000\u0000\u0210\u0211\u0005t\u0000\u0000\u0211\u0212\u0005"+
+ "s\u0000\u0000\u0212+\u0001\u0000\u0000\u0000\u0213\u0214\u0005a\u0000"+
+ "\u0000\u0214\u0215\u0005c\u0000\u0000\u0215\u0216\u0005c\u0000\u0000\u0216"+
+ "\u0217\u0001\u0000\u0000\u0000\u0217\u0218\u0006\u0015\u0000\u0000\u0218"+
+ "-\u0001\u0000\u0000\u0000\u0219\u021a\u0005f\u0000\u0000\u021a\u021b\u0005"+
+ "o\u0000\u0000\u021b\u021c\u0005l\u0000\u0000\u021c\u021d\u0005d\u0000"+
+ "\u0000\u021d/\u0001\u0000\u0000\u0000\u021e\u021f\u0005u\u0000\u0000\u021f"+
+ "\u0220\u0005n\u0000\u0000\u0220\u0221\u0005f\u0000\u0000\u0221\u0222\u0005"+
+ "o\u0000\u0000\u0222\u0223\u0005l\u0000\u0000\u0223\u0224\u0005d\u0000"+
+ "\u0000\u02241\u0001\u0000\u0000\u0000\u0225\u0226\u0005u\u0000\u0000\u0226"+
+ "\u0227\u0005n\u0000\u0000\u0227\u0228\u0005f\u0000\u0000\u0228\u0229\u0005"+
+ "o\u0000\u0000\u0229\u022a\u0005l\u0000\u0000\u022a\u022b\u0005d\u0000"+
+ "\u0000\u022b\u022c\u0005i\u0000\u0000\u022c\u022d\u0005n\u0000\u0000\u022d"+
+ "\u022e\u0005g\u0000\u0000\u022e3\u0001\u0000\u0000\u0000\u022f\u0230\u0005"+
+ "l\u0000\u0000\u0230\u0231\u0005e\u0000\u0000\u0231\u0232\u0005t\u0000"+
+ "\u0000\u02325\u0001\u0000\u0000\u0000\u0233\u0234\u0005g\u0000\u0000\u0234"+
+ "\u0235\u0005h\u0000\u0000\u0235\u0236\u0005o\u0000\u0000\u0236\u0237\u0005"+
+ "s\u0000\u0000\u0237\u0238\u0005t\u0000\u0000\u02387\u0001\u0000\u0000"+
+ "\u0000\u0239\u023a\u0005i\u0000\u0000\u023a\u023b\u0005n\u0000\u0000\u023b"+
+ "9\u0001\u0000\u0000\u0000\u023c\u023d\u0005#\u0000\u0000\u023d;\u0001"+
+ "\u0000\u0000\u0000\u023e\u023f\u0005s\u0000\u0000\u023f\u0240\u0005u\u0000"+
+ "\u0000\u0240\u0241\u0005b\u0000\u0000\u0241\u0242\u0005s\u0000\u0000\u0242"+
+ "\u0243\u0005e\u0000\u0000\u0243\u0244\u0005t\u0000\u0000\u0244=\u0001"+
+ "\u0000\u0000\u0000\u0245\u0246\u0005u\u0000\u0000\u0246\u0247\u0005n\u0000"+
+ "\u0000\u0247\u0248\u0005i\u0000\u0000\u0248\u0249\u0005o\u0000\u0000\u0249"+
+ "\u024a\u0005n\u0000\u0000\u024a?\u0001\u0000\u0000\u0000\u024b\u024c\u0005"+
+ "i\u0000\u0000\u024c\u024d\u0005n\u0000\u0000\u024d\u024e\u0005t\u0000"+
+ "\u0000\u024e\u024f\u0005e\u0000\u0000\u024f\u0250\u0005r\u0000\u0000\u0250"+
+ "\u0251\u0005s\u0000\u0000\u0251\u0252\u0005e\u0000\u0000\u0252\u0253\u0005"+
+ "c\u0000\u0000\u0253\u0254\u0005t\u0000\u0000\u0254\u0255\u0005i\u0000"+
+ "\u0000\u0255\u0256\u0005o\u0000\u0000\u0256\u0257\u0005n\u0000\u0000\u0257"+
+ "A\u0001\u0000\u0000\u0000\u0258\u0259\u0005s\u0000\u0000\u0259\u025a\u0005"+
+ "e\u0000\u0000\u025a\u025b\u0005t\u0000\u0000\u025b\u025c\u0005m\u0000"+
+ "\u0000\u025c\u025d\u0005i\u0000\u0000\u025d\u025e\u0005n\u0000\u0000\u025e"+
+ "\u025f\u0005u\u0000\u0000\u025f\u0260\u0005s\u0000\u0000\u0260C\u0001"+
+ "\u0000\u0000\u0000\u0261\u0262\u0005=\u0000\u0000\u0262\u0263\u0005=\u0000"+
+ "\u0000\u0263\u0264\u0005>\u0000\u0000\u0264E\u0001\u0000\u0000\u0000\u0265"+
+ "\u0266\u0005-\u0000\u0000\u0266\u0267\u0005-\u0000\u0000\u0267\u0268\u0005"+
+ "*\u0000\u0000\u0268G\u0001\u0000\u0000\u0000\u0269\u026a\u0005a\u0000"+
+ "\u0000\u026a\u026b\u0005p\u0000\u0000\u026b\u026c\u0005p\u0000\u0000\u026c"+
+ "\u026d\u0005l\u0000\u0000\u026d\u026e\u0005y\u0000\u0000\u026eI\u0001"+
+ "\u0000\u0000\u0000\u026f\u0270\u0005?\u0000\u0000\u0270K\u0001\u0000\u0000"+
+ "\u0000\u0271\u0272\u0005!\u0000\u0000\u0272\u0273\u0005<\u0000\u0000\u0273"+
+ "M\u0001\u0000\u0000\u0000\u0274\u0275\u0005!\u0000\u0000\u0275\u0276\u0005"+
+ ">\u0000\u0000\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0006&\u0000"+
+ "\u0000\u0278O\u0001\u0000\u0000\u0000\u0279\u027a\u0005s\u0000\u0000\u027a"+
+ "\u027b\u0005e\u0000\u0000\u027b\u027c\u0005q\u0000\u0000\u027c\u027d\u0001"+
+ "\u0000\u0000\u0000\u027d\u027e\u0006\'\u0000\u0000\u027eQ\u0001\u0000"+
+ "\u0000\u0000\u027f\u0280\u0005s\u0000\u0000\u0280\u0281\u0005e\u0000\u0000"+
+ "\u0281\u0282\u0005t\u0000\u0000\u0282\u0283\u0001\u0000\u0000\u0000\u0283"+
+ "\u0284\u0006(\u0000\u0000\u0284S\u0001\u0000\u0000\u0000\u0285\u0286\u0005"+
+ "m\u0000\u0000\u0286\u0287\u0005s\u0000\u0000\u0287\u0288\u0005e\u0000"+
+ "\u0000\u0288\u0289\u0005t\u0000\u0000\u0289\u028a\u0001\u0000\u0000\u0000"+
+ "\u028a\u028b\u0006)\u0000\u0000\u028bU\u0001\u0000\u0000\u0000\u028c\u028d"+
+ "\u0005d\u0000\u0000\u028d\u028e\u0005i\u0000\u0000\u028e\u028f\u0005c"+
+ "\u0000\u0000\u028f\u0290\u0005t\u0000\u0000\u0290\u0291\u0001\u0000\u0000"+
+ "\u0000\u0291\u0292\u0006*\u0000\u0000\u0292W\u0001\u0000\u0000\u0000\u0293"+
+ "\u0294\u0005o\u0000\u0000\u0294\u0295\u0005p\u0000\u0000\u0295\u0296\u0005"+
+ "t\u0000\u0000\u0296\u0297\u0005i\u0000\u0000\u0297\u0298\u0005o\u0000"+
+ "\u0000\u0298\u0299\u0005n\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000"+
+ "\u029a\u029b\u0006+\u0000\u0000\u029bY\u0001\u0000\u0000\u0000\u029c\u029d"+
+ "\u0005l\u0000\u0000\u029d\u029e\u0005e\u0000\u0000\u029e\u029f\u0005n"+
+ "\u0000\u0000\u029f\u02a0\u0001\u0000\u0000\u0000\u02a0\u02a1\u0006,\u0000"+
+ "\u0000\u02a1[\u0001\u0000\u0000\u0000\u02a2\u02a3\u0005n\u0000\u0000\u02a3"+
+ "\u02a4\u0005e\u0000\u0000\u02a4\u02a5\u0005w\u0000\u0000\u02a5\u02a6\u0001"+
+ "\u0000\u0000\u0000\u02a6\u02a7\u0006-\u0000\u0000\u02a7]\u0001\u0000\u0000"+
+ "\u0000\u02a8\u02a9\u0005m\u0000\u0000\u02a9\u02aa\u0005a\u0000\u0000\u02aa"+
+ "\u02ab\u0005k\u0000\u0000\u02ab\u02ac\u0005e\u0000\u0000\u02ac\u02ad\u0001"+
+ "\u0000\u0000\u0000\u02ad\u02ae\u0006.\u0000\u0000\u02ae_\u0001\u0000\u0000"+
+ "\u0000\u02af\u02b0\u0005c\u0000\u0000\u02b0\u02b1\u0005a\u0000\u0000\u02b1"+
+ "\u02b2\u0005p\u0000\u0000\u02b2\u02b3\u0001\u0000\u0000\u0000\u02b3\u02b4"+
+ "\u0006/\u0000\u0000\u02b4a\u0001\u0000\u0000\u0000\u02b5\u02b6\u0005s"+
+ "\u0000\u0000\u02b6\u02b7\u0005o\u0000\u0000\u02b7\u02b8\u0005m\u0000\u0000"+
+ "\u02b8\u02b9\u0005e\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba"+
+ "\u02bb\u00060\u0000\u0000\u02bbc\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005"+
+ "g\u0000\u0000\u02bd\u02be\u0005e\u0000\u0000\u02be\u02bf\u0005t\u0000"+
+ "\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c1\u00061\u0000\u0000"+
+ "\u02c1e\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005d\u0000\u0000\u02c3\u02c4"+
+ "\u0005o\u0000\u0000\u02c4\u02c5\u0005m\u0000\u0000\u02c5\u02c6\u0005a"+
+ "\u0000\u0000\u02c6\u02c7\u0005i\u0000\u0000\u02c7\u02c8\u0005n\u0000\u0000"+
+ "\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca\u00062\u0000\u0000\u02ca"+
+ "g\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005a\u0000\u0000\u02cc\u02cd\u0005"+
+ "x\u0000\u0000\u02cd\u02ce\u0005i\u0000\u0000\u02ce\u02cf\u0005o\u0000"+
+ "\u0000\u02cf\u02d0\u0005m\u0000\u0000\u02d0\u02d1\u0001\u0000\u0000\u0000"+
+ "\u02d1\u02d2\u00063\u0000\u0000\u02d2i\u0001\u0000\u0000\u0000\u02d3\u02d4"+
+ "\u0005a\u0000\u0000\u02d4\u02d5\u0005d\u0000\u0000\u02d5\u02d6\u0005t"+
+ "\u0000\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d7\u02d8\u00064\u0000"+
+ "\u0000\u02d8k\u0001\u0000\u0000\u0000\u02d9\u02da\u0005m\u0000\u0000\u02da"+
+ "\u02db\u0005a\u0000\u0000\u02db\u02dc\u0005t\u0000\u0000\u02dc\u02dd\u0005"+
+ "c\u0000\u0000\u02dd\u02de\u0005h\u0000\u0000\u02de\u02df\u0001\u0000\u0000"+
+ "\u0000\u02df\u02e0\u00065\u0000\u0000\u02e0m\u0001\u0000\u0000\u0000\u02e1"+
+ "\u02e2\u0005n\u0000\u0000\u02e2\u02e3\u0005o\u0000\u0000\u02e3\u02e4\u0005"+
+ "n\u0000\u0000\u02e4\u02e5\u0005e\u0000\u0000\u02e5\u02e6\u0001\u0000\u0000"+
+ "\u0000\u02e6\u02e7\u00066\u0000\u0000\u02e7o\u0001\u0000\u0000\u0000\u02e8"+
+ "\u02e9\u0005p\u0000\u0000\u02e9\u02ea\u0005r\u0000\u0000\u02ea\u02eb\u0005"+
+ "e\u0000\u0000\u02eb\u02ec\u0005d\u0000\u0000\u02ecq\u0001\u0000\u0000"+
+ "\u0000\u02ed\u02ee\u0005t\u0000\u0000\u02ee\u02ef\u0005y\u0000\u0000\u02ef"+
+ "\u02f0\u0005p\u0000\u0000\u02f0\u02f1\u0005e\u0000\u0000\u02f1\u02f2\u0005"+
+ "O\u0000\u0000\u02f2\u02f3\u0005f\u0000\u0000\u02f3\u02f4\u0001\u0000\u0000"+
+ "\u0000\u02f4\u02f5\u00068\u0000\u0000\u02f5s\u0001\u0000\u0000\u0000\u02f6"+
+ "\u02f7\u0005i\u0000\u0000\u02f7\u02f8\u0005s\u0000\u0000\u02f8\u02f9\u0005"+
+ "C\u0000\u0000\u02f9\u02fa\u0005o\u0000\u0000\u02fa\u02fb\u0005m\u0000"+
+ "\u0000\u02fb\u02fc\u0005p\u0000\u0000\u02fc\u02fd\u0005a\u0000\u0000\u02fd"+
+ "\u02fe\u0005r\u0000\u0000\u02fe\u02ff\u0005a\u0000\u0000\u02ff\u0300\u0005"+
+ "b\u0000\u0000\u0300\u0301\u0005l\u0000\u0000\u0301\u0302\u0005e\u0000"+
+ "\u0000\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u00069\u0000\u0000"+
+ "\u0304u\u0001\u0000\u0000\u0000\u0305\u0306\u0005l\u0000\u0000\u0306\u0307"+
+ "\u0005o\u0000\u0000\u0307\u0308\u0005w\u0000\u0000\u0308\u0309\u0001\u0000"+
+ "\u0000\u0000\u0309\u030a\u0006:\u0000\u0000\u030aw\u0001\u0000\u0000\u0000"+
+ "\u030b\u030c\u0005l\u0000\u0000\u030c\u030d\u0005o\u0000\u0000\u030d\u030e"+
+ "\u0005w\u0000\u0000\u030e\u030f\u0005C\u0000\u0000\u030f\u0310\u0005o"+
+ "\u0000\u0000\u0310\u0311\u0005n\u0000\u0000\u0311\u0312\u0005t\u0000\u0000"+
+ "\u0312\u0313\u0005e\u0000\u0000\u0313\u0314\u0005x\u0000\u0000\u0314\u0315"+
+ "\u0005t\u0000\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006"+
+ ";\u0000\u0000\u0317y\u0001\u0000\u0000\u0000\u0318\u0319\u0005s\u0000"+
+ "\u0000\u0319\u031a\u0005h\u0000\u0000\u031a\u031b\u0005a\u0000\u0000\u031b"+
+ "\u031c\u0005r\u0000\u0000\u031c\u031d\u0005e\u0000\u0000\u031d{\u0001"+
+ "\u0000\u0000\u0000\u031e\u031f\u0005@\u0000\u0000\u031f\u0320\u0001\u0000"+
+ "\u0000\u0000\u0320\u0321\u0006=\u0000\u0000\u0321}\u0001\u0000\u0000\u0000"+
+ "\u0322\u0323\u0005.\u0000\u0000\u0323\u0324\u0005.\u0000\u0000\u0324\u007f"+
+ "\u0001\u0000\u0000\u0000\u0325\u0326\u0005s\u0000\u0000\u0326\u0327\u0005"+
+ "h\u0000\u0000\u0327\u0328\u0005a\u0000\u0000\u0328\u0329\u0005r\u0000"+
+ "\u0000\u0329\u032a\u0005e\u0000\u0000\u032a\u032b\u0005d\u0000\u0000\u032b"+
+ "\u0081\u0001\u0000\u0000\u0000\u032c\u032d\u0005e\u0000\u0000\u032d\u032e"+
+ "\u0005x\u0000\u0000\u032e\u032f\u0005c\u0000\u0000\u032f\u0330\u0005l"+
+ "\u0000\u0000\u0330\u0331\u0005u\u0000\u0000\u0331\u0332\u0005s\u0000\u0000"+
+ "\u0332\u0333\u0005i\u0000\u0000\u0333\u0334\u0005v\u0000\u0000\u0334\u0335"+
+ "\u0005e\u0000\u0000\u0335\u0083\u0001\u0000\u0000\u0000\u0336\u0337\u0005"+
+ "p\u0000\u0000\u0337\u0338\u0005r\u0000\u0000\u0338\u0339\u0005e\u0000"+
+ "\u0000\u0339\u033a\u0005d\u0000\u0000\u033a\u033b\u0005i\u0000\u0000\u033b"+
+ "\u033c\u0005c\u0000\u0000\u033c\u033d\u0005a\u0000\u0000\u033d\u033e\u0005"+
+ "t\u0000\u0000\u033e\u033f\u0005e\u0000\u0000\u033f\u0085\u0001\u0000\u0000"+
+ "\u0000\u0340\u0341\u0005w\u0000\u0000\u0341\u0342\u0005r\u0000\u0000\u0342"+
+ "\u0343\u0005i\u0000\u0000\u0343\u0344\u0005t\u0000\u0000\u0344\u0345\u0005"+
+ "e\u0000\u0000\u0345\u0346\u0005P\u0000\u0000\u0346\u0347\u0005e\u0000"+
+ "\u0000\u0347\u0348\u0005r\u0000\u0000\u0348\u0349\u0005m\u0000\u0000\u0349"+
+ "\u034a\u0001\u0000\u0000\u0000\u034a\u034b\u0006B\u0000\u0000\u034b\u0087"+
+ "\u0001\u0000\u0000\u0000\u034c\u034d\u0005n\u0000\u0000\u034d\u034e\u0005"+
+ "o\u0000\u0000\u034e\u034f\u0005P\u0000\u0000\u034f\u0350\u0005e\u0000"+
+ "\u0000\u0350\u0351\u0005r\u0000\u0000\u0351\u0352\u0005m\u0000\u0000\u0352"+
+ "\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0006C\u0000\u0000\u0354\u0089"+
+ "\u0001\u0000\u0000\u0000\u0355\u0356\u0005t\u0000\u0000\u0356\u0357\u0005"+
+ "r\u0000\u0000\u0357\u0358\u0005u\u0000\u0000\u0358\u0359\u0005s\u0000"+
+ "\u0000\u0359\u035a\u0005t\u0000\u0000\u035a\u035b\u0005e\u0000\u0000\u035b"+
+ "\u035c\u0005d\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e"+
+ "\u0006D\u0000\u0000\u035e\u008b\u0001\u0000\u0000\u0000\u035f\u0360\u0005"+
+ "o\u0000\u0000\u0360\u0361\u0005u\u0000\u0000\u0361\u0362\u0005t\u0000"+
+ "\u0000\u0362\u0363\u0005l\u0000\u0000\u0363\u0364\u0005i\u0000\u0000\u0364"+
+ "\u0365\u0005n\u0000\u0000\u0365\u0366\u0005e\u0000\u0000\u0366\u008d\u0001"+
+ "\u0000\u0000\u0000\u0367\u0368\u0005i\u0000\u0000\u0368\u0369\u0005n\u0000"+
+ "\u0000\u0369\u036a\u0005i\u0000\u0000\u036a\u036b\u0005t\u0000\u0000\u036b"+
+ "\u036c\u0005E\u0000\u0000\u036c\u036d\u0005n\u0000\u0000\u036d\u036e\u0005"+
+ "s\u0000\u0000\u036e\u036f\u0005u\u0000\u0000\u036f\u0370\u0005r\u0000"+
+ "\u0000\u0370\u0371\u0005e\u0000\u0000\u0371\u0372\u0005s\u0000\u0000\u0372"+
+ "\u008f\u0001\u0000\u0000\u0000\u0373\u0374\u0005i\u0000\u0000\u0374\u0375"+
+ "\u0005m\u0000\u0000\u0375\u0376\u0005p\u0000\u0000\u0376\u0377\u0005o"+
+ "\u0000\u0000\u0377\u0378\u0005r\u0000\u0000\u0378\u0379\u0005t\u0000\u0000"+
+ "\u0379\u037a\u0005R\u0000\u0000\u037a\u037b\u0005e\u0000\u0000\u037b\u037c"+
+ "\u0005q\u0000\u0000\u037c\u037d\u0005u\u0000\u0000\u037d\u037e\u0005i"+
+ "\u0000\u0000\u037e\u037f\u0005r\u0000\u0000\u037f\u0380\u0005e\u0000\u0000"+
+ "\u0380\u0381\u0005s\u0000\u0000\u0381\u0091\u0001\u0000\u0000\u0000\u0382"+
+ "\u0383\u0005p\u0000\u0000\u0383\u0384\u0005r\u0000\u0000\u0384\u0385\u0005"+
+ "o\u0000\u0000\u0385\u0386\u0005o\u0000\u0000\u0386\u0387\u0005f\u0000"+
+ "\u0000\u0387\u0093\u0001\u0000\u0000\u0000\u0388\u0389\u0005=\u0000\u0000"+
+ "\u0389\u038a\u0005=\u0000\u0000\u038a\u038b\u0005=\u0000\u0000\u038b\u0095"+
+ "\u0001\u0000\u0000\u0000\u038c\u038d\u0005!\u0000\u0000\u038d\u038e\u0005"+
+ "=\u0000\u0000\u038e\u038f\u0005=\u0000\u0000\u038f\u0097\u0001\u0000\u0000"+
+ "\u0000\u0390\u0391\u0005w\u0000\u0000\u0391\u0392\u0005i\u0000\u0000\u0392"+
+ "\u0393\u0005t\u0000\u0000\u0393\u0394\u0005h\u0000\u0000\u0394\u0099\u0001"+
+ "\u0000\u0000\u0000\u0395\u0396\u0005o\u0000\u0000\u0396\u0397\u0005p\u0000"+
+ "\u0000\u0397\u0398\u0005a\u0000\u0000\u0398\u0399\u0005q\u0000\u0000\u0399"+
+ "\u039a\u0005u\u0000\u0000\u039a\u039b\u0005e\u0000\u0000\u039b\u039c\u0001"+
+ "\u0000\u0000\u0000\u039c\u039d\u0006L\u0000\u0000\u039d\u009b\u0001\u0000"+
+ "\u0000\u0000\u039e\u039f\u0005r\u0000\u0000\u039f\u03a0\u0005e\u0000\u0000"+
+ "\u03a0\u03a1\u0005v\u0000\u0000\u03a1\u03a2\u0005e\u0000\u0000\u03a2\u03a3"+
+ "\u0005a\u0000\u0000\u03a3\u03a4\u0005l\u0000\u0000\u03a4\u009d\u0001\u0000"+
+ "\u0000\u0000\u03a5\u03a6\u0005#\u0000\u0000\u03a6\u03a7\u0005b\u0000\u0000"+
+ "\u03a7\u03a8\u0005a\u0000\u0000\u03a8\u03a9\u0005c\u0000\u0000\u03a9\u03aa"+
+ "\u0005k\u0000\u0000\u03aa\u03ab\u0005e\u0000\u0000\u03ab\u03ac\u0005n"+
+ "\u0000\u0000\u03ac\u03ad\u0005d\u0000\u0000\u03ad\u009f\u0001\u0000\u0000"+
+ "\u0000\u03ae\u03af\u0005b\u0000\u0000\u03af\u03b0\u0005r\u0000\u0000\u03b0"+
+ "\u03b1\u0005e\u0000\u0000\u03b1\u03b2\u0005a\u0000\u0000\u03b2\u03b3\u0005"+
+ "k\u0000\u0000\u03b3\u03b4\u0001\u0000\u0000\u0000\u03b4\u03b5\u0006O\u0000"+
+ "\u0000\u03b5\u00a1\u0001\u0000\u0000\u0000\u03b6\u03b7\u0005d\u0000\u0000"+
+ "\u03b7\u03b8\u0005e\u0000\u0000\u03b8\u03b9\u0005f\u0000\u0000\u03b9\u03ba"+
+ "\u0005a\u0000\u0000\u03ba\u03bb\u0005u\u0000\u0000\u03bb\u03bc\u0005l"+
+ "\u0000\u0000\u03bc\u03bd\u0005t\u0000\u0000\u03bd\u00a3\u0001\u0000\u0000"+
+ "\u0000\u03be\u03bf\u0005f\u0000\u0000\u03bf\u03c0\u0005u\u0000\u0000\u03c0"+
+ "\u03c1\u0005n\u0000\u0000\u03c1\u03c2\u0005c\u0000\u0000\u03c2\u00a5\u0001"+
+ "\u0000\u0000\u0000\u03c3\u03c4\u0005i\u0000\u0000\u03c4\u03c5\u0005n\u0000"+
+ "\u0000\u03c5\u03c6\u0005t\u0000\u0000\u03c6\u03c7\u0005e\u0000\u0000\u03c7"+
+ "\u03c8\u0005r\u0000\u0000\u03c8\u03c9\u0005f\u0000\u0000\u03c9\u03ca\u0005"+
+ "a\u0000\u0000\u03ca\u03cb\u0005c\u0000\u0000\u03cb\u03cc\u0005e\u0000"+
+ "\u0000\u03cc\u00a7\u0001\u0000\u0000\u0000\u03cd\u03ce\u0005s\u0000\u0000"+
+ "\u03ce\u03cf\u0005e\u0000\u0000\u03cf\u03d0\u0005l\u0000\u0000\u03d0\u03d1"+
+ "\u0005e\u0000\u0000\u03d1\u03d2\u0005c\u0000\u0000\u03d2\u03d3\u0005t"+
+ "\u0000\u0000\u03d3\u00a9\u0001\u0000\u0000\u0000\u03d4\u03d5\u0005c\u0000"+
+ "\u0000\u03d5\u03d6\u0005a\u0000\u0000\u03d6\u03d7\u0005s\u0000\u0000\u03d7"+
+ "\u03d8\u0005e\u0000\u0000\u03d8\u00ab\u0001\u0000\u0000\u0000\u03d9\u03da"+
+ "\u0005d\u0000\u0000\u03da\u03db\u0005e\u0000\u0000\u03db\u03dc\u0005f"+
+ "\u0000\u0000\u03dc\u03dd\u0005e\u0000\u0000\u03dd\u03de\u0005r\u0000\u0000"+
+ "\u03de\u00ad\u0001\u0000\u0000\u0000\u03df\u03e0\u0005g\u0000\u0000\u03e0"+
+ "\u03e1\u0005o\u0000\u0000\u03e1\u00af\u0001\u0000\u0000\u0000\u03e2\u03e3"+
+ "\u0005m\u0000\u0000\u03e3\u03e4\u0005a\u0000\u0000\u03e4\u03e5\u0005p"+
+ "\u0000\u0000\u03e5\u00b1\u0001\u0000\u0000\u0000\u03e6\u03e7\u0005s\u0000"+
+ "\u0000\u03e7\u03e8\u0005t\u0000\u0000\u03e8\u03e9\u0005r\u0000\u0000\u03e9"+
+ "\u03ea\u0005u\u0000\u0000\u03ea\u03eb\u0005c\u0000\u0000\u03eb\u03ec\u0005"+
+ "t\u0000\u0000\u03ec\u00b3\u0001\u0000\u0000\u0000\u03ed\u03ee\u0005c\u0000"+
+ "\u0000\u03ee\u03ef\u0005h\u0000\u0000\u03ef\u03f0\u0005a\u0000\u0000\u03f0"+
+ "\u03f1\u0005n\u0000\u0000\u03f1\u00b5\u0001\u0000\u0000\u0000\u03f2\u03f3"+
+ "\u0005e\u0000\u0000\u03f3\u03f4\u0005l\u0000\u0000\u03f4\u03f5\u0005s"+
+ "\u0000\u0000\u03f5\u03f6\u0005e\u0000\u0000\u03f6\u00b7\u0001\u0000\u0000"+
+ "\u0000\u03f7\u03f8\u0005g\u0000\u0000\u03f8\u03f9\u0005o\u0000\u0000\u03f9"+
+ "\u03fa\u0005t\u0000\u0000\u03fa\u03fb\u0005o\u0000\u0000\u03fb\u00b9\u0001"+
+ "\u0000\u0000\u0000\u03fc\u03fd\u0005p\u0000\u0000\u03fd\u03fe\u0005a\u0000"+
+ "\u0000\u03fe\u03ff\u0005c\u0000\u0000\u03ff\u0400\u0005k\u0000\u0000\u0400"+
+ "\u0401\u0005a\u0000\u0000\u0401\u0402\u0005g\u0000\u0000\u0402\u0403\u0005"+
+ "e\u0000\u0000\u0403\u00bb\u0001\u0000\u0000\u0000\u0404\u0405\u0005s\u0000"+
+ "\u0000\u0405\u0406\u0005w\u0000\u0000\u0406\u0407\u0005i\u0000\u0000\u0407"+
+ "\u0408\u0005t\u0000\u0000\u0408\u0409\u0005c\u0000\u0000\u0409\u040a\u0005"+
+ "h\u0000\u0000\u040a\u00bd\u0001\u0000\u0000\u0000\u040b\u040c\u0005c\u0000"+
+ "\u0000\u040c\u040d\u0005o\u0000\u0000\u040d\u040e\u0005n\u0000\u0000\u040e"+
+ "\u040f\u0005s\u0000\u0000\u040f\u0410\u0005t\u0000\u0000\u0410\u00bf\u0001"+
+ "\u0000\u0000\u0000\u0411\u0412\u0005f\u0000\u0000\u0412\u0413\u0005a\u0000"+
+ "\u0000\u0413\u0414\u0005l\u0000\u0000\u0414\u0415\u0005l\u0000\u0000\u0415"+
+ "\u0416\u0005t\u0000\u0000\u0416\u0417\u0005h\u0000\u0000\u0417\u0418\u0005"+
+ "r\u0000\u0000\u0418\u0419\u0005o\u0000\u0000\u0419\u041a\u0005u\u0000"+
+ "\u0000\u041a\u041b\u0005g\u0000\u0000\u041b\u041c\u0005h\u0000\u0000\u041c"+
+ "\u041d\u0001\u0000\u0000\u0000\u041d\u041e\u0006_\u0000\u0000\u041e\u00c1"+
+ "\u0001\u0000\u0000\u0000\u041f\u0420\u0005i\u0000\u0000\u0420\u0421\u0005"+
+ "f\u0000\u0000\u0421\u00c3\u0001\u0000\u0000\u0000\u0422\u0423\u0005r\u0000"+
+ "\u0000\u0423\u0424\u0005a\u0000\u0000\u0424\u0425\u0005n\u0000\u0000\u0425"+
+ "\u0426\u0005g\u0000\u0000\u0426\u0427\u0005e\u0000\u0000\u0427\u00c5\u0001"+
+ "\u0000\u0000\u0000\u0428\u0429\u0005t\u0000\u0000\u0429\u042a\u0005y\u0000"+
+ "\u0000\u042a\u042b\u0005p\u0000\u0000\u042b\u042c\u0005e\u0000\u0000\u042c"+
+ "\u00c7\u0001\u0000\u0000\u0000\u042d\u042e\u0005c\u0000\u0000\u042e\u042f"+
+ "\u0005o\u0000\u0000\u042f\u0430\u0005n\u0000\u0000\u0430\u0431\u0005t"+
+ "\u0000\u0000\u0431\u0432\u0005i\u0000\u0000\u0432\u0433\u0005n\u0000\u0000"+
+ "\u0433\u0434\u0005u\u0000\u0000\u0434\u0435\u0005e\u0000\u0000\u0435\u0436"+
+ "\u0001\u0000\u0000\u0000\u0436\u0437\u0006c\u0000\u0000\u0437\u00c9\u0001"+
+ "\u0000\u0000\u0000\u0438\u0439\u0005f\u0000\u0000\u0439\u043a\u0005o\u0000"+
+ "\u0000\u043a\u043b\u0005r\u0000\u0000\u043b\u00cb\u0001\u0000\u0000\u0000"+
+ "\u043c\u043d\u0005i\u0000\u0000\u043d\u043e\u0005m\u0000\u0000\u043e\u043f"+
+ "\u0005p\u0000\u0000\u043f\u0440\u0005o\u0000\u0000\u0440\u0441\u0005r"+
+ "\u0000\u0000\u0441\u0442\u0005t\u0000\u0000\u0442\u00cd\u0001\u0000\u0000"+
+ "\u0000\u0443\u0444\u0005r\u0000\u0000\u0444\u0445\u0005e\u0000\u0000\u0445"+
+ "\u0446\u0005t\u0000\u0000\u0446\u0447\u0005u\u0000\u0000\u0447\u0448\u0005"+
+ "r\u0000\u0000\u0448\u0449\u0005n\u0000\u0000\u0449\u044a\u0001\u0000\u0000"+
+ "\u0000\u044a\u044b\u0006f\u0000\u0000\u044b\u00cf\u0001\u0000\u0000\u0000"+
+ "\u044c\u044d\u0005v\u0000\u0000\u044d\u044e\u0005a\u0000\u0000\u044e\u044f"+
+ "\u0005r\u0000\u0000\u044f\u00d1\u0001\u0000\u0000\u0000\u0450\u0451\u0005"+
+ "n\u0000\u0000\u0451\u0452\u0005i\u0000\u0000\u0452\u0453\u0005l\u0000"+
+ "\u0000\u0453\u0454\u0001\u0000\u0000\u0000\u0454\u0455\u0006h\u0000\u0000"+
+ "\u0455\u00d3\u0001\u0000\u0000\u0000\u0456\u045b\u0003\u0156\u00aa\u0000"+
+ "\u0457\u045a\u0003\u0156\u00aa\u0000\u0458\u045a\u0003\u0158\u00ab\u0000"+
+ "\u0459\u0457\u0001\u0000\u0000\u0000\u0459\u0458\u0001\u0000\u0000\u0000"+
+ "\u045a\u045d\u0001\u0000\u0000\u0000\u045b\u0459\u0001\u0000\u0000\u0000"+
+ "\u045b\u045c\u0001\u0000\u0000\u0000\u045c\u045e\u0001\u0000\u0000\u0000"+
+ "\u045d\u045b\u0001\u0000\u0000\u0000\u045e\u045f\u0006i\u0000\u0000\u045f"+
+ "\u00d5\u0001\u0000\u0000\u0000\u0460\u0461\u0005(\u0000\u0000\u0461\u00d7"+
+ "\u0001\u0000\u0000\u0000\u0462\u0463\u0005)\u0000\u0000\u0463\u0464\u0001"+
+ "\u0000\u0000\u0000\u0464\u0465\u0006k\u0000\u0000\u0465\u00d9\u0001\u0000"+
+ "\u0000\u0000\u0466\u0467\u0005{\u0000\u0000\u0467\u00db\u0001\u0000\u0000"+
+ "\u0000\u0468\u0469\u0005}\u0000\u0000\u0469\u046a\u0001\u0000\u0000\u0000"+
+ "\u046a\u046b\u0006m\u0000\u0000\u046b\u00dd\u0001\u0000\u0000\u0000\u046c"+
+ "\u046d\u0005[\u0000\u0000\u046d\u00df\u0001\u0000\u0000\u0000\u046e\u046f"+
+ "\u0005]\u0000\u0000\u046f\u0470\u0001\u0000\u0000\u0000\u0470\u0471\u0006"+
+ "o\u0000\u0000\u0471\u00e1\u0001\u0000\u0000\u0000\u0472\u0473\u0005=\u0000"+
+ "\u0000\u0473\u00e3\u0001\u0000\u0000\u0000\u0474\u0475\u0005,\u0000\u0000"+
+ "\u0475\u00e5\u0001\u0000\u0000\u0000\u0476\u0477\u0005;\u0000\u0000\u0477"+
+ "\u00e7\u0001\u0000\u0000\u0000\u0478\u0479\u0005:\u0000\u0000\u0479\u00e9"+
+ "\u0001\u0000\u0000\u0000\u047a\u047b\u0005.\u0000\u0000\u047b\u00eb\u0001"+
+ "\u0000\u0000\u0000\u047c\u047d\u0005+\u0000\u0000\u047d\u047e\u0005+\u0000"+
+ "\u0000\u047e\u047f\u0001\u0000\u0000\u0000\u047f\u0480\u0006u\u0000\u0000"+
+ "\u0480\u00ed\u0001\u0000\u0000\u0000\u0481\u0482\u0005-\u0000\u0000\u0482"+
+ "\u0483\u0005-\u0000\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0485"+
+ "\u0006v\u0000\u0000\u0485\u00ef\u0001\u0000\u0000\u0000\u0486\u0487\u0005"+
+ ":\u0000\u0000\u0487\u0488\u0005=\u0000\u0000\u0488\u00f1\u0001\u0000\u0000"+
+ "\u0000\u0489\u048a\u0005.\u0000\u0000\u048a\u048b\u0005.\u0000\u0000\u048b"+
+ "\u048c\u0005.\u0000\u0000\u048c\u00f3\u0001\u0000\u0000\u0000\u048d\u048e"+
+ "\u0005|\u0000\u0000\u048e\u048f\u0005|\u0000\u0000\u048f\u00f5\u0001\u0000"+
+ "\u0000\u0000\u0490\u0491\u0005&\u0000\u0000\u0491\u0492\u0005&\u0000\u0000"+
+ "\u0492\u00f7\u0001\u0000\u0000\u0000\u0493\u0494\u0005=\u0000\u0000\u0494"+
+ "\u0495\u0005=\u0000\u0000\u0495\u00f9\u0001\u0000\u0000\u0000\u0496\u0497"+
+ "\u0005!\u0000\u0000\u0497\u0498\u0005=\u0000\u0000\u0498\u00fb\u0001\u0000"+
+ "\u0000\u0000\u0499\u049a\u0005<\u0000\u0000\u049a\u00fd\u0001\u0000\u0000"+
+ "\u0000\u049b\u049c\u0005<\u0000\u0000\u049c\u049d\u0005=\u0000\u0000\u049d"+
+ "\u00ff\u0001\u0000\u0000\u0000\u049e\u049f\u0005>\u0000\u0000\u049f\u0101"+
+ "\u0001\u0000\u0000\u0000\u04a0\u04a1\u0005>\u0000\u0000\u04a1\u04a2\u0005"+
+ "=\u0000\u0000\u04a2\u0103\u0001\u0000\u0000\u0000\u04a3\u04a4\u0005|\u0000"+
+ "\u0000\u04a4\u0105\u0001\u0000\u0000\u0000\u04a5\u04a6\u0005/\u0000\u0000"+
+ "\u04a6\u0107\u0001\u0000\u0000\u0000\u04a7\u04a8\u0005%\u0000\u0000\u04a8"+
+ "\u0109\u0001\u0000\u0000\u0000\u04a9\u04aa\u0005<\u0000\u0000\u04aa\u04ab"+
+ "\u0005<\u0000\u0000\u04ab\u010b\u0001\u0000\u0000\u0000\u04ac\u04ad\u0005"+
+ ">\u0000\u0000\u04ad\u04ae\u0005>\u0000\u0000\u04ae\u010d\u0001\u0000\u0000"+
+ "\u0000\u04af\u04b0\u0005&\u0000\u0000\u04b0\u04b1\u0005^\u0000\u0000\u04b1"+
+ "\u010f\u0001\u0000\u0000\u0000\u04b2\u04b3\u0005!\u0000\u0000\u04b3\u0111"+
+ "\u0001\u0000\u0000\u0000\u04b4\u04b5\u0005+\u0000\u0000\u04b5\u0113\u0001"+
+ "\u0000\u0000\u0000\u04b6\u04b7\u0005-\u0000\u0000\u04b7\u0115\u0001\u0000"+
+ "\u0000\u0000\u04b8\u04b9\u0005^\u0000\u0000\u04b9\u0117\u0001\u0000\u0000"+
+ "\u0000\u04ba\u04bb\u0005*\u0000\u0000\u04bb\u0119\u0001\u0000\u0000\u0000"+
+ "\u04bc\u04bd\u0005&\u0000\u0000\u04bd\u011b\u0001\u0000\u0000\u0000\u04be"+
+ "\u04bf\u0005<\u0000\u0000\u04bf\u04c0\u0005-\u0000\u0000\u04c0\u011d\u0001"+
+ "\u0000\u0000\u0000\u04c1\u04cd\u00050\u0000\u0000\u04c2\u04c9\u0007\u0000"+
+ "\u0000\u0000\u04c3\u04c5\u0005_\u0000\u0000\u04c4\u04c3\u0001\u0000\u0000"+
+ "\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001\u0000\u0000"+
+ "\u0000\u04c6\u04c8\u0007\u0001\u0000\u0000\u04c7\u04c4\u0001\u0000\u0000"+
+ "\u0000\u04c8\u04cb\u0001\u0000\u0000\u0000\u04c9\u04c7\u0001\u0000\u0000"+
+ "\u0000\u04c9\u04ca\u0001\u0000\u0000\u0000\u04ca\u04cd\u0001\u0000\u0000"+
+ "\u0000\u04cb\u04c9\u0001\u0000\u0000\u0000\u04cc\u04c1\u0001\u0000\u0000"+
+ "\u0000\u04cc\u04c2\u0001\u0000\u0000\u0000\u04cd\u04ce\u0001\u0000\u0000"+
+ "\u0000\u04ce\u04cf\u0006\u008e\u0000\u0000\u04cf\u011f\u0001\u0000\u0000"+
+ "\u0000\u04d0\u04d1\u00050\u0000\u0000\u04d1\u04d6\u0007\u0002\u0000\u0000"+
+ "\u04d2\u04d4\u0005_\u0000\u0000\u04d3\u04d2\u0001\u0000\u0000\u0000\u04d3"+
+ "\u04d4\u0001\u0000\u0000\u0000\u04d4\u04d5\u0001\u0000\u0000\u0000\u04d5"+
+ "\u04d7\u0003\u0152\u00a8\u0000\u04d6\u04d3\u0001\u0000\u0000\u0000\u04d7"+
+ "\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d6\u0001\u0000\u0000\u0000\u04d8"+
+ "\u04d9\u0001\u0000\u0000\u0000\u04d9\u04da\u0001\u0000\u0000\u0000\u04da"+
+ "\u04db\u0006\u008f\u0000\u0000\u04db\u0121\u0001\u0000\u0000\u0000\u04dc"+
+ "\u04de\u00050\u0000\u0000\u04dd\u04df\u0007\u0003\u0000\u0000\u04de\u04dd"+
+ "\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000\u0000\u04df\u04e4"+
+ "\u0001\u0000\u0000\u0000\u04e0\u04e2\u0005_\u0000\u0000\u04e1\u04e0\u0001"+
+ "\u0000\u0000\u0000\u04e1\u04e2\u0001\u0000\u0000\u0000\u04e2\u04e3\u0001"+
+ "\u0000\u0000\u0000\u04e3\u04e5\u0003\u014e\u00a6\u0000\u04e4\u04e1\u0001"+
+ "\u0000\u0000\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6\u04e4\u0001"+
+ "\u0000\u0000\u0000\u04e6\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001"+
+ "\u0000\u0000\u0000\u04e8\u04e9\u0006\u0090\u0000\u0000\u04e9\u0123\u0001"+
+ "\u0000\u0000\u0000\u04ea\u04eb\u00050\u0000\u0000\u04eb\u04f0\u0007\u0004"+
+ "\u0000\u0000\u04ec\u04ee\u0005_\u0000\u0000\u04ed\u04ec\u0001\u0000\u0000"+
+ "\u0000\u04ed\u04ee\u0001\u0000\u0000\u0000\u04ee\u04ef\u0001\u0000\u0000"+
+ "\u0000\u04ef\u04f1\u0003\u0150\u00a7\u0000\u04f0\u04ed\u0001\u0000\u0000"+
+ "\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2\u04f0\u0001\u0000\u0000"+
+ "\u0000\u04f2\u04f3\u0001\u0000\u0000\u0000\u04f3\u04f4\u0001\u0000\u0000"+
+ "\u0000\u04f4\u04f5\u0006\u0091\u0000\u0000\u04f5\u0125\u0001\u0000\u0000"+
+ "\u0000\u04f6\u04f7\u00050\u0000\u0000\u04f7\u04f8\u0007\u0004\u0000\u0000"+
+ "\u04f8\u04f9\u0003\u0128\u0093\u0000\u04f9\u04fa\u0003\u012a\u0094\u0000"+
+ "\u04fa\u0127\u0001\u0000\u0000\u0000\u04fb\u04fd\u0005_\u0000\u0000\u04fc"+
+ "\u04fb\u0001\u0000\u0000\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd"+
+ "\u04fe\u0001\u0000\u0000\u0000\u04fe\u0500\u0003\u0150\u00a7\u0000\u04ff"+
+ "\u04fc\u0001\u0000\u0000\u0000\u0500\u0501\u0001\u0000\u0000\u0000\u0501"+
+ "\u04ff\u0001\u0000\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502"+
+ "\u050d\u0001\u0000\u0000\u0000\u0503\u050a\u0005.\u0000\u0000\u0504\u0506"+
+ "\u0005_\u0000\u0000\u0505\u0504\u0001\u0000\u0000\u0000\u0505\u0506\u0001"+
+ "\u0000\u0000\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0509\u0003"+
+ "\u0150\u00a7\u0000\u0508\u0505\u0001\u0000\u0000\u0000\u0509\u050c\u0001"+
+ "\u0000\u0000\u0000\u050a\u0508\u0001\u0000\u0000\u0000\u050a\u050b\u0001"+
+ "\u0000\u0000\u0000\u050b\u050e\u0001\u0000\u0000\u0000\u050c\u050a\u0001"+
+ "\u0000\u0000\u0000\u050d\u0503\u0001\u0000\u0000\u0000\u050d\u050e\u0001"+
+ "\u0000\u0000\u0000\u050e\u051b\u0001\u0000\u0000\u0000\u050f\u0510\u0005"+
+ ".\u0000\u0000\u0510\u0517\u0003\u0150\u00a7\u0000\u0511\u0513\u0005_\u0000"+
+ "\u0000\u0512\u0511\u0001\u0000\u0000\u0000\u0512\u0513\u0001\u0000\u0000"+
+ "\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0516\u0003\u0150\u00a7"+
+ "\u0000\u0515\u0512\u0001\u0000\u0000\u0000\u0516\u0519\u0001\u0000\u0000"+
+ "\u0000\u0517\u0515\u0001\u0000\u0000\u0000\u0517\u0518\u0001\u0000\u0000"+
+ "\u0000\u0518\u051b\u0001\u0000\u0000\u0000\u0519\u0517\u0001\u0000\u0000"+
+ "\u0000\u051a\u04ff\u0001\u0000\u0000\u0000\u051a\u050f\u0001\u0000\u0000"+
+ "\u0000\u051b\u0129\u0001\u0000\u0000\u0000\u051c\u051e\u0007\u0005\u0000"+
+ "\u0000\u051d\u051f\u0007\u0006\u0000\u0000\u051e\u051d\u0001\u0000\u0000"+
+ "\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000"+
+ "\u0000\u0520\u0521\u0003\u014c\u00a5\u0000\u0521\u012b\u0001\u0000\u0000"+
+ "\u0000\u0522\u0528\u0003\u011e\u008e\u0000\u0523\u0528\u0003\u0120\u008f"+
+ "\u0000\u0524\u0528\u0003\u0122\u0090\u0000\u0525\u0528\u0003\u0124\u0091"+
+ "\u0000\u0526\u0528\u0003\u0002\u0000\u0000\u0527\u0522\u0001\u0000\u0000"+
+ "\u0000\u0527\u0523\u0001\u0000\u0000\u0000\u0527\u0524\u0001\u0000\u0000"+
+ "\u0000\u0527\u0525\u0001\u0000\u0000\u0000\u0527\u0526\u0001\u0000\u0000"+
+ "\u0000\u0528\u0529\u0001\u0000\u0000\u0000\u0529\u052a\u0005i\u0000\u0000"+
+ "\u052a\u052b\u0001\u0000\u0000\u0000\u052b\u052c\u0006\u0095\u0000\u0000"+
+ "\u052c\u012d\u0001\u0000\u0000\u0000\u052d\u0530\u0005\'\u0000\u0000\u052e"+
+ "\u0531\u0003\u0148\u00a3\u0000\u052f\u0531\u0003\u0132\u0098\u0000\u0530"+
+ "\u052e\u0001\u0000\u0000\u0000\u0530\u052f\u0001\u0000\u0000\u0000\u0531"+
+ "\u0532\u0001\u0000\u0000\u0000\u0532\u0533\u0005\'\u0000\u0000\u0533\u012f"+
+ "\u0001\u0000\u0000\u0000\u0534\u0535\u0003\u012e\u0096\u0000\u0535\u0536"+
+ "\u0001\u0000\u0000\u0000\u0536\u0537\u0006\u0097\u0000\u0000\u0537\u0131"+
+ "\u0001\u0000\u0000\u0000\u0538\u053b\u0003\u0134\u0099\u0000\u0539\u053b"+
+ "\u0003\u0136\u009a\u0000\u053a\u0538\u0001\u0000\u0000\u0000\u053a\u0539"+
+ "\u0001\u0000\u0000\u0000\u053b\u0133\u0001\u0000\u0000\u0000\u053c\u053d"+
+ "\u0005\\\u0000\u0000\u053d\u053e\u0003\u014e\u00a6\u0000\u053e\u053f\u0003"+
+ "\u014e\u00a6\u0000\u053f\u0540\u0003\u014e\u00a6\u0000\u0540\u0135\u0001"+
+ "\u0000\u0000\u0000\u0541\u0542\u0005\\\u0000\u0000\u0542\u0543\u0005x"+
+ "\u0000\u0000\u0543\u0544\u0003\u0150\u00a7\u0000\u0544\u0545\u0003\u0150"+
+ "\u00a7\u0000\u0545\u0137\u0001\u0000\u0000\u0000\u0546\u0547\u0005\\\u0000"+
+ "\u0000\u0547\u0548\u0005u\u0000\u0000\u0548\u0549\u0003\u0150\u00a7\u0000"+
+ "\u0549\u054a\u0003\u0150\u00a7\u0000\u054a\u054b\u0003\u0150\u00a7\u0000"+
+ "\u054b\u054c\u0003\u0150\u00a7\u0000\u054c\u0139\u0001\u0000\u0000\u0000"+
+ "\u054d\u054e\u0005\\\u0000\u0000\u054e\u054f\u0005U\u0000\u0000\u054f"+
+ "\u0550\u0003\u0150\u00a7\u0000\u0550\u0551\u0003\u0150\u00a7\u0000\u0551"+
+ "\u0552\u0003\u0150\u00a7\u0000\u0552\u0553\u0003\u0150\u00a7\u0000\u0553"+
+ "\u0554\u0003\u0150\u00a7\u0000\u0554\u0555\u0003\u0150\u00a7\u0000\u0555"+
+ "\u0556\u0003\u0150\u00a7\u0000\u0556\u0557\u0003\u0150\u00a7\u0000\u0557"+
+ "\u013b\u0001\u0000\u0000\u0000\u0558\u055c\u0005`\u0000\u0000\u0559\u055b"+
+ "\b\u0007\u0000\u0000\u055a\u0559\u0001\u0000\u0000\u0000\u055b\u055e\u0001"+
+ "\u0000\u0000\u0000\u055c\u055a\u0001\u0000\u0000\u0000\u055c\u055d\u0001"+
+ "\u0000\u0000\u0000\u055d\u055f\u0001\u0000\u0000\u0000\u055e\u055c\u0001"+
+ "\u0000\u0000\u0000\u055f\u0560\u0005`\u0000\u0000\u0560\u0561\u0001\u0000"+
+ "\u0000\u0000\u0561\u0562\u0006\u009d\u0000\u0000\u0562\u013d\u0001\u0000"+
+ "\u0000\u0000\u0563\u0568\u0005\"\u0000\u0000\u0564\u0567\b\b\u0000\u0000"+
+ "\u0565\u0567\u0003\u014a\u00a4\u0000\u0566\u0564\u0001\u0000\u0000\u0000"+
+ "\u0566\u0565\u0001\u0000\u0000\u0000\u0567\u056a\u0001\u0000\u0000\u0000"+
+ "\u0568\u0566\u0001\u0000\u0000\u0000\u0568\u0569\u0001\u0000\u0000\u0000"+
+ "\u0569\u056b\u0001\u0000\u0000\u0000\u056a\u0568\u0001\u0000\u0000\u0000"+
+ "\u056b\u056c\u0005\"\u0000\u0000\u056c\u056d\u0001\u0000\u0000\u0000\u056d"+
+ "\u056e\u0006\u009e\u0000\u0000\u056e\u013f\u0001\u0000\u0000\u0000\u056f"+
+ "\u0571\u0007\t\u0000\u0000\u0570\u056f\u0001\u0000\u0000\u0000\u0571\u0572"+
+ "\u0001\u0000\u0000\u0000\u0572\u0570\u0001\u0000\u0000\u0000\u0572\u0573"+
+ "\u0001\u0000\u0000\u0000\u0573\u0574\u0001\u0000\u0000\u0000\u0574\u0575"+
+ "\u0006\u009f\u0001\u0000\u0575\u0141\u0001\u0000\u0000\u0000\u0576\u0577"+
+ "\u0005/\u0000\u0000\u0577\u0578\u0005*\u0000\u0000\u0578\u057c\u0001\u0000"+
+ "\u0000\u0000\u0579\u057b\t\u0000\u0000\u0000\u057a\u0579\u0001\u0000\u0000"+
+ "\u0000\u057b\u057e\u0001\u0000\u0000\u0000\u057c\u057d\u0001\u0000\u0000"+
+ "\u0000\u057c\u057a\u0001\u0000\u0000\u0000\u057d\u057f\u0001\u0000\u0000"+
+ "\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057f\u0580\u0005*\u0000\u0000"+
+ "\u0580\u0581\u0005/\u0000\u0000\u0581\u0582\u0001\u0000\u0000\u0000\u0582"+
+ "\u0583\u0006\u00a0\u0001\u0000\u0583\u0143\u0001\u0000\u0000\u0000\u0584"+
+ "\u0586\u0007\n\u0000\u0000\u0585\u0584\u0001\u0000\u0000\u0000\u0586\u0587"+
+ "\u0001\u0000\u0000\u0000\u0587\u0585\u0001\u0000\u0000\u0000\u0587\u0588"+
+ "\u0001\u0000\u0000\u0000\u0588\u0589\u0001\u0000\u0000\u0000\u0589\u058a"+
+ "\u0006\u00a1\u0001\u0000\u058a\u0145\u0001\u0000\u0000\u0000\u058b\u058c"+
+ "\u0005/\u0000\u0000\u058c\u058d\u0005/\u0000\u0000\u058d\u0591\u0001\u0000"+
+ "\u0000\u0000\u058e\u0590\b\n\u0000\u0000\u058f\u058e\u0001\u0000\u0000"+
+ "\u0000\u0590\u0593\u0001\u0000\u0000\u0000\u0591\u058f\u0001\u0000\u0000"+
+ "\u0000\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0594\u0001\u0000\u0000"+
+ "\u0000\u0593\u0591\u0001\u0000\u0000\u0000\u0594\u0595\u0006\u00a2\u0001"+
+ "\u0000\u0595\u0147\u0001\u0000\u0000\u0000\u0596\u059b\b\u000b\u0000\u0000"+
+ "\u0597\u059b\u0003\u0138\u009b\u0000\u0598\u059b\u0003\u013a\u009c\u0000"+
+ "\u0599\u059b\u0003\u014a\u00a4\u0000\u059a\u0596\u0001\u0000\u0000\u0000"+
+ "\u059a\u0597\u0001\u0000\u0000\u0000\u059a\u0598\u0001\u0000\u0000\u0000"+
+ "\u059a\u0599\u0001\u0000\u0000\u0000\u059b\u0149\u0001\u0000\u0000\u0000"+
+ "\u059c\u05b6\u0005\\\u0000\u0000\u059d\u059e\u0005u\u0000\u0000\u059e"+
+ "\u059f\u0003\u0150\u00a7\u0000\u059f\u05a0\u0003\u0150\u00a7\u0000\u05a0"+
+ "\u05a1\u0003\u0150\u00a7\u0000\u05a1\u05a2\u0003\u0150\u00a7\u0000\u05a2"+
+ "\u05b7\u0001\u0000\u0000\u0000\u05a3\u05a4\u0005U\u0000\u0000\u05a4\u05a5"+
+ "\u0003\u0150\u00a7\u0000\u05a5\u05a6\u0003\u0150\u00a7\u0000\u05a6\u05a7"+
+ "\u0003\u0150\u00a7\u0000\u05a7\u05a8\u0003\u0150\u00a7\u0000\u05a8\u05a9"+
+ "\u0003\u0150\u00a7\u0000\u05a9\u05aa\u0003\u0150\u00a7\u0000\u05aa\u05ab"+
+ "\u0003\u0150\u00a7\u0000\u05ab\u05ac\u0003\u0150\u00a7\u0000\u05ac\u05b7"+
+ "\u0001\u0000\u0000\u0000\u05ad\u05b7\u0007\f\u0000\u0000\u05ae\u05af\u0003"+
+ "\u014e\u00a6\u0000\u05af\u05b0\u0003\u014e\u00a6\u0000\u05b0\u05b1\u0003"+
+ "\u014e\u00a6\u0000\u05b1\u05b7\u0001\u0000\u0000\u0000\u05b2\u05b3\u0005"+
+ "x\u0000\u0000\u05b3\u05b4\u0003\u0150\u00a7\u0000\u05b4\u05b5\u0003\u0150"+
+ "\u00a7\u0000\u05b5\u05b7\u0001\u0000\u0000\u0000\u05b6\u059d\u0001\u0000"+
+ "\u0000\u0000\u05b6\u05a3\u0001\u0000\u0000\u0000\u05b6\u05ad\u0001\u0000"+
+ "\u0000\u0000\u05b6\u05ae\u0001\u0000\u0000\u0000\u05b6\u05b2\u0001\u0000"+
+ "\u0000\u0000\u05b7\u014b\u0001\u0000\u0000\u0000\u05b8\u05bf\u0007\u0001"+
+ "\u0000\u0000\u05b9\u05bb\u0005_\u0000\u0000\u05ba\u05b9\u0001\u0000\u0000"+
+ "\u0000\u05ba\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bc\u0001\u0000\u0000"+
+ "\u0000\u05bc\u05be\u0007\u0001\u0000\u0000\u05bd\u05ba\u0001\u0000\u0000"+
+ "\u0000\u05be\u05c1\u0001\u0000\u0000\u0000\u05bf\u05bd\u0001\u0000\u0000"+
+ "\u0000\u05bf\u05c0\u0001\u0000\u0000\u0000\u05c0\u014d\u0001\u0000\u0000"+
+ "\u0000\u05c1\u05bf\u0001\u0000\u0000\u0000\u05c2\u05c3\u0007\r\u0000\u0000"+
+ "\u05c3\u014f\u0001\u0000\u0000\u0000\u05c4\u05c5\u0007\u000e\u0000\u0000"+
+ "\u05c5\u0151\u0001\u0000\u0000\u0000\u05c6\u05c7\u0007\u000f\u0000\u0000"+
+ "\u05c7\u0153\u0001\u0000\u0000\u0000\u05c8\u05ca\u0007\u0010\u0000\u0000"+
+ "\u05c9\u05cb\u0007\u0006\u0000\u0000\u05ca\u05c9\u0001\u0000\u0000\u0000"+
+ "\u05ca\u05cb\u0001\u0000\u0000\u0000\u05cb\u05cc\u0001\u0000\u0000\u0000"+
+ "\u05cc\u05cd\u0003\u014c\u00a5\u0000\u05cd\u0155\u0001\u0000\u0000\u0000"+
+ "\u05ce\u05d1\u0003\u015a\u00ac\u0000\u05cf\u05d1\u0005_\u0000\u0000\u05d0"+
+ "\u05ce\u0001\u0000\u0000\u0000\u05d0\u05cf\u0001\u0000\u0000\u0000\u05d1"+
+ "\u0157\u0001\u0000\u0000\u0000\u05d2\u05d3\u0007\u0011\u0000\u0000\u05d3"+
+ "\u0159\u0001\u0000\u0000\u0000\u05d4\u05d5\u0007\u0012\u0000\u0000\u05d5"+
+ "\u015b\u0001\u0000\u0000\u0000\u05d6\u05d8\u0007\t\u0000\u0000\u05d7\u05d6"+
+ "\u0001\u0000\u0000\u0000\u05d8\u05d9\u0001\u0000\u0000\u0000\u05d9\u05d7"+
+ "\u0001\u0000\u0000\u0000\u05d9\u05da\u0001\u0000\u0000\u0000\u05da\u05db"+
+ "\u0001\u0000\u0000\u0000\u05db\u05dc\u0006\u00ad\u0001\u0000\u05dc\u015d"+
+ "\u0001\u0000\u0000\u0000\u05dd\u05de\u0005/\u0000\u0000\u05de\u05df\u0005"+
+ "*\u0000\u0000\u05df\u05e3\u0001\u0000\u0000\u0000\u05e0\u05e2\b\n\u0000"+
+ "\u0000\u05e1\u05e0\u0001\u0000\u0000\u0000\u05e2\u05e5\u0001\u0000\u0000"+
+ "\u0000\u05e3\u05e4\u0001\u0000\u0000\u0000\u05e3\u05e1\u0001\u0000\u0000"+
+ "\u0000\u05e4\u05e6\u0001\u0000\u0000\u0000\u05e5\u05e3\u0001\u0000\u0000"+
+ "\u0000\u05e6\u05e7\u0005*\u0000\u0000\u05e7\u05e8\u0005/\u0000\u0000\u05e8"+
+ "\u05e9\u0001\u0000\u0000\u0000\u05e9\u05ea\u0006\u00ae\u0001\u0000\u05ea"+
+ "\u015f\u0001\u0000\u0000\u0000\u05eb\u05ec\u0005/\u0000\u0000\u05ec\u05ed"+
+ "\u0005/\u0000\u0000\u05ed\u05f1\u0001\u0000\u0000\u0000\u05ee\u05f0\b"+
+ "\n\u0000\u0000\u05ef\u05ee\u0001\u0000\u0000\u0000\u05f0\u05f3\u0001\u0000"+
+ "\u0000\u0000\u05f1\u05ef\u0001\u0000\u0000\u0000\u05f1\u05f2\u0001\u0000"+
+ "\u0000\u0000\u05f2\u05f4\u0001\u0000\u0000\u0000\u05f3\u05f1\u0001\u0000"+
+ "\u0000\u0000\u05f4\u05f5\u0006\u00af\u0001\u0000\u05f5\u0161\u0001\u0000"+
+ "\u0000\u0000\u05f6\u05f8\u0007\n\u0000\u0000\u05f7\u05f6\u0001\u0000\u0000"+
+ "\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f9\u05f7\u0001\u0000\u0000"+
+ "\u0000\u05f9\u05fa\u0001\u0000\u0000\u0000\u05fa\u0609\u0001\u0000\u0000"+
+ "\u0000\u05fb\u0609\u0005;\u0000\u0000\u05fc\u05fd\u0005/\u0000\u0000\u05fd"+
+ "\u05fe\u0005*\u0000\u0000\u05fe\u0602\u0001\u0000\u0000\u0000\u05ff\u0601"+
+ "\t\u0000\u0000\u0000\u0600\u05ff\u0001\u0000\u0000\u0000\u0601\u0604\u0001"+
+ "\u0000\u0000\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0602\u0600\u0001"+
+ "\u0000\u0000\u0000\u0603\u0605\u0001\u0000\u0000\u0000\u0604\u0602\u0001"+
+ "\u0000\u0000\u0000\u0605\u0606\u0005*\u0000\u0000\u0606\u0609\u0005/\u0000"+
+ "\u0000\u0607\u0609\u0005\u0000\u0000\u0001\u0608\u05f7\u0001\u0000\u0000"+
+ "\u0000\u0608\u05fb\u0001\u0000\u0000\u0000\u0608\u05fc\u0001\u0000\u0000"+
+ "\u0000\u0608\u0607\u0001\u0000\u0000\u0000\u0609\u060a\u0001\u0000\u0000"+
+ "\u0000\u060a\u060b\u0006\u00b0\u0002\u0000\u060b\u0163\u0001\u0000\u0000"+
+ "\u0000\u060c\u060d\u0001\u0000\u0000\u0000\u060d\u060e\u0001\u0000\u0000"+
+ "\u0000\u060e\u060f\u0006\u00b1\u0002\u0000\u060f\u0610\u0006\u00b1\u0001"+
+ "\u0000\u0610\u0165\u0001\u0000\u0000\u00003\u0000\u0001\u0168\u0170\u0173"+
+ "\u0176\u017c\u017e\u0459\u045b\u04c4\u04c9\u04cc\u04d3\u04d8\u04de\u04e1"+
+ "\u04e6\u04ed\u04f2\u04fc\u0501\u0505\u050a\u050d\u0512\u0517\u051a\u051e"+
+ "\u0527\u0530\u053a\u055c\u0566\u0568\u0572\u057c\u0587\u0591\u059a\u05b6"+
+ "\u05ba\u05bf\u05ca\u05d0\u05d9\u05e3\u05f1\u05f9\u0602\u0608\u0003\u0002"+
+ "\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java
index 1aa6c0f2c..806cccd72 100644
--- a/src/main/java/viper/gobra/frontend/GobraParser.java
+++ b/src/main/java/viper/gobra/frontend/GobraParser.java
@@ -27,22 +27,22 @@ public class GobraParser extends GobraParserBase {
MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, LOW=59, LOWC=60,
SHARE=61, ADDR_MOD=62, DOT_DOT=63, SHARED=64, EXCLUSIVE=65, PREDICATE=66,
WRITEPERM=67, NOPERM=68, TRUSTED=69, OUTLINE=70, INIT_POST=71, IMPORT_PRE=72,
- PROOF=73, GHOST_EQUALS=74, GHOST_NOT_EQUALS=75, WITH=76, BREAK=77, DEFAULT=78,
- FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86,
- CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93,
- IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100,
- VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106,
- R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112,
- COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117,
- ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122,
- LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127,
- DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133,
- PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139,
- DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144,
- IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148,
- HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152,
- INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157,
- WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162;
+ PROOF=73, GHOST_EQUALS=74, GHOST_NOT_EQUALS=75, WITH=76, OPAQUE=77, REVEAL=78,
+ BACKEND=79, BREAK=80, DEFAULT=81, FUNC=82, INTERFACE=83, SELECT=84, CASE=85,
+ DEFER=86, GO=87, MAP=88, STRUCT=89, CHAN=90, ELSE=91, GOTO=92, PACKAGE=93,
+ SWITCH=94, CONST=95, FALLTHROUGH=96, IF=97, RANGE=98, TYPE=99, CONTINUE=100,
+ FOR=101, IMPORT=102, RETURN=103, VAR=104, NIL_LIT=105, IDENTIFIER=106,
+ L_PAREN=107, R_PAREN=108, L_CURLY=109, R_CURLY=110, L_BRACKET=111, R_BRACKET=112,
+ ASSIGN=113, COMMA=114, SEMI=115, COLON=116, DOT=117, PLUS_PLUS=118, MINUS_MINUS=119,
+ DECLARE_ASSIGN=120, ELLIPSIS=121, LOGICAL_OR=122, LOGICAL_AND=123, EQUALS=124,
+ NOT_EQUALS=125, LESS=126, LESS_OR_EQUALS=127, GREATER=128, GREATER_OR_EQUALS=129,
+ OR=130, DIV=131, MOD=132, LSHIFT=133, RSHIFT=134, BIT_CLEAR=135, EXCLAMATION=136,
+ PLUS=137, MINUS=138, CARET=139, STAR=140, AMPERSAND=141, RECEIVE=142,
+ DECIMAL_LIT=143, BINARY_LIT=144, OCTAL_LIT=145, HEX_LIT=146, HEX_FLOAT_LIT=147,
+ IMAGINARY_LIT=148, RUNE_LIT=149, BYTE_VALUE=150, OCTAL_BYTE_VALUE=151,
+ HEX_BYTE_VALUE=152, LITTLE_U_VALUE=153, BIG_U_VALUE=154, RAW_STRING_LIT=155,
+ INTERPRETED_STRING_LIT=156, WS=157, COMMENT=158, TERMINATOR=159, LINE_COMMENT=160,
+ WS_NLSEMI=161, COMMENT_NLSEMI=162, LINE_COMMENT_NLSEMI=163, EOS=164, OTHER=165;
public static final int
RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3,
RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_preamble = 6,
@@ -57,47 +57,49 @@ public class GobraParser extends GobraParserBase {
RULE_matchExpr = 38, RULE_matchExprClause = 39, RULE_seqUpdExp = 40, RULE_seqUpdClause = 41,
RULE_ghostTypeLit = 42, RULE_domainType = 43, RULE_domainClause = 44,
RULE_adtType = 45, RULE_adtClause = 46, RULE_adtFieldDecl = 47, RULE_ghostSliceType = 48,
- RULE_sqType = 49, RULE_specification = 50, RULE_specStatement = 51, RULE_terminationMeasure = 52,
- RULE_assertion = 53, RULE_matchStmt = 54, RULE_matchStmtClause = 55, RULE_matchCase = 56,
- RULE_matchPattern = 57, RULE_matchPatternList = 58, RULE_blockWithBodyParameterInfo = 59,
- RULE_closureSpecInstance = 60, RULE_closureSpecParams = 61, RULE_closureSpecParam = 62,
- RULE_closureImplProofStmt = 63, RULE_implementationProof = 64, RULE_methodImplementationProof = 65,
- RULE_nonLocalReceiver = 66, RULE_selection = 67, RULE_implementationProofPredicateAlias = 68,
- RULE_make = 69, RULE_new_ = 70, RULE_specMember = 71, RULE_functionDecl = 72,
- RULE_methodDecl = 73, RULE_explicitGhostMember = 74, RULE_fpredicateDecl = 75,
- RULE_predicateBody = 76, RULE_mpredicateDecl = 77, RULE_varSpec = 78,
- RULE_shortVarDecl = 79, RULE_receiver = 80, RULE_parameterDecl = 81, RULE_actualParameterDecl = 82,
- RULE_ghostParameterDecl = 83, RULE_parameterType = 84, RULE_expression = 85,
- RULE_statement = 86, RULE_applyStmt = 87, RULE_packageStmt = 88, RULE_specForStmt = 89,
- RULE_loopSpec = 90, RULE_deferStmt = 91, RULE_basicLit = 92, RULE_primaryExpr = 93,
- RULE_functionLit = 94, RULE_closureDecl = 95, RULE_predConstructArgs = 96,
- RULE_interfaceType = 97, RULE_predicateSpec = 98, RULE_methodSpec = 99,
- RULE_type_ = 100, RULE_typeLit = 101, RULE_predType = 102, RULE_predTypeParams = 103,
- RULE_literalType = 104, RULE_implicitArray = 105, RULE_fieldDecl = 106,
- RULE_slice_ = 107, RULE_lowSliceArgument = 108, RULE_highSliceArgument = 109,
- RULE_capSliceArgument = 110, RULE_assign_op = 111, RULE_rangeClause = 112,
- RULE_packageClause = 113, RULE_importPath = 114, RULE_declaration = 115,
- RULE_constDecl = 116, RULE_constSpec = 117, RULE_identifierList = 118,
- RULE_expressionList = 119, RULE_typeDecl = 120, RULE_typeSpec = 121, RULE_varDecl = 122,
- RULE_block = 123, RULE_statementList = 124, RULE_simpleStmt = 125, RULE_expressionStmt = 126,
- RULE_sendStmt = 127, RULE_incDecStmt = 128, RULE_assignment = 129, RULE_emptyStmt = 130,
- RULE_labeledStmt = 131, RULE_returnStmt = 132, RULE_breakStmt = 133, RULE_continueStmt = 134,
- RULE_gotoStmt = 135, RULE_fallthroughStmt = 136, RULE_ifStmt = 137, RULE_switchStmt = 138,
- RULE_exprSwitchStmt = 139, RULE_exprCaseClause = 140, RULE_exprSwitchCase = 141,
- RULE_typeSwitchStmt = 142, RULE_typeSwitchGuard = 143, RULE_typeCaseClause = 144,
- RULE_typeSwitchCase = 145, RULE_typeList = 146, RULE_selectStmt = 147,
- RULE_commClause = 148, RULE_commCase = 149, RULE_recvStmt = 150, RULE_forStmt = 151,
- RULE_forClause = 152, RULE_goStmt = 153, RULE_typeName = 154, RULE_arrayType = 155,
- RULE_arrayLength = 156, RULE_elementType = 157, RULE_pointerType = 158,
- RULE_sliceType = 159, RULE_mapType = 160, RULE_channelType = 161, RULE_functionType = 162,
- RULE_signature = 163, RULE_result = 164, RULE_parameters = 165, RULE_conversion = 166,
- RULE_nonNamedType = 167, RULE_operand = 168, RULE_literal = 169, RULE_integer = 170,
- RULE_operandName = 171, RULE_qualifiedIdent = 172, RULE_compositeLit = 173,
- RULE_literalValue = 174, RULE_elementList = 175, RULE_keyedElement = 176,
- RULE_key = 177, RULE_element = 178, RULE_structType = 179, RULE_string_ = 180,
- RULE_embeddedField = 181, RULE_index = 182, RULE_typeAssertion = 183,
- RULE_arguments = 184, RULE_methodExpr = 185, RULE_receiverType = 186,
- RULE_eos = 187;
+ RULE_sqType = 49, RULE_specification = 50, RULE_backendAnnotationEntry = 51,
+ RULE_listOfValues = 52, RULE_singleBackendAnnotation = 53, RULE_backendAnnotationList = 54,
+ RULE_backendAnnotation = 55, RULE_specStatement = 56, RULE_terminationMeasure = 57,
+ RULE_assertion = 58, RULE_matchStmt = 59, RULE_matchStmtClause = 60, RULE_matchCase = 61,
+ RULE_matchPattern = 62, RULE_matchPatternList = 63, RULE_blockWithBodyParameterInfo = 64,
+ RULE_closureSpecInstance = 65, RULE_closureSpecParams = 66, RULE_closureSpecParam = 67,
+ RULE_closureImplProofStmt = 68, RULE_implementationProof = 69, RULE_methodImplementationProof = 70,
+ RULE_nonLocalReceiver = 71, RULE_selection = 72, RULE_implementationProofPredicateAlias = 73,
+ RULE_make = 74, RULE_new_ = 75, RULE_specMember = 76, RULE_functionDecl = 77,
+ RULE_methodDecl = 78, RULE_explicitGhostMember = 79, RULE_fpredicateDecl = 80,
+ RULE_predicateBody = 81, RULE_mpredicateDecl = 82, RULE_varSpec = 83,
+ RULE_shortVarDecl = 84, RULE_receiver = 85, RULE_parameterDecl = 86, RULE_actualParameterDecl = 87,
+ RULE_ghostParameterDecl = 88, RULE_parameterType = 89, RULE_expression = 90,
+ RULE_statement = 91, RULE_applyStmt = 92, RULE_packageStmt = 93, RULE_specForStmt = 94,
+ RULE_loopSpec = 95, RULE_deferStmt = 96, RULE_basicLit = 97, RULE_primaryExpr = 98,
+ RULE_functionLit = 99, RULE_closureDecl = 100, RULE_predConstructArgs = 101,
+ RULE_interfaceType = 102, RULE_predicateSpec = 103, RULE_methodSpec = 104,
+ RULE_type_ = 105, RULE_typeLit = 106, RULE_predType = 107, RULE_predTypeParams = 108,
+ RULE_literalType = 109, RULE_implicitArray = 110, RULE_fieldDecl = 111,
+ RULE_slice_ = 112, RULE_lowSliceArgument = 113, RULE_highSliceArgument = 114,
+ RULE_capSliceArgument = 115, RULE_assign_op = 116, RULE_rangeClause = 117,
+ RULE_packageClause = 118, RULE_importPath = 119, RULE_declaration = 120,
+ RULE_constDecl = 121, RULE_constSpec = 122, RULE_identifierList = 123,
+ RULE_expressionList = 124, RULE_typeDecl = 125, RULE_typeSpec = 126, RULE_varDecl = 127,
+ RULE_block = 128, RULE_statementList = 129, RULE_simpleStmt = 130, RULE_expressionStmt = 131,
+ RULE_sendStmt = 132, RULE_incDecStmt = 133, RULE_assignment = 134, RULE_emptyStmt = 135,
+ RULE_labeledStmt = 136, RULE_returnStmt = 137, RULE_breakStmt = 138, RULE_continueStmt = 139,
+ RULE_gotoStmt = 140, RULE_fallthroughStmt = 141, RULE_ifStmt = 142, RULE_switchStmt = 143,
+ RULE_exprSwitchStmt = 144, RULE_exprCaseClause = 145, RULE_exprSwitchCase = 146,
+ RULE_typeSwitchStmt = 147, RULE_typeSwitchGuard = 148, RULE_typeCaseClause = 149,
+ RULE_typeSwitchCase = 150, RULE_typeList = 151, RULE_selectStmt = 152,
+ RULE_commClause = 153, RULE_commCase = 154, RULE_recvStmt = 155, RULE_forStmt = 156,
+ RULE_forClause = 157, RULE_goStmt = 158, RULE_typeName = 159, RULE_arrayType = 160,
+ RULE_arrayLength = 161, RULE_elementType = 162, RULE_pointerType = 163,
+ RULE_sliceType = 164, RULE_mapType = 165, RULE_channelType = 166, RULE_functionType = 167,
+ RULE_signature = 168, RULE_result = 169, RULE_parameters = 170, RULE_conversion = 171,
+ RULE_nonNamedType = 172, RULE_operand = 173, RULE_literal = 174, RULE_integer = 175,
+ RULE_operandName = 176, RULE_qualifiedIdent = 177, RULE_compositeLit = 178,
+ RULE_literalValue = 179, RULE_elementList = 180, RULE_keyedElement = 181,
+ RULE_key = 182, RULE_element = 183, RULE_structType = 184, RULE_string_ = 185,
+ RULE_embeddedField = 186, RULE_index = 187, RULE_typeAssertion = 188,
+ RULE_arguments = 189, RULE_methodExpr = 190, RULE_receiverType = 191,
+ RULE_eos = 192;
private static String[] makeRuleNames() {
return new String[] {
"exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList",
@@ -110,34 +112,35 @@ private static String[] makeRuleNames() {
"typeOf", "access", "range", "matchExpr", "matchExprClause", "seqUpdExp",
"seqUpdClause", "ghostTypeLit", "domainType", "domainClause", "adtType",
"adtClause", "adtFieldDecl", "ghostSliceType", "sqType", "specification",
- "specStatement", "terminationMeasure", "assertion", "matchStmt", "matchStmtClause",
- "matchCase", "matchPattern", "matchPatternList", "blockWithBodyParameterInfo",
- "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt",
- "implementationProof", "methodImplementationProof", "nonLocalReceiver",
- "selection", "implementationProofPredicateAlias", "make", "new_", "specMember",
- "functionDecl", "methodDecl", "explicitGhostMember", "fpredicateDecl",
- "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", "receiver",
- "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType",
- "expression", "statement", "applyStmt", "packageStmt", "specForStmt",
- "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl",
- "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec",
- "type_", "typeLit", "predType", "predTypeParams", "literalType", "implicitArray",
- "fieldDecl", "slice_", "lowSliceArgument", "highSliceArgument", "capSliceArgument",
- "assign_op", "rangeClause", "packageClause", "importPath", "declaration",
- "constDecl", "constSpec", "identifierList", "expressionList", "typeDecl",
- "typeSpec", "varDecl", "block", "statementList", "simpleStmt", "expressionStmt",
- "sendStmt", "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt",
- "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt",
- "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt",
- "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt",
- "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt",
- "typeName", "arrayType", "arrayLength", "elementType", "pointerType",
- "sliceType", "mapType", "channelType", "functionType", "signature", "result",
- "parameters", "conversion", "nonNamedType", "operand", "literal", "integer",
- "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList",
- "keyedElement", "key", "element", "structType", "string_", "embeddedField",
- "index", "typeAssertion", "arguments", "methodExpr", "receiverType",
- "eos"
+ "backendAnnotationEntry", "listOfValues", "singleBackendAnnotation",
+ "backendAnnotationList", "backendAnnotation", "specStatement", "terminationMeasure",
+ "assertion", "matchStmt", "matchStmtClause", "matchCase", "matchPattern",
+ "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance",
+ "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof",
+ "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias",
+ "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember",
+ "fpredicateDecl", "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl",
+ "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl",
+ "parameterType", "expression", "statement", "applyStmt", "packageStmt",
+ "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit",
+ "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec",
+ "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType",
+ "implicitArray", "fieldDecl", "slice_", "lowSliceArgument", "highSliceArgument",
+ "capSliceArgument", "assign_op", "rangeClause", "packageClause", "importPath",
+ "declaration", "constDecl", "constSpec", "identifierList", "expressionList",
+ "typeDecl", "typeSpec", "varDecl", "block", "statementList", "simpleStmt",
+ "expressionStmt", "sendStmt", "incDecStmt", "assignment", "emptyStmt",
+ "labeledStmt", "returnStmt", "breakStmt", "continueStmt", "gotoStmt",
+ "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", "exprCaseClause",
+ "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", "typeCaseClause",
+ "typeSwitchCase", "typeList", "selectStmt", "commClause", "commCase",
+ "recvStmt", "forStmt", "forClause", "goStmt", "typeName", "arrayType",
+ "arrayLength", "elementType", "pointerType", "sliceType", "mapType",
+ "channelType", "functionType", "signature", "result", "parameters", "conversion",
+ "nonNamedType", "operand", "literal", "integer", "operandName", "qualifiedIdent",
+ "compositeLit", "literalValue", "elementList", "keyedElement", "key",
+ "element", "structType", "string_", "embeddedField", "index", "typeAssertion",
+ "arguments", "methodExpr", "receiverType", "eos"
};
}
public static final String[] ruleNames = makeRuleNames();
@@ -155,14 +158,15 @@ private static String[] makeLiteralNames() {
"'none'", "'pred'", "'typeOf'", "'isComparable'", "'low'", "'lowContext'",
"'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'",
"'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'",
- "'proof'", "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'",
- "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'",
- "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'",
- "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'",
- "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='",
- "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'",
- "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'",
- "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
+ "'proof'", "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'#backend'",
+ "'break'", "'default'", "'func'", "'interface'", "'select'", "'case'",
+ "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'",
+ "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", "'range'",
+ "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'",
+ null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'",
+ "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='",
+ "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'",
+ "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -178,20 +182,21 @@ private static String[] makeSymbolicNames() {
"TYPE_OF", "IS_COMPARABLE", "LOW", "LOWC", "SHARE", "ADDR_MOD", "DOT_DOT",
"SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED",
"OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS",
- "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER",
- "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST",
- "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN",
- "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY",
- "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT",
- "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR",
- "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER",
- "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR",
- "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE",
- "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT",
- "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE",
- "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT",
- "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI",
- "LINE_COMMENT_NLSEMI", "EOS", "OTHER"
+ "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
+ "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
+ "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
+ "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS",
+ "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD",
+ "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET",
+ "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT",
+ "HEX_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE",
+ "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE",
+ "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR",
+ "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI",
+ "EOS", "OTHER"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -269,9 +274,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(376);
+ setState(386);
expression(0);
- setState(377);
+ setState(387);
match(EOF);
}
}
@@ -309,9 +314,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(379);
+ setState(389);
statement();
- setState(380);
+ setState(390);
match(EOF);
}
}
@@ -349,9 +354,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(382);
+ setState(392);
type_();
- setState(383);
+ setState(393);
match(EOF);
}
}
@@ -396,21 +401,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis
try {
enterOuterAlt(_localctx, 1);
{
- setState(385);
+ setState(395);
maybeAddressableIdentifier();
- setState(390);
+ setState(400);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(386);
+ setState(396);
match(COMMA);
- setState(387);
+ setState(397);
maybeAddressableIdentifier();
}
}
- setState(392);
+ setState(402);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -449,14 +454,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro
try {
enterOuterAlt(_localctx, 1);
{
- setState(393);
+ setState(403);
match(IDENTIFIER);
- setState(395);
+ setState(405);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ADDR_MOD) {
{
- setState(394);
+ setState(404);
match(ADDR_MOD);
}
}
@@ -534,79 +539,79 @@ public final SourceFileContext sourceFile() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(402);
+ setState(412);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==INIT_POST) {
{
{
- setState(397);
+ setState(407);
initPost();
- setState(398);
+ setState(408);
eos();
}
}
- setState(404);
+ setState(414);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(405);
+ setState(415);
packageClause();
- setState(406);
+ setState(416);
eos();
- setState(412);
+ setState(422);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE || _la==IMPORT) {
{
{
- setState(407);
+ setState(417);
importDecl();
- setState(408);
+ setState(418);
eos();
}
}
- setState(414);
+ setState(424);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(424);
+ setState(434);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 1153084298900013111L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881350095299L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101061120L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 4845867656449L) != 0) || _la==STAR || _la==RECEIVE) {
{
{
- setState(418);
+ setState(428);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
case 1:
{
- setState(415);
+ setState(425);
specMember();
}
break;
case 2:
{
- setState(416);
+ setState(426);
declaration();
}
break;
case 3:
{
- setState(417);
+ setState(427);
ghostMember();
}
break;
}
- setState(420);
+ setState(430);
eos();
}
}
- setState(426);
+ setState(436);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(427);
+ setState(437);
match(EOF);
}
}
@@ -662,39 +667,39 @@ public final PreambleContext preamble() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(434);
+ setState(444);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==INIT_POST) {
{
{
- setState(429);
+ setState(439);
initPost();
- setState(430);
+ setState(440);
eos();
}
}
- setState(436);
+ setState(446);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(437);
+ setState(447);
packageClause();
- setState(438);
+ setState(448);
eos();
- setState(444);
+ setState(454);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE || _la==IMPORT) {
{
{
- setState(439);
+ setState(449);
importDecl();
- setState(440);
+ setState(450);
eos();
}
}
- setState(446);
+ setState(456);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -734,9 +739,9 @@ public final InitPostContext initPost() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(447);
+ setState(457);
match(INIT_POST);
- setState(448);
+ setState(458);
expression(0);
}
}
@@ -774,9 +779,9 @@ public final ImportPreContext importPre() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(450);
+ setState(460);
match(IMPORT_PRE);
- setState(451);
+ setState(461);
expression(0);
}
}
@@ -829,28 +834,28 @@ public final ImportSpecContext importSpec() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(458);
+ setState(468);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE) {
{
{
- setState(453);
+ setState(463);
importPre();
- setState(454);
+ setState(464);
eos();
}
}
- setState(460);
+ setState(470);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(462);
+ setState(472);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==IDENTIFIER || _la==DOT) {
{
- setState(461);
+ setState(471);
((ImportSpecContext)_localctx).alias = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==IDENTIFIER || _la==DOT) ) {
@@ -864,7 +869,7 @@ public final ImportSpecContext importSpec() throws RecognitionException {
}
}
- setState(464);
+ setState(474);
importPath();
}
}
@@ -920,56 +925,56 @@ public final ImportDeclContext importDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(471);
+ setState(481);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE) {
{
{
- setState(466);
+ setState(476);
importPre();
- setState(467);
+ setState(477);
eos();
}
}
- setState(473);
+ setState(483);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(487);
+ setState(497);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
case 1:
{
- setState(474);
+ setState(484);
match(IMPORT);
- setState(475);
+ setState(485);
importSpec();
}
break;
case 2:
{
- setState(476);
+ setState(486);
match(IMPORT);
- setState(477);
+ setState(487);
match(L_PAREN);
- setState(483);
+ setState(493);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 4400193994753L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) {
+ while (((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 35201551958017L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) {
{
{
- setState(478);
+ setState(488);
importSpec();
- setState(479);
+ setState(489);
eos();
}
}
- setState(485);
+ setState(495);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(486);
+ setState(496);
match(R_PAREN);
}
break;
@@ -1016,34 +1021,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException {
GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState());
enterRule(_localctx, 22, RULE_ghostMember);
try {
- setState(493);
+ setState(503);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(489);
+ setState(499);
implementationProof();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(490);
+ setState(500);
fpredicateDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(491);
+ setState(501);
mpredicateDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(492);
+ setState(502);
explicitGhostMember();
}
break;
@@ -1135,16 +1140,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
enterRule(_localctx, 24, RULE_ghostStatement);
int _la;
try {
- setState(502);
+ setState(512);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
_localctx = new ExplicitGhostStatementContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(495);
+ setState(505);
match(GHOST);
- setState(496);
+ setState(506);
statement();
}
break;
@@ -1153,7 +1158,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_localctx = new FoldStatementContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(497);
+ setState(507);
((FoldStatementContext)_localctx).fold_stmt = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==FOLD || _la==UNFOLD) ) {
@@ -1164,7 +1169,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_errHandler.reportMatch(this);
consume();
}
- setState(498);
+ setState(508);
predicateAccess();
}
break;
@@ -1175,7 +1180,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_localctx = new ProofStatementContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(499);
+ setState(509);
((ProofStatementContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) {
@@ -1186,7 +1191,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_errHandler.reportMatch(this);
consume();
}
- setState(500);
+ setState(510);
expression(0);
}
break;
@@ -1194,7 +1199,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_localctx = new MatchStmt_Context(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(501);
+ setState(511);
matchStmt();
}
break;
@@ -1235,7 +1240,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(504);
+ setState(514);
statementWithSpec();
}
}
@@ -1276,10 +1281,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(506);
+ setState(516);
((StatementWithSpecContext)_localctx).specification = specification();
{
- setState(507);
+ setState(517);
outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure);
}
}
@@ -1325,21 +1330,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu
try {
enterOuterAlt(_localctx, 1);
{
- setState(509);
+ setState(519);
match(OUTLINE);
- setState(510);
+ setState(520);
match(L_PAREN);
- setState(512);
+ setState(522);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) {
case 1:
{
- setState(511);
+ setState(521);
statementList();
}
break;
}
- setState(514);
+ setState(524);
match(R_PAREN);
}
}
@@ -1416,111 +1421,111 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept
GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState());
enterRule(_localctx, 32, RULE_ghostPrimaryExpr);
try {
- setState(531);
+ setState(541);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(516);
+ setState(526);
range();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(517);
+ setState(527);
access();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(518);
+ setState(528);
typeOf();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(519);
+ setState(529);
typeExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(520);
+ setState(530);
isComparable();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(521);
+ setState(531);
low();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(522);
+ setState(532);
lowc();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(523);
+ setState(533);
old();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(524);
+ setState(534);
before();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(525);
+ setState(535);
sConversion();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(526);
+ setState(536);
optionNone();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(527);
+ setState(537);
optionSome();
}
break;
case 13:
enterOuterAlt(_localctx, 13);
{
- setState(528);
+ setState(538);
optionGet();
}
break;
case 14:
enterOuterAlt(_localctx, 14);
{
- setState(529);
+ setState(539);
permission();
}
break;
case 15:
enterOuterAlt(_localctx, 15);
{
- setState(530);
+ setState(540);
matchExpr();
}
break;
@@ -1559,7 +1564,7 @@ public final PermissionContext permission() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(533);
+ setState(543);
_la = _input.LA(1);
if ( !(_la==WRITEPERM || _la==NOPERM) ) {
_errHandler.recoverInline(this);
@@ -1607,13 +1612,13 @@ public final TypeExprContext typeExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(535);
+ setState(545);
match(TYPE);
- setState(536);
+ setState(546);
match(L_BRACKET);
- setState(537);
+ setState(547);
type_();
- setState(538);
+ setState(548);
match(R_BRACKET);
}
}
@@ -1659,32 +1664,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(540);
+ setState(550);
boundVariableDecl();
- setState(545);
+ setState(555);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(541);
+ setState(551);
match(COMMA);
- setState(542);
+ setState(552);
boundVariableDecl();
}
}
}
- setState(547);
+ setState(557);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
}
- setState(549);
+ setState(559);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(548);
+ setState(558);
match(COMMA);
}
}
@@ -1733,25 +1738,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(551);
+ setState(561);
match(IDENTIFIER);
- setState(556);
+ setState(566);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(552);
+ setState(562);
match(COMMA);
- setState(553);
+ setState(563);
match(IDENTIFIER);
}
}
- setState(558);
+ setState(568);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(559);
+ setState(569);
elementType();
}
}
@@ -1792,17 +1797,17 @@ public final TriggersContext triggers() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(564);
+ setState(574);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==L_CURLY) {
{
{
- setState(561);
+ setState(571);
trigger();
}
}
- setState(566);
+ setState(576);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -1851,27 +1856,27 @@ public final TriggerContext trigger() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(567);
+ setState(577);
match(L_CURLY);
- setState(568);
+ setState(578);
expression(0);
- setState(573);
+ setState(583);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(569);
+ setState(579);
match(COMMA);
- setState(570);
+ setState(580);
expression(0);
}
}
- setState(575);
+ setState(585);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(576);
+ setState(586);
match(R_CURLY);
}
}
@@ -1908,7 +1913,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(578);
+ setState(588);
primaryExpr(0);
}
}
@@ -1948,13 +1953,13 @@ public final OptionSomeContext optionSome() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(580);
+ setState(590);
match(SOME);
- setState(581);
+ setState(591);
match(L_PAREN);
- setState(582);
+ setState(592);
expression(0);
- setState(583);
+ setState(593);
match(R_PAREN);
}
}
@@ -1994,13 +1999,13 @@ public final OptionNoneContext optionNone() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(585);
+ setState(595);
match(NONE);
- setState(586);
+ setState(596);
match(L_BRACKET);
- setState(587);
+ setState(597);
type_();
- setState(588);
+ setState(598);
match(R_BRACKET);
}
}
@@ -2040,13 +2045,13 @@ public final OptionGetContext optionGet() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(590);
+ setState(600);
match(GET);
- setState(591);
+ setState(601);
match(L_PAREN);
- setState(592);
+ setState(602);
expression(0);
- setState(593);
+ setState(603);
match(R_PAREN);
}
}
@@ -2090,7 +2095,7 @@ public final SConversionContext sConversion() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(595);
+ setState(605);
((SConversionContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) {
@@ -2101,11 +2106,11 @@ public final SConversionContext sConversion() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(596);
+ setState(606);
match(L_PAREN);
- setState(597);
+ setState(607);
expression(0);
- setState(598);
+ setState(608);
match(R_PAREN);
}
}
@@ -2151,27 +2156,27 @@ public final OldContext old() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(600);
+ setState(610);
match(OLD);
- setState(605);
+ setState(615);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==L_BRACKET) {
{
- setState(601);
+ setState(611);
match(L_BRACKET);
- setState(602);
+ setState(612);
oldLabelUse();
- setState(603);
+ setState(613);
match(R_BRACKET);
}
}
- setState(607);
+ setState(617);
match(L_PAREN);
- setState(608);
+ setState(618);
expression(0);
- setState(609);
+ setState(619);
match(R_PAREN);
}
}
@@ -2207,20 +2212,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException {
OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState());
enterRule(_localctx, 58, RULE_oldLabelUse);
try {
- setState(613);
+ setState(623);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(611);
+ setState(621);
labelUse();
}
break;
case LHS:
enterOuterAlt(_localctx, 2);
{
- setState(612);
+ setState(622);
match(LHS);
}
break;
@@ -2259,7 +2264,7 @@ public final LabelUseContext labelUse() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(615);
+ setState(625);
match(IDENTIFIER);
}
}
@@ -2299,13 +2304,13 @@ public final BeforeContext before() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(617);
+ setState(627);
match(BEFORE);
- setState(618);
+ setState(628);
match(L_PAREN);
- setState(619);
+ setState(629);
expression(0);
- setState(620);
+ setState(630);
match(R_PAREN);
}
}
@@ -2345,13 +2350,13 @@ public final IsComparableContext isComparable() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(622);
+ setState(632);
match(IS_COMPARABLE);
- setState(623);
+ setState(633);
match(L_PAREN);
- setState(624);
+ setState(634);
expression(0);
- setState(625);
+ setState(635);
match(R_PAREN);
}
}
@@ -2391,13 +2396,13 @@ public final LowContext low() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(627);
+ setState(637);
match(LOW);
- setState(628);
+ setState(638);
match(L_PAREN);
- setState(629);
+ setState(639);
expression(0);
- setState(630);
+ setState(640);
match(R_PAREN);
}
}
@@ -2434,11 +2439,11 @@ public final LowcContext lowc() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(632);
+ setState(642);
match(LOWC);
- setState(633);
+ setState(643);
match(L_PAREN);
- setState(634);
+ setState(644);
match(R_PAREN);
}
}
@@ -2478,13 +2483,13 @@ public final TypeOfContext typeOf() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(636);
+ setState(646);
match(TYPE_OF);
- setState(637);
+ setState(647);
match(L_PAREN);
- setState(638);
+ setState(648);
expression(0);
- setState(639);
+ setState(649);
match(R_PAREN);
}
}
@@ -2529,25 +2534,25 @@ public final AccessContext access() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(641);
+ setState(651);
match(ACCESS);
- setState(642);
+ setState(652);
match(L_PAREN);
- setState(643);
+ setState(653);
expression(0);
- setState(646);
+ setState(656);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(644);
+ setState(654);
match(COMMA);
- setState(645);
+ setState(655);
expression(0);
}
}
- setState(648);
+ setState(658);
match(R_PAREN);
}
}
@@ -2595,7 +2600,7 @@ public final RangeContext range() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(650);
+ setState(660);
((RangeContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) {
@@ -2606,15 +2611,15 @@ public final RangeContext range() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(651);
+ setState(661);
match(L_BRACKET);
- setState(652);
+ setState(662);
expression(0);
- setState(653);
+ setState(663);
match(DOT_DOT);
- setState(654);
+ setState(664);
expression(0);
- setState(655);
+ setState(665);
match(R_BRACKET);
}
}
@@ -2667,29 +2672,29 @@ public final MatchExprContext matchExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(657);
+ setState(667);
match(MATCH);
- setState(658);
+ setState(668);
expression(0);
- setState(659);
+ setState(669);
match(L_CURLY);
- setState(665);
+ setState(675);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(660);
+ setState(670);
matchExprClause();
- setState(661);
+ setState(671);
eos();
}
}
- setState(667);
+ setState(677);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(668);
+ setState(678);
match(R_CURLY);
}
}
@@ -2730,11 +2735,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(670);
+ setState(680);
matchCase();
- setState(671);
+ setState(681);
match(COLON);
- setState(672);
+ setState(682);
expression(0);
}
}
@@ -2781,29 +2786,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(674);
+ setState(684);
match(L_BRACKET);
{
- setState(675);
+ setState(685);
seqUpdClause();
- setState(680);
+ setState(690);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(676);
+ setState(686);
match(COMMA);
- setState(677);
+ setState(687);
seqUpdClause();
}
}
- setState(682);
+ setState(692);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
- setState(683);
+ setState(693);
match(R_BRACKET);
}
}
@@ -2844,11 +2849,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(685);
+ setState(695);
expression(0);
- setState(686);
+ setState(696);
match(ASSIGN);
- setState(687);
+ setState(697);
expression(0);
}
}
@@ -2892,7 +2897,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException {
GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState());
enterRule(_localctx, 84, RULE_ghostTypeLit);
try {
- setState(693);
+ setState(703);
_errHandler.sync(this);
switch (_input.LA(1)) {
case SEQ:
@@ -2902,28 +2907,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException {
case OPT:
enterOuterAlt(_localctx, 1);
{
- setState(689);
+ setState(699);
sqType();
}
break;
case GHOST:
enterOuterAlt(_localctx, 2);
{
- setState(690);
+ setState(700);
ghostSliceType();
}
break;
case DOM:
enterOuterAlt(_localctx, 3);
{
- setState(691);
+ setState(701);
domainType();
}
break;
case ADT:
enterOuterAlt(_localctx, 4);
{
- setState(692);
+ setState(702);
adtType();
}
break;
@@ -2977,27 +2982,27 @@ public final DomainTypeContext domainType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(695);
+ setState(705);
match(DOM);
- setState(696);
+ setState(706);
match(L_CURLY);
- setState(702);
+ setState(712);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==AXIOM || _la==FUNC) {
{
{
- setState(697);
+ setState(707);
domainClause();
- setState(698);
+ setState(708);
eos();
}
}
- setState(704);
+ setState(714);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(705);
+ setState(715);
match(R_CURLY);
}
}
@@ -3043,32 +3048,32 @@ public final DomainClauseContext domainClause() throws RecognitionException {
DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState());
enterRule(_localctx, 88, RULE_domainClause);
try {
- setState(716);
+ setState(726);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FUNC:
enterOuterAlt(_localctx, 1);
{
- setState(707);
+ setState(717);
match(FUNC);
- setState(708);
+ setState(718);
match(IDENTIFIER);
- setState(709);
+ setState(719);
signature();
}
break;
case AXIOM:
enterOuterAlt(_localctx, 2);
{
- setState(710);
+ setState(720);
match(AXIOM);
- setState(711);
+ setState(721);
match(L_CURLY);
- setState(712);
+ setState(722);
expression(0);
- setState(713);
+ setState(723);
eos();
- setState(714);
+ setState(724);
match(R_CURLY);
}
break;
@@ -3122,27 +3127,27 @@ public final AdtTypeContext adtType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(718);
+ setState(728);
match(ADT);
- setState(719);
+ setState(729);
match(L_CURLY);
- setState(725);
+ setState(735);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(720);
+ setState(730);
adtClause();
- setState(721);
+ setState(731);
eos();
}
}
- setState(727);
+ setState(737);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(728);
+ setState(738);
match(R_CURLY);
}
}
@@ -3192,27 +3197,27 @@ public final AdtClauseContext adtClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(730);
+ setState(740);
match(IDENTIFIER);
- setState(731);
+ setState(741);
match(L_CURLY);
- setState(737);
+ setState(747);
_errHandler.sync(this);
_la = _input.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441151881345761731L) != 0)) {
{
{
- setState(732);
+ setState(742);
adtFieldDecl();
- setState(733);
+ setState(743);
eos();
}
}
- setState(739);
+ setState(749);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(740);
+ setState(750);
match(R_CURLY);
}
}
@@ -3252,17 +3257,17 @@ public final AdtFieldDeclContext adtFieldDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(743);
+ setState(753);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
case 1:
{
- setState(742);
+ setState(752);
identifierList();
}
break;
}
- setState(745);
+ setState(755);
type_();
}
}
@@ -3302,13 +3307,13 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(747);
+ setState(757);
match(GHOST);
- setState(748);
+ setState(758);
match(L_BRACKET);
- setState(749);
+ setState(759);
match(R_BRACKET);
- setState(750);
+ setState(760);
elementType();
}
}
@@ -3355,7 +3360,7 @@ public final SqTypeContext sqType() throws RecognitionException {
enterRule(_localctx, 98, RULE_sqType);
int _la;
try {
- setState(763);
+ setState(773);
_errHandler.sync(this);
switch (_input.LA(1)) {
case SEQ:
@@ -3365,7 +3370,7 @@ public final SqTypeContext sqType() throws RecognitionException {
enterOuterAlt(_localctx, 1);
{
{
- setState(752);
+ setState(762);
((SqTypeContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) {
@@ -3376,11 +3381,11 @@ public final SqTypeContext sqType() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(753);
+ setState(763);
match(L_BRACKET);
- setState(754);
+ setState(764);
type_();
- setState(755);
+ setState(765);
match(R_BRACKET);
}
}
@@ -3388,15 +3393,15 @@ public final SqTypeContext sqType() throws RecognitionException {
case DICT:
enterOuterAlt(_localctx, 2);
{
- setState(757);
+ setState(767);
((SqTypeContext)_localctx).kind = match(DICT);
- setState(758);
+ setState(768);
match(L_BRACKET);
- setState(759);
+ setState(769);
type_();
- setState(760);
+ setState(770);
match(R_BRACKET);
- setState(761);
+ setState(771);
type_();
}
break;
@@ -3418,7 +3423,8 @@ public final SqTypeContext sqType() throws RecognitionException {
@SuppressWarnings("CheckReturnValue")
public static class SpecificationContext extends ParserRuleContext {
public boolean trusted = false;
- public boolean pure = false;;
+ public boolean pure = false;
+ public boolean opaque = false;;
public List eos() {
return getRuleContexts(EosContext.class);
}
@@ -3429,12 +3435,19 @@ public EosContext eos(int i) {
public TerminalNode PURE(int i) {
return getToken(GobraParser.PURE, i);
}
+ public BackendAnnotationContext backendAnnotation() {
+ return getRuleContext(BackendAnnotationContext.class,0);
+ }
public List specStatement() {
return getRuleContexts(SpecStatementContext.class);
}
public SpecStatementContext specStatement(int i) {
return getRuleContext(SpecStatementContext.class,i);
}
+ public List OPAQUE() { return getTokens(GobraParser.OPAQUE); }
+ public TerminalNode OPAQUE(int i) {
+ return getToken(GobraParser.OPAQUE, i);
+ }
public List TRUSTED() { return getTokens(GobraParser.TRUSTED); }
public TerminalNode TRUSTED(int i) {
return getToken(GobraParser.TRUSTED, i);
@@ -3458,14 +3471,14 @@ public final SpecificationContext specification() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(775);
+ setState(787);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,35,_ctx);
while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1+1 ) {
{
{
- setState(770);
+ setState(782);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
@@ -3473,20 +3486,27 @@ public final SpecificationContext specification() throws RecognitionException {
case POST:
case DEC:
{
- setState(765);
+ setState(775);
specStatement();
}
break;
+ case OPAQUE:
+ {
+ setState(776);
+ match(OPAQUE);
+ ((SpecificationContext)_localctx).opaque = true;
+ }
+ break;
case PURE:
{
- setState(766);
+ setState(778);
match(PURE);
((SpecificationContext)_localctx).pure = true;
}
break;
case TRUSTED:
{
- setState(768);
+ setState(780);
match(TRUSTED);
((SpecificationContext)_localctx).trusted = true;
}
@@ -3494,26 +3514,341 @@ public final SpecificationContext specification() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(772);
+ setState(784);
eos();
}
}
}
- setState(777);
+ setState(789);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,35,_ctx);
}
- setState(780);
+ setState(792);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==PURE) {
{
- setState(778);
+ setState(790);
match(PURE);
((SpecificationContext)_localctx).pure = true;
}
}
+ setState(795);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==BACKEND) {
+ {
+ setState(794);
+ backendAnnotation();
+ }
+ }
+
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class BackendAnnotationEntryContext extends ParserRuleContext {
+ public List L_PAREN() { return getTokens(GobraParser.L_PAREN); }
+ public TerminalNode L_PAREN(int i) {
+ return getToken(GobraParser.L_PAREN, i);
+ }
+ public List R_PAREN() { return getTokens(GobraParser.R_PAREN); }
+ public TerminalNode R_PAREN(int i) {
+ return getToken(GobraParser.R_PAREN, i);
+ }
+ public List COMMA() { return getTokens(GobraParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(GobraParser.COMMA, i);
+ }
+ public BackendAnnotationEntryContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_backendAnnotationEntry; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitBackendAnnotationEntry(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final BackendAnnotationEntryContext backendAnnotationEntry() throws RecognitionException {
+ BackendAnnotationEntryContext _localctx = new BackendAnnotationEntryContext(_ctx, getState());
+ enterRule(_localctx, 102, RULE_backendAnnotationEntry);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(798);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(797);
+ _la = _input.LA(1);
+ if ( _la <= 0 || (((((_la - 107)) & ~0x3f) == 0 && ((1L << (_la - 107)) & 131L) != 0)) ) {
+ _errHandler.recoverInline(this);
+ }
+ else {
+ if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+ _errHandler.reportMatch(this);
+ consume();
+ }
+ }
+ }
+ setState(800);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1152288185909249L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 274877906943L) != 0) );
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class ListOfValuesContext extends ParserRuleContext {
+ public List backendAnnotationEntry() {
+ return getRuleContexts(BackendAnnotationEntryContext.class);
+ }
+ public BackendAnnotationEntryContext backendAnnotationEntry(int i) {
+ return getRuleContext(BackendAnnotationEntryContext.class,i);
+ }
+ public List COMMA() { return getTokens(GobraParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(GobraParser.COMMA, i);
+ }
+ public ListOfValuesContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_listOfValues; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitListOfValues(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ListOfValuesContext listOfValues() throws RecognitionException {
+ ListOfValuesContext _localctx = new ListOfValuesContext(_ctx, getState());
+ enterRule(_localctx, 104, RULE_listOfValues);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(802);
+ backendAnnotationEntry();
+ setState(807);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(803);
+ match(COMMA);
+ setState(804);
+ backendAnnotationEntry();
+ }
+ }
+ setState(809);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class SingleBackendAnnotationContext extends ParserRuleContext {
+ public BackendAnnotationEntryContext backendAnnotationEntry() {
+ return getRuleContext(BackendAnnotationEntryContext.class,0);
+ }
+ public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); }
+ public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); }
+ public ListOfValuesContext listOfValues() {
+ return getRuleContext(ListOfValuesContext.class,0);
+ }
+ public SingleBackendAnnotationContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_singleBackendAnnotation; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitSingleBackendAnnotation(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final SingleBackendAnnotationContext singleBackendAnnotation() throws RecognitionException {
+ SingleBackendAnnotationContext _localctx = new SingleBackendAnnotationContext(_ctx, getState());
+ enterRule(_localctx, 106, RULE_singleBackendAnnotation);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(810);
+ backendAnnotationEntry();
+ setState(811);
+ match(L_PAREN);
+ setState(813);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1152288185909249L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 274877906943L) != 0)) {
+ {
+ setState(812);
+ listOfValues();
+ }
+ }
+
+ setState(815);
+ match(R_PAREN);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class BackendAnnotationListContext extends ParserRuleContext {
+ public List singleBackendAnnotation() {
+ return getRuleContexts(SingleBackendAnnotationContext.class);
+ }
+ public SingleBackendAnnotationContext singleBackendAnnotation(int i) {
+ return getRuleContext(SingleBackendAnnotationContext.class,i);
+ }
+ public List COMMA() { return getTokens(GobraParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(GobraParser.COMMA, i);
+ }
+ public BackendAnnotationListContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_backendAnnotationList; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitBackendAnnotationList(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final BackendAnnotationListContext backendAnnotationList() throws RecognitionException {
+ BackendAnnotationListContext _localctx = new BackendAnnotationListContext(_ctx, getState());
+ enterRule(_localctx, 108, RULE_backendAnnotationList);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(817);
+ singleBackendAnnotation();
+ setState(822);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(818);
+ match(COMMA);
+ setState(819);
+ singleBackendAnnotation();
+ }
+ }
+ setState(824);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class BackendAnnotationContext extends ParserRuleContext {
+ public TerminalNode BACKEND() { return getToken(GobraParser.BACKEND, 0); }
+ public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); }
+ public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); }
+ public EosContext eos() {
+ return getRuleContext(EosContext.class,0);
+ }
+ public BackendAnnotationListContext backendAnnotationList() {
+ return getRuleContext(BackendAnnotationListContext.class,0);
+ }
+ public BackendAnnotationContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_backendAnnotation; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitBackendAnnotation(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final BackendAnnotationContext backendAnnotation() throws RecognitionException {
+ BackendAnnotationContext _localctx = new BackendAnnotationContext(_ctx, getState());
+ enterRule(_localctx, 110, RULE_backendAnnotation);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(825);
+ match(BACKEND);
+ setState(826);
+ match(L_BRACKET);
+ setState(828);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) {
+ case 1:
+ {
+ setState(827);
+ backendAnnotationList();
+ }
+ break;
+ }
+ setState(830);
+ match(R_BRACKET);
+ setState(831);
+ eos();
}
}
catch (RecognitionException re) {
@@ -3553,44 +3888,44 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecStatementContext specStatement() throws RecognitionException {
SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState());
- enterRule(_localctx, 102, RULE_specStatement);
+ enterRule(_localctx, 112, RULE_specStatement);
try {
- setState(790);
+ setState(841);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
enterOuterAlt(_localctx, 1);
{
- setState(782);
+ setState(833);
((SpecStatementContext)_localctx).kind = match(PRE);
- setState(783);
+ setState(834);
assertion();
}
break;
case PRESERVES:
enterOuterAlt(_localctx, 2);
{
- setState(784);
+ setState(835);
((SpecStatementContext)_localctx).kind = match(PRESERVES);
- setState(785);
+ setState(836);
assertion();
}
break;
case POST:
enterOuterAlt(_localctx, 3);
{
- setState(786);
+ setState(837);
((SpecStatementContext)_localctx).kind = match(POST);
- setState(787);
+ setState(838);
assertion();
}
break;
case DEC:
enterOuterAlt(_localctx, 4);
{
- setState(788);
+ setState(839);
((SpecStatementContext)_localctx).kind = match(DEC);
- setState(789);
+ setState(840);
terminationMeasure();
}
break;
@@ -3631,28 +3966,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TerminationMeasureContext terminationMeasure() throws RecognitionException {
TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState());
- enterRule(_localctx, 104, RULE_terminationMeasure);
+ enterRule(_localctx, 114, RULE_terminationMeasure);
try {
enterOuterAlt(_localctx, 1);
{
- setState(793);
+ setState(844);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) {
case 1:
{
- setState(792);
+ setState(843);
expressionList();
}
break;
}
- setState(797);
+ setState(848);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) {
case 1:
{
- setState(795);
+ setState(846);
match(IF);
- setState(796);
+ setState(847);
expression(0);
}
break;
@@ -3688,11 +4023,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AssertionContext assertion() throws RecognitionException {
AssertionContext _localctx = new AssertionContext(_ctx, getState());
- enterRule(_localctx, 106, RULE_assertion);
+ enterRule(_localctx, 116, RULE_assertion);
try {
- setState(801);
+ setState(852);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
@@ -3701,7 +4036,7 @@ public final AssertionContext assertion() throws RecognitionException {
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(800);
+ setState(851);
expression(0);
}
break;
@@ -3745,32 +4080,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MatchStmtContext matchStmt() throws RecognitionException {
MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState());
- enterRule(_localctx, 108, RULE_matchStmt);
+ enterRule(_localctx, 118, RULE_matchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(803);
+ setState(854);
match(MATCH);
- setState(804);
+ setState(855);
expression(0);
- setState(805);
+ setState(856);
match(L_CURLY);
- setState(809);
+ setState(860);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(806);
+ setState(857);
matchStmtClause();
}
}
- setState(811);
+ setState(862);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(812);
+ setState(863);
match(R_CURLY);
}
}
@@ -3807,20 +4142,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MatchStmtClauseContext matchStmtClause() throws RecognitionException {
MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState());
- enterRule(_localctx, 110, RULE_matchStmtClause);
+ enterRule(_localctx, 120, RULE_matchStmtClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(814);
+ setState(865);
matchCase();
- setState(815);
+ setState(866);
match(COLON);
- setState(817);
+ setState(868);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) {
case 1:
{
- setState(816);
+ setState(867);
statementList();
}
break;
@@ -3858,24 +4193,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MatchCaseContext matchCase() throws RecognitionException {
MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState());
- enterRule(_localctx, 112, RULE_matchCase);
+ enterRule(_localctx, 122, RULE_matchCase);
try {
- setState(822);
+ setState(873);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(819);
+ setState(870);
match(CASE);
- setState(820);
+ setState(871);
matchPattern();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(821);
+ setState(872);
match(DEFAULT);
}
break;
@@ -3950,19 +4285,19 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MatchPatternContext matchPattern() throws RecognitionException {
MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState());
- enterRule(_localctx, 114, RULE_matchPattern);
+ enterRule(_localctx, 124, RULE_matchPattern);
int _la;
try {
- setState(837);
+ setState(888);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1:
_localctx = new MatchPatternBindContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(824);
+ setState(875);
match(QMARK);
- setState(825);
+ setState(876);
match(IDENTIFIER);
}
break;
@@ -3970,23 +4305,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException {
_localctx = new MatchPatternCompositeContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(826);
+ setState(877);
literalType();
- setState(827);
+ setState(878);
match(L_CURLY);
- setState(832);
+ setState(883);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338447756291610L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338447756291610L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(828);
+ setState(879);
matchPatternList();
- setState(830);
+ setState(881);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(829);
+ setState(880);
match(COMMA);
}
}
@@ -3994,7 +4329,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException {
}
}
- setState(834);
+ setState(885);
match(R_CURLY);
}
break;
@@ -4002,7 +4337,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException {
_localctx = new MatchPatternValueContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(836);
+ setState(887);
expression(0);
}
break;
@@ -4044,30 +4379,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MatchPatternListContext matchPatternList() throws RecognitionException {
MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState());
- enterRule(_localctx, 116, RULE_matchPatternList);
+ enterRule(_localctx, 126, RULE_matchPatternList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(839);
+ setState(890);
matchPattern();
- setState(844);
+ setState(895);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,47,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,53,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(840);
+ setState(891);
match(COMMA);
- setState(841);
+ setState(892);
matchPattern();
}
}
}
- setState(846);
+ setState(897);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,47,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,53,_ctx);
}
}
}
@@ -4109,37 +4444,37 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException {
BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState());
- enterRule(_localctx, 118, RULE_blockWithBodyParameterInfo);
+ enterRule(_localctx, 128, RULE_blockWithBodyParameterInfo);
try {
enterOuterAlt(_localctx, 1);
{
- setState(847);
+ setState(898);
match(L_CURLY);
- setState(852);
+ setState(903);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) {
case 1:
{
- setState(848);
+ setState(899);
match(SHARE);
- setState(849);
+ setState(900);
identifierList();
- setState(850);
+ setState(901);
eos();
}
break;
}
- setState(855);
+ setState(906);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) {
case 1:
{
- setState(854);
+ setState(905);
statementList();
}
break;
}
- setState(857);
+ setState(908);
match(R_CURLY);
}
}
@@ -4179,47 +4514,47 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException {
ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState());
- enterRule(_localctx, 120, RULE_closureSpecInstance);
+ enterRule(_localctx, 130, RULE_closureSpecInstance);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(861);
+ setState(912);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) {
case 1:
{
- setState(859);
+ setState(910);
qualifiedIdent();
}
break;
case 2:
{
- setState(860);
+ setState(911);
match(IDENTIFIER);
}
break;
}
- setState(871);
+ setState(922);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) {
case 1:
{
- setState(863);
+ setState(914);
match(L_CURLY);
- setState(868);
+ setState(919);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(864);
+ setState(915);
closureSpecParams();
- setState(866);
+ setState(917);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(865);
+ setState(916);
match(COMMA);
}
}
@@ -4227,7 +4562,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition
}
}
- setState(870);
+ setState(921);
match(R_CURLY);
}
break;
@@ -4270,30 +4605,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException {
ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState());
- enterRule(_localctx, 122, RULE_closureSpecParams);
+ enterRule(_localctx, 132, RULE_closureSpecParams);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(873);
+ setState(924);
closureSpecParam();
- setState(878);
+ setState(929);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,54,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,60,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(874);
+ setState(925);
match(COMMA);
- setState(875);
+ setState(926);
closureSpecParam();
}
}
}
- setState(880);
+ setState(931);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,54,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,60,_ctx);
}
}
}
@@ -4328,23 +4663,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecParamContext closureSpecParam() throws RecognitionException {
ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState());
- enterRule(_localctx, 124, RULE_closureSpecParam);
+ enterRule(_localctx, 134, RULE_closureSpecParam);
try {
enterOuterAlt(_localctx, 1);
{
- setState(883);
+ setState(934);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) {
case 1:
{
- setState(881);
+ setState(932);
match(IDENTIFIER);
- setState(882);
+ setState(933);
match(COLON);
}
break;
}
- setState(885);
+ setState(936);
expression(0);
}
}
@@ -4385,19 +4720,19 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException {
ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState());
- enterRule(_localctx, 126, RULE_closureImplProofStmt);
+ enterRule(_localctx, 136, RULE_closureImplProofStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(887);
+ setState(938);
match(PROOF);
- setState(888);
+ setState(939);
expression(0);
- setState(889);
+ setState(940);
match(IMPL);
- setState(890);
+ setState(941);
closureSpecInstance();
- setState(891);
+ setState(942);
block();
}
}
@@ -4454,57 +4789,57 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImplementationProofContext implementationProof() throws RecognitionException {
ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState());
- enterRule(_localctx, 128, RULE_implementationProof);
+ enterRule(_localctx, 138, RULE_implementationProof);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(893);
+ setState(944);
type_();
- setState(894);
+ setState(945);
match(IMPL);
- setState(895);
+ setState(946);
type_();
- setState(914);
+ setState(965);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) {
case 1:
{
- setState(896);
+ setState(947);
match(L_CURLY);
- setState(902);
+ setState(953);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==PRED) {
{
{
- setState(897);
+ setState(948);
implementationProofPredicateAlias();
- setState(898);
+ setState(949);
eos();
}
}
- setState(904);
+ setState(955);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(910);
+ setState(961);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==PURE || _la==L_PAREN) {
{
{
- setState(905);
+ setState(956);
methodImplementationProof();
- setState(906);
+ setState(957);
eos();
}
}
- setState(912);
+ setState(963);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(913);
+ setState(964);
match(R_CURLY);
}
break;
@@ -4548,33 +4883,33 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException {
MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState());
- enterRule(_localctx, 130, RULE_methodImplementationProof);
+ enterRule(_localctx, 140, RULE_methodImplementationProof);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(917);
+ setState(968);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==PURE) {
{
- setState(916);
+ setState(967);
match(PURE);
}
}
- setState(919);
+ setState(970);
nonLocalReceiver();
- setState(920);
+ setState(971);
match(IDENTIFIER);
- setState(921);
+ setState(972);
signature();
- setState(923);
+ setState(974);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) {
case 1:
{
- setState(922);
+ setState(973);
block();
}
break;
@@ -4614,36 +4949,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException {
NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState());
- enterRule(_localctx, 132, RULE_nonLocalReceiver);
+ enterRule(_localctx, 142, RULE_nonLocalReceiver);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(925);
+ setState(976);
match(L_PAREN);
- setState(927);
+ setState(978);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) {
case 1:
{
- setState(926);
+ setState(977);
match(IDENTIFIER);
}
break;
}
- setState(930);
+ setState(981);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==STAR) {
{
- setState(929);
+ setState(980);
match(STAR);
}
}
- setState(932);
+ setState(983);
typeName();
- setState(933);
+ setState(984);
match(R_PAREN);
}
}
@@ -4681,26 +5016,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SelectionContext selection() throws RecognitionException {
SelectionContext _localctx = new SelectionContext(_ctx, getState());
- enterRule(_localctx, 134, RULE_selection);
+ enterRule(_localctx, 144, RULE_selection);
try {
- setState(940);
+ setState(991);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(935);
+ setState(986);
primaryExpr(0);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(936);
+ setState(987);
type_();
- setState(937);
+ setState(988);
match(DOT);
- setState(938);
+ setState(989);
match(IDENTIFIER);
}
break;
@@ -4741,28 +5076,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException {
ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState());
- enterRule(_localctx, 136, RULE_implementationProofPredicateAlias);
+ enterRule(_localctx, 146, RULE_implementationProofPredicateAlias);
try {
enterOuterAlt(_localctx, 1);
{
- setState(942);
+ setState(993);
match(PRED);
- setState(943);
+ setState(994);
match(IDENTIFIER);
- setState(944);
+ setState(995);
match(DECLARE_ASSIGN);
- setState(947);
+ setState(998);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) {
case 1:
{
- setState(945);
+ setState(996);
selection();
}
break;
case 2:
{
- setState(946);
+ setState(997);
operandName();
}
break;
@@ -4805,30 +5140,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MakeContext make() throws RecognitionException {
MakeContext _localctx = new MakeContext(_ctx, getState());
- enterRule(_localctx, 138, RULE_make);
+ enterRule(_localctx, 148, RULE_make);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(949);
+ setState(1000);
match(MAKE);
- setState(950);
+ setState(1001);
match(L_PAREN);
- setState(951);
+ setState(1002);
type_();
- setState(954);
+ setState(1005);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(952);
+ setState(1003);
match(COMMA);
- setState(953);
+ setState(1004);
expressionList();
}
}
- setState(956);
+ setState(1007);
match(R_PAREN);
}
}
@@ -4864,17 +5199,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final New_Context new_() throws RecognitionException {
New_Context _localctx = new New_Context(_ctx, getState());
- enterRule(_localctx, 140, RULE_new_);
+ enterRule(_localctx, 150, RULE_new_);
try {
enterOuterAlt(_localctx, 1);
{
- setState(958);
+ setState(1009);
match(NEW);
- setState(959);
+ setState(1010);
match(L_PAREN);
- setState(960);
+ setState(1011);
type_();
- setState(961);
+ setState(1012);
match(R_PAREN);
}
}
@@ -4914,25 +5249,25 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecMemberContext specMember() throws RecognitionException {
SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState());
- enterRule(_localctx, 142, RULE_specMember);
+ enterRule(_localctx, 152, RULE_specMember);
try {
enterOuterAlt(_localctx, 1);
{
- setState(963);
+ setState(1014);
((SpecMemberContext)_localctx).specification = specification();
- setState(966);
+ setState(1017);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) {
case 1:
{
- setState(964);
- functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure);
+ setState(1015);
+ functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque);
}
break;
case 2:
{
- setState(965);
- methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure);
+ setState(1016);
+ methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque);
}
break;
}
@@ -4953,6 +5288,7 @@ public final SpecMemberContext specMember() throws RecognitionException {
public static class FunctionDeclContext extends ParserRuleContext {
public boolean trusted;
public boolean pure;
+ public boolean opaque;
public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); }
public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); }
public SignatureContext signature() {
@@ -4962,10 +5298,11 @@ public BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() {
return getRuleContext(BlockWithBodyParameterInfoContext.class,0);
}
public FunctionDeclContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); }
- public FunctionDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure) {
+ public FunctionDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure, boolean opaque) {
super(parent, invokingState);
this.trusted = trusted;
this.pure = pure;
+ this.opaque = opaque;
}
@Override public int getRuleIndex() { return RULE_functionDecl; }
@Override
@@ -4975,25 +5312,25 @@ public T accept(ParseTreeVisitor extends T> visitor) {
}
}
- public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException {
- FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure);
- enterRule(_localctx, 144, RULE_functionDecl);
+ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException {
+ FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure, opaque);
+ enterRule(_localctx, 154, RULE_functionDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(968);
+ setState(1019);
match(FUNC);
- setState(969);
+ setState(1020);
match(IDENTIFIER);
{
- setState(970);
+ setState(1021);
signature();
- setState(972);
+ setState(1023);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) {
case 1:
{
- setState(971);
+ setState(1022);
blockWithBodyParameterInfo();
}
break;
@@ -5016,6 +5353,7 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) thro
public static class MethodDeclContext extends ParserRuleContext {
public boolean trusted;
public boolean pure;
+ public boolean opaque;
public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); }
public ReceiverContext receiver() {
return getRuleContext(ReceiverContext.class,0);
@@ -5028,10 +5366,11 @@ public BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() {
return getRuleContext(BlockWithBodyParameterInfoContext.class,0);
}
public MethodDeclContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); }
- public MethodDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure) {
+ public MethodDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure, boolean opaque) {
super(parent, invokingState);
this.trusted = trusted;
this.pure = pure;
+ this.opaque = opaque;
}
@Override public int getRuleIndex() { return RULE_methodDecl; }
@Override
@@ -5041,27 +5380,27 @@ public T accept(ParseTreeVisitor extends T> visitor) {
}
}
- public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException {
- MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure);
- enterRule(_localctx, 146, RULE_methodDecl);
+ public final MethodDeclContext methodDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException {
+ MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure, opaque);
+ enterRule(_localctx, 156, RULE_methodDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(974);
+ setState(1025);
match(FUNC);
- setState(975);
+ setState(1026);
receiver();
- setState(976);
+ setState(1027);
match(IDENTIFIER);
{
- setState(977);
+ setState(1028);
signature();
- setState(979);
+ setState(1030);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) {
case 1:
{
- setState(978);
+ setState(1029);
blockWithBodyParameterInfo();
}
break;
@@ -5102,13 +5441,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException {
ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState());
- enterRule(_localctx, 148, RULE_explicitGhostMember);
+ enterRule(_localctx, 158, RULE_explicitGhostMember);
try {
enterOuterAlt(_localctx, 1);
{
- setState(981);
+ setState(1032);
match(GHOST);
- setState(984);
+ setState(1035);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
@@ -5117,9 +5456,11 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition
case DEC:
case PURE:
case TRUSTED:
+ case OPAQUE:
+ case BACKEND:
case FUNC:
{
- setState(982);
+ setState(1033);
specMember();
}
break;
@@ -5127,7 +5468,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition
case TYPE:
case VAR:
{
- setState(983);
+ setState(1034);
declaration();
}
break;
@@ -5170,22 +5511,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FpredicateDeclContext fpredicateDecl() throws RecognitionException {
FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState());
- enterRule(_localctx, 150, RULE_fpredicateDecl);
+ enterRule(_localctx, 160, RULE_fpredicateDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(986);
+ setState(1037);
match(PRED);
- setState(987);
+ setState(1038);
match(IDENTIFIER);
- setState(988);
+ setState(1039);
parameters();
- setState(990);
+ setState(1041);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) {
case 1:
{
- setState(989);
+ setState(1040);
predicateBody();
}
break;
@@ -5226,17 +5567,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredicateBodyContext predicateBody() throws RecognitionException {
PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState());
- enterRule(_localctx, 152, RULE_predicateBody);
+ enterRule(_localctx, 162, RULE_predicateBody);
try {
enterOuterAlt(_localctx, 1);
{
- setState(992);
+ setState(1043);
match(L_CURLY);
- setState(993);
+ setState(1044);
expression(0);
- setState(994);
+ setState(1045);
eos();
- setState(995);
+ setState(1046);
match(R_CURLY);
}
}
@@ -5277,24 +5618,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MpredicateDeclContext mpredicateDecl() throws RecognitionException {
MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState());
- enterRule(_localctx, 154, RULE_mpredicateDecl);
+ enterRule(_localctx, 164, RULE_mpredicateDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(997);
+ setState(1048);
match(PRED);
- setState(998);
+ setState(1049);
receiver();
- setState(999);
+ setState(1050);
match(IDENTIFIER);
- setState(1000);
+ setState(1051);
parameters();
- setState(1002);
+ setState(1053);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) {
case 1:
{
- setState(1001);
+ setState(1052);
predicateBody();
}
break;
@@ -5337,13 +5678,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final VarSpecContext varSpec() throws RecognitionException {
VarSpecContext _localctx = new VarSpecContext(_ctx, getState());
- enterRule(_localctx, 156, RULE_varSpec);
+ enterRule(_localctx, 166, RULE_varSpec);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1004);
+ setState(1055);
maybeAddressableIdentifierList();
- setState(1012);
+ setState(1063);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -5366,16 +5707,16 @@ public final VarSpecContext varSpec() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1005);
+ setState(1056);
type_();
- setState(1008);
+ setState(1059);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) {
case 1:
{
- setState(1006);
+ setState(1057);
match(ASSIGN);
- setState(1007);
+ setState(1058);
expressionList();
}
break;
@@ -5384,9 +5725,9 @@ public final VarSpecContext varSpec() throws RecognitionException {
break;
case ASSIGN:
{
- setState(1010);
+ setState(1061);
match(ASSIGN);
- setState(1011);
+ setState(1062);
expressionList();
}
break;
@@ -5428,15 +5769,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ShortVarDeclContext shortVarDecl() throws RecognitionException {
ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState());
- enterRule(_localctx, 158, RULE_shortVarDecl);
+ enterRule(_localctx, 168, RULE_shortVarDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1014);
+ setState(1065);
maybeAddressableIdentifierList();
- setState(1015);
+ setState(1066);
match(DECLARE_ASSIGN);
- setState(1016);
+ setState(1067);
expressionList();
}
}
@@ -5475,36 +5816,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReceiverContext receiver() throws RecognitionException {
ReceiverContext _localctx = new ReceiverContext(_ctx, getState());
- enterRule(_localctx, 160, RULE_receiver);
+ enterRule(_localctx, 170, RULE_receiver);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1018);
+ setState(1069);
match(L_PAREN);
- setState(1020);
+ setState(1071);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) {
case 1:
{
- setState(1019);
+ setState(1070);
maybeAddressableIdentifier();
}
break;
}
- setState(1022);
+ setState(1073);
type_();
- setState(1024);
+ setState(1075);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1023);
+ setState(1074);
match(COMMA);
}
}
- setState(1026);
+ setState(1077);
match(R_PAREN);
}
}
@@ -5540,22 +5881,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ParameterDeclContext parameterDecl() throws RecognitionException {
ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState());
- enterRule(_localctx, 162, RULE_parameterDecl);
+ enterRule(_localctx, 172, RULE_parameterDecl);
try {
- setState(1030);
+ setState(1081);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1028);
+ setState(1079);
actualParameterDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1029);
+ setState(1080);
ghostParameterDecl();
}
break;
@@ -5593,21 +5934,21 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException {
ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState());
- enterRule(_localctx, 164, RULE_actualParameterDecl);
+ enterRule(_localctx, 174, RULE_actualParameterDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1033);
+ setState(1084);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) {
case 1:
{
- setState(1032);
+ setState(1083);
identifierList();
}
break;
}
- setState(1035);
+ setState(1086);
parameterType();
}
}
@@ -5644,23 +5985,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException {
GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState());
- enterRule(_localctx, 166, RULE_ghostParameterDecl);
+ enterRule(_localctx, 176, RULE_ghostParameterDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1037);
+ setState(1088);
match(GHOST);
- setState(1039);
+ setState(1090);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) {
case 1:
{
- setState(1038);
+ setState(1089);
identifierList();
}
break;
}
- setState(1041);
+ setState(1092);
parameterType();
}
}
@@ -5694,22 +6035,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ParameterTypeContext parameterType() throws RecognitionException {
ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState());
- enterRule(_localctx, 168, RULE_parameterType);
+ enterRule(_localctx, 178, RULE_parameterType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1044);
+ setState(1095);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ELLIPSIS) {
{
- setState(1043);
+ setState(1094);
match(ELLIPSIS);
}
}
- setState(1046);
+ setState(1097);
type_();
}
}
@@ -6024,26 +6365,26 @@ private ExpressionContext expression(int _p) throws RecognitionException {
int _parentState = getState();
ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState);
ExpressionContext _prevctx = _localctx;
- int _startState = 170;
- enterRecursionRule(_localctx, 170, RULE_expression, _p);
+ int _startState = 180;
+ enterRecursionRule(_localctx, 180, RULE_expression, _p);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1069);
+ setState(1120);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) {
case 1:
{
_localctx = new UnaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1049);
+ setState(1100);
((UnaryExprContext)_localctx).unary_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 127L) != 0)) ) {
+ if ( !(((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 127L) != 0)) ) {
((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6051,7 +6392,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1050);
+ setState(1101);
expression(15);
}
break;
@@ -6060,7 +6401,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new PrimaryExpr_Context(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1051);
+ setState(1102);
primaryExpr(0);
}
break;
@@ -6069,13 +6410,13 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new UnfoldingContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1052);
+ setState(1103);
match(UNFOLDING);
- setState(1053);
+ setState(1104);
predicateAccess();
- setState(1054);
+ setState(1105);
match(IN);
- setState(1055);
+ setState(1106);
expression(3);
}
break;
@@ -6084,13 +6425,13 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new LetContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1057);
+ setState(1108);
match(LET);
- setState(1058);
+ setState(1109);
shortVarDecl();
- setState(1059);
+ setState(1110);
match(IN);
- setState(1060);
+ setState(1111);
expression(2);
}
break;
@@ -6099,7 +6440,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new QuantificationContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1062);
+ setState(1113);
_la = _input.LA(1);
if ( !(_la==FORALL || _la==EXISTS) ) {
_errHandler.recoverInline(this);
@@ -6109,41 +6450,41 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1063);
+ setState(1114);
boundVariables();
- setState(1064);
+ setState(1115);
match(COLON);
- setState(1065);
+ setState(1116);
match(COLON);
- setState(1066);
+ setState(1117);
triggers();
- setState(1067);
+ setState(1118);
expression(1);
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(1106);
+ setState(1157);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,82,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,88,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(1104);
+ setState(1155);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) {
case 1:
{
_localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1071);
+ setState(1122);
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
- setState(1072);
+ setState(1123);
((MulExprContext)_localctx).mul_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 1567L) != 0)) ) {
+ if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1567L) != 0)) ) {
((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6151,7 +6492,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1073);
+ setState(1124);
expression(14);
}
break;
@@ -6159,12 +6500,12 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1074);
+ setState(1125);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
- setState(1075);
+ setState(1126);
((AddExprContext)_localctx).add_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(_la==WAND || ((((_la - 115)) & ~0x3f) == 0 && ((1L << (_la - 115)) & 3674113L) != 0)) ) {
+ if ( !(_la==WAND || ((((_la - 118)) & ~0x3f) == 0 && ((1L << (_la - 118)) & 3674113L) != 0)) ) {
((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6172,7 +6513,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1076);
+ setState(1127);
expression(13);
}
break;
@@ -6180,9 +6521,9 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1077);
+ setState(1128);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
- setState(1078);
+ setState(1129);
((P42ExprContext)_localctx).p42_op = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) {
@@ -6193,7 +6534,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1079);
+ setState(1130);
expression(12);
}
break;
@@ -6201,9 +6542,9 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1080);
+ setState(1131);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
- setState(1081);
+ setState(1132);
((P41ExprContext)_localctx).p41_op = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) {
@@ -6214,7 +6555,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1082);
+ setState(1133);
expression(11);
}
break;
@@ -6222,12 +6563,12 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1083);
+ setState(1134);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
- setState(1084);
+ setState(1135);
((RelExprContext)_localctx).rel_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & 8866461766385667L) != 0)) ) {
+ if ( !(((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & 70931694131085315L) != 0)) ) {
((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6235,7 +6576,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1085);
+ setState(1136);
expression(10);
}
break;
@@ -6243,11 +6584,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1086);
+ setState(1137);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(1087);
+ setState(1138);
match(LOGICAL_AND);
- setState(1088);
+ setState(1139);
expression(8);
}
break;
@@ -6255,11 +6596,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1089);
+ setState(1140);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(1090);
+ setState(1141);
match(LOGICAL_OR);
- setState(1091);
+ setState(1142);
expression(7);
}
break;
@@ -6267,11 +6608,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1092);
+ setState(1143);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
- setState(1093);
+ setState(1144);
match(IMPLIES);
- setState(1094);
+ setState(1145);
expression(5);
}
break;
@@ -6279,15 +6620,15 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1095);
+ setState(1146);
if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
- setState(1096);
+ setState(1147);
match(QMARK);
- setState(1097);
+ setState(1148);
expression(0);
- setState(1098);
+ setState(1149);
match(COLON);
- setState(1099);
+ setState(1150);
expression(4);
}
break;
@@ -6295,20 +6636,20 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(1101);
+ setState(1152);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
- setState(1102);
+ setState(1153);
match(IMPL);
- setState(1103);
+ setState(1154);
closureSpecInstance();
}
break;
}
}
}
- setState(1108);
+ setState(1159);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,82,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,88,_ctx);
}
}
}
@@ -6398,148 +6739,148 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementContext statement() throws RecognitionException {
StatementContext _localctx = new StatementContext(_ctx, getState());
- enterRule(_localctx, 172, RULE_statement);
+ enterRule(_localctx, 182, RULE_statement);
try {
- setState(1129);
+ setState(1180);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1109);
+ setState(1160);
ghostStatement();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1110);
+ setState(1161);
auxiliaryStatement();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1111);
+ setState(1162);
packageStmt();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1112);
+ setState(1163);
applyStmt();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1113);
+ setState(1164);
declaration();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1114);
+ setState(1165);
labeledStmt();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1115);
+ setState(1166);
simpleStmt();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1116);
+ setState(1167);
goStmt();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(1117);
+ setState(1168);
returnStmt();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(1118);
+ setState(1169);
breakStmt();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(1119);
+ setState(1170);
continueStmt();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(1120);
+ setState(1171);
gotoStmt();
}
break;
case 13:
enterOuterAlt(_localctx, 13);
{
- setState(1121);
+ setState(1172);
fallthroughStmt();
}
break;
case 14:
enterOuterAlt(_localctx, 14);
{
- setState(1122);
+ setState(1173);
block();
}
break;
case 15:
enterOuterAlt(_localctx, 15);
{
- setState(1123);
+ setState(1174);
ifStmt();
}
break;
case 16:
enterOuterAlt(_localctx, 16);
{
- setState(1124);
+ setState(1175);
switchStmt();
}
break;
case 17:
enterOuterAlt(_localctx, 17);
{
- setState(1125);
+ setState(1176);
selectStmt();
}
break;
case 18:
enterOuterAlt(_localctx, 18);
{
- setState(1126);
+ setState(1177);
specForStmt();
}
break;
case 19:
enterOuterAlt(_localctx, 19);
{
- setState(1127);
+ setState(1178);
deferStmt();
}
break;
case 20:
enterOuterAlt(_localctx, 20);
{
- setState(1128);
+ setState(1179);
closureImplProofStmt();
}
break;
@@ -6575,13 +6916,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ApplyStmtContext applyStmt() throws RecognitionException {
ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState());
- enterRule(_localctx, 174, RULE_applyStmt);
+ enterRule(_localctx, 184, RULE_applyStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1131);
+ setState(1182);
match(APPLY);
- setState(1132);
+ setState(1183);
expression(0);
}
}
@@ -6618,20 +6959,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PackageStmtContext packageStmt() throws RecognitionException {
PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState());
- enterRule(_localctx, 176, RULE_packageStmt);
+ enterRule(_localctx, 186, RULE_packageStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1134);
+ setState(1185);
match(PACKAGE);
- setState(1135);
+ setState(1186);
expression(0);
- setState(1137);
+ setState(1188);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) {
case 1:
{
- setState(1136);
+ setState(1187);
block();
}
break;
@@ -6670,13 +7011,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecForStmtContext specForStmt() throws RecognitionException {
SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState());
- enterRule(_localctx, 178, RULE_specForStmt);
+ enterRule(_localctx, 188, RULE_specForStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1139);
+ setState(1190);
loopSpec();
- setState(1140);
+ setState(1191);
forStmt();
}
}
@@ -6726,39 +7067,39 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LoopSpecContext loopSpec() throws RecognitionException {
LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState());
- enterRule(_localctx, 180, RULE_loopSpec);
+ enterRule(_localctx, 190, RULE_loopSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1148);
+ setState(1199);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==INV) {
{
{
- setState(1142);
+ setState(1193);
match(INV);
- setState(1143);
+ setState(1194);
expression(0);
- setState(1144);
+ setState(1195);
eos();
}
}
- setState(1150);
+ setState(1201);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1155);
+ setState(1206);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==DEC) {
{
- setState(1151);
+ setState(1202);
match(DEC);
- setState(1152);
+ setState(1203);
terminationMeasure();
- setState(1153);
+ setState(1204);
eos();
}
}
@@ -6801,27 +7142,27 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DeferStmtContext deferStmt() throws RecognitionException {
DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState());
- enterRule(_localctx, 182, RULE_deferStmt);
+ enterRule(_localctx, 192, RULE_deferStmt);
int _la;
try {
- setState(1162);
+ setState(1213);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1157);
+ setState(1208);
match(DEFER);
- setState(1158);
+ setState(1209);
expression(0);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1159);
+ setState(1210);
match(DEFER);
- setState(1160);
+ setState(1211);
((DeferStmtContext)_localctx).fold_stmt = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==FOLD || _la==UNFOLD) ) {
@@ -6832,7 +7173,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1161);
+ setState(1212);
predicateAccess();
}
break;
@@ -6876,64 +7217,64 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BasicLitContext basicLit() throws RecognitionException {
BasicLitContext _localctx = new BasicLitContext(_ctx, getState());
- enterRule(_localctx, 184, RULE_basicLit);
+ enterRule(_localctx, 194, RULE_basicLit);
try {
- setState(1172);
+ setState(1223);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1164);
+ setState(1215);
match(TRUE);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1165);
+ setState(1216);
match(FALSE);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1166);
+ setState(1217);
match(NIL_LIT);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1167);
+ setState(1218);
integer();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1168);
+ setState(1219);
string_();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1169);
+ setState(1220);
match(FLOAT_LIT);
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1170);
+ setState(1221);
match(IMAGINARY_LIT);
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1171);
+ setState(1222);
match(RUNE_LIT);
}
break;
@@ -7075,6 +7416,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
}
}
@SuppressWarnings("CheckReturnValue")
+ public static class RevealInvokePrimaryExprContext extends PrimaryExprContext {
+ public TerminalNode REVEAL() { return getToken(GobraParser.REVEAL, 0); }
+ public PrimaryExprContext primaryExpr() {
+ return getRuleContext(PrimaryExprContext.class,0);
+ }
+ public ArgumentsContext arguments() {
+ return getRuleContext(ArgumentsContext.class,0);
+ }
+ public RevealInvokePrimaryExprContext(PrimaryExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitRevealInvokePrimaryExpr(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+ @SuppressWarnings("CheckReturnValue")
public static class InvokePrimaryExprContext extends PrimaryExprContext {
public PrimaryExprContext primaryExpr() {
return getRuleContext(PrimaryExprContext.class,0);
@@ -7186,23 +7543,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
int _parentState = getState();
PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState);
PrimaryExprContext _prevctx = _localctx;
- int _startState = 186;
- enterRecursionRule(_localctx, 186, RULE_primaryExpr, _p);
+ int _startState = 196;
+ enterRecursionRule(_localctx, 196, RULE_primaryExpr, _p);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1186);
+ setState(1241);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) {
case 1:
{
_localctx = new OperandPrimaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1175);
+ setState(1226);
operand();
}
break;
@@ -7211,7 +7568,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new ConversionPrimaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1176);
+ setState(1227);
conversion();
}
break;
@@ -7220,7 +7577,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new MethodPrimaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1177);
+ setState(1228);
methodExpr();
}
break;
@@ -7229,7 +7586,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new GhostPrimaryExpr_Context(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1178);
+ setState(1229);
ghostPrimaryExpr();
}
break;
@@ -7238,7 +7595,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new NewExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1179);
+ setState(1230);
new_();
}
break;
@@ -7247,19 +7604,32 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new MakeExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1180);
+ setState(1231);
make();
}
break;
case 7:
+ {
+ _localctx = new RevealInvokePrimaryExprContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+ setState(1232);
+ match(REVEAL);
+ setState(1233);
+ primaryExpr(0);
+ setState(1234);
+ arguments();
+ }
+ break;
+ case 8:
{
_localctx = new BuiltInCallExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1181);
+ setState(1236);
((BuiltInCallExprContext)_localctx).call_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 1125899906842697L) != 0)) ) {
+ if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 9007199254741065L) != 0)) ) {
((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -7267,36 +7637,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1182);
+ setState(1237);
match(L_PAREN);
- setState(1183);
+ setState(1238);
expression(0);
- setState(1184);
+ setState(1239);
match(R_PAREN);
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(1210);
+ setState(1265);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,91,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,97,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(1208);
+ setState(1263);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
case 1:
{
_localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1188);
- if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
- setState(1189);
+ setState(1243);
+ if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
+ setState(1244);
match(DOT);
- setState(1190);
+ setState(1245);
match(IDENTIFIER);
}
break;
@@ -7304,9 +7674,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1191);
- if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
- setState(1192);
+ setState(1246);
+ if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
+ setState(1247);
index();
}
break;
@@ -7314,9 +7684,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1193);
- if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(1194);
+ setState(1248);
+ if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
+ setState(1249);
slice_();
}
break;
@@ -7324,9 +7694,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1195);
- if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(1196);
+ setState(1250);
+ if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
+ setState(1251);
seqUpdExp();
}
break;
@@ -7334,9 +7704,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1197);
- if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
- setState(1198);
+ setState(1252);
+ if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
+ setState(1253);
typeAssertion();
}
break;
@@ -7344,9 +7714,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1199);
- if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
- setState(1200);
+ setState(1254);
+ if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
+ setState(1255);
arguments();
}
break;
@@ -7354,13 +7724,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1201);
+ setState(1256);
if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
- setState(1202);
+ setState(1257);
arguments();
- setState(1203);
+ setState(1258);
match(AS);
- setState(1204);
+ setState(1259);
closureSpecInstance();
}
break;
@@ -7368,18 +7738,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1206);
+ setState(1261);
if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
- setState(1207);
+ setState(1262);
predConstructArgs();
}
break;
}
}
}
- setState(1212);
+ setState(1267);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,91,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,97,_ctx);
}
}
}
@@ -7416,13 +7786,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FunctionLitContext functionLit() throws RecognitionException {
FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState());
- enterRule(_localctx, 188, RULE_functionLit);
+ enterRule(_localctx, 198, RULE_functionLit);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1213);
+ setState(1268);
((FunctionLitContext)_localctx).specification = specification();
- setState(1214);
+ setState(1269);
closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure);
}
}
@@ -7465,32 +7835,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException {
ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure);
- enterRule(_localctx, 190, RULE_closureDecl);
+ enterRule(_localctx, 200, RULE_closureDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1216);
+ setState(1271);
match(FUNC);
- setState(1218);
+ setState(1273);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==IDENTIFIER) {
{
- setState(1217);
+ setState(1272);
match(IDENTIFIER);
}
}
{
- setState(1220);
+ setState(1275);
signature();
- setState(1222);
+ setState(1277);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) {
case 1:
{
- setState(1221);
+ setState(1276);
blockWithBodyParameterInfo();
}
break;
@@ -7530,34 +7900,34 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredConstructArgsContext predConstructArgs() throws RecognitionException {
PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState());
- enterRule(_localctx, 192, RULE_predConstructArgs);
+ enterRule(_localctx, 202, RULE_predConstructArgs);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1224);
+ setState(1279);
match(L_PRED);
- setState(1226);
+ setState(1281);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1225);
+ setState(1280);
expressionList();
}
}
- setState(1229);
+ setState(1284);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1228);
+ setState(1283);
match(COMMA);
}
}
- setState(1231);
+ setState(1286);
match(R_PRED);
}
}
@@ -7614,52 +7984,52 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final InterfaceTypeContext interfaceType() throws RecognitionException {
InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState());
- enterRule(_localctx, 194, RULE_interfaceType);
+ enterRule(_localctx, 204, RULE_interfaceType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1233);
+ setState(1288);
match(INTERFACE);
- setState(1234);
+ setState(1289);
match(L_CURLY);
- setState(1244);
+ setState(1299);
_errHandler.sync(this);
_la = _input.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || _la==TRUSTED || _la==IDENTIFIER) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 137438954753L) != 0)) {
{
{
- setState(1238);
+ setState(1293);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) {
case 1:
{
- setState(1235);
+ setState(1290);
methodSpec();
}
break;
case 2:
{
- setState(1236);
+ setState(1291);
typeName();
}
break;
case 3:
{
- setState(1237);
+ setState(1292);
predicateSpec();
}
break;
}
- setState(1240);
+ setState(1295);
eos();
}
}
- setState(1246);
+ setState(1301);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1247);
+ setState(1302);
match(R_CURLY);
}
}
@@ -7694,15 +8064,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredicateSpecContext predicateSpec() throws RecognitionException {
PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState());
- enterRule(_localctx, 196, RULE_predicateSpec);
+ enterRule(_localctx, 206, RULE_predicateSpec);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1249);
+ setState(1304);
match(PRED);
- setState(1250);
+ setState(1305);
match(IDENTIFIER);
- setState(1251);
+ setState(1306);
parameters();
}
}
@@ -7743,53 +8113,53 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodSpecContext methodSpec() throws RecognitionException {
MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState());
- enterRule(_localctx, 198, RULE_methodSpec);
+ enterRule(_localctx, 208, RULE_methodSpec);
int _la;
try {
- setState(1268);
+ setState(1323);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1254);
+ setState(1309);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==GHOST) {
{
- setState(1253);
+ setState(1308);
match(GHOST);
}
}
- setState(1256);
+ setState(1311);
specification();
- setState(1257);
+ setState(1312);
match(IDENTIFIER);
- setState(1258);
+ setState(1313);
parameters();
- setState(1259);
+ setState(1314);
result();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1262);
+ setState(1317);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==GHOST) {
{
- setState(1261);
+ setState(1316);
match(GHOST);
}
}
- setState(1264);
+ setState(1319);
specification();
- setState(1265);
+ setState(1320);
match(IDENTIFIER);
- setState(1266);
+ setState(1321);
parameters();
}
break;
@@ -7835,15 +8205,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Type_Context type_() throws RecognitionException {
Type_Context _localctx = new Type_Context(_ctx, getState());
- enterRule(_localctx, 200, RULE_type_);
+ enterRule(_localctx, 210, RULE_type_);
try {
- setState(1277);
+ setState(1332);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(1270);
+ setState(1325);
typeName();
}
break;
@@ -7858,7 +8228,7 @@ public final Type_Context type_() throws RecognitionException {
case RECEIVE:
enterOuterAlt(_localctx, 2);
{
- setState(1271);
+ setState(1326);
typeLit();
}
break;
@@ -7872,18 +8242,18 @@ public final Type_Context type_() throws RecognitionException {
case ADT:
enterOuterAlt(_localctx, 3);
{
- setState(1272);
+ setState(1327);
ghostTypeLit();
}
break;
case L_PAREN:
enterOuterAlt(_localctx, 4);
{
- setState(1273);
+ setState(1328);
match(L_PAREN);
- setState(1274);
+ setState(1329);
type_();
- setState(1275);
+ setState(1330);
match(R_PAREN);
}
break;
@@ -7944,71 +8314,71 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeLitContext typeLit() throws RecognitionException {
TypeLitContext _localctx = new TypeLitContext(_ctx, getState());
- enterRule(_localctx, 202, RULE_typeLit);
+ enterRule(_localctx, 212, RULE_typeLit);
try {
- setState(1288);
+ setState(1343);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1279);
+ setState(1334);
arrayType();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1280);
+ setState(1335);
structType();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1281);
+ setState(1336);
pointerType();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1282);
+ setState(1337);
functionType();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1283);
+ setState(1338);
interfaceType();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1284);
+ setState(1339);
sliceType();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1285);
+ setState(1340);
mapType();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1286);
+ setState(1341);
channelType();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(1287);
+ setState(1342);
predType();
}
break;
@@ -8044,13 +8414,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredTypeContext predType() throws RecognitionException {
PredTypeContext _localctx = new PredTypeContext(_ctx, getState());
- enterRule(_localctx, 204, RULE_predType);
+ enterRule(_localctx, 214, RULE_predType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1290);
+ setState(1345);
match(PRED);
- setState(1291);
+ setState(1346);
predTypeParams();
}
}
@@ -8092,45 +8462,45 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredTypeParamsContext predTypeParams() throws RecognitionException {
PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState());
- enterRule(_localctx, 206, RULE_predTypeParams);
+ enterRule(_localctx, 216, RULE_predTypeParams);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1293);
+ setState(1348);
match(L_PAREN);
- setState(1305);
+ setState(1360);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441151881345761731L) != 0)) {
{
- setState(1294);
+ setState(1349);
type_();
- setState(1299);
+ setState(1354);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,103,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,109,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1295);
+ setState(1350);
match(COMMA);
- setState(1296);
+ setState(1351);
type_();
}
}
}
- setState(1301);
+ setState(1356);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,103,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,109,_ctx);
}
- setState(1303);
+ setState(1358);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1302);
+ setState(1357);
match(COMMA);
}
}
@@ -8138,7 +8508,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException
}
}
- setState(1307);
+ setState(1362);
match(R_PAREN);
}
}
@@ -8189,57 +8559,57 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LiteralTypeContext literalType() throws RecognitionException {
LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState());
- enterRule(_localctx, 208, RULE_literalType);
+ enterRule(_localctx, 218, RULE_literalType);
try {
- setState(1316);
+ setState(1371);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1309);
+ setState(1364);
structType();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1310);
+ setState(1365);
arrayType();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1311);
+ setState(1366);
implicitArray();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1312);
+ setState(1367);
sliceType();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1313);
+ setState(1368);
mapType();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1314);
+ setState(1369);
ghostTypeLit();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1315);
+ setState(1370);
typeName();
}
break;
@@ -8277,17 +8647,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImplicitArrayContext implicitArray() throws RecognitionException {
ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState());
- enterRule(_localctx, 210, RULE_implicitArray);
+ enterRule(_localctx, 220, RULE_implicitArray);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1318);
+ setState(1373);
match(L_BRACKET);
- setState(1319);
+ setState(1374);
match(ELLIPSIS);
- setState(1320);
+ setState(1375);
match(R_BRACKET);
- setState(1321);
+ setState(1376);
elementType();
}
}
@@ -8331,45 +8701,45 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FieldDeclContext fieldDecl() throws RecognitionException {
FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState());
- enterRule(_localctx, 212, RULE_fieldDecl);
+ enterRule(_localctx, 222, RULE_fieldDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1324);
+ setState(1379);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==GHOST) {
{
- setState(1323);
+ setState(1378);
match(GHOST);
}
}
- setState(1330);
+ setState(1385);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
case 1:
{
- setState(1326);
+ setState(1381);
identifierList();
- setState(1327);
+ setState(1382);
type_();
}
break;
case 2:
{
- setState(1329);
+ setState(1384);
embeddedField();
}
break;
}
- setState(1333);
+ setState(1388);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
case 1:
{
- setState(1332);
+ setState(1387);
((FieldDeclContext)_localctx).tag = string_();
}
break;
@@ -8417,36 +8787,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Slice_Context slice_() throws RecognitionException {
Slice_Context _localctx = new Slice_Context(_ctx, getState());
- enterRule(_localctx, 214, RULE_slice_);
+ enterRule(_localctx, 224, RULE_slice_);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1335);
+ setState(1390);
match(L_BRACKET);
- setState(1351);
+ setState(1406);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,113,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
case 1:
{
- setState(1337);
+ setState(1392);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1336);
+ setState(1391);
lowSliceArgument();
}
}
- setState(1339);
+ setState(1394);
match(COLON);
- setState(1341);
+ setState(1396);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1340);
+ setState(1395);
highSliceArgument();
}
}
@@ -8455,28 +8825,28 @@ public final Slice_Context slice_() throws RecognitionException {
break;
case 2:
{
- setState(1344);
+ setState(1399);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1343);
+ setState(1398);
lowSliceArgument();
}
}
- setState(1346);
+ setState(1401);
match(COLON);
- setState(1347);
+ setState(1402);
highSliceArgument();
- setState(1348);
+ setState(1403);
match(COLON);
- setState(1349);
+ setState(1404);
capSliceArgument();
}
break;
}
- setState(1353);
+ setState(1408);
match(R_BRACKET);
}
}
@@ -8509,11 +8879,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LowSliceArgumentContext lowSliceArgument() throws RecognitionException {
LowSliceArgumentContext _localctx = new LowSliceArgumentContext(_ctx, getState());
- enterRule(_localctx, 216, RULE_lowSliceArgument);
+ enterRule(_localctx, 226, RULE_lowSliceArgument);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1355);
+ setState(1410);
expression(0);
}
}
@@ -8546,11 +8916,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final HighSliceArgumentContext highSliceArgument() throws RecognitionException {
HighSliceArgumentContext _localctx = new HighSliceArgumentContext(_ctx, getState());
- enterRule(_localctx, 218, RULE_highSliceArgument);
+ enterRule(_localctx, 228, RULE_highSliceArgument);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1357);
+ setState(1412);
expression(0);
}
}
@@ -8583,11 +8953,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CapSliceArgumentContext capSliceArgument() throws RecognitionException {
CapSliceArgumentContext _localctx = new CapSliceArgumentContext(_ctx, getState());
- enterRule(_localctx, 220, RULE_capSliceArgument);
+ enterRule(_localctx, 230, RULE_capSliceArgument);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1359);
+ setState(1414);
expression(0);
}
}
@@ -8630,20 +9000,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Assign_opContext assign_op() throws RecognitionException {
Assign_opContext _localctx = new Assign_opContext(_ctx, getState());
- enterRule(_localctx, 222, RULE_assign_op);
+ enterRule(_localctx, 232, RULE_assign_op);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1362);
+ setState(1417);
_errHandler.sync(this);
_la = _input.LA(1);
- if (((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) {
+ if (((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 4031L) != 0)) {
{
- setState(1361);
+ setState(1416);
((Assign_opContext)_localctx).ass_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) ) {
+ if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 4031L) != 0)) ) {
((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -8654,7 +9024,7 @@ public final Assign_opContext assign_op() throws RecognitionException {
}
}
- setState(1364);
+ setState(1419);
match(ASSIGN);
}
}
@@ -8698,48 +9068,48 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final RangeClauseContext rangeClause() throws RecognitionException {
RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState());
- enterRule(_localctx, 224, RULE_rangeClause);
+ enterRule(_localctx, 234, RULE_rangeClause);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1372);
+ setState(1427);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
case 1:
{
- setState(1366);
+ setState(1421);
expressionList();
- setState(1367);
+ setState(1422);
match(ASSIGN);
}
break;
case 2:
{
- setState(1369);
+ setState(1424);
maybeAddressableIdentifierList();
- setState(1370);
+ setState(1425);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1374);
+ setState(1429);
match(RANGE);
- setState(1375);
+ setState(1430);
expression(0);
- setState(1380);
+ setState(1435);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WITH) {
{
- setState(1376);
+ setState(1431);
match(WITH);
- setState(1378);
+ setState(1433);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==IDENTIFIER) {
{
- setState(1377);
+ setState(1432);
match(IDENTIFIER);
}
}
@@ -8778,13 +9148,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PackageClauseContext packageClause() throws RecognitionException {
PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState());
- enterRule(_localctx, 226, RULE_packageClause);
+ enterRule(_localctx, 236, RULE_packageClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1382);
+ setState(1437);
match(PACKAGE);
- setState(1383);
+ setState(1438);
((PackageClauseContext)_localctx).packageName = match(IDENTIFIER);
}
}
@@ -8817,11 +9187,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImportPathContext importPath() throws RecognitionException {
ImportPathContext _localctx = new ImportPathContext(_ctx, getState());
- enterRule(_localctx, 228, RULE_importPath);
+ enterRule(_localctx, 238, RULE_importPath);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1385);
+ setState(1440);
string_();
}
}
@@ -8860,29 +9230,29 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DeclarationContext declaration() throws RecognitionException {
DeclarationContext _localctx = new DeclarationContext(_ctx, getState());
- enterRule(_localctx, 230, RULE_declaration);
+ enterRule(_localctx, 240, RULE_declaration);
try {
- setState(1390);
+ setState(1445);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CONST:
enterOuterAlt(_localctx, 1);
{
- setState(1387);
+ setState(1442);
constDecl();
}
break;
case TYPE:
enterOuterAlt(_localctx, 2);
{
- setState(1388);
+ setState(1443);
typeDecl();
}
break;
case VAR:
enterOuterAlt(_localctx, 3);
{
- setState(1389);
+ setState(1444);
varDecl();
}
break;
@@ -8931,43 +9301,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstDeclContext constDecl() throws RecognitionException {
ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState());
- enterRule(_localctx, 232, RULE_constDecl);
+ enterRule(_localctx, 242, RULE_constDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1392);
+ setState(1447);
match(CONST);
- setState(1404);
+ setState(1459);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1393);
+ setState(1448);
constSpec();
}
break;
case L_PAREN:
{
- setState(1394);
+ setState(1449);
match(L_PAREN);
- setState(1400);
+ setState(1455);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1395);
+ setState(1450);
constSpec();
- setState(1396);
+ setState(1451);
eos();
}
}
- setState(1402);
+ setState(1457);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1403);
+ setState(1458);
match(R_PAREN);
}
break;
@@ -9012,31 +9382,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstSpecContext constSpec() throws RecognitionException {
ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState());
- enterRule(_localctx, 234, RULE_constSpec);
+ enterRule(_localctx, 244, RULE_constSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1406);
+ setState(1461);
identifierList();
- setState(1412);
+ setState(1467);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) {
case 1:
{
- setState(1408);
+ setState(1463);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441151881345761731L) != 0)) {
{
- setState(1407);
+ setState(1462);
type_();
}
}
- setState(1410);
+ setState(1465);
match(ASSIGN);
- setState(1411);
+ setState(1466);
expressionList();
}
break;
@@ -9077,30 +9447,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IdentifierListContext identifierList() throws RecognitionException {
IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState());
- enterRule(_localctx, 236, RULE_identifierList);
+ enterRule(_localctx, 246, RULE_identifierList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1414);
+ setState(1469);
match(IDENTIFIER);
- setState(1419);
+ setState(1474);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,123,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,129,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1415);
+ setState(1470);
match(COMMA);
- setState(1416);
+ setState(1471);
match(IDENTIFIER);
}
}
}
- setState(1421);
+ setState(1476);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,123,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,129,_ctx);
}
}
}
@@ -9140,30 +9510,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionListContext expressionList() throws RecognitionException {
ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState());
- enterRule(_localctx, 238, RULE_expressionList);
+ enterRule(_localctx, 248, RULE_expressionList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1422);
+ setState(1477);
expression(0);
- setState(1427);
+ setState(1482);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,124,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,130,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1423);
+ setState(1478);
match(COMMA);
- setState(1424);
+ setState(1479);
expression(0);
}
}
}
- setState(1429);
+ setState(1484);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,124,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,130,_ctx);
}
}
}
@@ -9208,43 +9578,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeDeclContext typeDecl() throws RecognitionException {
TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState());
- enterRule(_localctx, 240, RULE_typeDecl);
+ enterRule(_localctx, 250, RULE_typeDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1430);
+ setState(1485);
match(TYPE);
- setState(1442);
+ setState(1497);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1431);
+ setState(1486);
typeSpec();
}
break;
case L_PAREN:
{
- setState(1432);
+ setState(1487);
match(L_PAREN);
- setState(1438);
+ setState(1493);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1433);
+ setState(1488);
typeSpec();
- setState(1434);
+ setState(1489);
eos();
}
}
- setState(1440);
+ setState(1495);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1441);
+ setState(1496);
match(R_PAREN);
}
break;
@@ -9284,24 +9654,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSpecContext typeSpec() throws RecognitionException {
TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState());
- enterRule(_localctx, 242, RULE_typeSpec);
+ enterRule(_localctx, 252, RULE_typeSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1444);
+ setState(1499);
match(IDENTIFIER);
- setState(1446);
+ setState(1501);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASSIGN) {
{
- setState(1445);
+ setState(1500);
match(ASSIGN);
}
}
- setState(1448);
+ setState(1503);
type_();
}
}
@@ -9346,43 +9716,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final VarDeclContext varDecl() throws RecognitionException {
VarDeclContext _localctx = new VarDeclContext(_ctx, getState());
- enterRule(_localctx, 244, RULE_varDecl);
+ enterRule(_localctx, 254, RULE_varDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1450);
+ setState(1505);
match(VAR);
- setState(1462);
+ setState(1517);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1451);
+ setState(1506);
varSpec();
}
break;
case L_PAREN:
{
- setState(1452);
+ setState(1507);
match(L_PAREN);
- setState(1458);
+ setState(1513);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1453);
+ setState(1508);
varSpec();
- setState(1454);
+ setState(1509);
eos();
}
}
- setState(1460);
+ setState(1515);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1461);
+ setState(1516);
match(R_PAREN);
}
break;
@@ -9422,23 +9792,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BlockContext block() throws RecognitionException {
BlockContext _localctx = new BlockContext(_ctx, getState());
- enterRule(_localctx, 246, RULE_block);
+ enterRule(_localctx, 256, RULE_block);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1464);
+ setState(1519);
match(L_CURLY);
- setState(1466);
+ setState(1521);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) {
case 1:
{
- setState(1465);
+ setState(1520);
statementList();
}
break;
}
- setState(1468);
+ setState(1523);
match(R_CURLY);
}
}
@@ -9488,13 +9858,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementListContext statementList() throws RecognitionException {
StatementListContext _localctx = new StatementListContext(_ctx, getState());
- enterRule(_localctx, 248, RULE_statementList);
+ enterRule(_localctx, 258, RULE_statementList);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1482);
+ setState(1537);
_errHandler.sync(this);
_alt = 1;
do {
@@ -9502,17 +9872,17 @@ public final StatementListContext statementList() throws RecognitionException {
case 1:
{
{
- setState(1477);
+ setState(1532);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) {
case 1:
{
- setState(1471);
+ setState(1526);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==SEMI) {
{
- setState(1470);
+ setState(1525);
match(SEMI);
}
}
@@ -9521,12 +9891,12 @@ public final StatementListContext statementList() throws RecognitionException {
break;
case 2:
{
- setState(1474);
+ setState(1529);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==EOS) {
{
- setState(1473);
+ setState(1528);
match(EOS);
}
}
@@ -9535,14 +9905,14 @@ public final StatementListContext statementList() throws RecognitionException {
break;
case 3:
{
- setState(1476);
+ setState(1531);
if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()");
}
break;
}
- setState(1479);
+ setState(1534);
statement();
- setState(1480);
+ setState(1535);
eos();
}
}
@@ -9550,9 +9920,9 @@ public final StatementListContext statementList() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(1484);
+ setState(1539);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,134,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,140,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -9597,43 +9967,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SimpleStmtContext simpleStmt() throws RecognitionException {
SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState());
- enterRule(_localctx, 250, RULE_simpleStmt);
+ enterRule(_localctx, 260, RULE_simpleStmt);
try {
- setState(1491);
+ setState(1546);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1486);
+ setState(1541);
sendStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1487);
+ setState(1542);
incDecStmt();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1488);
+ setState(1543);
assignment();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1489);
+ setState(1544);
expressionStmt();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1490);
+ setState(1545);
shortVarDecl();
}
break;
@@ -9668,11 +10038,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionStmtContext expressionStmt() throws RecognitionException {
ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState());
- enterRule(_localctx, 252, RULE_expressionStmt);
+ enterRule(_localctx, 262, RULE_expressionStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1493);
+ setState(1548);
expression(0);
}
}
@@ -9710,15 +10080,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SendStmtContext sendStmt() throws RecognitionException {
SendStmtContext _localctx = new SendStmtContext(_ctx, getState());
- enterRule(_localctx, 254, RULE_sendStmt);
+ enterRule(_localctx, 264, RULE_sendStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1495);
+ setState(1550);
((SendStmtContext)_localctx).channel = expression(0);
- setState(1496);
+ setState(1551);
match(RECEIVE);
- setState(1497);
+ setState(1552);
expression(0);
}
}
@@ -9753,14 +10123,14 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IncDecStmtContext incDecStmt() throws RecognitionException {
IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState());
- enterRule(_localctx, 256, RULE_incDecStmt);
+ enterRule(_localctx, 266, RULE_incDecStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1499);
+ setState(1554);
expression(0);
- setState(1500);
+ setState(1555);
_la = _input.LA(1);
if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) {
_errHandler.recoverInline(this);
@@ -9807,15 +10177,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AssignmentContext assignment() throws RecognitionException {
AssignmentContext _localctx = new AssignmentContext(_ctx, getState());
- enterRule(_localctx, 258, RULE_assignment);
+ enterRule(_localctx, 268, RULE_assignment);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1502);
+ setState(1557);
expressionList();
- setState(1503);
+ setState(1558);
assign_op();
- setState(1504);
+ setState(1559);
expressionList();
}
}
@@ -9847,12 +10217,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EmptyStmtContext emptyStmt() throws RecognitionException {
EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState());
- enterRule(_localctx, 260, RULE_emptyStmt);
+ enterRule(_localctx, 270, RULE_emptyStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1506);
+ setState(1561);
_la = _input.LA(1);
if ( !(_la==SEMI || _la==EOS) ) {
_errHandler.recoverInline(this);
@@ -9895,20 +10265,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LabeledStmtContext labeledStmt() throws RecognitionException {
LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState());
- enterRule(_localctx, 262, RULE_labeledStmt);
+ enterRule(_localctx, 272, RULE_labeledStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1508);
+ setState(1563);
match(IDENTIFIER);
- setState(1509);
+ setState(1564);
match(COLON);
- setState(1511);
+ setState(1566);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) {
case 1:
{
- setState(1510);
+ setState(1565);
statement();
}
break;
@@ -9945,18 +10315,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReturnStmtContext returnStmt() throws RecognitionException {
ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState());
- enterRule(_localctx, 264, RULE_returnStmt);
+ enterRule(_localctx, 274, RULE_returnStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1513);
+ setState(1568);
match(RETURN);
- setState(1515);
+ setState(1570);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) {
case 1:
{
- setState(1514);
+ setState(1569);
expressionList();
}
break;
@@ -9991,18 +10361,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BreakStmtContext breakStmt() throws RecognitionException {
BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState());
- enterRule(_localctx, 266, RULE_breakStmt);
+ enterRule(_localctx, 276, RULE_breakStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1517);
+ setState(1572);
match(BREAK);
- setState(1519);
+ setState(1574);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) {
case 1:
{
- setState(1518);
+ setState(1573);
match(IDENTIFIER);
}
break;
@@ -10037,18 +10407,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ContinueStmtContext continueStmt() throws RecognitionException {
ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState());
- enterRule(_localctx, 268, RULE_continueStmt);
+ enterRule(_localctx, 278, RULE_continueStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1521);
+ setState(1576);
match(CONTINUE);
- setState(1523);
+ setState(1578);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
case 1:
{
- setState(1522);
+ setState(1577);
match(IDENTIFIER);
}
break;
@@ -10083,13 +10453,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GotoStmtContext gotoStmt() throws RecognitionException {
GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState());
- enterRule(_localctx, 270, RULE_gotoStmt);
+ enterRule(_localctx, 280, RULE_gotoStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1525);
+ setState(1580);
match(GOTO);
- setState(1526);
+ setState(1581);
match(IDENTIFIER);
}
}
@@ -10120,11 +10490,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FallthroughStmtContext fallthroughStmt() throws RecognitionException {
FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState());
- enterRule(_localctx, 272, RULE_fallthroughStmt);
+ enterRule(_localctx, 282, RULE_fallthroughStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1528);
+ setState(1583);
match(FALLTHROUGH);
}
}
@@ -10174,61 +10544,61 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IfStmtContext ifStmt() throws RecognitionException {
IfStmtContext _localctx = new IfStmtContext(_ctx, getState());
- enterRule(_localctx, 274, RULE_ifStmt);
+ enterRule(_localctx, 284, RULE_ifStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1530);
+ setState(1585);
match(IF);
- setState(1539);
+ setState(1594);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) {
case 1:
{
- setState(1531);
+ setState(1586);
expression(0);
}
break;
case 2:
{
- setState(1532);
+ setState(1587);
eos();
- setState(1533);
+ setState(1588);
expression(0);
}
break;
case 3:
{
- setState(1535);
+ setState(1590);
simpleStmt();
- setState(1536);
+ setState(1591);
eos();
- setState(1537);
+ setState(1592);
expression(0);
}
break;
}
- setState(1541);
+ setState(1596);
block();
- setState(1547);
+ setState(1602);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) {
case 1:
{
- setState(1542);
+ setState(1597);
match(ELSE);
- setState(1545);
+ setState(1600);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IF:
{
- setState(1543);
+ setState(1598);
ifStmt();
}
break;
case L_CURLY:
{
- setState(1544);
+ setState(1599);
block();
}
break;
@@ -10272,22 +10642,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SwitchStmtContext switchStmt() throws RecognitionException {
SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 276, RULE_switchStmt);
+ enterRule(_localctx, 286, RULE_switchStmt);
try {
- setState(1551);
+ setState(1606);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1549);
+ setState(1604);
exprSwitchStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1550);
+ setState(1605);
typeSwitchStmt();
}
break;
@@ -10337,24 +10707,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException {
ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 278, RULE_exprSwitchStmt);
+ enterRule(_localctx, 288, RULE_exprSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1553);
+ setState(1608);
match(SWITCH);
- setState(1564);
+ setState(1619);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) {
case 1:
{
- setState(1555);
+ setState(1610);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1554);
+ setState(1609);
expression(0);
}
}
@@ -10363,24 +10733,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
break;
case 2:
{
- setState(1558);
+ setState(1613);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
case 1:
{
- setState(1557);
+ setState(1612);
simpleStmt();
}
break;
}
- setState(1560);
+ setState(1615);
eos();
- setState(1562);
+ setState(1617);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1561);
+ setState(1616);
expression(0);
}
}
@@ -10388,23 +10758,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
}
break;
}
- setState(1566);
+ setState(1621);
match(L_CURLY);
- setState(1570);
+ setState(1625);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1567);
+ setState(1622);
exprCaseClause();
}
}
- setState(1572);
+ setState(1627);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1573);
+ setState(1628);
match(R_CURLY);
}
}
@@ -10441,20 +10811,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprCaseClauseContext exprCaseClause() throws RecognitionException {
ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 280, RULE_exprCaseClause);
+ enterRule(_localctx, 290, RULE_exprCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1575);
+ setState(1630);
exprSwitchCase();
- setState(1576);
+ setState(1631);
match(COLON);
- setState(1578);
+ setState(1633);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) {
case 1:
{
- setState(1577);
+ setState(1632);
statementList();
}
break;
@@ -10492,24 +10862,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException {
ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 282, RULE_exprSwitchCase);
+ enterRule(_localctx, 292, RULE_exprSwitchCase);
try {
- setState(1583);
+ setState(1638);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1580);
+ setState(1635);
match(CASE);
- setState(1581);
+ setState(1636);
expressionList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1582);
+ setState(1637);
match(DEFAULT);
}
break;
@@ -10561,58 +10931,58 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException {
TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 284, RULE_typeSwitchStmt);
+ enterRule(_localctx, 294, RULE_typeSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1585);
+ setState(1640);
match(SWITCH);
- setState(1594);
+ setState(1649);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) {
case 1:
{
- setState(1586);
+ setState(1641);
typeSwitchGuard();
}
break;
case 2:
{
- setState(1587);
+ setState(1642);
eos();
- setState(1588);
+ setState(1643);
typeSwitchGuard();
}
break;
case 3:
{
- setState(1590);
+ setState(1645);
simpleStmt();
- setState(1591);
+ setState(1646);
eos();
- setState(1592);
+ setState(1647);
typeSwitchGuard();
}
break;
}
- setState(1596);
+ setState(1651);
match(L_CURLY);
- setState(1600);
+ setState(1655);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1597);
+ setState(1652);
typeCaseClause();
}
}
- setState(1602);
+ setState(1657);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1603);
+ setState(1658);
match(R_CURLY);
}
}
@@ -10651,31 +11021,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException {
TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState());
- enterRule(_localctx, 286, RULE_typeSwitchGuard);
+ enterRule(_localctx, 296, RULE_typeSwitchGuard);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1607);
+ setState(1662);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) {
case 1:
{
- setState(1605);
+ setState(1660);
match(IDENTIFIER);
- setState(1606);
+ setState(1661);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1609);
+ setState(1664);
primaryExpr(0);
- setState(1610);
+ setState(1665);
match(DOT);
- setState(1611);
+ setState(1666);
match(L_PAREN);
- setState(1612);
+ setState(1667);
match(TYPE);
- setState(1613);
+ setState(1668);
match(R_PAREN);
}
}
@@ -10712,20 +11082,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeCaseClauseContext typeCaseClause() throws RecognitionException {
TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 288, RULE_typeCaseClause);
+ enterRule(_localctx, 298, RULE_typeCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1615);
+ setState(1670);
typeSwitchCase();
- setState(1616);
+ setState(1671);
match(COLON);
- setState(1618);
+ setState(1673);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) {
case 1:
{
- setState(1617);
+ setState(1672);
statementList();
}
break;
@@ -10763,24 +11133,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException {
TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 290, RULE_typeSwitchCase);
+ enterRule(_localctx, 300, RULE_typeSwitchCase);
try {
- setState(1623);
+ setState(1678);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1620);
+ setState(1675);
match(CASE);
- setState(1621);
+ setState(1676);
typeList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1622);
+ setState(1677);
match(DEFAULT);
}
break;
@@ -10828,12 +11198,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeListContext typeList() throws RecognitionException {
TypeListContext _localctx = new TypeListContext(_ctx, getState());
- enterRule(_localctx, 292, RULE_typeList);
+ enterRule(_localctx, 302, RULE_typeList);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1627);
+ setState(1682);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -10856,28 +11226,28 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1625);
+ setState(1680);
type_();
}
break;
case NIL_LIT:
{
- setState(1626);
+ setState(1681);
match(NIL_LIT);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(1636);
+ setState(1691);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(1629);
+ setState(1684);
match(COMMA);
- setState(1632);
+ setState(1687);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -10900,13 +11270,13 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1630);
+ setState(1685);
type_();
}
break;
case NIL_LIT:
{
- setState(1631);
+ setState(1686);
match(NIL_LIT);
}
break;
@@ -10915,7 +11285,7 @@ public final TypeListContext typeList() throws RecognitionException {
}
}
}
- setState(1638);
+ setState(1693);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -10956,30 +11326,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SelectStmtContext selectStmt() throws RecognitionException {
SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState());
- enterRule(_localctx, 294, RULE_selectStmt);
+ enterRule(_localctx, 304, RULE_selectStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1639);
+ setState(1694);
match(SELECT);
- setState(1640);
+ setState(1695);
match(L_CURLY);
- setState(1644);
+ setState(1699);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1641);
+ setState(1696);
commClause();
}
}
- setState(1646);
+ setState(1701);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1647);
+ setState(1702);
match(R_CURLY);
}
}
@@ -11016,20 +11386,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommClauseContext commClause() throws RecognitionException {
CommClauseContext _localctx = new CommClauseContext(_ctx, getState());
- enterRule(_localctx, 296, RULE_commClause);
+ enterRule(_localctx, 306, RULE_commClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1649);
+ setState(1704);
commCase();
- setState(1650);
+ setState(1705);
match(COLON);
- setState(1652);
+ setState(1707);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) {
case 1:
{
- setState(1651);
+ setState(1706);
statementList();
}
break;
@@ -11070,28 +11440,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommCaseContext commCase() throws RecognitionException {
CommCaseContext _localctx = new CommCaseContext(_ctx, getState());
- enterRule(_localctx, 298, RULE_commCase);
+ enterRule(_localctx, 308, RULE_commCase);
try {
- setState(1660);
+ setState(1715);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1654);
+ setState(1709);
match(CASE);
- setState(1657);
+ setState(1712);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) {
case 1:
{
- setState(1655);
+ setState(1710);
sendStmt();
}
break;
case 2:
{
- setState(1656);
+ setState(1711);
recvStmt();
}
break;
@@ -11101,7 +11471,7 @@ public final CommCaseContext commCase() throws RecognitionException {
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1659);
+ setState(1714);
match(DEFAULT);
}
break;
@@ -11147,31 +11517,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final RecvStmtContext recvStmt() throws RecognitionException {
RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState());
- enterRule(_localctx, 300, RULE_recvStmt);
+ enterRule(_localctx, 310, RULE_recvStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1668);
+ setState(1723);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) {
case 1:
{
- setState(1662);
+ setState(1717);
expressionList();
- setState(1663);
+ setState(1718);
match(ASSIGN);
}
break;
case 2:
{
- setState(1665);
+ setState(1720);
identifierList();
- setState(1666);
+ setState(1721);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1670);
+ setState(1725);
((RecvStmtContext)_localctx).recvExpr = expression(0);
}
}
@@ -11214,24 +11584,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForStmtContext forStmt() throws RecognitionException {
ForStmtContext _localctx = new ForStmtContext(_ctx, getState());
- enterRule(_localctx, 302, RULE_forStmt);
+ enterRule(_localctx, 312, RULE_forStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1672);
+ setState(1727);
match(FOR);
- setState(1680);
+ setState(1735);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) {
case 1:
{
- setState(1674);
+ setState(1729);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1673);
+ setState(1728);
expression(0);
}
}
@@ -11240,18 +11610,18 @@ public final ForStmtContext forStmt() throws RecognitionException {
break;
case 2:
{
- setState(1676);
+ setState(1731);
forClause();
}
break;
case 3:
{
- setState(1678);
+ setState(1733);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1677);
+ setState(1732);
rangeClause();
}
}
@@ -11259,7 +11629,7 @@ public final ForStmtContext forStmt() throws RecognitionException {
}
break;
}
- setState(1682);
+ setState(1737);
block();
}
}
@@ -11306,41 +11676,41 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForClauseContext forClause() throws RecognitionException {
ForClauseContext _localctx = new ForClauseContext(_ctx, getState());
- enterRule(_localctx, 304, RULE_forClause);
+ enterRule(_localctx, 314, RULE_forClause);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1685);
+ setState(1740);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) {
case 1:
{
- setState(1684);
+ setState(1739);
((ForClauseContext)_localctx).initStmt = simpleStmt();
}
break;
}
- setState(1687);
+ setState(1742);
eos();
- setState(1689);
+ setState(1744);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) {
case 1:
{
- setState(1688);
+ setState(1743);
expression(0);
}
break;
}
- setState(1691);
+ setState(1746);
eos();
- setState(1693);
+ setState(1748);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1692);
+ setState(1747);
((ForClauseContext)_localctx).postStmt = simpleStmt();
}
}
@@ -11377,13 +11747,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GoStmtContext goStmt() throws RecognitionException {
GoStmtContext _localctx = new GoStmtContext(_ctx, getState());
- enterRule(_localctx, 306, RULE_goStmt);
+ enterRule(_localctx, 316, RULE_goStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1695);
+ setState(1750);
match(GO);
- setState(1696);
+ setState(1751);
expression(0);
}
}
@@ -11417,22 +11787,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeNameContext typeName() throws RecognitionException {
TypeNameContext _localctx = new TypeNameContext(_ctx, getState());
- enterRule(_localctx, 308, RULE_typeName);
+ enterRule(_localctx, 318, RULE_typeName);
try {
- setState(1700);
+ setState(1755);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1698);
+ setState(1753);
qualifiedIdent();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1699);
+ setState(1754);
match(IDENTIFIER);
}
break;
@@ -11472,17 +11842,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArrayTypeContext arrayType() throws RecognitionException {
ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState());
- enterRule(_localctx, 310, RULE_arrayType);
+ enterRule(_localctx, 320, RULE_arrayType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1702);
+ setState(1757);
match(L_BRACKET);
- setState(1703);
+ setState(1758);
arrayLength();
- setState(1704);
+ setState(1759);
match(R_BRACKET);
- setState(1705);
+ setState(1760);
elementType();
}
}
@@ -11515,11 +11885,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArrayLengthContext arrayLength() throws RecognitionException {
ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState());
- enterRule(_localctx, 312, RULE_arrayLength);
+ enterRule(_localctx, 322, RULE_arrayLength);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1707);
+ setState(1762);
expression(0);
}
}
@@ -11552,11 +11922,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ElementTypeContext elementType() throws RecognitionException {
ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState());
- enterRule(_localctx, 314, RULE_elementType);
+ enterRule(_localctx, 324, RULE_elementType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1709);
+ setState(1764);
type_();
}
}
@@ -11590,13 +11960,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PointerTypeContext pointerType() throws RecognitionException {
PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState());
- enterRule(_localctx, 316, RULE_pointerType);
+ enterRule(_localctx, 326, RULE_pointerType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1711);
+ setState(1766);
match(STAR);
- setState(1712);
+ setState(1767);
type_();
}
}
@@ -11631,15 +12001,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SliceTypeContext sliceType() throws RecognitionException {
SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState());
- enterRule(_localctx, 318, RULE_sliceType);
+ enterRule(_localctx, 328, RULE_sliceType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1714);
+ setState(1769);
match(L_BRACKET);
- setState(1715);
+ setState(1770);
match(R_BRACKET);
- setState(1716);
+ setState(1771);
elementType();
}
}
@@ -11678,19 +12048,19 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MapTypeContext mapType() throws RecognitionException {
MapTypeContext _localctx = new MapTypeContext(_ctx, getState());
- enterRule(_localctx, 320, RULE_mapType);
+ enterRule(_localctx, 330, RULE_mapType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1718);
+ setState(1773);
match(MAP);
- setState(1719);
+ setState(1774);
match(L_BRACKET);
- setState(1720);
+ setState(1775);
type_();
- setState(1721);
+ setState(1776);
match(R_BRACKET);
- setState(1722);
+ setState(1777);
elementType();
}
}
@@ -11725,37 +12095,37 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ChannelTypeContext channelType() throws RecognitionException {
ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState());
- enterRule(_localctx, 322, RULE_channelType);
+ enterRule(_localctx, 332, RULE_channelType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1729);
+ setState(1784);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) {
case 1:
{
- setState(1724);
+ setState(1779);
match(CHAN);
}
break;
case 2:
{
- setState(1725);
+ setState(1780);
match(CHAN);
- setState(1726);
+ setState(1781);
match(RECEIVE);
}
break;
case 3:
{
- setState(1727);
+ setState(1782);
match(RECEIVE);
- setState(1728);
+ setState(1783);
match(CHAN);
}
break;
}
- setState(1731);
+ setState(1786);
elementType();
}
}
@@ -11789,13 +12159,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FunctionTypeContext functionType() throws RecognitionException {
FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState());
- enterRule(_localctx, 324, RULE_functionType);
+ enterRule(_localctx, 334, RULE_functionType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1733);
+ setState(1788);
match(FUNC);
- setState(1734);
+ setState(1789);
signature();
}
}
@@ -11831,24 +12201,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SignatureContext signature() throws RecognitionException {
SignatureContext _localctx = new SignatureContext(_ctx, getState());
- enterRule(_localctx, 326, RULE_signature);
+ enterRule(_localctx, 336, RULE_signature);
try {
- setState(1740);
+ setState(1795);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1736);
+ setState(1791);
parameters();
- setState(1737);
+ setState(1792);
result();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1739);
+ setState(1794);
parameters();
}
break;
@@ -11886,22 +12256,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ResultContext result() throws RecognitionException {
ResultContext _localctx = new ResultContext(_ctx, getState());
- enterRule(_localctx, 328, RULE_result);
+ enterRule(_localctx, 338, RULE_result);
try {
- setState(1744);
+ setState(1799);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1742);
+ setState(1797);
parameters();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1743);
+ setState(1798);
type_();
}
break;
@@ -11945,45 +12315,45 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ParametersContext parameters() throws RecognitionException {
ParametersContext _localctx = new ParametersContext(_ctx, getState());
- enterRule(_localctx, 330, RULE_parameters);
+ enterRule(_localctx, 340, RULE_parameters);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1746);
+ setState(1801);
match(L_PAREN);
- setState(1758);
+ setState(1813);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441152431101575619L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441152431101575619L) != 0)) {
{
- setState(1747);
+ setState(1802);
parameterDecl();
- setState(1752);
+ setState(1807);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,174,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,180,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1748);
+ setState(1803);
match(COMMA);
- setState(1749);
+ setState(1804);
parameterDecl();
}
}
}
- setState(1754);
+ setState(1809);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,174,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,180,_ctx);
}
- setState(1756);
+ setState(1811);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1755);
+ setState(1810);
match(COMMA);
}
}
@@ -11991,7 +12361,7 @@ public final ParametersContext parameters() throws RecognitionException {
}
}
- setState(1760);
+ setState(1815);
match(R_PAREN);
}
}
@@ -12030,28 +12400,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConversionContext conversion() throws RecognitionException {
ConversionContext _localctx = new ConversionContext(_ctx, getState());
- enterRule(_localctx, 332, RULE_conversion);
+ enterRule(_localctx, 342, RULE_conversion);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1762);
+ setState(1817);
nonNamedType();
- setState(1763);
+ setState(1818);
match(L_PAREN);
- setState(1764);
+ setState(1819);
expression(0);
- setState(1766);
+ setState(1821);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1765);
+ setState(1820);
match(COMMA);
}
}
- setState(1768);
+ setState(1823);
match(R_PAREN);
}
}
@@ -12089,9 +12459,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final NonNamedTypeContext nonNamedType() throws RecognitionException {
NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState());
- enterRule(_localctx, 334, RULE_nonNamedType);
+ enterRule(_localctx, 344, RULE_nonNamedType);
try {
- setState(1775);
+ setState(1830);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRED:
@@ -12105,18 +12475,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException {
case RECEIVE:
enterOuterAlt(_localctx, 1);
{
- setState(1770);
+ setState(1825);
typeLit();
}
break;
case L_PAREN:
enterOuterAlt(_localctx, 2);
{
- setState(1771);
+ setState(1826);
match(L_PAREN);
- setState(1772);
+ setState(1827);
nonNamedType();
- setState(1773);
+ setState(1828);
match(R_PAREN);
}
break;
@@ -12161,33 +12531,33 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final OperandContext operand() throws RecognitionException {
OperandContext _localctx = new OperandContext(_ctx, getState());
- enterRule(_localctx, 336, RULE_operand);
+ enterRule(_localctx, 346, RULE_operand);
try {
- setState(1783);
+ setState(1838);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1777);
+ setState(1832);
literal();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1778);
+ setState(1833);
operandName();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1779);
+ setState(1834);
match(L_PAREN);
- setState(1780);
+ setState(1835);
expression(0);
- setState(1781);
+ setState(1836);
match(R_PAREN);
}
break;
@@ -12228,9 +12598,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LiteralContext literal() throws RecognitionException {
LiteralContext _localctx = new LiteralContext(_ctx, getState());
- enterRule(_localctx, 338, RULE_literal);
+ enterRule(_localctx, 348, RULE_literal);
try {
- setState(1788);
+ setState(1843);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -12247,7 +12617,7 @@ public final LiteralContext literal() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1785);
+ setState(1840);
basicLit();
}
break;
@@ -12265,7 +12635,7 @@ public final LiteralContext literal() throws RecognitionException {
case L_BRACKET:
enterOuterAlt(_localctx, 2);
{
- setState(1786);
+ setState(1841);
compositeLit();
}
break;
@@ -12275,10 +12645,12 @@ public final LiteralContext literal() throws RecognitionException {
case DEC:
case PURE:
case TRUSTED:
+ case OPAQUE:
+ case BACKEND:
case FUNC:
enterOuterAlt(_localctx, 3);
{
- setState(1787);
+ setState(1842);
functionLit();
}
break;
@@ -12318,14 +12690,14 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IntegerContext integer() throws RecognitionException {
IntegerContext _localctx = new IntegerContext(_ctx, getState());
- enterRule(_localctx, 340, RULE_integer);
+ enterRule(_localctx, 350, RULE_integer);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1790);
+ setState(1845);
_la = _input.LA(1);
- if ( !(((((_la - 140)) & ~0x3f) == 0 && ((1L << (_la - 140)) & 111L) != 0)) ) {
+ if ( !(((((_la - 143)) & ~0x3f) == 0 && ((1L << (_la - 143)) & 111L) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -12362,11 +12734,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final OperandNameContext operandName() throws RecognitionException {
OperandNameContext _localctx = new OperandNameContext(_ctx, getState());
- enterRule(_localctx, 342, RULE_operandName);
+ enterRule(_localctx, 352, RULE_operandName);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1792);
+ setState(1847);
match(IDENTIFIER);
}
}
@@ -12401,15 +12773,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final QualifiedIdentContext qualifiedIdent() throws RecognitionException {
QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState());
- enterRule(_localctx, 344, RULE_qualifiedIdent);
+ enterRule(_localctx, 354, RULE_qualifiedIdent);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1794);
+ setState(1849);
match(IDENTIFIER);
- setState(1795);
+ setState(1850);
match(DOT);
- setState(1796);
+ setState(1851);
match(IDENTIFIER);
}
}
@@ -12445,13 +12817,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CompositeLitContext compositeLit() throws RecognitionException {
CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState());
- enterRule(_localctx, 346, RULE_compositeLit);
+ enterRule(_localctx, 356, RULE_compositeLit);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1798);
+ setState(1853);
literalType();
- setState(1799);
+ setState(1854);
literalValue();
}
}
@@ -12487,26 +12859,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LiteralValueContext literalValue() throws RecognitionException {
LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState());
- enterRule(_localctx, 348, RULE_literalValue);
+ enterRule(_localctx, 358, RULE_literalValue);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1801);
+ setState(1856);
match(L_CURLY);
- setState(1806);
+ setState(1861);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2990104391687L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 23920835140615L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1802);
+ setState(1857);
elementList();
- setState(1804);
+ setState(1859);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1803);
+ setState(1858);
match(COMMA);
}
}
@@ -12514,7 +12886,7 @@ public final LiteralValueContext literalValue() throws RecognitionException {
}
}
- setState(1808);
+ setState(1863);
match(R_CURLY);
}
}
@@ -12554,30 +12926,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ElementListContext elementList() throws RecognitionException {
ElementListContext _localctx = new ElementListContext(_ctx, getState());
- enterRule(_localctx, 350, RULE_elementList);
+ enterRule(_localctx, 360, RULE_elementList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1810);
+ setState(1865);
keyedElement();
- setState(1815);
+ setState(1870);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,183,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,189,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1811);
+ setState(1866);
match(COMMA);
- setState(1812);
+ setState(1867);
keyedElement();
}
}
}
- setState(1817);
+ setState(1872);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,183,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,189,_ctx);
}
}
}
@@ -12614,23 +12986,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final KeyedElementContext keyedElement() throws RecognitionException {
KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState());
- enterRule(_localctx, 352, RULE_keyedElement);
+ enterRule(_localctx, 362, RULE_keyedElement);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1821);
+ setState(1876);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,184,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) {
case 1:
{
- setState(1818);
+ setState(1873);
key();
- setState(1819);
+ setState(1874);
match(COLON);
}
break;
}
- setState(1823);
+ setState(1878);
element();
}
}
@@ -12666,9 +13038,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final KeyContext key() throws RecognitionException {
KeyContext _localctx = new KeyContext(_ctx, getState());
- enterRule(_localctx, 354, RULE_key);
+ enterRule(_localctx, 364, RULE_key);
try {
- setState(1827);
+ setState(1882);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -12710,6 +13082,9 @@ public final KeyContext key() throws RecognitionException {
case WRITEPERM:
case NOPERM:
case TRUSTED:
+ case OPAQUE:
+ case REVEAL:
+ case BACKEND:
case FUNC:
case INTERFACE:
case MAP:
@@ -12738,14 +13113,14 @@ public final KeyContext key() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1825);
+ setState(1880);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1826);
+ setState(1881);
literalValue();
}
break;
@@ -12785,9 +13160,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ElementContext element() throws RecognitionException {
ElementContext _localctx = new ElementContext(_ctx, getState());
- enterRule(_localctx, 356, RULE_element);
+ enterRule(_localctx, 366, RULE_element);
try {
- setState(1831);
+ setState(1886);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -12829,6 +13204,9 @@ public final ElementContext element() throws RecognitionException {
case WRITEPERM:
case NOPERM:
case TRUSTED:
+ case OPAQUE:
+ case REVEAL:
+ case BACKEND:
case FUNC:
case INTERFACE:
case MAP:
@@ -12857,14 +13235,14 @@ public final ElementContext element() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1829);
+ setState(1884);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1830);
+ setState(1885);
literalValue();
}
break;
@@ -12913,32 +13291,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StructTypeContext structType() throws RecognitionException {
StructTypeContext _localctx = new StructTypeContext(_ctx, getState());
- enterRule(_localctx, 358, RULE_structType);
+ enterRule(_localctx, 368, RULE_structType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1833);
+ setState(1888);
match(STRUCT);
- setState(1834);
+ setState(1889);
match(L_CURLY);
- setState(1840);
+ setState(1895);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==GHOST || _la==IDENTIFIER || _la==STAR) {
{
{
- setState(1835);
+ setState(1890);
fieldDecl();
- setState(1836);
+ setState(1891);
eos();
}
}
- setState(1842);
+ setState(1897);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1843);
+ setState(1898);
match(R_CURLY);
}
}
@@ -12970,12 +13348,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final String_Context string_() throws RecognitionException {
String_Context _localctx = new String_Context(_ctx, getState());
- enterRule(_localctx, 360, RULE_string_);
+ enterRule(_localctx, 370, RULE_string_);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1845);
+ setState(1900);
_la = _input.LA(1);
if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) {
_errHandler.recoverInline(this);
@@ -13017,22 +13395,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EmbeddedFieldContext embeddedField() throws RecognitionException {
EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState());
- enterRule(_localctx, 362, RULE_embeddedField);
+ enterRule(_localctx, 372, RULE_embeddedField);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1848);
+ setState(1903);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==STAR) {
{
- setState(1847);
+ setState(1902);
match(STAR);
}
}
- setState(1850);
+ setState(1905);
typeName();
}
}
@@ -13067,15 +13445,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IndexContext index() throws RecognitionException {
IndexContext _localctx = new IndexContext(_ctx, getState());
- enterRule(_localctx, 364, RULE_index);
+ enterRule(_localctx, 374, RULE_index);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1852);
+ setState(1907);
match(L_BRACKET);
- setState(1853);
+ setState(1908);
expression(0);
- setState(1854);
+ setState(1909);
match(R_BRACKET);
}
}
@@ -13111,17 +13489,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeAssertionContext typeAssertion() throws RecognitionException {
TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState());
- enterRule(_localctx, 366, RULE_typeAssertion);
+ enterRule(_localctx, 376, RULE_typeAssertion);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1856);
+ setState(1911);
match(DOT);
- setState(1857);
+ setState(1912);
match(L_PAREN);
- setState(1858);
+ setState(1913);
type_();
- setState(1859);
+ setState(1914);
match(R_PAREN);
}
}
@@ -13164,39 +13542,39 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArgumentsContext arguments() throws RecognitionException {
ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState());
- enterRule(_localctx, 368, RULE_arguments);
+ enterRule(_localctx, 378, RULE_arguments);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1861);
+ setState(1916);
match(L_PAREN);
- setState(1876);
+ setState(1931);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2440348577799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2301338310317338138L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) {
{
- setState(1868);
+ setState(1923);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) {
case 1:
{
- setState(1862);
+ setState(1917);
expressionList();
}
break;
case 2:
{
- setState(1863);
+ setState(1918);
nonNamedType();
- setState(1866);
+ setState(1921);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,189,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) {
case 1:
{
- setState(1864);
+ setState(1919);
match(COMMA);
- setState(1865);
+ setState(1920);
expressionList();
}
break;
@@ -13204,22 +13582,22 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
break;
}
- setState(1871);
+ setState(1926);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ELLIPSIS) {
{
- setState(1870);
+ setState(1925);
match(ELLIPSIS);
}
}
- setState(1874);
+ setState(1929);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1873);
+ setState(1928);
match(COMMA);
}
}
@@ -13227,7 +13605,7 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
}
- setState(1878);
+ setState(1933);
match(R_PAREN);
}
}
@@ -13262,15 +13640,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodExprContext methodExpr() throws RecognitionException {
MethodExprContext _localctx = new MethodExprContext(_ctx, getState());
- enterRule(_localctx, 370, RULE_methodExpr);
+ enterRule(_localctx, 380, RULE_methodExpr);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1880);
+ setState(1935);
nonNamedType();
- setState(1881);
+ setState(1936);
match(DOT);
- setState(1882);
+ setState(1937);
match(IDENTIFIER);
}
}
@@ -13303,11 +13681,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReceiverTypeContext receiverType() throws RecognitionException {
ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState());
- enterRule(_localctx, 372, RULE_receiverType);
+ enterRule(_localctx, 382, RULE_receiverType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1884);
+ setState(1939);
type_();
}
}
@@ -13340,36 +13718,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EosContext eos() throws RecognitionException {
EosContext _localctx = new EosContext(_ctx, getState());
- enterRule(_localctx, 374, RULE_eos);
+ enterRule(_localctx, 384, RULE_eos);
try {
- setState(1890);
+ setState(1945);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,194,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,200,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1886);
+ setState(1941);
match(SEMI);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1887);
+ setState(1942);
match(EOF);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1888);
+ setState(1943);
match(EOS);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1889);
+ setState(1944);
if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()");
}
break;
@@ -13388,13 +13766,13 @@ public final EosContext eos() throws RecognitionException {
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
switch (ruleIndex) {
- case 85:
+ case 90:
return expression_sempred((ExpressionContext)_localctx, predIndex);
- case 93:
+ case 98:
return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex);
- case 124:
+ case 129:
return statementList_sempred((StatementListContext)_localctx, predIndex);
- case 187:
+ case 192:
return eos_sempred((EosContext)_localctx, predIndex);
}
return true;
@@ -13427,17 +13805,17 @@ private boolean expression_sempred(ExpressionContext _localctx, int predIndex) {
private boolean primaryExpr_sempred(PrimaryExprContext _localctx, int predIndex) {
switch (predIndex) {
case 10:
- return precpred(_ctx, 9);
+ return precpred(_ctx, 10);
case 11:
- return precpred(_ctx, 8);
+ return precpred(_ctx, 9);
case 12:
- return precpred(_ctx, 7);
+ return precpred(_ctx, 8);
case 13:
- return precpred(_ctx, 6);
+ return precpred(_ctx, 7);
case 14:
- return precpred(_ctx, 5);
+ return precpred(_ctx, 6);
case 15:
- return precpred(_ctx, 4);
+ return precpred(_ctx, 5);
case 16:
return precpred(_ctx, 3);
case 17:
@@ -13461,7 +13839,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
}
public static final String _serializedATN =
- "\u0004\u0001\u00a2\u0765\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+
+ "\u0004\u0001\u00a5\u079c\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+
"\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+
"\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+
"\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+
@@ -13510,1174 +13888,1214 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
"\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007"+
"\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007"+
"\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0002\u00b9\u0007"+
- "\u00b9\u0002\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0001\u0000\u0001"+
- "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+
- "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u0185"+
- "\b\u0003\n\u0003\f\u0003\u0188\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004"+
- "\u018c\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u0191\b"+
- "\u0005\n\u0005\f\u0005\u0194\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
- "\u0001\u0005\u0001\u0005\u0005\u0005\u019b\b\u0005\n\u0005\f\u0005\u019e"+
- "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u01a3\b\u0005"+
- "\u0001\u0005\u0001\u0005\u0005\u0005\u01a7\b\u0005\n\u0005\f\u0005\u01aa"+
- "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0005"+
- "\u0006\u01b1\b\u0006\n\u0006\f\u0006\u01b4\t\u0006\u0001\u0006\u0001\u0006"+
+ "\u00b9\u0002\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007"+
+ "\u00bc\u0002\u00bd\u0007\u00bd\u0002\u00be\u0007\u00be\u0002\u00bf\u0007"+
+ "\u00bf\u0002\u00c0\u0007\u00c0\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
+ "\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u018f\b\u0003\n\u0003\f\u0003"+
+ "\u0192\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004\u0196\b\u0004\u0001"+
+ "\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u019b\b\u0005\n\u0005\f\u0005"+
+ "\u019e\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
+ "\u0005\u0005\u01a5\b\u0005\n\u0005\f\u0005\u01a8\t\u0005\u0001\u0005\u0001"+
+ "\u0005\u0001\u0005\u0003\u0005\u01ad\b\u0005\u0001\u0005\u0001\u0005\u0005"+
+ "\u0005\u01b1\b\u0005\n\u0005\f\u0005\u01b4\t\u0005\u0001\u0005\u0001\u0005"+
"\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01bb\b\u0006\n\u0006"+
- "\f\u0006\u01be\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+
- "\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01c9\b\t\n\t\f\t\u01cc\t\t"+
- "\u0001\t\u0003\t\u01cf\b\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005"+
- "\n\u01d6\b\n\n\n\f\n\u01d9\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+
- "\u0001\n\u0001\n\u0005\n\u01e2\b\n\n\n\f\n\u01e5\t\n\u0001\n\u0003\n\u01e8"+
- "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01ee"+
- "\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003"+
- "\f\u01f7\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+
- "\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u0201\b\u000f\u0001\u000f\u0001"+
- "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+
+ "\f\u0006\u01be\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+
+ "\u0001\u0006\u0005\u0006\u01c5\b\u0006\n\u0006\f\u0006\u01c8\t\u0006\u0001"+
+ "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t"+
+ "\u0001\t\u0005\t\u01d3\b\t\n\t\f\t\u01d6\t\t\u0001\t\u0003\t\u01d9\b\t"+
+ "\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005\n\u01e0\b\n\n\n\f\n\u01e3"+
+ "\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0005\n\u01ec"+
+ "\b\n\n\n\f\n\u01ef\t\n\u0001\n\u0003\n\u01f2\b\n\u0001\u000b\u0001\u000b"+
+ "\u0001\u000b\u0001\u000b\u0003\u000b\u01f8\b\u000b\u0001\f\u0001\f\u0001"+
+ "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003\f\u0201\b\f\u0001\r\u0001\r\u0001"+
+ "\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0003"+
+ "\u000f\u020b\b\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+
+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+
"\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+
- "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0214\b\u0010\u0001"+
- "\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+
- "\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u0220\b\u0013\n"+
- "\u0013\f\u0013\u0223\t\u0013\u0001\u0013\u0003\u0013\u0226\b\u0013\u0001"+
- "\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u022b\b\u0014\n\u0014\f\u0014"+
- "\u022e\t\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0005\u0015\u0233\b"+
- "\u0015\n\u0015\f\u0015\u0236\t\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+
- "\u0001\u0016\u0005\u0016\u023c\b\u0016\n\u0016\f\u0016\u023f\t\u0016\u0001"+
- "\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001"+
- "\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+
- "\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+
- "\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+
- "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u025e"+
- "\b\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+
- "\u001d\u0003\u001d\u0266\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+
- "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001"+
- " \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001"+
- "\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001"+
- "$\u0003$\u0287\b$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+
- "%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0005&\u0298\b&\n&"+
- "\f&\u029b\t&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001"+
- "(\u0001(\u0001(\u0005(\u02a7\b(\n(\f(\u02aa\t(\u0001(\u0001(\u0001)\u0001"+
- ")\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0003*\u02b6\b*\u0001+\u0001"+
- "+\u0001+\u0001+\u0001+\u0005+\u02bd\b+\n+\f+\u02c0\t+\u0001+\u0001+\u0001"+
- ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u02cd"+
- "\b,\u0001-\u0001-\u0001-\u0001-\u0001-\u0005-\u02d4\b-\n-\f-\u02d7\t-"+
- "\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u02e0\b.\n.\f"+
- ".\u02e3\t.\u0001.\u0001.\u0001/\u0003/\u02e8\b/\u0001/\u0001/\u00010\u0001"+
- "0\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+
- "1\u00011\u00011\u00011\u00011\u00031\u02fc\b1\u00012\u00012\u00012\u0001"+
- "2\u00012\u00032\u0303\b2\u00012\u00052\u0306\b2\n2\f2\u0309\t2\u00012"+
- "\u00012\u00032\u030d\b2\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+
- "3\u00013\u00033\u0317\b3\u00014\u00034\u031a\b4\u00014\u00014\u00034\u031e"+
- "\b4\u00015\u00015\u00035\u0322\b5\u00016\u00016\u00016\u00016\u00056\u0328"+
- "\b6\n6\f6\u032b\t6\u00016\u00016\u00017\u00017\u00017\u00037\u0332\b7"+
- "\u00018\u00018\u00018\u00038\u0337\b8\u00019\u00019\u00019\u00019\u0001"+
- "9\u00019\u00039\u033f\b9\u00039\u0341\b9\u00019\u00019\u00019\u00039\u0346"+
- "\b9\u0001:\u0001:\u0001:\u0005:\u034b\b:\n:\f:\u034e\t:\u0001;\u0001;"+
- "\u0001;\u0001;\u0001;\u0003;\u0355\b;\u0001;\u0003;\u0358\b;\u0001;\u0001"+
- ";\u0001<\u0001<\u0003<\u035e\b<\u0001<\u0001<\u0001<\u0003<\u0363\b<\u0003"+
- "<\u0365\b<\u0001<\u0003<\u0368\b<\u0001=\u0001=\u0001=\u0005=\u036d\b"+
- "=\n=\f=\u0370\t=\u0001>\u0001>\u0003>\u0374\b>\u0001>\u0001>\u0001?\u0001"+
- "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+
- "@\u0001@\u0005@\u0385\b@\n@\f@\u0388\t@\u0001@\u0001@\u0001@\u0005@\u038d"+
- "\b@\n@\f@\u0390\t@\u0001@\u0003@\u0393\b@\u0001A\u0003A\u0396\bA\u0001"+
- "A\u0001A\u0001A\u0001A\u0003A\u039c\bA\u0001B\u0001B\u0003B\u03a0\bB\u0001"+
- "B\u0003B\u03a3\bB\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001"+
- "C\u0003C\u03ad\bC\u0001D\u0001D\u0001D\u0001D\u0001D\u0003D\u03b4\bD\u0001"+
- "E\u0001E\u0001E\u0001E\u0001E\u0003E\u03bb\bE\u0001E\u0001E\u0001F\u0001"+
- "F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0003G\u03c7\bG\u0001H\u0001"+
- "H\u0001H\u0001H\u0003H\u03cd\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0003"+
- "I\u03d4\bI\u0001J\u0001J\u0001J\u0003J\u03d9\bJ\u0001K\u0001K\u0001K\u0001"+
- "K\u0003K\u03df\bK\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001"+
- "M\u0001M\u0001M\u0003M\u03eb\bM\u0001N\u0001N\u0001N\u0001N\u0003N\u03f1"+
- "\bN\u0001N\u0001N\u0003N\u03f5\bN\u0001O\u0001O\u0001O\u0001O\u0001P\u0001"+
- "P\u0003P\u03fd\bP\u0001P\u0001P\u0003P\u0401\bP\u0001P\u0001P\u0001Q\u0001"+
- "Q\u0003Q\u0407\bQ\u0001R\u0003R\u040a\bR\u0001R\u0001R\u0001S\u0001S\u0003"+
- "S\u0410\bS\u0001S\u0001S\u0001T\u0003T\u0415\bT\u0001T\u0001T\u0001U\u0001"+
- "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+
- "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0003"+
- "U\u042e\bU\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+
- "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+
- "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+
- "U\u0001U\u0001U\u0001U\u0001U\u0005U\u0451\bU\nU\fU\u0454\tU\u0001V\u0001"+
- "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+
- "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0003V\u046a"+
- "\bV\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0003X\u0472\bX\u0001Y\u0001"+
- "Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u047b\bZ\nZ\fZ\u047e\tZ\u0001"+
- "Z\u0001Z\u0001Z\u0001Z\u0003Z\u0484\bZ\u0001[\u0001[\u0001[\u0001[\u0001"+
- "[\u0003[\u048b\b[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+
- "\\\u0001\\\u0003\\\u0495\b\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+
- "]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0003]\u04a3\b]\u0001]\u0001"+
- "]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+
- "]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0005]\u04b9"+
- "\b]\n]\f]\u04bc\t]\u0001^\u0001^\u0001^\u0001_\u0001_\u0003_\u04c3\b_"+
- "\u0001_\u0001_\u0003_\u04c7\b_\u0001`\u0001`\u0003`\u04cb\b`\u0001`\u0003"+
- "`\u04ce\b`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04d7"+
- "\ba\u0001a\u0001a\u0005a\u04db\ba\na\fa\u04de\ta\u0001a\u0001a\u0001b"+
- "\u0001b\u0001b\u0001b\u0001c\u0003c\u04e7\bc\u0001c\u0001c\u0001c\u0001"+
- "c\u0001c\u0001c\u0003c\u04ef\bc\u0001c\u0001c\u0001c\u0001c\u0003c\u04f5"+
- "\bc\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0003d\u04fe\bd\u0001"+
- "e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0003e\u0509"+
- "\be\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0005g\u0512\bg\n"+
- "g\fg\u0515\tg\u0001g\u0003g\u0518\bg\u0003g\u051a\bg\u0001g\u0001g\u0001"+
- "h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u0525\bh\u0001i\u0001"+
- "i\u0001i\u0001i\u0001i\u0001j\u0003j\u052d\bj\u0001j\u0001j\u0001j\u0001"+
- "j\u0003j\u0533\bj\u0001j\u0003j\u0536\bj\u0001k\u0001k\u0003k\u053a\b"+
- "k\u0001k\u0001k\u0003k\u053e\bk\u0001k\u0003k\u0541\bk\u0001k\u0001k\u0001"+
- "k\u0001k\u0001k\u0003k\u0548\bk\u0001k\u0001k\u0001l\u0001l\u0001m\u0001"+
- "m\u0001n\u0001n\u0001o\u0003o\u0553\bo\u0001o\u0001o\u0001p\u0001p\u0001"+
- "p\u0001p\u0001p\u0001p\u0003p\u055d\bp\u0001p\u0001p\u0001p\u0001p\u0003"+
- "p\u0563\bp\u0003p\u0565\bp\u0001q\u0001q\u0001q\u0001r\u0001r\u0001s\u0001"+
- "s\u0001s\u0003s\u056f\bs\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0005"+
- "t\u0577\bt\nt\ft\u057a\tt\u0001t\u0003t\u057d\bt\u0001u\u0001u\u0003u"+
- "\u0581\bu\u0001u\u0001u\u0003u\u0585\bu\u0001v\u0001v\u0001v\u0005v\u058a"+
- "\bv\nv\fv\u058d\tv\u0001w\u0001w\u0001w\u0005w\u0592\bw\nw\fw\u0595\t"+
- "w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005x\u059d\bx\nx\fx\u05a0"+
- "\tx\u0001x\u0003x\u05a3\bx\u0001y\u0001y\u0003y\u05a7\by\u0001y\u0001"+
- "y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0005z\u05b1\bz\nz\fz\u05b4"+
- "\tz\u0001z\u0003z\u05b7\bz\u0001{\u0001{\u0003{\u05bb\b{\u0001{\u0001"+
- "{\u0001|\u0003|\u05c0\b|\u0001|\u0003|\u05c3\b|\u0001|\u0003|\u05c6\b"+
- "|\u0001|\u0001|\u0001|\u0004|\u05cb\b|\u000b|\f|\u05cc\u0001}\u0001}\u0001"+
- "}\u0001}\u0001}\u0003}\u05d4\b}\u0001~\u0001~\u0001\u007f\u0001\u007f"+
- "\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+
- "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083"+
- "\u0001\u0083\u0001\u0083\u0003\u0083\u05e8\b\u0083\u0001\u0084\u0001\u0084"+
- "\u0003\u0084\u05ec\b\u0084\u0001\u0085\u0001\u0085\u0003\u0085\u05f0\b"+
- "\u0085\u0001\u0086\u0001\u0086\u0003\u0086\u05f4\b\u0086\u0001\u0087\u0001"+
- "\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001"+
- "\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+
- "\u0089\u0003\u0089\u0604\b\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+
- "\u0089\u0003\u0089\u060a\b\u0089\u0003\u0089\u060c\b\u0089\u0001\u008a"+
- "\u0001\u008a\u0003\u008a\u0610\b\u008a\u0001\u008b\u0001\u008b\u0003\u008b"+
- "\u0614\b\u008b\u0001\u008b\u0003\u008b\u0617\b\u008b\u0001\u008b\u0001"+
- "\u008b\u0003\u008b\u061b\b\u008b\u0003\u008b\u061d\b\u008b\u0001\u008b"+
- "\u0001\u008b\u0005\u008b\u0621\b\u008b\n\u008b\f\u008b\u0624\t\u008b\u0001"+
- "\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u062b"+
- "\b\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d\u0630\b\u008d"+
- "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+
- "\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u063b\b\u008e\u0001\u008e"+
- "\u0001\u008e\u0005\u008e\u063f\b\u008e\n\u008e\f\u008e\u0642\t\u008e\u0001"+
- "\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0648\b\u008f\u0001"+
- "\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001"+
- "\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0653\b\u0090\u0001\u0091\u0001"+
- "\u0091\u0001\u0091\u0003\u0091\u0658\b\u0091\u0001\u0092\u0001\u0092\u0003"+
- "\u0092\u065c\b\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u0661"+
- "\b\u0092\u0005\u0092\u0663\b\u0092\n\u0092\f\u0092\u0666\t\u0092\u0001"+
- "\u0093\u0001\u0093\u0001\u0093\u0005\u0093\u066b\b\u0093\n\u0093\f\u0093"+
- "\u066e\t\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094"+
- "\u0003\u0094\u0675\b\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0003\u0095"+
- "\u067a\b\u0095\u0001\u0095\u0003\u0095\u067d\b\u0095\u0001\u0096\u0001"+
- "\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0685"+
- "\b\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0003\u0097\u068b"+
- "\b\u0097\u0001\u0097\u0001\u0097\u0003\u0097\u068f\b\u0097\u0003\u0097"+
- "\u0691\b\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0003\u0098\u0696\b"+
- "\u0098\u0001\u0098\u0001\u0098\u0003\u0098\u069a\b\u0098\u0001\u0098\u0001"+
- "\u0098\u0003\u0098\u069e\b\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+
- "\u009a\u0001\u009a\u0003\u009a\u06a5\b\u009a\u0001\u009b\u0001\u009b\u0001"+
- "\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+
- "\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001"+
- "\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+
- "\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+
- "\u00a1\u0003\u00a1\u06c2\b\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001"+
- "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003"+
- "\u00a3\u06cd\b\u00a3\u0001\u00a4\u0001\u00a4\u0003\u00a4\u06d1\b\u00a4"+
- "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0005\u00a5\u06d7\b\u00a5"+
- "\n\u00a5\f\u00a5\u06da\t\u00a5\u0001\u00a5\u0003\u00a5\u06dd\b\u00a5\u0003"+
- "\u00a5\u06df\b\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001"+
- "\u00a6\u0001\u00a6\u0003\u00a6\u06e7\b\u00a6\u0001\u00a6\u0001\u00a6\u0001"+
- "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0003\u00a7\u06f0"+
- "\b\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001"+
- "\u00a8\u0003\u00a8\u06f8\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0003"+
- "\u00a9\u06fd\b\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+
- "\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001"+
- "\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003\u00ae\u070d\b\u00ae\u0003"+
- "\u00ae\u070f\b\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001"+
- "\u00af\u0005\u00af\u0716\b\u00af\n\u00af\f\u00af\u0719\t\u00af\u0001\u00b0"+
- "\u0001\u00b0\u0001\u00b0\u0003\u00b0\u071e\b\u00b0\u0001\u00b0\u0001\u00b0"+
- "\u0001\u00b1\u0001\u00b1\u0003\u00b1\u0724\b\u00b1\u0001\u00b2\u0001\u00b2"+
- "\u0003\u00b2\u0728\b\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3"+
- "\u0001\u00b3\u0005\u00b3\u072f\b\u00b3\n\u00b3\f\u00b3\u0732\t\u00b3\u0001"+
- "\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0003\u00b5\u0739"+
- "\b\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+
- "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+
- "\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0003\u00b8\u074b"+
- "\b\u00b8\u0003\u00b8\u074d\b\u00b8\u0001\u00b8\u0003\u00b8\u0750\b\u00b8"+
- "\u0001\u00b8\u0003\u00b8\u0753\b\u00b8\u0003\u00b8\u0755\b\u00b8\u0001"+
- "\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+
- "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0003"+
- "\u00bb\u0763\b\u00bb\u0001\u00bb\u0001\u0307\u0002\u00aa\u00ba\u00bc\u0000"+
- "\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c"+
- "\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+
- "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+
- "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+
- "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+
- "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+
- "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+
- "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+
- "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+
- "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+
- "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+
- "\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174"+
- "\u0176\u0000\u0013\u0002\u0000ggrr\u0001\u0000\u0017\u0018\u0001\u0000"+
- "\u0005\b\u0001\u0000CD\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0085"+
- "\u008b\u0001\u0000\u0014\u0015\u0002\u0000\u0080\u0084\u0089\u008a\u0004"+
- "\u0000##ss\u007f\u007f\u0086\u0088\u0001\u0000\u001f!\u0001\u0000\u001c"+
- "\u001e\u0002\u0000JKy~\u0004\u0000--0033__\u0002\u0000\u007f\u0084\u0086"+
- "\u008a\u0001\u0000st\u0002\u0000pp\u00a1\u00a1\u0002\u0000\u008c\u008f"+
- "\u0091\u0092\u0001\u0000\u0098\u0099\u07cf\u0000\u0178\u0001\u0000\u0000"+
- "\u0000\u0002\u017b\u0001\u0000\u0000\u0000\u0004\u017e\u0001\u0000\u0000"+
- "\u0000\u0006\u0181\u0001\u0000\u0000\u0000\b\u0189\u0001\u0000\u0000\u0000"+
- "\n\u0192\u0001\u0000\u0000\u0000\f\u01b2\u0001\u0000\u0000\u0000\u000e"+
- "\u01bf\u0001\u0000\u0000\u0000\u0010\u01c2\u0001\u0000\u0000\u0000\u0012"+
- "\u01ca\u0001\u0000\u0000\u0000\u0014\u01d7\u0001\u0000\u0000\u0000\u0016"+
- "\u01ed\u0001\u0000\u0000\u0000\u0018\u01f6\u0001\u0000\u0000\u0000\u001a"+
- "\u01f8\u0001\u0000\u0000\u0000\u001c\u01fa\u0001\u0000\u0000\u0000\u001e"+
- "\u01fd\u0001\u0000\u0000\u0000 \u0213\u0001\u0000\u0000\u0000\"\u0215"+
- "\u0001\u0000\u0000\u0000$\u0217\u0001\u0000\u0000\u0000&\u021c\u0001\u0000"+
- "\u0000\u0000(\u0227\u0001\u0000\u0000\u0000*\u0234\u0001\u0000\u0000\u0000"+
- ",\u0237\u0001\u0000\u0000\u0000.\u0242\u0001\u0000\u0000\u00000\u0244"+
- "\u0001\u0000\u0000\u00002\u0249\u0001\u0000\u0000\u00004\u024e\u0001\u0000"+
- "\u0000\u00006\u0253\u0001\u0000\u0000\u00008\u0258\u0001\u0000\u0000\u0000"+
- ":\u0265\u0001\u0000\u0000\u0000<\u0267\u0001\u0000\u0000\u0000>\u0269"+
- "\u0001\u0000\u0000\u0000@\u026e\u0001\u0000\u0000\u0000B\u0273\u0001\u0000"+
- "\u0000\u0000D\u0278\u0001\u0000\u0000\u0000F\u027c\u0001\u0000\u0000\u0000"+
- "H\u0281\u0001\u0000\u0000\u0000J\u028a\u0001\u0000\u0000\u0000L\u0291"+
- "\u0001\u0000\u0000\u0000N\u029e\u0001\u0000\u0000\u0000P\u02a2\u0001\u0000"+
- "\u0000\u0000R\u02ad\u0001\u0000\u0000\u0000T\u02b5\u0001\u0000\u0000\u0000"+
- "V\u02b7\u0001\u0000\u0000\u0000X\u02cc\u0001\u0000\u0000\u0000Z\u02ce"+
- "\u0001\u0000\u0000\u0000\\\u02da\u0001\u0000\u0000\u0000^\u02e7\u0001"+
- "\u0000\u0000\u0000`\u02eb\u0001\u0000\u0000\u0000b\u02fb\u0001\u0000\u0000"+
- "\u0000d\u0307\u0001\u0000\u0000\u0000f\u0316\u0001\u0000\u0000\u0000h"+
- "\u0319\u0001\u0000\u0000\u0000j\u0321\u0001\u0000\u0000\u0000l\u0323\u0001"+
- "\u0000\u0000\u0000n\u032e\u0001\u0000\u0000\u0000p\u0336\u0001\u0000\u0000"+
- "\u0000r\u0345\u0001\u0000\u0000\u0000t\u0347\u0001\u0000\u0000\u0000v"+
- "\u034f\u0001\u0000\u0000\u0000x\u035d\u0001\u0000\u0000\u0000z\u0369\u0001"+
- "\u0000\u0000\u0000|\u0373\u0001\u0000\u0000\u0000~\u0377\u0001\u0000\u0000"+
- "\u0000\u0080\u037d\u0001\u0000\u0000\u0000\u0082\u0395\u0001\u0000\u0000"+
- "\u0000\u0084\u039d\u0001\u0000\u0000\u0000\u0086\u03ac\u0001\u0000\u0000"+
- "\u0000\u0088\u03ae\u0001\u0000\u0000\u0000\u008a\u03b5\u0001\u0000\u0000"+
- "\u0000\u008c\u03be\u0001\u0000\u0000\u0000\u008e\u03c3\u0001\u0000\u0000"+
- "\u0000\u0090\u03c8\u0001\u0000\u0000\u0000\u0092\u03ce\u0001\u0000\u0000"+
- "\u0000\u0094\u03d5\u0001\u0000\u0000\u0000\u0096\u03da\u0001\u0000\u0000"+
- "\u0000\u0098\u03e0\u0001\u0000\u0000\u0000\u009a\u03e5\u0001\u0000\u0000"+
- "\u0000\u009c\u03ec\u0001\u0000\u0000\u0000\u009e\u03f6\u0001\u0000\u0000"+
- "\u0000\u00a0\u03fa\u0001\u0000\u0000\u0000\u00a2\u0406\u0001\u0000\u0000"+
- "\u0000\u00a4\u0409\u0001\u0000\u0000\u0000\u00a6\u040d\u0001\u0000\u0000"+
- "\u0000\u00a8\u0414\u0001\u0000\u0000\u0000\u00aa\u042d\u0001\u0000\u0000"+
- "\u0000\u00ac\u0469\u0001\u0000\u0000\u0000\u00ae\u046b\u0001\u0000\u0000"+
- "\u0000\u00b0\u046e\u0001\u0000\u0000\u0000\u00b2\u0473\u0001\u0000\u0000"+
- "\u0000\u00b4\u047c\u0001\u0000\u0000\u0000\u00b6\u048a\u0001\u0000\u0000"+
- "\u0000\u00b8\u0494\u0001\u0000\u0000\u0000\u00ba\u04a2\u0001\u0000\u0000"+
- "\u0000\u00bc\u04bd\u0001\u0000\u0000\u0000\u00be\u04c0\u0001\u0000\u0000"+
- "\u0000\u00c0\u04c8\u0001\u0000\u0000\u0000\u00c2\u04d1\u0001\u0000\u0000"+
- "\u0000\u00c4\u04e1\u0001\u0000\u0000\u0000\u00c6\u04f4\u0001\u0000\u0000"+
- "\u0000\u00c8\u04fd\u0001\u0000\u0000\u0000\u00ca\u0508\u0001\u0000\u0000"+
- "\u0000\u00cc\u050a\u0001\u0000\u0000\u0000\u00ce\u050d\u0001\u0000\u0000"+
- "\u0000\u00d0\u0524\u0001\u0000\u0000\u0000\u00d2\u0526\u0001\u0000\u0000"+
- "\u0000\u00d4\u052c\u0001\u0000\u0000\u0000\u00d6\u0537\u0001\u0000\u0000"+
- "\u0000\u00d8\u054b\u0001\u0000\u0000\u0000\u00da\u054d\u0001\u0000\u0000"+
- "\u0000\u00dc\u054f\u0001\u0000\u0000\u0000\u00de\u0552\u0001\u0000\u0000"+
- "\u0000\u00e0\u055c\u0001\u0000\u0000\u0000\u00e2\u0566\u0001\u0000\u0000"+
- "\u0000\u00e4\u0569\u0001\u0000\u0000\u0000\u00e6\u056e\u0001\u0000\u0000"+
- "\u0000\u00e8\u0570\u0001\u0000\u0000\u0000\u00ea\u057e\u0001\u0000\u0000"+
- "\u0000\u00ec\u0586\u0001\u0000\u0000\u0000\u00ee\u058e\u0001\u0000\u0000"+
- "\u0000\u00f0\u0596\u0001\u0000\u0000\u0000\u00f2\u05a4\u0001\u0000\u0000"+
- "\u0000\u00f4\u05aa\u0001\u0000\u0000\u0000\u00f6\u05b8\u0001\u0000\u0000"+
- "\u0000\u00f8\u05ca\u0001\u0000\u0000\u0000\u00fa\u05d3\u0001\u0000\u0000"+
- "\u0000\u00fc\u05d5\u0001\u0000\u0000\u0000\u00fe\u05d7\u0001\u0000\u0000"+
- "\u0000\u0100\u05db\u0001\u0000\u0000\u0000\u0102\u05de\u0001\u0000\u0000"+
- "\u0000\u0104\u05e2\u0001\u0000\u0000\u0000\u0106\u05e4\u0001\u0000\u0000"+
- "\u0000\u0108\u05e9\u0001\u0000\u0000\u0000\u010a\u05ed\u0001\u0000\u0000"+
- "\u0000\u010c\u05f1\u0001\u0000\u0000\u0000\u010e\u05f5\u0001\u0000\u0000"+
- "\u0000\u0110\u05f8\u0001\u0000\u0000\u0000\u0112\u05fa\u0001\u0000\u0000"+
- "\u0000\u0114\u060f\u0001\u0000\u0000\u0000\u0116\u0611\u0001\u0000\u0000"+
- "\u0000\u0118\u0627\u0001\u0000\u0000\u0000\u011a\u062f\u0001\u0000\u0000"+
- "\u0000\u011c\u0631\u0001\u0000\u0000\u0000\u011e\u0647\u0001\u0000\u0000"+
- "\u0000\u0120\u064f\u0001\u0000\u0000\u0000\u0122\u0657\u0001\u0000\u0000"+
- "\u0000\u0124\u065b\u0001\u0000\u0000\u0000\u0126\u0667\u0001\u0000\u0000"+
- "\u0000\u0128\u0671\u0001\u0000\u0000\u0000\u012a\u067c\u0001\u0000\u0000"+
- "\u0000\u012c\u0684\u0001\u0000\u0000\u0000\u012e\u0688\u0001\u0000\u0000"+
- "\u0000\u0130\u0695\u0001\u0000\u0000\u0000\u0132\u069f\u0001\u0000\u0000"+
- "\u0000\u0134\u06a4\u0001\u0000\u0000\u0000\u0136\u06a6\u0001\u0000\u0000"+
- "\u0000\u0138\u06ab\u0001\u0000\u0000\u0000\u013a\u06ad\u0001\u0000\u0000"+
- "\u0000\u013c\u06af\u0001\u0000\u0000\u0000\u013e\u06b2\u0001\u0000\u0000"+
- "\u0000\u0140\u06b6\u0001\u0000\u0000\u0000\u0142\u06c1\u0001\u0000\u0000"+
- "\u0000\u0144\u06c5\u0001\u0000\u0000\u0000\u0146\u06cc\u0001\u0000\u0000"+
- "\u0000\u0148\u06d0\u0001\u0000\u0000\u0000\u014a\u06d2\u0001\u0000\u0000"+
- "\u0000\u014c\u06e2\u0001\u0000\u0000\u0000\u014e\u06ef\u0001\u0000\u0000"+
- "\u0000\u0150\u06f7\u0001\u0000\u0000\u0000\u0152\u06fc\u0001\u0000\u0000"+
- "\u0000\u0154\u06fe\u0001\u0000\u0000\u0000\u0156\u0700\u0001\u0000\u0000"+
- "\u0000\u0158\u0702\u0001\u0000\u0000\u0000\u015a\u0706\u0001\u0000\u0000"+
- "\u0000\u015c\u0709\u0001\u0000\u0000\u0000\u015e\u0712\u0001\u0000\u0000"+
- "\u0000\u0160\u071d\u0001\u0000\u0000\u0000\u0162\u0723\u0001\u0000\u0000"+
- "\u0000\u0164\u0727\u0001\u0000\u0000\u0000\u0166\u0729\u0001\u0000\u0000"+
- "\u0000\u0168\u0735\u0001\u0000\u0000\u0000\u016a\u0738\u0001\u0000\u0000"+
- "\u0000\u016c\u073c\u0001\u0000\u0000\u0000\u016e\u0740\u0001\u0000\u0000"+
- "\u0000\u0170\u0745\u0001\u0000\u0000\u0000\u0172\u0758\u0001\u0000\u0000"+
- "\u0000\u0174\u075c\u0001\u0000\u0000\u0000\u0176\u0762\u0001\u0000\u0000"+
- "\u0000\u0178\u0179\u0003\u00aaU\u0000\u0179\u017a\u0005\u0000\u0000\u0001"+
- "\u017a\u0001\u0001\u0000\u0000\u0000\u017b\u017c\u0003\u00acV\u0000\u017c"+
- "\u017d\u0005\u0000\u0000\u0001\u017d\u0003\u0001\u0000\u0000\u0000\u017e"+
- "\u017f\u0003\u00c8d\u0000\u017f\u0180\u0005\u0000\u0000\u0001\u0180\u0005"+
- "\u0001\u0000\u0000\u0000\u0181\u0186\u0003\b\u0004\u0000\u0182\u0183\u0005"+
- "o\u0000\u0000\u0183\u0185\u0003\b\u0004\u0000\u0184\u0182\u0001\u0000"+
- "\u0000\u0000\u0185\u0188\u0001\u0000\u0000\u0000\u0186\u0184\u0001\u0000"+
- "\u0000\u0000\u0186\u0187\u0001\u0000\u0000\u0000\u0187\u0007\u0001\u0000"+
- "\u0000\u0000\u0188\u0186\u0001\u0000\u0000\u0000\u0189\u018b\u0005g\u0000"+
- "\u0000\u018a\u018c\u0005>\u0000\u0000\u018b\u018a\u0001\u0000\u0000\u0000"+
- "\u018b\u018c\u0001\u0000\u0000\u0000\u018c\t\u0001\u0000\u0000\u0000\u018d"+
- "\u018e\u0003\u000e\u0007\u0000\u018e\u018f\u0003\u0176\u00bb\u0000\u018f"+
- "\u0191\u0001\u0000\u0000\u0000\u0190\u018d\u0001\u0000\u0000\u0000\u0191"+
- "\u0194\u0001\u0000\u0000\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0192"+
- "\u0193\u0001\u0000\u0000\u0000\u0193\u0195\u0001\u0000\u0000\u0000\u0194"+
- "\u0192\u0001\u0000\u0000\u0000\u0195\u0196\u0003\u00e2q\u0000\u0196\u019c"+
- "\u0003\u0176\u00bb\u0000\u0197\u0198\u0003\u0014\n\u0000\u0198\u0199\u0003"+
- "\u0176\u00bb\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0197\u0001"+
- "\u0000\u0000\u0000\u019b\u019e\u0001\u0000\u0000\u0000\u019c\u019a\u0001"+
- "\u0000\u0000\u0000\u019c\u019d\u0001\u0000\u0000\u0000\u019d\u01a8\u0001"+
- "\u0000\u0000\u0000\u019e\u019c\u0001\u0000\u0000\u0000\u019f\u01a3\u0003"+
- "\u008eG\u0000\u01a0\u01a3\u0003\u00e6s\u0000\u01a1\u01a3\u0003\u0016\u000b"+
- "\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000"+
- "\u0000\u01a2\u01a1\u0001\u0000\u0000\u0000\u01a3\u01a4\u0001\u0000\u0000"+
- "\u0000\u01a4\u01a5\u0003\u0176\u00bb\u0000\u01a5\u01a7\u0001\u0000\u0000"+
- "\u0000\u01a6\u01a2\u0001\u0000\u0000\u0000\u01a7\u01aa\u0001\u0000\u0000"+
- "\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001\u0000\u0000"+
- "\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000"+
- "\u0000\u01ab\u01ac\u0005\u0000\u0000\u0001\u01ac\u000b\u0001\u0000\u0000"+
- "\u0000\u01ad\u01ae\u0003\u000e\u0007\u0000\u01ae\u01af\u0003\u0176\u00bb"+
- "\u0000\u01af\u01b1\u0001\u0000\u0000\u0000\u01b0\u01ad\u0001\u0000\u0000"+
- "\u0000\u01b1\u01b4\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001\u0000\u0000"+
- "\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b5\u0001\u0000\u0000"+
- "\u0000\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b5\u01b6\u0003\u00e2q\u0000"+
- "\u01b6\u01bc\u0003\u0176\u00bb\u0000\u01b7\u01b8\u0003\u0014\n\u0000\u01b8"+
- "\u01b9\u0003\u0176\u00bb\u0000\u01b9\u01bb\u0001\u0000\u0000\u0000\u01ba"+
- "\u01b7\u0001\u0000\u0000\u0000\u01bb\u01be\u0001\u0000\u0000\u0000\u01bc"+
- "\u01ba\u0001\u0000\u0000\u0000\u01bc\u01bd\u0001\u0000\u0000\u0000\u01bd"+
- "\r\u0001\u0000\u0000\u0000\u01be\u01bc\u0001\u0000\u0000\u0000\u01bf\u01c0"+
- "\u0005G\u0000\u0000\u01c0\u01c1\u0003\u00aaU\u0000\u01c1\u000f\u0001\u0000"+
- "\u0000\u0000\u01c2\u01c3\u0005H\u0000\u0000\u01c3\u01c4\u0003\u00aaU\u0000"+
- "\u01c4\u0011\u0001\u0000\u0000\u0000\u01c5\u01c6\u0003\u0010\b\u0000\u01c6"+
- "\u01c7\u0003\u0176\u00bb\u0000\u01c7\u01c9\u0001\u0000\u0000\u0000\u01c8"+
- "\u01c5\u0001\u0000\u0000\u0000\u01c9\u01cc\u0001\u0000\u0000\u0000\u01ca"+
- "\u01c8\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000\u0000\u01cb"+
- "\u01ce\u0001\u0000\u0000\u0000\u01cc\u01ca\u0001\u0000\u0000\u0000\u01cd"+
- "\u01cf\u0007\u0000\u0000\u0000\u01ce\u01cd\u0001\u0000\u0000\u0000\u01ce"+
- "\u01cf\u0001\u0000\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000\u0000\u01d0"+
- "\u01d1\u0003\u00e4r\u0000\u01d1\u0013\u0001\u0000\u0000\u0000\u01d2\u01d3"+
- "\u0003\u0010\b\u0000\u01d3\u01d4\u0003\u0176\u00bb\u0000\u01d4\u01d6\u0001"+
- "\u0000\u0000\u0000\u01d5\u01d2\u0001\u0000\u0000\u0000\u01d6\u01d9\u0001"+
- "\u0000\u0000\u0000\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d7\u01d8\u0001"+
- "\u0000\u0000\u0000\u01d8\u01e7\u0001\u0000\u0000\u0000\u01d9\u01d7\u0001"+
- "\u0000\u0000\u0000\u01da\u01db\u0005c\u0000\u0000\u01db\u01e8\u0003\u0012"+
- "\t\u0000\u01dc\u01dd\u0005c\u0000\u0000\u01dd\u01e3\u0005h\u0000\u0000"+
- "\u01de\u01df\u0003\u0012\t\u0000\u01df\u01e0\u0003\u0176\u00bb\u0000\u01e0"+
- "\u01e2\u0001\u0000\u0000\u0000\u01e1\u01de\u0001\u0000\u0000\u0000\u01e2"+
- "\u01e5\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e3"+
- "\u01e4\u0001\u0000\u0000\u0000\u01e4\u01e6\u0001\u0000\u0000\u0000\u01e5"+
- "\u01e3\u0001\u0000\u0000\u0000\u01e6\u01e8\u0005i\u0000\u0000\u01e7\u01da"+
- "\u0001\u0000\u0000\u0000\u01e7\u01dc\u0001\u0000\u0000\u0000\u01e8\u0015"+
- "\u0001\u0000\u0000\u0000\u01e9\u01ee\u0003\u0080@\u0000\u01ea\u01ee\u0003"+
- "\u0096K\u0000\u01eb\u01ee\u0003\u009aM\u0000\u01ec\u01ee\u0003\u0094J"+
- "\u0000\u01ed\u01e9\u0001\u0000\u0000\u0000\u01ed\u01ea\u0001\u0000\u0000"+
- "\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000\u01ed\u01ec\u0001\u0000\u0000"+
- "\u0000\u01ee\u0017\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005\u001b\u0000"+
- "\u0000\u01f0\u01f7\u0003\u00acV\u0000\u01f1\u01f2\u0007\u0001\u0000\u0000"+
- "\u01f2\u01f7\u0003.\u0017\u0000\u01f3\u01f4\u0007\u0002\u0000\u0000\u01f4"+
- "\u01f7\u0003\u00aaU\u0000\u01f5\u01f7\u0003l6\u0000\u01f6\u01ef\u0001"+
- "\u0000\u0000\u0000\u01f6\u01f1\u0001\u0000\u0000\u0000\u01f6\u01f3\u0001"+
- "\u0000\u0000\u0000\u01f6\u01f5\u0001\u0000\u0000\u0000\u01f7\u0019\u0001"+
- "\u0000\u0000\u0000\u01f8\u01f9\u0003\u001c\u000e\u0000\u01f9\u001b\u0001"+
- "\u0000\u0000\u0000\u01fa\u01fb\u0003d2\u0000\u01fb\u01fc\u0003\u001e\u000f"+
- "\u0000\u01fc\u001d\u0001\u0000\u0000\u0000\u01fd\u01fe\u0005F\u0000\u0000"+
- "\u01fe\u0200\u0005h\u0000\u0000\u01ff\u0201\u0003\u00f8|\u0000\u0200\u01ff"+
- "\u0001\u0000\u0000\u0000\u0200\u0201\u0001\u0000\u0000\u0000\u0201\u0202"+
- "\u0001\u0000\u0000\u0000\u0202\u0203\u0005i\u0000\u0000\u0203\u001f\u0001"+
- "\u0000\u0000\u0000\u0204\u0214\u0003J%\u0000\u0205\u0214\u0003H$\u0000"+
- "\u0206\u0214\u0003F#\u0000\u0207\u0214\u0003$\u0012\u0000\u0208\u0214"+
- "\u0003@ \u0000\u0209\u0214\u0003B!\u0000\u020a\u0214\u0003D\"\u0000\u020b"+
- "\u0214\u00038\u001c\u0000\u020c\u0214\u0003>\u001f\u0000\u020d\u0214\u0003"+
- "6\u001b\u0000\u020e\u0214\u00032\u0019\u0000\u020f\u0214\u00030\u0018"+
- "\u0000\u0210\u0214\u00034\u001a\u0000\u0211\u0214\u0003\"\u0011\u0000"+
- "\u0212\u0214\u0003L&\u0000\u0213\u0204\u0001\u0000\u0000\u0000\u0213\u0205"+
- "\u0001\u0000\u0000\u0000\u0213\u0206\u0001\u0000\u0000\u0000\u0213\u0207"+
- "\u0001\u0000\u0000\u0000\u0213\u0208\u0001\u0000\u0000\u0000\u0213\u0209"+
- "\u0001\u0000\u0000\u0000\u0213\u020a\u0001\u0000\u0000\u0000\u0213\u020b"+
- "\u0001\u0000\u0000\u0000\u0213\u020c\u0001\u0000\u0000\u0000\u0213\u020d"+
- "\u0001\u0000\u0000\u0000\u0213\u020e\u0001\u0000\u0000\u0000\u0213\u020f"+
- "\u0001\u0000\u0000\u0000\u0213\u0210\u0001\u0000\u0000\u0000\u0213\u0211"+
- "\u0001\u0000\u0000\u0000\u0213\u0212\u0001\u0000\u0000\u0000\u0214!\u0001"+
- "\u0000\u0000\u0000\u0215\u0216\u0007\u0003\u0000\u0000\u0216#\u0001\u0000"+
- "\u0000\u0000\u0217\u0218\u0005`\u0000\u0000\u0218\u0219\u0005l\u0000\u0000"+
- "\u0219\u021a\u0003\u00c8d\u0000\u021a\u021b\u0005m\u0000\u0000\u021b%"+
- "\u0001\u0000\u0000\u0000\u021c\u0221\u0003(\u0014\u0000\u021d\u021e\u0005"+
- "o\u0000\u0000\u021e\u0220\u0003(\u0014\u0000\u021f\u021d\u0001\u0000\u0000"+
- "\u0000\u0220\u0223\u0001\u0000\u0000\u0000\u0221\u021f\u0001\u0000\u0000"+
- "\u0000\u0221\u0222\u0001\u0000\u0000\u0000\u0222\u0225\u0001\u0000\u0000"+
- "\u0000\u0223\u0221\u0001\u0000\u0000\u0000\u0224\u0226\u0005o\u0000\u0000"+
- "\u0225\u0224\u0001\u0000\u0000\u0000\u0225\u0226\u0001\u0000\u0000\u0000"+
- "\u0226\'\u0001\u0000\u0000\u0000\u0227\u022c\u0005g\u0000\u0000\u0228"+
- "\u0229\u0005o\u0000\u0000\u0229\u022b\u0005g\u0000\u0000\u022a\u0228\u0001"+
- "\u0000\u0000\u0000\u022b\u022e\u0001\u0000\u0000\u0000\u022c\u022a\u0001"+
- "\u0000\u0000\u0000\u022c\u022d\u0001\u0000\u0000\u0000\u022d\u022f\u0001"+
- "\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022f\u0230\u0003"+
- "\u013a\u009d\u0000\u0230)\u0001\u0000\u0000\u0000\u0231\u0233\u0003,\u0016"+
- "\u0000\u0232\u0231\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000"+
- "\u0000\u0234\u0232\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000"+
- "\u0000\u0235+\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000"+
- "\u0237\u0238\u0005j\u0000\u0000\u0238\u023d\u0003\u00aaU\u0000\u0239\u023a"+
- "\u0005o\u0000\u0000\u023a\u023c\u0003\u00aaU\u0000\u023b\u0239\u0001\u0000"+
- "\u0000\u0000\u023c\u023f\u0001\u0000\u0000\u0000\u023d\u023b\u0001\u0000"+
- "\u0000\u0000\u023d\u023e\u0001\u0000\u0000\u0000\u023e\u0240\u0001\u0000"+
- "\u0000\u0000\u023f\u023d\u0001\u0000\u0000\u0000\u0240\u0241\u0005k\u0000"+
- "\u0000\u0241-\u0001\u0000\u0000\u0000\u0242\u0243\u0003\u00ba]\u0000\u0243"+
- "/\u0001\u0000\u0000\u0000\u0244\u0245\u00051\u0000\u0000\u0245\u0246\u0005"+
- "h\u0000\u0000\u0246\u0247\u0003\u00aaU\u0000\u0247\u0248\u0005i\u0000"+
- "\u0000\u02481\u0001\u0000\u0000\u0000\u0249\u024a\u00057\u0000\u0000\u024a"+
- "\u024b\u0005l\u0000\u0000\u024b\u024c\u0003\u00c8d\u0000\u024c\u024d\u0005"+
- "m\u0000\u0000\u024d3\u0001\u0000\u0000\u0000\u024e\u024f\u00052\u0000"+
- "\u0000\u024f\u0250\u0005h\u0000\u0000\u0250\u0251\u0003\u00aaU\u0000\u0251"+
- "\u0252\u0005i\u0000\u0000\u02525\u0001\u0000\u0000\u0000\u0253\u0254\u0007"+
- "\u0004\u0000\u0000\u0254\u0255\u0005h\u0000\u0000\u0255\u0256\u0003\u00aa"+
- "U\u0000\u0256\u0257\u0005i\u0000\u0000\u02577\u0001\u0000\u0000\u0000"+
- "\u0258\u025d\u0005\u0011\u0000\u0000\u0259\u025a\u0005l\u0000\u0000\u025a"+
- "\u025b\u0003:\u001d\u0000\u025b\u025c\u0005m\u0000\u0000\u025c\u025e\u0001"+
- "\u0000\u0000\u0000\u025d\u0259\u0001\u0000\u0000\u0000\u025d\u025e\u0001"+
- "\u0000\u0000\u0000\u025e\u025f\u0001\u0000\u0000\u0000\u025f\u0260\u0005"+
- "h\u0000\u0000\u0260\u0261\u0003\u00aaU\u0000\u0261\u0262\u0005i\u0000"+
- "\u0000\u02629\u0001\u0000\u0000\u0000\u0263\u0266\u0003<\u001e\u0000\u0264"+
- "\u0266\u0005\u0013\u0000\u0000\u0265\u0263\u0001\u0000\u0000\u0000\u0265"+
- "\u0264\u0001\u0000\u0000\u0000\u0266;\u0001\u0000\u0000\u0000\u0267\u0268"+
- "\u0005g\u0000\u0000\u0268=\u0001\u0000\u0000\u0000\u0269\u026a\u0005\u0012"+
- "\u0000\u0000\u026a\u026b\u0005h\u0000\u0000\u026b\u026c\u0003\u00aaU\u0000"+
- "\u026c\u026d\u0005i\u0000\u0000\u026d?\u0001\u0000\u0000\u0000\u026e\u026f"+
- "\u0005:\u0000\u0000\u026f\u0270\u0005h\u0000\u0000\u0270\u0271\u0003\u00aa"+
- "U\u0000\u0271\u0272\u0005i\u0000\u0000\u0272A\u0001\u0000\u0000\u0000"+
- "\u0273\u0274\u0005;\u0000\u0000\u0274\u0275\u0005h\u0000\u0000\u0275\u0276"+
- "\u0003\u00aaU\u0000\u0276\u0277\u0005i\u0000\u0000\u0277C\u0001\u0000"+
- "\u0000\u0000\u0278\u0279\u0005<\u0000\u0000\u0279\u027a\u0005h\u0000\u0000"+
- "\u027a\u027b\u0005i\u0000\u0000\u027bE\u0001\u0000\u0000\u0000\u027c\u027d"+
- "\u00059\u0000\u0000\u027d\u027e\u0005h\u0000\u0000\u027e\u027f\u0003\u00aa"+
- "U\u0000\u027f\u0280\u0005i\u0000\u0000\u0280G\u0001\u0000\u0000\u0000"+
- "\u0281\u0282\u0005\u0016\u0000\u0000\u0282\u0283\u0005h\u0000\u0000\u0283"+
- "\u0286\u0003\u00aaU\u0000\u0284\u0285\u0005o\u0000\u0000\u0285\u0287\u0003"+
- "\u00aaU\u0000\u0286\u0284\u0001\u0000\u0000\u0000\u0286\u0287\u0001\u0000"+
- "\u0000\u0000\u0287\u0288\u0001\u0000\u0000\u0000\u0288\u0289\u0005i\u0000"+
- "\u0000\u0289I\u0001\u0000\u0000\u0000\u028a\u028b\u0007\u0004\u0000\u0000"+
- "\u028b\u028c\u0005l\u0000\u0000\u028c\u028d\u0003\u00aaU\u0000\u028d\u028e"+
- "\u0005?\u0000\u0000\u028e\u028f\u0003\u00aaU\u0000\u028f\u0290\u0005m"+
- "\u0000\u0000\u0290K\u0001\u0000\u0000\u0000\u0291\u0292\u00056\u0000\u0000"+
- "\u0292\u0293\u0003\u00aaU\u0000\u0293\u0299\u0005j\u0000\u0000\u0294\u0295"+
- "\u0003N\'\u0000\u0295\u0296\u0003\u0176\u00bb\u0000\u0296\u0298\u0001"+
- "\u0000\u0000\u0000\u0297\u0294\u0001\u0000\u0000\u0000\u0298\u029b\u0001"+
- "\u0000\u0000\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u0299\u029a\u0001"+
- "\u0000\u0000\u0000\u029a\u029c\u0001\u0000\u0000\u0000\u029b\u0299\u0001"+
- "\u0000\u0000\u0000\u029c\u029d\u0005k\u0000\u0000\u029dM\u0001\u0000\u0000"+
- "\u0000\u029e\u029f\u0003p8\u0000\u029f\u02a0\u0005q\u0000\u0000\u02a0"+
- "\u02a1\u0003\u00aaU\u0000\u02a1O\u0001\u0000\u0000\u0000\u02a2\u02a3\u0005"+
- "l\u0000\u0000\u02a3\u02a8\u0003R)\u0000\u02a4\u02a5\u0005o\u0000\u0000"+
- "\u02a5\u02a7\u0003R)\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a7\u02aa"+
- "\u0001\u0000\u0000\u0000\u02a8\u02a6\u0001\u0000\u0000\u0000\u02a8\u02a9"+
- "\u0001\u0000\u0000\u0000\u02a9\u02ab\u0001\u0000\u0000\u0000\u02aa\u02a8"+
- "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0005m\u0000\u0000\u02acQ\u0001\u0000"+
- "\u0000\u0000\u02ad\u02ae\u0003\u00aaU\u0000\u02ae\u02af\u0005n\u0000\u0000"+
- "\u02af\u02b0\u0003\u00aaU\u0000\u02b0S\u0001\u0000\u0000\u0000\u02b1\u02b6"+
- "\u0003b1\u0000\u02b2\u02b6\u0003`0\u0000\u02b3\u02b6\u0003V+\u0000\u02b4"+
- "\u02b6\u0003Z-\u0000\u02b5\u02b1\u0001\u0000\u0000\u0000\u02b5\u02b2\u0001"+
- "\u0000\u0000\u0000\u02b5\u02b3\u0001\u0000\u0000\u0000\u02b5\u02b4\u0001"+
- "\u0000\u0000\u0000\u02b6U\u0001\u0000\u0000\u0000\u02b7\u02b8\u00053\u0000"+
- "\u0000\u02b8\u02be\u0005j\u0000\u0000\u02b9\u02ba\u0003X,\u0000\u02ba"+
- "\u02bb\u0003\u0176\u00bb\u0000\u02bb\u02bd\u0001\u0000\u0000\u0000\u02bc"+
- "\u02b9\u0001\u0000\u0000\u0000\u02bd\u02c0\u0001\u0000\u0000\u0000\u02be"+
- "\u02bc\u0001\u0000\u0000\u0000\u02be\u02bf\u0001\u0000\u0000\u0000\u02bf"+
- "\u02c1\u0001\u0000\u0000\u0000\u02c0\u02be\u0001\u0000\u0000\u0000\u02c1"+
- "\u02c2\u0005k\u0000\u0000\u02c2W\u0001\u0000\u0000\u0000\u02c3\u02c4\u0005"+
- "O\u0000\u0000\u02c4\u02c5\u0005g\u0000\u0000\u02c5\u02cd\u0003\u0146\u00a3"+
- "\u0000\u02c6\u02c7\u00054\u0000\u0000\u02c7\u02c8\u0005j\u0000\u0000\u02c8"+
- "\u02c9\u0003\u00aaU\u0000\u02c9\u02ca\u0003\u0176\u00bb\u0000\u02ca\u02cb"+
- "\u0005k\u0000\u0000\u02cb\u02cd\u0001\u0000\u0000\u0000\u02cc\u02c3\u0001"+
- "\u0000\u0000\u0000\u02cc\u02c6\u0001\u0000\u0000\u0000\u02cdY\u0001\u0000"+
- "\u0000\u0000\u02ce\u02cf\u00055\u0000\u0000\u02cf\u02d5\u0005j\u0000\u0000"+
- "\u02d0\u02d1\u0003\\.\u0000\u02d1\u02d2\u0003\u0176\u00bb\u0000\u02d2"+
- "\u02d4\u0001\u0000\u0000\u0000\u02d3\u02d0\u0001\u0000\u0000\u0000\u02d4"+
- "\u02d7\u0001\u0000\u0000\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d5"+
- "\u02d6\u0001\u0000\u0000\u0000\u02d6\u02d8\u0001\u0000\u0000\u0000\u02d7"+
- "\u02d5\u0001\u0000\u0000\u0000\u02d8\u02d9\u0005k\u0000\u0000\u02d9[\u0001"+
- "\u0000\u0000\u0000\u02da\u02db\u0005g\u0000\u0000\u02db\u02e1\u0005j\u0000"+
- "\u0000\u02dc\u02dd\u0003^/\u0000\u02dd\u02de\u0003\u0176\u00bb\u0000\u02de"+
- "\u02e0\u0001\u0000\u0000\u0000\u02df\u02dc\u0001\u0000\u0000\u0000\u02e0"+
- "\u02e3\u0001\u0000\u0000\u0000\u02e1\u02df\u0001\u0000\u0000\u0000\u02e1"+
- "\u02e2\u0001\u0000\u0000\u0000\u02e2\u02e4\u0001\u0000\u0000\u0000\u02e3"+
- "\u02e1\u0001\u0000\u0000\u0000\u02e4\u02e5\u0005k\u0000\u0000\u02e5]\u0001"+
- "\u0000\u0000\u0000\u02e6\u02e8\u0003\u00ecv\u0000\u02e7\u02e6\u0001\u0000"+
- "\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000\u02e8\u02e9\u0001\u0000"+
- "\u0000\u0000\u02e9\u02ea\u0003\u00c8d\u0000\u02ea_\u0001\u0000\u0000\u0000"+
- "\u02eb\u02ec\u0005\u001b\u0000\u0000\u02ec\u02ed\u0005l\u0000\u0000\u02ed"+
- "\u02ee\u0005m\u0000\u0000\u02ee\u02ef\u0003\u013a\u009d\u0000\u02efa\u0001"+
- "\u0000\u0000\u0000\u02f0\u02f1\u0007\u0005\u0000\u0000\u02f1\u02f2\u0005"+
- "l\u0000\u0000\u02f2\u02f3\u0003\u00c8d\u0000\u02f3\u02f4\u0005m\u0000"+
- "\u0000\u02f4\u02fc\u0001\u0000\u0000\u0000\u02f5\u02f6\u0005+\u0000\u0000"+
- "\u02f6\u02f7\u0005l\u0000\u0000\u02f7\u02f8\u0003\u00c8d\u0000\u02f8\u02f9"+
- "\u0005m\u0000\u0000\u02f9\u02fa\u0003\u00c8d\u0000\u02fa\u02fc\u0001\u0000"+
- "\u0000\u0000\u02fb\u02f0\u0001\u0000\u0000\u0000\u02fb\u02f5\u0001\u0000"+
- "\u0000\u0000\u02fcc\u0001\u0000\u0000\u0000\u02fd\u0303\u0003f3\u0000"+
- "\u02fe\u02ff\u0005\u000e\u0000\u0000\u02ff\u0303\u00062\uffff\uffff\u0000"+
- "\u0300\u0301\u0005E\u0000\u0000\u0301\u0303\u00062\uffff\uffff\u0000\u0302"+
- "\u02fd\u0001\u0000\u0000\u0000\u0302\u02fe\u0001\u0000\u0000\u0000\u0302"+
- "\u0300\u0001\u0000\u0000\u0000\u0303\u0304\u0001\u0000\u0000\u0000\u0304"+
- "\u0306\u0003\u0176\u00bb\u0000\u0305\u0302\u0001\u0000\u0000\u0000\u0306"+
- "\u0309\u0001\u0000\u0000\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0307"+
- "\u0305\u0001\u0000\u0000\u0000\u0308\u030c\u0001\u0000\u0000\u0000\u0309"+
- "\u0307\u0001\u0000\u0000\u0000\u030a\u030b\u0005\u000e\u0000\u0000\u030b"+
- "\u030d\u00062\uffff\uffff\u0000\u030c\u030a\u0001\u0000\u0000\u0000\u030c"+
- "\u030d\u0001\u0000\u0000\u0000\u030de\u0001\u0000\u0000\u0000\u030e\u030f"+
- "\u0005\t\u0000\u0000\u030f\u0317\u0003j5\u0000\u0310\u0311\u0005\n\u0000"+
- "\u0000\u0311\u0317\u0003j5\u0000\u0312\u0313\u0005\u000b\u0000\u0000\u0313"+
- "\u0317\u0003j5\u0000\u0314\u0315\u0005\r\u0000\u0000\u0315\u0317\u0003"+
- "h4\u0000\u0316\u030e\u0001\u0000\u0000\u0000\u0316\u0310\u0001\u0000\u0000"+
- "\u0000\u0316\u0312\u0001\u0000\u0000\u0000\u0316\u0314\u0001\u0000\u0000"+
- "\u0000\u0317g\u0001\u0000\u0000\u0000\u0318\u031a\u0003\u00eew\u0000\u0319"+
- "\u0318\u0001\u0000\u0000\u0000\u0319\u031a\u0001\u0000\u0000\u0000\u031a"+
- "\u031d\u0001\u0000\u0000\u0000\u031b\u031c\u0005^\u0000\u0000\u031c\u031e"+
- "\u0003\u00aaU\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d\u031e\u0001"+
- "\u0000\u0000\u0000\u031ei\u0001\u0000\u0000\u0000\u031f\u0322\u0001\u0000"+
- "\u0000\u0000\u0320\u0322\u0003\u00aaU\u0000\u0321\u031f\u0001\u0000\u0000"+
- "\u0000\u0321\u0320\u0001\u0000\u0000\u0000\u0322k\u0001\u0000\u0000\u0000"+
- "\u0323\u0324\u00056\u0000\u0000\u0324\u0325\u0003\u00aaU\u0000\u0325\u0329"+
- "\u0005j\u0000\u0000\u0326\u0328\u0003n7\u0000\u0327\u0326\u0001\u0000"+
- "\u0000\u0000\u0328\u032b\u0001\u0000\u0000\u0000\u0329\u0327\u0001\u0000"+
- "\u0000\u0000\u0329\u032a\u0001\u0000\u0000\u0000\u032a\u032c\u0001\u0000"+
- "\u0000\u0000\u032b\u0329\u0001\u0000\u0000\u0000\u032c\u032d\u0005k\u0000"+
- "\u0000\u032dm\u0001\u0000\u0000\u0000\u032e\u032f\u0003p8\u0000\u032f"+
- "\u0331\u0005q\u0000\u0000\u0330\u0332\u0003\u00f8|\u0000\u0331\u0330\u0001"+
- "\u0000\u0000\u0000\u0331\u0332\u0001\u0000\u0000\u0000\u0332o\u0001\u0000"+
- "\u0000\u0000\u0333\u0334\u0005R\u0000\u0000\u0334\u0337\u0003r9\u0000"+
- "\u0335\u0337\u0005N\u0000\u0000\u0336\u0333\u0001\u0000\u0000\u0000\u0336"+
- "\u0335\u0001\u0000\u0000\u0000\u0337q\u0001\u0000\u0000\u0000\u0338\u0339"+
- "\u0005%\u0000\u0000\u0339\u0346\u0005g\u0000\u0000\u033a\u033b\u0003\u00d0"+
- "h\u0000\u033b\u0340\u0005j\u0000\u0000\u033c\u033e\u0003t:\u0000\u033d"+
- "\u033f\u0005o\u0000\u0000\u033e\u033d\u0001\u0000\u0000\u0000\u033e\u033f"+
- "\u0001\u0000\u0000\u0000\u033f\u0341\u0001\u0000\u0000\u0000\u0340\u033c"+
- "\u0001\u0000\u0000\u0000\u0340\u0341\u0001\u0000\u0000\u0000\u0341\u0342"+
- "\u0001\u0000\u0000\u0000\u0342\u0343\u0005k\u0000\u0000\u0343\u0346\u0001"+
- "\u0000\u0000\u0000\u0344\u0346\u0003\u00aaU\u0000\u0345\u0338\u0001\u0000"+
- "\u0000\u0000\u0345\u033a\u0001\u0000\u0000\u0000\u0345\u0344\u0001\u0000"+
- "\u0000\u0000\u0346s\u0001\u0000\u0000\u0000\u0347\u034c\u0003r9\u0000"+
- "\u0348\u0349\u0005o\u0000\u0000\u0349\u034b\u0003r9\u0000\u034a\u0348"+
- "\u0001\u0000\u0000\u0000\u034b\u034e\u0001\u0000\u0000\u0000\u034c\u034a"+
- "\u0001\u0000\u0000\u0000\u034c\u034d\u0001\u0000\u0000\u0000\u034du\u0001"+
- "\u0000\u0000\u0000\u034e\u034c\u0001\u0000\u0000\u0000\u034f\u0354\u0005"+
- "j\u0000\u0000\u0350\u0351\u0005=\u0000\u0000\u0351\u0352\u0003\u00ecv"+
- "\u0000\u0352\u0353\u0003\u0176\u00bb\u0000\u0353\u0355\u0001\u0000\u0000"+
- "\u0000\u0354\u0350\u0001\u0000\u0000\u0000\u0354\u0355\u0001\u0000\u0000"+
- "\u0000\u0355\u0357\u0001\u0000\u0000\u0000\u0356\u0358\u0003\u00f8|\u0000"+
- "\u0357\u0356\u0001\u0000\u0000\u0000\u0357\u0358\u0001\u0000\u0000\u0000"+
- "\u0358\u0359\u0001\u0000\u0000\u0000\u0359\u035a\u0005k\u0000\u0000\u035a"+
- "w\u0001\u0000\u0000\u0000\u035b\u035e\u0003\u0158\u00ac\u0000\u035c\u035e"+
- "\u0005g\u0000\u0000\u035d\u035b\u0001\u0000\u0000\u0000\u035d\u035c\u0001"+
- "\u0000\u0000\u0000\u035e\u0367\u0001\u0000\u0000\u0000\u035f\u0364\u0005"+
- "j\u0000\u0000\u0360\u0362\u0003z=\u0000\u0361\u0363\u0005o\u0000\u0000"+
- "\u0362\u0361\u0001\u0000\u0000\u0000\u0362\u0363\u0001\u0000\u0000\u0000"+
- "\u0363\u0365\u0001\u0000\u0000\u0000\u0364\u0360\u0001\u0000\u0000\u0000"+
- "\u0364\u0365\u0001\u0000\u0000\u0000\u0365\u0366\u0001\u0000\u0000\u0000"+
- "\u0366\u0368\u0005k\u0000\u0000\u0367\u035f\u0001\u0000\u0000\u0000\u0367"+
- "\u0368\u0001\u0000\u0000\u0000\u0368y\u0001\u0000\u0000\u0000\u0369\u036e"+
- "\u0003|>\u0000\u036a\u036b\u0005o\u0000\u0000\u036b\u036d\u0003|>\u0000"+
- "\u036c\u036a\u0001\u0000\u0000\u0000\u036d\u0370\u0001\u0000\u0000\u0000"+
- "\u036e\u036c\u0001\u0000\u0000\u0000\u036e\u036f\u0001\u0000\u0000\u0000"+
- "\u036f{\u0001\u0000\u0000\u0000\u0370\u036e\u0001\u0000\u0000\u0000\u0371"+
- "\u0372\u0005g\u0000\u0000\u0372\u0374\u0005q\u0000\u0000\u0373\u0371\u0001"+
- "\u0000\u0000\u0000\u0373\u0374\u0001\u0000\u0000\u0000\u0374\u0375\u0001"+
- "\u0000\u0000\u0000\u0375\u0376\u0003\u00aaU\u0000\u0376}\u0001\u0000\u0000"+
- "\u0000\u0377\u0378\u0005I\u0000\u0000\u0378\u0379\u0003\u00aaU\u0000\u0379"+
- "\u037a\u0005\u000f\u0000\u0000\u037a\u037b\u0003x<\u0000\u037b\u037c\u0003"+
- "\u00f6{\u0000\u037c\u007f\u0001\u0000\u0000\u0000\u037d\u037e\u0003\u00c8"+
- "d\u0000\u037e\u037f\u0005\u000f\u0000\u0000\u037f\u0392\u0003\u00c8d\u0000"+
- "\u0380\u0386\u0005j\u0000\u0000\u0381\u0382\u0003\u0088D\u0000\u0382\u0383"+
- "\u0003\u0176\u00bb\u0000\u0383\u0385\u0001\u0000\u0000\u0000\u0384\u0381"+
- "\u0001\u0000\u0000\u0000\u0385\u0388\u0001\u0000\u0000\u0000\u0386\u0384"+
- "\u0001\u0000\u0000\u0000\u0386\u0387\u0001\u0000\u0000\u0000\u0387\u038e"+
- "\u0001\u0000\u0000\u0000\u0388\u0386\u0001\u0000\u0000\u0000\u0389\u038a"+
- "\u0003\u0082A\u0000\u038a\u038b\u0003\u0176\u00bb\u0000\u038b\u038d\u0001"+
- "\u0000\u0000\u0000\u038c\u0389\u0001\u0000\u0000\u0000\u038d\u0390\u0001"+
- "\u0000\u0000\u0000\u038e\u038c\u0001\u0000\u0000\u0000\u038e\u038f\u0001"+
- "\u0000\u0000\u0000\u038f\u0391\u0001\u0000\u0000\u0000\u0390\u038e\u0001"+
- "\u0000\u0000\u0000\u0391\u0393\u0005k\u0000\u0000\u0392\u0380\u0001\u0000"+
- "\u0000\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393\u0081\u0001\u0000"+
- "\u0000\u0000\u0394\u0396\u0005\u000e\u0000\u0000\u0395\u0394\u0001\u0000"+
- "\u0000\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u0397\u0001\u0000"+
- "\u0000\u0000\u0397\u0398\u0003\u0084B\u0000\u0398\u0399\u0005g\u0000\u0000"+
- "\u0399\u039b\u0003\u0146\u00a3\u0000\u039a\u039c\u0003\u00f6{\u0000\u039b"+
- "\u039a\u0001\u0000\u0000\u0000\u039b\u039c\u0001\u0000\u0000\u0000\u039c"+
- "\u0083\u0001\u0000\u0000\u0000\u039d\u039f\u0005h\u0000\u0000\u039e\u03a0"+
- "\u0005g\u0000\u0000\u039f\u039e\u0001\u0000\u0000\u0000\u039f\u03a0\u0001"+
- "\u0000\u0000\u0000\u03a0\u03a2\u0001\u0000\u0000\u0000\u03a1\u03a3\u0005"+
- "\u0089\u0000\u0000\u03a2\u03a1\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001"+
- "\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000\u03a4\u03a5\u0003"+
- "\u0134\u009a\u0000\u03a5\u03a6\u0005i\u0000\u0000\u03a6\u0085\u0001\u0000"+
- "\u0000\u0000\u03a7\u03ad\u0003\u00ba]\u0000\u03a8\u03a9\u0003\u00c8d\u0000"+
- "\u03a9\u03aa\u0005r\u0000\u0000\u03aa\u03ab\u0005g\u0000\u0000\u03ab\u03ad"+
- "\u0001\u0000\u0000\u0000\u03ac\u03a7\u0001\u0000\u0000\u0000\u03ac\u03a8"+
- "\u0001\u0000\u0000\u0000\u03ad\u0087\u0001\u0000\u0000\u0000\u03ae\u03af"+
- "\u00058\u0000\u0000\u03af\u03b0\u0005g\u0000\u0000\u03b0\u03b3\u0005u"+
- "\u0000\u0000\u03b1\u03b4\u0003\u0086C\u0000\u03b2\u03b4\u0003\u0156\u00ab"+
- "\u0000\u03b3\u03b1\u0001\u0000\u0000\u0000\u03b3\u03b2\u0001\u0000\u0000"+
- "\u0000\u03b4\u0089\u0001\u0000\u0000\u0000\u03b5\u03b6\u0005/\u0000\u0000"+
- "\u03b6\u03b7\u0005h\u0000\u0000\u03b7\u03ba\u0003\u00c8d\u0000\u03b8\u03b9"+
- "\u0005o\u0000\u0000\u03b9\u03bb\u0003\u00eew\u0000\u03ba\u03b8\u0001\u0000"+
- "\u0000\u0000\u03ba\u03bb\u0001\u0000\u0000\u0000\u03bb\u03bc\u0001\u0000"+
- "\u0000\u0000\u03bc\u03bd\u0005i\u0000\u0000\u03bd\u008b\u0001\u0000\u0000"+
- "\u0000\u03be\u03bf\u0005.\u0000\u0000\u03bf\u03c0\u0005h\u0000\u0000\u03c0"+
- "\u03c1\u0003\u00c8d\u0000\u03c1\u03c2\u0005i\u0000\u0000\u03c2\u008d\u0001"+
- "\u0000\u0000\u0000\u03c3\u03c6\u0003d2\u0000\u03c4\u03c7\u0003\u0090H"+
- "\u0000\u03c5\u03c7\u0003\u0092I\u0000\u03c6\u03c4\u0001\u0000\u0000\u0000"+
- "\u03c6\u03c5\u0001\u0000\u0000\u0000\u03c7\u008f\u0001\u0000\u0000\u0000"+
- "\u03c8\u03c9\u0005O\u0000\u0000\u03c9\u03ca\u0005g\u0000\u0000\u03ca\u03cc"+
- "\u0003\u0146\u00a3\u0000\u03cb\u03cd\u0003v;\u0000\u03cc\u03cb\u0001\u0000"+
- "\u0000\u0000\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u0091\u0001\u0000"+
- "\u0000\u0000\u03ce\u03cf\u0005O\u0000\u0000\u03cf\u03d0\u0003\u00a0P\u0000"+
- "\u03d0\u03d1\u0005g\u0000\u0000\u03d1\u03d3\u0003\u0146\u00a3\u0000\u03d2"+
- "\u03d4\u0003v;\u0000\u03d3\u03d2\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001"+
- "\u0000\u0000\u0000\u03d4\u0093\u0001\u0000\u0000\u0000\u03d5\u03d8\u0005"+
- "\u001b\u0000\u0000\u03d6\u03d9\u0003\u008eG\u0000\u03d7\u03d9\u0003\u00e6"+
- "s\u0000\u03d8\u03d6\u0001\u0000\u0000\u0000\u03d8\u03d7\u0001\u0000\u0000"+
- "\u0000\u03d9\u0095\u0001\u0000\u0000\u0000\u03da\u03db\u00058\u0000\u0000"+
- "\u03db\u03dc\u0005g\u0000\u0000\u03dc\u03de\u0003\u014a\u00a5\u0000\u03dd"+
- "\u03df\u0003\u0098L\u0000\u03de\u03dd\u0001\u0000\u0000\u0000\u03de\u03df"+
- "\u0001\u0000\u0000\u0000\u03df\u0097\u0001\u0000\u0000\u0000\u03e0\u03e1"+
- "\u0005j\u0000\u0000\u03e1\u03e2\u0003\u00aaU\u0000\u03e2\u03e3\u0003\u0176"+
- "\u00bb\u0000\u03e3\u03e4\u0005k\u0000\u0000\u03e4\u0099\u0001\u0000\u0000"+
- "\u0000\u03e5\u03e6\u00058\u0000\u0000\u03e6\u03e7\u0003\u00a0P\u0000\u03e7"+
- "\u03e8\u0005g\u0000\u0000\u03e8\u03ea\u0003\u014a\u00a5\u0000\u03e9\u03eb"+
- "\u0003\u0098L\u0000\u03ea\u03e9\u0001\u0000\u0000\u0000\u03ea\u03eb\u0001"+
- "\u0000\u0000\u0000\u03eb\u009b\u0001\u0000\u0000\u0000\u03ec\u03f4\u0003"+
- "\u0006\u0003\u0000\u03ed\u03f0\u0003\u00c8d\u0000\u03ee\u03ef\u0005n\u0000"+
- "\u0000\u03ef\u03f1\u0003\u00eew\u0000\u03f0\u03ee\u0001\u0000\u0000\u0000"+
- "\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f5\u0001\u0000\u0000\u0000"+
- "\u03f2\u03f3\u0005n\u0000\u0000\u03f3\u03f5\u0003\u00eew\u0000\u03f4\u03ed"+
- "\u0001\u0000\u0000\u0000\u03f4\u03f2\u0001\u0000\u0000\u0000\u03f5\u009d"+
- "\u0001\u0000\u0000\u0000\u03f6\u03f7\u0003\u0006\u0003\u0000\u03f7\u03f8"+
- "\u0005u\u0000\u0000\u03f8\u03f9\u0003\u00eew\u0000\u03f9\u009f\u0001\u0000"+
- "\u0000\u0000\u03fa\u03fc\u0005h\u0000\u0000\u03fb\u03fd\u0003\b\u0004"+
- "\u0000\u03fc\u03fb\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001\u0000\u0000"+
- "\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe\u0400\u0003\u00c8d\u0000"+
- "\u03ff\u0401\u0005o\u0000\u0000\u0400\u03ff\u0001\u0000\u0000\u0000\u0400"+
- "\u0401\u0001\u0000\u0000\u0000\u0401\u0402\u0001\u0000\u0000\u0000\u0402"+
- "\u0403\u0005i\u0000\u0000\u0403\u00a1\u0001\u0000\u0000\u0000\u0404\u0407"+
- "\u0003\u00a4R\u0000\u0405\u0407\u0003\u00a6S\u0000\u0406\u0404\u0001\u0000"+
- "\u0000\u0000\u0406\u0405\u0001\u0000\u0000\u0000\u0407\u00a3\u0001\u0000"+
- "\u0000\u0000\u0408\u040a\u0003\u00ecv\u0000\u0409\u0408\u0001\u0000\u0000"+
- "\u0000\u0409\u040a\u0001\u0000\u0000\u0000\u040a\u040b\u0001\u0000\u0000"+
- "\u0000\u040b\u040c\u0003\u00a8T\u0000\u040c\u00a5\u0001\u0000\u0000\u0000"+
- "\u040d\u040f\u0005\u001b\u0000\u0000\u040e\u0410\u0003\u00ecv\u0000\u040f"+
- "\u040e\u0001\u0000\u0000\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410"+
- "\u0411\u0001\u0000\u0000\u0000\u0411\u0412\u0003\u00a8T\u0000\u0412\u00a7"+
- "\u0001\u0000\u0000\u0000\u0413\u0415\u0005v\u0000\u0000\u0414\u0413\u0001"+
- "\u0000\u0000\u0000\u0414\u0415\u0001\u0000\u0000\u0000\u0415\u0416\u0001"+
- "\u0000\u0000\u0000\u0416\u0417\u0003\u00c8d\u0000\u0417\u00a9\u0001\u0000"+
- "\u0000\u0000\u0418\u0419\u0006U\uffff\uffff\u0000\u0419\u041a\u0007\u0006"+
- "\u0000\u0000\u041a\u042e\u0003\u00aaU\u000f\u041b\u042e\u0003\u00ba]\u0000"+
- "\u041c\u041d\u0005\u0019\u0000\u0000\u041d\u041e\u0003.\u0017\u0000\u041e"+
- "\u041f\u0005\u001c\u0000\u0000\u041f\u0420\u0003\u00aaU\u0003\u0420\u042e"+
- "\u0001\u0000\u0000\u0000\u0421\u0422\u0005\u001a\u0000\u0000\u0422\u0423"+
- "\u0003\u009eO\u0000\u0423\u0424\u0005\u001c\u0000\u0000\u0424\u0425\u0003"+
- "\u00aaU\u0002\u0425\u042e\u0001\u0000\u0000\u0000\u0426\u0427\u0007\u0007"+
- "\u0000\u0000\u0427\u0428\u0003&\u0013\u0000\u0428\u0429\u0005q\u0000\u0000"+
- "\u0429\u042a\u0005q\u0000\u0000\u042a\u042b\u0003*\u0015\u0000\u042b\u042c"+
- "\u0003\u00aaU\u0001\u042c\u042e\u0001\u0000\u0000\u0000\u042d\u0418\u0001"+
- "\u0000\u0000\u0000\u042d\u041b\u0001\u0000\u0000\u0000\u042d\u041c\u0001"+
- "\u0000\u0000\u0000\u042d\u0421\u0001\u0000\u0000\u0000\u042d\u0426\u0001"+
- "\u0000\u0000\u0000\u042e\u0452\u0001\u0000\u0000\u0000\u042f\u0430\n\r"+
- "\u0000\u0000\u0430\u0431\u0007\b\u0000\u0000\u0431\u0451\u0003\u00aaU"+
- "\u000e\u0432\u0433\n\f\u0000\u0000\u0433\u0434\u0007\t\u0000\u0000\u0434"+
- "\u0451\u0003\u00aaU\r\u0435\u0436\n\u000b\u0000\u0000\u0436\u0437\u0007"+
- "\n\u0000\u0000\u0437\u0451\u0003\u00aaU\f\u0438\u0439\n\n\u0000\u0000"+
- "\u0439\u043a\u0007\u000b\u0000\u0000\u043a\u0451\u0003\u00aaU\u000b\u043b"+
- "\u043c\n\t\u0000\u0000\u043c\u043d\u0007\f\u0000\u0000\u043d\u0451\u0003"+
- "\u00aaU\n\u043e\u043f\n\u0007\u0000\u0000\u043f\u0440\u0005x\u0000\u0000"+
- "\u0440\u0451\u0003\u00aaU\b\u0441\u0442\n\u0006\u0000\u0000\u0442\u0443"+
- "\u0005w\u0000\u0000\u0443\u0451\u0003\u00aaU\u0007\u0444\u0445\n\u0005"+
- "\u0000\u0000\u0445\u0446\u0005\"\u0000\u0000\u0446\u0451\u0003\u00aaU"+
- "\u0005\u0447\u0448\n\u0004\u0000\u0000\u0448\u0449\u0005%\u0000\u0000"+
- "\u0449\u044a\u0003\u00aaU\u0000\u044a\u044b\u0005q\u0000\u0000\u044b\u044c"+
- "\u0003\u00aaU\u0004\u044c\u0451\u0001\u0000\u0000\u0000\u044d\u044e\n"+
- "\b\u0000\u0000\u044e\u044f\u0005\u000f\u0000\u0000\u044f\u0451\u0003x"+
- "<\u0000\u0450\u042f\u0001\u0000\u0000\u0000\u0450\u0432\u0001\u0000\u0000"+
- "\u0000\u0450\u0435\u0001\u0000\u0000\u0000\u0450\u0438\u0001\u0000\u0000"+
- "\u0000\u0450\u043b\u0001\u0000\u0000\u0000\u0450\u043e\u0001\u0000\u0000"+
- "\u0000\u0450\u0441\u0001\u0000\u0000\u0000\u0450\u0444\u0001\u0000\u0000"+
- "\u0000\u0450\u0447\u0001\u0000\u0000\u0000\u0450\u044d\u0001\u0000\u0000"+
- "\u0000\u0451\u0454\u0001\u0000\u0000\u0000\u0452\u0450\u0001\u0000\u0000"+
- "\u0000\u0452\u0453\u0001\u0000\u0000\u0000\u0453\u00ab\u0001\u0000\u0000"+
- "\u0000\u0454\u0452\u0001\u0000\u0000\u0000\u0455\u046a\u0003\u0018\f\u0000"+
- "\u0456\u046a\u0003\u001a\r\u0000\u0457\u046a\u0003\u00b0X\u0000\u0458"+
- "\u046a\u0003\u00aeW\u0000\u0459\u046a\u0003\u00e6s\u0000\u045a\u046a\u0003"+
- "\u0106\u0083\u0000\u045b\u046a\u0003\u00fa}\u0000\u045c\u046a\u0003\u0132"+
- "\u0099\u0000\u045d\u046a\u0003\u0108\u0084\u0000\u045e\u046a\u0003\u010a"+
- "\u0085\u0000\u045f\u046a\u0003\u010c\u0086\u0000\u0460\u046a\u0003\u010e"+
- "\u0087\u0000\u0461\u046a\u0003\u0110\u0088\u0000\u0462\u046a\u0003\u00f6"+
- "{\u0000\u0463\u046a\u0003\u0112\u0089\u0000\u0464\u046a\u0003\u0114\u008a"+
- "\u0000\u0465\u046a\u0003\u0126\u0093\u0000\u0466\u046a\u0003\u00b2Y\u0000"+
- "\u0467\u046a\u0003\u00b6[\u0000\u0468\u046a\u0003~?\u0000\u0469\u0455"+
- "\u0001\u0000\u0000\u0000\u0469\u0456\u0001\u0000\u0000\u0000\u0469\u0457"+
- "\u0001\u0000\u0000\u0000\u0469\u0458\u0001\u0000\u0000\u0000\u0469\u0459"+
- "\u0001\u0000\u0000\u0000\u0469\u045a\u0001\u0000\u0000\u0000\u0469\u045b"+
- "\u0001\u0000\u0000\u0000\u0469\u045c\u0001\u0000\u0000\u0000\u0469\u045d"+
- "\u0001\u0000\u0000\u0000\u0469\u045e\u0001\u0000\u0000\u0000\u0469\u045f"+
- "\u0001\u0000\u0000\u0000\u0469\u0460\u0001\u0000\u0000\u0000\u0469\u0461"+
- "\u0001\u0000\u0000\u0000\u0469\u0462\u0001\u0000\u0000\u0000\u0469\u0463"+
- "\u0001\u0000\u0000\u0000\u0469\u0464\u0001\u0000\u0000\u0000\u0469\u0465"+
- "\u0001\u0000\u0000\u0000\u0469\u0466\u0001\u0000\u0000\u0000\u0469\u0467"+
- "\u0001\u0000\u0000\u0000\u0469\u0468\u0001\u0000\u0000\u0000\u046a\u00ad"+
- "\u0001\u0000\u0000\u0000\u046b\u046c\u0005$\u0000\u0000\u046c\u046d\u0003"+
- "\u00aaU\u0000\u046d\u00af\u0001\u0000\u0000\u0000\u046e\u046f\u0005Z\u0000"+
- "\u0000\u046f\u0471\u0003\u00aaU\u0000\u0470\u0472\u0003\u00f6{\u0000\u0471"+
- "\u0470\u0001\u0000\u0000\u0000\u0471\u0472\u0001\u0000\u0000\u0000\u0472"+
- "\u00b1\u0001\u0000\u0000\u0000\u0473\u0474\u0003\u00b4Z\u0000\u0474\u0475"+
- "\u0003\u012e\u0097\u0000\u0475\u00b3\u0001\u0000\u0000\u0000\u0476\u0477"+
- "\u0005\f\u0000\u0000\u0477\u0478\u0003\u00aaU\u0000\u0478\u0479\u0003"+
- "\u0176\u00bb\u0000\u0479\u047b\u0001\u0000\u0000\u0000\u047a\u0476\u0001"+
- "\u0000\u0000\u0000\u047b\u047e\u0001\u0000\u0000\u0000\u047c\u047a\u0001"+
- "\u0000\u0000\u0000\u047c\u047d\u0001\u0000\u0000\u0000\u047d\u0483\u0001"+
- "\u0000\u0000\u0000\u047e\u047c\u0001\u0000\u0000\u0000\u047f\u0480\u0005"+
- "\r\u0000\u0000\u0480\u0481\u0003h4\u0000\u0481\u0482\u0003\u0176\u00bb"+
- "\u0000\u0482\u0484\u0001\u0000\u0000\u0000\u0483\u047f\u0001\u0000\u0000"+
- "\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u00b5\u0001\u0000\u0000"+
- "\u0000\u0485\u0486\u0005S\u0000\u0000\u0486\u048b\u0003\u00aaU\u0000\u0487"+
- "\u0488\u0005S\u0000\u0000\u0488\u0489\u0007\u0001\u0000\u0000\u0489\u048b"+
- "\u0003.\u0017\u0000\u048a\u0485\u0001\u0000\u0000\u0000\u048a\u0487\u0001"+
- "\u0000\u0000\u0000\u048b\u00b7\u0001\u0000\u0000\u0000\u048c\u0495\u0005"+
- "\u0003\u0000\u0000\u048d\u0495\u0005\u0004\u0000\u0000\u048e\u0495\u0005"+
- "f\u0000\u0000\u048f\u0495\u0003\u0154\u00aa\u0000\u0490\u0495\u0003\u0168"+
- "\u00b4\u0000\u0491\u0495\u0005\u0001\u0000\u0000\u0492\u0495\u0005\u0091"+
- "\u0000\u0000\u0493\u0495\u0005\u0092\u0000\u0000\u0494\u048c\u0001\u0000"+
- "\u0000\u0000\u0494\u048d\u0001\u0000\u0000\u0000\u0494\u048e\u0001\u0000"+
- "\u0000\u0000\u0494\u048f\u0001\u0000\u0000\u0000\u0494\u0490\u0001\u0000"+
- "\u0000\u0000\u0494\u0491\u0001\u0000\u0000\u0000\u0494\u0492\u0001\u0000"+
- "\u0000\u0000\u0494\u0493\u0001\u0000\u0000\u0000\u0495\u00b9\u0001\u0000"+
- "\u0000\u0000\u0496\u0497\u0006]\uffff\uffff\u0000\u0497\u04a3\u0003\u0150"+
- "\u00a8\u0000\u0498\u04a3\u0003\u014c\u00a6\u0000\u0499\u04a3\u0003\u0172"+
- "\u00b9\u0000\u049a\u04a3\u0003 \u0010\u0000\u049b\u04a3\u0003\u008cF\u0000"+
- "\u049c\u04a3\u0003\u008aE\u0000\u049d\u049e\u0007\r\u0000\u0000\u049e"+
- "\u049f\u0005h\u0000\u0000\u049f\u04a0\u0003\u00aaU\u0000\u04a0\u04a1\u0005"+
- "i\u0000\u0000\u04a1\u04a3\u0001\u0000\u0000\u0000\u04a2\u0496\u0001\u0000"+
- "\u0000\u0000\u04a2\u0498\u0001\u0000\u0000\u0000\u04a2\u0499\u0001\u0000"+
- "\u0000\u0000\u04a2\u049a\u0001\u0000\u0000\u0000\u04a2\u049b\u0001\u0000"+
- "\u0000\u0000\u04a2\u049c\u0001\u0000\u0000\u0000\u04a2\u049d\u0001\u0000"+
- "\u0000\u0000\u04a3\u04ba\u0001\u0000\u0000\u0000\u04a4\u04a5\n\t\u0000"+
- "\u0000\u04a5\u04a6\u0005r\u0000\u0000\u04a6\u04b9\u0005g\u0000\u0000\u04a7"+
- "\u04a8\n\b\u0000\u0000\u04a8\u04b9\u0003\u016c\u00b6\u0000\u04a9\u04aa"+
- "\n\u0007\u0000\u0000\u04aa\u04b9\u0003\u00d6k\u0000\u04ab\u04ac\n\u0006"+
- "\u0000\u0000\u04ac\u04b9\u0003P(\u0000\u04ad\u04ae\n\u0005\u0000\u0000"+
- "\u04ae\u04b9\u0003\u016e\u00b7\u0000\u04af\u04b0\n\u0004\u0000\u0000\u04b0"+
- "\u04b9\u0003\u0170\u00b8\u0000\u04b1\u04b2\n\u0003\u0000\u0000\u04b2\u04b3"+
- "\u0003\u0170\u00b8\u0000\u04b3\u04b4\u0005\u0010\u0000\u0000\u04b4\u04b5"+
- "\u0003x<\u0000\u04b5\u04b9\u0001\u0000\u0000\u0000\u04b6\u04b7\n\u0002"+
- "\u0000\u0000\u04b7\u04b9\u0003\u00c0`\u0000\u04b8\u04a4\u0001\u0000\u0000"+
- "\u0000\u04b8\u04a7\u0001\u0000\u0000\u0000\u04b8\u04a9\u0001\u0000\u0000"+
- "\u0000\u04b8\u04ab\u0001\u0000\u0000\u0000\u04b8\u04ad\u0001\u0000\u0000"+
- "\u0000\u04b8\u04af\u0001\u0000\u0000\u0000\u04b8\u04b1\u0001\u0000\u0000"+
- "\u0000\u04b8\u04b6\u0001\u0000\u0000\u0000\u04b9\u04bc\u0001\u0000\u0000"+
- "\u0000\u04ba\u04b8\u0001\u0000\u0000\u0000\u04ba\u04bb\u0001\u0000\u0000"+
- "\u0000\u04bb\u00bb\u0001\u0000\u0000\u0000\u04bc\u04ba\u0001\u0000\u0000"+
- "\u0000\u04bd\u04be\u0003d2\u0000\u04be\u04bf\u0003\u00be_\u0000\u04bf"+
- "\u00bd\u0001\u0000\u0000\u0000\u04c0\u04c2\u0005O\u0000\u0000\u04c1\u04c3"+
- "\u0005g\u0000\u0000\u04c2\u04c1\u0001\u0000\u0000\u0000\u04c2\u04c3\u0001"+
- "\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c6\u0003"+
- "\u0146\u00a3\u0000\u04c5\u04c7\u0003v;\u0000\u04c6\u04c5\u0001\u0000\u0000"+
- "\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7\u00bf\u0001\u0000\u0000"+
- "\u0000\u04c8\u04ca\u0005&\u0000\u0000\u04c9\u04cb\u0003\u00eew\u0000\u04ca"+
- "\u04c9\u0001\u0000\u0000\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb"+
- "\u04cd\u0001\u0000\u0000\u0000\u04cc\u04ce\u0005o\u0000\u0000\u04cd\u04cc"+
- "\u0001\u0000\u0000\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000\u04ce\u04cf"+
- "\u0001\u0000\u0000\u0000\u04cf\u04d0\u0005\'\u0000\u0000\u04d0\u00c1\u0001"+
- "\u0000\u0000\u0000\u04d1\u04d2\u0005P\u0000\u0000\u04d2\u04dc\u0005j\u0000"+
- "\u0000\u04d3\u04d7\u0003\u00c6c\u0000\u04d4\u04d7\u0003\u0134\u009a\u0000"+
- "\u04d5\u04d7\u0003\u00c4b\u0000\u04d6\u04d3\u0001\u0000\u0000\u0000\u04d6"+
- "\u04d4\u0001\u0000\u0000\u0000\u04d6\u04d5\u0001\u0000\u0000\u0000\u04d7"+
- "\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0003\u0176\u00bb\u0000\u04d9"+
- "\u04db\u0001\u0000\u0000\u0000\u04da\u04d6\u0001\u0000\u0000\u0000\u04db"+
- "\u04de\u0001\u0000\u0000\u0000\u04dc\u04da\u0001\u0000\u0000\u0000\u04dc"+
- "\u04dd\u0001\u0000\u0000\u0000\u04dd\u04df\u0001\u0000\u0000\u0000\u04de"+
- "\u04dc\u0001\u0000\u0000\u0000\u04df\u04e0\u0005k\u0000\u0000\u04e0\u00c3"+
- "\u0001\u0000\u0000\u0000\u04e1\u04e2\u00058\u0000\u0000\u04e2\u04e3\u0005"+
- "g\u0000\u0000\u04e3\u04e4\u0003\u014a\u00a5\u0000\u04e4\u00c5\u0001\u0000"+
- "\u0000\u0000\u04e5\u04e7\u0005\u001b\u0000\u0000\u04e6\u04e5\u0001\u0000"+
- "\u0000\u0000\u04e6\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001\u0000"+
- "\u0000\u0000\u04e8\u04e9\u0003d2\u0000\u04e9\u04ea\u0005g\u0000\u0000"+
- "\u04ea\u04eb\u0003\u014a\u00a5\u0000\u04eb\u04ec\u0003\u0148\u00a4\u0000"+
- "\u04ec\u04f5\u0001\u0000\u0000\u0000\u04ed\u04ef\u0005\u001b\u0000\u0000"+
- "\u04ee\u04ed\u0001\u0000\u0000\u0000\u04ee\u04ef\u0001\u0000\u0000\u0000"+
- "\u04ef\u04f0\u0001\u0000\u0000\u0000\u04f0\u04f1\u0003d2\u0000\u04f1\u04f2"+
- "\u0005g\u0000\u0000\u04f2\u04f3\u0003\u014a\u00a5\u0000\u04f3\u04f5\u0001"+
- "\u0000\u0000\u0000\u04f4\u04e6\u0001\u0000\u0000\u0000\u04f4\u04ee\u0001"+
- "\u0000\u0000\u0000\u04f5\u00c7\u0001\u0000\u0000\u0000\u04f6\u04fe\u0003"+
- "\u0134\u009a\u0000\u04f7\u04fe\u0003\u00cae\u0000\u04f8\u04fe\u0003T*"+
- "\u0000\u04f9\u04fa\u0005h\u0000\u0000\u04fa\u04fb\u0003\u00c8d\u0000\u04fb"+
- "\u04fc\u0005i\u0000\u0000\u04fc\u04fe\u0001\u0000\u0000\u0000\u04fd\u04f6"+
- "\u0001\u0000\u0000\u0000\u04fd\u04f7\u0001\u0000\u0000\u0000\u04fd\u04f8"+
- "\u0001\u0000\u0000\u0000\u04fd\u04f9\u0001\u0000\u0000\u0000\u04fe\u00c9"+
- "\u0001\u0000\u0000\u0000\u04ff\u0509\u0003\u0136\u009b\u0000\u0500\u0509"+
- "\u0003\u0166\u00b3\u0000\u0501\u0509\u0003\u013c\u009e\u0000\u0502\u0509"+
- "\u0003\u0144\u00a2\u0000\u0503\u0509\u0003\u00c2a\u0000\u0504\u0509\u0003"+
- "\u013e\u009f\u0000\u0505\u0509\u0003\u0140\u00a0\u0000\u0506\u0509\u0003"+
- "\u0142\u00a1\u0000\u0507\u0509\u0003\u00ccf\u0000\u0508\u04ff\u0001\u0000"+
- "\u0000\u0000\u0508\u0500\u0001\u0000\u0000\u0000\u0508\u0501\u0001\u0000"+
- "\u0000\u0000\u0508\u0502\u0001\u0000\u0000\u0000\u0508\u0503\u0001\u0000"+
- "\u0000\u0000\u0508\u0504\u0001\u0000\u0000\u0000\u0508\u0505\u0001\u0000"+
- "\u0000\u0000\u0508\u0506\u0001\u0000\u0000\u0000\u0508\u0507\u0001\u0000"+
- "\u0000\u0000\u0509\u00cb\u0001\u0000\u0000\u0000\u050a\u050b\u00058\u0000"+
- "\u0000\u050b\u050c\u0003\u00ceg\u0000\u050c\u00cd\u0001\u0000\u0000\u0000"+
- "\u050d\u0519\u0005h\u0000\u0000\u050e\u0513\u0003\u00c8d\u0000\u050f\u0510"+
- "\u0005o\u0000\u0000\u0510\u0512\u0003\u00c8d\u0000\u0511\u050f\u0001\u0000"+
- "\u0000\u0000\u0512\u0515\u0001\u0000\u0000\u0000\u0513\u0511\u0001\u0000"+
- "\u0000\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0517\u0001\u0000"+
- "\u0000\u0000\u0515\u0513\u0001\u0000\u0000\u0000\u0516\u0518\u0005o\u0000"+
- "\u0000\u0517\u0516\u0001\u0000\u0000\u0000\u0517\u0518\u0001\u0000\u0000"+
- "\u0000\u0518\u051a\u0001\u0000\u0000\u0000\u0519\u050e\u0001\u0000\u0000"+
- "\u0000\u0519\u051a\u0001\u0000\u0000\u0000\u051a\u051b\u0001\u0000\u0000"+
- "\u0000\u051b\u051c\u0005i\u0000\u0000\u051c\u00cf\u0001\u0000\u0000\u0000"+
- "\u051d\u0525\u0003\u0166\u00b3\u0000\u051e\u0525\u0003\u0136\u009b\u0000"+
- "\u051f\u0525\u0003\u00d2i\u0000\u0520\u0525\u0003\u013e\u009f\u0000\u0521"+
- "\u0525\u0003\u0140\u00a0\u0000\u0522\u0525\u0003T*\u0000\u0523\u0525\u0003"+
- "\u0134\u009a\u0000\u0524\u051d\u0001\u0000\u0000\u0000\u0524\u051e\u0001"+
- "\u0000\u0000\u0000\u0524\u051f\u0001\u0000\u0000\u0000\u0524\u0520\u0001"+
- "\u0000\u0000\u0000\u0524\u0521\u0001\u0000\u0000\u0000\u0524\u0522\u0001"+
- "\u0000\u0000\u0000\u0524\u0523\u0001\u0000\u0000\u0000\u0525\u00d1\u0001"+
- "\u0000\u0000\u0000\u0526\u0527\u0005l\u0000\u0000\u0527\u0528\u0005v\u0000"+
- "\u0000\u0528\u0529\u0005m\u0000\u0000\u0529\u052a\u0003\u013a\u009d\u0000"+
- "\u052a\u00d3\u0001\u0000\u0000\u0000\u052b\u052d\u0005\u001b\u0000\u0000"+
- "\u052c\u052b\u0001\u0000\u0000\u0000\u052c\u052d\u0001\u0000\u0000\u0000"+
- "\u052d\u0532\u0001\u0000\u0000\u0000\u052e\u052f\u0003\u00ecv\u0000\u052f"+
- "\u0530\u0003\u00c8d\u0000\u0530\u0533\u0001\u0000\u0000\u0000\u0531\u0533"+
- "\u0003\u016a\u00b5\u0000\u0532\u052e\u0001\u0000\u0000\u0000\u0532\u0531"+
- "\u0001\u0000\u0000\u0000\u0533\u0535\u0001\u0000\u0000\u0000\u0534\u0536"+
- "\u0003\u0168\u00b4\u0000\u0535\u0534\u0001\u0000\u0000\u0000\u0535\u0536"+
- "\u0001\u0000\u0000\u0000\u0536\u00d5\u0001\u0000\u0000\u0000\u0537\u0547"+
- "\u0005l\u0000\u0000\u0538\u053a\u0003\u00d8l\u0000\u0539\u0538\u0001\u0000"+
- "\u0000\u0000\u0539\u053a\u0001\u0000\u0000\u0000\u053a\u053b\u0001\u0000"+
- "\u0000\u0000\u053b\u053d\u0005q\u0000\u0000\u053c\u053e\u0003\u00dam\u0000"+
- "\u053d\u053c\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000\u0000\u0000"+
- "\u053e\u0548\u0001\u0000\u0000\u0000\u053f\u0541\u0003\u00d8l\u0000\u0540"+
- "\u053f\u0001\u0000\u0000\u0000\u0540\u0541\u0001\u0000\u0000\u0000\u0541"+
- "\u0542\u0001\u0000\u0000\u0000\u0542\u0543\u0005q\u0000\u0000\u0543\u0544"+
- "\u0003\u00dam\u0000\u0544\u0545\u0005q\u0000\u0000\u0545\u0546\u0003\u00dc"+
- "n\u0000\u0546\u0548\u0001\u0000\u0000\u0000\u0547\u0539\u0001\u0000\u0000"+
- "\u0000\u0547\u0540\u0001\u0000\u0000\u0000\u0548\u0549\u0001\u0000\u0000"+
- "\u0000\u0549\u054a\u0005m\u0000\u0000\u054a\u00d7\u0001\u0000\u0000\u0000"+
- "\u054b\u054c\u0003\u00aaU\u0000\u054c\u00d9\u0001\u0000\u0000\u0000\u054d"+
- "\u054e\u0003\u00aaU\u0000\u054e\u00db\u0001\u0000\u0000\u0000\u054f\u0550"+
- "\u0003\u00aaU\u0000\u0550\u00dd\u0001\u0000\u0000\u0000\u0551\u0553\u0007"+
- "\u000e\u0000\u0000\u0552\u0551\u0001\u0000\u0000\u0000\u0552\u0553\u0001"+
- "\u0000\u0000\u0000\u0553\u0554\u0001\u0000\u0000\u0000\u0554\u0555\u0005"+
- "n\u0000\u0000\u0555\u00df\u0001\u0000\u0000\u0000\u0556\u0557\u0003\u00ee"+
- "w\u0000\u0557\u0558\u0005n\u0000\u0000\u0558\u055d\u0001\u0000\u0000\u0000"+
- "\u0559\u055a\u0003\u0006\u0003\u0000\u055a\u055b\u0005u\u0000\u0000\u055b"+
- "\u055d\u0001\u0000\u0000\u0000\u055c\u0556\u0001\u0000\u0000\u0000\u055c"+
- "\u0559\u0001\u0000\u0000\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d"+
- "\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0005_\u0000\u0000\u055f\u0564"+
- "\u0003\u00aaU\u0000\u0560\u0562\u0005L\u0000\u0000\u0561\u0563\u0005g"+
- "\u0000\u0000\u0562\u0561\u0001\u0000\u0000\u0000\u0562\u0563\u0001\u0000"+
- "\u0000\u0000\u0563\u0565\u0001\u0000\u0000\u0000\u0564\u0560\u0001\u0000"+
- "\u0000\u0000\u0564\u0565\u0001\u0000\u0000\u0000\u0565\u00e1\u0001\u0000"+
- "\u0000\u0000\u0566\u0567\u0005Z\u0000\u0000\u0567\u0568\u0005g\u0000\u0000"+
- "\u0568\u00e3\u0001\u0000\u0000\u0000\u0569\u056a\u0003\u0168\u00b4\u0000"+
- "\u056a\u00e5\u0001\u0000\u0000\u0000\u056b\u056f\u0003\u00e8t\u0000\u056c"+
- "\u056f\u0003\u00f0x\u0000\u056d\u056f\u0003\u00f4z\u0000\u056e\u056b\u0001"+
- "\u0000\u0000\u0000\u056e\u056c\u0001\u0000\u0000\u0000\u056e\u056d\u0001"+
- "\u0000\u0000\u0000\u056f\u00e7\u0001\u0000\u0000\u0000\u0570\u057c\u0005"+
- "\\\u0000\u0000\u0571\u057d\u0003\u00eau\u0000\u0572\u0578\u0005h\u0000"+
- "\u0000\u0573\u0574\u0003\u00eau\u0000\u0574\u0575\u0003\u0176\u00bb\u0000"+
- "\u0575\u0577\u0001\u0000\u0000\u0000\u0576\u0573\u0001\u0000\u0000\u0000"+
- "\u0577\u057a\u0001\u0000\u0000\u0000\u0578\u0576\u0001\u0000\u0000\u0000"+
- "\u0578\u0579\u0001\u0000\u0000\u0000\u0579\u057b\u0001\u0000\u0000\u0000"+
- "\u057a\u0578\u0001\u0000\u0000\u0000\u057b\u057d\u0005i\u0000\u0000\u057c"+
- "\u0571\u0001\u0000\u0000\u0000\u057c\u0572\u0001\u0000\u0000\u0000\u057d"+
- "\u00e9\u0001\u0000\u0000\u0000\u057e\u0584\u0003\u00ecv\u0000\u057f\u0581"+
- "\u0003\u00c8d\u0000\u0580\u057f\u0001\u0000\u0000\u0000\u0580\u0581\u0001"+
- "\u0000\u0000\u0000\u0581\u0582\u0001\u0000\u0000\u0000\u0582\u0583\u0005"+
- "n\u0000\u0000\u0583\u0585\u0003\u00eew\u0000\u0584\u0580\u0001\u0000\u0000"+
- "\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u00eb\u0001\u0000\u0000"+
- "\u0000\u0586\u058b\u0005g\u0000\u0000\u0587\u0588\u0005o\u0000\u0000\u0588"+
- "\u058a\u0005g\u0000\u0000\u0589\u0587\u0001\u0000\u0000\u0000\u058a\u058d"+
- "\u0001\u0000\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058b\u058c"+
- "\u0001\u0000\u0000\u0000\u058c\u00ed\u0001\u0000\u0000\u0000\u058d\u058b"+
- "\u0001\u0000\u0000\u0000\u058e\u0593\u0003\u00aaU\u0000\u058f\u0590\u0005"+
- "o\u0000\u0000\u0590\u0592\u0003\u00aaU\u0000\u0591\u058f\u0001\u0000\u0000"+
- "\u0000\u0592\u0595\u0001\u0000\u0000\u0000\u0593\u0591\u0001\u0000\u0000"+
- "\u0000\u0593\u0594\u0001\u0000\u0000\u0000\u0594\u00ef\u0001\u0000\u0000"+
- "\u0000\u0595\u0593\u0001\u0000\u0000\u0000\u0596\u05a2\u0005`\u0000\u0000"+
- "\u0597\u05a3\u0003\u00f2y\u0000\u0598\u059e\u0005h\u0000\u0000\u0599\u059a"+
- "\u0003\u00f2y\u0000\u059a\u059b\u0003\u0176\u00bb\u0000\u059b\u059d\u0001"+
- "\u0000\u0000\u0000\u059c\u0599\u0001\u0000\u0000\u0000\u059d\u05a0\u0001"+
- "\u0000\u0000\u0000\u059e\u059c\u0001\u0000\u0000\u0000\u059e\u059f\u0001"+
- "\u0000\u0000\u0000\u059f\u05a1\u0001\u0000\u0000\u0000\u05a0\u059e\u0001"+
- "\u0000\u0000\u0000\u05a1\u05a3\u0005i\u0000\u0000\u05a2\u0597\u0001\u0000"+
- "\u0000\u0000\u05a2\u0598\u0001\u0000\u0000\u0000\u05a3\u00f1\u0001\u0000"+
- "\u0000\u0000\u05a4\u05a6\u0005g\u0000\u0000\u05a5\u05a7\u0005n\u0000\u0000"+
- "\u05a6\u05a5\u0001\u0000\u0000\u0000\u05a6\u05a7\u0001\u0000\u0000\u0000"+
- "\u05a7\u05a8\u0001\u0000\u0000\u0000\u05a8\u05a9\u0003\u00c8d\u0000\u05a9"+
- "\u00f3\u0001\u0000\u0000\u0000\u05aa\u05b6\u0005e\u0000\u0000\u05ab\u05b7"+
- "\u0003\u009cN\u0000\u05ac\u05b2\u0005h\u0000\u0000\u05ad\u05ae\u0003\u009c"+
- "N\u0000\u05ae\u05af\u0003\u0176\u00bb\u0000\u05af\u05b1\u0001\u0000\u0000"+
- "\u0000\u05b0\u05ad\u0001\u0000\u0000\u0000\u05b1\u05b4\u0001\u0000\u0000"+
- "\u0000\u05b2\u05b0\u0001\u0000\u0000\u0000\u05b2\u05b3\u0001\u0000\u0000"+
- "\u0000\u05b3\u05b5\u0001\u0000\u0000\u0000\u05b4\u05b2\u0001\u0000\u0000"+
- "\u0000\u05b5\u05b7\u0005i\u0000\u0000\u05b6\u05ab\u0001\u0000\u0000\u0000"+
- "\u05b6\u05ac\u0001\u0000\u0000\u0000\u05b7\u00f5\u0001\u0000\u0000\u0000"+
- "\u05b8\u05ba\u0005j\u0000\u0000\u05b9\u05bb\u0003\u00f8|\u0000\u05ba\u05b9"+
- "\u0001\u0000\u0000\u0000\u05ba\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bc"+
- "\u0001\u0000\u0000\u0000\u05bc\u05bd\u0005k\u0000\u0000\u05bd\u00f7\u0001"+
- "\u0000\u0000\u0000\u05be\u05c0\u0005p\u0000\u0000\u05bf\u05be\u0001\u0000"+
- "\u0000\u0000\u05bf\u05c0\u0001\u0000\u0000\u0000\u05c0\u05c6\u0001\u0000"+
- "\u0000\u0000\u05c1\u05c3\u0005\u00a1\u0000\u0000\u05c2\u05c1\u0001\u0000"+
- "\u0000\u0000\u05c2\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c6\u0001\u0000"+
- "\u0000\u0000\u05c4\u05c6\u0004|\u0012\u0000\u05c5\u05bf\u0001\u0000\u0000"+
- "\u0000\u05c5\u05c2\u0001\u0000\u0000\u0000\u05c5\u05c4\u0001\u0000\u0000"+
- "\u0000\u05c6\u05c7\u0001\u0000\u0000\u0000\u05c7\u05c8\u0003\u00acV\u0000"+
- "\u05c8\u05c9\u0003\u0176\u00bb\u0000\u05c9\u05cb\u0001\u0000\u0000\u0000"+
- "\u05ca\u05c5\u0001\u0000\u0000\u0000\u05cb\u05cc\u0001\u0000\u0000\u0000"+
- "\u05cc\u05ca\u0001\u0000\u0000\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000"+
- "\u05cd\u00f9\u0001\u0000\u0000\u0000\u05ce\u05d4\u0003\u00fe\u007f\u0000"+
- "\u05cf\u05d4\u0003\u0100\u0080\u0000\u05d0\u05d4\u0003\u0102\u0081\u0000"+
- "\u05d1\u05d4\u0003\u00fc~\u0000\u05d2\u05d4\u0003\u009eO\u0000\u05d3\u05ce"+
- "\u0001\u0000\u0000\u0000\u05d3\u05cf\u0001\u0000\u0000\u0000\u05d3\u05d0"+
- "\u0001\u0000\u0000\u0000\u05d3\u05d1\u0001\u0000\u0000\u0000\u05d3\u05d2"+
- "\u0001\u0000\u0000\u0000\u05d4\u00fb\u0001\u0000\u0000\u0000\u05d5\u05d6"+
- "\u0003\u00aaU\u0000\u05d6\u00fd\u0001\u0000\u0000\u0000\u05d7\u05d8\u0003"+
- "\u00aaU\u0000\u05d8\u05d9\u0005\u008b\u0000\u0000\u05d9\u05da\u0003\u00aa"+
- "U\u0000\u05da\u00ff\u0001\u0000\u0000\u0000\u05db\u05dc\u0003\u00aaU\u0000"+
- "\u05dc\u05dd\u0007\u000f\u0000\u0000\u05dd\u0101\u0001\u0000\u0000\u0000"+
- "\u05de\u05df\u0003\u00eew\u0000\u05df\u05e0\u0003\u00deo\u0000\u05e0\u05e1"+
- "\u0003\u00eew\u0000\u05e1\u0103\u0001\u0000\u0000\u0000\u05e2\u05e3\u0007"+
- "\u0010\u0000\u0000\u05e3\u0105\u0001\u0000\u0000\u0000\u05e4\u05e5\u0005"+
- "g\u0000\u0000\u05e5\u05e7\u0005q\u0000\u0000\u05e6\u05e8\u0003\u00acV"+
- "\u0000\u05e7\u05e6\u0001\u0000\u0000\u0000\u05e7\u05e8\u0001\u0000\u0000"+
- "\u0000\u05e8\u0107\u0001\u0000\u0000\u0000\u05e9\u05eb\u0005d\u0000\u0000"+
- "\u05ea\u05ec\u0003\u00eew\u0000\u05eb\u05ea\u0001\u0000\u0000\u0000\u05eb"+
- "\u05ec\u0001\u0000\u0000\u0000\u05ec\u0109\u0001\u0000\u0000\u0000\u05ed"+
- "\u05ef\u0005M\u0000\u0000\u05ee\u05f0\u0005g\u0000\u0000\u05ef\u05ee\u0001"+
- "\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u010b\u0001"+
- "\u0000\u0000\u0000\u05f1\u05f3\u0005a\u0000\u0000\u05f2\u05f4\u0005g\u0000"+
- "\u0000\u05f3\u05f2\u0001\u0000\u0000\u0000\u05f3\u05f4\u0001\u0000\u0000"+
- "\u0000\u05f4\u010d\u0001\u0000\u0000\u0000\u05f5\u05f6\u0005Y\u0000\u0000"+
- "\u05f6\u05f7\u0005g\u0000\u0000\u05f7\u010f\u0001\u0000\u0000\u0000\u05f8"+
- "\u05f9\u0005]\u0000\u0000\u05f9\u0111\u0001\u0000\u0000\u0000\u05fa\u0603"+
- "\u0005^\u0000\u0000\u05fb\u0604\u0003\u00aaU\u0000\u05fc\u05fd\u0003\u0176"+
- "\u00bb\u0000\u05fd\u05fe\u0003\u00aaU\u0000\u05fe\u0604\u0001\u0000\u0000"+
- "\u0000\u05ff\u0600\u0003\u00fa}\u0000\u0600\u0601\u0003\u0176\u00bb\u0000"+
- "\u0601\u0602\u0003\u00aaU\u0000\u0602\u0604\u0001\u0000\u0000\u0000\u0603"+
- "\u05fb\u0001\u0000\u0000\u0000\u0603\u05fc\u0001\u0000\u0000\u0000\u0603"+
- "\u05ff\u0001\u0000\u0000\u0000\u0604\u0605\u0001\u0000\u0000\u0000\u0605"+
- "\u060b\u0003\u00f6{\u0000\u0606\u0609\u0005X\u0000\u0000\u0607\u060a\u0003"+
- "\u0112\u0089\u0000\u0608\u060a\u0003\u00f6{\u0000\u0609\u0607\u0001\u0000"+
- "\u0000\u0000\u0609\u0608\u0001\u0000\u0000\u0000\u060a\u060c\u0001\u0000"+
- "\u0000\u0000\u060b\u0606\u0001\u0000\u0000\u0000\u060b\u060c\u0001\u0000"+
- "\u0000\u0000\u060c\u0113\u0001\u0000\u0000\u0000\u060d\u0610\u0003\u0116"+
- "\u008b\u0000\u060e\u0610\u0003\u011c\u008e\u0000\u060f\u060d\u0001\u0000"+
- "\u0000\u0000\u060f\u060e\u0001\u0000\u0000\u0000\u0610\u0115\u0001\u0000"+
- "\u0000\u0000\u0611\u061c\u0005[\u0000\u0000\u0612\u0614\u0003\u00aaU\u0000"+
- "\u0613\u0612\u0001\u0000\u0000\u0000\u0613\u0614\u0001\u0000\u0000\u0000"+
- "\u0614\u061d\u0001\u0000\u0000\u0000\u0615\u0617\u0003\u00fa}\u0000\u0616"+
- "\u0615\u0001\u0000\u0000\u0000\u0616\u0617\u0001\u0000\u0000\u0000\u0617"+
- "\u0618\u0001\u0000\u0000\u0000\u0618\u061a\u0003\u0176\u00bb\u0000\u0619"+
- "\u061b\u0003\u00aaU\u0000\u061a\u0619\u0001\u0000\u0000\u0000\u061a\u061b"+
- "\u0001\u0000\u0000\u0000\u061b\u061d\u0001\u0000\u0000\u0000\u061c\u0613"+
- "\u0001\u0000\u0000\u0000\u061c\u0616\u0001\u0000\u0000\u0000\u061d\u061e"+
- "\u0001\u0000\u0000\u0000\u061e\u0622\u0005j\u0000\u0000\u061f\u0621\u0003"+
- "\u0118\u008c\u0000\u0620\u061f\u0001\u0000\u0000\u0000\u0621\u0624\u0001"+
- "\u0000\u0000\u0000\u0622\u0620\u0001\u0000\u0000\u0000\u0622\u0623\u0001"+
- "\u0000\u0000\u0000\u0623\u0625\u0001\u0000\u0000\u0000\u0624\u0622\u0001"+
- "\u0000\u0000\u0000\u0625\u0626\u0005k\u0000\u0000\u0626\u0117\u0001\u0000"+
- "\u0000\u0000\u0627\u0628\u0003\u011a\u008d\u0000\u0628\u062a\u0005q\u0000"+
- "\u0000\u0629\u062b\u0003\u00f8|\u0000\u062a\u0629\u0001\u0000\u0000\u0000"+
- "\u062a\u062b\u0001\u0000\u0000\u0000\u062b\u0119\u0001\u0000\u0000\u0000"+
- "\u062c\u062d\u0005R\u0000\u0000\u062d\u0630\u0003\u00eew\u0000\u062e\u0630"+
- "\u0005N\u0000\u0000\u062f\u062c\u0001\u0000\u0000\u0000\u062f\u062e\u0001"+
- "\u0000\u0000\u0000\u0630\u011b\u0001\u0000\u0000\u0000\u0631\u063a\u0005"+
- "[\u0000\u0000\u0632\u063b\u0003\u011e\u008f\u0000\u0633\u0634\u0003\u0176"+
- "\u00bb\u0000\u0634\u0635\u0003\u011e\u008f\u0000\u0635\u063b\u0001\u0000"+
- "\u0000\u0000\u0636\u0637\u0003\u00fa}\u0000\u0637\u0638\u0003\u0176\u00bb"+
- "\u0000\u0638\u0639\u0003\u011e\u008f\u0000\u0639\u063b\u0001\u0000\u0000"+
- "\u0000\u063a\u0632\u0001\u0000\u0000\u0000\u063a\u0633\u0001\u0000\u0000"+
- "\u0000\u063a\u0636\u0001\u0000\u0000\u0000\u063b\u063c\u0001\u0000\u0000"+
- "\u0000\u063c\u0640\u0005j\u0000\u0000\u063d\u063f\u0003\u0120\u0090\u0000"+
- "\u063e\u063d\u0001\u0000\u0000\u0000\u063f\u0642\u0001\u0000\u0000\u0000"+
- "\u0640\u063e\u0001\u0000\u0000\u0000\u0640\u0641\u0001\u0000\u0000\u0000"+
- "\u0641\u0643\u0001\u0000\u0000\u0000\u0642\u0640\u0001\u0000\u0000\u0000"+
- "\u0643\u0644\u0005k\u0000\u0000\u0644\u011d\u0001\u0000\u0000\u0000\u0645"+
- "\u0646\u0005g\u0000\u0000\u0646\u0648\u0005u\u0000\u0000\u0647\u0645\u0001"+
- "\u0000\u0000\u0000\u0647\u0648\u0001\u0000\u0000\u0000\u0648\u0649\u0001"+
- "\u0000\u0000\u0000\u0649\u064a\u0003\u00ba]\u0000\u064a\u064b\u0005r\u0000"+
- "\u0000\u064b\u064c\u0005h\u0000\u0000\u064c\u064d\u0005`\u0000\u0000\u064d"+
- "\u064e\u0005i\u0000\u0000\u064e\u011f\u0001\u0000\u0000\u0000\u064f\u0650"+
- "\u0003\u0122\u0091\u0000\u0650\u0652\u0005q\u0000\u0000\u0651\u0653\u0003"+
- "\u00f8|\u0000\u0652\u0651\u0001\u0000\u0000\u0000\u0652\u0653\u0001\u0000"+
- "\u0000\u0000\u0653\u0121\u0001\u0000\u0000\u0000\u0654\u0655\u0005R\u0000"+
- "\u0000\u0655\u0658\u0003\u0124\u0092\u0000\u0656\u0658\u0005N\u0000\u0000"+
- "\u0657\u0654\u0001\u0000\u0000\u0000\u0657\u0656\u0001\u0000\u0000\u0000"+
- "\u0658\u0123\u0001\u0000\u0000\u0000\u0659\u065c\u0003\u00c8d\u0000\u065a"+
- "\u065c\u0005f\u0000\u0000\u065b\u0659\u0001\u0000\u0000\u0000\u065b\u065a"+
- "\u0001\u0000\u0000\u0000\u065c\u0664\u0001\u0000\u0000\u0000\u065d\u0660"+
- "\u0005o\u0000\u0000\u065e\u0661\u0003\u00c8d\u0000\u065f\u0661\u0005f"+
- "\u0000\u0000\u0660\u065e\u0001\u0000\u0000\u0000\u0660\u065f\u0001\u0000"+
- "\u0000\u0000\u0661\u0663\u0001\u0000\u0000\u0000\u0662\u065d\u0001\u0000"+
- "\u0000\u0000\u0663\u0666\u0001\u0000\u0000\u0000\u0664\u0662\u0001\u0000"+
- "\u0000\u0000\u0664\u0665\u0001\u0000\u0000\u0000\u0665\u0125\u0001\u0000"+
- "\u0000\u0000\u0666\u0664\u0001\u0000\u0000\u0000\u0667\u0668\u0005Q\u0000"+
- "\u0000\u0668\u066c\u0005j\u0000\u0000\u0669\u066b\u0003\u0128\u0094\u0000"+
- "\u066a\u0669\u0001\u0000\u0000\u0000\u066b\u066e\u0001\u0000\u0000\u0000"+
- "\u066c\u066a\u0001\u0000\u0000\u0000\u066c\u066d\u0001\u0000\u0000\u0000"+
- "\u066d\u066f\u0001\u0000\u0000\u0000\u066e\u066c\u0001\u0000\u0000\u0000"+
- "\u066f\u0670\u0005k\u0000\u0000\u0670\u0127\u0001\u0000\u0000\u0000\u0671"+
- "\u0672\u0003\u012a\u0095\u0000\u0672\u0674\u0005q\u0000\u0000\u0673\u0675"+
- "\u0003\u00f8|\u0000\u0674\u0673\u0001\u0000\u0000\u0000\u0674\u0675\u0001"+
- "\u0000\u0000\u0000\u0675\u0129\u0001\u0000\u0000\u0000\u0676\u0679\u0005"+
- "R\u0000\u0000\u0677\u067a\u0003\u00fe\u007f\u0000\u0678\u067a\u0003\u012c"+
- "\u0096\u0000\u0679\u0677\u0001\u0000\u0000\u0000\u0679\u0678\u0001\u0000"+
- "\u0000\u0000\u067a\u067d\u0001\u0000\u0000\u0000\u067b\u067d\u0005N\u0000"+
- "\u0000\u067c\u0676\u0001\u0000\u0000\u0000\u067c\u067b\u0001\u0000\u0000"+
- "\u0000\u067d\u012b\u0001\u0000\u0000\u0000\u067e\u067f\u0003\u00eew\u0000"+
- "\u067f\u0680\u0005n\u0000\u0000\u0680\u0685\u0001\u0000\u0000\u0000\u0681"+
- "\u0682\u0003\u00ecv\u0000\u0682\u0683\u0005u\u0000\u0000\u0683\u0685\u0001"+
- "\u0000\u0000\u0000\u0684\u067e\u0001\u0000\u0000\u0000\u0684\u0681\u0001"+
- "\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685\u0686\u0001"+
- "\u0000\u0000\u0000\u0686\u0687\u0003\u00aaU\u0000\u0687\u012d\u0001\u0000"+
- "\u0000\u0000\u0688\u0690\u0005b\u0000\u0000\u0689\u068b\u0003\u00aaU\u0000"+
- "\u068a\u0689\u0001\u0000\u0000\u0000\u068a\u068b\u0001\u0000\u0000\u0000"+
- "\u068b\u0691\u0001\u0000\u0000\u0000\u068c\u0691\u0003\u0130\u0098\u0000"+
- "\u068d\u068f\u0003\u00e0p\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068e"+
- "\u068f\u0001\u0000\u0000\u0000\u068f\u0691\u0001\u0000\u0000\u0000\u0690"+
- "\u068a\u0001\u0000\u0000\u0000\u0690\u068c\u0001\u0000\u0000\u0000\u0690"+
- "\u068e\u0001\u0000\u0000\u0000\u0691\u0692\u0001\u0000\u0000\u0000\u0692"+
- "\u0693\u0003\u00f6{\u0000\u0693\u012f\u0001\u0000\u0000\u0000\u0694\u0696"+
- "\u0003\u00fa}\u0000\u0695\u0694\u0001\u0000\u0000\u0000\u0695\u0696\u0001"+
- "\u0000\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u0699\u0003"+
- "\u0176\u00bb\u0000\u0698\u069a\u0003\u00aaU\u0000\u0699\u0698\u0001\u0000"+
- "\u0000\u0000\u0699\u069a\u0001\u0000\u0000\u0000\u069a\u069b\u0001\u0000"+
- "\u0000\u0000\u069b\u069d\u0003\u0176\u00bb\u0000\u069c\u069e\u0003\u00fa"+
- "}\u0000\u069d\u069c\u0001\u0000\u0000\u0000\u069d\u069e\u0001\u0000\u0000"+
- "\u0000\u069e\u0131\u0001\u0000\u0000\u0000\u069f\u06a0\u0005T\u0000\u0000"+
- "\u06a0\u06a1\u0003\u00aaU\u0000\u06a1\u0133\u0001\u0000\u0000\u0000\u06a2"+
- "\u06a5\u0003\u0158\u00ac\u0000\u06a3\u06a5\u0005g\u0000\u0000\u06a4\u06a2"+
- "\u0001\u0000\u0000\u0000\u06a4\u06a3\u0001\u0000\u0000\u0000\u06a5\u0135"+
- "\u0001\u0000\u0000\u0000\u06a6\u06a7\u0005l\u0000\u0000\u06a7\u06a8\u0003"+
- "\u0138\u009c\u0000\u06a8\u06a9\u0005m\u0000\u0000\u06a9\u06aa\u0003\u013a"+
- "\u009d\u0000\u06aa\u0137\u0001\u0000\u0000\u0000\u06ab\u06ac\u0003\u00aa"+
- "U\u0000\u06ac\u0139\u0001\u0000\u0000\u0000\u06ad\u06ae\u0003\u00c8d\u0000"+
- "\u06ae\u013b\u0001\u0000\u0000\u0000\u06af\u06b0\u0005\u0089\u0000\u0000"+
- "\u06b0\u06b1\u0003\u00c8d\u0000\u06b1\u013d\u0001\u0000\u0000\u0000\u06b2"+
- "\u06b3\u0005l\u0000\u0000\u06b3\u06b4\u0005m\u0000\u0000\u06b4\u06b5\u0003"+
- "\u013a\u009d\u0000\u06b5\u013f\u0001\u0000\u0000\u0000\u06b6\u06b7\u0005"+
- "U\u0000\u0000\u06b7\u06b8\u0005l\u0000\u0000\u06b8\u06b9\u0003\u00c8d"+
- "\u0000\u06b9\u06ba\u0005m\u0000\u0000\u06ba\u06bb\u0003\u013a\u009d\u0000"+
- "\u06bb\u0141\u0001\u0000\u0000\u0000\u06bc\u06c2\u0005W\u0000\u0000\u06bd"+
- "\u06be\u0005W\u0000\u0000\u06be\u06c2\u0005\u008b\u0000\u0000\u06bf\u06c0"+
- "\u0005\u008b\u0000\u0000\u06c0\u06c2\u0005W\u0000\u0000\u06c1\u06bc\u0001"+
- "\u0000\u0000\u0000\u06c1\u06bd\u0001\u0000\u0000\u0000\u06c1\u06bf\u0001"+
- "\u0000\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000\u0000\u06c3\u06c4\u0003"+
- "\u013a\u009d\u0000\u06c4\u0143\u0001\u0000\u0000\u0000\u06c5\u06c6\u0005"+
- "O\u0000\u0000\u06c6\u06c7\u0003\u0146\u00a3\u0000\u06c7\u0145\u0001\u0000"+
- "\u0000\u0000\u06c8\u06c9\u0003\u014a\u00a5\u0000\u06c9\u06ca\u0003\u0148"+
- "\u00a4\u0000\u06ca\u06cd\u0001\u0000\u0000\u0000\u06cb\u06cd\u0003\u014a"+
- "\u00a5\u0000\u06cc\u06c8\u0001\u0000\u0000\u0000\u06cc\u06cb\u0001\u0000"+
- "\u0000\u0000\u06cd\u0147\u0001\u0000\u0000\u0000\u06ce\u06d1\u0003\u014a"+
- "\u00a5\u0000\u06cf\u06d1\u0003\u00c8d\u0000\u06d0\u06ce\u0001\u0000\u0000"+
- "\u0000\u06d0\u06cf\u0001\u0000\u0000\u0000\u06d1\u0149\u0001\u0000\u0000"+
- "\u0000\u06d2\u06de\u0005h\u0000\u0000\u06d3\u06d8\u0003\u00a2Q\u0000\u06d4"+
- "\u06d5\u0005o\u0000\u0000\u06d5\u06d7\u0003\u00a2Q\u0000\u06d6\u06d4\u0001"+
- "\u0000\u0000\u0000\u06d7\u06da\u0001\u0000\u0000\u0000\u06d8\u06d6\u0001"+
- "\u0000\u0000\u0000\u06d8\u06d9\u0001\u0000\u0000\u0000\u06d9\u06dc\u0001"+
- "\u0000\u0000\u0000\u06da\u06d8\u0001\u0000\u0000\u0000\u06db\u06dd\u0005"+
- "o\u0000\u0000\u06dc\u06db\u0001\u0000\u0000\u0000\u06dc\u06dd\u0001\u0000"+
- "\u0000\u0000\u06dd\u06df\u0001\u0000\u0000\u0000\u06de\u06d3\u0001\u0000"+
- "\u0000\u0000\u06de\u06df\u0001\u0000\u0000\u0000\u06df\u06e0\u0001\u0000"+
- "\u0000\u0000\u06e0\u06e1\u0005i\u0000\u0000\u06e1\u014b\u0001\u0000\u0000"+
- "\u0000\u06e2\u06e3\u0003\u014e\u00a7\u0000\u06e3\u06e4\u0005h\u0000\u0000"+
- "\u06e4\u06e6\u0003\u00aaU\u0000\u06e5\u06e7\u0005o\u0000\u0000\u06e6\u06e5"+
- "\u0001\u0000\u0000\u0000\u06e6\u06e7\u0001\u0000\u0000\u0000\u06e7\u06e8"+
- "\u0001\u0000\u0000\u0000\u06e8\u06e9\u0005i\u0000\u0000\u06e9\u014d\u0001"+
- "\u0000\u0000\u0000\u06ea\u06f0\u0003\u00cae\u0000\u06eb\u06ec\u0005h\u0000"+
- "\u0000\u06ec\u06ed\u0003\u014e\u00a7\u0000\u06ed\u06ee\u0005i\u0000\u0000"+
- "\u06ee\u06f0\u0001\u0000\u0000\u0000\u06ef\u06ea\u0001\u0000\u0000\u0000"+
- "\u06ef\u06eb\u0001\u0000\u0000\u0000\u06f0\u014f\u0001\u0000\u0000\u0000"+
- "\u06f1\u06f8\u0003\u0152\u00a9\u0000\u06f2\u06f8\u0003\u0156\u00ab\u0000"+
- "\u06f3\u06f4\u0005h\u0000\u0000\u06f4\u06f5\u0003\u00aaU\u0000\u06f5\u06f6"+
- "\u0005i\u0000\u0000\u06f6\u06f8\u0001\u0000\u0000\u0000\u06f7\u06f1\u0001"+
- "\u0000\u0000\u0000\u06f7\u06f2\u0001\u0000\u0000\u0000\u06f7\u06f3\u0001"+
- "\u0000\u0000\u0000\u06f8\u0151\u0001\u0000\u0000\u0000\u06f9\u06fd\u0003"+
- "\u00b8\\\u0000\u06fa\u06fd\u0003\u015a\u00ad\u0000\u06fb\u06fd\u0003\u00bc"+
- "^\u0000\u06fc\u06f9\u0001\u0000\u0000\u0000\u06fc\u06fa\u0001\u0000\u0000"+
- "\u0000\u06fc\u06fb\u0001\u0000\u0000\u0000\u06fd\u0153\u0001\u0000\u0000"+
- "\u0000\u06fe\u06ff\u0007\u0011\u0000\u0000\u06ff\u0155\u0001\u0000\u0000"+
- "\u0000\u0700\u0701\u0005g\u0000\u0000\u0701\u0157\u0001\u0000\u0000\u0000"+
- "\u0702\u0703\u0005g\u0000\u0000\u0703\u0704\u0005r\u0000\u0000\u0704\u0705"+
- "\u0005g\u0000\u0000\u0705\u0159\u0001\u0000\u0000\u0000\u0706\u0707\u0003"+
- "\u00d0h\u0000\u0707\u0708\u0003\u015c\u00ae\u0000\u0708\u015b\u0001\u0000"+
- "\u0000\u0000\u0709\u070e\u0005j\u0000\u0000\u070a\u070c\u0003\u015e\u00af"+
- "\u0000\u070b\u070d\u0005o\u0000\u0000\u070c\u070b\u0001\u0000\u0000\u0000"+
- "\u070c\u070d\u0001\u0000\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000"+
- "\u070e\u070a\u0001\u0000\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000"+
- "\u070f\u0710\u0001\u0000\u0000\u0000\u0710\u0711\u0005k\u0000\u0000\u0711"+
- "\u015d\u0001\u0000\u0000\u0000\u0712\u0717\u0003\u0160\u00b0\u0000\u0713"+
- "\u0714\u0005o\u0000\u0000\u0714\u0716\u0003\u0160\u00b0\u0000\u0715\u0713"+
- "\u0001\u0000\u0000\u0000\u0716\u0719\u0001\u0000\u0000\u0000\u0717\u0715"+
- "\u0001\u0000\u0000\u0000\u0717\u0718\u0001\u0000\u0000\u0000\u0718\u015f"+
- "\u0001\u0000\u0000\u0000\u0719\u0717\u0001\u0000\u0000\u0000\u071a\u071b"+
- "\u0003\u0162\u00b1\u0000\u071b\u071c\u0005q\u0000\u0000\u071c\u071e\u0001"+
- "\u0000\u0000\u0000\u071d\u071a\u0001\u0000\u0000\u0000\u071d\u071e\u0001"+
- "\u0000\u0000\u0000\u071e\u071f\u0001\u0000\u0000\u0000\u071f\u0720\u0003"+
- "\u0164\u00b2\u0000\u0720\u0161\u0001\u0000\u0000\u0000\u0721\u0724\u0003"+
- "\u00aaU\u0000\u0722\u0724\u0003\u015c\u00ae\u0000\u0723\u0721\u0001\u0000"+
- "\u0000\u0000\u0723\u0722\u0001\u0000\u0000\u0000\u0724\u0163\u0001\u0000"+
- "\u0000\u0000\u0725\u0728\u0003\u00aaU\u0000\u0726\u0728\u0003\u015c\u00ae"+
- "\u0000\u0727\u0725\u0001\u0000\u0000\u0000\u0727\u0726\u0001\u0000\u0000"+
- "\u0000\u0728\u0165\u0001\u0000\u0000\u0000\u0729\u072a\u0005V\u0000\u0000"+
- "\u072a\u0730\u0005j\u0000\u0000\u072b\u072c\u0003\u00d4j\u0000\u072c\u072d"+
- "\u0003\u0176\u00bb\u0000\u072d\u072f\u0001\u0000\u0000\u0000\u072e\u072b"+
- "\u0001\u0000\u0000\u0000\u072f\u0732\u0001\u0000\u0000\u0000\u0730\u072e"+
- "\u0001\u0000\u0000\u0000\u0730\u0731\u0001\u0000\u0000\u0000\u0731\u0733"+
- "\u0001\u0000\u0000\u0000\u0732\u0730\u0001\u0000\u0000\u0000\u0733\u0734"+
- "\u0005k\u0000\u0000\u0734\u0167\u0001\u0000\u0000\u0000\u0735\u0736\u0007"+
- "\u0012\u0000\u0000\u0736\u0169\u0001\u0000\u0000\u0000\u0737\u0739\u0005"+
- "\u0089\u0000\u0000\u0738\u0737\u0001\u0000\u0000\u0000\u0738\u0739\u0001"+
- "\u0000\u0000\u0000\u0739\u073a\u0001\u0000\u0000\u0000\u073a\u073b\u0003"+
- "\u0134\u009a\u0000\u073b\u016b\u0001\u0000\u0000\u0000\u073c\u073d\u0005"+
- "l\u0000\u0000\u073d\u073e\u0003\u00aaU\u0000\u073e\u073f\u0005m\u0000"+
- "\u0000\u073f\u016d\u0001\u0000\u0000\u0000\u0740\u0741\u0005r\u0000\u0000"+
- "\u0741\u0742\u0005h\u0000\u0000\u0742\u0743\u0003\u00c8d\u0000\u0743\u0744"+
- "\u0005i\u0000\u0000\u0744\u016f\u0001\u0000\u0000\u0000\u0745\u0754\u0005"+
- "h\u0000\u0000\u0746\u074d\u0003\u00eew\u0000\u0747\u074a\u0003\u014e\u00a7"+
- "\u0000\u0748\u0749\u0005o\u0000\u0000\u0749\u074b\u0003\u00eew\u0000\u074a"+
- "\u0748\u0001\u0000\u0000\u0000\u074a\u074b\u0001\u0000\u0000\u0000\u074b"+
- "\u074d\u0001\u0000\u0000\u0000\u074c\u0746\u0001\u0000\u0000\u0000\u074c"+
- "\u0747\u0001\u0000\u0000\u0000\u074d\u074f\u0001\u0000\u0000\u0000\u074e"+
- "\u0750\u0005v\u0000\u0000\u074f\u074e\u0001\u0000\u0000\u0000\u074f\u0750"+
- "\u0001\u0000\u0000\u0000\u0750\u0752\u0001\u0000\u0000\u0000\u0751\u0753"+
- "\u0005o\u0000\u0000\u0752\u0751\u0001\u0000\u0000\u0000\u0752\u0753\u0001"+
- "\u0000\u0000\u0000\u0753\u0755\u0001\u0000\u0000\u0000\u0754\u074c\u0001"+
- "\u0000\u0000\u0000\u0754\u0755\u0001\u0000\u0000\u0000\u0755\u0756\u0001"+
- "\u0000\u0000\u0000\u0756\u0757\u0005i\u0000\u0000\u0757\u0171\u0001\u0000"+
- "\u0000\u0000\u0758\u0759\u0003\u014e\u00a7\u0000\u0759\u075a\u0005r\u0000"+
- "\u0000\u075a\u075b\u0005g\u0000\u0000\u075b\u0173\u0001\u0000\u0000\u0000"+
- "\u075c\u075d\u0003\u00c8d\u0000\u075d\u0175\u0001\u0000\u0000\u0000\u075e"+
- "\u0763\u0005p\u0000\u0000\u075f\u0763\u0005\u0000\u0000\u0001\u0760\u0763"+
- "\u0005\u00a1\u0000\u0000\u0761\u0763\u0004\u00bb\u0013\u0000\u0762\u075e"+
- "\u0001\u0000\u0000\u0000\u0762\u075f\u0001\u0000\u0000\u0000\u0762\u0760"+
- "\u0001\u0000\u0000\u0000\u0762\u0761\u0001\u0000\u0000\u0000\u0763\u0177"+
- "\u0001\u0000\u0000\u0000\u00c3\u0186\u018b\u0192\u019c\u01a2\u01a8\u01b2"+
- "\u01bc\u01ca\u01ce\u01d7\u01e3\u01e7\u01ed\u01f6\u0200\u0213\u0221\u0225"+
- "\u022c\u0234\u023d\u025d\u0265\u0286\u0299\u02a8\u02b5\u02be\u02cc\u02d5"+
- "\u02e1\u02e7\u02fb\u0302\u0307\u030c\u0316\u0319\u031d\u0321\u0329\u0331"+
- "\u0336\u033e\u0340\u0345\u034c\u0354\u0357\u035d\u0362\u0364\u0367\u036e"+
- "\u0373\u0386\u038e\u0392\u0395\u039b\u039f\u03a2\u03ac\u03b3\u03ba\u03c6"+
- "\u03cc\u03d3\u03d8\u03de\u03ea\u03f0\u03f4\u03fc\u0400\u0406\u0409\u040f"+
- "\u0414\u042d\u0450\u0452\u0469\u0471\u047c\u0483\u048a\u0494\u04a2\u04b8"+
- "\u04ba\u04c2\u04c6\u04ca\u04cd\u04d6\u04dc\u04e6\u04ee\u04f4\u04fd\u0508"+
- "\u0513\u0517\u0519\u0524\u052c\u0532\u0535\u0539\u053d\u0540\u0547\u0552"+
- "\u055c\u0562\u0564\u056e\u0578\u057c\u0580\u0584\u058b\u0593\u059e\u05a2"+
- "\u05a6\u05b2\u05b6\u05ba\u05bf\u05c2\u05c5\u05cc\u05d3\u05e7\u05eb\u05ef"+
- "\u05f3\u0603\u0609\u060b\u060f\u0613\u0616\u061a\u061c\u0622\u062a\u062f"+
- "\u063a\u0640\u0647\u0652\u0657\u065b\u0660\u0664\u066c\u0674\u0679\u067c"+
- "\u0684\u068a\u068e\u0690\u0695\u0699\u069d\u06a4\u06c1\u06cc\u06d0\u06d8"+
- "\u06dc\u06de\u06e6\u06ef\u06f7\u06fc\u070c\u070e\u0717\u071d\u0723\u0727"+
- "\u0730\u0738\u074a\u074c\u074f\u0752\u0754\u0762";
+ "\u0010\u0003\u0010\u021e\b\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001"+
+ "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001"+
+ "\u0013\u0005\u0013\u022a\b\u0013\n\u0013\f\u0013\u022d\t\u0013\u0001\u0013"+
+ "\u0003\u0013\u0230\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014"+
+ "\u0235\b\u0014\n\u0014\f\u0014\u0238\t\u0014\u0001\u0014\u0001\u0014\u0001"+
+ "\u0015\u0005\u0015\u023d\b\u0015\n\u0015\f\u0015\u0240\t\u0015\u0001\u0016"+
+ "\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0246\b\u0016\n\u0016"+
+ "\f\u0016\u0249\t\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+
+ "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019"+
+ "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+
+ "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b"+
+ "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+
+ "\u0001\u001c\u0003\u001c\u0268\b\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+
+ "\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u0270\b\u001d\u0001\u001e"+
+ "\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+
+ "\u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001"+
+ "!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+
+ "$\u0001$\u0001$\u0001$\u0001$\u0003$\u0291\b$\u0001$\u0001$\u0001%\u0001"+
+ "%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001"+
+ "&\u0001&\u0005&\u02a2\b&\n&\f&\u02a5\t&\u0001&\u0001&\u0001\'\u0001\'"+
+ "\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0005(\u02b1\b(\n(\f(\u02b4"+
+ "\t(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+
+ "*\u0003*\u02c0\b*\u0001+\u0001+\u0001+\u0001+\u0001+\u0005+\u02c7\b+\n"+
+ "+\f+\u02ca\t+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,"+
+ "\u0001,\u0001,\u0001,\u0003,\u02d7\b,\u0001-\u0001-\u0001-\u0001-\u0001"+
+ "-\u0005-\u02de\b-\n-\f-\u02e1\t-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+
+ ".\u0001.\u0005.\u02ea\b.\n.\f.\u02ed\t.\u0001.\u0001.\u0001/\u0003/\u02f2"+
+ "\b/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u0001"+
+ "1\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00031\u0306"+
+ "\b1\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00032\u030f\b2\u0001"+
+ "2\u00052\u0312\b2\n2\f2\u0315\t2\u00012\u00012\u00032\u0319\b2\u00012"+
+ "\u00032\u031c\b2\u00013\u00043\u031f\b3\u000b3\f3\u0320\u00014\u00014"+
+ "\u00014\u00054\u0326\b4\n4\f4\u0329\t4\u00015\u00015\u00015\u00035\u032e"+
+ "\b5\u00015\u00015\u00016\u00016\u00016\u00056\u0335\b6\n6\f6\u0338\t6"+
+ "\u00017\u00017\u00017\u00037\u033d\b7\u00017\u00017\u00017\u00018\u0001"+
+ "8\u00018\u00018\u00018\u00018\u00018\u00018\u00038\u034a\b8\u00019\u0003"+
+ "9\u034d\b9\u00019\u00019\u00039\u0351\b9\u0001:\u0001:\u0003:\u0355\b"+
+ ":\u0001;\u0001;\u0001;\u0001;\u0005;\u035b\b;\n;\f;\u035e\t;\u0001;\u0001"+
+ ";\u0001<\u0001<\u0001<\u0003<\u0365\b<\u0001=\u0001=\u0001=\u0003=\u036a"+
+ "\b=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0003>\u0372\b>\u0003>\u0374"+
+ "\b>\u0001>\u0001>\u0001>\u0003>\u0379\b>\u0001?\u0001?\u0001?\u0005?\u037e"+
+ "\b?\n?\f?\u0381\t?\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u0388\b@"+
+ "\u0001@\u0003@\u038b\b@\u0001@\u0001@\u0001A\u0001A\u0003A\u0391\bA\u0001"+
+ "A\u0001A\u0001A\u0003A\u0396\bA\u0003A\u0398\bA\u0001A\u0003A\u039b\b"+
+ "A\u0001B\u0001B\u0001B\u0005B\u03a0\bB\nB\fB\u03a3\tB\u0001C\u0001C\u0003"+
+ "C\u03a7\bC\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+
+ "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0005E\u03b8\bE\nE\fE\u03bb"+
+ "\tE\u0001E\u0001E\u0001E\u0005E\u03c0\bE\nE\fE\u03c3\tE\u0001E\u0003E"+
+ "\u03c6\bE\u0001F\u0003F\u03c9\bF\u0001F\u0001F\u0001F\u0001F\u0003F\u03cf"+
+ "\bF\u0001G\u0001G\u0003G\u03d3\bG\u0001G\u0003G\u03d6\bG\u0001G\u0001"+
+ "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0003H\u03e0\bH\u0001I\u0001"+
+ "I\u0001I\u0001I\u0001I\u0003I\u03e7\bI\u0001J\u0001J\u0001J\u0001J\u0001"+
+ "J\u0003J\u03ee\bJ\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+
+ "L\u0001L\u0001L\u0003L\u03fa\bL\u0001M\u0001M\u0001M\u0001M\u0003M\u0400"+
+ "\bM\u0001N\u0001N\u0001N\u0001N\u0001N\u0003N\u0407\bN\u0001O\u0001O\u0001"+
+ "O\u0003O\u040c\bO\u0001P\u0001P\u0001P\u0001P\u0003P\u0412\bP\u0001Q\u0001"+
+ "Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0003R\u041e"+
+ "\bR\u0001S\u0001S\u0001S\u0001S\u0003S\u0424\bS\u0001S\u0001S\u0003S\u0428"+
+ "\bS\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0003U\u0430\bU\u0001U\u0001"+
+ "U\u0003U\u0434\bU\u0001U\u0001U\u0001V\u0001V\u0003V\u043a\bV\u0001W\u0003"+
+ "W\u043d\bW\u0001W\u0001W\u0001X\u0001X\u0003X\u0443\bX\u0001X\u0001X\u0001"+
+ "Y\u0003Y\u0448\bY\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u0461\bZ\u0001Z\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "Z\u0005Z\u0484\bZ\nZ\fZ\u0487\tZ\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+
+ "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+
+ "[\u0001[\u0001[\u0001[\u0001[\u0003[\u049d\b[\u0001\\\u0001\\\u0001\\"+
+ "\u0001]\u0001]\u0001]\u0003]\u04a5\b]\u0001^\u0001^\u0001^\u0001_\u0001"+
+ "_\u0001_\u0001_\u0005_\u04ae\b_\n_\f_\u04b1\t_\u0001_\u0001_\u0001_\u0001"+
+ "_\u0003_\u04b7\b_\u0001`\u0001`\u0001`\u0001`\u0001`\u0003`\u04be\b`\u0001"+
+ "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04c8\ba\u0001"+
+ "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+
+ "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u04da\bb\u0001b\u0001b\u0001"+
+ "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+
+ "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0005b\u04f0\bb\nb"+
+ "\fb\u04f3\tb\u0001c\u0001c\u0001c\u0001d\u0001d\u0003d\u04fa\bd\u0001"+
+ "d\u0001d\u0003d\u04fe\bd\u0001e\u0001e\u0003e\u0502\be\u0001e\u0003e\u0505"+
+ "\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0003f\u050e\bf\u0001"+
+ "f\u0001f\u0005f\u0512\bf\nf\ff\u0515\tf\u0001f\u0001f\u0001g\u0001g\u0001"+
+ "g\u0001g\u0001h\u0003h\u051e\bh\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+
+ "h\u0003h\u0526\bh\u0001h\u0001h\u0001h\u0001h\u0003h\u052c\bh\u0001i\u0001"+
+ "i\u0001i\u0001i\u0001i\u0001i\u0001i\u0003i\u0535\bi\u0001j\u0001j\u0001"+
+ "j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0003j\u0540\bj\u0001k\u0001"+
+ "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0005l\u0549\bl\nl\fl\u054c\tl\u0001"+
+ "l\u0003l\u054f\bl\u0003l\u0551\bl\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+
+ "m\u0001m\u0001m\u0001m\u0003m\u055c\bm\u0001n\u0001n\u0001n\u0001n\u0001"+
+ "n\u0001o\u0003o\u0564\bo\u0001o\u0001o\u0001o\u0001o\u0003o\u056a\bo\u0001"+
+ "o\u0003o\u056d\bo\u0001p\u0001p\u0003p\u0571\bp\u0001p\u0001p\u0003p\u0575"+
+ "\bp\u0001p\u0003p\u0578\bp\u0001p\u0001p\u0001p\u0001p\u0001p\u0003p\u057f"+
+ "\bp\u0001p\u0001p\u0001q\u0001q\u0001r\u0001r\u0001s\u0001s\u0001t\u0003"+
+ "t\u058a\bt\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0003"+
+ "u\u0594\bu\u0001u\u0001u\u0001u\u0001u\u0003u\u059a\bu\u0003u\u059c\b"+
+ "u\u0001v\u0001v\u0001v\u0001w\u0001w\u0001x\u0001x\u0001x\u0003x\u05a6"+
+ "\bx\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0005y\u05ae\by\ny\fy\u05b1"+
+ "\ty\u0001y\u0003y\u05b4\by\u0001z\u0001z\u0003z\u05b8\bz\u0001z\u0001"+
+ "z\u0003z\u05bc\bz\u0001{\u0001{\u0001{\u0005{\u05c1\b{\n{\f{\u05c4\t{"+
+ "\u0001|\u0001|\u0001|\u0005|\u05c9\b|\n|\f|\u05cc\t|\u0001}\u0001}\u0001"+
+ "}\u0001}\u0001}\u0001}\u0005}\u05d4\b}\n}\f}\u05d7\t}\u0001}\u0003}\u05da"+
+ "\b}\u0001~\u0001~\u0003~\u05de\b~\u0001~\u0001~\u0001\u007f\u0001\u007f"+
+ "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0005\u007f\u05e8\b\u007f"+
+ "\n\u007f\f\u007f\u05eb\t\u007f\u0001\u007f\u0003\u007f\u05ee\b\u007f\u0001"+
+ "\u0080\u0001\u0080\u0003\u0080\u05f2\b\u0080\u0001\u0080\u0001\u0080\u0001"+
+ "\u0081\u0003\u0081\u05f7\b\u0081\u0001\u0081\u0003\u0081\u05fa\b\u0081"+
+ "\u0001\u0081\u0003\u0081\u05fd\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081"+
+ "\u0004\u0081\u0602\b\u0081\u000b\u0081\f\u0081\u0603\u0001\u0082\u0001"+
+ "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0003\u0082\u060b\b\u0082\u0001"+
+ "\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+
+ "\u0085\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+
+ "\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0003"+
+ "\u0088\u061f\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u0623\b\u0089"+
+ "\u0001\u008a\u0001\u008a\u0003\u008a\u0627\b\u008a\u0001\u008b\u0001\u008b"+
+ "\u0003\u008b\u062b\b\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d"+
+ "\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+
+ "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u063b\b\u008e"+
+ "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u0641\b\u008e"+
+ "\u0003\u008e\u0643\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0647\b"+
+ "\u008f\u0001\u0090\u0001\u0090\u0003\u0090\u064b\b\u0090\u0001\u0090\u0003"+
+ "\u0090\u064e\b\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0652\b\u0090"+
+ "\u0003\u0090\u0654\b\u0090\u0001\u0090\u0001\u0090\u0005\u0090\u0658\b"+
+ "\u0090\n\u0090\f\u0090\u065b\t\u0090\u0001\u0090\u0001\u0090\u0001\u0091"+
+ "\u0001\u0091\u0001\u0091\u0003\u0091\u0662\b\u0091\u0001\u0092\u0001\u0092"+
+ "\u0001\u0092\u0003\u0092\u0667\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093"+
+ "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+
+ "\u0003\u0093\u0672\b\u0093\u0001\u0093\u0001\u0093\u0005\u0093\u0676\b"+
+ "\u0093\n\u0093\f\u0093\u0679\t\u0093\u0001\u0093\u0001\u0093\u0001\u0094"+
+ "\u0001\u0094\u0003\u0094\u067f\b\u0094\u0001\u0094\u0001\u0094\u0001\u0094"+
+ "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+
+ "\u0003\u0095\u068a\b\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0003\u0096"+
+ "\u068f\b\u0096\u0001\u0097\u0001\u0097\u0003\u0097\u0693\b\u0097\u0001"+
+ "\u0097\u0001\u0097\u0001\u0097\u0003\u0097\u0698\b\u0097\u0005\u0097\u069a"+
+ "\b\u0097\n\u0097\f\u0097\u069d\t\u0097\u0001\u0098\u0001\u0098\u0001\u0098"+
+ "\u0005\u0098\u06a2\b\u0098\n\u0098\f\u0098\u06a5\t\u0098\u0001\u0098\u0001"+
+ "\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0003\u0099\u06ac\b\u0099\u0001"+
+ "\u009a\u0001\u009a\u0001\u009a\u0003\u009a\u06b1\b\u009a\u0001\u009a\u0003"+
+ "\u009a\u06b4\b\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+
+ "\u009b\u0001\u009b\u0003\u009b\u06bc\b\u009b\u0001\u009b\u0001\u009b\u0001"+
+ "\u009c\u0001\u009c\u0003\u009c\u06c2\b\u009c\u0001\u009c\u0001\u009c\u0003"+
+ "\u009c\u06c6\b\u009c\u0003\u009c\u06c8\b\u009c\u0001\u009c\u0001\u009c"+
+ "\u0001\u009d\u0003\u009d\u06cd\b\u009d\u0001\u009d\u0001\u009d\u0003\u009d"+
+ "\u06d1\b\u009d\u0001\u009d\u0001\u009d\u0003\u009d\u06d5\b\u009d\u0001"+
+ "\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0003\u009f\u06dc"+
+ "\b\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+
+ "\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001"+
+ "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001"+
+ "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+
+ "\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06f9\b\u00a6\u0001"+
+ "\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001"+
+ "\u00a8\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0704\b\u00a8\u0001\u00a9\u0001"+
+ "\u00a9\u0003\u00a9\u0708\b\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001"+
+ "\u00aa\u0005\u00aa\u070e\b\u00aa\n\u00aa\f\u00aa\u0711\t\u00aa\u0001\u00aa"+
+ "\u0003\u00aa\u0714\b\u00aa\u0003\u00aa\u0716\b\u00aa\u0001\u00aa\u0001"+
+ "\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u071e"+
+ "\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+
+ "\u00ac\u0001\u00ac\u0003\u00ac\u0727\b\u00ac\u0001\u00ad\u0001\u00ad\u0001"+
+ "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003\u00ad\u072f\b\u00ad\u0001"+
+ "\u00ae\u0001\u00ae\u0001\u00ae\u0003\u00ae\u0734\b\u00ae\u0001\u00af\u0001"+
+ "\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001"+
+ "\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+
+ "\u00b3\u0003\u00b3\u0744\b\u00b3\u0003\u00b3\u0746\b\u00b3\u0001\u00b3"+
+ "\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0005\u00b4\u074d\b\u00b4"+
+ "\n\u00b4\f\u00b4\u0750\t\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0003"+
+ "\u00b5\u0755\b\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0003"+
+ "\u00b6\u075b\b\u00b6\u0001\u00b7\u0001\u00b7\u0003\u00b7\u075f\b\u00b7"+
+ "\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0005\u00b8"+
+ "\u0766\b\u00b8\n\u00b8\f\u00b8\u0769\t\u00b8\u0001\u00b8\u0001\u00b8\u0001"+
+ "\u00b9\u0001\u00b9\u0001\u00ba\u0003\u00ba\u0770\b\u00ba\u0001\u00ba\u0001"+
+ "\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001"+
+ "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001"+
+ "\u00bd\u0001\u00bd\u0001\u00bd\u0003\u00bd\u0782\b\u00bd\u0003\u00bd\u0784"+
+ "\b\u00bd\u0001\u00bd\u0003\u00bd\u0787\b\u00bd\u0001\u00bd\u0003\u00bd"+
+ "\u078a\b\u00bd\u0003\u00bd\u078c\b\u00bd\u0001\u00bd\u0001\u00bd\u0001"+
+ "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+
+ "\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0003\u00c0\u079a\b\u00c0\u0001"+
+ "\u00c0\u0001\u0313\u0002\u00b4\u00c4\u00c1\u0000\u0002\u0004\u0006\b\n"+
+ "\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.0246"+
+ "8:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+
+ "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+
+ "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba"+
+ "\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2"+
+ "\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+
+ "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102"+
+ "\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a"+
+ "\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132"+
+ "\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a"+
+ "\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162"+
+ "\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u017a"+
+ "\u017c\u017e\u0180\u0000\u0014\u0002\u0000jjuu\u0001\u0000\u0017\u0018"+
+ "\u0001\u0000\u0005\b\u0001\u0000CD\u0001\u0000(*\u0002\u0000(*,,\u0002"+
+ "\u0000klrr\u0001\u0000\u0088\u008e\u0001\u0000\u0014\u0015\u0002\u0000"+
+ "\u0083\u0087\u008c\u008d\u0004\u0000##vv\u0082\u0082\u0089\u008b\u0001"+
+ "\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000JK|\u0081\u0004\u0000"+
+ "--0033bb\u0002\u0000\u0082\u0087\u0089\u008d\u0001\u0000vw\u0002\u0000"+
+ "ss\u00a4\u00a4\u0002\u0000\u008f\u0092\u0094\u0095\u0001\u0000\u009b\u009c"+
+ "\u0809\u0000\u0182\u0001\u0000\u0000\u0000\u0002\u0185\u0001\u0000\u0000"+
+ "\u0000\u0004\u0188\u0001\u0000\u0000\u0000\u0006\u018b\u0001\u0000\u0000"+
+ "\u0000\b\u0193\u0001\u0000\u0000\u0000\n\u019c\u0001\u0000\u0000\u0000"+
+ "\f\u01bc\u0001\u0000\u0000\u0000\u000e\u01c9\u0001\u0000\u0000\u0000\u0010"+
+ "\u01cc\u0001\u0000\u0000\u0000\u0012\u01d4\u0001\u0000\u0000\u0000\u0014"+
+ "\u01e1\u0001\u0000\u0000\u0000\u0016\u01f7\u0001\u0000\u0000\u0000\u0018"+
+ "\u0200\u0001\u0000\u0000\u0000\u001a\u0202\u0001\u0000\u0000\u0000\u001c"+
+ "\u0204\u0001\u0000\u0000\u0000\u001e\u0207\u0001\u0000\u0000\u0000 \u021d"+
+ "\u0001\u0000\u0000\u0000\"\u021f\u0001\u0000\u0000\u0000$\u0221\u0001"+
+ "\u0000\u0000\u0000&\u0226\u0001\u0000\u0000\u0000(\u0231\u0001\u0000\u0000"+
+ "\u0000*\u023e\u0001\u0000\u0000\u0000,\u0241\u0001\u0000\u0000\u0000."+
+ "\u024c\u0001\u0000\u0000\u00000\u024e\u0001\u0000\u0000\u00002\u0253\u0001"+
+ "\u0000\u0000\u00004\u0258\u0001\u0000\u0000\u00006\u025d\u0001\u0000\u0000"+
+ "\u00008\u0262\u0001\u0000\u0000\u0000:\u026f\u0001\u0000\u0000\u0000<"+
+ "\u0271\u0001\u0000\u0000\u0000>\u0273\u0001\u0000\u0000\u0000@\u0278\u0001"+
+ "\u0000\u0000\u0000B\u027d\u0001\u0000\u0000\u0000D\u0282\u0001\u0000\u0000"+
+ "\u0000F\u0286\u0001\u0000\u0000\u0000H\u028b\u0001\u0000\u0000\u0000J"+
+ "\u0294\u0001\u0000\u0000\u0000L\u029b\u0001\u0000\u0000\u0000N\u02a8\u0001"+
+ "\u0000\u0000\u0000P\u02ac\u0001\u0000\u0000\u0000R\u02b7\u0001\u0000\u0000"+
+ "\u0000T\u02bf\u0001\u0000\u0000\u0000V\u02c1\u0001\u0000\u0000\u0000X"+
+ "\u02d6\u0001\u0000\u0000\u0000Z\u02d8\u0001\u0000\u0000\u0000\\\u02e4"+
+ "\u0001\u0000\u0000\u0000^\u02f1\u0001\u0000\u0000\u0000`\u02f5\u0001\u0000"+
+ "\u0000\u0000b\u0305\u0001\u0000\u0000\u0000d\u0313\u0001\u0000\u0000\u0000"+
+ "f\u031e\u0001\u0000\u0000\u0000h\u0322\u0001\u0000\u0000\u0000j\u032a"+
+ "\u0001\u0000\u0000\u0000l\u0331\u0001\u0000\u0000\u0000n\u0339\u0001\u0000"+
+ "\u0000\u0000p\u0349\u0001\u0000\u0000\u0000r\u034c\u0001\u0000\u0000\u0000"+
+ "t\u0354\u0001\u0000\u0000\u0000v\u0356\u0001\u0000\u0000\u0000x\u0361"+
+ "\u0001\u0000\u0000\u0000z\u0369\u0001\u0000\u0000\u0000|\u0378\u0001\u0000"+
+ "\u0000\u0000~\u037a\u0001\u0000\u0000\u0000\u0080\u0382\u0001\u0000\u0000"+
+ "\u0000\u0082\u0390\u0001\u0000\u0000\u0000\u0084\u039c\u0001\u0000\u0000"+
+ "\u0000\u0086\u03a6\u0001\u0000\u0000\u0000\u0088\u03aa\u0001\u0000\u0000"+
+ "\u0000\u008a\u03b0\u0001\u0000\u0000\u0000\u008c\u03c8\u0001\u0000\u0000"+
+ "\u0000\u008e\u03d0\u0001\u0000\u0000\u0000\u0090\u03df\u0001\u0000\u0000"+
+ "\u0000\u0092\u03e1\u0001\u0000\u0000\u0000\u0094\u03e8\u0001\u0000\u0000"+
+ "\u0000\u0096\u03f1\u0001\u0000\u0000\u0000\u0098\u03f6\u0001\u0000\u0000"+
+ "\u0000\u009a\u03fb\u0001\u0000\u0000\u0000\u009c\u0401\u0001\u0000\u0000"+
+ "\u0000\u009e\u0408\u0001\u0000\u0000\u0000\u00a0\u040d\u0001\u0000\u0000"+
+ "\u0000\u00a2\u0413\u0001\u0000\u0000\u0000\u00a4\u0418\u0001\u0000\u0000"+
+ "\u0000\u00a6\u041f\u0001\u0000\u0000\u0000\u00a8\u0429\u0001\u0000\u0000"+
+ "\u0000\u00aa\u042d\u0001\u0000\u0000\u0000\u00ac\u0439\u0001\u0000\u0000"+
+ "\u0000\u00ae\u043c\u0001\u0000\u0000\u0000\u00b0\u0440\u0001\u0000\u0000"+
+ "\u0000\u00b2\u0447\u0001\u0000\u0000\u0000\u00b4\u0460\u0001\u0000\u0000"+
+ "\u0000\u00b6\u049c\u0001\u0000\u0000\u0000\u00b8\u049e\u0001\u0000\u0000"+
+ "\u0000\u00ba\u04a1\u0001\u0000\u0000\u0000\u00bc\u04a6\u0001\u0000\u0000"+
+ "\u0000\u00be\u04af\u0001\u0000\u0000\u0000\u00c0\u04bd\u0001\u0000\u0000"+
+ "\u0000\u00c2\u04c7\u0001\u0000\u0000\u0000\u00c4\u04d9\u0001\u0000\u0000"+
+ "\u0000\u00c6\u04f4\u0001\u0000\u0000\u0000\u00c8\u04f7\u0001\u0000\u0000"+
+ "\u0000\u00ca\u04ff\u0001\u0000\u0000\u0000\u00cc\u0508\u0001\u0000\u0000"+
+ "\u0000\u00ce\u0518\u0001\u0000\u0000\u0000\u00d0\u052b\u0001\u0000\u0000"+
+ "\u0000\u00d2\u0534\u0001\u0000\u0000\u0000\u00d4\u053f\u0001\u0000\u0000"+
+ "\u0000\u00d6\u0541\u0001\u0000\u0000\u0000\u00d8\u0544\u0001\u0000\u0000"+
+ "\u0000\u00da\u055b\u0001\u0000\u0000\u0000\u00dc\u055d\u0001\u0000\u0000"+
+ "\u0000\u00de\u0563\u0001\u0000\u0000\u0000\u00e0\u056e\u0001\u0000\u0000"+
+ "\u0000\u00e2\u0582\u0001\u0000\u0000\u0000\u00e4\u0584\u0001\u0000\u0000"+
+ "\u0000\u00e6\u0586\u0001\u0000\u0000\u0000\u00e8\u0589\u0001\u0000\u0000"+
+ "\u0000\u00ea\u0593\u0001\u0000\u0000\u0000\u00ec\u059d\u0001\u0000\u0000"+
+ "\u0000\u00ee\u05a0\u0001\u0000\u0000\u0000\u00f0\u05a5\u0001\u0000\u0000"+
+ "\u0000\u00f2\u05a7\u0001\u0000\u0000\u0000\u00f4\u05b5\u0001\u0000\u0000"+
+ "\u0000\u00f6\u05bd\u0001\u0000\u0000\u0000\u00f8\u05c5\u0001\u0000\u0000"+
+ "\u0000\u00fa\u05cd\u0001\u0000\u0000\u0000\u00fc\u05db\u0001\u0000\u0000"+
+ "\u0000\u00fe\u05e1\u0001\u0000\u0000\u0000\u0100\u05ef\u0001\u0000\u0000"+
+ "\u0000\u0102\u0601\u0001\u0000\u0000\u0000\u0104\u060a\u0001\u0000\u0000"+
+ "\u0000\u0106\u060c\u0001\u0000\u0000\u0000\u0108\u060e\u0001\u0000\u0000"+
+ "\u0000\u010a\u0612\u0001\u0000\u0000\u0000\u010c\u0615\u0001\u0000\u0000"+
+ "\u0000\u010e\u0619\u0001\u0000\u0000\u0000\u0110\u061b\u0001\u0000\u0000"+
+ "\u0000\u0112\u0620\u0001\u0000\u0000\u0000\u0114\u0624\u0001\u0000\u0000"+
+ "\u0000\u0116\u0628\u0001\u0000\u0000\u0000\u0118\u062c\u0001\u0000\u0000"+
+ "\u0000\u011a\u062f\u0001\u0000\u0000\u0000\u011c\u0631\u0001\u0000\u0000"+
+ "\u0000\u011e\u0646\u0001\u0000\u0000\u0000\u0120\u0648\u0001\u0000\u0000"+
+ "\u0000\u0122\u065e\u0001\u0000\u0000\u0000\u0124\u0666\u0001\u0000\u0000"+
+ "\u0000\u0126\u0668\u0001\u0000\u0000\u0000\u0128\u067e\u0001\u0000\u0000"+
+ "\u0000\u012a\u0686\u0001\u0000\u0000\u0000\u012c\u068e\u0001\u0000\u0000"+
+ "\u0000\u012e\u0692\u0001\u0000\u0000\u0000\u0130\u069e\u0001\u0000\u0000"+
+ "\u0000\u0132\u06a8\u0001\u0000\u0000\u0000\u0134\u06b3\u0001\u0000\u0000"+
+ "\u0000\u0136\u06bb\u0001\u0000\u0000\u0000\u0138\u06bf\u0001\u0000\u0000"+
+ "\u0000\u013a\u06cc\u0001\u0000\u0000\u0000\u013c\u06d6\u0001\u0000\u0000"+
+ "\u0000\u013e\u06db\u0001\u0000\u0000\u0000\u0140\u06dd\u0001\u0000\u0000"+
+ "\u0000\u0142\u06e2\u0001\u0000\u0000\u0000\u0144\u06e4\u0001\u0000\u0000"+
+ "\u0000\u0146\u06e6\u0001\u0000\u0000\u0000\u0148\u06e9\u0001\u0000\u0000"+
+ "\u0000\u014a\u06ed\u0001\u0000\u0000\u0000\u014c\u06f8\u0001\u0000\u0000"+
+ "\u0000\u014e\u06fc\u0001\u0000\u0000\u0000\u0150\u0703\u0001\u0000\u0000"+
+ "\u0000\u0152\u0707\u0001\u0000\u0000\u0000\u0154\u0709\u0001\u0000\u0000"+
+ "\u0000\u0156\u0719\u0001\u0000\u0000\u0000\u0158\u0726\u0001\u0000\u0000"+
+ "\u0000\u015a\u072e\u0001\u0000\u0000\u0000\u015c\u0733\u0001\u0000\u0000"+
+ "\u0000\u015e\u0735\u0001\u0000\u0000\u0000\u0160\u0737\u0001\u0000\u0000"+
+ "\u0000\u0162\u0739\u0001\u0000\u0000\u0000\u0164\u073d\u0001\u0000\u0000"+
+ "\u0000\u0166\u0740\u0001\u0000\u0000\u0000\u0168\u0749\u0001\u0000\u0000"+
+ "\u0000\u016a\u0754\u0001\u0000\u0000\u0000\u016c\u075a\u0001\u0000\u0000"+
+ "\u0000\u016e\u075e\u0001\u0000\u0000\u0000\u0170\u0760\u0001\u0000\u0000"+
+ "\u0000\u0172\u076c\u0001\u0000\u0000\u0000\u0174\u076f\u0001\u0000\u0000"+
+ "\u0000\u0176\u0773\u0001\u0000\u0000\u0000\u0178\u0777\u0001\u0000\u0000"+
+ "\u0000\u017a\u077c\u0001\u0000\u0000\u0000\u017c\u078f\u0001\u0000\u0000"+
+ "\u0000\u017e\u0793\u0001\u0000\u0000\u0000\u0180\u0799\u0001\u0000\u0000"+
+ "\u0000\u0182\u0183\u0003\u00b4Z\u0000\u0183\u0184\u0005\u0000\u0000\u0001"+
+ "\u0184\u0001\u0001\u0000\u0000\u0000\u0185\u0186\u0003\u00b6[\u0000\u0186"+
+ "\u0187\u0005\u0000\u0000\u0001\u0187\u0003\u0001\u0000\u0000\u0000\u0188"+
+ "\u0189\u0003\u00d2i\u0000\u0189\u018a\u0005\u0000\u0000\u0001\u018a\u0005"+
+ "\u0001\u0000\u0000\u0000\u018b\u0190\u0003\b\u0004\u0000\u018c\u018d\u0005"+
+ "r\u0000\u0000\u018d\u018f\u0003\b\u0004\u0000\u018e\u018c\u0001\u0000"+
+ "\u0000\u0000\u018f\u0192\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000"+
+ "\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u0007\u0001\u0000"+
+ "\u0000\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0193\u0195\u0005j\u0000"+
+ "\u0000\u0194\u0196\u0005>\u0000\u0000\u0195\u0194\u0001\u0000\u0000\u0000"+
+ "\u0195\u0196\u0001\u0000\u0000\u0000\u0196\t\u0001\u0000\u0000\u0000\u0197"+
+ "\u0198\u0003\u000e\u0007\u0000\u0198\u0199\u0003\u0180\u00c0\u0000\u0199"+
+ "\u019b\u0001\u0000\u0000\u0000\u019a\u0197\u0001\u0000\u0000\u0000\u019b"+
+ "\u019e\u0001\u0000\u0000\u0000\u019c\u019a\u0001\u0000\u0000\u0000\u019c"+
+ "\u019d\u0001\u0000\u0000\u0000\u019d\u019f\u0001\u0000\u0000\u0000\u019e"+
+ "\u019c\u0001\u0000\u0000\u0000\u019f\u01a0\u0003\u00ecv\u0000\u01a0\u01a6"+
+ "\u0003\u0180\u00c0\u0000\u01a1\u01a2\u0003\u0014\n\u0000\u01a2\u01a3\u0003"+
+ "\u0180\u00c0\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a1\u0001"+
+ "\u0000\u0000\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+
+ "\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01b2\u0001"+
+ "\u0000\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a9\u01ad\u0003"+
+ "\u0098L\u0000\u01aa\u01ad\u0003\u00f0x\u0000\u01ab\u01ad\u0003\u0016\u000b"+
+ "\u0000\u01ac\u01a9\u0001\u0000\u0000\u0000\u01ac\u01aa\u0001\u0000\u0000"+
+ "\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000"+
+ "\u0000\u01ae\u01af\u0003\u0180\u00c0\u0000\u01af\u01b1\u0001\u0000\u0000"+
+ "\u0000\u01b0\u01ac\u0001\u0000\u0000\u0000\u01b1\u01b4\u0001\u0000\u0000"+
+ "\u0000\u01b2\u01b0\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000"+
+ "\u0000\u01b3\u01b5\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000\u0000"+
+ "\u0000\u01b5\u01b6\u0005\u0000\u0000\u0001\u01b6\u000b\u0001\u0000\u0000"+
+ "\u0000\u01b7\u01b8\u0003\u000e\u0007\u0000\u01b8\u01b9\u0003\u0180\u00c0"+
+ "\u0000\u01b9\u01bb\u0001\u0000\u0000\u0000\u01ba\u01b7\u0001\u0000\u0000"+
+ "\u0000\u01bb\u01be\u0001\u0000\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000"+
+ "\u0000\u01bc\u01bd\u0001\u0000\u0000\u0000\u01bd\u01bf\u0001\u0000\u0000"+
+ "\u0000\u01be\u01bc\u0001\u0000\u0000\u0000\u01bf\u01c0\u0003\u00ecv\u0000"+
+ "\u01c0\u01c6\u0003\u0180\u00c0\u0000\u01c1\u01c2\u0003\u0014\n\u0000\u01c2"+
+ "\u01c3\u0003\u0180\u00c0\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4"+
+ "\u01c1\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6"+
+ "\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7"+
+ "\r\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01ca"+
+ "\u0005G\u0000\u0000\u01ca\u01cb\u0003\u00b4Z\u0000\u01cb\u000f\u0001\u0000"+
+ "\u0000\u0000\u01cc\u01cd\u0005H\u0000\u0000\u01cd\u01ce\u0003\u00b4Z\u0000"+
+ "\u01ce\u0011\u0001\u0000\u0000\u0000\u01cf\u01d0\u0003\u0010\b\u0000\u01d0"+
+ "\u01d1\u0003\u0180\u00c0\u0000\u01d1\u01d3\u0001\u0000\u0000\u0000\u01d2"+
+ "\u01cf\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4"+
+ "\u01d2\u0001\u0000\u0000\u0000\u01d4\u01d5\u0001\u0000\u0000\u0000\u01d5"+
+ "\u01d8\u0001\u0000\u0000\u0000\u01d6\u01d4\u0001\u0000\u0000\u0000\u01d7"+
+ "\u01d9\u0007\u0000\u0000\u0000\u01d8\u01d7\u0001\u0000\u0000\u0000\u01d8"+
+ "\u01d9\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000\u0000\u01da"+
+ "\u01db\u0003\u00eew\u0000\u01db\u0013\u0001\u0000\u0000\u0000\u01dc\u01dd"+
+ "\u0003\u0010\b\u0000\u01dd\u01de\u0003\u0180\u00c0\u0000\u01de\u01e0\u0001"+
+ "\u0000\u0000\u0000\u01df\u01dc\u0001\u0000\u0000\u0000\u01e0\u01e3\u0001"+
+ "\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000\u0000\u01e1\u01e2\u0001"+
+ "\u0000\u0000\u0000\u01e2\u01f1\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001"+
+ "\u0000\u0000\u0000\u01e4\u01e5\u0005f\u0000\u0000\u01e5\u01f2\u0003\u0012"+
+ "\t\u0000\u01e6\u01e7\u0005f\u0000\u0000\u01e7\u01ed\u0005k\u0000\u0000"+
+ "\u01e8\u01e9\u0003\u0012\t\u0000\u01e9\u01ea\u0003\u0180\u00c0\u0000\u01ea"+
+ "\u01ec\u0001\u0000\u0000\u0000\u01eb\u01e8\u0001\u0000\u0000\u0000\u01ec"+
+ "\u01ef\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000\u01ed"+
+ "\u01ee\u0001\u0000\u0000\u0000\u01ee\u01f0\u0001\u0000\u0000\u0000\u01ef"+
+ "\u01ed\u0001\u0000\u0000\u0000\u01f0\u01f2\u0005l\u0000\u0000\u01f1\u01e4"+
+ "\u0001\u0000\u0000\u0000\u01f1\u01e6\u0001\u0000\u0000\u0000\u01f2\u0015"+
+ "\u0001\u0000\u0000\u0000\u01f3\u01f8\u0003\u008aE\u0000\u01f4\u01f8\u0003"+
+ "\u00a0P\u0000\u01f5\u01f8\u0003\u00a4R\u0000\u01f6\u01f8\u0003\u009eO"+
+ "\u0000\u01f7\u01f3\u0001\u0000\u0000\u0000\u01f7\u01f4\u0001\u0000\u0000"+
+ "\u0000\u01f7\u01f5\u0001\u0000\u0000\u0000\u01f7\u01f6\u0001\u0000\u0000"+
+ "\u0000\u01f8\u0017\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005\u001b\u0000"+
+ "\u0000\u01fa\u0201\u0003\u00b6[\u0000\u01fb\u01fc\u0007\u0001\u0000\u0000"+
+ "\u01fc\u0201\u0003.\u0017\u0000\u01fd\u01fe\u0007\u0002\u0000\u0000\u01fe"+
+ "\u0201\u0003\u00b4Z\u0000\u01ff\u0201\u0003v;\u0000\u0200\u01f9\u0001"+
+ "\u0000\u0000\u0000\u0200\u01fb\u0001\u0000\u0000\u0000\u0200\u01fd\u0001"+
+ "\u0000\u0000\u0000\u0200\u01ff\u0001\u0000\u0000\u0000\u0201\u0019\u0001"+
+ "\u0000\u0000\u0000\u0202\u0203\u0003\u001c\u000e\u0000\u0203\u001b\u0001"+
+ "\u0000\u0000\u0000\u0204\u0205\u0003d2\u0000\u0205\u0206\u0003\u001e\u000f"+
+ "\u0000\u0206\u001d\u0001\u0000\u0000\u0000\u0207\u0208\u0005F\u0000\u0000"+
+ "\u0208\u020a\u0005k\u0000\u0000\u0209\u020b\u0003\u0102\u0081\u0000\u020a"+
+ "\u0209\u0001\u0000\u0000\u0000\u020a\u020b\u0001\u0000\u0000\u0000\u020b"+
+ "\u020c\u0001\u0000\u0000\u0000\u020c\u020d\u0005l\u0000\u0000\u020d\u001f"+
+ "\u0001\u0000\u0000\u0000\u020e\u021e\u0003J%\u0000\u020f\u021e\u0003H"+
+ "$\u0000\u0210\u021e\u0003F#\u0000\u0211\u021e\u0003$\u0012\u0000\u0212"+
+ "\u021e\u0003@ \u0000\u0213\u021e\u0003B!\u0000\u0214\u021e\u0003D\"\u0000"+
+ "\u0215\u021e\u00038\u001c\u0000\u0216\u021e\u0003>\u001f\u0000\u0217\u021e"+
+ "\u00036\u001b\u0000\u0218\u021e\u00032\u0019\u0000\u0219\u021e\u00030"+
+ "\u0018\u0000\u021a\u021e\u00034\u001a\u0000\u021b\u021e\u0003\"\u0011"+
+ "\u0000\u021c\u021e\u0003L&\u0000\u021d\u020e\u0001\u0000\u0000\u0000\u021d"+
+ "\u020f\u0001\u0000\u0000\u0000\u021d\u0210\u0001\u0000\u0000\u0000\u021d"+
+ "\u0211\u0001\u0000\u0000\u0000\u021d\u0212\u0001\u0000\u0000\u0000\u021d"+
+ "\u0213\u0001\u0000\u0000\u0000\u021d\u0214\u0001\u0000\u0000\u0000\u021d"+
+ "\u0215\u0001\u0000\u0000\u0000\u021d\u0216\u0001\u0000\u0000\u0000\u021d"+
+ "\u0217\u0001\u0000\u0000\u0000\u021d\u0218\u0001\u0000\u0000\u0000\u021d"+
+ "\u0219\u0001\u0000\u0000\u0000\u021d\u021a\u0001\u0000\u0000\u0000\u021d"+
+ "\u021b\u0001\u0000\u0000\u0000\u021d\u021c\u0001\u0000\u0000\u0000\u021e"+
+ "!\u0001\u0000\u0000\u0000\u021f\u0220\u0007\u0003\u0000\u0000\u0220#\u0001"+
+ "\u0000\u0000\u0000\u0221\u0222\u0005c\u0000\u0000\u0222\u0223\u0005o\u0000"+
+ "\u0000\u0223\u0224\u0003\u00d2i\u0000\u0224\u0225\u0005p\u0000\u0000\u0225"+
+ "%\u0001\u0000\u0000\u0000\u0226\u022b\u0003(\u0014\u0000\u0227\u0228\u0005"+
+ "r\u0000\u0000\u0228\u022a\u0003(\u0014\u0000\u0229\u0227\u0001\u0000\u0000"+
+ "\u0000\u022a\u022d\u0001\u0000\u0000\u0000\u022b\u0229\u0001\u0000\u0000"+
+ "\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\u022f\u0001\u0000\u0000"+
+ "\u0000\u022d\u022b\u0001\u0000\u0000\u0000\u022e\u0230\u0005r\u0000\u0000"+
+ "\u022f\u022e\u0001\u0000\u0000\u0000\u022f\u0230\u0001\u0000\u0000\u0000"+
+ "\u0230\'\u0001\u0000\u0000\u0000\u0231\u0236\u0005j\u0000\u0000\u0232"+
+ "\u0233\u0005r\u0000\u0000\u0233\u0235\u0005j\u0000\u0000\u0234\u0232\u0001"+
+ "\u0000\u0000\u0000\u0235\u0238\u0001\u0000\u0000\u0000\u0236\u0234\u0001"+
+ "\u0000\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0239\u0001"+
+ "\u0000\u0000\u0000\u0238\u0236\u0001\u0000\u0000\u0000\u0239\u023a\u0003"+
+ "\u0144\u00a2\u0000\u023a)\u0001\u0000\u0000\u0000\u023b\u023d\u0003,\u0016"+
+ "\u0000\u023c\u023b\u0001\u0000\u0000\u0000\u023d\u0240\u0001\u0000\u0000"+
+ "\u0000\u023e\u023c\u0001\u0000\u0000\u0000\u023e\u023f\u0001\u0000\u0000"+
+ "\u0000\u023f+\u0001\u0000\u0000\u0000\u0240\u023e\u0001\u0000\u0000\u0000"+
+ "\u0241\u0242\u0005m\u0000\u0000\u0242\u0247\u0003\u00b4Z\u0000\u0243\u0244"+
+ "\u0005r\u0000\u0000\u0244\u0246\u0003\u00b4Z\u0000\u0245\u0243\u0001\u0000"+
+ "\u0000\u0000\u0246\u0249\u0001\u0000\u0000\u0000\u0247\u0245\u0001\u0000"+
+ "\u0000\u0000\u0247\u0248\u0001\u0000\u0000\u0000\u0248\u024a\u0001\u0000"+
+ "\u0000\u0000\u0249\u0247\u0001\u0000\u0000\u0000\u024a\u024b\u0005n\u0000"+
+ "\u0000\u024b-\u0001\u0000\u0000\u0000\u024c\u024d\u0003\u00c4b\u0000\u024d"+
+ "/\u0001\u0000\u0000\u0000\u024e\u024f\u00051\u0000\u0000\u024f\u0250\u0005"+
+ "k\u0000\u0000\u0250\u0251\u0003\u00b4Z\u0000\u0251\u0252\u0005l\u0000"+
+ "\u0000\u02521\u0001\u0000\u0000\u0000\u0253\u0254\u00057\u0000\u0000\u0254"+
+ "\u0255\u0005o\u0000\u0000\u0255\u0256\u0003\u00d2i\u0000\u0256\u0257\u0005"+
+ "p\u0000\u0000\u02573\u0001\u0000\u0000\u0000\u0258\u0259\u00052\u0000"+
+ "\u0000\u0259\u025a\u0005k\u0000\u0000\u025a\u025b\u0003\u00b4Z\u0000\u025b"+
+ "\u025c\u0005l\u0000\u0000\u025c5\u0001\u0000\u0000\u0000\u025d\u025e\u0007"+
+ "\u0004\u0000\u0000\u025e\u025f\u0005k\u0000\u0000\u025f\u0260\u0003\u00b4"+
+ "Z\u0000\u0260\u0261\u0005l\u0000\u0000\u02617\u0001\u0000\u0000\u0000"+
+ "\u0262\u0267\u0005\u0011\u0000\u0000\u0263\u0264\u0005o\u0000\u0000\u0264"+
+ "\u0265\u0003:\u001d\u0000\u0265\u0266\u0005p\u0000\u0000\u0266\u0268\u0001"+
+ "\u0000\u0000\u0000\u0267\u0263\u0001\u0000\u0000\u0000\u0267\u0268\u0001"+
+ "\u0000\u0000\u0000\u0268\u0269\u0001\u0000\u0000\u0000\u0269\u026a\u0005"+
+ "k\u0000\u0000\u026a\u026b\u0003\u00b4Z\u0000\u026b\u026c\u0005l\u0000"+
+ "\u0000\u026c9\u0001\u0000\u0000\u0000\u026d\u0270\u0003<\u001e\u0000\u026e"+
+ "\u0270\u0005\u0013\u0000\u0000\u026f\u026d\u0001\u0000\u0000\u0000\u026f"+
+ "\u026e\u0001\u0000\u0000\u0000\u0270;\u0001\u0000\u0000\u0000\u0271\u0272"+
+ "\u0005j\u0000\u0000\u0272=\u0001\u0000\u0000\u0000\u0273\u0274\u0005\u0012"+
+ "\u0000\u0000\u0274\u0275\u0005k\u0000\u0000\u0275\u0276\u0003\u00b4Z\u0000"+
+ "\u0276\u0277\u0005l\u0000\u0000\u0277?\u0001\u0000\u0000\u0000\u0278\u0279"+
+ "\u0005:\u0000\u0000\u0279\u027a\u0005k\u0000\u0000\u027a\u027b\u0003\u00b4"+
+ "Z\u0000\u027b\u027c\u0005l\u0000\u0000\u027cA\u0001\u0000\u0000\u0000"+
+ "\u027d\u027e\u0005;\u0000\u0000\u027e\u027f\u0005k\u0000\u0000\u027f\u0280"+
+ "\u0003\u00b4Z\u0000\u0280\u0281\u0005l\u0000\u0000\u0281C\u0001\u0000"+
+ "\u0000\u0000\u0282\u0283\u0005<\u0000\u0000\u0283\u0284\u0005k\u0000\u0000"+
+ "\u0284\u0285\u0005l\u0000\u0000\u0285E\u0001\u0000\u0000\u0000\u0286\u0287"+
+ "\u00059\u0000\u0000\u0287\u0288\u0005k\u0000\u0000\u0288\u0289\u0003\u00b4"+
+ "Z\u0000\u0289\u028a\u0005l\u0000\u0000\u028aG\u0001\u0000\u0000\u0000"+
+ "\u028b\u028c\u0005\u0016\u0000\u0000\u028c\u028d\u0005k\u0000\u0000\u028d"+
+ "\u0290\u0003\u00b4Z\u0000\u028e\u028f\u0005r\u0000\u0000\u028f\u0291\u0003"+
+ "\u00b4Z\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0290\u0291\u0001\u0000"+
+ "\u0000\u0000\u0291\u0292\u0001\u0000\u0000\u0000\u0292\u0293\u0005l\u0000"+
+ "\u0000\u0293I\u0001\u0000\u0000\u0000\u0294\u0295\u0007\u0004\u0000\u0000"+
+ "\u0295\u0296\u0005o\u0000\u0000\u0296\u0297\u0003\u00b4Z\u0000\u0297\u0298"+
+ "\u0005?\u0000\u0000\u0298\u0299\u0003\u00b4Z\u0000\u0299\u029a\u0005p"+
+ "\u0000\u0000\u029aK\u0001\u0000\u0000\u0000\u029b\u029c\u00056\u0000\u0000"+
+ "\u029c\u029d\u0003\u00b4Z\u0000\u029d\u02a3\u0005m\u0000\u0000\u029e\u029f"+
+ "\u0003N\'\u0000\u029f\u02a0\u0003\u0180\u00c0\u0000\u02a0\u02a2\u0001"+
+ "\u0000\u0000\u0000\u02a1\u029e\u0001\u0000\u0000\u0000\u02a2\u02a5\u0001"+
+ "\u0000\u0000\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000\u02a3\u02a4\u0001"+
+ "\u0000\u0000\u0000\u02a4\u02a6\u0001\u0000\u0000\u0000\u02a5\u02a3\u0001"+
+ "\u0000\u0000\u0000\u02a6\u02a7\u0005n\u0000\u0000\u02a7M\u0001\u0000\u0000"+
+ "\u0000\u02a8\u02a9\u0003z=\u0000\u02a9\u02aa\u0005t\u0000\u0000\u02aa"+
+ "\u02ab\u0003\u00b4Z\u0000\u02abO\u0001\u0000\u0000\u0000\u02ac\u02ad\u0005"+
+ "o\u0000\u0000\u02ad\u02b2\u0003R)\u0000\u02ae\u02af\u0005r\u0000\u0000"+
+ "\u02af\u02b1\u0003R)\u0000\u02b0\u02ae\u0001\u0000\u0000\u0000\u02b1\u02b4"+
+ "\u0001\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b2\u02b3"+
+ "\u0001\u0000\u0000\u0000\u02b3\u02b5\u0001\u0000\u0000\u0000\u02b4\u02b2"+
+ "\u0001\u0000\u0000\u0000\u02b5\u02b6\u0005p\u0000\u0000\u02b6Q\u0001\u0000"+
+ "\u0000\u0000\u02b7\u02b8\u0003\u00b4Z\u0000\u02b8\u02b9\u0005q\u0000\u0000"+
+ "\u02b9\u02ba\u0003\u00b4Z\u0000\u02baS\u0001\u0000\u0000\u0000\u02bb\u02c0"+
+ "\u0003b1\u0000\u02bc\u02c0\u0003`0\u0000\u02bd\u02c0\u0003V+\u0000\u02be"+
+ "\u02c0\u0003Z-\u0000\u02bf\u02bb\u0001\u0000\u0000\u0000\u02bf\u02bc\u0001"+
+ "\u0000\u0000\u0000\u02bf\u02bd\u0001\u0000\u0000\u0000\u02bf\u02be\u0001"+
+ "\u0000\u0000\u0000\u02c0U\u0001\u0000\u0000\u0000\u02c1\u02c2\u00053\u0000"+
+ "\u0000\u02c2\u02c8\u0005m\u0000\u0000\u02c3\u02c4\u0003X,\u0000\u02c4"+
+ "\u02c5\u0003\u0180\u00c0\u0000\u02c5\u02c7\u0001\u0000\u0000\u0000\u02c6"+
+ "\u02c3\u0001\u0000\u0000\u0000\u02c7\u02ca\u0001\u0000\u0000\u0000\u02c8"+
+ "\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9"+
+ "\u02cb\u0001\u0000\u0000\u0000\u02ca\u02c8\u0001\u0000\u0000\u0000\u02cb"+
+ "\u02cc\u0005n\u0000\u0000\u02ccW\u0001\u0000\u0000\u0000\u02cd\u02ce\u0005"+
+ "R\u0000\u0000\u02ce\u02cf\u0005j\u0000\u0000\u02cf\u02d7\u0003\u0150\u00a8"+
+ "\u0000\u02d0\u02d1\u00054\u0000\u0000\u02d1\u02d2\u0005m\u0000\u0000\u02d2"+
+ "\u02d3\u0003\u00b4Z\u0000\u02d3\u02d4\u0003\u0180\u00c0\u0000\u02d4\u02d5"+
+ "\u0005n\u0000\u0000\u02d5\u02d7\u0001\u0000\u0000\u0000\u02d6\u02cd\u0001"+
+ "\u0000\u0000\u0000\u02d6\u02d0\u0001\u0000\u0000\u0000\u02d7Y\u0001\u0000"+
+ "\u0000\u0000\u02d8\u02d9\u00055\u0000\u0000\u02d9\u02df\u0005m\u0000\u0000"+
+ "\u02da\u02db\u0003\\.\u0000\u02db\u02dc\u0003\u0180\u00c0\u0000\u02dc"+
+ "\u02de\u0001\u0000\u0000\u0000\u02dd\u02da\u0001\u0000\u0000\u0000\u02de"+
+ "\u02e1\u0001\u0000\u0000\u0000\u02df\u02dd\u0001\u0000\u0000\u0000\u02df"+
+ "\u02e0\u0001\u0000\u0000\u0000\u02e0\u02e2\u0001\u0000\u0000\u0000\u02e1"+
+ "\u02df\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005n\u0000\u0000\u02e3[\u0001"+
+ "\u0000\u0000\u0000\u02e4\u02e5\u0005j\u0000\u0000\u02e5\u02eb\u0005m\u0000"+
+ "\u0000\u02e6\u02e7\u0003^/\u0000\u02e7\u02e8\u0003\u0180\u00c0\u0000\u02e8"+
+ "\u02ea\u0001\u0000\u0000\u0000\u02e9\u02e6\u0001\u0000\u0000\u0000\u02ea"+
+ "\u02ed\u0001\u0000\u0000\u0000\u02eb\u02e9\u0001\u0000\u0000\u0000\u02eb"+
+ "\u02ec\u0001\u0000\u0000\u0000\u02ec\u02ee\u0001\u0000\u0000\u0000\u02ed"+
+ "\u02eb\u0001\u0000\u0000\u0000\u02ee\u02ef\u0005n\u0000\u0000\u02ef]\u0001"+
+ "\u0000\u0000\u0000\u02f0\u02f2\u0003\u00f6{\u0000\u02f1\u02f0\u0001\u0000"+
+ "\u0000\u0000\u02f1\u02f2\u0001\u0000\u0000\u0000\u02f2\u02f3\u0001\u0000"+
+ "\u0000\u0000\u02f3\u02f4\u0003\u00d2i\u0000\u02f4_\u0001\u0000\u0000\u0000"+
+ "\u02f5\u02f6\u0005\u001b\u0000\u0000\u02f6\u02f7\u0005o\u0000\u0000\u02f7"+
+ "\u02f8\u0005p\u0000\u0000\u02f8\u02f9\u0003\u0144\u00a2\u0000\u02f9a\u0001"+
+ "\u0000\u0000\u0000\u02fa\u02fb\u0007\u0005\u0000\u0000\u02fb\u02fc\u0005"+
+ "o\u0000\u0000\u02fc\u02fd\u0003\u00d2i\u0000\u02fd\u02fe\u0005p\u0000"+
+ "\u0000\u02fe\u0306\u0001\u0000\u0000\u0000\u02ff\u0300\u0005+\u0000\u0000"+
+ "\u0300\u0301\u0005o\u0000\u0000\u0301\u0302\u0003\u00d2i\u0000\u0302\u0303"+
+ "\u0005p\u0000\u0000\u0303\u0304\u0003\u00d2i\u0000\u0304\u0306\u0001\u0000"+
+ "\u0000\u0000\u0305\u02fa\u0001\u0000\u0000\u0000\u0305\u02ff\u0001\u0000"+
+ "\u0000\u0000\u0306c\u0001\u0000\u0000\u0000\u0307\u030f\u0003p8\u0000"+
+ "\u0308\u0309\u0005M\u0000\u0000\u0309\u030f\u00062\uffff\uffff\u0000\u030a"+
+ "\u030b\u0005\u000e\u0000\u0000\u030b\u030f\u00062\uffff\uffff\u0000\u030c"+
+ "\u030d\u0005E\u0000\u0000\u030d\u030f\u00062\uffff\uffff\u0000\u030e\u0307"+
+ "\u0001\u0000\u0000\u0000\u030e\u0308\u0001\u0000\u0000\u0000\u030e\u030a"+
+ "\u0001\u0000\u0000\u0000\u030e\u030c\u0001\u0000\u0000\u0000\u030f\u0310"+
+ "\u0001\u0000\u0000\u0000\u0310\u0312\u0003\u0180\u00c0\u0000\u0311\u030e"+
+ "\u0001\u0000\u0000\u0000\u0312\u0315\u0001\u0000\u0000\u0000\u0313\u0314"+
+ "\u0001\u0000\u0000\u0000\u0313\u0311\u0001\u0000\u0000\u0000\u0314\u0318"+
+ "\u0001\u0000\u0000\u0000\u0315\u0313\u0001\u0000\u0000\u0000\u0316\u0317"+
+ "\u0005\u000e\u0000\u0000\u0317\u0319\u00062\uffff\uffff\u0000\u0318\u0316"+
+ "\u0001\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0319\u031b"+
+ "\u0001\u0000\u0000\u0000\u031a\u031c\u0003n7\u0000\u031b\u031a\u0001\u0000"+
+ "\u0000\u0000\u031b\u031c\u0001\u0000\u0000\u0000\u031ce\u0001\u0000\u0000"+
+ "\u0000\u031d\u031f\b\u0006\u0000\u0000\u031e\u031d\u0001\u0000\u0000\u0000"+
+ "\u031f\u0320\u0001\u0000\u0000\u0000\u0320\u031e\u0001\u0000\u0000\u0000"+
+ "\u0320\u0321\u0001\u0000\u0000\u0000\u0321g\u0001\u0000\u0000\u0000\u0322"+
+ "\u0327\u0003f3\u0000\u0323\u0324\u0005r\u0000\u0000\u0324\u0326\u0003"+
+ "f3\u0000\u0325\u0323\u0001\u0000\u0000\u0000\u0326\u0329\u0001\u0000\u0000"+
+ "\u0000\u0327\u0325\u0001\u0000\u0000\u0000\u0327\u0328\u0001\u0000\u0000"+
+ "\u0000\u0328i\u0001\u0000\u0000\u0000\u0329\u0327\u0001\u0000\u0000\u0000"+
+ "\u032a\u032b\u0003f3\u0000\u032b\u032d\u0005k\u0000\u0000\u032c\u032e"+
+ "\u0003h4\u0000\u032d\u032c\u0001\u0000\u0000\u0000\u032d\u032e\u0001\u0000"+
+ "\u0000\u0000\u032e\u032f\u0001\u0000\u0000\u0000\u032f\u0330\u0005l\u0000"+
+ "\u0000\u0330k\u0001\u0000\u0000\u0000\u0331\u0336\u0003j5\u0000\u0332"+
+ "\u0333\u0005r\u0000\u0000\u0333\u0335\u0003j5\u0000\u0334\u0332\u0001"+
+ "\u0000\u0000\u0000\u0335\u0338\u0001\u0000\u0000\u0000\u0336\u0334\u0001"+
+ "\u0000\u0000\u0000\u0336\u0337\u0001\u0000\u0000\u0000\u0337m\u0001\u0000"+
+ "\u0000\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0339\u033a\u0005O\u0000"+
+ "\u0000\u033a\u033c\u0005o\u0000\u0000\u033b\u033d\u0003l6\u0000\u033c"+
+ "\u033b\u0001\u0000\u0000\u0000\u033c\u033d\u0001\u0000\u0000\u0000\u033d"+
+ "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0005p\u0000\u0000\u033f\u0340"+
+ "\u0003\u0180\u00c0\u0000\u0340o\u0001\u0000\u0000\u0000\u0341\u0342\u0005"+
+ "\t\u0000\u0000\u0342\u034a\u0003t:\u0000\u0343\u0344\u0005\n\u0000\u0000"+
+ "\u0344\u034a\u0003t:\u0000\u0345\u0346\u0005\u000b\u0000\u0000\u0346\u034a"+
+ "\u0003t:\u0000\u0347\u0348\u0005\r\u0000\u0000\u0348\u034a\u0003r9\u0000"+
+ "\u0349\u0341\u0001\u0000\u0000\u0000\u0349\u0343\u0001\u0000\u0000\u0000"+
+ "\u0349\u0345\u0001\u0000\u0000\u0000\u0349\u0347\u0001\u0000\u0000\u0000"+
+ "\u034aq\u0001\u0000\u0000\u0000\u034b\u034d\u0003\u00f8|\u0000\u034c\u034b"+
+ "\u0001\u0000\u0000\u0000\u034c\u034d\u0001\u0000\u0000\u0000\u034d\u0350"+
+ "\u0001\u0000\u0000\u0000\u034e\u034f\u0005a\u0000\u0000\u034f\u0351\u0003"+
+ "\u00b4Z\u0000\u0350\u034e\u0001\u0000\u0000\u0000\u0350\u0351\u0001\u0000"+
+ "\u0000\u0000\u0351s\u0001\u0000\u0000\u0000\u0352\u0355\u0001\u0000\u0000"+
+ "\u0000\u0353\u0355\u0003\u00b4Z\u0000\u0354\u0352\u0001\u0000\u0000\u0000"+
+ "\u0354\u0353\u0001\u0000\u0000\u0000\u0355u\u0001\u0000\u0000\u0000\u0356"+
+ "\u0357\u00056\u0000\u0000\u0357\u0358\u0003\u00b4Z\u0000\u0358\u035c\u0005"+
+ "m\u0000\u0000\u0359\u035b\u0003x<\u0000\u035a\u0359\u0001\u0000\u0000"+
+ "\u0000\u035b\u035e\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000\u0000"+
+ "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035f\u0001\u0000\u0000"+
+ "\u0000\u035e\u035c\u0001\u0000\u0000\u0000\u035f\u0360\u0005n\u0000\u0000"+
+ "\u0360w\u0001\u0000\u0000\u0000\u0361\u0362\u0003z=\u0000\u0362\u0364"+
+ "\u0005t\u0000\u0000\u0363\u0365\u0003\u0102\u0081\u0000\u0364\u0363\u0001"+
+ "\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365y\u0001\u0000"+
+ "\u0000\u0000\u0366\u0367\u0005U\u0000\u0000\u0367\u036a\u0003|>\u0000"+
+ "\u0368\u036a\u0005Q\u0000\u0000\u0369\u0366\u0001\u0000\u0000\u0000\u0369"+
+ "\u0368\u0001\u0000\u0000\u0000\u036a{\u0001\u0000\u0000\u0000\u036b\u036c"+
+ "\u0005%\u0000\u0000\u036c\u0379\u0005j\u0000\u0000\u036d\u036e\u0003\u00da"+
+ "m\u0000\u036e\u0373\u0005m\u0000\u0000\u036f\u0371\u0003~?\u0000\u0370"+
+ "\u0372\u0005r\u0000\u0000\u0371\u0370\u0001\u0000\u0000\u0000\u0371\u0372"+
+ "\u0001\u0000\u0000\u0000\u0372\u0374\u0001\u0000\u0000\u0000\u0373\u036f"+
+ "\u0001\u0000\u0000\u0000\u0373\u0374\u0001\u0000\u0000\u0000\u0374\u0375"+
+ "\u0001\u0000\u0000\u0000\u0375\u0376\u0005n\u0000\u0000\u0376\u0379\u0001"+
+ "\u0000\u0000\u0000\u0377\u0379\u0003\u00b4Z\u0000\u0378\u036b\u0001\u0000"+
+ "\u0000\u0000\u0378\u036d\u0001\u0000\u0000\u0000\u0378\u0377\u0001\u0000"+
+ "\u0000\u0000\u0379}\u0001\u0000\u0000\u0000\u037a\u037f\u0003|>\u0000"+
+ "\u037b\u037c\u0005r\u0000\u0000\u037c\u037e\u0003|>\u0000\u037d\u037b"+
+ "\u0001\u0000\u0000\u0000\u037e\u0381\u0001\u0000\u0000\u0000\u037f\u037d"+
+ "\u0001\u0000\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u007f"+
+ "\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000\u0000\u0000\u0382\u0387"+
+ "\u0005m\u0000\u0000\u0383\u0384\u0005=\u0000\u0000\u0384\u0385\u0003\u00f6"+
+ "{\u0000\u0385\u0386\u0003\u0180\u00c0\u0000\u0386\u0388\u0001\u0000\u0000"+
+ "\u0000\u0387\u0383\u0001\u0000\u0000\u0000\u0387\u0388\u0001\u0000\u0000"+
+ "\u0000\u0388\u038a\u0001\u0000\u0000\u0000\u0389\u038b\u0003\u0102\u0081"+
+ "\u0000\u038a\u0389\u0001\u0000\u0000\u0000\u038a\u038b\u0001\u0000\u0000"+
+ "\u0000\u038b\u038c\u0001\u0000\u0000\u0000\u038c\u038d\u0005n\u0000\u0000"+
+ "\u038d\u0081\u0001\u0000\u0000\u0000\u038e\u0391\u0003\u0162\u00b1\u0000"+
+ "\u038f\u0391\u0005j\u0000\u0000\u0390\u038e\u0001\u0000\u0000\u0000\u0390"+
+ "\u038f\u0001\u0000\u0000\u0000\u0391\u039a\u0001\u0000\u0000\u0000\u0392"+
+ "\u0397\u0005m\u0000\u0000\u0393\u0395\u0003\u0084B\u0000\u0394\u0396\u0005"+
+ "r\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0395\u0396\u0001\u0000"+
+ "\u0000\u0000\u0396\u0398\u0001\u0000\u0000\u0000\u0397\u0393\u0001\u0000"+
+ "\u0000\u0000\u0397\u0398\u0001\u0000\u0000\u0000\u0398\u0399\u0001\u0000"+
+ "\u0000\u0000\u0399\u039b\u0005n\u0000\u0000\u039a\u0392\u0001\u0000\u0000"+
+ "\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u0083\u0001\u0000\u0000"+
+ "\u0000\u039c\u03a1\u0003\u0086C\u0000\u039d\u039e\u0005r\u0000\u0000\u039e"+
+ "\u03a0\u0003\u0086C\u0000\u039f\u039d\u0001\u0000\u0000\u0000\u03a0\u03a3"+
+ "\u0001\u0000\u0000\u0000\u03a1\u039f\u0001\u0000\u0000\u0000\u03a1\u03a2"+
+ "\u0001\u0000\u0000\u0000\u03a2\u0085\u0001\u0000\u0000\u0000\u03a3\u03a1"+
+ "\u0001\u0000\u0000\u0000\u03a4\u03a5\u0005j\u0000\u0000\u03a5\u03a7\u0005"+
+ "t\u0000\u0000\u03a6\u03a4\u0001\u0000\u0000\u0000\u03a6\u03a7\u0001\u0000"+
+ "\u0000\u0000\u03a7\u03a8\u0001\u0000\u0000\u0000\u03a8\u03a9\u0003\u00b4"+
+ "Z\u0000\u03a9\u0087\u0001\u0000\u0000\u0000\u03aa\u03ab\u0005I\u0000\u0000"+
+ "\u03ab\u03ac\u0003\u00b4Z\u0000\u03ac\u03ad\u0005\u000f\u0000\u0000\u03ad"+
+ "\u03ae\u0003\u0082A\u0000\u03ae\u03af\u0003\u0100\u0080\u0000\u03af\u0089"+
+ "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0003\u00d2i\u0000\u03b1\u03b2\u0005"+
+ "\u000f\u0000\u0000\u03b2\u03c5\u0003\u00d2i\u0000\u03b3\u03b9\u0005m\u0000"+
+ "\u0000\u03b4\u03b5\u0003\u0092I\u0000\u03b5\u03b6\u0003\u0180\u00c0\u0000"+
+ "\u03b6\u03b8\u0001\u0000\u0000\u0000\u03b7\u03b4\u0001\u0000\u0000\u0000"+
+ "\u03b8\u03bb\u0001\u0000\u0000\u0000\u03b9\u03b7\u0001\u0000\u0000\u0000"+
+ "\u03b9\u03ba\u0001\u0000\u0000\u0000\u03ba\u03c1\u0001\u0000\u0000\u0000"+
+ "\u03bb\u03b9\u0001\u0000\u0000\u0000\u03bc\u03bd\u0003\u008cF\u0000\u03bd"+
+ "\u03be\u0003\u0180\u00c0\u0000\u03be\u03c0\u0001\u0000\u0000\u0000\u03bf"+
+ "\u03bc\u0001\u0000\u0000\u0000\u03c0\u03c3\u0001\u0000\u0000\u0000\u03c1"+
+ "\u03bf\u0001\u0000\u0000\u0000\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2"+
+ "\u03c4\u0001\u0000\u0000\u0000\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4"+
+ "\u03c6\u0005n\u0000\u0000\u03c5\u03b3\u0001\u0000\u0000\u0000\u03c5\u03c6"+
+ "\u0001\u0000\u0000\u0000\u03c6\u008b\u0001\u0000\u0000\u0000\u03c7\u03c9"+
+ "\u0005\u000e\u0000\u0000\u03c8\u03c7\u0001\u0000\u0000\u0000\u03c8\u03c9"+
+ "\u0001\u0000\u0000\u0000\u03c9\u03ca\u0001\u0000\u0000\u0000\u03ca\u03cb"+
+ "\u0003\u008eG\u0000\u03cb\u03cc\u0005j\u0000\u0000\u03cc\u03ce\u0003\u0150"+
+ "\u00a8\u0000\u03cd\u03cf\u0003\u0100\u0080\u0000\u03ce\u03cd\u0001\u0000"+
+ "\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03cf\u008d\u0001\u0000"+
+ "\u0000\u0000\u03d0\u03d2\u0005k\u0000\u0000\u03d1\u03d3\u0005j\u0000\u0000"+
+ "\u03d2\u03d1\u0001\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000"+
+ "\u03d3\u03d5\u0001\u0000\u0000\u0000\u03d4\u03d6\u0005\u008c\u0000\u0000"+
+ "\u03d5\u03d4\u0001\u0000\u0000\u0000\u03d5\u03d6\u0001\u0000\u0000\u0000"+
+ "\u03d6\u03d7\u0001\u0000\u0000\u0000\u03d7\u03d8\u0003\u013e\u009f\u0000"+
+ "\u03d8\u03d9\u0005l\u0000\u0000\u03d9\u008f\u0001\u0000\u0000\u0000\u03da"+
+ "\u03e0\u0003\u00c4b\u0000\u03db\u03dc\u0003\u00d2i\u0000\u03dc\u03dd\u0005"+
+ "u\u0000\u0000\u03dd\u03de\u0005j\u0000\u0000\u03de\u03e0\u0001\u0000\u0000"+
+ "\u0000\u03df\u03da\u0001\u0000\u0000\u0000\u03df\u03db\u0001\u0000\u0000"+
+ "\u0000\u03e0\u0091\u0001\u0000\u0000\u0000\u03e1\u03e2\u00058\u0000\u0000"+
+ "\u03e2\u03e3\u0005j\u0000\u0000\u03e3\u03e6\u0005x\u0000\u0000\u03e4\u03e7"+
+ "\u0003\u0090H\u0000\u03e5\u03e7\u0003\u0160\u00b0\u0000\u03e6\u03e4\u0001"+
+ "\u0000\u0000\u0000\u03e6\u03e5\u0001\u0000\u0000\u0000\u03e7\u0093\u0001"+
+ "\u0000\u0000\u0000\u03e8\u03e9\u0005/\u0000\u0000\u03e9\u03ea\u0005k\u0000"+
+ "\u0000\u03ea\u03ed\u0003\u00d2i\u0000\u03eb\u03ec\u0005r\u0000\u0000\u03ec"+
+ "\u03ee\u0003\u00f8|\u0000\u03ed\u03eb\u0001\u0000\u0000\u0000\u03ed\u03ee"+
+ "\u0001\u0000\u0000\u0000\u03ee\u03ef\u0001\u0000\u0000\u0000\u03ef\u03f0"+
+ "\u0005l\u0000\u0000\u03f0\u0095\u0001\u0000\u0000\u0000\u03f1\u03f2\u0005"+
+ ".\u0000\u0000\u03f2\u03f3\u0005k\u0000\u0000\u03f3\u03f4\u0003\u00d2i"+
+ "\u0000\u03f4\u03f5\u0005l\u0000\u0000\u03f5\u0097\u0001\u0000\u0000\u0000"+
+ "\u03f6\u03f9\u0003d2\u0000\u03f7\u03fa\u0003\u009aM\u0000\u03f8\u03fa"+
+ "\u0003\u009cN\u0000\u03f9\u03f7\u0001\u0000\u0000\u0000\u03f9\u03f8\u0001"+
+ "\u0000\u0000\u0000\u03fa\u0099\u0001\u0000\u0000\u0000\u03fb\u03fc\u0005"+
+ "R\u0000\u0000\u03fc\u03fd\u0005j\u0000\u0000\u03fd\u03ff\u0003\u0150\u00a8"+
+ "\u0000\u03fe\u0400\u0003\u0080@\u0000\u03ff\u03fe\u0001\u0000\u0000\u0000"+
+ "\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u009b\u0001\u0000\u0000\u0000"+
+ "\u0401\u0402\u0005R\u0000\u0000\u0402\u0403\u0003\u00aaU\u0000\u0403\u0404"+
+ "\u0005j\u0000\u0000\u0404\u0406\u0003\u0150\u00a8\u0000\u0405\u0407\u0003"+
+ "\u0080@\u0000\u0406\u0405\u0001\u0000\u0000\u0000\u0406\u0407\u0001\u0000"+
+ "\u0000\u0000\u0407\u009d\u0001\u0000\u0000\u0000\u0408\u040b\u0005\u001b"+
+ "\u0000\u0000\u0409\u040c\u0003\u0098L\u0000\u040a\u040c\u0003\u00f0x\u0000"+
+ "\u040b\u0409\u0001\u0000\u0000\u0000\u040b\u040a\u0001\u0000\u0000\u0000"+
+ "\u040c\u009f\u0001\u0000\u0000\u0000\u040d\u040e\u00058\u0000\u0000\u040e"+
+ "\u040f\u0005j\u0000\u0000\u040f\u0411\u0003\u0154\u00aa\u0000\u0410\u0412"+
+ "\u0003\u00a2Q\u0000\u0411\u0410\u0001\u0000\u0000\u0000\u0411\u0412\u0001"+
+ "\u0000\u0000\u0000\u0412\u00a1\u0001\u0000\u0000\u0000\u0413\u0414\u0005"+
+ "m\u0000\u0000\u0414\u0415\u0003\u00b4Z\u0000\u0415\u0416\u0003\u0180\u00c0"+
+ "\u0000\u0416\u0417\u0005n\u0000\u0000\u0417\u00a3\u0001\u0000\u0000\u0000"+
+ "\u0418\u0419\u00058\u0000\u0000\u0419\u041a\u0003\u00aaU\u0000\u041a\u041b"+
+ "\u0005j\u0000\u0000\u041b\u041d\u0003\u0154\u00aa\u0000\u041c\u041e\u0003"+
+ "\u00a2Q\u0000\u041d\u041c\u0001\u0000\u0000\u0000\u041d\u041e\u0001\u0000"+
+ "\u0000\u0000\u041e\u00a5\u0001\u0000\u0000\u0000\u041f\u0427\u0003\u0006"+
+ "\u0003\u0000\u0420\u0423\u0003\u00d2i\u0000\u0421\u0422\u0005q\u0000\u0000"+
+ "\u0422\u0424\u0003\u00f8|\u0000\u0423\u0421\u0001\u0000\u0000\u0000\u0423"+
+ "\u0424\u0001\u0000\u0000\u0000\u0424\u0428\u0001\u0000\u0000\u0000\u0425"+
+ "\u0426\u0005q\u0000\u0000\u0426\u0428\u0003\u00f8|\u0000\u0427\u0420\u0001"+
+ "\u0000\u0000\u0000\u0427\u0425\u0001\u0000\u0000\u0000\u0428\u00a7\u0001"+
+ "\u0000\u0000\u0000\u0429\u042a\u0003\u0006\u0003\u0000\u042a\u042b\u0005"+
+ "x\u0000\u0000\u042b\u042c\u0003\u00f8|\u0000\u042c\u00a9\u0001\u0000\u0000"+
+ "\u0000\u042d\u042f\u0005k\u0000\u0000\u042e\u0430\u0003\b\u0004\u0000"+
+ "\u042f\u042e\u0001\u0000\u0000\u0000\u042f\u0430\u0001\u0000\u0000\u0000"+
+ "\u0430\u0431\u0001\u0000\u0000\u0000\u0431\u0433\u0003\u00d2i\u0000\u0432"+
+ "\u0434\u0005r\u0000\u0000\u0433\u0432\u0001\u0000\u0000\u0000\u0433\u0434"+
+ "\u0001\u0000\u0000\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435\u0436"+
+ "\u0005l\u0000\u0000\u0436\u00ab\u0001\u0000\u0000\u0000\u0437\u043a\u0003"+
+ "\u00aeW\u0000\u0438\u043a\u0003\u00b0X\u0000\u0439\u0437\u0001\u0000\u0000"+
+ "\u0000\u0439\u0438\u0001\u0000\u0000\u0000\u043a\u00ad\u0001\u0000\u0000"+
+ "\u0000\u043b\u043d\u0003\u00f6{\u0000\u043c\u043b\u0001\u0000\u0000\u0000"+
+ "\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0001\u0000\u0000\u0000"+
+ "\u043e\u043f\u0003\u00b2Y\u0000\u043f\u00af\u0001\u0000\u0000\u0000\u0440"+
+ "\u0442\u0005\u001b\u0000\u0000\u0441\u0443\u0003\u00f6{\u0000\u0442\u0441"+
+ "\u0001\u0000\u0000\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444"+
+ "\u0001\u0000\u0000\u0000\u0444\u0445\u0003\u00b2Y\u0000\u0445\u00b1\u0001"+
+ "\u0000\u0000\u0000\u0446\u0448\u0005y\u0000\u0000\u0447\u0446\u0001\u0000"+
+ "\u0000\u0000\u0447\u0448\u0001\u0000\u0000\u0000\u0448\u0449\u0001\u0000"+
+ "\u0000\u0000\u0449\u044a\u0003\u00d2i\u0000\u044a\u00b3\u0001\u0000\u0000"+
+ "\u0000\u044b\u044c\u0006Z\uffff\uffff\u0000\u044c\u044d\u0007\u0007\u0000"+
+ "\u0000\u044d\u0461\u0003\u00b4Z\u000f\u044e\u0461\u0003\u00c4b\u0000\u044f"+
+ "\u0450\u0005\u0019\u0000\u0000\u0450\u0451\u0003.\u0017\u0000\u0451\u0452"+
+ "\u0005\u001c\u0000\u0000\u0452\u0453\u0003\u00b4Z\u0003\u0453\u0461\u0001"+
+ "\u0000\u0000\u0000\u0454\u0455\u0005\u001a\u0000\u0000\u0455\u0456\u0003"+
+ "\u00a8T\u0000\u0456\u0457\u0005\u001c\u0000\u0000\u0457\u0458\u0003\u00b4"+
+ "Z\u0002\u0458\u0461\u0001\u0000\u0000\u0000\u0459\u045a\u0007\b\u0000"+
+ "\u0000\u045a\u045b\u0003&\u0013\u0000\u045b\u045c\u0005t\u0000\u0000\u045c"+
+ "\u045d\u0005t\u0000\u0000\u045d\u045e\u0003*\u0015\u0000\u045e\u045f\u0003"+
+ "\u00b4Z\u0001\u045f\u0461\u0001\u0000\u0000\u0000\u0460\u044b\u0001\u0000"+
+ "\u0000\u0000\u0460\u044e\u0001\u0000\u0000\u0000\u0460\u044f\u0001\u0000"+
+ "\u0000\u0000\u0460\u0454\u0001\u0000\u0000\u0000\u0460\u0459\u0001\u0000"+
+ "\u0000\u0000\u0461\u0485\u0001\u0000\u0000\u0000\u0462\u0463\n\r\u0000"+
+ "\u0000\u0463\u0464\u0007\t\u0000\u0000\u0464\u0484\u0003\u00b4Z\u000e"+
+ "\u0465\u0466\n\f\u0000\u0000\u0466\u0467\u0007\n\u0000\u0000\u0467\u0484"+
+ "\u0003\u00b4Z\r\u0468\u0469\n\u000b\u0000\u0000\u0469\u046a\u0007\u000b"+
+ "\u0000\u0000\u046a\u0484\u0003\u00b4Z\f\u046b\u046c\n\n\u0000\u0000\u046c"+
+ "\u046d\u0007\f\u0000\u0000\u046d\u0484\u0003\u00b4Z\u000b\u046e\u046f"+
+ "\n\t\u0000\u0000\u046f\u0470\u0007\r\u0000\u0000\u0470\u0484\u0003\u00b4"+
+ "Z\n\u0471\u0472\n\u0007\u0000\u0000\u0472\u0473\u0005{\u0000\u0000\u0473"+
+ "\u0484\u0003\u00b4Z\b\u0474\u0475\n\u0006\u0000\u0000\u0475\u0476\u0005"+
+ "z\u0000\u0000\u0476\u0484\u0003\u00b4Z\u0007\u0477\u0478\n\u0005\u0000"+
+ "\u0000\u0478\u0479\u0005\"\u0000\u0000\u0479\u0484\u0003\u00b4Z\u0005"+
+ "\u047a\u047b\n\u0004\u0000\u0000\u047b\u047c\u0005%\u0000\u0000\u047c"+
+ "\u047d\u0003\u00b4Z\u0000\u047d\u047e\u0005t\u0000\u0000\u047e\u047f\u0003"+
+ "\u00b4Z\u0004\u047f\u0484\u0001\u0000\u0000\u0000\u0480\u0481\n\b\u0000"+
+ "\u0000\u0481\u0482\u0005\u000f\u0000\u0000\u0482\u0484\u0003\u0082A\u0000"+
+ "\u0483\u0462\u0001\u0000\u0000\u0000\u0483\u0465\u0001\u0000\u0000\u0000"+
+ "\u0483\u0468\u0001\u0000\u0000\u0000\u0483\u046b\u0001\u0000\u0000\u0000"+
+ "\u0483\u046e\u0001\u0000\u0000\u0000\u0483\u0471\u0001\u0000\u0000\u0000"+
+ "\u0483\u0474\u0001\u0000\u0000\u0000\u0483\u0477\u0001\u0000\u0000\u0000"+
+ "\u0483\u047a\u0001\u0000\u0000\u0000\u0483\u0480\u0001\u0000\u0000\u0000"+
+ "\u0484\u0487\u0001\u0000\u0000\u0000\u0485\u0483\u0001\u0000\u0000\u0000"+
+ "\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u00b5\u0001\u0000\u0000\u0000"+
+ "\u0487\u0485\u0001\u0000\u0000\u0000\u0488\u049d\u0003\u0018\f\u0000\u0489"+
+ "\u049d\u0003\u001a\r\u0000\u048a\u049d\u0003\u00ba]\u0000\u048b\u049d"+
+ "\u0003\u00b8\\\u0000\u048c\u049d\u0003\u00f0x\u0000\u048d\u049d\u0003"+
+ "\u0110\u0088\u0000\u048e\u049d\u0003\u0104\u0082\u0000\u048f\u049d\u0003"+
+ "\u013c\u009e\u0000\u0490\u049d\u0003\u0112\u0089\u0000\u0491\u049d\u0003"+
+ "\u0114\u008a\u0000\u0492\u049d\u0003\u0116\u008b\u0000\u0493\u049d\u0003"+
+ "\u0118\u008c\u0000\u0494\u049d\u0003\u011a\u008d\u0000\u0495\u049d\u0003"+
+ "\u0100\u0080\u0000\u0496\u049d\u0003\u011c\u008e\u0000\u0497\u049d\u0003"+
+ "\u011e\u008f\u0000\u0498\u049d\u0003\u0130\u0098\u0000\u0499\u049d\u0003"+
+ "\u00bc^\u0000\u049a\u049d\u0003\u00c0`\u0000\u049b\u049d\u0003\u0088D"+
+ "\u0000\u049c\u0488\u0001\u0000\u0000\u0000\u049c\u0489\u0001\u0000\u0000"+
+ "\u0000\u049c\u048a\u0001\u0000\u0000\u0000\u049c\u048b\u0001\u0000\u0000"+
+ "\u0000\u049c\u048c\u0001\u0000\u0000\u0000\u049c\u048d\u0001\u0000\u0000"+
+ "\u0000\u049c\u048e\u0001\u0000\u0000\u0000\u049c\u048f\u0001\u0000\u0000"+
+ "\u0000\u049c\u0490\u0001\u0000\u0000\u0000\u049c\u0491\u0001\u0000\u0000"+
+ "\u0000\u049c\u0492\u0001\u0000\u0000\u0000\u049c\u0493\u0001\u0000\u0000"+
+ "\u0000\u049c\u0494\u0001\u0000\u0000\u0000\u049c\u0495\u0001\u0000\u0000"+
+ "\u0000\u049c\u0496\u0001\u0000\u0000\u0000\u049c\u0497\u0001\u0000\u0000"+
+ "\u0000\u049c\u0498\u0001\u0000\u0000\u0000\u049c\u0499\u0001\u0000\u0000"+
+ "\u0000\u049c\u049a\u0001\u0000\u0000\u0000\u049c\u049b\u0001\u0000\u0000"+
+ "\u0000\u049d\u00b7\u0001\u0000\u0000\u0000\u049e\u049f\u0005$\u0000\u0000"+
+ "\u049f\u04a0\u0003\u00b4Z\u0000\u04a0\u00b9\u0001\u0000\u0000\u0000\u04a1"+
+ "\u04a2\u0005]\u0000\u0000\u04a2\u04a4\u0003\u00b4Z\u0000\u04a3\u04a5\u0003"+
+ "\u0100\u0080\u0000\u04a4\u04a3\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001"+
+ "\u0000\u0000\u0000\u04a5\u00bb\u0001\u0000\u0000\u0000\u04a6\u04a7\u0003"+
+ "\u00be_\u0000\u04a7\u04a8\u0003\u0138\u009c\u0000\u04a8\u00bd\u0001\u0000"+
+ "\u0000\u0000\u04a9\u04aa\u0005\f\u0000\u0000\u04aa\u04ab\u0003\u00b4Z"+
+ "\u0000\u04ab\u04ac\u0003\u0180\u00c0\u0000\u04ac\u04ae\u0001\u0000\u0000"+
+ "\u0000\u04ad\u04a9\u0001\u0000\u0000\u0000\u04ae\u04b1\u0001\u0000\u0000"+
+ "\u0000\u04af\u04ad\u0001\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000"+
+ "\u0000\u04b0\u04b6\u0001\u0000\u0000\u0000\u04b1\u04af\u0001\u0000\u0000"+
+ "\u0000\u04b2\u04b3\u0005\r\u0000\u0000\u04b3\u04b4\u0003r9\u0000\u04b4"+
+ "\u04b5\u0003\u0180\u00c0\u0000\u04b5\u04b7\u0001\u0000\u0000\u0000\u04b6"+
+ "\u04b2\u0001\u0000\u0000\u0000\u04b6\u04b7\u0001\u0000\u0000\u0000\u04b7"+
+ "\u00bf\u0001\u0000\u0000\u0000\u04b8\u04b9\u0005V\u0000\u0000\u04b9\u04be"+
+ "\u0003\u00b4Z\u0000\u04ba\u04bb\u0005V\u0000\u0000\u04bb\u04bc\u0007\u0001"+
+ "\u0000\u0000\u04bc\u04be\u0003.\u0017\u0000\u04bd\u04b8\u0001\u0000\u0000"+
+ "\u0000\u04bd\u04ba\u0001\u0000\u0000\u0000\u04be\u00c1\u0001\u0000\u0000"+
+ "\u0000\u04bf\u04c8\u0005\u0003\u0000\u0000\u04c0\u04c8\u0005\u0004\u0000"+
+ "\u0000\u04c1\u04c8\u0005i\u0000\u0000\u04c2\u04c8\u0003\u015e\u00af\u0000"+
+ "\u04c3\u04c8\u0003\u0172\u00b9\u0000\u04c4\u04c8\u0005\u0001\u0000\u0000"+
+ "\u04c5\u04c8\u0005\u0094\u0000\u0000\u04c6\u04c8\u0005\u0095\u0000\u0000"+
+ "\u04c7\u04bf\u0001\u0000\u0000\u0000\u04c7\u04c0\u0001\u0000\u0000\u0000"+
+ "\u04c7\u04c1\u0001\u0000\u0000\u0000\u04c7\u04c2\u0001\u0000\u0000\u0000"+
+ "\u04c7\u04c3\u0001\u0000\u0000\u0000\u04c7\u04c4\u0001\u0000\u0000\u0000"+
+ "\u04c7\u04c5\u0001\u0000\u0000\u0000\u04c7\u04c6\u0001\u0000\u0000\u0000"+
+ "\u04c8\u00c3\u0001\u0000\u0000\u0000\u04c9\u04ca\u0006b\uffff\uffff\u0000"+
+ "\u04ca\u04da\u0003\u015a\u00ad\u0000\u04cb\u04da\u0003\u0156\u00ab\u0000"+
+ "\u04cc\u04da\u0003\u017c\u00be\u0000\u04cd\u04da\u0003 \u0010\u0000\u04ce"+
+ "\u04da\u0003\u0096K\u0000\u04cf\u04da\u0003\u0094J\u0000\u04d0\u04d1\u0005"+
+ "N\u0000\u0000\u04d1\u04d2\u0003\u00c4b\u0000\u04d2\u04d3\u0003\u017a\u00bd"+
+ "\u0000\u04d3\u04da\u0001\u0000\u0000\u0000\u04d4\u04d5\u0007\u000e\u0000"+
+ "\u0000\u04d5\u04d6\u0005k\u0000\u0000\u04d6\u04d7\u0003\u00b4Z\u0000\u04d7"+
+ "\u04d8\u0005l\u0000\u0000\u04d8\u04da\u0001\u0000\u0000\u0000\u04d9\u04c9"+
+ "\u0001\u0000\u0000\u0000\u04d9\u04cb\u0001\u0000\u0000\u0000\u04d9\u04cc"+
+ "\u0001\u0000\u0000\u0000\u04d9\u04cd\u0001\u0000\u0000\u0000\u04d9\u04ce"+
+ "\u0001\u0000\u0000\u0000\u04d9\u04cf\u0001\u0000\u0000\u0000\u04d9\u04d0"+
+ "\u0001\u0000\u0000\u0000\u04d9\u04d4\u0001\u0000\u0000\u0000\u04da\u04f1"+
+ "\u0001\u0000\u0000\u0000\u04db\u04dc\n\n\u0000\u0000\u04dc\u04dd\u0005"+
+ "u\u0000\u0000\u04dd\u04f0\u0005j\u0000\u0000\u04de\u04df\n\t\u0000\u0000"+
+ "\u04df\u04f0\u0003\u0176\u00bb\u0000\u04e0\u04e1\n\b\u0000\u0000\u04e1"+
+ "\u04f0\u0003\u00e0p\u0000\u04e2\u04e3\n\u0007\u0000\u0000\u04e3\u04f0"+
+ "\u0003P(\u0000\u04e4\u04e5\n\u0006\u0000\u0000\u04e5\u04f0\u0003\u0178"+
+ "\u00bc\u0000\u04e6\u04e7\n\u0005\u0000\u0000\u04e7\u04f0\u0003\u017a\u00bd"+
+ "\u0000\u04e8\u04e9\n\u0003\u0000\u0000\u04e9\u04ea\u0003\u017a\u00bd\u0000"+
+ "\u04ea\u04eb\u0005\u0010\u0000\u0000\u04eb\u04ec\u0003\u0082A\u0000\u04ec"+
+ "\u04f0\u0001\u0000\u0000\u0000\u04ed\u04ee\n\u0002\u0000\u0000\u04ee\u04f0"+
+ "\u0003\u00cae\u0000\u04ef\u04db\u0001\u0000\u0000\u0000\u04ef\u04de\u0001"+
+ "\u0000\u0000\u0000\u04ef\u04e0\u0001\u0000\u0000\u0000\u04ef\u04e2\u0001"+
+ "\u0000\u0000\u0000\u04ef\u04e4\u0001\u0000\u0000\u0000\u04ef\u04e6\u0001"+
+ "\u0000\u0000\u0000\u04ef\u04e8\u0001\u0000\u0000\u0000\u04ef\u04ed\u0001"+
+ "\u0000\u0000\u0000\u04f0\u04f3\u0001\u0000\u0000\u0000\u04f1\u04ef\u0001"+
+ "\u0000\u0000\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2\u00c5\u0001"+
+ "\u0000\u0000\u0000\u04f3\u04f1\u0001\u0000\u0000\u0000\u04f4\u04f5\u0003"+
+ "d2\u0000\u04f5\u04f6\u0003\u00c8d\u0000\u04f6\u00c7\u0001\u0000\u0000"+
+ "\u0000\u04f7\u04f9\u0005R\u0000\u0000\u04f8\u04fa\u0005j\u0000\u0000\u04f9"+
+ "\u04f8\u0001\u0000\u0000\u0000\u04f9\u04fa\u0001\u0000\u0000\u0000\u04fa"+
+ "\u04fb\u0001\u0000\u0000\u0000\u04fb\u04fd\u0003\u0150\u00a8\u0000\u04fc"+
+ "\u04fe\u0003\u0080@\u0000\u04fd\u04fc\u0001\u0000\u0000\u0000\u04fd\u04fe"+
+ "\u0001\u0000\u0000\u0000\u04fe\u00c9\u0001\u0000\u0000\u0000\u04ff\u0501"+
+ "\u0005&\u0000\u0000\u0500\u0502\u0003\u00f8|\u0000\u0501\u0500\u0001\u0000"+
+ "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0504\u0001\u0000"+
+ "\u0000\u0000\u0503\u0505\u0005r\u0000\u0000\u0504\u0503\u0001\u0000\u0000"+
+ "\u0000\u0504\u0505\u0001\u0000\u0000\u0000\u0505\u0506\u0001\u0000\u0000"+
+ "\u0000\u0506\u0507\u0005\'\u0000\u0000\u0507\u00cb\u0001\u0000\u0000\u0000"+
+ "\u0508\u0509\u0005S\u0000\u0000\u0509\u0513\u0005m\u0000\u0000\u050a\u050e"+
+ "\u0003\u00d0h\u0000\u050b\u050e\u0003\u013e\u009f\u0000\u050c\u050e\u0003"+
+ "\u00ceg\u0000\u050d\u050a\u0001\u0000\u0000\u0000\u050d\u050b\u0001\u0000"+
+ "\u0000\u0000\u050d\u050c\u0001\u0000\u0000\u0000\u050e\u050f\u0001\u0000"+
+ "\u0000\u0000\u050f\u0510\u0003\u0180\u00c0\u0000\u0510\u0512\u0001\u0000"+
+ "\u0000\u0000\u0511\u050d\u0001\u0000\u0000\u0000\u0512\u0515\u0001\u0000"+
+ "\u0000\u0000\u0513\u0511\u0001\u0000\u0000\u0000\u0513\u0514\u0001\u0000"+
+ "\u0000\u0000\u0514\u0516\u0001\u0000\u0000\u0000\u0515\u0513\u0001\u0000"+
+ "\u0000\u0000\u0516\u0517\u0005n\u0000\u0000\u0517\u00cd\u0001\u0000\u0000"+
+ "\u0000\u0518\u0519\u00058\u0000\u0000\u0519\u051a\u0005j\u0000\u0000\u051a"+
+ "\u051b\u0003\u0154\u00aa\u0000\u051b\u00cf\u0001\u0000\u0000\u0000\u051c"+
+ "\u051e\u0005\u001b\u0000\u0000\u051d\u051c\u0001\u0000\u0000\u0000\u051d"+
+ "\u051e\u0001\u0000\u0000\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f"+
+ "\u0520\u0003d2\u0000\u0520\u0521\u0005j\u0000\u0000\u0521\u0522\u0003"+
+ "\u0154\u00aa\u0000\u0522\u0523\u0003\u0152\u00a9\u0000\u0523\u052c\u0001"+
+ "\u0000\u0000\u0000\u0524\u0526\u0005\u001b\u0000\u0000\u0525\u0524\u0001"+
+ "\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000\u0000\u0526\u0527\u0001"+
+ "\u0000\u0000\u0000\u0527\u0528\u0003d2\u0000\u0528\u0529\u0005j\u0000"+
+ "\u0000\u0529\u052a\u0003\u0154\u00aa\u0000\u052a\u052c\u0001\u0000\u0000"+
+ "\u0000\u052b\u051d\u0001\u0000\u0000\u0000\u052b\u0525\u0001\u0000\u0000"+
+ "\u0000\u052c\u00d1\u0001\u0000\u0000\u0000\u052d\u0535\u0003\u013e\u009f"+
+ "\u0000\u052e\u0535\u0003\u00d4j\u0000\u052f\u0535\u0003T*\u0000\u0530"+
+ "\u0531\u0005k\u0000\u0000\u0531\u0532\u0003\u00d2i\u0000\u0532\u0533\u0005"+
+ "l\u0000\u0000\u0533\u0535\u0001\u0000\u0000\u0000\u0534\u052d\u0001\u0000"+
+ "\u0000\u0000\u0534\u052e\u0001\u0000\u0000\u0000\u0534\u052f\u0001\u0000"+
+ "\u0000\u0000\u0534\u0530\u0001\u0000\u0000\u0000\u0535\u00d3\u0001\u0000"+
+ "\u0000\u0000\u0536\u0540\u0003\u0140\u00a0\u0000\u0537\u0540\u0003\u0170"+
+ "\u00b8\u0000\u0538\u0540\u0003\u0146\u00a3\u0000\u0539\u0540\u0003\u014e"+
+ "\u00a7\u0000\u053a\u0540\u0003\u00ccf\u0000\u053b\u0540\u0003\u0148\u00a4"+
+ "\u0000\u053c\u0540\u0003\u014a\u00a5\u0000\u053d\u0540\u0003\u014c\u00a6"+
+ "\u0000\u053e\u0540\u0003\u00d6k\u0000\u053f\u0536\u0001\u0000\u0000\u0000"+
+ "\u053f\u0537\u0001\u0000\u0000\u0000\u053f\u0538\u0001\u0000\u0000\u0000"+
+ "\u053f\u0539\u0001\u0000\u0000\u0000\u053f\u053a\u0001\u0000\u0000\u0000"+
+ "\u053f\u053b\u0001\u0000\u0000\u0000\u053f\u053c\u0001\u0000\u0000\u0000"+
+ "\u053f\u053d\u0001\u0000\u0000\u0000\u053f\u053e\u0001\u0000\u0000\u0000"+
+ "\u0540\u00d5\u0001\u0000\u0000\u0000\u0541\u0542\u00058\u0000\u0000\u0542"+
+ "\u0543\u0003\u00d8l\u0000\u0543\u00d7\u0001\u0000\u0000\u0000\u0544\u0550"+
+ "\u0005k\u0000\u0000\u0545\u054a\u0003\u00d2i\u0000\u0546\u0547\u0005r"+
+ "\u0000\u0000\u0547\u0549\u0003\u00d2i\u0000\u0548\u0546\u0001\u0000\u0000"+
+ "\u0000\u0549\u054c\u0001\u0000\u0000\u0000\u054a\u0548\u0001\u0000\u0000"+
+ "\u0000\u054a\u054b\u0001\u0000\u0000\u0000\u054b\u054e\u0001\u0000\u0000"+
+ "\u0000\u054c\u054a\u0001\u0000\u0000\u0000\u054d\u054f\u0005r\u0000\u0000"+
+ "\u054e\u054d\u0001\u0000\u0000\u0000\u054e\u054f\u0001\u0000\u0000\u0000"+
+ "\u054f\u0551\u0001\u0000\u0000\u0000\u0550\u0545\u0001\u0000\u0000\u0000"+
+ "\u0550\u0551\u0001\u0000\u0000\u0000\u0551\u0552\u0001\u0000\u0000\u0000"+
+ "\u0552\u0553\u0005l\u0000\u0000\u0553\u00d9\u0001\u0000\u0000\u0000\u0554"+
+ "\u055c\u0003\u0170\u00b8\u0000\u0555\u055c\u0003\u0140\u00a0\u0000\u0556"+
+ "\u055c\u0003\u00dcn\u0000\u0557\u055c\u0003\u0148\u00a4\u0000\u0558\u055c"+
+ "\u0003\u014a\u00a5\u0000\u0559\u055c\u0003T*\u0000\u055a\u055c\u0003\u013e"+
+ "\u009f\u0000\u055b\u0554\u0001\u0000\u0000\u0000\u055b\u0555\u0001\u0000"+
+ "\u0000\u0000\u055b\u0556\u0001\u0000\u0000\u0000\u055b\u0557\u0001\u0000"+
+ "\u0000\u0000\u055b\u0558\u0001\u0000\u0000\u0000\u055b\u0559\u0001\u0000"+
+ "\u0000\u0000\u055b\u055a\u0001\u0000\u0000\u0000\u055c\u00db\u0001\u0000"+
+ "\u0000\u0000\u055d\u055e\u0005o\u0000\u0000\u055e\u055f\u0005y\u0000\u0000"+
+ "\u055f\u0560\u0005p\u0000\u0000\u0560\u0561\u0003\u0144\u00a2\u0000\u0561"+
+ "\u00dd\u0001\u0000\u0000\u0000\u0562\u0564\u0005\u001b\u0000\u0000\u0563"+
+ "\u0562\u0001\u0000\u0000\u0000\u0563\u0564\u0001\u0000\u0000\u0000\u0564"+
+ "\u0569\u0001\u0000\u0000\u0000\u0565\u0566\u0003\u00f6{\u0000\u0566\u0567"+
+ "\u0003\u00d2i\u0000\u0567\u056a\u0001\u0000\u0000\u0000\u0568\u056a\u0003"+
+ "\u0174\u00ba\u0000\u0569\u0565\u0001\u0000\u0000\u0000\u0569\u0568\u0001"+
+ "\u0000\u0000\u0000\u056a\u056c\u0001\u0000\u0000\u0000\u056b\u056d\u0003"+
+ "\u0172\u00b9\u0000\u056c\u056b\u0001\u0000\u0000\u0000\u056c\u056d\u0001"+
+ "\u0000\u0000\u0000\u056d\u00df\u0001\u0000\u0000\u0000\u056e\u057e\u0005"+
+ "o\u0000\u0000\u056f\u0571\u0003\u00e2q\u0000\u0570\u056f\u0001\u0000\u0000"+
+ "\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u0001\u0000\u0000"+
+ "\u0000\u0572\u0574\u0005t\u0000\u0000\u0573\u0575\u0003\u00e4r\u0000\u0574"+
+ "\u0573\u0001\u0000\u0000\u0000\u0574\u0575\u0001\u0000\u0000\u0000\u0575"+
+ "\u057f\u0001\u0000\u0000\u0000\u0576\u0578\u0003\u00e2q\u0000\u0577\u0576"+
+ "\u0001\u0000\u0000\u0000\u0577\u0578\u0001\u0000\u0000\u0000\u0578\u0579"+
+ "\u0001\u0000\u0000\u0000\u0579\u057a\u0005t\u0000\u0000\u057a\u057b\u0003"+
+ "\u00e4r\u0000\u057b\u057c\u0005t\u0000\u0000\u057c\u057d\u0003\u00e6s"+
+ "\u0000\u057d\u057f\u0001\u0000\u0000\u0000\u057e\u0570\u0001\u0000\u0000"+
+ "\u0000\u057e\u0577\u0001\u0000\u0000\u0000\u057f\u0580\u0001\u0000\u0000"+
+ "\u0000\u0580\u0581\u0005p\u0000\u0000\u0581\u00e1\u0001\u0000\u0000\u0000"+
+ "\u0582\u0583\u0003\u00b4Z\u0000\u0583\u00e3\u0001\u0000\u0000\u0000\u0584"+
+ "\u0585\u0003\u00b4Z\u0000\u0585\u00e5\u0001\u0000\u0000\u0000\u0586\u0587"+
+ "\u0003\u00b4Z\u0000\u0587\u00e7\u0001\u0000\u0000\u0000\u0588\u058a\u0007"+
+ "\u000f\u0000\u0000\u0589\u0588\u0001\u0000\u0000\u0000\u0589\u058a\u0001"+
+ "\u0000\u0000\u0000\u058a\u058b\u0001\u0000\u0000\u0000\u058b\u058c\u0005"+
+ "q\u0000\u0000\u058c\u00e9\u0001\u0000\u0000\u0000\u058d\u058e\u0003\u00f8"+
+ "|\u0000\u058e\u058f\u0005q\u0000\u0000\u058f\u0594\u0001\u0000\u0000\u0000"+
+ "\u0590\u0591\u0003\u0006\u0003\u0000\u0591\u0592\u0005x\u0000\u0000\u0592"+
+ "\u0594\u0001\u0000\u0000\u0000\u0593\u058d\u0001\u0000\u0000\u0000\u0593"+
+ "\u0590\u0001\u0000\u0000\u0000\u0593\u0594\u0001\u0000\u0000\u0000\u0594"+
+ "\u0595\u0001\u0000\u0000\u0000\u0595\u0596\u0005b\u0000\u0000\u0596\u059b"+
+ "\u0003\u00b4Z\u0000\u0597\u0599\u0005L\u0000\u0000\u0598\u059a\u0005j"+
+ "\u0000\u0000\u0599\u0598\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000"+
+ "\u0000\u0000\u059a\u059c\u0001\u0000\u0000\u0000\u059b\u0597\u0001\u0000"+
+ "\u0000\u0000\u059b\u059c\u0001\u0000\u0000\u0000\u059c\u00eb\u0001\u0000"+
+ "\u0000\u0000\u059d\u059e\u0005]\u0000\u0000\u059e\u059f\u0005j\u0000\u0000"+
+ "\u059f\u00ed\u0001\u0000\u0000\u0000\u05a0\u05a1\u0003\u0172\u00b9\u0000"+
+ "\u05a1\u00ef\u0001\u0000\u0000\u0000\u05a2\u05a6\u0003\u00f2y\u0000\u05a3"+
+ "\u05a6\u0003\u00fa}\u0000\u05a4\u05a6\u0003\u00fe\u007f\u0000\u05a5\u05a2"+
+ "\u0001\u0000\u0000\u0000\u05a5\u05a3\u0001\u0000\u0000\u0000\u05a5\u05a4"+
+ "\u0001\u0000\u0000\u0000\u05a6\u00f1\u0001\u0000\u0000\u0000\u05a7\u05b3"+
+ "\u0005_\u0000\u0000\u05a8\u05b4\u0003\u00f4z\u0000\u05a9\u05af\u0005k"+
+ "\u0000\u0000\u05aa\u05ab\u0003\u00f4z\u0000\u05ab\u05ac\u0003\u0180\u00c0"+
+ "\u0000\u05ac\u05ae\u0001\u0000\u0000\u0000\u05ad\u05aa\u0001\u0000\u0000"+
+ "\u0000\u05ae\u05b1\u0001\u0000\u0000\u0000\u05af\u05ad\u0001\u0000\u0000"+
+ "\u0000\u05af\u05b0\u0001\u0000\u0000\u0000\u05b0\u05b2\u0001\u0000\u0000"+
+ "\u0000\u05b1\u05af\u0001\u0000\u0000\u0000\u05b2\u05b4\u0005l\u0000\u0000"+
+ "\u05b3\u05a8\u0001\u0000\u0000\u0000\u05b3\u05a9\u0001\u0000\u0000\u0000"+
+ "\u05b4\u00f3\u0001\u0000\u0000\u0000\u05b5\u05bb\u0003\u00f6{\u0000\u05b6"+
+ "\u05b8\u0003\u00d2i\u0000\u05b7\u05b6\u0001\u0000\u0000\u0000\u05b7\u05b8"+
+ "\u0001\u0000\u0000\u0000\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba"+
+ "\u0005q\u0000\u0000\u05ba\u05bc\u0003\u00f8|\u0000\u05bb\u05b7\u0001\u0000"+
+ "\u0000\u0000\u05bb\u05bc\u0001\u0000\u0000\u0000\u05bc\u00f5\u0001\u0000"+
+ "\u0000\u0000\u05bd\u05c2\u0005j\u0000\u0000\u05be\u05bf\u0005r\u0000\u0000"+
+ "\u05bf\u05c1\u0005j\u0000\u0000\u05c0\u05be\u0001\u0000\u0000\u0000\u05c1"+
+ "\u05c4\u0001\u0000\u0000\u0000\u05c2\u05c0\u0001\u0000\u0000\u0000\u05c2"+
+ "\u05c3\u0001\u0000\u0000\u0000\u05c3\u00f7\u0001\u0000\u0000\u0000\u05c4"+
+ "\u05c2\u0001\u0000\u0000\u0000\u05c5\u05ca\u0003\u00b4Z\u0000\u05c6\u05c7"+
+ "\u0005r\u0000\u0000\u05c7\u05c9\u0003\u00b4Z\u0000\u05c8\u05c6\u0001\u0000"+
+ "\u0000\u0000\u05c9\u05cc\u0001\u0000\u0000\u0000\u05ca\u05c8\u0001\u0000"+
+ "\u0000\u0000\u05ca\u05cb\u0001\u0000\u0000\u0000\u05cb\u00f9\u0001\u0000"+
+ "\u0000\u0000\u05cc\u05ca\u0001\u0000\u0000\u0000\u05cd\u05d9\u0005c\u0000"+
+ "\u0000\u05ce\u05da\u0003\u00fc~\u0000\u05cf\u05d5\u0005k\u0000\u0000\u05d0"+
+ "\u05d1\u0003\u00fc~\u0000\u05d1\u05d2\u0003\u0180\u00c0\u0000\u05d2\u05d4"+
+ "\u0001\u0000\u0000\u0000\u05d3\u05d0\u0001\u0000\u0000\u0000\u05d4\u05d7"+
+ "\u0001\u0000\u0000\u0000\u05d5\u05d3\u0001\u0000\u0000\u0000\u05d5\u05d6"+
+ "\u0001\u0000\u0000\u0000\u05d6\u05d8\u0001\u0000\u0000\u0000\u05d7\u05d5"+
+ "\u0001\u0000\u0000\u0000\u05d8\u05da\u0005l\u0000\u0000\u05d9\u05ce\u0001"+
+ "\u0000\u0000\u0000\u05d9\u05cf\u0001\u0000\u0000\u0000\u05da\u00fb\u0001"+
+ "\u0000\u0000\u0000\u05db\u05dd\u0005j\u0000\u0000\u05dc\u05de\u0005q\u0000"+
+ "\u0000\u05dd\u05dc\u0001\u0000\u0000\u0000\u05dd\u05de\u0001\u0000\u0000"+
+ "\u0000\u05de\u05df\u0001\u0000\u0000\u0000\u05df\u05e0\u0003\u00d2i\u0000"+
+ "\u05e0\u00fd\u0001\u0000\u0000\u0000\u05e1\u05ed\u0005h\u0000\u0000\u05e2"+
+ "\u05ee\u0003\u00a6S\u0000\u05e3\u05e9\u0005k\u0000\u0000\u05e4\u05e5\u0003"+
+ "\u00a6S\u0000\u05e5\u05e6\u0003\u0180\u00c0\u0000\u05e6\u05e8\u0001\u0000"+
+ "\u0000\u0000\u05e7\u05e4\u0001\u0000\u0000\u0000\u05e8\u05eb\u0001\u0000"+
+ "\u0000\u0000\u05e9\u05e7\u0001\u0000\u0000\u0000\u05e9\u05ea\u0001\u0000"+
+ "\u0000\u0000\u05ea\u05ec\u0001\u0000\u0000\u0000\u05eb\u05e9\u0001\u0000"+
+ "\u0000\u0000\u05ec\u05ee\u0005l\u0000\u0000\u05ed\u05e2\u0001\u0000\u0000"+
+ "\u0000\u05ed\u05e3\u0001\u0000\u0000\u0000\u05ee\u00ff\u0001\u0000\u0000"+
+ "\u0000\u05ef\u05f1\u0005m\u0000\u0000\u05f0\u05f2\u0003\u0102\u0081\u0000"+
+ "\u05f1\u05f0\u0001\u0000\u0000\u0000\u05f1\u05f2\u0001\u0000\u0000\u0000"+
+ "\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f4\u0005n\u0000\u0000\u05f4"+
+ "\u0101\u0001\u0000\u0000\u0000\u05f5\u05f7\u0005s\u0000\u0000\u05f6\u05f5"+
+ "\u0001\u0000\u0000\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000\u05f7\u05fd"+
+ "\u0001\u0000\u0000\u0000\u05f8\u05fa\u0005\u00a4\u0000\u0000\u05f9\u05f8"+
+ "\u0001\u0000\u0000\u0000\u05f9\u05fa\u0001\u0000\u0000\u0000\u05fa\u05fd"+
+ "\u0001\u0000\u0000\u0000\u05fb\u05fd\u0004\u0081\u0012\u0000\u05fc\u05f6"+
+ "\u0001\u0000\u0000\u0000\u05fc\u05f9\u0001\u0000\u0000\u0000\u05fc\u05fb"+
+ "\u0001\u0000\u0000\u0000\u05fd\u05fe\u0001\u0000\u0000\u0000\u05fe\u05ff"+
+ "\u0003\u00b6[\u0000\u05ff\u0600\u0003\u0180\u00c0\u0000\u0600\u0602\u0001"+
+ "\u0000\u0000\u0000\u0601\u05fc\u0001\u0000\u0000\u0000\u0602\u0603\u0001"+
+ "\u0000\u0000\u0000\u0603\u0601\u0001\u0000\u0000\u0000\u0603\u0604\u0001"+
+ "\u0000\u0000\u0000\u0604\u0103\u0001\u0000\u0000\u0000\u0605\u060b\u0003"+
+ "\u0108\u0084\u0000\u0606\u060b\u0003\u010a\u0085\u0000\u0607\u060b\u0003"+
+ "\u010c\u0086\u0000\u0608\u060b\u0003\u0106\u0083\u0000\u0609\u060b\u0003"+
+ "\u00a8T\u0000\u060a\u0605\u0001\u0000\u0000\u0000\u060a\u0606\u0001\u0000"+
+ "\u0000\u0000\u060a\u0607\u0001\u0000\u0000\u0000\u060a\u0608\u0001\u0000"+
+ "\u0000\u0000\u060a\u0609\u0001\u0000\u0000\u0000\u060b\u0105\u0001\u0000"+
+ "\u0000\u0000\u060c\u060d\u0003\u00b4Z\u0000\u060d\u0107\u0001\u0000\u0000"+
+ "\u0000\u060e\u060f\u0003\u00b4Z\u0000\u060f\u0610\u0005\u008e\u0000\u0000"+
+ "\u0610\u0611\u0003\u00b4Z\u0000\u0611\u0109\u0001\u0000\u0000\u0000\u0612"+
+ "\u0613\u0003\u00b4Z\u0000\u0613\u0614\u0007\u0010\u0000\u0000\u0614\u010b"+
+ "\u0001\u0000\u0000\u0000\u0615\u0616\u0003\u00f8|\u0000\u0616\u0617\u0003"+
+ "\u00e8t\u0000\u0617\u0618\u0003\u00f8|\u0000\u0618\u010d\u0001\u0000\u0000"+
+ "\u0000\u0619\u061a\u0007\u0011\u0000\u0000\u061a\u010f\u0001\u0000\u0000"+
+ "\u0000\u061b\u061c\u0005j\u0000\u0000\u061c\u061e\u0005t\u0000\u0000\u061d"+
+ "\u061f\u0003\u00b6[\u0000\u061e\u061d\u0001\u0000\u0000\u0000\u061e\u061f"+
+ "\u0001\u0000\u0000\u0000\u061f\u0111\u0001\u0000\u0000\u0000\u0620\u0622"+
+ "\u0005g\u0000\u0000\u0621\u0623\u0003\u00f8|\u0000\u0622\u0621\u0001\u0000"+
+ "\u0000\u0000\u0622\u0623\u0001\u0000\u0000\u0000\u0623\u0113\u0001\u0000"+
+ "\u0000\u0000\u0624\u0626\u0005P\u0000\u0000\u0625\u0627\u0005j\u0000\u0000"+
+ "\u0626\u0625\u0001\u0000\u0000\u0000\u0626\u0627\u0001\u0000\u0000\u0000"+
+ "\u0627\u0115\u0001\u0000\u0000\u0000\u0628\u062a\u0005d\u0000\u0000\u0629"+
+ "\u062b\u0005j\u0000\u0000\u062a\u0629\u0001\u0000\u0000\u0000\u062a\u062b"+
+ "\u0001\u0000\u0000\u0000\u062b\u0117\u0001\u0000\u0000\u0000\u062c\u062d"+
+ "\u0005\\\u0000\u0000\u062d\u062e\u0005j\u0000\u0000\u062e\u0119\u0001"+
+ "\u0000\u0000\u0000\u062f\u0630\u0005`\u0000\u0000\u0630\u011b\u0001\u0000"+
+ "\u0000\u0000\u0631\u063a\u0005a\u0000\u0000\u0632\u063b\u0003\u00b4Z\u0000"+
+ "\u0633\u0634\u0003\u0180\u00c0\u0000\u0634\u0635\u0003\u00b4Z\u0000\u0635"+
+ "\u063b\u0001\u0000\u0000\u0000\u0636\u0637\u0003\u0104\u0082\u0000\u0637"+
+ "\u0638\u0003\u0180\u00c0\u0000\u0638\u0639\u0003\u00b4Z\u0000\u0639\u063b"+
+ "\u0001\u0000\u0000\u0000\u063a\u0632\u0001\u0000\u0000\u0000\u063a\u0633"+
+ "\u0001\u0000\u0000\u0000\u063a\u0636\u0001\u0000\u0000\u0000\u063b\u063c"+
+ "\u0001\u0000\u0000\u0000\u063c\u0642\u0003\u0100\u0080\u0000\u063d\u0640"+
+ "\u0005[\u0000\u0000\u063e\u0641\u0003\u011c\u008e\u0000\u063f\u0641\u0003"+
+ "\u0100\u0080\u0000\u0640\u063e\u0001\u0000\u0000\u0000\u0640\u063f\u0001"+
+ "\u0000\u0000\u0000\u0641\u0643\u0001\u0000\u0000\u0000\u0642\u063d\u0001"+
+ "\u0000\u0000\u0000\u0642\u0643\u0001\u0000\u0000\u0000\u0643\u011d\u0001"+
+ "\u0000\u0000\u0000\u0644\u0647\u0003\u0120\u0090\u0000\u0645\u0647\u0003"+
+ "\u0126\u0093\u0000\u0646\u0644\u0001\u0000\u0000\u0000\u0646\u0645\u0001"+
+ "\u0000\u0000\u0000\u0647\u011f\u0001\u0000\u0000\u0000\u0648\u0653\u0005"+
+ "^\u0000\u0000\u0649\u064b\u0003\u00b4Z\u0000\u064a\u0649\u0001\u0000\u0000"+
+ "\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u0654\u0001\u0000\u0000"+
+ "\u0000\u064c\u064e\u0003\u0104\u0082\u0000\u064d\u064c\u0001\u0000\u0000"+
+ "\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u064f\u0001\u0000\u0000"+
+ "\u0000\u064f\u0651\u0003\u0180\u00c0\u0000\u0650\u0652\u0003\u00b4Z\u0000"+
+ "\u0651\u0650\u0001\u0000\u0000\u0000\u0651\u0652\u0001\u0000\u0000\u0000"+
+ "\u0652\u0654\u0001\u0000\u0000\u0000\u0653\u064a\u0001\u0000\u0000\u0000"+
+ "\u0653\u064d\u0001\u0000\u0000\u0000\u0654\u0655\u0001\u0000\u0000\u0000"+
+ "\u0655\u0659\u0005m\u0000\u0000\u0656\u0658\u0003\u0122\u0091\u0000\u0657"+
+ "\u0656\u0001\u0000\u0000\u0000\u0658\u065b\u0001\u0000\u0000\u0000\u0659"+
+ "\u0657\u0001\u0000\u0000\u0000\u0659\u065a\u0001\u0000\u0000\u0000\u065a"+
+ "\u065c\u0001\u0000\u0000\u0000\u065b\u0659\u0001\u0000\u0000\u0000\u065c"+
+ "\u065d\u0005n\u0000\u0000\u065d\u0121\u0001\u0000\u0000\u0000\u065e\u065f"+
+ "\u0003\u0124\u0092\u0000\u065f\u0661\u0005t\u0000\u0000\u0660\u0662\u0003"+
+ "\u0102\u0081\u0000\u0661\u0660\u0001\u0000\u0000\u0000\u0661\u0662\u0001"+
+ "\u0000\u0000\u0000\u0662\u0123\u0001\u0000\u0000\u0000\u0663\u0664\u0005"+
+ "U\u0000\u0000\u0664\u0667\u0003\u00f8|\u0000\u0665\u0667\u0005Q\u0000"+
+ "\u0000\u0666\u0663\u0001\u0000\u0000\u0000\u0666\u0665\u0001\u0000\u0000"+
+ "\u0000\u0667\u0125\u0001\u0000\u0000\u0000\u0668\u0671\u0005^\u0000\u0000"+
+ "\u0669\u0672\u0003\u0128\u0094\u0000\u066a\u066b\u0003\u0180\u00c0\u0000"+
+ "\u066b\u066c\u0003\u0128\u0094\u0000\u066c\u0672\u0001\u0000\u0000\u0000"+
+ "\u066d\u066e\u0003\u0104\u0082\u0000\u066e\u066f\u0003\u0180\u00c0\u0000"+
+ "\u066f\u0670\u0003\u0128\u0094\u0000\u0670\u0672\u0001\u0000\u0000\u0000"+
+ "\u0671\u0669\u0001\u0000\u0000\u0000\u0671\u066a\u0001\u0000\u0000\u0000"+
+ "\u0671\u066d\u0001\u0000\u0000\u0000\u0672\u0673\u0001\u0000\u0000\u0000"+
+ "\u0673\u0677\u0005m\u0000\u0000\u0674\u0676\u0003\u012a\u0095\u0000\u0675"+
+ "\u0674\u0001\u0000\u0000\u0000\u0676\u0679\u0001\u0000\u0000\u0000\u0677"+
+ "\u0675\u0001\u0000\u0000\u0000\u0677\u0678\u0001\u0000\u0000\u0000\u0678"+
+ "\u067a\u0001\u0000\u0000\u0000\u0679\u0677\u0001\u0000\u0000\u0000\u067a"+
+ "\u067b\u0005n\u0000\u0000\u067b\u0127\u0001\u0000\u0000\u0000\u067c\u067d"+
+ "\u0005j\u0000\u0000\u067d\u067f\u0005x\u0000\u0000\u067e\u067c\u0001\u0000"+
+ "\u0000\u0000\u067e\u067f\u0001\u0000\u0000\u0000\u067f\u0680\u0001\u0000"+
+ "\u0000\u0000\u0680\u0681\u0003\u00c4b\u0000\u0681\u0682\u0005u\u0000\u0000"+
+ "\u0682\u0683\u0005k\u0000\u0000\u0683\u0684\u0005c\u0000\u0000\u0684\u0685"+
+ "\u0005l\u0000\u0000\u0685\u0129\u0001\u0000\u0000\u0000\u0686\u0687\u0003"+
+ "\u012c\u0096\u0000\u0687\u0689\u0005t\u0000\u0000\u0688\u068a\u0003\u0102"+
+ "\u0081\u0000\u0689\u0688\u0001\u0000\u0000\u0000\u0689\u068a\u0001\u0000"+
+ "\u0000\u0000\u068a\u012b\u0001\u0000\u0000\u0000\u068b\u068c\u0005U\u0000"+
+ "\u0000\u068c\u068f\u0003\u012e\u0097\u0000\u068d\u068f\u0005Q\u0000\u0000"+
+ "\u068e\u068b\u0001\u0000\u0000\u0000\u068e\u068d\u0001\u0000\u0000\u0000"+
+ "\u068f\u012d\u0001\u0000\u0000\u0000\u0690\u0693\u0003\u00d2i\u0000\u0691"+
+ "\u0693\u0005i\u0000\u0000\u0692\u0690\u0001\u0000\u0000\u0000\u0692\u0691"+
+ "\u0001\u0000\u0000\u0000\u0693\u069b\u0001\u0000\u0000\u0000\u0694\u0697"+
+ "\u0005r\u0000\u0000\u0695\u0698\u0003\u00d2i\u0000\u0696\u0698\u0005i"+
+ "\u0000\u0000\u0697\u0695\u0001\u0000\u0000\u0000\u0697\u0696\u0001\u0000"+
+ "\u0000\u0000\u0698\u069a\u0001\u0000\u0000\u0000\u0699\u0694\u0001\u0000"+
+ "\u0000\u0000\u069a\u069d\u0001\u0000\u0000\u0000\u069b\u0699\u0001\u0000"+
+ "\u0000\u0000\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u012f\u0001\u0000"+
+ "\u0000\u0000\u069d\u069b\u0001\u0000\u0000\u0000\u069e\u069f\u0005T\u0000"+
+ "\u0000\u069f\u06a3\u0005m\u0000\u0000\u06a0\u06a2\u0003\u0132\u0099\u0000"+
+ "\u06a1\u06a0\u0001\u0000\u0000\u0000\u06a2\u06a5\u0001\u0000\u0000\u0000"+
+ "\u06a3\u06a1\u0001\u0000\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000"+
+ "\u06a4\u06a6\u0001\u0000\u0000\u0000\u06a5\u06a3\u0001\u0000\u0000\u0000"+
+ "\u06a6\u06a7\u0005n\u0000\u0000\u06a7\u0131\u0001\u0000\u0000\u0000\u06a8"+
+ "\u06a9\u0003\u0134\u009a\u0000\u06a9\u06ab\u0005t\u0000\u0000\u06aa\u06ac"+
+ "\u0003\u0102\u0081\u0000\u06ab\u06aa\u0001\u0000\u0000\u0000\u06ab\u06ac"+
+ "\u0001\u0000\u0000\u0000\u06ac\u0133\u0001\u0000\u0000\u0000\u06ad\u06b0"+
+ "\u0005U\u0000\u0000\u06ae\u06b1\u0003\u0108\u0084\u0000\u06af\u06b1\u0003"+
+ "\u0136\u009b\u0000\u06b0\u06ae\u0001\u0000\u0000\u0000\u06b0\u06af\u0001"+
+ "\u0000\u0000\u0000\u06b1\u06b4\u0001\u0000\u0000\u0000\u06b2\u06b4\u0005"+
+ "Q\u0000\u0000\u06b3\u06ad\u0001\u0000\u0000\u0000\u06b3\u06b2\u0001\u0000"+
+ "\u0000\u0000\u06b4\u0135\u0001\u0000\u0000\u0000\u06b5\u06b6\u0003\u00f8"+
+ "|\u0000\u06b6\u06b7\u0005q\u0000\u0000\u06b7\u06bc\u0001\u0000\u0000\u0000"+
+ "\u06b8\u06b9\u0003\u00f6{\u0000\u06b9\u06ba\u0005x\u0000\u0000\u06ba\u06bc"+
+ "\u0001\u0000\u0000\u0000\u06bb\u06b5\u0001\u0000\u0000\u0000\u06bb\u06b8"+
+ "\u0001\u0000\u0000\u0000\u06bb\u06bc\u0001\u0000\u0000\u0000\u06bc\u06bd"+
+ "\u0001\u0000\u0000\u0000\u06bd\u06be\u0003\u00b4Z\u0000\u06be\u0137\u0001"+
+ "\u0000\u0000\u0000\u06bf\u06c7\u0005e\u0000\u0000\u06c0\u06c2\u0003\u00b4"+
+ "Z\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000"+
+ "\u0000\u06c2\u06c8\u0001\u0000\u0000\u0000\u06c3\u06c8\u0003\u013a\u009d"+
+ "\u0000\u06c4\u06c6\u0003\u00eau\u0000\u06c5\u06c4\u0001\u0000\u0000\u0000"+
+ "\u06c5\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c8\u0001\u0000\u0000\u0000"+
+ "\u06c7\u06c1\u0001\u0000\u0000\u0000\u06c7\u06c3\u0001\u0000\u0000\u0000"+
+ "\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c8\u06c9\u0001\u0000\u0000\u0000"+
+ "\u06c9\u06ca\u0003\u0100\u0080\u0000\u06ca\u0139\u0001\u0000\u0000\u0000"+
+ "\u06cb\u06cd\u0003\u0104\u0082\u0000\u06cc\u06cb\u0001\u0000\u0000\u0000"+
+ "\u06cc\u06cd\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000\u0000\u0000"+
+ "\u06ce\u06d0\u0003\u0180\u00c0\u0000\u06cf\u06d1\u0003\u00b4Z\u0000\u06d0"+
+ "\u06cf\u0001\u0000\u0000\u0000\u06d0\u06d1\u0001\u0000\u0000\u0000\u06d1"+
+ "\u06d2\u0001\u0000\u0000\u0000\u06d2\u06d4\u0003\u0180\u00c0\u0000\u06d3"+
+ "\u06d5\u0003\u0104\u0082\u0000\u06d4\u06d3\u0001\u0000\u0000\u0000\u06d4"+
+ "\u06d5\u0001\u0000\u0000\u0000\u06d5\u013b\u0001\u0000\u0000\u0000\u06d6"+
+ "\u06d7\u0005W\u0000\u0000\u06d7\u06d8\u0003\u00b4Z\u0000\u06d8\u013d\u0001"+
+ "\u0000\u0000\u0000\u06d9\u06dc\u0003\u0162\u00b1\u0000\u06da\u06dc\u0005"+
+ "j\u0000\u0000\u06db\u06d9\u0001\u0000\u0000\u0000\u06db\u06da\u0001\u0000"+
+ "\u0000\u0000\u06dc\u013f\u0001\u0000\u0000\u0000\u06dd\u06de\u0005o\u0000"+
+ "\u0000\u06de\u06df\u0003\u0142\u00a1\u0000\u06df\u06e0\u0005p\u0000\u0000"+
+ "\u06e0\u06e1\u0003\u0144\u00a2\u0000\u06e1\u0141\u0001\u0000\u0000\u0000"+
+ "\u06e2\u06e3\u0003\u00b4Z\u0000\u06e3\u0143\u0001\u0000\u0000\u0000\u06e4"+
+ "\u06e5\u0003\u00d2i\u0000\u06e5\u0145\u0001\u0000\u0000\u0000\u06e6\u06e7"+
+ "\u0005\u008c\u0000\u0000\u06e7\u06e8\u0003\u00d2i\u0000\u06e8\u0147\u0001"+
+ "\u0000\u0000\u0000\u06e9\u06ea\u0005o\u0000\u0000\u06ea\u06eb\u0005p\u0000"+
+ "\u0000\u06eb\u06ec\u0003\u0144\u00a2\u0000\u06ec\u0149\u0001\u0000\u0000"+
+ "\u0000\u06ed\u06ee\u0005X\u0000\u0000\u06ee\u06ef\u0005o\u0000\u0000\u06ef"+
+ "\u06f0\u0003\u00d2i\u0000\u06f0\u06f1\u0005p\u0000\u0000\u06f1\u06f2\u0003"+
+ "\u0144\u00a2\u0000\u06f2\u014b\u0001\u0000\u0000\u0000\u06f3\u06f9\u0005"+
+ "Z\u0000\u0000\u06f4\u06f5\u0005Z\u0000\u0000\u06f5\u06f9\u0005\u008e\u0000"+
+ "\u0000\u06f6\u06f7\u0005\u008e\u0000\u0000\u06f7\u06f9\u0005Z\u0000\u0000"+
+ "\u06f8\u06f3\u0001\u0000\u0000\u0000\u06f8\u06f4\u0001\u0000\u0000\u0000"+
+ "\u06f8\u06f6\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000"+
+ "\u06fa\u06fb\u0003\u0144\u00a2\u0000\u06fb\u014d\u0001\u0000\u0000\u0000"+
+ "\u06fc\u06fd\u0005R\u0000\u0000\u06fd\u06fe\u0003\u0150\u00a8\u0000\u06fe"+
+ "\u014f\u0001\u0000\u0000\u0000\u06ff\u0700\u0003\u0154\u00aa\u0000\u0700"+
+ "\u0701\u0003\u0152\u00a9\u0000\u0701\u0704\u0001\u0000\u0000\u0000\u0702"+
+ "\u0704\u0003\u0154\u00aa\u0000\u0703\u06ff\u0001\u0000\u0000\u0000\u0703"+
+ "\u0702\u0001\u0000\u0000\u0000\u0704\u0151\u0001\u0000\u0000\u0000\u0705"+
+ "\u0708\u0003\u0154\u00aa\u0000\u0706\u0708\u0003\u00d2i\u0000\u0707\u0705"+
+ "\u0001\u0000\u0000\u0000\u0707\u0706\u0001\u0000\u0000\u0000\u0708\u0153"+
+ "\u0001\u0000\u0000\u0000\u0709\u0715\u0005k\u0000\u0000\u070a\u070f\u0003"+
+ "\u00acV\u0000\u070b\u070c\u0005r\u0000\u0000\u070c\u070e\u0003\u00acV"+
+ "\u0000\u070d\u070b\u0001\u0000\u0000\u0000\u070e\u0711\u0001\u0000\u0000"+
+ "\u0000\u070f\u070d\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000"+
+ "\u0000\u0710\u0713\u0001\u0000\u0000\u0000\u0711\u070f\u0001\u0000\u0000"+
+ "\u0000\u0712\u0714\u0005r\u0000\u0000\u0713\u0712\u0001\u0000\u0000\u0000"+
+ "\u0713\u0714\u0001\u0000\u0000\u0000\u0714\u0716\u0001\u0000\u0000\u0000"+
+ "\u0715\u070a\u0001\u0000\u0000\u0000\u0715\u0716\u0001\u0000\u0000\u0000"+
+ "\u0716\u0717\u0001\u0000\u0000\u0000\u0717\u0718\u0005l\u0000\u0000\u0718"+
+ "\u0155\u0001\u0000\u0000\u0000\u0719\u071a\u0003\u0158\u00ac\u0000\u071a"+
+ "\u071b\u0005k\u0000\u0000\u071b\u071d\u0003\u00b4Z\u0000\u071c\u071e\u0005"+
+ "r\u0000\u0000\u071d\u071c\u0001\u0000\u0000\u0000\u071d\u071e\u0001\u0000"+
+ "\u0000\u0000\u071e\u071f\u0001\u0000\u0000\u0000\u071f\u0720\u0005l\u0000"+
+ "\u0000\u0720\u0157\u0001\u0000\u0000\u0000\u0721\u0727\u0003\u00d4j\u0000"+
+ "\u0722\u0723\u0005k\u0000\u0000\u0723\u0724\u0003\u0158\u00ac\u0000\u0724"+
+ "\u0725\u0005l\u0000\u0000\u0725\u0727\u0001\u0000\u0000\u0000\u0726\u0721"+
+ "\u0001\u0000\u0000\u0000\u0726\u0722\u0001\u0000\u0000\u0000\u0727\u0159"+
+ "\u0001\u0000\u0000\u0000\u0728\u072f\u0003\u015c\u00ae\u0000\u0729\u072f"+
+ "\u0003\u0160\u00b0\u0000\u072a\u072b\u0005k\u0000\u0000\u072b\u072c\u0003"+
+ "\u00b4Z\u0000\u072c\u072d\u0005l\u0000\u0000\u072d\u072f\u0001\u0000\u0000"+
+ "\u0000\u072e\u0728\u0001\u0000\u0000\u0000\u072e\u0729\u0001\u0000\u0000"+
+ "\u0000\u072e\u072a\u0001\u0000\u0000\u0000\u072f\u015b\u0001\u0000\u0000"+
+ "\u0000\u0730\u0734\u0003\u00c2a\u0000\u0731\u0734\u0003\u0164\u00b2\u0000"+
+ "\u0732\u0734\u0003\u00c6c\u0000\u0733\u0730\u0001\u0000\u0000\u0000\u0733"+
+ "\u0731\u0001\u0000\u0000\u0000\u0733\u0732\u0001\u0000\u0000\u0000\u0734"+
+ "\u015d\u0001\u0000\u0000\u0000\u0735\u0736\u0007\u0012\u0000\u0000\u0736"+
+ "\u015f\u0001\u0000\u0000\u0000\u0737\u0738\u0005j\u0000\u0000\u0738\u0161"+
+ "\u0001\u0000\u0000\u0000\u0739\u073a\u0005j\u0000\u0000\u073a\u073b\u0005"+
+ "u\u0000\u0000\u073b\u073c\u0005j\u0000\u0000\u073c\u0163\u0001\u0000\u0000"+
+ "\u0000\u073d\u073e\u0003\u00dam\u0000\u073e\u073f\u0003\u0166\u00b3\u0000"+
+ "\u073f\u0165\u0001\u0000\u0000\u0000\u0740\u0745\u0005m\u0000\u0000\u0741"+
+ "\u0743\u0003\u0168\u00b4\u0000\u0742\u0744\u0005r\u0000\u0000\u0743\u0742"+
+ "\u0001\u0000\u0000\u0000\u0743\u0744\u0001\u0000\u0000\u0000\u0744\u0746"+
+ "\u0001\u0000\u0000\u0000\u0745\u0741\u0001\u0000\u0000\u0000\u0745\u0746"+
+ "\u0001\u0000\u0000\u0000\u0746\u0747\u0001\u0000\u0000\u0000\u0747\u0748"+
+ "\u0005n\u0000\u0000\u0748\u0167\u0001\u0000\u0000\u0000\u0749\u074e\u0003"+
+ "\u016a\u00b5\u0000\u074a\u074b\u0005r\u0000\u0000\u074b\u074d\u0003\u016a"+
+ "\u00b5\u0000\u074c\u074a\u0001\u0000\u0000\u0000\u074d\u0750\u0001\u0000"+
+ "\u0000\u0000\u074e\u074c\u0001\u0000\u0000\u0000\u074e\u074f\u0001\u0000"+
+ "\u0000\u0000\u074f\u0169\u0001\u0000\u0000\u0000\u0750\u074e\u0001\u0000"+
+ "\u0000\u0000\u0751\u0752\u0003\u016c\u00b6\u0000\u0752\u0753\u0005t\u0000"+
+ "\u0000\u0753\u0755\u0001\u0000\u0000\u0000\u0754\u0751\u0001\u0000\u0000"+
+ "\u0000\u0754\u0755\u0001\u0000\u0000\u0000\u0755\u0756\u0001\u0000\u0000"+
+ "\u0000\u0756\u0757\u0003\u016e\u00b7\u0000\u0757\u016b\u0001\u0000\u0000"+
+ "\u0000\u0758\u075b\u0003\u00b4Z\u0000\u0759\u075b\u0003\u0166\u00b3\u0000"+
+ "\u075a\u0758\u0001\u0000\u0000\u0000\u075a\u0759\u0001\u0000\u0000\u0000"+
+ "\u075b\u016d\u0001\u0000\u0000\u0000\u075c\u075f\u0003\u00b4Z\u0000\u075d"+
+ "\u075f\u0003\u0166\u00b3\u0000\u075e\u075c\u0001\u0000\u0000\u0000\u075e"+
+ "\u075d\u0001\u0000\u0000\u0000\u075f\u016f\u0001\u0000\u0000\u0000\u0760"+
+ "\u0761\u0005Y\u0000\u0000\u0761\u0767\u0005m\u0000\u0000\u0762\u0763\u0003"+
+ "\u00deo\u0000\u0763\u0764\u0003\u0180\u00c0\u0000\u0764\u0766\u0001\u0000"+
+ "\u0000\u0000\u0765\u0762\u0001\u0000\u0000\u0000\u0766\u0769\u0001\u0000"+
+ "\u0000\u0000\u0767\u0765\u0001\u0000\u0000\u0000\u0767\u0768\u0001\u0000"+
+ "\u0000\u0000\u0768\u076a\u0001\u0000\u0000\u0000\u0769\u0767\u0001\u0000"+
+ "\u0000\u0000\u076a\u076b\u0005n\u0000\u0000\u076b\u0171\u0001\u0000\u0000"+
+ "\u0000\u076c\u076d\u0007\u0013\u0000\u0000\u076d\u0173\u0001\u0000\u0000"+
+ "\u0000\u076e\u0770\u0005\u008c\u0000\u0000\u076f\u076e\u0001\u0000\u0000"+
+ "\u0000\u076f\u0770\u0001\u0000\u0000\u0000\u0770\u0771\u0001\u0000\u0000"+
+ "\u0000\u0771\u0772\u0003\u013e\u009f\u0000\u0772\u0175\u0001\u0000\u0000"+
+ "\u0000\u0773\u0774\u0005o\u0000\u0000\u0774\u0775\u0003\u00b4Z\u0000\u0775"+
+ "\u0776\u0005p\u0000\u0000\u0776\u0177\u0001\u0000\u0000\u0000\u0777\u0778"+
+ "\u0005u\u0000\u0000\u0778\u0779\u0005k\u0000\u0000\u0779\u077a\u0003\u00d2"+
+ "i\u0000\u077a\u077b\u0005l\u0000\u0000\u077b\u0179\u0001\u0000\u0000\u0000"+
+ "\u077c\u078b\u0005k\u0000\u0000\u077d\u0784\u0003\u00f8|\u0000\u077e\u0781"+
+ "\u0003\u0158\u00ac\u0000\u077f\u0780\u0005r\u0000\u0000\u0780\u0782\u0003"+
+ "\u00f8|\u0000\u0781\u077f\u0001\u0000\u0000\u0000\u0781\u0782\u0001\u0000"+
+ "\u0000\u0000\u0782\u0784\u0001\u0000\u0000\u0000\u0783\u077d\u0001\u0000"+
+ "\u0000\u0000\u0783\u077e\u0001\u0000\u0000\u0000\u0784\u0786\u0001\u0000"+
+ "\u0000\u0000\u0785\u0787\u0005y\u0000\u0000\u0786\u0785\u0001\u0000\u0000"+
+ "\u0000\u0786\u0787\u0001\u0000\u0000\u0000\u0787\u0789\u0001\u0000\u0000"+
+ "\u0000\u0788\u078a\u0005r\u0000\u0000\u0789\u0788\u0001\u0000\u0000\u0000"+
+ "\u0789\u078a\u0001\u0000\u0000\u0000\u078a\u078c\u0001\u0000\u0000\u0000"+
+ "\u078b\u0783\u0001\u0000\u0000\u0000\u078b\u078c\u0001\u0000\u0000\u0000"+
+ "\u078c\u078d\u0001\u0000\u0000\u0000\u078d\u078e\u0005l\u0000\u0000\u078e"+
+ "\u017b\u0001\u0000\u0000\u0000\u078f\u0790\u0003\u0158\u00ac\u0000\u0790"+
+ "\u0791\u0005u\u0000\u0000\u0791\u0792\u0005j\u0000\u0000\u0792\u017d\u0001"+
+ "\u0000\u0000\u0000\u0793\u0794\u0003\u00d2i\u0000\u0794\u017f\u0001\u0000"+
+ "\u0000\u0000\u0795\u079a\u0005s\u0000\u0000\u0796\u079a\u0005\u0000\u0000"+
+ "\u0001\u0797\u079a\u0005\u00a4\u0000\u0000\u0798\u079a\u0004\u00c0\u0013"+
+ "\u0000\u0799\u0795\u0001\u0000\u0000\u0000\u0799\u0796\u0001\u0000\u0000"+
+ "\u0000\u0799\u0797\u0001\u0000\u0000\u0000\u0799\u0798\u0001\u0000\u0000"+
+ "\u0000\u079a\u0181\u0001\u0000\u0000\u0000\u00c9\u0190\u0195\u019c\u01a6"+
+ "\u01ac\u01b2\u01bc\u01c6\u01d4\u01d8\u01e1\u01ed\u01f1\u01f7\u0200\u020a"+
+ "\u021d\u022b\u022f\u0236\u023e\u0247\u0267\u026f\u0290\u02a3\u02b2\u02bf"+
+ "\u02c8\u02d6\u02df\u02eb\u02f1\u0305\u030e\u0313\u0318\u031b\u0320\u0327"+
+ "\u032d\u0336\u033c\u0349\u034c\u0350\u0354\u035c\u0364\u0369\u0371\u0373"+
+ "\u0378\u037f\u0387\u038a\u0390\u0395\u0397\u039a\u03a1\u03a6\u03b9\u03c1"+
+ "\u03c5\u03c8\u03ce\u03d2\u03d5\u03df\u03e6\u03ed\u03f9\u03ff\u0406\u040b"+
+ "\u0411\u041d\u0423\u0427\u042f\u0433\u0439\u043c\u0442\u0447\u0460\u0483"+
+ "\u0485\u049c\u04a4\u04af\u04b6\u04bd\u04c7\u04d9\u04ef\u04f1\u04f9\u04fd"+
+ "\u0501\u0504\u050d\u0513\u051d\u0525\u052b\u0534\u053f\u054a\u054e\u0550"+
+ "\u055b\u0563\u0569\u056c\u0570\u0574\u0577\u057e\u0589\u0593\u0599\u059b"+
+ "\u05a5\u05af\u05b3\u05b7\u05bb\u05c2\u05ca\u05d5\u05d9\u05dd\u05e9\u05ed"+
+ "\u05f1\u05f6\u05f9\u05fc\u0603\u060a\u061e\u0622\u0626\u062a\u063a\u0640"+
+ "\u0642\u0646\u064a\u064d\u0651\u0653\u0659\u0661\u0666\u0671\u0677\u067e"+
+ "\u0689\u068e\u0692\u0697\u069b\u06a3\u06ab\u06b0\u06b3\u06bb\u06c1\u06c5"+
+ "\u06c7\u06cc\u06d0\u06d4\u06db\u06f8\u0703\u0707\u070f\u0713\u0715\u071d"+
+ "\u0726\u072e\u0733\u0743\u0745\u074e\u0754\u075a\u075e\u0767\u076f\u0781"+
+ "\u0783\u0786\u0789\u078b\u0799";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
index a471d7d23..b2019f465 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
@@ -390,6 +390,41 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitSpecification(GobraParser.SpecificationContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitBackendAnnotationEntry(GobraParser.BackendAnnotationEntryContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitListOfValues(GobraParser.ListOfValuesContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitSingleBackendAnnotation(GobraParser.SingleBackendAnnotationContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitBackendAnnotationList(GobraParser.BackendAnnotationListContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitBackendAnnotation(GobraParser.BackendAnnotationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@@ -852,6 +887,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitPredConstrPrimaryExpr(GobraParser.PredConstrPrimaryExprContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitRevealInvokePrimaryExpr(GobraParser.RevealInvokePrimaryExprContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
index bf9a321e1..a0eb7a6d6 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
@@ -338,6 +338,36 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitSpecification(GobraParser.SpecificationContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#backendAnnotationEntry}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitBackendAnnotationEntry(GobraParser.BackendAnnotationEntryContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#listOfValues}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitListOfValues(GobraParser.ListOfValuesContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#singleBackendAnnotation}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitSingleBackendAnnotation(GobraParser.SingleBackendAnnotationContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#backendAnnotationList}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitBackendAnnotationList(GobraParser.BackendAnnotationListContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#backendAnnotation}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitBackendAnnotation(GobraParser.BackendAnnotationContext ctx);
/**
* Visit a parse tree produced by {@link GobraParser#specStatement}.
* @param ctx the parse tree
@@ -760,6 +790,13 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitPredConstrPrimaryExpr(GobraParser.PredConstrPrimaryExprContext ctx);
+ /**
+ * Visit a parse tree produced by the {@code revealInvokePrimaryExpr}
+ * labeled alternative in {@link GobraParser#primaryExpr}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitRevealInvokePrimaryExpr(GobraParser.RevealInvokePrimaryExprContext ctx);
/**
* Visit a parse tree produced by the {@code invokePrimaryExpr}
* labeled alternative in {@link GobraParser#primaryExpr}.
diff --git a/src/main/resources/README.md b/src/main/resources/README.md
index cdc799ba6..01cb58af9 100644
--- a/src/main/resources/README.md
+++ b/src/main/resources/README.md
@@ -20,3 +20,8 @@ import stubAssert "github.com/scionproto/scion/go/lib/assert"
Note that the import path directly corresponds to the directory structure in `stubs`.
As `assert` is a reserved keyword in Gobra and the implicit qualifier would be `assert`, the library is imported with the qualifier `stubAssert`.
The implicit qualifier corresponds to the last path component (here `assert`) and is not related to the package clause used in Gobra files located in the `assert` folder.
+
+## noaxioms
+The `.vpr` files in the `noaxioms` folder contain minimal definitions of operations on the various built-in Viper types. These files are used when we disable the built-in axiomatisation of the Viper files.
+`sets.vpr` for example is used when the flag `--disableSetAxiomatization` is passed to Gobra, which in turn is useful if the user
+wants to manually prove obligations using the standard library.
diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra
index 9680d28e2..9abe0d891 100644
--- a/src/main/resources/builtin/builtin.gobra
+++ b/src/main/resources/builtin/builtin.gobra
@@ -11,21 +11,26 @@ package builtin
type any = interface{}
type error interface {
+ // To allow for recursive implementations of the
+ // following methods, we use ErrorMem() as the
+ // termination measure.
pred ErrorMem()
ghost
- requires acc(ErrorMem(), _)
- decreases
+ requires acc(ErrorMem(), _)
+ decreases ErrorMem()
pure IsDuplicableMem() bool
ghost
preserves ErrorMem()
- ensures IsDuplicableMem() ==> ErrorMem()
- decreases
+ ensures IsDuplicableMem() == old(IsDuplicableMem())
+ ensures IsDuplicableMem() ==> ErrorMem()
+ decreases ErrorMem()
Duplicate()
preserves ErrorMem()
- decreases
+ ensures IsDuplicableMem() == old(IsDuplicableMem())
+ decreases ErrorMem()
Error() string
}
diff --git a/src/main/resources/noaxioms/sets.vpr b/src/main/resources/noaxioms/sets.vpr
new file mode 100644
index 000000000..f29cf7154
--- /dev/null
+++ b/src/main/resources/noaxioms/sets.vpr
@@ -0,0 +1,19 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+// Copyright (c) 2011-2023 ETH Zurich.
+
+domain $Set[E] {
+ function Set_in(e: E, s: $Set[E]): Bool
+ function Set_card(s: $Set[E]): Int
+ function Set_empty(): $Set[E]
+ function Set_singleton(e: E): $Set[E]
+ function Set_unionone(s: $Set[E], e: E): $Set[E]
+ function Set_union(s1: $Set[E], s2: $Set[E]): $Set[E]
+ function Set_disjoint(s1: $Set[E], s2: $Set[E]): Bool
+ function Set_difference(s1: $Set[E], s2: $Set[E]): $Set[E]
+ function Set_intersection(s1: $Set[E], s2: $Set[E]): $Set[E]
+ function Set_subset(s1: $Set[E], s2: $Set[E]): Bool
+ function Set_equal(s1: $Set[E], s2: $Set[E]): Bool
+}
diff --git a/src/main/resources/stubs/net/ip.gobra b/src/main/resources/stubs/net/ip.gobra
index f6a3ee897..0c177d6bc 100644
--- a/src/main/resources/stubs/net/ip.gobra
+++ b/src/main/resources/stubs/net/ip.gobra
@@ -144,6 +144,7 @@ func (ip IP) To4() (res IP) {
pure
preserves forall i int :: 0 <= i && i < len(s) ==> acc(&s[i], 1/100000)
+decreases _
func isZeros(s []byte) bool
// To16 converts the IP address ip to a 16-byte representation.
diff --git a/src/main/resources/stubs/net/net.gobra b/src/main/resources/stubs/net/net.gobra
index d1d1ff11e..0319d37dd 100644
--- a/src/main/resources/stubs/net/net.gobra
+++ b/src/main/resources/stubs/net/net.gobra
@@ -171,6 +171,7 @@ pred (op *OpError) Mem() {
}
requires acc(e.Mem(), _)
+decreases
pure func (e *OpError) Unwrap() error { return unfolding acc(e.Mem(), _) in e.Err }
requires acc(e.Mem())
@@ -271,8 +272,10 @@ type UnknownNetworkError string
func (e UnknownNetworkError) Error() string // { return "unknown network " + string(e) }
ensures !res
+decreases
pure func (e UnknownNetworkError) Timeout() (res bool) { return false }
ensures !res
+decreases
pure func (e UnknownNetworkError) Temporary() (res bool) { return false }
type InvalidAddrError string
diff --git a/src/main/resources/stubs/strings/strings.gobra b/src/main/resources/stubs/strings/strings.gobra
index 0307bf577..2d652bc53 100644
--- a/src/main/resources/stubs/strings/strings.gobra
+++ b/src/main/resources/stubs/strings/strings.gobra
@@ -151,6 +151,7 @@ ensures len(elems) == 0 ==> res == ""
ensures len(elems) == 1 ==> res == elems[0]
// (joao) Leads to precondition of call might not hold (permission to elems[i] might not suffice)
// ensures len(elems) > 1 ==> res == elems[0] + sep + Join(elems[1:], sep)
+decreases _
pure func Join(elems []string, sep string) (res string) /*{
switch len(elems) {
case 0:
@@ -176,26 +177,18 @@ pure func Join(elems []string, sep string) (res string) /*{
// HasPrefix tests whether the string s begins with prefix.
pure
-ensures ret == (len(s) >= len(prefix) && s[0:len(prefix)] == prefix)
+decreases
func HasPrefix(s, prefix string) (ret bool) {
return len(s) >= len(prefix) && (s[0:len(prefix)] == prefix)
}
// HasSuffix tests whether the string s ends with suffix.
pure
-ensures ret == (len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix)
+decreases
func HasSuffix(s, suffix string) (ret bool) {
return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
}
-// Map returns a copy of the string s with all its characters modified
-// according to the mapping function. If mapping returns a negative value, the character is
-// dropped from the string with no replacement.
-// (joao) no support for higher-order functions
-/*
-func Map(mapping func(rune) rune, s string) string
-*/
-
// Repeat returns a new string consisting of count copies of the string s.
//
// It panics if count is negative or if
diff --git a/src/main/resources/stubs/sync/mutex.gobra b/src/main/resources/stubs/sync/mutex.gobra
index f88fe1405..fd335a399 100644
--- a/src/main/resources/stubs/sync/mutex.gobra
+++ b/src/main/resources/stubs/sync/mutex.gobra
@@ -14,6 +14,7 @@ pred (m *Mutex) UnlockP()
ghost
requires acc(m.LockP(), _)
+decreases _
pure func (m *Mutex) LockInv() pred()
ghost
diff --git a/src/main/resources/stubs/sync/waitgroup.gobra b/src/main/resources/stubs/sync/waitgroup.gobra
index 2de127d4d..f42663519 100644
--- a/src/main/resources/stubs/sync/waitgroup.gobra
+++ b/src/main/resources/stubs/sync/waitgroup.gobra
@@ -17,17 +17,19 @@ pred (wg *WaitGroup) Token(t pred())
ghost
requires acc(g.WaitGroupP(), _)
+decreases _
pure func (g *WaitGroup) WaitMode() bool
ghost
requires acc(g) && *g == WaitGroup{}
ensures g.WaitGroupP() && !g.WaitMode()
-decreases
+decreases _
func (g *WaitGroup) Init()
ghost
requires g.WaitGroupP()
ensures g.WaitGroupP() && !g.WaitMode()
+decreases _
func (g *WaitGroup) UnsetWaitMode()
ghost
@@ -35,7 +37,7 @@ requires p > 0
requires acc(g.WaitGroupP(), p)
requires !g.WaitMode() && g.UnitDebt(P)
ensures g.UnitDebt(P) && acc(g.WaitGroupStarted(), p)
-decreases
+decreases _
func (g *WaitGroup) Start(ghost p perm, ghost P pred())
ghost
@@ -45,7 +47,7 @@ requires p + q == 1
requires acc(g.WaitGroupP(), p)
requires acc(g.WaitGroupStarted(), q)
ensures g.WaitGroupP() && g.WaitMode()
-decreases
+decreases _
func (g *WaitGroup) SetWaitMode(ghost p perm, ghost q perm)
// Simplified version of the debt redistribution rule. The most general version cannot be written in Gobra
@@ -54,7 +56,7 @@ func (g *WaitGroup) SetWaitMode(ghost p perm, ghost q perm)
ghost
requires P() && g.UnitDebt(P)
ensures g.UnitDebt(PredTrue!)
-decreases
+decreases _
func (g *WaitGroup) PayDebt(ghost P pred())
// Simplified version of the debt redistribution rule, instantiated with P == { PredTrue! } and Q == { R }.
@@ -62,12 +64,13 @@ func (g *WaitGroup) PayDebt(ghost P pred())
ghost
requires g.UnitDebt(PredTrue!)
ensures g.UnitDebt(R) && g.Token(R)
-decreases
+decreases _
func (g *WaitGroup) GenerateTokenAndDebt(ghost R pred())
ghost
requires R()
ensures g.Token(R)
+decreases _
func (g *WaitGroup) GenerateToken(ghost R pred())
// Simplified version of Add as proposed in page 8 of Martin's latest document (as of 21/01/2021)
@@ -80,11 +83,11 @@ ensures (n > 0 && p == 0) ==> g.UnitDebt(P)
ensures n > 0 ==> acc(g.UnitDebt(PredTrue!), n/1)
// this is actually necessary, otherwise Gobra cannot prove that Add does not modify the wait mode
ensures (n > 0 && p > 0) ==> g.WaitMode() == old(g.WaitMode())
-decreases
+decreases _
func (g *WaitGroup) Add(n int, ghost p perm, ghost P pred())
requires g.UnitDebt(PredTrue!)
-decreases
+decreases _
func (g *WaitGroup) Done()
requires p > 0
@@ -117,6 +120,7 @@ requires len(Q) == len(permsQ)
requires g.UnitDebt(CollectFractions!)
requires g.UnitDebt(PredTrue!)
ensures g.UnitDebt(CollectFractions!
) && g.UnitDebt(CollectFractions!)
+decreases _
func (g *WaitGroup) SplitSequence(ghost P seq[pred()], ghost Q seq[pred()], ghost permsP seq[perm], ghost permsQ seq[perm])
// Special case of the debt redistribution rule
@@ -131,4 +135,5 @@ requires g.UnitDebt(PredTrue!)
requires forall i int :: 0 <= i && i < len(P) ==> permsP[i] + permsQ[i] == permsR[i]
ensures g.UnitDebt(CollectFractions!)
ensures g.UnitDebt(CollectFractions!
)
+decreases _
func (g *WaitGroup) SplitFractions(ghost P seq[pred()], ghost permsP seq[perm], ghost permsQ seq[perm], ghost permsR seq[perm])
diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
index fe151a6fb..d355670e7 100644
--- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
@@ -467,7 +467,7 @@ case class PClosureImplements(closure: PExpression, spec: PClosureSpecInstance)
case class PClosureImplProof(impl: PClosureImplements, block: PBlock) extends PGhostStatement with PScope
-case class PInvoke(base: PExpressionOrType, args: Vector[PExpression], spec: Option[PClosureSpecInstance]) extends PActualExpression {
+case class PInvoke(base: PExpressionOrType, args: Vector[PExpression], spec: Option[PClosureSpecInstance], reveal: Boolean = false) extends PActualExpression {
require(base.isInstanceOf[PExpression] || spec.isEmpty) // `base` is a type for conversions only, for which `spec` is empty
}
@@ -877,14 +877,18 @@ case class PTupleTerminationMeasure(tuple: Vector[PExpression], cond: Option[PEx
sealed trait PSpecification extends PGhostNode
case class PFunctionSpec(
- pres: Vector[PExpression],
- preserves: Vector[PExpression],
- posts: Vector[PExpression],
- terminationMeasures: Vector[PTerminationMeasure],
- isPure: Boolean = false,
- isTrusted: Boolean = false
+ pres: Vector[PExpression],
+ preserves: Vector[PExpression],
+ posts: Vector[PExpression],
+ terminationMeasures: Vector[PTerminationMeasure],
+ backendAnnotations: Vector[PBackendAnnotation],
+ isPure: Boolean = false,
+ isTrusted: Boolean = false,
+ isOpaque: Boolean = false,
) extends PSpecification
+case class PBackendAnnotation(key: String, values: Vector[String]) extends PGhostMisc
+
case class PBodyParameterInfo(
/**
* Stores parameters that have been declared as shared in the body of a function or method.
diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
index dbaf68a28..8232ca144 100644
--- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
@@ -128,6 +128,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
}
def showPure: Doc = "pure" <> line
+ def showOpaque: Doc = "opaque" <> line
def showTrusted: Doc = "trusted" <> line
def showPre(pre: PExpression): Doc = "requires" <+> showExpr(pre)
def showPreserves(preserves: PExpression): Doc = "preserves" <+> showExpr(preserves)
@@ -143,13 +144,15 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
}
def showSpec(spec: PSpecification): Doc = spec match {
- case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted) =>
+ case PFunctionSpec(pres, preserves, posts, measures, backendAnnotations, isPure, isTrusted, isOpaque) =>
(if (isPure) showPure else emptyDoc) <>
+ (if (isOpaque) showOpaque else emptyDoc) <>
(if (isTrusted) showTrusted else emptyDoc) <>
hcat(pres map (showPre(_) <> line)) <>
- hcat(preserves map (showPreserves(_) <> line)) <>
- hcat(posts map (showPost(_) <> line)) <>
- hcat(measures map (showTerminationMeasure(_) <> line))
+ hcat(preserves map (showPreserves(_) <> line)) <>
+ hcat(posts map (showPost(_) <> line)) <>
+ hcat(measures map (showTerminationMeasure(_) <> line)) <>
+ showBackendAnnotations(backendAnnotations) <> line
case PLoopSpec(inv, measure) =>
hcat(inv map (showInv(_) <> line)) <> opt(measure)(showTerminationMeasure) <> line
@@ -453,7 +456,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case PStringLit(lit) => "\"" <> lit <> "\""
case PCompositeLit(typ, lit) => showLiteralType(typ) <+> showLiteralValue(lit)
case lit: PFunctionLit => showFunctionLit(lit)
- case PInvoke(base, args, spec) => showExprOrType(base) <> parens(showExprList(args)) <> opt(spec)(s => emptyDoc <+> "as" <+> showMisc(s))
+ case PInvoke(base, args, spec, reveal) =>
+ val revealDoc: Doc = if (reveal) "reveal" else emptyDoc
+ revealDoc <+> showExprOrType(base) <> parens(showExprList(args)) <> opt(spec)(s => emptyDoc <+> "as" <+> showMisc(s))
case PIndexedExp(base, index) => showExpr(base) <> brackets(showExpr(index))
case PSliceExp(base, low, high, cap) => {
@@ -690,6 +695,12 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
def showLabel(id: PLabelNode): Doc = id.name
+ def showBackendAnnotation(annotation: PBackendAnnotation): Doc =
+ annotation.key <> parens(showList(annotation.values)(d => d))
+
+ def showBackendAnnotations(annotations: Vector[PBackendAnnotation]): Doc =
+ "#backend" <> brackets(showList(annotations)(showBackendAnnotation))
+
// misc
def showMisc(id: PMisc): Doc = id match {
@@ -728,6 +739,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case expr: PMatchPattern => showMatchPattern(expr)
case c: PMatchExpDefault => showMatchExpClause(c)
case c: PMatchExpCase => showMatchExpClause(c)
+ case a: PBackendAnnotation => showBackendAnnotation(a)
}
}
diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
index 7dccbc8bc..30ddfc9ab 100644
--- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
+++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
@@ -10,12 +10,11 @@ import org.bitbucket.inkytonik.kiama
import org.bitbucket.inkytonik.kiama.util.Trampolines.Done
import viper.gobra.ast.printing.PrettyPrinterCombinators
import viper.gobra.theory.Addressability
-import viper.gobra.util.{Binary, Decimal, Hexadecimal, Octal}
+import viper.gobra.util.{BackendAnnotation, Binary, Decimal, Hexadecimal, Octal}
import viper.silver.ast.{Position => GobraPosition}
import scala.collection.mutable
import scala.collection.mutable.ListBuffer
-import viper.gobra.util.Violation.violation
trait PrettyPrinter {
def format(node : Node): String
@@ -140,35 +139,34 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
measure match {
case WildcardMeasure(cond) => "_" <+> showCond(cond)
case TupleTerminationMeasure(tuple, cond) =>
- hcat(tuple map {
- case e: Expr => showExpr(e)
- case n => violation(s"Unexpected node $n")
- }) <+> showCond(cond)
+ hcat(tuple map show) <+> showCond(cond)
}
}
def showFunction(f: Function): Doc = f match {
- case Function(name, args, results, pres, posts, measures, body) =>
+ case Function(name, args, results, pres, posts, measures, backendAnnotations, body) =>
"func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block(showStmt(b)))
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block(showStmt(b)))
}
def showPureFunction(f: PureFunction): Doc = f match {
- case PureFunction(name, args, results, pres, posts, measures, body) =>
- "pure func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b)))
+ case PureFunction(name, args, results, pres, posts, measures, backendAnnotations, body, isOpaque) =>
+ val funcPrefix = (if (isOpaque) text("opaque ") else emptyDoc) <> "pure func"
+ funcPrefix <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block("return" <+> showExpr(b)))
}
def showMethod(m: Method): Doc = m match {
- case Method(receiver, name, args, results, pres, posts, measures, body) =>
+ case Method(receiver, name, args, results, pres, posts, measures, backendAnnotations, body) =>
"func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block(showStmt(b)))
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block(showStmt(b)))
}
def showPureMethod(m: PureMethod): Doc = m match {
- case PureMethod(receiver, name, args, results, pres, posts, measures, body) =>
- "pure func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b)))
+ case PureMethod(receiver, name, args, results, pres, posts, measures, backendAnnotations, body, isOpaque) =>
+ val funcPrefix = (if (isOpaque) text("opaque ") else emptyDoc) <> "pure func"
+ funcPrefix <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block("return" <+> showExpr(b)))
}
def showMethodSubtypeProof(m: MethodSubtypeProof): Doc = m match {
@@ -223,6 +221,12 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case Field(name, typ, _) => "field" <> name <> ":" <+> showType(typ)
})
+ def showBackendAnnotations(annotations: Vector[BackendAnnotation]): Doc =
+ "#backend" <> brackets(showList(annotations)(showBackendAnnotation)) <> line
+
+ def showBackendAnnotation(annotation: BackendAnnotation): Doc =
+ annotation.key <> parens(showList(annotation.values)(d => d))
+
def showClosureSpec(spec: ClosureSpec): Doc =
showProxy(spec.func) <> braces(ssep(spec.params.map(p => p._1.toString <> colon <> showExpr(p._2)).toSeq, comma <> space))
@@ -353,9 +357,10 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
showVar(resTarget) <> "," <+> showVar(successTarget) <+> "=" <+> showExpr(mapLookup)
case PredExprFold(base, args, p) => "fold" <+> "acc" <> parens(showExpr(base) <> parens(showExprList(args)) <> "," <+> showExpr(p))
case PredExprUnfold(base, args, p) => "unfold" <+> "acc" <> parens(showExpr(base) <> parens(showExprList(args)) <> "," <+> showExpr(p))
- case Outline(_, pres, posts, measures, body, trusted) =>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <>
- "outline" <> (if (trusted) emptyDoc else parens(nest(line <> showStmt(body)) <> line))
+ case Outline(_, pres, posts, measures, backendAnnotations, body, trusted) =>
+ spec(showPreconditions(pres) <>
+ showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <>
+ "outline" <> (if (trusted) emptyDoc else parens(nest(line <> showStmt(body)) <> line))
case Continue(l, _) => "continue" <+> opt(l)(text)
case Break(l, _) => "break" <+> opt(l)(text)
})
@@ -491,9 +496,13 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case c: CurrentPerm => "perm" <> parens(showAcc(c.acc))
case PermMinus(exp) => "-" <> showExpr(exp)
- case PureFunctionCall(func, args, _) => func.name <> parens(showExprList(args))
+ case PureFunctionCall(func, args, _, reveal) =>
+ val revealDoc: Doc = if (reveal) "reveal" else emptyDoc
+ revealDoc <+> func.name <> parens(showExprList(args))
- case PureMethodCall(recv, meth, args, _) => showExpr(recv) <> dot <> meth.name <> parens(showExprList(args))
+ case PureMethodCall(recv, meth, args, _, reveal) =>
+ val revealDoc: Doc = if (reveal) "reveal " else emptyDoc
+ revealDoc <> showExpr(recv) <> dot <> meth.name <> parens(showExprList(args))
case PureClosureCall(closure, args, spec, _) => showExpr(closure) <> parens(showExprList(args)) <+> "as" <+> showClosureSpec(spec)
@@ -581,7 +590,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case StructUpdate(base, field, newVal) => showExpr(base) <> brackets(showField(field) <+> ":=" <+> showExpr(newVal))
case Negation(op) => "!" <> showExpr(op)
case BitNeg(op) => "^" <> showExpr(op)
- case BinaryExpr(left, op, right, _) => showExpr(left) <+> op <+> showExpr(right)
+ case BinaryExpr(left, op, right, _) => parens(showExpr(left) <+> op <+> showExpr(right))
case lit: Lit => showLit(lit)
case v: Var => showVar(v)
})
@@ -608,14 +617,16 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case BoolLit(b) => if (b) "true" else "false"
case NilLit(t) => parens("nil" <> ":" <> showType(t))
- case FunctionLit(name, args, captured, results, pres, posts, measures, body) =>
+ case FunctionLit(name, args, captured, results, pres, posts, measures, backendAnnotations, body) =>
"func" <+> showProxy(name) <> showCaptured(captured) <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <>
+ spec(showPreconditions(pres) <> showPostconditions(posts) <>
+ showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <>
opt(body)(b => block(showStmt(b)))
- case PureFunctionLit(name, args, captured, results, pres, posts, measures, body) =>
+ case PureFunctionLit(name, args, captured, results, pres, posts, measures, backendAnnotations, body) =>
"pure func" <+> showProxy(name) <> showCaptured(captured) <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b)))
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <>
+ opt(body)(b => block("return" <+> showExpr(b)))
case ArrayLit(len, typ, elems) => {
val lenP = brackets(len.toString)
@@ -681,27 +692,33 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter {
override def showFunction(f: Function): Doc = f match {
- case Function(name, args, results, pres, posts, measures, _) =>
+ case Function(name, args, results, pres, posts, measures, backendAnnotations, _) =>
"func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures))
+ spec(showPreconditions(pres) <>
+ showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations))
}
override def showPureFunction(f: PureFunction): Doc = f match {
- case PureFunction(name, args, results, pres, posts, measures, _) =>
- "pure func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures))
+ case PureFunction(name, args, results, pres, posts, measures, backendAnnotations, _, isOpaque) =>
+ val funcPrefix = if (isOpaque) "pure opaque func" else "pure func"
+ funcPrefix <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <>
+ showBackendAnnotations(backendAnnotations))
}
override def showMethod(m: Method): Doc = m match {
- case Method(receiver, name, args, results, pres, posts, measures, _) =>
+ case Method(receiver, name, args, results, pres, posts, measures, backendAnnotations, _) =>
"func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures))
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <>
+ showBackendAnnotations(backendAnnotations))
}
override def showPureMethod(m: PureMethod): Doc = m match {
- case PureMethod(receiver, name, args, results, pres, posts, measures, _) =>
- "pure func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures))
+ case PureMethod(receiver, name, args, results, pres, posts, measures, backendAnnotations, _, isOpaque) =>
+ val funcPrefix = if (isOpaque) "pure opaque func" else "pure func"
+ funcPrefix <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <>
+ spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <>
+ showBackendAnnotations(backendAnnotations))
}
override def showFPredicate(predicate: FPredicate): Doc = predicate match {
@@ -793,8 +810,10 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter {
case PredExprUnfold(base, args, p) => "unfold" <+> "acc" <> parens(showExpr(base) <> parens(showExprList(args)) <> "," <+> showExpr(p))
case Continue(l, _) => "continue" <+> opt(l)(text)
case Break(l, _) => "break" <+> opt(l)(text)
- case Outline(_, pres, posts, measures, _, _) =>
- spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <>
+ case Outline(_, pres, posts, measures, backendAnnotations, _, _) =>
+ spec(showPreconditions(pres) <>
+ showPostconditions(posts) <> showTerminationMeasures(measures)) <>
+ showBackendAnnotations(backendAnnotations) <>
"outline"
}
}
diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala
index 2f141d1c0..61622f208 100644
--- a/src/main/scala/viper/gobra/ast/internal/Program.scala
+++ b/src/main/scala/viper/gobra/ast/internal/Program.scala
@@ -18,7 +18,7 @@ import viper.gobra.reporting.Source
import viper.gobra.reporting.Source.Parser
import viper.gobra.theory.Addressability
import viper.gobra.translator.Names
-import viper.gobra.util.{Decimal, NumBase, TypeBounds, Violation}
+import viper.gobra.util.{BackendAnnotation, Decimal, NumBase, TypeBounds, Violation}
import viper.gobra.util.TypeBounds.{IntegerKind, UnboundedInteger}
import viper.gobra.util.Violation.violation
@@ -147,6 +147,7 @@ sealed trait MethodMember extends MethodLikeMember {
def pres: Vector[Assertion]
def posts: Vector[Assertion]
def terminationMeasures: Vector[TerminationMeasure]
+ def backendAnnotations: Vector[BackendAnnotation]
}
sealed trait FunctionLikeMember extends Member {
@@ -159,6 +160,7 @@ sealed trait FunctionLikeMemberOrLit extends Node {
def pres: Vector[Assertion]
def posts: Vector[Assertion]
def terminationMeasures: Vector[TerminationMeasure]
+ def backendAnnotations: Vector[BackendAnnotation]
}
sealed trait FunctionMember extends FunctionLikeMember with FunctionLikeMemberOrLit
@@ -185,6 +187,7 @@ case class Method(
override val pres: Vector[Assertion],
override val posts: Vector[Assertion],
override val terminationMeasures: Vector[TerminationMeasure],
+ override val backendAnnotations: Vector[BackendAnnotation],
body: Option[MethodBody]
)(val info: Source.Parser.Info) extends Member with MethodMember
@@ -196,7 +199,9 @@ case class PureMethod(
override val pres: Vector[Assertion],
override val posts: Vector[Assertion],
override val terminationMeasures: Vector[TerminationMeasure],
- body: Option[Expr]
+ override val backendAnnotations: Vector[BackendAnnotation],
+ body: Option[Expr],
+ isOpaque: Boolean
)(val info: Source.Parser.Info) extends Member with MethodMember {
require(results.size <= 1)
}
@@ -241,6 +246,7 @@ case class Function(
override val pres: Vector[Assertion],
override val posts: Vector[Assertion],
override val terminationMeasures: Vector[TerminationMeasure],
+ override val backendAnnotations: Vector[BackendAnnotation],
body: Option[MethodBody]
)(val info: Source.Parser.Info) extends Member with FunctionMember
@@ -251,7 +257,9 @@ case class PureFunction(
override val pres: Vector[Assertion],
override val posts: Vector[Assertion],
override val terminationMeasures: Vector[TerminationMeasure],
- body: Option[Expr]
+ override val backendAnnotations: Vector[BackendAnnotation],
+ body: Option[Expr],
+ isOpaque: Boolean
)(val info: Source.Parser.Info) extends Member with FunctionMember {
require(results.size <= 1)
}
@@ -449,6 +457,7 @@ case class Outline(
pres: Vector[Assertion],
posts: Vector[Assertion],
terminationMeasures: Vector[TerminationMeasure],
+ val backendAnnotations: Vector[BackendAnnotation],
body: Stmt,
trusted: Boolean,
)(val info: Source.Parser.Info) extends Stmt
@@ -933,8 +942,8 @@ case class MapValues(exp : Expr, expUnderlyingType: Type)(val info : Source.Pars
}
}
-case class PureFunctionCall(func: FunctionProxy, args: Vector[Expr], typ: Type)(val info: Source.Parser.Info) extends Expr
-case class PureMethodCall(recv: Expr, meth: MethodProxy, args: Vector[Expr], typ: Type)(val info: Source.Parser.Info) extends Expr
+case class PureFunctionCall(func: FunctionProxy, args: Vector[Expr], typ: Type, reveal: Boolean = false)(val info: Source.Parser.Info) extends Expr
+case class PureMethodCall(recv: Expr, meth: MethodProxy, args: Vector[Expr], typ: Type, reveal: Boolean = false)(val info: Source.Parser.Info) extends Expr
case class PureClosureCall(closure: Expr, args: Vector[Expr], spec: ClosureSpec, typ: Type)(val info: Source.Parser.Info) extends Expr
case class DomainFunctionCall(func: DomainFuncProxy, args: Vector[Expr], typ: Type)(val info: Source.Parser.Info) extends Expr
@@ -1120,6 +1129,7 @@ case class FunctionLit(
override val pres: Vector[Assertion],
override val posts: Vector[Assertion],
override val terminationMeasures: Vector[TerminationMeasure],
+ override val backendAnnotations: Vector[BackendAnnotation],
body: Option[MethodBody]
)(val info: Source.Parser.Info) extends FunctionLitLike {
override def typ: Type = FunctionT(args.map(_.typ), results.map(_.typ), Addressability.literal)
@@ -1133,6 +1143,7 @@ case class PureFunctionLit(
override val pres: Vector[Assertion],
override val posts: Vector[Assertion],
override val terminationMeasures: Vector[TerminationMeasure],
+ override val backendAnnotations: Vector[BackendAnnotation],
body: Option[Expr]
)(val info: Source.Parser.Info) extends FunctionLitLike {
override def typ: Type = FunctionT(args.map(_.typ), results.map(_.typ), Addressability.literal)
diff --git a/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala
index dbbce3b7b..af4eb1036 100644
--- a/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala
+++ b/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala
@@ -102,7 +102,7 @@ object CGEdgesTerminationTransform extends InternalTransform {
stmts = assumeFalse +: optCallsToImpls
)(src)
}
- val newMember = in.Method(m.receiver, m.name, m.args, m.results, m.pres, m.posts, m.terminationMeasures, Some(newBody.toMethodBody))(src)
+ val newMember = in.Method(m.receiver, m.name, m.args, m.results, m.pres, m.posts, m.terminationMeasures, Vector.empty, Some(newBody.toMethodBody))(src)
methodsToRemove += m
methodsToAdd += newMember
definedMethodsDelta += proxy -> newMember
@@ -156,7 +156,7 @@ object CGEdgesTerminationTransform extends InternalTransform {
// new body to check termination
val terminationCheckBody = {
val returnType = m.results.head.typ
- val fallbackProxyCall = in.PureMethodCall(m.receiver, fallbackProxy, m.args, returnType)(src)
+ val fallbackProxyCall = in.PureMethodCall(m.receiver, fallbackProxy, m.args, returnType, false)(src)
val implProxies: Vector[(in.Type, in.MemberProxy)] = implementations.toVector.flatMap{ impl =>
table.lookup(impl, proxy.name).map(implProxy => (impl, implProxy))
}
@@ -166,7 +166,7 @@ object CGEdgesTerminationTransform extends InternalTransform {
case implProxy: in.MethodProxy if !subT.isInstanceOf[in.InterfaceT] =>
in.Conditional(
in.EqCmp(in.TypeOf(m.receiver)(src), typeAsExpr(subT)(src))(src),
- in.PureMethodCall(in.TypeAssertion(m.receiver, subT)(src), implProxy, m.args, returnType)(src),
+ in.PureMethodCall(in.TypeAssertion(m.receiver, subT)(src), implProxy, m.args, returnType, false)(src),
accum,
returnType
)(src)
diff --git a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala
index 883d861b6..d5d97d8c6 100644
--- a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala
+++ b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala
@@ -25,27 +25,27 @@ object OverflowChecksTransform extends InternalTransform {
// adds overflow checks per statement that contains subexpressions of bounded integer type and adds assume
/// statements at the beginning of a function or method body assuming that the value of an argument (of
// bounded integer type) respects the bounds.
- case f@Function(name, args, results, pres, posts, terminationMeasure, body) =>
- Function(name, args, results, pres, posts, terminationMeasure, body map computeNewBody)(f.info)
+ case f@Function(name, args, results, pres, posts, terminationMeasure, annotations, body) =>
+ Function(name, args, results, pres, posts, terminationMeasure, annotations, body map computeNewBody)(f.info)
// same as functions
- case m@Method(receiver, name, args, results, pres, posts, terminationMeasure,body) =>
- Method(receiver, name, args, results, pres, posts, terminationMeasure, body map computeNewBody)(m.info)
+ case m@Method(receiver, name, args, results, pres, posts, terminationMeasure, annotations, body) =>
+ Method(receiver, name, args, results, pres, posts, terminationMeasure, annotations, body map computeNewBody)(m.info)
// Adds pre-conditions stating the bounds of each argument and a post-condition to check if the body expression
// overflows
- case f@PureFunction(name, args, results, pres, posts, terminationMeasure, body) => body match {
+ case f@PureFunction(name, args, results, pres, posts, terminationMeasure, annotations, body, isOpaque) => body match {
case Some(expr) =>
val newPost = posts ++ getPureBlockPosts(expr, results)
- PureFunction(name, args, results, pres, newPost, terminationMeasure, body)(f.info)
+ PureFunction(name, args, results, pres, newPost, terminationMeasure, annotations, body, isOpaque)(f.info)
case None => f
}
// Same as pure functions
- case m@PureMethod(receiver, name, args, results, pres, posts, terminationMeasure, body) => body match {
+ case m@PureMethod(receiver, name, args, results, pres, posts, terminationMeasure, annotations, body, isOpaque) => body match {
case Some(expr) =>
val newPost = posts ++ getPureBlockPosts(expr, results)
- PureMethod(receiver, name, args, results, pres, newPost, terminationMeasure, body)(m.info)
+ PureMethod(receiver, name, args, results, pres, newPost, terminationMeasure, annotations, body, isOpaque)(m.info)
case None => m
}
diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala
index 7746255ec..7d457ec9b 100644
--- a/src/main/scala/viper/gobra/backend/ViperBackends.scala
+++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala
@@ -13,6 +13,10 @@ import viper.server.core.ViperCoreServer
import viper.silicon.decider.Z3ProverAPI
import viper.server.vsi.DefaultVerificationServerStart
+import java.nio.file.{Files, Paths}
+import scala.io.Source
+import scala.util.Using
+
trait ViperBackend {
def create(exePaths: Vector[String], config: Config)(implicit executor: GobraExecutionContext): ViperVerifier
}
@@ -29,7 +33,16 @@ object ViperBackends {
options ++= Vector("--conditionalizePermissions")
}
if (config.z3APIMode) {
- options = options ++ Vector(s"--prover=${Z3ProverAPI.name}")
+ options ++= Vector(s"--prover=${Z3ProverAPI.name}")
+ }
+ if (config.disableNL) {
+ options ++= Vector(s"--disableNL")
+ }
+ if (config.unsafeWildcardOptimization) {
+ options ++= Vector(s"--unsafeWildcardOptimization")
+ }
+ if (config.enableMoreJoins) {
+ options ++= Vector(s"--moreJoins")
}
val mceSiliconOpt = config.mceMode match {
case MCE.Disabled => "0"
@@ -37,6 +50,9 @@ object ViperBackends {
case MCE.OnDemand => "2"
}
options ++= Vector(s"--exhaleMode=$mceSiliconOpt")
+ // Gobra seems to be much slower with the new silicon axiomatization of collections.
+ // For now, we stick to the old one.
+ options ++= Vector("--useOldAxiomatization")
if (config.assumeInjectivityOnInhale) {
options ++= Vector("--assumeInjectivityOnInhale")
}
@@ -44,6 +60,20 @@ object ViperBackends {
options ++= Vector("--parallelizeBranches")
}
options ++= exePaths
+ if (config.disableSetAxiomatization) {
+ // Since resources are stored within the .jar archive, we cannot
+ // directly pass the axiom file to Silicon.
+ val tmpPath = Paths.get("gobra_tmp")
+ val axiomTmpPath = tmpPath.resolve("noaxioms_sets.vpr")
+ val axiom: Source = Source.fromResource("noaxioms/sets.vpr")
+
+ Files.createDirectories(tmpPath)
+ Using(axiom) { source =>
+ Files.write(axiomTmpPath, source.mkString.getBytes)
+ }
+
+ options ++= Vector("--setAxiomatizationFile", axiomTmpPath.toString())
+ }
new Silicon(options)
}
@@ -107,6 +137,21 @@ object ViperBackends {
var options: Vector[String] = Vector.empty
options ++= Vector("--logLevel", "ERROR")
options ++= Vector("--disableCatchingExceptions")
+ // Gobra seems to be much slower with the new silicon axiomatization of collections.
+ // For now, we stick to the old one.
+ options ++= Vector("--useOldAxiomatization")
+ if (config.z3APIMode) {
+ options ++= Vector(s"--prover=${Z3ProverAPI.name}")
+ }
+ if (config.disableNL) {
+ options ++= Vector(s"--disableNL")
+ }
+ if (config.unsafeWildcardOptimization) {
+ options ++= Vector(s"--unsafeWildcardOptimization")
+ }
+ if (config.enableMoreJoins) {
+ options ++= Vector(s"--moreJoins")
+ }
val mceSiliconOpt = config.mceMode match {
case MCE.Disabled => "0"
case MCE.Enabled => "1"
diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala
index edc8aba9c..70aef5b81 100644
--- a/src/main/scala/viper/gobra/frontend/Config.scala
+++ b/src/main/scala/viper/gobra/frontend/Config.scala
@@ -29,50 +29,55 @@ object LoggerDefaults {
}
object ConfigDefaults {
- lazy val DefaultModuleName: String = ""
+ val DefaultModuleName: String = ""
lazy val DefaultProjectRoot: File = new File("").getAbsoluteFile // current working directory
- lazy val DefaultIncludePackages: List[String] = List.empty
- lazy val DefaultExcludePackages: List[String] = List.empty
- lazy val DefaultIncludeDirs: List[File] = List.empty
+ val DefaultIncludePackages: List[String] = List.empty
+ val DefaultExcludePackages: List[String] = List.empty
+ val DefaultIncludeDirs: List[File] = List.empty
lazy val DefaultReporter: GobraReporter = StdIOReporter()
- lazy val DefaultBackend: ViperBackend = ViperBackends.SiliconBackend
- lazy val DefaultIsolate: List[(Path, List[Int])] = List.empty
- lazy val DefaultChoppingUpperBound: Int = 1
- lazy val DefaultPackageTimeout: Duration = Duration.Inf
- lazy val DefaultZ3Exe: Option[String] = None
- lazy val DefaultBoogieExe: Option[String] = None
- lazy val DefaultLogLevel: Level = LoggerDefaults.DefaultLevel
- lazy val DefaultCacheFile: Option[File] = None
- lazy val DefaultParseOnly: Boolean = false
- lazy val DefaultStopAfterEncoding: Boolean = false
- lazy val DefaultCheckOverflows: Boolean = false
- lazy val DefaultCheckConsistency: Boolean = false
- lazy val DefaultShouldChop: Boolean = false
+ val DefaultBackend: ViperBackend = ViperBackends.SiliconBackend
+ val DefaultIsolate: List[(Path, List[Int])] = List.empty
+ val DefaultChoppingUpperBound: Int = 1
+ val DefaultPackageTimeout: Duration = Duration.Inf
+ val DefaultZ3Exe: Option[String] = None
+ val DefaultBoogieExe: Option[String] = None
+ val DefaultLogLevel: Level = LoggerDefaults.DefaultLevel
+ val DefaultCacheFile: Option[File] = None
+ val DefaultParseOnly: Boolean = false
+ val DefaultStopAfterEncoding: Boolean = false
+ val DefaultCheckOverflows: Boolean = false
+ val DefaultCheckConsistency: Boolean = false
+ val DefaultShouldChop: Boolean = false
// The go language specification states that int and uint variables can have either 32bit or 64, as long
// as they have the same size. This flag allows users to pick the size of int's and uints's: 32 if true,
// 64 bit otherwise.
- lazy val DefaultInt32bit: Boolean = false
+ val DefaultInt32bit: Boolean = false
// the following option is currently not controllable via CLI as it is meaningless without a constantly
// running JVM. It is targeted in particular to Gobra Server and Gobra IDE
- lazy val DefaultCacheParserAndTypeChecker: Boolean = false
+ val DefaultCacheParserAndTypeChecker: Boolean = false
// this option introduces a mode where Gobra only considers files with a specific annotation ("// +gobra").
// this is useful when verifying large packages where some files might use some unsupported feature of Gobra,
// or when the goal is to gradually verify part of a package without having to provide an explicit list of the files
// to verify.
- lazy val DefaultOnlyFilesWithHeader: Boolean = false
+ val DefaultOnlyFilesWithHeader: Boolean = false
lazy val DefaultGobraDirectory: Path = Path.of(".gobra")
- lazy val DefaultTaskName: String = "gobra-task"
- lazy val DefaultAssumeInjectivityOnInhale: Boolean = true
- lazy val DefaultParallelizeBranches: Boolean = false
- lazy val DefaultConditionalizePermissions: Boolean = false
- lazy val DefaultZ3APIMode: Boolean = false
- lazy val DefaultMCEMode: MCE.Mode = MCE.Enabled
- lazy val DefaultHyperMode: Hyper.Mode = Hyper.Enabled
+ val DefaultTaskName: String = "gobra-task"
+ val DefaultAssumeInjectivityOnInhale: Boolean = true
+ val DefaultParallelizeBranches: Boolean = false
+ val DefaultConditionalizePermissions: Boolean = false
+ val DefaultZ3APIMode: Boolean = false
+ val DefaultDisableNL: Boolean = false
+ val DefaultMCEMode: MCE.Mode = MCE.Enabled
+ val DefaultHyperMode: Hyper.Mode = Hyper.Enabled
lazy val DefaultEnableLazyImports: Boolean = false
- lazy val DefaultNoVerify: Boolean = false
- lazy val DefaultNoStreamErrors: Boolean = false
- lazy val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel
- lazy val DefaultRequireTriggers: Boolean = false
+ val DefaultNoVerify: Boolean = false
+ val DefaultNoStreamErrors: Boolean = false
+ val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel
+ val DefaultRequireTriggers: Boolean = false
+ val DefaultDisableSetAxiomatization: Boolean = false
+ val DefaultDisableCheckTerminationPureFns: Boolean = false
+ val DefaultUnsafeWildcardOptimization: Boolean = false
+ val DefaultEnableMoreJoins: Boolean = false
}
// More-complete exhale modes
@@ -138,6 +143,7 @@ case class Config(
parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches,
conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions,
z3APIMode: Boolean = ConfigDefaults.DefaultZ3APIMode,
+ disableNL: Boolean = ConfigDefaults.DefaultDisableNL,
mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode,
hyperMode: Hyper.Mode = ConfigDefaults.DefaultHyperMode,
enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports,
@@ -146,6 +152,11 @@ case class Config(
parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode,
// when enabled, all quantifiers without triggers are rejected
requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers,
+ disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization,
+ disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns,
+ unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization,
+ enableMoreJoins: Boolean = ConfigDefaults.DefaultEnableMoreJoins,
+
) {
def merge(other: Config): Config = {
@@ -189,13 +200,18 @@ case class Config(
parallelizeBranches = parallelizeBranches,
conditionalizePermissions = conditionalizePermissions,
z3APIMode = z3APIMode || other.z3APIMode,
+ disableNL = disableNL || other.disableNL,
mceMode = mceMode,
hyperMode = hyperMode,
enableLazyImports = enableLazyImports || other.enableLazyImports,
noVerify = noVerify || other.noVerify,
noStreamErrors = noStreamErrors || other.noStreamErrors,
parseAndTypeCheckMode = parseAndTypeCheckMode,
- requireTriggers = requireTriggers || other.requireTriggers
+ requireTriggers = requireTriggers || other.requireTriggers,
+ disableSetAxiomatization = disableSetAxiomatization || other.disableSetAxiomatization,
+ disableCheckTerminationPureFns = disableCheckTerminationPureFns || other.disableCheckTerminationPureFns,
+ unsafeWildcardOptimization = unsafeWildcardOptimization && other.unsafeWildcardOptimization,
+ enableMoreJoins = enableMoreJoins || other.enableMoreJoins,
)
}
@@ -243,6 +259,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector
parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches,
conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions,
z3APIMode: Boolean = ConfigDefaults.DefaultZ3APIMode,
+ disableNL: Boolean = ConfigDefaults.DefaultDisableNL,
mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode,
hyperMode: Hyper.Mode = ConfigDefaults.DefaultHyperMode,
enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports,
@@ -250,6 +267,10 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector
noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors,
parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode,
requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers,
+ disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization,
+ disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns,
+ unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization,
+ enableMoreJoins: Boolean = ConfigDefaults.DefaultEnableMoreJoins,
) {
def shouldParse: Boolean = true
def shouldTypeCheck: Boolean = !shouldParseOnly
@@ -301,6 +322,7 @@ trait RawConfig {
parallelizeBranches = baseConfig.parallelizeBranches,
conditionalizePermissions = baseConfig.conditionalizePermissions,
z3APIMode = baseConfig.z3APIMode,
+ disableNL = baseConfig.disableNL,
mceMode = baseConfig.mceMode,
hyperMode = baseConfig.hyperMode,
enableLazyImports = baseConfig.enableLazyImports,
@@ -308,6 +330,10 @@ trait RawConfig {
noStreamErrors = baseConfig.noStreamErrors,
parseAndTypeCheckMode = baseConfig.parseAndTypeCheckMode,
requireTriggers = baseConfig.requireTriggers,
+ disableSetAxiomatization = baseConfig.disableSetAxiomatization,
+ disableCheckTerminationPureFns = baseConfig.disableCheckTerminationPureFns,
+ unsafeWildcardOptimization = baseConfig.unsafeWildcardOptimization,
+ enableMoreJoins = baseConfig.enableMoreJoins,
)
}
@@ -573,6 +599,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
default = None,
noshort = true
)
+
lazy val packageTimeoutDuration: Duration = packageTimeout.toOption match {
case Some(d) => Duration(d)
case _ => Duration.Inf
@@ -658,6 +685,26 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
noshort = true,
)
+ val disableNL: ScallopOption[Boolean] = opt[Boolean](
+ name = "disableNL",
+ descr = "Disable non-linear integer arithmetics. Non compatible with Carbon",
+ default = Some(ConfigDefaults.DefaultDisableNL),
+ noshort = true,
+ )
+
+ val unsafeWildcardOptimization: ScallopOption[Boolean] = opt[Boolean]("unsafeWildcardOptimization",
+ descr = "Simplify wildcard terms in a way that might be unsafe. Only use this if you know what you are doing! See Silicon PR #756 for details.",
+ default = Some(false),
+ noshort = true
+ )
+
+ val enableMoreJoins: ScallopOption[Boolean] = opt[Boolean](
+ name = "moreJoins",
+ descr = "Enable more joins using a more complete implementation of state merging.",
+ default = Some(false),
+ noshort = true
+ )
+
val mceMode: ScallopOption[MCE.Mode] = {
val on = "on"
val off = "off"
@@ -716,6 +763,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
noshort = true,
)
+ val disableCheckTerminationPureFns: ScallopOption[Boolean] = opt[Boolean](
+ name = "disablePureFunctsTerminationRequirement",
+ descr = "Do not enforce that all pure functions must have termination measures",
+ default = Some(ConfigDefaults.DefaultDisableCheckTerminationPureFns),
+ noshort = true,
+ )
+
val parseAndTypeCheckMode: ScallopOption[TaskManagerMode] = choice(
name = "parseAndTypeCheckMode",
choices = Seq("LAZY", "SEQUENTIAL", "PARALLEL"),
@@ -729,6 +783,12 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
case _ => ConfigDefaults.DefaultParseAndTypeCheckMode
}
+ val disableSetAxiomatization: ScallopOption[Boolean] = opt[Boolean](
+ name = "disableSetAxiomatization",
+ descr = s"Disables set axiomatization in Silicon.",
+ default = Some(ConfigDefaults.DefaultDisableSetAxiomatization),
+ noshort = true,
+ )
/**
* Exception handling
*/
@@ -794,6 +854,44 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
}
}
+ addValidation {
+ val unsafeWildcardOptSupplied = unsafeWildcardOptimization.isSupplied
+ if (unsafeWildcardOptSupplied && !isSiliconBasedBackend) {
+ Left("The flag --unsafeWildcardOptimization can only be used with Silicon or ViperServer with Silicon")
+ } else {
+ Right(())
+ }
+ }
+
+ addValidation {
+ val enableMoreJoinsOptSupplied = enableMoreJoins.isSupplied
+ if (enableMoreJoinsOptSupplied && !isSiliconBasedBackend) {
+ Left("The flag --moreJoins can only be used with Silicon or ViperServer with Silicon")
+ } else {
+ Right(())
+ }
+ }
+
+ // `disableSetAxiomatization` can only be provided when using a silicon-based backend
+ // since, at the time of writing, we rely on Silicon's setAxiomatizationFile for the
+ // implementation
+ addValidation {
+ val disableSetAxiomatizationOn = disableSetAxiomatization.toOption.contains(true)
+ if (disableSetAxiomatizationOn && !isSiliconBasedBackend) {
+ Left("The selected backend does not support --disableSetAxiomatization.")
+ } else {
+ Right(())
+ }
+ }
+
+ addValidation {
+ if (!disableNL.toOption.contains(true) || isSiliconBasedBackend) {
+ Right(())
+ } else {
+ Left("--disableNL is not compatible with Carbon")
+ }
+ }
+
/** File Validation */
validateFilesExist(cutInput)
@@ -881,6 +979,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
parallelizeBranches = parallelizeBranches(),
conditionalizePermissions = conditionalizePermissions(),
z3APIMode = z3APIMode(),
+ disableNL = disableNL(),
mceMode = mceMode(),
hyperMode = hyperMode(),
enableLazyImports = enableLazyImports(),
@@ -888,5 +987,9 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
noStreamErrors = noStreamErrors(),
parseAndTypeCheckMode = parseAndTypeCheckMode(),
requireTriggers = requireTriggers(),
+ disableSetAxiomatization = disableSetAxiomatization(),
+ disableCheckTerminationPureFns = disableCheckTerminationPureFns(),
+ unsafeWildcardOptimization = unsafeWildcardOptimization(),
+ enableMoreJoins = enableMoreJoins(),
)
}
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 621bbf7aa..297eabd8a 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -21,7 +21,7 @@ import viper.gobra.reporting.{DesugaredMessage, Source}
import viper.gobra.theory.Addressability
import viper.gobra.translator.Names
import viper.gobra.util.Violation.violation
-import viper.gobra.util.{Constants, DesugarWriter, GobraExecutionContext, Violation}
+import viper.gobra.util.{BackendAnnotation, Constants, DesugarWriter, GobraExecutionContext, Violation}
import java.util.concurrent.atomic.AtomicLong
import scala.annotation.{tailrec, unused}
@@ -564,6 +564,10 @@ object Desugar extends LazyLogging {
typeD(DeclaredT(decl, info), Addressability.Exclusive)(meta(decl, info))
}
+ def desugarBackendAnnotations(annotations: Vector[PBackendAnnotation]): Vector[BackendAnnotation] = {
+ annotations map { case PBackendAnnotation(key, value) => BackendAnnotation(key, value) }
+ }
+
def functionD(decl: PFunctionDecl): in.FunctionMember =
if (decl.spec.isPure) pureFunctionD(decl) else {
@@ -572,7 +576,7 @@ object Desugar extends LazyLogging {
val functionInfo = functionMemberOrLitD(decl, fsrc, new FunctionContext(_ => _ => in.Seqn(Vector.empty)(fsrc)))
in.Function(name, functionInfo.args, functionInfo.results, functionInfo.pres, functionInfo.posts,
- functionInfo.terminationMeasures, functionInfo.body)(fsrc)
+ functionInfo.terminationMeasures, functionInfo.backendAnnotations, functionInfo.body)(fsrc)
}
private case class FunctionInfo(args: Vector[in.Parameter.In],
@@ -581,6 +585,7 @@ object Desugar extends LazyLogging {
pres: Vector[in.Assertion],
posts: Vector[in.Assertion],
terminationMeasures: Vector[in.TerminationMeasure],
+ backendAnnotations: Vector[BackendAnnotation],
body: Option[in.MethodBody])
private def functionMemberOrLitD(decl: PFunctionOrClosureDecl, fsrc: Meta, outerCtx: FunctionContext): FunctionInfo = {
@@ -693,7 +698,8 @@ object Desugar extends LazyLogging {
in.MethodBody(vars, in.MethodBodySeqn(body)(fsrc), resultAssignments)(fsrc)
}
- FunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasures, bodyOpt)
+ val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations)
+ FunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasures, annotations, bodyOpt)
}
def pureFunctionD(decl: PFunctionDecl): in.PureFunction = {
@@ -701,7 +707,8 @@ object Desugar extends LazyLogging {
val fsrc = meta(decl, info)
val funcInfo = pureFunctionMemberOrLitD(decl, fsrc, new FunctionContext(_ => _ => in.Seqn(Vector.empty)(fsrc)), info)
- in.PureFunction(name, funcInfo.args, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body)(fsrc)
+ in.PureFunction(name, funcInfo.args, funcInfo.results, funcInfo.pres,
+ funcInfo.posts, funcInfo.terminationMeasures, funcInfo.backendAnnotations, funcInfo.body, funcInfo.isOpaque)(fsrc)
}
private case class PureFunctionInfo(args: Vector[in.Parameter.In],
@@ -710,7 +717,9 @@ object Desugar extends LazyLogging {
pres: Vector[in.Assertion],
posts: Vector[in.Assertion],
terminationMeasures: Vector[in.TerminationMeasure],
- body: Option[in.Expr])
+ backendAnnotations: Vector[BackendAnnotation],
+ body: Option[in.Expr],
+ isOpaque: Boolean)
private def pureFunctionMemberOrLitD(decl: PFunctionOrClosureDecl, fsrc: Meta, outerCtx: FunctionContext, info: TypeInfo): PureFunctionInfo = {
@@ -756,6 +765,8 @@ object Desugar extends LazyLogging {
val posts = decl.spec.posts map postconditionD(ctx, info)
val terminationMeasure = sequence(decl.spec.terminationMeasures map terminationMeasureD(ctx, info)).res
+ val isOpaque = decl.spec.isOpaque
+
val capturedWithAliases = (captured.map { v => in.Ref(localVarD(outerCtx, info)(v))(meta(v, info)) } zip capturedPar)
val bodyOpt = decl.body.map {
@@ -766,8 +777,9 @@ object Desugar extends LazyLogging {
}
implicitConversion(res.typ, returns.head.typ, res)
}
+ val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations)
- PureFunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasure, bodyOpt)
+ PureFunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasure, annotations, bodyOpt, isOpaque)
}
@@ -880,7 +892,9 @@ object Desugar extends LazyLogging {
in.MethodBody(vars, in.MethodBodySeqn(body)(fsrc), resultAssignments)(fsrc)
}
- in.Method(recv, name, args, returns, pres, posts, terminationMeasure, bodyOpt)(fsrc)
+ val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations)
+
+ in.Method(recv, name, args, returns, pres, posts, terminationMeasure, annotations, bodyOpt)(fsrc)
}
def pureMethodD(decl: PMethodDecl): in.PureMethod = {
@@ -924,6 +938,8 @@ object Desugar extends LazyLogging {
val posts = (decl.spec.preserves ++ decl.spec.posts) map postconditionD(ctx, info)
val terminationMeasure = sequence(decl.spec.terminationMeasures map terminationMeasureD(ctx, info)).res
+ val isOpaque = decl.spec.isOpaque
+
val bodyOpt = decl.body.map {
case (_, b: PBlock) =>
val res = b.nonEmptyStmts match {
@@ -932,8 +948,8 @@ object Desugar extends LazyLogging {
}
implicitConversion(res.typ, returns.head.typ, res)
}
-
- in.PureMethod(recv, name, args, returns, pres, posts, terminationMeasure, bodyOpt)(fsrc)
+ val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations)
+ in.PureMethod(recv, name, args, returns, pres, posts, terminationMeasure, annotations, bodyOpt, isOpaque)(fsrc)
}
def fpredicateD(decl: PFPredicateDecl): in.FPredicate = {
@@ -1846,11 +1862,12 @@ object Desugar extends LazyLogging {
val pres = (n.spec.pres ++ n.spec.preserves) map preconditionD(ctx, info)
val posts = (n.spec.preserves ++ n.spec.posts) map postconditionD(ctx, info)
val terminationMeasures = sequence(n.spec.terminationMeasures map terminationMeasureD(ctx, info)).res
+ val annotations = desugarBackendAnnotations(n.spec.backendAnnotations)
if (!n.spec.isTrusted) {
for {
body <- seqn(stmtD(ctx, info)(n.body))
- } yield in.Outline(name, pres, posts, terminationMeasures, body, trusted = false)(src)
+ } yield in.Outline(name, pres, posts, terminationMeasures, annotations, body, trusted = false)(src)
} else {
val declared = info.freeDeclared(n).map(localVarContextFreeD(_, info))
// The dummy body preserves the reads and writes of the real body that target free variables.
@@ -1875,7 +1892,7 @@ object Desugar extends LazyLogging {
for {
// since the body of an outline is not a separate scope, we have to preserve variable declarations.
_ <- declare(declared:_*)
- } yield in.Outline(name, pres, posts, terminationMeasures, dummyBody, trusted = true)(src)
+ } yield in.Outline(name, pres, posts, terminationMeasures, annotations, dummyBody, trusted = true)(src)
}
@@ -2096,11 +2113,11 @@ object Desugar extends LazyLogging {
case _ => in.FunctionCall(targets, getFunctionProxy(func, args), args)(src)
}
- def pureFunctionCall(func: ap.FunctionKind, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type): in.Expr = spec match {
+ def pureFunctionCall(func: ap.FunctionKind, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type, reveal: Boolean): in.Expr = spec match {
case Some(spec) =>
val funcObject = in.FunctionObject(getFunctionProxy(func, args), typeD(info.typ(func.id), Addressability.rValue)(src))(src)
in.PureClosureCall(funcObject, args, spec, resT)(src)
- case _ => in.PureFunctionCall(getFunctionProxy(func, args), args, resT)(src)
+ case _ => in.PureFunctionCall(getFunctionProxy(func, args), args, resT, reveal)(src)
}
def getMethodProxy(f: ap.FunctionKind, recv: in.Expr, args: Vector[in.Expr]): in.MethodProxy = f match {
@@ -2121,7 +2138,7 @@ object Desugar extends LazyLogging {
case _ => in.MethodCall(targets, recv, meth, args)(src)
}
- def pureMethodCall(recv: in.Expr, meth: in.MethodProxy, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type): in.Expr = spec match {
+ def pureMethodCall(recv: in.Expr, meth: in.MethodProxy, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type, reveal: Boolean): in.Expr = spec match {
case Some(spec) =>
val resType = resT match {
case in.TupleT(ts, _) => ts
@@ -2129,7 +2146,7 @@ object Desugar extends LazyLogging {
}
val methObject = in.MethodObject(recv, meth, in.FunctionT(args.map(_.typ), resType, Addressability.rValue))(src)
in.PureClosureCall(methObject, args, spec, resT)(src)
- case _ => in.PureMethodCall(recv, meth, args, resT)(src)
+ case _ => in.PureMethodCall(recv, meth, args, resT, reveal)(src)
}
def convertArgs(args: Vector[in.Expr]): Vector[in.Expr] = {
@@ -2194,11 +2211,12 @@ object Desugar extends LazyLogging {
case base: ap.FunctionKind => base match {
case _: ap.Function | _: ap.BuiltInFunction =>
if (isPure) {
+
for {
args <- dArgs
convertedArgs = convertArgs(args)
spec = p.maybeSpec.map(closureSpecD(ctx, info))
- } yield Right(pureFunctionCall(base, convertedArgs, spec, resT))
+ } yield Right(pureFunctionCall(base, convertedArgs, spec, resT, expr.reveal))
} else {
for {
args <- dArgs
@@ -2218,7 +2236,7 @@ object Desugar extends LazyLogging {
proxy = methodProxy(iim.id, iim.symb.context.getTypeInfo)
recvType = typeD(iim.symb.itfType, Addressability.receiver)(src)
spec = p.maybeSpec.map(closureSpecD(ctx, info))
- } yield Right(pureMethodCall(implicitThisD(recvType)(src), proxy, args, spec, resT))
+ } yield Right(pureMethodCall(implicitThisD(recvType)(src), proxy, args, spec, resT, expr.reveal))
} else {
for {
args <- dArgs
@@ -2263,7 +2281,7 @@ object Desugar extends LazyLogging {
convertedArgs = convertArgs(args)
mproxy = getMethodProxy(base, recv, convertedArgs)
spec = p.maybeSpec.map(closureSpecD(ctx, info))
- } yield Right(pureMethodCall(recv, mproxy, convertedArgs, spec, resT))
+ } yield Right(pureMethodCall(recv, mproxy, convertedArgs, spec, resT, expr.reveal))
} else {
for {
(recv, args) <- dRecvWithArgs
@@ -2638,8 +2656,53 @@ object Desugar extends LazyLogging {
for {l <- go(left); r <- go(right)} yield in.AtLeastCmp(l, r)(src)
}
- case PAnd(left, right) => for {l <- go(left); r <- go(right)} yield in.And(l, r)(src)
- case POr(left, right) => for {l <- go(left); r <- go(right)} yield in.Or(l, r)(src)
+ case PAnd(left, right) =>
+ val isPure = info.isPureExpression(expr)
+ if (isPure) {
+ // in this case, the generated expression will already be short-circuiting
+ for { l <- go(left); r <- go(right) } yield in.And(l, r)(src)
+ } else {
+ // here, we implement short-circuiting manually, as we need to be careful about
+ // when the side-effectful operations may run
+ for {
+ l <- go(left)
+ rightW = go(right)
+ res = freshExclusiveVar(in.BoolT(Addressability.Exclusive), expr, info)(src)
+ fstAssign = singleAss(in.Assignee.Var(res), l)(src)
+ sndAssign = singleAss(in.Assignee.Var(res), rightW.res)(src)
+ condStmt = in.If(
+ l,
+ in.Block(rightW.decls, rightW.stmts :+ sndAssign)(src),
+ in.Block(Vector.empty, Vector.empty)(src),
+ )(src)
+ _ <- declaredExclusiveVar(res)
+ _ <- write(fstAssign, condStmt)
+ } yield res
+ }
+
+ case POr(left, right) =>
+ val isPure = info.isPureExpression(expr)
+ if (isPure) {
+ // in this case, the generated expression will already be short-circuiting
+ for {l <- go(left); r <- go(right)} yield in.Or(l, r)(src)
+ } else {
+ // here, we implement short-circuiting manually, as we need to be careful about
+ // when the side-effectful operations may run
+ for {
+ l <- go(left)
+ rightW = go(right)
+ res = freshExclusiveVar(in.BoolT(Addressability.Exclusive), expr, info)(src)
+ fstAssign = singleAss(in.Assignee.Var(res), l)(src)
+ sndAssign = singleAss(in.Assignee.Var(res), rightW.res)(src)
+ condStmt = in.If(
+ l,
+ in.Block(Vector.empty, Vector.empty)(src),
+ in.Block(rightW.decls, rightW.stmts :+ sndAssign)(src),
+ )(src)
+ _ <- declaredExclusiveVar(res)
+ _ <- write(fstAssign, condStmt)
+ } yield res
+ }
case PAdd(left, right) => for {l <- go(left); r <- go(right)} yield in.Add(l, r)(src)
case PSub(left, right) => for {l <- go(left); r <- go(right)} yield in.Sub(l, r)(src)
@@ -2940,13 +3003,13 @@ object Desugar extends LazyLogging {
val funcInfo = functionMemberOrLitD(lit.decl, meta(lit, info), ctx)
val src = meta(lit, info)
val name = functionLitProxyD(lit, info)
- in.FunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body)(src)
+ in.FunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.backendAnnotations, funcInfo.body)(src)
}
def pureFunctionLitD(ctx: FunctionContext, info: TypeInfo)(lit: PFunctionLit): in.PureFunctionLit = {
val funcInfo = pureFunctionMemberOrLitD(lit.decl, meta(lit, info), ctx, info)
val name = functionLitProxyD(lit, info)
- in.PureFunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body)(meta(lit, info))
+ in.PureFunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.backendAnnotations, funcInfo.body)(meta(lit, info))
}
def capturedVarD(v: PIdnNode): (in.Parameter.In, in.LocalVar) = {
@@ -3244,11 +3307,13 @@ object Desugar extends LazyLogging {
val pres = (m.spec.pres ++ m.spec.preserves) map preconditionD(specCtx, info)
val posts = (m.spec.preserves ++ m.spec.posts) map postconditionD(specCtx, info)
val terminationMeasures = sequence(m.spec.terminationMeasures map terminationMeasureD(specCtx, info)).res
+ val annotations = desugarBackendAnnotations(m.spec.backendAnnotations)
+ val isOpaque = m.spec.isOpaque
val mem = if (m.spec.isPure) {
- in.PureMethod(recv, proxy, args, returns, pres, posts, terminationMeasures, None)(src)
+ in.PureMethod(recv, proxy, args, returns, pres, posts, terminationMeasures, annotations, None, isOpaque)(src)
} else {
- in.Method(recv, proxy, args, returns, pres, posts, terminationMeasures, None)(src)
+ in.Method(recv, proxy, args, returns, pres, posts, terminationMeasures, annotations, None)(src)
}
definedMethods += (proxy -> mem)
AdditionalMembers.addMember(mem)
@@ -3498,6 +3563,7 @@ object Desugar extends LazyLogging {
a.withInfo(a.info.asInstanceOf[Source.Parser.Single].createAnnotatedInfo(ImportPreNotEstablished))
},
terminationMeasures = Vector.empty,
+ backendAnnotations = Vector.empty,
body = Some(in.MethodBody(Vector.empty, in.MethodBodySeqn(Vector.empty)(src), Vector.empty)(src)),
)(src)
}
@@ -3532,6 +3598,7 @@ object Desugar extends LazyLogging {
pres = mainPkgPosts,
posts = mainFuncPreD,
terminationMeasures = Vector.empty,
+ backendAnnotations = Vector.empty,
body = Some(in.MethodBody(Vector.empty, in.MethodBodySeqn(Vector.empty)(src), Vector.empty)(src)),
)(src)
}
@@ -3569,6 +3636,7 @@ object Desugar extends LazyLogging {
posts = progPosts,
// in our verification approach, the initialization code must be proven to terminate
terminationMeasures = Vector(in.TupleTerminationMeasure(Vector(), None)(src)),
+ backendAnnotations = Vector.empty,
body = Some(
in.MethodBody(
decls = Vector(),
@@ -4549,10 +4617,10 @@ object Desugar extends LazyLogging {
case n: PInvoke =>
// a predicate invocation corresponds to a predicate access with full permissions
- // register the full permission AST node in the position manager such that its meta information
+ // register the full permission AST node in `info`'s position manager such that its meta information
// is retrievable in predicateCallD
val perm = PFullPerm()
- pom.positions.dupPos(n, perm)
+ info.tree.root.positions.positions.dupPos(n, perm)
predicateCallD(ctx, info)(n, perm)
case PForall(vars, triggers, body) =>
diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
index 1d6f85893..6a3bf0de6 100644
--- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
+++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
@@ -425,7 +425,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
*/
override def visitMethodSpec(ctx: GobraParser.MethodSpecContext): PMethodSig = {
val ghost = has(ctx.GHOST())
- val spec = if (ctx.specification() != null) visitSpecification(ctx.specification()) else PFunctionSpec(Vector.empty,Vector.empty,Vector.empty, Vector.empty).at(ctx)
+ val spec = if (ctx.specification() != null)
+ visitSpecification(ctx.specification())
+ else
+ PFunctionSpec(Vector.empty,Vector.empty,Vector.empty, Vector.empty, Vector.empty).at(ctx)
// The name of each explicitly specified method must be unique and not blank.
val id = idnDef.get(ctx.IDENTIFIER())
val args = visitNode[Vector[Vector[PParameter]]](ctx.parameters())
@@ -869,6 +872,19 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
*
* */
override def visitSpecification(ctx: GobraParser.SpecificationContext): PFunctionSpec = {
+ // Get the backend options if available
+ val annotations = {
+ if (has(ctx.backendAnnotation()) && has(ctx.backendAnnotation().backendAnnotationList()))
+ ctx
+ .backendAnnotation()
+ .backendAnnotationList()
+ .singleBackendAnnotation()
+ .asScala
+ .map(visitSingleBackendAnnotation)
+ .toVector
+ else
+ Vector.empty
+ }
// Group the specifications by keyword
val groups = ctx.specStatement().asScala.view.groupBy(_.kind.getType)
// Get the respective groups
@@ -877,7 +893,16 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
val posts = groups.getOrElse(GobraParser.POST, Vector.empty).toVector.map(s => visitNode[PExpression](s.assertion().expression()))
val terms = groups.getOrElse(GobraParser.DEC, Vector.empty).toVector.map(s => visitTerminationMeasure(s.terminationMeasure()))
- PFunctionSpec(pres, preserves, posts, terms, isPure = ctx.pure, isTrusted = ctx.trusted)
+ PFunctionSpec(
+ pres,
+ preserves,
+ posts,
+ terms,
+ annotations,
+ isPure = ctx.pure,
+ isTrusted = ctx.trusted,
+ isOpaque = ctx.opaque
+ )
}
/**
@@ -909,6 +934,21 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
case Vector("ghost", decl : Vector[PGhostifiableMember] @unchecked) => decl.map(PExplicitGhostMember(_).at(ctx))
}
+ override def visitSingleBackendAnnotation(ctx: SingleBackendAnnotationContext): PBackendAnnotation = {
+ val key = visit(ctx.backendAnnotationEntry).toString
+ val values =
+ if (has(ctx.listOfValues())) {
+ ctx
+ .listOfValues()
+ .backendAnnotationEntry()
+ .asScala
+ .view.map(ctx => visit(ctx).toString)
+ .toVector
+ } else {
+ Vector.empty
+ }
+ PBackendAnnotation(key, values).at(ctx)
+ }
//region Implementation proofs
/**
@@ -1225,6 +1265,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
case Vector(pe : PExpression, InvokeArgs(args)) => PInvoke(pe, args, None)
}
+ override def visitRevealInvokePrimaryExpr(ctx: RevealInvokePrimaryExprContext): AnyRef = super.visitRevealInvokePrimaryExpr(ctx) match {
+ case Vector(_, pe : PExpression, InvokeArgs(args)) => PInvoke(pe, args, None, true)
+ }
+
override def visitInvokePrimaryExprWithSpec(ctx: InvokePrimaryExprWithSpecContext): AnyRef = super.visitInvokePrimaryExprWithSpec(ctx) match {
case Vector(pe: PExpression, InvokeArgs(args), "as", pcs: PClosureSpecInstance) => PInvoke(pe, args, Some(pcs))
}
diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala
index 5900fa9e6..300a3000f 100644
--- a/src/main/scala/viper/gobra/frontend/Parser.scala
+++ b/src/main/scala/viper/gobra/frontend/Parser.scala
@@ -493,7 +493,7 @@ object Parser extends LazyLogging {
case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n)
case t => t
}
- PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted)
+ PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.backendAnnotations, spec.isPure, spec.isTrusted)
}
val replaceTerminationMeasuresForFunctionsAndMethods: Strategy =
diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
index b365cb375..57f5df1be 100644
--- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
+++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
@@ -72,6 +72,7 @@ object SymbolTable extends Environments[Entity] {
override val args: Vector[PParameter] = decl.args
override val result: PResult = decl.result
def isPure: Boolean = decl.spec.isPure
+ def isOpaque: Boolean = decl.spec.isOpaque
}
case class Closure(lit: PFunctionLit, ghost: Boolean, context: ExternalTypeInfo) extends ActualDataEntity with WithArguments with WithResult {
@@ -188,6 +189,7 @@ object SymbolTable extends Environments[Entity] {
override def isPure: Boolean = decl.spec.isPure
override val args: Vector[PParameter] = decl.args
override val result: PResult = decl.result
+ def isOpaque: Boolean = decl.spec.isOpaque
}
case class MethodSpec(spec: PMethodSig, itfDef: PInterfaceType, ghost: Boolean, context: ExternalTypeInfo) extends Method {
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
index a050ad5a7..0bf0223f1 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
@@ -8,6 +8,7 @@ package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, noMessages}
import viper.gobra.ast.frontend.{AstPattern => ap, _}
+import viper.gobra.frontend.info.base.{SymbolTable => st}
import viper.gobra.frontend.info.base.SymbolTable.{AdtDestructor, AdtDiscriminator, GlobalVariable, SingleConstant}
import viper.gobra.frontend.info.base.Type._
import viper.gobra.frontend.info.implementation.TypeInfoImpl
@@ -233,22 +234,33 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case f: PFunctionLit =>
capturedLocalVariables(f.decl).flatMap(v => addressable.errors(enclosingExpr(v).get)(v)) ++
wellDefVariadicArgs(f.args) ++
- f.id.fold(noMessages)(id => wellDefID(id).out)
+ f.id.fold(noMessages)(id => wellDefID(id).out) ++
+ error(f, "Opaque function literals are not yet supported.", f.spec.isOpaque)
case n: PInvoke => {
val (l, r) = (exprOrType(n.base), resolve(n))
(l,r) match {
-
case (Right(_), Some(p: ap.Conversion)) =>
val typ = typeSymbType(p.typ)
val argWithinBounds: Messages = underlyingTypeP(p.typ) match {
case Some(_: PIntegerType) => intExprWithinTypeBounds(p.arg, typ)
case _ => noMessages
}
- convertibleTo.errors(exprType(p.arg), typ)(n) ++ isExpr(p.arg).out ++ argWithinBounds
-
+ error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a conversion.", n.reveal) ++
+ convertibleTo.errors(exprType(p.arg), typ)(n) ++
+ isExpr(p.arg).out ++
+ argWithinBounds
case (Left(callee), Some(c: ap.FunctionCall)) =>
+ val isOpaque = c.callee match {
+ case base: ap.Symbolic => base.symb match {
+ case f: st.Function => f.isOpaque
+ case m: st.MethodImpl => m.isOpaque
+ case _ => false
+ }
+ }
+ val onlyRevealOpaqueFunc =
+ error(n, "Cannot reveal call to non-opaque function.", n.reveal && !isOpaque)
val isCallToInit =
error(n, s"${Constants.INIT_FUNC_NAME} function is not callable",
c.callee.isInstanceOf[ap.Function] && c.callee.id.name == Constants.INIT_FUNC_NAME)
@@ -261,9 +273,10 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case t: AbstractType => t.messages(n, n.args map exprType)
case t => error(n, s"type error: got $t but expected function type or AbstractType")
}
- isCallToInit ++ wellTypedArgs
+ onlyRevealOpaqueFunc ++ isCallToInit ++ wellTypedArgs
- case (Left(_), Some(_: ap.ClosureCall)) => wellDefCallWithSpec(n)
+ case (Left(_), Some(_: ap.ClosureCall)) =>
+ error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a closure call.", n.reveal) ++ wellDefCallWithSpec(n)
case (Left(callee), Some(p: ap.PredicateCall)) => // TODO: Maybe move case to other file
val pureReceiverMsgs = p.predicate match {
@@ -284,15 +297,16 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case t: AbstractType => t.messages(n, n.args map exprType)
case t => error(n, s"type error: got $t but expected function type or AbstractType")
}
- pureReceiverMsgs ++ pureArgsMsgs ++ argAssignMsgs
+ error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a predicate instance.", n.reveal) ++ pureReceiverMsgs ++ pureArgsMsgs ++ argAssignMsgs
case (Left(callee), Some(_: ap.PredExprInstance)) =>
- exprType(callee) match {
+ val wellTypedArguments = exprType(callee) match {
case PredT(args) =>
if (n.args.isEmpty && args.isEmpty) noMessages
else multiAssignableTo.errors(n.args map exprType, args)(n) ++ n.args.flatMap(isExpr(_).out)
case c => Violation.violation(s"This case should be unreachable, but got $c")
}
+ error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a predicate expression instance.", n.reveal) ++ wellTypedArguments
case _ => error(n, s"expected a call to a conversion, function, or predicate, but got $n")
}
@@ -305,49 +319,53 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
val baseType = exprType(base)
val idxType = exprType(index)
(underlyingType(baseType), underlyingType(idxType)) match {
- case (ArrayT(l, _), IntT(_)) =>
- val idxOpt = intConstantEval(index)
- error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l))
-
- case (PointerT(ArrayT(l, _)), IntT(_)) =>
- val idxOpt = intConstantEval(index)
- error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l))
-
- case (SequenceT(_), IntT(_)) =>
- noMessages
-
- case (_: SliceT | _: GhostSliceT, IntT(_)) =>
- noMessages
-
- case (VariadicT(_), IntT(_)) =>
- noMessages
+ case (Single(base), Single(idx)) => (base, idx) match {
+ case (ArrayT(l, _), IntT(_)) =>
+ val idxOpt = intConstantEval(index)
+ error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l))
+
+ case (PointerT(ArrayT(l, _)), IntT(_)) =>
+ val idxOpt = intConstantEval(index)
+ error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l))
+
+ case (SequenceT(_), IntT(_)) =>
+ noMessages
+
+ case (_: SliceT | _: GhostSliceT, IntT(_)) =>
+ noMessages
+
+ case (VariadicT(_), IntT(_)) =>
+ noMessages
+
+ case (StringT, IntT(_)) =>
+ error(n, "Indexing a string is currently not supported")
+
+ case (MapT(key, _), underlyingIdxType) =>
+ // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation
+ // between two types, which is less precise. Because of this limitation, and with the goal of handling
+ // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go
+ // expressions that are not accepted by the compiler.
+ val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key))
+ if (assignableToIdxType.nonEmpty) {
+ error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key))
+ } else {
+ assignableToIdxType
+ }
- case (StringT, IntT(_)) =>
- error(n, "Indexing a string is currently not supported")
-
- case (MapT(key, _), underlyingIdxType) =>
- // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation
- // between two types, which is less precise. Because of this limitation, and with the goal of handling
- // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go
- // expressions that are not accepted by the compiler.
- val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key))
- if (assignableToIdxType.nonEmpty) {
- error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key))
- } else {
- assignableToIdxType
- }
+ case (MathMapT(key, _), underlyingIdxType) =>
+ // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation
+ // between two types, which is less precise. Because of this limitation, and with the goal of handling
+ // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go
+ // expressions that are not accepted by the compiler.
+ val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key))
+ if (assignableToIdxType.nonEmpty) {
+ error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key))
+ } else {
+ assignableToIdxType
+ }
- case (MathMapT(key, _), underlyingIdxType) =>
- // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation
- // between two types, which is less precise. Because of this limitation, and with the goal of handling
- // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go
- // expressions that are not accepted by the compiler.
- val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key))
- if (assignableToIdxType.nonEmpty) {
- error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key))
- } else {
- assignableToIdxType
- }
+ case (bt, it) => error(n, s"$it index is not a proper index of $bt")
+ }
case (bt, it) => error(n, s"$it index is not a proper index of $bt")
}
@@ -669,16 +687,19 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
val baseType = exprType(base)
val idxType = exprType(index)
(underlyingType(baseType), underlyingType(idxType)) match {
- case (ArrayT(_, elem), IntT(_)) => elem
- case (PointerT(ArrayT(_, elem)), IntT(_)) => elem
- case (SequenceT(elem), IntT(_)) => elem
- case (SliceT(elem), IntT(_)) => elem
- case (GhostSliceT(elem), IntT(_)) => elem
- case (VariadicT(elem), IntT(_)) => elem
- case (MapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) =>
- InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT)))
- case (MathMapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) =>
- InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT)))
+ case (Single(base), Single(idx)) => (base, idx) match {
+ case (ArrayT(_, elem), IntT(_)) => elem
+ case (PointerT(ArrayT(_, elem)), IntT(_)) => elem
+ case (SequenceT(elem), IntT(_)) => elem
+ case (SliceT(elem), IntT(_)) => elem
+ case (GhostSliceT(elem), IntT(_)) => elem
+ case (VariadicT(elem), IntT(_)) => elem
+ case (MapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) =>
+ InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT)))
+ case (MathMapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) =>
+ InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT)))
+ case (bt, it) => violation(s"$it is not a valid index for the the base $bt")
+ }
case (bt, it) => violation(s"$it is not a valid index for the the base $bt")
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
index 0fcf977b9..a8fd70d43 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
@@ -22,9 +22,16 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl =>
private[typing] def wellDefActualMember(member: PActualMember): Messages = member match {
case n: PFunctionDecl =>
- wellDefVariadicArgs(n.args) ++ wellDefIfPureFunction(n) ++ wellDefIfInitBlock(n) ++ wellDefIfMain(n)
+ wellDefVariadicArgs(n.args) ++
+ wellDefIfPureFunction(n) ++
+ wellDefIfInitBlock(n) ++
+ wellDefIfMain(n) ++
+ wellFoundedIfNeeded(n)
case m: PMethodDecl =>
- wellDefVariadicArgs(m.args) ++ isReceiverType.errors(miscType(m.receiver))(member) ++ wellDefIfPureMethod(m)
+ wellDefVariadicArgs(m.args) ++
+ isReceiverType.errors(miscType(m.receiver))(member) ++
+ wellDefIfPureMethod(m) ++
+ wellFoundedIfNeeded(m)
case b: PConstDecl =>
b.specs.flatMap(wellDefConstSpec)
case g: PVarDecl if isGlobalVarDeclaration(g) =>
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
index ad6c39039..5330c4cb4 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
@@ -35,7 +35,8 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl =>
case n: PTypeDecl => isType(n.right).out ++ (n.right match {
case s: PStructType =>
error(n, s"invalid recursive type ${n.left.name}", cyclicStructDef(s, Some(n.left)))
- case s: PInterfaceType =>
+ case s@PInterfaceType(_, methSpecs, _) =>
+ methSpecs.flatMap(m => error(m, "Interface method signatures cannot be opaque.", m.spec.isOpaque)) ++
error(n, s"invalid recursive type ${n.left.name}", cyclicInterfaceDef(s, Some(n.left)))
case _ => noMessages
})
@@ -156,7 +157,9 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl =>
case n: PDeferStmt => error(n, "Currently, outline statements are not allowed to contain defer statements.")
case n: PReturn => error(n, "outline statements must not contain return statements.")
}
- error(n, s"pure outline statements are not supported.", n.spec.isPure) ++ invalidNodes.flatten
+ error(n, s"pure outline statements are not supported.", n.spec.isPure) ++
+ error(n, "Opaque outline statements are not supported.", n.spec.isOpaque) ++
+ invalidNodes.flatten
case _: PEmptyStmt => noMessages
case _: PGoto => ???
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala
index dfbf1c7cc..c5b6ed001 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala
@@ -97,11 +97,13 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
}
permWellDef ++ expWellDef
- case n: PPredicateAccess => resolve(n.pred) match {
- case Some(_: ap.PredicateCall) => noMessages
- case Some(_: ap.PredExprInstance) => noMessages
- case _ => error(n, s"expected reference, dereference, field selection, or predicate expression instance, but got ${n.pred}")
- }
+ case n: PPredicateAccess =>
+ val predWellDef = resolve(n.pred) match {
+ case Some(_: ap.PredicateCall) => noMessages
+ case Some(_: ap.PredExprInstance) => noMessages
+ case _ => error(n, s"expected reference, dereference, field selection, or predicate expression instance, but got ${n.pred}")
+ }
+ predWellDef ++ error(n, "Cannot reveal a predicate access.", n.pred.reveal)
case PTypeOf(e) => isExpr(e).out
case PTypeExpr(t) => isType(t).out
@@ -208,11 +210,11 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
case t => error(op, s"expected a sequence, multiset or option type, but got $t")
}
case PMapKeys(exp) => underlyingType(exprType(exp)) match {
- case _: MathMapT | _: MapT => isExpr(exp).out
+ case Single(_: MathMapT | _: MapT) => isExpr(exp).out
case t => error(expr, s"expected a map, but got $t")
}
case PMapValues(exp) => underlyingType(exprType(exp)) match {
- case _: MathMapT | _: MapT => isExpr(exp).out
+ case Single(_: MathMapT | _: MapT) => isExpr(exp).out
case t => error(expr, s"expected a map, but got $t")
}
}
@@ -265,7 +267,13 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
case _: PGhostEquals | _: PGhostUnequals => BooleanT
case POptionNone(t) => OptionT(typeSymbType(t))
- case POptionSome(e) => OptionT(exprType(e))
+ case POptionSome(e) =>
+ val et = exprType(e)
+ et match {
+ case Single(t) => OptionT(t)
+ case t => violation(s"expected a single type, but got $t")
+ }
+
case POptionGet(e) => exprType(e) match {
case OptionT(t) => t
case t => violation(s"expected an option type, but got $t")
@@ -313,13 +321,13 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
case t => violation(s"expected a sequence, set, multiset or option type, but got $t")
}
case PMapKeys(exp) => underlyingType(exprType(exp)) match {
- case t: MathMapT => SetT(t.key)
- case t: MapT => SetT(t.key)
+ case Single(t: MathMapT) => SetT(t.key)
+ case Single(t: MapT) => SetT(t.key)
case t => violation(s"expected a map, but got $t")
}
case PMapValues(exp) => underlyingType(exprType(exp)) match {
- case t: MathMapT => SetT(t.elem)
- case t: MapT => SetT(t.elem)
+ case Single(t: MathMapT) => SetT(t.elem)
+ case Single(t: MapT) => SetT(t.elem)
case t => violation(s"expected a map, but got $t")
}
}
@@ -556,7 +564,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
expr match {
case PDot(base, _) => goEorT(base)
- case PInvoke(base, args, None) => {
+ case PInvoke(base, args, None, _) => {
val res1 = goEorT(base)
val res2 = combineTriggerResults(args.map(validTriggerPattern))
combineTriggerResults(res1, res2)
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala
index 6ff5bef67..6fefc23d1 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala
@@ -7,11 +7,12 @@
package viper.gobra.frontend.info.implementation.typing.ghost
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages}
-import viper.gobra.ast.frontend.{PBlock, PCodeRootWithResult, PExplicitGhostMember, PFPredicateDecl, PFunctionDecl, PFunctionSpec, PGhostMember, PIdnUse, PImplementationProof, PMPredicateDecl, PMethodDecl, PMethodImplementationProof, PParameter, PReturn, PVariadicType, PWithBody}
+import viper.gobra.ast.frontend.{PBlock, PCodeRootWithResult, PExplicitGhostMember, PFPredicateDecl, PFunctionDecl, PFunctionSpec, PGhostMember, PIdnUse, PImplementationProof, PMember, PMPredicateDecl, PMethodDecl, PMethodImplementationProof, PParameter, PReturn, PVariadicType, PWithBody}
import viper.gobra.frontend.info.base.SymbolTable.{MPredicateSpec, MethodImpl, MethodSpec}
import viper.gobra.frontend.info.base.Type.{InterfaceT, Type, UnknownType}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.frontend.info.implementation.typing.BaseTyping
+import viper.gobra.util.Violation
trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl =>
@@ -58,8 +59,23 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl =>
}
}
- private[typing] def wellDefIfPureMethod(member: PMethodDecl): Messages = {
+ private[typing] def wellFoundedIfNeeded(member: PMember): Messages = {
+ val spec = member match {
+ case m: PMethodDecl => m.spec
+ case f: PFunctionDecl => f.spec
+ case _ => Violation.violation("Unexpected member type")
+ }
+ val hasMeasureIfNeeded =
+ if (spec.isPure || isEnclosingGhost(member))
+ config.disableCheckTerminationPureFns || spec.terminationMeasures.nonEmpty
+ else
+ true
+ val needsMeasureError =
+ error(member, "All pure or ghost functions and methods must have termination measures, but none was found for this member.", !hasMeasureIfNeeded)
+ needsMeasureError
+ }
+ private[typing] def wellDefIfPureMethod(member: PMethodDecl): Messages = {
if (member.spec.isPure) {
isSingleResultArg(member) ++
isSinglePureReturnExpr(member) ++
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala
index ef273194c..d2569a98c 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala
@@ -160,6 +160,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
case e => Violation.violation(s"expected a method signature of an interface, but got $e")
}
}
+ case _: PBackendAnnotation => noMessages
}
private[typing] def ghostMiscType(misc: PGhostMisc): Type = misc match {
@@ -205,6 +206,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
case _: PMethodImplementationProof => UnknownType
case _: PImplementationProofPredicateAlias => UnknownType
+ case _: PBackendAnnotation => UnknownType
}
private[typing] def ghostMemberType(typeMember: GhostTypeMember): Type = typeMember match {
@@ -219,7 +221,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
}
implicit lazy val wellDefSpec: WellDefinedness[PSpecification] = createWellDef {
- case n@ PFunctionSpec(pres, preserves, posts, terminationMeasures, _, _) =>
+ case n@ PFunctionSpec(pres, preserves, posts, terminationMeasures, _, isPure, _, isOpaque) =>
pres.flatMap(assignableToSpec) ++ preserves.flatMap(assignableToSpec) ++ posts.flatMap(assignableToSpec) ++
preserves.flatMap(e => allChildren(e).flatMap(illegalPreconditionNode)) ++
pres.flatMap(e => allChildren(e).flatMap(illegalPreconditionNode)) ++
@@ -228,7 +230,8 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
// can only have one non-conditional clause
error(n, "Specifications can either contain one non-conditional termination measure or multiple conditional-termination measures.", terminationMeasures.length > 1 && !terminationMeasures.forall(isConditional)) ++
// measures must have the same type
- error(n, "Termination measures must all have the same type.", !hasSameMeasureType(terminationMeasures))
+ error(n, "Termination measures must all have the same type.", !hasSameMeasureType(terminationMeasures)) ++
+ error(n, "Opaque can only be used in combination with pure.", isOpaque && !isPure)
case n@ PLoopSpec(invariants, terminationMeasure) =>
invariants.flatMap(assignableToSpec) ++ terminationMeasure.toVector.flatMap(wellDefTerminationMeasure) ++
@@ -283,6 +286,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
private def illegalPreconditionNode(n: PNode): Messages = {
n match {
+ case PLabeledOld(PLabelUse(PLabelNode.lhsLabel), _) => noMessages
case n@ (_: POld | _: PLabeledOld) => message(n, s"old not permitted in precondition")
case n@ (_: PBefore) => message(n, s"old not permitted in precondition")
case _ => noMessages
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala
index 1cf3b63b1..039e9ea39 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala
@@ -21,7 +21,7 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter
rec,
filterParamList(args),
filterResult(res),
- PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty),
+ PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty),
body.map( b => (PBodyParameterInfo(Vector.empty), b._2) )
)
)
@@ -32,7 +32,7 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter
id,
filterParamList(args),
filterResult(res),
- PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty),
+ PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty),
body.map( b => (PBodyParameterInfo(Vector.empty), b._2) )
)
)
@@ -170,7 +170,7 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter
case PFunctionLit(_, PClosureDecl(args, result, _, body)) => super.showMisc(PClosureDecl(
filterParamList(args),
filterResult(result),
- PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty),
+ PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty),
body.map( b => (PBodyParameterInfo(Vector.empty), b._2) )
))
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala
index b524fc44c..a6606258a 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala
@@ -77,13 +77,15 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter {
* Shows the Goified version of the function / method specification
*/
override def showSpec(spec: PSpecification): Doc = spec match {
- case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted) =>
+ case PFunctionSpec(pres, preserves, posts, measures, backendAnnotations, isPure, isTrusted, isOpaque) =>
(if (isPure) specComment <+> showPure else emptyDoc) <>
+ (if (isOpaque) specComment <+> showOpaque else emptyDoc) <>
(if (isTrusted) specComment <+> showTrusted else emptyDoc) <>
hcat(pres map (p => specComment <+> showPre(p) <> line)) <>
hcat(preserves map (p => specComment <+> showPreserves(p) <> line)) <>
hcat(posts map (p => specComment <+> showPost(p) <> line)) <>
- hcat(measures map (p => specComment <+> showTerminationMeasure(p) <> line))
+ hcat(measures map (p => specComment <+> showTerminationMeasure(p) <> line)) <>
+ specComment <+> showBackendAnnotations(backendAnnotations) <> line
case PLoopSpec(inv, measure) =>
hcat(inv map (p => specComment <+> showInv(p) <> line)) <>
@@ -124,7 +126,7 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter {
rec,
getActualParams(args),
getActualResult(res),
- PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty),
+ PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty),
body
)
)
@@ -136,7 +138,7 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter {
id,
getActualParams(args),
getActualResult(res),
- PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty),
+ PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty),
body
)
)
diff --git a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
index 2cc79ddc3..96da68382 100644
--- a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
+++ b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
@@ -6,8 +6,7 @@
package viper.gobra.reporting
-import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation}
-
+import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation, MainPreNotEstablished, OverflowCheckAnnotation, OverwriteErrorAnnotation, ReceiverNotNilCheckAnnotation}
import viper.gobra.reporting.Source.Verifier./
import viper.silver
import viper.silver.ast.Not
@@ -163,6 +162,8 @@ class DefaultErrorBackTranslator(
}
val transformAnnotatedError: VerificationError => VerificationError = x => x.info match {
+ case _ / (an: OverwriteErrorAnnotation) => an(x)
+
case _ / OverflowCheckAnnotation =>
x.reasons.foldLeft(OverflowError(x.info): VerificationError){ case (err, reason) => err dueTo reason }
diff --git a/src/main/scala/viper/gobra/reporting/Source.scala b/src/main/scala/viper/gobra/reporting/Source.scala
index 6204aa50d..5c1a2bbc3 100644
--- a/src/main/scala/viper/gobra/reporting/Source.scala
+++ b/src/main/scala/viper/gobra/reporting/Source.scala
@@ -33,6 +33,16 @@ object Source {
case class NoPermissionToRangeExpressionAnnotation() extends Annotation
case class InsufficientPermissionToRangeExpressionAnnotation() extends Annotation
case class AutoImplProofAnnotation(subT: String, superT: String) extends Annotation
+ class OverwriteErrorAnnotation(
+ newError: VerificationError => VerificationError,
+ attachReasons: Boolean = true
+ ) extends Annotation {
+ def apply(err: VerificationError): VerificationError = {
+ if (attachReasons) {
+ err.reasons.foldLeft(newError(err)){ case (err, reason) => err dueTo reason }
+ } else newError(err)
+ }
+ }
object Parser {
diff --git a/src/main/scala/viper/gobra/reporting/StatsCollector.scala b/src/main/scala/viper/gobra/reporting/StatsCollector.scala
index 611689580..ffc915ba8 100644
--- a/src/main/scala/viper/gobra/reporting/StatsCollector.scala
+++ b/src/main/scala/viper/gobra/reporting/StatsCollector.scala
@@ -14,7 +14,8 @@ import viper.gobra.frontend.Config
import viper.gobra.frontend.info.{Info, TypeInfo}
import viper.gobra.util.Violation
import viper.silver.ast.{Function, Member, Method, Predicate}
-import viper.silver.ast.utility.Chopper.{Edges, Vertex}
+import viper.silver.ast.utility.chopper.{Edges, Vertices}
+import viper.silver.ast.utility.chopper.Vertices.Vertex
import viper.silver.reporter.Time
import scala.collection.concurrent.{Map, TrieMap}
@@ -162,7 +163,7 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter {
taskName,
time,
ViperNodeType.withName(viperMember.getClass.getSimpleName),
- Edges.dependencies(viperMember).flatMap(edge => vertexToName(edge._2)).toSet,
+ EdgesImpl.dependencies(viperMember).flatMap(edge => vertexToName(edge._2)).toSet,
success,
cached,
memberInfo.isImported,
@@ -193,6 +194,8 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter {
reporter.report(msg)
}
+ private object EdgesImpl extends Edges with Vertices
+
private def gobraMemberKey(pkgId: String,memberName: String, args: String): String = pkgId + "." + memberName + args
private def viperMemberKey(taskName: String, viperMemberName: String): String = taskName + "-" + viperMemberName
@@ -241,11 +244,11 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter {
* for the statistics
*/
private def vertexToName(vertex: Vertex): Option[String] = vertex match {
- case Vertex.Method(name) => Some(name)
- case Vertex.MethodSpec(name) => Some(name)
- case Vertex.Function(name) => Some(name)
- case Vertex.PredicateBody(name) => Some(name)
- case Vertex.PredicateSig(name) => Some(name)
+ case Vertices.Method(name) => Some(name)
+ case Vertices.MethodSpec(name) => Some(name)
+ case Vertices.Function(name) => Some(name)
+ case Vertices.PredicateBody(name) => Some(name)
+ case Vertices.PredicateSig(name) => Some(name)
case _ => None
}
diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala
index a2877f4cb..067334e5e 100644
--- a/src/main/scala/viper/gobra/reporting/VerifierError.scala
+++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala
@@ -161,6 +161,11 @@ case class CallError(info: Source.Verifier.Info) extends VerificationError {
override def localMessage: String = "Call might fail"
}
+case class LoadError(info: Source.Verifier.Info) extends VerificationError {
+ override def localId: String = "load_error"
+ override def localMessage: String = "Reading might fail"
+}
+
case class PostconditionError(info: Source.Verifier.Info) extends VerificationError {
override def localId: String = "postcondition_error"
override def localMessage: String = "Postcondition might not hold"
@@ -340,7 +345,7 @@ case class ChannelReceiveError(info: Source.Verifier.Info) extends VerificationE
case class ChannelSendError(info: Source.Verifier.Info) extends VerificationError {
override def localId: String = "send_error"
- override def localMessage: String = s"The receive expression ${info.trySrc[PSendStmt](" ")}might fail"
+ override def localMessage: String = s"The send expression ${info.trySrc[PSendStmt](" ")}might fail"
}
case class FunctionTerminationError(info: Source.Verifier.Info) extends VerificationError {
diff --git a/src/main/scala/viper/gobra/translator/Names.scala b/src/main/scala/viper/gobra/translator/Names.scala
index 8befa7395..3168fa953 100644
--- a/src/main/scala/viper/gobra/translator/Names.scala
+++ b/src/main/scala/viper/gobra/translator/Names.scala
@@ -62,6 +62,7 @@ object Names {
case in.ArrayT(len, elemT, addr) => s"Array$len${serializeType(elemT)}${serializeAddressability(addr)}"
case in.SliceT(elemT, addr) => s"Slice${serializeType(elemT)}${serializeAddressability(addr)}"
case in.MapT(keyT, valueT, addr) => s"Map${serializeType(keyT)}_${serializeType(valueT)}_${serializeAddressability(addr)}"
+ case in.MathMapT(keyT, valueT, addr) => s"Dict${serializeType(keyT)}_${serializeType(valueT)}_${serializeAddressability(addr)}"
case in.SequenceT(elemT, addr) => s"Sequence${serializeType(elemT)}${serializeAddressability(addr)}"
case in.SetT(elemT, addr) => s"Set${serializeType(elemT)}${serializeAddressability(addr)}"
case in.MultisetT(elemT, addr) => s"Multiset${serializeType(elemT)}${serializeAddressability(addr)}"
diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
index c5416a789..44835e447 100644
--- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
@@ -16,10 +16,12 @@ import viper.gobra.translator.Names
import viper.gobra.translator.encodings.combinators.LeafTypeEncoding
import viper.gobra.translator.context.Context
import viper.gobra.translator.util.FunctionGenerator
+import viper.gobra.translator.util.ViperUtil.synthesized
import viper.gobra.translator.util.ViperWriter.CodeLevel._
import viper.gobra.translator.util.ViperWriter.CodeWriter
import viper.gobra.util.TypeBounds
import viper.silver.{ast => vpr}
+import viper.silver.plugin.standard.termination
import scala.annotation.unused
@@ -181,6 +183,7 @@ class StringEncoding extends LeafTypeEncoding {
* requires l <= h
* requires h <= len(s)
* ensures strLen(s) == h - l
+ * decreases _
* where s is a string id and l and r are the lower and upper bounds of the slice
*/
private val strSliceName: String = "strSlice"
@@ -197,7 +200,8 @@ class StringEncoding extends LeafTypeEncoding {
pres = Seq(
vpr.LeCmp(vpr.IntLit(0)(), argL.localVar)(),
vpr.LeCmp(argL.localVar, argH.localVar)(),
- vpr.LeCmp(argH.localVar, vpr.DomainFuncApp(lenFunc, Seq(argS.localVar), Map.empty)())()
+ vpr.LeCmp(argH.localVar, vpr.DomainFuncApp(lenFunc, Seq(argS.localVar), Map.empty)())(),
+ synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate"),
),
posts = Seq(
vpr.EqCmp(
@@ -298,7 +302,9 @@ class StringEncoding extends LeafTypeEncoding {
pres = Vector(pre),
posts = Vector(),
terminationMeasures = Vector(in.WildcardMeasure(None)(info)),
- body = None
+ backendAnnotations = Vector.empty,
+ body = None,
+ isOpaque = false
)(info)
val translatedFunc = ctx.function(func)
translatedFunc.res
diff --git a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala
index 3ad28b2a8..5eb0a288e 100644
--- a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala
@@ -8,7 +8,7 @@ package viper.gobra.translator.encodings.arrays
import org.bitbucket.inkytonik.kiama.==>
import viper.gobra.ast.{internal => in}
-import viper.gobra.reporting.Source
+import viper.gobra.reporting.{LoadError, InsufficientPermissionError, Source}
import viper.gobra.theory.Addressability
import viper.gobra.theory.Addressability.{Exclusive, Shared}
import viper.gobra.translator.Names
@@ -230,7 +230,11 @@ class ArrayEncoding extends TypeEncoding with SharedArrayEmbedding {
val (pos, info, errT) = loc.vprMeta
for {
arg <- ctx.reference(loc)
- } yield conversionFunc(Vector(arg), cptParam(len, t)(ctx))(pos, info, errT)(ctx)
+ res <- funcAppPrecondition(
+ conversionFunc(Vector(arg), cptParam(len, t)(ctx))(pos, info, errT)(ctx),
+ { case (info, _) => LoadError(info) dueTo InsufficientPermissionError(info) }
+ )
+ } yield res
}
/**
@@ -336,6 +340,7 @@ class ArrayEncoding extends TypeEncoding with SharedArrayEmbedding {
* function arrayDefault(): ([n]T)°
* ensures len(result) == n
* ensures Forall idx :: {result[idx]} 0 <= idx < n ==> [result[idx] == dflt(T)]
+ * decreases _
* */
private val exDfltFunc: FunctionGenerator[ComponentParameter] = new FunctionGenerator[ComponentParameter]{
def genFunction(t: ComponentParameter)(ctx: Context): vpr.Function = {
@@ -358,12 +363,14 @@ class ArrayEncoding extends TypeEncoding with SharedArrayEmbedding {
Seq(vpr.Trigger(Seq(trigger))()),
vpr.Implies(boundaryCondition(vIdx.localVar, t.len)(src), idxEq)()
)()
+ val terminationMeasure =
+ synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate")
vpr.Function(
name = s"${Names.arrayDefaultFunc}_${t.serialize}",
formalArgs = Seq.empty,
typ = vResType,
- pres = Seq.empty,
+ pres = Seq(terminationMeasure),
posts = Vector(lenEq, arrayEq),
body = None
)()
diff --git a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala
index 1d6567738..d13147fa5 100644
--- a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala
@@ -14,7 +14,6 @@ import viper.gobra.theory.Addressability.{Exclusive, Shared}
import viper.gobra.translator.encodings.combinators.LeafTypeEncoding
import viper.gobra.translator.context.Context
import viper.gobra.translator.util.ViperWriter.CodeWriter
-import viper.gobra.util.Violation.violation
import viper.silver.{ast => vpr}
class ChannelEncoding extends LeafTypeEncoding {
@@ -68,7 +67,7 @@ class ChannelEncoding extends LeafTypeEncoding {
)
// exhale [c].RecvGivenPerm()()
- recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector())(exp.info)
+ recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector.empty, Vector.empty)(exp.info)
vprRecvGivenPermInst <- ctx.assertion(recvGivenPermInst)
_ <- exhale(vprRecvGivenPermInst,
(info, _) => ChannelReceiveError(info) dueTo InsufficientPermissionFromTagError(s"${channel.info.tag}.RecvGivenPerm()()")
@@ -85,7 +84,7 @@ class ChannelEncoding extends LeafTypeEncoding {
// inhale res != Dflt[T] ==> [c].RecvGotPerm()(res)
isNotZero = in.UneqCmp(res, in.DfltVal(res.typ)(exp.info))(exp.info)
- recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res))(exp.info)
+ recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res), Vector(typeParam))(exp.info)
notZeroImpl = in.Implication(isNotZero, recvGotPermInst)(exp.info)
vprNotZeroImpl <- ctx.assertion(notZeroImpl)
vprInhaleNotZeroImpl = vpr.Inhale(vprNotZeroImpl)(pos, info, errT)
@@ -156,7 +155,7 @@ class ChannelEncoding extends LeafTypeEncoding {
_ <- write(vprIsChannelInhale)
// inhale [a].BufferSize() == [bufferSize]
- bufferSizeCall = in.PureMethodCall(a, bufferSizeMProxy, Vector(), in.IntT(Addressability.outParameter))(makeStmt.info)
+ bufferSizeCall = in.PureMethodCall(a, bufferSizeMProxy, Vector(), in.IntT(Addressability.outParameter), false)(makeStmt.info)
bufferSizeEq = in.EqCmp(bufferSizeCall, bufferSizeArg)(makeStmt.info)
vprBufferSizeEq <- ctx.expression(bufferSizeEq)
vprBufferSizeInhale = vpr.Inhale(vprBufferSizeEq)(pos, info, errT)
@@ -168,7 +167,7 @@ class ChannelEncoding extends LeafTypeEncoding {
)
case stmt@in.Send(channel :: ctx.Channel(typeParam), message, sendChannel, sendGivenPerm, sendGotPerm) =>
- violation(message.typ == typeParam, s"message type ${message.typ} has to be the same as the channel element type $typeParam")
+ // note that the message type might not be identical to the channel element type but is assignable (as checked by the type checker)!
val (pos, info, errT) = stmt.vprMeta
val sendChannelPred = in.Accessible.Predicate(in.MPredicateAccess(channel, sendChannel, Vector())(stmt.info))
seqn(
@@ -180,14 +179,14 @@ class ChannelEncoding extends LeafTypeEncoding {
)
// exhale [c].SendGivenPerm()([m])
- sendGivenPermInst = getChannelInvariantAccess(channel, sendGivenPerm, Vector(message))(stmt.info)
+ sendGivenPermInst = getChannelInvariantAccess(channel, sendGivenPerm, Vector(message), Vector(typeParam))(stmt.info)
vprSendGivenPermInst <- ctx.assertion(sendGivenPermInst)
_ <- exhale(vprSendGivenPermInst,
(info, _) => ChannelSendError(info) dueTo InsufficientPermissionFromTagError(s"${channel.info.tag}.SendGivenPerm()(${message.info.tag})")
)
// inhale [c].SendGotPerm()()
- sendGotPermInst = getChannelInvariantAccess(channel, sendGotPerm, Vector())(stmt.info)
+ sendGotPermInst = getChannelInvariantAccess(channel, sendGotPerm, Vector.empty, Vector.empty)(stmt.info)
vprSendGotPermInst <- ctx.assertion(sendGotPermInst)
vprInhaleSendGotPermInst = vpr.Inhale(vprSendGotPermInst)(pos, info, errT)
} yield vprInhaleSendGotPermInst
@@ -209,7 +208,7 @@ class ChannelEncoding extends LeafTypeEncoding {
)
// exhale [c].RecvGivenPerm()()
- recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector())(stmt.info)
+ recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector.empty, Vector.empty)(stmt.info)
vprRecvGivenPermInst <- ctx.assertion(recvGivenPermInst)
_ <- exhale(vprRecvGivenPermInst,
(info, _) => ChannelReceiveError(info) dueTo InsufficientPermissionFromTagError(s"${channel.info.tag}.RecvGivenPerm()()")
@@ -228,7 +227,7 @@ class ChannelEncoding extends LeafTypeEncoding {
_ <- write(vprInhaleRecvChannelFull)
// inhale ok ==> [c].RecvGotPerm()(res)
- recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res))(stmt.info)
+ recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res), Vector(typeParam))(stmt.info)
okImpl = in.Implication(ok, recvGotPermInst)(stmt.info)
vprOkImpl <- ctx.assertion(okImpl)
vprInhaleOkImpl = vpr.Inhale(vprOkImpl)(pos, info, errT)
@@ -260,9 +259,10 @@ class ChannelEncoding extends LeafTypeEncoding {
/**
* Constructs `[channel].invariant()([args])`
*/
- private def getChannelInvariantAccess(channel: in.Expr, invariant: in.MethodProxy, args: Vector[in.Expr])(src: Source.Parser.Info): in.Access = {
- val permReturnT = in.PredT(args.map(_.typ), Addressability.outParameter)
- val permPred = in.PureMethodCall(channel, invariant, Vector(), permReturnT)(src)
+ private def getChannelInvariantAccess(channel: in.Expr, invariant: in.MethodProxy, args: Vector[in.Expr], argTypes: Vector[in.Type])(src: Source.Parser.Info): in.Access = {
+ require(args.length == argTypes.length)
+ val permReturnT = in.PredT(argTypes, Addressability.outParameter)
+ val permPred = in.PureMethodCall(channel, invariant, Vector(), permReturnT, false)(src)
in.Access(in.Accessible.PredExpr(in.PredExprInstance(permPred, args)(src)), in.FullPerm(src))(src)
}
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala
index 3a35fcd57..611748049 100644
--- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala
@@ -48,7 +48,7 @@ protected class ClosureSpecsEncoder {
def callToClosureGetter(func: in.FunctionMemberOrLitProxy, captured: Vector[(in.Expr, in.Parameter.In)] = Vector.empty)(ctx: Context): CodeWriter[vpr.Exp] = {
val errorTransformers = register(in.ClosureSpec(func, Map.empty)(func.info))(ctx, func.info)
for {
- exp <- ctx.expression(in.PureFunctionCall(closureGetterFunctionProxy(func), captured.map(c => c._1), genericFuncType)(func.info))
+ exp <- ctx.expression(in.PureFunctionCall(closureGetterFunctionProxy(func), captured.map(c => c._1), genericFuncType, false)(func.info))
_ <- errorT(errorTransformers: _*)
} yield exp
}
@@ -77,7 +77,7 @@ protected class ClosureSpecsEncoder {
register(c.spec)(ctx, c.spec.info)
for {
- exp <- ctx.expression(in.PureFunctionCall(closureCallProxy(c.spec)(c.info), closureCallArgs(c.closure, c.args, c.spec)(ctx), c.typ)(c.info))
+ exp <- ctx.expression(in.PureFunctionCall(closureCallProxy(c.spec)(c.info), closureCallArgs(c.closure, c.args, c.spec)(ctx), c.typ, false)(c.info))
callNode = exp.deepCollect{ case funcApp: vpr.FuncApp => funcApp }.head
_ <- errorT(doesNotImplementSpecErr(callNode, c.closure.info.tag))
} yield exp
@@ -208,7 +208,8 @@ protected class ClosureSpecsEncoder {
val result = in.Parameter.Out(Names.closureArg, genericFuncType)(info)
val satisfiesSpec = in.ExprAssertion(in.ClosureImplements(result, in.ClosureSpec(func, Map.empty)(info))(info))(info)
val (args, captAssertions) = capturedArgsAndAssertions(ctx)(result, captured(ctx)(func), info)
- val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions, Vector.empty, None)(memberOrLit(ctx)(func).info)
+ val notNil = in.ExprAssertion(in.UneqCmp(result, in.NilLit(genericFuncType)(info))(info))(info)
+ val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions :+ notNil, Vector.empty, Vector.empty, None, false)(memberOrLit(ctx)(func).info)
ctx.defaultEncoding.pureFunction(getter)(ctx)
}
@@ -282,30 +283,31 @@ protected class ClosureSpecsEncoder {
Some(in.ExprAssertion(in.ClosureImplements(closurePar, specWithFuncArgs(spec, func))(spec.info))(spec.info)) else None
val fromClosureGetter = if (captArgs.nonEmpty)
Some(in.ExprAssertion(in.EqCmp(closurePar,
- in.PureFunctionCall(closureGetterFunctionProxy(spec.func), captArgs, genericFuncType)(spec.info))(spec.info)
+ in.PureFunctionCall(closureGetterFunctionProxy(spec.func), captArgs, genericFuncType, false)(spec.info))(spec.info)
)(spec.info)) else None
val args = Vector(closurePar) ++ captArgs ++ func.args
val pres = implementsAssertion.toVector ++ fromClosureGetter ++ func.pres
+ val annotations = func.backendAnnotations
// Store the origin of the spec; if the first precondition fails, we use this to recognise and transform the error message
implementAssertionSpecOriginToStr += spec.info.origin.get -> spec.info.tag
func match {
case _: in.Function =>
- val m = in.Function(proxy, args, func.results, pres, func.posts, func.terminationMeasures, None)(spec.info)
+ val m = in.Function(proxy, args, func.results, pres, func.posts, func.terminationMeasures, annotations, None)(spec.info)
ctx.defaultEncoding.function(m)(ctx)
case lit: in.FunctionLit =>
val body = if (spec.params.isEmpty) lit.body else None
- val func = in.Function(proxy, args, lit.results, pres, lit.posts, lit.terminationMeasures, body)(lit.info)
+ val func = in.Function(proxy, args, lit.results, pres, lit.posts, lit.terminationMeasures, annotations, body)(lit.info)
ctx.defaultEncoding.function(func)(ctx)
case f: in.PureFunction =>
val posts = func.posts ++ assertionFromPureFunctionBody(f.body, f.results.head)
- val m = in.PureFunction(proxy, args, f.results, pres, posts, f.terminationMeasures, None)(spec.info)
+ val m = in.PureFunction(proxy, args, f.results, pres, posts, f.terminationMeasures, annotations, None, f.isOpaque)(spec.info)
ctx.defaultEncoding.pureFunction(m)(ctx)
case lit: in.PureFunctionLit =>
val body = if (spec.params.isEmpty) lit.body else None
val posts = lit.posts ++ (if (spec.params.isEmpty) Vector.empty else assertionFromPureFunctionBody(lit.body, lit.results.head).toVector)
- val func = in.PureFunction(proxy, args, lit.results, pres, posts, lit.terminationMeasures, body)(lit.info)
+ val func = in.PureFunction(proxy, args, lit.results, pres, posts, lit.terminationMeasures, annotations, body, false)(lit.info)
ctx.defaultEncoding.pureFunction(func)(ctx)
}
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
index 1421fdcc7..377b54000 100644
--- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
@@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.==>
import viper.gobra.ast.{internal => in}
import viper.gobra.ast.internal.theory.Comparability
import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage}
-import viper.gobra.reporting.{DefaultErrorBackTranslator, LoopInvariantNotWellFormedError, MethodContractNotWellFormedError, NoPermissionToRangeExpressionError, Source}
+import viper.gobra.reporting.{AssignmentError, DefaultErrorBackTranslator, LoopInvariantNotWellFormedError, MethodContractNotWellFormedError, NoPermissionToRangeExpressionError, Source}
import viper.gobra.theory.Addressability.{Exclusive, Shared}
import viper.gobra.translator.library.Generator
import viper.gobra.translator.context.Context
@@ -175,7 +175,7 @@ trait TypeEncoding extends Generator {
for {
footprint <- addressFootprint(ctx)(loc, in.FullPerm(loc.info))
eq <- ctx.equal(loc, rhs)(src)
- _ <- write(vpr.Exhale(footprint)(pos, info, errT))
+ _ <- exhaleWithDefaultReason(footprint, AssignmentError)
inhale = vpr.Inhale(vpr.And(footprint, eq)(pos, info, errT))(pos, info, errT)
} yield inhale
)
diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala
index ce944bb7c..ea60fd8c0 100644
--- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala
@@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.==>
import viper.gobra.ast.{internal => in}
import viper.gobra.translator.encodings.combinators.Encoding
import viper.gobra.translator.context.Context
-import viper.gobra.translator.util.{ViperUtil => vu}
+import viper.gobra.translator.util.{VprInfo, ViperUtil => vu}
import viper.silver.ast.Method
import viper.silver.{ast => vpr}
@@ -49,6 +49,8 @@ class DefaultMethodEncoding extends Encoding {
} yield vu.seqn(Vector(init, core))(pos, info, errT)
}})
+ annotatedInfo = VprInfo.attachAnnotations(x.backendAnnotations, info)
+
method = vpr.Method(
name = x.name.uniqueName,
formalArgs = vRecv +: vArgs,
@@ -56,7 +58,7 @@ class DefaultMethodEncoding extends Encoding {
pres = pres ++ measures,
posts = posts,
body = body
- )(pos, info, errT)
+ )(pos, annotatedInfo, errT)
} yield method
}
@@ -86,6 +88,8 @@ class DefaultMethodEncoding extends Encoding {
} yield vu.seqn(Vector(init, core))(pos, info, errT)
}})
+ annotatedInfo = VprInfo.attachAnnotations(x.backendAnnotations, info)
+
method = vpr.Method(
name = x.name.name,
formalArgs = vArgs,
@@ -93,7 +97,7 @@ class DefaultMethodEncoding extends Encoding {
pres = pres ++ measures,
posts = posts,
body = body
- )(pos, info, errT)
+ )(pos, annotatedInfo, errT)
} yield method
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala
index 5f97f2807..55352d75c 100644
--- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala
@@ -10,6 +10,7 @@ import org.bitbucket.inkytonik.kiama.==>
import viper.gobra.ast.{internal => in}
import viper.gobra.translator.encodings.combinators.Encoding
import viper.gobra.translator.context.Context
+import viper.gobra.translator.util.VprInfo
import viper.silver.{ast => vpr}
class DefaultPureMethodEncoding extends Encoding {
@@ -26,6 +27,7 @@ class DefaultPureMethodEncoding extends Encoding {
require(meth.results.size == 1)
val (pos, info, errT) = meth.vprMeta
+ val infoWithOpaque = VprInfo.maybeAttachOpaque(info, meth.isOpaque)
val vRecv = ctx.variable(meth.receiver)
val vRecvPres = ctx.varPrecondition(meth.receiver).toVector
@@ -55,6 +57,8 @@ class DefaultPureMethodEncoding extends Encoding {
)(ctx)
})
+ annotatedInfo = VprInfo.attachAnnotations(meth.backendAnnotations, infoWithOpaque)
+
function = vpr.Function(
name = meth.name.uniqueName,
formalArgs = vRecv +: vArgs,
@@ -62,7 +66,7 @@ class DefaultPureMethodEncoding extends Encoding {
pres = pres ++ measures,
posts = posts,
body = body
- )(pos, info, errT)
+ )(pos, annotatedInfo, errT)
} yield function
}
@@ -71,6 +75,7 @@ class DefaultPureMethodEncoding extends Encoding {
require(func.results.size == 1)
val (pos, info, errT) = func.vprMeta
+ val infoWithOpaque = VprInfo.maybeAttachOpaque(info, func.isOpaque)
val vArgs = func.args.map(ctx.variable)
val vArgPres = func.args.flatMap(ctx.varPrecondition)
@@ -97,6 +102,8 @@ class DefaultPureMethodEncoding extends Encoding {
)(ctx)
})
+ annotatedInfo = VprInfo.attachAnnotations(func.backendAnnotations, infoWithOpaque)
+
function = vpr.Function(
name = func.name.name,
formalArgs = vArgs,
@@ -104,7 +111,7 @@ class DefaultPureMethodEncoding extends Encoding {
pres = pres ++ measures,
posts = posts,
body = body
- )(pos, info, errT)
+ )(pos, annotatedInfo, errT)
} yield function
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala
index 1f70d737f..03d74b055 100644
--- a/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala
@@ -742,7 +742,7 @@ class InterfaceEncoding extends LeafTypeEncoding {
val itfSymb = ctx.lookup(p.superProxy).asInstanceOf[in.PureMethod]
val vItfFun = ctx.defaultEncoding.pureMethod(itfSymb)(ctx).res
- val body = p.body.getOrElse(in.PureMethodCall(p.receiver, p.subProxy, p.args, p.results.head.typ)(p.info))
+ val body = p.body.getOrElse(in.PureMethodCall(p.receiver, p.subProxy, p.args, p.results.head.typ, false)(p.info))
val pureMethodDummy = ctx.defaultEncoding.pureMethod(in.PureMethod(
receiver = p.receiver,
@@ -752,7 +752,9 @@ class InterfaceEncoding extends LeafTypeEncoding {
pres = Vector.empty,
posts = Vector.empty,
terminationMeasures = Vector.empty,
- body = Some(body)
+ backendAnnotations = Vector.empty,
+ body = Some(body),
+ isOpaque = false
)(p.info))(ctx)
val pres = vItfFun.pres.map { pre =>
@@ -796,6 +798,7 @@ class InterfaceEncoding extends LeafTypeEncoding {
pres = Vector.empty,
posts = Vector.empty,
terminationMeasures = Vector.empty,
+ backendAnnotations = Vector.empty,
body = Some(body)
)(p.info))(ctx)
diff --git a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala
index cba1ace53..cd81a08c0 100644
--- a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala
@@ -17,6 +17,7 @@ import viper.gobra.translator.util.FunctionGenerator
import viper.gobra.translator.util.ViperUtil.synthesized
import viper.gobra.translator.util.ViperWriter.CodeWriter
import viper.gobra.util.Violation
+import viper.silver.plugin.standard.termination
import viper.silver.{ast => vpr}
class SequenceEncoding extends LeafTypeEncoding {
@@ -225,6 +226,7 @@ class SequenceEncoding extends LeafTypeEncoding {
* requires 0 <= n
* ensures |result| == n
* ensures forall i : Int :: { result[i] } 0 <= i < n ==> result[i] == dfltVal(`T`)
+ * decreases _
* }}}
*/
private val emptySeqFunc: FunctionGenerator[in.Type] = new FunctionGenerator[in.Type] {
@@ -245,6 +247,7 @@ class SequenceEncoding extends LeafTypeEncoding {
// preconditions
val pre1 = synthesized(vpr.LeCmp(vpr.IntLit(0)(), nDecl.localVar))("Sequence length might be negative")
+ val pre2 = synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate")
// postconditions
val post1 = vpr.EqCmp(vResultLength, nDecl.localVar)()
@@ -262,7 +265,7 @@ class SequenceEncoding extends LeafTypeEncoding {
name = s"${Names.emptySequenceFunc}_${Names.serializeType(t)}",
formalArgs = Vector(nDecl),
typ = vResultType,
- pres = Vector(pre1),
+ pres = Vector(pre1, pre2),
posts = Vector(post1, post2),
body = None
)()
diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala
index df86ccff2..71aab6317 100644
--- a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala
@@ -216,7 +216,7 @@ class BuiltInEncoding extends Encoding {
val pres: Vector[in.Assertion] = Vector(
in.Access(isChannelInst, in.WildcardPerm(src))(src),
)
- in.PureMethod(recvParam, x.name, Vector(), Vector(kParam), pres, Vector(), Vector(), None)(src)
+ in.PureMethod(recvParam, x.name, Vector.empty, Vector(kParam), pres, Vector.empty, Vector.empty, Vector.empty, None, false)(src)
case (tag: ChannelInvariantMethodTag, recv: in.ChannelT) =>
/**
@@ -242,7 +242,7 @@ class BuiltInEncoding extends Encoding {
val pres: Vector[in.Assertion] = Vector(
in.Access(chanPredicate, in.WildcardPerm(src))(src)
)
- in.PureMethod(recvParam, x.name, Vector(), Vector(resParam), pres, Vector(), Vector(), None)(src)
+ in.PureMethod(recvParam, x.name, Vector.empty, Vector(resParam), pres, Vector.empty, Vector.empty, Vector.empty, None, false)(src)
case (InitChannelMethodTag, recv: in.ChannelT) =>
/**
@@ -297,7 +297,7 @@ class BuiltInEncoding extends Encoding {
in.ExprAssertion(sendChannelInvEq)(src),
in.ExprAssertion(recvChannelInvEq)(src),
)
- in.Method(recvParam, x.name, Vector(aParam, bParam), Vector(), pres, posts, Vector(in.WildcardMeasure(None)(src)), None)(src)
+ in.Method(recvParam, x.name, Vector(aParam, bParam), Vector.empty, pres, posts, Vector(in.WildcardMeasure(None)(src)), Vector.empty, None)(src)
case (CreateDebtChannelMethodTag, recv: in.ChannelT) =>
/**
@@ -327,7 +327,7 @@ class BuiltInEncoding extends Encoding {
in.Access(closureDebtInst, in.FullPerm(src))(src),
in.Access(tokenInst, in.FullPerm(src))(src),
)
- in.Method(recvParam, x.name, Vector(dividendParam, divisorParam /* permissionAmountParam */, predicateParam), Vector(), pres, posts, Vector(), None)(src)
+ in.Method(recvParam, x.name, Vector(dividendParam, divisorParam /* permissionAmountParam */, predicateParam), Vector.empty, pres, posts, Vector.empty, Vector.empty, None)(src)
case (RedeemChannelMethodTag, recv: in.ChannelT) =>
/**
@@ -350,7 +350,7 @@ class BuiltInEncoding extends Encoding {
in.Access(closedInst, in.FullPerm(src))(src),
in.Access(in.Accessible.PredExpr(in.PredExprInstance(predicateParam, Vector())(src)), in.FullPerm(src))(src)
)
- in.Method(recvParam, x.name, Vector(predicateParam), Vector(), pres, posts, Vector(), None)(src)
+ in.Method(recvParam, x.name, Vector(predicateParam), Vector.empty, pres, posts, Vector.empty, Vector.empty, None)(src)
case (tag, recv) => violation(s"no method generation defined for tag $tag and receiver $recv")
}
@@ -424,7 +424,7 @@ class BuiltInEncoding extends Encoding {
in.Access(closedInst, in.FullPerm(src))(src)
)
- in.Function(x.name, args, Vector(), pres, posts, Vector(), None)(src)
+ in.Function(x.name, args, Vector.empty, pres, posts, Vector.empty, Vector.empty, None)(src)
/* João, 18/08/2021:
* The spec for `append` currently does not allow the first and second non-ghost arguments to be the same. The go
@@ -502,7 +502,7 @@ class BuiltInEncoding extends Encoding {
)
val posts: Vector[in.Assertion] = Vector(postLen, postRes, postVariadic, postCmpSlice, postCmpVariadic)
- in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), None)(src)
+ in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), Vector.empty, None)(src)
case (CopyFunctionTag, Vector(t1, t2, _)) =>
/**
@@ -606,7 +606,7 @@ class BuiltInEncoding extends Encoding {
val posts = Vector(postRes1, postRes2, postDst, postSrc, postUpdate, postSame)
- in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), None)(src)
+ in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), Vector.empty, None)(src)
case (tag, args) => violation(s"no function generation defined for tag $tag and arguments $args")
}
@@ -680,6 +680,6 @@ class BuiltInEncoding extends Encoding {
*/
private def builtInPureMethodCall(tag: BuiltInMethodTag, recv: in.Expr, args: Vector[in.Expr], retType: in.Type)(src: Source.Parser.Info)(ctx: Context): in.PureMethodCall = {
val method = getOrGenerateMethod(tag, recv.typ, args.map(_.typ))(src)(ctx)
- in.PureMethodCall(recv, method, args, retType)(src)
+ in.PureMethodCall(recv, method, args, retType, false)(src)
}
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala
index b7209627b..5cd633fd4 100644
--- a/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala
@@ -13,6 +13,7 @@ import viper.gobra.translator.encodings.combinators.Encoding
import viper.gobra.translator.context.Context
import viper.gobra.translator.util.ViperWriter.CodeWriter
import viper.gobra.translator.util.{ViperUtil => vu}
+import viper.gobra.translator.util.VprInfo
import viper.gobra.util.Violation
import viper.silver.{ast => vpr}
@@ -21,23 +22,27 @@ class CallEncoding extends Encoding {
import viper.gobra.translator.util.ViperWriter.CodeLevel._
override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = {
- case x@in.PureFunctionCall(func, args, typ) =>
+ case x@in.PureFunctionCall(func, args, typ, reveal) =>
val (pos, info, errT) = x.vprMeta
+ val annotatedInfo = VprInfo.maybeAttachReveal(info, reveal)
+
val resultType = ctx.typ(typ)
for {
vArgs <- sequence(args map ctx.expression)
- app = vpr.FuncApp(func.name, vArgs)(pos, info, resultType, errT)
+ app = vpr.FuncApp(func.name, vArgs)(pos, annotatedInfo, resultType, errT)
} yield app
- case x@in.PureMethodCall(recv, meth, args, typ) =>
+ case x@in.PureMethodCall(recv, meth, args, typ, reveal) =>
val (pos, info, errT) = x.vprMeta
+ val annotatedInfo = VprInfo.maybeAttachReveal(info, reveal)
+
val resultType = ctx.typ(typ)
for {
vRecv <- ctx.expression(recv)
vArgs <- sequence(args map ctx.expression)
- app = vpr.FuncApp(meth.uniqueName, vRecv +: vArgs)(pos, info, resultType, errT)
+ app = vpr.FuncApp(meth.uniqueName, vRecv +: vArgs)(pos, annotatedInfo, resultType, errT)
} yield app
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala
index 296a426b3..fcef140fb 100644
--- a/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala
@@ -33,8 +33,9 @@ class OutlineEncoding extends Encoding {
pres <- ml.sequence(n.pres map (p => ctx.precondition(p)))
posts <- ml.sequence(n.posts map (p => ctx.postcondition(p)))
measures <- ml.sequence(n.terminationMeasures map (m => ml.pure(ctx.assertion(m))(ctx)))
+ annotations = n.backendAnnotations
body <- ml.block(ctx.statement(n.body))
- } yield outlines.outline(n.name, pres ++ measures, posts, body, n.trusted)(pos, info, errT)
+ } yield outlines.outline(n.name, pres ++ measures, posts, annotations, body, n.trusted)(pos, info, errT)
)
}
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala
index 9254170b7..7c95a1442 100644
--- a/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala
@@ -44,6 +44,6 @@ class TerminationEncoding extends Encoding {
for {
v <- ctx.assertion(in.Access(in.Accessible.Predicate(x), in.FullPerm(x.info))(x.info))
pap = v.asInstanceOf[vpr.PredicateAccessPredicate]
- } yield predicateinstance.PredicateInstance(pap.loc.args, pap.loc.predicateName)(pos, info, errT)
+ } yield predicateinstance.PredicateInstance(pap.loc.predicateName, pap.loc.args)(pos, info, errT)
}
}
diff --git a/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala b/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala
index 9eafe6a15..74d9597e8 100644
--- a/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala
+++ b/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala
@@ -7,6 +7,7 @@
package viper.gobra.translator.library.outlines
import viper.gobra.translator.library.Generator
+import viper.gobra.util.BackendAnnotation
import viper.silver.{ast => vpr}
trait Outlines extends Generator {
@@ -19,6 +20,7 @@ trait Outlines extends Generator {
name: String,
pres: Vector[vpr.Exp],
posts: Vector[vpr.Exp],
+ annotations: Vector[BackendAnnotation],
body: vpr.Stmt,
trusted: Boolean,
)(pos : vpr.Position = vpr.NoPosition, info : vpr.Info = vpr.NoInfo, errT : vpr.ErrorTrafo = vpr.NoTrafos) : vpr.Stmt
@@ -32,6 +34,7 @@ trait Outlines extends Generator {
name: String,
pres: Vector[vpr.Exp],
posts: Vector[vpr.Exp],
+ annotations: Vector[BackendAnnotation],
arguments: Vector[vpr.LocalVar],
modifies: Vector[vpr.LocalVar],
)(pos : vpr.Position = vpr.NoPosition, info : vpr.Info = vpr.NoInfo, errT : vpr.ErrorTrafo = vpr.NoTrafos) : vpr.Stmt
diff --git a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala
index d19f1117a..2357f6966 100644
--- a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala
+++ b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala
@@ -6,7 +6,8 @@
package viper.gobra.translator.library.outlines
-import viper.gobra.translator.util.ViperUtil
+import viper.gobra.translator.util.{ViperUtil, VprInfo}
+import viper.gobra.util.BackendAnnotation
import viper.silver.{ast => vpr}
class OutlinesImpl extends Outlines {
@@ -56,6 +57,7 @@ class OutlinesImpl extends Outlines {
name: String,
pres: Vector[vpr.Exp],
posts: Vector[vpr.Exp],
+ annotations: Vector[BackendAnnotation],
body: vpr.Stmt,
trusted: Boolean,
)(pos : vpr.Position, info : vpr.Info, errT : vpr.ErrorTrafo) : vpr.Stmt = {
@@ -94,6 +96,8 @@ class OutlinesImpl extends Outlines {
replacedArguments
}
+ val annotatedInfo = VprInfo.attachAnnotations(annotations, info)
+
vpr.Method(
name = name,
formalArgs = formals map ViperUtil.toVarDecl,
@@ -101,7 +105,7 @@ class OutlinesImpl extends Outlines {
pres = actualPres,
posts = actualPosts,
body = actualBody,
- )(pos, info, errT)
+ )(pos, annotatedInfo, errT)
}
vpr.MethodCall(methodName = name, args = arguments, targets = results)(pos, info, errT)
@@ -116,6 +120,7 @@ class OutlinesImpl extends Outlines {
name: String,
pres: Vector[vpr.Exp],
posts: Vector[vpr.Exp],
+ annotations: Vector[BackendAnnotation],
arguments: Vector[vpr.LocalVar],
modifies: Vector[vpr.LocalVar],
)(pos : vpr.Position, info : vpr.Info, errT : vpr.ErrorTrafo) : vpr.Stmt = {
@@ -128,6 +133,8 @@ class OutlinesImpl extends Outlines {
case lold: vpr.LabelledOld => vpr.Old(lold.exp)(lold.pos, lold.info, lold.errT)
})
+ val annotatedInfo = VprInfo.attachAnnotations(annotations, info)
+
vpr.Method(
name = name,
formalArgs = arguments map ViperUtil.toVarDecl,
@@ -135,7 +142,7 @@ class OutlinesImpl extends Outlines {
pres = pres,
posts = actualPosts,
body = None,
- )(pos, info, errT)
+ )(pos, annotatedInfo, errT)
}
vpr.MethodCall(methodName = name, args = arguments, targets = results)(pos, info, errT)
diff --git a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
index c140dd988..3c57baefc 100644
--- a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
+++ b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
@@ -8,6 +8,7 @@ package viper.gobra.translator.transformers
import java.nio.file.Path
import viper.gobra.backend.BackendVerifier
import viper.silicon.Silicon
+import viper.silver.ast.utility.FileLoader
import viper.silver.{ast => vpr}
import viper.silver.frontend.{DefaultStates, ViperAstProvider}
import viper.silver.plugin.SilverPlugin
@@ -134,8 +135,8 @@ class TerminationTransformer extends ViperTransformer {
resetMessages()
}
- override def execute(args: Seq[String] = Seq()): Unit = {
- super.execute(args ++ Seq("--ignoreFile", Silicon.dummyInputFilename))
+ override def execute(args: Seq[String] = Seq(), loader: Option[FileLoader] = None): Unit = {
+ super.execute(args ++ Seq("--ignoreFile", Silicon.dummyInputFilename), loader)
}
}
}
diff --git a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala
index 21ee86494..c5387b74b 100644
--- a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala
+++ b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala
@@ -408,6 +408,16 @@ object ViperWriter {
}
}
+ /* Can be used in expressions. */
+ def funcAppPrecondition(call: vpr.FuncApp, reasonT: (Source.Verifier.Info, ErrorReason) => VerificationError): Writer[vpr.Exp] = {
+ for {
+ _ <- errorT({
+ case e@vprerr.PreconditionInAppFalse(Source(info), reason, _) if e causedBy call =>
+ reasonT(info, reason)
+ })
+ } yield call
+ }
+
/* Emits Viper statements. */
def assert(cond: vpr.Exp, reasonT: (Source.Verifier.Info, ErrorReason) => VerificationError): Writer[Unit] = {
val res = vpr.Assert(cond)(cond.pos, cond.info, cond.errT)
diff --git a/src/main/scala/viper/gobra/translator/util/VprInfo.scala b/src/main/scala/viper/gobra/translator/util/VprInfo.scala
new file mode 100644
index 000000000..ab39b2594
--- /dev/null
+++ b/src/main/scala/viper/gobra/translator/util/VprInfo.scala
@@ -0,0 +1,47 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+// Copyright (c) 2011-2023 ETH Zurich.
+
+package viper.gobra.translator.util
+import viper.gobra.util.BackendAnnotation
+import viper.silver.{ast => vpr}
+
+object VprInfo {
+ def maybeAttachOpaque(info: vpr.Info, isOpaque: Boolean): vpr.Info = {
+ if (isOpaque) {
+ attachBackendAnnotation(info, "opaque")
+ } else {
+ info
+ }
+ }
+
+ def maybeAttachReveal(info: vpr.Info, reveal: Boolean): vpr.Info = {
+ if (reveal) {
+ attachBackendAnnotation(info, "reveal")
+ } else {
+ info
+ }
+ }
+
+ private def attachBackendAnnotation(info: vpr.Info, key: String, values: String*) : vpr.Info = {
+ val annotation = vpr.AnnotationInfo(Map(key -> values))
+ vpr.ConsInfo(annotation, info)
+ }
+
+ private def backendAnnotationToInfo(a: BackendAnnotation): vpr.AnnotationInfo = {
+ vpr.AnnotationInfo(Map(a.key -> a.values))
+ }
+
+ private def attachBackendAnnotation(a: BackendAnnotation, info: vpr.Info): vpr.Info = {
+ val modeAnnotation = backendAnnotationToInfo(a)
+ vpr.ConsInfo(modeAnnotation, info)
+ }
+
+ def attachAnnotations(as: Vector[BackendAnnotation], info: vpr.Info): vpr.Info =
+ as match {
+ case Vector() => info
+ case _ => attachAnnotations(as.tail, attachBackendAnnotation(as.head, info))
+ }
+}
diff --git a/src/main/scala/viper/gobra/util/BackendAnnotation.scala b/src/main/scala/viper/gobra/util/BackendAnnotation.scala
new file mode 100644
index 000000000..8e82348b0
--- /dev/null
+++ b/src/main/scala/viper/gobra/util/BackendAnnotation.scala
@@ -0,0 +1,9 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+// Copyright (c) 2011-2020 ETH Zurich.
+
+package viper.gobra.util
+
+case class BackendAnnotation(key: String, values: Vector[String])
diff --git a/src/main/scala/viper/gobra/util/ChopperUtil.scala b/src/main/scala/viper/gobra/util/ChopperUtil.scala
index 0489716ac..0a76b24eb 100644
--- a/src/main/scala/viper/gobra/util/ChopperUtil.scala
+++ b/src/main/scala/viper/gobra/util/ChopperUtil.scala
@@ -12,7 +12,7 @@ import java.nio.file.Files
import java.util.Properties
import viper.silver.{ast => vpr}
import viper.silver.ast.SourcePosition
-import viper.silver.ast.utility.Chopper
+import viper.silver.ast.utility.chopper
import viper.gobra.frontend.{Config, PackageInfo}
import viper.gobra.reporting.ChoppedViperMessage
import viper.gobra.backend.BackendVerifier.Task
@@ -25,7 +25,7 @@ object ChopperUtil {
def computeChoppedPrograms(task: Task, pkgInfo: PackageInfo)(config: Config): Vector[vpr.Program] = {
- val programs = Chopper.chop(task.program)(
+ val programs = chopper.Chopper.chop(task.program)(
selection = computeIsolateMap(config, pkgInfo),
bound = Some(config.choppingUpperBound),
penalty = getPenalty
@@ -71,9 +71,9 @@ object ChopperUtil {
* then a penalty object using this configuration is created and returned.
* Otherwise, if no configuration is present, the default configuration is returned.
* */
- def getPenalty: Chopper.Penalty[Chopper.Vertex] = {
+ def getPenalty: chopper.Penalty[chopper.Vertices.Vertex] = {
import scala.io.Source
- import viper.silver.ast.utility.Chopper.Penalty
+ import viper.silver.ast.utility.chopper.Penalty
val file = new File(GobraChopperFileLocation)
if (!file.exists()) {
@@ -90,7 +90,8 @@ object ChopperUtil {
val penaltyConf = Penalty.PenaltyConfig(
method = get("method_body", dfltConf.method),
methodSpec = get("method_spec", dfltConf.methodSpec),
- function = get("function", dfltConf.function),
+ function = get("function_body", dfltConf.function),
+ functionSig = get("function_spec", dfltConf.function),
predicate = get("predicate_body", dfltConf.predicate),
predicateSig = get("predicate_spec", dfltConf.predicateSig),
field = get("field", dfltConf.field),
diff --git a/src/test/resources/regressions/examples/disableNL.gobra b/src/test/resources/regressions/examples/disableNL.gobra
new file mode 100644
index 000000000..53e144e85
--- /dev/null
+++ b/src/test/resources/regressions/examples/disableNL.gobra
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+// ##(--disableNL)
+package pkg
+
+requires 0 <= x && x <= 10
+requires 0 <= y && y <= 10
+//:: ExpectedOutput(postcondition_error:assertion_error)
+ensures 0 <= res && res <= 100
+func f(x, y int) (res int) {
+ return x * y
+}
diff --git a/src/test/resources/regressions/examples/disableNL_success.gobra b/src/test/resources/regressions/examples/disableNL_success.gobra
new file mode 100644
index 000000000..f2ca41718
--- /dev/null
+++ b/src/test/resources/regressions/examples/disableNL_success.gobra
@@ -0,0 +1,11 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+requires 0 <= x && x <= 10
+requires 0 <= y && y <= 10
+ensures 0 <= res && res <= 100
+func f(x, y int) (res int) {
+ return x * y
+}
diff --git a/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra b/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra
index 2c016db97..f2dd40403 100644
--- a/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra
+++ b/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra
@@ -5,11 +5,13 @@ package tutorial
requires 0 <= n // precondition
ensures sum == n * (n+1)/2 // postcondition
+decreases
func sum(n int) (sum int) {
sum := 0
invariant 0 <= i && i <= n + 1
invariant sum == i * (i-1)/2
+ decreases n - i
for i := 0; i <= n; i++ {
sum += i
}
@@ -17,12 +19,14 @@ func sum(n int) (sum int) {
}
ensures res == (n % 2 == 0)
+decreases
pure func isEven(n int) (res bool) {
return n % 2 == 0
}
ensures isEven(n) ==> res == n / 2
ensures !isEven(n) ==> res == n / 2 + 1
+decreases
func halfRoundedUp(n int) (res int) {
if isEven(n) {
res = n / 2
diff --git a/src/test/resources/regressions/features/backendAnnotations/mce-success1.gobra b/src/test/resources/regressions/features/backendAnnotations/mce-success1.gobra
new file mode 100644
index 000000000..ac254da1a
--- /dev/null
+++ b/src/test/resources/regressions/features/backendAnnotations/mce-success1.gobra
@@ -0,0 +1,68 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+// Example in functions with disjunctive aliasing
+requires acc(x) && acc(y)
+requires x == z || y == z
+//:: ExpectedOutput(postcondition_error:permission_error)
+ensures acc(z)
+#backend[exhaleMode(0)]
+func f_greedy(x, y, z *int) { }
+
+requires acc(x) && acc(y)
+requires x == z || y == z
+ensures acc(z)
+#backend[exhaleMode(1)]
+func f_mce(x, y, z *int) { }
+
+// Example in outline blocks
+requires acc(x) && acc(y)
+requires x == z || y == z
+ensures acc(z)
+#backend[exhaleMode(0)]
+func g1(x, y, z *int) {
+ requires acc(x) && acc(y)
+ requires x == z || y == z
+ ensures acc(z)
+ #backend[exhaleMode(1)]
+ outline(
+ assert true
+ )
+}
+
+requires acc(x) && acc(y)
+requires x == z || y == z
+ensures acc(z)
+#backend[exhaleMode(1), moreJoins()]
+func g2(x, y, z *int) {
+ requires acc(x) && acc(y)
+ requires x == z || y == z
+ //:: ExpectedOutput(postcondition_error:permission_error)
+ ensures acc(z)
+ #backend[exhaleMode(0)]
+ outline(
+ assert true
+ )
+}
+
+// closures
+func m1(x, y, z *int) {
+ foo :=
+ requires acc(x) && acc(y)
+ requires x == z || y == z
+ //:: ExpectedOutput(postcondition_error:permission_error)
+ ensures acc(z)
+ #backend[exhaleMode(0)]
+ func bar(x, y, z *int) { }
+}
+
+func m2(x, y, z *int) {
+ foo :=
+ requires acc(x) && acc(y)
+ requires x == z || y == z
+ ensures acc(z)
+ #backend[exhaleMode(1), bogusAnnotation(1, 2, 3, 4)]
+ func bar(x, y, z *int) { }
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/maps/maps-nested.gobra b/src/test/resources/regressions/features/maps/maps-nested.gobra
new file mode 100644
index 000000000..9d0072258
--- /dev/null
+++ b/src/test/resources/regressions/features/maps/maps-nested.gobra
@@ -0,0 +1,11 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+ghost
+func foo(){
+ mm := dict[int](dict[int]int){1 : {2:3}}
+ assert mm[1][2] == 3
+ assert 2 in domain(mm[1])
+}
diff --git a/src/test/resources/regressions/features/opaque/opaque-closure-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-closure-fail1.gobra
new file mode 100644
index 000000000..86f1f5272
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-closure-fail1.gobra
@@ -0,0 +1,17 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+func main() {
+ x@ := 0
+ // Closure cannot be made opaque
+ //:: ExpectedOutput(type_error)
+ c := preserves acc(&x)
+ ensures x == old(x) + n && m == x
+ opaque
+ pure func f(n int) (m int) {
+ x += n;
+ return x
+ }
+}
diff --git a/src/test/resources/regressions/features/opaque/opaque-fac1.gobra b/src/test/resources/regressions/features/opaque/opaque-fac1.gobra
new file mode 100644
index 000000000..fd18aa19a
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-fac1.gobra
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+// This file does not exercise opaque. Rather, it serves as a base case
+// compared to the files opaque-fac2.gobra and opaque-fac3.gobra.
+
+package pkg
+
+ghost
+decreases i
+pure func fac(i int) int {
+ return i <= 1 ? 1 : i * fac(i - 1)
+}
+
+ghost
+decreases
+func example1 (i int) int {
+ tmp := fac(3)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 6
+}
+
+ghost
+decreases
+func example2 (i int) int {
+ tmp := fac(3)
+ assert tmp == 3 * fac(2)
+ assert tmp == 3 * 2 * fac(1)
+ assert tmp == 6
+}
diff --git a/src/test/resources/regressions/features/opaque/opaque-fac2.gobra b/src/test/resources/regressions/features/opaque/opaque-fac2.gobra
new file mode 100644
index 000000000..2dd755485
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-fac2.gobra
@@ -0,0 +1,45 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+ghost
+decreases i
+opaque
+pure func fac(i int) int {
+ return i <= 1 ? 1 : i * fac(i - 1)
+}
+
+ghost
+decreases
+func example1 (i int) int {
+ tmp := fac(3)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 6
+}
+
+ghost
+decreases
+func example2 (i int) int {
+ tmp := fac(3)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 3 * fac(2)
+}
+
+ghost
+decreases
+func example3 (i int) int {
+ tmp := reveal fac(3)
+ assert tmp == 3 * reveal fac(2)
+ assert tmp == 3 * 2 * reveal fac(1)
+ assert tmp == 6
+}
+
+ghost
+decreases
+func example4 (i int) int {
+ tmp := reveal fac(3)
+ assert tmp == 3 * fac(2)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 3 * 2 * reveal fac(1)
+}
diff --git a/src/test/resources/regressions/features/opaque/opaque-fac3.gobra b/src/test/resources/regressions/features/opaque/opaque-fac3.gobra
new file mode 100644
index 000000000..68447ed0f
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-fac3.gobra
@@ -0,0 +1,54 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+ghost
+decreases i
+opaque
+pure func fac(i int) int {
+ return i <= 1 ? 1 : i * (reveal fac(i - 1))
+}
+
+ghost
+decreases
+func example1 (i int) int {
+ tmp := fac(3)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 6
+}
+
+ghost
+decreases
+func example2 (i int) int {
+ tmp := fac(3)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 3 * fac(2)
+}
+
+ghost
+decreases
+func example3 (i int) int {
+ tmp := reveal fac(3)
+ assert tmp == 3 * reveal fac(2)
+ assert tmp == 3 * 2 * reveal fac(1)
+ assert tmp == 6
+}
+
+ghost
+decreases
+func example4 (i int) int {
+ tmp := reveal fac(3)
+ assert tmp == 3 * fac(2)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 3 * 2 * reveal fac(1)
+}
+
+ghost
+decreases
+func example5 (i int) int {
+ tmp := reveal fac(3)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert tmp == 6
+}
+
diff --git a/src/test/resources/regressions/features/opaque/opaque-function-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-function-fail1.gobra
new file mode 100644
index 000000000..10e05ece8
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-function-fail1.gobra
@@ -0,0 +1,11 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+// Cannot make non-pure function opaque
+//:: ExpectedOutput(type_error)
+opaque
+func A() int {
+ return 42
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/opaque/opaque-interface-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-interface-fail1.gobra
new file mode 100644
index 000000000..edd5fbcdf
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-interface-fail1.gobra
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+// This does not parse:
+// type foo interface {
+// opaque pure bar() (res int)
+// }
+
+// Interface method signatures cannot be opaque.
+type foo interface {
+ //:: ExpectedOutput(type_error)
+ opaque
+ pure bar() (res int)
+}
+
+type test int
+
+test implements foo
+
+ensures res == 5
+decreases
+pure func (x test) bar() (res int)
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/opaque/opaque-method-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-method-fail1.gobra
new file mode 100644
index 000000000..fa035ccac
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-method-fail1.gobra
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg;
+
+type IntType int
+
+// Cannot make non-pure method opaque
+//:: ExpectedOutput(type_error)
+opaque
+func (x IntType) negateCorrectSpec() (ret IntType) {
+ return -x
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/opaque/opaque-outline-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-outline-fail1.gobra
new file mode 100644
index 000000000..c70af8c0c
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-outline-fail1.gobra
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+func test1() {
+ // Cannot make outline opaque
+ //:: ExpectedOutput(type_error)
+ opaque
+ outline (
+ x := 10
+ )
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/opaque/opaque-spec-simple1.gobra b/src/test/resources/regressions/features/opaque/opaque-spec-simple1.gobra
new file mode 100644
index 000000000..fa321e4fc
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/opaque-spec-simple1.gobra
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+ensures res == (x > 0)
+decreases
+opaque
+pure func foo(x int) (res bool)
+
+func bar() {
+ t := reveal foo(3)
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/opaque/reveal-conversion-fail1.gobra b/src/test/resources/regressions/features/opaque/reveal-conversion-fail1.gobra
new file mode 100644
index 000000000..37d8a769c
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/reveal-conversion-fail1.gobra
@@ -0,0 +1,10 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+func foo(i int) {
+ // Cannot reveal conversions
+ //:: ExpectedOutput(type_error)
+ f := reveal float64(i)
+}
diff --git a/src/test/resources/regressions/features/opaque/reveal-fail1.gobra b/src/test/resources/regressions/features/opaque/reveal-fail1.gobra
new file mode 100644
index 000000000..55930330a
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/reveal-fail1.gobra
@@ -0,0 +1,15 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+decreases
+pure func A() int {
+ return 42
+}
+
+func B() {
+ // Cannot reveal non-opaque function
+ //:: ExpectedOutput(type_error)
+ a := reveal A()
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/opaque/reveal-fail2.gobra b/src/test/resources/regressions/features/opaque/reveal-fail2.gobra
new file mode 100644
index 000000000..09cd2078c
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/reveal-fail2.gobra
@@ -0,0 +1,17 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg;
+
+type IntType int
+
+decreases
+pure func (x IntType) negateCorrectSpec() (ret IntType) {
+ return -x
+}
+
+func test(x IntType) {
+ // Cannot reveal non-opaque method
+ //:: ExpectedOutput(type_error)
+ nx := reveal x.negateCorrectSpec()
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/opaque/reveal-predicate-fail1.gobra b/src/test/resources/regressions/features/opaque/reveal-predicate-fail1.gobra
new file mode 100644
index 000000000..d5112a3a8
--- /dev/null
+++ b/src/test/resources/regressions/features/opaque/reveal-predicate-fail1.gobra
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg;
+
+type coordinate struct{
+ x, y, val int;
+};
+
+pred cooMem(self *coordinate) {
+ acc(&self.x) && acc(&self.y) && acc(&self.val)
+};
+
+
+requires cooMem(self);
+decreases
+pure func (self *coordinate) value() int {
+ return unfolding cooMem(self) in self.val;
+};
+
+func test1() {
+ coo := &coordinate{1,2,3};
+ fold cooMem(coo);
+ assert coo.value() == 3;
+ // Cannot reveal predicate
+ //:: ExpectedOutput(type_error)
+ unfold reveal cooMem(coo);
+};
diff --git a/src/test/resources/regressions/features/options/options-nested-maps.gobra b/src/test/resources/regressions/features/options/options-nested-maps.gobra
new file mode 100644
index 000000000..090ff5c17
--- /dev/null
+++ b/src/test/resources/regressions/features/options/options-nested-maps.gobra
@@ -0,0 +1,19 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+ghost
+pure func bar(m dict[int]int, idx int) option[int] {
+ return idx in domain(m) ? some(m[idx]) : none[int]
+}
+
+ghost
+pure func baz(m dict[int]int, idx int) option[int] {
+ return match idx in domain(m){
+ case true:
+ some(m[idx])
+ case false:
+ none[int]
+ }
+}
diff --git a/src/test/resources/regressions/features/sets/set-disable-axioms-fail1.gobra b/src/test/resources/regressions/features/sets/set-disable-axioms-fail1.gobra
new file mode 100644
index 000000000..a57276179
--- /dev/null
+++ b/src/test/resources/regressions/features/sets/set-disable-axioms-fail1.gobra
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+// ##(--disableSetAxiomatization)
+
+// From set-union-simple1.gobra, example 10
+func foo(ghost s set[int], ghost t set[int]) {
+ // fails: set axioms disabled (including commutativity)
+ //:: ExpectedOutput(assert_error:assertion_error)
+ assert s union t == t union s
+}
diff --git a/src/test/resources/regressions/issues/000511.gobra b/src/test/resources/regressions/issues/000511.gobra
new file mode 100644
index 000000000..fee6442c0
--- /dev/null
+++ b/src/test/resources/regressions/issues/000511.gobra
@@ -0,0 +1,46 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package issues
+
+preserves acc(x)
+ensures *x == old(*x) + 1
+ensures !res
+func incF(x *int) (res bool) {
+ *x += 1
+ return false
+}
+
+func clientAnd1() {
+ x@ := 1
+ if incF(&x) && incT(&x) {
+ assert false
+ }
+ assert x == 2
+}
+
+func clientAnd2() {
+ x@ := 1
+ if incT(&x) && incT(&x) {}
+ assert x == 3
+}
+
+preserves acc(x)
+ensures *x == old(*x) + 1
+ensures res
+func incT(x *int) (res bool) {
+ *x += 1
+ return true
+}
+
+func clientOr1() {
+ x@ := 1
+ if incT(&x) || incT(&x) {}
+ assert x == 2
+}
+
+func clientOr2() {
+ x@ := 1
+ if incF(&x) || incT(&x) {}
+ assert x == 3
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/issues/000695.gobra b/src/test/resources/regressions/issues/000695.gobra
new file mode 100644
index 000000000..f8832ac93
--- /dev/null
+++ b/src/test/resources/regressions/issues/000695.gobra
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package issue000695
+
+type ChannelMsgType int
+
+const ChannelMsg1 = 42
+const ChannelMsg2 ChannelMsgType = 43
+
+pred sendInvariant(v ChannelMsgType) {
+ true
+}
+
+requires acc(channel.SendChannel(), 1/2)
+requires channel.SendGivenPerm() == sendInvariant!<_!>
+requires channel.SendGotPerm() == PredTrue!
+func sendMsg1(channel chan ChannelMsgType) {
+ fold sendInvariant!<_!>(ChannelMsg1)
+ fold PredTrue!()
+ assert acc(channel.SendChannel(), _) && sendInvariant!<_!>(ChannelMsg1)
+ assert acc(channel.SendChannel(), _) && channel.SendGivenPerm()(ChannelMsg1)
+ channel <- ChannelMsg1
+}
+
+requires acc(channel.SendChannel(), 1/2)
+requires channel.SendGivenPerm() == sendInvariant!<_!>
+requires channel.SendGotPerm() == PredTrue!
+func sendMsg2(channel chan ChannelMsgType) {
+ fold sendInvariant!<_!>(ChannelMsg2)
+ fold PredTrue!()
+ assert acc(channel.SendChannel(), _) && sendInvariant!<_!>(ChannelMsg2)
+ assert acc(channel.SendChannel(), _) && channel.SendGivenPerm()(ChannelMsg2)
+ channel <- ChannelMsg2
+}
diff --git a/src/test/resources/regressions/issues/000697.gobra b/src/test/resources/regressions/issues/000697.gobra
new file mode 100644
index 000000000..51528815f
--- /dev/null
+++ b/src/test/resources/regressions/issues/000697.gobra
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package issue000697
+
+// ##(-I ./000697/)
+import pkg "pkg"
+
+type Impl struct{
+ x *int
+}
+
+pred (impl Impl) inv() {
+ acc(impl.x)
+}
+
+func main() {
+ x@ := 0
+
+ cl := preserves acc(&x)
+ func closureImpl() int {
+ x += 42
+ return x
+ }
+
+ proof cl implements pkg.ClosureSpec{Impl{&x}} {
+ unfold Impl{&x}.inv()
+ res = cl() as closureImpl
+ fold Impl{&x}.inv()
+ }
+
+ impl := Impl{&x}
+ fold impl.inv()
+ pkg.Invoke(cl, impl)
+}
diff --git a/src/test/resources/regressions/issues/000697/pkg/pkg.gobra b/src/test/resources/regressions/issues/000697/pkg/pkg.gobra
new file mode 100644
index 000000000..aea827382
--- /dev/null
+++ b/src/test/resources/regressions/issues/000697/pkg/pkg.gobra
@@ -0,0 +1,20 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+type Calls interface {
+ pred inv()
+}
+
+ghost
+requires cs != nil
+preserves cs.inv()
+func ClosureSpec(ghost cs Calls) (res int)
+
+requires fn implements ClosureSpec{cs}
+requires cs != nil && cs.inv()
+ensures cs.inv()
+func Invoke(fn func () (int), ghost cs Calls) int {
+ return fn() as ClosureSpec{cs}
+}
diff --git a/src/test/resources/regressions/issues/000705.gobra b/src/test/resources/regressions/issues/000705.gobra
new file mode 100644
index 000000000..1912c34c1
--- /dev/null
+++ b/src/test/resources/regressions/issues/000705.gobra
@@ -0,0 +1,75 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package issue000705
+
+// adapted from Viper tutorial on magic wands
+
+type ListEntry struct {
+ next *ListEntry
+ value int
+}
+
+pred (l *ListEntry) List() {
+ acc(l) && (l.next != nil ==> l.next.List())
+}
+
+ghost
+requires acc(l.List(), _)
+pure func (l *ListEntry) Elems() (res seq[int]) {
+ return unfolding acc(l.List(), _) in (
+ l.next == nil ? seq[int]{ l.value } :
+ seq[int]{ l.value } ++ l.next.Elems())
+}
+
+requires l1.List() && l2.List() && l2 != nil
+ensures l1.List() && l1.Elems() == old(l1.Elems() ++ l2.Elems())
+func (l1 *ListEntry) append(l2 *ListEntry) {
+ unfold l1.List()
+ if l1.next == nil {
+ l1.next = l2
+ fold l1.List()
+ } else {
+ tmp := l1.next
+ index := 1
+
+ package tmp.List() --* (l1.List() && l1.Elems() == old(l1.Elems()[:index]) ++ old[#lhs](tmp.Elems())) {
+ fold l1.List()
+ }
+
+ newTmp, newIndex := l1.appendSubroutine(tmp, old(l1.Elems()))
+
+ unfold newTmp.List()
+ newTmp.next = l2
+ fold newTmp.List()
+ apply newTmp.List() --* (l1.List() && l1.Elems() == old(l1.Elems()[:newIndex]) ++ old[#lhs](newTmp.Elems()))
+ }
+}
+
+requires tmp.List() && /*acc(l1) && l1.next == tmp &&*/ tmp.Elems() == elems[1:]
+requires tmp.List() --* (l1.List() && l1.Elems() == elems[:1] ++ old[#lhs](tmp.Elems()))
+ensures 0 <= newIndex
+ensures newTmp.List() && newTmp.Elems() == elems[newIndex:]
+ensures unfolding newTmp.List() in newTmp.next == nil
+ensures newTmp.List() --* (l1.List() && l1.Elems() == elems[:newIndex] ++ old[#lhs](newTmp.Elems()))
+func (l1 *ListEntry) appendSubroutine(tmp *ListEntry, ghost elems seq[int]) (newTmp *ListEntry, newIndex int) {
+ index := 1
+
+ invariant 0 <= index
+ invariant tmp.List() && tmp.Elems() == elems[index:]
+ invariant tmp.List() --* (l1.List() && l1.Elems() == elems[:index] ++ old[#lhs](tmp.Elems()))
+ for unfolding tmp.List() in tmp.next != nil {
+ unfold tmp.List()
+ prev := tmp
+ tmp = tmp.next
+ index = index + 1
+ package tmp.List() --* (l1.List() && l1.Elems() == elems[:index] ++ old[#lhs](tmp.Elems())) {
+ fold prev.List()
+ apply prev.List() --* (l1.List() && l1.Elems() == elems[:index-1] ++ old[#lhs](prev.Elems()))
+ }
+ }
+
+ newTmp = tmp
+ newIndex = index
+ return
+}
diff --git a/src/test/resources/regressions/issues/000713.gobra b/src/test/resources/regressions/issues/000713.gobra
new file mode 100644
index 000000000..601f9dc1c
--- /dev/null
+++ b/src/test/resources/regressions/issues/000713.gobra
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package issue000713
+
+func foo() {
+ f := func g() {}
+ assert f != nil
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/issues/000745.gobra b/src/test/resources/regressions/issues/000745.gobra
new file mode 100644
index 000000000..92eab1ecc
--- /dev/null
+++ b/src/test/resources/regressions/issues/000745.gobra
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package issue000745
+
+func assignment() int {
+ var x@, y [10]int
+ exhale acc(&x)
+ //:: ExpectedOutput(assignment_error:permission_error)
+ x = y
+}
+
+func load0() int {
+ var x@, y int
+ exhale acc(&x)
+ //:: ExpectedOutput(assignment_error:permission_error)
+ y = x
+}
+
+func load1() int {
+ var x@, y struct{ f,g int }
+ exhale acc(&x)
+ //:: ExpectedOutput(assignment_error:permission_error)
+ y = x
+}
+
+func load2() int {
+ var x@, y [10]int
+ exhale acc(&x)
+ //:: ExpectedOutput(load_error:permission_error)
+ y = x
+}
\ No newline at end of file
diff --git a/src/test/scala/viper/gobra/GobraPackageTests.scala b/src/test/scala/viper/gobra/GobraPackageTests.scala
index 8e01bcc49..49738fd19 100644
--- a/src/test/scala/viper/gobra/GobraPackageTests.scala
+++ b/src/test/scala/viper/gobra/GobraPackageTests.scala
@@ -62,7 +62,10 @@ class GobraPackageTests extends GobraTests {
"--logLevel", "INFO",
"--directory", currentDir.toFile.getPath,
"--projectRoot", currentDir.toFile.getPath, // otherwise, it assumes Gobra's root directory as the project root
- "-I", currentDir.toFile.getPath
+ "-I", currentDir.toFile.getPath,
+ // termination checks in functions are currently disabled in the tests. This can be enabled in the future,
+ // but requires some work to add termination measures all over the test suite.
+ "--disablePureFunctsTerminationRequirement",
))
} yield config
diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala
index 057d0fdb8..9de0ce90d 100644
--- a/src/test/scala/viper/gobra/GobraTests.scala
+++ b/src/test/scala/viper/gobra/GobraTests.scala
@@ -16,7 +16,7 @@ import viper.gobra.frontend.Source.FromFileSource
import viper.gobra.frontend.info.Info
import viper.gobra.frontend.{Config, PackageResolver, Parser, Source}
import viper.gobra.reporting.VerifierResult.{Failure, Success}
-import viper.gobra.reporting.{NoopReporter, VerifierError}
+import viper.gobra.reporting.{GobraMessage, GobraReporter, VerifierError}
import viper.silver.testing.{AbstractOutput, AnnotatedTestInput, ProjectInfo, SystemUnderTest}
import viper.silver.utility.TimingUtils
import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext}
@@ -51,11 +51,14 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll {
private def getConfig(source: Source): Config =
Config(
logLevel = Level.INFO,
- reporter = NoopReporter,
+ reporter = StringifyReporter,
packageInfoInputMap = Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)),
checkConsistency = true,
cacheParserAndTypeChecker = cacheParserAndTypeChecker,
z3Exe = z3Exe,
+ // termination checks in functions are currently disabled in the tests. This can be enabled in the future,
+ // but requires some work to add termination measures all over the test suite.
+ disableCheckTerminationPureFns = true,
)
override def runTests(testName: Option[String], args: Args): Status = {
@@ -120,4 +123,13 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll {
/** A short and unique identifier for this output. */
override def fullId: String = error.id
}
+
+ case object StringifyReporter extends GobraReporter {
+ override val name: String = "StringifyReporter"
+
+ override def report(msg: GobraMessage): Unit = {
+ // by invoking `toString`, we check that messages are printable, which includes pretty-printing AST nodes:
+ msg.toString
+ }
+ }
}
diff --git a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala
index 926b112c9..1bd7bb920 100644
--- a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala
+++ b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala
@@ -216,7 +216,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s union t" =>
+ case "(s union t)" =>
}
}
@@ -232,7 +232,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s union t union u" =>
+ case "((s union t) union u)" =>
}
}
@@ -248,7 +248,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s union t union u" =>
+ case "(s union (t union u))" =>
}
}
@@ -265,7 +265,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "set[bool°] { s } union set[bool°] { t, u }" =>
+ case "(set[bool°] { s } union set[bool°] { t, u })" =>
}
}
@@ -277,7 +277,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s intersection t" =>
+ case "(s intersection t)" =>
}
}
@@ -293,7 +293,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s intersection t intersection u" =>
+ case "((s intersection t) intersection u)" =>
}
}
@@ -309,7 +309,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s intersection t intersection u" =>
+ case "(s intersection (t intersection u))" =>
}
}
@@ -326,7 +326,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "set[bool°] { s } intersection set[bool°] { t, u }" =>
+ case "(set[bool°] { s } intersection set[bool°] { t, u })" =>
}
}
@@ -338,7 +338,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s setminus t" =>
+ case "(s setminus t)" =>
}
}
@@ -354,7 +354,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s setminus t setminus u" =>
+ case "((s setminus t) setminus u)" =>
}
}
@@ -370,7 +370,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s setminus t setminus u" =>
+ case "(s setminus (t setminus u))" =>
}
}
@@ -387,7 +387,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "set[bool°] { s } setminus set[bool°] { t, u }" =>
+ case "(set[bool°] { s } setminus set[bool°] { t, u })" =>
}
}
@@ -398,7 +398,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s subset t" =>
+ case "(s subset t)" =>
}
}
@@ -412,7 +412,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "s subset t subset u" =>
+ case "((s subset t) subset u)" =>
}
}
@@ -423,7 +423,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "set[int°] { 42 } subset set[bool°] { }" =>
+ case "(set[int°] { 42 } subset set[bool°] { })" =>
}
}
@@ -434,7 +434,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "x in xs" =>
+ case "(x in xs)" =>
}
}
@@ -448,32 +448,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "x in xs in ys" =>
- }
- }
-
- test("Printer: should correctly show a simple set membership expression") {
- val expr = Contains(
- LocalVar("x", sequenceT(boolT))(Internal),
- LocalVar("s", sequenceT(boolT))(Internal)
- )(Internal)
-
- frontend.show(expr) should matchPattern {
- case "x in s" =>
- }
- }
-
- test("Printer: should correctly show a small 'chain' of set membership expressions") {
- val expr = Contains(
- Contains(
- LocalVar("x", boolT)(Internal),
- LocalVar("s", setT(boolT))(Internal)
- )(Internal),
- LocalVar("t", setT(boolT))(Internal),
- )(Internal)
-
- frontend.show(expr) should matchPattern {
- case "x in s in t" =>
+ case "((x in xs) in ys)" =>
}
}
@@ -487,7 +462,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "set[bool°] { true, false } in set[set[set[int°]°]°] { }" =>
+ case "(set[bool°] { true, false } in set[set[set[int°]°]°] { })" =>
}
}
@@ -511,7 +486,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "len(s intersection t)" =>
+ case "len((s intersection t))" =>
}
}
@@ -608,7 +583,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "mset[int°] { 1, 2 } union mset[int°] { 3 }" =>
+ case "(mset[int°] { 1, 2 } union mset[int°] { 3 })" =>
}
}
@@ -620,7 +595,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "mset[int°] { 1, 2 } intersection mset[int°] { 3 }" =>
+ case "(mset[int°] { 1, 2 } intersection mset[int°] { 3 })" =>
}
}
@@ -631,7 +606,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "mset[int°] { 1, 2 } subset mset[int°] { 3 }" =>
+ case "(mset[int°] { 1, 2 } subset mset[int°] { 3 })" =>
}
}
@@ -664,23 +639,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "2 in mset[int°] { 1, 2, 3 }" =>
- }
- }
-
- test("Printer: should correctly show a multiset inclusion expression (2)") {
- val expr = Contains(
- MultisetLit(intT, Vector(
- IntLit(1)(Internal)
- ))(Internal),
- MultisetLit(intT, Vector(
- IntLit(2)(Internal),
- IntLit(3)(Internal),
- ))(Internal)
- )(Internal)
-
- frontend.show(expr) should matchPattern {
- case "mset[int°] { 1 } in mset[int°] { 2, 3 }" =>
+ case "(2 in mset[int°] { 1, 2, 3 })" =>
}
}
@@ -717,7 +676,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "set(xs ++ ys)" =>
+ case "set((xs ++ ys))" =>
}
}
@@ -729,7 +688,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "set(xs) union set(ys)" =>
+ case "(set(xs) union set(ys))" =>
}
}
@@ -740,7 +699,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "x # xs" =>
+ case "(x # xs)" =>
}
}
@@ -755,7 +714,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "40 + 2 # seq[int°] { 0:1, 1:2, 2:3 }" =>
+ case "((40 + 2) # seq[int°] { 0:1, 1:2, 2:3 })" =>
}
}
@@ -769,7 +728,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "x # xs # ys" =>
+ case "((x # xs) # ys)" =>
}
}
@@ -793,7 +752,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "mset(xs ++ ys)" =>
+ case "mset((xs ++ ys))" =>
}
}
@@ -805,7 +764,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "mset(xs) union mset(ys)" =>
+ case "(mset(xs) union mset(ys))" =>
}
}
@@ -863,27 +822,6 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
}
}
- test("Printer: should correctly show a slightly more complex array length expression") {
- val expr = Length(
- Add(
- Length(LocalVar("s", setT(boolT))(Internal))(Internal),
- IntLit(42)(Internal)
- )(Internal)
- )(Internal)
-
- frontend.show(expr) should matchPattern {
- case "len(len(s) + 42)" =>
- }
- }
-
- test("Printer: should correctly show a nested array length expression") {
- val expr = Length(Length(IntLit(42)(Internal))(Internal))(Internal)
-
- frontend.show(expr) should matchPattern {
- case "len(len(42))" =>
- }
- }
-
test("Printer: should be able to show the addition of two uses of the array length function") {
val expr = Add(
Length(LocalVar("a", exclusiveArrayT(24, boolT))(Internal))(Internal),
@@ -891,7 +829,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "len(a) + len(b)" =>
+ case "(len(a) + len(b))" =>
}
}
@@ -915,7 +853,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "len(seq[bool°] { 0:false } ++ xs)" =>
+ case "len((seq[bool°] { 0:false } ++ xs))" =>
}
}
@@ -929,17 +867,6 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
}
}
- test("Printer: should correctly show a composition of two sequence length function applications") {
- val expr = Add(
- Length(LocalVar("xs", sequenceT(intT))(Internal))(Internal),
- Length(LocalVar("ys", sequenceT(intT))(Internal))(Internal)
- )(Internal)
-
- frontend.show(expr) should matchPattern {
- case "len(xs) + len(ys)" =>
- }
- }
-
test("Printer: should correctly show a simple array indexing expression") {
val expr = IndexedExp(
LocalVar("a", exclusiveArrayT(124, intT))(Internal),
@@ -964,7 +891,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "a[x + 2]" =>
+ case "a[(x + 2)]" =>
}
}
@@ -1004,21 +931,6 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
}
}
- test("Printer: should correctly show a simple assignee indexed expression") {
- val typ = sharedArrayT(12, sharedArrayT(24, BoolT(Addressability.Shared)))
- val expr = Assignee.Index(
- IndexedExp(
- LocalVar("a", typ)(Internal),
- Add(IntLit(2)(Internal), IntLit(3)(Internal))(Internal),
- typ
- )(Internal)
- )
-
- frontend.show(expr) should matchPattern {
- case "a[2 + 3]" =>
- }
- }
-
test("Printer: should correctly show a simple integer array literal") {
val expr = ArrayLit(3, intT, Map(
BigInt(0) -> IntLit(12)(Internal),
@@ -1127,7 +1039,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
)(Internal)
frontend.show(expr) should matchPattern {
- case "seq(xs) ++ seq(a)" =>
+ case "(seq(xs) ++ seq(a))" =>
}
}
@@ -1161,7 +1073,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi
val exp = OptionSome(And(BoolLit(true)(Internal), BoolLit(false)(Internal))(Internal))(Internal)
frontend.show(exp) should matchPattern {
- case "some(true && false)" =>
+ case "some((true && false))" =>
}
}
diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala
index dd203575a..bd39c248d 100644
--- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala
+++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala
@@ -327,7 +327,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside {
PIdnDef("foo"),
inArgs.map(_._1),
PResult(Vector()),
- PFunctionSpec(Vector(), Vector(), Vector(), Vector.empty),
+ PFunctionSpec(Vector(), Vector(), Vector(), Vector.empty, Vector.empty),
Some(PBodyParameterInfo(inArgs.collect{ case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body)))
))
)
@@ -341,7 +341,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside {
new PackageInfo("pkg", "pkg", false)
)
val tree = new Info.GoTree(pkg)
- val config = Config()
+ val config = Config(disableCheckTerminationPureFns = true)
val info = new TypeInfoImpl(tree, Map.empty)(config)
info.errors match {
case Vector(msgs) => fail(s"Type-checking failed: $msgs")
diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala
index a8a132b6e..bd9fd62c7 100644
--- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala
+++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala
@@ -24,13 +24,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: Invoke") {
frontend.parseExpOrFail("Contains(v)") should matchPattern {
- case PInvoke(PNamedOperand(PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) =>
+ case PInvoke(PNamedOperand(PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) =>
}
}
test("Parser: DotInvoke") {
frontend.parseExpOrFail("self.Contains(v)") should matchPattern {
- case PInvoke(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) =>
+ case PInvoke(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) =>
}
}
@@ -42,13 +42,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: DoubleDotInvoke1") {
frontend.parseExpOrFail("(self.Left).Contains(v)") should matchPattern {
- case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) =>
+ case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) =>
}
}
test("Parser: DoubleDotInvoke2") {
frontend.parseExpOrFail("self.Left.Contains(v)") should matchPattern {
- case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) =>
+ case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) =>
}
}
@@ -120,13 +120,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: spec only function") {
frontend.parseFunctionDecl("func foo() { b.bar() }", specOnly = true) should matchPattern {
- case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) =>
+ case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), false, false, false), None) =>
}
}
test("Parser: spec only function with nested blocks") {
frontend.parseFunctionDecl("func foo() { if(true) { b.bar() } else { foo() } }", specOnly = true) should matchPattern {
- case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) =>
+ case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), false, false, false), None) =>
}
}
@@ -145,13 +145,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: fold mpredicate call") {
frontend.parseStmtOrFail("fold (*(b.Rectangle)).RectMem(&r)") should matchPattern {
- case PFold(PPredicateAccess(PInvoke(PDot(PDeref(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("Rectangle"))), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None), PFullPerm())) =>
+ case PFold(PPredicateAccess(PInvoke(PDot(PDeref(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("Rectangle"))), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None, false), PFullPerm())) =>
}
}
test("Parser: fold fpredicate call") {
frontend.parseStmtOrFail("fold b.RectMem(&r)") should matchPattern {
- case PFold(PPredicateAccess(PInvoke(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None), PFullPerm())) =>
+ case PFold(PPredicateAccess(PInvoke(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None, false), PFullPerm())) =>
}
}
@@ -159,7 +159,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
val modes: Set[Boolean] = Set(false, true)
modes.foreach(specOnly => {
frontend.parseFunctionDecl("func bar()", specOnly) should matchPattern {
- case PFunctionDecl(PIdnDef("bar"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) =>
+ case PFunctionDecl(PIdnDef("bar"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), false, false, false), None) =>
}
})
}
@@ -2516,7 +2516,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: should be able to parse an explicit short var decl") {
frontend.parseStmtOrFail("ghost res := test(s)") should matchPattern {
case PExplicitGhostStatement(PShortVarDecl(
- Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None)),
+ Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None, false)),
Vector(PIdnUnk("res")),
Vector(false))) =>
}
@@ -2525,7 +2525,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: should be able to parse an explicit short var decl with ghost in the declaration") {
frontend.parseStmtOrFail("ghost ghostRes := test(s)") should matchPattern {
case PExplicitGhostStatement(PShortVarDecl(
- Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None)),
+ Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None, false)),
Vector(PIdnUnk("ghostRes")),
Vector(false))) =>
}
@@ -2619,7 +2619,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
// 0xf8 == 248
val parseRes = frontend.parseExp("string(248)")
inside (parseRes) {
- case Right(PInvoke(PNamedOperand(PIdnUse("string")), Vector(PIntLit(value, Decimal)), None)) => value should be (0xf8)
+ case Right(PInvoke(PNamedOperand(PIdnUse("string")), Vector(PIntLit(value, Decimal)), None, false)) => value should be (0xf8)
}
}
@@ -2643,19 +2643,19 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: should be able to parse normal termination measure") {
frontend.parseFunctionDecl("decreases n; func factorial (n int) int") should matchPattern {
- case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), false, false), None) =>
+ case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), Vector(), false, false, false), None) =>
}
}
test("Parser: should be able to parse underscore termination measure") {
frontend.parseFunctionDecl("decreases _; func factorial (n int) int") should matchPattern {
- case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), false, false), None) =>
+ case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), Vector(), false, false, false), None) =>
}
}
test("Parser: should be able to parse conditional termination measure" ) {
frontend.parseFunctionDecl("decreases n if n>1; decreases _ if n<2; func factorial (n int) int") should matchPattern {
- case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), false, false), None) if one == 1 && two == 2 =>
+ case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), Vector(), false, false, false), None) if one == 1 && two == 2 =>
}
}
@@ -2674,7 +2674,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside {
test("Parser: should be able to parse type conversions") {
frontend.parseExpOrFail("uint8(1)") should matchPattern {
- case PInvoke(PNamedOperand(PIdnUse("uint8")), Vector(x), None) if x == PIntLit(1) =>
+ case PInvoke(PNamedOperand(PIdnUse("uint8")), Vector(x), None, false) if x == PIntLit(1) =>
}
}
diff --git a/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala b/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala
index 25980a22a..a8fa3ee9f 100644
--- a/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala
+++ b/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala
@@ -32,12 +32,12 @@ class StatsCollectorTests extends AnyFunSuite with BeforeAndAfterAll {
}
test("Integration without chopper") {
- val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir))
+ val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir, "--disablePureFunctsTerminationRequirement"))
runIntegration(config)
}
test("Integration with chopper") {
- val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir, "--chop", "10"))
+ val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir, "--chop", "10", "--disablePureFunctsTerminationRequirement"))
runPackagesSeparately(config)
runIntegration(config)
}
diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala
index ed9020f20..7583beb60 100644
--- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala
+++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala
@@ -3371,7 +3371,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside {
PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("self")))),
inArgs.map(_._1),
PResult(Vector()),
- PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = true),
+ PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), isPure = true),
Some(PBodyParameterInfo(inArgs.collect{ case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body)))
))
)
diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala
index dc3a3fbc7..34e51a27d 100644
--- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala
+++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala
@@ -66,7 +66,7 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside {
PIdnDef("foo"),
inArgs.map(_._1),
PResult(Vector()),
- PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = false),
+ PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), isPure = false),
Some(PBodyParameterInfo(inArgs.collect{ case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body)))
))
)
diff --git a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala
index a248c2a15..383924a5a 100644
--- a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala
+++ b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala
@@ -363,7 +363,7 @@ class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside {
PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("self")))),
stubParams(ts),
PResult(Vector()),
- PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = true),
+ PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), isPure = true),
None
))
)