From f5819535b22d4db600481711f5c9cc25eb70e9e4 Mon Sep 17 00:00:00 2001 From: Anthony Bau Date: Fri, 10 Jul 2015 10:10:21 -0400 Subject: [PATCH 001/268] Start on svg --- Gruntfile.coffee | 52 ++------------------- css/droplet.css | 3 ++ src/draw.coffee | 117 +++++++++++++---------------------------------- src/view.coffee | 4 +- 4 files changed, 43 insertions(+), 133 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 203e6c40..1653b44e 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -69,7 +69,7 @@ module.exports = (grunt) -> browserify: build: files: - 'dist/droplet-full.js': ['./src/main.coffee'] + 'example/example-svg.js': ['./src/example-svg.coffee'] options: transform: ['coffeeify'] browserifyOptions: @@ -83,6 +83,8 @@ module.exports = (grunt) -> * Date: <%=grunt.template.today('yyyy-mm-dd')%> */ ''' + watch: true + keepAlive: true test: files: 'test/js/tests.js': ['test/src/tests.coffee'] @@ -168,49 +170,5 @@ module.exports = (grunt) -> grunt.task.run 'qunit:all' grunt.task.run 'mochaTest' - grunt.task.registerTask 'watchify', -> - # Prevent the task from terminating - @async() - - b = browserify { - cache: {} - packageCache: {} - noParse: NO_PARSE - delay: 100 - standalone: 'droplet' - } - - b.require './src/main.coffee' - b.transform coffeeify - - w = watchify(b) - - # Compile once through first - stream = fs.createWriteStream 'dist/droplet-full.js' - w.bundle().pipe stream - - stream.once 'close', -> - console.log 'Initial bundle complete.' - - lrserver = livereload() - - lrserver.listen 35729, -> - console.log 'Livereload server listening on 35729' - - w.on 'update', -> - console.log 'File changed...' - stream = fs.createWriteStream 'dist/droplet-full.js' - try - w.bundle().pipe stream - stream.once 'close', -> - console.log 'Rebuilt.' - lrserver.changed { - body: { - files: ['dist/droplet-full.js'] - } - } - catch e - console.log 'BUILD FAILED.' - console.log e.stack - - grunt.registerTask 'testserver', ['connect:testserver', 'watchify'] + + grunt.registerTask 'testserver', ['connect:testserver', 'browserify:build'] diff --git a/css/droplet.css b/css/droplet.css index 61928f68..e996037b 100644 --- a/css/droplet.css +++ b/css/droplet.css @@ -308,3 +308,6 @@ letter-spacing: normal; pointer-events: none; } +text { + white-space: pre; +} diff --git a/src/draw.coffee b/src/draw.coffee index a2c78479..e82757dd 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -4,6 +4,7 @@ # Minimalistic HTML5 canvas wrapper. Mainly used as conveneince tools in Droplet. ## Private (convenience) functions +SVG_STANDARD = 'http://www.w3.org/2000/svg' helper = require './helper.coffee' @@ -55,10 +56,12 @@ avgColor = (a, factor, b) -> return memoizedAvgColor[c] = toHex newRGB +getGuid = -> 'draw-guid-' + Math.random().toString() # For + exports.Draw = class Draw ## Public functions constructor: -> - @ctx = null #Hacky, hacky, hacky + @ctx = document.createElement('canvas') @fontSize = 15 @fontFamily = 'Courier New, monospace' @fontAscent = 2 @@ -297,105 +300,42 @@ exports.Draw = class Draw @_cachedTranslation.translate vector @_cacheFlag = true - clip: (ctx) -> - @_clearCache() - - if @_points.length is 0 then return - - ctx.beginPath() - ctx.moveTo @_points[0].x, @_points[0].y - for point in @_points - ctx.lineTo point.x, point.y - ctx.lineTo @_points[0].x, @_points[0].y - - # Wrap around again so that the origin - # has a normal corner - if @_points.length > 1 - ctx.lineTo @_points[1].x, @_points[1].y - - ctx.clip() - draw: (ctx) -> @_clearCache() if @_points.length is 0 then return - ctx.strokeStyle = @style.strokeColor - ctx.lineWidth = @style.lineWidth + pathElement = document.createElementNS SVG_STANDARD, 'path' - if @style.fillColor? then ctx.fillStyle = @style.fillColor + if @style.fillColor? + pathElement.setAttribute 'fill', @style.fillColor - ctx.beginPath() - ctx.moveTo @_points[0].x, @_points[0].y + pathCommands = [] + + pathCommands.push "M#{@_points[0].x} #{@_points[0].y}" for point in @_points - ctx.lineTo point.x, point.y - ctx.lineTo @_points[0].x, @_points[0].y + pathCommands.push "L#{point.x} #{point.y}" + pathCommands.push "M#{@_points[0].x} #{@_points[0].y}" + pathCommands.push "Z" - # Wrap around again so that the origin - # has a normal corner - if @_points.length > 1 - ctx.lineTo @_points[1].x, @_points[1].y + pathElement.setAttribute 'd', pathCommands.join ' ' - # Fill and stroke - if @style.fillColor? then ctx.fill() + ctx.appendChild pathElement - ctx.save() - unless @noclip - ctx.clip() if @bevel - # Dark bevels - ctx.beginPath() - ctx.moveTo @_points[0].x, @_points[0].y - for point, i in @_points[1..] - if (point.x < @_points[i].x and point.y >= @_points[i].y) or - (point.y > @_points[i].y and point.x <= @_points[i].x) - ctx.lineTo point.x, point.y - else unless point.equals(@_points[i]) - ctx.moveTo point.x, point.y - - unless @_points[0].x > @_points[@_points.length - 1].x or - @_points[0].y < @_points[@_points.length - 1].y - ctx.lineTo @_points[0].x, @_points[0].y - - ctx.lineWidth = 4 - ctx.strokeStyle = avgColor @style.fillColor, 0.85, '#000' - ctx.stroke() - - ctx.lineWidth = 2 - ctx.strokeStyle = avgColor @style.fillColor, 0.7, '#000' - ctx.stroke() - - # Light bevels - ctx.beginPath() - ctx.moveTo @_points[0].x, @_points[0].y - for point, i in @_points[1..] - if (point.x > @_points[i].x and point.y <= @_points[i].y) or - (point.y < @_points[i].y and point.x >= @_points[i].x) - ctx.lineTo point.x, point.y - else unless point.equals(@_points[i]) - ctx.moveTo point.x, point.y - if @_points[0].x > @_points[@_points.length - 1].x or - @_points[0].y < @_points[@_points.length - 1].y - ctx.lineTo @_points[0].x, @_points[0].y - - ctx.lineWidth = 4 - ctx.strokeStyle = avgColor @style.fillColor, 0.85, '#FFF' - ctx.stroke() - - ctx.lineWidth = 2 - ctx.strokeStyle = avgColor @style.fillColor, 0.7, '#FFF' - ctx.stroke() + pathElement.setAttribute 'filter', 'url(#droplet-path-bevel)' else - ctx.stroke() - - ctx.restore() + pathElement.setAttribute 'stroke', @style.strokeColor + pathElement.setAttribute 'stroke-width', @style.lineWidth clone: -> clone = new Path() clone.push el for el in @_points return clone + ### + # TODO drawShadow: (ctx, offsetX, offsetY, blur) -> @_clearCache() @@ -426,6 +366,7 @@ exports.Draw = class Draw for own key, value of oldValues ctx[key] = value + ### # ## Text ## # A Text element. Mainly this exists for computing bounding boxes, which is @@ -449,10 +390,18 @@ exports.Draw = class Draw setPosition: (point) -> @translate point.from @point draw: (ctx) -> - ctx.textBaseline = 'top' - ctx.font = self.fontSize + 'px ' + self.fontFamily - ctx.fillStyle = '#000' - ctx.fillText @value, @point.x, @point.y - self.fontAscent + element = document.createElementNS SVG_STANDARD, 'text' + element.setAttribute 'x', @point.x + element.setAttribute 'y', @point.y + element.setAttribute 'fill', '#000' + element.setAttribute 'dominant-baseline', 'text-before-edge' + element.setAttribute 'font-family', self.fontFamily + element.setAttribute 'font-size', self.fontSize + + text = document.createTextNode @value.replace(/ /g, '\u00A0') # Preserve whitespace + element.appendChild text + + ctx.appendChild element refreshFontCapital: -> @fontAscent = helper.fontMetrics(@fontFamily, @fontSize).prettytop diff --git a/src/view.coffee b/src/view.coffee index d4727345..8ccea5b9 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -31,8 +31,8 @@ DROP_TRIANGLE_COLOR = '#555' DEFAULT_OPTIONS = showDropdowns: true padding: 5 - indentWidth: 10 - indentTongueHeight: 10 + indentWidth: 20 + indentTongueHeight: 20 tabOffset: 10 tabWidth: 15 tabHeight: 5 From 2901b79f858d41053a0f89a7ee9a9be5655ade58 Mon Sep 17 00:00:00 2001 From: Anthony Bau Date: Sat, 11 Jul 2015 23:51:29 -0400 Subject: [PATCH 002/268] Integrate into main controller --- Gruntfile.coffee | 2 +- src/controller.coffee | 223 ++++++++++++++++++++---------------------- src/draw.coffee | 30 +++--- src/view.coffee | 9 +- 4 files changed, 128 insertions(+), 136 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 1653b44e..060fd886 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -69,7 +69,7 @@ module.exports = (grunt) -> browserify: build: files: - 'example/example-svg.js': ['./src/example-svg.coffee'] + 'dist/droplet-full.js': ['./src/main.coffee'] options: transform: ['coffeeify'] browserifyOptions: diff --git a/src/controller.coffee b/src/controller.coffee index e12fdadc..951aa72f 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -79,6 +79,27 @@ unsortedEditorBindings = { editorBindings = {} +SVG_STANDARD = 'http://www.w3.org/2000/svg' + +EMBOSS_FILTER_SVG = """ + + + + + + + + + + + + + +""" + +clearCanvas = (canvas) -> + canvas.innerHTML = '' + # This hook function is for convenience, # for features to add events that will occur at # various times in the editor lifecycle. @@ -119,6 +140,8 @@ exports.Editor = class Editor @dropletElement = document.createElement 'div' @dropletElement.className = 'droplet-wrapper-div' + @dropletElement.innerHTML = EMBOSS_FILTER_SVG + # We give our element a tabIndex so that it can be focused and capture keypresses. @dropletElement.tabIndex = 0 @@ -130,13 +153,14 @@ exports.Editor = class Editor # ### Canvases # Create the palette and main canvases - # Main canvas first - @mainCanvas = document.createElement 'canvas' - @mainCanvas.className = 'droplet-main-canvas' - - @mainCanvas.width = @mainCanvas.height = 0 + # A measuring canvas for measuring text + @measureCanvas = document.createElement 'canvas' + @measureCtx = @measureCanvas.getContext '2d' - @mainCtx = @mainCanvas.getContext '2d' + # Main canvas first + @mainCanvas = @mainCtx = document.createElementNS SVG_STANDARD, 'svg' + @mainCanvas.setAttribute 'class', 'droplet-main-canvas' + @mainCanvas.setAttribute 'shape-rendering', 'optimizeSpeed' @dropletElement.appendChild @mainCanvas @@ -148,11 +172,8 @@ exports.Editor = class Editor @paletteWrapper.appendChild @paletteElement # Then palette canvas - @paletteCanvas = document.createElement 'canvas' - @paletteCanvas.className = 'droplet-palette-canvas' - @paletteCanvas.height = @paletteCanvas.width = 0 - - @paletteCtx = @paletteCanvas.getContext '2d' + @paletteCanvas = @paletteCtx = document.createElementNS SVG_STANDARD, 'svg' + @paletteCanvas.setAttribute 'class', 'droplet-palette-canvas' @paletteElement.appendChild @paletteCanvas @@ -183,7 +204,7 @@ exports.Editor = class Editor emptyLineHeight: 25 highlightAreaHeight: 10 shadowBlur: 5 - ctx: @mainCtx + ctx: @measureCtx draw: @draw # Set up event bindings before creating a view @@ -314,11 +335,9 @@ exports.Editor = class Editor @resizeGutter() - @mainCanvas.height = @dropletElement.offsetHeight - @mainCanvas.width = @dropletElement.offsetWidth - @gutter.offsetWidth + @mainCanvas.style.height = "#{@dropletElement.offsetHeight}px" + @mainCanvas.style.width = "#{@dropletElement.offsetWidth - @gutter.offsetWidth}px" - @mainCanvas.style.height = "#{@mainCanvas.height}px" - @mainCanvas.style.width = "#{@mainCanvas.width}px" @mainCanvas.style.left = "#{@gutter.offsetWidth}px" @transitionContainer.style.left = "#{@gutter.offsetWidth}px" @@ -335,28 +354,28 @@ exports.Editor = class Editor @scrollOffsets.main.y = @mainScroller.scrollTop @scrollOffsets.main.x = @mainScroller.scrollLeft - @mainCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y + # TODO migrate from "transform" to "viewBox" + @setScrollOffset @mainCtx, @scrollOffsets.main # Also update scroll for the highlight ctx, so that # they can match the blocks' positions - @highlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y - @cursorCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y + @setScrollOffset @highlightCtx, @scrollOffsets.main + @setScrollOffset @cursorCtx, @scrollOffsets.main - @redrawMain() + setScrollOffset: (canvas, offset) -> + canvas.setAttribute 'viewBox', "#{offset.x}, #{offset.y}, #{canvas.offsetWidth}, #{canvas.offsetHeight}" resizePalette: -> @paletteCanvas.style.top = "#{@paletteHeader.offsetHeight}px" - @paletteCanvas.height = @paletteWrapper.offsetHeight - @paletteHeader.offsetHeight - @paletteCanvas.width = @paletteWrapper.offsetWidth + @paletteCanvas.style.height = "#{@paletteWrapper.offsetHeight - @paletteHeader.offsetHeight}px" + @paletteCanvas.style.width = "#{@paletteWrapper.offsetWidth}px" - @paletteCanvas.style.height = "#{@paletteCanvas.height}px" - @paletteCanvas.style.width = "#{@paletteCanvas.width}px" for binding in editorBindings.resize_palette binding.call this - @paletteCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y - @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y + @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})" + @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})" @rebuildPalette() @@ -376,12 +395,7 @@ exports.Editor = class Editor # # Redrawing simply involves issuing a call to the View. -Editor::clearMain = (opts) -> - if opts.boundingRectangle? - @mainCtx.clearRect opts.boundingRectangle.x, opts.boundingRectangle.y, - opts.boundingRectangle.width, opts.boundingRectangle.height - else - @mainCtx.clearRect @scrollOffsets.main.x, @scrollOffsets.main.y, @mainCanvas.width, @mainCanvas.height +Editor::clearMain = (opts) -> clearCanvas @mainCtx Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> @nubbyHeight = Math.max(0, height); @nubbyColor = color @@ -390,8 +404,8 @@ Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> if height >= 0 @topNubbyPath.bevel = true - @topNubbyPath.push new @draw.Point @mainCanvas.width, -5 - @topNubbyPath.push new @draw.Point @mainCanvas.width, height + @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, -5 + @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, height @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth), @@ -417,24 +431,12 @@ Editor::redrawMain = (opts = {}) -> # to the font size we want @draw.setGlobalFontSize @fontSize - # Supply our main canvas for measuring - @draw.setCtx @mainCtx - # Clear the main canvas @clearMain(opts) @topNubbyPath.draw @mainCtx - if opts.boundingRectangle? - @mainCtx.save() - opts.boundingRectangle.clip @mainCtx - - rect = opts.boundingRectangle ? new @draw.Rectangle( - @scrollOffsets.main.x, - @scrollOffsets.main.y, - @mainCanvas.width, - @mainCanvas.height - ) + rect = null options = { grayscale: false selected: false @@ -448,8 +450,8 @@ Editor::redrawMain = (opts = {}) -> @mainCtx.globalAlpha *= FLOATING_BLOCK_ALPHA # Draw floating blocks - startWidth = @mainCtx.measureText(@mode.startComment).width - endWidth = @mainCtx.measureText(@mode.endComment).width + startWidth = @measureCtx.measureText(@mode.startComment).width + endWidth = @measureCtx.measureText(@mode.endComment).width for record in @floatingBlocks blockView = @view.getViewNodeFor record.block blockView.layout record.position.x, record.position.y @@ -505,27 +507,22 @@ Editor::redrawMain = (opts = {}) -> if opts.boundingRectangle? opts.boundingRectangle.unite path.bounds() opts.boundingRectangle.unite(oldBounds) - @mainCtx.restore() return @redrawMain opts # TODO this will need to become configurable by the @mode - @mainCtx.globalAlpha *= 0.8 record.grayBoxPath.draw @mainCtx + ###TODO @mainCtx.fillStyle = '#000' @mainCtx.fillText(@mode.startComment, blockView.totalBounds.x - startWidth, blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize) @mainCtx.fillText(@mode.endComment, record.grayBox.right() - endWidth - 5, bottomTextPosition) - @mainCtx.globalAlpha /= 0.8 + ### blockView.draw @mainCtx, rect, { grayscale: false selected: false noText: false } - @mainCtx.globalAlpha /= FLOATING_BLOCK_ALPHA - - if opts.boundingRectangle? - @mainCtx.restore() # Draw the cursor (if exists, and is inserted) @redrawCursors(); @redrawHighlights() @@ -588,8 +585,7 @@ Editor::redrawHighlights = -> @redrawCursors() @redrawLassoHighlight() -Editor::clearCursorCanvas = -> - @cursorCtx.clearRect @scrollOffsets.main.x, @scrollOffsets.main.y, @cursorCanvas.width, @cursorCanvas.height +Editor::clearCursorCanvas = -> clearCanvas @cursorCtx Editor::redrawCursors = -> @clearCursorCanvas() @@ -602,13 +598,9 @@ Editor::redrawCursors = -> Editor::drawCursor = -> @strokeCursor @determineCursorPosition() -Editor::clearPalette = -> - @paletteCtx.clearRect @scrollOffsets.palette.x, @scrollOffsets.palette.y, - @paletteCanvas.width, @paletteCanvas.height +Editor::clearPalette = -> clearCanvas @paletteCtx -Editor::clearPaletteHighlightCanvas = -> - @paletteHighlightCtx.clearRect @scrollOffsets.palette.x, @scrollOffsets.palette.y, - @paletteHighlightCanvas.width, @paletteHighlightCanvas.height +Editor::clearPaletteHighlightCanvas = -> clearCanvas @paletteHighlightCtx Editor::redrawPalette = -> @clearPalette() @@ -944,19 +936,15 @@ hook 'populate', 0, -> # We will also have to initialize the # drag canvas. - @dragCanvas = document.createElement 'canvas' - @dragCanvas.className = 'droplet-drag-canvas' + @dragCanvas = @dragCtx = document.createElementNS SVG_STANDARD, 'svg' + @dragCanvas.setAttribute 'class', 'droplet-drag-canvas' @dragCanvas.style.left = '-9999px' @dragCanvas.style.top = '-9999px' - @dragCtx = @dragCanvas.getContext '2d' - # And the canvas for drawing highlights - @highlightCanvas = document.createElement 'canvas' - @highlightCanvas.className = 'droplet-highlight-canvas' - - @highlightCtx = @highlightCanvas.getContext '2d' + @highlightCanvas = @highlightCtx = document.createElementNS SVG_STANDARD, 'svg' + @highlightCanvas.setAttribute 'class', 'droplet-highlight-canvas' # We append it to the tracker element, # so that it can appear in front of the scrollers. @@ -965,24 +953,20 @@ hook 'populate', 0, -> @wrapperElement.appendChild @dragCanvas @dropletElement.appendChild @highlightCanvas -Editor::clearHighlightCanvas = -> - @highlightCtx.clearRect @scrollOffsets.main.x, @scrollOffsets.main.y, @highlightCanvas.width, @highlightCanvas.height +Editor::clearHighlightCanvas = -> clearCanvas @highlightCtx # Utility function for clearing the drag canvas, # an operation we will be doing a lot. -Editor::clearDrag = -> - @dragCtx.clearRect 0, 0, @dragCanvas.width, @dragCanvas.height +Editor::clearDrag = -> clearCanvas @dragCtx # On resize, we will want to size the drag canvas correctly. Editor::resizeDragCanvas = -> - @dragCanvas.width = 0 - @dragCanvas.height = 0 + @dragCanvas.style.width = "#{0}px" + @dragCanvas.style.height = "#{0}px" - @highlightCanvas.width = @dropletElement.offsetWidth - @gutter.offsetWidth - @highlightCanvas.style.width = "#{@highlightCanvas.width}px" + @highlightCanvas.style.width = "#{@dropletElement.offsetWidth - @gutter.offsetWidth}px" - @highlightCanvas.height = @dropletElement.offsetHeight - @highlightCanvas.style.height = "#{@highlightCanvas.height}px" + @highlightCanvas.style.height = "#{@dropletElement.offsetHeight}px" @highlightCanvas.style.left = "#{@mainCanvas.offsetLeft}px" @@ -1154,8 +1138,8 @@ hook 'mousemove', 1, (point, event, state) -> draggingBlockView = @dragView.getViewNodeFor @draggingBlock draggingBlockView.layout 1, 1 - @dragCanvas.width = Math.min draggingBlockView.totalBounds.width + 10, window.screen.width - @dragCanvas.height = Math.min draggingBlockView.totalBounds.height + 10, window.screen.height + @dragCanvas.style.width = "#{Math.min draggingBlockView.totalBounds.width + 10, window.screen.width}px" + @dragCanvas.style.height = "#{Math.min draggingBlockView.totalBounds.height + 10, window.screen.height}px" draggingBlockView.drawShadow @dragCtx, 5, 5 draggingBlockView.draw @dragCtx, new @draw.Rectangle 0, 0, @dragCanvas.width, @dragCanvas.height @@ -1627,17 +1611,21 @@ hook 'mousedown', 6, (point, event, state) -> # If someone else has already taken this click, pass. if state.consumedHitTest then return + console.log 'got this' + # If it's not in the palette pane, pass. if not @trackerPointIsInPalette(point) then return palettePoint = @trackerPointToPalette point - if @scrollOffsets.palette.y < palettePoint.y < @scrollOffsets.palette.y + @paletteCanvas.height and - @scrollOffsets.palette.x < palettePoint.x < @scrollOffsets.palette.x + @paletteCanvas.width + if @scrollOffsets.palette.y < palettePoint.y < @scrollOffsets.palette.y + @paletteCanvas.offsetHeight and + @scrollOffsets.palette.x < palettePoint.x < @scrollOffsets.palette.x + @paletteCanvas.offsetWidth + console.log 'ok to test' for entry in @currentPaletteBlocks hitTestResult = @hitTest palettePoint, entry.block, @paletteView if hitTestResult? + console.log 'got it' @clickedBlock = entry.block @clickedPoint = point @clickedBlockPaletteEntry = entry @@ -1650,9 +1638,8 @@ hook 'mousedown', 6, (point, event, state) -> # PALETTE HIGHLIGHT CODE # ================================ hook 'populate', 1, -> - @paletteHighlightCanvas = document.createElement 'canvas' - @paletteHighlightCanvas.className = 'droplet-palette-highlight-canvas' - @paletteHighlightCtx = @paletteHighlightCanvas.getContext '2d' + @paletteHighlightCanvas = @paletteHighlightCtx = document.createElementNS SVG_STANDARD, 'svg' + @paletteHighlightCanvas.setAttribute 'class', 'droplet-palette-highlight-canvas' @paletteHighlightPath = null @currentHighlightedPaletteBlock = null @@ -1661,8 +1648,8 @@ hook 'populate', 1, -> Editor::resizePaletteHighlight = -> @paletteHighlightCanvas.style.top = @paletteHeader.offsetHeight + 'px' - @paletteHighlightCanvas.width = @paletteCanvas.width - @paletteHighlightCanvas.height = @paletteCanvas.height + @paletteHighlightCanvas.style.width = "#{@paletteCanvas.width}px" + @paletteHighlightCanvas.style.height = "#{@paletteCanvas.height}px" hook 'redraw_palette', 0, -> @clearPaletteHighlightCanvas() @@ -1691,7 +1678,6 @@ hook 'rebuild_palette', 1, -> # Clip boxes to the width of the palette to prevent x-scrolling. TODO: fix x-scrolling behaviour. hoverDiv.style.width = "#{Math.min(bounds.width, Infinity)}px" - hoverDiv.style.height = "#{bounds.height}px" do (block) => hoverDiv.addEventListener 'mousemove', (event) => @@ -1860,26 +1846,30 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> lines = @getCursor().stringify().split '\n' startPosition = textFocusView.bounds[startRow].x + @view.opts.textPadding + - @mainCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionStart].split('\n'))).width + + @measureCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionStart].split('\n'))).width + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) endPosition = textFocusView.bounds[endRow].x + @view.opts.textPadding + - @mainCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionEnd].split('\n'))).width + + @measureCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionEnd].split('\n'))).width + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) # Now draw the highlight/typing cursor # # Draw a line if it is just a cursor if @hiddenInput.selectionStart is @hiddenInput.selectionEnd + ### TODO @cursorCtx.lineWidth = 1 @cursorCtx.strokeStyle = '#000' @cursorCtx.strokeRect startPosition, textFocusView.bounds[startRow].y, 0, @view.opts.textHeight @textInputHighlighted = false + ### + 0 # Draw a translucent rectangle if there is a selection. else @textInputHighlighted = true + ###TODO @cursorCtx.fillStyle = 'rgba(0, 0, 256, 0.3)' if startRow is endRow @@ -1901,6 +1891,7 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> textFocusView.bounds[endRow].y + @view.opts.textPadding, endPosition - textFocusView.bounds[endRow].x, @view.opts.textHeight + ### if scrollIntoView and endPosition > @scrollOffsets.main.x + @mainCanvas.width @mainScroller.scrollLeft = endPosition - @mainCanvas.width + @view.opts.padding @@ -2052,7 +2043,7 @@ Editor::getTextPosition = (point) -> row = Math.max row, 0 row = Math.min row, textFocusView.lineLength - 1 - column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @mainCtx.measureText(' ').width) + column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @measureCtx.measureText(' ').width) lines = @getCursor().stringify().split('\n')[..row] lines[lines.length - 1] = lines[lines.length - 1][...column] @@ -2270,9 +2261,8 @@ hook 'mouseup', 0, (point, event, state) -> # with some fields. hook 'populate', 0, -> @lassoSelectCanvas = document.createElement 'canvas' - @lassoSelectCanvas.className = 'droplet-lasso-select-canvas' - @lassoSelectCtx = @lassoSelectCanvas.getContext '2d' + @lassoSelectCanvas.setAttribute 'class', 'droplet-lasso-select-canvas' @lassoSelectAnchor = null @lassoSelection = null @@ -2345,7 +2335,6 @@ hook 'mousemove', 0, (point, event, state) -> last = last.prev @clearLassoSelectCanvas(); @clearHighlightCanvas() - @lassoSelectCtx.strokeStyle = '#00f' @lassoSelectCtx.strokeRect lassoRectangle.x - @scrollOffsets.main.x, lassoRectangle.y - @scrollOffsets.main.y, @@ -2791,7 +2780,7 @@ Editor::computePlaintextTranslationVectors = -> translationVectors.push (new @draw.Point(state.x, state.y)).from(corner) textElements.push @view.getViewNodeFor head - state.x += @mainCtx.measureText(head.value).width + state.x += @measureCtx.measureText(head.value).width # Newline moves the cursor to the next line, # plus some indent. @@ -2803,9 +2792,9 @@ Editor::computePlaintextTranslationVectors = -> rownum += 1 state.y += state.lineHeight * wrappedlines if head.specialIndent? - state.x = state.leftEdge + @mainCtx.measureText(head.specialIndent).width + state.x = state.leftEdge + @measureCtx.measureText(head.specialIndent).width else - state.x = state.leftEdge + state.indent * @mainCtx.measureText(' ').width + state.x = state.leftEdge + state.indent * @measureCtx.measureText(' ').width when 'indentStart' state.indent += head.container.depth @@ -3238,14 +3227,12 @@ hook 'populate', 2, -> @scrollOffsets.main.y = @mainScroller.scrollTop @scrollOffsets.main.x = @mainScroller.scrollLeft - @mainCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y + @setScrollOffset @mainCtx, @scrollOffsets.main # Also update scroll for the highlight ctx, so that # they can match the blocks' positions - @highlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y - @cursorCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y - - @redrawMain() + @setScrollOffset @highlightCtx, @scrollOffsets.main + @setScrollOffset @cursorCtx, @scrollOffsets.main @paletteScroller = document.createElement 'div' @paletteScroller.className = 'droplet-palette-scroller' @@ -3263,8 +3250,8 @@ hook 'populate', 2, -> # when dragging blocks out of the palette. TODO: fix x-scrolling behaviour. # @scrollOffsets.palette.x = @paletteScroller.scrollLeft - @paletteCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y - @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y + @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})" + @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})" # redraw the bits of the palette @redrawPalette() @@ -3290,7 +3277,7 @@ hook 'redraw_main', 1, -> # jammed up against the edge of the screen. # # Default this extra space to fontSize (approx. 1 line). - @mainScrollerStuffing.style.height = "#{bounds.bottom() + + @mainCanvas.style.height = "#{bounds.bottom() + (@options.extraBottomHeight ? @fontSize)}px" hook 'redraw_palette', 0, -> @@ -3760,24 +3747,21 @@ hook 'populate', 0, -> # CURSOR DRAW SUPPORRT # ================================ hook 'populate', 0, -> - @cursorCanvas = document.createElement 'canvas' - @cursorCanvas.className = 'droplet-highlight-canvas droplet-cursor-canvas' - - @cursorCtx = @cursorCanvas.getContext '2d' + @cursorCanvas = @cursorCtx = document.createElementNS SVG_STANDARD, 'svg' + @cursorCanvas.setAttribute 'class', 'droplet-highlight-canvas droplet-cursor-canvas' @dropletElement.appendChild @cursorCanvas Editor::resizeCursorCanvas = -> - @cursorCanvas.width = @dropletElement.offsetWidth - @gutter.offsetWidth - @cursorCanvas.style.width = "#{@cursorCanvas.width}px" + @cursorCanvas.style.width = "#{@dropletElement.offsetWidth - @gutter.offsetWidth}px" - @cursorCanvas.height = @dropletElement.offsetHeight - @cursorCanvas.style.height = "#{@cursorCanvas.height}px" + @cursorCanvas.style.height = "#{@dropletElement.offsetHeight}px" @cursorCanvas.style.left = "#{@mainCanvas.offsetLeft}px" Editor::strokeCursor = (point) -> return unless point? + ### @cursorCtx.beginPath() @cursorCtx.fillStyle = @@ -3799,16 +3783,17 @@ Editor::strokeCursor = (point) -> @cursorCtx.arc arcCenter.x, arcCenter.y, (w*w + h*h) / (2 * h), startAngle, endAngle @cursorCtx.stroke() + ### Editor::highlightFlashShow = -> if @flashTimeout? then clearTimeout @flashTimeout - @cursorCanvas.style.display = 'block' + #@cursorCanvas.style.display = 'block' @highlightsCurrentlyShown = true @flashTimeout = setTimeout (=> @flash()), 500 Editor::highlightFlashHide = -> if @flashTimeout? then clearTimeout @flashTimeout - @cursorCanvas.style.display = 'none' + #@cursorCanvas.style.display = 'none' @highlightsCurrentlyShown = false @flashTimeout = setTimeout (=> @flash()), 500 diff --git a/src/draw.coffee b/src/draw.coffee index e82757dd..460a73de 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -61,10 +61,12 @@ getGuid = -> 'draw-guid-' + Math.random().toString() # For exports.Draw = class Draw ## Public functions constructor: -> - @ctx = document.createElement('canvas') + canvas = document.createElement('canvas') + @ctx = canvas.getContext '2d' @fontSize = 15 @fontFamily = 'Courier New, monospace' @fontAscent = 2 + @fontBaseline = 10 self = this @@ -205,7 +207,7 @@ exports.Draw = class Draw @style = { 'strokeColor': '#000' - 'lineWidth': 1 + 'lineWidth': 0 'fillColor': null } @@ -334,9 +336,9 @@ exports.Draw = class Draw clone.push el for el in @_points return clone - ### - # TODO drawShadow: (ctx, offsetX, offsetY, blur) -> + ### + # TODO @_clearCache() ctx.fillStyle = @style.fillColor @@ -366,7 +368,8 @@ exports.Draw = class Draw for own key, value of oldValues ctx[key] = value - ### + ### + 0 # ## Text ## # A Text element. Mainly this exists for computing bounding boxes, which is @@ -391,10 +394,15 @@ exports.Draw = class Draw draw: (ctx) -> element = document.createElementNS SVG_STANDARD, 'text' - element.setAttribute 'x', @point.x - element.setAttribute 'y', @point.y element.setAttribute 'fill', '#000' - element.setAttribute 'dominant-baseline', 'text-before-edge' + + # We use the alphabetic baseline and add the distance + # to base ourselves to avoid a chrome bug where text zooming + # doesn't work for non-alphabetic baselines + element.setAttribute 'x', @point.x + element.setAttribute 'y', @point.y + self.fontBaseline + element.setAttribute 'dominant-baseline', 'alphabetic' + element.setAttribute 'font-family', self.fontFamily element.setAttribute 'font-size', self.fontSize @@ -404,9 +412,9 @@ exports.Draw = class Draw ctx.appendChild element refreshFontCapital: -> - @fontAscent = helper.fontMetrics(@fontFamily, @fontSize).prettytop - - setCtx: (ctx) -> @ctx = ctx + metrics = helper.fontMetrics(@fontFamily, @fontSize) + @fontAscent = metrics.prettytop + @fontBaseline = metrics.baseline setGlobalFontSize: (size) -> @fontSize = size diff --git a/src/view.coffee b/src/view.coffee index 8ccea5b9..2747a5eb 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -106,9 +106,6 @@ exports.View = class View unless option of @opts @opts[option] = DEFAULT_OPTIONS[option] - # Do our measurement hack - @draw.setCtx @opts.ctx - # Simple method for clearing caches clearCache: -> @map = {} @@ -711,7 +708,7 @@ exports.View = class View draw: (ctx, boundingRect, style = {}) -> # First, test to see whether our AABB overlaps # with the viewport - if @totalBounds.overlap boundingRect + if not boundingRect? or @totalBounds.overlap boundingRect # If it does, we want to render. # Call `@drawSelf` @drawSelf ctx, style @@ -1841,7 +1838,6 @@ exports.View = class View # Make ourselves white, with a # gray border. @path.style.fillColor = '#FFF' - @path.style.strokeColor = '#FFF' return @path @@ -1849,12 +1845,15 @@ exports.View = class View drawSelf: (ctx) -> super if @model.hasDropdown() and @view.opts.showDropdowns + ### ctx.beginPath() ctx.fillStyle = DROP_TRIANGLE_COLOR ctx.moveTo @bounds[0].x + helper.DROPDOWN_ARROW_PADDING, @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2 ctx.lineTo @bounds[0].x + helper.DROPDOWN_ARROW_WIDTH - helper.DROPDOWN_ARROW_PADDING, @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2 ctx.lineTo @bounds[0].x + helper.DROPDOWN_ARROW_WIDTH / 2, @bounds[0].y + (@bounds[0].height + DROPDOWN_ARROW_HEIGHT) / 2 ctx.fill() + ### + 0 # ## computeOwnDropArea (SocketViewNode) # Socket drop areas are actually the same From 595a84d3959d5f0e876cf5a96231e164431a1c0d Mon Sep 17 00:00:00 2001 From: Anthony Bau Date: Mon, 13 Jul 2015 16:05:42 -0400 Subject: [PATCH 003/268] Fix up performance and scrolling --- src/controller.coffee | 33 ++++++++++++------------ src/draw.coffee | 58 ++++++++++++++++++++++++++++++++++++++++--- src/view.coffee | 12 ++++----- 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 951aa72f..21327593 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -162,8 +162,6 @@ exports.Editor = class Editor @mainCanvas.setAttribute 'class', 'droplet-main-canvas' @mainCanvas.setAttribute 'shape-rendering', 'optimizeSpeed' - @dropletElement.appendChild @mainCanvas - @paletteWrapper = document.createElement 'div' @paletteWrapper.className = 'droplet-palette-wrapper' @@ -335,13 +333,11 @@ exports.Editor = class Editor @resizeGutter() - @mainCanvas.style.height = "#{@dropletElement.offsetHeight}px" - @mainCanvas.style.width = "#{@dropletElement.offsetWidth - @gutter.offsetWidth}px" + @mainCanvas.setAttribute 'width', @dropletElement.offsetWidth - @gutter.offsetWidth @mainCanvas.style.left = "#{@gutter.offsetWidth}px" @transitionContainer.style.left = "#{@gutter.offsetWidth}px" - @resizePalette() @resizePaletteHighlight() @resizeNubby() @@ -363,7 +359,8 @@ exports.Editor = class Editor @setScrollOffset @cursorCtx, @scrollOffsets.main setScrollOffset: (canvas, offset) -> - canvas.setAttribute 'viewBox', "#{offset.x}, #{offset.y}, #{canvas.offsetWidth}, #{canvas.offsetHeight}" + #canvas.setAttribute 'viewBox', "#{offset.x}, #{offset.y}, #{canvas.offsetWidth}, #{canvas.offsetHeight}" + 0 resizePalette: -> @paletteCanvas.style.top = "#{@paletteHeader.offsetHeight}px" @@ -932,7 +929,7 @@ hook 'populate', 0, -> @draggingBlock = null @draggingOffset = null - @lastHighlight = null + @lastHighlight = @lastHighlightPath = null # We will also have to initialize the # drag canvas. @@ -1296,9 +1293,12 @@ hook 'mousemove', 0, (point, event, state) -> # TODO if this becomes a performance issue, # pull the drop highlights out into a new canvas. @redrawHighlights() + if @lastHighlightPath? + @mainCtx.removeChild @lastHighlightPath + @lastHighlightPath = null if best? - @view.getViewNodeFor(best).highlightArea.draw @highlightCtx + @lastHighlightPath = @view.getViewNodeFor(best).highlightArea.draw @mainCtx @maskFloatingPaths(best.getDocument()) @lastHighlight = best @@ -1474,7 +1474,7 @@ hook 'mouseup', 0, (point, event, state) -> # Now that we've done that, we can annul stuff. @draggingBlock = null @draggingOffset = null - @lastHighlight = null + @lastHighlight = @lastHighlightPath = null @clearDrag() @redrawMain() @@ -3216,7 +3216,7 @@ hook 'populate', 2, -> @mainScrollerStuffing = document.createElement 'div' @mainScrollerStuffing.className = 'droplet-main-scroller-stuffing' - @mainScroller.appendChild @mainScrollerStuffing + @mainScroller.appendChild @mainCanvas @dropletElement.appendChild @mainScroller # Prevent scrolling on wrapper element @@ -3270,15 +3270,16 @@ hook 'redraw_main', 1, -> for record in @floatingBlocks bounds.unite @view.getViewNodeFor(record.block).getBounds() - @mainScrollerStuffing.style.width = "#{bounds.right()}px" - # We add some extra height to the bottom # of the document so that the last block isn't # jammed up against the edge of the screen. # # Default this extra space to fontSize (approx. 1 line). - @mainCanvas.style.height = "#{bounds.bottom() + - (@options.extraBottomHeight ? @fontSize)}px" + height = bounds.bottom() + + (@options.extraBottomHeight ? @fontSize) + + @mainCanvas.setAttribute 'height', height + @mainCanvas.style.height = "#{height}px" hook 'redraw_palette', 0, -> bounds = new @draw.NoRectangle() @@ -3633,7 +3634,7 @@ Editor::endDrag = -> @draggingBlock = null @draggingOffset = null - @lastHighlight = null + @lastHighlight = @lastHighlightPath = null @clearDrag() @redrawMain() @@ -3943,7 +3944,7 @@ Editor::resizeGutter = -> @gutter.style.width = @lastGutterWidth + 'px' return @resize() @gutter.style.height = "#{Math.max(@dropletElement.offsetHeight, - @mainScrollerStuffing.offsetHeight)}px" + @mainCanvas.offsetHeight)}px" Editor::addLineNumberForLine = (line) -> treeView = @view.getViewNodeFor @tree diff --git a/src/draw.coffee b/src/draw.coffee index 460a73de..d2736f6e 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -5,6 +5,7 @@ ## Private (convenience) functions SVG_STANDARD = 'http://www.w3.org/2000/svg' +BEVEL_SIZE = 1.5 helper = require './helper.coffee' @@ -322,15 +323,66 @@ exports.Draw = class Draw pathElement.setAttribute 'd', pathCommands.join ' ' - ctx.appendChild pathElement - if @bevel - pathElement.setAttribute 'filter', 'url(#droplet-path-bevel)' + backgroundPathElement = pathElement + foregroundPathElement = document.createElementNS SVG_STANDARD, 'path' + foregroundPathElement.setAttribute 'd', pathCommands.join ' ' + foregroundPathElement.setAttribute 'fill', @style.fillColor + container = document.createElementNS SVG_STANDARD, 'g' + pathElement = document.createElementNS SVG_STANDARD, 'g' + + bigClipPath = document.createElementNS SVG_STANDARD, 'clipPath' + bigClipPathElement = document.createElementNS SVG_STANDARD, 'path' + bigClipPathElement.setAttribute 'd', pathCommands.join ' ' + bigClipPath.appendChild bigClipPathElement + bigClipPath.setAttribute 'id', clipId = 'droplet-clip-path-' + Math.random() + container.appendChild bigClipPath + + littleClipPathA = document.createElementNS SVG_STANDARD, 'clipPath' + littleClipPathAElement = document.createElementNS SVG_STANDARD, 'path' + littleClipPathAElement.setAttribute 'd', pathCommands.join ' ' + littleClipPathAElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" + littleClipPathA.appendChild littleClipPathAElement + littleClipPathA.setAttribute 'id', littleClipAId = 'droplet-clip-path-' + Math.random() + container.appendChild littleClipPathA + + littleClipPath = document.createElementNS SVG_STANDARD, 'clipPath' + littleClipPath.setAttribute 'clip-path', "url(##{littleClipAId})" + littleClipPathElement = document.createElementNS SVG_STANDARD, 'path' + littleClipPathElement.setAttribute 'd', pathCommands.join ' ' + littleClipPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" + littleClipPath.appendChild littleClipPathElement + littleClipPath.setAttribute 'id', littleClipId = 'droplet-clip-path-' + Math.random() + container.appendChild littleClipPath + + pathElement.setAttribute 'clip-path', "url(##{clipId})" + foregroundPathElement.setAttribute 'clip-path', "url(##{littleClipId})" + + darkPathElement = document.createElementNS SVG_STANDARD, 'path' + darkPathElement.setAttribute 'd', pathCommands.join ' ' + darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.5, '#888' + darkPathElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" + + lightPathElement = document.createElementNS SVG_STANDARD, 'path' + lightPathElement.setAttribute 'd', pathCommands.join ' ' + lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.5, '#FFF' + lightPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" + + pathElement.appendChild backgroundPathElement + pathElement.appendChild darkPathElement + pathElement.appendChild lightPathElement + pathElement.appendChild foregroundPathElement + container.appendChild pathElement + + pathElement = container else pathElement.setAttribute 'stroke', @style.strokeColor pathElement.setAttribute 'stroke-width', @style.lineWidth + ctx.appendChild pathElement + return pathElement + clone: -> clone = new Path() clone.push el for el in @_points diff --git a/src/view.coffee b/src/view.coffee index 2747a5eb..6e4d5e16 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -711,13 +711,13 @@ exports.View = class View if not boundingRect? or @totalBounds.overlap boundingRect # If it does, we want to render. # Call `@drawSelf` - @drawSelf ctx, style + drawSelfResult = @drawSelf ctx, style # Draw our children. for childObj in @children @view.getViewNodeFor(childObj.child).draw ctx, boundingRect, style - return null + return drawSelfResult # ## drawShadow (GenericViewNode) # Draw the shadow of our path @@ -1649,13 +1649,13 @@ exports.View = class View @path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F' @path.style.strokeColor = avgColor @path.style.strokeColor, 0.7, '#00F' - @path.draw ctx + drawResult = @path.draw ctx # Unset all the things we changed @path.style.fillColor = oldFill @path.style.strokeColor = oldStroke - return null + return drawResult # # BlockViewNode class BlockViewNode extends ContainerViewNode @@ -2068,8 +2068,8 @@ exports.View = class View # Draw the text element itself. drawSelf: (ctx, style = {}) -> unless style.noText - @textElement.draw ctx - return null + drawResult = @textElement.draw ctx + return drawResult # ## Debug output From 852c64e3aad2b9b7cda767f5c7d3c641e48ccdd4 Mon Sep 17 00:00:00 2001 From: Anthony Bau Date: Tue, 14 Jul 2015 00:11:37 -0400 Subject: [PATCH 004/268] Some attempts at performance, and align text --- src/controller.coffee | 173 ++++++++++++++++++------------------------ src/draw.coffee | 8 +- src/main.coffee | 1 + 3 files changed, 79 insertions(+), 103 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 21327593..6c6c16b3 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -98,7 +98,8 @@ EMBOSS_FILTER_SVG = """ """ clearCanvas = (canvas) -> - canvas.innerHTML = '' + while canvas.lastChild? + canvas.removeChild canvas.lastChild # This hook function is for convenience, # for features to add events that will occur at @@ -158,7 +159,11 @@ exports.Editor = class Editor @measureCtx = @measureCanvas.getContext '2d' # Main canvas first - @mainCanvas = @mainCtx = document.createElementNS SVG_STANDARD, 'svg' + @mainCanvas = document.createElementNS SVG_STANDARD, 'svg' + @mainCtxWrapper = document.createElementNS SVG_STANDARD, 'g' + @mainCtx = document.createElementNS SVG_STANDARD, 'g' + @mainCanvas.appendChild @mainCtxWrapper + @mainCtxWrapper.appendChild @mainCtx @mainCanvas.setAttribute 'class', 'droplet-main-canvas' @mainCanvas.setAttribute 'shape-rendering', 'optimizeSpeed' @@ -342,8 +347,6 @@ exports.Editor = class Editor @resizePaletteHighlight() @resizeNubby() @resizeMainScroller() - @resizeLassoCanvas() - @resizeCursorCanvas() @resizeDragCanvas() # Re-scroll and redraw main @@ -392,7 +395,10 @@ exports.Editor = class Editor # # Redrawing simply involves issuing a call to the View. -Editor::clearMain = (opts) -> clearCanvas @mainCtx +Editor::clearMain = (opts) -> + @mainCtxWrapper.removeChild @mainCtx + @mainCtx = document.createElementNS SVG_STANDARD, 'g' + @mainCtxWrapper.appendChild @mainCtx Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> @nubbyHeight = Math.max(0, height); @nubbyColor = color @@ -447,8 +453,8 @@ Editor::redrawMain = (opts = {}) -> @mainCtx.globalAlpha *= FLOATING_BLOCK_ALPHA # Draw floating blocks - startWidth = @measureCtx.measureText(@mode.startComment).width - endWidth = @measureCtx.measureText(@mode.endComment).width + startWidth = @mode.startComment.length * @fontWidth + endWidth = @mode.endComment.length * @fontWidth for record in @floatingBlocks blockView = @view.getViewNodeFor record.block blockView.layout record.position.x, record.position.y @@ -660,8 +666,8 @@ Editor::trackerPointToMain = (point) -> if not @mainCanvas.offsetParent? return new @draw.Point(NaN, NaN) gbr = @mainCanvas.getBoundingClientRect() - new @draw.Point(point.x - gbr.left + @scrollOffsets.main.x, - point.y - gbr.top + @scrollOffsets.main.y) + new @draw.Point(point.x - gbr.left + point.y - gbr.top) Editor::trackerPointToPalette = (point) -> if not @paletteCanvas.offsetParent? @@ -940,15 +946,14 @@ hook 'populate', 0, -> @dragCanvas.style.top = '-9999px' # And the canvas for drawing highlights - @highlightCanvas = @highlightCtx = document.createElementNS SVG_STANDARD, 'svg' - @highlightCanvas.setAttribute 'class', 'droplet-highlight-canvas' + @highlightCanvas = @highlightCtx = document.createElementNS SVG_STANDARD, 'g' # We append it to the tracker element, # so that it can appear in front of the scrollers. #@dropletElement.appendChild @dragCanvas #document.body.appendChild @dragCanvas @wrapperElement.appendChild @dragCanvas - @dropletElement.appendChild @highlightCanvas + @mainCanvas.appendChild @highlightCanvas Editor::clearHighlightCanvas = -> clearCanvas @highlightCtx @@ -1293,12 +1298,9 @@ hook 'mousemove', 0, (point, event, state) -> # TODO if this becomes a performance issue, # pull the drop highlights out into a new canvas. @redrawHighlights() - if @lastHighlightPath? - @mainCtx.removeChild @lastHighlightPath - @lastHighlightPath = null if best? - @lastHighlightPath = @view.getViewNodeFor(best).highlightArea.draw @mainCtx + @view.getViewNodeFor(best).highlightArea.draw @highlightCtx @maskFloatingPaths(best.getDocument()) @lastHighlight = best @@ -1846,52 +1848,57 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> lines = @getCursor().stringify().split '\n' startPosition = textFocusView.bounds[startRow].x + @view.opts.textPadding + - @measureCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionStart].split('\n'))).width + + @fontWidth * last_(@getCursor().stringify()[...@hiddenInput.selectionStart].split('\n')).length + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) endPosition = textFocusView.bounds[endRow].x + @view.opts.textPadding + - @measureCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionEnd].split('\n'))).width + + @fontWidth * last_(@getCursor().stringify()[...@hiddenInput.selectionEnd].split('\n')).length + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) # Now draw the highlight/typing cursor # # Draw a line if it is just a cursor if @hiddenInput.selectionStart is @hiddenInput.selectionEnd - ### TODO - @cursorCtx.lineWidth = 1 - @cursorCtx.strokeStyle = '#000' - @cursorCtx.strokeRect startPosition, textFocusView.bounds[startRow].y, - 0, @view.opts.textHeight + @mainCanvas.appendChild @cursorRect + @cursorRect.setAttribute 'stroke', '#000' + @cursorRect.setAttribute 'x', startPosition + @cursorRect.setAttribute 'y', textFocusView.bounds[startRow].y, + @cursorRect.setAttribute 'width', 1 + @cursorRect.setAttribute 'height', @view.opts.textHeight + @textInputHighlighted = false - ### - 0 # Draw a translucent rectangle if there is a selection. else @textInputHighlighted = true - ###TODO - @cursorCtx.fillStyle = 'rgba(0, 0, 256, 0.3)' if startRow is endRow - @cursorCtx.fillRect startPosition, + rect = new @view.draw.Rectangle startPosition, textFocusView.bounds[startRow].y + @view.opts.textPadding endPosition - startPosition, @view.opts.textHeight else - @cursorCtx.fillRect startPosition, textFocusView.bounds[startRow].y + @view.opts.textPadding + + rect = new @view.draw.Rectangle startPosition, textFocusView.bounds[startRow].y + @view.opts.textPadding + textFocusView.bounds[startRow].right() - @view.opts.textPadding - startPosition, @view.opts.textHeight for i in [startRow + 1...endRow] - @cursorCtx.fillRect textFocusView.bounds[i].x, + rect = new @view.draw.Rectangle textFocusView.bounds[i].x, textFocusView.bounds[i].y + @view.opts.textPadding, textFocusView.bounds[i].width, @view.opts.textHeight - @cursorCtx.fillRect textFocusView.bounds[endRow].x, + rect = new @view.draw.Rectangle textFocusView.bounds[endRow].x, textFocusView.bounds[endRow].y + @view.opts.textPadding, endPosition - textFocusView.bounds[endRow].x, @view.opts.textHeight - ### + + @mainCanvas.appendChild @cursorRect + @cursorRect.setAttribute 'stroke', 'none' + @cursorRect.setAttribute 'fill', 'rgba(0, 0, 256, 0.3)' + @cursorRect.setAttribute 'x', rect.x + @cursorRect.setAttribute 'y', rect.y + @cursorRect.setAttribute 'width', rect.width + @cursorRect.setAttribute 'height', rect.height if scrollIntoView and endPosition > @scrollOffsets.main.x + @mainCanvas.width @mainScroller.scrollLeft = endPosition - @mainCanvas.width + @view.opts.padding @@ -2043,7 +2050,7 @@ Editor::getTextPosition = (point) -> row = Math.max row, 0 row = Math.min row, textFocusView.lineLength - 1 - column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @measureCtx.measureText(' ').width) + column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @fontWidth) lines = @getCursor().stringify().split('\n')[..row] lines[lines.length - 1] = lines[lines.length - 1][...column] @@ -2260,30 +2267,14 @@ hook 'mouseup', 0, (point, event, state) -> # to be added at populate-time, along # with some fields. hook 'populate', 0, -> - @lassoSelectCanvas = document.createElement 'canvas' - @lassoSelectCtx = @lassoSelectCanvas.getContext '2d' - @lassoSelectCanvas.setAttribute 'class', 'droplet-lasso-select-canvas' + @lassoSelectRect = document.createElementNS SVG_STANDARD, 'rect' + @lassoSelectRect.setAttribute 'stroke', '#00f' + @lassoSelectRect.setAttribute 'fill', 'none' @lassoSelectAnchor = null @lassoSelection = null - @dropletElement.appendChild @lassoSelectCanvas - -# Conveneince function for clearing -# the lasso select canvas -Editor::clearLassoSelectCanvas = -> - @lassoSelectCtx.clearRect 0, 0, @lassoSelectCanvas.width, @lassoSelectCanvas.height - -# Deal with resize for the lasso -# select canvas -Editor::resizeLassoCanvas = -> - @lassoSelectCanvas.width = @dropletElement.offsetWidth - @gutter.offsetWidth - @lassoSelectCanvas.style.width = "#{@lassoSelectCanvas.width}px" - - @lassoSelectCanvas.height = @dropletElement.offsetHeight - @lassoSelectCanvas.style.height = "#{@lassoSelectCanvas.height}px" - - @lassoSelectCanvas.style.left = "#{@mainCanvas.offsetLeft}px" + @mainCanvas.appendChild @lassoSelectRect Editor::clearLassoSelection = -> @lassoSelection = null @@ -2316,8 +2307,6 @@ hook 'mousemove', 0, (point, event, state) -> if @lassoSelectAnchor? mainPoint = @trackerPointToMain point - @clearLassoSelectCanvas() - lassoRectangle = new @draw.Rectangle( Math.min(@lassoSelectAnchor.x, mainPoint.x), Math.min(@lassoSelectAnchor.y, mainPoint.y), @@ -2334,12 +2323,13 @@ hook 'mousemove', 0, (point, event, state) -> until (not last?) or last.type is 'blockEnd' and @view.getViewNodeFor(last.container).path.intersects lassoRectangle last = last.prev - @clearLassoSelectCanvas(); @clearHighlightCanvas() - @lassoSelectCtx.strokeStyle = '#00f' - @lassoSelectCtx.strokeRect lassoRectangle.x - @scrollOffsets.main.x, - lassoRectangle.y - @scrollOffsets.main.y, - lassoRectangle.width, - lassoRectangle.height + @clearHighlightCanvas() + @mainCanvas.appendChild @lassoSelectRect + @lassoSelectRect.style.display = 'block' + @lassoSelectRect.setAttribute 'x', lassoRectangle.x + @lassoSelectRect.setAttribute 'y', lassoRectangle.y + @lassoSelectRect.setAttribute 'width', lassoRectangle.width + @lassoSelectRect.setAttribute 'height', lassoRectangle.height if first and last? [first, last] = validateLassoSelection dropletDocument, first, last @@ -2421,7 +2411,7 @@ hook 'mouseup', 0, (point, event, state) -> @setCursor @lassoSelection.end @lassoSelectAnchor = null - @clearLassoSelectCanvas() + @lassoSelectRect.style.display = 'none' @redrawMain() @lassoSelectionDocument = null @@ -2766,7 +2756,7 @@ Editor::computePlaintextTranslationVectors = -> @gutter.offsetWidth + 5 # TODO see above } - @mainCtx.font = @aceFontSize() + ' ' + @fontFamily + @measureCtx.font = @aceFontSize() + ' ' + @fontFamily rownum = 0 until head is @tree.end @@ -2780,7 +2770,7 @@ Editor::computePlaintextTranslationVectors = -> translationVectors.push (new @draw.Point(state.x, state.y)).from(corner) textElements.push @view.getViewNodeFor head - state.x += @measureCtx.measureText(head.value).width + state.x += @fontWidth * head.value.length # Newline moves the cursor to the next line, # plus some indent. @@ -2792,9 +2782,9 @@ Editor::computePlaintextTranslationVectors = -> rownum += 1 state.y += state.lineHeight * wrappedlines if head.specialIndent? - state.x = state.leftEdge + @measureCtx.measureText(head.specialIndent).width + state.x = state.leftEdge + @fontWidth * head.specialIndent.length else - state.x = state.leftEdge + state.indent * @measureCtx.measureText(' ').width + state.x = state.leftEdge + state.indent * @fontWidth when 'indentStart' state.indent += head.container.depth @@ -2912,13 +2902,9 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - # Kick off fade-out transition - @mainCanvas.style.transition = - @highlightCanvas.style.transition = - @cursorCanvas.style.opacity = "opacity #{fadeTime}ms linear" + @mainCanvas.style.transition = "opacity #{fadeTime}ms linear" - @mainCanvas.style.opacity = - @highlightCanvas.style.opacity = - @cursorCanvas.style.opacity = 0 + @mainCanvas.style.opacity = 0 paletteDisappearingWithMelt = @paletteEnabled and not @showPaletteInTextMode @@ -3092,20 +3078,11 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- div.style.fontSize = @fontSize + 'px' ), 0 - for el in [@mainCanvas, @highlightCanvas, @cursorCanvas] - el.style.opacity = 0 + @mainCanvas.style.opacity = 0 setTimeout (=> - for el in [@mainCanvas, @highlightCanvas, @cursorCanvas] - el.style.transition = "opacity #{fadeTime}ms linear" + @mainCanvas.style.transition = "opacity #{fadeTime}ms linear" @mainCanvas.style.opacity = 1 - @highlightCanvas.style.opacity = 1 - - if @editorHasFocus() - @cursorCanvas.style.opacity = 1 - else - @cursorCanvas.style.opacity = CURSOR_UNFOCUSED_OPACITY - ), translateTime @dropletElement.style.transition = "left #{fadeTime}ms" @@ -3296,6 +3273,8 @@ hook 'redraw_palette', 0, -> hook 'populate', 0, -> @fontSize = 15 @fontFamily = 'Courier New' + @measureCtx.font = '15px Courier New' + @fontWidth = @measureCtx.measureText(' ').width metrics = helper.fontMetrics(@fontFamily, @fontSize) @fontAscent = metrics.prettytop @@ -3303,6 +3282,8 @@ hook 'populate', 0, -> Editor::setFontSize_raw = (fontSize) -> unless @fontSize is fontSize + @measureCtx.font = fontSize + ' px ' + @fontFamily + @fontWidth = @measureCtx.measureText(' ').width @fontSize = fontSize @paletteHeader.style.fontSize = "#{fontSize}px" @@ -3326,6 +3307,7 @@ Editor::setFontSize_raw = (fontSize) -> @rebuildPalette() Editor::setFontFamily = (fontFamily) -> + @measureCtx.font = @fontSize + 'px ' + fontFamily @draw.setGlobalFontFamily fontFamily @fontFamily = fontFamily @@ -3748,17 +3730,11 @@ hook 'populate', 0, -> # CURSOR DRAW SUPPORRT # ================================ hook 'populate', 0, -> - @cursorCanvas = @cursorCtx = document.createElementNS SVG_STANDARD, 'svg' - @cursorCanvas.setAttribute 'class', 'droplet-highlight-canvas droplet-cursor-canvas' - - @dropletElement.appendChild @cursorCanvas - -Editor::resizeCursorCanvas = -> - @cursorCanvas.style.width = "#{@dropletElement.offsetWidth - @gutter.offsetWidth}px" - - @cursorCanvas.style.height = "#{@dropletElement.offsetHeight}px" + @cursorCtx = document.createElementNS SVG_STANDARD, 'g' + @cursorRect = document.createElementNS SVG_STANDARD, 'rect' - @cursorCanvas.style.left = "#{@mainCanvas.offsetLeft}px" + @mainCanvas.appendChild @cursorCtx + @mainCanvas.appendChild @cursorRect Editor::strokeCursor = (point) -> return unless point? @@ -3788,13 +3764,13 @@ Editor::strokeCursor = (point) -> Editor::highlightFlashShow = -> if @flashTimeout? then clearTimeout @flashTimeout - #@cursorCanvas.style.display = 'block' + @cursorCtx.style.display = 'block' @highlightsCurrentlyShown = true @flashTimeout = setTimeout (=> @flash()), 500 Editor::highlightFlashHide = -> if @flashTimeout? then clearTimeout @flashTimeout - #@cursorCanvas.style.display = 'none' + @cursorCtx.style.display = 'none' @highlightsCurrentlyShown = false @flashTimeout = setTimeout (=> @flash()), 500 @@ -3816,8 +3792,7 @@ hook 'populate', 0, -> blurCursors = => @highlightFlashShow() - @cursorCanvas.style.transition = '' - @cursorCanvas.style.opacity = CURSOR_UNFOCUSED_OPACITY + @cursorCtx.style.opacity = CURSOR_UNFOCUSED_OPACITY @dropletElement.addEventListener 'blur', blurCursors @hiddenInput.addEventListener 'blur', blurCursors @@ -3825,8 +3800,8 @@ hook 'populate', 0, -> focusCursors = => @highlightFlashShow() - @cursorCanvas.style.transition = '' - @cursorCanvas.style.opacity = 1 + @cursorCtx.style.transition = '' + @cursorCtx.style.opacity = 1 @dropletElement.addEventListener 'focus', focusCursors @hiddenInput.addEventListener 'focus', focusCursors diff --git a/src/draw.coffee b/src/draw.coffee index d2736f6e..c52ff708 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -67,7 +67,7 @@ exports.Draw = class Draw @fontSize = 15 @fontFamily = 'Courier New, monospace' @fontAscent = 2 - @fontBaseline = 10 + @fontBaseline = 8 self = this @@ -360,12 +360,12 @@ exports.Draw = class Draw darkPathElement = document.createElementNS SVG_STANDARD, 'path' darkPathElement.setAttribute 'd', pathCommands.join ' ' - darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.5, '#888' + darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000' darkPathElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" lightPathElement = document.createElementNS SVG_STANDARD, 'path' lightPathElement.setAttribute 'd', pathCommands.join ' ' - lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.5, '#FFF' + lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF' lightPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" pathElement.appendChild backgroundPathElement @@ -452,7 +452,7 @@ exports.Draw = class Draw # to base ourselves to avoid a chrome bug where text zooming # doesn't work for non-alphabetic baselines element.setAttribute 'x', @point.x - element.setAttribute 'y', @point.y + self.fontBaseline + element.setAttribute 'y', @point.y + self.fontBaseline - self.fontAscent element.setAttribute 'dominant-baseline', 'alphabetic' element.setAttribute 'font-family', self.fontFamily diff --git a/src/main.coffee b/src/main.coffee index ccad653b..9d50eb3d 100644 --- a/src/main.coffee +++ b/src/main.coffee @@ -1,3 +1,4 @@ module.exports = { Editor: require('./controller.coffee').Editor + helper: require './helper.coffee' } From d0f5db4e8c56fdda8ed9465a26e3db5f6b3d503b Mon Sep 17 00:00:00 2001 From: Anthony Bau Date: Wed, 15 Jul 2015 18:45:32 -0400 Subject: [PATCH 005/268] Simple caching for svg performance --- src/controller.coffee | 36 ++++++------- src/draw.coffee | 36 +++++++++---- src/helper.coffee | 3 ++ src/languages/python.coffee | 2 +- src/view.coffee | 104 +++++++++++++++++++++++++++++++----- 5 files changed, 139 insertions(+), 42 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 6c6c16b3..d8595688 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -97,10 +97,6 @@ EMBOSS_FILTER_SVG = """ """ -clearCanvas = (canvas) -> - while canvas.lastChild? - canvas.removeChild canvas.lastChild - # This hook function is for convenience, # for features to add events that will occur at # various times in the editor lifecycle. @@ -385,6 +381,9 @@ exports.Editor = class Editor else @resizeTextMode() +Editor::clearCanvas = (canvas) -> + @view.clearCanvas canvas + # RENDERING CAPABILITIES # ================================ @@ -396,9 +395,6 @@ exports.Editor = class Editor # Redrawing simply involves issuing a call to the View. Editor::clearMain = (opts) -> - @mainCtxWrapper.removeChild @mainCtx - @mainCtx = document.createElementNS SVG_STANDARD, 'g' - @mainCtxWrapper.appendChild @mainCtx Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> @nubbyHeight = Math.max(0, height); @nubbyColor = color @@ -450,8 +446,6 @@ Editor::redrawMain = (opts = {}) -> layoutResult = @view.getViewNodeFor(@tree).layout 0, @nubbyHeight @view.getViewNodeFor(@tree).draw @mainCtx, rect, options - @mainCtx.globalAlpha *= FLOATING_BLOCK_ALPHA - # Draw floating blocks startWidth = @mode.startComment.length * @fontWidth endWidth = @mode.endComment.length * @fontWidth @@ -588,7 +582,7 @@ Editor::redrawHighlights = -> @redrawCursors() @redrawLassoHighlight() -Editor::clearCursorCanvas = -> clearCanvas @cursorCtx +Editor::clearCursorCanvas = -> @clearCanvas @cursorCtx Editor::redrawCursors = -> @clearCursorCanvas() @@ -601,9 +595,9 @@ Editor::redrawCursors = -> Editor::drawCursor = -> @strokeCursor @determineCursorPosition() -Editor::clearPalette = -> clearCanvas @paletteCtx +Editor::clearPalette = -> @clearCanvas @paletteCtx -Editor::clearPaletteHighlightCanvas = -> clearCanvas @paletteHighlightCtx +Editor::clearPaletteHighlightCanvas = -> @clearCanvas @paletteHighlightCtx Editor::redrawPalette = -> @clearPalette() @@ -955,11 +949,13 @@ hook 'populate', 0, -> @wrapperElement.appendChild @dragCanvas @mainCanvas.appendChild @highlightCanvas -Editor::clearHighlightCanvas = -> clearCanvas @highlightCtx +Editor::clearHighlightCanvas = -> + @clearCanvas @highlightCtx + @cursorRect.style.display = 'none' # Utility function for clearing the drag canvas, # an operation we will be doing a lot. -Editor::clearDrag = -> clearCanvas @dragCtx +Editor::clearDrag = -> @dragView.clearCanvas @dragCtx # On resize, we will want to size the drag canvas correctly. Editor::resizeDragCanvas = -> @@ -1300,7 +1296,8 @@ hook 'mousemove', 0, (point, event, state) -> @redrawHighlights() if best? - @view.getViewNodeFor(best).highlightArea.draw @highlightCtx + @highlightCtx.removeChild(@lastHighlightPath) if @lastHighlightPath? + @lastHighlightPath = @view.getViewNodeFor(best).highlightArea.draw @highlightCtx @maskFloatingPaths(best.getDocument()) @lastHighlight = best @@ -1476,6 +1473,7 @@ hook 'mouseup', 0, (point, event, state) -> # Now that we've done that, we can annul stuff. @draggingBlock = null @draggingOffset = null + @highlightCtx.removeChild(@lastHighlightPath) if @lastHighlightPath? @lastHighlight = @lastHighlightPath = null @clearDrag() @@ -1613,21 +1611,16 @@ hook 'mousedown', 6, (point, event, state) -> # If someone else has already taken this click, pass. if state.consumedHitTest then return - console.log 'got this' - # If it's not in the palette pane, pass. if not @trackerPointIsInPalette(point) then return palettePoint = @trackerPointToPalette point if @scrollOffsets.palette.y < palettePoint.y < @scrollOffsets.palette.y + @paletteCanvas.offsetHeight and @scrollOffsets.palette.x < palettePoint.x < @scrollOffsets.palette.x + @paletteCanvas.offsetWidth - console.log 'ok to test' - for entry in @currentPaletteBlocks hitTestResult = @hitTest palettePoint, entry.block, @paletteView if hitTestResult? - console.log 'got it' @clickedBlock = entry.block @clickedPoint = point @clickedBlockPaletteEntry = entry @@ -1859,6 +1852,7 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> # # Draw a line if it is just a cursor if @hiddenInput.selectionStart is @hiddenInput.selectionEnd + @cursorRect.style.display = 'block' @mainCanvas.appendChild @cursorRect @cursorRect.setAttribute 'stroke', '#000' @cursorRect.setAttribute 'x', startPosition @@ -1892,6 +1886,7 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> endPosition - textFocusView.bounds[endRow].x, @view.opts.textHeight + @cursorRect.style.display = 'block' @mainCanvas.appendChild @cursorRect @cursorRect.setAttribute 'stroke', 'none' @cursorRect.setAttribute 'fill', 'rgba(0, 0, 256, 0.3)' @@ -3616,6 +3611,7 @@ Editor::endDrag = -> @draggingBlock = null @draggingOffset = null + @highlightCtx.removeChild(@lastHighlightPath) if @lastHighlightPath? @lastHighlight = @lastHighlightPath = null @clearDrag() diff --git a/src/draw.coffee b/src/draw.coffee index c52ff708..217e9ff0 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -57,8 +57,6 @@ avgColor = (a, factor, b) -> return memoizedAvgColor[c] = toHex newRGB -getGuid = -> 'draw-guid-' + Math.random().toString() # For - exports.Draw = class Draw ## Public functions constructor: -> @@ -261,6 +259,16 @@ exports.Draw = class Draw return count % 2 is 1 + equals: (other) -> + unless other instanceof Path + return false + if other._points.length isnt @_points.length + return false + for el, i in other._points + unless @_points[i].equals(el) + return false + return true + # ### Rectangular intersection ### # Succeeds if any edges intersect or either shape is # entirely within the other. @@ -303,7 +311,7 @@ exports.Draw = class Draw @_cachedTranslation.translate vector @_cacheFlag = true - draw: (ctx) -> + makeElement: -> @_clearCache() if @_points.length is 0 then return @@ -318,7 +326,7 @@ exports.Draw = class Draw pathCommands.push "M#{@_points[0].x} #{@_points[0].y}" for point in @_points pathCommands.push "L#{point.x} #{point.y}" - pathCommands.push "M#{@_points[0].x} #{@_points[0].y}" + pathCommands.push "L#{@_points[0].x} #{@_points[0].y}" pathCommands.push "Z" pathElement.setAttribute 'd', pathCommands.join ' ' @@ -335,7 +343,7 @@ exports.Draw = class Draw bigClipPathElement = document.createElementNS SVG_STANDARD, 'path' bigClipPathElement.setAttribute 'd', pathCommands.join ' ' bigClipPath.appendChild bigClipPathElement - bigClipPath.setAttribute 'id', clipId = 'droplet-clip-path-' + Math.random() + bigClipPath.setAttribute 'id', clipId = 'droplet-clip-path-' + helper.generateGUID() container.appendChild bigClipPath littleClipPathA = document.createElementNS SVG_STANDARD, 'clipPath' @@ -343,7 +351,7 @@ exports.Draw = class Draw littleClipPathAElement.setAttribute 'd', pathCommands.join ' ' littleClipPathAElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" littleClipPathA.appendChild littleClipPathAElement - littleClipPathA.setAttribute 'id', littleClipAId = 'droplet-clip-path-' + Math.random() + littleClipPathA.setAttribute 'id', littleClipAId = 'droplet-clip-path-' + helper.generateGUID() container.appendChild littleClipPathA littleClipPath = document.createElementNS SVG_STANDARD, 'clipPath' @@ -352,7 +360,7 @@ exports.Draw = class Draw littleClipPathElement.setAttribute 'd', pathCommands.join ' ' littleClipPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" littleClipPath.appendChild littleClipPathElement - littleClipPath.setAttribute 'id', littleClipId = 'droplet-clip-path-' + Math.random() + littleClipPath.setAttribute 'id', littleClipId = 'droplet-clip-path-' + helper.generateGUID() container.appendChild littleClipPath pathElement.setAttribute 'clip-path', "url(##{clipId})" @@ -380,9 +388,12 @@ exports.Draw = class Draw pathElement.setAttribute 'stroke', @style.strokeColor pathElement.setAttribute 'stroke-width', @style.lineWidth - ctx.appendChild pathElement return pathElement + draw: (ctx) -> + pathElement = @makeElement() + ctx.appendChild pathElement + clone: -> clone = new Path() clone.push el for el in @_points @@ -435,6 +446,9 @@ exports.Draw = class Draw @_bounds = new Rectangle @point.x, @point.y, self.ctx.measureText(@value).width, self.fontSize + clone: -> new Text @point, @value + equals: (other) -> other? and @point.equals(other.point) and @value is other.value + bounds: -> @_bounds contains: (point) -> @_bounds.contains point @@ -444,7 +458,7 @@ exports.Draw = class Draw setPosition: (point) -> @translate point.from @point - draw: (ctx) -> + makeElement: -> element = document.createElementNS SVG_STANDARD, 'text' element.setAttribute 'fill', '#000' @@ -461,6 +475,10 @@ exports.Draw = class Draw text = document.createTextNode @value.replace(/ /g, '\u00A0') # Preserve whitespace element.appendChild text + return element + + draw: (ctx) -> + element = @makeElement() ctx.appendChild element refreshFontCapital: -> diff --git a/src/helper.coffee b/src/helper.coffee index 10f041d0..ca076b19 100644 --- a/src/helper.coffee +++ b/src/helper.coffee @@ -179,3 +179,6 @@ exports.deepEquals = deepEquals = (a, b) -> else return a is b +_guid = 0 +exports.generateGUID = -> (_guid++).toString(16) + diff --git a/src/languages/python.coffee b/src/languages/python.coffee index ea814154..65b33b2d 100644 --- a/src/languages/python.coffee +++ b/src/languages/python.coffee @@ -84,4 +84,4 @@ config = { INDENTS, SKIPS, PARENS, SOCKET_TOKENS, COLORS_FORWARD, COLORS_BACKWARD, } -model.exports = parser.wrapParser treewalk.createTreewalkParser parse, config +module.exports = parser.wrapParser treewalk.createTreewalkParser parse, config diff --git a/src/view.coffee b/src/view.coffee index 6e4d5e16..6c08695c 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -27,6 +27,7 @@ CARRIAGE_GROW_DOWN = 3 DROPDOWN_ARROW_HEIGHT = 8 DROP_TRIANGLE_COLOR = '#555' +SVG_STANDARD = 'http://www.w3.org/2000/svg' DEFAULT_OPTIONS = showDropdowns: true @@ -81,7 +82,6 @@ arrayEq = (a, b) -> return false if k isnt b[i] for k, i in a return true - # # View # The View class contains options and caches # for rendering. The controller instantiates a View @@ -98,6 +98,7 @@ exports.View = class View # so that rerendering the same model # can be fast @map = {} + @contextMaps = [] @draw = @opts.draw ? new draw.Draw() @@ -106,6 +107,64 @@ exports.View = class View unless option of @opts @opts[option] = DEFAULT_OPTIONS[option] + getMap: (ctx) -> + ctxID = ctx.getAttribute('id') + unless ctxID? + ctxID = 'droplet-render-' + helper.generateGUID() + ctx.setAttribute 'id', ctxID + + if ctxID of @contextMaps + map = @contextMaps[ctxID] + else + @contextMaps[ctxID] = map = { + context: ctx, + groups: {} + cachedPaths: {} + } + return map + + getCachedPath: (ctx, id) -> + map = @getMap ctx + return map.cachedPaths[id] + + setCachedPath: (ctx, id, path) -> + map = @getMap ctx + map.cachedPaths[id] = path.clone() + + clearCanvas: (ctx, remove = true) -> + ctxID = ctx.getAttribute('id') + if ctxID of @contextMaps + for key, val of @contextMaps[ctxID].groups + @clearCanvas val + if remove + ctx.removeChild val, false + delete @contextMaps[ctxID].groups[key] + delete @contextMaps[ctxID].cachedPaths[key] + delete @contextMaps[val.getAttribute('id')] + + getSVGGroup: (ctx, id) -> + map = @getMap ctx + + if id of map.groups + return map.groups[id] + else + group = document.createElementNS SVG_STANDARD, 'g' + group.setAttribute 'id', 'droplet-render-' + helper.generateGUID() + '-' + id + ctx.appendChild group + + map.groups[id] = group + return group + + return group + + removeSVGGroup: (ctx, id) -> + map = @getMap ctx + + if id of map.groups + @clearCanvas map.groups[id] + ctx.removeChild map.groups[id] + delete map.groups[id] + # Simple method for clearing caches clearCache: -> @map = {} @@ -160,6 +219,7 @@ exports.View = class View # computeChildren @lineLength = 0 # How many lines does this take up? @children = [] # All children, flat + @oldChildren = [] # Previous children, for removing @lineChildren = [] # Children who own each line @multilineChildrenData = [] # Where do indents start/end? @@ -701,7 +761,7 @@ exports.View = class View # Draw our own polygon on a canvas context. # May require special effects, like graying-out # or blueing for lasso select. - drawSelf: (ctx, style = {}) -> + drawSelf: (style = {}) -> # ## draw (GenericViewNode) # Call `drawSelf` and recurse, if we are in the viewport. @@ -709,15 +769,33 @@ exports.View = class View # First, test to see whether our AABB overlaps # with the viewport if not boundingRect? or @totalBounds.overlap boundingRect + children = @children.map (x) -> x.child.id + + if @oldGroup? + for childObj in @oldChildren + unless childObj in children + @view.removeSVGGroup(@oldGroup, childObj) + + @oldChildren = children + # If it does, we want to render. # Call `@drawSelf` - drawSelfResult = @drawSelf ctx, style + unless @path.equals(@view.getCachedPath(ctx, @model.id)) + @view.setCachedPath ctx, @model.id, @path + @view.removeSVGGroup ctx, @model.id + group = @view.getSVGGroup(ctx, @model.id) + ownPath = @drawSelf style + group.appendChild(ownPath) if ownPath? + else + group = @view.getSVGGroup(ctx, @model.id) + + @oldGroup = group ? ctx # Draw our children. for childObj in @children - @view.getViewNodeFor(childObj.child).draw ctx, boundingRect, style + @view.getViewNodeFor(childObj.child).draw group ? ctx, boundingRect, style - return drawSelfResult + return ownPath # ## drawShadow (GenericViewNode) # Draw the shadow of our path @@ -1634,7 +1712,7 @@ exports.View = class View # ## drawSelf # Draw our path, with applied # styles if necessary. - drawSelf: (ctx, style = {}) -> + drawSelf: (style = {}) -> # We migh want to apply some # temporary color changes, # so store the old colors @@ -1649,7 +1727,7 @@ exports.View = class View @path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F' @path.style.strokeColor = avgColor @path.style.strokeColor, 0.7, '#00F' - drawResult = @path.draw ctx + drawResult = @path.makeElement() # Unset all the things we changed @path.style.fillColor = oldFill @@ -1842,10 +1920,10 @@ exports.View = class View return @path # ## drawSelf (SocketViewNode) - drawSelf: (ctx) -> - super + drawSelf: (style) -> + path = super(style) if @model.hasDropdown() and @view.opts.showDropdowns - ### + ###TODO ctx.beginPath() ctx.fillStyle = DROP_TRIANGLE_COLOR ctx.moveTo @bounds[0].x + helper.DROPDOWN_ARROW_PADDING, @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2 @@ -1854,6 +1932,7 @@ exports.View = class View ctx.fill() ### 0 + return path # ## computeOwnDropArea (SocketViewNode) # Socket drop areas are actually the same @@ -1868,6 +1947,7 @@ exports.View = class View @highlightArea = @path.clone() @highlightArea.noclip = true @highlightArea.style.strokeColor = '#FF0' + @highlightArea.style.fillColor = 'none' @highlightArea.style.lineWidth = @view.opts.padding # # IndentViewNode @@ -2066,9 +2146,9 @@ exports.View = class View # ## drawSelf # # Draw the text element itself. - drawSelf: (ctx, style = {}) -> + drawSelf: (style = {}) -> unless style.noText - drawResult = @textElement.draw ctx + drawResult = @textElement.makeElement() return drawResult # ## Debug output From ba66bc05085d1daede57fae8c260007e7070a39a Mon Sep 17 00:00:00 2001 From: Anthony Bau Date: Thu, 16 Jul 2015 17:30:23 -0400 Subject: [PATCH 006/268] Bijection with the view for performance --- Gruntfile.coffee | 1 + example/example-svg.html | 45 ++++++ src/controller.coffee | 142 ++++++++---------- src/draw.coffee | 251 +++++++++++++++++++------------- src/example-svg.coffee | 55 +++++++ src/view.coffee | 301 +++++++++++---------------------------- 6 files changed, 396 insertions(+), 399 deletions(-) create mode 100644 example/example-svg.html create mode 100644 src/example-svg.coffee diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 060fd886..365c9388 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -70,6 +70,7 @@ module.exports = (grunt) -> build: files: 'dist/droplet-full.js': ['./src/main.coffee'] + 'example/example-svg.js': ['./src/example-svg.coffee'] options: transform: ['coffeeify'] browserifyOptions: diff --git a/example/example-svg.html b/example/example-svg.html new file mode 100644 index 00000000..34519271 --- /dev/null +++ b/example/example-svg.html @@ -0,0 +1,45 @@ + + + + +
+for el in [1..3]
+  fd 10
+  if a is b
+    fd 100
+  else
+    bk 100
+
+ + + + + diff --git a/src/controller.coffee b/src/controller.coffee index d8595688..8227ed38 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -121,8 +121,6 @@ exports.Editor = class Editor else @mode = new coffee @options.modeOptions - @draw = new draw.Draw() - # No gutter decorations to start @gutterDecorations = {} @@ -182,6 +180,22 @@ exports.Editor = class Editor @paletteWrapper.style.bottom = '0px' @paletteWrapper.style.width = '270px' + # We will also have to initialize the + # drag canvas. + @dragCanvas = @dragCtx = document.createElementNS SVG_STANDARD, 'svg' + @dragCanvas.setAttribute 'class', 'droplet-drag-canvas' + + @dragCanvas.style.left = '-9999px' + @dragCanvas.style.top = '-9999px' + + # Instantiate the Droplet views + @view = new view.View @mainCtx, @standardViewSettings + @paletteView = new view.View @paletteCtx, helper.extend {}, @standardViewSettings, { + showDropdowns: @options.showDropdownInPalette ? false + } + @dragView = new view.View @dragCtx, @standardViewSettings + @draw = new draw.Draw(@mainCtx) + @dropletElement.style.left = @paletteWrapper.offsetWidth + 'px' @wrapperElement.appendChild @paletteWrapper @@ -209,13 +223,6 @@ exports.Editor = class Editor # Set up event bindings before creating a view @bindings = {} - # Instantiate an ICE editor view - @view = new view.View @standardViewSettings - @paletteView = new view.View helper.extend {}, @standardViewSettings, { - showDropdowns: @options.showDropdownInPalette ? false - } - @dragView = new view.View @standardViewSettings - boundListeners = [] # Call all the feature bindings that are supposed @@ -381,8 +388,7 @@ exports.Editor = class Editor else @resizeTextMode() -Editor::clearCanvas = (canvas) -> - @view.clearCanvas canvas +Editor::clearCanvas = (canvas) -> #@view.clearCanvas canvas # RENDERING CAPABILITIES @@ -399,24 +405,22 @@ Editor::clearMain = (opts) -> Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> @nubbyHeight = Math.max(0, height); @nubbyColor = color - @topNubbyPath = new @draw.Path() - if height >= 0 - @topNubbyPath.bevel = true + @topNubbyPath = new @draw.Path([], true) - @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, -5 - @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, height + @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, -5 + @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth), - @view.opts.tabHeight + height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * @view.opts.tabSideWidth, - @view.opts.tabHeight + height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset, height + @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height + @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth), + @view.opts.tabHeight + height + @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * @view.opts.tabSideWidth, + @view.opts.tabHeight + height + @topNubbyPath.push new @draw.Point @view.opts.tabOffset, height - @topNubbyPath.push new @draw.Point -5, height - @topNubbyPath.push new @draw.Point -5, -5 + @topNubbyPath.push new @draw.Point -5, height + @topNubbyPath.push new @draw.Point -5, -5 - @topNubbyPath.style.fillColor = color + @topNubbyPath.style.fillColor = color @redrawMain() @@ -433,7 +437,7 @@ Editor::redrawMain = (opts = {}) -> # Clear the main canvas @clearMain(opts) - @topNubbyPath.draw @mainCtx + @topNubbyPath.update() rect = null options = { @@ -444,7 +448,7 @@ Editor::redrawMain = (opts = {}) -> # Draw the new tree on the main context layoutResult = @view.getViewNodeFor(@tree).layout 0, @nubbyHeight - @view.getViewNodeFor(@tree).draw @mainCtx, rect, options + @view.getViewNodeFor(@tree).draw rect, options # Draw floating blocks startWidth = @mode.startComment.length * @fontWidth @@ -495,7 +499,6 @@ Editor::redrawMain = (opts = {}) -> path.push new @view.draw.Point rectangle.x, rectangle.y - path.bevel = true path.style = { fillColor: GRAY_BLOCK_COLOR @@ -507,7 +510,7 @@ Editor::redrawMain = (opts = {}) -> return @redrawMain opts # TODO this will need to become configurable by the @mode - record.grayBoxPath.draw @mainCtx + record.grayBoxPath.update() #draw @mainCtx ###TODO @mainCtx.fillStyle = '#000' @mainCtx.fillText(@mode.startComment, blockView.totalBounds.x - startWidth, @@ -515,7 +518,7 @@ Editor::redrawMain = (opts = {}) -> @mainCtx.fillText(@mode.endComment, record.grayBox.right() - endWidth - 5, bottomTextPosition) ### - blockView.draw @mainCtx, rect, { + blockView.draw rect, { grayscale: false selected: false noText: false @@ -544,34 +547,10 @@ Editor::redrawMain = (opts = {}) -> return null Editor::redrawHighlights = -> - # Draw highlights around marked lines - @clearHighlightCanvas() - - for line, info of @markedLines - if @inDisplay info.model - path = @getHighlightPath info.model, info.style - path.draw @highlightCtx - else - delete @markedLines[line] - - for id, info of @markedBlocks - if @inDisplay info.model - path = @getHighlightPath info.model, info.style - path.draw @highlightCtx - else - delete @markedLines[id] - - for id, info of @extraMarks - if @inDisplay info.model - path = @getHighlightPath info.model, info.style - path.draw @highlightCtx - else - delete @extraMarks[id] - # If there is an block that is being dragged, # draw it in gray if @draggingBlock? and @inDisplay @draggingBlock - @view.getViewNodeFor(@draggingBlock).draw @highlightCtx, new @draw.Rectangle( + @view.getViewNodeFor(@draggingBlock).draw new @draw.Rectangle( @scrollOffsets.main.x, @scrollOffsets.main.y, @mainCanvas.width, @@ -582,7 +561,7 @@ Editor::redrawHighlights = -> @redrawCursors() @redrawLassoHighlight() -Editor::clearCursorCanvas = -> @clearCanvas @cursorCtx +Editor::clearCursorCanvas = -> #@clearCanvas @cursorCtx Editor::redrawCursors = -> @clearCursorCanvas() @@ -595,9 +574,9 @@ Editor::redrawCursors = -> Editor::drawCursor = -> @strokeCursor @determineCursorPosition() -Editor::clearPalette = -> @clearCanvas @paletteCtx +Editor::clearPalette = -> #@clearCanvas @paletteCtx -Editor::clearPaletteHighlightCanvas = -> @clearCanvas @paletteHighlightCtx +Editor::clearPaletteHighlightCanvas = -> #@clearCanvas @paletteHighlightCtx Editor::redrawPalette = -> @clearPalette() @@ -621,7 +600,7 @@ Editor::redrawPalette = -> paletteBlockView.layout PALETTE_LEFT_MARGIN, lastBottomEdge # Render the block - paletteBlockView.draw @paletteCtx, boundingRect + paletteBlockView.draw boundingRect # Update lastBottomEdge lastBottomEdge = paletteBlockView.getBounds().bottom() + PALETTE_MARGIN @@ -931,14 +910,6 @@ hook 'populate', 0, -> @lastHighlight = @lastHighlightPath = null - # We will also have to initialize the - # drag canvas. - @dragCanvas = @dragCtx = document.createElementNS SVG_STANDARD, 'svg' - @dragCanvas.setAttribute 'class', 'droplet-drag-canvas' - - @dragCanvas.style.left = '-9999px' - @dragCanvas.style.top = '-9999px' - # And the canvas for drawing highlights @highlightCanvas = @highlightCtx = document.createElementNS SVG_STANDARD, 'g' @@ -950,12 +921,15 @@ hook 'populate', 0, -> @mainCanvas.appendChild @highlightCanvas Editor::clearHighlightCanvas = -> - @clearCanvas @highlightCtx + #@clearCanvas @highlightCtx @cursorRect.style.display = 'none' # Utility function for clearing the drag canvas, # an operation we will be doing a lot. -Editor::clearDrag = -> @dragView.clearCanvas @dragCtx +Editor::clearDrag = -> + if @draggingBlock? + @dragView.getViewNodeFor(@draggingBlock).forceClean() + @clearHighlightCanvas() # On resize, we will want to size the drag canvas correctly. Editor::resizeDragCanvas = -> @@ -1140,7 +1114,7 @@ hook 'mousemove', 1, (point, event, state) -> @dragCanvas.style.height = "#{Math.min draggingBlockView.totalBounds.height + 10, window.screen.height}px" draggingBlockView.drawShadow @dragCtx, 5, 5 - draggingBlockView.draw @dragCtx, new @draw.Rectangle 0, 0, @dragCanvas.width, @dragCanvas.height + draggingBlockView.draw new @draw.Rectangle 0, 0, @dragCanvas.width, @dragCanvas.height # Translate it immediately into position position = new @draw.Point( @@ -1258,7 +1232,7 @@ hook 'mousemove', 0, (point, event, state) -> if head is @tree.end and @floatingBlocks.length is 0 and @mainCanvas.width + @scrollOffsets.main.x > mainPoint.x > @scrollOffsets.main.x - @gutter.offsetWidth and @mainCanvas.height + @scrollOffsets.main.y > mainPoint.y > @scrollOffsets.main.y - @view.getViewNodeFor(@tree).highlightArea.draw @highlightCtx + @view.getViewNodeFor(@tree).highlightArea.update() @lastHighlight = @tree else @@ -1296,8 +1270,10 @@ hook 'mousemove', 0, (point, event, state) -> @redrawHighlights() if best? - @highlightCtx.removeChild(@lastHighlightPath) if @lastHighlightPath? - @lastHighlightPath = @view.getViewNodeFor(best).highlightArea.draw @highlightCtx + @lastHighlightPath?.destroy?() + @lastHighlightPath = @view.getViewNodeFor(best).highlightArea + @lastHighlightPath.update() + @lastHighlightPath.activate() @maskFloatingPaths(best.getDocument()) @lastHighlight = best @@ -1471,12 +1447,12 @@ hook 'mouseup', 0, (point, event, state) -> @setCursor @draggingBlock.start # Now that we've done that, we can annul stuff. + @clearDrag() @draggingBlock = null @draggingOffset = null - @highlightCtx.removeChild(@lastHighlightPath) if @lastHighlightPath? + @lastHighlightPath?.destroy?() @lastHighlight = @lastHighlightPath = null - @clearDrag() @redrawMain() @redrawHighlights() @@ -1649,7 +1625,7 @@ Editor::resizePaletteHighlight = -> hook 'redraw_palette', 0, -> @clearPaletteHighlightCanvas() if @currentHighlightedPaletteBlock? - @paletteHighlightPath.draw @paletteHighlightCtx + @paletteHighlightPath.update() hook 'rebuild_palette', 1, -> # Remove the existent blocks @@ -1681,7 +1657,7 @@ hook 'rebuild_palette', 1, -> if @viewOrChildrenContains block, palettePoint, @paletteView @clearPaletteHighlightCanvas() @paletteHighlightPath = @getHighlightPath block, {color: '#FF0'}, @paletteView - @paletteHighlightPath.draw @paletteHighlightCtx + @paletteHighlightPath.update() @currentHighlightedPaletteBlock = block else if block is @currentHighlightedPaletteBlock @currentHighlightedPaletteBlock = null @@ -2351,7 +2327,7 @@ Editor::redrawLassoHighlight = -> ) lassoView = @view.getViewNodeFor(@lassoSelection) lassoView.absorbCache() - lassoView.draw @highlightCtx, mainCanvasRectangle, {selected: true} + lassoView.draw mainCanvasRectangle, {selected: true} @maskFloatingPaths(@lassoSelection.start.getDocument()) Editor::maskFloatingPaths = (dropletDocument) -> @@ -3609,12 +3585,12 @@ Editor::endDrag = -> if @cursorAtSocket() @setCursor @cursor, (x) -> x.type isnt 'socketStart' + @clearDrag() @draggingBlock = null @draggingOffset = null - @highlightCtx.removeChild(@lastHighlightPath) if @lastHighlightPath? + @lastHighlightPath?.destroy?() @lastHighlight = @lastHighlightPath = null - @clearDrag() @redrawMain() return @@ -3914,8 +3890,10 @@ Editor::resizeGutter = -> @lastGutterWidth = @aceEditor.renderer.$gutterLayer.gutterWidth @gutter.style.width = @lastGutterWidth + 'px' return @resize() - @gutter.style.height = "#{Math.max(@dropletElement.offsetHeight, - @mainCanvas.offsetHeight)}px" + + unless @lastGutterHeight is Math.max(@dropletElement.offsetHeight, @mainCanvas.offsetHeight) + @lastGutterHeight = Math.max(@dropletElement.offsetHeight, @mainCanvas.offsetHeight) + @gutter.style.height = @lastGutterHeight + 'px' Editor::addLineNumberForLine = (line) -> treeView = @view.getViewNodeFor @tree diff --git a/src/draw.coffee b/src/draw.coffee index 217e9ff0..dc26ce6a 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -18,6 +18,11 @@ _area = (a, b, c) -> (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y) _intersects = (a, b, c, d) -> ((_area(a, b, c) > 0) != (_area(a, b, d) > 0)) and ((_area(c, d, a) > 0) != (_area(c, d, b) > 0)) +_bisector = (a, b, c) -> + a.from(b).normalize().add( + c.from(b).normalize() + ).normalize() + max = (a, b) -> `(a > b ? a : b)` min = (a, b) -> `(b > a ? a : b)` @@ -59,13 +64,13 @@ avgColor = (a, factor, b) -> exports.Draw = class Draw ## Public functions - constructor: -> + constructor: (@ctx) -> canvas = document.createElement('canvas') - @ctx = canvas.getContext '2d' + @measureCtx = canvas.getContext '2d' @fontSize = 15 @fontFamily = 'Courier New, monospace' @fontAscent = 2 - @fontBaseline = 8 + @fontBaseline = 10 self = this @@ -78,6 +83,10 @@ exports.Draw = class Draw magnitude: -> Math.sqrt @x * @x + @y * @y + mult: (scalar) -> new Point @x * scalar, @y * scalar + + normalize: -> @mult 1 / @mag() + translate: (vector) -> @x += vector.x; @y += vector.y @@ -198,17 +207,15 @@ exports.Draw = class Draw # This is called Path, but is forced to be closed so is actually a polygon. # It can do fast translation and rectangular intersection. @Path = class Path - constructor: -> - @_points = [] + constructor: (@_points = [], @bevel = false, @style = {'strokeColor': '#000', 'lineWidth': 0, 'fillColor': 'none'}) -> @_cachedTranslation = new Point 0, 0 - @_cacheFlag = false + @_cacheFlag = true @_bounds = new NoRectangle() - @style = { - 'strokeColor': '#000' - 'lineWidth': 0 - 'fillColor': null - } + @_clearCache() + + @element = @makeElement() + self.ctx.appendChild @element _clearCache: -> @_cacheFlag = true @@ -230,13 +237,20 @@ exports.Draw = class Draw @_cacheFlag = false + setPoints: (points) -> + @_points = points + @_cacheFlag = true + @_updateFlag = true + push: (point) -> @_points.push point @_cacheFlag = true + @_updateFlag = true unshift: (point) -> @_points.unshift point @_cacheFlag = true + @_updateFlag = true # ### Point containment ### # Accomplished with ray-casting @@ -311,75 +325,85 @@ exports.Draw = class Draw @_cachedTranslation.translate vector @_cacheFlag = true + getCommandString: -> + if @_points.length is 0 + return '' + + pathCommands = [] + + pathCommands.push "M#{Math.round(@_points[0].x)} #{Math.round(@_points[0].y)}" + for point in @_points + pathCommands.push "L#{Math.round(point.x)} #{Math.round(point.y)}" + pathCommands.push "L#{Math.round(@_points[0].x)} #{Math.round(@_points[0].y)}" + pathCommands.push "Z" + return pathCommands.join ' ' + + # TODO unhackify makeElement: -> @_clearCache() - if @_points.length is 0 then return - pathElement = document.createElementNS SVG_STANDARD, 'path' if @style.fillColor? pathElement.setAttribute 'fill', @style.fillColor - pathCommands = [] + @__lastFillColor = @style.fillColor + @__lastStrokeColor = @style.strokeColor + @__lastLineWidth = @style.lineWidth - pathCommands.push "M#{@_points[0].x} #{@_points[0].y}" - for point in @_points - pathCommands.push "L#{point.x} #{point.y}" - pathCommands.push "L#{@_points[0].x} #{@_points[0].y}" - pathCommands.push "Z" + pathString = @getCommandString() - pathElement.setAttribute 'd', pathCommands.join ' ' + pathElement.setAttribute 'd', pathString if @bevel - backgroundPathElement = pathElement - foregroundPathElement = document.createElementNS SVG_STANDARD, 'path' - foregroundPathElement.setAttribute 'd', pathCommands.join ' ' - foregroundPathElement.setAttribute 'fill', @style.fillColor + @backgroundPathElement = pathElement + @foregroundPathElement = document.createElementNS SVG_STANDARD, 'path' + @foregroundPathElement.setAttribute 'd', pathString + @foregroundPathElement.setAttribute 'fill', @style.fillColor container = document.createElementNS SVG_STANDARD, 'g' pathElement = document.createElementNS SVG_STANDARD, 'g' bigClipPath = document.createElementNS SVG_STANDARD, 'clipPath' - bigClipPathElement = document.createElementNS SVG_STANDARD, 'path' - bigClipPathElement.setAttribute 'd', pathCommands.join ' ' - bigClipPath.appendChild bigClipPathElement + @bigClipPathElement = document.createElementNS SVG_STANDARD, 'path' + @bigClipPathElement.setAttribute 'd', pathString + bigClipPath.appendChild @bigClipPathElement bigClipPath.setAttribute 'id', clipId = 'droplet-clip-path-' + helper.generateGUID() container.appendChild bigClipPath littleClipPathA = document.createElementNS SVG_STANDARD, 'clipPath' - littleClipPathAElement = document.createElementNS SVG_STANDARD, 'path' - littleClipPathAElement.setAttribute 'd', pathCommands.join ' ' - littleClipPathAElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" - littleClipPathA.appendChild littleClipPathAElement + @littleClipPathAElement = document.createElementNS SVG_STANDARD, 'path' + @littleClipPathAElement.setAttribute 'd', pathString + @littleClipPathAElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" + littleClipPathA.appendChild @littleClipPathAElement littleClipPathA.setAttribute 'id', littleClipAId = 'droplet-clip-path-' + helper.generateGUID() container.appendChild littleClipPathA littleClipPath = document.createElementNS SVG_STANDARD, 'clipPath' littleClipPath.setAttribute 'clip-path', "url(##{littleClipAId})" - littleClipPathElement = document.createElementNS SVG_STANDARD, 'path' - littleClipPathElement.setAttribute 'd', pathCommands.join ' ' - littleClipPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" - littleClipPath.appendChild littleClipPathElement + @littleClipPathElement = document.createElementNS SVG_STANDARD, 'path' + @littleClipPathElement.setAttribute 'd', pathString + @littleClipPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" + littleClipPath.appendChild @littleClipPathElement littleClipPath.setAttribute 'id', littleClipId = 'droplet-clip-path-' + helper.generateGUID() container.appendChild littleClipPath pathElement.setAttribute 'clip-path', "url(##{clipId})" - foregroundPathElement.setAttribute 'clip-path', "url(##{littleClipId})" - - darkPathElement = document.createElementNS SVG_STANDARD, 'path' - darkPathElement.setAttribute 'd', pathCommands.join ' ' - darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000' - darkPathElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" - - lightPathElement = document.createElementNS SVG_STANDARD, 'path' - lightPathElement.setAttribute 'd', pathCommands.join ' ' - lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF' - lightPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" - - pathElement.appendChild backgroundPathElement - pathElement.appendChild darkPathElement - pathElement.appendChild lightPathElement - pathElement.appendChild foregroundPathElement + @foregroundPathElement.setAttribute 'clip-path', "url(##{littleClipId})" + + @darkPathElement = document.createElementNS SVG_STANDARD, 'path' + @darkPathElement.setAttribute 'd', pathString + @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000' + @darkPathElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})" + + @lightPathElement = document.createElementNS SVG_STANDARD, 'path' + @lightPathElement.setAttribute 'd', pathString + @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF' + @lightPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})" + + pathElement.appendChild @backgroundPathElement + pathElement.appendChild @darkPathElement + pathElement.appendChild @lightPathElement + pathElement.appendChild @foregroundPathElement container.appendChild pathElement pathElement = container @@ -390,49 +414,62 @@ exports.Draw = class Draw return pathElement - draw: (ctx) -> - pathElement = @makeElement() - ctx.appendChild pathElement + update: -> + if @style.fillColor isnt @__lastFillColor + @__lastFillColor = @style.fillColor - clone: -> - clone = new Path() - clone.push el for el in @_points - return clone - - drawShadow: (ctx, offsetX, offsetY, blur) -> - ### - # TODO - @_clearCache() - - ctx.fillStyle = @style.fillColor - - if @_points.length is 0 then return - - oldValues = { - shadowColor: ctx.shadowColor - shadowBlur: ctx.shadowBlur - shadowOffsetY: ctx.shadowOffsetY - shadowOffsetX: ctx.shadowOffsetX - globalAlpha: ctx.globalAlpha - } - - ctx.globalAlpha = 0.5 - ctx.shadowColor = '#000'; ctx.shadowBlur = blur - ctx.shadowOffsetX = offsetX; ctx.shadowOffsetY = offsetY + if @bevel + @backgroundPathElement.setAttribute 'fill', @style.fillColor + @foregroundPathElement.setAttribute 'fill', @style.fillColor + @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF' + @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000' + else + @element.setAttribute 'fill', @style.fillColor + + if not @bevel and @style.strokeColor isnt @__lastStrokeColor + @__lastStrokeColor = @style.strokeColor + @element.setAttribute 'stroke', @style.strokeColor + + if not @bevel and @style.lineWidth isnt @__lastLineWidth + @__lastLineWidth = @style.lineWidth + @element.setAttribute 'stroke-width', @style.lineWidth + + if @_updateFlag + @_updateFlag = false + pathString = @getCommandString() + if @bevel + @backgroundPathElement.setAttribute 'd', pathString + @foregroundPathElement.setAttribute 'd', pathString + @lightPathElement.setAttribute 'd', pathString + @darkPathElement.setAttribute 'd', pathString + @bigClipPathElement.setAttribute 'd', pathString + @littleClipPathAElement.setAttribute 'd', pathString + @littleClipPathElement.setAttribute 'd', pathString + else + @element.setAttribute 'd', pathString - ctx.beginPath() + activate: -> + unless @active + @element.setAttribute 'visibility', 'visible' + @active = true - ctx.moveTo @_points[0].x, @_points[0].y - for point in @_points - ctx.lineTo point.x, point.y # DEFAULT - ctx.lineTo @_points[0].x, @_points[0].y + destroy: -> + if @active + #ctx.removeChild @element + @element.setAttribute 'visibility', 'hidden' + @active = false - ctx.fill() + clone: -> + clone = new Path(@_points.slice(0), @bevel, { + lineWidth: @style.lineWidth + fillColor: @style.fillColor + strokeColor: @style.strokeColor + }) + clone._clearCache() + clone.update() + return clone - for own key, value of oldValues - ctx[key] = value - ### - 0 + drawShadow: (ctx, offsetX, offsetY, blur) -> #TODO # ## Text ## # A Text element. Mainly this exists for computing bounding boxes, which is @@ -441,10 +478,16 @@ exports.Draw = class Draw constructor: (@point, @value) -> @wantedFont = self.fontSize + 'px ' + self.fontFamily - unless self.ctx.font is @wantedFont - self.ctx.font = self.fontSize + 'px ' + self.fontFamily + unless self.measureCtx.font is @wantedFont + self.measureCtx.font = self.fontSize + 'px ' + self.fontFamily - @_bounds = new Rectangle @point.x, @point.y, self.ctx.measureText(@value).width, self.fontSize + @_bounds = new Rectangle @point.x, @point.y, self.measureCtx.measureText(@value).width, self.fontSize + + @element = @makeElement() + self.ctx.appendChild @element + + @__lastValue = @value + @__lastPoint = @point.clone() clone: -> new Text @point, @value equals: (other) -> other? and @point.equals(other.point) and @value is other.value @@ -452,10 +495,6 @@ exports.Draw = class Draw bounds: -> @_bounds contains: (point) -> @_bounds.contains point - translate: (vector) -> - @point.translate vector - @_bounds.translate vector - setPosition: (point) -> @translate point.from @point makeElement: -> @@ -466,7 +505,7 @@ exports.Draw = class Draw # to base ourselves to avoid a chrome bug where text zooming # doesn't work for non-alphabetic baselines element.setAttribute 'x', @point.x - element.setAttribute 'y', @point.y + self.fontBaseline - self.fontAscent + element.setAttribute 'y', @point.y + self.fontBaseline + self.fontAscent element.setAttribute 'dominant-baseline', 'alphabetic' element.setAttribute 'font-family', self.fontFamily @@ -477,9 +516,21 @@ exports.Draw = class Draw return element - draw: (ctx) -> - element = @makeElement() - ctx.appendChild element + update: -> + unless @point.equals(@__lastPoint) + @__lastPoint = @point.clone() + @element.setAttribute 'x', @point.x + @element.setAttribute 'y', @point.y + self.fontBaseline + self.fontAscent + + unless @value is @__lastValue + @__lastValue = @value + @element.removeChild(@element.lastChild) + text = document.createTextNode @value.replace(/ /g, '\u00A0') + element.appendChild text + + destroy: -> + #self.ctx.removeChild @element + @element.setAttribute 'visibility', 'hidden' refreshFontCapital: -> metrics = helper.fontMetrics(@fontFamily, @fontSize) diff --git a/src/example-svg.coffee b/src/example-svg.coffee new file mode 100644 index 00000000..97273275 --- /dev/null +++ b/src/example-svg.coffee @@ -0,0 +1,55 @@ +viewlib = require './view.coffee' +modes = require './modes.coffee' + +modeOptions = {} + +exports.setModeOptions = (language, options) -> + modeOptions[language] = options + +exports.highlight = -> + FILTER_SVG = ''' + + + + + + + + + + + + + + + ''' + + div = document.createElement 'div' + div.innerHTML = FILTER_SVG + document.body.appendChild div + + replaceElement = (element) -> + language = element.getAttribute 'droplet-lang' + mode = new modes[language](modeOptions[language]) + + dropletDocument = mode.parse element.innerText.trim() + dropletDocument.opts.roundedSingletons = true + + svg = document.createElementNS 'http://www.w3.org/2000/svg', 'svg' + + view = new viewlib.View(svg) + node = view.getViewNodeFor(dropletDocument) + node.layout 0, 0 + svg.style.width = node.totalBounds.width + 'px' + svg.style.height = node.totalBounds.height + 'px' + node.draw() + + element.innerHTML = '' + element.appendChild svg + + for el, i in document.getElementsByTagName('pre') + if el.hasAttribute('droplet-lang') + replaceElement el + +window.addEventListener 'load', -> + exports.highlight() diff --git a/src/view.coffee b/src/view.coffee index 6c08695c..f475b274 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -47,7 +47,6 @@ DEFAULT_OPTIONS = highlightAreaHeight: 10 bevelClip: 3 shadowBlur: 5 - ctx: document.createElement('canvas').getContext('2d') colors: error: '#ff0000' return: '#fff59d' # yellow @@ -92,7 +91,7 @@ arrayEq = (a, b) -> # will have access to their View's caches # and options object. exports.View = class View - constructor: (@opts = {}) -> + constructor: (@ctx, @opts = {}) -> # @map maps Model objects # to corresponding View objects, # so that rerendering the same model @@ -100,71 +99,13 @@ exports.View = class View @map = {} @contextMaps = [] - @draw = @opts.draw ? new draw.Draw() + @draw = new draw.Draw(@ctx) # Apply default options for option of DEFAULT_OPTIONS unless option of @opts @opts[option] = DEFAULT_OPTIONS[option] - getMap: (ctx) -> - ctxID = ctx.getAttribute('id') - unless ctxID? - ctxID = 'droplet-render-' + helper.generateGUID() - ctx.setAttribute 'id', ctxID - - if ctxID of @contextMaps - map = @contextMaps[ctxID] - else - @contextMaps[ctxID] = map = { - context: ctx, - groups: {} - cachedPaths: {} - } - return map - - getCachedPath: (ctx, id) -> - map = @getMap ctx - return map.cachedPaths[id] - - setCachedPath: (ctx, id, path) -> - map = @getMap ctx - map.cachedPaths[id] = path.clone() - - clearCanvas: (ctx, remove = true) -> - ctxID = ctx.getAttribute('id') - if ctxID of @contextMaps - for key, val of @contextMaps[ctxID].groups - @clearCanvas val - if remove - ctx.removeChild val, false - delete @contextMaps[ctxID].groups[key] - delete @contextMaps[ctxID].cachedPaths[key] - delete @contextMaps[val.getAttribute('id')] - - getSVGGroup: (ctx, id) -> - map = @getMap ctx - - if id of map.groups - return map.groups[id] - else - group = document.createElementNS SVG_STANDARD, 'g' - group.setAttribute 'id', 'droplet-render-' + helper.generateGUID() + '-' + id - ctx.appendChild group - - map.groups[id] = group - return group - - return group - - removeSVGGroup: (ctx, id) -> - map = @getMap ctx - - if id of map.groups - @clearCanvas map.groups[id] - ctx.removeChild map.groups[id] - delete map.groups[id] - # Simple method for clearing caches clearCache: -> @map = {} @@ -260,12 +201,21 @@ exports.View = class View # *Sixth pass variables* # computePath - @path = new @view.draw.Path() + if @model.type is 'block' + @path = new @view.draw.Path([], true) + else + @path = new @view.draw.Path() # *Seventh pass variables* # computeDropAreas # each one is a @view.draw.Path (or null) - @dropArea = @highlightArea = null + @dropArea = null + @highlightArea = new @view.draw.Path([], false, { + fillColor: '#FF0' + strokeColor: '#FF0' + lineWidth: 1 + }) + @highlightArea.destroy() # Versions. The corresponding # Model will keep corresponding version @@ -652,7 +602,7 @@ exports.View = class View # # Many nodes do not have paths at all, # and so need not override this function. - computeOwnPath: -> @path = new @view.draw.Path() + computeOwnPath: -> # ## computePath (GenericViewNode) # Call `@computeOwnPath` and recurse. This function @@ -765,99 +715,44 @@ exports.View = class View # ## draw (GenericViewNode) # Call `drawSelf` and recurse, if we are in the viewport. - draw: (ctx, boundingRect, style = {}) -> - # First, test to see whether our AABB overlaps - # with the viewport - if not boundingRect? or @totalBounds.overlap boundingRect - children = @children.map (x) -> x.child.id - - if @oldGroup? - for childObj in @oldChildren - unless childObj in children - @view.removeSVGGroup(@oldGroup, childObj) - - @oldChildren = children - - # If it does, we want to render. - # Call `@drawSelf` - unless @path.equals(@view.getCachedPath(ctx, @model.id)) - @view.setCachedPath ctx, @model.id, @path - @view.removeSVGGroup ctx, @model.id - group = @view.getSVGGroup(ctx, @model.id) - ownPath = @drawSelf style - group.appendChild(ownPath) if ownPath? - else - group = @view.getSVGGroup(ctx, @model.id) + draw: (boundingRect, style = {}) -> + @drawSelf style + @path.activate() - @oldGroup = group ? ctx + for childObj in @children + @view.getViewNodeFor(childObj.child).draw boundingRect, style - # Draw our children. - for childObj in @children - @view.getViewNodeFor(childObj.child).draw group ? ctx, boundingRect, style + children = @children.map (x) -> x.child - return ownPath + if @oldChildren? + for el, i in @oldChildren + unless el.child in children + @view.getViewNodeFor(el.child).clean(el.version) + + @oldChildren = @children.map (x) => { + child: x.child + version: @view.getViewNodeFor(x.child).computedVersion + } + + forceClean: -> + @clean @computedVersion + + clean: (version) -> + if version is @computedVersion and @oldChildren? + for child in @oldChildren + viewNode = @view.getViewNodeFor child.child + viewNode.forceClean() + @path.destroy() + if @textElement? + @textElement.destroy() + if @highlightArea? + @highlightArea.destroy() # ## drawShadow (GenericViewNode) # Draw the shadow of our path # on a canvas context. Used # for drop shadow when dragging. - drawShadow: (ctx) -> - - # ## Debug output - - # ### debugDimensions (GenericViewNode) - # A super-simplified bounding box algorithm - # made just to show dimensions in context. - debugDimensions: (x, y, line, ctx) -> - # Draw a rectangle with our dimensions - ctx.fillStyle = '#00F' - ctx.strokeStyle = '#000' - ctx.lineWidth = 1 - ctx.fillRect x, y, @dimensions[line].width, @dimensions[line].height - ctx.strokeRect x, y, @dimensions[line].width, @dimensions[line].height - - # Recurse on all our children, - # advancing x and y so that there - # is no overlap between boxes - for childObj in @lineChildren[line] - childView = @view.getViewNodeFor childObj.child - - x += childView.getMargins(line).left - childView.debugDimensions x, y, line - childObj.startLine, ctx - x += childView.dimensions[line - childObj.startLine].width + childView.getMargins(line).right - - # ### debugAllDimensions (GenericViewNode) - # Run `debugDimensions` on all lines. - debugAllDimensions: (ctx) -> - # Make the context transparent - # a bit, so that we can see the stack depth - # of each block - ctx.globalAlpha = 0.1; y = 0 - - for size, line in @dimensions - @debugDimensions 0, y, line, ctx - y += size.height - - ctx.globalAlpha = 1 - - # ### debugAllBoundingBoxes (GenericViewNode) - # Draw our bounding box on each line, and ask - # all our children to do so too. - debugAllBoundingBoxes: (ctx) -> - # Make the context transparent for easy depth - # perception - ctx.globalAlpha = 0.1 - - # Draw bounding box - for bound in @bounds - bound.fill ctx, '#00F' - bound.stroke ctx, '#000' - - # Recurse - for childObj in @children - @view.getViewNodeFor(childObj.child).debugAllBoundingBoxes ctx - - ctx.globalAlpha = 1 + drawShadow: -> class ListViewNode extends GenericViewNode constructor: (@model, @view) -> @@ -1272,11 +1167,11 @@ exports.View = class View # ## drawShadow # Draw the drop-shadow of the path on the given # context. - drawShadow: (ctx, x, y) -> - @path.drawShadow ctx, x, y, @view.opts.shadowBlur + drawShadow: (x, y) -> + @path.drawShadow x, y, @view.opts.shadowBlur for childObj in @children - @view.getViewNodeFor(childObj.child).drawShadow ctx, x, y + @view.getViewNodeFor(childObj.child).drawShadow x, y return null @@ -1664,7 +1559,9 @@ exports.View = class View newPath.push point # Make a Path object out of these points - @path = new @view.draw.Path(); @path.push el for el in newPath + @path.setPoints newPath + if @model.type is 'block' + @path.style.fillColor = @view.getColor @model.color # Return it. return @path @@ -1727,13 +1624,13 @@ exports.View = class View @path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F' @path.style.strokeColor = avgColor @path.style.strokeColor, 0.7, '#00F' - drawResult = @path.makeElement() + @path.update() # Unset all the things we changed @path.style.fillColor = oldFill @path.style.strokeColor = oldStroke - return drawResult + return null # # BlockViewNode class BlockViewNode extends ContainerViewNode @@ -1762,17 +1659,8 @@ exports.View = class View return not ('mostly-value' in @model.classes or 'value-only' in @model.classes) - computeOwnPath: -> - super - - @path.style.fillColor = @view.getColor @model.color - @path.style.strokeColor = '#888' - - @path.bevel = true - - return @path - computeOwnDropArea: -> + return unless @model.parent?.type in ['indent', 'document'] # Our drop area is a rectangle of # height dropAreaHeight and a width # equal to our last line width, @@ -1800,7 +1688,6 @@ exports.View = class View # Our highlight area is the a rectangle in the same place, # with a height that can be given by a different option. - @highlightArea = new @view.draw.Path() highlightAreaPoints = [] highlightAreaPoints.push new @view.draw.Point lastBoundsLeft, @dropPoint.y - @view.opts.highlightAreaHeight / 2 + @view.opts.bevelClip @@ -1819,11 +1706,8 @@ exports.View = class View highlightAreaPoints.push new @view.draw.Point lastBoundsLeft + @view.opts.bevelClip, @dropPoint.y + @view.opts.highlightAreaHeight / 2 highlightAreaPoints.push new @view.draw.Point lastBoundsLeft, @dropPoint.y + @view.opts.highlightAreaHeight / 2 - @view.opts.bevelClip - @highlightArea.push point for point in highlightAreaPoints - - @highlightArea.style.lineWidth = 1 - @highlightArea.style.strokeColor = '#ff0' - @highlightArea.style.fillColor = '#ff0' + @highlightArea.setPoints highlightAreaPoints + @highlightArea.destroy() # # SocketViewNode class SocketViewNode extends ContainerViewNode @@ -1906,8 +1790,7 @@ exports.View = class View return @path if @model.start.next.type is 'blockStart' - view = @view.getViewNodeFor @model.start.next.container - @path = view.computeOwnPath().clone() + @path.style.fillColor = 'none' # Otherwise, call super. else @@ -1941,14 +1824,19 @@ exports.View = class View # things. computeOwnDropArea: -> if @model.start.next.type is 'blockStart' - @dropArea = @highlightArea = null + @dropArea = null + @highlightArea.destroy() else + console.log 'updating socket highlight', @model.stringify() @dropPoint = @bounds[0].upperLeftCorner() - @highlightArea = @path.clone() - @highlightArea.noclip = true + ### + @highlightArea.setPoints @path._points @highlightArea.style.strokeColor = '#FF0' @highlightArea.style.fillColor = 'none' @highlightArea.style.lineWidth = @view.opts.padding + @highlightArea.update() + @highlightArea.destroy() + ### # # IndentViewNode class IndentViewNode extends ContainerViewNode @@ -1960,7 +1848,7 @@ exports.View = class View # ## computeOwnPath # An Indent should also have no drawn # or hit-tested path. - computeOwnPath: -> @path = new @view.draw.Path() + computeOwnPath: -> # ## computeChildren computeChildren: -> @@ -2025,7 +1913,6 @@ exports.View = class View # Our highlight area is the a rectangle in the same place, # with a height that can be given by a different option. - @highlightArea = new @view.draw.Path() highlightAreaPoints = [] highlightAreaPoints.push new @view.draw.Point lastBounds.x, lastBounds.y - @view.opts.highlightAreaHeight / 2 + @view.opts.bevelClip @@ -2044,11 +1931,9 @@ exports.View = class View highlightAreaPoints.push new @view.draw.Point lastBounds.x + @view.opts.bevelClip, lastBounds.y + @view.opts.highlightAreaHeight / 2 highlightAreaPoints.push new @view.draw.Point lastBounds.x, lastBounds.y + @view.opts.highlightAreaHeight / 2 - @view.opts.bevelClip - @highlightArea.push point for point in highlightAreaPoints + @highlightArea.setPoints highlightAreaPoints + @highlightArea.destroy() - @highlightArea.style.lineWidth = 1 - @highlightArea.style.strokeColor = '#ff0' - @highlightArea.style.fillColor = '#ff0' # # DocumentViewNode # Represents a Document. Draws little, but @@ -2058,7 +1943,7 @@ exports.View = class View # ## computeOwnPath # - computeOwnPath: -> @path = new @view.draw.Path() + computeOwnPath: -> # ## computeOwnDropArea # @@ -2067,7 +1952,6 @@ exports.View = class View computeOwnDropArea: -> @dropPoint = @bounds[0].upperLeftCorner() - @highlightArea = new @view.draw.Path() highlightAreaPoints = [] lastBounds = new @view.draw.NoRectangle() @@ -2090,10 +1974,13 @@ exports.View = class View highlightAreaPoints.push new @view.draw.Point lastBounds.x + @view.opts.bevelClip, lastBounds.y + @view.opts.highlightAreaHeight / 2 highlightAreaPoints.push new @view.draw.Point lastBounds.x, lastBounds.y + @view.opts.highlightAreaHeight / 2 - @view.opts.bevelClip - @highlightArea.push point for point in highlightAreaPoints - - @highlightArea.style.fillColor = '#ff0' - @highlightArea.style.strokeColor = '#ff0' + @highlightArea.destroy() + @highlightArea = new @view.draw.Path(highlightAreaPoints, false, { + fillColor: '#FF0' + strokeColor: '#FF0' + lineWidth: 1 + }) + @highlightArea.destroy() return null @@ -2103,7 +1990,12 @@ exports.View = class View # We contain a @view.draw.TextElement to measure # bounding boxes and draw text. class TextViewNode extends GenericViewNode - constructor: (@model, @view) -> super + constructor: (@model, @view) -> + super + @textElement = new @view.draw.Text( + new @view.draw.Point(0, 0), + @model.value + ) # ## computeChildren # @@ -2122,10 +2014,8 @@ exports.View = class View if @computedVersion is @model.version return null - @textElement = new @view.draw.Text( - new @view.draw.Point(0, 0), - @model.value - ) + @textElement.point = new @view.draw.Point 0, 0 + @textElement.value = @model.value height = @view.opts.textHeight @minDimensions[0] = new @view.draw.Size(@textElement.bounds().width, height) @@ -2147,30 +2037,7 @@ exports.View = class View # # Draw the text element itself. drawSelf: (style = {}) -> - unless style.noText - drawResult = @textElement.makeElement() - return drawResult - - # ## Debug output - - # ### debugDimensions - # - # Draw the text element wherever we're told. - debugDimensions: (x, y, line, ctx) -> - ctx.globalAlpha = 1 - oldPoint = @textElement.point - @textElement.point = new @view.draw.Point x, y - @textElement.draw ctx - @textElement.point = oldPoint - ctx.globalAlpha = 0.1 - - # ### debugAllBoundingBoxes - # Draw our text element - debugAllBoundingBoxes: (ctx) -> - ctx.globalAlpha = 1 - @computeOwnPath() - @textElement.draw ctx - ctx.globalAlpha = 0.1 + @textElement.update() toRGB = (hex) -> # Convert to 6-char hex if not already there From 783770eabd04497d24f9005223bcf11805d6434e Mon Sep 17 00:00:00 2001 From: Anthony Bau Date: Mon, 20 Jul 2015 16:01:46 -0400 Subject: [PATCH 007/268] Fixes for hand-computed bevels --- example/example-svg.html | 2 +- src/draw.coffee | 206 ++++++++++++++++++++++++++++----------- src/example-svg.coffee | 19 ++++ src/helper.coffee | 1 + src/view.coffee | 17 ++-- 5 files changed, 182 insertions(+), 63 deletions(-) diff --git a/example/example-svg.html b/example/example-svg.html index 34519271..64347a59 100644 --- a/example/example-svg.html +++ b/example/example-svg.html @@ -1,7 +1,7 @@ - +
 for el in [1..3]
   fd 10
diff --git a/src/draw.coffee b/src/draw.coffee
index dc26ce6a..ae1ed806 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -18,10 +18,33 @@ _area = (a, b, c) -> (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y)
 _intersects = (a, b, c, d) ->
   ((_area(a, b, c) > 0) != (_area(a, b, d) > 0)) and ((_area(c, d, a) > 0) != (_area(c, d, b) > 0))
 
-_bisector = (a, b, c) ->
-  a.from(b).normalize().add(
-    c.from(b).normalize()
-  ).normalize()
+_bisector = (a, b, c, magnitude = 1) ->
+  if a.equals(b) or b.equals(c)
+    return null
+
+  sample = a.from(b).normalize()
+
+  diagonal = sample.plus(
+    sampleB = c.from(b).normalize()
+  )
+
+  if diagonal.x is 0 and diagonal.y is 0
+    return null
+  else if sample.equals(sampleB)
+    return null
+
+  diagonal = diagonal.normalize()
+
+  scalar = magnitude / Math.sqrt((1 - diagonal.dot(sample) ** 2))
+
+  diagonal.x *= scalar
+  diagonal.y *= scalar
+
+  if _area(a, b, c) < 0
+    diagonal.x *= -1
+    diagonal.y *= -1
+
+  return diagonal
 
 max = (a, b) -> `(a > b ? a : b)`
 min = (a, b) -> `(b > a ? a : b)`
@@ -83,15 +106,17 @@ exports.Draw = class Draw
 
       magnitude: -> Math.sqrt @x * @x + @y * @y
 
-      mult: (scalar) -> new Point @x * scalar, @y * scalar
+      times: (scalar) -> new Point @x * scalar, @y * scalar
 
-      normalize: -> @mult 1 / @mag()
+      normalize: -> @times 1 / @magnitude()
 
       translate: (vector) ->
         @x += vector.x; @y += vector.y
 
       add: (x, y) -> @x += x; @y += y
 
+      dot: (other) -> @x * other.x + @y * other.y
+
       plus: ({x, y}) -> new Point @x + x, @y + y
 
       toMagnitude: (mag) ->
@@ -222,7 +247,9 @@ exports.Draw = class Draw
         if @_cacheFlag
           if @_points.length is 0
             @_bounds = new NoRectangle()
+            @_lightBevelPath = ''
           else
+            # Bounds
             minX = minY = Infinity
             maxX = maxY = 0
             for point in @_points
@@ -235,6 +262,89 @@ exports.Draw = class Draw
             @_bounds.x = minX; @_bounds.y = minY
             @_bounds.width = maxX - minX; @_bounds.height = maxY - minY
 
+            # Light bevels
+            subpaths = []
+            outsidePoints = []
+            insidePoints = []
+            for point, i in @_points[1..]
+              if (point.x > @_points[i].x and point.y <= @_points[i].y) or
+                 (point.y < @_points[i].y and point.x >= @_points[i].x)
+                if outsidePoints.length is 0
+                  insetCoord = @getInsetCoordinate i, BEVEL_SIZE
+                  if insetCoord?
+                    outsidePoints.push @_points[i]
+                    insidePoints.push insetCoord
+                insetCoord = @getInsetCoordinate i + 1, BEVEL_SIZE
+                if insetCoord?
+                  outsidePoints.push point
+                  insidePoints.push insetCoord
+              else unless point.equals(@_points[i]) or outsidePoints.length is 0
+                subpaths.push(
+                  'M' + outsidePoints.concat(insidePoints.reverse()).map((point) -> "#{ point.x} #{ point.y}").join(" L") + ' Z'
+                )
+                outsidePoints.length = insidePoints.length = 0
+
+            if @_points[0].x > @_points[@_points.length - 1].x or
+                @_points[0].y < @_points[@_points.length - 1].y
+              if outsidePoints.length is 0
+                insetCoord = @getInsetCoordinate @_points.length - 1, BEVEL_SIZE
+                if insetCoord?
+                  outsidePoints.push @_points[@_points.length - 1]
+                  insidePoints.push insetCoord
+              insetCoord = @getInsetCoordinate 0, BEVEL_SIZE
+              if insetCoord?
+                outsidePoints.push @_points[0]
+                insidePoints.push insetCoord
+
+            if outsidePoints.length > 0
+              subpaths.push(
+                'M' + outsidePoints.concat(insidePoints.reverse()).map((point) -> "#{point.x} #{point.y}").join(" L") + ' Z'
+              )
+
+            @_lightBevelPath = subpaths.join(' ')
+
+            # Dark bevels
+            subpaths = []
+            outsidePoints = []
+            insidePoints = []
+            for point, i in @_points[1..]
+              if (point.x < @_points[i].x and point.y >= @_points[i].y) or
+                 (point.y > @_points[i].y and point.x <= @_points[i].x)
+                if outsidePoints.length is 0
+                  insetCoord = @getInsetCoordinate i, BEVEL_SIZE
+                  if insetCoord?
+                    outsidePoints.push @_points[i]
+                    insidePoints.push insetCoord
+
+                insetCoord = @getInsetCoordinate i + 1, BEVEL_SIZE
+                if insetCoord?
+                  outsidePoints.push point
+                  insidePoints.push insetCoord
+              else unless point.equals(@_points[i]) or outsidePoints.length is 0
+                subpaths.push(
+                  'M' + outsidePoints.concat(insidePoints.reverse()).map((point) -> "#{point.x} #{point.y}").join(" L") + ' Z'
+                )
+                outsidePoints.length = insidePoints.length = 0
+
+            if @_points[0].x < @_points[@_points.length - 1].x or
+                @_points[0].y > @_points[@_points.length - 1].y
+              if outsidePoints.length is 0
+                insetCoord = @getInsetCoordinate @_points.length - 1, BEVEL_SIZE
+                if insetCoord?
+                  outsidePoints.push @_points[@_points.length - 1]
+                  insidePoints.push insetCoord
+              insetCoord = @getInsetCoordinate 0, BEVEL_SIZE
+              if insetCoord?
+                outsidePoints.push @_points[0]
+                insidePoints.push insetCoord
+
+            if outsidePoints.length > 0
+              subpaths.push(
+                'M' + outsidePoints.concat(insidePoints.reverse()).map((point) -> "#{point.x} #{point.y}").join(" L") + ' Z'
+              )
+
+            @_darkBevelPath = subpaths.join(' ')
+
             @_cacheFlag = false
 
       setPoints: (points) ->
@@ -338,12 +448,39 @@ exports.Draw = class Draw
         pathCommands.push "Z"
         return pathCommands.join ' '
 
+      getInsetCoordinate: (i, length) ->
+        j = i; prev = @_points[i]
+        while prev.equals(@_points[i]) and j > i - @_points.length
+          j--
+          prev = @_points[j %% @_points.length]
+
+        k = i; next = @_points[i]
+        while next.equals(@_points[i]) and k < i + @_points.length
+          k++
+          next = @_points[k %% @_points.length]
+
+        vector = _bisector prev, @_points[i], next, length
+        return null unless vector?
+
+        point = @_points[i].plus vector
+
+        return point
+
+      getLightBevelPath: -> @_clearCache(); @_lightBevelPath
+      getDarkBevelPath: -> @_clearCache(); @_darkBevelPath
+
       # TODO unhackify
       makeElement: ->
         @_clearCache()
 
         pathElement = document.createElementNS SVG_STANDARD, 'path'
 
+        ###
+        @darkPath = document.createElementNS SVG_STANDARD, 'path'
+        @darkPath.setAttribute 'fill', avgColor @style.fillColor, 0.7 '#000'
+        @darkPath.setAttribute 'd', @getLightBevelPath()
+        ###
+
         if @style.fillColor?
           pathElement.setAttribute 'fill', @style.fillColor
 
@@ -357,57 +494,19 @@ exports.Draw = class Draw
 
         if @bevel
           @backgroundPathElement = pathElement
-          @foregroundPathElement = document.createElementNS SVG_STANDARD, 'path'
-          @foregroundPathElement.setAttribute 'd', pathString
-          @foregroundPathElement.setAttribute 'fill', @style.fillColor
-          container = document.createElementNS SVG_STANDARD, 'g'
           pathElement = document.createElementNS SVG_STANDARD, 'g'
 
-          bigClipPath = document.createElementNS SVG_STANDARD, 'clipPath'
-          @bigClipPathElement = document.createElementNS SVG_STANDARD, 'path'
-          @bigClipPathElement.setAttribute 'd', pathString
-          bigClipPath.appendChild @bigClipPathElement
-          bigClipPath.setAttribute 'id', clipId = 'droplet-clip-path-' + helper.generateGUID()
-          container.appendChild bigClipPath
-
-          littleClipPathA = document.createElementNS SVG_STANDARD, 'clipPath'
-          @littleClipPathAElement = document.createElementNS SVG_STANDARD, 'path'
-          @littleClipPathAElement.setAttribute 'd', pathString
-          @littleClipPathAElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})"
-          littleClipPathA.appendChild @littleClipPathAElement
-          littleClipPathA.setAttribute 'id', littleClipAId = 'droplet-clip-path-' + helper.generateGUID()
-          container.appendChild littleClipPathA
-
-          littleClipPath = document.createElementNS SVG_STANDARD, 'clipPath'
-          littleClipPath.setAttribute 'clip-path', "url(##{littleClipAId})"
-          @littleClipPathElement = document.createElementNS SVG_STANDARD, 'path'
-          @littleClipPathElement.setAttribute 'd', pathString
-          @littleClipPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})"
-          littleClipPath.appendChild @littleClipPathElement
-          littleClipPath.setAttribute 'id', littleClipId = 'droplet-clip-path-' + helper.generateGUID()
-          container.appendChild littleClipPath
-
-          pathElement.setAttribute 'clip-path', "url(##{clipId})"
-          @foregroundPathElement.setAttribute 'clip-path', "url(##{littleClipId})"
+          @lightPathElement = document.createElementNS SVG_STANDARD, 'path'
+          @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF'
+          @lightPathElement.setAttribute 'd', @getLightBevelPath()
 
           @darkPathElement = document.createElementNS SVG_STANDARD, 'path'
-          @darkPathElement.setAttribute 'd', pathString
           @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000'
-          @darkPathElement.setAttribute 'transform', "translate(#{BEVEL_SIZE},#{BEVEL_SIZE})"
-
-          @lightPathElement = document.createElementNS SVG_STANDARD, 'path'
-          @lightPathElement.setAttribute 'd', pathString
-          @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF'
-          @lightPathElement.setAttribute 'transform', "translate(#{-BEVEL_SIZE},#{-BEVEL_SIZE})"
+          @darkPathElement.setAttribute 'd', @getDarkBevelPath()
 
           pathElement.appendChild @backgroundPathElement
-          pathElement.appendChild @darkPathElement
           pathElement.appendChild @lightPathElement
-          pathElement.appendChild @foregroundPathElement
-          container.appendChild pathElement
-
-          pathElement = container
-
+          pathElement.appendChild @darkPathElement
         else
           pathElement.setAttribute 'stroke', @style.strokeColor
           pathElement.setAttribute 'stroke-width', @style.lineWidth
@@ -420,7 +519,6 @@ exports.Draw = class Draw
 
           if @bevel
             @backgroundPathElement.setAttribute 'fill', @style.fillColor
-            @foregroundPathElement.setAttribute 'fill', @style.fillColor
             @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF'
             @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000'
           else
@@ -439,12 +537,8 @@ exports.Draw = class Draw
           pathString = @getCommandString()
           if @bevel
             @backgroundPathElement.setAttribute 'd', pathString
-            @foregroundPathElement.setAttribute 'd', pathString
-            @lightPathElement.setAttribute 'd', pathString
-            @darkPathElement.setAttribute 'd', pathString
-            @bigClipPathElement.setAttribute 'd', pathString
-            @littleClipPathAElement.setAttribute 'd', pathString
-            @littleClipPathElement.setAttribute 'd', pathString
+            @lightPathElement.setAttribute 'd', @getLightBevelPath()
+            @darkPathElement.setAttribute 'd', @getDarkBevelPath()
           else
             @element.setAttribute 'd', pathString
 
diff --git a/src/example-svg.coffee b/src/example-svg.coffee
index 97273275..45aa0eca 100644
--- a/src/example-svg.coffee
+++ b/src/example-svg.coffee
@@ -1,8 +1,27 @@
 viewlib = require './view.coffee'
+drawlib = require './draw.coffee'
+helper = require './helper.coffee'
 modes = require './modes.coffee'
 
 modeOptions = {}
 
+###
+bigSvg = document.createElementNS helper.SVG_STANDARD, 'svg'
+document.body.appendChild bigSvg
+bigSvg.style.width = '500px'
+bigSvg.style.height = '500px'
+draw = new drawlib.Draw(bigSvg)
+path = new draw.Path([
+  new draw.Point 0, 0
+  new draw.Point 100, 0
+  new draw.Point 100, 100
+  new draw.Point 0, 100
+], true, {
+  fillColor: '#AAF'
+})
+path.update()
+###
+
 exports.setModeOptions = (language, options) ->
   modeOptions[language] = options
 
diff --git a/src/helper.coffee b/src/helper.coffee
index ca076b19..04114cbc 100644
--- a/src/helper.coffee
+++ b/src/helper.coffee
@@ -9,6 +9,7 @@ exports.BLOCK_ONLY = 1
 exports.MOSTLY_BLOCK = 2
 exports.MOSTLY_VALUE = 3
 exports.VALUE_ONLY = 4
+exports.SVG_STANDARD = 'http://www.w3.org/2000/svg'
 
 exports.ENCOURAGE = 1
 exports.DISCOURAGE = 0
diff --git a/src/view.coffee b/src/view.coffee
index f475b274..70173646 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -1533,6 +1533,9 @@ exports.View = class View
           @addTab right, new @view.draw.Point @bounds[@lineLength - 1].x + @view.opts.tabOffset,
             @bounds[@lineLength - 1].bottom()
 
+      left = dedupe left
+      right = dedupe right
+
       # Reverse the left and concatenate it with the right
       # to make a counterclockwise path
       path = left.reverse().concat right
@@ -1974,12 +1977,7 @@ exports.View = class View
       highlightAreaPoints.push new @view.draw.Point lastBounds.x + @view.opts.bevelClip, lastBounds.y + @view.opts.highlightAreaHeight / 2
       highlightAreaPoints.push new @view.draw.Point lastBounds.x, lastBounds.y + @view.opts.highlightAreaHeight / 2 - @view.opts.bevelClip
 
-      @highlightArea.destroy()
-      @highlightArea = new @view.draw.Path(highlightAreaPoints, false, {
-        fillColor: '#FF0'
-        strokeColor: '#FF0'
-        lineWidth: 1
-      })
+      @highlightArea.setPoints highlightAreaPoints
       @highlightArea.destroy()
 
       return null
@@ -2069,3 +2067,10 @@ avgColor = (a, factor, b) ->
   newRGB = (a[i] * factor + b[i] * (1 - factor) for k, i in a)
 
   return toHex newRGB
+
+dedupe = (path) ->
+  return path.filter (x, i) ->
+    if i is 0
+      return true
+    else return not x.equals(path[i - 1])
+

From 5414067254d3f4894135890118cac075415fdff6 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Mon, 20 Jul 2015 17:42:53 -0400
Subject: [PATCH 008/268] Actual perfect bevels with deduping

---
 src/view.coffee | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/view.coffee b/src/view.coffee
index 70173646..781968b8 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -2072,5 +2072,10 @@ dedupe = (path) ->
   return path.filter (x, i) ->
     if i is 0
       return true
-    else return not x.equals(path[i - 1])
+    else
+      if x.equals(path[i - 1])
+        return false
+      if i < path.length - 1 and x.from(path[i - 1]).normalize().equals(path[i + 1].from(x).normalize())
+        return false
+      return true
 

From cb1d25b6ae4cbdf464a68324f86a12433ffdb135 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Mon, 20 Jul 2015 18:34:13 -0400
Subject: [PATCH 009/268] Fix dragging graphics

---
 src/controller.coffee |  4 ++--
 src/draw.coffee       | 37 ++++++++++++++++++++++++-------------
 src/view.coffee       | 21 +++++++++------------
 3 files changed, 35 insertions(+), 27 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index 8227ed38..a2feab05 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -1270,10 +1270,10 @@ hook 'mousemove', 0, (point, event, state) ->
         @redrawHighlights()
 
         if best?
-          @lastHighlightPath?.destroy?()
+          @lastHighlightPath?.deactivate?()
           @lastHighlightPath = @view.getViewNodeFor(best).highlightArea
           @lastHighlightPath.update()
-          @lastHighlightPath.activate()
+          @lastHighlightPath.focus()
           @maskFloatingPaths(best.getDocument())
 
         @lastHighlight = best
diff --git a/src/draw.coffee b/src/draw.coffee
index ae1ed806..021e41c8 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -237,17 +237,18 @@ exports.Draw = class Draw
         @_cacheFlag = true
         @_bounds = new NoRectangle()
 
+        @active = true
+
         @_clearCache()
 
         @element = @makeElement()
         self.ctx.appendChild @element
 
       _clearCache: ->
-        @_cacheFlag = true
         if @_cacheFlag
           if @_points.length is 0
             @_bounds = new NoRectangle()
-            @_lightBevelPath = ''
+            @_lightBevelPath = @_darkBevelPath = ''
           else
             # Bounds
             minX = minY = Infinity
@@ -467,7 +468,11 @@ exports.Draw = class Draw
         return point
 
       getLightBevelPath: -> @_clearCache(); @_lightBevelPath
-      getDarkBevelPath: -> @_clearCache(); @_darkBevelPath
+      getDarkBevelPath: ->
+        @_clearCache()
+        unless @_darkBevelPath?
+          debugger
+        return @_darkBevelPath
 
       # TODO unhackify
       makeElement: ->
@@ -475,12 +480,6 @@ exports.Draw = class Draw
 
         pathElement = document.createElementNS SVG_STANDARD, 'path'
 
-        ###
-        @darkPath = document.createElementNS SVG_STANDARD, 'path'
-        @darkPath.setAttribute 'fill', avgColor @style.fillColor, 0.7 '#000'
-        @darkPath.setAttribute 'd', @getLightBevelPath()
-        ###
-
         if @style.fillColor?
           pathElement.setAttribute 'fill', @style.fillColor
 
@@ -547,12 +546,19 @@ exports.Draw = class Draw
           @element.setAttribute 'visibility', 'visible'
           @active = true
 
-      destroy: ->
+      deactivate: ->
         if @active
-          #ctx.removeChild @element
           @element.setAttribute 'visibility', 'hidden'
           @active = false
 
+      destroy: ->
+        @deactivate()
+        self.ctx.removeChild @element
+
+      focus: ->
+        @activate()
+        self.ctx.appendChild @element
+
       clone: ->
         clone = new Path(@_points.slice(0), @bevel, {
           lineWidth: @style.lineWidth
@@ -622,10 +628,15 @@ exports.Draw = class Draw
           text = document.createTextNode @value.replace(/ /g, '\u00A0')
           element.appendChild text
 
-      destroy: ->
-        #self.ctx.removeChild @element
+      deactivate: ->
         @element.setAttribute 'visibility', 'hidden'
 
+      activate: ->
+        @element.setAttribute 'visibility', 'visible'
+
+      destroy: ->
+        self.ctx.removeChild @element
+
   refreshFontCapital:  ->
     metrics = helper.fontMetrics(@fontFamily, @fontSize)
     @fontAscent = metrics.prettytop
diff --git a/src/view.coffee b/src/view.coffee
index 781968b8..ee5cc926 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -215,7 +215,7 @@ exports.View = class View
         strokeColor: '#FF0'
         lineWidth: 1
       })
-      @highlightArea.destroy()
+      @highlightArea.deactivate()
 
       # Versions. The corresponding
       # Model will keep corresponding version
@@ -742,11 +742,11 @@ exports.View = class View
         for child in @oldChildren
           viewNode = @view.getViewNodeFor child.child
           viewNode.forceClean()
-        @path.destroy()
+        @path.deactivate()
         if @textElement?
-          @textElement.destroy()
+          @textElement.deactivate()
         if @highlightArea?
-          @highlightArea.destroy()
+          @highlightArea.deactivate()
 
     # ## drawShadow (GenericViewNode)
     # Draw the shadow of our path
@@ -1710,7 +1710,7 @@ exports.View = class View
       highlightAreaPoints.push new @view.draw.Point lastBoundsLeft, @dropPoint.y + @view.opts.highlightAreaHeight / 2 - @view.opts.bevelClip
 
       @highlightArea.setPoints highlightAreaPoints
-      @highlightArea.destroy()
+      @highlightArea.deactivate()
 
   # # SocketViewNode
   class SocketViewNode extends ContainerViewNode
@@ -1828,18 +1828,15 @@ exports.View = class View
     computeOwnDropArea: ->
       if @model.start.next.type is 'blockStart'
         @dropArea = null
-        @highlightArea.destroy()
+        @highlightArea.deactivate()
       else
-        console.log 'updating socket highlight', @model.stringify()
         @dropPoint = @bounds[0].upperLeftCorner()
-        ###
         @highlightArea.setPoints @path._points
         @highlightArea.style.strokeColor = '#FF0'
         @highlightArea.style.fillColor = 'none'
         @highlightArea.style.lineWidth = @view.opts.padding
         @highlightArea.update()
-        @highlightArea.destroy()
-        ###
+        @highlightArea.deactivate()
 
   # # IndentViewNode
   class IndentViewNode extends ContainerViewNode
@@ -1935,7 +1932,7 @@ exports.View = class View
       highlightAreaPoints.push new @view.draw.Point lastBounds.x, lastBounds.y + @view.opts.highlightAreaHeight / 2 - @view.opts.bevelClip
 
       @highlightArea.setPoints highlightAreaPoints
-      @highlightArea.destroy()
+      @highlightArea.deactivate()
 
 
   # # DocumentViewNode
@@ -1978,7 +1975,7 @@ exports.View = class View
       highlightAreaPoints.push new @view.draw.Point lastBounds.x, lastBounds.y + @view.opts.highlightAreaHeight / 2 - @view.opts.bevelClip
 
       @highlightArea.setPoints highlightAreaPoints
-      @highlightArea.destroy()
+      @highlightArea.deactivate()
 
       return null
 

From fdd4d63b6a3b5a77cbff97082c11fd2f33bf60f4 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Mon, 20 Jul 2015 18:57:33 -0400
Subject: [PATCH 010/268] Add cursors and start on floating blocks

---
 css/droplet.css       | 15 ++++++++++++++
 src/controller.coffee | 46 ++++++++++++++++++++++++-------------------
 src/view.coffee       |  6 ++++++
 3 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/css/droplet.css b/css/droplet.css
index e996037b..e6673714 100644
--- a/css/droplet.css
+++ b/css/droplet.css
@@ -186,6 +186,9 @@
   position: absolute;
   top: 0; bottom: 0; right: 0; left: 0;
   z-index: 9999;
+  cursor: -webkit-grabbing;
+  cursor: -moz-grabbing;
+  cursor: grabbing;
 }
 .droplet-transitioning-element {
   position: absolute;
@@ -310,4 +313,16 @@
 }
 text {
   white-space: pre;
+  pointer-events: none;
+}
+.droplet-block-path {
+  cursor: -webkit-grab;
+  cursor: -moz-grab;
+  cursor: grab;
+}
+.droplet-socket-path {
+  cursor: text;
+}
+.droplet-cursor-rect {
+  cursor: text; 
 }
diff --git a/src/controller.coffee b/src/controller.coffee
index a2feab05..b41aaf22 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -477,32 +477,32 @@ Editor::redrawMain = (opts = {}) ->
 
         startHeight = blockView.bounds[0].height + 10
 
-        # Make the path surrounding the gray box (with rounded corners)
-        record.grayBoxPath = path = new @view.draw.Path()
-        path.push new @view.draw.Point rectangle.right() - 5, rectangle.y
-        path.push new @view.draw.Point rectangle.right(), rectangle.y + 5
-        path.push new @view.draw.Point rectangle.right(), rectangle.bottom() - 5
-        path.push new @view.draw.Point rectangle.right() - 5, rectangle.bottom()
+        points = []
+
+        # Make the points surrounding the gray box (with rounded corners)
+        points.push new @view.draw.Point rectangle.right() - 5, rectangle.y
+        points.push new @view.draw.Point rectangle.right(), rectangle.y + 5
+        points.push new @view.draw.Point rectangle.right(), rectangle.bottom() - 5
+        points.push new @view.draw.Point rectangle.right() - 5, rectangle.bottom()
 
         if blockView.lineLength > 1
-          path.push new @view.draw.Point rectangle.x + 5, rectangle.bottom()
-          path.push new @view.draw.Point rectangle.x, rectangle.bottom() - 5
+          points.push new @view.draw.Point rectangle.x + 5, rectangle.bottom()
+          points.push new @view.draw.Point rectangle.x, rectangle.bottom() - 5
         else
-          path.push new @view.draw.Point rectangle.x, rectangle.bottom()
+          points.push new @view.draw.Point rectangle.x, rectangle.bottom()
 
         # Handle
-        path.push new @view.draw.Point rectangle.x, rectangle.y + startHeight
-        path.push new @view.draw.Point rectangle.x - startWidth + 5, rectangle.y + startHeight
-        path.push new @view.draw.Point rectangle.x - startWidth, rectangle.y + startHeight - 5
-        path.push new @view.draw.Point rectangle.x - startWidth, rectangle.y + 5
-        path.push new @view.draw.Point rectangle.x - startWidth + 5, rectangle.y
+        points.push new @view.draw.Point rectangle.x, rectangle.y + startHeight
+        points.push new @view.draw.Point rectangle.x - startWidth + 5, rectangle.y + startHeight
+        points.push new @view.draw.Point rectangle.x - startWidth, rectangle.y + startHeight - 5
+        points.push new @view.draw.Point rectangle.x - startWidth, rectangle.y + 5
+        points.push new @view.draw.Point rectangle.x - startWidth + 5, rectangle.y
 
-        path.push new @view.draw.Point rectangle.x, rectangle.y
+        points.push new @view.draw.Point rectangle.x, rectangle.y
 
-        path.bevel = true
-        path.style = {
+        record.grayBoxPath = path = new @view.draw.Path(points, true, {
           fillColor: GRAY_BLOCK_COLOR
-        }
+        })
 
         if opts.boundingRectangle?
           opts.boundingRectangle.unite path.bounds()
@@ -517,6 +517,7 @@ Editor::redrawMain = (opts = {}) ->
         blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize)
       @mainCtx.fillText(@mode.endComment, record.grayBox.right() - endWidth - 5, bottomTextPosition)
       ###
+      console.log 'drawing!'
 
       blockView.draw rect, {
         grayscale: false
@@ -1403,6 +1404,7 @@ Editor::inDisplay = (block) -> (block.container ? block).getDocument() in @getDo
 # blocks without a highlight.
 hook 'mouseup', 0, (point, event, state) ->
   if @draggingBlock? and not @lastHighlight? and not @dragReplacing
+    console.log 'floatifying'
     # Before we put this block into our list of floating blocks,
     # we need to figure out where on the main canvas
     # we are going to render it.
@@ -1421,11 +1423,13 @@ hook 'mouseup', 0, (point, event, state) ->
     palettePoint = @trackerPointToPalette point
     if 0 < palettePoint.x - @scrollOffsets.palette.x < @paletteCanvas.width and
        0 < palettePoint.y - @scrollOffsets.palette.y < @paletteCanvas.height or not
-       (-@gutter.offsetWidth < renderPoint.x - @scrollOffsets.main.x < @mainCanvas.width and
-       0 < renderPoint.y - @scrollOffsets.main.y< @mainCanvas.height)
+       (-@gutter.offsetWidth < renderPoint.x < @mainCanvas.offsetWidth and
+       0 < renderPoint.y < @mainCanvas.offsetHeight)
       if @draggingBlock is @lassoSelection
         @lassoSelection = null
 
+      console.log 'deletifying'
+
       @endDrag()
       return
 
@@ -1439,6 +1443,7 @@ hook 'mouseup', 0, (point, event, state) ->
     @pushUndo new FloatingOperation @floatingBlocks.length, newDocument, renderPoint, 'create'
 
     # Add this block to our list of floating blocks
+    console.log 'pushing a floater'
     @floatingBlocks.push new FloatingBlockRecord(
       newDocument
       renderPoint
@@ -1835,6 +1840,7 @@ Editor::redrawTextHighlights = (scrollIntoView = false) ->
     @cursorRect.setAttribute 'y', textFocusView.bounds[startRow].y,
     @cursorRect.setAttribute 'width', 1
     @cursorRect.setAttribute 'height', @view.opts.textHeight
+    @cursorRect.setAttribute 'class', 'droplet-cursor-rect'
 
     @textInputHighlighted = false
 
diff --git a/src/view.coffee b/src/view.coffee
index ee5cc926..81e828e0 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -1566,6 +1566,9 @@ exports.View = class View
       if @model.type is 'block'
         @path.style.fillColor = @view.getColor @model.color
 
+        # Set its cursor TODO make a Draw method for this
+        @path.element.setAttribute 'class', 'droplet-block-path'
+
       # Return it.
       return @path
 
@@ -1803,6 +1806,9 @@ exports.View = class View
       # gray border.
       @path.style.fillColor = '#FFF'
 
+      # Set its cursor TODO make a Draw method for this
+      @path.element.setAttribute 'class', 'droplet-socket-path'
+
       return @path
 
     # ## drawSelf (SocketViewNode)

From 8e06f7ca9de6ce5c2e5a75ab508a72a7b4030836 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 21 Jul 2015 09:52:44 -0400
Subject: [PATCH 011/268] Fix some lasso select graphics

---
 src/controller.coffee | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index b41aaf22..a8b24b37 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -2315,6 +2315,7 @@ hook 'mousemove', 0, (point, event, state) ->
         return true
       else
         @lassoSelection = null
+        @redrawLassoHighlight()
         return false
 
     unless @lassoSelectionDocument? and findLassoSelect @lassoSelectionDocument
@@ -2324,13 +2325,19 @@ hook 'mousemove', 0, (point, event, state) ->
           break
 
 Editor::redrawLassoHighlight = ->
+  mainCanvasRectangle = new @draw.Rectangle(
+    @scrollOffsets.main.x,
+    @scrollOffsets.main.y,
+    @mainCanvas.width,
+    @mainCanvas.height
+  )
+
+  # Remove any existing selections
+  tree = @view.getViewNodeFor @tree
+  tree.draw mainCanvasRectangle, {selected: false}
+
   if @lassoSelection?
-    mainCanvasRectangle = new @draw.Rectangle(
-      @scrollOffsets.main.x,
-      @scrollOffsets.main.y,
-      @mainCanvas.width,
-      @mainCanvas.height
-    )
+    # Add any new selections
     lassoView = @view.getViewNodeFor(@lassoSelection)
     lassoView.absorbCache()
     lassoView.draw mainCanvasRectangle, {selected: true}
@@ -3229,8 +3236,10 @@ hook 'redraw_main', 1, ->
   # jammed up against the edge of the screen.
   #
   # Default this extra space to fontSize (approx. 1 line).
-  height = bounds.bottom() +
-    (@options.extraBottomHeight ? @fontSize)
+  height = Math.max(
+    bounds.bottom() + (@options.extraBottomHeight ? @fontSize),
+    @dropletElement.offsetHeight
+  )
 
   @mainCanvas.setAttribute 'height', height
   @mainCanvas.style.height = "#{height}px"

From fa5c01154a3813dbcbfc056405a9a59d28da33fe Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 21 Jul 2015 11:47:12 -0400
Subject: [PATCH 012/268] Add back comment texts to floating blocks

---
 src/controller.coffee | 53 +++++++++++++++++++++++++++++++------------
 1 file changed, 39 insertions(+), 14 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index 1cdc1939..15de5dcc 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -41,7 +41,7 @@ CONTROL_KEYS = [17, 162, 163]
 GRAY_BLOCK_MARGIN = 5
 GRAY_BLOCK_HANDLE_WIDTH = 15
 GRAY_BLOCK_HANDLE_HEIGHT = 30
-GRAY_BLOCK_COLOR = '#FFF'
+GRAY_BLOCK_COLOR = 'rgba(256, 256, 256, 0.5)'
 GRAY_BLOCK_BORDER = '#AAA'
 
 userAgent = ''
@@ -451,7 +451,7 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
         fillColor: GRAY_BLOCK_COLOR
         strokeColor: GRAY_BLOCK_BORDER
         lineWidth: 4
-        dotted: '5 8'
+        dotted: '8 5'
         cssClass: 'droplet-floating-container'
       }
     )
@@ -492,12 +492,22 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
 
   record.grayBoxPath.update() #draw @mainCtx
   record.grayBoxPath.focus()
-  ### TODO
-  @mainCtx.fillStyle = '#000'
-  @mainCtx.fillText(@mode.startComment, blockView.totalBounds.x - startWidth,
-    blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize)
-  @mainCtx.fillText(@mode.endComment, record.grayBox.right() - endWidth - 5, bottomTextPosition)
-  ###
+  record.startText ?= new @view.draw.Text(
+    (new @view.draw.Point(0, 0)), @mode.startComment
+  )
+  record.endText ?= new @view.draw.Text(
+    (new @view.draw.Point(0, 0)), @mode.startComment
+  )
+
+  record.startText.point.x = blockView.totalBounds.x - startWidth
+  record.startText.point.y = blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize
+  record.startText.update()
+  record.startText.focus()
+
+  record.endText.point.x = record.grayBox.right() - endWidth - 5
+  record.endText.point.y = bottomTextPosition
+  record.endText.update()
+  record.endText.focus()
 
   blockView.draw rect, {
     grayscale: false
@@ -507,6 +517,9 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
 
   blockView.focusAll()
 
+hook 'populate', 0, ->
+  @currentlyDrawnFloatingBlocks = []
+
 Editor::redrawMain = (opts = {}) ->
   unless @currentlyAnimating_suprressRedraw
 
@@ -530,11 +543,22 @@ Editor::redrawMain = (opts = {}) ->
     layoutResult = @view.getViewNodeFor(@tree).layout 0, @nubbyHeight
     @view.getViewNodeFor(@tree).draw rect, options
 
+    for el, i in @currentlyDrawnFloatingBlocks
+      unless el.record in @floatingBlocks
+        el.record.grayBoxPath.destroy()
+        el.record.startText.destroy()
+        el.record.endText.destroy()
+
+    @currentlyDrawnFloatingBlocks = []
+
     # Draw floating blocks
     startWidth = @mode.startComment.length * @fontWidth
     endWidth = @mode.endComment.length * @fontWidth
     for record in @floatingBlocks
-      @drawFloatingBlock(record, startWidth, endWidth, rect, opts)
+      element = @drawFloatingBlock(record, startWidth, endWidth, rect, opts)
+      @currentlyDrawnFloatingBlocks.push {
+        record: record
+      }
 
     # Draw the cursor (if exists, and is inserted)
     @redrawCursors(); @redrawHighlights()
@@ -2483,11 +2507,12 @@ Editor::redrawLassoHighlight = ->
   )
 
   # Remove any existing selections
-  tree = @view.getViewNodeFor @tree
-  tree.draw mainCanvasRectangle, {
-    selected: false
-    noText: @currentlyAnimating # TODO add some modularized way of having global view options
-  }
+  for dropletDocument in @getDocuments()
+    dropletDocumentView = @view.getViewNodeFor dropletDocument
+    dropletDocumentView.draw mainCanvasRectangle, {
+      selected: false
+      noText: @currentlyAnimating # TODO add some modularized way of having global view options
+    }
 
   if @lassoSelection?
     # Add any new selections

From 1e2620a399736d2ab89387764dd264bd073fe330 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 21 Jul 2015 12:44:54 -0400
Subject: [PATCH 013/268] Fix text cursors

---
 css/droplet.css       |   2 +-
 src/controller.coffee | 112 +++++++++++++++++++-----------------------
 2 files changed, 52 insertions(+), 62 deletions(-)

diff --git a/css/droplet.css b/css/droplet.css
index 89e2f4aa..a653ed76 100644
--- a/css/droplet.css
+++ b/css/droplet.css
@@ -324,7 +324,7 @@ text {
 .droplet-socket-path {
   cursor: text;
 }
-.droplet-cursor-rect {
+.droplet-cursor-path {
   cursor: text;
 }
 .droplet-floating-container {
diff --git a/src/controller.coffee b/src/controller.coffee
index 15de5dcc..bb80d597 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -356,7 +356,7 @@ exports.Editor = class Editor
     @scrollOffsets.main.y = @mainScroller.scrollTop
     @scrollOffsets.main.x = @mainScroller.scrollLeft
 
-    # TODO migrate from "transform" to "viewBox"
+    # TODO remove @scrollOffsets.main
     @setScrollOffset @mainCtx, @scrollOffsets.main
 
     # Also update scroll for the highlight ctx, so that
@@ -1034,8 +1034,8 @@ hook 'populate', 0, ->
   @mainCanvas.appendChild @highlightCanvas
 
 Editor::clearHighlightCanvas = ->
-  #@clearCanvas @highlightCtx
-  @cursorRect.style.display = 'none'
+  for path in [@textCursorPath]
+    path.deactivate()
 
 # Utility function for clearing the drag canvas,
 # an operation we will be doing a lot.
@@ -1386,8 +1386,7 @@ hook 'mousemove', 0, (point, event, state) ->
           @lastHighlightPath?.deactivate?()
           @lastHighlightPath = @view.getViewNodeFor(best).highlightArea
           @lastHighlightPath.update()
-          @lastHighlightPath.focus()
-          @maskFloatingPaths(best.getDocument())
+          @qualifiedFocus best, @lastHighlightPath
 
         @lastHighlight = best
 
@@ -1402,6 +1401,14 @@ hook 'mousemove', 0, (point, event, state) ->
       @dragCanvas.style.opacity = 0.85
       @begunTrash = false
 
+Editor::qualifiedFocus = (node, path) ->
+  documentIndex = @documentIndex node
+  if documentIndex < @floatingBlocks.length
+    path.activate()
+    @mainCtx.insertBefore path.element, @floatingBlocks[documentIndex].grayBoxPath.element
+  else
+    path.focus()
+
 hook 'mouseup', 0, ->
   clearTimeout @discourageDropTimeout; @discourageDropTimeout = null
 
@@ -1986,6 +1993,8 @@ Editor::redrawTextInput = ->
 Editor::redrawTextHighlights = (scrollIntoView = false) ->
   return unless @cursorAtSocket()
 
+  @clearHighlightCanvas()
+
   textFocusView = @view.getViewNodeFor @getCursor()
 
   # Determine the coordinate positions
@@ -2007,14 +2016,16 @@ Editor::redrawTextHighlights = (scrollIntoView = false) ->
   #
   # Draw a line if it is just a cursor
   if @hiddenInput.selectionStart is @hiddenInput.selectionEnd
-    @cursorRect.style.display = 'block'
-    @mainCanvas.appendChild @cursorRect
-    @cursorRect.setAttribute 'stroke', '#000'
-    @cursorRect.setAttribute 'x', startPosition
-    @cursorRect.setAttribute 'y', textFocusView.bounds[startRow].y,
-    @cursorRect.setAttribute 'width', 1
-    @cursorRect.setAttribute 'height', @view.opts.textHeight
-    @cursorRect.setAttribute 'class', 'droplet-cursor-rect'
+    @qualifiedFocus @getCursor(), @textCursorPath
+    points = [
+      new @view.draw.Point(startPosition, textFocusView.bounds[startRow].y),
+      new @view.draw.Point(startPosition, textFocusView.bounds[startRow].y + @view.opts.textHeight)
+    ]
+
+    @textCursorPath.setPoints points
+    @textCursorPath.style.strokeColor = '#000'
+    @textCursorPath.update()
+    @qualifiedFocus @getCursor(), @textCursorPath
 
     @textInputHighlighted = false
 
@@ -2022,34 +2033,40 @@ Editor::redrawTextHighlights = (scrollIntoView = false) ->
   else
     @textInputHighlighted = true
 
+    # TODO maybe put this in the view?
+    rectangles = []
+
     if startRow is endRow
-      rect = new @view.draw.Rectangle startPosition,
+      rectangles.push new @view.draw.Rectangle startPosition,
         textFocusView.bounds[startRow].y + @view.opts.textPadding
         endPosition - startPosition, @view.opts.textHeight
 
     else
-      rect = new @view.draw.Rectangle startPosition, textFocusView.bounds[startRow].y + @view.opts.textPadding +
+      rectangles.push new @view.draw.Rectangle startPosition, textFocusView.bounds[startRow].y + @view.opts.textPadding +
         textFocusView.bounds[startRow].right() - @view.opts.textPadding - startPosition, @view.opts.textHeight
 
       for i in [startRow + 1...endRow]
-        rect = new @view.draw.Rectangle textFocusView.bounds[i].x,
+        rectangles.push new @view.draw.Rectangle textFocusView.bounds[i].x,
           textFocusView.bounds[i].y + @view.opts.textPadding,
           textFocusView.bounds[i].width,
           @view.opts.textHeight
 
-      rect = new @view.draw.Rectangle textFocusView.bounds[endRow].x,
+      rectangles.push new @view.draw.Rectangle textFocusView.bounds[endRow].x,
         textFocusView.bounds[endRow].y + @view.opts.textPadding,
         endPosition - textFocusView.bounds[endRow].x,
         @view.opts.textHeight
 
-    @cursorRect.style.display = 'block'
-    @mainCanvas.appendChild @cursorRect
-    @cursorRect.setAttribute 'stroke', 'none'
-    @cursorRect.setAttribute 'fill', 'rgba(0, 0, 256, 0.3)'
-    @cursorRect.setAttribute 'x', rect.x
-    @cursorRect.setAttribute 'y', rect.y
-    @cursorRect.setAttribute 'width', rect.width
-    @cursorRect.setAttribute 'height', rect.height
+    left = []; right = []
+    for el, i in rectangles
+      left.push new @view.draw.Point el.x, el.y
+      left.push new @view.draw.Point el.x, el.bottom()
+      right.push new @view.draw.Point el.right(), el.y
+      right.push new @view.draw.Point el.right(), el.bottom()
+
+    @textCursorPath.setPoints left.concat right.reverse()
+    @textCursorPath.style.strokeColor = 'none'
+    @textCursorPath.update()
+    @qualifiedFocus @getCursor(), @textCursorPath
 
   if scrollIntoView and endPosition > @scrollOffsets.main.x + @mainCanvas.offsetWidth
     @mainScroller.scrollLeft = endPosition - @mainCanvas.offsetWidth + @view.opts.padding
@@ -2521,15 +2538,6 @@ Editor::redrawLassoHighlight = ->
     lassoView.draw mainCanvasRectangle, {selected: true}
     @maskFloatingPaths(@lassoSelection.start.getDocument())
 
-Editor::maskFloatingPaths = (dropletDocument) ->
-  for record, i in @floatingBlocks by -1
-    if record.block is dropletDocument
-      break
-    else
-      0 # TODO masking
-      #record.grayBoxPath.clip(@highlightCtx)
-      #record.grayBoxPath.bounds().clearRect(@highlightCtx)
-
 # Convnience function for validating
 # a lasso selection. A lasso selection
 # cannot contain start tokens without
@@ -3901,46 +3909,28 @@ hook 'populate', 0, ->
 # ================================
 hook 'populate', 0, ->
   @cursorCtx = document.createElementNS SVG_STANDARD, 'g'
-  @cursorRect = document.createElementNS SVG_STANDARD, 'rect'
+  @textCursorPath = new @view.draw.Path([], false, {
+    'strokeColor': '#000'
+    'lineWidth': '2'
+    'fillColor': 'rgba(0, 0, 256, 0.3)'
+    'cssClass': 'droplet-cursor-path'
+  })
 
   @mainCanvas.appendChild @cursorCtx
-  @mainCanvas.appendChild @cursorRect
 
 Editor::strokeCursor = (point) ->
   return unless point?
-  ###
-  @cursorCtx.beginPath()
-
-  @cursorCtx.fillStyle =
-    @cursorCtx.strokeStyle = '#000'
-
-  @cursorCtx.lineCap = 'round'
-
-  @cursorCtx.lineWidth = 3
-
-  w = @view.opts.tabWidth / 2 - CURSOR_WIDTH_DECREASE
-  h = @view.opts.tabHeight - CURSOR_HEIGHT_DECREASE
-
-  arcCenter = new @draw.Point point.x + @view.opts.tabOffset + w + CURSOR_WIDTH_DECREASE,
-    point.y - (w*w + h*h) / (2 * h) + h + CURSOR_HEIGHT_DECREASE / 2
-  arcAngle = Math.atan2 w, (w*w + h*h) / (2 * h) - h
-  startAngle = 0.5 * Math.PI - arcAngle
-  endAngle = 0.5 * Math.PI + arcAngle
-
-  @cursorCtx.arc arcCenter.x, arcCenter.y, (w*w + h*h) / (2 * h), startAngle, endAngle
-
-  @cursorCtx.stroke()
-  ###
+  #@cursorElement.setAttribute 'transform', "translate(#{point.x}, #{point.y})"
 
 Editor::highlightFlashShow = ->
   if @flashTimeout? then clearTimeout @flashTimeout
-  @cursorCtx.style.display = 'block'
+  @textCursorPath.activate()
   @highlightsCurrentlyShown = true
   @flashTimeout = setTimeout (=> @flash()), 500
 
 Editor::highlightFlashHide = ->
   if @flashTimeout? then clearTimeout @flashTimeout
-  @cursorCtx.style.display = 'none'
+  @textCursorPath.deactivate()
   @highlightsCurrentlyShown = false
   @flashTimeout = setTimeout (=> @flash()), 500
 

From 5a1f5324f2a145d40307faec2e2af3832e612daf Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Wed, 22 Jul 2015 16:14:31 -0400
Subject: [PATCH 014/268] Garbage-collect the view

---
 src/controller.coffee | 39 +++++++++++++++++++++------------
 src/view.coffee       | 50 +++++++++++++++++++++++++++++++++++++------
 2 files changed, 69 insertions(+), 20 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index bb80d597..07182ea0 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -523,6 +523,8 @@ hook 'populate', 0, ->
 Editor::redrawMain = (opts = {}) ->
   unless @currentlyAnimating_suprressRedraw
 
+    @view.beginDraw()
+
     # Set our draw tool's font size
     # to the font size we want
     @draw.setGlobalFontSize @fontSize
@@ -580,6 +582,15 @@ Editor::redrawMain = (opts = {}) ->
 
       @fireEvent 'change', []
 
+    @view.cleanupDraw()
+
+    unless @alreadyScheduledCleanup
+      @alreadyScheduledCleanup = true
+      setTimeout (=>
+        @alreadyScheduledCLeanup = false
+        @view.garbageCollect()
+      ), 0
+
     return null
 
 Editor::redrawHighlights = ->
@@ -592,7 +603,6 @@ Editor::redrawHighlights = ->
       @mainCanvas.offsetWidth,
       @mainCanvas.offsetHeight
     ), {grayscale: true}
-    @maskFloatingPaths(@draggingBlock.getDocument())
 
   @redrawCursors()
   @redrawLassoHighlight()
@@ -602,10 +612,9 @@ Editor::clearCursorCanvas = -> #@clearCanvas @cursorCtx
 Editor::redrawCursors = ->
   @clearCursorCanvas()
 
-  if @cursorAtSocket()
-    @redrawTextHighlights()
+  @redrawTextHighlights()
 
-  else unless @lassoSelection?
+  unless @lassoSelection?
     @drawCursor()
 
 Editor::drawCursor = -> @strokeCursor @determineCursorPosition()
@@ -1042,6 +1051,7 @@ Editor::clearHighlightCanvas = ->
 Editor::clearDrag = ->
   if @draggingBlock?
     @dragView.getViewNodeFor(@draggingBlock).forceClean()
+    @dragView.garbageCollect()
   @clearHighlightCanvas()
 
 # On resize, we will want to size the drag canvas correctly.
@@ -1219,16 +1229,16 @@ hook 'mousemove', 1, (point, event, state) ->
     # When we are dragging things, we draw the shadow.
     # Also, we translate the block 1x1 to the right,
     # so that we can see its borders.
-    @dragView.clearCache()
+    @dragView.beginDraw()
     draggingBlockView = @dragView.getViewNodeFor @draggingBlock
     draggingBlockView.layout 1, 1
+    draggingBlockView.drawShadow @dragCtx, 5, 5
+    draggingBlockView.draw()
+    @dragView.garbageCollect()
 
     @dragCanvas.style.width = "#{Math.min draggingBlockView.totalBounds.width + 10, window.screen.width}px"
     @dragCanvas.style.height = "#{Math.min draggingBlockView.totalBounds.height + 10, window.screen.height}px"
 
-    draggingBlockView.drawShadow @dragCtx, 5, 5
-    draggingBlockView.draw new @draw.Rectangle 0, 0, @dragCanvas.offsetWidth, @dragCanvas.offsetHeight
-
     # Translate it immediately into position
     position = new @draw.Point(
       point.x + @draggingOffset.x,
@@ -1991,10 +2001,10 @@ Editor::redrawTextInput = ->
     @redrawMain()
 
 Editor::redrawTextHighlights = (scrollIntoView = false) ->
-  return unless @cursorAtSocket()
-
   @clearHighlightCanvas()
 
+  return unless @cursorAtSocket()
+
   textFocusView = @view.getViewNodeFor @getCursor()
 
   # Determine the coordinate positions
@@ -2536,7 +2546,6 @@ Editor::redrawLassoHighlight = ->
     lassoView = @view.getViewNodeFor(@lassoSelection)
     lassoView.absorbCache()
     lassoView.draw mainCanvasRectangle, {selected: true}
-    @maskFloatingPaths(@lassoSelection.start.getDocument())
 
 # Convnience function for validating
 # a lasso selection. A lasso selection
@@ -3924,13 +3933,15 @@ Editor::strokeCursor = (point) ->
 
 Editor::highlightFlashShow = ->
   if @flashTimeout? then clearTimeout @flashTimeout
-  @textCursorPath.activate()
+  if @cursorAtSocket()
+    @textCursorPath.activate()
   @highlightsCurrentlyShown = true
   @flashTimeout = setTimeout (=> @flash()), 500
 
 Editor::highlightFlashHide = ->
   if @flashTimeout? then clearTimeout @flashTimeout
-  @textCursorPath.deactivate()
+  if @cursorAtSocket()
+    @textCursorPath.deactivate()
   @highlightsCurrentlyShown = false
   @flashTimeout = setTimeout (=> @flash()), 500
 
@@ -4163,7 +4174,7 @@ hook 'redraw_main', 0, (changedBox) ->
 Editor::redrawGutter = (changedBox = true) ->
   treeView = @view.getViewNodeFor @tree
 
-  top = @findLineNumberAtCoordinate @scrollOffsets.main.y
+  top = 0 # TODO @findLineNumberAtCoordinate @scrollOffsets.main.y
   bottom = @findLineNumberAtCoordinate @scrollOffsets.main.y + @mainCanvas.offsetHeight
 
   for line in [top..bottom]
diff --git a/src/view.coffee b/src/view.coffee
index 0cdd7a09..7243851a 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -99,6 +99,8 @@ exports.View = class View
     @map = {}
     @contextMaps = []
 
+    @lastIncludes = {}
+
     @draw = new draw.Draw(@ctx)
 
     # Apply default options
@@ -120,7 +122,25 @@ exports.View = class View
     else
       return @createView(model)
 
-  hasViewNodeFor: (model) -> model? and model.id of @map
+  include: (id) ->
+    @lastIncludes[id] = true
+
+  beginDraw: ->
+    @lastIncludes = {}
+
+  cleanupDraw: ->
+    for key, val of @map
+      unless key of @lastIncludes
+        val.hide()
+
+  garbageCollect: ->
+    for key, val of @map
+      unless key of @lastIncludes
+        val.destroy()
+        delete @map[key]
+
+  hasViewNodeFor: (model) ->
+    model? and model.id of @map
 
   # ## createView
   # Given a model object, create a renderer object
@@ -723,6 +743,7 @@ exports.View = class View
     # May require special effects, like graying-out
     # or blueing for lasso select.
     drawSelf: (style = {}) ->
+      @view.include @model.id
 
     # ## draw (GenericViewNode)
     # Call `drawSelf` and recurse, if we are in the viewport.
@@ -753,11 +774,23 @@ exports.View = class View
         for child in @oldChildren
           viewNode = @view.getViewNodeFor child.child
           viewNode.forceClean()
+        @hide()
+
+    hide: ->
+      if @path?
         @path.deactivate()
-        if @textElement?
-          @textElement.deactivate()
-        if @highlightArea?
-          @highlightArea.deactivate()
+      if @textElement?
+        @textElement.deactivate()
+      if @highlightArea?
+        @highlightArea.deactivate()
+
+    destroy: ->
+      if @path?
+        @path.destroy()
+      if @textElement?
+        @textElement.destroy()
+      if @highlightArea?
+        @highlightArea.destroy()
 
     # ## drawShadow (GenericViewNode)
     # Draw the shadow of our path
@@ -1644,6 +1677,8 @@ exports.View = class View
       @path.style.fillColor = oldFill
       @path.style.strokeColor = oldStroke
 
+      @view.include @model.id
+
       return null
 
   # # BlockViewNode
@@ -1903,7 +1938,8 @@ exports.View = class View
     # ## drawSelf
     #
     # Again, an Indent should draw nothing.
-    drawSelf: -> null
+    drawSelf: ->
+      @view.include @model.id
 
     # ## computeOwnDropArea
     #
@@ -2049,6 +2085,8 @@ exports.View = class View
       else
         @textElement.activate()
 
+      @view.include @model.id
+
 toRGB = (hex) ->
   # Convert to 6-char hex if not already there
   if hex.length is 4

From 64fdb2ff72ebdd27c1e2ea48a70c31d69e6ecd1f Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Wed, 22 Jul 2015 17:48:18 -0400
Subject: [PATCH 015/268] Add cursor graphic back, and restructure Draw a bit

---
 src/controller.coffee | 33 ++++++++++++++++++-----
 src/draw.coffee       | 62 ++++++++++++++++++++++++-------------------
 2 files changed, 60 insertions(+), 35 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index 07182ea0..ae1eef49 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -607,14 +607,16 @@ Editor::redrawHighlights = ->
   @redrawCursors()
   @redrawLassoHighlight()
 
-Editor::clearCursorCanvas = -> #@clearCanvas @cursorCtx
+Editor::clearCursorCanvas = ->
+  @textCursorPath.deactivate()
+  @cursorPath.deactivate()
 
 Editor::redrawCursors = ->
   @clearCursorCanvas()
 
-  @redrawTextHighlights()
-
-  unless @lassoSelection?
+  if @cursorAtSocket()
+    @redrawTextHighlights()
+  else unless @lassoSelection?
     @drawCursor()
 
 Editor::drawCursor = -> @strokeCursor @determineCursorPosition()
@@ -1392,8 +1394,9 @@ hook 'mousemove', 0, (point, event, state) ->
         # pull the drop highlights out into a new canvas.
         @redrawHighlights()
 
+        @lastHighlightPath?.deactivate?()
+
         if best?
-          @lastHighlightPath?.deactivate?()
           @lastHighlightPath = @view.getViewNodeFor(best).highlightArea
           @lastHighlightPath.update()
           @qualifiedFocus best, @lastHighlightPath
@@ -3803,7 +3806,7 @@ Editor::endDrag = ->
   @clearDrag()
   @draggingBlock = null
   @draggingOffset = null
-  @lastHighlightPath?.destroy?()
+  @lastHighlightPath?.deactivate?()
   @lastHighlight = @lastHighlightPath = null
 
   @redrawMain()
@@ -3925,16 +3928,30 @@ hook 'populate', 0, ->
     'cssClass': 'droplet-cursor-path'
   })
 
+  cursorElement = document.createElementNS SVG_STANDARD, 'path'
+  cursorElement.setAttribute 'fill', 'none'
+  cursorElement.setAttribute 'stroke', '#000'
+  cursorElement.setAttribute 'stroke-width', '3'
+  cursorElement.setAttribute 'stroke-linecap', 'round'
+  cursorElement.setAttribute 'd', "M#{@view.opts.tabOffset + CURSOR_WIDTH_DECREASE / 2} 0 " +
+      "Q#{@view.opts.tabOffset + @view.opts.tabWidth / 2} #{@view.opts.tabHeight}" +
+      " #{@view.opts.tabOffset + @view.opts.tabWidth - CURSOR_WIDTH_DECREASE / 2} 0"
+
+  @cursorPath = new @view.draw.ElementWrapper(cursorElement)
+
   @mainCanvas.appendChild @cursorCtx
 
 Editor::strokeCursor = (point) ->
   return unless point?
-  #@cursorElement.setAttribute 'transform', "translate(#{point.x}, #{point.y})"
+  @cursorPath.element.setAttribute 'transform', "translate(#{point.x}, #{point.y})"
+  @qualifiedFocus @getCursor(), @cursorPath
 
 Editor::highlightFlashShow = ->
   if @flashTimeout? then clearTimeout @flashTimeout
   if @cursorAtSocket()
     @textCursorPath.activate()
+  else
+    @cursorPath.activate()
   @highlightsCurrentlyShown = true
   @flashTimeout = setTimeout (=> @flash()), 500
 
@@ -3942,6 +3959,8 @@ Editor::highlightFlashHide = ->
   if @flashTimeout? then clearTimeout @flashTimeout
   if @cursorAtSocket()
     @textCursorPath.deactivate()
+  else
+    @cursorPath.deactivate()
   @highlightsCurrentlyShown = false
   @flashTimeout = setTimeout (=> @flash()), 500
 
diff --git a/src/draw.coffee b/src/draw.coffee
index ceaaaf3b..49aa0642 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -230,17 +230,40 @@ exports.Draw = class Draw
     @NoRectangle = class NoRectangle extends Rectangle
       constructor: -> super(null, null, 0, 0)
 
+    # ## ElementWrapper ###
+    @ElementWrapper = class ElementWrapper
+      constructor: (@element) ->
+        self.ctx.appendChild @element
+        @active = true
+
+      deactivate: ->
+        if @active
+          @active = false
+          @element.setAttribute 'visibility', 'hidden'
+
+      activate: ->
+        unless @active
+          @active = true
+          @element.setAttribute 'visibility', 'visible'
+
+      focus: ->
+        @activate()
+        self.ctx.appendChild @element
+
+      destroy: ->
+        @deactivate()
+        self.ctx.removeChild @element
+
+
     # ## Path ##
     # This is called Path, but is forced to be closed so is actually a polygon.
     # It can do fast translation and rectangular intersection.
-    @Path = class Path
+    @Path = class Path extends ElementWrapper
       constructor: (@_points = [], @bevel = false, @style) ->
         @_cachedTranslation = new Point 0, 0
         @_cacheFlag = true
         @_bounds = new NoRectangle()
 
-        @active = true
-
         @_clearCache()
 
         @style = helper.extend {
@@ -251,7 +274,7 @@ exports.Draw = class Draw
         }, @style
 
         @element = @makeElement()
-        self.ctx.appendChild @element
+        super @element
 
       _clearCache: ->
         if @_cacheFlag
@@ -570,29 +593,13 @@ exports.Draw = class Draw
           else
             @element.setAttribute 'd', pathString
 
-      activate: ->
-        unless @active
-          @element.setAttribute 'visibility', 'visible'
-          @active = true
-
-      deactivate: ->
-        if @active
-          @element.setAttribute 'visibility', 'hidden'
-          @active = false
-
-      destroy: ->
-        @deactivate()
-        self.ctx.removeChild @element
-
-      focus: ->
-        @activate()
-        self.ctx.appendChild @element
-
       clone: ->
         clone = new Path(@_points.slice(0), @bevel, {
           lineWidth: @style.lineWidth
           fillColor: @style.fillColor
           strokeColor: @style.strokeColor
+          dotted: @style.dotted
+          cssClass: @style.cssClass
         })
         clone._clearCache()
         clone.update()
@@ -603,7 +610,7 @@ exports.Draw = class Draw
     # ## Text ##
     # A Text element. Mainly this exists for computing bounding boxes, which is
     # accomplished via ctx.measureText().
-    @Text = class Text
+    @Text = class Text extends ElementWrapper
       constructor: (@point, @value) ->
         @wantedFont = self.fontSize + 'px ' + self.fontFamily
 
@@ -612,14 +619,13 @@ exports.Draw = class Draw
 
         @_bounds = new Rectangle @point.x, @point.y, self.measureCtx.measureText(@value).width, self.fontSize
 
-        @element = @makeElement()
-        self.ctx.appendChild @element
-
-        @active = true
-
         @__lastValue = @value
         @__lastPoint = @point.clone()
 
+        @element = @makeElement()
+
+        super @element
+
       clone: -> new Text @point, @value
       equals: (other) -> other? and @point.equals(other.point) and @value is other.value
 

From 97c7681ff8b7e5d1dd335e7ee00ce7349248a0d2 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Thu, 23 Jul 2015 16:54:31 -0400
Subject: [PATCH 016/268] Performance tweaks for typing -- may have broken
 gutter resizing

---
 css/droplet.css       |   4 +-
 src/controller.coffee | 258 +++++++++++++++++++-----------------------
 src/draw.coffee       |  12 +-
 src/view.coffee       |  14 +--
 4 files changed, 130 insertions(+), 158 deletions(-)

diff --git a/css/droplet.css b/css/droplet.css
index a653ed76..8eb39e6c 100644
--- a/css/droplet.css
+++ b/css/droplet.css
@@ -135,8 +135,8 @@
 
 .droplet-hidden-input {
   position: absolute;
-  z-index: -999;
-  opacity: 0;
+  top: -9999px;
+  left: -9999px;
   -webkit-touch-callout: none;
   width: 1px;
   height: 1px;
diff --git a/src/controller.coffee b/src/controller.coffee
index ae1eef49..0b5caac3 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -339,9 +339,12 @@ exports.Editor = class Editor
       @dropletElement.style.left = "0px"
       @dropletElement.style.width = "#{@wrapperElement.clientWidth}px"
 
-    @resizeGutter()
+    #@resizeGutter()
+
+    @viewports.main.height = @dropletElement.clientHeight
+    @viewports.main.width = @dropletElement.clientWidth - @gutter.clientWidth
 
-    @mainCanvas.setAttribute 'width', @dropletElement.offsetWidth - @gutter.offsetWidth
+    @mainCanvas.setAttribute 'width', @dropletElement.clientWidth - @gutter.clientWidth
 
     @mainCanvas.style.left = "#{@gutter.offsetWidth}px"
     @transitionContainer.style.left = "#{@gutter.offsetWidth}px"
@@ -353,20 +356,8 @@ exports.Editor = class Editor
     @resizeDragCanvas()
 
     # Re-scroll and redraw main
-    @scrollOffsets.main.y = @mainScroller.scrollTop
-    @scrollOffsets.main.x = @mainScroller.scrollLeft
-
-    # TODO remove @scrollOffsets.main
-    @setScrollOffset @mainCtx, @scrollOffsets.main
-
-    # Also update scroll for the highlight ctx, so that
-    # they can match the blocks' positions
-    @setScrollOffset @highlightCtx, @scrollOffsets.main
-    @setScrollOffset @cursorCtx, @scrollOffsets.main
-
-  setScrollOffset: (canvas, offset) ->
-    #canvas.setAttribute 'viewBox', "#{offset.x}, #{offset.y}, #{canvas.offsetWidth}, #{canvas.offsetHeight}"
-    0
+    @viewports.main.y = @mainScroller.scrollTop
+    @viewports.main.x = @mainScroller.scrollLeft
 
   resizePalette: ->
     @paletteCanvas.style.top = "#{@paletteHeader.offsetHeight}px"
@@ -377,8 +368,8 @@ exports.Editor = class Editor
     for binding in editorBindings.resize_palette
       binding.call this
 
-    @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})"
-    @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})"
+    @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
+    @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
 
     @rebuildPalette()
 
@@ -534,7 +525,7 @@ Editor::redrawMain = (opts = {}) ->
 
     @topNubbyPath.update()
 
-    rect = null
+    rect = @viewports.main
     options = {
       grayscale: false
       selected: false
@@ -572,14 +563,6 @@ Editor::redrawMain = (opts = {}) ->
     if @changeEventVersion isnt @tree.version
       @changeEventVersion = @tree.version
 
-      # Update the ace editor value to match,
-      # but don't trigger a resize event.
-      @suppressAceChangeEvent = true
-      oldScroll = @aceEditor.session.getScrollTop()
-      @setAceValue @getValue()
-      @suppressAceChangeEvent = false
-      @aceEditor.session.setScrollTop oldScroll
-
       @fireEvent 'change', []
 
     @view.cleanupDraw()
@@ -598,10 +581,10 @@ Editor::redrawHighlights = ->
   # draw it in gray
   if @draggingBlock? and @inDisplay @draggingBlock
     @view.getViewNodeFor(@draggingBlock).draw new @draw.Rectangle(
-      @scrollOffsets.main.x,
-      @scrollOffsets.main.y,
-      @mainCanvas.offsetWidth,
-      @mainCanvas.offsetHeight
+      @viewports.main.x,
+      @viewports.main.y,
+      @viewports.main.width,
+      @viewports.main.height
     ), {grayscale: true}
 
   @redrawCursors()
@@ -635,8 +618,8 @@ Editor::redrawPalette = ->
   lastBottomEdge = PALETTE_TOP_MARGIN
 
   boundingRect = new @draw.Rectangle(
-    @scrollOffsets.palette.x,
-    @scrollOffsets.palette.y,
+    @viewports.palette.x,
+    @viewports.palette.y,
     @paletteCanvas.offsetWidth,
     @paletteCanvas.offsetHeight
   )
@@ -693,8 +676,8 @@ Editor::trackerPointToPalette = (point) ->
   if not @paletteCanvas.offsetParent?
     return new @draw.Point(NaN, NaN)
   gbr = @paletteCanvas.getBoundingClientRect()
-  new @draw.Point(point.x - gbr.left + @scrollOffsets.palette.x,
-                  point.y - gbr.top + @scrollOffsets.palette.y)
+  new @draw.Point(point.x - gbr.left + @viewports.palette.x,
+                  point.y - gbr.top + @viewports.palette.y)
 
 Editor::trackerPointIsInElement = (point, element) ->
   if @readOnly
@@ -1173,10 +1156,7 @@ Editor::wouldDelete = (position) ->
   palettePoint = @trackerPointToPalette position
 
   return not @lastHighlight and not
-      (@mainCanvas.offsetWidth + @scrollOffsets.main.x > mainPoint.x > @scrollOffsets.main.x and
-       @mainCanvas.offsetHeight + @scrollOffsets.main.y > mainPoint.y > @scrollOffsets.main.y) or
-      (@paletteCanvas.offsetWidth + @scrollOffsets.palette.x > palettePoint.x > @scrollOffsets.palette.x and
-      @paletteCanvas.offsetHeight + @scrollOffsets.palette.y > palettePoint.y > @scrollOffsets.palette.y)
+    (@viewports.main.contains(mainPoint) or @viewports.palette.contains(palettePoint))
 
 # On mousemove, if there is a clicked block but no drag block,
 # we might want to transition to a dragging the block if the user
@@ -1250,10 +1230,10 @@ hook 'mousemove', 1, (point, event, state) ->
     # Construct a quadtree of drop areas
     # for faster dragging
     @dropPointQuadTree = QUAD.init
-      x: @scrollOffsets.main.x
-      y: @scrollOffsets.main.y
-      w: @mainCanvas.offsetWidth
-      h: @mainCanvas.offsetHeight
+      x: @viewports.main.x
+      y: @viewports.main.y
+      w: @viewports.main.width
+      h: @viewports.main.height
 
     for dropletDocument in @getDocuments()
       head = dropletDocument.start
@@ -1355,8 +1335,8 @@ hook 'mousemove', 0, (point, event, state) ->
       head = head.next
 
     if head is @tree.end and @floatingBlocks.length is 0 and
-        @mainCanvas.offsetWidth + @scrollOffsets.main.x > mainPoint.x > @scrollOffsets.main.x - @gutter.offsetWidth and
-        @mainCanvas.offsetHeight + @scrollOffsets.main.y > mainPoint.y > @scrollOffsets.main.y
+        @viewports.main.right() > mainPoint.x > @viewports.main.x - @gutter.offsetWidth and
+        @viewports.main.bottom() > mainPoint.y > @viewports.main.y
       @view.getViewNodeFor(@tree).highlightArea.update()
       @lastHighlight = @tree
 
@@ -1599,10 +1579,8 @@ hook 'mouseup', 0, (point, event, state) ->
 
     # If we dropped it off in the palette, abort (so as to delete the block).
     palettePoint = @trackerPointToPalette point
-    if 0 < palettePoint.x - @scrollOffsets.palette.x < @paletteCanvas.offsetWidth and
-       0 < palettePoint.y - @scrollOffsets.palette.y < @paletteCanvas.offsetHeight or not
-       (-@gutter.offsetWidth < renderPoint.x < @mainCanvas.offsetWidth and
-       0 < renderPoint.y < @mainCanvas.offsetHeight)
+    if @viewports.palette.contains(palettePoint) and not
+       @viewports.main.contains(renderPoint)
       if @draggingBlock is @lassoSelection
         @lassoSelection = null
 
@@ -1611,8 +1589,8 @@ hook 'mouseup', 0, (point, event, state) ->
       @endDrag()
       return
 
-    else if renderPoint.x - @scrollOffsets.main.x < 0
-      renderPoint.x = @scrollOffsets.main.x
+    else if renderPoint.x - @viewports.main.x < 0
+      renderPoint.x = @viewports.main.x
 
     # Add the undo operation associated
     # with creating this floating block
@@ -1790,8 +1768,8 @@ hook 'mousedown', 6, (point, event, state) ->
   if not @trackerPointIsInPalette(point) then return
 
   palettePoint = @trackerPointToPalette point
-  if @scrollOffsets.palette.y < palettePoint.y < @scrollOffsets.palette.y + @paletteCanvas.offsetHeight and
-     @scrollOffsets.palette.x < palettePoint.x < @scrollOffsets.palette.x + @paletteCanvas.offsetWidth
+  if @viewports.palette.y < palettePoint.y < @viewports.palette.y + @paletteCanvas.offsetHeight and
+     @viewports.palette.x < palettePoint.x < @viewports.palette.x + @paletteCanvas.offsetWidth
     for entry in @currentPaletteBlocks
       hitTestResult = @hitTest palettePoint, entry.block, @paletteView
 
@@ -1865,8 +1843,8 @@ hook 'rebuild_palette', 1, ->
       hoverDiv.addEventListener 'mouseout', (event) =>
         if block is @currentHighlightedPaletteBlock
           @currentHighlightedPaletteBlock = null
-          @paletteHighlightCtx.clearRect @scrollOffsets.palette.x, @scrollOffsets.palette.y,
-            @paletteHighlightCanvas.offsetWidth + @scrollOffsets.palette.x, @paletteHighlightCanvas.offsetHeight + @scrollOffsets.palette.y
+          @paletteHighlightCtx.clearRect @viewports.palette.x, @viewports.palette.y,
+            @paletteHighlightCanvas.offsetWidth + @viewports.palette.x, @paletteHighlightCanvas.offsetHeight + @viewports.palette.y
 
     @paletteScrollerStuffing.appendChild hoverDiv
 
@@ -1888,14 +1866,16 @@ hook 'populate', 1, ->
       # (left and top should not be closer than 10 pixels from the edge)
 
       bounds = @view.getViewNodeFor(@getCursor()).bounds[0]
-      inputLeft = bounds.x + @mainCanvas.offsetLeft - @scrollOffsets.main.x
+      ###
+      inputLeft = bounds.x + @mainCanvas.offsetLeft - @viewports.main.x
       inputLeft = Math.min inputLeft, @dropletElement.clientWidth - 10
       inputLeft = Math.max @mainCanvas.offsetLeft, inputLeft
       @hiddenInput.style.left = inputLeft + 'px'
-      inputTop = bounds.y - @scrollOffsets.main.y
+      inputTop = bounds.y - @viewports.main.y
       inputTop = Math.min inputTop, @dropletElement.clientHeight - 10
       inputTop = Math.max 0, inputTop
       @hiddenInput.style.top = inputTop + 'px'
+      ###
 
   @dropletElement.appendChild @hiddenInput
 
@@ -1984,6 +1964,8 @@ Editor::redrawTextInput = ->
 
     # If the layout has not changed enough to affect
     # anything non-local, only redraw locally.
+    @redrawMain()
+    ###
     if helper.deepEquals newp, oldp
       rect = new @draw.NoRectangle()
 
@@ -1993,11 +1975,11 @@ Editor::redrawTextInput = ->
 
       rect.width = Math.max rect.width, @mainCanvas.offsetWidth
 
-
       @redrawMain
         boundingRectangle: rect
 
     else @redrawMain()
+    ###
 
   # Otherwise, redraw the whole thing
   else
@@ -2081,7 +2063,7 @@ Editor::redrawTextHighlights = (scrollIntoView = false) ->
     @textCursorPath.update()
     @qualifiedFocus @getCursor(), @textCursorPath
 
-  if scrollIntoView and endPosition > @scrollOffsets.main.x + @mainCanvas.offsetWidth
+  if scrollIntoView and endPosition > @viewports.main.x + @mainCanvas.offsetWidth
     @mainScroller.scrollLeft = endPosition - @mainCanvas.offsetWidth + @view.opts.padding
 
 escapeString = (str) ->
@@ -2373,8 +2355,8 @@ Editor::showDropdown = (socket = @getCursor()) ->
 
     location = @view.getViewNodeFor(socket).bounds[0]
 
-    @dropdownElement.style.top = location.y + @fontSize - @scrollOffsets.main.y + 'px'
-    @dropdownElement.style.left = location.x - @scrollOffsets.main.x + @dropletElement.offsetLeft + @mainCanvas.offsetLeft + 'px'
+    @dropdownElement.style.top = location.y + @fontSize - @viewports.main.y + 'px'
+    @dropdownElement.style.left = location.x - @viewports.main.x + @dropletElement.offsetLeft + @mainCanvas.offsetLeft + 'px'
     @dropdownElement.style.minWidth = location.width + 'px'
   ), 0
 
@@ -2477,8 +2459,8 @@ hook 'mousedown', 0, (point, event, state) ->
 
   # If the point was actually in the main canvas,
   # start a lasso select.
-  mainPoint = @trackerPointToMain(point).from @scrollOffsets.main
-  palettePoint = @trackerPointToPalette(point).from @scrollOffsets.palette
+  mainPoint = @trackerPointToMain(point).from @viewports.main
+  palettePoint = @trackerPointToPalette(point).from @viewports.palette
 
   @lassoSelectAnchor = @trackerPointToMain point
 
@@ -2529,17 +2511,10 @@ hook 'mousemove', 0, (point, event, state) ->
           break
 
 Editor::redrawLassoHighlight = ->
-  mainCanvasRectangle = new @draw.Rectangle(
-    @scrollOffsets.main.x,
-    @scrollOffsets.main.y,
-    @mainCanvas.offsetWidth,
-    @mainCanvas.offsetHeight
-  )
-
   # Remove any existing selections
   for dropletDocument in @getDocuments()
     dropletDocumentView = @view.getViewNodeFor dropletDocument
-    dropletDocumentView.draw mainCanvasRectangle, {
+    dropletDocumentView.draw @viewports.main, {
       selected: false
       noText: @currentlyAnimating # TODO add some modularized way of having global view options
     }
@@ -2548,7 +2523,7 @@ Editor::redrawLassoHighlight = ->
     # Add any new selections
     lassoView = @view.getViewNodeFor(@lassoSelection)
     lassoView.absorbCache()
-    lassoView.draw mainCanvasRectangle, {selected: true}
+    lassoView.draw @viewports.main, {selected: true}
 
 # Convnience function for validating
 # a lasso selection. A lasso selection
@@ -2708,10 +2683,10 @@ Editor::getCursor = ->
 Editor::scrollCursorIntoPosition = ->
   axis = @determineCursorPosition().y
 
-  if axis - @scrollOffsets.main.y < 0
+  if axis < @viewports.main.y
     @mainScroller.scrollTop = axis
-  else if axis - @scrollOffsets.main.y > @mainCanvas.offsetHeight
-    @mainScroller.scrollTop = axis - @mainCanvas.offsetHeight
+  else if axis > @viewports.main.bottom()
+    @mainScroller.scrollTop = axis - @viewports.main.height
 
   @mainScroller.scrollLeft = 0
 
@@ -2951,8 +2926,8 @@ Editor::computePlaintextTranslationVectors = ->
       when 'text'
         corner = @view.getViewNodeFor(head).bounds[0].upperLeftCorner()
 
-        corner.x -= @scrollOffsets.main.x
-        corner.y -= @scrollOffsets.main.y
+        corner.x -= @viewports.main.x
+        corner.y -= @viewports.main.y
 
         translationVectors.push (new @draw.Point(state.x, state.y)).from(corner)
         textElements.push @view.getViewNodeFor head
@@ -2994,7 +2969,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
 
     @setAceValue @getValue()
 
-    top = @findLineNumberAtCoordinate @scrollOffsets.main.y
+    top = @findLineNumberAtCoordinate @viewports.main.y
     @aceEditor.scrollToLine top
 
     @aceEditor.resize true
@@ -3021,8 +2996,8 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
 
       # Skip anything that's
       # off the screen the whole time.
-      unless 0 < textElement.bounds[0].bottom() - @scrollOffsets.main.y + translationVectors[i].y and
-                 textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y < @mainCanvas.offsetHeight
+      unless 0 < textElement.bounds[0].bottom() - @viewports.main.y + translationVectors[i].y and
+                 textElement.bounds[0].y - @viewports.main.y + translationVectors[i].y < @viewports.main.height
         continue
 
       div = document.createElement 'div'
@@ -3032,8 +3007,8 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
 
       div.style.font = @fontSize + 'px ' + @fontFamily
 
-      div.style.left = "#{textElement.bounds[0].x - @scrollOffsets.main.x}px"
-      div.style.top = "#{textElement.bounds[0].y - @scrollOffsets.main.y - @fontAscent}px"
+      div.style.left = "#{textElement.bounds[0].x - @viewports.main.x}px"
+      div.style.top = "#{textElement.bounds[0].y - @viewports.main.y - @fontAscent}px"
 
       div.className = 'droplet-transitioning-element'
       div.style.transition = "left #{translateTime}ms, top #{translateTime}ms, font-size #{translateTime}ms"
@@ -3043,8 +3018,8 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
 
       do (div, textElement, translationVectors, i) =>
         setTimeout (=>
-          div.style.left = (textElement.bounds[0].x - @scrollOffsets.main.x + translationVectors[i].x) + 'px'
-          div.style.top = (textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y) + 'px'
+          div.style.left = (textElement.bounds[0].x - @viewports.main.x + translationVectors[i].x) + 'px'
+          div.style.top = (textElement.bounds[0].y - @viewports.main.y + translationVectors[i].y) + 'px'
           div.style.fontSize = @aceFontSize()
         ), fadeTime
 
@@ -3062,7 +3037,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
       div.innerText = div.textContent = line + 1
 
       div.style.left = 0
-      div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent - @scrollOffsets.main.y}px"
+      div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent - @viewports.main.y}px"
 
       div.style.font = @fontSize + 'px ' + @fontFamily
       div.style.width = "#{@gutter.offsetWidth}px"
@@ -3200,8 +3175,8 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-
 
         # Skip anything that's
         # off the screen the whole time.
-        unless 0 < textElement.bounds[0].bottom() - @scrollOffsets.main.y + translationVectors[i].y and
-                 textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y < @mainCanvas.offsetHeight
+        unless 0 < textElement.bounds[0].bottom() - @viewports.main.y + translationVectors[i].y and
+                 textElement.bounds[0].y - @viewports.main.y + translationVectors[i].y < @viewports.main.height
           continue
 
         div = document.createElement 'div'
@@ -3212,8 +3187,8 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-
         div.style.font = @aceFontSize() + ' ' + @fontFamily
         div.style.position = 'absolute'
 
-        div.style.left = "#{textElement.bounds[0].x - @scrollOffsets.main.x + translationVectors[i].x}px"
-        div.style.top = "#{textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y}px"
+        div.style.left = "#{textElement.bounds[0].x - @viewports.main.x + translationVectors[i].x}px"
+        div.style.top = "#{textElement.bounds[0].y - @viewports.main.y + translationVectors[i].y}px"
 
         div.className = 'droplet-transitioning-element'
         div.style.transition = "left #{translateTime}ms, top #{translateTime}ms, font-size #{translateTime}ms"
@@ -3223,8 +3198,8 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-
 
         do (div, textElement) =>
           setTimeout (=>
-            div.style.left = "#{textElement.bounds[0].x - @scrollOffsets.main.x}px"
-            div.style.top = "#{textElement.bounds[0].y - @scrollOffsets.main.y - @fontAscent}px"
+            div.style.left = "#{textElement.bounds[0].x - @viewports.main.x}px"
+            div.style.top = "#{textElement.bounds[0].y - @viewports.main.y - @fontAscent}px"
             div.style.fontSize = @fontSize + 'px'
           ), 0
 
@@ -3261,7 +3236,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-
         do (div, line) =>
           setTimeout (=>
             div.style.left = 0
-            div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent- @scrollOffsets.main.y}px"
+            div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent- @viewports.main.y}px"
             div.style.fontSize = @fontSize + 'px'
           ), 0
 
@@ -3369,9 +3344,9 @@ Editor::toggleBlocks = (cb) ->
 # ================================
 
 hook 'populate', 2, ->
-  @scrollOffsets = {
-    main: new @draw.Point 0, 0
-    palette: new @draw.Point 0, 0
+  @viewports = {
+    main: new @draw.NoRectangle()
+    palette: new @draw.NoRectangle()
   }
 
   @mainScroller = document.createElement 'div'
@@ -3388,15 +3363,10 @@ hook 'populate', 2, ->
     @wrapperElement.scrollTop = @wrapperElement.scrollLeft = 0
 
   @mainScroller.addEventListener 'scroll', =>
-    @scrollOffsets.main.y = @mainScroller.scrollTop
-    @scrollOffsets.main.x = @mainScroller.scrollLeft
-
-    @setScrollOffset @mainCtx, @scrollOffsets.main
+    @viewports.main.y = @mainScroller.scrollTop
+    @viewports.main.x = @mainScroller.scrollLeft
 
-    # Also update scroll for the highlight ctx, so that
-    # they can match the blocks' positions
-    @setScrollOffset @highlightCtx, @scrollOffsets.main
-    @setScrollOffset @cursorCtx, @scrollOffsets.main
+    @redrawMain()
 
   @paletteScroller = document.createElement 'div'
   @paletteScroller.className = 'droplet-palette-scroller'
@@ -3408,14 +3378,14 @@ hook 'populate', 2, ->
   @paletteElement.appendChild @paletteScroller
 
   @paletteScroller.addEventListener 'scroll', =>
-    @scrollOffsets.palette.y = @paletteScroller.scrollTop
+    @viewports.palette.y = @paletteScroller.scrollTop
 
     # Temporarily ignoring x-scroll to fix bad x-scrolling behaviour
     # when dragging blocks out of the palette. TODO: fix x-scrolling behaviour.
-    # @scrollOffsets.palette.x = @paletteScroller.scrollLeft
+    # @viewports.palette.x = @paletteScroller.scrollLeft
 
-    @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})"
-    @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@scrollOffsets.palette.x}, #{-@scrollOffsets.palette.y})"
+    @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
+    @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
 
     # redraw the bits of the palette
     @redrawPalette()
@@ -3444,8 +3414,10 @@ hook 'redraw_main', 1, ->
     @dropletElement.offsetHeight
   )
 
-  @mainCanvas.setAttribute 'height', height
-  @mainCanvas.style.height = "#{height}px"
+  if height isnt @lastHeight
+    @lastHeight = height
+    @mainCanvas.setAttribute 'height', height
+    @mainCanvas.style.height = "#{height}px"
 
 hook 'redraw_palette', 0, ->
   bounds = new @draw.NoRectangle()
@@ -4117,45 +4089,50 @@ Editor::addLineNumberForLine = (line) ->
   treeView = @view.getViewNodeFor @tree
 
   if line of @lineNumberTags
-    lineDiv = @lineNumberTags[line]
+    lineDiv = @lineNumberTags[line].tag
 
   else
     lineDiv = document.createElement 'div'
     lineDiv.innerText = lineDiv.textContent = line + 1
-    @lineNumberTags[line] = lineDiv
+    @lineNumberTags[line] = {
+      tag: lineDiv
+      lastPosition: null
+    }
 
-  lineDiv.className = 'droplet-gutter-line'
+  if treeView.bounds[line].y isnt @lineNumberTags[line].lastPosition
+    lineDiv.className = 'droplet-gutter-line'
 
-  # Add annotation mouseover text
-  # and graphics
-  if @annotations[line]?
-    lineDiv.className += ' droplet_' + getMostSevereAnnotationType(@annotations[line])
+    # Add annotation mouseover text
+    # and graphics
+    if @annotations[line]?
+      lineDiv.className += ' droplet_' + getMostSevereAnnotationType(@annotations[line])
 
-    title = @annotations[line].map((x) -> x.text).join('\n')
+      title = @annotations[line].map((x) -> x.text).join('\n')
 
-    lineDiv.addEventListener 'mouseover', =>
-      @tooltipElement.innerText =
-        @tooltipElement.textContent = title
-      @tooltipElement.style.display = 'block'
-    lineDiv.addEventListener 'mousemove', (event) =>
-      @tooltipElement.style.left = event.pageX + 'px'
-      @tooltipElement.style.top = event.pageY + 'px'
-    lineDiv.addEventListener 'mouseout', =>
-      @tooltipElement.style.display = 'none'
+      lineDiv.addEventListener 'mouseover', =>
+        @tooltipElement.innerText =
+          @tooltipElement.textContent = title
+        @tooltipElement.style.display = 'block'
+      lineDiv.addEventListener 'mousemove', (event) =>
+        @tooltipElement.style.left = event.pageX + 'px'
+        @tooltipElement.style.top = event.pageY + 'px'
+      lineDiv.addEventListener 'mouseout', =>
+        @tooltipElement.style.display = 'none'
 
-  # Add breakpoint graphics
-  if @breakpoints[line]
-    lineDiv.className += ' droplet_breakpoint'
+    # Add breakpoint graphics
+    if @breakpoints[line]
+      lineDiv.className += ' droplet_breakpoint'
 
-  lineDiv.style.top = "#{treeView.bounds[line].y}px"
+    lineDiv.style.top = "#{treeView.bounds[line].y}px"
 
-  lineDiv.style.paddingTop = "#{treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent}px"
-  lineDiv.style.paddingBottom = "#{treeView.distanceToBase[line].below - @fontDescent}"
+    lineDiv.style.paddingTop = "#{treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent}px"
+    lineDiv.style.paddingBottom = "#{treeView.distanceToBase[line].below - @fontDescent}"
 
-  lineDiv.style.height =  treeView.bounds[line].height + 'px'
-  lineDiv.style.fontSize = @fontSize + 'px'
+    lineDiv.style.height =  treeView.bounds[line].height + 'px'
+    lineDiv.style.fontSize = @fontSize + 'px'
 
-  @lineNumberWrapper.appendChild lineDiv
+    @lineNumberWrapper.appendChild lineDiv
+    @lineNumberTags[line].lastPosition = treeView.bounds[line].y
 
 TYPE_SEVERITY = {
   'error': 2
@@ -4193,15 +4170,15 @@ hook 'redraw_main', 0, (changedBox) ->
 Editor::redrawGutter = (changedBox = true) ->
   treeView = @view.getViewNodeFor @tree
 
-  top = 0 # TODO @findLineNumberAtCoordinate @scrollOffsets.main.y
-  bottom = @findLineNumberAtCoordinate @scrollOffsets.main.y + @mainCanvas.offsetHeight
+  top = @findLineNumberAtCoordinate @viewports.main.y
+  bottom = @findLineNumberAtCoordinate @viewports.main.bottom()
 
   for line in [top..bottom]
     @addLineNumberForLine line
 
   for line, tag of @lineNumberTags
     if line < top or line > bottom
-      @lineNumberTags[line].parentNode.removeChild @lineNumberTags[line]
+      @lineNumberTags[line].tag.parentNode.removeChild @lineNumberTags[line].tag
       delete @lineNumberTags[line]
 
   if changedBox
@@ -4302,10 +4279,7 @@ Editor::documentDimensions = ->
   }
 
 Editor::viewportDimensions = ->
-  return {
-    width: @mainCanvas.offsetWidth
-    height: @mainCanvas.offsetHeight
-  }
+  return @viewports.main
 
 # LINE LOCATION API
 # =================
diff --git a/src/draw.coffee b/src/draw.coffee
index 49aa0642..84a06484 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -385,11 +385,21 @@ exports.Draw = class Draw
 
             @_cacheFlag = false
 
-      setPoints: (points) ->
+      _setPoints_raw: (points) ->
         @_points = points
         @_cacheFlag = true
         @_updateFlag = true
 
+      setPoints: (points) ->
+        if points.length isnt @_points.length
+          @_setPoints_raw points
+          return
+        for el, i in points
+          unless @_points[i].equals(el)
+            @_setPoints_raw points
+            return
+        return
+
       push: (point) ->
         @_points.push point
         @_cacheFlag = true
diff --git a/src/view.coffee b/src/view.coffee
index 7243851a..27b9fca4 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -754,18 +754,6 @@ exports.View = class View
       for childObj in @children
         @view.getViewNodeFor(childObj.child).draw boundingRect, style
 
-      children = @children.map (x) -> x.child
-
-      if @oldChildren?
-        for el, i in @oldChildren
-          unless el.child in children
-            @view.getViewNodeFor(el.child).clean(el.version)
-
-      @oldChildren = @children.map (x) => {
-        child: x.child
-        version: @view.getViewNodeFor(x.child).computedVersion
-      }
-
     forceClean: ->
       @clean @computedVersion
 
@@ -1657,7 +1645,7 @@ exports.View = class View
     # Draw our path, with applied
     # styles if necessary.
     drawSelf: (style = {}) ->
-      # We migh want to apply some
+      # We might want to apply some
       # temporary color changes,
       # so store the old colors
       oldFill = @path.style.fillColor

From 24f2018e39864ddc133d9517001b71f7512a02b9 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Mon, 27 Jul 2015 14:54:11 -0400
Subject: [PATCH 017/268] Fix palette resizing

---
 css/droplet.css       |  14 ++++++
 src/controller.coffee | 105 +++++++++---------------------------------
 src/draw.coffee       |   3 ++
 3 files changed, 40 insertions(+), 82 deletions(-)

diff --git a/css/droplet.css b/css/droplet.css
index 8eb39e6c..2f0ecfb4 100644
--- a/css/droplet.css
+++ b/css/droplet.css
@@ -324,6 +324,20 @@ text {
 .droplet-socket-path {
   cursor: text;
 }
+/*
+.droplet-block-path:hover .droplet-background-path {
+  stroke: #FF0;
+  stroke-width: 2px;
+}
+.droplet-block-path:hover .droplet-light-bevel-path .droplet-dark-bevel-path {
+  fill: #FF0 !important;
+}
+*/
+.droplet-palette-canvas .droplet-socket-path {
+  cursor: -webkit-grab;
+  cursor: -moz-grab;
+  cursor: grab;
+}
 .droplet-cursor-path {
   cursor: text;
 }
diff --git a/src/controller.coffee b/src/controller.coffee
index 0b5caac3..f4f0f5ee 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -172,8 +172,6 @@ exports.Editor = class Editor
     @paletteCanvas = @paletteCtx = document.createElementNS SVG_STANDARD, 'svg'
     @paletteCanvas.setAttribute 'class',  'droplet-palette-canvas'
 
-    @paletteElement.appendChild @paletteCanvas
-
     @paletteWrapper.style.position = 'absolute'
     @paletteWrapper.style.left = '0px'
     @paletteWrapper.style.top = '0px'
@@ -360,17 +358,9 @@ exports.Editor = class Editor
     @viewports.main.x = @mainScroller.scrollLeft
 
   resizePalette: ->
-    @paletteCanvas.style.top = "#{@paletteHeader.offsetHeight}px"
-    @paletteCanvas.style.height = "#{@paletteWrapper.offsetHeight - @paletteHeader.offsetHeight}px"
-    @paletteCanvas.style.width = "#{@paletteWrapper.offsetWidth}px"
-
-
     for binding in editorBindings.resize_palette
       binding.call this
 
-    @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
-    @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
-
     @rebuildPalette()
 
   resize: ->
@@ -487,7 +477,7 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
     (new @view.draw.Point(0, 0)), @mode.startComment
   )
   record.endText ?= new @view.draw.Text(
-    (new @view.draw.Point(0, 0)), @mode.startComment
+    (new @view.draw.Point(0, 0)), @mode.endComment
   )
 
   record.startText.point.x = blockView.totalBounds.x - startWidth
@@ -611,6 +601,8 @@ Editor::clearPaletteHighlightCanvas = -> #@clearCanvas @paletteHighlightCtx
 Editor::redrawPalette = ->
   @clearPalette()
 
+  @paletteView.beginDraw()
+
   # We will construct a vertical layout
   # with padding for the palette blocks.
   # To do this, we will need to keep track
@@ -638,12 +630,17 @@ Editor::redrawPalette = ->
   for binding in editorBindings.redraw_palette
     binding.call this
 
+  console.log 'setting bottom edge to', lastBottomEdge
+
+  @paletteCanvas.style.height = lastBottomEdge + 'px'
+
+  @paletteView.cleanupDraw() #TODO garageCollect()
+
 Editor::rebuildPalette = ->
   @redrawPalette()
   for binding in editorBindings.rebuild_palette
     binding.call this
 
-
 # MOUSE INTERACTION WRAPPERS
 # ================================
 
@@ -676,8 +673,8 @@ Editor::trackerPointToPalette = (point) ->
   if not @paletteCanvas.offsetParent?
     return new @draw.Point(NaN, NaN)
   gbr = @paletteCanvas.getBoundingClientRect()
-  new @draw.Point(point.x - gbr.left + @viewports.palette.x,
-                  point.y - gbr.top + @viewports.palette.y)
+  new @draw.Point(point.x - gbr.left
+                  point.y - gbr.top)
 
 Editor::trackerPointIsInElement = (point, element) ->
   if @readOnly
@@ -1155,8 +1152,7 @@ Editor::wouldDelete = (position) ->
   mainPoint = @trackerPointToMain position
   palettePoint = @trackerPointToPalette position
 
-  return not @lastHighlight and not
-    (@viewports.main.contains(mainPoint) or @viewports.palette.contains(palettePoint))
+  return not @lastHighlight and not @viewports.main.contains(mainPoint)
 
 # On mousemove, if there is a clicked block but no drag block,
 # we might want to transition to a dragging the block if the user
@@ -1561,7 +1557,6 @@ Editor::inDisplay = (block) -> (block.container ? block).getDocument() in @getDo
 # blocks without a highlight.
 hook 'mouseup', 0, (point, event, state) ->
   if @draggingBlock? and not @lastHighlight? and not @dragReplacing
-    console.log 'floatifying'
     # Before we put this block into our list of floating blocks,
     # we need to figure out where on the main canvas
     # we are going to render it.
@@ -1578,14 +1573,11 @@ hook 'mouseup', 0, (point, event, state) ->
     @spliceOut @draggingBlock
 
     # If we dropped it off in the palette, abort (so as to delete the block).
-    palettePoint = @trackerPointToPalette point
-    if @viewports.palette.contains(palettePoint) and not
-       @viewports.main.contains(renderPoint)
+    unless @viewports.main.right() > renderPoint.x > @viewports.main.x - @gutter.offsetWidth and
+        @viewports.main.bottom() > renderPoint.y > @viewports.main.y
       if @draggingBlock is @lassoSelection
         @lassoSelection = null
 
-      console.log 'deletifying'
-
       @endDrag()
       return
 
@@ -1768,8 +1760,8 @@ hook 'mousedown', 6, (point, event, state) ->
   if not @trackerPointIsInPalette(point) then return
 
   palettePoint = @trackerPointToPalette point
-  if @viewports.palette.y < palettePoint.y < @viewports.palette.y + @paletteCanvas.offsetHeight and
-     @viewports.palette.x < palettePoint.x < @viewports.palette.x + @paletteCanvas.offsetWidth
+  console.log palettePoint
+  if @viewports.palette.contains(palettePoint)
     for entry in @currentPaletteBlocks
       hitTestResult = @hitTest palettePoint, entry.block, @paletteView
 
@@ -1804,50 +1796,6 @@ hook 'redraw_palette', 0, ->
   if @currentHighlightedPaletteBlock?
     @paletteHighlightPath.update()
 
-hook 'rebuild_palette', 1, ->
-  # Remove the existent blocks
-  @paletteScrollerStuffing.innerHTML = ''
-
-  @currentHighlightedPaletteBlock = null
-
-  # Add new blocks
-  for data in @currentPaletteMetadata
-    block = data.block
-
-    hoverDiv = document.createElement 'div'
-    hoverDiv.className = 'droplet-hover-div'
-
-    hoverDiv.title = data.title ? block.stringify()
-
-    bounds = @paletteView.getViewNodeFor(block).totalBounds
-
-    hoverDiv.style.top = "#{bounds.y}px"
-    hoverDiv.style.left = "#{bounds.x}px"
-
-    # Clip boxes to the width of the palette to prevent x-scrolling. TODO: fix x-scrolling behaviour.
-    hoverDiv.style.width = "#{Math.min(bounds.width, Infinity)}px"
-
-    do (block) =>
-      hoverDiv.addEventListener 'mousemove', (event) =>
-        palettePoint = @trackerPointToPalette new @draw.Point(
-            event.clientX, event.clientY)
-        if @viewOrChildrenContains block, palettePoint, @paletteView
-            @clearPaletteHighlightCanvas()
-            @paletteHighlightPath = @getHighlightPath block, {color: '#FF0'}, @paletteView
-            @paletteHighlightPath.update()
-            @currentHighlightedPaletteBlock = block
-        else if block is @currentHighlightedPaletteBlock
-          @currentHighlightedPaletteBlock = null
-          @clearPaletteHighlightCanvas()
-
-      hoverDiv.addEventListener 'mouseout', (event) =>
-        if block is @currentHighlightedPaletteBlock
-          @currentHighlightedPaletteBlock = null
-          @paletteHighlightCtx.clearRect @viewports.palette.x, @viewports.palette.y,
-            @paletteHighlightCanvas.offsetWidth + @viewports.palette.x, @paletteHighlightCanvas.offsetHeight + @viewports.palette.y
-
-    @paletteScrollerStuffing.appendChild hoverDiv
-
 # TEXT INPUT SUPPORT
 # ================================
 
@@ -3345,8 +3293,8 @@ Editor::toggleBlocks = (cb) ->
 
 hook 'populate', 2, ->
   @viewports = {
-    main: new @draw.NoRectangle()
-    palette: new @draw.NoRectangle()
+    main: new @draw.Rectangle 0, 0, 0, 0
+    palette: new @draw.Rectangle 0, 0, 0, 0
   }
 
   @mainScroller = document.createElement 'div'
@@ -3370,6 +3318,7 @@ hook 'populate', 2, ->
 
   @paletteScroller = document.createElement 'div'
   @paletteScroller.className = 'droplet-palette-scroller'
+  @paletteScroller.appendChild @paletteCanvas
 
   @paletteScrollerStuffing = document.createElement 'div'
   @paletteScrollerStuffing.className = 'droplet-palette-scroller-stuffing'
@@ -3379,16 +3328,7 @@ hook 'populate', 2, ->
 
   @paletteScroller.addEventListener 'scroll', =>
     @viewports.palette.y = @paletteScroller.scrollTop
-
-    # Temporarily ignoring x-scroll to fix bad x-scrolling behaviour
-    # when dragging blocks out of the palette. TODO: fix x-scrolling behaviour.
-    # @viewports.palette.x = @paletteScroller.scrollLeft
-
-    @paletteCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
-    @paletteHighlightCtx.setAttribute 'transform', "matrix(1, 0, 0, 1, #{-@viewports.palette.x}, #{-@viewports.palette.y})"
-
-    # redraw the bits of the palette
-    @redrawPalette()
+    @viewports.palette.x = @paletteScroller.scrollLeft
 
 Editor::resizeMainScroller = ->
   @mainScroller.style.width = "#{@dropletElement.offsetWidth}px"
@@ -3396,8 +3336,9 @@ Editor::resizeMainScroller = ->
 
 hook 'resize_palette', 0, ->
   @paletteScroller.style.top = "#{@paletteHeader.offsetHeight}px"
-  @paletteScroller.style.width = "#{@paletteCanvas.offsetWidth}px"
-  @paletteScroller.style.height = "#{@paletteCanvas.offsetHeight}px"
+
+  @viewports.palette.height = @paletteScroller.clientHeight
+  @viewports.palette.width = @paletteScroller.clientWidth
 
 hook 'redraw_main', 1, ->
   bounds = @view.getViewNodeFor(@tree).getBounds()
diff --git a/src/draw.coffee b/src/draw.coffee
index 84a06484..de8d0b36 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -542,15 +542,18 @@ exports.Draw = class Draw
 
         if @bevel
           @backgroundPathElement = pathElement
+          @backgroundPathElement.setAttribute 'class', 'droplet-background-path'
           pathElement = document.createElementNS SVG_STANDARD, 'g'
 
           @lightPathElement = document.createElementNS SVG_STANDARD, 'path'
           @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF'
           @lightPathElement.setAttribute 'd', @getLightBevelPath()
+          @lightPathElement.setAttribute 'class', 'droplet-light-bevel-path'
 
           @darkPathElement = document.createElementNS SVG_STANDARD, 'path'
           @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000'
           @darkPathElement.setAttribute 'd', @getDarkBevelPath()
+          @darkPathElement.setAttribute 'class', 'droplet-dark-bevel-path'
 
           pathElement.appendChild @backgroundPathElement
           pathElement.appendChild @lightPathElement

From 7680c611947886e4ef8f480a39633668539032fa Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Mon, 27 Jul 2015 20:55:23 -0400
Subject: [PATCH 018/268] Fix some tests

---
 Gruntfile.coffee       | 23 ++++++++++++++++++++---
 src/draw.coffee        | 24 ++++++++++++++----------
 src/view.coffee        |  2 ++
 test/src/tests.coffee  |  4 ++--
 test/src/uitest.coffee |  8 ++++----
 5 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/Gruntfile.coffee b/Gruntfile.coffee
index 36045525..43ddad6c 100644
--- a/Gruntfile.coffee
+++ b/Gruntfile.coffee
@@ -1,4 +1,4 @@
-browserify = require 'browserify'
+ldbrowserify = require 'browserify'
 coffeeify = require 'coffeeify'
 watchify = require 'watchify'
 
@@ -71,7 +71,7 @@ module.exports = (grunt) ->
           timeout: 10000
 
     browserify:
-      build:
+      testserver:
         files:
           'dist/droplet-full.js': ['./src/main.coffee']
           'example/example-svg.js': ['./src/example-svg.coffee']
@@ -90,6 +90,23 @@ module.exports = (grunt) ->
           '''
           watch: true
           keepAlive: true
+      build:
+        files:
+          'dist/droplet-full.js': ['./src/main.coffee']
+          'example/example-svg.js': ['./src/example-svg.coffee']
+        options:
+          transform: ['coffeeify']
+          browserifyOptions:
+            standalone: 'droplet'
+            noParse: NO_PARSE
+          banner: '''
+          /* Droplet.
+           * Copyright (c) <%=grunt.template.today('yyyy')%> Anthony Bau.
+           * MIT License.
+           *
+           * Date: <%=grunt.template.today('yyyy-mm-dd')%>
+           */
+          '''
       test:
         files:
           'test/js/tests.js': ['test/src/tests.coffee']
@@ -177,4 +194,4 @@ module.exports = (grunt) ->
       grunt.task.run 'mochaTest'
 
 
-  grunt.registerTask 'testserver', ['connect:testserver', 'browserify:build']
+  grunt.registerTask 'testserver', ['connect:testserver', 'browserify:testserver']
diff --git a/src/draw.coffee b/src/draw.coffee
index de8d0b36..900b099a 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -538,7 +538,8 @@ exports.Draw = class Draw
 
         pathString = @getCommandString()
 
-        pathElement.setAttribute 'd', pathString
+        if pathString.length > 0
+          pathElement.setAttribute 'd', pathString
 
         if @bevel
           @backgroundPathElement = pathElement
@@ -547,13 +548,15 @@ exports.Draw = class Draw
 
           @lightPathElement = document.createElementNS SVG_STANDARD, 'path'
           @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF'
-          @lightPathElement.setAttribute 'd', @getLightBevelPath()
+          if pathString.length > 0
+            @lightPathElement.setAttribute 'd', @getLightBevelPath()
           @lightPathElement.setAttribute 'class', 'droplet-light-bevel-path'
 
           @darkPathElement = document.createElementNS SVG_STANDARD, 'path'
           @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000'
-          @darkPathElement.setAttribute 'd', @getDarkBevelPath()
-          @darkPathElement.setAttribute 'class', 'droplet-dark-bevel-path'
+          if pathString.length > 0
+            @darkPathElement.setAttribute 'd', @getDarkBevelPath()
+          @backgroundPathElement.setAttribute 'class', 'droplet-dark-bevel-path'
 
           pathElement.appendChild @backgroundPathElement
           pathElement.appendChild @lightPathElement
@@ -599,12 +602,13 @@ exports.Draw = class Draw
         if @_updateFlag
           @_updateFlag = false
           pathString = @getCommandString()
-          if @bevel
-            @backgroundPathElement.setAttribute 'd', pathString
-            @lightPathElement.setAttribute 'd', @getLightBevelPath()
-            @darkPathElement.setAttribute 'd', @getDarkBevelPath()
-          else
-            @element.setAttribute 'd', pathString
+          if pathString.length > 0
+            if @bevel
+              @backgroundPathElement.setAttribute 'd', pathString
+              @lightPathElement.setAttribute 'd', @getLightBevelPath()
+              @darkPathElement.setAttribute 'd', @getDarkBevelPath()
+            else
+              @element.setAttribute 'd', pathString
 
       clone: ->
         clone = new Path(@_points.slice(0), @bevel, {
diff --git a/src/view.coffee b/src/view.coffee
index 27b9fca4..7e696f5d 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -92,6 +92,8 @@ arrayEq = (a, b) ->
 # and options object.
 exports.View = class View
   constructor: (@ctx, @opts = {}) ->
+    @ctx ?= document.createElementNS SVG_STANDARD, 'svg'
+
     # @map maps Model objects
     # to corresponding View objects,
     # so that rerendering the same model
diff --git a/test/src/tests.coffee b/test/src/tests.coffee
index 369be2b9..ae7b8cc1 100644
--- a/test/src/tests.coffee
+++ b/test/src/tests.coffee
@@ -231,7 +231,7 @@ asyncTest 'View: bottomLineSticksToTop bug', ->
   strictEqual testedBlockView.dimensions[0].height,
     2 * view_.opts.textPadding +
     1 * view_.opts.textHeight +
-    8 * view_.opts.padding -
+    10 * view_.opts.padding -
     1 * view_.opts.indentTongueHeight, 'Original height O.K.'
 
   block = document.getBlockOnLine 1
@@ -255,7 +255,7 @@ asyncTest 'View: bottomLineSticksToTop bug', ->
   strictEqual testedBlockView.dimensions[0].height,
     2 * view_.opts.textPadding +
     1 * view_.opts.textHeight +
-    8 * view_.opts.padding -
+    10 * view_.opts.padding -
     1 * view_.opts.indentTongueHeight, 'Dragging other block in works'
   start()
 
diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee
index f72a50fa..1e80107f 100644
--- a/test/src/uitest.coffee
+++ b/test/src/uitest.coffee
@@ -364,11 +364,11 @@ getRandomTextOp = (editor, rng) ->
   return {socket, text}
 
 performTextOperation = (editor, text, cb) ->
-  simulate('mousedown', editor.mainScrollerStuffing, {
+  simulate('mousedown', editor.mainCanvas, {
     dx: text.socket.handle.x + editor.gutter.offsetWidth,
     dy: text.socket.handle.y
   })
-  simulate('mouseup', editor.mainScrollerStuffing, {
+  simulate('mouseup', editor.mainCanvas, {
     dx: text.socket.handle.x + editor.gutter.offsetWidth,
     dy: text.socket.handle.y
   })
@@ -391,7 +391,7 @@ performTextOperation = (editor, text, cb) ->
   ), 0
 
 performDragOperation = (editor, drag, cb) ->
-  simulate('mousedown', editor.mainScrollerStuffing, {
+  simulate('mousedown', editor.mainCanvas, {
     dx: drag.drag.handle.x + editor.gutter.offsetWidth,
     dy: drag.drag.handle.y
   })
@@ -428,7 +428,7 @@ performDragOperation = (editor, drag, cb) ->
 pickUpLocation = (editor, document, location) ->
   block = editor.getDocument(document).getFromTextLocation(location)
   bound = editor.view.getViewNodeFor(block).bounds[0]
-  simulate('mousedown', editor.mainScrollerStuffing, {
+  simulate('mousedown', editor.mainCanvas, {
     dx: bound.x + editor.gutter.offsetWidth + 5,
     dy: bound.y + 5
   })

From 49d8d9f12e1e5873700ca53de536f0ec87016d22 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 28 Jul 2015 13:02:33 -0400
Subject: [PATCH 019/268] Add dropdowns again

---
 css/droplet.css |  3 +++
 src/view.coffee | 62 +++++++++++++++++++++++++++----------------------
 2 files changed, 37 insertions(+), 28 deletions(-)

diff --git a/css/droplet.css b/css/droplet.css
index 2f0ecfb4..68d91f5c 100644
--- a/css/droplet.css
+++ b/css/droplet.css
@@ -346,3 +346,6 @@ text {
   cursor: -moz-grab;
   cursor: grab;
 }
+.droplet-dropdown-arrow {
+  cursor: pointer;
+}
diff --git a/src/view.coffee b/src/view.coffee
index 7e696f5d..934083cf 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -243,6 +243,8 @@ exports.View = class View
       })
       @highlightArea.deactivate()
 
+      @elements = [@path, @highlightArea]
+
       # Versions. The corresponding
       # Model will keep corresponding version
       # numbers, and each of our passes can
@@ -311,9 +313,8 @@ exports.View = class View
     computeChildren: -> @lineLength
 
     focusAll: ->
-      @path.focus() if @path?
-      if @textElement?
-        @textElement.focus()
+      for element in @elements
+        element?.focus?()
       for child in @children
         @view.getViewNodeFor(child.child).focusAll()
 
@@ -767,20 +768,12 @@ exports.View = class View
         @hide()
 
     hide: ->
-      if @path?
-        @path.deactivate()
-      if @textElement?
-        @textElement.deactivate()
-      if @highlightArea?
-        @highlightArea.deactivate()
+      for element in @elements
+        element?.deactivate?()
 
     destroy: ->
-      if @path?
-        @path.destroy()
-      if @textElement?
-        @textElement.destroy()
-      if @highlightArea?
-        @highlightArea.destroy()
+      for element in @elements
+        element?.destroy?()
 
     # ## drawShadow (GenericViewNode)
     # Draw the shadow of our path
@@ -1636,7 +1629,11 @@ exports.View = class View
     # ## computeOwnDropArea
     # By default, we will not have a
     # drop area (not be droppable).
-    computeOwnDropArea: -> @dropArea = @highlightArea = null
+    computeOwnDropArea: ->
+      @dropArea = null
+      if @highlightArea?
+        @elements = @elements.filter (x) -> x isnt @highlightArea
+        @highlightArea = null
 
     # ## shouldAddTab
     # By default, we will ask
@@ -1750,7 +1747,14 @@ exports.View = class View
 
   # # SocketViewNode
   class SocketViewNode extends ContainerViewNode
-    constructor: -> super
+    constructor: ->
+      super
+      if @view.opts.showDropdowns and @model.dropdown?
+        @dropdownElement ?= new @view.draw.Path([], false, {fillColor: DROP_TRIANGLE_COLOR})
+        @dropdownElement.element.setAttribute 'class', 'droplet-dropdown-arrow'
+        @dropdownElement.deactivate()
+
+        @elements.push @dropdownElement
 
     shouldAddTab: NO
 
@@ -1843,18 +1847,19 @@ exports.View = class View
 
     # ## drawSelf (SocketViewNode)
     drawSelf: (style) ->
-      path = super(style)
+      super
       if @model.hasDropdown() and @view.opts.showDropdowns
-        ###TODO
-        ctx.beginPath()
-        ctx.fillStyle = DROP_TRIANGLE_COLOR
-        ctx.moveTo @bounds[0].x + helper.DROPDOWN_ARROW_PADDING, @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2
-        ctx.lineTo @bounds[0].x + helper.DROPDOWN_ARROW_WIDTH - helper.DROPDOWN_ARROW_PADDING, @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2
-        ctx.lineTo @bounds[0].x + helper.DROPDOWN_ARROW_WIDTH / 2, @bounds[0].y + (@bounds[0].height + DROPDOWN_ARROW_HEIGHT) / 2
-        ctx.fill()
-        ###
-        0
-      return path
+        @dropdownElement.setPoints([new @view.draw.Point(@bounds[0].x + helper.DROPDOWN_ARROW_PADDING,
+            @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2),
+          new @view.draw.Point(@bounds[0].x + helper.DROPDOWN_ARROW_WIDTH - helper.DROPDOWN_ARROW_PADDING,
+            @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2),
+          new @view.draw.Point(@bounds[0].x + helper.DROPDOWN_ARROW_WIDTH / 2,
+            @bounds[0].y + (@bounds[0].height + DROPDOWN_ARROW_HEIGHT) / 2)
+        ])
+        @dropdownElement.update()
+        @dropdownElement.activate()
+      else if @dropdownElement?
+        @dropdownElement.deactivate()
 
     # ## computeOwnDropArea (SocketViewNode)
     # Socket drop areas are actually the same
@@ -2028,6 +2033,7 @@ exports.View = class View
         new @view.draw.Point(0, 0),
         @model.value
       )
+      @elements.push @textElement
 
     # ## computeChildren
     #

From 90dc70ab3078dde1e2e5675d492a6743b2121665 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 28 Jul 2015 13:03:11 -0400
Subject: [PATCH 020/268] Remove gratuitous console.log

---
 src/controller.coffee | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index f4f0f5ee..5e1e6e7c 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -630,8 +630,6 @@ Editor::redrawPalette = ->
   for binding in editorBindings.redraw_palette
     binding.call this
 
-  console.log 'setting bottom edge to', lastBottomEdge
-
   @paletteCanvas.style.height = lastBottomEdge + 'px'
 
   @paletteView.cleanupDraw() #TODO garageCollect()

From 8e5645d2c1065f568a0380c0f254dab1c9d4dfb3 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 28 Jul 2015 13:07:27 -0400
Subject: [PATCH 021/268] Fix highlightArea bug

---
 src/view.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/view.coffee b/src/view.coffee
index 934083cf..94b3ec66 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -313,7 +313,7 @@ exports.View = class View
     computeChildren: -> @lineLength
 
     focusAll: ->
-      for element in @elements
+      for element in @elements when element isnt @highlightArea
         element?.focus?()
       for child in @children
         @view.getViewNodeFor(child.child).focusAll()

From 3691069bded6a52f44757b8c9185d4bcbcc4fa6c Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 28 Jul 2015 17:39:36 -0400
Subject: [PATCH 022/268] Line marks and almostEquals bug fix

---
 css/droplet.css       | 11 +++++-----
 src/controller.coffee | 50 ++++++-------------------------------------
 src/draw.coffee       | 38 +++++++++++++++++++++++++++++---
 src/view.coffee       | 20 +++++++++++++++--
 4 files changed, 65 insertions(+), 54 deletions(-)

diff --git a/css/droplet.css b/css/droplet.css
index 68d91f5c..07269b82 100644
--- a/css/droplet.css
+++ b/css/droplet.css
@@ -323,16 +323,15 @@ text {
 }
 .droplet-socket-path {
   cursor: text;
-}
-/*
+} /*
 .droplet-block-path:hover .droplet-background-path {
   stroke: #FF0;
   stroke-width: 2px;
+  stroke-alignment: inner;
 }
-.droplet-block-path:hover .droplet-light-bevel-path .droplet-dark-bevel-path {
-  fill: #FF0 !important;
-}
-*/
+.droplet-block-path:hover .droplet-light-bevel-path, .droplet-block-path:hover .droplet-dark-bevel-path {
+  fill: #FF0;
+} */
 .droplet-palette-canvas .droplet-socket-path {
   cursor: -webkit-grab;
   cursor: -moz-grab;
diff --git a/src/controller.coffee b/src/controller.coffee
index 97caf904..757f4119 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -79,7 +79,7 @@ unsortedEditorBindings = {
 
 editorBindings = {}
 
-SVG_STANDARD = 'http://www.w3.org/2000/svg'
+SVG_STANDARD = helper.SVG_STANDARD
 
 EMBOSS_FILTER_SVG =  """
 
@@ -471,8 +471,7 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
       opts.boundingRectangle.unite(oldBounds)
       return @redrawMain opts
 
-  record.grayBoxPath.update() #draw @mainCtx
-  record.grayBoxPath.focus()
+  record.grayBoxPath.update()
   record.startText ?= new @view.draw.Text(
     (new @view.draw.Point(0, 0)), @mode.startComment
   )
@@ -483,12 +482,10 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
   record.startText.point.x = blockView.totalBounds.x - startWidth
   record.startText.point.y = blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize
   record.startText.update()
-  record.startText.focus()
 
   record.endText.point.x = record.grayBox.right() - endWidth - 5
   record.endText.point.y = bottomTextPosition
   record.endText.update()
-  record.endText.focus()
 
   blockView.draw rect, {
     grayscale: false
@@ -2090,7 +2087,7 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) ->
       if parent?
         return @reparse parent, recovery, updates, originalTrigger
       else
-        @markBlock originalTrigger, {color: '#F00'}
+        @view.getViewNodeFor(originalTrigger).mark {color: '#F00'}
         return false
 
   return if newList.start.next is newList.end
@@ -3452,22 +3449,9 @@ Editor::getHighlightPath = (model, style, view = @view) ->
 Editor::markLine = (line, style) ->
   block = @tree.getBlockOnLine line
 
-  if block?
-    @markedLines[line] =
-      model: block
-      style: style
+  @view.getViewNodeFor(block).mark style
 
-  @redrawHighlights()
-
-Editor::markBlock = (block, style) ->
-  key = @nextMarkedBlockId++
-
-  @markedBlocks[key] = {
-    model: block
-    style: style
-  }
-
-  return key
+  @redrawMain()
 
 # ## Mark
 # `mark(line, col, style)` will mark the first block after the given (line, col) coordinate
@@ -3476,32 +3460,12 @@ Editor::mark = (location, style) ->
   block = @tree.getFromTextLocation location
   block = block.container ? block
 
-  # `key` is a unique identifier for this
-  # mark, to be used later for removal
-  key = @nextMarkedBlockId++
-
-  @markedBlocks[key] = {
-    model: block
-    style: style
-  }
-
-  @redrawHighlights()
-
-  # Return `key`, so that the caller can
-  # remove the line mark later with unmark(key)
-  return key
-
-Editor::unmark = (key) ->
-  delete @markedBlocks[key]
-  return true
-
-Editor::unmarkLine = (line) ->
-  delete @markedLines[line]
+  @view.getViewNodeFor(block).mark style
 
   @redrawMain()
 
 Editor::clearLineMarks = ->
-  @markedLines = @markedBlocks = {}
+  @view.clearMarks()
 
   @redrawMain()
 
diff --git a/src/draw.coffee b/src/draw.coffee
index 900b099a..d6aa53c4 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -4,10 +4,11 @@
 # Minimalistic HTML5 canvas wrapper. Mainly used as conveneince tools in Droplet.
 
 ## Private (convenience) functions
-SVG_STANDARD = 'http://www.w3.org/2000/svg'
 BEVEL_SIZE = 1.5
+EPSILON = 0.00001
 
 helper = require './helper.coffee'
+SVG_STANDARD = helper.SVG_STANDARD
 
 # ## _area ##
 # Signed area of the triangle formed by vectors [ab] and [ac]
@@ -30,7 +31,7 @@ _bisector = (a, b, c, magnitude = 1) ->
 
   if diagonal.x is 0 and diagonal.y is 0
     return null
-  else if sample.equals(sampleB)
+  else if sample.almostEquals(sampleB)
     return null
 
   diagonal = diagonal.normalize()
@@ -133,6 +134,10 @@ exports.Draw = class Draw
 
       equals: (point) -> point.x is @x and point.y is @y
 
+      almostEquals: (point) ->
+        Math.abs(point.x - @x) < EPSILON and
+        Math.abs(point.y - @y) < EPSILON
+
     # ## Size ##
     # A Size knows its width and height.
     @Size = class Size
@@ -390,6 +395,14 @@ exports.Draw = class Draw
         @_cacheFlag = true
         @_updateFlag = true
 
+      setMarkStyle: (style) ->
+        if style? and style.color isnt @markColor?
+          @markColor = style.color
+          @_markFlag = true
+        else if @markColor?
+          @markColor = null
+          @_markFlag = true
+
       setPoints: (points) ->
         if points.length isnt @_points.length
           @_setPoints_raw points
@@ -556,7 +569,7 @@ exports.Draw = class Draw
           @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000'
           if pathString.length > 0
             @darkPathElement.setAttribute 'd', @getDarkBevelPath()
-          @backgroundPathElement.setAttribute 'class', 'droplet-dark-bevel-path'
+          @darkPathElement.setAttribute 'class', 'droplet-dark-bevel-path'
 
           pathElement.appendChild @backgroundPathElement
           pathElement.appendChild @lightPathElement
@@ -599,6 +612,25 @@ exports.Draw = class Draw
           @_lastCssClass = @style.cssClass
           @element.setAttribute 'class', @style.cssClass
 
+        if @_markFlag
+          if @markColor?
+            if @bevel
+              @backgroundPathElement.setAttribute 'stroke', @markColor
+              @backgroundPathElement.setAttribute 'stroke-width', '2'
+              @lightPathElement.setAttribute 'fill', @markColor
+              @darkPathElement.setAttribute 'fill', @markColor
+            else
+              @element.setAttribute 'stroke', @markColor
+              @element.setAttribute 'stroke-width', '2'
+          else
+            if @bevel
+              @backgroundPathElement.setAttribute 'stroke', 'none'
+              @lightPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#FFF'
+              @darkPathElement.setAttribute 'fill', avgColor @style.fillColor, 0.7, '#000'
+            else
+              @element.setAttribute 'stroke', @style.strokeColor
+              @backgroundPathElement.setAttribute 'line-width', @style.lineWidth
+
         if @_updateFlag
           @_updateFlag = false
           pathString = @getCommandString()
diff --git a/src/view.coffee b/src/view.coffee
index 94b3ec66..ff8dd534 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -27,7 +27,7 @@ CARRIAGE_GROW_DOWN = 3
 DROPDOWN_ARROW_HEIGHT = 8
 
 DROP_TRIANGLE_COLOR = '#555'
-SVG_STANDARD = 'http://www.w3.org/2000/svg'
+SVG_STANDARD = helper.SVG_STANDARD
 
 DEFAULT_OPTIONS =
   showDropdowns: true
@@ -102,6 +102,7 @@ exports.View = class View
     @contextMaps = []
 
     @lastIncludes = {}
+    @marks = {}
 
     @draw = new draw.Draw(@ctx)
 
@@ -127,6 +128,14 @@ exports.View = class View
   include: (id) ->
     @lastIncludes[id] = true
 
+  registerMark: (id) ->
+    @marks[id] = true
+
+  clearMarks: ->
+    for key, val of @marks
+      @map[key].unmark()
+    @marks = {}
+
   beginDraw: ->
     @lastIncludes = {}
 
@@ -1625,6 +1634,11 @@ exports.View = class View
       array.push new @view.draw.Point(point.x + @view.opts.tabWidth,
         point.y)
 
+    mark: (style) ->
+      @view.registerMark @model.id
+      @markStyle = style
+
+    unmark: -> @markStyle = null
 
     # ## computeOwnDropArea
     # By default, we will not have a
@@ -1658,6 +1672,8 @@ exports.View = class View
         @path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F'
         @path.style.strokeColor = avgColor @path.style.strokeColor, 0.7, '#00F'
 
+      @path.setMarkStyle @markStyle
+
       @path.update()
 
       # Unset all the things we changed
@@ -2121,7 +2137,7 @@ dedupe = (path) ->
     else
       if x.equals(path[i - 1])
         return false
-      if i < path.length - 1 and x.from(path[i - 1]).normalize().equals(path[i + 1].from(x).normalize())
+      if i < path.length - 1 and x.from(path[i - 1]).normalize().almostEquals(path[i + 1].from(x).normalize())
         return false
       return true
 

From ed566d72bcc54e2e1bc2e23dc2f2fb39308bed08 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 28 Jul 2015 19:06:58 -0400
Subject: [PATCH 023/268] Get some optimizations with floating blocks from
 grouping

---
 src/controller.coffee | 142 ++++++++++++++++++++++++------------------
 src/draw.coffee       |  32 ++++------
 src/view.coffee       |  24 ++++---
 3 files changed, 108 insertions(+), 90 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index 757f4119..664b534e 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -194,7 +194,7 @@ exports.Editor = class Editor
     @dragView = new view.View @dragCtx, @standardViewSettings
     @draw = new draw.Draw(@mainCtx)
 
-    @dropletElement.style.left = @paletteWrapper.offsetWidth + 'px'
+    @dropletElement.style.left = @paletteWrapper.clientWidth + 'px'
 
     @wrapperElement.appendChild @paletteWrapper
 
@@ -331,8 +331,8 @@ exports.Editor = class Editor
 
     @dropletElement.style.height = "#{@wrapperElement.clientHeight}px"
     if @paletteEnabled
-      @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px"
-      @dropletElement.style.width = "#{@wrapperElement.clientWidth - @paletteWrapper.offsetWidth}px"
+      @dropletElement.style.left = "#{@paletteWrapper.clientWidth}px"
+      @dropletElement.style.width = "#{@wrapperElement.clientWidth - @paletteWrapper.clientWidth}px"
     else
       @dropletElement.style.left = "0px"
       @dropletElement.style.width = "#{@wrapperElement.clientWidth}px"
@@ -344,8 +344,8 @@ exports.Editor = class Editor
 
     @mainCanvas.setAttribute 'width', @dropletElement.clientWidth - @gutter.clientWidth
 
-    @mainCanvas.style.left = "#{@gutter.offsetWidth}px"
-    @transitionContainer.style.left = "#{@gutter.offsetWidth}px"
+    @mainCanvas.style.left = "#{@gutter.clientWidth}px"
+    @transitionContainer.style.left = "#{@gutter.clientWidth}px"
 
     @resizePalette()
     @resizePaletteHighlight()
@@ -388,8 +388,8 @@ Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') ->
 
   @topNubbyPath = new @draw.Path([], true)
 
-  @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, -5
-  @topNubbyPath.push new @draw.Point @mainCanvas.offsetWidth, height
+  @topNubbyPath.push new @draw.Point @mainCanvas.clientWidth, -5
+  @topNubbyPath.push new @draw.Point @mainCanvas.clientWidth, height
 
   @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height
   @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth),
@@ -408,6 +408,37 @@ Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') ->
 Editor::resizeNubby = ->
   @setTopNubbyStyle @nubbyHeight, @nubbyColor
 
+Editor::initializeFloatingBlock = (record, i) ->
+  record.renderGroup = new @view.draw.Group()
+
+  record.grayBox = new @view.draw.NoRectangle()
+  record.grayBoxPath = new @view.draw.Path(
+    [], false, {
+      fillColor: GRAY_BLOCK_COLOR
+      strokeColor: GRAY_BLOCK_BORDER
+      lineWidth: 4
+      dotted: '8 5'
+      cssClass: 'droplet-floating-container'
+    }
+  )
+  record.startText = new @view.draw.Text(
+    (new @view.draw.Point(0, 0)), @mode.startComment
+  )
+  record.endText = new @view.draw.Text(
+    (new @view.draw.Point(0, 0)), @mode.endComment
+  )
+
+  for element in [record.grayBoxPath, record.startText, record.endText]
+    element.setParent record.renderGroup
+
+  @view.getViewNodeFor(record.block).group.setParent record.renderGroup
+
+  # TODO maybe refactor into qualifiedFocus
+  if i < @floatingBlocks.length
+    @mainCtx.insertBefore record.renderGroup.element, @floatingBlocks[i].renderGroup.element
+  else
+    @mainCtx.appendChild record.renderGroup
+
 Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
   blockView = @view.getViewNodeFor record.block
   blockView.layout record.position.x, record.position.y
@@ -427,15 +458,6 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
 
   unless rectangle.equals(record.grayBox)
     record.grayBox = rectangle
-    record.grayBoxPath ?= new @view.draw.Path(
-      [], false, {
-        fillColor: GRAY_BLOCK_COLOR
-        strokeColor: GRAY_BLOCK_BORDER
-        lineWidth: 4
-        dotted: '8 5'
-        cssClass: 'droplet-floating-container'
-      }
-    )
 
     oldBounds = record.grayBoxPath?.bounds?() ? new @view.draw.NoRectangle()
 
@@ -472,12 +494,6 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
       return @redrawMain opts
 
   record.grayBoxPath.update()
-  record.startText ?= new @view.draw.Text(
-    (new @view.draw.Point(0, 0)), @mode.startComment
-  )
-  record.endText ?= new @view.draw.Text(
-    (new @view.draw.Point(0, 0)), @mode.endComment
-  )
 
   record.startText.point.x = blockView.totalBounds.x - startWidth
   record.startText.point.y = blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize
@@ -493,8 +509,6 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) ->
     noText: false
   }
 
-  blockView.focusAll()
-
 hook 'populate', 0, ->
   @currentlyDrawnFloatingBlocks = []
 
@@ -609,8 +623,8 @@ Editor::redrawPalette = ->
   boundingRect = new @draw.Rectangle(
     @viewports.palette.x,
     @viewports.palette.y,
-    @paletteCanvas.offsetWidth,
-    @paletteCanvas.offsetHeight
+    @paletteCanvas.clientWidth,
+    @paletteCanvas.clientHeight
   )
 
   for entry in @currentPaletteBlocks
@@ -1040,9 +1054,9 @@ Editor::resizeDragCanvas = ->
   @dragCanvas.style.width = "#{0}px"
   @dragCanvas.style.height = "#{0}px"
 
-  @highlightCanvas.style.width = "#{@dropletElement.offsetWidth - @gutter.offsetWidth}px"
+  @highlightCanvas.style.width = "#{@dropletElement.clientWidth - @gutter.clientWidth}px"
 
-  @highlightCanvas.style.height = "#{@dropletElement.offsetHeight}px"
+  @highlightCanvas.style.height = "#{@dropletElement.clientHeight}px"
 
   @highlightCanvas.style.left = "#{@mainCanvas.offsetLeft}px"
 
@@ -1330,7 +1344,7 @@ hook 'mousemove', 0, (point, event, state) ->
       head = head.next
 
     if head is @tree.end and @floatingBlocks.length is 0 and
-        @viewports.main.right() > mainPoint.x > @viewports.main.x - @gutter.offsetWidth and
+        @viewports.main.right() > mainPoint.x > @viewports.main.x - @gutter.clientWidth and
         @viewports.main.bottom() > mainPoint.y > @viewports.main.y
       @view.getViewNodeFor(@tree).highlightArea.update()
       @lastHighlight = @tree
@@ -1393,7 +1407,7 @@ Editor::qualifiedFocus = (node, path) ->
   documentIndex = @documentIndex node
   if documentIndex < @floatingBlocks.length
     path.activate()
-    @mainCtx.insertBefore path.element, @floatingBlocks[documentIndex].grayBoxPath.element
+    @mainCtx.insertBefore path.element, @floatingBlocks[documentIndex].renderGroup.element
   else
     path.focus()
 
@@ -1572,7 +1586,7 @@ hook 'mouseup', 0, (point, event, state) ->
     @spliceOut @draggingBlock
 
     # If we dropped it off in the palette, abort (so as to delete the block).
-    unless @viewports.main.right() > renderPoint.x > @viewports.main.x - @gutter.offsetWidth and
+    unless @viewports.main.right() > renderPoint.x > @viewports.main.x - @gutter.clientWidth and
         @viewports.main.bottom() > renderPoint.y > @viewports.main.y
       if @draggingBlock is @lassoSelection
         @lassoSelection = null
@@ -1591,11 +1605,13 @@ hook 'mouseup', 0, (point, event, state) ->
 
     # Add this block to our list of floating blocks
     console.log 'pushing a floater'
-    @floatingBlocks.push new FloatingBlockRecord(
+    @floatingBlocks.push record = new FloatingBlockRecord(
       newDocument
       renderPoint
     )
 
+    @initializeFloatingBlock record, @floatingBlocks.length - 1
+
     @setCursor @draggingBlock.start
 
     # TODO write a test for this logic
@@ -1623,10 +1639,12 @@ Editor::performFloatingOperation = (op, direction) ->
     if @cursor.document > op.index
       @cursor.document += 1
 
-    @floatingBlocks.splice op.index, 0, new FloatingBlockRecord(
+    @floatingBlocks.splice op.index, 0, record = new FloatingBlockRecord(
       op.block.clone()
       op.position
     )
+
+    @initializeFloatingBlock record, op.index
   else
     # If the cursor's document is about to vanish,
     # put it back in the main tree.
@@ -1787,9 +1805,9 @@ hook 'populate', 1, ->
   @paletteElement.appendChild @paletteHighlightCanvas
 
 Editor::resizePaletteHighlight = ->
-  @paletteHighlightCanvas.style.top = @paletteHeader.offsetHeight + 'px'
-  @paletteHighlightCanvas.style.width = "#{@paletteCanvas.offsetWidth}px"
-  @paletteHighlightCanvas.style.height = "#{@paletteCanvas.offsetHeight}px"
+  @paletteHighlightCanvas.style.top = @paletteHeader.clientHeight + 'px'
+  @paletteHighlightCanvas.style.width = "#{@paletteCanvas.clientWidth}px"
+  @paletteHighlightCanvas.style.height = "#{@paletteCanvas.clientHeight}px"
 
 hook 'redraw_palette', 0, ->
   @clearPaletteHighlightCanvas()
@@ -1860,7 +1878,7 @@ hook 'populate', 1, ->
 Editor::resizeAceElement = ->
   width = @wrapperElement.clientWidth
   if @showPaletteInTextMode and @paletteEnabled
-    width -= @paletteWrapper.offsetWidth
+    width -= @paletteWrapper.clientWidth
 
   @aceElement.style.width = "#{width}px"
   @aceElement.style.height = "#{@wrapperElement.clientHeight}px"
@@ -1921,7 +1939,7 @@ Editor::redrawTextInput = ->
       rect.unite treeView.bounds[line]
       rect.unite treeView.bounds[line + 1] if line + 1 < treeView.bounds.length
 
-      rect.width = Math.max rect.width, @mainCanvas.offsetWidth
+      rect.width = Math.max rect.width, @mainCanvas.clientWidth
 
       @redrawMain
         boundingRectangle: rect
@@ -2011,8 +2029,8 @@ Editor::redrawTextHighlights = (scrollIntoView = false) ->
     @textCursorPath.update()
     @qualifiedFocus @getCursor(), @textCursorPath
 
-  if scrollIntoView and endPosition > @viewports.main.x + @mainCanvas.offsetWidth
-    @mainScroller.scrollLeft = endPosition - @mainCanvas.offsetWidth + @view.opts.padding
+  if scrollIntoView and endPosition > @viewports.main.x + @mainCanvas.clientWidth
+    @mainScroller.scrollLeft = endPosition - @mainCanvas.clientWidth + @view.opts.padding
 
 escapeString = (str) ->
   str[0] + str[1...-1].replace(/(\'|\"|\n)/g, '\\$1') + str[str.length - 1]
@@ -2297,7 +2315,7 @@ Editor::showDropdown = (socket = @getCursor()) ->
   # some padding on the right. After checking for this,
   # move the dropdown element into position
   setTimeout (=>
-    if @dropdownElement.offsetHeight < @dropdownElement.scrollHeight
+    if @dropdownElement.clientHeight < @dropdownElement.scrollHeight
       for el in dropdownItems
         el.style.paddingRight = DROPDOWN_SCROLLBAR_PADDING
 
@@ -2849,7 +2867,7 @@ Editor::computePlaintextTranslationVectors = ->
     x: (@aceEditor.container.getBoundingClientRect().left -
         @aceElement.getBoundingClientRect().left +
         @aceEditor.renderer.$gutterLayer.gutterWidth) -
-        @gutter.offsetWidth + 5 # TODO find out where this 5 comes from
+        @gutter.clientWidth + 5 # TODO find out where this 5 comes from
     y: (@aceEditor.container.getBoundingClientRect().top -
         @aceElement.getBoundingClientRect().top) -
         aceSession.getScrollTop()
@@ -2863,7 +2881,7 @@ Editor::computePlaintextTranslationVectors = ->
     leftEdge: (@aceEditor.container.getBoundingClientRect().left -
         getOffsetLeft(@aceElement) +
         @aceEditor.renderer.$gutterLayer.gutterWidth) -
-        @gutter.offsetWidth + 5 # TODO see above
+        @gutter.clientWidth + 5 # TODO see above
   }
 
   @measureCtx.font = @aceFontSize() + ' ' + @fontFamily
@@ -2925,7 +2943,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
     @redrawMain noText: true
 
     # Hide scrollbars and increase width
-    if @mainScroller.scrollWidth > @mainScroller.offsetWidth
+    if @mainScroller.scrollWidth > @mainScroller.clientWidth
       @mainScroller.style.overflowX = 'scroll'
     else
       @mainScroller.style.overflowX = 'hidden'
@@ -2988,7 +3006,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
       div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent - @viewports.main.y}px"
 
       div.style.font = @fontSize + 'px ' + @fontFamily
-      div.style.width = "#{@gutter.offsetWidth}px"
+      div.style.width = "#{@gutter.clientWidth}px"
       translatingElements.push div
 
       div.className = 'droplet-transitioning-element droplet-transitioning-gutter droplet-gutter-line'
@@ -3027,7 +3045,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
           @paletteWrapper.style.transition = "left #{translateTime}ms"
 
         @dropletElement.style.left = '0px'
-        @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px"
+        @paletteWrapper.style.left = "#{-@paletteWrapper.clientWidth}px"
       ), fadeTime
 
     setTimeout (=>
@@ -3038,7 +3056,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -
       # Translate the ACE editor div into frame.
       @aceElement.style.top = '0px'
       if @showPaletteInTextMode and @paletteEnabled
-        @aceElement.style.left = "#{@paletteWrapper.offsetWidth}px"
+        @aceElement.style.left = "#{@paletteWrapper.clientWidth}px"
       else
         @aceElement.style.left = '0px'
 
@@ -3106,12 +3124,12 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-
 
       if paletteAppearingWithFreeze
         @paletteWrapper.style.top = '0px'
-        @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px"
+        @paletteWrapper.style.left = "#{-@paletteWrapper.clientWidth}px"
         @paletteHeader.style.zIndex = 0
 
       @dropletElement.style.top = "0px"
       if @paletteEnabled and not paletteAppearingWithFreeze
-        @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px"
+        @dropletElement.style.left = "#{@paletteWrapper.clientWidth}px"
       else
         @dropletElement.style.left = "0px"
 
@@ -3166,7 +3184,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-
         div.innerText = div.textContent = line + 1
 
         div.style.font = @aceFontSize() + ' ' + @fontFamily
-        div.style.width = "#{@aceEditor.renderer.$gutter.offsetWidth}px"
+        div.style.width = "#{@aceEditor.renderer.$gutter.clientWidth}px"
 
         div.style.left = 0
         div.style.top = "#{@aceEditor.session.documentToScreenRow(line, 0) *
@@ -3199,7 +3217,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-
 
       if paletteAppearingWithFreeze
         @paletteWrapper.style.transition = @dropletElement.style.transition
-        @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px"
+        @dropletElement.style.left = "#{@paletteWrapper.clientWidth}px"
         @paletteWrapper.style.left = '0px'
 
       setTimeout (=>
@@ -3243,7 +3261,7 @@ Editor::enablePalette = (enabled) ->
         @paletteWrapper.style.transition = "left 500ms"
 
       activeElement.style.left = '0px'
-      @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px"
+      @paletteWrapper.style.left = "#{-@paletteWrapper.clientWidth}px"
 
       @paletteHeader.style.zIndex = 0
 
@@ -3261,14 +3279,14 @@ Editor::enablePalette = (enabled) ->
 
     else
       @paletteWrapper.style.top = '0px'
-      @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px"
+      @paletteWrapper.style.left = "#{-@paletteWrapper.clientWidth}px"
       @paletteHeader.style.zIndex = 257
 
       setTimeout (=>
         activeElement.style.transition =
           @paletteWrapper.style.transition = "left 500ms"
 
-        activeElement.style.left = "#{@paletteWrapper.offsetWidth}px"
+        activeElement.style.left = "#{@paletteWrapper.clientWidth}px"
         @paletteWrapper.style.left = '0px'
 
         setTimeout (=>
@@ -3331,11 +3349,11 @@ hook 'populate', 2, ->
     @viewports.palette.x = @paletteScroller.scrollLeft
 
 Editor::resizeMainScroller = ->
-  @mainScroller.style.width = "#{@dropletElement.offsetWidth}px"
-  @mainScroller.style.height = "#{@dropletElement.offsetHeight}px"
+  @mainScroller.style.width = "#{@dropletElement.clientWidth}px"
+  @mainScroller.style.height = "#{@dropletElement.clientHeight}px"
 
 hook 'resize_palette', 0, ->
-  @paletteScroller.style.top = "#{@paletteHeader.offsetHeight}px"
+  @paletteScroller.style.top = "#{@paletteHeader.clientHeight}px"
 
   @viewports.palette.height = @paletteScroller.clientHeight
   @viewports.palette.width = @paletteScroller.clientWidth
@@ -3352,7 +3370,7 @@ hook 'redraw_main', 1, ->
   # Default this extra space to fontSize (approx. 1 line).
   height = Math.max(
     bounds.bottom() + (@options.extraBottomHeight ? @fontSize),
-    @dropletElement.offsetHeight
+    @dropletElement.clientHeight
   )
 
   if height isnt @lastHeight
@@ -3597,7 +3615,7 @@ Editor::setEditorState = (useBlocks) ->
     @dropletElement.style.top = '0px'
     if @paletteEnabled
       @paletteWrapper.style.top = @paletteWrapper.style.left = '0px'
-      @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px"
+      @dropletElement.style.left = "#{@paletteWrapper.clientWidth}px"
     else
       @paletteWrapper.style.top = @paletteWrapper.style.left = '-9999px'
       @dropletElement.style.left = '0px'
@@ -3634,7 +3652,7 @@ Editor::setEditorState = (useBlocks) ->
 
     @aceElement.style.top = '0px'
     if paletteVisibleInNewState
-      @aceElement.style.left = "#{@paletteWrapper.offsetWidth}px"
+      @aceElement.style.left = "#{@paletteWrapper.clientWidth}px"
     else
       @aceElement.style.left = '0px'
 
@@ -3989,8 +4007,8 @@ Editor::resizeGutter = ->
     @gutter.style.width = @lastGutterWidth + 'px'
     return @resize()
 
-  unless @lastGutterHeight is Math.max(@dropletElement.offsetHeight, @mainCanvas.offsetHeight)
-    @lastGutterHeight = Math.max(@dropletElement.offsetHeight, @mainCanvas.offsetHeight)
+  unless @lastGutterHeight is Math.max(@dropletElement.clientHeight, @mainCanvas.clientHeight)
+    @lastGutterHeight = Math.max(@dropletElement.clientHeight, @mainCanvas.clientHeight)
     @gutter.style.height = @lastGutterHeight + 'px'
 
 Editor::addLineNumberForLine = (line) ->
diff --git a/src/draw.coffee b/src/draw.coffee
index d6aa53c4..cb8ea6e3 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -253,12 +253,22 @@ exports.Draw = class Draw
 
       focus: ->
         @activate()
-        self.ctx.appendChild @element
+        (@element.parentElement ? self.ctx).appendChild @element
+
+      setParent: (parent) ->
+        if parent instanceof ElementWrapper
+          parent = parent.element
+
+        unless parent is @element.parentElement
+          parent.appendChild @element
 
       destroy: ->
         @deactivate()
-        self.ctx.removeChild @element
+        @element.parentElement.removeChild @element
 
+    @Group = class Group extends ElementWrapper
+      constructor: ->
+        super document.createElementNS SVG_STANDARD, 'g'
 
     # ## Path ##
     # This is called Path, but is forced to be closed so is actually a polygon.
@@ -714,24 +724,6 @@ exports.Draw = class Draw
           text = document.createTextNode @value.replace(/ /g, '\u00A0')
           element.appendChild text
 
-      deactivate: ->
-        if @active
-          @active = false
-          @element.setAttribute 'visibility', 'hidden'
-
-      activate: ->
-        unless @active
-          @active = true
-          @element.setAttribute 'visibility', 'visible'
-
-      focus: ->
-        @activate()
-        self.ctx.appendChild @element
-
-      destroy: ->
-        @deactivate()
-        self.ctx.removeChild @element
-
   refreshFontCapital:  ->
     metrics = helper.fontMetrics(@fontFamily, @fontSize)
     @fontAscent = metrics.prettytop
diff --git a/src/view.coffee b/src/view.coffee
index ff8dd534..7b496874 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -230,6 +230,8 @@ exports.View = class View
       # {height:2, draw:true}
       @glue = {}
 
+      @group = new @view.draw.Group()
+
       # *Sixth pass variables*
       # computePath
       if @model.type is 'block'
@@ -241,6 +243,8 @@ exports.View = class View
           cssClass: "droplet-#{@model.type}-path"
         })
 
+      @path.setParent @group
+
       # *Seventh pass variables*
       # computeDropAreas
       # each one is a @view.draw.Path (or null)
@@ -252,7 +256,7 @@ exports.View = class View
       })
       @highlightArea.deactivate()
 
-      @elements = [@path, @highlightArea]
+      @elements = [@group, @path, @highlightArea]
 
       # Versions. The corresponding
       # Model will keep corresponding version
@@ -322,10 +326,7 @@ exports.View = class View
     computeChildren: -> @lineLength
 
     focusAll: ->
-      for element in @elements when element isnt @highlightArea
-        element?.focus?()
-      for child in @children
-        @view.getViewNodeFor(child.child).focusAll()
+      @group.focus()
 
     computeCarriageArrow: ->
       for childObj in @children
@@ -759,12 +760,18 @@ exports.View = class View
 
     # ## draw (GenericViewNode)
     # Call `drawSelf` and recurse, if we are in the viewport.
-    draw: (boundingRect, style = {}) ->
+    draw: (boundingRect, style = {}, parent = null) ->
       @drawSelf style
-      @path.activate()
+
+      @group.activate(); @path.activate()
+
+      if parent?
+        @group.setParent parent
+      else
+        @group.setParent @view.draw.ctx
 
       for childObj in @children
-        @view.getViewNodeFor(childObj.child).draw boundingRect, style
+        @view.getViewNodeFor(childObj.child).draw boundingRect, style, @group
 
     forceClean: ->
       @clean @computedVersion
@@ -2049,6 +2056,7 @@ exports.View = class View
         new @view.draw.Point(0, 0),
         @model.value
       )
+      @textElement.setParent @group
       @elements.push @textElement
 
     # ## computeChildren

From 1f0de78c83f79fcc7ef47811403b85b565932f96 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Tue, 28 Jul 2015 20:08:39 -0400
Subject: [PATCH 024/268] Fix parenting on drags

---
 src/controller.coffee |   1 +
 src/view.coffee       | 110 +++++++++++++++++++++++++-----------------
 2 files changed, 66 insertions(+), 45 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index 664b534e..2f8e2536 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -1224,6 +1224,7 @@ hook 'mousemove', 1, (point, event, state) ->
     draggingBlockView = @dragView.getViewNodeFor @draggingBlock
     draggingBlockView.layout 1, 1
     draggingBlockView.drawShadow @dragCtx, 5, 5
+    draggingBlockView.root()
     draggingBlockView.draw()
     @dragView.garbageCollect()
 
diff --git a/src/view.coffee b/src/view.coffee
index 7b496874..2abc99a8 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -230,33 +230,7 @@ exports.View = class View
       # {height:2, draw:true}
       @glue = {}
 
-      @group = new @view.draw.Group()
-
-      # *Sixth pass variables*
-      # computePath
-      if @model.type is 'block'
-        @path = new @view.draw.Path([], true, {
-          cssClass: 'droplet-block-path'
-        })
-      else
-        @path = new @view.draw.Path([], false, {
-          cssClass: "droplet-#{@model.type}-path"
-        })
-
-      @path.setParent @group
-
-      # *Seventh pass variables*
-      # computeDropAreas
-      # each one is a @view.draw.Path (or null)
-      @dropArea = null
-      @highlightArea = new @view.draw.Path([], false, {
-        fillColor: '#FF0'
-        strokeColor: '#FF0'
-        lineWidth: 1
-      })
-      @highlightArea.deactivate()
-
-      @elements = [@group, @path, @highlightArea]
+      @elements = []
 
       # Versions. The corresponding
       # Model will keep corresponding version
@@ -266,6 +240,13 @@ exports.View = class View
       # few or no changes to the Model).
       @computedVersion = -1
 
+    draw: (boundingRect, style = {}, parent = null) ->
+      @drawSelf style, parent
+
+    root: ->
+      for element in @elements
+        element.setParent @view.draw.ctx
+
     serialize: (line) ->
       result = []
       for prop in [
@@ -695,7 +676,8 @@ exports.View = class View
 
           @totalBounds.width = maxRight - @totalBounds.x
 
-        @totalBounds.unite @path.bounds()
+        if @path?
+          @totalBounds.unite @path.bounds()
 
       @lastComputedLinePredicate = @model.isLastOnLine()
 
@@ -758,21 +740,6 @@ exports.View = class View
     drawSelf: (style = {}) ->
       @view.include @model.id
 
-    # ## draw (GenericViewNode)
-    # Call `drawSelf` and recurse, if we are in the viewport.
-    draw: (boundingRect, style = {}, parent = null) ->
-      @drawSelf style
-
-      @group.activate(); @path.activate()
-
-      if parent?
-        @group.setParent parent
-      else
-        @group.setParent @view.draw.ctx
-
-      for childObj in @children
-        @view.getViewNodeFor(childObj.child).draw boundingRect, style, @group
-
     forceClean: ->
       @clean @computedVersion
 
@@ -801,6 +768,11 @@ exports.View = class View
     constructor: (@model, @view) ->
       super
 
+    draw: (boundingRect, style = {}, parent = null) ->
+      super
+      for childObj in @children
+        @view.getViewNodeFor(childObj.child).draw boundingRect, style, @group
+
     # ## computeChildren (ListViewNode)
     # Figure out which children lie on each line,
     # and compute `@multilineChildrenData` simultaneously.
@@ -1226,6 +1198,52 @@ exports.View = class View
     constructor: (@model, @view) ->
       super
 
+      # *Sixth pass variables*
+      # computePath
+      @group = new @view.draw.Group()
+
+      if @model.type is 'block'
+        @path = new @view.draw.Path([], true, {
+          cssClass: 'droplet-block-path'
+        })
+      else
+        @path = new @view.draw.Path([], false, {
+          cssClass: "droplet-#{@model.type}-path"
+        })
+
+      @path.setParent @group
+
+      # *Seventh pass variables*
+      # computeDropAreas
+      # each one is a @view.draw.Path (or null)
+      @dropArea = null
+      @highlightArea = new @view.draw.Path([], false, {
+        fillColor: '#FF0'
+        strokeColor: '#FF0'
+        lineWidth: 1
+      })
+      @highlightArea.deactivate()
+
+      @elements.push @group
+      @elements.push @path
+      @elements.push @highlightArea
+
+    root: ->
+      @group.setParent @view.draw.ctx
+
+    # ## draw (GenericViewNode)
+    # Call `drawSelf` and recurse, if we are in the viewport.
+    draw: (boundingRect, style = {}, parent = null) ->
+      @drawSelf style, parent
+
+      @group.activate(); @path.activate()
+
+      if parent?
+        @group.setParent parent
+
+      for childObj in @children
+        @view.getViewNodeFor(childObj.child).draw boundingRect, style, @group
+
     computeCarriageArrow: (root = false) ->
       oldCarriageArrow = @carriageArrow
       @carriageArrow = CARRIAGE_ARROW_NONE
@@ -2056,7 +2074,6 @@ exports.View = class View
         new @view.draw.Point(0, 0),
         @model.value
       )
-      @textElement.setParent @group
       @elements.push @textElement
 
     # ## computeChildren
@@ -2098,13 +2115,16 @@ exports.View = class View
     # ## drawSelf
     #
     # Draw the text element itself.
-    drawSelf: (style = {}) ->
+    drawSelf: (style = {}, parent = null) ->
       @textElement.update()
       if style.noText
         @textElement.deactivate()
       else
         @textElement.activate()
 
+      if parent?
+        @textElement.setParent parent
+
       @view.include @model.id
 
 toRGB = (hex) ->

From 872ec4e2d39debcc69ff3c24f0cb95b687d248c0 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Wed, 29 Jul 2015 13:18:07 -0400
Subject: [PATCH 025/268] Fix bug with dragging Lists

---
 src/controller.coffee |  4 ++++
 src/view.coffee       | 10 ++++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index 2f8e2536..5bcaa344 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -635,6 +635,10 @@ Editor::redrawPalette = ->
     # Render the block
     paletteBlockView.draw boundingRect
 
+    element = document.createElementNS SVG_STANDARD, 'title'
+    element.innerHTML = entry.title ? entry.block.stringify()
+    paletteBlockView.group.element.appendChild element
+
     # Update lastBottomEdge
     lastBottomEdge = paletteBlockView.getBounds().bottom() + PALETTE_MARGIN
 
diff --git a/src/view.coffee b/src/view.coffee
index 2abc99a8..2e829b6d 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -773,6 +773,10 @@ exports.View = class View
       for childObj in @children
         @view.getViewNodeFor(childObj.child).draw boundingRect, style, @group
 
+    root: ->
+      for child in @children
+        @view.getViewNodeFor(child.child).root()
+
     # ## computeChildren (ListViewNode)
     # Figure out which children lie on each line,
     # and compute `@multilineChildrenData` simultaneously.
@@ -1183,8 +1187,6 @@ exports.View = class View
     # Draw the drop-shadow of the path on the given
     # context.
     drawShadow: (x, y) ->
-      @path.drawShadow x, y, @view.opts.shadowBlur
-
       for childObj in @children
         @view.getViewNodeFor(childObj.child).drawShadow x, y
 
@@ -1231,6 +1233,10 @@ exports.View = class View
     root: ->
       @group.setParent @view.draw.ctx
 
+    drawShadow: (x, y) ->
+      @path.drawShadow x, y, @view.opts.shadowBlur
+      super
+
     # ## draw (GenericViewNode)
     # Call `drawSelf` and recurse, if we are in the viewport.
     draw: (boundingRect, style = {}, parent = null) ->

From 75d37cc628ddb03845b046d4bba6056e6f4a9822 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Wed, 29 Jul 2015 19:12:57 -0400
Subject: [PATCH 026/268] Fix garbage-collection and palette aesthetics

---
 src/controller.coffee  |  6 +++---
 src/draw.coffee        |  3 ++-
 src/view.coffee        |  3 +++
 test/src/uitest.coffee | 48 +++++++++++++++++++++---------------------
 4 files changed, 32 insertions(+), 28 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index e04127d5..ea674f09 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -571,7 +571,7 @@ Editor::redrawMain = (opts = {}) ->
     unless @alreadyScheduledCleanup
       @alreadyScheduledCleanup = true
       setTimeout (=>
-        @alreadyScheduledCLeanup = false
+        @alreadyScheduledCleanup = false
         @view.garbageCollect()
       ), 0
 
@@ -1810,7 +1810,7 @@ hook 'populate', 1, ->
   @paletteElement.appendChild @paletteHighlightCanvas
 
 Editor::resizePaletteHighlight = ->
-  @paletteHighlightCanvas.style.top = @paletteHeader.clientHeight + 'px'
+  @paletteHighlightCanvas.style.top = @paletteHeader.offsetHeight + 'px'
   @paletteHighlightCanvas.style.width = "#{@paletteCanvas.clientWidth}px"
   @paletteHighlightCanvas.style.height = "#{@paletteCanvas.clientHeight}px"
 
@@ -3356,7 +3356,7 @@ Editor::resizeMainScroller = ->
   @mainScroller.style.height = "#{@dropletElement.clientHeight}px"
 
 hook 'resize_palette', 0, ->
-  @paletteScroller.style.top = "#{@paletteHeader.clientHeight}px"
+  @paletteScroller.style.top = "#{@paletteHeader.offsetHeight}px"
 
   @viewports.palette.height = @paletteScroller.clientHeight
   @viewports.palette.width = @paletteScroller.clientWidth
diff --git a/src/draw.coffee b/src/draw.coffee
index 68c8e83d..aec1083b 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -264,7 +264,8 @@ exports.Draw = class Draw
 
       destroy: ->
         @deactivate()
-        @element.parentElement.removeChild @element
+        if @element.parentElement?
+          @element.parentElement.removeChild @element
 
     @Group = class Group extends ElementWrapper
       constructor: ->
diff --git a/src/view.coffee b/src/view.coffee
index df1dcca8..f8753d72 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -145,10 +145,13 @@ exports.View = class View
         val.hide()
 
   garbageCollect: ->
+    destroyed = 0
     for key, val of @map
       unless key of @lastIncludes
+        destroyed += 1
         val.destroy()
         delete @map[key]
+    console.log 'destroyed', destroyed
 
   hasViewNodeFor: (model) ->
     model? and model.id of @map
diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee
index 1e80107f..226f4fe8 100644
--- a/test/src/uitest.coffee
+++ b/test/src/uitest.coffee
@@ -140,8 +140,8 @@ asyncTest 'Controller: reparse and undo reparse', ->
   editor.setEditorState(true)
   editor.setValue('var hello = 1;')
 
-  simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 160, dy: 20})
-  simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 160, dy: 20})
+  simulate('mousedown', '.droplet-main-canvas', {dx: 160, dy: 20})
+  simulate('mouseup', '.droplet-main-canvas', {dx: 160, dy: 20})
 
   ok(editor.cursorAtSocket(), 'Has text focus')
   equal(editor.getCursor().stringify(), '1')
@@ -152,12 +152,12 @@ asyncTest 'Controller: reparse and undo reparse', ->
     ok(editor.cursorAtSocket(), 'Editor still has text focus')
     equal(editor.getCursor().stringify(), '2 + 3')
 
-    simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 300, dy: 300})
-    simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 300, dy: 300})
+    simulate('mousedown', '.droplet-main-canvas', {dx: 300, dy: 300})
+    simulate('mouseup', '.droplet-main-canvas', {dx: 300, dy: 300})
 
     # Sockets are separate
-    simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 160, dy: 30})
-    simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 160, dy: 30})
+    simulate('mousedown', '.droplet-main-canvas', {dx: 160, dy: 30})
+    simulate('mouseup', '.droplet-main-canvas', {dx: 160, dy: 30})
 
     ok(editor.cursorAtSocket(), 'Has text focus')
 
@@ -166,8 +166,8 @@ asyncTest 'Controller: reparse and undo reparse', ->
     editor.undo()
 
     setTimeout (->
-      simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 160, dy: 20})
-      simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 160, dy: 20})
+      simulate('mousedown', '.droplet-main-canvas', {dx: 160, dy: 20})
+      simulate('mouseup', '.droplet-main-canvas', {dx: 160, dy: 20})
       equal(editor.getCursor().stringify(), '1', 'Successfully undid reparse')
     ), 0
 
@@ -186,8 +186,8 @@ asyncTest 'Controller: reparse fallback', ->
   editor.setEditorState(true)
   editor.setValue('var hello = function (a) {};')
 
-  simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 260, dy: 30})
-  simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 260, dy: 30})
+  simulate('mousedown', '.droplet-main-canvas', {dx: 260, dy: 30})
+  simulate('mouseup', '.droplet-main-canvas', {dx: 260, dy: 30})
 
   ok(editor.cursorAtSocket(), 'Has text focus')
   equal(editor.getCursor().stringify(), 'a')
@@ -198,15 +198,15 @@ asyncTest 'Controller: reparse fallback', ->
     ok(editor.cursorAtSocket(), 'Editor still has text focus')
     equal(editor.getCursor().stringify(), 'a, b')
 
-    simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 300, dy: 300})
-    simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 300, dy: 300})
+    simulate('mousedown', '.droplet-main-canvas', {dx: 300, dy: 300})
+    simulate('mouseup', '.droplet-main-canvas', {dx: 300, dy: 300})
 
     # Did not insert parentheses
     equal(editor.getValue().trim(), 'var hello = function (a, b) {};')
 
     # Sockets are separate
-    simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 260, dy: 30})
-    simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 260, dy: 30})
+    simulate('mousedown', '.droplet-main-canvas', {dx: 260, dy: 30})
+    simulate('mouseup', '.droplet-main-canvas', {dx: 260, dy: 30})
 
     ok(editor.cursorAtSocket(), 'Has text focus')
 
@@ -227,8 +227,8 @@ asyncTest 'Controller: does not throw on reparse error', ->
   editor.setEditorState(true)
   editor.setValue('var hello = function (a) {};')
 
-  simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 260, dy: 30})
-  simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 260, dy: 30})
+  simulate('mousedown', '.droplet-main-canvas', {dx: 260, dy: 30})
+  simulate('mouseup', '.droplet-main-canvas', {dx: 260, dy: 30})
 
   ok(editor.getCursor(), 'Has text focus')
   equal(editor.getCursor().stringify(), 'a')
@@ -239,8 +239,8 @@ asyncTest 'Controller: does not throw on reparse error', ->
     ok(editor.getCursor(), 'Editor still has getCursor()')
     equal(editor.getCursor().stringify(), '18n')
 
-    simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 300, dy: 300})
-    simulate('mouseup', '.droplet-main-scroller-stuffing', {dx: 300, dy: 300})
+    simulate('mousedown', '.droplet-main-canvas', {dx: 300, dy: 300})
+    simulate('mouseup', '.droplet-main-canvas', {dx: 300, dy: 300})
 
     ok(true, 'Does not throw on reparse')
 
@@ -267,20 +267,20 @@ asyncTest 'Controller: Can replace a block where we found it', ->
   editor.setValue('for (var i = 0; i < 5; i++) {\n' +
                    '  fd(10);\n' +
                    '}\n')
-  simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 300, dy: 30})
+  simulate('mousedown', '.droplet-main-canvas', {dx: 300, dy: 30})
   simulate('mousemove', '.droplet-drag-cover'
-    {location: '.droplet-main-scroller-stuffing', dx: 305, dy: 35})
+    {location: '.droplet-main-canvas', dx: 305, dy: 35})
   simulate('mouseup', '.droplet-drag-cover'
-    {location: '.droplet-main-scroller-stuffing', dx: 305, dy: 35})
+    {location: '.droplet-main-canvas', dx: 305, dy: 35})
   equal(editor.getValue() , 'for (var i = 0; i < 5; i++) {\n' +
                             '  fd(10);\n' +
                             '}\n')
 
-  simulate('mousedown', '.droplet-main-scroller-stuffing', {dx: 300, dy: 30})
+  simulate('mousedown', '.droplet-main-canvas', {dx: 300, dy: 30})
   simulate('mousemove', '.droplet-drag-cover'
-    {location: '.droplet-main-scroller-stuffing', dx: 290, dy: 25})
+    {location: '.droplet-main-canvas', dx: 290, dy: 25})
   simulate('mouseup', '.droplet-drag-cover'
-    {location: '.droplet-main-scroller-stuffing', dx: 290, dy: 25})
+    {location: '.droplet-main-canvas', dx: 290, dy: 25})
   equal(editor.getValue() , 'for (var i = 0; i < i++; __) {\n' +
                             '  fd(10);\n' +
                             '}\n')

From c6af07479b5484ae00c782b98f3cec41d9d7b6cf Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Fri, 31 Jul 2015 08:39:09 -0400
Subject: [PATCH 027/268] Add bounding box logic again

---
 src/draw.coffee |  1 -
 src/view.coffee | 26 +++++++++++++++++++-------
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/draw.coffee b/src/draw.coffee
index aec1083b..d4a536d6 100644
--- a/src/draw.coffee
+++ b/src/draw.coffee
@@ -263,7 +263,6 @@ exports.Draw = class Draw
           parent.appendChild @element
 
       destroy: ->
-        @deactivate()
         if @element.parentElement?
           @element.parentElement.removeChild @element
 
diff --git a/src/view.coffee b/src/view.coffee
index f8753d72..2639e543 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -101,7 +101,8 @@ exports.View = class View
     @map = {}
     @contextMaps = []
 
-    @lastIncludes = {}
+    @oldTree = {}
+    @newTree = {}
     @marks = {}
 
     @draw = new draw.Draw(@ctx)
@@ -1215,6 +1216,7 @@ exports.View = class View
         @path = new @view.draw.Path([], false, {
           cssClass: "droplet-#{@model.type}-path"
         })
+      @totalBounds = new @view.draw.NoRectangle()
 
       @path.setParent @group
 
@@ -1243,15 +1245,23 @@ exports.View = class View
     # ## draw (GenericViewNode)
     # Call `drawSelf` and recurse, if we are in the viewport.
     draw: (boundingRect, style = {}, parent = null) ->
-      @drawSelf style, parent
+      if not boundingRect? or @totalBounds.overlap boundingRect
+        @drawSelf style, parent
 
-      @group.activate(); @path.activate()
+        @group.activate(); @path.activate()
+        if @highlightArea?
+          @highlightArea.setParent @view.draw.ctx
 
-      if parent?
-        @group.setParent parent
+        if parent?
+          @group.setParent parent
 
-      for childObj in @children
-        @view.getViewNodeFor(childObj.child).draw boundingRect, style, @group
+        for childObj in @children
+          @view.getViewNodeFor(childObj.child).draw boundingRect, style, @group
+
+      else
+        @group.destroy()
+        if @highlightArea?
+          @highlightArea.destroy()
 
     computeCarriageArrow: (root = false) ->
       oldCarriageArrow = @carriageArrow
@@ -1682,6 +1692,7 @@ exports.View = class View
       @dropArea = null
       if @highlightArea?
         @elements = @elements.filter (x) -> x isnt @highlightArea
+        @highlightArea.destroy()
         @highlightArea = null
 
     # ## shouldAddTab
@@ -2084,6 +2095,7 @@ exports.View = class View
         new @view.draw.Point(0, 0),
         @model.value
       )
+      @textElement.destroy()
       @elements.push @textElement
 
     # ## computeChildren

From a0df533176b9f3a5bb72f5760dc1075e0930fecf Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Fri, 31 Jul 2015 15:43:30 -0400
Subject: [PATCH 028/268] New removal caching logic, hopefully for speed for
 large files

---
 src/controller.coffee |  22 +++++---
 src/model.coffee      |   2 +
 src/view.coffee       | 127 ++++++++++++++++++++++++++++++++----------
 3 files changed, 114 insertions(+), 37 deletions(-)

diff --git a/src/controller.coffee b/src/controller.coffee
index ea674f09..02fd4dc3 100644
--- a/src/controller.coffee
+++ b/src/controller.coffee
@@ -386,20 +386,24 @@ Editor::clearMain = (opts) ->
 Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') ->
   @nubbyHeight = Math.max(0, height); @nubbyColor = color
 
-  @topNubbyPath = new @draw.Path([], true)
+  @topNubbyPath ?= new @draw.Path([], true)
 
-  @topNubbyPath.push new @draw.Point @mainCanvas.clientWidth, -5
-  @topNubbyPath.push new @draw.Point @mainCanvas.clientWidth, height
+  points = []
 
-  @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height
-  @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth),
+  points.push new @draw.Point @mainCanvas.clientWidth, -5
+  points.push new @draw.Point @mainCanvas.clientWidth, height
+
+  points.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height
+  points.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth),
       @view.opts.tabHeight + height
-  @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * @view.opts.tabSideWidth,
+  points.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * @view.opts.tabSideWidth,
       @view.opts.tabHeight + height
-  @topNubbyPath.push new @draw.Point @view.opts.tabOffset, height
+  points.push new @draw.Point @view.opts.tabOffset, height
+
+  points.push new @draw.Point -5, height
+  points.push new @draw.Point -5, -5
 
-  @topNubbyPath.push new @draw.Point -5, height
-  @topNubbyPath.push new @draw.Point -5, -5
+  @topNubbyPath.setPoints points
 
   @topNubbyPath.style.fillColor = color
 
diff --git a/src/model.coffee b/src/model.coffee
index e8a81f74..7060a699 100644
--- a/src/model.coffee
+++ b/src/model.coffee
@@ -109,6 +109,8 @@ exports.List = class List
   constructor: (@start, @end) ->
     @id = ++_id
 
+  hasParent: (x) -> false
+
   contains: (token) ->
     if token instanceof Container
       token = token.start
diff --git a/src/view.coffee b/src/view.coffee
index 2639e543..5156c895 100644
--- a/src/view.coffee
+++ b/src/view.coffee
@@ -99,10 +99,14 @@ exports.View = class View
     # so that rerendering the same model
     # can be fast
     @map = {}
-    @contextMaps = []
 
-    @oldTree = {}
-    @newTree = {}
+    @oldRoots = {}
+    @newRoots = {}
+    @auxiliaryMap = {}
+
+    @flaggedToDelete = {}
+    @unflaggedToDelete = {}
+
     @marks = {}
 
     @draw = new draw.Draw(@ctx)
@@ -126,9 +130,6 @@ exports.View = class View
     else
       return @createView(model)
 
-  include: (id) ->
-    @lastIncludes[id] = true
-
   registerMark: (id) ->
     @marks[id] = true
 
@@ -138,24 +139,59 @@ exports.View = class View
     @marks = {}
 
   beginDraw: ->
-    @lastIncludes = {}
+    @oldRoots = @newRoots
+    @newRoots = {}
+    @unflaggedToDelete = {}
+
+  hasViewNodeFor: (model) ->
+    model? and model.id of @map
+
+  getAuxiliaryNode: (node) ->
+    if node.id of @auxiliaryMap
+      return @auxiliaryMap[node.id]
+    else
+      return @auxiliaryMap[node.id] = new AuxiliaryViewNode(@, node)
+
+  registerRoot: (model) ->
+    for id, aux of @newRoots
+      if aux.model.hasParent(model)
+        delete @newRoots[id]
+      else if model.hasParent(aux.model)
+        return
+
+    @newRoots[model.id] = @getAuxiliaryNode(model)
 
   cleanupDraw: ->
-    for key, val of @map
-      unless key of @lastIncludes
-        val.hide()
+    for id, el of @oldRoots
+      unless id of @newRoots
+        @flag el
+
+    for id, el of @newRoots
+      el.cleanup()
+
+    for id, el of @flaggedToDelete when id of @unflaggedToDelete
+      delete @flaggedToDelete[id]
+
+    for id, el of @flaggedToDelete when id of @map
+      @map[id].hide()
+
+  flag: (auxiliaryNode) ->
+    @flaggedToDelete[auxiliaryNode.model.id] = auxiliaryNode
+
+  unflag: (auxiliaryNode) ->
+    @unflaggedToDelete[auxiliaryNode.model.id] = auxiliaryNode
 
   garbageCollect: ->
-    destroyed = 0
-    for key, val of @map
-      unless key of @lastIncludes
-        destroyed += 1
-        val.destroy()
-        delete @map[key]
-    console.log 'destroyed', destroyed
+    @cleanupDraw()
 
-  hasViewNodeFor: (model) ->
-    model? and model.id of @map
+    for id, el of @flaggedToDelete when id of @map
+      console.log 'destroying', id
+      @map[id].destroy()
+      delete @map[id]
+      delete @auxiliaryMap[id]
+      delete @flaggedToDelete[id]
+
+  hasViewNodeFor: (model) -> model? and model.id of @map
 
   # ## createView
   # Given a model object, create a renderer object
@@ -178,6 +214,37 @@ exports.View = class View
     else
       @opts.colors[color] ? '#ffffff'
 
+  class AuxiliaryViewNode
+    constructor: (@view, @model) ->
+      @children = {}
+      @computedVersion = -1
+
+    cleanup: ->
+      @view.unflag @
+
+      if @model.version is @computedVersion
+        return
+
+      children = {}
+      if @model instanceof model.Container
+        @model.traverseOneLevel (head) =>
+          if head instanceof model.NewlineToken
+            return
+          else
+            children[head.id] = @view.getAuxiliaryNode head
+
+      for id, child of @children
+        unless id of children
+          @view.flag child
+
+      @children = children
+
+      for id, child of @children
+        child.cleanup()
+
+      @computedVersion = @model.version
+
+
   # # GenericViewNode
   # Class from which all renderer classes will
   # extend.
@@ -187,6 +254,8 @@ exports.View = class View
       # from model to renderer
       @view.map[@model.id] = this
 
+      @view.registerRoot @model
+
       @lastCoordinate = new @view.draw.Point 0, 0
 
       @invalidate = false
@@ -742,7 +811,6 @@ exports.View = class View
     # May require special effects, like graying-out
     # or blueing for lasso select.
     drawSelf: (style = {}) ->
-      @view.include @model.id
 
     forceClean: ->
       @clean @computedVersion
@@ -758,9 +826,15 @@ exports.View = class View
       for element in @elements
         element?.deactivate?()
 
-    destroy: ->
-      for element in @elements
-        element?.destroy?()
+    destroy: (root = true) ->
+      if root
+        for element in @elements
+          element?.destroy?()
+      else if @highlightArea?
+        @highlightArea.destroy()
+
+      for child in @children
+        @view.getViewNodeFor(child.child).destroy(false)
 
     # ## drawShadow (GenericViewNode)
     # Draw the shadow of our path
@@ -1081,6 +1155,8 @@ exports.View = class View
     # Takes two arguments, which can be changed
     # to translate the entire document from the upper-left corner.
     layout: (left = @lastCoordinate.x, top = @lastCoordinate.y) ->
+      @view.registerRoot @model
+
       @lastCoordinate = new @view.draw.Point left, top
 
       @computeChildren()
@@ -1726,8 +1802,6 @@ exports.View = class View
       @path.style.fillColor = oldFill
       @path.style.strokeColor = oldStroke
 
-      @view.include @model.id
-
       return null
 
   # # BlockViewNode
@@ -1996,7 +2070,6 @@ exports.View = class View
     #
     # Again, an Indent should draw nothing.
     drawSelf: ->
-      @view.include @model.id
 
     # ## computeOwnDropArea
     #
@@ -2147,8 +2220,6 @@ exports.View = class View
       if parent?
         @textElement.setParent parent
 
-      @view.include @model.id
-
 toRGB = (hex) ->
   # Convert to 6-char hex if not already there
   if hex.length is 4

From 88634f695ecef9bd59ca9e184fb5007fc85feba5 Mon Sep 17 00:00:00 2001
From: Anthony Bau 
Date: Fri, 31 Jul 2015 17:19:58 -0400
Subject: [PATCH 029/268] Fix floating block drag destroy

---
 css/droplet.css       | 19 ++++++++++----
 example/example.html  |  5 ++++
 src/controller.coffee | 11 +++++---
 src/draw.coffee       |  2 +-
 src/view.coffee       | 60 ++++++++++++++++++++++++++++++-------------
 5 files changed, 70 insertions(+), 27 deletions(-)

diff --git a/css/droplet.css b/css/droplet.css
index 07269b82..071355f2 100644
--- a/css/droplet.css
+++ b/css/droplet.css
@@ -323,15 +323,24 @@ text {
 }
 .droplet-socket-path {
   cursor: text;
-} /*
-.droplet-block-path:hover .droplet-background-path {
+}
+.droplet-main-canvas text {
+  fill: #000;
+}
+/*
+.droplet-block-path:hover ~ text {
+  fill: #000;
+}
+*/
+.droplet-block-path:hover .droplet-background-path {/*
   stroke: #FF0;
   stroke-width: 2px;
-  stroke-alignment: inner;
-}
+  stroke-alignment: inner;*/
+  /*filter: url(#saturate);*/
+}/*
 .droplet-block-path:hover .droplet-light-bevel-path, .droplet-block-path:hover .droplet-dark-bevel-path {
   fill: #FF0;
-} */
+}*/
 .droplet-palette-canvas .droplet-socket-path {
   cursor: -webkit-grab;
   cursor: -moz-grab;
diff --git a/example/example.html b/example/example.html
index fec90e1c..57937492 100644
--- a/example/example.html
+++ b/example/example.html
@@ -3,6 +3,11 @@
     Droplet Demo
     
     
+    
+      
+        
+      
+    
     
+  
+  
+    
+
+
+ Update +
+
+
+
+
+
+
+
+
+ Toggle +
+
+
+
+ + + + + + + + + + diff --git a/src/languages/python.coffee b/src/languages/python.coffee index 7f508b7b..fbeac278 100644 --- a/src/languages/python.coffee +++ b/src/languages/python.coffee @@ -14,15 +14,8 @@ PYTHON_KEYWORDS = ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', ' PYTHON_BUILTIN = ['type', 'object', 'hashCount', 'none', 'NotImplemented', 'pyCheckArgs', 'pyCheckType', 'checkSequence', 'checkIterable', 'checkCallable', 'checkNumber', 'checkComplex', 'checkInt', 'checkFloat', 'checkString', 'checkClass', 'checkBool', 'checkNone', 'checkFunction', 'func', 'range', 'asnum$', 'assk$', 'asnum$nofloat', 'round', 'len', 'min', 'max', 'any', 'all', 'sum', 'zip', 'abs', 'ord', 'chr', 'int2str_', 'hex', 'oct', 'bin', 'dir', 'repr', 'open', 'isinstance', 'hash', 'getattr', 'setattr', 'raw_input', 'input', 'jseval', 'jsmillis', 'superbi', 'eval_', 'map', 'reduce', 'filter', 'hasattr', 'pow', 'quit', 'issubclass', 'globals', 'divmod', 'format', 'bytearray', 'callable', 'delattr', 'execfile', 'frozenset', 'help', 'iter', 'locals', 'memoryview', 'next_', 'property', 'reload', 'reversed', 'unichr', 'vars', 'xrange', 'apply_', 'buffer', 'coerce', 'intern', 'BaseException', 'Exception', 'StandardError', 'AssertionError', 'AttributeError', 'ImportError', 'IndentationError', 'IndexError', 'KeyError', 'NameError', 'UnboundLocalError', 'OverflowError', 'ParseError', 'RuntimeError', 'SuspensionError', 'SystemExit', 'SyntaxError', 'TokenError', 'TypeError', 'ValueError', 'ZeroDivisionError', 'TimeLimitError', 'IOError', 'NotImplementedError', 'NegativePowerError', 'ExternalError', 'OperationError', 'SystemError', 'method', 'seqtype', 'list', 'interned', 'str', 'tuple', 'dict', 'numtype', 'biginteger', 'int_', 'bool', 'float_', 'nmber', 'lng', 'complex', 'slice', 'slice$start', 'slice$stop', 'slice$step', 'set', 'print', 'module', 'structseq_types', 'make_structseq', 'generator', 'makeGenerator', 'file', 'enumerate', '__import__', 'timSort', 'listSlice', 'sorted'] -# TODO: how do we add keywords without hardcoding? -PYTHON_RANDOM = ['seed', 'random', 'randint', 'randrange', 'uniform', 'triangular', 'gauss', 'normalvariate', 'lognormvariate', 'expovariate', 'choice', 'shuffle', 'sample'] - -PYTHON_MATH = ['pi', 'e', 'fabs', 'asin', 'acos', 'atan', 'atan2', 'sin', 'cos', 'tan', 'asinh', 'acosh', 'atanh', 'sinh', 'cosh', 'tanh', 'ceil', 'copysign', 'floor', 'sqrt', 'trunc', 'log', 'log10', 'isnan', 'exp', 'pow', 'radians', 'degrees', 'hypot', 'factorial'] - -ES_KEYWORDS = ['init', 'setTempo', 'finish', 'fitMedia', 'makeBeat', 'setEffect', 'selectRandomFile', 'insertMedia', 'analyze', 'analyzeForTime', 'analyzeTrack', 'analyzeTrackForTime', 'dur', 'importImage', 'importFile', 'insertMediaSection', 'makeBeatSlice', 'readInput', 'replaceListElement', 'replaceString', 'reverseList', 'reverseString', 'rhythmEffects', 'shuffleList', 'shuffleString'] - -PYTHON_KEYWORDS = PYTHON_KEYWORDS.concat(PYTHON_BUILTIN, PYTHON_RANDOM, PYTHON_MATH, ES_KEYWORDS) -PYTHON_KEYWORDS = PYTHON_KEYWORDS.filter((v, i) -> return PYTHON_KEYWORDS.indexOf(v) == i) # remove duplicates +PYTHON_KEYWORDS = PYTHON_KEYWORDS.concat(PYTHON_BUILTIN) +PYTHON_KEYWORDS = PYTHON_KEYWORDS.filter((v, i) -> return PYTHON_KEYWORDS.indexOf(v) == i) # remove possible duplicates # PARSER SECTION parse = (context, text) -> @@ -56,7 +49,7 @@ getFunctionName = (node) -> else if node.type is 'power' and node.children.some((n) -> n.type is 'trailer') siblingNode = node.children[0].children?[0] - if siblingNode?.type is 'T_KEYWORD' + if siblingNode?.type in ['T_KEYWORD', 'T_NAME'] return siblingNode.meta.value if node.parent? then getFunctionName(node.parent) @@ -78,11 +71,11 @@ getDropdown = (opts, node) -> funcName = getFunctionName(node) if argNum? and funcName? - return opts.functions[funcName]?.dropdown?[argNum] ? null + return opts.functions?[funcName]?.dropdown?[argNum] ? null getColor = (opts, node) -> if getArgNum(node) is null - return opts.functions[getFunctionName(node)]?.color ? null + return opts.functions?[getFunctionName(node)]?.color ? null transform = (node, lines, parent = null) -> type = skulpt.tables.ParseTables.number2symbol[node.type] ? skulpt.Tokenizer.tokenNames[node.type] ? node.type diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 3d30d36e..68071f29 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -43,9 +43,13 @@ exports.createTreewalkParser = (parse, config, root) -> else return 'block' detNode: (node) -> if node.blockified then 'block' else @det(node.type) + detToken: (node) -> if node.type? - if node.type in config.SOCKET_TOKENS then 'socket' else 'none' + if node.type in config.SOCKET_TOKENS + # user-defined function names (in modeOptions) are being excluded + if @opts.functions? and node.meta.value in Object.keys(@opts.functions) then 'none' else 'socket' + else 'none' else 'none' getDropType: (context) -> ({ @@ -165,7 +169,7 @@ exports.createTreewalkParser = (parse, config, root) -> for child in node.children @mark child, prefix, depth + 2, false else if context? and @detNode(context) is 'block' - if @detToken(node) is 'socket' + if @detToken(node) is 'socket' # TODO: it doesn't differentiate between function names and arguments @addSocket bounds: node.bounds depth: depth From 75d1b3e952481253e013a64dda4af8cacecf25e0 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 13 Jun 2016 13:02:58 -0400 Subject: [PATCH 100/268] Mark TODOs --- src/controller.coffee | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index c484c944..fdab93e5 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -101,14 +101,14 @@ exports.Editor = class Editor @options.mode = @options.mode.replace /$\/ace\/mode\//, '' if @options.mode of modes - @mode = new modes[@options.mode] @options.modeOptions + @mode = new modes[@options.mode] @options.modeOptions # TODO session else - @mode = new coffee @options.modeOptions + @mode = new coffee @options.modeOptions # TODO session @draw = new draw.Draw() # No gutter decorations to start - @gutterDecorations = {} + @gutterDecorations = {} # TODO session # ## DOM Population # This stage of ICE Editor construction populates the given wrapper @@ -191,12 +191,12 @@ exports.Editor = class Editor # Set up event bindings before creating a view @bindings = {} - # Instantiate an ICE editor view - @view = new view.View @standardViewSettings - @paletteView = new view.View helper.extend {}, @standardViewSettings, { + # Instantiate an Droplet editor view + @view = new view.View @standardViewSettings # TODO session + @paletteView = new view.View helper.extend {}, @standardViewSettings, { # TODO session showDropdowns: @options.showDropdownInPalette ? false } - @dragView = new view.View @standardViewSettings + @dragView = new view.View @standardViewSettings # TODO session boundListeners = [] @@ -258,7 +258,7 @@ exports.Editor = class Editor # ## Document initialization # We start of with an empty document - @tree = new model.Document() + @tree = new model.Document() # TODO session @resizeBlockMode() @@ -278,7 +278,7 @@ exports.Editor = class Editor modeClass = modes[mode] if modeClass @options.mode = mode - @mode = new modeClass modeOptions + @mode = new modeClass modeOptions # TODO session else @options.mode = null @mode = null @@ -334,8 +334,8 @@ exports.Editor = class Editor @resizeDragCanvas() # Re-scroll and redraw main - @scrollOffsets.main.y = @mainScroller.scrollTop - @scrollOffsets.main.x = @mainScroller.scrollLeft + @scrollOffsets.main.y = @mainScroller.scrollTop # TODO session + @scrollOffsets.main.x = @mainScroller.scrollLeft # TODO session @mainCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y @@ -753,9 +753,9 @@ Editor::removeBlankLines = -> # We must declare a few # fields a populate time hook 'populate', 0, -> - @undoStack = [] - @redoStack = [] - @changeEventVersion = 0 + @undoStack = [] # TODO session + @redoStack = [] # TODO session + @changeEventVersion = 0 # TODO session # Now we hook to ctrl-z to undo. hook 'keydown', 0, (event, state) -> From b96914785bde8a198c51e45fed7ae1fc689706b4 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 13 Jun 2016 14:00:01 -0400 Subject: [PATCH 101/268] Initial refactor for multiple sessions --- src/controller.coffee | 912 ++++++++++++++++++++--------------------- src/helper.coffee | 10 +- src/treewalk.coffee | 2 +- test/src/tests.coffee | 76 ++-- test/src/uitest.coffee | 34 +- 5 files changed, 512 insertions(+), 522 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index fdab93e5..09dd195c 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -88,9 +88,9 @@ hook = (event, priority, fn) -> fn: fn } -# ## The Editor Class -exports.Editor = class Editor - constructor: (@wrapperElement, @options) -> +class Session + constructor: (@editor, @options, standardViewSettings) -> + # Option flags @readOnly = false @paletteGroups = @options.palette @showPaletteInTextMode = @options.showPaletteInTextMode ? false @@ -98,18 +98,64 @@ exports.Editor = class Editor @dropIntoAceAtLineStart = @options.dropIntoAceAtLineStart ? false @allowFloatingBlocks = @options.allowFloatingBlocks ? true + # Mode @options.mode = @options.mode.replace /$\/ace\/mode\//, '' if @options.mode of modes - @mode = new modes[@options.mode] @options.modeOptions # TODO session + @mode = new modes[@options.mode] @options.modeOptions else - @mode = new coffee @options.modeOptions # TODO session + @mode = new coffee @options.modeOptions - @draw = new draw.Draw() + # Instantiate an Droplet editor view + @view = new view.View standardViewSettings + @paletteView = new view.View helper.extend {}, standardViewSettings, { + showDropdowns: @options.showDropdownInPalette ? false + } + @dragView = new view.View standardViewSettings + + # ## Document initialization + # We start of with an empty document + @tree = new model.Document() + + # Line markings + @markedLines = {} + @markedBlocks = {}; @nextMarkedBlockId = 0 + @extraMarks = {} + + # Undo/redo stack + @undoStack = [] + @redoStack = [] + @changeEventVersion = 0 + + # Floating blocks + @floatingBlocks = [] + + # Cursor + @cursor = new CrossDocumentLocation(0, new model.Location(0, 'documentStart')) + + # Scrolling + @scrollOffsets = { + main: new @editor.draw.Point 0, 0 + palette: new @editor.draw.Point 0, 0 + } + + # Block toggle + @currentlyUsingBlocks = true + + # Fonts + @fontSize = 15 + @fontFamily = 'Courier New' + + metrics = helper.fontMetrics(@fontFamily, @fontSize) + @fontAscent = metrics.prettytop + @fontDescent = metrics.descent - # No gutter decorations to start - @gutterDecorations = {} # TODO session + # Remembered sockets + @rememberedSockets = [] +# ## The Editor Class +exports.Editor = class Editor + constructor: (@wrapperElement, @options) -> # ## DOM Population # This stage of ICE Editor construction populates the given wrapper # element with all the necessary ICE editor components. @@ -168,6 +214,8 @@ exports.Editor = class Editor @wrapperElement.appendChild @paletteWrapper + @draw = new draw.Draw() + do @draw.refreshFontCapital @standardViewSettings = @@ -188,16 +236,11 @@ exports.Editor = class Editor ctx: @mainCtx draw: @draw + @session = new Session @, @options, @standardViewSettings + # Set up event bindings before creating a view @bindings = {} - # Instantiate an Droplet editor view - @view = new view.View @standardViewSettings # TODO session - @paletteView = new view.View helper.extend {}, @standardViewSettings, { # TODO session - showDropdowns: @options.showDropdownInPalette ? false - } - @dragView = new view.View @standardViewSettings # TODO session - boundListeners = [] # Call all the feature bindings that are supposed @@ -256,10 +299,6 @@ exports.Editor = class Editor else element.addEventListener eventName, dispatchMouseEvent - # ## Document initialization - # We start of with an empty document - @tree = new model.Document() # TODO session - @resizeBlockMode() # Now that we've populated everything, immediately redraw. @@ -268,7 +307,7 @@ exports.Editor = class Editor # If we were given an unrecognized mode or asked to start in text mode, # flip into text mode here - useBlockMode = @mode? && !@options.textModeAtStart + useBlockMode = @session.mode? && !@options.textModeAtStart # Always call @setEditorState to ensure palette is positioned properly @setEditorState useBlockMode @@ -278,21 +317,21 @@ exports.Editor = class Editor modeClass = modes[mode] if modeClass @options.mode = mode - @mode = new modeClass modeOptions # TODO session + @session.mode = new modeClass modeOptions else @options.mode = null - @mode = null + @session.mode = null @setValue @getValue() getMode: -> @options.mode setReadOnly: (readOnly) -> - @readOnly = readOnly + @session.readOnly = readOnly @aceEditor.setReadOnly readOnly getReadOnly: -> - @readOnly + @session.readOnly # ## Foundational Resize # At the editor core, we will need to resize @@ -307,7 +346,7 @@ exports.Editor = class Editor @resizeTextMode() @dropletElement.style.height = "#{@wrapperElement.clientHeight}px" - if @paletteEnabled + if @session.paletteEnabled @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px" @dropletElement.style.width = "#{@wrapperElement.clientWidth - @paletteWrapper.offsetWidth}px" else @@ -334,15 +373,15 @@ exports.Editor = class Editor @resizeDragCanvas() # Re-scroll and redraw main - @scrollOffsets.main.y = @mainScroller.scrollTop # TODO session - @scrollOffsets.main.x = @mainScroller.scrollLeft # TODO session + @session.scrollOffsets.main.y = @mainScroller.scrollTop + @session.scrollOffsets.main.x = @mainScroller.scrollLeft - @mainCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y + @mainCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.main.x, -@session.scrollOffsets.main.y # Also update scroll for the highlight ctx, so that # they can match the blocks' positions - @highlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y - @cursorCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y + @highlightCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.main.x, -@session.scrollOffsets.main.y + @cursorCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.main.x, -@session.scrollOffsets.main.y @redrawMain() @@ -357,13 +396,13 @@ exports.Editor = class Editor for binding in editorBindings.resize_palette binding.call this - @paletteCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y - @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y + @paletteCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y + @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y @rebuildPalette() resize: -> - if @currentlyUsingBlocks + if @session.currentlyUsingBlocks #TODO session @resizeBlockMode() else @resizeTextMode() @@ -383,7 +422,7 @@ Editor::clearMain = (opts) -> @mainCtx.clearRect opts.boundingRectangle.x, opts.boundingRectangle.y, opts.boundingRectangle.width, opts.boundingRectangle.height else - @mainCtx.clearRect @scrollOffsets.main.x, @scrollOffsets.main.y, @mainCanvas.width, @mainCanvas.height + @mainCtx.clearRect @session.scrollOffsets.main.x, @session.scrollOffsets.main.y, @mainCanvas.width, @mainCanvas.height Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> @nubbyHeight = Math.max(0, height); @nubbyColor = color @@ -395,12 +434,12 @@ Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> @topNubbyPath.push new @draw.Point @mainCanvas.width, -5 @topNubbyPath.push new @draw.Point @mainCanvas.width, height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth), - @view.opts.tabHeight + height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * @view.opts.tabSideWidth, - @view.opts.tabHeight + height - @topNubbyPath.push new @draw.Point @view.opts.tabOffset, height + @topNubbyPath.push new @draw.Point @session.view.opts.tabOffset + @session.view.opts.tabWidth, height + @topNubbyPath.push new @draw.Point @session.view.opts.tabOffset + @session.view.opts.tabWidth * (1 - @session.view.opts.tabSideWidth), + @session.view.opts.tabHeight + height + @topNubbyPath.push new @draw.Point @session.view.opts.tabOffset + @session.view.opts.tabWidth * @session.view.opts.tabSideWidth, + @session.view.opts.tabHeight + height + @topNubbyPath.push new @draw.Point @session.view.opts.tabOffset, height @topNubbyPath.push new @draw.Point -5, height @topNubbyPath.push new @draw.Point -5, -5 @@ -413,50 +452,50 @@ Editor::resizeNubby = -> @setTopNubbyStyle @nubbyHeight, @nubbyColor Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) -> - blockView = @view.getViewNodeFor record.block + blockView = @session.view.getViewNodeFor record.block blockView.layout record.position.x, record.position.y - rectangle = new @view.draw.Rectangle(); rectangle.copy(blockView.totalBounds) + rectangle = new @session.view.draw.Rectangle(); rectangle.copy(blockView.totalBounds) rectangle.x -= GRAY_BLOCK_MARGIN; rectangle.y -= GRAY_BLOCK_MARGIN rectangle.width += 2 * GRAY_BLOCK_MARGIN; rectangle.height += 2 * GRAY_BLOCK_MARGIN - bottomTextPosition = blockView.totalBounds.bottom() - blockView.distanceToBase[blockView.lineLength - 1].below - @fontSize + bottomTextPosition = blockView.totalBounds.bottom() - blockView.distanceToBase[blockView.lineLength - 1].below - @session.fontSize if (blockView.totalBounds.width - blockView.bounds[blockView.bounds.length - 1].width) < endWidth if blockView.lineLength > 1 - rectangle.height += @fontSize - bottomTextPosition = rectangle.bottom() - @fontSize - 5 + rectangle.height += @session.fontSize + bottomTextPosition = rectangle.bottom() - @session.fontSize - 5 else rectangle.width += endWidth unless rectangle.equals(record.grayBox) record.grayBox = rectangle - oldBounds = record.grayBoxPath?.bounds?() ? new @view.draw.NoRectangle() + oldBounds = record.grayBoxPath?.bounds?() ? new @session.view.draw.NoRectangle() startHeight = blockView.bounds[0].height + 10 # Make the path surrounding the gray box (with rounded corners) - record.grayBoxPath = path = new @view.draw.Path() - path.push new @view.draw.Point rectangle.right() - 5, rectangle.y - path.push new @view.draw.Point rectangle.right(), rectangle.y + 5 - path.push new @view.draw.Point rectangle.right(), rectangle.bottom() - 5 - path.push new @view.draw.Point rectangle.right() - 5, rectangle.bottom() + record.grayBoxPath = path = new @session.view.draw.Path() + path.push new @session.view.draw.Point rectangle.right() - 5, rectangle.y + path.push new @session.view.draw.Point rectangle.right(), rectangle.y + 5 + path.push new @session.view.draw.Point rectangle.right(), rectangle.bottom() - 5 + path.push new @session.view.draw.Point rectangle.right() - 5, rectangle.bottom() if blockView.lineLength > 1 - path.push new @view.draw.Point rectangle.x + 5, rectangle.bottom() - path.push new @view.draw.Point rectangle.x, rectangle.bottom() - 5 + path.push new @session.view.draw.Point rectangle.x + 5, rectangle.bottom() + path.push new @session.view.draw.Point rectangle.x, rectangle.bottom() - 5 else - path.push new @view.draw.Point rectangle.x, rectangle.bottom() + path.push new @session.view.draw.Point rectangle.x, rectangle.bottom() # Handle - path.push new @view.draw.Point rectangle.x, rectangle.y + startHeight - path.push new @view.draw.Point rectangle.x - startWidth + 5, rectangle.y + startHeight - path.push new @view.draw.Point rectangle.x - startWidth, rectangle.y + startHeight - 5 - path.push new @view.draw.Point rectangle.x - startWidth, rectangle.y + 5 - path.push new @view.draw.Point rectangle.x - startWidth + 5, rectangle.y + path.push new @session.view.draw.Point rectangle.x, rectangle.y + startHeight + path.push new @session.view.draw.Point rectangle.x - startWidth + 5, rectangle.y + startHeight + path.push new @session.view.draw.Point rectangle.x - startWidth, rectangle.y + startHeight - 5 + path.push new @session.view.draw.Point rectangle.x - startWidth, rectangle.y + 5 + path.push new @session.view.draw.Point rectangle.x - startWidth + 5, rectangle.y - path.push new @view.draw.Point rectangle.x, rectangle.y + path.push new @session.view.draw.Point rectangle.x, rectangle.y path.bevel = false @@ -474,13 +513,13 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) -> @mainCtx.restore() return @redrawMain opts - # TODO this will need to become configurable by the @mode + # TODO this will need to become configurable by the @session.mode @mainCtx.globalAlpha *= 0.8 record.grayBoxPath.draw @mainCtx @mainCtx.fillStyle = '#000' - @mainCtx.fillText(@mode.startComment, blockView.totalBounds.x - startWidth, - blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize) - @mainCtx.fillText(@mode.endComment, record.grayBox.right() - endWidth - 5, bottomTextPosition) + @mainCtx.fillText(@session.mode.startComment, blockView.totalBounds.x - startWidth, + blockView.totalBounds.y + blockView.distanceToBase[0].above - @session.fontSize) + @mainCtx.fillText(@session.mode.endComment, record.grayBox.right() - endWidth - 5, bottomTextPosition) @mainCtx.globalAlpha /= 0.8 blockView.draw @mainCtx, rect, { @@ -494,7 +533,7 @@ Editor::redrawMain = (opts = {}) -> # Set our draw tool's font size # to the font size we want - @draw.setGlobalFontSize @fontSize + @draw.setGlobalFontSize @session.fontSize # Supply our main canvas for measuring @draw.setCtx @mainCtx @@ -509,8 +548,8 @@ Editor::redrawMain = (opts = {}) -> opts.boundingRectangle.clip @mainCtx rect = opts.boundingRectangle ? new @draw.Rectangle( - @scrollOffsets.main.x, - @scrollOffsets.main.y, + @session.scrollOffsets.main.x, + @session.scrollOffsets.main.y, @mainCanvas.width, @mainCanvas.height ) @@ -521,13 +560,13 @@ Editor::redrawMain = (opts = {}) -> } # Draw the new tree on the main context - layoutResult = @view.getViewNodeFor(@tree).layout 0, @nubbyHeight - @view.getViewNodeFor(@tree).draw @mainCtx, rect, options + layoutResult = @session.view.getViewNodeFor(@session.tree).layout 0, @nubbyHeight + @session.view.getViewNodeFor(@session.tree).draw @mainCtx, rect, options # Draw floating blocks - startWidth = @mainCtx.measureText(@mode.startComment).width - endWidth = @mainCtx.measureText(@mode.endComment).width - for record in @floatingBlocks + startWidth = @mainCtx.measureText(@session.mode.startComment).width + endWidth = @mainCtx.measureText(@session.mode.endComment).width + for record in @session.floatingBlocks @drawFloatingBlock(record, startWidth, endWidth, rect, opts) if opts.boundingRectangle? @@ -540,8 +579,8 @@ Editor::redrawMain = (opts = {}) -> for binding in editorBindings.redraw_main binding.call this, layoutResult - if @changeEventVersion isnt @tree.version - @changeEventVersion = @tree.version + if @session.changeEventVersion isnt @session.tree.version + @session.changeEventVersion = @session.tree.version # Update the ace editor value to match, # but don't trigger a resize event. @@ -559,33 +598,33 @@ Editor::redrawHighlights = -> # Draw highlights around marked lines @clearHighlightCanvas() - for line, info of @markedLines + for line, info of @session.markedLines if @inDisplay info.model path = @getHighlightPath info.model, info.style path.draw @highlightCtx else - delete @markedLines[line] + delete @session.markedLines[line] - for id, info of @markedBlocks + for id, info of @session.markedBlocks if @inDisplay info.model path = @getHighlightPath info.model, info.style path.draw @highlightCtx else - delete @markedLines[id] + delete @session.markedLines[id] - for id, info of @extraMarks + for id, info of @session.extraMarks if @inDisplay info.model path = @getHighlightPath info.model, info.style path.draw @highlightCtx else - delete @extraMarks[id] + delete @session.extraMarks[id] # If there is an block that is being dragged, # draw it in gray if @draggingBlock? and @inDisplay @draggingBlock - @view.getViewNodeFor(@draggingBlock).draw @highlightCtx, new @draw.Rectangle( - @scrollOffsets.main.x, - @scrollOffsets.main.y, + @session.view.getViewNodeFor(@draggingBlock).draw @highlightCtx, new @draw.Rectangle( + @session.scrollOffsets.main.x, + @session.scrollOffsets.main.y, @mainCanvas.width, @mainCanvas.height ), {grayscale: true} @@ -594,7 +633,7 @@ Editor::redrawHighlights = -> @redrawLassoHighlight() Editor::clearCursorCanvas = -> - @cursorCtx.clearRect @scrollOffsets.main.x, @scrollOffsets.main.y, @cursorCanvas.width, @cursorCanvas.height + @cursorCtx.clearRect @session.scrollOffsets.main.x, @session.scrollOffsets.main.y, @cursorCanvas.width, @cursorCanvas.height Editor::redrawCursors = -> @clearCursorCanvas() @@ -608,11 +647,11 @@ Editor::redrawCursors = -> Editor::drawCursor = -> @strokeCursor @determineCursorPosition() Editor::clearPalette = -> - @paletteCtx.clearRect @scrollOffsets.palette.x, @scrollOffsets.palette.y, + @paletteCtx.clearRect @session.scrollOffsets.palette.x, @session.scrollOffsets.palette.y, @paletteCanvas.width, @paletteCanvas.height Editor::clearPaletteHighlightCanvas = -> - @paletteHighlightCtx.clearRect @scrollOffsets.palette.x, @scrollOffsets.palette.y, + @paletteHighlightCtx.clearRect @session.scrollOffsets.palette.x, @session.scrollOffsets.palette.y, @paletteHighlightCanvas.width, @paletteHighlightCanvas.height Editor::redrawPalette = -> @@ -625,15 +664,15 @@ Editor::redrawPalette = -> lastBottomEdge = PALETTE_TOP_MARGIN boundingRect = new @draw.Rectangle( - @scrollOffsets.palette.x, - @scrollOffsets.palette.y, + @session.scrollOffsets.palette.x, + @session.scrollOffsets.palette.y, @paletteCanvas.width, @paletteCanvas.height ) for entry in @currentPaletteBlocks # Layout this block - paletteBlockView = @paletteView.getViewNodeFor entry.block + paletteBlockView = @session.paletteView.getViewNodeFor entry.block paletteBlockView.layout PALETTE_LEFT_MARGIN, lastBottomEdge # Render the block @@ -676,18 +715,18 @@ Editor::trackerPointToMain = (point) -> if not @mainCanvas.offsetParent? return new @draw.Point(NaN, NaN) gbr = @mainCanvas.getBoundingClientRect() - new @draw.Point(point.x - gbr.left + @scrollOffsets.main.x, - point.y - gbr.top + @scrollOffsets.main.y) + new @draw.Point(point.x - gbr.left + @session.scrollOffsets.main.x, + point.y - gbr.top + @session.scrollOffsets.main.y) Editor::trackerPointToPalette = (point) -> if not @paletteCanvas.offsetParent? return new @draw.Point(NaN, NaN) gbr = @paletteCanvas.getBoundingClientRect() - new @draw.Point(point.x - gbr.left + @scrollOffsets.palette.x, - point.y - gbr.top + @scrollOffsets.palette.y) + new @draw.Point(point.x - gbr.left + @session.scrollOffsets.palette.x, + point.y - gbr.top + @session.scrollOffsets.palette.y) Editor::trackerPointIsInElement = (point, element) -> - if @readOnly + if @session.readOnly return false if not element.offsetParent? return false @@ -714,8 +753,8 @@ Editor::trackerPointIsInAce = (point) -> # ### hitTest # Simple function for going through a linked-list block # and seeing what the innermost child is that we hit. -Editor::hitTest = (point, block, view = @view) -> - if @readOnly +Editor::hitTest = (point, block, view = @session.view) -> + if @session.readOnly return null head = block.start @@ -740,7 +779,7 @@ hook 'mousedown', 10, -> Editor::removeBlankLines = -> # If we have blank lines at the end, # get rid of them - head = tail = @tree.end.prev + head = tail = @session.tree.end.prev while head?.type is 'newline' head = head.prev @@ -752,10 +791,6 @@ Editor::removeBlankLines = -> # We must declare a few # fields a populate time -hook 'populate', 0, -> - @undoStack = [] # TODO session - @redoStack = [] # TODO session - @changeEventVersion = 0 # TODO session # Now we hook to ctrl-z to undo. hook 'keydown', 0, (event, state) -> @@ -780,24 +815,24 @@ class EditorState } Editor::getSerializedEditorState = -> - return new EditorState @tree.stringify(), @floatingBlocks.map (x) -> { + return new EditorState @session.tree.stringify(), @session.floatingBlocks.map (x) -> { position: x.position string: x.block.stringify() } Editor::clearUndoStack = -> - @undoStack.length = 0 - @redoStack.length = 0 + @session.undoStack.length = 0 + @session.redoStack.length = 0 Editor::undo = -> # Don't allow a socket to be highlighted during # an undo operation - @setCursor @cursor, ((x) -> x.type isnt 'socketStart') + @setCursor @session.cursor, ((x) -> x.type isnt 'socketStart') currentValue = @getSerializedEditorState() - until @undoStack.length is 0 or - (@undoStack[@undoStack.length - 1] instanceof CapturePoint and + until @session.undoStack.length is 0 or + (@session.undoStack[@session.undoStack.length - 1] instanceof CapturePoint and not @getSerializedEditorState().equals(currentValue)) operation = @popUndo() if operation instanceof FloatingOperation @@ -809,8 +844,8 @@ Editor::undo = -> # Set the the remembered socket contents to the state it was in # at this point in the undo stack. - if @undoStack[@undoStack.length - 1] instanceof CapturePoint - @rememberedSockets = @undoStack[@undoStack.length - 1].rememberedSockets.map (x) -> x.clone() + if @session.undoStack[@session.undoStack.length - 1] instanceof CapturePoint + @session.rememberedSockets = @session.undoStack[@session.undoStack.length - 1].rememberedSockets.map (x) -> x.clone() @popUndo() @correctCursor() @@ -818,24 +853,24 @@ Editor::undo = -> return Editor::pushUndo = (operation) -> - @redoStack.length = 0 - @undoStack.push operation + @session.redoStack.length = 0 + @session.undoStack.push operation Editor::popUndo = -> - operation = @undoStack.pop() - @redoStack.push(operation) if operation? + operation = @session.undoStack.pop() + @session.redoStack.push(operation) if operation? return operation Editor::popRedo = -> - operation = @redoStack.pop() - @undoStack.push(operation) if operation? + operation = @session.redoStack.pop() + @session.undoStack.push(operation) if operation? return operation Editor::redo = -> currentValue = @getSerializedEditorState() - until @redoStack.length is 0 or - (@redoStack[@redoStack.length - 1] instanceof CapturePoint and + until @session.redoStack.length is 0 or + (@session.redoStack[@session.redoStack.length - 1] instanceof CapturePoint and not @getSerializedEditorState().equals(currentValue)) operation = @popRedo() if operation instanceof FloatingOperation @@ -847,8 +882,8 @@ Editor::redo = -> # Set the the remembered socket contents to the state it was in # at this point in the undo stack. - if @undoStack[@undoStack.length - 1] instanceof CapturePoint - @rememberedSockets = @undoStack[@undoStack.length - 1].rememberedSockets.map (x) -> x.clone() + if @session.undoStack[@session.undoStack.length - 1] instanceof CapturePoint + @session.rememberedSockets = @session.undoStack[@session.undoStack.length - 1].rememberedSockets.map (x) -> x.clone() @popRedo() @redrawMain() @@ -860,7 +895,7 @@ Editor::redo = -> # also remembers the @rememberedSocket state at the time it was placed, # to preserved remembered socket contents across undo and redo. Editor::undoCapture = -> - @pushUndo new CapturePoint(@rememberedSockets) + @pushUndo new CapturePoint(@session.rememberedSockets) class CapturePoint constructor: (rememberedSockets) -> @@ -869,26 +904,13 @@ class CapturePoint # BASIC BLOCK MOVE SUPPORT # ================================ -hook 'populate', 7, -> - # ## rememberedSockets ## - # This is an array with pair elements mapping locations of sockets - # to old text values, for when users drop a block into a socket and then pull - # it back out again. All the mutation operations (spliceIn, spliceOut, replace) - # update these locations to attempt to make sure the locations point to the same sockets, - # and the Controller will also attempt to bring the locations with a dragged block - # if they are inside it. - # - # A snapshot of this array is taken every CapturePoint in the undo stack and restored - # when the undo stack reaches this point, to persist this effect across undo and redo. - @rememberedSockets = [] - Editor::getPreserves = (dropletDocument) -> if dropletDocument instanceof model.Document dropletDocument = @documentIndex dropletDocument - array = [@cursor] + array = [@session.cursor] - array = array.concat @rememberedSockets.map( + array = array.concat @session.rememberedSockets.map( (x) -> x.socket ) @@ -916,28 +938,28 @@ Editor::spliceOut = (node, container = null) -> # dictionary of remembered socket contents, repopulate the socket with # its old contents. if parent?.type is 'socket' and node.start.type is 'blockStart' - for socket, i in @rememberedSockets + for socket, i in @session.rememberedSockets if @fromCrossDocumentLocation(socket.socket) is parent - @rememberedSockets.splice i, 0 + @session.rememberedSockets.splice i, 0 @populateSocket parent, socket.text break # Remove the floating dropletDocument if it is now # empty if dropletDocument.start.next is dropletDocument.end - for record, i in @floatingBlocks + for record, i in @session.floatingBlocks if record.block is dropletDocument @pushUndo new FloatingOperation i, record.block, record.position, 'delete' # If the cursor's document is about to vanish, # put it back in the main tree. - if @cursor.document is i + 1 - @setCursor @tree.start + if @session.cursor.document is i + 1 + @setCursor @session.tree.start - if @cursor.document > i + 1 - @cursor.document -= 1 + if @session.cursor.document > i + 1 + @session.cursor.document -= 1 - @floatingBlocks.splice i, 1 + @session.floatingBlocks.splice i, 1 break else if container? # No document, so try to remove from container if it was supplied @@ -958,9 +980,9 @@ Editor::spliceIn = (node, location) -> if @documentIndex(container) != -1 # If we're splicing into a socket found in a document and it already has # something in it, remove it. Additionally, remember the old - # contents in @rememberedSockets for later repopulation if they take + # contents in @session.rememberedSockets for later repopulation if they take # the block back out. - @rememberedSockets.push new RememberedSocketRecord( + @session.rememberedSockets.push new RememberedSocketRecord( @toCrossDocumentLocation(container), container.textContent() ) @@ -1008,14 +1030,14 @@ Editor::adjustPosToLineStart = (pos) -> pos Editor::correctCursor = -> - cursor = @fromCrossDocumentLocation @cursor + cursor = @fromCrossDocumentLocation @session.cursor unless @validCursorPosition cursor until not cursor? or (@validCursorPosition(cursor) and cursor.type isnt 'socketStart') cursor = cursor.next - unless cursor? then cursor = @fromCrossDocumentLocation @cursor + unless cursor? then cursor = @fromCrossDocumentLocation @session.cursor until not cursor? or (@validCursorPosition(cursor) and cursor.type isnt 'socketStart') cursor = cursor.prev - @cursor = @toCrossDocumentLocation cursor + @session.cursor = @toCrossDocumentLocation cursor Editor::prepareNode = (node, context) -> if node instanceof model.Container @@ -1025,7 +1047,7 @@ Editor::prepareNode = (node, context) -> else trailing = node.getTrailingText() - [leading, trailing] = @mode.parens leading, trailing, node.getReader(), + [leading, trailing] = @session.mode.parens leading, trailing, node.getReader(), context?.getReader?() ? null node.setLeadingText leading; node.setTrailingText trailing @@ -1067,7 +1089,7 @@ hook 'populate', 0, -> @dropletElement.appendChild @highlightCanvas Editor::clearHighlightCanvas = -> - @highlightCtx.clearRect @scrollOffsets.main.x, @scrollOffsets.main.y, @highlightCanvas.width, @highlightCanvas.height + @highlightCtx.clearRect @session.scrollOffsets.main.x, @session.scrollOffsets.main.y, @highlightCanvas.width, @highlightCanvas.height # Utility function for clearing the drag canvas, # an operation we will be doing a lot. @@ -1089,14 +1111,14 @@ Editor::resizeDragCanvas = -> Editor::getDocuments = -> - documents = [@tree] - for el, i in @floatingBlocks + documents = [@session.tree] + for el, i in @session.floatingBlocks documents.push el.block return documents Editor::getDocument = (n) -> - if n is 0 then @tree - else @floatingBlocks[n - 1].block + if n is 0 then @session.tree + else @session.floatingBlocks[n - 1].block Editor::documentIndex = (block) -> @getDocuments().indexOf block.getDocument() @@ -1128,15 +1150,15 @@ hook 'mousedown', 1, (point, event, state) -> if @handleTextInputClick mainPoint, dropletDocument state.consumedHitTest = true return - else if @cursor.document is i and @cursorAtSocket() - @setCursor @cursor, ((token) -> token.type isnt 'socketStart') + else if @session.cursor.document is i and @cursorAtSocket() + @setCursor @session.cursor, ((token) -> token.type isnt 'socketStart') hitTestResult = @hitTest mainPoint, dropletDocument # Produce debugging output if @debugging and event.shiftKey line = null - node = @view.getViewNodeFor(hitTestResult) + node = @session.view.getViewNodeFor(hitTestResult) for box, i in node.bounds if box.contains(mainPoint) line = i @@ -1163,12 +1185,12 @@ hook 'mousedown', 1, (point, event, state) -> return else if i > 0 - record = @floatingBlocks[i - 1] + record = @session.floatingBlocks[i - 1] if record.grayBoxPath? and record.grayBoxPath.contains @trackerPointToMain point @clickedBlock = new model.List record.block.start.next, record.block.end.prev @clickedPoint = point - @view.getViewNodeFor(@clickedBlock).absorbCache() + @session.view.getViewNodeFor(@clickedBlock).absorbCache() state.consumedHitTest = true @@ -1188,20 +1210,20 @@ hook 'mousedown', 4, (point, event, state) -> #Buttons aren't clickable in a selection if @lassoSelection? and @hitTest(mainPoint, @lassoSelection)? then return - hitTestResult = @hitTest mainPoint, @tree + hitTestResult = @hitTest mainPoint, @session.tree if hitTestResult? - hitTestBlock = @view.getViewNodeFor hitTestResult + hitTestBlock = @session.view.getViewNodeFor hitTestResult str = hitTestResult.stringifyInPlace() if hitTestBlock.addButtonRect? and hitTestBlock.addButtonRect.contains mainPoint - line = @mode.handleButton str, 'add-button', hitTestResult.getReader() + line = @session.mode.handleButton str, 'add-button', hitTestResult.getReader() if line?.length >= 0 @populateBlock hitTestResult, line @redrawMain() state.consumedHitTest = true else if hitTestBlock.subtractButtonRect? and hitTestBlock.subtractButtonRect.contains mainPoint - line = @mode.handleButton str, 'subtract-button', hitTestResult.getReader() + line = @session.mode.handleButton str, 'subtract-button', hitTestResult.getReader() if line?.length >= 0 @populateBlock hitTestResult, line @redrawMain() @@ -1225,8 +1247,8 @@ Editor::drawDraggingBlock = -> # When we are dragging things, we draw the shadow. # Also, we translate the block 1x1 to the right, # so that we can see its borders. - @dragView.clearCache() - draggingBlockView = @dragView.getViewNodeFor @draggingBlock + @session.dragView.clearCache() + draggingBlockView = @session.dragView.getViewNodeFor @draggingBlock draggingBlockView.layout 1, 1 @dragCanvas.width = Math.min draggingBlockView.totalBounds.width + 10, window.screen.width @@ -1241,10 +1263,10 @@ Editor::wouldDelete = (position) -> palettePoint = @trackerPointToPalette position return not @lastHighlight and not - (@mainCanvas.width + @scrollOffsets.main.x > mainPoint.x > @scrollOffsets.main.x and - @mainCanvas.height + @scrollOffsets.main.y > mainPoint.y > @scrollOffsets.main.y) or - (@paletteCanvas.width + @scrollOffsets.palette.x > palettePoint.x > @scrollOffsets.palette.x and - @paletteCanvas.height + @scrollOffsets.palette.y > palettePoint.y > @scrollOffsets.palette.y) + (@mainCanvas.width + @session.scrollOffsets.main.x > mainPoint.x > @session.scrollOffsets.main.x and + @mainCanvas.height + @session.scrollOffsets.main.y > mainPoint.y > @session.scrollOffsets.main.y) or + (@paletteCanvas.width + @session.scrollOffsets.palette.x > palettePoint.x > @session.scrollOffsets.palette.x and + @paletteCanvas.height + @session.scrollOffsets.palette.y > palettePoint.y > @session.scrollOffsets.palette.y) # On mousemove, if there is a clicked block but no drag block, # we might want to transition to a dragging the block if the user @@ -1262,7 +1284,7 @@ hook 'mousemove', 1, (point, event, state) -> # NOTE: this really falls under "PALETTE SUPPORT", but must # go here. Try to organise this better. if @clickedBlockPaletteEntry - @draggingOffset = @paletteView.getViewNodeFor(@draggingBlock).bounds[0].upperLeftCorner().from( + @draggingOffset = @session.paletteView.getViewNodeFor(@draggingBlock).bounds[0].upperLeftCorner().from( @trackerPointToPalette(@clickedPoint)) # Substitute in expansion for this palette entry, if supplied. @@ -1270,7 +1292,7 @@ hook 'mousemove', 1, (point, event, state) -> # Call expansion() function with no parameter to get the initial value. if 'function' is typeof expansion then expansion = expansion() - if (expansion) then expansion = parseBlock(@mode, expansion) + if (expansion) then expansion = parseBlock(@session.mode, expansion) @draggingBlock = (expansion or @draggingBlock).clone() # Special @draggingBlock setup for expansion function blocks. @@ -1292,7 +1314,7 @@ hook 'mousemove', 1, (point, event, state) -> # To do this, we will assume that the left edge of a free # block are all aligned. mainPoint = @trackerPointToMain @clickedPoint - viewNode = @view.getViewNodeFor @draggingBlock + viewNode = @session.view.getViewNodeFor @draggingBlock @draggingOffset = null @@ -1319,8 +1341,8 @@ hook 'mousemove', 1, (point, event, state) -> # Construct a quadtree of drop areas # for faster dragging @dropPointQuadTree = QUAD.init - x: @scrollOffsets.main.x - y: @scrollOffsets.main.y + x: @session.scrollOffsets.main.x + y: @session.scrollOffsets.main.y w: @mainCanvas.width h: @mainCanvas.height @@ -1340,11 +1362,11 @@ hook 'mousemove', 1, (point, event, state) -> if head instanceof model.StartToken acceptLevel = @getAcceptLevel @draggingBlock, head.container unless acceptLevel is helper.FORBID - dropPoint = @view.getViewNodeFor(head.container).dropPoint + dropPoint = @session.view.getViewNodeFor(head.container).dropPoint if dropPoint? allowed = true - for record, i in @floatingBlocks by -1 + for record, i in @session.floatingBlocks by -1 if record.block is dropletDocument break else if record.grayBoxPath.contains dropPoint @@ -1393,13 +1415,13 @@ Editor::getClosestDroppableBlock = (mainPoint, isDebugMode) -> # Select the node that is closest by said "distance" if distance < min and mainPoint.from(point).magnitude() < MAX_DROP_DISTANCE and - @view.getViewNodeFor(point._droplet_node).highlightArea? + @session.view.getViewNodeFor(point._droplet_node).highlightArea? best = point._droplet_node min = distance best Editor::getClosestDroppableBlockFromPosition = (position, isDebugMode) -> - if not @currentlyUsingBlocks + if not @session.currentlyUsingBlocks return null mainPoint = @trackerPointToMain(position) @@ -1410,16 +1432,16 @@ Editor::getAcceptLevel = (drag, drop) -> if drag.type is 'list' return helper.FORBID else - return @mode.drop drag.getReader(), drop.getReader(), null, null + return @session.mode.drop drag.getReader(), drop.getReader(), null, null else if drop.type is 'block' if drop.parent.type is 'socket' return helper.FORBID else next = drop.nextSibling() - return @mode.drop drag.getReader(), drop.parent.getReader(), drop.getReader(), next?.getReader?() + return @session.mode.drop drag.getReader(), drop.parent.getReader(), drop.getReader(), next?.getReader?() else next = drop.firstChild() - return @mode.drop drag.getReader(), drop.getReader(), drop.getReader(), next?.getReader?() + return @session.mode.drop drag.getReader(), drop.getReader(), drop.getReader(), next?.getReader?() # On mousemove, if there is a dragged block, we want to # translate the drag canvas into place, @@ -1439,7 +1461,7 @@ hook 'mousemove', 0, (point, event, state) -> # Create replacement @draggingBlock if the returned text is new. if expansionText isnt @draggingBlock.lastExpansionText - newBlock = parseBlock(@mode, expansionText) + newBlock = parseBlock(@session.mode, expansionText) newBlock.lastExpansionText = expansionText newBlock.expansion = @draggingBlock.expansion if 'any-drop' in @draggingBlock.classes @@ -1447,11 +1469,11 @@ hook 'mousemove', 0, (point, event, state) -> @draggingBlock = newBlock @drawDraggingBlock() - if not @currentlyUsingBlocks + if not @session.currentlyUsingBlocks if @trackerPointIsInAce position pos = @aceEditor.renderer.screenToTextCoordinates position.x, position.y - if @dropIntoAceAtLineStart + if @session.dropIntoAceAtLineStart pos = @adjustPosToLineStart pos @aceEditor.focus() @@ -1468,15 +1490,15 @@ hook 'mousemove', 0, (point, event, state) -> # Check to see if the tree is empty; # if it is, drop on the tree always - head = @tree.start.next + head = @session.tree.start.next while head.type in ['newline', 'cursor'] or head.type is 'text' and head.value is '' head = head.next - if head is @tree.end and @floatingBlocks.length is 0 and - @mainCanvas.width + @scrollOffsets.main.x > mainPoint.x > @scrollOffsets.main.x - @gutter.offsetWidth and - @mainCanvas.height + @scrollOffsets.main.y > mainPoint.y > @scrollOffsets.main.y - @view.getViewNodeFor(@tree).highlightArea.draw @highlightCtx - @lastHighlight = @tree + if head is @session.tree.end and @session.floatingBlocks.length is 0 and + @mainCanvas.width + @session.scrollOffsets.main.x > mainPoint.x > @session.scrollOffsets.main.x - @gutter.offsetWidth and + @mainCanvas.height + @session.scrollOffsets.main.y > mainPoint.y > @session.scrollOffsets.main.y + @session.view.getViewNodeFor(@session.tree).highlightArea.draw @highlightCtx + @lastHighlight = @session.tree else # If the user is touching the original location, @@ -1497,7 +1519,7 @@ hook 'mousemove', 0, (point, event, state) -> @redrawHighlights() if dropBlock? - @view.getViewNodeFor(dropBlock).highlightArea.draw @highlightCtx + @session.view.getViewNodeFor(dropBlock).highlightArea.draw @highlightCtx @maskFloatingPaths(dropBlock.getDocument()) @lastHighlight = dropBlock @@ -1523,7 +1545,7 @@ hook 'mouseup', 1, (point, event, state) -> # We will consume this event iff we dropped it successfully # in the root tree. if @draggingBlock? - if not @currentlyUsingBlocks + if not @session.currentlyUsingBlocks # See if we can drop the block's text in ace mode. position = new @draw.Point( point.x + @draggingOffset.x, @@ -1541,7 +1563,7 @@ hook 'mouseup', 1, (point, event, state) -> prefix = '' suffix = '' - if @dropIntoAceAtLineStart + if @session.dropIntoAceAtLineStart # First, adjust indentation if we're dropping into the start of a # line that ends an indentation block firstNonWhitespaceRegex = /\S/ @@ -1573,7 +1595,7 @@ hook 'mouseup', 1, (point, event, state) -> # Call prepareNode, which may append with a semicolon @prepareNode @draggingBlock, null - text = @draggingBlock.stringify @mode + text = @draggingBlock.stringify @session.mode # Indent each line, unless it's the first line and wasn't placed on # a newline @@ -1643,7 +1665,7 @@ hook 'mouseup', 1, (point, event, state) -> newIndex = futureCursorLocation.document for el, i in rememberedSocketOffsets - @rememberedSockets.push new RememberedSocketRecord( + @session.rememberedSockets.push new RememberedSocketRecord( new CrossDocumentLocation( newIndex new model.Location(el.offset + newBeginning, 'socket') @@ -1659,7 +1681,7 @@ Editor::spliceRememberedSocketOffsets = (block) -> blockBegin = block.start.getLocation().count offsets = [] newRememberedSockets = [] - for el, i in @rememberedSockets + for el, i in @session.rememberedSockets if block.contains @fromCrossDocumentLocation(el.socket) offsets.push { offset: el.socket.location.count - blockBegin @@ -1667,7 +1689,7 @@ Editor::spliceRememberedSocketOffsets = (block) -> } else newRememberedSockets.push el - @rememberedSockets = newRememberedSockets + @session.rememberedSockets = newRememberedSockets return offsets else [] @@ -1675,15 +1697,10 @@ Editor::spliceRememberedSocketOffsets = (block) -> # FLOATING BLOCK SUPPORT # ================================ -# We need to initialize the @floatingBlocks -# array at populate-time. -hook 'populate', 0, -> - @floatingBlocks = [] - class FloatingBlockRecord constructor: (@block, @position) -> -Editor::inTree = (block) -> (block.container ? block).getDocument() is @tree +Editor::inTree = (block) -> (block.container ? block).getDocument() is @session.tree Editor::inDisplay = (block) -> (block.container ? block).getDocument() in @getDocuments() # We can create floating blocks by dropping @@ -1705,20 +1722,20 @@ hook 'mouseup', 0, (point, event, state) -> # If we dropped it off in the palette, abort (so as to delete the block). palettePoint = @trackerPointToPalette point - if 0 < palettePoint.x - @scrollOffsets.palette.x < @paletteCanvas.width and - 0 < palettePoint.y - @scrollOffsets.palette.y < @paletteCanvas.height or not - (-@gutter.offsetWidth < renderPoint.x - @scrollOffsets.main.x < @mainCanvas.width and - 0 < renderPoint.y - @scrollOffsets.main.y< @mainCanvas.height) + if 0 < palettePoint.x - @session.scrollOffsets.palette.x < @paletteCanvas.width and + 0 < palettePoint.y - @session.scrollOffsets.palette.y < @paletteCanvas.height or not + (-@gutter.offsetWidth < renderPoint.x - @session.scrollOffsets.main.x < @mainCanvas.width and + 0 < renderPoint.y - @session.scrollOffsets.main.y< @mainCanvas.height) if @draggingBlock is @lassoSelection @lassoSelection = null addBlockAsFloatingBlock = false else - if renderPoint.x - @scrollOffsets.main.x < 0 - renderPoint.x = @scrollOffsets.main.x + if renderPoint.x - @session.scrollOffsets.main.x < 0 + renderPoint.x = @session.scrollOffsets.main.x - # If @allowFloatingBlocks is false, we end the drag without deleting the block. - if not @allowFloatingBlocks + # If @session.allowFloatingBlocks is false, we end the drag without deleting the block. + if not @session.allowFloatingBlocks addBlockAsFloatingBlock = false removeBlock = false @@ -1736,10 +1753,10 @@ hook 'mouseup', 0, (point, event, state) -> # with creating this floating block newDocument = new model.Document({roundedSingletons: true}) newDocument.insert newDocument.start, @draggingBlock - @pushUndo new FloatingOperation @floatingBlocks.length, newDocument, renderPoint, 'create' + @pushUndo new FloatingOperation @session.floatingBlocks.length, newDocument, renderPoint, 'create' # Add this block to our list of floating blocks - @floatingBlocks.push new FloatingBlockRecord( + @session.floatingBlocks.push new FloatingBlockRecord( newDocument renderPoint ) @@ -1748,9 +1765,9 @@ hook 'mouseup', 0, (point, event, state) -> # TODO write a test for this logic for el, i in rememberedSocketOffsets - @rememberedSockets.push new RememberedSocketRecord( + @session.rememberedSockets.push new RememberedSocketRecord( new CrossDocumentLocation( - @floatingBlocks.length, + @session.floatingBlocks.length, new model.Location(el.offset + 1, 'socket') ), el.text @@ -1766,20 +1783,20 @@ hook 'mouseup', 0, (point, event, state) -> Editor::performFloatingOperation = (op, direction) -> if (op.type is 'create') is (direction is 'forward') - if @cursor.document > op.index - @cursor.document += 1 + if @session.cursor.document > op.index + @session.cursor.document += 1 - @floatingBlocks.splice op.index, 0, new FloatingBlockRecord( + @session.floatingBlocks.splice op.index, 0, new FloatingBlockRecord( op.block.clone() op.position ) else # If the cursor's document is about to vanish, # put it back in the main tree. - if @cursor.document is op.index + 1 - @setCursor @tree.start + if @session.cursor.document is op.index + 1 + @setCursor @session.tree.start - @floatingBlocks.splice op.index, 1 + @session.floatingBlocks.splice op.index, 1 class FloatingOperation constructor: (@index, @block, @position, @type) -> @@ -1807,7 +1824,7 @@ hook 'populate', 0, -> # Append the element. @paletteElement.appendChild @paletteHeader - @setPalette @paletteGroups + @setPalette @session.paletteGroups parseBlock = (mode, code) => block = mode.parse(code).start.next.container @@ -1817,14 +1834,14 @@ parseBlock = (mode, code) => Editor::setPalette = (paletteGroups) -> @paletteHeader.innerHTML = '' - @paletteGroups = paletteGroups + @session.paletteGroups = paletteGroups @currentPaletteBlocks = [] @currentPaletteMetadata = [] paletteHeaderRow = null - for paletteGroup, i in @paletteGroups then do (paletteGroup, i) => + for paletteGroup, i in @session.paletteGroups then do (paletteGroup, i) => # Start a new row, if we're at that point # in our appending cycle if i % 2 is 0 @@ -1832,7 +1849,7 @@ Editor::setPalette = (paletteGroups) -> paletteHeaderRow.className = 'droplet-palette-header-row' @paletteHeader.appendChild paletteHeaderRow # hide the header if there is only one group, and it has no name. - if @paletteGroups.length is 1 and !paletteGroup.name + if @session.paletteGroups.length is 1 and !paletteGroup.name paletteHeaderRow.style.height = 0 # Create the element itself @@ -1850,7 +1867,7 @@ Editor::setPalette = (paletteGroups) -> # Parse all the blocks in this palette and clone them for data in paletteGroup.blocks - newBlock = parseBlock(@mode, data.block) + newBlock = parseBlock(@session.mode, data.block) expansion = data.expansion or null newPaletteBlocks.push block: newBlock @@ -1882,7 +1899,7 @@ Editor::setPalette = (paletteGroups) -> # group argument can be object, id (string), or name (string) # Editor::changePaletteGroup = (group) -> - for curGroup, i in @paletteGroups + for curGroup, i in @session.paletteGroups if group is curGroup or group is curGroup.id or group is curGroup.name paletteGroup = curGroup break @@ -1922,15 +1939,15 @@ hook 'mousedown', 6, (point, event, state) -> if not @trackerPointIsInPalette(point) then return palettePoint = @trackerPointToPalette point - if @scrollOffsets.palette.y < palettePoint.y < @scrollOffsets.palette.y + @paletteCanvas.height and - @scrollOffsets.palette.x < palettePoint.x < @scrollOffsets.palette.x + @paletteCanvas.width + if @session.scrollOffsets.palette.y < palettePoint.y < @session.scrollOffsets.palette.y + @paletteCanvas.height and + @session.scrollOffsets.palette.x < palettePoint.x < @session.scrollOffsets.palette.x + @paletteCanvas.width if @handleTextInputClickInPalette palettePoint state.consumedHitTest = true return for entry in @currentPaletteBlocks - hitTestResult = @hitTest palettePoint, entry.block, @paletteView + hitTestResult = @hitTest palettePoint, entry.block, @session.paletteView if hitTestResult? @clickedBlock = entry.block @@ -1982,7 +1999,7 @@ hook 'rebuild_palette', 1, -> if data.id? hoverDiv.setAttribute 'data-id', data.id - bounds = @paletteView.getViewNodeFor(block).totalBounds + bounds = @session.paletteView.getViewNodeFor(block).totalBounds hoverDiv.style.top = "#{bounds.y}px" hoverDiv.style.left = "#{bounds.x}px" @@ -1995,9 +2012,9 @@ hook 'rebuild_palette', 1, -> hoverDiv.addEventListener 'mousemove', (event) => palettePoint = @trackerPointToPalette new @draw.Point( event.clientX, event.clientY) - if @viewOrChildrenContains block, palettePoint, @paletteView + if @session.viewOrChildrenContains block, palettePoint, @session.paletteView @clearPaletteHighlightCanvas() - @paletteHighlightPath = @getHighlightPath block, {color: '#FF0'}, @paletteView + @paletteHighlightPath = @getHighlightPath block, {color: '#FF0'}, @session.paletteView @paletteHighlightPath.draw @paletteHighlightCtx @currentHighlightedPaletteBlock = block else if block is @currentHighlightedPaletteBlock @@ -2007,8 +2024,8 @@ hook 'rebuild_palette', 1, -> hoverDiv.addEventListener 'mouseout', (event) => if block is @currentHighlightedPaletteBlock @currentHighlightedPaletteBlock = null - @paletteHighlightCtx.clearRect @scrollOffsets.palette.x, @scrollOffsets.palette.y, - @paletteHighlightCanvas.width + @scrollOffsets.palette.x, @paletteHighlightCanvas.height + @scrollOffsets.palette.y + @paletteHighlightCtx.clearRect @session.scrollOffsets.palette.x, @session.scrollOffsets.palette.y, + @paletteHighlightCanvas.width + @session.scrollOffsets.palette.x, @paletteHighlightCanvas.height + @session.scrollOffsets.palette.y @paletteScrollerStuffing.appendChild hoverDiv @@ -2029,12 +2046,12 @@ hook 'populate', 1, -> # position when @hiddenInput receives keystrokes with focus # (left and top should not be closer than 10 pixels from the edge) - bounds = @view.getViewNodeFor(@getCursor()).bounds[0] - inputLeft = bounds.x + @mainCanvas.offsetLeft - @scrollOffsets.main.x + bounds = @session.view.getViewNodeFor(@getCursor()).bounds[0] + inputLeft = bounds.x + @mainCanvas.offsetLeft - @session.scrollOffsets.main.x inputLeft = Math.min inputLeft, @dropletElement.clientWidth - 10 inputLeft = Math.max @mainCanvas.offsetLeft, inputLeft @hiddenInput.style.left = inputLeft + 'px' - inputTop = bounds.y - @scrollOffsets.main.y + inputTop = bounds.y - @session.scrollOffsets.main.y inputTop = Math.min inputTop, @dropletElement.clientHeight - 10 inputTop = Math.max 0, inputTop @hiddenInput.style.top = inputTop + 'px' @@ -2071,7 +2088,7 @@ hook 'populate', 1, -> Editor::resizeAceElement = -> width = @wrapperElement.clientWidth - if @showPaletteInTextMode and @paletteEnabled + if @session.showPaletteInTextMode and @session.paletteEnabled width -= @paletteWrapper.offsetWidth @aceElement.style.width = "#{width}px" @@ -2088,7 +2105,7 @@ Editor::redrawTextInput = -> # the hidden input value. @populateSocket @getCursor(), @hiddenInput.value - textFocusView = @view.getViewNodeFor @getCursor() + textFocusView = @session.view.getViewNodeFor @getCursor() # Determine the coordinate positions # of the typing cursor @@ -2106,7 +2123,7 @@ Editor::redrawTextInput = -> head = head.prev if head.type is 'newline' then line++ - treeView = @view.getViewNodeFor dropletDocument + treeView = @session.view.getViewNodeFor dropletDocument oldp = helper.deepCopy [ treeView.glue[line - 1], @@ -2146,7 +2163,7 @@ Editor::redrawTextInput = -> Editor::redrawTextHighlights = (scrollIntoView = false) -> return unless @cursorAtSocket() - textFocusView = @view.getViewNodeFor @getCursor() + textFocusView = @session.view.getViewNodeFor @getCursor() # Determine the coordinate positions # of the typing cursor @@ -2155,11 +2172,11 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> lines = @getCursor().stringify().split '\n' - startPosition = textFocusView.bounds[startRow].x + @view.opts.textPadding + + startPosition = textFocusView.bounds[startRow].x + @session.view.opts.textPadding + @mainCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionStart].split('\n'))).width + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) - endPosition = textFocusView.bounds[endRow].x + @view.opts.textPadding + + endPosition = textFocusView.bounds[endRow].x + @session.view.opts.textPadding + @mainCtx.measureText(last_(@getCursor().stringify()[...@hiddenInput.selectionEnd].split('\n'))).width + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) @@ -2170,7 +2187,7 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> @cursorCtx.lineWidth = 1 @cursorCtx.strokeStyle = '#000' @cursorCtx.strokeRect startPosition, textFocusView.bounds[startRow].y, - 0, @view.opts.textHeight + 0, @session.view.opts.textHeight @textInputHighlighted = false # Draw a translucent rectangle if there is a selection. @@ -2180,26 +2197,26 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> if startRow is endRow @cursorCtx.fillRect startPosition, - textFocusView.bounds[startRow].y + @view.opts.textPadding - endPosition - startPosition, @view.opts.textHeight + textFocusView.bounds[startRow].y + @session.view.opts.textPadding + endPosition - startPosition, @session.view.opts.textHeight else - @cursorCtx.fillRect startPosition, textFocusView.bounds[startRow].y + @view.opts.textPadding, - textFocusView.bounds[startRow].right() - @view.opts.textPadding - startPosition, @view.opts.textHeight + @cursorCtx.fillRect startPosition, textFocusView.bounds[startRow].y + @session.view.opts.textPadding, + textFocusView.bounds[startRow].right() - @session.view.opts.textPadding - startPosition, @session.view.opts.textHeight for i in [startRow + 1...endRow] @cursorCtx.fillRect textFocusView.bounds[i].x, - textFocusView.bounds[i].y + @view.opts.textPadding, + textFocusView.bounds[i].y + @session.view.opts.textPadding, textFocusView.bounds[i].width, - @view.opts.textHeight + @session.view.opts.textHeight @cursorCtx.fillRect textFocusView.bounds[endRow].x, - textFocusView.bounds[endRow].y + @view.opts.textPadding, + textFocusView.bounds[endRow].y + @session.view.opts.textPadding, endPosition - textFocusView.bounds[endRow].x, - @view.opts.textHeight + @session.view.opts.textHeight - if scrollIntoView and endPosition > @scrollOffsets.main.x + @mainCanvas.width - @mainScroller.scrollLeft = endPosition - @mainCanvas.width + @view.opts.padding + if scrollIntoView and endPosition > @session.scrollOffsets.main.x + @mainCanvas.width + @mainScroller.scrollLeft = endPosition - @mainCanvas.width + @session.view.opts.padding escapeString = (str) -> str[0] + str[1...-1].replace(/(\'|\"|\n)/g, '\\$1') + str[str.length - 1] @@ -2259,13 +2276,13 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> context = (list.start.container ? list.start.parent).parseContext try - newList = @mode.parse list.stringifyInPlace(),{ + newList = @session.mode.parse list.stringifyInPlace(),{ wrapAtRoot: parent.type isnt 'socket' context: context } catch e try - newList = @mode.parse recovery(list.stringifyInPlace()), { + newList = @session.mode.parse recovery(list.stringifyInPlace()), { wrapAtRoot: parent.type isnt 'socket' context: context } @@ -2332,7 +2349,7 @@ Editor::populateSocket = (socket, string) -> @spliceIn (new model.List(first, last)), socket.start Editor::populateBlock = (block, string) -> - newBlock = @mode.parse(string, wrapAtRoot: false).start.next.container + newBlock = @session.mode.parse(string, wrapAtRoot: false).start.next.container if newBlock # Find the first token before the block # that will still be around after the @@ -2352,7 +2369,7 @@ Editor::hitTestTextInput = (point, block) -> head = block.start while head? if head.type is 'socketStart' and head.container.isDroppable() and - @view.getViewNodeFor(head.container).path.contains point + @session.view.getViewNodeFor(head.container).path.contains point return head.container head = head.next @@ -2362,14 +2379,14 @@ Editor::hitTestTextInput = (point, block) -> # the text input selection, given # points on the main canvas. Editor::getTextPosition = (point) -> - textFocusView = @view.getViewNodeFor @getCursor() + textFocusView = @session.view.getViewNodeFor @getCursor() - row = Math.floor((point.y - textFocusView.bounds[0].y) / (@fontSize + 2 * @view.opts.padding)) + row = Math.floor((point.y - textFocusView.bounds[0].y) / (@session.fontSize + 2 * @session.view.opts.padding)) row = Math.max row, 0 row = Math.min row, textFocusView.lineLength - 1 - column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @mainCtx.measureText(' ').width) + column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @session.view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @mainCtx.measureText(' ').width) lines = @getCursor().stringify().split('\n')[..row] lines[lines.length - 1] = lines[lines.length - 1][...column] @@ -2412,14 +2429,14 @@ Editor::handleTextInputClick = (mainPoint, dropletDocument) -> @redrawMain() if hitTestResult.hasDropdown() and ((not hitTestResult.editable()) or - mainPoint.x - @view.getViewNodeFor(hitTestResult).bounds[0].x < helper.DROPDOWN_ARROW_WIDTH) + mainPoint.x - @session.view.getViewNodeFor(hitTestResult).bounds[0].x < helper.DROPDOWN_ARROW_WIDTH) @showDropdown hitTestResult @textInputSelecting = false else if @getCursor().hasDropdown() and - mainPoint.x - @view.getViewNodeFor(hitTestResult).bounds[0].x < helper.DROPDOWN_ARROW_WIDTH + mainPoint.x - @session.view.getViewNodeFor(hitTestResult).bounds[0].x < helper.DROPDOWN_ARROW_WIDTH @showDropdown() @setTextInputAnchor mainPoint @@ -2446,7 +2463,7 @@ Editor::hitTestTextInputInPalette = (point, block) -> head = block.start while head? if head.type is 'socketStart' and head.container.isDroppable() and - @paletteView.getViewNodeFor(head.container).path.contains point + @session.paletteView.getViewNodeFor(head.container).path.contains point return head.container head = head.next @@ -2477,9 +2494,9 @@ hook 'populate', 0, -> # Update the dropdown to match # the current text focus font and size. -Editor::formatDropdown = (socket = @getCursor(), view = @view) -> - @dropdownElement.style.fontFamily = @fontFamily - @dropdownElement.style.fontSize = @fontSize +Editor::formatDropdown = (socket = @getCursor(), view = @session.view) -> + @dropdownElement.style.fontFamily = @session.fontFamily + @dropdownElement.style.fontSize = @session.fontSize @dropdownElement.style.minWidth = view.getViewNodeFor(socket).bounds[0].width Editor::getDropdownList = (socket) -> @@ -2503,7 +2520,7 @@ Editor::showDropdown = (socket = @getCursor(), inPalette = false) -> @dropdownElement.innerHTML = '' @dropdownElement.style.display = 'inline-block' - @formatDropdown socket, if inPalette then @paletteView else @view + @formatDropdown socket, if inPalette then @session.paletteView else @session.view for el, i in @getDropdownList(socket) then do (el) => div = document.createElement 'div' @@ -2557,22 +2574,22 @@ Editor::showDropdown = (socket = @getCursor(), inPalette = false) -> el.style.paddingRight = DROPDOWN_SCROLLBAR_PADDING if inPalette - location = @paletteView.getViewNodeFor(socket).bounds[0] - @dropdownElement.style.left = location.x - @scrollOffsets.palette.x + @paletteCanvas.offsetLeft + 'px' + location = @session.paletteView.getViewNodeFor(socket).bounds[0] + @dropdownElement.style.left = location.x - @session.scrollOffsets.palette.x + @paletteCanvas.offsetLeft + 'px' @dropdownElement.style.minWidth = location.width + 'px' - dropdownTop = location.y + @fontSize - @scrollOffsets.palette.y + @paletteCanvas.offsetTop + dropdownTop = location.y + @session.fontSize - @session.scrollOffsets.palette.y + @paletteCanvas.offsetTop if dropdownTop + @dropdownElement.offsetHeight > @paletteElement.offsetHeight - dropdownTop -= (@fontSize + @dropdownElement.offsetHeight) + dropdownTop -= (@session.fontSize + @dropdownElement.offsetHeight) @dropdownElement.style.top = dropdownTop + 'px' else - location = @view.getViewNodeFor(socket).bounds[0] - @dropdownElement.style.left = location.x - @scrollOffsets.main.x + @dropletElement.offsetLeft + @mainCanvas.offsetLeft + 'px' + location = @session.view.getViewNodeFor(socket).bounds[0] + @dropdownElement.style.left = location.x - @session.scrollOffsets.main.x + @dropletElement.offsetLeft + @mainCanvas.offsetLeft + 'px' @dropdownElement.style.minWidth = location.width + 'px' - dropdownTop = location.y + @fontSize - @scrollOffsets.main.y + dropdownTop = location.y + @session.fontSize - @session.scrollOffsets.main.y if dropdownTop + @dropdownElement.offsetHeight > @dropletElement.offsetHeight - dropdownTop -= (@fontSize + @dropdownElement.offsetHeight) + dropdownTop -= (@session.fontSize + @dropdownElement.offsetHeight) @dropdownElement.style.top = dropdownTop + 'px' ), 0 @@ -2589,14 +2606,14 @@ hook 'dblclick', 0, (point, event, state) -> # Otherwise, look for a socket that # the user has clicked mainPoint = @trackerPointToMain point - hitTestResult = @hitTestTextInput mainPoint, @tree + hitTestResult = @hitTestTextInput mainPoint, @session.tree # If they have clicked a socket, # focus it, and unless hitTestResult is @getCursor() if hitTestResult? and hitTestResult.editable() @redrawMain() - hitTestResult = @hitTestTextInput mainPoint, @tree + hitTestResult = @hitTestTextInput mainPoint, @session.tree if hitTestResult? and hitTestResult.editable() @setCursor hitTestResult @@ -2692,8 +2709,8 @@ hook 'mousedown', 0, (point, event, state) -> # If the point was actually in the main canvas, # start a lasso select. - mainPoint = @trackerPointToMain(point).from @scrollOffsets.main - palettePoint = @trackerPointToPalette(point).from @scrollOffsets.palette + mainPoint = @trackerPointToMain(point).from @session.scrollOffsets.main + palettePoint = @trackerPointToPalette(point).from @session.scrollOffsets.palette @lassoSelectAnchor = @trackerPointToMain point @@ -2714,18 +2731,18 @@ hook 'mousemove', 0, (point, event, state) -> findLassoSelect = (dropletDocument) => first = dropletDocument.start - until (not first?) or first.type is 'blockStart' and @view.getViewNodeFor(first.container).path.intersects lassoRectangle + until (not first?) or first.type is 'blockStart' and @session.view.getViewNodeFor(first.container).path.intersects lassoRectangle first = first.next last = dropletDocument.end - until (not last?) or last.type is 'blockEnd' and @view.getViewNodeFor(last.container).path.intersects lassoRectangle + until (not last?) or last.type is 'blockEnd' and @session.view.getViewNodeFor(last.container).path.intersects lassoRectangle last = last.prev @clearLassoSelectCanvas(); @clearHighlightCanvas() @lassoSelectCtx.strokeStyle = '#00f' - @lassoSelectCtx.strokeRect lassoRectangle.x - @scrollOffsets.main.x, - lassoRectangle.y - @scrollOffsets.main.y, + @lassoSelectCtx.strokeRect lassoRectangle.x - @session.scrollOffsets.main.x, + lassoRectangle.y - @session.scrollOffsets.main.y, lassoRectangle.width, lassoRectangle.height @@ -2747,18 +2764,18 @@ hook 'mousemove', 0, (point, event, state) -> Editor::redrawLassoHighlight = -> if @lassoSelection? mainCanvasRectangle = new @draw.Rectangle( - @scrollOffsets.main.x, - @scrollOffsets.main.y, + @session.scrollOffsets.main.x, + @session.scrollOffsets.main.y, @mainCanvas.width, @mainCanvas.height ) - lassoView = @view.getViewNodeFor(@lassoSelection) + lassoView = @session.view.getViewNodeFor(@lassoSelection) lassoView.absorbCache() lassoView.draw @highlightCtx, mainCanvasRectangle, {selected: true} @maskFloatingPaths(@lassoSelection.start.getDocument()) Editor::maskFloatingPaths = (dropletDocument) -> - for record, i in @floatingBlocks by -1 + for record, i in @session.floatingBlocks by -1 if record.block is dropletDocument break else @@ -2829,9 +2846,6 @@ hook 'mousedown', 3, (point, event, state) -> # CURSOR OPERATION SUPPORT # ================================ -hook 'populate', 0, -> - @cursor = new CrossDocumentLocation(0, new model.Location(0, 'documentStart')) - class CrossDocumentLocation constructor: (@document, @location) -> @@ -2868,14 +2882,14 @@ Editor::setCursor = (destination, validate = (-> true), direction = 'after') -> destination = @toCrossDocumentLocation destination # If the cursor was at a text input, reparse the old one - if @cursorAtSocket() and not @cursor.is(destination) + if @cursorAtSocket() and not @session.cursor.is(destination) socket = @getCursor() if '__comment__' not in socket.classes - @reparse socket, null, (if destination.document is @cursor.document then [destination.location] else []) + @reparse socket, null, (if destination.document is @session.cursor.document then [destination.location] else []) @hiddenInput.blur() @dropletElement.focus() - @cursor = destination + @session.cursor = destination # If we have messed up (usually because # of a reparse), scramble to find a nearby @@ -2887,37 +2901,37 @@ Editor::setCursor = (destination, validate = (-> true), direction = 'after') -> # If we are now at a text input, populate the hidden input if @cursorAtSocket() - if @getCursor()?.id of @extraMarks - delete @extraMarks[focus?.id] + if @getCursor()?.id of @session.extraMarks + delete @session.extraMarks[focus?.id] @undoCapture() @hiddenInput.value = @getCursor().textContent() @hiddenInput.focus() - {start, end} = @mode.getDefaultSelectionRange @hiddenInput.value + {start, end} = @session.mode.getDefaultSelectionRange @hiddenInput.value @setTextSelectionRange start, end Editor::determineCursorPosition = -> # Do enough of the redraw to get the bounds - @view.getViewNodeFor(@tree).layout 0, @nubbyHeight + @session.view.getViewNodeFor(@session.tree).layout 0, @nubbyHeight # Get a cursor that is in the model cursor = @getCursor() if cursor.type is 'documentStart' - bound = @view.getViewNodeFor(cursor.container).bounds[0] + bound = @session.view.getViewNodeFor(cursor.container).bounds[0] return new @draw.Point bound.x, bound.y else if cursor.type is 'indentStart' line = if cursor.next.type is 'newline' then 1 else 0 - bound = @view.getViewNodeFor(cursor.container).bounds[line] + bound = @session.view.getViewNodeFor(cursor.container).bounds[line] return new @draw.Point bound.x, bound.y else line = @getCursor().getTextLocation().row - cursor.parent.getTextLocation().row - bound = @view.getViewNodeFor(cursor.parent).bounds[line] + bound = @session.view.getViewNodeFor(cursor.parent).bounds[line] return new @draw.Point bound.x, bound.bottom() Editor::getCursor = -> - cursor = @fromCrossDocumentLocation @cursor + cursor = @fromCrossDocumentLocation @session.cursor if cursor.type is 'socketStart' return cursor.container @@ -2927,9 +2941,9 @@ Editor::getCursor = -> Editor::scrollCursorIntoPosition = -> axis = @determineCursorPosition().y - if axis - @scrollOffsets.main.y < 0 + if axis - @session.scrollOffsets.main.y < 0 @mainScroller.scrollTop = axis - else if axis - @scrollOffsets.main.y > @mainCanvas.height + else if axis - @session.scrollOffsets.main.y > @mainCanvas.height @mainScroller.scrollTop = axis - @mainCanvas.height @mainScroller.scrollLeft = 0 @@ -2937,8 +2951,8 @@ Editor::scrollCursorIntoPosition = -> # Moves the cursor to the end of the document and scrolls it into position # (in block and text mode) Editor::scrollCursorToEndOfDocument = -> - if @currentlyUsingBlocks - pos = @tree.end + if @session.currentlyUsingBlocks + pos = @session.tree.end while pos && !@validCursorPosition(pos) pos = pos.prev @setCursor(pos) @@ -3001,7 +3015,7 @@ Editor::deleteAtCursor = -> @redrawMain() hook 'keydown', 0, (event, state) -> - if @readOnly + if @session.readOnly return if event.which isnt BACKSPACE_KEY return @@ -3043,16 +3057,13 @@ Editor::deleteLassoSelection = -> # HANDWRITTEN BLOCK SUPPORT # ================================ -hook 'populate', 0, -> - @handwrittenBlocks = [] - hook 'keydown', 0, (event, state) -> - if @readOnly + if @session.readOnly return if event.which is ENTER_KEY if not @cursorAtSocket() and not event.shiftKey and not event.ctrlKey and not event.metaKey # Construct the block; flag the socket as handwritten - newBlock = new model.Block(); newSocket = new model.Socket @mode.empty, Infinity, true + newBlock = new model.Block(); newSocket = new model.Socket @session.mode.empty, Infinity, true newSocket.setParent newBlock helper.connect newBlock.start, newSocket.start helper.connect newSocket.end, newBlock.end @@ -3073,14 +3084,14 @@ hook 'keydown', 0, (event, state) -> socket = @getCursor() @hiddenInput.blur() @dropletElement.focus() - @setCursor @cursor, (token) -> token.type isnt 'socketStart' + @setCursor @session.cursor, (token) -> token.type isnt 'socketStart' @redrawMain() - if '__comment__' in socket.classes and @mode.startSingleLineComment + if '__comment__' in socket.classes and @session.mode.startSingleLineComment # Create another single line comment block just below newBlock = new model.Block 0, 'blank', helper.ANY_DROP newBlock.classes = ['__comment__', 'block-only'] newBlock.socketLevel = helper.BLOCK_ONLY - newTextMarker = new model.TextToken @mode.startSingleLineComment + newTextMarker = new model.TextToken @session.mode.startSingleLineComment newTextMarker.setParent newBlock newSocket = new model.Socket '', 0, true newSocket.classes = ['__comment__'] @@ -3103,7 +3114,7 @@ hook 'keydown', 0, (event, state) -> @newHandwrittenSocket = newSocket hook 'keyup', 0, (event, state) -> - if @readOnly + if @session.readOnly return # prevents routing the initial enter keypress to a new handwritten # block by focusing the block only after the enter key is released. @@ -3143,7 +3154,6 @@ hook 'populate', 1, -> @aceEditor.getSession().setMode 'ace/mode/' + acemode @aceEditor.getSession().setTabSize 2 - @currentlyUsingBlocks = true @currentlyAnimating = false @transitionContainer = document.createElement 'div' @@ -3176,7 +3186,7 @@ Editor::computePlaintextTranslationVectors = -> # to end up. textElements = []; translationVectors = [] - head = @tree.start + head = @session.tree.start aceSession = @aceEditor.session state = { @@ -3202,19 +3212,19 @@ Editor::computePlaintextTranslationVectors = -> @gutter.offsetWidth + 5 # TODO see above } - @mainCtx.font = @aceFontSize() + ' ' + @fontFamily + @mainCtx.font = @aceFontSize() + ' ' + @session.fontFamily rownum = 0 - until head is @tree.end + until head is @session.tree.end switch head.type when 'text' - corner = @view.getViewNodeFor(head).bounds[0].upperLeftCorner() + corner = @session.view.getViewNodeFor(head).bounds[0].upperLeftCorner() - corner.x -= @scrollOffsets.main.x - corner.y -= @scrollOffsets.main.y + corner.x -= @session.scrollOffsets.main.x + corner.y -= @session.scrollOffsets.main.y translationVectors.push (new @draw.Point(state.x, state.y)).from(corner) - textElements.push @view.getViewNodeFor head + textElements.push @session.view.getViewNodeFor head state.x += @mainCtx.measureText(head.value).width @@ -3246,14 +3256,14 @@ Editor::computePlaintextTranslationVectors = -> } Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -> - if @currentlyUsingBlocks and not @currentlyAnimating + if @session.currentlyUsingBlocks and not @currentlyAnimating @hideDropdown() @fireEvent 'statechange', [false] @setAceValue @getValue() - top = @findLineNumberAtCoordinate @scrollOffsets.main.y + top = @findLineNumberAtCoordinate @session.scrollOffsets.main.y @aceEditor.scrollToLine top @aceEditor.resize true @@ -3268,7 +3278,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - @mainScroller.style.overflowY = 'hidden' @dropletElement.style.width = @wrapperElement.clientWidth + 'px' - @currentlyUsingBlocks = false; @currentlyAnimating = @currentlyAnimating_suppressRedraw = true + @session.currentlyUsingBlocks = false; @currentlyAnimating = @currentlyAnimating_suppressRedraw = true # Compute where the text will end up # in the ace editor @@ -3280,8 +3290,8 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - # Skip anything that's # off the screen the whole time. - unless 0 < textElement.bounds[0].bottom() - @scrollOffsets.main.y + translationVectors[i].y and - textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y < @mainCanvas.height + unless 0 < textElement.bounds[0].bottom() - @session.scrollOffsets.main.y + translationVectors[i].y and + textElement.bounds[0].y - @session.scrollOffsets.main.y + translationVectors[i].y < @mainCanvas.height continue div = document.createElement 'div' @@ -3289,10 +3299,10 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - div.innerText = div.textContent = textElement.model.value - div.style.font = @fontSize + 'px ' + @fontFamily + div.style.font = @session.fontSize + 'px ' + @session.fontFamily - div.style.left = "#{textElement.bounds[0].x - @scrollOffsets.main.x}px" - div.style.top = "#{textElement.bounds[0].y - @scrollOffsets.main.y - @fontAscent}px" + div.style.left = "#{textElement.bounds[0].x - @session.scrollOffsets.main.x}px" + div.style.top = "#{textElement.bounds[0].y - @session.scrollOffsets.main.y - @session.fontAscent}px" div.className = 'droplet-transitioning-element' div.style.transition = "left #{translateTime}ms, top #{translateTime}ms, font-size #{translateTime}ms" @@ -3302,16 +3312,16 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - do (div, textElement, translationVectors, i) => setTimeout (=> - div.style.left = (textElement.bounds[0].x - @scrollOffsets.main.x + translationVectors[i].x) + 'px' - div.style.top = (textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y) + 'px' + div.style.left = (textElement.bounds[0].x - @session.scrollOffsets.main.x + translationVectors[i].x) + 'px' + div.style.top = (textElement.bounds[0].y - @session.scrollOffsets.main.y + translationVectors[i].y) + 'px' div.style.fontSize = @aceFontSize() ), fadeTime top = Math.max @aceEditor.getFirstVisibleRow(), 0 - bottom = Math.min @aceEditor.getLastVisibleRow(), @view.getViewNodeFor(@tree).lineLength - 1 + bottom = Math.min @aceEditor.getLastVisibleRow(), @session.view.getViewNodeFor(@session.tree).lineLength - 1 aceScrollTop = @aceEditor.session.getScrollTop() - treeView = @view.getViewNodeFor @tree + treeView = @session.view.getViewNodeFor @session.tree lineHeight = @aceEditor.renderer.layerConfig.lineHeight for line in [top..bottom] @@ -3321,9 +3331,9 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - div.innerText = div.textContent = line + 1 div.style.left = 0 - div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent - @scrollOffsets.main.y}px" + div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @session.view.opts.textHeight - @session.fontAscent - @session.scrollOffsets.main.y}px" - div.style.font = @fontSize + 'px ' + @fontFamily + div.style.font = @session.fontSize + 'px ' + @session.fontFamily div.style.width = "#{@gutter.offsetWidth}px" translatingElements.push div @@ -3356,7 +3366,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - @highlightCanvas.style.opacity = @cursorCanvas.style.opacity = 0 - paletteDisappearingWithMelt = @paletteEnabled and not @showPaletteInTextMode + paletteDisappearingWithMelt = @session.paletteEnabled and not @session.showPaletteInTextMode if paletteDisappearingWithMelt # Move the palette header into the background @@ -3377,7 +3387,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - # Translate the ACE editor div into frame. @aceElement.style.top = '0px' - if @showPaletteInTextMode and @paletteEnabled + if @session.showPaletteInTextMode and @session.paletteEnabled @aceElement.style.left = "#{@paletteWrapper.offsetWidth}px" else @aceElement.style.left = '0px' @@ -3401,7 +3411,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - for div in translatingElements div.parentNode.removeChild div - @fireEvent 'toggledone', [@currentlyUsingBlocks] + @fireEvent 'toggledone', [@session.currentlyUsingBlocks] if cb? then do cb ), fadeTime + translateTime @@ -3412,7 +3422,7 @@ Editor::aceFontSize = -> parseFloat(@aceEditor.getFontSize()) + 'px' Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-> - if not @currentlyUsingBlocks and not @currentlyAnimating + if not @session.currentlyUsingBlocks and not @currentlyAnimating setValueResult = @copyAceEditor() unless setValueResult.success @@ -3420,13 +3430,12 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- @fireEvent 'parseerror', [setValueResult.error] return setValueResult - if @aceEditor.getFirstVisibleRow() is 0 @mainScroller.scrollTop = 0 else - @mainScroller.scrollTop = @view.getViewNodeFor(@tree).bounds[@aceEditor.getFirstVisibleRow()].y + @mainScroller.scrollTop = @session.view.getViewNodeFor(@session.tree).bounds[@aceEditor.getFirstVisibleRow()].y - @currentlyUsingBlocks = true + @session.currentlyUsingBlocks = true @currentlyAnimating = true @fireEvent 'statechange', [true] @@ -3442,7 +3451,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- @aceElement.style.top = "-9999px" @aceElement.style.left = "-9999px" - paletteAppearingWithFreeze = @paletteEnabled and not @showPaletteInTextMode + paletteAppearingWithFreeze = @session.paletteEnabled and not @session.showPaletteInTextMode if paletteAppearingWithFreeze @paletteWrapper.style.top = '0px' @@ -3450,7 +3459,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- @paletteHeader.style.zIndex = 0 @dropletElement.style.top = "0px" - if @paletteEnabled and not paletteAppearingWithFreeze + if @session.paletteEnabled and not paletteAppearingWithFreeze @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px" else @dropletElement.style.left = "0px" @@ -3463,8 +3472,8 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- # Skip anything that's # off the screen the whole time. - unless 0 < textElement.bounds[0].bottom() - @scrollOffsets.main.y + translationVectors[i].y and - textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y < @mainCanvas.height + unless 0 < textElement.bounds[0].bottom() - @session.scrollOffsets.main.y + translationVectors[i].y and + textElement.bounds[0].y - @session.scrollOffsets.main.y + translationVectors[i].y < @mainCanvas.height continue div = document.createElement 'div' @@ -3472,11 +3481,11 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- div.innerText = div.textContent = textElement.model.value - div.style.font = @aceFontSize() + ' ' + @fontFamily + div.style.font = @aceFontSize() + ' ' + @session.fontFamily div.style.position = 'absolute' - div.style.left = "#{textElement.bounds[0].x - @scrollOffsets.main.x + translationVectors[i].x}px" - div.style.top = "#{textElement.bounds[0].y - @scrollOffsets.main.y + translationVectors[i].y}px" + div.style.left = "#{textElement.bounds[0].x - @session.scrollOffsets.main.x + translationVectors[i].x}px" + div.style.top = "#{textElement.bounds[0].y - @session.scrollOffsets.main.y + translationVectors[i].y}px" div.className = 'droplet-transitioning-element' div.style.transition = "left #{translateTime}ms, top #{translateTime}ms, font-size #{translateTime}ms" @@ -3486,15 +3495,15 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- do (div, textElement) => setTimeout (=> - div.style.left = "#{textElement.bounds[0].x - @scrollOffsets.main.x}px" - div.style.top = "#{textElement.bounds[0].y - @scrollOffsets.main.y - @fontAscent}px" - div.style.fontSize = @fontSize + 'px' + div.style.left = "#{textElement.bounds[0].x - @session.scrollOffsets.main.x}px" + div.style.top = "#{textElement.bounds[0].y - @session.scrollOffsets.main.y - @session.fontAscent}px" + div.style.fontSize = @session.fontSize + 'px' ), 0 top = Math.max @aceEditor.getFirstVisibleRow(), 0 - bottom = Math.min @aceEditor.getLastVisibleRow(), @view.getViewNodeFor(@tree).lineLength - 1 + bottom = Math.min @aceEditor.getLastVisibleRow(), @session.view.getViewNodeFor(@session.tree).lineLength - 1 - treeView = @view.getViewNodeFor @tree + treeView = @session.view.getViewNodeFor @session.tree lineHeight = @aceEditor.renderer.layerConfig.lineHeight aceScrollTop = @aceEditor.session.getScrollTop() @@ -3505,7 +3514,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- div.innerText = div.textContent = line + 1 - div.style.font = @aceFontSize() + ' ' + @fontFamily + div.style.font = @aceFontSize() + ' ' + @session.fontFamily div.style.width = "#{@aceEditor.renderer.$gutter.offsetWidth}px" div.style.left = 0 @@ -3524,8 +3533,8 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- do (div, line) => setTimeout (=> div.style.left = 0 - div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent- @scrollOffsets.main.y}px" - div.style.fontSize = @fontSize + 'px' + div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @session.view.opts.textHeight - @session.fontAscent- @session.scrollOffsets.main.y}px" + div.style.fontSize = @session.fontSize + 'px' ), 0 for el in [@mainCanvas, @highlightCanvas, @cursorCanvas] @@ -3568,7 +3577,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- @resizeBlockMode() - @fireEvent 'toggledone', [@currentlyUsingBlocks] + @fireEvent 'toggledone', [@session.currentlyUsingBlocks] if cb? then do cb ), translateTime + fadeTime @@ -3578,16 +3587,16 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- return success: true Editor::enablePalette = (enabled) -> - if not @currentlyAnimating and @paletteEnabled != enabled - @paletteEnabled = enabled + if not @currentlyAnimating and @session.paletteEnabled != enabled + @session.paletteEnabled = enabled @currentlyAnimating = true - if @currentlyUsingBlocks + if @session.currentlyUsingBlocks activeElement = @dropletElement else activeElement = @aceElement - if not @paletteEnabled + if not @session.paletteEnabled activeElement.style.transition = @paletteWrapper.style.transition = "left 500ms" @@ -3607,7 +3616,7 @@ Editor::enablePalette = (enabled) -> @currentlyAnimating = false - @fireEvent 'palettetoggledone', [@paletteEnabled] + @fireEvent 'palettetoggledone', [@session.paletteEnabled] ), 500 else @@ -3630,13 +3639,13 @@ Editor::enablePalette = (enabled) -> @currentlyAnimating = false - @fireEvent 'palettetoggledone', [@paletteEnabled] + @fireEvent 'palettetoggledone', [@session.paletteEnabled] ), 500 ), 0 Editor::toggleBlocks = (cb) -> - if @currentlyUsingBlocks + if @session.currentlyUsingBlocks return @performMeltAnimation 500, 1000, cb else return @performFreezeAnimation 500, 500, cb @@ -3645,11 +3654,6 @@ Editor::toggleBlocks = (cb) -> # ================================ hook 'populate', 2, -> - @scrollOffsets = { - main: new @draw.Point 0, 0 - palette: new @draw.Point 0, 0 - } - @mainScroller = document.createElement 'div' @mainScroller.className = 'droplet-main-scroller' @@ -3664,15 +3668,15 @@ hook 'populate', 2, -> @wrapperElement.scrollTop = @wrapperElement.scrollLeft = 0 @mainScroller.addEventListener 'scroll', => - @scrollOffsets.main.y = @mainScroller.scrollTop - @scrollOffsets.main.x = @mainScroller.scrollLeft + @session.scrollOffsets.main.y = @mainScroller.scrollTop + @session.scrollOffsets.main.x = @mainScroller.scrollLeft - @mainCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y + @mainCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.main.x, -@session.scrollOffsets.main.y # Also update scroll for the highlight ctx, so that # they can match the blocks' positions - @highlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y - @cursorCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.main.x, -@scrollOffsets.main.y + @highlightCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.main.x, -@session.scrollOffsets.main.y + @cursorCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.main.x, -@session.scrollOffsets.main.y @redrawMain() @@ -3686,14 +3690,14 @@ hook 'populate', 2, -> @paletteElement.appendChild @paletteScroller @paletteScroller.addEventListener 'scroll', => - @scrollOffsets.palette.y = @paletteScroller.scrollTop + @session.scrollOffsets.palette.y = @paletteScroller.scrollTop # Temporarily ignoring x-scroll to fix bad x-scrolling behaviour # when dragging blocks out of the palette. TODO: fix x-scrolling behaviour. - # @scrollOffsets.palette.x = @paletteScroller.scrollLeft + # @session.scrollOffsets.palette.x = @paletteScroller.scrollLeft - @paletteCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y - @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@scrollOffsets.palette.x, -@scrollOffsets.palette.y + @paletteCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y + @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y # redraw the bits of the palette @redrawPalette() @@ -3708,9 +3712,9 @@ hook 'resize_palette', 0, -> @paletteScroller.style.height = "#{@paletteCanvas.offsetHeight}px" hook 'redraw_main', 1, -> - bounds = @view.getViewNodeFor(@tree).getBounds() - for record in @floatingBlocks - bounds.unite @view.getViewNodeFor(record.block).getBounds() + bounds = @session.view.getViewNodeFor(@session.tree).getBounds() + for record in @session.floatingBlocks + bounds.unite @session.view.getViewNodeFor(record.block).getBounds() @mainScrollerStuffing.style.width = "#{bounds.right()}px" @@ -3720,12 +3724,12 @@ hook 'redraw_main', 1, -> # # Default this extra space to fontSize (approx. 1 line). @mainScrollerStuffing.style.height = "#{bounds.bottom() + - (@options.extraBottomHeight ? @fontSize)}px" + (@options.extraBottomHeight ? @session.fontSize)}px" hook 'redraw_palette', 0, -> bounds = new @draw.NoRectangle() for entry in @currentPaletteBlocks - bounds.unite @paletteView.getViewNodeFor(entry.block).getBounds() + bounds.unite @session.paletteView.getViewNodeFor(entry.block).getBounds() # For now, we will comment out this line # due to bugs @@ -3734,32 +3738,24 @@ hook 'redraw_palette', 0, -> # MULTIPLE FONT SIZE SUPPORT # ================================ -hook 'populate', 0, -> - @fontSize = 15 - @fontFamily = 'Courier New' - - metrics = helper.fontMetrics(@fontFamily, @fontSize) - @fontAscent = metrics.prettytop - @fontDescent = metrics.descent - Editor::setFontSize_raw = (fontSize) -> - unless @fontSize is fontSize - @fontSize = fontSize + unless @session.fontSize is fontSize + @session.fontSize = fontSize @paletteHeader.style.fontSize = "#{fontSize}px" @gutter.style.fontSize = "#{fontSize}px" @tooltipElement.style.fontSize = "#{fontSize}px" - @view.opts.textHeight = - @dragView.opts.textHeight = helper.getFontHeight @fontFamily, @fontSize + @session.view.opts.textHeight = + @session.dragView.opts.textHeight = helper.getFontHeight @session.fontFamily, @session.fontSize - metrics = helper.fontMetrics(@fontFamily, @fontSize) - @fontAscent = metrics.prettytop - @fontDescent = metrics.descent + metrics = helper.fontMetrics(@session.fontFamily, @session.fontSize) + @session.fontAscent = metrics.prettytop + @session.fontDescent = metrics.descent - @view.clearCache() + @session.view.clearCache() - @dragView.clearCache() + @session.dragView.clearCache() @gutter.style.width = @aceEditor.renderer.$gutterLayer.gutterWidth + 'px' @@ -3769,12 +3765,12 @@ Editor::setFontSize_raw = (fontSize) -> Editor::setFontFamily = (fontFamily) -> @draw.setGlobalFontFamily fontFamily - @fontFamily = fontFamily + @session.fontFamily = fontFamily - @view.opts.textHeight = helper.getFontHeight @fontFamily, @fontSize - @fontAscent = helper.fontMetrics(@fontFamily, @fontSize).prettytop + @session.view.opts.textHeight = helper.getFontHeight @session.fontFamily, @session.fontSize + @session.fontAscent = helper.fontMetrics(@session.fontFamily, @session.fontSize).prettytop - @view.clearCache(); @dragView.clearCache() + @session.view.clearCache(); @session.dragView.clearCache() @gutter.style.fontFamily = fontFamily @tooltipElement.style.fontFamily = fontFamily @@ -3787,13 +3783,7 @@ Editor::setFontSize = (fontSize) -> # LINE MARKING SUPPORT # ================================ - -hook 'populate', 0, -> - @markedLines = {} - @markedBlocks = {}; @nextMarkedBlockId = 0 - @extraMarks = {} - -Editor::getHighlightPath = (model, style, view = @view) -> +Editor::getHighlightPath = (model, style, view = @session.view) -> path = view.getViewNodeFor(model).path.clone() path.style.fillColor = null @@ -3804,10 +3794,10 @@ Editor::getHighlightPath = (model, style, view = @view) -> return path Editor::markLine = (line, style) -> - block = @tree.getBlockOnLine line + block = @session.tree.getBlockOnLine line if block? - @markedLines[line] = + @session.markedLines[line] = model: block style: style @@ -3816,7 +3806,7 @@ Editor::markLine = (line, style) -> Editor::markBlock = (block, style) -> key = @nextMarkedBlockId++ - @markedBlocks[key] = { + @session.markedBlocks[key] = { model: block style: style } @@ -3827,14 +3817,14 @@ Editor::markBlock = (block, style) -> # `mark(line, col, style)` will mark the first block after the given (line, col) coordinate # with the given style. Editor::mark = (location, style) -> - block = @tree.getFromTextLocation location + block = @session.tree.getFromTextLocation location block = block.container ? block # `key` is a unique identifier for this # mark, to be used later for removal key = @nextMarkedBlockId++ - @markedBlocks[key] = { + @session.markedBlocks[key] = { model: block style: style } @@ -3846,18 +3836,18 @@ Editor::mark = (location, style) -> return key Editor::unmark = (key) -> - delete @markedBlocks[key] + delete @session.markedBlocks[key] @redrawHighlights() return true Editor::unmarkLine = (line) -> - delete @markedLines[line] + delete @session.markedLines[line] @redrawHighlights() Editor::clearLineMarks = -> - @markedLines = @markedBlocks = {} + @session.markedLines = @session.markedBlocks = {} @redrawHighlights() @@ -3875,7 +3865,7 @@ hook 'mousemove', 0, (point, event, state) -> mainPoint = @trackerPointToMain point - treeView = @view.getViewNodeFor @tree + treeView = @session.view.getViewNodeFor @session.tree if @lastHoveredLine? and treeView.bounds[@lastHoveredLine]? and treeView.bounds[@lastHoveredLine].contains mainPoint @@ -3904,14 +3894,14 @@ Editor::setValue_raw = (value) -> try if @trimWhitespace then value = value.trim() - newParse = @mode.parse value, wrapAtRoot: true + newParse = @session.mode.parse value, wrapAtRoot: true - unless @tree.start.next is @tree.end - removal = new model.List @tree.start.next, @tree.end.prev + unless @session.tree.start.next is @session.tree.end + removal = new model.List @session.tree.start.next, @session.tree.end.prev @spliceOut removal unless newParse.start.next is newParse.end - @spliceIn new model.List(newParse.start.next, newParse.end.prev), @tree.start + @spliceIn new model.List(newParse.start.next, newParse.end.prev), @session.tree.start @removeBlankLines() @redrawMain() @@ -3930,7 +3920,7 @@ Editor::setValue = (value) -> @aceEditor.session.setScrollTop oldScrollTop - if @currentlyUsingBlocks + if @session.currentlyUsingBlocks result = @setValue_raw value if result.success is false @setEditorState false @@ -3945,8 +3935,8 @@ Editor::addEmptyLine = (str) -> return str + '\n' Editor::getValue = -> - if @currentlyUsingBlocks - return @addEmptyLine @tree.stringify() + if @session.currentlyUsingBlocks + return @addEmptyLine @session.tree.stringify() else @getAceValue() @@ -3983,11 +3973,11 @@ Editor::hasEvent = (event) -> event of @bindings and @bindings[event]? Editor::setEditorState = (useBlocks) -> if useBlocks - unless @currentlyUsingBlocks + unless @session.currentlyUsingBlocks @setValue @getAceValue() @dropletElement.style.top = '0px' - if @paletteEnabled + if @session.paletteEnabled @paletteWrapper.style.top = @paletteWrapper.style.left = '0px' @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px" else @@ -3995,7 +3985,7 @@ Editor::setEditorState = (useBlocks) -> @dropletElement.style.left = '0px' @aceElement.style.top = @aceElement.style.left = '-9999px' - @currentlyUsingBlocks = true + @session.currentlyUsingBlocks = true @lineNumberWrapper.style.display = 'block' @@ -4007,11 +3997,11 @@ Editor::setEditorState = (useBlocks) -> else @hideDropdown() - paletteVisibleInNewState = @paletteEnabled and @showPaletteInTextMode + paletteVisibleInNewState = @session.paletteEnabled and @session.showPaletteInTextMode oldScrollTop = @aceEditor.session.getScrollTop() - if @currentlyUsingBlocks + if @session.currentlyUsingBlocks @setAceValue @getValue() @aceEditor.resize true @@ -4030,7 +4020,7 @@ Editor::setEditorState = (useBlocks) -> else @aceElement.style.left = '0px' - @currentlyUsingBlocks = false + @session.currentlyUsingBlocks = false @lineNumberWrapper.style.display = 'none' @@ -4073,7 +4063,7 @@ hook 'mousedown', 10, -> Editor::endDrag = -> # Ensure that the cursor is not in a socket. if @cursorAtSocket() - @setCursor @cursor, (x) -> x.type isnt 'socketStart' + @setCursor @session.cursor, (x) -> x.type isnt 'socketStart' @draggingBlock = null @draggingOffset = null @@ -4218,10 +4208,10 @@ Editor::strokeCursor = (point) -> @cursorCtx.lineWidth = 3 - w = @view.opts.tabWidth / 2 - CURSOR_WIDTH_DECREASE - h = @view.opts.tabHeight - CURSOR_HEIGHT_DECREASE + w = @session.view.opts.tabWidth / 2 - CURSOR_WIDTH_DECREASE + h = @session.view.opts.tabHeight - CURSOR_HEIGHT_DECREASE - arcCenter = new @draw.Point point.x + @view.opts.tabOffset + w + CURSOR_WIDTH_DECREASE, + arcCenter = new @draw.Point point.x + @session.view.opts.tabOffset + w + CURSOR_WIDTH_DECREASE, point.y - (w*w + h*h) / (2 * h) + h + CURSOR_HEIGHT_DECREASE / 2 arcAngle = Math.atan2 w, (w*w + h*h) / (2 * h) - h startAngle = 0.5 * Math.PI - arcAngle @@ -4283,14 +4273,14 @@ hook 'populate', 0, -> # ================================ # TODO possibly move this next utility function to view? -Editor::viewOrChildrenContains = (model, point, view = @view) -> +Editor::viewOrChildrenContains = (model, point, view = @session.view) -> modelView = view.getViewNodeFor model if modelView.path.contains point return true for childObj in modelView.children - if @viewOrChildrenContains childObj.child, point, view + if @session.viewOrChildrenContains childObj.child, point, view return true return false @@ -4341,7 +4331,7 @@ hook 'mousedown', 11, (point, event, state) -> # Find the line that was clicked mainPoint = @trackerPointToMain point - treeView = @view.getViewNodeFor @tree + treeView = @session.view.getViewNodeFor @session.tree clickedLine = @findLineNumberAtCoordinate mainPoint.y @fireEvent 'guttermousedown', [{line: clickedLine, event: event}] @@ -4392,7 +4382,7 @@ Editor::resizeGutter = -> @mainScrollerStuffing.offsetHeight)}px" Editor::addLineNumberForLine = (line) -> - treeView = @view.getViewNodeFor @tree + treeView = @session.view.getViewNodeFor @session.tree if line of @lineNumberTags lineDiv = @lineNumberTags[line] @@ -4427,11 +4417,11 @@ Editor::addLineNumberForLine = (line) -> lineDiv.style.top = "#{treeView.bounds[line].y}px" - lineDiv.style.paddingTop = "#{treeView.distanceToBase[line].above - @view.opts.textHeight - @fontAscent}px" - lineDiv.style.paddingBottom = "#{treeView.distanceToBase[line].below - @fontDescent}" + lineDiv.style.paddingTop = "#{treeView.distanceToBase[line].above - @session.view.opts.textHeight - @session.fontAscent}px" + lineDiv.style.paddingBottom = "#{treeView.distanceToBase[line].below - @session.fontDescent}" lineDiv.style.height = treeView.bounds[line].height + 'px' - lineDiv.style.fontSize = @fontSize + 'px' + lineDiv.style.fontSize = @session.fontSize + 'px' @lineNumberWrapper.appendChild lineDiv @@ -4445,7 +4435,7 @@ getMostSevereAnnotationType = (arr) -> TYPE_FROM_SEVERITY[Math.max.apply(this, arr.map((x) -> TYPE_SEVERITY[x.type]))] Editor::findLineNumberAtCoordinate = (coord) -> - treeView = @view.getViewNodeFor @tree + treeView = @session.view.getViewNodeFor @session.tree start = 0; end = treeView.bounds.length pivot = Math.floor (start + end) / 2 @@ -4469,10 +4459,10 @@ hook 'redraw_main', 0, (changedBox) -> @redrawGutter(changedBox) Editor::redrawGutter = (changedBox = true) -> - treeView = @view.getViewNodeFor @tree + treeView = @session.view.getViewNodeFor @session.tree - top = @findLineNumberAtCoordinate @scrollOffsets.main.y - bottom = @findLineNumberAtCoordinate @scrollOffsets.main.y + @mainCanvas.height + top = @findLineNumberAtCoordinate @session.scrollOffsets.main.y + bottom = @findLineNumberAtCoordinate @session.scrollOffsets.main.y + @mainCanvas.height for line in [top..bottom] @addLineNumberForLine line @@ -4509,7 +4499,7 @@ hook 'populate', 1, -> pressedXKey = true @copyPasteInput.addEventListener 'input', => - if @readOnly + if @session.readOnly return if pressedVKey and not @cursorAtSocket() str = @copyPasteInput.value; lines = str.split '\n' @@ -4521,7 +4511,7 @@ hook 'populate', 1, -> str = str.replace /^\n*|\n*$/g, '' try - blocks = @mode.parse str + blocks = @session.mode.parse str blocks = new model.List blocks.start.next, blocks.end.prev catch e blocks = null @@ -4562,13 +4552,13 @@ hook 'keyup', 0, (point, event, state) -> # ================================ Editor::overflowsX = -> - @documentDimensions().width > @viewportDimensions().width + @documentDimensions().width > @session.viewportDimensions().width Editor::overflowsY = -> - @documentDimensions().height > @viewportDimensions().height + @documentDimensions().height > @session.viewportDimensions().height Editor::documentDimensions = -> - bounds = @view.getViewNodeFor(@tree).totalBounds + bounds = @session.view.getViewNodeFor(@session.tree).totalBounds return { width: bounds.width height: bounds.height @@ -4583,8 +4573,8 @@ Editor::viewportDimensions = -> # LINE LOCATION API # ================= Editor::getLineMetrics = (row) -> - viewNode = @view.getViewNodeFor @tree - bounds = (new @view.draw.Rectangle()).copy(viewNode.bounds[row]) + viewNode = @session.view.getViewNodeFor @session.tree + bounds = (new @session.view.draw.Rectangle()).copy(viewNode.bounds[row]) bounds.x += @mainCanvas.offsetLeft + @mainCanvas.offsetParent.offsetLeft return { bounds: bounds @@ -4600,7 +4590,7 @@ Editor::dumpNodeForDebug = (hitTestResult, line) -> console.log('Model node:') console.log(hitTestResult.serialize()) console.log('View node:') - console.log(@view.getViewNodeFor(hitTestResult).serialize(line)) + console.log(@session.view.getViewNodeFor(hitTestResult).serialize(line)) # CLOSING FOUNDATIONAL STUFF # ================================ diff --git a/src/helper.coffee b/src/helper.coffee index 10f041d0..ab6986c1 100644 --- a/src/helper.coffee +++ b/src/helper.coffee @@ -108,15 +108,15 @@ exports.fontMetrics = fontMetrics = (fontFamily, fontHeight) -> exports.clipLines = (lines, start, end) -> if start.line isnt end.line - console.log 'pieces:', - "'#{lines[start.line][start.column..]}'", - "'#{lines[start.line + 1...end.line].join('\n')}'", - "'#{lines[end.line][...end.column]}'" + #console.log 'pieces:', + # "'#{lines[start.line][start.column..]}'", + # "'#{lines[start.line + 1...end.line].join('\n')}'", + # "'#{lines[end.line][...end.column]}'" return lines[start.line][start.column..] + lines[start.line + 1...end.line].join('\n') + lines[end.line][...end.column] else - console.log 'clipping', lines[start.line], 'from', start.column + 1, 'to', end.column + #console.log 'clipping', lines[start.line], 'from', start.column + 1, 'to', end.column return lines[start.line][start.column...end.column] exports.getFontHeight = (family, size) -> diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 96afea17..054c8fce 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -142,7 +142,7 @@ exports.createTreewalkParser = (parse, config, root) -> if child.children.length > 0 break else unless helper.clipLines(@lines, origin, child.bounds.end).trim().length is 0 - console.log 'excluding start', helper.clipLines(@lines, origin, child.bounds.end) + #console.log 'excluding start', helper.clipLines(@lines, origin, child.bounds.end) start = child.bounds.end end = node.children[node.children.length - 1].bounds.end diff --git a/test/src/tests.coffee b/test/src/tests.coffee index 369be2b9..2774b89c 100644 --- a/test/src/tests.coffee +++ b/test/src/tests.coffee @@ -498,76 +498,76 @@ asyncTest 'Controller: cursor motion and rendering', -> strictEqual editor.determineCursorPosition().x, 0, 'Cursor position correct after \'alert 10\' (x - down)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 1 * editor.view.opts.textHeight + - 2 * editor.view.opts.padding + - 2 * editor.view.opts.textPadding, 'Cursor position correct after \'alert 10\' (y - down)' + 1 * editor.session.view.opts.textHeight + + 2 * editor.session.view.opts.padding + + 2 * editor.session.view.opts.textPadding, 'Cursor position correct after \'alert 10\' (y - down)' moveCursorDown() - strictEqual editor.determineCursorPosition().x, editor.view.opts.indentWidth, + strictEqual editor.determineCursorPosition().x, editor.session.view.opts.indentWidth, 'Cursor position correct after \'if a is b\' (x - down)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 2 * editor.view.opts.textHeight + - 6 * editor.view.opts.padding + - 4 * editor.view.opts.textPadding, 'Cursor position correct after \'if a is b\' (y - down)' + 2 * editor.session.view.opts.textHeight + + 6 * editor.session.view.opts.padding + + 4 * editor.session.view.opts.textPadding, 'Cursor position correct after \'if a is b\' (y - down)' moveCursorDown() - strictEqual editor.determineCursorPosition().x, editor.view.opts.indentWidth, + strictEqual editor.determineCursorPosition().x, editor.session.view.opts.indentWidth, 'Cursor position correct after \'alert 20\' (x - down)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 3 * editor.view.opts.textHeight + - 8 * editor.view.opts.padding + - 6 * editor.view.opts.textPadding, 'Cursor position correct after \'alert 20\' (y - down)' + 3 * editor.session.view.opts.textHeight + + 8 * editor.session.view.opts.padding + + 6 * editor.session.view.opts.textPadding, 'Cursor position correct after \'alert 20\' (y - down)' moveCursorDown() - strictEqual editor.determineCursorPosition().x, editor.view.opts.indentWidth, + strictEqual editor.determineCursorPosition().x, editor.session.view.opts.indentWidth, 'Cursor position correct at end of indent (x - down)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 4 * editor.view.opts.textHeight + - 10 * editor.view.opts.padding + - 8 * editor.view.opts.textPadding, 'Cursor position at end of indent (y - down)' + 4 * editor.session.view.opts.textHeight + + 10 * editor.session.view.opts.padding + + 8 * editor.session.view.opts.textPadding, 'Cursor position at end of indent (y - down)' moveCursorDown() - strictEqual editor.cursor.location.type, 'indentStart', 'Cursor skipped middle of block' + strictEqual editor.session.cursor.location.type, 'indentStart', 'Cursor skipped middle of block' moveCursorUp() - strictEqual editor.determineCursorPosition().x, editor.view.opts.indentWidth, + strictEqual editor.determineCursorPosition().x, editor.session.view.opts.indentWidth, 'Cursor position correct at end of indent (x - up)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 4 * editor.view.opts.textHeight + - 10 * editor.view.opts.padding + - 8 * editor.view.opts.textPadding, 'Cursor position at end of indent (y - up)' + 4 * editor.session.view.opts.textHeight + + 10 * editor.session.view.opts.padding + + 8 * editor.session.view.opts.textPadding, 'Cursor position at end of indent (y - up)' moveCursorUp() - strictEqual editor.determineCursorPosition().x, editor.view.opts.indentWidth, + strictEqual editor.determineCursorPosition().x, editor.session.view.opts.indentWidth, 'Cursor position correct after \'alert 20\' (x - up)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 3 * editor.view.opts.textHeight + - 8 * editor.view.opts.padding + - 6 * editor.view.opts.textPadding, 'Cursor position correct after \'alert 20\' (y - up)' + 3 * editor.session.view.opts.textHeight + + 8 * editor.session.view.opts.padding + + 6 * editor.session.view.opts.textPadding, 'Cursor position correct after \'alert 20\' (y - up)' moveCursorUp() - strictEqual editor.determineCursorPosition().x, editor.view.opts.indentWidth, + strictEqual editor.determineCursorPosition().x, editor.session.view.opts.indentWidth, 'Cursor position correct after \'if a is b\' (y - up)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 2 * editor.view.opts.textHeight + - 6 * editor.view.opts.padding + - 4 * editor.view.opts.textPadding, 'Cursor position correct after \'if a is b\' (y - up)' + 2 * editor.session.view.opts.textHeight + + 6 * editor.session.view.opts.padding + + 4 * editor.session.view.opts.textPadding, 'Cursor position correct after \'if a is b\' (y - up)' moveCursorUp() strictEqual editor.determineCursorPosition().x, 0, 'Cursor position correct after \'alert 10\' (x - up)' strictEqual editor.determineCursorPosition().y, editor.nubbyHeight + - 1 * editor.view.opts.textHeight + - 2 * editor.view.opts.padding + - 2 * editor.view.opts.textPadding, 'Cursor position correct after \'alert 10\' (y - up)' + 1 * editor.session.view.opts.textHeight + + 2 * editor.session.view.opts.padding + + 2 * editor.session.view.opts.textPadding, 'Cursor position correct after \'alert 10\' (y - up)' moveCursorUp() @@ -637,11 +637,11 @@ asyncTest 'Controller: arbitrary row/column marking', -> key = editor.mark {row: 2, col: 4}, {color: '#F00'} - strictEqual editor.markedBlocks[key].model.stringify({}), '10 - 10' - strictEqual editor.markedBlocks[key].style.color, '#F00' + strictEqual editor.session.markedBlocks[key].model.stringify({}), '10 - 10' + strictEqual editor.session.markedBlocks[key].style.color, '#F00' editor.unmark key - ok key not of editor.markedBlocks + ok key not of editor.session.markedBlocks start() asyncTest 'Controller: dropdown menus', -> @@ -670,10 +670,10 @@ asyncTest 'Controller: dropdown menus', -> ''' # Assert that the arrow is there - strictEqual Math.round(editor.view.getViewNodeFor(editor.tree.getBlockOnLine(0)).bounds[0].width), 90 + strictEqual Math.round(editor.session.view.getViewNodeFor(editor.session.tree.getBlockOnLine(0)).bounds[0].width), 90 # no-throw - editor.setCursor editor.tree.getBlockOnLine(0).end.prev.container.start + editor.setCursor editor.session.tree.getBlockOnLine(0).end.prev.container.start editor.showDropdown() start() @@ -703,10 +703,10 @@ asyncTest 'Controller: dropdown menus with functions', -> ''' # Assert that the arrow is there - strictEqual Math.round(editor.view.getViewNodeFor(editor.tree.getBlockOnLine(0)).bounds[0].width), 90 + strictEqual Math.round(editor.session.view.getViewNodeFor(editor.session.tree.getBlockOnLine(0)).bounds[0].width), 90 # no-throw - editor.setCursor editor.tree.getBlockOnLine(0).end.prev.container.start + editor.setCursor editor.session.tree.getBlockOnLine(0).end.prev.container.start editor.showDropdown() start() diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee index 2ab74a0f..ec9ce9e1 100644 --- a/test/src/uitest.coffee +++ b/test/src/uitest.coffee @@ -245,7 +245,7 @@ asyncTest 'Controller: does not throw on reparse error', -> ok(true, 'Does not throw on reparse') foundErrorMark = false - for key, val of editor.markedBlocks + for key, val of editor.session.markedBlocks if val.model.stringify() is '18n' and val.style.color is '#F00' foundErrorMark = true @@ -288,14 +288,14 @@ asyncTest 'Controller: Can replace a block where we found it', -> getRandomDragOp = (editor, rng) -> # Find the locations of all the blocks - head = editor.tree.start + head = editor.session.tree.start # Skip the first block if it is the entire document - if head.next.container?.end is editor.tree.end.prev + if head.next.container?.end is editor.session.tree.end.prev head = head.next.next dragPossibilities = [] - until head is editor.tree.end + until head is editor.session.tree.end if head.type is 'blockStart' - bound = editor.view.getViewNodeFor(head.container).bounds[0] + bound = editor.session.view.getViewNodeFor(head.container).bounds[0] handle = {x: bound.x + 5, y: bound.y + 5} dragPossibilities.push { block: head.container @@ -306,17 +306,17 @@ getRandomDragOp = (editor, rng) -> drag = dragPossibilities[Math.floor rng() * dragPossibilities.length] # Find all the drop areas - head = editor.tree.start + head = editor.session.tree.start # Disclude the main tree if we're dragging the first block if drag is dragPossibilities[0] head = head.next dropPossibilities = [] - until head is editor.tree.end + until head is editor.session.tree.end if head is drag.block.start head = drag.block.end if head.type.match(/Start$/)? - dropPoint = editor.view.getViewNodeFor(head.container).dropPoint + dropPoint = editor.session.view.getViewNodeFor(head.container).dropPoint if dropPoint? if head.container.type is 'block' parent = head.container.parent @@ -345,11 +345,11 @@ generateRandomAlphabetic = (rng) -> return str getRandomTextOp = (editor, rng) -> - head = editor.tree.start + head = editor.session.tree.start socketPossibilities = [] - until head is editor.tree.end + until head is editor.session.tree.end if head.type is 'socketStart' and head.container.editable() - bound = editor.view.getViewNodeFor(head.container).bounds[0] + bound = editor.session.view.getViewNodeFor(head.container).bounds[0] handle = {x: bound.x + 5, y: bound.y + 5} socketPossibilities.push { block: head.container @@ -427,7 +427,7 @@ performDragOperation = (editor, drag, cb) -> pickUpLocation = (editor, document, location) -> block = editor.getDocument(document).getFromTextLocation(location) - bound = editor.view.getViewNodeFor(block).bounds[0] + bound = editor.session.view.getViewNodeFor(block).bounds[0] simulate('mousedown', editor.mainScrollerStuffing, { dx: bound.x + editor.gutter.offsetWidth + 5, dy: bound.y + 5 @@ -440,7 +440,7 @@ pickUpLocation = (editor, document, location) -> dropLocation = (editor, document, location) -> block = editor.getDocument(document).getFromTextLocation(location) - blockView = editor.view.getViewNodeFor block + blockView = editor.session.view.getViewNodeFor block simulate('mousemove', editor.dragCover, { location: editor.mainCanvas dx: blockView.dropPoint.x + 5, @@ -612,8 +612,8 @@ asyncTest 'Controller: Quoted string selection', -> editor.setEditorState(true) editor.setValue('fd "hello"') - entity = editor.tree.getFromTextLocation({row: 0, col: 'fd '.length, type: 'socket'}) - {x, y} = editor.view.getViewNodeFor(entity).bounds[0] + entity = editor.session.tree.getFromTextLocation({row: 0, col: 'fd '.length, type: 'socket'}) + {x, y} = editor.session.view.getViewNodeFor(entity).bounds[0] simulate('mousedown', editor.mainScrollerStuffing, { dx: x + 5 + editor.gutter.offsetWidth @@ -662,8 +662,8 @@ asyncTest 'Controller: Quoted string CoffeeScript autoescape', -> editor.setEditorState(true) editor.setValue("fd 'hello'") - entity = editor.tree.getFromTextLocation({row: 0, col: 'fd '.length, type: 'socket'}) - {x, y} = editor.view.getViewNodeFor(entity).bounds[0] + entity = editor.session.tree.getFromTextLocation({row: 0, col: 'fd '.length, type: 'socket'}) + {x, y} = editor.session.view.getViewNodeFor(entity).bounds[0] executeAsyncSequence [ (-> From 43a49affd0414b7d6e3092bbe2743340b77ce8b8 Mon Sep 17 00:00:00 2001 From: Takahiko Tsuchiya Date: Mon, 13 Jun 2016 14:09:32 -0400 Subject: [PATCH 102/268] implement handleButton for extending if/elses --- src/languages/python.coffee | 32 +++++++++++++++++++++++++++++++- src/treewalk.coffee | 3 +++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/languages/python.coffee b/src/languages/python.coffee index fbeac278..e8a3ca42 100644 --- a/src/languages/python.coffee +++ b/src/languages/python.coffee @@ -76,7 +76,35 @@ getDropdown = (opts, node) -> getColor = (opts, node) -> if getArgNum(node) is null return opts.functions?[getFunctionName(node)]?.color ? null - + +insertButton = (opts, node) -> + if node.type is 'if_stmt' + return {addButton: true} + else + return null + +handelButton = (text, button, oldBlocks) -> + checkElif = (node) -> + res = 'init' + if node.type is 'if_stmt' + node.children?.forEach((c) -> if c.type is 'T_KEYWORD' then res = c.meta.value) + else + node.children?.forEach((c) -> res = checkElif(c)) + return res + + if button is 'add-button' and 'if_stmt' in oldBlocks.classes + node = parse({}, text).children[0] + elif = checkElif(node) + + if elif is 'if' or elif is 'elif' + text += '''\nelse:\n print \'hi\'''' + else if elif is 'else' + text = text.replace('else:', 'elif a == b:') + text += '''\nelse:\n print \'hi\'''' + + return text + + transform = (node, lines, parent = null) -> type = skulpt.tables.ParseTables.number2symbol[node.type] ? skulpt.Tokenizer.tokenNames[node.type] ? node.type @@ -142,6 +170,8 @@ config = { BLOCK_TOKENS: [], PLAIN_SOCKETS: [], VALUE_TYPES: [], BLOCK_TYPES: [] DROPDOWN_CB: getDropdown COLOR_CB: getColor + BUTTON_CB: insertButton + HANDLE_BUTTON_CB: handelButton } result = treewalk.createTreewalkParser parse, config diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 68071f29..8a342c8f 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -101,6 +101,7 @@ exports.createTreewalkParser = (parse, config, root) -> color: config.COLOR_CB(@opts, node) ? @getColor rules classes: rules.concat(if context? then @getDropType(context) else 'any-drop') parseContext: (if wrap? then wrap.type else rules[0]) + buttons: config.BUTTON_CB(@opts, node) ? null when 'parens' # Parens are assumed to wrap the only child that has children @@ -187,4 +188,6 @@ exports.createTreewalkParser = (parse, config, root) -> # Doesn't yet deal with parens TreewalkParser.parens = (leading, trailing, node, context) -> + TreewalkParser.handleButton = config.HANDLE_BUTTON_CB + return TreewalkParser From f7ddb4d2b95453baec5279c2bd6c97ce57ea486e Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 13 Jun 2016 15:52:15 -0400 Subject: [PATCH 103/268] Make sessions bind to ace editor sessions --- src/controller.coffee | 134 +++++++++++++++++++++++++++++------------- 1 file changed, 93 insertions(+), 41 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 09dd195c..d9746eaa 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -51,6 +51,25 @@ isOSX = /OS X/.test(userAgent) command_modifiers = if isOSX then META_KEYS else CONTROL_KEYS command_pressed = (e) -> if isOSX then e.metaKey else e.ctrlKey +class PairDict + constructor: (@pairs) -> + + get: (index) -> + for el, i in @pairs + if el[0] is index + return el[1] + + contains: (index) -> + @pairs.some (x) -> x[0] is index + + set: (index, value) -> + for el, i in @pairs + if el[0] is index + el[1] = index + return true + @pairs.push [index, value] + return false + # FOUNDATION # ================================ @@ -104,7 +123,7 @@ class Session if @options.mode of modes @mode = new modes[@options.mode] @options.modeOptions else - @mode = new coffee @options.modeOptions + @mode = null # Instantiate an Droplet editor view @view = new view.View standardViewSettings @@ -236,7 +255,43 @@ exports.Editor = class Editor ctx: @mainCtx draw: @draw + @aceElement = document.createElement 'div' + @aceElement.className = 'droplet-ace' + + @wrapperElement.appendChild @aceElement + + @aceEditor = ace.edit @aceElement + + @aceEditor.setTheme 'ace/theme/chrome' + @aceEditor.setFontSize 15 + acemode = @options.mode + if acemode is 'coffeescript' then acemode = 'coffee' + @aceEditor.getSession().setMode 'ace/mode/' + acemode + @aceEditor.getSession().setTabSize 2 + + @currentlyAnimating = false + + @transitionContainer = document.createElement 'div' + @transitionContainer.className = 'droplet-transition-container' + + @dropletElement.appendChild @transitionContainer + @session = new Session @, @options, @standardViewSettings + @sessions = new PairDict([ + [@aceEditor.getSession(), @session] + ]) + + @blankSession = new Session @, {mode: '', palette: []}, @standardViewSettings + + # Sessions are bound to other ace sessions; + # on ace session change Droplet will also change sessions. + @aceEditor.on 'changeSession', (e) => + if @sessions.contains(e.session) + @session = @sessions.get(e.session) + @updateNewSession() + else + @setEditorState false + @session = @blankSession # Set up event bindings before creating a view @bindings = {} @@ -407,6 +462,24 @@ exports.Editor = class Editor else @resizeTextMode() + updateNewSession: -> + @setEditorState @session.currentlyUsingBlocks + @redrawMain() + @rebuildPalette() + @redrawPalette() + + bindNewSession: (opts) -> + if @sessions.contains(@aceEditor.getSession()) + throw new ArgumentError 'Cannot bind a new session where one already exists.' + else + session = new Session @, opts, @standardViewSettings + @sessions.set(@aceEditor.getSession(), session) + @session = session + @session.currentlyUsingBlocks = false + @setValue @getAceValue() + @setPalette @session.paletteGroups + return session + # RENDERING CAPABILITIES # ================================ @@ -670,7 +743,7 @@ Editor::redrawPalette = -> @paletteCanvas.height ) - for entry in @currentPaletteBlocks + for entry in @session.currentPaletteBlocks # Layout this block paletteBlockView = @session.paletteView.getViewNodeFor entry.block paletteBlockView.layout PALETTE_LEFT_MARGIN, lastBottomEdge @@ -1835,9 +1908,10 @@ parseBlock = (mode, code) => Editor::setPalette = (paletteGroups) -> @paletteHeader.innerHTML = '' @session.paletteGroups = paletteGroups + console.log 'setting palette' - @currentPaletteBlocks = [] - @currentPaletteMetadata = [] + @session.currentPaletteBlocks = [] + @session.currentPaletteMetadata = [] paletteHeaderRow = null @@ -1908,21 +1982,21 @@ Editor::changePaletteGroup = (group) -> return # Record that we are the selected group now - @currentPaletteGroup = paletteGroup.name - @currentPaletteBlocks = paletteGroup.parsedBlocks - @currentPaletteMetadata = paletteGroup.parsedBlocks + @session.currentPaletteGroup = paletteGroup.name + @session.currentPaletteBlocks = paletteGroup.parsedBlocks + @session.currentPaletteMetadata = paletteGroup.parsedBlocks # Unapply the "selected" style to the current palette group header - @currentPaletteGroupHeader?.className = - @currentPaletteGroupHeader.className.replace( + @session.currentPaletteGroupHeader?.className = + @session.currentPaletteGroupHeader.className.replace( /\s[-\w]*-selected\b/, '') # Now we are the current palette group header - @currentPaletteGroupHeader = paletteGroup.header + @session.currentPaletteGroupHeader = paletteGroup.header @currentPaletteIndex = i # Apply the "selected" style to us - @currentPaletteGroupHeader.className += + @session.currentPaletteGroupHeader.className += ' droplet-palette-group-header-selected' # Redraw the palette. @@ -1946,7 +2020,7 @@ hook 'mousedown', 6, (point, event, state) -> state.consumedHitTest = true return - for entry in @currentPaletteBlocks + for entry in @session.currentPaletteBlocks hitTestResult = @hitTest palettePoint, entry.block, @session.paletteView if hitTestResult? @@ -1988,7 +2062,7 @@ hook 'rebuild_palette', 1, -> @currentHighlightedPaletteBlock = null # Add new blocks - for data in @currentPaletteMetadata + for data in @session.currentPaletteMetadata block = data.block hoverDiv = document.createElement 'div' @@ -2012,7 +2086,7 @@ hook 'rebuild_palette', 1, -> hoverDiv.addEventListener 'mousemove', (event) => palettePoint = @trackerPointToPalette new @draw.Point( event.clientX, event.clientY) - if @session.viewOrChildrenContains block, palettePoint, @session.paletteView + if @viewOrChildrenContains block, palettePoint, @session.paletteView @clearPaletteHighlightCanvas() @paletteHighlightPath = @getHighlightPath block, {color: '#FF0'}, @session.paletteView @paletteHighlightPath.draw @paletteHighlightCtx @@ -2470,7 +2544,7 @@ Editor::hitTestTextInputInPalette = (point, block) -> return null Editor::handleTextInputClickInPalette = (palettePoint) -> - for entry in @currentPaletteBlocks + for entry in @session.currentPaletteBlocks hitTestResult = @hitTestTextInputInPalette palettePoint, entry.block # If they have clicked a socket, check to see if it is a dropdown @@ -3139,28 +3213,6 @@ Editor::copyAceEditor = -> @resizeBlockMode() return @setValue_raw @getAceValue() -hook 'populate', 1, -> - @aceElement = document.createElement 'div' - @aceElement.className = 'droplet-ace' - - @wrapperElement.appendChild @aceElement - - @aceEditor = ace.edit @aceElement - - @aceEditor.setTheme 'ace/theme/chrome' - @aceEditor.setFontSize 15 - acemode = @options.mode - if acemode is 'coffeescript' then acemode = 'coffee' - @aceEditor.getSession().setMode 'ace/mode/' + acemode - @aceEditor.getSession().setTabSize 2 - - @currentlyAnimating = false - - @transitionContainer = document.createElement 'div' - @transitionContainer.className = 'droplet-transition-container' - - @dropletElement.appendChild @transitionContainer - # For animation and ace editor, # we will need a couple convenience functions # for getting the "absolute"-esque position @@ -3728,7 +3780,7 @@ hook 'redraw_main', 1, -> hook 'redraw_palette', 0, -> bounds = new @draw.NoRectangle() - for entry in @currentPaletteBlocks + for entry in @session.currentPaletteBlocks bounds.unite @session.paletteView.getViewNodeFor(entry.block).getBounds() # For now, we will comment out this line @@ -4280,7 +4332,7 @@ Editor::viewOrChildrenContains = (model, point, view = @session.view) -> return true for childObj in modelView.children - if @session.viewOrChildrenContains childObj.child, point, view + if @viewOrChildrenContains childObj.child, point, view return true return false @@ -4552,10 +4604,10 @@ hook 'keyup', 0, (point, event, state) -> # ================================ Editor::overflowsX = -> - @documentDimensions().width > @session.viewportDimensions().width + @documentDimensions().width > @viewportDimensions().width Editor::overflowsY = -> - @documentDimensions().height > @session.viewportDimensions().height + @documentDimensions().height > @viewportDimensions().height Editor::documentDimensions = -> bounds = @session.view.getViewNodeFor(@session.tree).totalBounds From aec63bfe2adff4427a1bff828fd999c6217808fb Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 13 Jun 2016 15:56:56 -0400 Subject: [PATCH 104/268] Remove extraneous log --- src/controller.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controller.coffee b/src/controller.coffee index d9746eaa..b99750f4 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -1908,7 +1908,6 @@ parseBlock = (mode, code) => Editor::setPalette = (paletteGroups) -> @paletteHeader.innerHTML = '' @session.paletteGroups = paletteGroups - console.log 'setting palette' @session.currentPaletteBlocks = [] @session.currentPaletteMetadata = [] From 91ad88f7c2d1560ec81b567d03d2a51eb3a3c50b Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 13 Jun 2016 16:30:45 -0400 Subject: [PATCH 105/268] Allow accepting ace editor as construction argument --- src/controller.coffee | 47 ++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index b99750f4..8547cdf9 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -174,7 +174,7 @@ class Session # ## The Editor Class exports.Editor = class Editor - constructor: (@wrapperElement, @options) -> + constructor: (@aceEditor, @options) -> # ## DOM Population # This stage of ICE Editor construction populates the given wrapper # element with all the necessary ICE editor components. @@ -189,11 +189,6 @@ exports.Editor = class Editor # We give our element a tabIndex so that it can be focused and capture keypresses. @dropletElement.tabIndex = 0 - # Append that div. - @wrapperElement.appendChild @dropletElement - - @wrapperElement.style.backgroundColor = '#FFF' - # ### Canvases # Create the palette and main canvases @@ -231,8 +226,6 @@ exports.Editor = class Editor @dropletElement.style.left = @paletteWrapper.offsetWidth + 'px' - @wrapperElement.appendChild @paletteWrapper - @draw = new draw.Draw() do @draw.refreshFontCapital @@ -255,19 +248,37 @@ exports.Editor = class Editor ctx: @mainCtx draw: @draw - @aceElement = document.createElement 'div' - @aceElement.className = 'droplet-ace' + # We can be passed a div + if @aceEditor instanceof Node + @wrapperElement = @aceEditor + + + @aceElement = document.createElement 'div' + @aceElement.className = 'droplet-ace' - @wrapperElement.appendChild @aceElement + @wrapperElement.appendChild @aceElement - @aceEditor = ace.edit @aceElement + @aceEditor = ace.edit @aceElement - @aceEditor.setTheme 'ace/theme/chrome' - @aceEditor.setFontSize 15 - acemode = @options.mode - if acemode is 'coffeescript' then acemode = 'coffee' - @aceEditor.getSession().setMode 'ace/mode/' + acemode - @aceEditor.getSession().setTabSize 2 + @aceEditor.setTheme 'ace/theme/chrome' + @aceEditor.setFontSize 15 + acemode = @options.mode + if acemode is 'coffeescript' then acemode = 'coffee' + @aceEditor.getSession().setMode 'ace/mode/' + acemode + @aceEditor.getSession().setTabSize 2 + + else + @wrapperElement = document.createElement 'div' + @wrapperElement.className = 'droplet-editor' + + @aceEditor.container.parentElement.appendChild @wrapperElement + @wrapperElement.appendChild @aceEditor.container + + # Append populated divs + @wrapperElement.appendChild @dropletElement + @wrapperElement.appendChild @paletteWrapper + + @wrapperElement.style.backgroundColor = '#FFF' @currentlyAnimating = false From 10f9eb85f6ea756e4f6c1d1c86548b2e76ef1afc Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 13 Jun 2016 17:59:57 -0400 Subject: [PATCH 106/268] A couple bug fixes for ace initialization --- example/example.coffee | 5 +++-- example/example.html | 4 ++-- src/controller.coffee | 8 ++++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/example/example.coffee b/example/example.coffee index 654234e8..c1e9b974 100644 --- a/example/example.coffee +++ b/example/example.coffee @@ -42,8 +42,9 @@ editor = null # Droplet itself createEditor = (options) -> - $('#droplet-editor').html '' - editor = new droplet.Editor $('#droplet-editor')[0], options + $('#droplet-editor').html '
' + aceEditor = ace.edit 'ace-target' + editor = new droplet.Editor aceEditor, options editor.setEditorState localStorage.getItem('blocks') is 'yes' editor.aceEditor.getSession().setUseWrapMode true diff --git a/example/example.html b/example/example.html index fec90e1c..abd8a947 100644 --- a/example/example.html +++ b/example/example.html @@ -15,12 +15,12 @@ #droplet-config { position: absolute; top: 25; bottom: 0; left: 0; right: 0; - } + }/* #droplet-editor { position: absolute; top: 25; bottom: 0; right: 0; left: 0; overflow: hidden; - } + }*/ #right-panel { position: absolute; top: 0; bottom: 0; left: 525px; right: 0; diff --git a/src/controller.coffee b/src/controller.coffee index 8547cdf9..85131bca 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -252,7 +252,6 @@ exports.Editor = class Editor if @aceEditor instanceof Node @wrapperElement = @aceEditor - @aceElement = document.createElement 'div' @aceElement.className = 'droplet-ace' @@ -269,7 +268,12 @@ exports.Editor = class Editor else @wrapperElement = document.createElement 'div' - @wrapperElement.className = 'droplet-editor' + @wrapperElement.style.position = 'absolute' + @wrapperElement.style.right = @wrapperElement.style.left = @wrapperElement.style.top = @wrapperElement.style.bottom = '0px' + @wrapperElement.style.overflow = 'hidden' + + @aceElement = @aceEditor.container + @aceElement.className = 'droplet-ace' @aceEditor.container.parentElement.appendChild @wrapperElement @wrapperElement.appendChild @aceEditor.container From 18941425f52dde1d54a1b06827bad2480d523c89 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 14 Jun 2016 11:57:47 -0400 Subject: [PATCH 107/268] Palette wrapper prep for button --- css/droplet.css | 2 +- src/controller.coffee | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/css/droplet.css b/css/droplet.css index 61928f68..98f39b15 100644 --- a/css/droplet.css +++ b/css/droplet.css @@ -80,7 +80,7 @@ position: absolute; height: 100%; width: 100%; - overflow: hidden; + /*overflow: hidden;*/ } .droplet-palette-header { z-index: 257; diff --git a/src/controller.coffee b/src/controller.coffee index 8547cdf9..4cab5f28 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -3454,9 +3454,9 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - else @aceElement.style.left = '0px' - if paletteDisappearingWithMelt - @paletteWrapper.style.top = '-9999px' - @paletteWrapper.style.left = '-9999px' + #if paletteDisappearingWithMelt + # @paletteWrapper.style.top = '-9999px' + # @paletteWrapper.style.left = '-9999px' @dropletElement.style.top = '-9999px' @dropletElement.style.left = '-9999px' @@ -3673,8 +3673,8 @@ Editor::enablePalette = (enabled) -> activeElement.style.transition = @paletteWrapper.style.transition = '' - @paletteWrapper.style.top = '-9999px' - @paletteWrapper.style.left = '-9999px' + #@paletteWrapper.style.top = '-9999px' + #@paletteWrapper.style.left = '-9999px' @currentlyAnimating = false @@ -4043,7 +4043,8 @@ Editor::setEditorState = (useBlocks) -> @paletteWrapper.style.top = @paletteWrapper.style.left = '0px' @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px" else - @paletteWrapper.style.top = @paletteWrapper.style.left = '-9999px' + @paletteWrapper.style.top = '0px' + @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px" @dropletElement.style.left = '0px' @aceElement.style.top = @aceElement.style.left = '-9999px' @@ -4074,7 +4075,8 @@ Editor::setEditorState = (useBlocks) -> if paletteVisibleInNewState @paletteWrapper.style.top = @paletteWrapper.style.left = '0px' else - @paletteWrapper.style.top = @paletteWrapper.style.left = '-9999px' + @paletteWrapper.style.top = '0px' + @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px" @aceElement.style.top = '0px' if paletteVisibleInNewState From f251a8064b77732004c7f269d43c9a75b1fbe115 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 14 Jun 2016 11:58:38 -0400 Subject: [PATCH 108/268] Attach sessions to ace sessions --- src/controller.coffee | 87 ++++++++++++++++++++++++++++++++----------- src/draw.coffee | 70 ++++++++++++++++++---------------- 2 files changed, 103 insertions(+), 54 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 85131bca..97a42547 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -108,7 +108,7 @@ hook = (event, priority, fn) -> } class Session - constructor: (@editor, @options, standardViewSettings) -> + constructor: (@options, standardViewSettings) -> # Option flags @readOnly = false @paletteGroups = @options.palette @@ -154,8 +154,8 @@ class Session # Scrolling @scrollOffsets = { - main: new @editor.draw.Point 0, 0 - palette: new @editor.draw.Point 0, 0 + main: new draw.Point 0, 0 + palette: new draw.Point 0, 0 } # Block toggle @@ -273,7 +273,7 @@ exports.Editor = class Editor @wrapperElement.style.overflow = 'hidden' @aceElement = @aceEditor.container - @aceElement.className = 'droplet-ace' + @aceElement.className += ' droplet-ace' @aceEditor.container.parentElement.appendChild @wrapperElement @wrapperElement.appendChild @aceEditor.container @@ -291,22 +291,23 @@ exports.Editor = class Editor @dropletElement.appendChild @transitionContainer - @session = new Session @, @options, @standardViewSettings + @session = new Session @options, @standardViewSettings @sessions = new PairDict([ [@aceEditor.getSession(), @session] ]) - @blankSession = new Session @, {mode: '', palette: []}, @standardViewSettings - # Sessions are bound to other ace sessions; # on ace session change Droplet will also change sessions. @aceEditor.on 'changeSession', (e) => if @sessions.contains(e.session) @session = @sessions.get(e.session) @updateNewSession() + else if e.session._dropletSession? + @session = e.session._dropletSession + @sessions.set(e.session, e.session._dropletSession) else + @session = null @setEditorState false - @session = @blankSession # Set up event bindings before creating a view @bindings = {} @@ -413,6 +414,8 @@ exports.Editor = class Editor @aceEditor.resize true resizeBlockMode: -> + return unless @session? + @resizeTextMode() @dropletElement.style.height = "#{@wrapperElement.clientHeight}px" @@ -478,18 +481,31 @@ exports.Editor = class Editor @resizeTextMode() updateNewSession: -> + return unless @session? + + # Force scroll into our position + offsetY =@session.scrollOffsets.main.y + offsetX = @session.scrollOffsets.main.x + @setEditorState @session.currentlyUsingBlocks + @redrawMain() - @rebuildPalette() - @redrawPalette() + + @mainScroller.scrollTop = offsetY + @mainScroller.scrollLeft = offsetX + + @setPalette @session.paletteGroups + + hasSessionFor: (aceSession) -> @sessions.contains(aceSession) bindNewSession: (opts) -> if @sessions.contains(@aceEditor.getSession()) throw new ArgumentError 'Cannot bind a new session where one already exists.' else - session = new Session @, opts, @standardViewSettings + session = new Session opts, @standardViewSettings @sessions.set(@aceEditor.getSession(), session) @session = session + e.session._dropletSession = @session @session.currentlyUsingBlocks = false @setValue @getAceValue() @setPalette @session.paletteGroups @@ -617,6 +633,7 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) -> } Editor::redrawMain = (opts = {}) -> + return unless @session? unless @currentlyAnimating_suprressRedraw # Set our draw tool's font size @@ -683,6 +700,7 @@ Editor::redrawMain = (opts = {}) -> return null Editor::redrawHighlights = -> + return unless @session? # Draw highlights around marked lines @clearHighlightCanvas() @@ -724,6 +742,7 @@ Editor::clearCursorCanvas = -> @cursorCtx.clearRect @session.scrollOffsets.main.x, @session.scrollOffsets.main.y, @cursorCanvas.width, @cursorCanvas.height Editor::redrawCursors = -> + return unless @session? @clearCursorCanvas() if @cursorAtSocket() @@ -743,6 +762,7 @@ Editor::clearPaletteHighlightCanvas = -> @paletteHighlightCanvas.width, @paletteHighlightCanvas.height Editor::redrawPalette = -> + return unless @session? @clearPalette() # We will construct a vertical layout @@ -909,10 +929,14 @@ Editor::getSerializedEditorState = -> } Editor::clearUndoStack = -> + return unless @session? + @session.undoStack.length = 0 @session.redoStack.length = 0 Editor::undo = -> + return unless @session? + # Don't allow a socket to be highlighted during # an undo operation @setCursor @session.cursor, ((x) -> x.type isnt 'socketStart') @@ -2176,7 +2200,7 @@ hook 'populate', 1, -> Editor::resizeAceElement = -> width = @wrapperElement.clientWidth - if @session.showPaletteInTextMode and @session.paletteEnabled + if @session?.showPaletteInTextMode and @session?.paletteEnabled width -= @paletteWrapper.offsetWidth @aceElement.style.width = "#{width}px" @@ -2186,6 +2210,8 @@ last_ = (array) -> array[array.length - 1] # Redraw function for text input Editor::redrawTextInput = -> + return unless @session? + sameLength = @getCursor().stringify().split('\n').length is @hiddenInput.value.split('\n').length dropletDocument = @getCursor().getDocument() @@ -2249,6 +2275,7 @@ Editor::redrawTextInput = -> @redrawMain() Editor::redrawTextHighlights = (scrollIntoView = false) -> + return unless @session? return unless @cursorAtSocket() textFocusView = @session.view.getViewNodeFor @getCursor() @@ -2850,6 +2877,8 @@ hook 'mousemove', 0, (point, event, state) -> break Editor::redrawLassoHighlight = -> + return unless @session? + if @lassoSelection? mainCanvasRectangle = new @draw.Rectangle( @session.scrollOffsets.main.x, @@ -3426,7 +3455,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - @mainCanvas.style.transition = @highlightCanvas.style.transition = - @cursorCanvas.style.opacity = "opacity #{fadeTime}ms linear" + @cursorCanvas.style.transition = "opacity #{fadeTime}ms linear" @mainCanvas.style.opacity = @highlightCanvas.style.opacity = @@ -3488,6 +3517,7 @@ Editor::aceFontSize = -> parseFloat(@aceEditor.getFontSize()) + 'px' Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)-> + return unless @session? if not @session.currentlyUsingBlocks and not @currentlyAnimating setValueResult = @copyAceEditor() @@ -3860,6 +3890,8 @@ Editor::getHighlightPath = (model, style, view = @session.view) -> return path Editor::markLine = (line, style) -> + return unless @session? + block = @session.tree.getBlockOnLine line if block? @@ -3870,6 +3902,8 @@ Editor::markLine = (line, style) -> @redrawHighlights() Editor::markBlock = (block, style) -> + return unless @session? + key = @nextMarkedBlockId++ @session.markedBlocks[key] = { @@ -3883,6 +3917,8 @@ Editor::markBlock = (block, style) -> # `mark(line, col, style)` will mark the first block after the given (line, col) coordinate # with the given style. Editor::mark = (location, style) -> + return unless @session? + block = @session.tree.getFromTextLocation location block = block.container ? block @@ -3978,6 +4014,8 @@ Editor::setValue_raw = (value) -> return success: false, error: e Editor::setValue = (value) -> + if not @session? + return @aceEditor.setValue value oldScrollTop = @aceEditor.session.getScrollTop() @@ -4001,7 +4039,7 @@ Editor::addEmptyLine = (str) -> return str + '\n' Editor::getValue = -> - if @session.currentlyUsingBlocks + if @session?.currentlyUsingBlocks return @addEmptyLine @session.tree.stringify() else @getAceValue() @@ -4038,7 +4076,13 @@ Editor::hasEvent = (event) -> event of @bindings and @bindings[event]? # ================================ Editor::setEditorState = (useBlocks) -> + @mainCanvas.style.transition = @paletteWrapper.style.transition = + @highlightCanvas.style.transition = '' + if useBlocks + if not @session? + throw new ArgumentError 'cannot switch to blocks if a session has not been set up.' + unless @session.currentlyUsingBlocks @setValue @getAceValue() @@ -4055,19 +4099,19 @@ Editor::setEditorState = (useBlocks) -> @lineNumberWrapper.style.display = 'block' - @mainCanvas.opacity = @paletteWrapper.opacity = - @highlightCanvas.opacity = 1 + @mainCanvas.style.opacity = + @highlightCanvas.style.opacity = 1 @resizeBlockMode(); @redrawMain() else @hideDropdown() - paletteVisibleInNewState = @session.paletteEnabled and @session.showPaletteInTextMode + paletteVisibleInNewState = @session?.paletteEnabled and @session.showPaletteInTextMode oldScrollTop = @aceEditor.session.getScrollTop() - if @session.currentlyUsingBlocks + if @session?.currentlyUsingBlocks @setAceValue @getValue() @aceEditor.resize true @@ -4086,12 +4130,12 @@ Editor::setEditorState = (useBlocks) -> else @aceElement.style.left = '0px' - @session.currentlyUsingBlocks = false + @session?.currentlyUsingBlocks = false @lineNumberWrapper.style.display = 'none' - @mainCanvas.opacity = - @highlightCanvas.opacity = 0 + @mainCanvas.style.opacity = + @highlightCanvas.style.opacity = 0 @resizeBlockMode() @@ -4525,6 +4569,7 @@ hook 'redraw_main', 0, (changedBox) -> @redrawGutter(changedBox) Editor::redrawGutter = (changedBox = true) -> + return unless @session? treeView = @session.view.getViewNodeFor @session.tree top = @findLineNumberAtCoordinate @session.scrollOffsets.main.y diff --git a/src/draw.coffee b/src/draw.coffee index 3e788b91..7bc1c793 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -67,42 +67,11 @@ exports.Draw = class Draw # ## Point ## # A point knows its x and y coordinate, and can do some vector operations. - @Point = class Point - constructor: (@x, @y) -> - - clone: -> new Point @x, @y - - magnitude: -> Math.sqrt @x * @x + @y * @y - - translate: (vector) -> - @x += vector.x; @y += vector.y - - add: (x, y) -> @x += x; @y += y - - plus: ({x, y}) -> new Point @x + x, @y + y - - toMagnitude: (mag) -> - r = mag / @magnitude() - return new Point @x * r, @y * r - - copy: (point) -> - @x = point.x; @y = point.y - return @ - - from: (point) -> new Point @x - point.x, @y - point.y - - clear: -> @x = @y = 0 - - equals: (point) -> point.x is @x and point.y is @y + @Point = Point # ## Size ## # A Size knows its width and height. - @Size = class Size - constructor: (@width, @height) -> - equals: (size) -> - @width is size.width and @height is size.height - @copy: (size) -> - new Size(size.width, size.height) + @Size = Size # ## Rectangle ## # A Rectangle knows its upper-left corner, width, and height, @@ -483,3 +452,38 @@ exports.Draw = class Draw @refreshFontCapital() getGlobalFontSize: -> @fontSize + +exports.Point = class Point + constructor: (@x, @y) -> + + clone: -> new Point @x, @y + + magnitude: -> Math.sqrt @x * @x + @y * @y + + translate: (vector) -> + @x += vector.x; @y += vector.y + + add: (x, y) -> @x += x; @y += y + + plus: ({x, y}) -> new Point @x + x, @y + y + + toMagnitude: (mag) -> + r = mag / @magnitude() + return new Point @x * r, @y * r + + copy: (point) -> + @x = point.x; @y = point.y + return @ + + from: (point) -> new Point @x - point.x, @y - point.y + + clear: -> @x = @y = 0 + + equals: (point) -> point.x is @x and point.y is @y + +exports.Size = class Size + constructor: (@width, @height) -> + equals: (size) -> + @width is size.width and @height is size.height + @copy: (size) -> + new Size(size.width, size.height) From cd69fd697cf2978971ca987ec9cdf9e977e0eb55 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 14 Jun 2016 12:11:10 -0400 Subject: [PATCH 109/268] Typo --- src/controller.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controller.coffee b/src/controller.coffee index cc78ab5f..a6d2ae8f 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -505,7 +505,7 @@ exports.Editor = class Editor session = new Session opts, @standardViewSettings @sessions.set(@aceEditor.getSession(), session) @session = session - e.session._dropletSession = @session + @aceEditor.getSession()._dropletSession = @session @session.currentlyUsingBlocks = false @setValue @getAceValue() @setPalette @session.paletteGroups From ff96f51d52db15aea013dc56e6b5bf15ef6ae7c7 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 14 Jun 2016 15:50:16 -0400 Subject: [PATCH 110/268] Fix live mode switch sessions --- example/example.html | 10 +++++---- src/controller.coffee | 48 ++++++++++++++++++++++++++++--------------- src/treewalk.coffee | 4 ++-- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/example/example.html b/example/example.html index abd8a947..8024ecf1 100644 --- a/example/example.html +++ b/example/example.html @@ -15,12 +15,12 @@ #droplet-config { position: absolute; top: 25; bottom: 0; left: 0; right: 0; - }/* - #droplet-editor { + } + #droplet-editor-wrapper { position: absolute; top: 25; bottom: 0; right: 0; left: 0; overflow: hidden; - }*/ + } #right-panel { position: absolute; top: 0; bottom: 0; left: 525px; right: 0; @@ -59,7 +59,9 @@
Toggle
-
+
+
+
diff --git a/src/controller.coffee b/src/controller.coffee index a6d2ae8f..278e029a 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -291,10 +291,14 @@ exports.Editor = class Editor @dropletElement.appendChild @transitionContainer - @session = new Session @options, @standardViewSettings - @sessions = new PairDict([ - [@aceEditor.getSession(), @session] - ]) + if @options? + @session = new Session @options, @standardViewSettings + @sessions = new PairDict([ + [@aceEditor.getSession(), @session] + ]) + else + @session = null + @sessions = new PairDict [] # Sessions are bound to other ace sessions; # on ace session change Droplet will also change sessions. @@ -378,7 +382,7 @@ exports.Editor = class Editor # If we were given an unrecognized mode or asked to start in text mode, # flip into text mode here - useBlockMode = @session.mode? && !@options.textModeAtStart + useBlockMode = @session?.mode? && !@options.textModeAtStart # Always call @setEditorState to ensure palette is positioned properly @setEditorState useBlockMode @@ -413,6 +417,11 @@ exports.Editor = class Editor @resizeAceElement() @aceEditor.resize true + if @session? + @resizePalette() + + return + resizeBlockMode: -> return unless @session? @@ -472,10 +481,13 @@ exports.Editor = class Editor @paletteCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y + unless @session?.currentlyUsingBlocks + @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px" + @rebuildPalette() resize: -> - if @session.currentlyUsingBlocks #TODO session + if @session?.currentlyUsingBlocks #TODO session @resizeBlockMode() else @resizeTextMode() @@ -762,7 +774,8 @@ Editor::clearPaletteHighlightCanvas = -> @paletteHighlightCanvas.width, @paletteHighlightCanvas.height Editor::redrawPalette = -> - return unless @session? + return unless @session?.currentPaletteBlocks? + @clearPalette() # We will construct a vertical layout @@ -793,6 +806,7 @@ Editor::redrawPalette = -> binding.call this Editor::rebuildPalette = -> + return unless @session?.currentPaletteBlocks? @redrawPalette() for binding in editorBindings.rebuild_palette binding.call this @@ -834,7 +848,7 @@ Editor::trackerPointToPalette = (point) -> point.y - gbr.top + @session.scrollOffsets.palette.y) Editor::trackerPointIsInElement = (point, element) -> - if @session.readOnly + if not @session? or @session.readOnly return false if not element.offsetParent? return false @@ -1936,10 +1950,11 @@ hook 'populate', 0, -> # Append the element. @paletteElement.appendChild @paletteHeader - @setPalette @session.paletteGroups + if @session? + @setPalette @session.paletteGroups -parseBlock = (mode, code) => - block = mode.parse(code).start.next.container +parseBlock = (mode, code, context = null) => + block = mode.parse(code, {context}).start.next.container block.start.prev = block.end.next = null block.setParent null return block @@ -1979,7 +1994,7 @@ Editor::setPalette = (paletteGroups) -> # Parse all the blocks in this palette and clone them for data in paletteGroup.blocks - newBlock = parseBlock(@session.mode, data.block) + newBlock = parseBlock(@session.mode, data.block, data.context) expansion = data.expansion or null newPaletteBlocks.push block: newBlock @@ -3132,7 +3147,7 @@ Editor::deleteAtCursor = -> @redrawMain() hook 'keydown', 0, (event, state) -> - if @session.readOnly + if not @session? or @session.readOnly return if event.which isnt BACKSPACE_KEY return @@ -3175,7 +3190,7 @@ Editor::deleteLassoSelection = -> # ================================ hook 'keydown', 0, (event, state) -> - if @session.readOnly + if not @session? or @session.readOnly return if event.which is ENTER_KEY if not @cursorAtSocket() and not event.shiftKey and not event.ctrlKey and not event.metaKey @@ -3231,7 +3246,7 @@ hook 'keydown', 0, (event, state) -> @newHandwrittenSocket = newSocket hook 'keyup', 0, (event, state) -> - if @session.readOnly + if not @session? or @session.readOnly return # prevents routing the initial enter keypress to a new handwritten # block by focusing the block only after the enter key is released. @@ -3791,6 +3806,7 @@ hook 'populate', 2, -> # Temporarily ignoring x-scroll to fix bad x-scrolling behaviour # when dragging blocks out of the palette. TODO: fix x-scrolling behaviour. # @session.scrollOffsets.palette.x = @paletteScroller.scrollLeft + # @paletteCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y @@ -4612,7 +4628,7 @@ hook 'populate', 1, -> pressedXKey = true @copyPasteInput.addEventListener 'input', => - if @session.readOnly + if not @session? or @session.readOnly return if pressedVKey and not @cursorAtSocket() str = @copyPasteInput.value; lines = str.split '\n' diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 054c8fce..a1cae650 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -178,8 +178,8 @@ exports.createTreewalkParser = (parse, config, root) -> for c in context.classes if c in block.classes return helper.ENCOURAGE - else - return helper.DISCOURAGE + console.log block.classes, context.classes + return helper.DISCOURAGE # Doesn't yet deal with parens TreewalkParser.parens = (leading, trailing, node, context) -> From c5027b22e8f7ed0374e9c8310ddeaa46d534ee03 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 14 Jun 2016 16:04:54 -0400 Subject: [PATCH 111/268] Fix tests theoretically? --- src/controller.coffee | 2 +- test/src/tests.coffee | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 278e029a..5fa0b997 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -481,7 +481,7 @@ exports.Editor = class Editor @paletteCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y @paletteHighlightCtx.setTransform 1, 0, 0, 1, -@session.scrollOffsets.palette.x, -@session.scrollOffsets.palette.y - unless @session?.currentlyUsingBlocks + unless @session?.currentlyUsingBlocks or @session?.showPaletteInTextMode and @session?.paletteEnabled @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px" @rebuildPalette() diff --git a/test/src/tests.coffee b/test/src/tests.coffee index 2774b89c..28845cbd 100644 --- a/test/src/tests.coffee +++ b/test/src/tests.coffee @@ -728,7 +728,7 @@ asyncTest 'Controller: showPaletteInTextMode false', -> states.push usingBlocks editor.performMeltAnimation 10, 10, -> - strictEqual paletteWrapper.style.left, '-9999px' + strictEqual paletteWrapper.style.left, '-270px' strictEqual aceEditor.style.left, '0px' editor.performFreezeAnimation 10, 10, -> strictEqual paletteWrapper.style.left, '0px' @@ -776,7 +776,7 @@ asyncTest 'Controller: enablePalette false', -> strictEqual dropletWrapper.style.left, '270px' verifyPaletteHidden = -> - strictEqual paletteWrapper.style.left, '-9999px' + strictEqual paletteWrapper.style.left, '-270px' strictEqual dropletWrapper.style.left, '0px' start() From 3f68631c58e0483c6c1ad9dc95d8ea0ca86a7415 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 14 Jun 2016 16:22:26 -0400 Subject: [PATCH 112/268] Add socket parse contexts to fix most live reparsing bugs --- src/controller.coffee | 2 ++ src/model.coffee | 2 +- src/parser.coffee | 3 ++- src/treewalk.coffee | 3 +++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 5fa0b997..75f52ec8 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2405,6 +2405,8 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> parent = list.start.parent context = (list.start.container ? list.start.parent).parseContext + console.log 'REPARSING', list, list.stringify(), list.start.parent, 'WITH', context + try newList = @session.mode.parse list.stringifyInPlace(),{ wrapAtRoot: parent.type isnt 'socket' diff --git a/src/model.coffee b/src/model.coffee index d354a487..321ee4b1 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -1024,7 +1024,7 @@ exports.SocketEndToken = class SocketEndToken extends EndToken else '' exports.Socket = class Socket extends Container - constructor: (@emptyString, @precedence = 0, @handwritten = false, @classes = [], @dropdown = null) -> + constructor: (@emptyString, @precedence = 0, @handwritten = false, @classes = [], @dropdown = null, @parseContext = null) -> @start = new SocketStartToken this @end = new SocketEndToken this diff --git a/src/parser.coffee b/src/parser.coffee index 7ad8aeda..2dc5d7de 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -115,7 +115,8 @@ exports.Parser = class Parser socket = new model.Socket opts.empty ? @empty, opts.precedence, false, opts.classes, - opts.dropdown + opts.dropdown, + opts.parseContext @addMarkup socket, opts.bounds, opts.depth diff --git a/src/treewalk.coffee b/src/treewalk.coffee index a1cae650..ce9b8399 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -93,6 +93,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth classes: rules + parseContext: (if wrap? then wrap.type else rules[0]) @addBlock bounds: bounds @@ -128,6 +129,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth classes: rules + parseContext: (if wrap? then wrap.type else rules[0]) @addBlock bounds: bounds @@ -172,6 +174,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: node.bounds depth: depth classes: rules + parseContext: (if wrap? then wrap.type else rules[0]) TreewalkParser.drop = (block, context, pred) -> if context.type is 'socket' From 3f896efcf661e0dbe7b071e8be958fa963fe61dc Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 15 Jun 2016 11:07:18 -0400 Subject: [PATCH 113/268] Support root-level #include and expression #defines --- antlr/C.g4 | 45 +- antlr/C.tokens | 385 ++-- antlr/CLexer.js | 1211 ++++++------- antlr/CLexer.tokens | 385 ++-- antlr/CListener.js | 72 + antlr/CParser.js | 3848 +++++++++++++++++++++++----------------- src/languages/c.coffee | 16 +- src/treewalk.coffee | 1 + 8 files changed, 3395 insertions(+), 2568 deletions(-) diff --git a/antlr/C.g4 b/antlr/C.g4 index 8f43423c..ac9d1981 100644 --- a/antlr/C.g4 +++ b/antlr/C.g4 @@ -238,7 +238,7 @@ typeSpecifier ; structOrUnionSpecifier - : structOrUnion Identifier? '{' structDeclarationList '}' + : structOrUnion Identifier? structDeclarationsBlock | structOrUnion Identifier ; @@ -247,6 +247,11 @@ structOrUnion | 'union' ; + +structDeclarationsBlock + : '{' structDeclarationList '}' + ; + structDeclarationList : structDeclaration | structDeclarationList structDeclaration @@ -509,9 +514,43 @@ translationUnit | translationUnit externalDeclaration ; +includeDirective + : '#' 'include' StringLiteral + | '#' 'include' SharedIncludeLiteral + ; + +defineDirective + : defineDirectiveWithParams + | defineDirectiveNoParams + | defineDirectiveNoVal + ; + +defineDirectiveNoVal + : '#' 'define' Identifier + ; + +defineDirectiveNoParams + : '#' 'define' Identifier macroResult + ; + +defineDirectiveWithParams + : '#' 'define' Identifier '(' macroParamList ')' macroResult + ; + +macroResult + : expression + ; + +macroParamList + : Identifier + | macroParamList ',' Identifier + ; + externalDeclaration : functionDefinition | declaration + | includeDirective + | defineDirective | ';' // stray ; ; @@ -842,6 +881,10 @@ StringLiteral : EncodingPrefix? '"' SCharSequence? '"' ; +SharedIncludeLiteral + : '<' SCharSequence '>' + ; + fragment EncodingPrefix : 'u8' diff --git a/antlr/C.tokens b/antlr/C.tokens index a406c034..e88e63cc 100644 --- a/antlr/C.tokens +++ b/antlr/C.tokens @@ -12,105 +12,109 @@ T__10=11 T__11=12 T__12=13 T__13=14 -Auto=15 -Break=16 -Case=17 -Char=18 -Const=19 -Continue=20 -Default=21 -Do=22 -Double=23 -Else=24 -Enum=25 -Extern=26 -Float=27 -For=28 -Goto=29 -If=30 -Inline=31 -Int=32 -Long=33 -Register=34 -Restrict=35 -Return=36 -Short=37 -Signed=38 -Sizeof=39 -Static=40 -Struct=41 -Switch=42 -Typedef=43 -Union=44 -Unsigned=45 -Void=46 -Volatile=47 -While=48 -Alignas=49 -Alignof=50 -Atomic=51 -Bool=52 -Complex=53 -Generic=54 -Imaginary=55 -Noreturn=56 -StaticAssert=57 -ThreadLocal=58 -LeftParen=59 -RightParen=60 -LeftBracket=61 -RightBracket=62 -LeftBrace=63 -RightBrace=64 -Less=65 -LessEqual=66 -Greater=67 -GreaterEqual=68 -LeftShift=69 -RightShift=70 -Plus=71 -PlusPlus=72 -Minus=73 -MinusMinus=74 -Star=75 -Div=76 -Mod=77 -And=78 -Or=79 -AndAnd=80 -OrOr=81 -Caret=82 -Not=83 -Tilde=84 -Question=85 -Colon=86 -Semi=87 -Comma=88 -Assign=89 -StarAssign=90 -DivAssign=91 -ModAssign=92 -PlusAssign=93 -MinusAssign=94 -LeftShiftAssign=95 -RightShiftAssign=96 -AndAssign=97 -XorAssign=98 -OrAssign=99 -Equal=100 -NotEqual=101 -Arrow=102 -Dot=103 -Ellipsis=104 -Identifier=105 -Constant=106 -StringLiteral=107 -LineDirective=108 -PragmaDirective=109 -Whitespace=110 -Newline=111 -BlockComment=112 -LineComment=113 +T__14=15 +T__15=16 +T__16=17 +Auto=18 +Break=19 +Case=20 +Char=21 +Const=22 +Continue=23 +Default=24 +Do=25 +Double=26 +Else=27 +Enum=28 +Extern=29 +Float=30 +For=31 +Goto=32 +If=33 +Inline=34 +Int=35 +Long=36 +Register=37 +Restrict=38 +Return=39 +Short=40 +Signed=41 +Sizeof=42 +Static=43 +Struct=44 +Switch=45 +Typedef=46 +Union=47 +Unsigned=48 +Void=49 +Volatile=50 +While=51 +Alignas=52 +Alignof=53 +Atomic=54 +Bool=55 +Complex=56 +Generic=57 +Imaginary=58 +Noreturn=59 +StaticAssert=60 +ThreadLocal=61 +LeftParen=62 +RightParen=63 +LeftBracket=64 +RightBracket=65 +LeftBrace=66 +RightBrace=67 +Less=68 +LessEqual=69 +Greater=70 +GreaterEqual=71 +LeftShift=72 +RightShift=73 +Plus=74 +PlusPlus=75 +Minus=76 +MinusMinus=77 +Star=78 +Div=79 +Mod=80 +And=81 +Or=82 +AndAnd=83 +OrOr=84 +Caret=85 +Not=86 +Tilde=87 +Question=88 +Colon=89 +Semi=90 +Comma=91 +Assign=92 +StarAssign=93 +DivAssign=94 +ModAssign=95 +PlusAssign=96 +MinusAssign=97 +LeftShiftAssign=98 +RightShiftAssign=99 +AndAssign=100 +XorAssign=101 +OrAssign=102 +Equal=103 +NotEqual=104 +Arrow=105 +Dot=106 +Ellipsis=107 +Identifier=108 +Constant=109 +StringLiteral=110 +SharedIncludeLiteral=111 +LineDirective=112 +PragmaDirective=113 +Whitespace=114 +Newline=115 +BlockComment=116 +LineComment=117 '__extension__'=1 '__builtin_va_arg'=2 '__builtin_offsetof'=3 @@ -125,93 +129,96 @@ LineComment=113 '__attribute__'=12 '__asm__'=13 '__volatile__'=14 -'auto'=15 -'break'=16 -'case'=17 -'char'=18 -'const'=19 -'continue'=20 -'default'=21 -'do'=22 -'double'=23 -'else'=24 -'enum'=25 -'extern'=26 -'float'=27 -'for'=28 -'goto'=29 -'if'=30 -'inline'=31 -'int'=32 -'long'=33 -'register'=34 -'restrict'=35 -'return'=36 -'short'=37 -'signed'=38 -'sizeof'=39 -'static'=40 -'struct'=41 -'switch'=42 -'typedef'=43 -'union'=44 -'unsigned'=45 -'void'=46 -'volatile'=47 -'while'=48 -'_Alignas'=49 -'_Alignof'=50 -'_Atomic'=51 -'_Bool'=52 -'_Complex'=53 -'_Generic'=54 -'_Imaginary'=55 -'_Noreturn'=56 -'_Static_assert'=57 -'_Thread_local'=58 -'('=59 -')'=60 -'['=61 -']'=62 -'{'=63 -'}'=64 -'<'=65 -'<='=66 -'>'=67 -'>='=68 -'<<'=69 -'>>'=70 -'+'=71 -'++'=72 -'-'=73 -'--'=74 -'*'=75 -'/'=76 -'%'=77 -'&'=78 -'|'=79 -'&&'=80 -'||'=81 -'^'=82 -'!'=83 -'~'=84 -'?'=85 -':'=86 -';'=87 -','=88 -'='=89 -'*='=90 -'/='=91 -'%='=92 -'+='=93 -'-='=94 -'<<='=95 -'>>='=96 -'&='=97 -'^='=98 -'|='=99 -'=='=100 -'!='=101 -'->'=102 -'.'=103 -'...'=104 +'#'=15 +'include'=16 +'define'=17 +'auto'=18 +'break'=19 +'case'=20 +'char'=21 +'const'=22 +'continue'=23 +'default'=24 +'do'=25 +'double'=26 +'else'=27 +'enum'=28 +'extern'=29 +'float'=30 +'for'=31 +'goto'=32 +'if'=33 +'inline'=34 +'int'=35 +'long'=36 +'register'=37 +'restrict'=38 +'return'=39 +'short'=40 +'signed'=41 +'sizeof'=42 +'static'=43 +'struct'=44 +'switch'=45 +'typedef'=46 +'union'=47 +'unsigned'=48 +'void'=49 +'volatile'=50 +'while'=51 +'_Alignas'=52 +'_Alignof'=53 +'_Atomic'=54 +'_Bool'=55 +'_Complex'=56 +'_Generic'=57 +'_Imaginary'=58 +'_Noreturn'=59 +'_Static_assert'=60 +'_Thread_local'=61 +'('=62 +')'=63 +'['=64 +']'=65 +'{'=66 +'}'=67 +'<'=68 +'<='=69 +'>'=70 +'>='=71 +'<<'=72 +'>>'=73 +'+'=74 +'++'=75 +'-'=76 +'--'=77 +'*'=78 +'/'=79 +'%'=80 +'&'=81 +'|'=82 +'&&'=83 +'||'=84 +'^'=85 +'!'=86 +'~'=87 +'?'=88 +':'=89 +';'=90 +','=91 +'='=92 +'*='=93 +'/='=94 +'%='=95 +'+='=96 +'-='=97 +'<<='=98 +'>>='=99 +'&='=100 +'^='=101 +'|='=102 +'=='=103 +'!='=104 +'->'=105 +'.'=106 +'...'=107 diff --git a/antlr/CLexer.js b/antlr/CLexer.js index d9c90f38..4026948b 100644 --- a/antlr/CLexer.js +++ b/antlr/CLexer.js @@ -4,7 +4,7 @@ var antlr4 = require('antlr4/index'); var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\2s\u04e7\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t", + "\2w\u0504\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t", "\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20", "\t\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4", "\27\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35", @@ -23,454 +23,466 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e\t\u008e\4\u008f", "\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092\4\u0093\t\u0093", "\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098", - "\t\u0098\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3", - "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4", - "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4", - "\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7", - "\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", - "\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n", - "\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3", - "\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", - "\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3", - "\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20", - "\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3", - "\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25", - "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3", - "\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31", - "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3", - "\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36", - "\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3\"", - "\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$", - "\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3", - "\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3", - "+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.", - "\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3", - "\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62", - "\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", - "\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65", - "\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3", - "\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\39\39\39\3", - "9\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;", - "\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3@\3", - "@\3A\3A\3B\3B\3C\3C\3C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3I\3I", - "\3I\3J\3J\3K\3K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3Q\3Q\3Q\3R\3R\3R\3", - "S\3S\3T\3T\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3[\3\\\3\\\3\\", - "\3]\3]\3]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3c\3c\3", - "c\3d\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3i\3i\3i\3i\3j\3j\3j\7j", - "\u0381\nj\fj\16j\u0384\13j\3k\3k\5k\u0388\nk\3l\3l\3m\3m\3n\3n\3n\3", - "n\3n\3n\3n\3n\3n\3n\5n\u0398\nn\3o\3o\3o\3o\3o\3p\3p\3p\5p\u03a2\np", - "\3q\3q\5q\u03a6\nq\3q\3q\5q\u03aa\nq\3q\3q\5q\u03ae\nq\5q\u03b0\nq\3", - "r\3r\7r\u03b4\nr\fr\16r\u03b7\13r\3s\3s\7s\u03bb\ns\fs\16s\u03be\13", - "s\3t\3t\6t\u03c2\nt\rt\16t\u03c3\3u\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\5", - "y\u03d1\ny\3y\3y\3y\3y\3y\5y\u03d8\ny\3y\3y\5y\u03dc\ny\5y\u03de\ny", - "\3z\3z\3{\3{\3|\3|\3|\3|\5|\u03e8\n|\3}\3}\5}\u03ec\n}\3~\3~\5~\u03f0", - "\n~\3~\5~\u03f3\n~\3~\3~\3~\5~\u03f8\n~\5~\u03fa\n~\3\177\3\177\3\177", - "\3\177\5\177\u0400\n\177\3\177\3\177\3\177\3\177\5\177\u0406\n\177\5", - "\177\u0408\n\177\3\u0080\5\u0080\u040b\n\u0080\3\u0080\3\u0080\3\u0080", - "\3\u0080\3\u0080\5\u0080\u0412\n\u0080\3\u0081\3\u0081\5\u0081\u0416", - "\n\u0081\3\u0081\3\u0081\3\u0081\5\u0081\u041b\n\u0081\3\u0081\5\u0081", - "\u041e\n\u0081\3\u0082\3\u0082\3\u0083\6\u0083\u0423\n\u0083\r\u0083", - "\16\u0083\u0424\3\u0084\5\u0084\u0428\n\u0084\3\u0084\3\u0084\3\u0084", - "\3\u0084\3\u0084\5\u0084\u042f\n\u0084\3\u0085\3\u0085\5\u0085\u0433", - "\n\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0438\n\u0085\3\u0085\5\u0085", - "\u043b\n\u0085\3\u0086\6\u0086\u043e\n\u0086\r\u0086\16\u0086\u043f", - "\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088", - "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088", - "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u045a\n\u0088", - "\3\u0089\6\u0089\u045d\n\u0089\r\u0089\16\u0089\u045e\3\u008a\3\u008a", - "\5\u008a\u0463\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0469", - "\n\u008b\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d", - "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0479\n\u008d", - "\3\u008e\3\u008e\3\u008e\3\u008e\6\u008e\u047f\n\u008e\r\u008e\16\u008e", - "\u0480\3\u008f\5\u008f\u0484\n\u008f\3\u008f\3\u008f\5\u008f\u0488\n", - "\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090\u048f\n\u0090", - "\3\u0091\6\u0091\u0492\n\u0091\r\u0091\16\u0091\u0493\3\u0092\3\u0092", - "\5\u0092\u0498\n\u0092\3\u0093\3\u0093\5\u0093\u049c\n\u0093\3\u0093", - "\3\u0093\5\u0093\u04a0\n\u0093\3\u0093\3\u0093\7\u0093\u04a4\n\u0093", - "\f\u0093\16\u0093\u04a7\13\u0093\3\u0093\3\u0093\3\u0094\3\u0094\5\u0094", - "\u04ad\n\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094", - "\3\u0094\3\u0094\7\u0094\u04b8\n\u0094\f\u0094\16\u0094\u04bb\13\u0094", - "\3\u0094\3\u0094\3\u0095\6\u0095\u04c0\n\u0095\r\u0095\16\u0095\u04c1", - "\3\u0095\3\u0095\3\u0096\3\u0096\5\u0096\u04c8\n\u0096\3\u0096\5\u0096", - "\u04cb\n\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\7\u0097", - "\u04d3\n\u0097\f\u0097\16\u0097\u04d6\13\u0097\3\u0097\3\u0097\3\u0097", - "\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098\7\u0098\u04e1\n\u0098", - "\f\u0098\16\u0098\u04e4\13\u0098\3\u0098\3\u0098\3\u04d4\2\u0099\3\3", - "\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37", - "\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37", - "= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m", - "8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d", - "H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1", - "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5", - "\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9", - "f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5\2\u00d7\2\u00d9\2\u00db\2", - "\u00dd\2\u00dfl\u00e1\2\u00e3\2\u00e5\2\u00e7\2\u00e9\2\u00eb\2\u00ed", - "\2\u00ef\2\u00f1\2\u00f3\2\u00f5\2\u00f7\2\u00f9\2\u00fb\2\u00fd\2\u00ff", - "\2\u0101\2\u0103\2\u0105\2\u0107\2\u0109\2\u010b\2\u010d\2\u010f\2\u0111", - "\2\u0113\2\u0115\2\u0117\2\u0119\2\u011b\2\u011dm\u011f\2\u0121\2\u0123", - "\2\u0125n\u0127o\u0129p\u012bq\u012dr\u012fs\3\2\22\5\2C\\aac|\3\2\62", - ";\4\2ZZzz\3\2\63;\3\2\629\5\2\62;CHch\4\2WWww\4\2NNnn\4\2--//\6\2HH", - "NNhhnn\6\2\f\f\17\17))^^\f\2$$))AA^^cdhhppttvvxx\5\2NNWWww\6\2\f\f\17", - "\17$$^^\4\2\f\f\17\17\4\2\13\13\"\"\u0503\2\3\3\2\2\2\2\5\3\2\2\2\2", - "\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3", - "\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2", - "\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'", - "\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2", - "\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2", - "\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2", - "\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2", - "W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c", - "\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3", - "\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2", - "\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085", - "\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2", - "\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2", - "\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f", - "\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2", - "\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2", - "\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9", - "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2", - "\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2", - "\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3", - "\3\2\2\2\2\u00df\3\2\2\2\2\u011d\3\2\2\2\2\u0125\3\2\2\2\2\u0127\3\2", - "\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2\2", - "\3\u0131\3\2\2\2\5\u013f\3\2\2\2\7\u0150\3\2\2\2\t\u0163\3\2\2\2\13", - "\u016a\3\2\2\2\r\u0172\3\2\2\2\17\u017a\3\2\2\2\21\u0185\3\2\2\2\23", - "\u0190\3\2\2\2\25\u019a\3\2\2\2\27\u01a5\3\2\2\2\31\u01ab\3\2\2\2\33", - "\u01b9\3\2\2\2\35\u01c1\3\2\2\2\37\u01ce\3\2\2\2!\u01d3\3\2\2\2#\u01d9", - "\3\2\2\2%\u01de\3\2\2\2\'\u01e3\3\2\2\2)\u01e9\3\2\2\2+\u01f2\3\2\2", - "\2-\u01fa\3\2\2\2/\u01fd\3\2\2\2\61\u0204\3\2\2\2\63\u0209\3\2\2\2\65", - "\u020e\3\2\2\2\67\u0215\3\2\2\29\u021b\3\2\2\2;\u021f\3\2\2\2=\u0224", - "\3\2\2\2?\u0227\3\2\2\2A\u022e\3\2\2\2C\u0232\3\2\2\2E\u0237\3\2\2\2", - "G\u0240\3\2\2\2I\u0249\3\2\2\2K\u0250\3\2\2\2M\u0256\3\2\2\2O\u025d", - "\3\2\2\2Q\u0264\3\2\2\2S\u026b\3\2\2\2U\u0272\3\2\2\2W\u0279\3\2\2\2", - "Y\u0281\3\2\2\2[\u0287\3\2\2\2]\u0290\3\2\2\2_\u0295\3\2\2\2a\u029e", - "\3\2\2\2c\u02a4\3\2\2\2e\u02ad\3\2\2\2g\u02b6\3\2\2\2i\u02be\3\2\2\2", - "k\u02c4\3\2\2\2m\u02cd\3\2\2\2o\u02d6\3\2\2\2q\u02e1\3\2\2\2s\u02eb", - "\3\2\2\2u\u02fa\3\2\2\2w\u0308\3\2\2\2y\u030a\3\2\2\2{\u030c\3\2\2\2", - "}\u030e\3\2\2\2\177\u0310\3\2\2\2\u0081\u0312\3\2\2\2\u0083\u0314\3", - "\2\2\2\u0085\u0316\3\2\2\2\u0087\u0319\3\2\2\2\u0089\u031b\3\2\2\2\u008b", - "\u031e\3\2\2\2\u008d\u0321\3\2\2\2\u008f\u0324\3\2\2\2\u0091\u0326\3", - "\2\2\2\u0093\u0329\3\2\2\2\u0095\u032b\3\2\2\2\u0097\u032e\3\2\2\2\u0099", - "\u0330\3\2\2\2\u009b\u0332\3\2\2\2\u009d\u0334\3\2\2\2\u009f\u0336\3", - "\2\2\2\u00a1\u0338\3\2\2\2\u00a3\u033b\3\2\2\2\u00a5\u033e\3\2\2\2\u00a7", - "\u0340\3\2\2\2\u00a9\u0342\3\2\2\2\u00ab\u0344\3\2\2\2\u00ad\u0346\3", - "\2\2\2\u00af\u0348\3\2\2\2\u00b1\u034a\3\2\2\2\u00b3\u034c\3\2\2\2\u00b5", - "\u034e\3\2\2\2\u00b7\u0351\3\2\2\2\u00b9\u0354\3\2\2\2\u00bb\u0357\3", - "\2\2\2\u00bd\u035a\3\2\2\2\u00bf\u035d\3\2\2\2\u00c1\u0361\3\2\2\2\u00c3", - "\u0365\3\2\2\2\u00c5\u0368\3\2\2\2\u00c7\u036b\3\2\2\2\u00c9\u036e\3", - "\2\2\2\u00cb\u0371\3\2\2\2\u00cd\u0374\3\2\2\2\u00cf\u0377\3\2\2\2\u00d1", - "\u0379\3\2\2\2\u00d3\u037d\3\2\2\2\u00d5\u0387\3\2\2\2\u00d7\u0389\3", - "\2\2\2\u00d9\u038b\3\2\2\2\u00db\u0397\3\2\2\2\u00dd\u0399\3\2\2\2\u00df", - "\u03a1\3\2\2\2\u00e1\u03af\3\2\2\2\u00e3\u03b1\3\2\2\2\u00e5\u03b8\3", - "\2\2\2\u00e7\u03bf\3\2\2\2\u00e9\u03c5\3\2\2\2\u00eb\u03c8\3\2\2\2\u00ed", - "\u03ca\3\2\2\2\u00ef\u03cc\3\2\2\2\u00f1\u03dd\3\2\2\2\u00f3\u03df\3", - "\2\2\2\u00f5\u03e1\3\2\2\2\u00f7\u03e7\3\2\2\2\u00f9\u03eb\3\2\2\2\u00fb", - "\u03f9\3\2\2\2\u00fd\u0407\3\2\2\2\u00ff\u0411\3\2\2\2\u0101\u041d\3", - "\2\2\2\u0103\u041f\3\2\2\2\u0105\u0422\3\2\2\2\u0107\u042e\3\2\2\2\u0109", - "\u043a\3\2\2\2\u010b\u043d\3\2\2\2\u010d\u0441\3\2\2\2\u010f\u0459\3", - "\2\2\2\u0111\u045c\3\2\2\2\u0113\u0462\3\2\2\2\u0115\u0468\3\2\2\2\u0117", - "\u046a\3\2\2\2\u0119\u0478\3\2\2\2\u011b\u047a\3\2\2\2\u011d\u0483\3", - "\2\2\2\u011f\u048e\3\2\2\2\u0121\u0491\3\2\2\2\u0123\u0497\3\2\2\2\u0125", - "\u0499\3\2\2\2\u0127\u04aa\3\2\2\2\u0129\u04bf\3\2\2\2\u012b\u04ca\3", - "\2\2\2\u012d\u04ce\3\2\2\2\u012f\u04dc\3\2\2\2\u0131\u0132\7a\2\2\u0132", - "\u0133\7a\2\2\u0133\u0134\7g\2\2\u0134\u0135\7z\2\2\u0135\u0136\7v\2", - "\2\u0136\u0137\7g\2\2\u0137\u0138\7p\2\2\u0138\u0139\7u\2\2\u0139\u013a", - "\7k\2\2\u013a\u013b\7q\2\2\u013b\u013c\7p\2\2\u013c\u013d\7a\2\2\u013d", - "\u013e\7a\2\2\u013e\4\3\2\2\2\u013f\u0140\7a\2\2\u0140\u0141\7a\2\2", - "\u0141\u0142\7d\2\2\u0142\u0143\7w\2\2\u0143\u0144\7k\2\2\u0144\u0145", - "\7n\2\2\u0145\u0146\7v\2\2\u0146\u0147\7k\2\2\u0147\u0148\7p\2\2\u0148", - "\u0149\7a\2\2\u0149\u014a\7x\2\2\u014a\u014b\7c\2\2\u014b\u014c\7a\2", - "\2\u014c\u014d\7c\2\2\u014d\u014e\7t\2\2\u014e\u014f\7i\2\2\u014f\6", - "\3\2\2\2\u0150\u0151\7a\2\2\u0151\u0152\7a\2\2\u0152\u0153\7d\2\2\u0153", - "\u0154\7w\2\2\u0154\u0155\7k\2\2\u0155\u0156\7n\2\2\u0156\u0157\7v\2", - "\2\u0157\u0158\7k\2\2\u0158\u0159\7p\2\2\u0159\u015a\7a\2\2\u015a\u015b", - "\7q\2\2\u015b\u015c\7h\2\2\u015c\u015d\7h\2\2\u015d\u015e\7u\2\2\u015e", - "\u015f\7g\2\2\u015f\u0160\7v\2\2\u0160\u0161\7q\2\2\u0161\u0162\7h\2", - "\2\u0162\b\3\2\2\2\u0163\u0164\7a\2\2\u0164\u0165\7a\2\2\u0165\u0166", - "\7o\2\2\u0166\u0167\7\63\2\2\u0167\u0168\7\64\2\2\u0168\u0169\7:\2\2", - "\u0169\n\3\2\2\2\u016a\u016b\7a\2\2\u016b\u016c\7a\2\2\u016c\u016d\7", - "o\2\2\u016d\u016e\7\63\2\2\u016e\u016f\7\64\2\2\u016f\u0170\7:\2\2\u0170", - "\u0171\7f\2\2\u0171\f\3\2\2\2\u0172\u0173\7a\2\2\u0173\u0174\7a\2\2", - "\u0174\u0175\7o\2\2\u0175\u0176\7\63\2\2\u0176\u0177\7\64\2\2\u0177", - "\u0178\7:\2\2\u0178\u0179\7k\2\2\u0179\16\3\2\2\2\u017a\u017b\7a\2\2", - "\u017b\u017c\7a\2\2\u017c\u017d\7v\2\2\u017d\u017e\7{\2\2\u017e\u017f", - "\7r\2\2\u017f\u0180\7g\2\2\u0180\u0181\7q\2\2\u0181\u0182\7h\2\2\u0182", - "\u0183\7a\2\2\u0183\u0184\7a\2\2\u0184\20\3\2\2\2\u0185\u0186\7a\2\2", - "\u0186\u0187\7a\2\2\u0187\u0188\7k\2\2\u0188\u0189\7p\2\2\u0189\u018a", - "\7n\2\2\u018a\u018b\7k\2\2\u018b\u018c\7p\2\2\u018c\u018d\7g\2\2\u018d", - "\u018e\7a\2\2\u018e\u018f\7a\2\2\u018f\22\3\2\2\2\u0190\u0191\7a\2\2", - "\u0191\u0192\7a\2\2\u0192\u0193\7u\2\2\u0193\u0194\7v\2\2\u0194\u0195", - "\7f\2\2\u0195\u0196\7e\2\2\u0196\u0197\7c\2\2\u0197\u0198\7n\2\2\u0198", - "\u0199\7n\2\2\u0199\24\3\2\2\2\u019a\u019b\7a\2\2\u019b\u019c\7a\2\2", - "\u019c\u019d\7f\2\2\u019d\u019e\7g\2\2\u019e\u019f\7e\2\2\u019f\u01a0", - "\7n\2\2\u01a0\u01a1\7u\2\2\u01a1\u01a2\7r\2\2\u01a2\u01a3\7g\2\2\u01a3", - "\u01a4\7e\2\2\u01a4\26\3\2\2\2\u01a5\u01a6\7a\2\2\u01a6\u01a7\7a\2\2", - "\u01a7\u01a8\7c\2\2\u01a8\u01a9\7u\2\2\u01a9\u01aa\7o\2\2\u01aa\30\3", - "\2\2\2\u01ab\u01ac\7a\2\2\u01ac\u01ad\7a\2\2\u01ad\u01ae\7c\2\2\u01ae", - "\u01af\7v\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7t\2\2\u01b1\u01b2\7k\2", - "\2\u01b2\u01b3\7d\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7v\2\2\u01b5\u01b6", - "\7g\2\2\u01b6\u01b7\7a\2\2\u01b7\u01b8\7a\2\2\u01b8\32\3\2\2\2\u01b9", - "\u01ba\7a\2\2\u01ba\u01bb\7a\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7u\2", - "\2\u01bd\u01be\7o\2\2\u01be\u01bf\7a\2\2\u01bf\u01c0\7a\2\2\u01c0\34", - "\3\2\2\2\u01c1\u01c2\7a\2\2\u01c2\u01c3\7a\2\2\u01c3\u01c4\7x\2\2\u01c4", - "\u01c5\7q\2\2\u01c5\u01c6\7n\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7v\2", - "\2\u01c8\u01c9\7k\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7g\2\2\u01cb\u01cc", - "\7a\2\2\u01cc\u01cd\7a\2\2\u01cd\36\3\2\2\2\u01ce\u01cf\7c\2\2\u01cf", - "\u01d0\7w\2\2\u01d0\u01d1\7v\2\2\u01d1\u01d2\7q\2\2\u01d2 \3\2\2\2\u01d3", - "\u01d4\7d\2\2\u01d4\u01d5\7t\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7c\2", - "\2\u01d7\u01d8\7m\2\2\u01d8\"\3\2\2\2\u01d9\u01da\7e\2\2\u01da\u01db", - "\7c\2\2\u01db\u01dc\7u\2\2\u01dc\u01dd\7g\2\2\u01dd$\3\2\2\2\u01de\u01df", - "\7e\2\2\u01df\u01e0\7j\2\2\u01e0\u01e1\7c\2\2\u01e1\u01e2\7t\2\2\u01e2", - "&\3\2\2\2\u01e3\u01e4\7e\2\2\u01e4\u01e5\7q\2\2\u01e5\u01e6\7p\2\2\u01e6", - "\u01e7\7u\2\2\u01e7\u01e8\7v\2\2\u01e8(\3\2\2\2\u01e9\u01ea\7e\2\2\u01ea", - "\u01eb\7q\2\2\u01eb\u01ec\7p\2\2\u01ec\u01ed\7v\2\2\u01ed\u01ee\7k\2", - "\2\u01ee\u01ef\7p\2\2\u01ef\u01f0\7w\2\2\u01f0\u01f1\7g\2\2\u01f1*\3", - "\2\2\2\u01f2\u01f3\7f\2\2\u01f3\u01f4\7g\2\2\u01f4\u01f5\7h\2\2\u01f5", - "\u01f6\7c\2\2\u01f6\u01f7\7w\2\2\u01f7\u01f8\7n\2\2\u01f8\u01f9\7v\2", - "\2\u01f9,\3\2\2\2\u01fa\u01fb\7f\2\2\u01fb\u01fc\7q\2\2\u01fc.\3\2\2", - "\2\u01fd\u01fe\7f\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200\7w\2\2\u0200\u0201", - "\7d\2\2\u0201\u0202\7n\2\2\u0202\u0203\7g\2\2\u0203\60\3\2\2\2\u0204", - "\u0205\7g\2\2\u0205\u0206\7n\2\2\u0206\u0207\7u\2\2\u0207\u0208\7g\2", - "\2\u0208\62\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020b\7p\2\2\u020b\u020c", - "\7w\2\2\u020c\u020d\7o\2\2\u020d\64\3\2\2\2\u020e\u020f\7g\2\2\u020f", - "\u0210\7z\2\2\u0210\u0211\7v\2\2\u0211\u0212\7g\2\2\u0212\u0213\7t\2", - "\2\u0213\u0214\7p\2\2\u0214\66\3\2\2\2\u0215\u0216\7h\2\2\u0216\u0217", - "\7n\2\2\u0217\u0218\7q\2\2\u0218\u0219\7c\2\2\u0219\u021a\7v\2\2\u021a", - "8\3\2\2\2\u021b\u021c\7h\2\2\u021c\u021d\7q\2\2\u021d\u021e\7t\2\2\u021e", - ":\3\2\2\2\u021f\u0220\7i\2\2\u0220\u0221\7q\2\2\u0221\u0222\7v\2\2\u0222", - "\u0223\7q\2\2\u0223<\3\2\2\2\u0224\u0225\7k\2\2\u0225\u0226\7h\2\2\u0226", - ">\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229\7p\2\2\u0229\u022a\7n\2\2\u022a", - "\u022b\7k\2\2\u022b\u022c\7p\2\2\u022c\u022d\7g\2\2\u022d@\3\2\2\2\u022e", - "\u022f\7k\2\2\u022f\u0230\7p\2\2\u0230\u0231\7v\2\2\u0231B\3\2\2\2\u0232", - "\u0233\7n\2\2\u0233\u0234\7q\2\2\u0234\u0235\7p\2\2\u0235\u0236\7i\2", - "\2\u0236D\3\2\2\2\u0237\u0238\7t\2\2\u0238\u0239\7g\2\2\u0239\u023a", - "\7i\2\2\u023a\u023b\7k\2\2\u023b\u023c\7u\2\2\u023c\u023d\7v\2\2\u023d", - "\u023e\7g\2\2\u023e\u023f\7t\2\2\u023fF\3\2\2\2\u0240\u0241\7t\2\2\u0241", - "\u0242\7g\2\2\u0242\u0243\7u\2\2\u0243\u0244\7v\2\2\u0244\u0245\7t\2", - "\2\u0245\u0246\7k\2\2\u0246\u0247\7e\2\2\u0247\u0248\7v\2\2\u0248H\3", - "\2\2\2\u0249\u024a\7t\2\2\u024a\u024b\7g\2\2\u024b\u024c\7v\2\2\u024c", - "\u024d\7w\2\2\u024d\u024e\7t\2\2\u024e\u024f\7p\2\2\u024fJ\3\2\2\2\u0250", - "\u0251\7u\2\2\u0251\u0252\7j\2\2\u0252\u0253\7q\2\2\u0253\u0254\7t\2", - "\2\u0254\u0255\7v\2\2\u0255L\3\2\2\2\u0256\u0257\7u\2\2\u0257\u0258", - "\7k\2\2\u0258\u0259\7i\2\2\u0259\u025a\7p\2\2\u025a\u025b\7g\2\2\u025b", - "\u025c\7f\2\2\u025cN\3\2\2\2\u025d\u025e\7u\2\2\u025e\u025f\7k\2\2\u025f", - "\u0260\7|\2\2\u0260\u0261\7g\2\2\u0261\u0262\7q\2\2\u0262\u0263\7h\2", - "\2\u0263P\3\2\2\2\u0264\u0265\7u\2\2\u0265\u0266\7v\2\2\u0266\u0267", - "\7c\2\2\u0267\u0268\7v\2\2\u0268\u0269\7k\2\2\u0269\u026a\7e\2\2\u026a", - "R\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7v\2\2\u026d\u026e\7t\2\2\u026e", - "\u026f\7w\2\2\u026f\u0270\7e\2\2\u0270\u0271\7v\2\2\u0271T\3\2\2\2\u0272", - "\u0273\7u\2\2\u0273\u0274\7y\2\2\u0274\u0275\7k\2\2\u0275\u0276\7v\2", - "\2\u0276\u0277\7e\2\2\u0277\u0278\7j\2\2\u0278V\3\2\2\2\u0279\u027a", - "\7v\2\2\u027a\u027b\7{\2\2\u027b\u027c\7r\2\2\u027c\u027d\7g\2\2\u027d", - "\u027e\7f\2\2\u027e\u027f\7g\2\2\u027f\u0280\7h\2\2\u0280X\3\2\2\2\u0281", - "\u0282\7w\2\2\u0282\u0283\7p\2\2\u0283\u0284\7k\2\2\u0284\u0285\7q\2", - "\2\u0285\u0286\7p\2\2\u0286Z\3\2\2\2\u0287\u0288\7w\2\2\u0288\u0289", - "\7p\2\2\u0289\u028a\7u\2\2\u028a\u028b\7k\2\2\u028b\u028c\7i\2\2\u028c", - "\u028d\7p\2\2\u028d\u028e\7g\2\2\u028e\u028f\7f\2\2\u028f\\\3\2\2\2", - "\u0290\u0291\7x\2\2\u0291\u0292\7q\2\2\u0292\u0293\7k\2\2\u0293\u0294", - "\7f\2\2\u0294^\3\2\2\2\u0295\u0296\7x\2\2\u0296\u0297\7q\2\2\u0297\u0298", - "\7n\2\2\u0298\u0299\7c\2\2\u0299\u029a\7v\2\2\u029a\u029b\7k\2\2\u029b", - "\u029c\7n\2\2\u029c\u029d\7g\2\2\u029d`\3\2\2\2\u029e\u029f\7y\2\2\u029f", - "\u02a0\7j\2\2\u02a0\u02a1\7k\2\2\u02a1\u02a2\7n\2\2\u02a2\u02a3\7g\2", - "\2\u02a3b\3\2\2\2\u02a4\u02a5\7a\2\2\u02a5\u02a6\7C\2\2\u02a6\u02a7", - "\7n\2\2\u02a7\u02a8\7k\2\2\u02a8\u02a9\7i\2\2\u02a9\u02aa\7p\2\2\u02aa", - "\u02ab\7c\2\2\u02ab\u02ac\7u\2\2\u02acd\3\2\2\2\u02ad\u02ae\7a\2\2\u02ae", - "\u02af\7C\2\2\u02af\u02b0\7n\2\2\u02b0\u02b1\7k\2\2\u02b1\u02b2\7i\2", - "\2\u02b2\u02b3\7p\2\2\u02b3\u02b4\7q\2\2\u02b4\u02b5\7h\2\2\u02b5f\3", - "\2\2\2\u02b6\u02b7\7a\2\2\u02b7\u02b8\7C\2\2\u02b8\u02b9\7v\2\2\u02b9", - "\u02ba\7q\2\2\u02ba\u02bb\7o\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7e\2", - "\2\u02bdh\3\2\2\2\u02be\u02bf\7a\2\2\u02bf\u02c0\7D\2\2\u02c0\u02c1", - "\7q\2\2\u02c1\u02c2\7q\2\2\u02c2\u02c3\7n\2\2\u02c3j\3\2\2\2\u02c4\u02c5", - "\7a\2\2\u02c5\u02c6\7E\2\2\u02c6\u02c7\7q\2\2\u02c7\u02c8\7o\2\2\u02c8", - "\u02c9\7r\2\2\u02c9\u02ca\7n\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7z\2", - "\2\u02ccl\3\2\2\2\u02cd\u02ce\7a\2\2\u02ce\u02cf\7I\2\2\u02cf\u02d0", - "\7g\2\2\u02d0\u02d1\7p\2\2\u02d1\u02d2\7g\2\2\u02d2\u02d3\7t\2\2\u02d3", - "\u02d4\7k\2\2\u02d4\u02d5\7e\2\2\u02d5n\3\2\2\2\u02d6\u02d7\7a\2\2\u02d7", - "\u02d8\7K\2\2\u02d8\u02d9\7o\2\2\u02d9\u02da\7c\2\2\u02da\u02db\7i\2", - "\2\u02db\u02dc\7k\2\2\u02dc\u02dd\7p\2\2\u02dd\u02de\7c\2\2\u02de\u02df", - "\7t\2\2\u02df\u02e0\7{\2\2\u02e0p\3\2\2\2\u02e1\u02e2\7a\2\2\u02e2\u02e3", - "\7P\2\2\u02e3\u02e4\7q\2\2\u02e4\u02e5\7t\2\2\u02e5\u02e6\7g\2\2\u02e6", - "\u02e7\7v\2\2\u02e7\u02e8\7w\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7p\2", - "\2\u02ear\3\2\2\2\u02eb\u02ec\7a\2\2\u02ec\u02ed\7U\2\2\u02ed\u02ee", - "\7v\2\2\u02ee\u02ef\7c\2\2\u02ef\u02f0\7v\2\2\u02f0\u02f1\7k\2\2\u02f1", - "\u02f2\7e\2\2\u02f2\u02f3\7a\2\2\u02f3\u02f4\7c\2\2\u02f4\u02f5\7u\2", - "\2\u02f5\u02f6\7u\2\2\u02f6\u02f7\7g\2\2\u02f7\u02f8\7t\2\2\u02f8\u02f9", - "\7v\2\2\u02f9t\3\2\2\2\u02fa\u02fb\7a\2\2\u02fb\u02fc\7V\2\2\u02fc\u02fd", - "\7j\2\2\u02fd\u02fe\7t\2\2\u02fe\u02ff\7g\2\2\u02ff\u0300\7c\2\2\u0300", - "\u0301\7f\2\2\u0301\u0302\7a\2\2\u0302\u0303\7n\2\2\u0303\u0304\7q\2", - "\2\u0304\u0305\7e\2\2\u0305\u0306\7c\2\2\u0306\u0307\7n\2\2\u0307v\3", - "\2\2\2\u0308\u0309\7*\2\2\u0309x\3\2\2\2\u030a\u030b\7+\2\2\u030bz\3", - "\2\2\2\u030c\u030d\7]\2\2\u030d|\3\2\2\2\u030e\u030f\7_\2\2\u030f~\3", - "\2\2\2\u0310\u0311\7}\2\2\u0311\u0080\3\2\2\2\u0312\u0313\7\177\2\2", - "\u0313\u0082\3\2\2\2\u0314\u0315\7>\2\2\u0315\u0084\3\2\2\2\u0316\u0317", - "\7>\2\2\u0317\u0318\7?\2\2\u0318\u0086\3\2\2\2\u0319\u031a\7@\2\2\u031a", - "\u0088\3\2\2\2\u031b\u031c\7@\2\2\u031c\u031d\7?\2\2\u031d\u008a\3\2", - "\2\2\u031e\u031f\7>\2\2\u031f\u0320\7>\2\2\u0320\u008c\3\2\2\2\u0321", - "\u0322\7@\2\2\u0322\u0323\7@\2\2\u0323\u008e\3\2\2\2\u0324\u0325\7-", - "\2\2\u0325\u0090\3\2\2\2\u0326\u0327\7-\2\2\u0327\u0328\7-\2\2\u0328", - "\u0092\3\2\2\2\u0329\u032a\7/\2\2\u032a\u0094\3\2\2\2\u032b\u032c\7", - "/\2\2\u032c\u032d\7/\2\2\u032d\u0096\3\2\2\2\u032e\u032f\7,\2\2\u032f", - "\u0098\3\2\2\2\u0330\u0331\7\61\2\2\u0331\u009a\3\2\2\2\u0332\u0333", - "\7\'\2\2\u0333\u009c\3\2\2\2\u0334\u0335\7(\2\2\u0335\u009e\3\2\2\2", - "\u0336\u0337\7~\2\2\u0337\u00a0\3\2\2\2\u0338\u0339\7(\2\2\u0339\u033a", - "\7(\2\2\u033a\u00a2\3\2\2\2\u033b\u033c\7~\2\2\u033c\u033d\7~\2\2\u033d", - "\u00a4\3\2\2\2\u033e\u033f\7`\2\2\u033f\u00a6\3\2\2\2\u0340\u0341\7", - "#\2\2\u0341\u00a8\3\2\2\2\u0342\u0343\7\u0080\2\2\u0343\u00aa\3\2\2", - "\2\u0344\u0345\7A\2\2\u0345\u00ac\3\2\2\2\u0346\u0347\7<\2\2\u0347\u00ae", - "\3\2\2\2\u0348\u0349\7=\2\2\u0349\u00b0\3\2\2\2\u034a\u034b\7.\2\2\u034b", - "\u00b2\3\2\2\2\u034c\u034d\7?\2\2\u034d\u00b4\3\2\2\2\u034e\u034f\7", - ",\2\2\u034f\u0350\7?\2\2\u0350\u00b6\3\2\2\2\u0351\u0352\7\61\2\2\u0352", - "\u0353\7?\2\2\u0353\u00b8\3\2\2\2\u0354\u0355\7\'\2\2\u0355\u0356\7", - "?\2\2\u0356\u00ba\3\2\2\2\u0357\u0358\7-\2\2\u0358\u0359\7?\2\2\u0359", - "\u00bc\3\2\2\2\u035a\u035b\7/\2\2\u035b\u035c\7?\2\2\u035c\u00be\3\2", - "\2\2\u035d\u035e\7>\2\2\u035e\u035f\7>\2\2\u035f\u0360\7?\2\2\u0360", - "\u00c0\3\2\2\2\u0361\u0362\7@\2\2\u0362\u0363\7@\2\2\u0363\u0364\7?", - "\2\2\u0364\u00c2\3\2\2\2\u0365\u0366\7(\2\2\u0366\u0367\7?\2\2\u0367", - "\u00c4\3\2\2\2\u0368\u0369\7`\2\2\u0369\u036a\7?\2\2\u036a\u00c6\3\2", - "\2\2\u036b\u036c\7~\2\2\u036c\u036d\7?\2\2\u036d\u00c8\3\2\2\2\u036e", - "\u036f\7?\2\2\u036f\u0370\7?\2\2\u0370\u00ca\3\2\2\2\u0371\u0372\7#", - "\2\2\u0372\u0373\7?\2\2\u0373\u00cc\3\2\2\2\u0374\u0375\7/\2\2\u0375", - "\u0376\7@\2\2\u0376\u00ce\3\2\2\2\u0377\u0378\7\60\2\2\u0378\u00d0\3", - "\2\2\2\u0379\u037a\7\60\2\2\u037a\u037b\7\60\2\2\u037b\u037c\7\60\2", - "\2\u037c\u00d2\3\2\2\2\u037d\u0382\5\u00d5k\2\u037e\u0381\5\u00d5k\2", - "\u037f\u0381\5\u00d9m\2\u0380\u037e\3\2\2\2\u0380\u037f\3\2\2\2\u0381", - "\u0384\3\2\2\2\u0382\u0380\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u00d4\3", - "\2\2\2\u0384\u0382\3\2\2\2\u0385\u0388\5\u00d7l\2\u0386\u0388\5\u00db", - "n\2\u0387\u0385\3\2\2\2\u0387\u0386\3\2\2\2\u0388\u00d6\3\2\2\2\u0389", - "\u038a\t\2\2\2\u038a\u00d8\3\2\2\2\u038b\u038c\t\3\2\2\u038c\u00da\3", - "\2\2\2\u038d\u038e\7^\2\2\u038e\u038f\7w\2\2\u038f\u0390\3\2\2\2\u0390", - "\u0398\5\u00ddo\2\u0391\u0392\7^\2\2\u0392\u0393\7W\2\2\u0393\u0394", - "\3\2\2\2\u0394\u0395\5\u00ddo\2\u0395\u0396\5\u00ddo\2\u0396\u0398\3", - "\2\2\2\u0397\u038d\3\2\2\2\u0397\u0391\3\2\2\2\u0398\u00dc\3\2\2\2\u0399", - "\u039a\5\u00efx\2\u039a\u039b\5\u00efx\2\u039b\u039c\5\u00efx\2\u039c", - "\u039d\5\u00efx\2\u039d\u00de\3\2\2\2\u039e\u03a2\5\u00e1q\2\u039f\u03a2", - "\5\u00f9}\2\u03a0\u03a2\5\u010f\u0088\2\u03a1\u039e\3\2\2\2\u03a1\u039f", - "\3\2\2\2\u03a1\u03a0\3\2\2\2\u03a2\u00e0\3\2\2\2\u03a3\u03a5\5\u00e3", - "r\2\u03a4\u03a6\5\u00f1y\2\u03a5\u03a4\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6", - "\u03b0\3\2\2\2\u03a7\u03a9\5\u00e5s\2\u03a8\u03aa\5\u00f1y\2\u03a9\u03a8", - "\3\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u03b0\3\2\2\2\u03ab\u03ad\5\u00e7", - "t\2\u03ac\u03ae\5\u00f1y\2\u03ad\u03ac\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae", - "\u03b0\3\2\2\2\u03af\u03a3\3\2\2\2\u03af\u03a7\3\2\2\2\u03af\u03ab\3", - "\2\2\2\u03b0\u00e2\3\2\2\2\u03b1\u03b5\5\u00ebv\2\u03b2\u03b4\5\u00d9", - "m\2\u03b3\u03b2\3\2\2\2\u03b4\u03b7\3\2\2\2\u03b5\u03b3\3\2\2\2\u03b5", - "\u03b6\3\2\2\2\u03b6\u00e4\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b8\u03bc\7", - "\62\2\2\u03b9\u03bb\5\u00edw\2\u03ba\u03b9\3\2\2\2\u03bb\u03be\3\2\2", - "\2\u03bc\u03ba\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd\u00e6\3\2\2\2\u03be", - "\u03bc\3\2\2\2\u03bf\u03c1\5\u00e9u\2\u03c0\u03c2\5\u00efx\2\u03c1\u03c0", - "\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03c1\3\2\2\2\u03c3\u03c4\3\2\2\2", - "\u03c4\u00e8\3\2\2\2\u03c5\u03c6\7\62\2\2\u03c6\u03c7\t\4\2\2\u03c7", - "\u00ea\3\2\2\2\u03c8\u03c9\t\5\2\2\u03c9\u00ec\3\2\2\2\u03ca\u03cb\t", - "\6\2\2\u03cb\u00ee\3\2\2\2\u03cc\u03cd\t\7\2\2\u03cd\u00f0\3\2\2\2\u03ce", - "\u03d0\5\u00f3z\2\u03cf\u03d1\5\u00f5{\2\u03d0\u03cf\3\2\2\2\u03d0\u03d1", - "\3\2\2\2\u03d1\u03de\3\2\2\2\u03d2\u03d3\5\u00f3z\2\u03d3\u03d4\5\u00f7", - "|\2\u03d4\u03de\3\2\2\2\u03d5\u03d7\5\u00f5{\2\u03d6\u03d8\5\u00f3z", - "\2\u03d7\u03d6\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03de\3\2\2\2\u03d9", - "\u03db\5\u00f7|\2\u03da\u03dc\5\u00f3z\2\u03db\u03da\3\2\2\2\u03db\u03dc", - "\3\2\2\2\u03dc\u03de\3\2\2\2\u03dd\u03ce\3\2\2\2\u03dd\u03d2\3\2\2\2", - "\u03dd\u03d5\3\2\2\2\u03dd\u03d9\3\2\2\2\u03de\u00f2\3\2\2\2\u03df\u03e0", - "\t\b\2\2\u03e0\u00f4\3\2\2\2\u03e1\u03e2\t\t\2\2\u03e2\u00f6\3\2\2\2", - "\u03e3\u03e4\7n\2\2\u03e4\u03e8\7n\2\2\u03e5\u03e6\7N\2\2\u03e6\u03e8", - "\7N\2\2\u03e7\u03e3\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u00f8\3\2\2\2", - "\u03e9\u03ec\5\u00fb~\2\u03ea\u03ec\5\u00fd\177\2\u03eb\u03e9\3\2\2", - "\2\u03eb\u03ea\3\2\2\2\u03ec\u00fa\3\2\2\2\u03ed\u03ef\5\u00ff\u0080", - "\2\u03ee\u03f0\5\u0101\u0081\2\u03ef\u03ee\3\2\2\2\u03ef\u03f0\3\2\2", - "\2\u03f0\u03f2\3\2\2\2\u03f1\u03f3\5\u010d\u0087\2\u03f2\u03f1\3\2\2", - "\2\u03f2\u03f3\3\2\2\2\u03f3\u03fa\3\2\2\2\u03f4\u03f5\5\u0105\u0083", - "\2\u03f5\u03f7\5\u0101\u0081\2\u03f6\u03f8\5\u010d\u0087\2\u03f7\u03f6", - "\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u03fa\3\2\2\2\u03f9\u03ed\3\2\2\2", - "\u03f9\u03f4\3\2\2\2\u03fa\u00fc\3\2\2\2\u03fb\u03fc\5\u00e9u\2\u03fc", - "\u03fd\5\u0107\u0084\2\u03fd\u03ff\5\u0109\u0085\2\u03fe\u0400\5\u010d", - "\u0087\2\u03ff\u03fe\3\2\2\2\u03ff\u0400\3\2\2\2\u0400\u0408\3\2\2\2", - "\u0401\u0402\5\u00e9u\2\u0402\u0403\5\u010b\u0086\2\u0403\u0405\5\u0109", - "\u0085\2\u0404\u0406\5\u010d\u0087\2\u0405\u0404\3\2\2\2\u0405\u0406", - "\3\2\2\2\u0406\u0408\3\2\2\2\u0407\u03fb\3\2\2\2\u0407\u0401\3\2\2\2", - "\u0408\u00fe\3\2\2\2\u0409\u040b\5\u0105\u0083\2\u040a\u0409\3\2\2\2", - "\u040a\u040b\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u040d\7\60\2\2\u040d", - "\u0412\5\u0105\u0083\2\u040e\u040f\5\u0105\u0083\2\u040f\u0410\7\60", - "\2\2\u0410\u0412\3\2\2\2\u0411\u040a\3\2\2\2\u0411\u040e\3\2\2\2\u0412", - "\u0100\3\2\2\2\u0413\u0415\7g\2\2\u0414\u0416\5\u0103\u0082\2\u0415", - "\u0414\3\2\2\2\u0415\u0416\3\2\2\2\u0416\u0417\3\2\2\2\u0417\u041e\5", - "\u0105\u0083\2\u0418\u041a\7G\2\2\u0419\u041b\5\u0103\u0082\2\u041a", - "\u0419\3\2\2\2\u041a\u041b\3\2\2\2\u041b\u041c\3\2\2\2\u041c\u041e\5", - "\u0105\u0083\2\u041d\u0413\3\2\2\2\u041d\u0418\3\2\2\2\u041e\u0102\3", - "\2\2\2\u041f\u0420\t\n\2\2\u0420\u0104\3\2\2\2\u0421\u0423\5\u00d9m", - "\2\u0422\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u0422\3\2\2\2\u0424", - "\u0425\3\2\2\2\u0425\u0106\3\2\2\2\u0426\u0428\5\u010b\u0086\2\u0427", - "\u0426\3\2\2\2\u0427\u0428\3\2\2\2\u0428\u0429\3\2\2\2\u0429\u042a\7", - "\60\2\2\u042a\u042f\5\u010b\u0086\2\u042b\u042c\5\u010b\u0086\2\u042c", - "\u042d\7\60\2\2\u042d\u042f\3\2\2\2\u042e\u0427\3\2\2\2\u042e\u042b", - "\3\2\2\2\u042f\u0108\3\2\2\2\u0430\u0432\7r\2\2\u0431\u0433\5\u0103", - "\u0082\2\u0432\u0431\3\2\2\2\u0432\u0433\3\2\2\2\u0433\u0434\3\2\2\2", - "\u0434\u043b\5\u0105\u0083\2\u0435\u0437\7R\2\2\u0436\u0438\5\u0103", - "\u0082\2\u0437\u0436\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\3\2\2\2", - "\u0439\u043b\5\u0105\u0083\2\u043a\u0430\3\2\2\2\u043a\u0435\3\2\2\2", - "\u043b\u010a\3\2\2\2\u043c\u043e\5\u00efx\2\u043d\u043c\3\2\2\2\u043e", - "\u043f\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u0440\3\2\2\2\u0440\u010c\3", - "\2\2\2\u0441\u0442\t\13\2\2\u0442\u010e\3\2\2\2\u0443\u0444\7)\2\2\u0444", - "\u0445\5\u0111\u0089\2\u0445\u0446\7)\2\2\u0446\u045a\3\2\2\2\u0447", - "\u0448\7N\2\2\u0448\u0449\7)\2\2\u0449\u044a\3\2\2\2\u044a\u044b\5\u0111", - "\u0089\2\u044b\u044c\7)\2\2\u044c\u045a\3\2\2\2\u044d\u044e\7w\2\2\u044e", - "\u044f\7)\2\2\u044f\u0450\3\2\2\2\u0450\u0451\5\u0111\u0089\2\u0451", - "\u0452\7)\2\2\u0452\u045a\3\2\2\2\u0453\u0454\7W\2\2\u0454\u0455\7)", - "\2\2\u0455\u0456\3\2\2\2\u0456\u0457\5\u0111\u0089\2\u0457\u0458\7)", - "\2\2\u0458\u045a\3\2\2\2\u0459\u0443\3\2\2\2\u0459\u0447\3\2\2\2\u0459", - "\u044d\3\2\2\2\u0459\u0453\3\2\2\2\u045a\u0110\3\2\2\2\u045b\u045d\5", - "\u0113\u008a\2\u045c\u045b\3\2\2\2\u045d\u045e\3\2\2\2\u045e\u045c\3", - "\2\2\2\u045e\u045f\3\2\2\2\u045f\u0112\3\2\2\2\u0460\u0463\n\f\2\2\u0461", - "\u0463\5\u0115\u008b\2\u0462\u0460\3\2\2\2\u0462\u0461\3\2\2\2\u0463", - "\u0114\3\2\2\2\u0464\u0469\5\u0117\u008c\2\u0465\u0469\5\u0119\u008d", - "\2\u0466\u0469\5\u011b\u008e\2\u0467\u0469\5\u00dbn\2\u0468\u0464\3", - "\2\2\2\u0468\u0465\3\2\2\2\u0468\u0466\3\2\2\2\u0468\u0467\3\2\2\2\u0469", - "\u0116\3\2\2\2\u046a\u046b\7^\2\2\u046b\u046c\t\r\2\2\u046c\u0118\3", - "\2\2\2\u046d\u046e\7^\2\2\u046e\u0479\5\u00edw\2\u046f\u0470\7^\2\2", - "\u0470\u0471\5\u00edw\2\u0471\u0472\5\u00edw\2\u0472\u0479\3\2\2\2\u0473", - "\u0474\7^\2\2\u0474\u0475\5\u00edw\2\u0475\u0476\5\u00edw\2\u0476\u0477", - "\5\u00edw\2\u0477\u0479\3\2\2\2\u0478\u046d\3\2\2\2\u0478\u046f\3\2", - "\2\2\u0478\u0473\3\2\2\2\u0479\u011a\3\2\2\2\u047a\u047b\7^\2\2\u047b", - "\u047c\7z\2\2\u047c\u047e\3\2\2\2\u047d\u047f\5\u00efx\2\u047e\u047d", - "\3\2\2\2\u047f\u0480\3\2\2\2\u0480\u047e\3\2\2\2\u0480\u0481\3\2\2\2", - "\u0481\u011c\3\2\2\2\u0482\u0484\5\u011f\u0090\2\u0483\u0482\3\2\2\2", - "\u0483\u0484\3\2\2\2\u0484\u0485\3\2\2\2\u0485\u0487\7$\2\2\u0486\u0488", - "\5\u0121\u0091\2\u0487\u0486\3\2\2\2\u0487\u0488\3\2\2\2\u0488\u0489", - "\3\2\2\2\u0489\u048a\7$\2\2\u048a\u011e\3\2\2\2\u048b\u048c\7w\2\2\u048c", - "\u048f\7:\2\2\u048d\u048f\t\16\2\2\u048e\u048b\3\2\2\2\u048e\u048d\3", - "\2\2\2\u048f\u0120\3\2\2\2\u0490\u0492\5\u0123\u0092\2\u0491\u0490\3", - "\2\2\2\u0492\u0493\3\2\2\2\u0493\u0491\3\2\2\2\u0493\u0494\3\2\2\2\u0494", - "\u0122\3\2\2\2\u0495\u0498\n\17\2\2\u0496\u0498\5\u0115\u008b\2\u0497", - "\u0495\3\2\2\2\u0497\u0496\3\2\2\2\u0498\u0124\3\2\2\2\u0499\u049b\7", - "%\2\2\u049a\u049c\5\u0129\u0095\2\u049b\u049a\3\2\2\2\u049b\u049c\3", - "\2\2\2\u049c\u049d\3\2\2\2\u049d\u049f\5\u00e3r\2\u049e\u04a0\5\u0129", - "\u0095\2\u049f\u049e\3\2\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a1\3\2\2\2", - "\u04a1\u04a5\5\u011d\u008f\2\u04a2\u04a4\n\20\2\2\u04a3\u04a2\3\2\2", - "\2\u04a4\u04a7\3\2\2\2\u04a5\u04a3\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6", - "\u04a8\3\2\2\2\u04a7\u04a5\3\2\2\2\u04a8\u04a9\b\u0093\2\2\u04a9\u0126", - "\3\2\2\2\u04aa\u04ac\7%\2\2\u04ab\u04ad\5\u0129\u0095\2\u04ac\u04ab", - "\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af\7r\2\2", - "\u04af\u04b0\7t\2\2\u04b0\u04b1\7c\2\2\u04b1\u04b2\7i\2\2\u04b2\u04b3", - "\7o\2\2\u04b3\u04b4\7c\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b9\5\u0129\u0095", - "\2\u04b6\u04b8\n\20\2\2\u04b7\u04b6\3\2\2\2\u04b8\u04bb\3\2\2\2\u04b9", - "\u04b7\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bc\3\2\2\2\u04bb\u04b9\3", - "\2\2\2\u04bc\u04bd\b\u0094\2\2\u04bd\u0128\3\2\2\2\u04be\u04c0\t\21", - "\2\2\u04bf\u04be\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04bf\3\2\2\2\u04c1", - "\u04c2\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c4\b\u0095\2\2\u04c4\u012a", - "\3\2\2\2\u04c5\u04c7\7\17\2\2\u04c6\u04c8\7\f\2\2\u04c7\u04c6\3\2\2", - "\2\u04c7\u04c8\3\2\2\2\u04c8\u04cb\3\2\2\2\u04c9\u04cb\7\f\2\2\u04ca", - "\u04c5\3\2\2\2\u04ca\u04c9\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc\u04cd\b", - "\u0096\2\2\u04cd\u012c\3\2\2\2\u04ce\u04cf\7\61\2\2\u04cf\u04d0\7,\2", - "\2\u04d0\u04d4\3\2\2\2\u04d1\u04d3\13\2\2\2\u04d2\u04d1\3\2\2\2\u04d3", - "\u04d6\3\2\2\2\u04d4\u04d5\3\2\2\2\u04d4\u04d2\3\2\2\2\u04d5\u04d7\3", - "\2\2\2\u04d6\u04d4\3\2\2\2\u04d7\u04d8\7,\2\2\u04d8\u04d9\7\61\2\2\u04d9", - "\u04da\3\2\2\2\u04da\u04db\b\u0097\2\2\u04db\u012e\3\2\2\2\u04dc\u04dd", - "\7\61\2\2\u04dd\u04de\7\61\2\2\u04de\u04e2\3\2\2\2\u04df\u04e1\n\20", - "\2\2\u04e0\u04df\3\2\2\2\u04e1\u04e4\3\2\2\2\u04e2\u04e0\3\2\2\2\u04e2", - "\u04e3\3\2\2\2\u04e3\u04e5\3\2\2\2\u04e4\u04e2\3\2\2\2\u04e5\u04e6\b", - "\u0098\2\2\u04e6\u0130\3\2\2\2=\2\u0380\u0382\u0387\u0397\u03a1\u03a5", - "\u03a9\u03ad\u03af\u03b5\u03bc\u03c3\u03d0\u03d7\u03db\u03dd\u03e7\u03eb", - "\u03ef\u03f2\u03f7\u03f9\u03ff\u0405\u0407\u040a\u0411\u0415\u041a\u041d", - "\u0424\u0427\u042e\u0432\u0437\u043a\u043f\u0459\u045e\u0462\u0468\u0478", - "\u0480\u0483\u0487\u048e\u0493\u0497\u049b\u049f\u04a5\u04ac\u04b9\u04c1", - "\u04c7\u04ca\u04d4\u04e2\3\b\2\2"].join(""); + "\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b\4\u009c\t\u009c", + "\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3", + "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4", + "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5", + "\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7", + "\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t", + "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n", + "\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13", + "\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", + "\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17", + "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\21\3", + "\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22", + "\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3", + "\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27", + "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3", + "\31\3\31\3\31\3\31\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33", + "\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3", + "\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3", + "!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%", + "\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3", + "(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+", + "\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3", + ".\3.\3/\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61", + "\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\63\3", + "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64", + "\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3", + "\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\3", + "8\38\38\38\38\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:", + "\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3=\3", + "=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>", + "\3>\3>\3>\3>\3>\3?\3?\3@\3@\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3F\3F\3F\3", + "G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3K\3K\3L\3L\3L\3M\3M\3N\3N\3N\3O\3O", + "\3P\3P\3Q\3Q\3R\3R\3S\3S\3T\3T\3T\3U\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3", + "Z\3Z\3[\3[\3\\\3\\\3]\3]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3a\3a\3a\3b\3b\3", + "b\3c\3c\3c\3c\3d\3d\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3h\3i\3i", + "\3i\3j\3j\3j\3k\3k\3l\3l\3l\3l\3m\3m\3m\7m\u039a\nm\fm\16m\u039d\13", + "m\3n\3n\5n\u03a1\nn\3o\3o\3p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3q\3q\5q\u03b1", + "\nq\3r\3r\3r\3r\3r\3s\3s\3s\5s\u03bb\ns\3t\3t\5t\u03bf\nt\3t\3t\5t\u03c3", + "\nt\3t\3t\5t\u03c7\nt\5t\u03c9\nt\3u\3u\7u\u03cd\nu\fu\16u\u03d0\13", + "u\3v\3v\7v\u03d4\nv\fv\16v\u03d7\13v\3w\3w\6w\u03db\nw\rw\16w\u03dc", + "\3x\3x\3x\3y\3y\3z\3z\3{\3{\3|\3|\5|\u03ea\n|\3|\3|\3|\3|\3|\5|\u03f1", + "\n|\3|\3|\5|\u03f5\n|\5|\u03f7\n|\3}\3}\3~\3~\3\177\3\177\3\177\3\177", + "\5\177\u0401\n\177\3\u0080\3\u0080\5\u0080\u0405\n\u0080\3\u0081\3\u0081", + "\5\u0081\u0409\n\u0081\3\u0081\5\u0081\u040c\n\u0081\3\u0081\3\u0081", + "\3\u0081\5\u0081\u0411\n\u0081\5\u0081\u0413\n\u0081\3\u0082\3\u0082", + "\3\u0082\3\u0082\5\u0082\u0419\n\u0082\3\u0082\3\u0082\3\u0082\3\u0082", + "\5\u0082\u041f\n\u0082\5\u0082\u0421\n\u0082\3\u0083\5\u0083\u0424\n", + "\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\5\u0083\u042b\n\u0083", + "\3\u0084\3\u0084\5\u0084\u042f\n\u0084\3\u0084\3\u0084\3\u0084\5\u0084", + "\u0434\n\u0084\3\u0084\5\u0084\u0437\n\u0084\3\u0085\3\u0085\3\u0086", + "\6\u0086\u043c\n\u0086\r\u0086\16\u0086\u043d\3\u0087\5\u0087\u0441", + "\n\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\5\u0087\u0448\n\u0087", + "\3\u0088\3\u0088\5\u0088\u044c\n\u0088\3\u0088\3\u0088\3\u0088\5\u0088", + "\u0451\n\u0088\3\u0088\5\u0088\u0454\n\u0088\3\u0089\6\u0089\u0457\n", + "\u0089\r\u0089\16\u0089\u0458\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b", + "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b", + "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b", + "\3\u008b\5\u008b\u0473\n\u008b\3\u008c\6\u008c\u0476\n\u008c\r\u008c", + "\16\u008c\u0477\3\u008d\3\u008d\5\u008d\u047c\n\u008d\3\u008e\3\u008e", + "\3\u008e\3\u008e\5\u008e\u0482\n\u008e\3\u008f\3\u008f\3\u008f\3\u0090", + "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090", + "\3\u0090\5\u0090\u0492\n\u0090\3\u0091\3\u0091\3\u0091\3\u0091\6\u0091", + "\u0498\n\u0091\r\u0091\16\u0091\u0499\3\u0092\5\u0092\u049d\n\u0092", + "\3\u0092\3\u0092\5\u0092\u04a1\n\u0092\3\u0092\3\u0092\3\u0093\3\u0093", + "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\5\u0094\u04ac\n\u0094\3\u0095", + "\6\u0095\u04af\n\u0095\r\u0095\16\u0095\u04b0\3\u0096\3\u0096\5\u0096", + "\u04b5\n\u0096\3\u0097\3\u0097\5\u0097\u04b9\n\u0097\3\u0097\3\u0097", + "\5\u0097\u04bd\n\u0097\3\u0097\3\u0097\7\u0097\u04c1\n\u0097\f\u0097", + "\16\u0097\u04c4\13\u0097\3\u0097\3\u0097\3\u0098\3\u0098\5\u0098\u04ca", + "\n\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098", + "\3\u0098\7\u0098\u04d5\n\u0098\f\u0098\16\u0098\u04d8\13\u0098\3\u0098", + "\3\u0098\3\u0099\6\u0099\u04dd\n\u0099\r\u0099\16\u0099\u04de\3\u0099", + "\3\u0099\3\u009a\3\u009a\5\u009a\u04e5\n\u009a\3\u009a\5\u009a\u04e8", + "\n\u009a\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\7\u009b\u04f0", + "\n\u009b\f\u009b\16\u009b\u04f3\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b", + "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u04fe\n\u009c\f\u009c", + "\16\u009c\u0501\13\u009c\3\u009c\3\u009c\3\u04f1\2\u009d\3\3\5\4\7\5", + "\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22", + "#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"", + "C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;", + "u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008f", + "I\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3", + "S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7", + "]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cb", + "g\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db\2\u00dd\2\u00df", + "\2\u00e1\2\u00e3\2\u00e5o\u00e7\2\u00e9\2\u00eb\2\u00ed\2\u00ef\2\u00f1", + "\2\u00f3\2\u00f5\2\u00f7\2\u00f9\2\u00fb\2\u00fd\2\u00ff\2\u0101\2\u0103", + "\2\u0105\2\u0107\2\u0109\2\u010b\2\u010d\2\u010f\2\u0111\2\u0113\2\u0115", + "\2\u0117\2\u0119\2\u011b\2\u011d\2\u011f\2\u0121\2\u0123p\u0125q\u0127", + "\2\u0129\2\u012b\2\u012dr\u012fs\u0131t\u0133u\u0135v\u0137w\3\2\22", + "\5\2C\\aac|\3\2\62;\4\2ZZzz\3\2\63;\3\2\629\5\2\62;CHch\4\2WWww\4\2", + "NNnn\4\2--//\6\2HHNNhhnn\6\2\f\f\17\17))^^\f\2$$))AA^^cdhhppttvvxx\5", + "\2NNWWww\6\2\f\f\17\17$$^^\4\2\f\f\17\17\4\2\13\13\"\"\u0520\2\3\3\2", + "\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2", + "\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31", + "\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2", + "\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2", + "\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2", + ";\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G", + "\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3", + "\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2", + "\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2", + "\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2", + "\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083", + "\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2", + "\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2", + "\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d", + "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2", + "\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2", + "\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7", + "\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2", + "\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2", + "\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1", + "\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2", + "\2\2\2\u00e5\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u012d\3\2\2\2", + "\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137", + "\3\2\2\2\3\u0139\3\2\2\2\5\u0147\3\2\2\2\7\u0158\3\2\2\2\t\u016b\3\2", + "\2\2\13\u0172\3\2\2\2\r\u017a\3\2\2\2\17\u0182\3\2\2\2\21\u018d\3\2", + "\2\2\23\u0198\3\2\2\2\25\u01a2\3\2\2\2\27\u01ad\3\2\2\2\31\u01b3\3\2", + "\2\2\33\u01c1\3\2\2\2\35\u01c9\3\2\2\2\37\u01d6\3\2\2\2!\u01d8\3\2\2", + "\2#\u01e0\3\2\2\2%\u01e7\3\2\2\2\'\u01ec\3\2\2\2)\u01f2\3\2\2\2+\u01f7", + "\3\2\2\2-\u01fc\3\2\2\2/\u0202\3\2\2\2\61\u020b\3\2\2\2\63\u0213\3\2", + "\2\2\65\u0216\3\2\2\2\67\u021d\3\2\2\29\u0222\3\2\2\2;\u0227\3\2\2\2", + "=\u022e\3\2\2\2?\u0234\3\2\2\2A\u0238\3\2\2\2C\u023d\3\2\2\2E\u0240", + "\3\2\2\2G\u0247\3\2\2\2I\u024b\3\2\2\2K\u0250\3\2\2\2M\u0259\3\2\2\2", + "O\u0262\3\2\2\2Q\u0269\3\2\2\2S\u026f\3\2\2\2U\u0276\3\2\2\2W\u027d", + "\3\2\2\2Y\u0284\3\2\2\2[\u028b\3\2\2\2]\u0292\3\2\2\2_\u029a\3\2\2\2", + "a\u02a0\3\2\2\2c\u02a9\3\2\2\2e\u02ae\3\2\2\2g\u02b7\3\2\2\2i\u02bd", + "\3\2\2\2k\u02c6\3\2\2\2m\u02cf\3\2\2\2o\u02d7\3\2\2\2q\u02dd\3\2\2\2", + "s\u02e6\3\2\2\2u\u02ef\3\2\2\2w\u02fa\3\2\2\2y\u0304\3\2\2\2{\u0313", + "\3\2\2\2}\u0321\3\2\2\2\177\u0323\3\2\2\2\u0081\u0325\3\2\2\2\u0083", + "\u0327\3\2\2\2\u0085\u0329\3\2\2\2\u0087\u032b\3\2\2\2\u0089\u032d\3", + "\2\2\2\u008b\u032f\3\2\2\2\u008d\u0332\3\2\2\2\u008f\u0334\3\2\2\2\u0091", + "\u0337\3\2\2\2\u0093\u033a\3\2\2\2\u0095\u033d\3\2\2\2\u0097\u033f\3", + "\2\2\2\u0099\u0342\3\2\2\2\u009b\u0344\3\2\2\2\u009d\u0347\3\2\2\2\u009f", + "\u0349\3\2\2\2\u00a1\u034b\3\2\2\2\u00a3\u034d\3\2\2\2\u00a5\u034f\3", + "\2\2\2\u00a7\u0351\3\2\2\2\u00a9\u0354\3\2\2\2\u00ab\u0357\3\2\2\2\u00ad", + "\u0359\3\2\2\2\u00af\u035b\3\2\2\2\u00b1\u035d\3\2\2\2\u00b3\u035f\3", + "\2\2\2\u00b5\u0361\3\2\2\2\u00b7\u0363\3\2\2\2\u00b9\u0365\3\2\2\2\u00bb", + "\u0367\3\2\2\2\u00bd\u036a\3\2\2\2\u00bf\u036d\3\2\2\2\u00c1\u0370\3", + "\2\2\2\u00c3\u0373\3\2\2\2\u00c5\u0376\3\2\2\2\u00c7\u037a\3\2\2\2\u00c9", + "\u037e\3\2\2\2\u00cb\u0381\3\2\2\2\u00cd\u0384\3\2\2\2\u00cf\u0387\3", + "\2\2\2\u00d1\u038a\3\2\2\2\u00d3\u038d\3\2\2\2\u00d5\u0390\3\2\2\2\u00d7", + "\u0392\3\2\2\2\u00d9\u0396\3\2\2\2\u00db\u03a0\3\2\2\2\u00dd\u03a2\3", + "\2\2\2\u00df\u03a4\3\2\2\2\u00e1\u03b0\3\2\2\2\u00e3\u03b2\3\2\2\2\u00e5", + "\u03ba\3\2\2\2\u00e7\u03c8\3\2\2\2\u00e9\u03ca\3\2\2\2\u00eb\u03d1\3", + "\2\2\2\u00ed\u03d8\3\2\2\2\u00ef\u03de\3\2\2\2\u00f1\u03e1\3\2\2\2\u00f3", + "\u03e3\3\2\2\2\u00f5\u03e5\3\2\2\2\u00f7\u03f6\3\2\2\2\u00f9\u03f8\3", + "\2\2\2\u00fb\u03fa\3\2\2\2\u00fd\u0400\3\2\2\2\u00ff\u0404\3\2\2\2\u0101", + "\u0412\3\2\2\2\u0103\u0420\3\2\2\2\u0105\u042a\3\2\2\2\u0107\u0436\3", + "\2\2\2\u0109\u0438\3\2\2\2\u010b\u043b\3\2\2\2\u010d\u0447\3\2\2\2\u010f", + "\u0453\3\2\2\2\u0111\u0456\3\2\2\2\u0113\u045a\3\2\2\2\u0115\u0472\3", + "\2\2\2\u0117\u0475\3\2\2\2\u0119\u047b\3\2\2\2\u011b\u0481\3\2\2\2\u011d", + "\u0483\3\2\2\2\u011f\u0491\3\2\2\2\u0121\u0493\3\2\2\2\u0123\u049c\3", + "\2\2\2\u0125\u04a4\3\2\2\2\u0127\u04ab\3\2\2\2\u0129\u04ae\3\2\2\2\u012b", + "\u04b4\3\2\2\2\u012d\u04b6\3\2\2\2\u012f\u04c7\3\2\2\2\u0131\u04dc\3", + "\2\2\2\u0133\u04e7\3\2\2\2\u0135\u04eb\3\2\2\2\u0137\u04f9\3\2\2\2\u0139", + "\u013a\7a\2\2\u013a\u013b\7a\2\2\u013b\u013c\7g\2\2\u013c\u013d\7z\2", + "\2\u013d\u013e\7v\2\2\u013e\u013f\7g\2\2\u013f\u0140\7p\2\2\u0140\u0141", + "\7u\2\2\u0141\u0142\7k\2\2\u0142\u0143\7q\2\2\u0143\u0144\7p\2\2\u0144", + "\u0145\7a\2\2\u0145\u0146\7a\2\2\u0146\4\3\2\2\2\u0147\u0148\7a\2\2", + "\u0148\u0149\7a\2\2\u0149\u014a\7d\2\2\u014a\u014b\7w\2\2\u014b\u014c", + "\7k\2\2\u014c\u014d\7n\2\2\u014d\u014e\7v\2\2\u014e\u014f\7k\2\2\u014f", + "\u0150\7p\2\2\u0150\u0151\7a\2\2\u0151\u0152\7x\2\2\u0152\u0153\7c\2", + "\2\u0153\u0154\7a\2\2\u0154\u0155\7c\2\2\u0155\u0156\7t\2\2\u0156\u0157", + "\7i\2\2\u0157\6\3\2\2\2\u0158\u0159\7a\2\2\u0159\u015a\7a\2\2\u015a", + "\u015b\7d\2\2\u015b\u015c\7w\2\2\u015c\u015d\7k\2\2\u015d\u015e\7n\2", + "\2\u015e\u015f\7v\2\2\u015f\u0160\7k\2\2\u0160\u0161\7p\2\2\u0161\u0162", + "\7a\2\2\u0162\u0163\7q\2\2\u0163\u0164\7h\2\2\u0164\u0165\7h\2\2\u0165", + "\u0166\7u\2\2\u0166\u0167\7g\2\2\u0167\u0168\7v\2\2\u0168\u0169\7q\2", + "\2\u0169\u016a\7h\2\2\u016a\b\3\2\2\2\u016b\u016c\7a\2\2\u016c\u016d", + "\7a\2\2\u016d\u016e\7o\2\2\u016e\u016f\7\63\2\2\u016f\u0170\7\64\2\2", + "\u0170\u0171\7:\2\2\u0171\n\3\2\2\2\u0172\u0173\7a\2\2\u0173\u0174\7", + "a\2\2\u0174\u0175\7o\2\2\u0175\u0176\7\63\2\2\u0176\u0177\7\64\2\2\u0177", + "\u0178\7:\2\2\u0178\u0179\7f\2\2\u0179\f\3\2\2\2\u017a\u017b\7a\2\2", + "\u017b\u017c\7a\2\2\u017c\u017d\7o\2\2\u017d\u017e\7\63\2\2\u017e\u017f", + "\7\64\2\2\u017f\u0180\7:\2\2\u0180\u0181\7k\2\2\u0181\16\3\2\2\2\u0182", + "\u0183\7a\2\2\u0183\u0184\7a\2\2\u0184\u0185\7v\2\2\u0185\u0186\7{\2", + "\2\u0186\u0187\7r\2\2\u0187\u0188\7g\2\2\u0188\u0189\7q\2\2\u0189\u018a", + "\7h\2\2\u018a\u018b\7a\2\2\u018b\u018c\7a\2\2\u018c\20\3\2\2\2\u018d", + "\u018e\7a\2\2\u018e\u018f\7a\2\2\u018f\u0190\7k\2\2\u0190\u0191\7p\2", + "\2\u0191\u0192\7n\2\2\u0192\u0193\7k\2\2\u0193\u0194\7p\2\2\u0194\u0195", + "\7g\2\2\u0195\u0196\7a\2\2\u0196\u0197\7a\2\2\u0197\22\3\2\2\2\u0198", + "\u0199\7a\2\2\u0199\u019a\7a\2\2\u019a\u019b\7u\2\2\u019b\u019c\7v\2", + "\2\u019c\u019d\7f\2\2\u019d\u019e\7e\2\2\u019e\u019f\7c\2\2\u019f\u01a0", + "\7n\2\2\u01a0\u01a1\7n\2\2\u01a1\24\3\2\2\2\u01a2\u01a3\7a\2\2\u01a3", + "\u01a4\7a\2\2\u01a4\u01a5\7f\2\2\u01a5\u01a6\7g\2\2\u01a6\u01a7\7e\2", + "\2\u01a7\u01a8\7n\2\2\u01a8\u01a9\7u\2\2\u01a9\u01aa\7r\2\2\u01aa\u01ab", + "\7g\2\2\u01ab\u01ac\7e\2\2\u01ac\26\3\2\2\2\u01ad\u01ae\7a\2\2\u01ae", + "\u01af\7a\2\2\u01af\u01b0\7c\2\2\u01b0\u01b1\7u\2\2\u01b1\u01b2\7o\2", + "\2\u01b2\30\3\2\2\2\u01b3\u01b4\7a\2\2\u01b4\u01b5\7a\2\2\u01b5\u01b6", + "\7c\2\2\u01b6\u01b7\7v\2\2\u01b7\u01b8\7v\2\2\u01b8\u01b9\7t\2\2\u01b9", + "\u01ba\7k\2\2\u01ba\u01bb\7d\2\2\u01bb\u01bc\7w\2\2\u01bc\u01bd\7v\2", + "\2\u01bd\u01be\7g\2\2\u01be\u01bf\7a\2\2\u01bf\u01c0\7a\2\2\u01c0\32", + "\3\2\2\2\u01c1\u01c2\7a\2\2\u01c2\u01c3\7a\2\2\u01c3\u01c4\7c\2\2\u01c4", + "\u01c5\7u\2\2\u01c5\u01c6\7o\2\2\u01c6\u01c7\7a\2\2\u01c7\u01c8\7a\2", + "\2\u01c8\34\3\2\2\2\u01c9\u01ca\7a\2\2\u01ca\u01cb\7a\2\2\u01cb\u01cc", + "\7x\2\2\u01cc\u01cd\7q\2\2\u01cd\u01ce\7n\2\2\u01ce\u01cf\7c\2\2\u01cf", + "\u01d0\7v\2\2\u01d0\u01d1\7k\2\2\u01d1\u01d2\7n\2\2\u01d2\u01d3\7g\2", + "\2\u01d3\u01d4\7a\2\2\u01d4\u01d5\7a\2\2\u01d5\36\3\2\2\2\u01d6\u01d7", + "\7%\2\2\u01d7 \3\2\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7p\2\2\u01da\u01db", + "\7e\2\2\u01db\u01dc\7n\2\2\u01dc\u01dd\7w\2\2\u01dd\u01de\7f\2\2\u01de", + "\u01df\7g\2\2\u01df\"\3\2\2\2\u01e0\u01e1\7f\2\2\u01e1\u01e2\7g\2\2", + "\u01e2\u01e3\7h\2\2\u01e3\u01e4\7k\2\2\u01e4\u01e5\7p\2\2\u01e5\u01e6", + "\7g\2\2\u01e6$\3\2\2\2\u01e7\u01e8\7c\2\2\u01e8\u01e9\7w\2\2\u01e9\u01ea", + "\7v\2\2\u01ea\u01eb\7q\2\2\u01eb&\3\2\2\2\u01ec\u01ed\7d\2\2\u01ed\u01ee", + "\7t\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7m\2\2\u01f1", + "(\3\2\2\2\u01f2\u01f3\7e\2\2\u01f3\u01f4\7c\2\2\u01f4\u01f5\7u\2\2\u01f5", + "\u01f6\7g\2\2\u01f6*\3\2\2\2\u01f7\u01f8\7e\2\2\u01f8\u01f9\7j\2\2\u01f9", + "\u01fa\7c\2\2\u01fa\u01fb\7t\2\2\u01fb,\3\2\2\2\u01fc\u01fd\7e\2\2\u01fd", + "\u01fe\7q\2\2\u01fe\u01ff\7p\2\2\u01ff\u0200\7u\2\2\u0200\u0201\7v\2", + "\2\u0201.\3\2\2\2\u0202\u0203\7e\2\2\u0203\u0204\7q\2\2\u0204\u0205", + "\7p\2\2\u0205\u0206\7v\2\2\u0206\u0207\7k\2\2\u0207\u0208\7p\2\2\u0208", + "\u0209\7w\2\2\u0209\u020a\7g\2\2\u020a\60\3\2\2\2\u020b\u020c\7f\2\2", + "\u020c\u020d\7g\2\2\u020d\u020e\7h\2\2\u020e\u020f\7c\2\2\u020f\u0210", + "\7w\2\2\u0210\u0211\7n\2\2\u0211\u0212\7v\2\2\u0212\62\3\2\2\2\u0213", + "\u0214\7f\2\2\u0214\u0215\7q\2\2\u0215\64\3\2\2\2\u0216\u0217\7f\2\2", + "\u0217\u0218\7q\2\2\u0218\u0219\7w\2\2\u0219\u021a\7d\2\2\u021a\u021b", + "\7n\2\2\u021b\u021c\7g\2\2\u021c\66\3\2\2\2\u021d\u021e\7g\2\2\u021e", + "\u021f\7n\2\2\u021f\u0220\7u\2\2\u0220\u0221\7g\2\2\u02218\3\2\2\2\u0222", + "\u0223\7g\2\2\u0223\u0224\7p\2\2\u0224\u0225\7w\2\2\u0225\u0226\7o\2", + "\2\u0226:\3\2\2\2\u0227\u0228\7g\2\2\u0228\u0229\7z\2\2\u0229\u022a", + "\7v\2\2\u022a\u022b\7g\2\2\u022b\u022c\7t\2\2\u022c\u022d\7p\2\2\u022d", + "<\3\2\2\2\u022e\u022f\7h\2\2\u022f\u0230\7n\2\2\u0230\u0231\7q\2\2\u0231", + "\u0232\7c\2\2\u0232\u0233\7v\2\2\u0233>\3\2\2\2\u0234\u0235\7h\2\2\u0235", + "\u0236\7q\2\2\u0236\u0237\7t\2\2\u0237@\3\2\2\2\u0238\u0239\7i\2\2\u0239", + "\u023a\7q\2\2\u023a\u023b\7v\2\2\u023b\u023c\7q\2\2\u023cB\3\2\2\2\u023d", + "\u023e\7k\2\2\u023e\u023f\7h\2\2\u023fD\3\2\2\2\u0240\u0241\7k\2\2\u0241", + "\u0242\7p\2\2\u0242\u0243\7n\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2", + "\2\u0245\u0246\7g\2\2\u0246F\3\2\2\2\u0247\u0248\7k\2\2\u0248\u0249", + "\7p\2\2\u0249\u024a\7v\2\2\u024aH\3\2\2\2\u024b\u024c\7n\2\2\u024c\u024d", + "\7q\2\2\u024d\u024e\7p\2\2\u024e\u024f\7i\2\2\u024fJ\3\2\2\2\u0250\u0251", + "\7t\2\2\u0251\u0252\7g\2\2\u0252\u0253\7i\2\2\u0253\u0254\7k\2\2\u0254", + "\u0255\7u\2\2\u0255\u0256\7v\2\2\u0256\u0257\7g\2\2\u0257\u0258\7t\2", + "\2\u0258L\3\2\2\2\u0259\u025a\7t\2\2\u025a\u025b\7g\2\2\u025b\u025c", + "\7u\2\2\u025c\u025d\7v\2\2\u025d\u025e\7t\2\2\u025e\u025f\7k\2\2\u025f", + "\u0260\7e\2\2\u0260\u0261\7v\2\2\u0261N\3\2\2\2\u0262\u0263\7t\2\2\u0263", + "\u0264\7g\2\2\u0264\u0265\7v\2\2\u0265\u0266\7w\2\2\u0266\u0267\7t\2", + "\2\u0267\u0268\7p\2\2\u0268P\3\2\2\2\u0269\u026a\7u\2\2\u026a\u026b", + "\7j\2\2\u026b\u026c\7q\2\2\u026c\u026d\7t\2\2\u026d\u026e\7v\2\2\u026e", + "R\3\2\2\2\u026f\u0270\7u\2\2\u0270\u0271\7k\2\2\u0271\u0272\7i\2\2\u0272", + "\u0273\7p\2\2\u0273\u0274\7g\2\2\u0274\u0275\7f\2\2\u0275T\3\2\2\2\u0276", + "\u0277\7u\2\2\u0277\u0278\7k\2\2\u0278\u0279\7|\2\2\u0279\u027a\7g\2", + "\2\u027a\u027b\7q\2\2\u027b\u027c\7h\2\2\u027cV\3\2\2\2\u027d\u027e", + "\7u\2\2\u027e\u027f\7v\2\2\u027f\u0280\7c\2\2\u0280\u0281\7v\2\2\u0281", + "\u0282\7k\2\2\u0282\u0283\7e\2\2\u0283X\3\2\2\2\u0284\u0285\7u\2\2\u0285", + "\u0286\7v\2\2\u0286\u0287\7t\2\2\u0287\u0288\7w\2\2\u0288\u0289\7e\2", + "\2\u0289\u028a\7v\2\2\u028aZ\3\2\2\2\u028b\u028c\7u\2\2\u028c\u028d", + "\7y\2\2\u028d\u028e\7k\2\2\u028e\u028f\7v\2\2\u028f\u0290\7e\2\2\u0290", + "\u0291\7j\2\2\u0291\\\3\2\2\2\u0292\u0293\7v\2\2\u0293\u0294\7{\2\2", + "\u0294\u0295\7r\2\2\u0295\u0296\7g\2\2\u0296\u0297\7f\2\2\u0297\u0298", + "\7g\2\2\u0298\u0299\7h\2\2\u0299^\3\2\2\2\u029a\u029b\7w\2\2\u029b\u029c", + "\7p\2\2\u029c\u029d\7k\2\2\u029d\u029e\7q\2\2\u029e\u029f\7p\2\2\u029f", + "`\3\2\2\2\u02a0\u02a1\7w\2\2\u02a1\u02a2\7p\2\2\u02a2\u02a3\7u\2\2\u02a3", + "\u02a4\7k\2\2\u02a4\u02a5\7i\2\2\u02a5\u02a6\7p\2\2\u02a6\u02a7\7g\2", + "\2\u02a7\u02a8\7f\2\2\u02a8b\3\2\2\2\u02a9\u02aa\7x\2\2\u02aa\u02ab", + "\7q\2\2\u02ab\u02ac\7k\2\2\u02ac\u02ad\7f\2\2\u02add\3\2\2\2\u02ae\u02af", + "\7x\2\2\u02af\u02b0\7q\2\2\u02b0\u02b1\7n\2\2\u02b1\u02b2\7c\2\2\u02b2", + "\u02b3\7v\2\2\u02b3\u02b4\7k\2\2\u02b4\u02b5\7n\2\2\u02b5\u02b6\7g\2", + "\2\u02b6f\3\2\2\2\u02b7\u02b8\7y\2\2\u02b8\u02b9\7j\2\2\u02b9\u02ba", + "\7k\2\2\u02ba\u02bb\7n\2\2\u02bb\u02bc\7g\2\2\u02bch\3\2\2\2\u02bd\u02be", + "\7a\2\2\u02be\u02bf\7C\2\2\u02bf\u02c0\7n\2\2\u02c0\u02c1\7k\2\2\u02c1", + "\u02c2\7i\2\2\u02c2\u02c3\7p\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7u\2", + "\2\u02c5j\3\2\2\2\u02c6\u02c7\7a\2\2\u02c7\u02c8\7C\2\2\u02c8\u02c9", + "\7n\2\2\u02c9\u02ca\7k\2\2\u02ca\u02cb\7i\2\2\u02cb\u02cc\7p\2\2\u02cc", + "\u02cd\7q\2\2\u02cd\u02ce\7h\2\2\u02cel\3\2\2\2\u02cf\u02d0\7a\2\2\u02d0", + "\u02d1\7C\2\2\u02d1\u02d2\7v\2\2\u02d2\u02d3\7q\2\2\u02d3\u02d4\7o\2", + "\2\u02d4\u02d5\7k\2\2\u02d5\u02d6\7e\2\2\u02d6n\3\2\2\2\u02d7\u02d8", + "\7a\2\2\u02d8\u02d9\7D\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7q\2\2\u02db", + "\u02dc\7n\2\2\u02dcp\3\2\2\2\u02dd\u02de\7a\2\2\u02de\u02df\7E\2\2\u02df", + "\u02e0\7q\2\2\u02e0\u02e1\7o\2\2\u02e1\u02e2\7r\2\2\u02e2\u02e3\7n\2", + "\2\u02e3\u02e4\7g\2\2\u02e4\u02e5\7z\2\2\u02e5r\3\2\2\2\u02e6\u02e7", + "\7a\2\2\u02e7\u02e8\7I\2\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7p\2\2\u02ea", + "\u02eb\7g\2\2\u02eb\u02ec\7t\2\2\u02ec\u02ed\7k\2\2\u02ed\u02ee\7e\2", + "\2\u02eet\3\2\2\2\u02ef\u02f0\7a\2\2\u02f0\u02f1\7K\2\2\u02f1\u02f2", + "\7o\2\2\u02f2\u02f3\7c\2\2\u02f3\u02f4\7i\2\2\u02f4\u02f5\7k\2\2\u02f5", + "\u02f6\7p\2\2\u02f6\u02f7\7c\2\2\u02f7\u02f8\7t\2\2\u02f8\u02f9\7{\2", + "\2\u02f9v\3\2\2\2\u02fa\u02fb\7a\2\2\u02fb\u02fc\7P\2\2\u02fc\u02fd", + "\7q\2\2\u02fd\u02fe\7t\2\2\u02fe\u02ff\7g\2\2\u02ff\u0300\7v\2\2\u0300", + "\u0301\7w\2\2\u0301\u0302\7t\2\2\u0302\u0303\7p\2\2\u0303x\3\2\2\2\u0304", + "\u0305\7a\2\2\u0305\u0306\7U\2\2\u0306\u0307\7v\2\2\u0307\u0308\7c\2", + "\2\u0308\u0309\7v\2\2\u0309\u030a\7k\2\2\u030a\u030b\7e\2\2\u030b\u030c", + "\7a\2\2\u030c\u030d\7c\2\2\u030d\u030e\7u\2\2\u030e\u030f\7u\2\2\u030f", + "\u0310\7g\2\2\u0310\u0311\7t\2\2\u0311\u0312\7v\2\2\u0312z\3\2\2\2\u0313", + "\u0314\7a\2\2\u0314\u0315\7V\2\2\u0315\u0316\7j\2\2\u0316\u0317\7t\2", + "\2\u0317\u0318\7g\2\2\u0318\u0319\7c\2\2\u0319\u031a\7f\2\2\u031a\u031b", + "\7a\2\2\u031b\u031c\7n\2\2\u031c\u031d\7q\2\2\u031d\u031e\7e\2\2\u031e", + "\u031f\7c\2\2\u031f\u0320\7n\2\2\u0320|\3\2\2\2\u0321\u0322\7*\2\2\u0322", + "~\3\2\2\2\u0323\u0324\7+\2\2\u0324\u0080\3\2\2\2\u0325\u0326\7]\2\2", + "\u0326\u0082\3\2\2\2\u0327\u0328\7_\2\2\u0328\u0084\3\2\2\2\u0329\u032a", + "\7}\2\2\u032a\u0086\3\2\2\2\u032b\u032c\7\177\2\2\u032c\u0088\3\2\2", + "\2\u032d\u032e\7>\2\2\u032e\u008a\3\2\2\2\u032f\u0330\7>\2\2\u0330\u0331", + "\7?\2\2\u0331\u008c\3\2\2\2\u0332\u0333\7@\2\2\u0333\u008e\3\2\2\2\u0334", + "\u0335\7@\2\2\u0335\u0336\7?\2\2\u0336\u0090\3\2\2\2\u0337\u0338\7>", + "\2\2\u0338\u0339\7>\2\2\u0339\u0092\3\2\2\2\u033a\u033b\7@\2\2\u033b", + "\u033c\7@\2\2\u033c\u0094\3\2\2\2\u033d\u033e\7-\2\2\u033e\u0096\3\2", + "\2\2\u033f\u0340\7-\2\2\u0340\u0341\7-\2\2\u0341\u0098\3\2\2\2\u0342", + "\u0343\7/\2\2\u0343\u009a\3\2\2\2\u0344\u0345\7/\2\2\u0345\u0346\7/", + "\2\2\u0346\u009c\3\2\2\2\u0347\u0348\7,\2\2\u0348\u009e\3\2\2\2\u0349", + "\u034a\7\61\2\2\u034a\u00a0\3\2\2\2\u034b\u034c\7\'\2\2\u034c\u00a2", + "\3\2\2\2\u034d\u034e\7(\2\2\u034e\u00a4\3\2\2\2\u034f\u0350\7~\2\2\u0350", + "\u00a6\3\2\2\2\u0351\u0352\7(\2\2\u0352\u0353\7(\2\2\u0353\u00a8\3\2", + "\2\2\u0354\u0355\7~\2\2\u0355\u0356\7~\2\2\u0356\u00aa\3\2\2\2\u0357", + "\u0358\7`\2\2\u0358\u00ac\3\2\2\2\u0359\u035a\7#\2\2\u035a\u00ae\3\2", + "\2\2\u035b\u035c\7\u0080\2\2\u035c\u00b0\3\2\2\2\u035d\u035e\7A\2\2", + "\u035e\u00b2\3\2\2\2\u035f\u0360\7<\2\2\u0360\u00b4\3\2\2\2\u0361\u0362", + "\7=\2\2\u0362\u00b6\3\2\2\2\u0363\u0364\7.\2\2\u0364\u00b8\3\2\2\2\u0365", + "\u0366\7?\2\2\u0366\u00ba\3\2\2\2\u0367\u0368\7,\2\2\u0368\u0369\7?", + "\2\2\u0369\u00bc\3\2\2\2\u036a\u036b\7\61\2\2\u036b\u036c\7?\2\2\u036c", + "\u00be\3\2\2\2\u036d\u036e\7\'\2\2\u036e\u036f\7?\2\2\u036f\u00c0\3", + "\2\2\2\u0370\u0371\7-\2\2\u0371\u0372\7?\2\2\u0372\u00c2\3\2\2\2\u0373", + "\u0374\7/\2\2\u0374\u0375\7?\2\2\u0375\u00c4\3\2\2\2\u0376\u0377\7>", + "\2\2\u0377\u0378\7>\2\2\u0378\u0379\7?\2\2\u0379\u00c6\3\2\2\2\u037a", + "\u037b\7@\2\2\u037b\u037c\7@\2\2\u037c\u037d\7?\2\2\u037d\u00c8\3\2", + "\2\2\u037e\u037f\7(\2\2\u037f\u0380\7?\2\2\u0380\u00ca\3\2\2\2\u0381", + "\u0382\7`\2\2\u0382\u0383\7?\2\2\u0383\u00cc\3\2\2\2\u0384\u0385\7~", + "\2\2\u0385\u0386\7?\2\2\u0386\u00ce\3\2\2\2\u0387\u0388\7?\2\2\u0388", + "\u0389\7?\2\2\u0389\u00d0\3\2\2\2\u038a\u038b\7#\2\2\u038b\u038c\7?", + "\2\2\u038c\u00d2\3\2\2\2\u038d\u038e\7/\2\2\u038e\u038f\7@\2\2\u038f", + "\u00d4\3\2\2\2\u0390\u0391\7\60\2\2\u0391\u00d6\3\2\2\2\u0392\u0393", + "\7\60\2\2\u0393\u0394\7\60\2\2\u0394\u0395\7\60\2\2\u0395\u00d8\3\2", + "\2\2\u0396\u039b\5\u00dbn\2\u0397\u039a\5\u00dbn\2\u0398\u039a\5\u00df", + "p\2\u0399\u0397\3\2\2\2\u0399\u0398\3\2\2\2\u039a\u039d\3\2\2\2\u039b", + "\u0399\3\2\2\2\u039b\u039c\3\2\2\2\u039c\u00da\3\2\2\2\u039d\u039b\3", + "\2\2\2\u039e\u03a1\5\u00ddo\2\u039f\u03a1\5\u00e1q\2\u03a0\u039e\3\2", + "\2\2\u03a0\u039f\3\2\2\2\u03a1\u00dc\3\2\2\2\u03a2\u03a3\t\2\2\2\u03a3", + "\u00de\3\2\2\2\u03a4\u03a5\t\3\2\2\u03a5\u00e0\3\2\2\2\u03a6\u03a7\7", + "^\2\2\u03a7\u03a8\7w\2\2\u03a8\u03a9\3\2\2\2\u03a9\u03b1\5\u00e3r\2", + "\u03aa\u03ab\7^\2\2\u03ab\u03ac\7W\2\2\u03ac\u03ad\3\2\2\2\u03ad\u03ae", + "\5\u00e3r\2\u03ae\u03af\5\u00e3r\2\u03af\u03b1\3\2\2\2\u03b0\u03a6\3", + "\2\2\2\u03b0\u03aa\3\2\2\2\u03b1\u00e2\3\2\2\2\u03b2\u03b3\5\u00f5{", + "\2\u03b3\u03b4\5\u00f5{\2\u03b4\u03b5\5\u00f5{\2\u03b5\u03b6\5\u00f5", + "{\2\u03b6\u00e4\3\2\2\2\u03b7\u03bb\5\u00e7t\2\u03b8\u03bb\5\u00ff\u0080", + "\2\u03b9\u03bb\5\u0115\u008b\2\u03ba\u03b7\3\2\2\2\u03ba\u03b8\3\2\2", + "\2\u03ba\u03b9\3\2\2\2\u03bb\u00e6\3\2\2\2\u03bc\u03be\5\u00e9u\2\u03bd", + "\u03bf\5\u00f7|\2\u03be\u03bd\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c9", + "\3\2\2\2\u03c0\u03c2\5\u00ebv\2\u03c1\u03c3\5\u00f7|\2\u03c2\u03c1\3", + "\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03c9\3\2\2\2\u03c4\u03c6\5\u00edw", + "\2\u03c5\u03c7\5\u00f7|\2\u03c6\u03c5\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7", + "\u03c9\3\2\2\2\u03c8\u03bc\3\2\2\2\u03c8\u03c0\3\2\2\2\u03c8\u03c4\3", + "\2\2\2\u03c9\u00e8\3\2\2\2\u03ca\u03ce\5\u00f1y\2\u03cb\u03cd\5\u00df", + "p\2\u03cc\u03cb\3\2\2\2\u03cd\u03d0\3\2\2\2\u03ce\u03cc\3\2\2\2\u03ce", + "\u03cf\3\2\2\2\u03cf\u00ea\3\2\2\2\u03d0\u03ce\3\2\2\2\u03d1\u03d5\7", + "\62\2\2\u03d2\u03d4\5\u00f3z\2\u03d3\u03d2\3\2\2\2\u03d4\u03d7\3\2\2", + "\2\u03d5\u03d3\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u00ec\3\2\2\2\u03d7", + "\u03d5\3\2\2\2\u03d8\u03da\5\u00efx\2\u03d9\u03db\5\u00f5{\2\u03da\u03d9", + "\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc\u03da\3\2\2\2\u03dc\u03dd\3\2\2\2", + "\u03dd\u00ee\3\2\2\2\u03de\u03df\7\62\2\2\u03df\u03e0\t\4\2\2\u03e0", + "\u00f0\3\2\2\2\u03e1\u03e2\t\5\2\2\u03e2\u00f2\3\2\2\2\u03e3\u03e4\t", + "\6\2\2\u03e4\u00f4\3\2\2\2\u03e5\u03e6\t\7\2\2\u03e6\u00f6\3\2\2\2\u03e7", + "\u03e9\5\u00f9}\2\u03e8\u03ea\5\u00fb~\2\u03e9\u03e8\3\2\2\2\u03e9\u03ea", + "\3\2\2\2\u03ea\u03f7\3\2\2\2\u03eb\u03ec\5\u00f9}\2\u03ec\u03ed\5\u00fd", + "\177\2\u03ed\u03f7\3\2\2\2\u03ee\u03f0\5\u00fb~\2\u03ef\u03f1\5\u00f9", + "}\2\u03f0\u03ef\3\2\2\2\u03f0\u03f1\3\2\2\2\u03f1\u03f7\3\2\2\2\u03f2", + "\u03f4\5\u00fd\177\2\u03f3\u03f5\5\u00f9}\2\u03f4\u03f3\3\2\2\2\u03f4", + "\u03f5\3\2\2\2\u03f5\u03f7\3\2\2\2\u03f6\u03e7\3\2\2\2\u03f6\u03eb\3", + "\2\2\2\u03f6\u03ee\3\2\2\2\u03f6\u03f2\3\2\2\2\u03f7\u00f8\3\2\2\2\u03f8", + "\u03f9\t\b\2\2\u03f9\u00fa\3\2\2\2\u03fa\u03fb\t\t\2\2\u03fb\u00fc\3", + "\2\2\2\u03fc\u03fd\7n\2\2\u03fd\u0401\7n\2\2\u03fe\u03ff\7N\2\2\u03ff", + "\u0401\7N\2\2\u0400\u03fc\3\2\2\2\u0400\u03fe\3\2\2\2\u0401\u00fe\3", + "\2\2\2\u0402\u0405\5\u0101\u0081\2\u0403\u0405\5\u0103\u0082\2\u0404", + "\u0402\3\2\2\2\u0404\u0403\3\2\2\2\u0405\u0100\3\2\2\2\u0406\u0408\5", + "\u0105\u0083\2\u0407\u0409\5\u0107\u0084\2\u0408\u0407\3\2\2\2\u0408", + "\u0409\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u040c\5\u0113\u008a\2\u040b", + "\u040a\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u0413\3\2\2\2\u040d\u040e\5", + "\u010b\u0086\2\u040e\u0410\5\u0107\u0084\2\u040f\u0411\5\u0113\u008a", + "\2\u0410\u040f\3\2\2\2\u0410\u0411\3\2\2\2\u0411\u0413\3\2\2\2\u0412", + "\u0406\3\2\2\2\u0412\u040d\3\2\2\2\u0413\u0102\3\2\2\2\u0414\u0415\5", + "\u00efx\2\u0415\u0416\5\u010d\u0087\2\u0416\u0418\5\u010f\u0088\2\u0417", + "\u0419\5\u0113\u008a\2\u0418\u0417\3\2\2\2\u0418\u0419\3\2\2\2\u0419", + "\u0421\3\2\2\2\u041a\u041b\5\u00efx\2\u041b\u041c\5\u0111\u0089\2\u041c", + "\u041e\5\u010f\u0088\2\u041d\u041f\5\u0113\u008a\2\u041e\u041d\3\2\2", + "\2\u041e\u041f\3\2\2\2\u041f\u0421\3\2\2\2\u0420\u0414\3\2\2\2\u0420", + "\u041a\3\2\2\2\u0421\u0104\3\2\2\2\u0422\u0424\5\u010b\u0086\2\u0423", + "\u0422\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u0425\3\2\2\2\u0425\u0426\7", + "\60\2\2\u0426\u042b\5\u010b\u0086\2\u0427\u0428\5\u010b\u0086\2\u0428", + "\u0429\7\60\2\2\u0429\u042b\3\2\2\2\u042a\u0423\3\2\2\2\u042a\u0427", + "\3\2\2\2\u042b\u0106\3\2\2\2\u042c\u042e\7g\2\2\u042d\u042f\5\u0109", + "\u0085\2\u042e\u042d\3\2\2\2\u042e\u042f\3\2\2\2\u042f\u0430\3\2\2\2", + "\u0430\u0437\5\u010b\u0086\2\u0431\u0433\7G\2\2\u0432\u0434\5\u0109", + "\u0085\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0435\3\2\2\2", + "\u0435\u0437\5\u010b\u0086\2\u0436\u042c\3\2\2\2\u0436\u0431\3\2\2\2", + "\u0437\u0108\3\2\2\2\u0438\u0439\t\n\2\2\u0439\u010a\3\2\2\2\u043a\u043c", + "\5\u00dfp\2\u043b\u043a\3\2\2\2\u043c\u043d\3\2\2\2\u043d\u043b\3\2", + "\2\2\u043d\u043e\3\2\2\2\u043e\u010c\3\2\2\2\u043f\u0441\5\u0111\u0089", + "\2\u0440\u043f\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\3\2\2\2\u0442", + "\u0443\7\60\2\2\u0443\u0448\5\u0111\u0089\2\u0444\u0445\5\u0111\u0089", + "\2\u0445\u0446\7\60\2\2\u0446\u0448\3\2\2\2\u0447\u0440\3\2\2\2\u0447", + "\u0444\3\2\2\2\u0448\u010e\3\2\2\2\u0449\u044b\7r\2\2\u044a\u044c\5", + "\u0109\u0085\2\u044b\u044a\3\2\2\2\u044b\u044c\3\2\2\2\u044c\u044d\3", + "\2\2\2\u044d\u0454\5\u010b\u0086\2\u044e\u0450\7R\2\2\u044f\u0451\5", + "\u0109\u0085\2\u0450\u044f\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\3", + "\2\2\2\u0452\u0454\5\u010b\u0086\2\u0453\u0449\3\2\2\2\u0453\u044e\3", + "\2\2\2\u0454\u0110\3\2\2\2\u0455\u0457\5\u00f5{\2\u0456\u0455\3\2\2", + "\2\u0457\u0458\3\2\2\2\u0458\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459", + "\u0112\3\2\2\2\u045a\u045b\t\13\2\2\u045b\u0114\3\2\2\2\u045c\u045d", + "\7)\2\2\u045d\u045e\5\u0117\u008c\2\u045e\u045f\7)\2\2\u045f\u0473\3", + "\2\2\2\u0460\u0461\7N\2\2\u0461\u0462\7)\2\2\u0462\u0463\3\2\2\2\u0463", + "\u0464\5\u0117\u008c\2\u0464\u0465\7)\2\2\u0465\u0473\3\2\2\2\u0466", + "\u0467\7w\2\2\u0467\u0468\7)\2\2\u0468\u0469\3\2\2\2\u0469\u046a\5\u0117", + "\u008c\2\u046a\u046b\7)\2\2\u046b\u0473\3\2\2\2\u046c\u046d\7W\2\2\u046d", + "\u046e\7)\2\2\u046e\u046f\3\2\2\2\u046f\u0470\5\u0117\u008c\2\u0470", + "\u0471\7)\2\2\u0471\u0473\3\2\2\2\u0472\u045c\3\2\2\2\u0472\u0460\3", + "\2\2\2\u0472\u0466\3\2\2\2\u0472\u046c\3\2\2\2\u0473\u0116\3\2\2\2\u0474", + "\u0476\5\u0119\u008d\2\u0475\u0474\3\2\2\2\u0476\u0477\3\2\2\2\u0477", + "\u0475\3\2\2\2\u0477\u0478\3\2\2\2\u0478\u0118\3\2\2\2\u0479\u047c\n", + "\f\2\2\u047a\u047c\5\u011b\u008e\2\u047b\u0479\3\2\2\2\u047b\u047a\3", + "\2\2\2\u047c\u011a\3\2\2\2\u047d\u0482\5\u011d\u008f\2\u047e\u0482\5", + "\u011f\u0090\2\u047f\u0482\5\u0121\u0091\2\u0480\u0482\5\u00e1q\2\u0481", + "\u047d\3\2\2\2\u0481\u047e\3\2\2\2\u0481\u047f\3\2\2\2\u0481\u0480\3", + "\2\2\2\u0482\u011c\3\2\2\2\u0483\u0484\7^\2\2\u0484\u0485\t\r\2\2\u0485", + "\u011e\3\2\2\2\u0486\u0487\7^\2\2\u0487\u0492\5\u00f3z\2\u0488\u0489", + "\7^\2\2\u0489\u048a\5\u00f3z\2\u048a\u048b\5\u00f3z\2\u048b\u0492\3", + "\2\2\2\u048c\u048d\7^\2\2\u048d\u048e\5\u00f3z\2\u048e\u048f\5\u00f3", + "z\2\u048f\u0490\5\u00f3z\2\u0490\u0492\3\2\2\2\u0491\u0486\3\2\2\2\u0491", + "\u0488\3\2\2\2\u0491\u048c\3\2\2\2\u0492\u0120\3\2\2\2\u0493\u0494\7", + "^\2\2\u0494\u0495\7z\2\2\u0495\u0497\3\2\2\2\u0496\u0498\5\u00f5{\2", + "\u0497\u0496\3\2\2\2\u0498\u0499\3\2\2\2\u0499\u0497\3\2\2\2\u0499\u049a", + "\3\2\2\2\u049a\u0122\3\2\2\2\u049b\u049d\5\u0127\u0094\2\u049c\u049b", + "\3\2\2\2\u049c\u049d\3\2\2\2\u049d\u049e\3\2\2\2\u049e\u04a0\7$\2\2", + "\u049f\u04a1\5\u0129\u0095\2\u04a0\u049f\3\2\2\2\u04a0\u04a1\3\2\2\2", + "\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7$\2\2\u04a3\u0124\3\2\2\2\u04a4\u04a5", + "\7>\2\2\u04a5\u04a6\5\u0129\u0095\2\u04a6\u04a7\7@\2\2\u04a7\u0126\3", + "\2\2\2\u04a8\u04a9\7w\2\2\u04a9\u04ac\7:\2\2\u04aa\u04ac\t\16\2\2\u04ab", + "\u04a8\3\2\2\2\u04ab\u04aa\3\2\2\2\u04ac\u0128\3\2\2\2\u04ad\u04af\5", + "\u012b\u0096\2\u04ae\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04ae\3", + "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u012a\3\2\2\2\u04b2\u04b5\n\17\2\2", + "\u04b3\u04b5\5\u011b\u008e\2\u04b4\u04b2\3\2\2\2\u04b4\u04b3\3\2\2\2", + "\u04b5\u012c\3\2\2\2\u04b6\u04b8\7%\2\2\u04b7\u04b9\5\u0131\u0099\2", + "\u04b8\u04b7\3\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bc", + "\5\u00e9u\2\u04bb\u04bd\5\u0131\u0099\2\u04bc\u04bb\3\2\2\2\u04bc\u04bd", + "\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04c2\5\u0123\u0092\2\u04bf\u04c1", + "\n\20\2\2\u04c0\u04bf\3\2\2\2\u04c1\u04c4\3\2\2\2\u04c2\u04c0\3\2\2", + "\2\u04c2\u04c3\3\2\2\2\u04c3\u04c5\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c5", + "\u04c6\b\u0097\2\2\u04c6\u012e\3\2\2\2\u04c7\u04c9\7%\2\2\u04c8\u04ca", + "\5\u0131\u0099\2\u04c9\u04c8\3\2\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04cb", + "\3\2\2\2\u04cb\u04cc\7r\2\2\u04cc\u04cd\7t\2\2\u04cd\u04ce\7c\2\2\u04ce", + "\u04cf\7i\2\2\u04cf\u04d0\7o\2\2\u04d0\u04d1\7c\2\2\u04d1\u04d2\3\2", + "\2\2\u04d2\u04d6\5\u0131\u0099\2\u04d3\u04d5\n\20\2\2\u04d4\u04d3\3", + "\2\2\2\u04d5\u04d8\3\2\2\2\u04d6\u04d4\3\2\2\2\u04d6\u04d7\3\2\2\2\u04d7", + "\u04d9\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d9\u04da\b\u0098\2\2\u04da\u0130", + "\3\2\2\2\u04db\u04dd\t\21\2\2\u04dc\u04db\3\2\2\2\u04dd\u04de\3\2\2", + "\2\u04de\u04dc\3\2\2\2\u04de\u04df\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0", + "\u04e1\b\u0099\2\2\u04e1\u0132\3\2\2\2\u04e2\u04e4\7\17\2\2\u04e3\u04e5", + "\7\f\2\2\u04e4\u04e3\3\2\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e8\3\2\2\2", + "\u04e6\u04e8\7\f\2\2\u04e7\u04e2\3\2\2\2\u04e7\u04e6\3\2\2\2\u04e8\u04e9", + "\3\2\2\2\u04e9\u04ea\b\u009a\2\2\u04ea\u0134\3\2\2\2\u04eb\u04ec\7\61", + "\2\2\u04ec\u04ed\7,\2\2\u04ed\u04f1\3\2\2\2\u04ee\u04f0\13\2\2\2\u04ef", + "\u04ee\3\2\2\2\u04f0\u04f3\3\2\2\2\u04f1\u04f2\3\2\2\2\u04f1\u04ef\3", + "\2\2\2\u04f2\u04f4\3\2\2\2\u04f3\u04f1\3\2\2\2\u04f4\u04f5\7,\2\2\u04f5", + "\u04f6\7\61\2\2\u04f6\u04f7\3\2\2\2\u04f7\u04f8\b\u009b\2\2\u04f8\u0136", + "\3\2\2\2\u04f9\u04fa\7\61\2\2\u04fa\u04fb\7\61\2\2\u04fb\u04ff\3\2\2", + "\2\u04fc\u04fe\n\20\2\2\u04fd\u04fc\3\2\2\2\u04fe\u0501\3\2\2\2\u04ff", + "\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502\3\2\2\2\u0501\u04ff\3", + "\2\2\2\u0502\u0503\b\u009c\2\2\u0503\u0138\3\2\2\2=\2\u0399\u039b\u03a0", + "\u03b0\u03ba\u03be\u03c2\u03c6\u03c8\u03ce\u03d5\u03dc\u03e9\u03f0\u03f4", + "\u03f6\u0400\u0404\u0408\u040b\u0410\u0412\u0418\u041e\u0420\u0423\u042a", + "\u042e\u0433\u0436\u043d\u0440\u0447\u044b\u0450\u0453\u0458\u0472\u0477", + "\u047b\u0481\u0491\u0499\u049c\u04a0\u04ab\u04b0\u04b4\u04b8\u04bc\u04c2", + "\u04c9\u04d6\u04de\u04e4\u04e7\u04f1\u04ff\3\b\2\2"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -501,105 +513,109 @@ CLexer.T__10 = 11; CLexer.T__11 = 12; CLexer.T__12 = 13; CLexer.T__13 = 14; -CLexer.Auto = 15; -CLexer.Break = 16; -CLexer.Case = 17; -CLexer.Char = 18; -CLexer.Const = 19; -CLexer.Continue = 20; -CLexer.Default = 21; -CLexer.Do = 22; -CLexer.Double = 23; -CLexer.Else = 24; -CLexer.Enum = 25; -CLexer.Extern = 26; -CLexer.Float = 27; -CLexer.For = 28; -CLexer.Goto = 29; -CLexer.If = 30; -CLexer.Inline = 31; -CLexer.Int = 32; -CLexer.Long = 33; -CLexer.Register = 34; -CLexer.Restrict = 35; -CLexer.Return = 36; -CLexer.Short = 37; -CLexer.Signed = 38; -CLexer.Sizeof = 39; -CLexer.Static = 40; -CLexer.Struct = 41; -CLexer.Switch = 42; -CLexer.Typedef = 43; -CLexer.Union = 44; -CLexer.Unsigned = 45; -CLexer.Void = 46; -CLexer.Volatile = 47; -CLexer.While = 48; -CLexer.Alignas = 49; -CLexer.Alignof = 50; -CLexer.Atomic = 51; -CLexer.Bool = 52; -CLexer.Complex = 53; -CLexer.Generic = 54; -CLexer.Imaginary = 55; -CLexer.Noreturn = 56; -CLexer.StaticAssert = 57; -CLexer.ThreadLocal = 58; -CLexer.LeftParen = 59; -CLexer.RightParen = 60; -CLexer.LeftBracket = 61; -CLexer.RightBracket = 62; -CLexer.LeftBrace = 63; -CLexer.RightBrace = 64; -CLexer.Less = 65; -CLexer.LessEqual = 66; -CLexer.Greater = 67; -CLexer.GreaterEqual = 68; -CLexer.LeftShift = 69; -CLexer.RightShift = 70; -CLexer.Plus = 71; -CLexer.PlusPlus = 72; -CLexer.Minus = 73; -CLexer.MinusMinus = 74; -CLexer.Star = 75; -CLexer.Div = 76; -CLexer.Mod = 77; -CLexer.And = 78; -CLexer.Or = 79; -CLexer.AndAnd = 80; -CLexer.OrOr = 81; -CLexer.Caret = 82; -CLexer.Not = 83; -CLexer.Tilde = 84; -CLexer.Question = 85; -CLexer.Colon = 86; -CLexer.Semi = 87; -CLexer.Comma = 88; -CLexer.Assign = 89; -CLexer.StarAssign = 90; -CLexer.DivAssign = 91; -CLexer.ModAssign = 92; -CLexer.PlusAssign = 93; -CLexer.MinusAssign = 94; -CLexer.LeftShiftAssign = 95; -CLexer.RightShiftAssign = 96; -CLexer.AndAssign = 97; -CLexer.XorAssign = 98; -CLexer.OrAssign = 99; -CLexer.Equal = 100; -CLexer.NotEqual = 101; -CLexer.Arrow = 102; -CLexer.Dot = 103; -CLexer.Ellipsis = 104; -CLexer.Identifier = 105; -CLexer.Constant = 106; -CLexer.StringLiteral = 107; -CLexer.LineDirective = 108; -CLexer.PragmaDirective = 109; -CLexer.Whitespace = 110; -CLexer.Newline = 111; -CLexer.BlockComment = 112; -CLexer.LineComment = 113; +CLexer.T__14 = 15; +CLexer.T__15 = 16; +CLexer.T__16 = 17; +CLexer.Auto = 18; +CLexer.Break = 19; +CLexer.Case = 20; +CLexer.Char = 21; +CLexer.Const = 22; +CLexer.Continue = 23; +CLexer.Default = 24; +CLexer.Do = 25; +CLexer.Double = 26; +CLexer.Else = 27; +CLexer.Enum = 28; +CLexer.Extern = 29; +CLexer.Float = 30; +CLexer.For = 31; +CLexer.Goto = 32; +CLexer.If = 33; +CLexer.Inline = 34; +CLexer.Int = 35; +CLexer.Long = 36; +CLexer.Register = 37; +CLexer.Restrict = 38; +CLexer.Return = 39; +CLexer.Short = 40; +CLexer.Signed = 41; +CLexer.Sizeof = 42; +CLexer.Static = 43; +CLexer.Struct = 44; +CLexer.Switch = 45; +CLexer.Typedef = 46; +CLexer.Union = 47; +CLexer.Unsigned = 48; +CLexer.Void = 49; +CLexer.Volatile = 50; +CLexer.While = 51; +CLexer.Alignas = 52; +CLexer.Alignof = 53; +CLexer.Atomic = 54; +CLexer.Bool = 55; +CLexer.Complex = 56; +CLexer.Generic = 57; +CLexer.Imaginary = 58; +CLexer.Noreturn = 59; +CLexer.StaticAssert = 60; +CLexer.ThreadLocal = 61; +CLexer.LeftParen = 62; +CLexer.RightParen = 63; +CLexer.LeftBracket = 64; +CLexer.RightBracket = 65; +CLexer.LeftBrace = 66; +CLexer.RightBrace = 67; +CLexer.Less = 68; +CLexer.LessEqual = 69; +CLexer.Greater = 70; +CLexer.GreaterEqual = 71; +CLexer.LeftShift = 72; +CLexer.RightShift = 73; +CLexer.Plus = 74; +CLexer.PlusPlus = 75; +CLexer.Minus = 76; +CLexer.MinusMinus = 77; +CLexer.Star = 78; +CLexer.Div = 79; +CLexer.Mod = 80; +CLexer.And = 81; +CLexer.Or = 82; +CLexer.AndAnd = 83; +CLexer.OrOr = 84; +CLexer.Caret = 85; +CLexer.Not = 86; +CLexer.Tilde = 87; +CLexer.Question = 88; +CLexer.Colon = 89; +CLexer.Semi = 90; +CLexer.Comma = 91; +CLexer.Assign = 92; +CLexer.StarAssign = 93; +CLexer.DivAssign = 94; +CLexer.ModAssign = 95; +CLexer.PlusAssign = 96; +CLexer.MinusAssign = 97; +CLexer.LeftShiftAssign = 98; +CLexer.RightShiftAssign = 99; +CLexer.AndAssign = 100; +CLexer.XorAssign = 101; +CLexer.OrAssign = 102; +CLexer.Equal = 103; +CLexer.NotEqual = 104; +CLexer.Arrow = 105; +CLexer.Dot = 106; +CLexer.Ellipsis = 107; +CLexer.Identifier = 108; +CLexer.Constant = 109; +CLexer.StringLiteral = 110; +CLexer.SharedIncludeLiteral = 111; +CLexer.LineDirective = 112; +CLexer.PragmaDirective = 113; +CLexer.Whitespace = 114; +CLexer.Newline = 115; +CLexer.BlockComment = 116; +CLexer.LineComment = 117; CLexer.modeNames = [ "DEFAULT_MODE" ]; @@ -608,16 +624,17 @@ CLexer.literalNames = [ 'null', "'__extension__'", "'__builtin_va_arg'", "'__builtin_offsetof'", "'__m128'", "'__m128d'", "'__m128i'", "'__typeof__'", "'__inline__'", "'__stdcall'", "'__declspec'", "'__asm'", "'__attribute__'", "'__asm__'", - "'__volatile__'", "'auto'", "'break'", "'case'", - "'char'", "'const'", "'continue'", "'default'", - "'do'", "'double'", "'else'", "'enum'", "'extern'", - "'float'", "'for'", "'goto'", "'if'", "'inline'", - "'int'", "'long'", "'register'", "'restrict'", "'return'", - "'short'", "'signed'", "'sizeof'", "'static'", "'struct'", - "'switch'", "'typedef'", "'union'", "'unsigned'", - "'void'", "'volatile'", "'while'", "'_Alignas'", - "'_Alignof'", "'_Atomic'", "'_Bool'", "'_Complex'", - "'_Generic'", "'_Imaginary'", "'_Noreturn'", "'_Static_assert'", + "'__volatile__'", "'#'", "'include'", "'define'", + "'auto'", "'break'", "'case'", "'char'", "'const'", + "'continue'", "'default'", "'do'", "'double'", "'else'", + "'enum'", "'extern'", "'float'", "'for'", "'goto'", + "'if'", "'inline'", "'int'", "'long'", "'register'", + "'restrict'", "'return'", "'short'", "'signed'", + "'sizeof'", "'static'", "'struct'", "'switch'", + "'typedef'", "'union'", "'unsigned'", "'void'", + "'volatile'", "'while'", "'_Alignas'", "'_Alignof'", + "'_Atomic'", "'_Bool'", "'_Complex'", "'_Generic'", + "'_Imaginary'", "'_Noreturn'", "'_Static_assert'", "'_Thread_local'", "'('", "')'", "'['", "']'", "'{'", "'}'", "'<'", "'<='", "'>'", "'>='", "'<<'", "'>>'", "'+'", "'++'", "'-'", "'--'", "'*'", "'/'", "'%'", @@ -628,17 +645,18 @@ CLexer.literalNames = [ 'null', "'__extension__'", "'__builtin_va_arg'", CLexer.symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', - 'null', 'null', 'null', "Auto", "Break", "Case", - "Char", "Const", "Continue", "Default", "Do", "Double", - "Else", "Enum", "Extern", "Float", "For", "Goto", - "If", "Inline", "Int", "Long", "Register", "Restrict", - "Return", "Short", "Signed", "Sizeof", "Static", - "Struct", "Switch", "Typedef", "Union", "Unsigned", - "Void", "Volatile", "While", "Alignas", "Alignof", - "Atomic", "Bool", "Complex", "Generic", "Imaginary", - "Noreturn", "StaticAssert", "ThreadLocal", "LeftParen", - "RightParen", "LeftBracket", "RightBracket", "LeftBrace", - "RightBrace", "Less", "LessEqual", "Greater", "GreaterEqual", + 'null', 'null', 'null', 'null', 'null', 'null', + "Auto", "Break", "Case", "Char", "Const", "Continue", + "Default", "Do", "Double", "Else", "Enum", "Extern", + "Float", "For", "Goto", "If", "Inline", "Int", + "Long", "Register", "Restrict", "Return", "Short", + "Signed", "Sizeof", "Static", "Struct", "Switch", + "Typedef", "Union", "Unsigned", "Void", "Volatile", + "While", "Alignas", "Alignof", "Atomic", "Bool", + "Complex", "Generic", "Imaginary", "Noreturn", + "StaticAssert", "ThreadLocal", "LeftParen", "RightParen", + "LeftBracket", "RightBracket", "LeftBrace", "RightBrace", + "Less", "LessEqual", "Greater", "GreaterEqual", "LeftShift", "RightShift", "Plus", "PlusPlus", "Minus", "MinusMinus", "Star", "Div", "Mod", "And", "Or", "AndAnd", "OrOr", "Caret", "Not", "Tilde", @@ -647,33 +665,34 @@ CLexer.symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', "MinusAssign", "LeftShiftAssign", "RightShiftAssign", "AndAssign", "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", - "Constant", "StringLiteral", "LineDirective", "PragmaDirective", - "Whitespace", "Newline", "BlockComment", "LineComment" ]; + "Constant", "StringLiteral", "SharedIncludeLiteral", + "LineDirective", "PragmaDirective", "Whitespace", + "Newline", "BlockComment", "LineComment" ]; CLexer.ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", "T__9", "T__10", "T__11", "T__12", - "T__13", "Auto", "Break", "Case", "Char", "Const", - "Continue", "Default", "Do", "Double", "Else", "Enum", - "Extern", "Float", "For", "Goto", "If", "Inline", "Int", - "Long", "Register", "Restrict", "Return", "Short", - "Signed", "Sizeof", "Static", "Struct", "Switch", "Typedef", - "Union", "Unsigned", "Void", "Volatile", "While", "Alignas", - "Alignof", "Atomic", "Bool", "Complex", "Generic", - "Imaginary", "Noreturn", "StaticAssert", "ThreadLocal", - "LeftParen", "RightParen", "LeftBracket", "RightBracket", - "LeftBrace", "RightBrace", "Less", "LessEqual", "Greater", - "GreaterEqual", "LeftShift", "RightShift", "Plus", - "PlusPlus", "Minus", "MinusMinus", "Star", "Div", "Mod", - "And", "Or", "AndAnd", "OrOr", "Caret", "Not", "Tilde", - "Question", "Colon", "Semi", "Comma", "Assign", "StarAssign", - "DivAssign", "ModAssign", "PlusAssign", "MinusAssign", - "LeftShiftAssign", "RightShiftAssign", "AndAssign", - "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", - "Dot", "Ellipsis", "Identifier", "IdentifierNondigit", - "Nondigit", "Digit", "UniversalCharacterName", "HexQuad", - "Constant", "IntegerConstant", "DecimalConstant", "OctalConstant", - "HexadecimalConstant", "HexadecimalPrefix", "NonzeroDigit", - "OctalDigit", "HexadecimalDigit", "IntegerSuffix", + "T__13", "T__14", "T__15", "T__16", "Auto", "Break", + "Case", "Char", "Const", "Continue", "Default", "Do", + "Double", "Else", "Enum", "Extern", "Float", "For", + "Goto", "If", "Inline", "Int", "Long", "Register", + "Restrict", "Return", "Short", "Signed", "Sizeof", + "Static", "Struct", "Switch", "Typedef", "Union", "Unsigned", + "Void", "Volatile", "While", "Alignas", "Alignof", + "Atomic", "Bool", "Complex", "Generic", "Imaginary", + "Noreturn", "StaticAssert", "ThreadLocal", "LeftParen", + "RightParen", "LeftBracket", "RightBracket", "LeftBrace", + "RightBrace", "Less", "LessEqual", "Greater", "GreaterEqual", + "LeftShift", "RightShift", "Plus", "PlusPlus", "Minus", + "MinusMinus", "Star", "Div", "Mod", "And", "Or", "AndAnd", + "OrOr", "Caret", "Not", "Tilde", "Question", "Colon", + "Semi", "Comma", "Assign", "StarAssign", "DivAssign", + "ModAssign", "PlusAssign", "MinusAssign", "LeftShiftAssign", + "RightShiftAssign", "AndAssign", "XorAssign", "OrAssign", + "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", + "IdentifierNondigit", "Nondigit", "Digit", "UniversalCharacterName", + "HexQuad", "Constant", "IntegerConstant", "DecimalConstant", + "OctalConstant", "HexadecimalConstant", "HexadecimalPrefix", + "NonzeroDigit", "OctalDigit", "HexadecimalDigit", "IntegerSuffix", "UnsignedSuffix", "LongSuffix", "LongLongSuffix", "FloatingConstant", "DecimalFloatingConstant", "HexadecimalFloatingConstant", "FractionalConstant", "ExponentPart", "Sign", "DigitSequence", @@ -681,9 +700,9 @@ CLexer.ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "HexadecimalDigitSequence", "FloatingSuffix", "CharacterConstant", "CCharSequence", "CChar", "EscapeSequence", "SimpleEscapeSequence", "OctalEscapeSequence", "HexadecimalEscapeSequence", - "StringLiteral", "EncodingPrefix", "SCharSequence", - "SChar", "LineDirective", "PragmaDirective", "Whitespace", - "Newline", "BlockComment", "LineComment" ]; + "StringLiteral", "SharedIncludeLiteral", "EncodingPrefix", + "SCharSequence", "SChar", "LineDirective", "PragmaDirective", + "Whitespace", "Newline", "BlockComment", "LineComment" ]; CLexer.grammarFileName = "C.g4"; diff --git a/antlr/CLexer.tokens b/antlr/CLexer.tokens index a406c034..e88e63cc 100644 --- a/antlr/CLexer.tokens +++ b/antlr/CLexer.tokens @@ -12,105 +12,109 @@ T__10=11 T__11=12 T__12=13 T__13=14 -Auto=15 -Break=16 -Case=17 -Char=18 -Const=19 -Continue=20 -Default=21 -Do=22 -Double=23 -Else=24 -Enum=25 -Extern=26 -Float=27 -For=28 -Goto=29 -If=30 -Inline=31 -Int=32 -Long=33 -Register=34 -Restrict=35 -Return=36 -Short=37 -Signed=38 -Sizeof=39 -Static=40 -Struct=41 -Switch=42 -Typedef=43 -Union=44 -Unsigned=45 -Void=46 -Volatile=47 -While=48 -Alignas=49 -Alignof=50 -Atomic=51 -Bool=52 -Complex=53 -Generic=54 -Imaginary=55 -Noreturn=56 -StaticAssert=57 -ThreadLocal=58 -LeftParen=59 -RightParen=60 -LeftBracket=61 -RightBracket=62 -LeftBrace=63 -RightBrace=64 -Less=65 -LessEqual=66 -Greater=67 -GreaterEqual=68 -LeftShift=69 -RightShift=70 -Plus=71 -PlusPlus=72 -Minus=73 -MinusMinus=74 -Star=75 -Div=76 -Mod=77 -And=78 -Or=79 -AndAnd=80 -OrOr=81 -Caret=82 -Not=83 -Tilde=84 -Question=85 -Colon=86 -Semi=87 -Comma=88 -Assign=89 -StarAssign=90 -DivAssign=91 -ModAssign=92 -PlusAssign=93 -MinusAssign=94 -LeftShiftAssign=95 -RightShiftAssign=96 -AndAssign=97 -XorAssign=98 -OrAssign=99 -Equal=100 -NotEqual=101 -Arrow=102 -Dot=103 -Ellipsis=104 -Identifier=105 -Constant=106 -StringLiteral=107 -LineDirective=108 -PragmaDirective=109 -Whitespace=110 -Newline=111 -BlockComment=112 -LineComment=113 +T__14=15 +T__15=16 +T__16=17 +Auto=18 +Break=19 +Case=20 +Char=21 +Const=22 +Continue=23 +Default=24 +Do=25 +Double=26 +Else=27 +Enum=28 +Extern=29 +Float=30 +For=31 +Goto=32 +If=33 +Inline=34 +Int=35 +Long=36 +Register=37 +Restrict=38 +Return=39 +Short=40 +Signed=41 +Sizeof=42 +Static=43 +Struct=44 +Switch=45 +Typedef=46 +Union=47 +Unsigned=48 +Void=49 +Volatile=50 +While=51 +Alignas=52 +Alignof=53 +Atomic=54 +Bool=55 +Complex=56 +Generic=57 +Imaginary=58 +Noreturn=59 +StaticAssert=60 +ThreadLocal=61 +LeftParen=62 +RightParen=63 +LeftBracket=64 +RightBracket=65 +LeftBrace=66 +RightBrace=67 +Less=68 +LessEqual=69 +Greater=70 +GreaterEqual=71 +LeftShift=72 +RightShift=73 +Plus=74 +PlusPlus=75 +Minus=76 +MinusMinus=77 +Star=78 +Div=79 +Mod=80 +And=81 +Or=82 +AndAnd=83 +OrOr=84 +Caret=85 +Not=86 +Tilde=87 +Question=88 +Colon=89 +Semi=90 +Comma=91 +Assign=92 +StarAssign=93 +DivAssign=94 +ModAssign=95 +PlusAssign=96 +MinusAssign=97 +LeftShiftAssign=98 +RightShiftAssign=99 +AndAssign=100 +XorAssign=101 +OrAssign=102 +Equal=103 +NotEqual=104 +Arrow=105 +Dot=106 +Ellipsis=107 +Identifier=108 +Constant=109 +StringLiteral=110 +SharedIncludeLiteral=111 +LineDirective=112 +PragmaDirective=113 +Whitespace=114 +Newline=115 +BlockComment=116 +LineComment=117 '__extension__'=1 '__builtin_va_arg'=2 '__builtin_offsetof'=3 @@ -125,93 +129,96 @@ LineComment=113 '__attribute__'=12 '__asm__'=13 '__volatile__'=14 -'auto'=15 -'break'=16 -'case'=17 -'char'=18 -'const'=19 -'continue'=20 -'default'=21 -'do'=22 -'double'=23 -'else'=24 -'enum'=25 -'extern'=26 -'float'=27 -'for'=28 -'goto'=29 -'if'=30 -'inline'=31 -'int'=32 -'long'=33 -'register'=34 -'restrict'=35 -'return'=36 -'short'=37 -'signed'=38 -'sizeof'=39 -'static'=40 -'struct'=41 -'switch'=42 -'typedef'=43 -'union'=44 -'unsigned'=45 -'void'=46 -'volatile'=47 -'while'=48 -'_Alignas'=49 -'_Alignof'=50 -'_Atomic'=51 -'_Bool'=52 -'_Complex'=53 -'_Generic'=54 -'_Imaginary'=55 -'_Noreturn'=56 -'_Static_assert'=57 -'_Thread_local'=58 -'('=59 -')'=60 -'['=61 -']'=62 -'{'=63 -'}'=64 -'<'=65 -'<='=66 -'>'=67 -'>='=68 -'<<'=69 -'>>'=70 -'+'=71 -'++'=72 -'-'=73 -'--'=74 -'*'=75 -'/'=76 -'%'=77 -'&'=78 -'|'=79 -'&&'=80 -'||'=81 -'^'=82 -'!'=83 -'~'=84 -'?'=85 -':'=86 -';'=87 -','=88 -'='=89 -'*='=90 -'/='=91 -'%='=92 -'+='=93 -'-='=94 -'<<='=95 -'>>='=96 -'&='=97 -'^='=98 -'|='=99 -'=='=100 -'!='=101 -'->'=102 -'.'=103 -'...'=104 +'#'=15 +'include'=16 +'define'=17 +'auto'=18 +'break'=19 +'case'=20 +'char'=21 +'const'=22 +'continue'=23 +'default'=24 +'do'=25 +'double'=26 +'else'=27 +'enum'=28 +'extern'=29 +'float'=30 +'for'=31 +'goto'=32 +'if'=33 +'inline'=34 +'int'=35 +'long'=36 +'register'=37 +'restrict'=38 +'return'=39 +'short'=40 +'signed'=41 +'sizeof'=42 +'static'=43 +'struct'=44 +'switch'=45 +'typedef'=46 +'union'=47 +'unsigned'=48 +'void'=49 +'volatile'=50 +'while'=51 +'_Alignas'=52 +'_Alignof'=53 +'_Atomic'=54 +'_Bool'=55 +'_Complex'=56 +'_Generic'=57 +'_Imaginary'=58 +'_Noreturn'=59 +'_Static_assert'=60 +'_Thread_local'=61 +'('=62 +')'=63 +'['=64 +']'=65 +'{'=66 +'}'=67 +'<'=68 +'<='=69 +'>'=70 +'>='=71 +'<<'=72 +'>>'=73 +'+'=74 +'++'=75 +'-'=76 +'--'=77 +'*'=78 +'/'=79 +'%'=80 +'&'=81 +'|'=82 +'&&'=83 +'||'=84 +'^'=85 +'!'=86 +'~'=87 +'?'=88 +':'=89 +';'=90 +','=91 +'='=92 +'*='=93 +'/='=94 +'%='=95 +'+='=96 +'-='=97 +'<<='=98 +'>>='=99 +'&='=100 +'^='=101 +'|='=102 +'=='=103 +'!='=104 +'->'=105 +'.'=106 +'...'=107 diff --git a/antlr/CListener.js b/antlr/CListener.js index 638eab94..b2611eef 100644 --- a/antlr/CListener.js +++ b/antlr/CListener.js @@ -317,6 +317,15 @@ CListener.prototype.exitStructOrUnion = function(ctx) { }; +// Enter a parse tree produced by CParser#structDeclarationsBlock. +CListener.prototype.enterStructDeclarationsBlock = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structDeclarationsBlock. +CListener.prototype.exitStructDeclarationsBlock = function(ctx) { +}; + + // Enter a parse tree produced by CParser#structDeclarationList. CListener.prototype.enterStructDeclarationList = function(ctx) { }; @@ -740,6 +749,69 @@ CListener.prototype.exitTranslationUnit = function(ctx) { }; +// Enter a parse tree produced by CParser#includeDirective. +CListener.prototype.enterIncludeDirective = function(ctx) { +}; + +// Exit a parse tree produced by CParser#includeDirective. +CListener.prototype.exitIncludeDirective = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#defineDirective. +CListener.prototype.enterDefineDirective = function(ctx) { +}; + +// Exit a parse tree produced by CParser#defineDirective. +CListener.prototype.exitDefineDirective = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#defineDirectiveNoVal. +CListener.prototype.enterDefineDirectiveNoVal = function(ctx) { +}; + +// Exit a parse tree produced by CParser#defineDirectiveNoVal. +CListener.prototype.exitDefineDirectiveNoVal = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#defineDirectiveNoParams. +CListener.prototype.enterDefineDirectiveNoParams = function(ctx) { +}; + +// Exit a parse tree produced by CParser#defineDirectiveNoParams. +CListener.prototype.exitDefineDirectiveNoParams = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#defineDirectiveWithParams. +CListener.prototype.enterDefineDirectiveWithParams = function(ctx) { +}; + +// Exit a parse tree produced by CParser#defineDirectiveWithParams. +CListener.prototype.exitDefineDirectiveWithParams = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#macroResult. +CListener.prototype.enterMacroResult = function(ctx) { +}; + +// Exit a parse tree produced by CParser#macroResult. +CListener.prototype.exitMacroResult = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#macroParamList. +CListener.prototype.enterMacroParamList = function(ctx) { +}; + +// Exit a parse tree produced by CParser#macroParamList. +CListener.prototype.exitMacroParamList = function(ctx) { +}; + + // Enter a parse tree produced by CParser#externalDeclaration. CListener.prototype.enterExternalDeclaration = function(ctx) { }; diff --git a/antlr/CParser.js b/antlr/CParser.js index eabfb157..54ec9897 100644 --- a/antlr/CParser.js +++ b/antlr/CParser.js @@ -5,7 +5,7 @@ var CListener = require('./CListener').CListener; var grammarFileName = "C.g4"; var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\3s\u04e9\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", + "\3w\u0528\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", "\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t", "\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27", "\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4", @@ -14,490 +14,512 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\61\4\62\t\62\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t", "8\49\t9\4:\t:\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC", "\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4", - "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\3\2\3\2\3\2\6\2\u00ae\n\2\r", - "\2\16\2\u00af\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00b8\n\2\3\2\3\2\3\2\3\2", - "\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00cc\n", - "\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u00db\n\4", - "\f\4\16\4\u00de\13\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u00e7\n\5\3\6\3", - "\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3", - "\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u010b", - "\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0115\n\6\3\6\3\6\3\6\3\6\3", - "\6\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u0122\n\6\f\6\16\6\u0125\13\6\3\7\3\7", - "\3\7\3\7\3\7\3\7\7\7\u012d\n\7\f\7\16\7\u0130\13\7\3\b\3\b\3\b\3\b\3", - "\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3", - "\b\5\b\u0148\n\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n", - "\3\n\5\n\u0158\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13", - "\3\13\3\13\7\13\u0166\n\13\f\13\16\13\u0169\13\13\3\f\3\f\3\f\3\f\3", - "\f\3\f\3\f\3\f\3\f\7\f\u0174\n\f\f\f\16\f\u0177\13\f\3\r\3\r\3\r\3\r", - "\3\r\3\r\3\r\3\r\3\r\7\r\u0182\n\r\f\r\16\r\u0185\13\r\3\16\3\16\3\16", - "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\7\16\u0196", - "\n\16\f\16\16\16\u0199\13\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17", - "\3\17\7\17\u01a4\n\17\f\17\16\17\u01a7\13\17\3\20\3\20\3\20\3\20\3\20", - "\3\20\7\20\u01af\n\20\f\20\16\20\u01b2\13\20\3\21\3\21\3\21\3\21\3\21", - "\3\21\7\21\u01ba\n\21\f\21\16\21\u01bd\13\21\3\22\3\22\3\22\3\22\3\22", - "\3\22\7\22\u01c5\n\22\f\22\16\22\u01c8\13\22\3\23\3\23\3\23\3\23\3\23", - "\3\23\7\23\u01d0\n\23\f\23\16\23\u01d3\13\23\3\24\3\24\3\24\3\24\3\24", - "\3\24\7\24\u01db\n\24\f\24\16\24\u01de\13\24\3\25\3\25\3\25\3\25\3\25", - "\3\25\5\25\u01e6\n\25\3\26\3\26\3\26\3\26\3\26\5\26\u01ed\n\26\3\27", - "\3\27\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01f7\n\30\f\30\16\30\u01fa", - "\13\30\3\31\3\31\3\32\3\32\5\32\u0200\n\32\3\32\3\32\3\32\5\32\u0205", - "\n\32\3\33\6\33\u0208\n\33\r\33\16\33\u0209\3\34\6\34\u020d\n\34\r\34", - "\16\34\u020e\3\35\3\35\3\35\3\35\3\35\5\35\u0216\n\35\3\36\3\36\3\36", - "\3\36\3\36\3\36\7\36\u021e\n\36\f\36\16\36\u0221\13\36\3\37\3\37\3\37", - "\3\37\3\37\5\37\u0228\n\37\3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3", - "!\3!\3!\5!\u023a\n!\3\"\3\"\5\"\u023e\n\"\3\"\3\"\3\"\3\"\3\"\3\"\3", - "\"\5\"\u0247\n\"\3#\3#\3$\3$\3$\3$\3$\7$\u0250\n$\f$\16$\u0253\13$\3", - "%\3%\5%\u0257\n%\3%\3%\3%\5%\u025c\n%\3&\3&\5&\u0260\n&\3&\3&\5&\u0264", - "\n&\5&\u0266\n&\3\'\3\'\3\'\3\'\3\'\3\'\7\'\u026e\n\'\f\'\16\'\u0271", - "\13\'\3(\3(\5(\u0275\n(\3(\3(\5(\u0279\n(\3)\3)\5)\u027d\n)\3)\3)\3", - ")\3)\3)\3)\5)\u0285\n)\3)\3)\3)\3)\3)\3)\3)\5)\u028e\n)\3*\3*\3*\3*", - "\3*\3*\7*\u0296\n*\f*\16*\u0299\13*\3+\3+\3+\3+\3+\5+\u02a0\n+\3,\3", - ",\3-\3-\3-\3-\3-\3.\3.\3/\3/\3/\3/\3/\3/\5/\u02b1\n/\3\60\3\60\3\60", - "\3\60\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u02bd\n\60\3\61\5\61\u02c0", - "\n\61\3\61\3\61\7\61\u02c4\n\61\f\61\16\61\u02c7\13\61\3\62\3\62\3\62", - "\3\62\3\62\3\62\5\62\u02cf\n\62\3\62\3\62\3\62\5\62\u02d4\n\62\3\62", - "\5\62\u02d7\n\62\3\62\3\62\3\62\3\62\3\62\5\62\u02de\n\62\3\62\3\62", - "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u02ed\n", - "\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u02f9\n\62", - "\3\62\7\62\u02fc\n\62\f\62\16\62\u02ff\13\62\3\63\3\63\3\63\6\63\u0304", - "\n\63\r\63\16\63\u0305\3\63\3\63\5\63\u030a\n\63\3\64\3\64\3\64\3\64", - "\3\64\3\64\3\64\3\65\3\65\3\65\7\65\u0316\n\65\f\65\16\65\u0319\13\65", - "\3\65\5\65\u031c\n\65\3\66\3\66\3\66\5\66\u0321\n\66\3\66\5\66\u0324", - "\n\66\3\66\5\66\u0327\n\66\3\67\3\67\3\67\3\67\3\67\7\67\u032e\n\67", - "\f\67\16\67\u0331\13\67\38\38\58\u0335\n8\38\38\58\u0339\n8\38\38\3", - "8\58\u033e\n8\38\38\58\u0342\n8\38\58\u0345\n8\39\39\39\39\39\79\u034c", - "\n9\f9\169\u034f\139\3:\3:\3:\3:\3:\5:\u0356\n:\3;\3;\3;\3;\3;\3;\7", - ";\u035e\n;\f;\16;\u0361\13;\3<\3<\3<\3<\3<\5<\u0368\n<\5<\u036a\n<\3", - "=\3=\3=\3=\3=\3=\7=\u0372\n=\f=\16=\u0375\13=\3>\3>\5>\u0379\n>\3?\3", - "?\5?\u037d\n?\3?\3?\7?\u0381\n?\f?\16?\u0384\13?\5?\u0386\n?\3@\3@\3", - "@\3@\3@\7@\u038d\n@\f@\16@\u0390\13@\3@\3@\5@\u0394\n@\3@\5@\u0397\n", - "@\3@\3@\3@\3@\5@\u039d\n@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@", - "\5@\u03ad\n@\3@\3@\7@\u03b1\n@\f@\16@\u03b4\13@\5@\u03b6\n@\3@\3@\3", - "@\5@\u03bb\n@\3@\5@\u03be\n@\3@\3@\3@\3@\3@\5@\u03c5\n@\3@\3@\3@\3@", - "\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\5@\u03d8\n@\3@\3@\7@\u03dc\n", - "@\f@\16@\u03df\13@\7@\u03e1\n@\f@\16@\u03e4\13@\3A\3A\3B\3B\3B\3B\3", - "B\3B\3B\3B\3B\3B\5B\u03f2\nB\3C\3C\5C\u03f6\nC\3C\3C\3C\3C\3C\5C\u03fd", - "\nC\3C\7C\u0400\nC\fC\16C\u0403\13C\3D\3D\3D\3E\3E\3E\3E\3E\7E\u040d", - "\nE\fE\16E\u0410\13E\3F\3F\3F\3F\3F\3F\5F\u0418\nF\3G\3G\3G\3G\3G\6", - "G\u041f\nG\rG\16G\u0420\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3", - "H\7H\u0432\nH\fH\16H\u0435\13H\5H\u0437\nH\3H\3H\3H\3H\7H\u043d\nH\f", - "H\16H\u0440\13H\5H\u0442\nH\7H\u0444\nH\fH\16H\u0447\13H\3H\3H\5H\u044b", - "\nH\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\5I\u0458\nI\3J\3J\5J\u045c\nJ\3", - "J\3J\3K\3K\3K\3K\3K\7K\u0465\nK\fK\16K\u0468\13K\3L\3L\5L\u046c\nL\3", - "M\5M\u046f\nM\3M\3M\3N\3N\3N\3N\3N\3N\3N\5N\u047a\nN\3N\3N\3N\3N\3N", - "\3N\5N\u0482\nN\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\5", - "O\u0495\nO\3O\3O\5O\u0499\nO\3O\3O\5O\u049d\nO\3O\3O\3O\3O\3O\3O\5O", - "\u04a5\nO\3O\3O\5O\u04a9\nO\3O\3O\3O\5O\u04ae\nO\3P\3P\3P\3P\3P\3P\3", - "P\3P\3P\5P\u04b9\nP\3P\3P\3P\3P\3P\5P\u04c0\nP\3Q\5Q\u04c3\nQ\3Q\3Q", - "\3R\3R\3R\3R\3R\7R\u04cc\nR\fR\16R\u04cf\13R\3S\3S\3S\5S\u04d4\nS\3", - "T\5T\u04d7\nT\3T\3T\5T\u04db\nT\3T\3T\3U\3U\3U\3U\3U\7U\u04e4\nU\fU", - "\16U\u04e7\13U\3U\2\36\6\n\f\24\26\30\32\34\36 \"$&.:FLRbptx~\u0084", - "\u0088\u0094\u00a2\u00a8V\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"", - "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082", - "\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a", - "\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\2\16\7\2IIKKMMPPUV\3\2[e", - "\b\2\21\21\34\34$$**--<<\n\2\6\b\24\24\31\31\35\35\"#\'(/\60\66\67\3", - "\2\6\b\4\2++..\6\2\25\25%%\61\61\65\65\5\2\n\13!!::\4\2=>ZZ\3\2=>\4", - "\2\r\r\17\17\4\2\20\20\61\61\u0559\2\u00cb\3\2\2\2\4\u00cd\3\2\2\2\6", - "\u00d4\3\2\2\2\b\u00e6\3\2\2\2\n\u010a\3\2\2\2\f\u0126\3\2\2\2\16\u0147", - "\3\2\2\2\20\u0149\3\2\2\2\22\u0157\3\2\2\2\24\u0159\3\2\2\2\26\u016a", - "\3\2\2\2\30\u0178\3\2\2\2\32\u0186\3\2\2\2\34\u019a\3\2\2\2\36\u01a8", - "\3\2\2\2 \u01b3\3\2\2\2\"\u01be\3\2\2\2$\u01c9\3\2\2\2&\u01d4\3\2\2", - "\2(\u01df\3\2\2\2*\u01ec\3\2\2\2,\u01ee\3\2\2\2.\u01f0\3\2\2\2\60\u01fb", - "\3\2\2\2\62\u0204\3\2\2\2\64\u0207\3\2\2\2\66\u020c\3\2\2\28\u0215\3", - "\2\2\2:\u0217\3\2\2\2<\u0227\3\2\2\2>\u0229\3\2\2\2@\u0239\3\2\2\2B", - "\u0246\3\2\2\2D\u0248\3\2\2\2F\u024a\3\2\2\2H\u025b\3\2\2\2J\u0265\3", - "\2\2\2L\u0267\3\2\2\2N\u0278\3\2\2\2P\u028d\3\2\2\2R\u028f\3\2\2\2T", - "\u029f\3\2\2\2V\u02a1\3\2\2\2X\u02a3\3\2\2\2Z\u02a8\3\2\2\2\\\u02b0", - "\3\2\2\2^\u02bc\3\2\2\2`\u02bf\3\2\2\2b\u02ce\3\2\2\2d\u0309\3\2\2\2", - "f\u030b\3\2\2\2h\u031b\3\2\2\2j\u0326\3\2\2\2l\u032f\3\2\2\2n\u0344", - "\3\2\2\2p\u0346\3\2\2\2r\u0355\3\2\2\2t\u0357\3\2\2\2v\u0369\3\2\2\2", - "x\u036b\3\2\2\2z\u0376\3\2\2\2|\u0385\3\2\2\2~\u03b5\3\2\2\2\u0080\u03e5", - "\3\2\2\2\u0082\u03f1\3\2\2\2\u0084\u03f3\3\2\2\2\u0086\u0404\3\2\2\2", - "\u0088\u0407\3\2\2\2\u008a\u0417\3\2\2\2\u008c\u0419\3\2\2\2\u008e\u044a", - "\3\2\2\2\u0090\u0457\3\2\2\2\u0092\u0459\3\2\2\2\u0094\u045f\3\2\2\2", - "\u0096\u046b\3\2\2\2\u0098\u046e\3\2\2\2\u009a\u0481\3\2\2\2\u009c\u04ad", - "\3\2\2\2\u009e\u04bf\3\2\2\2\u00a0\u04c2\3\2\2\2\u00a2\u04c6\3\2\2\2", - "\u00a4\u04d3\3\2\2\2\u00a6\u04d6\3\2\2\2\u00a8\u04de\3\2\2\2\u00aa\u00cc", - "\7k\2\2\u00ab\u00cc\7l\2\2\u00ac\u00ae\7m\2\2\u00ad\u00ac\3\2\2\2\u00ae", - "\u00af\3\2\2\2\u00af\u00ad\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00cc\3", - "\2\2\2\u00b1\u00b2\7=\2\2\u00b2\u00b3\5.\30\2\u00b3\u00b4\7>\2\2\u00b4", - "\u00cc\3\2\2\2\u00b5\u00cc\5\4\3\2\u00b6\u00b8\7\3\2\2\u00b7\u00b6\3", - "\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9\u00ba\7=\2\2\u00ba", - "\u00bb\5\u0092J\2\u00bb\u00bc\7>\2\2\u00bc\u00cc\3\2\2\2\u00bd\u00be", - "\7\4\2\2\u00be\u00bf\7=\2\2\u00bf\u00c0\5\16\b\2\u00c0\u00c1\7Z\2\2", - "\u00c1\u00c2\5z>\2\u00c2\u00c3\7>\2\2\u00c3\u00cc\3\2\2\2\u00c4\u00c5", - "\7\5\2\2\u00c5\u00c6\7=\2\2\u00c6\u00c7\5z>\2\u00c7\u00c8\7Z\2\2\u00c8", - "\u00c9\5\16\b\2\u00c9\u00ca\7>\2\2\u00ca\u00cc\3\2\2\2\u00cb\u00aa\3", - "\2\2\2\u00cb\u00ab\3\2\2\2\u00cb\u00ad\3\2\2\2\u00cb\u00b1\3\2\2\2\u00cb", - "\u00b5\3\2\2\2\u00cb\u00b7\3\2\2\2\u00cb\u00bd\3\2\2\2\u00cb\u00c4\3", - "\2\2\2\u00cc\3\3\2\2\2\u00cd\u00ce\78\2\2\u00ce\u00cf\7=\2\2\u00cf\u00d0", - "\5*\26\2\u00d0\u00d1\7Z\2\2\u00d1\u00d2\5\6\4\2\u00d2\u00d3\7>\2\2\u00d3", - "\5\3\2\2\2\u00d4\u00d5\b\4\1\2\u00d5\u00d6\5\b\5\2\u00d6\u00dc\3\2\2", - "\2\u00d7\u00d8\f\3\2\2\u00d8\u00d9\7Z\2\2\u00d9\u00db\5\b\5\2\u00da", - "\u00d7\3\2\2\2\u00db\u00de\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd\3", - "\2\2\2\u00dd\7\3\2\2\2\u00de\u00dc\3\2\2\2\u00df\u00e0\5z>\2\u00e0\u00e1", - "\7X\2\2\u00e1\u00e2\5*\26\2\u00e2\u00e7\3\2\2\2\u00e3\u00e4\7\27\2\2", - "\u00e4\u00e5\7X\2\2\u00e5\u00e7\5*\26\2\u00e6\u00df\3\2\2\2\u00e6\u00e3", - "\3\2\2\2\u00e7\t\3\2\2\2\u00e8\u00e9\b\6\1\2\u00e9\u010b\5\2\2\2\u00ea", - "\u00eb\7=\2\2\u00eb\u00ec\5z>\2\u00ec\u00ed\7>\2\2\u00ed\u00ee\7A\2", - "\2\u00ee\u00ef\5\u0084C\2\u00ef\u00f0\7B\2\2\u00f0\u010b\3\2\2\2\u00f1", - "\u00f2\7=\2\2\u00f2\u00f3\5z>\2\u00f3\u00f4\7>\2\2\u00f4\u00f5\7A\2", - "\2\u00f5\u00f6\5\u0084C\2\u00f6\u00f7\7Z\2\2\u00f7\u00f8\7B\2\2\u00f8", - "\u010b\3\2\2\2\u00f9\u00fa\7\3\2\2\u00fa\u00fb\7=\2\2\u00fb\u00fc\5", - "z>\2\u00fc\u00fd\7>\2\2\u00fd\u00fe\7A\2\2\u00fe\u00ff\5\u0084C\2\u00ff", - "\u0100\7B\2\2\u0100\u010b\3\2\2\2\u0101\u0102\7\3\2\2\u0102\u0103\7", - "=\2\2\u0103\u0104\5z>\2\u0104\u0105\7>\2\2\u0105\u0106\7A\2\2\u0106", - "\u0107\5\u0084C\2\u0107\u0108\7Z\2\2\u0108\u0109\7B\2\2\u0109\u010b", - "\3\2\2\2\u010a\u00e8\3\2\2\2\u010a\u00ea\3\2\2\2\u010a\u00f1\3\2\2\2", - "\u010a\u00f9\3\2\2\2\u010a\u0101\3\2\2\2\u010b\u0123\3\2\2\2\u010c\u010d", - "\f\f\2\2\u010d\u010e\7?\2\2\u010e\u010f\5.\30\2\u010f\u0110\7@\2\2\u0110", - "\u0122\3\2\2\2\u0111\u0112\f\13\2\2\u0112\u0114\7=\2\2\u0113\u0115\5", - "\f\7\2\u0114\u0113\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0116\3\2\2\2\u0116", - "\u0122\7>\2\2\u0117\u0118\f\n\2\2\u0118\u0119\7i\2\2\u0119\u0122\7k", - "\2\2\u011a\u011b\f\t\2\2\u011b\u011c\7h\2\2\u011c\u0122\7k\2\2\u011d", - "\u011e\f\b\2\2\u011e\u0122\7J\2\2\u011f\u0120\f\7\2\2\u0120\u0122\7", - "L\2\2\u0121\u010c\3\2\2\2\u0121\u0111\3\2\2\2\u0121\u0117\3\2\2\2\u0121", - "\u011a\3\2\2\2\u0121\u011d\3\2\2\2\u0121\u011f\3\2\2\2\u0122\u0125\3", - "\2\2\2\u0123\u0121\3\2\2\2\u0123\u0124\3\2\2\2\u0124\13\3\2\2\2\u0125", - "\u0123\3\2\2\2\u0126\u0127\b\7\1\2\u0127\u0128\5*\26\2\u0128\u012e\3", - "\2\2\2\u0129\u012a\f\3\2\2\u012a\u012b\7Z\2\2\u012b\u012d\5*\26\2\u012c", - "\u0129\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012c\3\2\2\2\u012e\u012f\3", - "\2\2\2\u012f\r\3\2\2\2\u0130\u012e\3\2\2\2\u0131\u0148\5\n\6\2\u0132", - "\u0133\7J\2\2\u0133\u0148\5\16\b\2\u0134\u0135\7L\2\2\u0135\u0148\5", - "\16\b\2\u0136\u0137\5\20\t\2\u0137\u0138\5\22\n\2\u0138\u0148\3\2\2", - "\2\u0139\u013a\7)\2\2\u013a\u0148\5\16\b\2\u013b\u013c\7)\2\2\u013c", - "\u013d\7=\2\2\u013d\u013e\5z>\2\u013e\u013f\7>\2\2\u013f\u0148\3\2\2", - "\2\u0140\u0141\7\64\2\2\u0141\u0142\7=\2\2\u0142\u0143\5z>\2\u0143\u0144", - "\7>\2\2\u0144\u0148\3\2\2\2\u0145\u0146\7R\2\2\u0146\u0148\7k\2\2\u0147", - "\u0131\3\2\2\2\u0147\u0132\3\2\2\2\u0147\u0134\3\2\2\2\u0147\u0136\3", - "\2\2\2\u0147\u0139\3\2\2\2\u0147\u013b\3\2\2\2\u0147\u0140\3\2\2\2\u0147", - "\u0145\3\2\2\2\u0148\17\3\2\2\2\u0149\u014a\t\2\2\2\u014a\21\3\2\2\2", - "\u014b\u0158\5\16\b\2\u014c\u014d\7=\2\2\u014d\u014e\5z>\2\u014e\u014f", - "\7>\2\2\u014f\u0150\5\22\n\2\u0150\u0158\3\2\2\2\u0151\u0152\7\3\2\2", - "\u0152\u0153\7=\2\2\u0153\u0154\5z>\2\u0154\u0155\7>\2\2\u0155\u0156", - "\5\22\n\2\u0156\u0158\3\2\2\2\u0157\u014b\3\2\2\2\u0157\u014c\3\2\2", - "\2\u0157\u0151\3\2\2\2\u0158\23\3\2\2\2\u0159\u015a\b\13\1\2\u015a\u015b", - "\5\22\n\2\u015b\u0167\3\2\2\2\u015c\u015d\f\5\2\2\u015d\u015e\7M\2\2", - "\u015e\u0166\5\22\n\2\u015f\u0160\f\4\2\2\u0160\u0161\7N\2\2\u0161\u0166", - "\5\22\n\2\u0162\u0163\f\3\2\2\u0163\u0164\7O\2\2\u0164\u0166\5\22\n", - "\2\u0165\u015c\3\2\2\2\u0165\u015f\3\2\2\2\u0165\u0162\3\2\2\2\u0166", - "\u0169\3\2\2\2\u0167\u0165\3\2\2\2\u0167\u0168\3\2\2\2\u0168\25\3\2", - "\2\2\u0169\u0167\3\2\2\2\u016a\u016b\b\f\1\2\u016b\u016c\5\24\13\2\u016c", - "\u0175\3\2\2\2\u016d\u016e\f\4\2\2\u016e\u016f\7I\2\2\u016f\u0174\5", - "\24\13\2\u0170\u0171\f\3\2\2\u0171\u0172\7K\2\2\u0172\u0174\5\24\13", - "\2\u0173\u016d\3\2\2\2\u0173\u0170\3\2\2\2\u0174\u0177\3\2\2\2\u0175", - "\u0173\3\2\2\2\u0175\u0176\3\2\2\2\u0176\27\3\2\2\2\u0177\u0175\3\2", - "\2\2\u0178\u0179\b\r\1\2\u0179\u017a\5\26\f\2\u017a\u0183\3\2\2\2\u017b", - "\u017c\f\4\2\2\u017c\u017d\7G\2\2\u017d\u0182\5\26\f\2\u017e\u017f\f", - "\3\2\2\u017f\u0180\7H\2\2\u0180\u0182\5\26\f\2\u0181\u017b\3\2\2\2\u0181", - "\u017e\3\2\2\2\u0182\u0185\3\2\2\2\u0183\u0181\3\2\2\2\u0183\u0184\3", - "\2\2\2\u0184\31\3\2\2\2\u0185\u0183\3\2\2\2\u0186\u0187\b\16\1\2\u0187", - "\u0188\5\30\r\2\u0188\u0197\3\2\2\2\u0189\u018a\f\6\2\2\u018a\u018b", - "\7C\2\2\u018b\u0196\5\30\r\2\u018c\u018d\f\5\2\2\u018d\u018e\7E\2\2", - "\u018e\u0196\5\30\r\2\u018f\u0190\f\4\2\2\u0190\u0191\7D\2\2\u0191\u0196", - "\5\30\r\2\u0192\u0193\f\3\2\2\u0193\u0194\7F\2\2\u0194\u0196\5\30\r", - "\2\u0195\u0189\3\2\2\2\u0195\u018c\3\2\2\2\u0195\u018f\3\2\2\2\u0195", - "\u0192\3\2\2\2\u0196\u0199\3\2\2\2\u0197\u0195\3\2\2\2\u0197\u0198\3", - "\2\2\2\u0198\33\3\2\2\2\u0199\u0197\3\2\2\2\u019a\u019b\b\17\1\2\u019b", - "\u019c\5\32\16\2\u019c\u01a5\3\2\2\2\u019d\u019e\f\4\2\2\u019e\u019f", - "\7f\2\2\u019f\u01a4\5\32\16\2\u01a0\u01a1\f\3\2\2\u01a1\u01a2\7g\2\2", - "\u01a2\u01a4\5\32\16\2\u01a3\u019d\3\2\2\2\u01a3\u01a0\3\2\2\2\u01a4", - "\u01a7\3\2\2\2\u01a5\u01a3\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6\35\3\2", - "\2\2\u01a7\u01a5\3\2\2\2\u01a8\u01a9\b\20\1\2\u01a9\u01aa\5\34\17\2", - "\u01aa\u01b0\3\2\2\2\u01ab\u01ac\f\3\2\2\u01ac\u01ad\7P\2\2\u01ad\u01af", - "\5\34\17\2\u01ae\u01ab\3\2\2\2\u01af\u01b2\3\2\2\2\u01b0\u01ae\3\2\2", - "\2\u01b0\u01b1\3\2\2\2\u01b1\37\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b3\u01b4", - "\b\21\1\2\u01b4\u01b5\5\36\20\2\u01b5\u01bb\3\2\2\2\u01b6\u01b7\f\3", - "\2\2\u01b7\u01b8\7T\2\2\u01b8\u01ba\5\36\20\2\u01b9\u01b6\3\2\2\2\u01ba", - "\u01bd\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bb\u01bc\3\2\2\2\u01bc!\3\2\2", - "\2\u01bd\u01bb\3\2\2\2\u01be\u01bf\b\22\1\2\u01bf\u01c0\5 \21\2\u01c0", - "\u01c6\3\2\2\2\u01c1\u01c2\f\3\2\2\u01c2\u01c3\7Q\2\2\u01c3\u01c5\5", - " \21\2\u01c4\u01c1\3\2\2\2\u01c5\u01c8\3\2\2\2\u01c6\u01c4\3\2\2\2\u01c6", - "\u01c7\3\2\2\2\u01c7#\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c9\u01ca\b\23\1", - "\2\u01ca\u01cb\5\"\22\2\u01cb\u01d1\3\2\2\2\u01cc\u01cd\f\3\2\2\u01cd", - "\u01ce\7R\2\2\u01ce\u01d0\5\"\22\2\u01cf\u01cc\3\2\2\2\u01d0\u01d3\3", - "\2\2\2\u01d1\u01cf\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2%\3\2\2\2\u01d3", - "\u01d1\3\2\2\2\u01d4\u01d5\b\24\1\2\u01d5\u01d6\5$\23\2\u01d6\u01dc", - "\3\2\2\2\u01d7\u01d8\f\3\2\2\u01d8\u01d9\7S\2\2\u01d9\u01db\5$\23\2", - "\u01da\u01d7\3\2\2\2\u01db\u01de\3\2\2\2\u01dc\u01da\3\2\2\2\u01dc\u01dd", - "\3\2\2\2\u01dd\'\3\2\2\2\u01de\u01dc\3\2\2\2\u01df\u01e5\5&\24\2\u01e0", - "\u01e1\7W\2\2\u01e1\u01e2\5.\30\2\u01e2\u01e3\7X\2\2\u01e3\u01e4\5(", - "\25\2\u01e4\u01e6\3\2\2\2\u01e5\u01e0\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6", - ")\3\2\2\2\u01e7\u01ed\5(\25\2\u01e8\u01e9\5\16\b\2\u01e9\u01ea\5,\27", - "\2\u01ea\u01eb\5*\26\2\u01eb\u01ed\3\2\2\2\u01ec\u01e7\3\2\2\2\u01ec", - "\u01e8\3\2\2\2\u01ed+\3\2\2\2\u01ee\u01ef\t\3\2\2\u01ef-\3\2\2\2\u01f0", - "\u01f1\b\30\1\2\u01f1\u01f2\5*\26\2\u01f2\u01f8\3\2\2\2\u01f3\u01f4", - "\f\3\2\2\u01f4\u01f5\7Z\2\2\u01f5\u01f7\5*\26\2\u01f6\u01f3\3\2\2\2", - "\u01f7\u01fa\3\2\2\2\u01f8\u01f6\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9/", - "\3\2\2\2\u01fa\u01f8\3\2\2\2\u01fb\u01fc\5(\25\2\u01fc\61\3\2\2\2\u01fd", - "\u01ff\5\64\33\2\u01fe\u0200\5:\36\2\u01ff\u01fe\3\2\2\2\u01ff\u0200", - "\3\2\2\2\u0200\u0201\3\2\2\2\u0201\u0202\7Y\2\2\u0202\u0205\3\2\2\2", - "\u0203\u0205\5\u008cG\2\u0204\u01fd\3\2\2\2\u0204\u0203\3\2\2\2\u0205", - "\63\3\2\2\2\u0206\u0208\58\35\2\u0207\u0206\3\2\2\2\u0208\u0209\3\2", - "\2\2\u0209\u0207\3\2\2\2\u0209\u020a\3\2\2\2\u020a\65\3\2\2\2\u020b", - "\u020d\58\35\2\u020c\u020b\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u020c\3", - "\2\2\2\u020e\u020f\3\2\2\2\u020f\67\3\2\2\2\u0210\u0216\5> \2\u0211", - "\u0216\5@!\2\u0212\u0216\5Z.\2\u0213\u0216\5\\/\2\u0214\u0216\5^\60", - "\2\u0215\u0210\3\2\2\2\u0215\u0211\3\2\2\2\u0215\u0212\3\2\2\2\u0215", - "\u0213\3\2\2\2\u0215\u0214\3\2\2\2\u02169\3\2\2\2\u0217\u0218\b\36\1", - "\2\u0218\u0219\5<\37\2\u0219\u021f\3\2\2\2\u021a\u021b\f\3\2\2\u021b", - "\u021c\7Z\2\2\u021c\u021e\5<\37\2\u021d\u021a\3\2\2\2\u021e\u0221\3", - "\2\2\2\u021f\u021d\3\2\2\2\u021f\u0220\3\2\2\2\u0220;\3\2\2\2\u0221", - "\u021f\3\2\2\2\u0222\u0228\5`\61\2\u0223\u0224\5`\61\2\u0224\u0225\7", - "[\2\2\u0225\u0226\5\u0082B\2\u0226\u0228\3\2\2\2\u0227\u0222\3\2\2\2", - "\u0227\u0223\3\2\2\2\u0228=\3\2\2\2\u0229\u022a\t\4\2\2\u022a?\3\2\2", - "\2\u022b\u023a\t\5\2\2\u022c\u022d\7\3\2\2\u022d\u022e\7=\2\2\u022e", - "\u022f\t\6\2\2\u022f\u023a\7>\2\2\u0230\u023a\5X-\2\u0231\u023a\5B\"", - "\2\u0232\u023a\5P)\2\u0233\u023a\5\u0080A\2\u0234\u0235\7\t\2\2\u0235", - "\u0236\7=\2\2\u0236\u0237\5\60\31\2\u0237\u0238\7>\2\2\u0238\u023a\3", - "\2\2\2\u0239\u022b\3\2\2\2\u0239\u022c\3\2\2\2\u0239\u0230\3\2\2\2\u0239", - "\u0231\3\2\2\2\u0239\u0232\3\2\2\2\u0239\u0233\3\2\2\2\u0239\u0234\3", - "\2\2\2\u023aA\3\2\2\2\u023b\u023d\5D#\2\u023c\u023e\7k\2\2\u023d\u023c", - "\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0240\7A\2\2", - "\u0240\u0241\5F$\2\u0241\u0242\7B\2\2\u0242\u0247\3\2\2\2\u0243\u0244", - "\5D#\2\u0244\u0245\7k\2\2\u0245\u0247\3\2\2\2\u0246\u023b\3\2\2\2\u0246", - "\u0243\3\2\2\2\u0247C\3\2\2\2\u0248\u0249\t\7\2\2\u0249E\3\2\2\2\u024a", - "\u024b\b$\1\2\u024b\u024c\5H%\2\u024c\u0251\3\2\2\2\u024d\u024e\f\3", - "\2\2\u024e\u0250\5H%\2\u024f\u024d\3\2\2\2\u0250\u0253\3\2\2\2\u0251", - "\u024f\3\2\2\2\u0251\u0252\3\2\2\2\u0252G\3\2\2\2\u0253\u0251\3\2\2", - "\2\u0254\u0256\5J&\2\u0255\u0257\5L\'\2\u0256\u0255\3\2\2\2\u0256\u0257", - "\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u0259\7Y\2\2\u0259\u025c\3\2\2\2", - "\u025a\u025c\5\u008cG\2\u025b\u0254\3\2\2\2\u025b\u025a\3\2\2\2\u025c", - "I\3\2\2\2\u025d\u025f\5@!\2\u025e\u0260\5J&\2\u025f\u025e\3\2\2\2\u025f", - "\u0260\3\2\2\2\u0260\u0266\3\2\2\2\u0261\u0263\5Z.\2\u0262\u0264\5J", - "&\2\u0263\u0262\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u0266\3\2\2\2\u0265", - "\u025d\3\2\2\2\u0265\u0261\3\2\2\2\u0266K\3\2\2\2\u0267\u0268\b\'\1", - "\2\u0268\u0269\5N(\2\u0269\u026f\3\2\2\2\u026a\u026b\f\3\2\2\u026b\u026c", - "\7Z\2\2\u026c\u026e\5N(\2\u026d\u026a\3\2\2\2\u026e\u0271\3\2\2\2\u026f", - "\u026d\3\2\2\2\u026f\u0270\3\2\2\2\u0270M\3\2\2\2\u0271\u026f\3\2\2", - "\2\u0272\u0279\5`\61\2\u0273\u0275\5`\61\2\u0274\u0273\3\2\2\2\u0274", - "\u0275\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0277\7X\2\2\u0277\u0279\5", - "\60\31\2\u0278\u0272\3\2\2\2\u0278\u0274\3\2\2\2\u0279O\3\2\2\2\u027a", - "\u027c\7\33\2\2\u027b\u027d\7k\2\2\u027c\u027b\3\2\2\2\u027c\u027d\3", - "\2\2\2\u027d\u027e\3\2\2\2\u027e\u027f\7A\2\2\u027f\u0280\5R*\2\u0280", - "\u0281\7B\2\2\u0281\u028e\3\2\2\2\u0282\u0284\7\33\2\2\u0283\u0285\7", - "k\2\2\u0284\u0283\3\2\2\2\u0284\u0285\3\2\2\2\u0285\u0286\3\2\2\2\u0286", - "\u0287\7A\2\2\u0287\u0288\5R*\2\u0288\u0289\7Z\2\2\u0289\u028a\7B\2", - "\2\u028a\u028e\3\2\2\2\u028b\u028c\7\33\2\2\u028c\u028e\7k\2\2\u028d", - "\u027a\3\2\2\2\u028d\u0282\3\2\2\2\u028d\u028b\3\2\2\2\u028eQ\3\2\2", - "\2\u028f\u0290\b*\1\2\u0290\u0291\5T+\2\u0291\u0297\3\2\2\2\u0292\u0293", - "\f\3\2\2\u0293\u0294\7Z\2\2\u0294\u0296\5T+\2\u0295\u0292\3\2\2\2\u0296", - "\u0299\3\2\2\2\u0297\u0295\3\2\2\2\u0297\u0298\3\2\2\2\u0298S\3\2\2", - "\2\u0299\u0297\3\2\2\2\u029a\u02a0\5V,\2\u029b\u029c\5V,\2\u029c\u029d", - "\7[\2\2\u029d\u029e\5\60\31\2\u029e\u02a0\3\2\2\2\u029f\u029a\3\2\2", - "\2\u029f\u029b\3\2\2\2\u02a0U\3\2\2\2\u02a1\u02a2\7k\2\2\u02a2W\3\2", - "\2\2\u02a3\u02a4\7\65\2\2\u02a4\u02a5\7=\2\2\u02a5\u02a6\5z>\2\u02a6", - "\u02a7\7>\2\2\u02a7Y\3\2\2\2\u02a8\u02a9\t\b\2\2\u02a9[\3\2\2\2\u02aa", - "\u02b1\t\t\2\2\u02ab\u02b1\5f\64\2\u02ac\u02ad\7\f\2\2\u02ad\u02ae\7", - "=\2\2\u02ae\u02af\7k\2\2\u02af\u02b1\7>\2\2\u02b0\u02aa\3\2\2\2\u02b0", - "\u02ab\3\2\2\2\u02b0\u02ac\3\2\2\2\u02b1]\3\2\2\2\u02b2\u02b3\7\63\2", - "\2\u02b3\u02b4\7=\2\2\u02b4\u02b5\5z>\2\u02b5\u02b6\7>\2\2\u02b6\u02bd", - "\3\2\2\2\u02b7\u02b8\7\63\2\2\u02b8\u02b9\7=\2\2\u02b9\u02ba\5\60\31", - "\2\u02ba\u02bb\7>\2\2\u02bb\u02bd\3\2\2\2\u02bc\u02b2\3\2\2\2\u02bc", - "\u02b7\3\2\2\2\u02bd_\3\2\2\2\u02be\u02c0\5n8\2\u02bf\u02be\3\2\2\2", - "\u02bf\u02c0\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c5\5b\62\2\u02c2\u02c4", - "\5d\63\2\u02c3\u02c2\3\2\2\2\u02c4\u02c7\3\2\2\2\u02c5\u02c3\3\2\2\2", - "\u02c5\u02c6\3\2\2\2\u02c6a\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c8\u02c9", - "\b\62\1\2\u02c9\u02cf\7k\2\2\u02ca\u02cb\7=\2\2\u02cb\u02cc\5`\61\2", - "\u02cc\u02cd\7>\2\2\u02cd\u02cf\3\2\2\2\u02ce\u02c8\3\2\2\2\u02ce\u02ca", - "\3\2\2\2\u02cf\u02fd\3\2\2\2\u02d0\u02d1\f\b\2\2\u02d1\u02d3\7?\2\2", - "\u02d2\u02d4\5p9\2\u02d3\u02d2\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d6", - "\3\2\2\2\u02d5\u02d7\5*\26\2\u02d6\u02d5\3\2\2\2\u02d6\u02d7\3\2\2\2", - "\u02d7\u02d8\3\2\2\2\u02d8\u02fc\7@\2\2\u02d9\u02da\f\7\2\2\u02da\u02db", - "\7?\2\2\u02db\u02dd\7*\2\2\u02dc\u02de\5p9\2\u02dd\u02dc\3\2\2\2\u02dd", - "\u02de\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\5*\26\2\u02e0\u02e1\7", - "@\2\2\u02e1\u02fc\3\2\2\2\u02e2\u02e3\f\6\2\2\u02e3\u02e4\7?\2\2\u02e4", - "\u02e5\5p9\2\u02e5\u02e6\7*\2\2\u02e6\u02e7\5*\26\2\u02e7\u02e8\7@\2", - "\2\u02e8\u02fc\3\2\2\2\u02e9\u02ea\f\5\2\2\u02ea\u02ec\7?\2\2\u02eb", - "\u02ed\5p9\2\u02ec\u02eb\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee\3\2", - "\2\2\u02ee\u02ef\7M\2\2\u02ef\u02fc\7@\2\2\u02f0\u02f1\f\4\2\2\u02f1", - "\u02f2\7=\2\2\u02f2\u02f3\5r:\2\u02f3\u02f4\7>\2\2\u02f4\u02fc\3\2\2", - "\2\u02f5\u02f6\f\3\2\2\u02f6\u02f8\7=\2\2\u02f7\u02f9\5x=\2\u02f8\u02f7", - "\3\2\2\2\u02f8\u02f9\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fc\7>\2\2", - "\u02fb\u02d0\3\2\2\2\u02fb\u02d9\3\2\2\2\u02fb\u02e2\3\2\2\2\u02fb\u02e9", - "\3\2\2\2\u02fb\u02f0\3\2\2\2\u02fb\u02f5\3\2\2\2\u02fc\u02ff\3\2\2\2", - "\u02fd\u02fb\3\2\2\2\u02fd\u02fe\3\2\2\2\u02fec\3\2\2\2\u02ff\u02fd", - "\3\2\2\2\u0300\u0301\7\r\2\2\u0301\u0303\7=\2\2\u0302\u0304\7m\2\2\u0303", - "\u0302\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0303\3\2\2\2\u0305\u0306\3", - "\2\2\2\u0306\u0307\3\2\2\2\u0307\u030a\7>\2\2\u0308\u030a\5f\64\2\u0309", - "\u0300\3\2\2\2\u0309\u0308\3\2\2\2\u030ae\3\2\2\2\u030b\u030c\7\16\2", - "\2\u030c\u030d\7=\2\2\u030d\u030e\7=\2\2\u030e\u030f\5h\65\2\u030f\u0310", - "\7>\2\2\u0310\u0311\7>\2\2\u0311g\3\2\2\2\u0312\u0317\5j\66\2\u0313", - "\u0314\7Z\2\2\u0314\u0316\5j\66\2\u0315\u0313\3\2\2\2\u0316\u0319\3", - "\2\2\2\u0317\u0315\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u031c\3\2\2\2\u0319", - "\u0317\3\2\2\2\u031a\u031c\3\2\2\2\u031b\u0312\3\2\2\2\u031b\u031a\3", - "\2\2\2\u031ci\3\2\2\2\u031d\u0323\n\n\2\2\u031e\u0320\7=\2\2\u031f\u0321", - "\5\f\7\2\u0320\u031f\3\2\2\2\u0320\u0321\3\2\2\2\u0321\u0322\3\2\2\2", - "\u0322\u0324\7>\2\2\u0323\u031e\3\2\2\2\u0323\u0324\3\2\2\2\u0324\u0327", - "\3\2\2\2\u0325\u0327\3\2\2\2\u0326\u031d\3\2\2\2\u0326\u0325\3\2\2\2", - "\u0327k\3\2\2\2\u0328\u032e\n\13\2\2\u0329\u032a\7=\2\2\u032a\u032b", - "\5l\67\2\u032b\u032c\7>\2\2\u032c\u032e\3\2\2\2\u032d\u0328\3\2\2\2", - "\u032d\u0329\3\2\2\2\u032e\u0331\3\2\2\2\u032f\u032d\3\2\2\2\u032f\u0330", - "\3\2\2\2\u0330m\3\2\2\2\u0331\u032f\3\2\2\2\u0332\u0334\7M\2\2\u0333", - "\u0335\5p9\2\u0334\u0333\3\2\2\2\u0334\u0335\3\2\2\2\u0335\u0345\3\2", - "\2\2\u0336\u0338\7M\2\2\u0337\u0339\5p9\2\u0338\u0337\3\2\2\2\u0338", - "\u0339\3\2\2\2\u0339\u033a\3\2\2\2\u033a\u0345\5n8\2\u033b\u033d\7T", - "\2\2\u033c\u033e\5p9\2\u033d\u033c\3\2\2\2\u033d\u033e\3\2\2\2\u033e", - "\u0345\3\2\2\2\u033f\u0341\7T\2\2\u0340\u0342\5p9\2\u0341\u0340\3\2", - "\2\2\u0341\u0342\3\2\2\2\u0342\u0343\3\2\2\2\u0343\u0345\5n8\2\u0344", - "\u0332\3\2\2\2\u0344\u0336\3\2\2\2\u0344\u033b\3\2\2\2\u0344\u033f\3", - "\2\2\2\u0345o\3\2\2\2\u0346\u0347\b9\1\2\u0347\u0348\5Z.\2\u0348\u034d", - "\3\2\2\2\u0349\u034a\f\3\2\2\u034a\u034c\5Z.\2\u034b\u0349\3\2\2\2\u034c", - "\u034f\3\2\2\2\u034d\u034b\3\2\2\2\u034d\u034e\3\2\2\2\u034eq\3\2\2", - "\2\u034f\u034d\3\2\2\2\u0350\u0356\5t;\2\u0351\u0352\5t;\2\u0352\u0353", - "\7Z\2\2\u0353\u0354\7j\2\2\u0354\u0356\3\2\2\2\u0355\u0350\3\2\2\2\u0355", - "\u0351\3\2\2\2\u0356s\3\2\2\2\u0357\u0358\b;\1\2\u0358\u0359\5v<\2\u0359", - "\u035f\3\2\2\2\u035a\u035b\f\3\2\2\u035b\u035c\7Z\2\2\u035c\u035e\5", - "v<\2\u035d\u035a\3\2\2\2\u035e\u0361\3\2\2\2\u035f\u035d\3\2\2\2\u035f", - "\u0360\3\2\2\2\u0360u\3\2\2\2\u0361\u035f\3\2\2\2\u0362\u0363\5\64\33", - "\2\u0363\u0364\5`\61\2\u0364\u036a\3\2\2\2\u0365\u0367\5\66\34\2\u0366", - "\u0368\5|?\2\u0367\u0366\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u036a\3\2", - "\2\2\u0369\u0362\3\2\2\2\u0369\u0365\3\2\2\2\u036aw\3\2\2\2\u036b\u036c", - "\b=\1\2\u036c\u036d\7k\2\2\u036d\u0373\3\2\2\2\u036e\u036f\f\3\2\2\u036f", - "\u0370\7Z\2\2\u0370\u0372\7k\2\2\u0371\u036e\3\2\2\2\u0372\u0375\3\2", - "\2\2\u0373\u0371\3\2\2\2\u0373\u0374\3\2\2\2\u0374y\3\2\2\2\u0375\u0373", - "\3\2\2\2\u0376\u0378\5J&\2\u0377\u0379\5|?\2\u0378\u0377\3\2\2\2\u0378", - "\u0379\3\2\2\2\u0379{\3\2\2\2\u037a\u0386\5n8\2\u037b\u037d\5n8\2\u037c", - "\u037b\3\2\2\2\u037c\u037d\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u0382\5", - "~@\2\u037f\u0381\5d\63\2\u0380\u037f\3\2\2\2\u0381\u0384\3\2\2\2\u0382", - "\u0380\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0386\3\2\2\2\u0384\u0382\3", - "\2\2\2\u0385\u037a\3\2\2\2\u0385\u037c\3\2\2\2\u0386}\3\2\2\2\u0387", - "\u0388\b@\1\2\u0388\u0389\7=\2\2\u0389\u038a\5|?\2\u038a\u038e\7>\2", - "\2\u038b\u038d\5d\63\2\u038c\u038b\3\2\2\2\u038d\u0390\3\2\2\2\u038e", - "\u038c\3\2\2\2\u038e\u038f\3\2\2\2\u038f\u03b6\3\2\2\2\u0390\u038e\3", - "\2\2\2\u0391\u0393\7?\2\2\u0392\u0394\5p9\2\u0393\u0392\3\2\2\2\u0393", - "\u0394\3\2\2\2\u0394\u0396\3\2\2\2\u0395\u0397\5*\26\2\u0396\u0395\3", - "\2\2\2\u0396\u0397\3\2\2\2\u0397\u0398\3\2\2\2\u0398\u03b6\7@\2\2\u0399", - "\u039a\7?\2\2\u039a\u039c\7*\2\2\u039b\u039d\5p9\2\u039c\u039b\3\2\2", - "\2\u039c\u039d\3\2\2\2\u039d\u039e\3\2\2\2\u039e\u039f\5*\26\2\u039f", - "\u03a0\7@\2\2\u03a0\u03b6\3\2\2\2\u03a1\u03a2\7?\2\2\u03a2\u03a3\5p", - "9\2\u03a3\u03a4\7*\2\2\u03a4\u03a5\5*\26\2\u03a5\u03a6\7@\2\2\u03a6", - "\u03b6\3\2\2\2\u03a7\u03a8\7?\2\2\u03a8\u03a9\7M\2\2\u03a9\u03b6\7@", - "\2\2\u03aa\u03ac\7=\2\2\u03ab\u03ad\5r:\2\u03ac\u03ab\3\2\2\2\u03ac", - "\u03ad\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae\u03b2\7>\2\2\u03af\u03b1\5", - "d\63\2\u03b0\u03af\3\2\2\2\u03b1\u03b4\3\2\2\2\u03b2\u03b0\3\2\2\2\u03b2", - "\u03b3\3\2\2\2\u03b3\u03b6\3\2\2\2\u03b4\u03b2\3\2\2\2\u03b5\u0387\3", - "\2\2\2\u03b5\u0391\3\2\2\2\u03b5\u0399\3\2\2\2\u03b5\u03a1\3\2\2\2\u03b5", - "\u03a7\3\2\2\2\u03b5\u03aa\3\2\2\2\u03b6\u03e2\3\2\2\2\u03b7\u03b8\f", - "\7\2\2\u03b8\u03ba\7?\2\2\u03b9\u03bb\5p9\2\u03ba\u03b9\3\2\2\2\u03ba", - "\u03bb\3\2\2\2\u03bb\u03bd\3\2\2\2\u03bc\u03be\5*\26\2\u03bd\u03bc\3", - "\2\2\2\u03bd\u03be\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03e1\7@\2\2\u03c0", - "\u03c1\f\6\2\2\u03c1\u03c2\7?\2\2\u03c2\u03c4\7*\2\2\u03c3\u03c5\5p", - "9\2\u03c4\u03c3\3\2\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03c6\3\2\2\2\u03c6", - "\u03c7\5*\26\2\u03c7\u03c8\7@\2\2\u03c8\u03e1\3\2\2\2\u03c9\u03ca\f", - "\5\2\2\u03ca\u03cb\7?\2\2\u03cb\u03cc\5p9\2\u03cc\u03cd\7*\2\2\u03cd", - "\u03ce\5*\26\2\u03ce\u03cf\7@\2\2\u03cf\u03e1\3\2\2\2\u03d0\u03d1\f", - "\4\2\2\u03d1\u03d2\7?\2\2\u03d2\u03d3\7M\2\2\u03d3\u03e1\7@\2\2\u03d4", - "\u03d5\f\3\2\2\u03d5\u03d7\7=\2\2\u03d6\u03d8\5r:\2\u03d7\u03d6\3\2", - "\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03dd\7>\2\2\u03da", - "\u03dc\5d\63\2\u03db\u03da\3\2\2\2\u03dc\u03df\3\2\2\2\u03dd\u03db\3", - "\2\2\2\u03dd\u03de\3\2\2\2\u03de\u03e1\3\2\2\2\u03df\u03dd\3\2\2\2\u03e0", - "\u03b7\3\2\2\2\u03e0\u03c0\3\2\2\2\u03e0\u03c9\3\2\2\2\u03e0\u03d0\3", - "\2\2\2\u03e0\u03d4\3\2\2\2\u03e1\u03e4\3\2\2\2\u03e2\u03e0\3\2\2\2\u03e2", - "\u03e3\3\2\2\2\u03e3\177\3\2\2\2\u03e4\u03e2\3\2\2\2\u03e5\u03e6\7k", - "\2\2\u03e6\u0081\3\2\2\2\u03e7\u03f2\5*\26\2\u03e8\u03e9\7A\2\2\u03e9", - "\u03ea\5\u0084C\2\u03ea\u03eb\7B\2\2\u03eb\u03f2\3\2\2\2\u03ec\u03ed", - "\7A\2\2\u03ed\u03ee\5\u0084C\2\u03ee\u03ef\7Z\2\2\u03ef\u03f0\7B\2\2", - "\u03f0\u03f2\3\2\2\2\u03f1\u03e7\3\2\2\2\u03f1\u03e8\3\2\2\2\u03f1\u03ec", - "\3\2\2\2\u03f2\u0083\3\2\2\2\u03f3\u03f5\bC\1\2\u03f4\u03f6\5\u0086", - "D\2\u03f5\u03f4\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u03f7\3\2\2\2\u03f7", - "\u03f8\5\u0082B\2\u03f8\u0401\3\2\2\2\u03f9\u03fa\f\3\2\2\u03fa\u03fc", - "\7Z\2\2\u03fb\u03fd\5\u0086D\2\u03fc\u03fb\3\2\2\2\u03fc\u03fd\3\2\2", - "\2\u03fd\u03fe\3\2\2\2\u03fe\u0400\5\u0082B\2\u03ff\u03f9\3\2\2\2\u0400", - "\u0403\3\2\2\2\u0401\u03ff\3\2\2\2\u0401\u0402\3\2\2\2\u0402\u0085\3", - "\2\2\2\u0403\u0401\3\2\2\2\u0404\u0405\5\u0088E\2\u0405\u0406\7[\2\2", - "\u0406\u0087\3\2\2\2\u0407\u0408\bE\1\2\u0408\u0409\5\u008aF\2\u0409", - "\u040e\3\2\2\2\u040a\u040b\f\3\2\2\u040b\u040d\5\u008aF\2\u040c\u040a", - "\3\2\2\2\u040d\u0410\3\2\2\2\u040e\u040c\3\2\2\2\u040e\u040f\3\2\2\2", - "\u040f\u0089\3\2\2\2\u0410\u040e\3\2\2\2\u0411\u0412\7?\2\2\u0412\u0413", - "\5\60\31\2\u0413\u0414\7@\2\2\u0414\u0418\3\2\2\2\u0415\u0416\7i\2\2", - "\u0416\u0418\7k\2\2\u0417\u0411\3\2\2\2\u0417\u0415\3\2\2\2\u0418\u008b", - "\3\2\2\2\u0419\u041a\7;\2\2\u041a\u041b\7=\2\2\u041b\u041c\5\60\31\2", - "\u041c\u041e\7Z\2\2\u041d\u041f\7m\2\2\u041e\u041d\3\2\2\2\u041f\u0420", - "\3\2\2\2\u0420\u041e\3\2\2\2\u0420\u0421\3\2\2\2\u0421\u0422\3\2\2\2", - "\u0422\u0423\7>\2\2\u0423\u0424\7Y\2\2\u0424\u008d\3\2\2\2\u0425\u044b", - "\5\u0090I\2\u0426\u044b\5\u0092J\2\u0427\u044b\5\u0098M\2\u0428\u044b", - "\5\u009aN\2\u0429\u044b\5\u009cO\2\u042a\u044b\5\u009eP\2\u042b\u042c", - "\t\f\2\2\u042c\u042d\t\r\2\2\u042d\u0436\7=\2\2\u042e\u0433\5&\24\2", - "\u042f\u0430\7Z\2\2\u0430\u0432\5&\24\2\u0431\u042f\3\2\2\2\u0432\u0435", - "\3\2\2\2\u0433\u0431\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0437\3\2\2\2", - "\u0435\u0433\3\2\2\2\u0436\u042e\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0445", - "\3\2\2\2\u0438\u0441\7X\2\2\u0439\u043e\5&\24\2\u043a\u043b\7Z\2\2\u043b", - "\u043d\5&\24\2\u043c\u043a\3\2\2\2\u043d\u0440\3\2\2\2\u043e\u043c\3", - "\2\2\2\u043e\u043f\3\2\2\2\u043f\u0442\3\2\2\2\u0440\u043e\3\2\2\2\u0441", - "\u0439\3\2\2\2\u0441\u0442\3\2\2\2\u0442\u0444\3\2\2\2\u0443\u0438\3", - "\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3\2\2\2\u0445\u0446\3\2\2\2\u0446", - "\u0448\3\2\2\2\u0447\u0445\3\2\2\2\u0448\u0449\7>\2\2\u0449\u044b\7", - "Y\2\2\u044a\u0425\3\2\2\2\u044a\u0426\3\2\2\2\u044a\u0427\3\2\2\2\u044a", - "\u0428\3\2\2\2\u044a\u0429\3\2\2\2\u044a\u042a\3\2\2\2\u044a\u042b\3", - "\2\2\2\u044b\u008f\3\2\2\2\u044c\u044d\7k\2\2\u044d\u044e\7X\2\2\u044e", - "\u0458\5\u008eH\2\u044f\u0450\7\23\2\2\u0450\u0451\5\60\31\2\u0451\u0452", - "\7X\2\2\u0452\u0453\5\u008eH\2\u0453\u0458\3\2\2\2\u0454\u0455\7\27", - "\2\2\u0455\u0456\7X\2\2\u0456\u0458\5\u008eH\2\u0457\u044c\3\2\2\2\u0457", - "\u044f\3\2\2\2\u0457\u0454\3\2\2\2\u0458\u0091\3\2\2\2\u0459\u045b\7", - "A\2\2\u045a\u045c\5\u0094K\2\u045b\u045a\3\2\2\2\u045b\u045c\3\2\2\2", - "\u045c\u045d\3\2\2\2\u045d\u045e\7B\2\2\u045e\u0093\3\2\2\2\u045f\u0460", - "\bK\1\2\u0460\u0461\5\u0096L\2\u0461\u0466\3\2\2\2\u0462\u0463\f\3\2", - "\2\u0463\u0465\5\u0096L\2\u0464\u0462\3\2\2\2\u0465\u0468\3\2\2\2\u0466", - "\u0464\3\2\2\2\u0466\u0467\3\2\2\2\u0467\u0095\3\2\2\2\u0468\u0466\3", - "\2\2\2\u0469\u046c\5\62\32\2\u046a\u046c\5\u008eH\2\u046b\u0469\3\2", - "\2\2\u046b\u046a\3\2\2\2\u046c\u0097\3\2\2\2\u046d\u046f\5.\30\2\u046e", - "\u046d\3\2\2\2\u046e\u046f\3\2\2\2\u046f\u0470\3\2\2\2\u0470\u0471\7", - "Y\2\2\u0471\u0099\3\2\2\2\u0472\u0473\7 \2\2\u0473\u0474\7=\2\2\u0474", - "\u0475\5.\30\2\u0475\u0476\7>\2\2\u0476\u0479\5\u008eH\2\u0477\u0478", - "\7\32\2\2\u0478\u047a\5\u008eH\2\u0479\u0477\3\2\2\2\u0479\u047a\3\2", - "\2\2\u047a\u0482\3\2\2\2\u047b\u047c\7,\2\2\u047c\u047d\7=\2\2\u047d", - "\u047e\5.\30\2\u047e\u047f\7>\2\2\u047f\u0480\5\u008eH\2\u0480\u0482", - "\3\2\2\2\u0481\u0472\3\2\2\2\u0481\u047b\3\2\2\2\u0482\u009b\3\2\2\2", - "\u0483\u0484\7\62\2\2\u0484\u0485\7=\2\2\u0485\u0486\5.\30\2\u0486\u0487", - "\7>\2\2\u0487\u0488\5\u008eH\2\u0488\u04ae\3\2\2\2\u0489\u048a\7\30", - "\2\2\u048a\u048b\5\u008eH\2\u048b\u048c\7\62\2\2\u048c\u048d\7=\2\2", - "\u048d\u048e\5.\30\2\u048e\u048f\7>\2\2\u048f\u0490\7Y\2\2\u0490\u04ae", - "\3\2\2\2\u0491\u0492\7\36\2\2\u0492\u0494\7=\2\2\u0493\u0495\5.\30\2", - "\u0494\u0493\3\2\2\2\u0494\u0495\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0498", - "\7Y\2\2\u0497\u0499\5.\30\2\u0498\u0497\3\2\2\2\u0498\u0499\3\2\2\2", - "\u0499\u049a\3\2\2\2\u049a\u049c\7Y\2\2\u049b\u049d\5.\30\2\u049c\u049b", - "\3\2\2\2\u049c\u049d\3\2\2\2\u049d\u049e\3\2\2\2\u049e\u049f\7>\2\2", - "\u049f\u04ae\5\u008eH\2\u04a0\u04a1\7\36\2\2\u04a1\u04a2\7=\2\2\u04a2", - "\u04a4\5\62\32\2\u04a3\u04a5\5.\30\2\u04a4\u04a3\3\2\2\2\u04a4\u04a5", - "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a8\7Y\2\2\u04a7\u04a9\5.\30\2", - "\u04a8\u04a7\3\2\2\2\u04a8\u04a9\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab", - "\7>\2\2\u04ab\u04ac\5\u008eH\2\u04ac\u04ae\3\2\2\2\u04ad\u0483\3\2\2", - "\2\u04ad\u0489\3\2\2\2\u04ad\u0491\3\2\2\2\u04ad\u04a0\3\2\2\2\u04ae", - "\u009d\3\2\2\2\u04af\u04b0\7\37\2\2\u04b0\u04b1\7k\2\2\u04b1\u04c0\7", - "Y\2\2\u04b2\u04b3\7\26\2\2\u04b3\u04c0\7Y\2\2\u04b4\u04b5\7\22\2\2\u04b5", - "\u04c0\7Y\2\2\u04b6\u04b8\7&\2\2\u04b7\u04b9\5.\30\2\u04b8\u04b7\3\2", - "\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04c0\7Y\2\2\u04bb", - "\u04bc\7\37\2\2\u04bc\u04bd\5\16\b\2\u04bd\u04be\7Y\2\2\u04be\u04c0", - "\3\2\2\2\u04bf\u04af\3\2\2\2\u04bf\u04b2\3\2\2\2\u04bf\u04b4\3\2\2\2", - "\u04bf\u04b6\3\2\2\2\u04bf\u04bb\3\2\2\2\u04c0\u009f\3\2\2\2\u04c1\u04c3", - "\5\u00a2R\2\u04c2\u04c1\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c4\3\2", - "\2\2\u04c4\u04c5\7\2\2\3\u04c5\u00a1\3\2\2\2\u04c6\u04c7\bR\1\2\u04c7", - "\u04c8\5\u00a4S\2\u04c8\u04cd\3\2\2\2\u04c9\u04ca\f\3\2\2\u04ca\u04cc", - "\5\u00a4S\2\u04cb\u04c9\3\2\2\2\u04cc\u04cf\3\2\2\2\u04cd\u04cb\3\2", - "\2\2\u04cd\u04ce\3\2\2\2\u04ce\u00a3\3\2\2\2\u04cf\u04cd\3\2\2\2\u04d0", - "\u04d4\5\u00a6T\2\u04d1\u04d4\5\62\32\2\u04d2\u04d4\7Y\2\2\u04d3\u04d0", - "\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d3\u04d2\3\2\2\2\u04d4\u00a5\3\2\2\2", - "\u04d5\u04d7\5\64\33\2\u04d6\u04d5\3\2\2\2\u04d6\u04d7\3\2\2\2\u04d7", - "\u04d8\3\2\2\2\u04d8\u04da\5`\61\2\u04d9\u04db\5\u00a8U\2\u04da\u04d9", - "\3\2\2\2\u04da\u04db\3\2\2\2\u04db\u04dc\3\2\2\2\u04dc\u04dd\5\u0092", - "J\2\u04dd\u00a7\3\2\2\2\u04de\u04df\bU\1\2\u04df\u04e0\5\62\32\2\u04e0", - "\u04e5\3\2\2\2\u04e1\u04e2\f\3\2\2\u04e2\u04e4\5\62\32\2\u04e3\u04e1", - "\3\2\2\2\u04e4\u04e7\3\2\2\2\u04e5\u04e3\3\2\2\2\u04e5\u04e6\3\2\2\2", - "\u04e6\u00a9\3\2\2\2\u04e7\u04e5\3\2\2\2\u008c\u00af\u00b7\u00cb\u00dc", - "\u00e6\u010a\u0114\u0121\u0123\u012e\u0147\u0157\u0165\u0167\u0173\u0175", - "\u0181\u0183\u0195\u0197\u01a3\u01a5\u01b0\u01bb\u01c6\u01d1\u01dc\u01e5", - "\u01ec\u01f8\u01ff\u0204\u0209\u020e\u0215\u021f\u0227\u0239\u023d\u0246", - "\u0251\u0256\u025b\u025f\u0263\u0265\u026f\u0274\u0278\u027c\u0284\u028d", - "\u0297\u029f\u02b0\u02bc\u02bf\u02c5\u02ce\u02d3\u02d6\u02dd\u02ec\u02f8", - "\u02fb\u02fd\u0305\u0309\u0317\u031b\u0320\u0323\u0326\u032d\u032f\u0334", - "\u0338\u033d\u0341\u0344\u034d\u0355\u035f\u0367\u0369\u0373\u0378\u037c", - "\u0382\u0385\u038e\u0393\u0396\u039c\u03ac\u03b2\u03b5\u03ba\u03bd\u03c4", - "\u03d7\u03dd\u03e0\u03e2\u03f1\u03f5\u03fc\u0401\u040e\u0417\u0420\u0433", - "\u0436\u043e\u0441\u0445\u044a\u0457\u045b\u0466\u046b\u046e\u0479\u0481", - "\u0494\u0498\u049c\u04a4\u04a8\u04ad\u04b8\u04bf\u04c2\u04cd\u04d3\u04d6", - "\u04da\u04e5"].join(""); + "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z", + "\tZ\4[\t[\4\\\t\\\4]\t]\3\2\3\2\3\2\6\2\u00be\n\2\r\2\16\2\u00bf\3\2", + "\3\2\3\2\3\2\3\2\3\2\5\2\u00c8\n\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3", + "\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00dc\n\2\3\3\3\3\3\3\3\3", + "\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u00eb\n\4\f\4\16\4\u00ee\13", + "\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u00f7\n\5\3\6\3\6\3\6\3\6\3\6\3\6", + "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", + "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u011b\n\6\3\6\3\6\3", + "\6\3\6\3\6\3\6\3\6\3\6\5\6\u0125\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", + "\3\6\3\6\3\6\7\6\u0132\n\6\f\6\16\6\u0135\13\6\3\7\3\7\3\7\3\7\3\7\3", + "\7\7\7\u013d\n\7\f\7\16\7\u0140\13\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", + "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\5\b\u0158\n", + "\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u0168", + "\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13", + "\u0176\n\13\f\13\16\13\u0179\13\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3", + "\f\7\f\u0184\n\f\f\f\16\f\u0187\13\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", + "\3\r\7\r\u0192\n\r\f\r\16\r\u0195\13\r\3\16\3\16\3\16\3\16\3\16\3\16", + "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\7\16\u01a6\n\16\f\16\16", + "\16\u01a9\13\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\7\17\u01b4", + "\n\17\f\17\16\17\u01b7\13\17\3\20\3\20\3\20\3\20\3\20\3\20\7\20\u01bf", + "\n\20\f\20\16\20\u01c2\13\20\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u01ca", + "\n\21\f\21\16\21\u01cd\13\21\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u01d5", + "\n\22\f\22\16\22\u01d8\13\22\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u01e0", + "\n\23\f\23\16\23\u01e3\13\23\3\24\3\24\3\24\3\24\3\24\3\24\7\24\u01eb", + "\n\24\f\24\16\24\u01ee\13\24\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u01f6", + "\n\25\3\26\3\26\3\26\3\26\3\26\5\26\u01fd\n\26\3\27\3\27\3\30\3\30\3", + "\30\3\30\3\30\3\30\7\30\u0207\n\30\f\30\16\30\u020a\13\30\3\31\3\31", + "\3\32\3\32\5\32\u0210\n\32\3\32\3\32\3\32\5\32\u0215\n\32\3\33\6\33", + "\u0218\n\33\r\33\16\33\u0219\3\34\6\34\u021d\n\34\r\34\16\34\u021e\3", + "\35\3\35\3\35\3\35\3\35\5\35\u0226\n\35\3\36\3\36\3\36\3\36\3\36\3\36", + "\7\36\u022e\n\36\f\36\16\36\u0231\13\36\3\37\3\37\3\37\3\37\3\37\5\37", + "\u0238\n\37\3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u024a", + "\n!\3\"\3\"\5\"\u024e\n\"\3\"\3\"\3\"\3\"\3\"\5\"\u0255\n\"\3#\3#\3", + "$\3$\3$\3$\3%\3%\3%\3%\3%\7%\u0262\n%\f%\16%\u0265\13%\3&\3&\5&\u0269", + "\n&\3&\3&\3&\5&\u026e\n&\3\'\3\'\5\'\u0272\n\'\3\'\3\'\5\'\u0276\n\'", + "\5\'\u0278\n\'\3(\3(\3(\3(\3(\3(\7(\u0280\n(\f(\16(\u0283\13(\3)\3)", + "\5)\u0287\n)\3)\3)\5)\u028b\n)\3*\3*\5*\u028f\n*\3*\3*\3*\3*\3*\3*\5", + "*\u0297\n*\3*\3*\3*\3*\3*\3*\3*\5*\u02a0\n*\3+\3+\3+\3+\3+\3+\7+\u02a8", + "\n+\f+\16+\u02ab\13+\3,\3,\3,\3,\3,\5,\u02b2\n,\3-\3-\3.\3.\3.\3.\3", + ".\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u02c3\n\60\3\61\3\61\3\61", + "\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02cf\n\61\3\62\5\62\u02d2", + "\n\62\3\62\3\62\7\62\u02d6\n\62\f\62\16\62\u02d9\13\62\3\63\3\63\3\63", + "\3\63\3\63\3\63\5\63\u02e1\n\63\3\63\3\63\3\63\5\63\u02e6\n\63\3\63", + "\5\63\u02e9\n\63\3\63\3\63\3\63\3\63\3\63\5\63\u02f0\n\63\3\63\3\63", + "\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u02ff\n", + "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u030b\n\63", + "\3\63\7\63\u030e\n\63\f\63\16\63\u0311\13\63\3\64\3\64\3\64\6\64\u0316", + "\n\64\r\64\16\64\u0317\3\64\3\64\5\64\u031c\n\64\3\65\3\65\3\65\3\65", + "\3\65\3\65\3\65\3\66\3\66\3\66\7\66\u0328\n\66\f\66\16\66\u032b\13\66", + "\3\66\5\66\u032e\n\66\3\67\3\67\3\67\5\67\u0333\n\67\3\67\5\67\u0336", + "\n\67\3\67\5\67\u0339\n\67\38\38\38\38\38\78\u0340\n8\f8\168\u0343\13", + "8\39\39\59\u0347\n9\39\39\59\u034b\n9\39\39\39\59\u0350\n9\39\39\59", + "\u0354\n9\39\59\u0357\n9\3:\3:\3:\3:\3:\7:\u035e\n:\f:\16:\u0361\13", + ":\3;\3;\3;\3;\3;\5;\u0368\n;\3<\3<\3<\3<\3<\3<\7<\u0370\n<\f<\16<\u0373", + "\13<\3=\3=\3=\3=\3=\5=\u037a\n=\5=\u037c\n=\3>\3>\3>\3>\3>\3>\7>\u0384", + "\n>\f>\16>\u0387\13>\3?\3?\5?\u038b\n?\3@\3@\5@\u038f\n@\3@\3@\7@\u0393", + "\n@\f@\16@\u0396\13@\5@\u0398\n@\3A\3A\3A\3A\3A\7A\u039f\nA\fA\16A\u03a2", + "\13A\3A\3A\5A\u03a6\nA\3A\5A\u03a9\nA\3A\3A\3A\3A\5A\u03af\nA\3A\3A", + "\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\5A\u03bf\nA\3A\3A\7A\u03c3\nA\f", + "A\16A\u03c6\13A\5A\u03c8\nA\3A\3A\3A\5A\u03cd\nA\3A\5A\u03d0\nA\3A\3", + "A\3A\3A\3A\5A\u03d7\nA\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A", + "\3A\3A\5A\u03ea\nA\3A\3A\7A\u03ee\nA\fA\16A\u03f1\13A\7A\u03f3\nA\f", + "A\16A\u03f6\13A\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\5C\u0404\nC\3D\3", + "D\5D\u0408\nD\3D\3D\3D\3D\3D\5D\u040f\nD\3D\7D\u0412\nD\fD\16D\u0415", + "\13D\3E\3E\3E\3F\3F\3F\3F\3F\7F\u041f\nF\fF\16F\u0422\13F\3G\3G\3G\3", + "G\3G\3G\5G\u042a\nG\3H\3H\3H\3H\3H\6H\u0431\nH\rH\16H\u0432\3H\3H\3", + "H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\7I\u0444\nI\fI\16I\u0447\13I\5", + "I\u0449\nI\3I\3I\3I\3I\7I\u044f\nI\fI\16I\u0452\13I\5I\u0454\nI\7I\u0456", + "\nI\fI\16I\u0459\13I\3I\3I\5I\u045d\nI\3J\3J\3J\3J\3J\3J\3J\3J\3J\3", + "J\3J\5J\u046a\nJ\3K\3K\5K\u046e\nK\3K\3K\3L\3L\3L\3L\3L\7L\u0477\nL", + "\fL\16L\u047a\13L\3M\3M\5M\u047e\nM\3N\5N\u0481\nN\3N\3N\3O\3O\3O\3", + "O\3O\3O\3O\5O\u048c\nO\3O\3O\3O\3O\3O\3O\5O\u0494\nO\3P\3P\3P\3P\3P", + "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\5P\u04a7\nP\3P\3P\5P\u04ab\nP\3", + "P\3P\5P\u04af\nP\3P\3P\3P\3P\3P\3P\5P\u04b7\nP\3P\3P\5P\u04bb\nP\3P", + "\3P\3P\5P\u04c0\nP\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u04cb\nQ\3Q\3Q\3Q\3", + "Q\3Q\5Q\u04d2\nQ\3R\5R\u04d5\nR\3R\3R\3S\3S\3S\3S\3S\7S\u04de\nS\fS", + "\16S\u04e1\13S\3T\3T\3T\3T\3T\3T\5T\u04e9\nT\3U\3U\3U\5U\u04ee\nU\3", + "V\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Z\3Z\3Z\3Z", + "\3Z\3Z\7Z\u0509\nZ\fZ\16Z\u050c\13Z\3[\3[\3[\3[\3[\5[\u0513\n[\3\\\5", + "\\\u0516\n\\\3\\\3\\\5\\\u051a\n\\\3\\\3\\\3]\3]\3]\3]\3]\7]\u0523\n", + "]\f]\16]\u0526\13]\3]\2\37\6\n\f\24\26\30\32\34\36 \"$&.:HNTdrvz\u0080", + "\u0086\u008a\u0096\u00a4\u00b2\u00b8^\2\4\6\b\n\f\16\20\22\24\26\30", + "\32\34\36 \"$&(*,.\60\62\64\668:<>@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\2\16\7\2LLNNPPSSXY\3\2^h\b\2\24\24\37", + "\37\'\'--\60\60??\n\2\6\b\27\27\34\34 %&*+\62\639:\3\2\6\b\4\2..\61", + "\61\6\2\30\30((\64\6488\5\2\n\13$$==\4\2@A]]\3\2@A\4\2\r\r\17\17\4\2", + "\20\20\64\64\u0596\2\u00db\3\2\2\2\4\u00dd\3\2\2\2\6\u00e4\3\2\2\2\b", + "\u00f6\3\2\2\2\n\u011a\3\2\2\2\f\u0136\3\2\2\2\16\u0157\3\2\2\2\20\u0159", + "\3\2\2\2\22\u0167\3\2\2\2\24\u0169\3\2\2\2\26\u017a\3\2\2\2\30\u0188", + "\3\2\2\2\32\u0196\3\2\2\2\34\u01aa\3\2\2\2\36\u01b8\3\2\2\2 \u01c3\3", + "\2\2\2\"\u01ce\3\2\2\2$\u01d9\3\2\2\2&\u01e4\3\2\2\2(\u01ef\3\2\2\2", + "*\u01fc\3\2\2\2,\u01fe\3\2\2\2.\u0200\3\2\2\2\60\u020b\3\2\2\2\62\u0214", + "\3\2\2\2\64\u0217\3\2\2\2\66\u021c\3\2\2\28\u0225\3\2\2\2:\u0227\3\2", + "\2\2<\u0237\3\2\2\2>\u0239\3\2\2\2@\u0249\3\2\2\2B\u0254\3\2\2\2D\u0256", + "\3\2\2\2F\u0258\3\2\2\2H\u025c\3\2\2\2J\u026d\3\2\2\2L\u0277\3\2\2\2", + "N\u0279\3\2\2\2P\u028a\3\2\2\2R\u029f\3\2\2\2T\u02a1\3\2\2\2V\u02b1", + "\3\2\2\2X\u02b3\3\2\2\2Z\u02b5\3\2\2\2\\\u02ba\3\2\2\2^\u02c2\3\2\2", + "\2`\u02ce\3\2\2\2b\u02d1\3\2\2\2d\u02e0\3\2\2\2f\u031b\3\2\2\2h\u031d", + "\3\2\2\2j\u032d\3\2\2\2l\u0338\3\2\2\2n\u0341\3\2\2\2p\u0356\3\2\2\2", + "r\u0358\3\2\2\2t\u0367\3\2\2\2v\u0369\3\2\2\2x\u037b\3\2\2\2z\u037d", + "\3\2\2\2|\u0388\3\2\2\2~\u0397\3\2\2\2\u0080\u03c7\3\2\2\2\u0082\u03f7", + "\3\2\2\2\u0084\u0403\3\2\2\2\u0086\u0405\3\2\2\2\u0088\u0416\3\2\2\2", + "\u008a\u0419\3\2\2\2\u008c\u0429\3\2\2\2\u008e\u042b\3\2\2\2\u0090\u045c", + "\3\2\2\2\u0092\u0469\3\2\2\2\u0094\u046b\3\2\2\2\u0096\u0471\3\2\2\2", + "\u0098\u047d\3\2\2\2\u009a\u0480\3\2\2\2\u009c\u0493\3\2\2\2\u009e\u04bf", + "\3\2\2\2\u00a0\u04d1\3\2\2\2\u00a2\u04d4\3\2\2\2\u00a4\u04d8\3\2\2\2", + "\u00a6\u04e8\3\2\2\2\u00a8\u04ed\3\2\2\2\u00aa\u04ef\3\2\2\2\u00ac\u04f3", + "\3\2\2\2\u00ae\u04f8\3\2\2\2\u00b0\u0500\3\2\2\2\u00b2\u0502\3\2\2\2", + "\u00b4\u0512\3\2\2\2\u00b6\u0515\3\2\2\2\u00b8\u051d\3\2\2\2\u00ba\u00dc", + "\7n\2\2\u00bb\u00dc\7o\2\2\u00bc\u00be\7p\2\2\u00bd\u00bc\3\2\2\2\u00be", + "\u00bf\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00dc\3", + "\2\2\2\u00c1\u00c2\7@\2\2\u00c2\u00c3\5.\30\2\u00c3\u00c4\7A\2\2\u00c4", + "\u00dc\3\2\2\2\u00c5\u00dc\5\4\3\2\u00c6\u00c8\7\3\2\2\u00c7\u00c6\3", + "\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\u00c9\3\2\2\2\u00c9\u00ca\7@\2\2\u00ca", + "\u00cb\5\u0094K\2\u00cb\u00cc\7A\2\2\u00cc\u00dc\3\2\2\2\u00cd\u00ce", + "\7\4\2\2\u00ce\u00cf\7@\2\2\u00cf\u00d0\5\16\b\2\u00d0\u00d1\7]\2\2", + "\u00d1\u00d2\5|?\2\u00d2\u00d3\7A\2\2\u00d3\u00dc\3\2\2\2\u00d4\u00d5", + "\7\5\2\2\u00d5\u00d6\7@\2\2\u00d6\u00d7\5|?\2\u00d7\u00d8\7]\2\2\u00d8", + "\u00d9\5\16\b\2\u00d9\u00da\7A\2\2\u00da\u00dc\3\2\2\2\u00db\u00ba\3", + "\2\2\2\u00db\u00bb\3\2\2\2\u00db\u00bd\3\2\2\2\u00db\u00c1\3\2\2\2\u00db", + "\u00c5\3\2\2\2\u00db\u00c7\3\2\2\2\u00db\u00cd\3\2\2\2\u00db\u00d4\3", + "\2\2\2\u00dc\3\3\2\2\2\u00dd\u00de\7;\2\2\u00de\u00df\7@\2\2\u00df\u00e0", + "\5*\26\2\u00e0\u00e1\7]\2\2\u00e1\u00e2\5\6\4\2\u00e2\u00e3\7A\2\2\u00e3", + "\5\3\2\2\2\u00e4\u00e5\b\4\1\2\u00e5\u00e6\5\b\5\2\u00e6\u00ec\3\2\2", + "\2\u00e7\u00e8\f\3\2\2\u00e8\u00e9\7]\2\2\u00e9\u00eb\5\b\5\2\u00ea", + "\u00e7\3\2\2\2\u00eb\u00ee\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ec\u00ed\3", + "\2\2\2\u00ed\7\3\2\2\2\u00ee\u00ec\3\2\2\2\u00ef\u00f0\5|?\2\u00f0\u00f1", + "\7[\2\2\u00f1\u00f2\5*\26\2\u00f2\u00f7\3\2\2\2\u00f3\u00f4\7\32\2\2", + "\u00f4\u00f5\7[\2\2\u00f5\u00f7\5*\26\2\u00f6\u00ef\3\2\2\2\u00f6\u00f3", + "\3\2\2\2\u00f7\t\3\2\2\2\u00f8\u00f9\b\6\1\2\u00f9\u011b\5\2\2\2\u00fa", + "\u00fb\7@\2\2\u00fb\u00fc\5|?\2\u00fc\u00fd\7A\2\2\u00fd\u00fe\7D\2", + "\2\u00fe\u00ff\5\u0086D\2\u00ff\u0100\7E\2\2\u0100\u011b\3\2\2\2\u0101", + "\u0102\7@\2\2\u0102\u0103\5|?\2\u0103\u0104\7A\2\2\u0104\u0105\7D\2", + "\2\u0105\u0106\5\u0086D\2\u0106\u0107\7]\2\2\u0107\u0108\7E\2\2\u0108", + "\u011b\3\2\2\2\u0109\u010a\7\3\2\2\u010a\u010b\7@\2\2\u010b\u010c\5", + "|?\2\u010c\u010d\7A\2\2\u010d\u010e\7D\2\2\u010e\u010f\5\u0086D\2\u010f", + "\u0110\7E\2\2\u0110\u011b\3\2\2\2\u0111\u0112\7\3\2\2\u0112\u0113\7", + "@\2\2\u0113\u0114\5|?\2\u0114\u0115\7A\2\2\u0115\u0116\7D\2\2\u0116", + "\u0117\5\u0086D\2\u0117\u0118\7]\2\2\u0118\u0119\7E\2\2\u0119\u011b", + "\3\2\2\2\u011a\u00f8\3\2\2\2\u011a\u00fa\3\2\2\2\u011a\u0101\3\2\2\2", + "\u011a\u0109\3\2\2\2\u011a\u0111\3\2\2\2\u011b\u0133\3\2\2\2\u011c\u011d", + "\f\f\2\2\u011d\u011e\7B\2\2\u011e\u011f\5.\30\2\u011f\u0120\7C\2\2\u0120", + "\u0132\3\2\2\2\u0121\u0122\f\13\2\2\u0122\u0124\7@\2\2\u0123\u0125\5", + "\f\7\2\u0124\u0123\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0126\3\2\2\2\u0126", + "\u0132\7A\2\2\u0127\u0128\f\n\2\2\u0128\u0129\7l\2\2\u0129\u0132\7n", + "\2\2\u012a\u012b\f\t\2\2\u012b\u012c\7k\2\2\u012c\u0132\7n\2\2\u012d", + "\u012e\f\b\2\2\u012e\u0132\7M\2\2\u012f\u0130\f\7\2\2\u0130\u0132\7", + "O\2\2\u0131\u011c\3\2\2\2\u0131\u0121\3\2\2\2\u0131\u0127\3\2\2\2\u0131", + "\u012a\3\2\2\2\u0131\u012d\3\2\2\2\u0131\u012f\3\2\2\2\u0132\u0135\3", + "\2\2\2\u0133\u0131\3\2\2\2\u0133\u0134\3\2\2\2\u0134\13\3\2\2\2\u0135", + "\u0133\3\2\2\2\u0136\u0137\b\7\1\2\u0137\u0138\5*\26\2\u0138\u013e\3", + "\2\2\2\u0139\u013a\f\3\2\2\u013a\u013b\7]\2\2\u013b\u013d\5*\26\2\u013c", + "\u0139\3\2\2\2\u013d\u0140\3\2\2\2\u013e\u013c\3\2\2\2\u013e\u013f\3", + "\2\2\2\u013f\r\3\2\2\2\u0140\u013e\3\2\2\2\u0141\u0158\5\n\6\2\u0142", + "\u0143\7M\2\2\u0143\u0158\5\16\b\2\u0144\u0145\7O\2\2\u0145\u0158\5", + "\16\b\2\u0146\u0147\5\20\t\2\u0147\u0148\5\22\n\2\u0148\u0158\3\2\2", + "\2\u0149\u014a\7,\2\2\u014a\u0158\5\16\b\2\u014b\u014c\7,\2\2\u014c", + "\u014d\7@\2\2\u014d\u014e\5|?\2\u014e\u014f\7A\2\2\u014f\u0158\3\2\2", + "\2\u0150\u0151\7\67\2\2\u0151\u0152\7@\2\2\u0152\u0153\5|?\2\u0153\u0154", + "\7A\2\2\u0154\u0158\3\2\2\2\u0155\u0156\7U\2\2\u0156\u0158\7n\2\2\u0157", + "\u0141\3\2\2\2\u0157\u0142\3\2\2\2\u0157\u0144\3\2\2\2\u0157\u0146\3", + "\2\2\2\u0157\u0149\3\2\2\2\u0157\u014b\3\2\2\2\u0157\u0150\3\2\2\2\u0157", + "\u0155\3\2\2\2\u0158\17\3\2\2\2\u0159\u015a\t\2\2\2\u015a\21\3\2\2\2", + "\u015b\u0168\5\16\b\2\u015c\u015d\7@\2\2\u015d\u015e\5|?\2\u015e\u015f", + "\7A\2\2\u015f\u0160\5\22\n\2\u0160\u0168\3\2\2\2\u0161\u0162\7\3\2\2", + "\u0162\u0163\7@\2\2\u0163\u0164\5|?\2\u0164\u0165\7A\2\2\u0165\u0166", + "\5\22\n\2\u0166\u0168\3\2\2\2\u0167\u015b\3\2\2\2\u0167\u015c\3\2\2", + "\2\u0167\u0161\3\2\2\2\u0168\23\3\2\2\2\u0169\u016a\b\13\1\2\u016a\u016b", + "\5\22\n\2\u016b\u0177\3\2\2\2\u016c\u016d\f\5\2\2\u016d\u016e\7P\2\2", + "\u016e\u0176\5\22\n\2\u016f\u0170\f\4\2\2\u0170\u0171\7Q\2\2\u0171\u0176", + "\5\22\n\2\u0172\u0173\f\3\2\2\u0173\u0174\7R\2\2\u0174\u0176\5\22\n", + "\2\u0175\u016c\3\2\2\2\u0175\u016f\3\2\2\2\u0175\u0172\3\2\2\2\u0176", + "\u0179\3\2\2\2\u0177\u0175\3\2\2\2\u0177\u0178\3\2\2\2\u0178\25\3\2", + "\2\2\u0179\u0177\3\2\2\2\u017a\u017b\b\f\1\2\u017b\u017c\5\24\13\2\u017c", + "\u0185\3\2\2\2\u017d\u017e\f\4\2\2\u017e\u017f\7L\2\2\u017f\u0184\5", + "\24\13\2\u0180\u0181\f\3\2\2\u0181\u0182\7N\2\2\u0182\u0184\5\24\13", + "\2\u0183\u017d\3\2\2\2\u0183\u0180\3\2\2\2\u0184\u0187\3\2\2\2\u0185", + "\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\27\3\2\2\2\u0187\u0185\3\2", + "\2\2\u0188\u0189\b\r\1\2\u0189\u018a\5\26\f\2\u018a\u0193\3\2\2\2\u018b", + "\u018c\f\4\2\2\u018c\u018d\7J\2\2\u018d\u0192\5\26\f\2\u018e\u018f\f", + "\3\2\2\u018f\u0190\7K\2\2\u0190\u0192\5\26\f\2\u0191\u018b\3\2\2\2\u0191", + "\u018e\3\2\2\2\u0192\u0195\3\2\2\2\u0193\u0191\3\2\2\2\u0193\u0194\3", + "\2\2\2\u0194\31\3\2\2\2\u0195\u0193\3\2\2\2\u0196\u0197\b\16\1\2\u0197", + "\u0198\5\30\r\2\u0198\u01a7\3\2\2\2\u0199\u019a\f\6\2\2\u019a\u019b", + "\7F\2\2\u019b\u01a6\5\30\r\2\u019c\u019d\f\5\2\2\u019d\u019e\7H\2\2", + "\u019e\u01a6\5\30\r\2\u019f\u01a0\f\4\2\2\u01a0\u01a1\7G\2\2\u01a1\u01a6", + "\5\30\r\2\u01a2\u01a3\f\3\2\2\u01a3\u01a4\7I\2\2\u01a4\u01a6\5\30\r", + "\2\u01a5\u0199\3\2\2\2\u01a5\u019c\3\2\2\2\u01a5\u019f\3\2\2\2\u01a5", + "\u01a2\3\2\2\2\u01a6\u01a9\3\2\2\2\u01a7\u01a5\3\2\2\2\u01a7\u01a8\3", + "\2\2\2\u01a8\33\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa\u01ab\b\17\1\2\u01ab", + "\u01ac\5\32\16\2\u01ac\u01b5\3\2\2\2\u01ad\u01ae\f\4\2\2\u01ae\u01af", + "\7i\2\2\u01af\u01b4\5\32\16\2\u01b0\u01b1\f\3\2\2\u01b1\u01b2\7j\2\2", + "\u01b2\u01b4\5\32\16\2\u01b3\u01ad\3\2\2\2\u01b3\u01b0\3\2\2\2\u01b4", + "\u01b7\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\35\3\2", + "\2\2\u01b7\u01b5\3\2\2\2\u01b8\u01b9\b\20\1\2\u01b9\u01ba\5\34\17\2", + "\u01ba\u01c0\3\2\2\2\u01bb\u01bc\f\3\2\2\u01bc\u01bd\7S\2\2\u01bd\u01bf", + "\5\34\17\2\u01be\u01bb\3\2\2\2\u01bf\u01c2\3\2\2\2\u01c0\u01be\3\2\2", + "\2\u01c0\u01c1\3\2\2\2\u01c1\37\3\2\2\2\u01c2\u01c0\3\2\2\2\u01c3\u01c4", + "\b\21\1\2\u01c4\u01c5\5\36\20\2\u01c5\u01cb\3\2\2\2\u01c6\u01c7\f\3", + "\2\2\u01c7\u01c8\7W\2\2\u01c8\u01ca\5\36\20\2\u01c9\u01c6\3\2\2\2\u01ca", + "\u01cd\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc!\3\2\2", + "\2\u01cd\u01cb\3\2\2\2\u01ce\u01cf\b\22\1\2\u01cf\u01d0\5 \21\2\u01d0", + "\u01d6\3\2\2\2\u01d1\u01d2\f\3\2\2\u01d2\u01d3\7T\2\2\u01d3\u01d5\5", + " \21\2\u01d4\u01d1\3\2\2\2\u01d5\u01d8\3\2\2\2\u01d6\u01d4\3\2\2\2\u01d6", + "\u01d7\3\2\2\2\u01d7#\3\2\2\2\u01d8\u01d6\3\2\2\2\u01d9\u01da\b\23\1", + "\2\u01da\u01db\5\"\22\2\u01db\u01e1\3\2\2\2\u01dc\u01dd\f\3\2\2\u01dd", + "\u01de\7U\2\2\u01de\u01e0\5\"\22\2\u01df\u01dc\3\2\2\2\u01e0\u01e3\3", + "\2\2\2\u01e1\u01df\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2%\3\2\2\2\u01e3", + "\u01e1\3\2\2\2\u01e4\u01e5\b\24\1\2\u01e5\u01e6\5$\23\2\u01e6\u01ec", + "\3\2\2\2\u01e7\u01e8\f\3\2\2\u01e8\u01e9\7V\2\2\u01e9\u01eb\5$\23\2", + "\u01ea\u01e7\3\2\2\2\u01eb\u01ee\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ec\u01ed", + "\3\2\2\2\u01ed\'\3\2\2\2\u01ee\u01ec\3\2\2\2\u01ef\u01f5\5&\24\2\u01f0", + "\u01f1\7Z\2\2\u01f1\u01f2\5.\30\2\u01f2\u01f3\7[\2\2\u01f3\u01f4\5(", + "\25\2\u01f4\u01f6\3\2\2\2\u01f5\u01f0\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6", + ")\3\2\2\2\u01f7\u01fd\5(\25\2\u01f8\u01f9\5\16\b\2\u01f9\u01fa\5,\27", + "\2\u01fa\u01fb\5*\26\2\u01fb\u01fd\3\2\2\2\u01fc\u01f7\3\2\2\2\u01fc", + "\u01f8\3\2\2\2\u01fd+\3\2\2\2\u01fe\u01ff\t\3\2\2\u01ff-\3\2\2\2\u0200", + "\u0201\b\30\1\2\u0201\u0202\5*\26\2\u0202\u0208\3\2\2\2\u0203\u0204", + "\f\3\2\2\u0204\u0205\7]\2\2\u0205\u0207\5*\26\2\u0206\u0203\3\2\2\2", + "\u0207\u020a\3\2\2\2\u0208\u0206\3\2\2\2\u0208\u0209\3\2\2\2\u0209/", + "\3\2\2\2\u020a\u0208\3\2\2\2\u020b\u020c\5(\25\2\u020c\61\3\2\2\2\u020d", + "\u020f\5\64\33\2\u020e\u0210\5:\36\2\u020f\u020e\3\2\2\2\u020f\u0210", + "\3\2\2\2\u0210\u0211\3\2\2\2\u0211\u0212\7\\\2\2\u0212\u0215\3\2\2\2", + "\u0213\u0215\5\u008eH\2\u0214\u020d\3\2\2\2\u0214\u0213\3\2\2\2\u0215", + "\63\3\2\2\2\u0216\u0218\58\35\2\u0217\u0216\3\2\2\2\u0218\u0219\3\2", + "\2\2\u0219\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021a\65\3\2\2\2\u021b", + "\u021d\58\35\2\u021c\u021b\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u021c\3", + "\2\2\2\u021e\u021f\3\2\2\2\u021f\67\3\2\2\2\u0220\u0226\5> \2\u0221", + "\u0226\5@!\2\u0222\u0226\5\\/\2\u0223\u0226\5^\60\2\u0224\u0226\5`\61", + "\2\u0225\u0220\3\2\2\2\u0225\u0221\3\2\2\2\u0225\u0222\3\2\2\2\u0225", + "\u0223\3\2\2\2\u0225\u0224\3\2\2\2\u02269\3\2\2\2\u0227\u0228\b\36\1", + "\2\u0228\u0229\5<\37\2\u0229\u022f\3\2\2\2\u022a\u022b\f\3\2\2\u022b", + "\u022c\7]\2\2\u022c\u022e\5<\37\2\u022d\u022a\3\2\2\2\u022e\u0231\3", + "\2\2\2\u022f\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230;\3\2\2\2\u0231", + "\u022f\3\2\2\2\u0232\u0238\5b\62\2\u0233\u0234\5b\62\2\u0234\u0235\7", + "^\2\2\u0235\u0236\5\u0084C\2\u0236\u0238\3\2\2\2\u0237\u0232\3\2\2\2", + "\u0237\u0233\3\2\2\2\u0238=\3\2\2\2\u0239\u023a\t\4\2\2\u023a?\3\2\2", + "\2\u023b\u024a\t\5\2\2\u023c\u023d\7\3\2\2\u023d\u023e\7@\2\2\u023e", + "\u023f\t\6\2\2\u023f\u024a\7A\2\2\u0240\u024a\5Z.\2\u0241\u024a\5B\"", + "\2\u0242\u024a\5R*\2\u0243\u024a\5\u0082B\2\u0244\u0245\7\t\2\2\u0245", + "\u0246\7@\2\2\u0246\u0247\5\60\31\2\u0247\u0248\7A\2\2\u0248\u024a\3", + "\2\2\2\u0249\u023b\3\2\2\2\u0249\u023c\3\2\2\2\u0249\u0240\3\2\2\2\u0249", + "\u0241\3\2\2\2\u0249\u0242\3\2\2\2\u0249\u0243\3\2\2\2\u0249\u0244\3", + "\2\2\2\u024aA\3\2\2\2\u024b\u024d\5D#\2\u024c\u024e\7n\2\2\u024d\u024c", + "\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u024f\3\2\2\2\u024f\u0250\5F$\2\u0250", + "\u0255\3\2\2\2\u0251\u0252\5D#\2\u0252\u0253\7n\2\2\u0253\u0255\3\2", + "\2\2\u0254\u024b\3\2\2\2\u0254\u0251\3\2\2\2\u0255C\3\2\2\2\u0256\u0257", + "\t\7\2\2\u0257E\3\2\2\2\u0258\u0259\7D\2\2\u0259\u025a\5H%\2\u025a\u025b", + "\7E\2\2\u025bG\3\2\2\2\u025c\u025d\b%\1\2\u025d\u025e\5J&\2\u025e\u0263", + "\3\2\2\2\u025f\u0260\f\3\2\2\u0260\u0262\5J&\2\u0261\u025f\3\2\2\2\u0262", + "\u0265\3\2\2\2\u0263\u0261\3\2\2\2\u0263\u0264\3\2\2\2\u0264I\3\2\2", + "\2\u0265\u0263\3\2\2\2\u0266\u0268\5L\'\2\u0267\u0269\5N(\2\u0268\u0267", + "\3\2\2\2\u0268\u0269\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026b\7\\\2\2", + "\u026b\u026e\3\2\2\2\u026c\u026e\5\u008eH\2\u026d\u0266\3\2\2\2\u026d", + "\u026c\3\2\2\2\u026eK\3\2\2\2\u026f\u0271\5@!\2\u0270\u0272\5L\'\2\u0271", + "\u0270\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0278\3\2\2\2\u0273\u0275\5", + "\\/\2\u0274\u0276\5L\'\2\u0275\u0274\3\2\2\2\u0275\u0276\3\2\2\2\u0276", + "\u0278\3\2\2\2\u0277\u026f\3\2\2\2\u0277\u0273\3\2\2\2\u0278M\3\2\2", + "\2\u0279\u027a\b(\1\2\u027a\u027b\5P)\2\u027b\u0281\3\2\2\2\u027c\u027d", + "\f\3\2\2\u027d\u027e\7]\2\2\u027e\u0280\5P)\2\u027f\u027c\3\2\2\2\u0280", + "\u0283\3\2\2\2\u0281\u027f\3\2\2\2\u0281\u0282\3\2\2\2\u0282O\3\2\2", + "\2\u0283\u0281\3\2\2\2\u0284\u028b\5b\62\2\u0285\u0287\5b\62\2\u0286", + "\u0285\3\2\2\2\u0286\u0287\3\2\2\2\u0287\u0288\3\2\2\2\u0288\u0289\7", + "[\2\2\u0289\u028b\5\60\31\2\u028a\u0284\3\2\2\2\u028a\u0286\3\2\2\2", + "\u028bQ\3\2\2\2\u028c\u028e\7\36\2\2\u028d\u028f\7n\2\2\u028e\u028d", + "\3\2\2\2\u028e\u028f\3\2\2\2\u028f\u0290\3\2\2\2\u0290\u0291\7D\2\2", + "\u0291\u0292\5T+\2\u0292\u0293\7E\2\2\u0293\u02a0\3\2\2\2\u0294\u0296", + "\7\36\2\2\u0295\u0297\7n\2\2\u0296\u0295\3\2\2\2\u0296\u0297\3\2\2\2", + "\u0297\u0298\3\2\2\2\u0298\u0299\7D\2\2\u0299\u029a\5T+\2\u029a\u029b", + "\7]\2\2\u029b\u029c\7E\2\2\u029c\u02a0\3\2\2\2\u029d\u029e\7\36\2\2", + "\u029e\u02a0\7n\2\2\u029f\u028c\3\2\2\2\u029f\u0294\3\2\2\2\u029f\u029d", + "\3\2\2\2\u02a0S\3\2\2\2\u02a1\u02a2\b+\1\2\u02a2\u02a3\5V,\2\u02a3\u02a9", + "\3\2\2\2\u02a4\u02a5\f\3\2\2\u02a5\u02a6\7]\2\2\u02a6\u02a8\5V,\2\u02a7", + "\u02a4\3\2\2\2\u02a8\u02ab\3\2\2\2\u02a9\u02a7\3\2\2\2\u02a9\u02aa\3", + "\2\2\2\u02aaU\3\2\2\2\u02ab\u02a9\3\2\2\2\u02ac\u02b2\5X-\2\u02ad\u02ae", + "\5X-\2\u02ae\u02af\7^\2\2\u02af\u02b0\5\60\31\2\u02b0\u02b2\3\2\2\2", + "\u02b1\u02ac\3\2\2\2\u02b1\u02ad\3\2\2\2\u02b2W\3\2\2\2\u02b3\u02b4", + "\7n\2\2\u02b4Y\3\2\2\2\u02b5\u02b6\78\2\2\u02b6\u02b7\7@\2\2\u02b7\u02b8", + "\5|?\2\u02b8\u02b9\7A\2\2\u02b9[\3\2\2\2\u02ba\u02bb\t\b\2\2\u02bb]", + "\3\2\2\2\u02bc\u02c3\t\t\2\2\u02bd\u02c3\5h\65\2\u02be\u02bf\7\f\2\2", + "\u02bf\u02c0\7@\2\2\u02c0\u02c1\7n\2\2\u02c1\u02c3\7A\2\2\u02c2\u02bc", + "\3\2\2\2\u02c2\u02bd\3\2\2\2\u02c2\u02be\3\2\2\2\u02c3_\3\2\2\2\u02c4", + "\u02c5\7\66\2\2\u02c5\u02c6\7@\2\2\u02c6\u02c7\5|?\2\u02c7\u02c8\7A", + "\2\2\u02c8\u02cf\3\2\2\2\u02c9\u02ca\7\66\2\2\u02ca\u02cb\7@\2\2\u02cb", + "\u02cc\5\60\31\2\u02cc\u02cd\7A\2\2\u02cd\u02cf\3\2\2\2\u02ce\u02c4", + "\3\2\2\2\u02ce\u02c9\3\2\2\2\u02cfa\3\2\2\2\u02d0\u02d2\5p9\2\u02d1", + "\u02d0\3\2\2\2\u02d1\u02d2\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d7\5", + "d\63\2\u02d4\u02d6\5f\64\2\u02d5\u02d4\3\2\2\2\u02d6\u02d9\3\2\2\2\u02d7", + "\u02d5\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8c\3\2\2\2\u02d9\u02d7\3\2\2", + "\2\u02da\u02db\b\63\1\2\u02db\u02e1\7n\2\2\u02dc\u02dd\7@\2\2\u02dd", + "\u02de\5b\62\2\u02de\u02df\7A\2\2\u02df\u02e1\3\2\2\2\u02e0\u02da\3", + "\2\2\2\u02e0\u02dc\3\2\2\2\u02e1\u030f\3\2\2\2\u02e2\u02e3\f\b\2\2\u02e3", + "\u02e5\7B\2\2\u02e4\u02e6\5r:\2\u02e5\u02e4\3\2\2\2\u02e5\u02e6\3\2", + "\2\2\u02e6\u02e8\3\2\2\2\u02e7\u02e9\5*\26\2\u02e8\u02e7\3\2\2\2\u02e8", + "\u02e9\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea\u030e\7C\2\2\u02eb\u02ec\f", + "\7\2\2\u02ec\u02ed\7B\2\2\u02ed\u02ef\7-\2\2\u02ee\u02f0\5r:\2\u02ef", + "\u02ee\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f2\5", + "*\26\2\u02f2\u02f3\7C\2\2\u02f3\u030e\3\2\2\2\u02f4\u02f5\f\6\2\2\u02f5", + "\u02f6\7B\2\2\u02f6\u02f7\5r:\2\u02f7\u02f8\7-\2\2\u02f8\u02f9\5*\26", + "\2\u02f9\u02fa\7C\2\2\u02fa\u030e\3\2\2\2\u02fb\u02fc\f\5\2\2\u02fc", + "\u02fe\7B\2\2\u02fd\u02ff\5r:\2\u02fe\u02fd\3\2\2\2\u02fe\u02ff\3\2", + "\2\2\u02ff\u0300\3\2\2\2\u0300\u0301\7P\2\2\u0301\u030e\7C\2\2\u0302", + "\u0303\f\4\2\2\u0303\u0304\7@\2\2\u0304\u0305\5t;\2\u0305\u0306\7A\2", + "\2\u0306\u030e\3\2\2\2\u0307\u0308\f\3\2\2\u0308\u030a\7@\2\2\u0309", + "\u030b\5z>\2\u030a\u0309\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030c\3\2", + "\2\2\u030c\u030e\7A\2\2\u030d\u02e2\3\2\2\2\u030d\u02eb\3\2\2\2\u030d", + "\u02f4\3\2\2\2\u030d\u02fb\3\2\2\2\u030d\u0302\3\2\2\2\u030d\u0307\3", + "\2\2\2\u030e\u0311\3\2\2\2\u030f\u030d\3\2\2\2\u030f\u0310\3\2\2\2\u0310", + "e\3\2\2\2\u0311\u030f\3\2\2\2\u0312\u0313\7\r\2\2\u0313\u0315\7@\2\2", + "\u0314\u0316\7p\2\2\u0315\u0314\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0315", + "\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031c\7A\2\2", + "\u031a\u031c\5h\65\2\u031b\u0312\3\2\2\2\u031b\u031a\3\2\2\2\u031cg", + "\3\2\2\2\u031d\u031e\7\16\2\2\u031e\u031f\7@\2\2\u031f\u0320\7@\2\2", + "\u0320\u0321\5j\66\2\u0321\u0322\7A\2\2\u0322\u0323\7A\2\2\u0323i\3", + "\2\2\2\u0324\u0329\5l\67\2\u0325\u0326\7]\2\2\u0326\u0328\5l\67\2\u0327", + "\u0325\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u0327\3\2\2\2\u0329\u032a\3", + "\2\2\2\u032a\u032e\3\2\2\2\u032b\u0329\3\2\2\2\u032c\u032e\3\2\2\2\u032d", + "\u0324\3\2\2\2\u032d\u032c\3\2\2\2\u032ek\3\2\2\2\u032f\u0335\n\n\2", + "\2\u0330\u0332\7@\2\2\u0331\u0333\5\f\7\2\u0332\u0331\3\2\2\2\u0332", + "\u0333\3\2\2\2\u0333\u0334\3\2\2\2\u0334\u0336\7A\2\2\u0335\u0330\3", + "\2\2\2\u0335\u0336\3\2\2\2\u0336\u0339\3\2\2\2\u0337\u0339\3\2\2\2\u0338", + "\u032f\3\2\2\2\u0338\u0337\3\2\2\2\u0339m\3\2\2\2\u033a\u0340\n\13\2", + "\2\u033b\u033c\7@\2\2\u033c\u033d\5n8\2\u033d\u033e\7A\2\2\u033e\u0340", + "\3\2\2\2\u033f\u033a\3\2\2\2\u033f\u033b\3\2\2\2\u0340\u0343\3\2\2\2", + "\u0341\u033f\3\2\2\2\u0341\u0342\3\2\2\2\u0342o\3\2\2\2\u0343\u0341", + "\3\2\2\2\u0344\u0346\7P\2\2\u0345\u0347\5r:\2\u0346\u0345\3\2\2\2\u0346", + "\u0347\3\2\2\2\u0347\u0357\3\2\2\2\u0348\u034a\7P\2\2\u0349\u034b\5", + "r:\2\u034a\u0349\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034c\3\2\2\2\u034c", + "\u0357\5p9\2\u034d\u034f\7W\2\2\u034e\u0350\5r:\2\u034f\u034e\3\2\2", + "\2\u034f\u0350\3\2\2\2\u0350\u0357\3\2\2\2\u0351\u0353\7W\2\2\u0352", + "\u0354\5r:\2\u0353\u0352\3\2\2\2\u0353\u0354\3\2\2\2\u0354\u0355\3\2", + "\2\2\u0355\u0357\5p9\2\u0356\u0344\3\2\2\2\u0356\u0348\3\2\2\2\u0356", + "\u034d\3\2\2\2\u0356\u0351\3\2\2\2\u0357q\3\2\2\2\u0358\u0359\b:\1\2", + "\u0359\u035a\5\\/\2\u035a\u035f\3\2\2\2\u035b\u035c\f\3\2\2\u035c\u035e", + "\5\\/\2\u035d\u035b\3\2\2\2\u035e\u0361\3\2\2\2\u035f\u035d\3\2\2\2", + "\u035f\u0360\3\2\2\2\u0360s\3\2\2\2\u0361\u035f\3\2\2\2\u0362\u0368", + "\5v<\2\u0363\u0364\5v<\2\u0364\u0365\7]\2\2\u0365\u0366\7m\2\2\u0366", + "\u0368\3\2\2\2\u0367\u0362\3\2\2\2\u0367\u0363\3\2\2\2\u0368u\3\2\2", + "\2\u0369\u036a\b<\1\2\u036a\u036b\5x=\2\u036b\u0371\3\2\2\2\u036c\u036d", + "\f\3\2\2\u036d\u036e\7]\2\2\u036e\u0370\5x=\2\u036f\u036c\3\2\2\2\u0370", + "\u0373\3\2\2\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372w\3\2\2", + "\2\u0373\u0371\3\2\2\2\u0374\u0375\5\64\33\2\u0375\u0376\5b\62\2\u0376", + "\u037c\3\2\2\2\u0377\u0379\5\66\34\2\u0378\u037a\5~@\2\u0379\u0378\3", + "\2\2\2\u0379\u037a\3\2\2\2\u037a\u037c\3\2\2\2\u037b\u0374\3\2\2\2\u037b", + "\u0377\3\2\2\2\u037cy\3\2\2\2\u037d\u037e\b>\1\2\u037e\u037f\7n\2\2", + "\u037f\u0385\3\2\2\2\u0380\u0381\f\3\2\2\u0381\u0382\7]\2\2\u0382\u0384", + "\7n\2\2\u0383\u0380\3\2\2\2\u0384\u0387\3\2\2\2\u0385\u0383\3\2\2\2", + "\u0385\u0386\3\2\2\2\u0386{\3\2\2\2\u0387\u0385\3\2\2\2\u0388\u038a", + "\5L\'\2\u0389\u038b\5~@\2\u038a\u0389\3\2\2\2\u038a\u038b\3\2\2\2\u038b", + "}\3\2\2\2\u038c\u0398\5p9\2\u038d\u038f\5p9\2\u038e\u038d\3\2\2\2\u038e", + "\u038f\3\2\2\2\u038f\u0390\3\2\2\2\u0390\u0394\5\u0080A\2\u0391\u0393", + "\5f\64\2\u0392\u0391\3\2\2\2\u0393\u0396\3\2\2\2\u0394\u0392\3\2\2\2", + "\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396\u0394\3\2\2\2\u0397\u038c", + "\3\2\2\2\u0397\u038e\3\2\2\2\u0398\177\3\2\2\2\u0399\u039a\bA\1\2\u039a", + "\u039b\7@\2\2\u039b\u039c\5~@\2\u039c\u03a0\7A\2\2\u039d\u039f\5f\64", + "\2\u039e\u039d\3\2\2\2\u039f\u03a2\3\2\2\2\u03a0\u039e\3\2\2\2\u03a0", + "\u03a1\3\2\2\2\u03a1\u03c8\3\2\2\2\u03a2\u03a0\3\2\2\2\u03a3\u03a5\7", + "B\2\2\u03a4\u03a6\5r:\2\u03a5\u03a4\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6", + "\u03a8\3\2\2\2\u03a7\u03a9\5*\26\2\u03a8\u03a7\3\2\2\2\u03a8\u03a9\3", + "\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u03c8\7C\2\2\u03ab\u03ac\7B\2\2\u03ac", + "\u03ae\7-\2\2\u03ad\u03af\5r:\2\u03ae\u03ad\3\2\2\2\u03ae\u03af\3\2", + "\2\2\u03af\u03b0\3\2\2\2\u03b0\u03b1\5*\26\2\u03b1\u03b2\7C\2\2\u03b2", + "\u03c8\3\2\2\2\u03b3\u03b4\7B\2\2\u03b4\u03b5\5r:\2\u03b5\u03b6\7-\2", + "\2\u03b6\u03b7\5*\26\2\u03b7\u03b8\7C\2\2\u03b8\u03c8\3\2\2\2\u03b9", + "\u03ba\7B\2\2\u03ba\u03bb\7P\2\2\u03bb\u03c8\7C\2\2\u03bc\u03be\7@\2", + "\2\u03bd\u03bf\5t;\2\u03be\u03bd\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c0", + "\3\2\2\2\u03c0\u03c4\7A\2\2\u03c1\u03c3\5f\64\2\u03c2\u03c1\3\2\2\2", + "\u03c3\u03c6\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03c8", + "\3\2\2\2\u03c6\u03c4\3\2\2\2\u03c7\u0399\3\2\2\2\u03c7\u03a3\3\2\2\2", + "\u03c7\u03ab\3\2\2\2\u03c7\u03b3\3\2\2\2\u03c7\u03b9\3\2\2\2\u03c7\u03bc", + "\3\2\2\2\u03c8\u03f4\3\2\2\2\u03c9\u03ca\f\7\2\2\u03ca\u03cc\7B\2\2", + "\u03cb\u03cd\5r:\2\u03cc\u03cb\3\2\2\2\u03cc\u03cd\3\2\2\2\u03cd\u03cf", + "\3\2\2\2\u03ce\u03d0\5*\26\2\u03cf\u03ce\3\2\2\2\u03cf\u03d0\3\2\2\2", + "\u03d0\u03d1\3\2\2\2\u03d1\u03f3\7C\2\2\u03d2\u03d3\f\6\2\2\u03d3\u03d4", + "\7B\2\2\u03d4\u03d6\7-\2\2\u03d5\u03d7\5r:\2\u03d6\u03d5\3\2\2\2\u03d6", + "\u03d7\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03d9\5*\26\2\u03d9\u03da\7", + "C\2\2\u03da\u03f3\3\2\2\2\u03db\u03dc\f\5\2\2\u03dc\u03dd\7B\2\2\u03dd", + "\u03de\5r:\2\u03de\u03df\7-\2\2\u03df\u03e0\5*\26\2\u03e0\u03e1\7C\2", + "\2\u03e1\u03f3\3\2\2\2\u03e2\u03e3\f\4\2\2\u03e3\u03e4\7B\2\2\u03e4", + "\u03e5\7P\2\2\u03e5\u03f3\7C\2\2\u03e6\u03e7\f\3\2\2\u03e7\u03e9\7@", + "\2\2\u03e8\u03ea\5t;\2\u03e9\u03e8\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea", + "\u03eb\3\2\2\2\u03eb\u03ef\7A\2\2\u03ec\u03ee\5f\64\2\u03ed\u03ec\3", + "\2\2\2\u03ee\u03f1\3\2\2\2\u03ef\u03ed\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0", + "\u03f3\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f2\u03c9\3\2\2\2\u03f2\u03d2\3", + "\2\2\2\u03f2\u03db\3\2\2\2\u03f2\u03e2\3\2\2\2\u03f2\u03e6\3\2\2\2\u03f3", + "\u03f6\3\2\2\2\u03f4\u03f2\3\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u0081\3", + "\2\2\2\u03f6\u03f4\3\2\2\2\u03f7\u03f8\7n\2\2\u03f8\u0083\3\2\2\2\u03f9", + "\u0404\5*\26\2\u03fa\u03fb\7D\2\2\u03fb\u03fc\5\u0086D\2\u03fc\u03fd", + "\7E\2\2\u03fd\u0404\3\2\2\2\u03fe\u03ff\7D\2\2\u03ff\u0400\5\u0086D", + "\2\u0400\u0401\7]\2\2\u0401\u0402\7E\2\2\u0402\u0404\3\2\2\2\u0403\u03f9", + "\3\2\2\2\u0403\u03fa\3\2\2\2\u0403\u03fe\3\2\2\2\u0404\u0085\3\2\2\2", + "\u0405\u0407\bD\1\2\u0406\u0408\5\u0088E\2\u0407\u0406\3\2\2\2\u0407", + "\u0408\3\2\2\2\u0408\u0409\3\2\2\2\u0409\u040a\5\u0084C\2\u040a\u0413", + "\3\2\2\2\u040b\u040c\f\3\2\2\u040c\u040e\7]\2\2\u040d\u040f\5\u0088", + "E\2\u040e\u040d\3\2\2\2\u040e\u040f\3\2\2\2\u040f\u0410\3\2\2\2\u0410", + "\u0412\5\u0084C\2\u0411\u040b\3\2\2\2\u0412\u0415\3\2\2\2\u0413\u0411", + "\3\2\2\2\u0413\u0414\3\2\2\2\u0414\u0087\3\2\2\2\u0415\u0413\3\2\2\2", + "\u0416\u0417\5\u008aF\2\u0417\u0418\7^\2\2\u0418\u0089\3\2\2\2\u0419", + "\u041a\bF\1\2\u041a\u041b\5\u008cG\2\u041b\u0420\3\2\2\2\u041c\u041d", + "\f\3\2\2\u041d\u041f\5\u008cG\2\u041e\u041c\3\2\2\2\u041f\u0422\3\2", + "\2\2\u0420\u041e\3\2\2\2\u0420\u0421\3\2\2\2\u0421\u008b\3\2\2\2\u0422", + "\u0420\3\2\2\2\u0423\u0424\7B\2\2\u0424\u0425\5\60\31\2\u0425\u0426", + "\7C\2\2\u0426\u042a\3\2\2\2\u0427\u0428\7l\2\2\u0428\u042a\7n\2\2\u0429", + "\u0423\3\2\2\2\u0429\u0427\3\2\2\2\u042a\u008d\3\2\2\2\u042b\u042c\7", + ">\2\2\u042c\u042d\7@\2\2\u042d\u042e\5\60\31\2\u042e\u0430\7]\2\2\u042f", + "\u0431\7p\2\2\u0430\u042f\3\2\2\2\u0431\u0432\3\2\2\2\u0432\u0430\3", + "\2\2\2\u0432\u0433\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0435\7A\2\2\u0435", + "\u0436\7\\\2\2\u0436\u008f\3\2\2\2\u0437\u045d\5\u0092J\2\u0438\u045d", + "\5\u0094K\2\u0439\u045d\5\u009aN\2\u043a\u045d\5\u009cO\2\u043b\u045d", + "\5\u009eP\2\u043c\u045d\5\u00a0Q\2\u043d\u043e\t\f\2\2\u043e\u043f\t", + "\r\2\2\u043f\u0448\7@\2\2\u0440\u0445\5&\24\2\u0441\u0442\7]\2\2\u0442", + "\u0444\5&\24\2\u0443\u0441\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3", + "\2\2\2\u0445\u0446\3\2\2\2\u0446\u0449\3\2\2\2\u0447\u0445\3\2\2\2\u0448", + "\u0440\3\2\2\2\u0448\u0449\3\2\2\2\u0449\u0457\3\2\2\2\u044a\u0453\7", + "[\2\2\u044b\u0450\5&\24\2\u044c\u044d\7]\2\2\u044d\u044f\5&\24\2\u044e", + "\u044c\3\2\2\2\u044f\u0452\3\2\2\2\u0450\u044e\3\2\2\2\u0450\u0451\3", + "\2\2\2\u0451\u0454\3\2\2\2\u0452\u0450\3\2\2\2\u0453\u044b\3\2\2\2\u0453", + "\u0454\3\2\2\2\u0454\u0456\3\2\2\2\u0455\u044a\3\2\2\2\u0456\u0459\3", + "\2\2\2\u0457\u0455\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u045a\3\2\2\2\u0459", + "\u0457\3\2\2\2\u045a\u045b\7A\2\2\u045b\u045d\7\\\2\2\u045c\u0437\3", + "\2\2\2\u045c\u0438\3\2\2\2\u045c\u0439\3\2\2\2\u045c\u043a\3\2\2\2\u045c", + "\u043b\3\2\2\2\u045c\u043c\3\2\2\2\u045c\u043d\3\2\2\2\u045d\u0091\3", + "\2\2\2\u045e\u045f\7n\2\2\u045f\u0460\7[\2\2\u0460\u046a\5\u0090I\2", + "\u0461\u0462\7\26\2\2\u0462\u0463\5\60\31\2\u0463\u0464\7[\2\2\u0464", + "\u0465\5\u0090I\2\u0465\u046a\3\2\2\2\u0466\u0467\7\32\2\2\u0467\u0468", + "\7[\2\2\u0468\u046a\5\u0090I\2\u0469\u045e\3\2\2\2\u0469\u0461\3\2\2", + "\2\u0469\u0466\3\2\2\2\u046a\u0093\3\2\2\2\u046b\u046d\7D\2\2\u046c", + "\u046e\5\u0096L\2\u046d\u046c\3\2\2\2\u046d\u046e\3\2\2\2\u046e\u046f", + "\3\2\2\2\u046f\u0470\7E\2\2\u0470\u0095\3\2\2\2\u0471\u0472\bL\1\2\u0472", + "\u0473\5\u0098M\2\u0473\u0478\3\2\2\2\u0474\u0475\f\3\2\2\u0475\u0477", + "\5\u0098M\2\u0476\u0474\3\2\2\2\u0477\u047a\3\2\2\2\u0478\u0476\3\2", + "\2\2\u0478\u0479\3\2\2\2\u0479\u0097\3\2\2\2\u047a\u0478\3\2\2\2\u047b", + "\u047e\5\62\32\2\u047c\u047e\5\u0090I\2\u047d\u047b\3\2\2\2\u047d\u047c", + "\3\2\2\2\u047e\u0099\3\2\2\2\u047f\u0481\5.\30\2\u0480\u047f\3\2\2\2", + "\u0480\u0481\3\2\2\2\u0481\u0482\3\2\2\2\u0482\u0483\7\\\2\2\u0483\u009b", + "\3\2\2\2\u0484\u0485\7#\2\2\u0485\u0486\7@\2\2\u0486\u0487\5.\30\2\u0487", + "\u0488\7A\2\2\u0488\u048b\5\u0090I\2\u0489\u048a\7\35\2\2\u048a\u048c", + "\5\u0090I\2\u048b\u0489\3\2\2\2\u048b\u048c\3\2\2\2\u048c\u0494\3\2", + "\2\2\u048d\u048e\7/\2\2\u048e\u048f\7@\2\2\u048f\u0490\5.\30\2\u0490", + "\u0491\7A\2\2\u0491\u0492\5\u0090I\2\u0492\u0494\3\2\2\2\u0493\u0484", + "\3\2\2\2\u0493\u048d\3\2\2\2\u0494\u009d\3\2\2\2\u0495\u0496\7\65\2", + "\2\u0496\u0497\7@\2\2\u0497\u0498\5.\30\2\u0498\u0499\7A\2\2\u0499\u049a", + "\5\u0090I\2\u049a\u04c0\3\2\2\2\u049b\u049c\7\33\2\2\u049c\u049d\5\u0090", + "I\2\u049d\u049e\7\65\2\2\u049e\u049f\7@\2\2\u049f\u04a0\5.\30\2\u04a0", + "\u04a1\7A\2\2\u04a1\u04a2\7\\\2\2\u04a2\u04c0\3\2\2\2\u04a3\u04a4\7", + "!\2\2\u04a4\u04a6\7@\2\2\u04a5\u04a7\5.\30\2\u04a6\u04a5\3\2\2\2\u04a6", + "\u04a7\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8\u04aa\7\\\2\2\u04a9\u04ab\5", + ".\30\2\u04aa\u04a9\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ac\3\2\2\2\u04ac", + "\u04ae\7\\\2\2\u04ad\u04af\5.\30\2\u04ae\u04ad\3\2\2\2\u04ae\u04af\3", + "\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04b1\7A\2\2\u04b1\u04c0\5\u0090I\2", + "\u04b2\u04b3\7!\2\2\u04b3\u04b4\7@\2\2\u04b4\u04b6\5\62\32\2\u04b5\u04b7", + "\5.\30\2\u04b6\u04b5\3\2\2\2\u04b6\u04b7\3\2\2\2\u04b7\u04b8\3\2\2\2", + "\u04b8\u04ba\7\\\2\2\u04b9\u04bb\5.\30\2\u04ba\u04b9\3\2\2\2\u04ba\u04bb", + "\3\2\2\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd\7A\2\2\u04bd\u04be\5\u0090", + "I\2\u04be\u04c0\3\2\2\2\u04bf\u0495\3\2\2\2\u04bf\u049b\3\2\2\2\u04bf", + "\u04a3\3\2\2\2\u04bf\u04b2\3\2\2\2\u04c0\u009f\3\2\2\2\u04c1\u04c2\7", + "\"\2\2\u04c2\u04c3\7n\2\2\u04c3\u04d2\7\\\2\2\u04c4\u04c5\7\31\2\2\u04c5", + "\u04d2\7\\\2\2\u04c6\u04c7\7\25\2\2\u04c7\u04d2\7\\\2\2\u04c8\u04ca", + "\7)\2\2\u04c9\u04cb\5.\30\2\u04ca\u04c9\3\2\2\2\u04ca\u04cb\3\2\2\2", + "\u04cb\u04cc\3\2\2\2\u04cc\u04d2\7\\\2\2\u04cd\u04ce\7\"\2\2\u04ce\u04cf", + "\5\16\b\2\u04cf\u04d0\7\\\2\2\u04d0\u04d2\3\2\2\2\u04d1\u04c1\3\2\2", + "\2\u04d1\u04c4\3\2\2\2\u04d1\u04c6\3\2\2\2\u04d1\u04c8\3\2\2\2\u04d1", + "\u04cd\3\2\2\2\u04d2\u00a1\3\2\2\2\u04d3\u04d5\5\u00a4S\2\u04d4\u04d3", + "\3\2\2\2\u04d4\u04d5\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d7\7\2\2\3", + "\u04d7\u00a3\3\2\2\2\u04d8\u04d9\bS\1\2\u04d9\u04da\5\u00b4[\2\u04da", + "\u04df\3\2\2\2\u04db\u04dc\f\3\2\2\u04dc\u04de\5\u00b4[\2\u04dd\u04db", + "\3\2\2\2\u04de\u04e1\3\2\2\2\u04df\u04dd\3\2\2\2\u04df\u04e0\3\2\2\2", + "\u04e0\u00a5\3\2\2\2\u04e1\u04df\3\2\2\2\u04e2\u04e3\7\21\2\2\u04e3", + "\u04e4\7\22\2\2\u04e4\u04e9\7p\2\2\u04e5\u04e6\7\21\2\2\u04e6\u04e7", + "\7\22\2\2\u04e7\u04e9\7q\2\2\u04e8\u04e2\3\2\2\2\u04e8\u04e5\3\2\2\2", + "\u04e9\u00a7\3\2\2\2\u04ea\u04ee\5\u00aeX\2\u04eb\u04ee\5\u00acW\2\u04ec", + "\u04ee\5\u00aaV\2\u04ed\u04ea\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ed\u04ec", + "\3\2\2\2\u04ee\u00a9\3\2\2\2\u04ef\u04f0\7\21\2\2\u04f0\u04f1\7\23\2", + "\2\u04f1\u04f2\7n\2\2\u04f2\u00ab\3\2\2\2\u04f3\u04f4\7\21\2\2\u04f4", + "\u04f5\7\23\2\2\u04f5\u04f6\7n\2\2\u04f6\u04f7\5\u00b0Y\2\u04f7\u00ad", + "\3\2\2\2\u04f8\u04f9\7\21\2\2\u04f9\u04fa\7\23\2\2\u04fa\u04fb\7n\2", + "\2\u04fb\u04fc\7@\2\2\u04fc\u04fd\5\u00b2Z\2\u04fd\u04fe\7A\2\2\u04fe", + "\u04ff\5\u00b0Y\2\u04ff\u00af\3\2\2\2\u0500\u0501\5.\30\2\u0501\u00b1", + "\3\2\2\2\u0502\u0503\bZ\1\2\u0503\u0504\7n\2\2\u0504\u050a\3\2\2\2\u0505", + "\u0506\f\3\2\2\u0506\u0507\7]\2\2\u0507\u0509\7n\2\2\u0508\u0505\3\2", + "\2\2\u0509\u050c\3\2\2\2\u050a\u0508\3\2\2\2\u050a\u050b\3\2\2\2\u050b", + "\u00b3\3\2\2\2\u050c\u050a\3\2\2\2\u050d\u0513\5\u00b6\\\2\u050e\u0513", + "\5\62\32\2\u050f\u0513\5\u00a6T\2\u0510\u0513\5\u00a8U\2\u0511\u0513", + "\7\\\2\2\u0512\u050d\3\2\2\2\u0512\u050e\3\2\2\2\u0512\u050f\3\2\2\2", + "\u0512\u0510\3\2\2\2\u0512\u0511\3\2\2\2\u0513\u00b5\3\2\2\2\u0514\u0516", + "\5\64\33\2\u0515\u0514\3\2\2\2\u0515\u0516\3\2\2\2\u0516\u0517\3\2\2", + "\2\u0517\u0519\5b\62\2\u0518\u051a\5\u00b8]\2\u0519\u0518\3\2\2\2\u0519", + "\u051a\3\2\2\2\u051a\u051b\3\2\2\2\u051b\u051c\5\u0094K\2\u051c\u00b7", + "\3\2\2\2\u051d\u051e\b]\1\2\u051e\u051f\5\62\32\2\u051f\u0524\3\2\2", + "\2\u0520\u0521\f\3\2\2\u0521\u0523\5\62\32\2\u0522\u0520\3\2\2\2\u0523", + "\u0526\3\2\2\2\u0524\u0522\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u00b9\3", + "\2\2\2\u0526\u0524\3\2\2\2\u008f\u00bf\u00c7\u00db\u00ec\u00f6\u011a", + "\u0124\u0131\u0133\u013e\u0157\u0167\u0175\u0177\u0183\u0185\u0191\u0193", + "\u01a5\u01a7\u01b3\u01b5\u01c0\u01cb\u01d6\u01e1\u01ec\u01f5\u01fc\u0208", + "\u020f\u0214\u0219\u021e\u0225\u022f\u0237\u0249\u024d\u0254\u0263\u0268", + "\u026d\u0271\u0275\u0277\u0281\u0286\u028a\u028e\u0296\u029f\u02a9\u02b1", + "\u02c2\u02ce\u02d1\u02d7\u02e0\u02e5\u02e8\u02ef\u02fe\u030a\u030d\u030f", + "\u0317\u031b\u0329\u032d\u0332\u0335\u0338\u033f\u0341\u0346\u034a\u034f", + "\u0353\u0356\u035f\u0367\u0371\u0379\u037b\u0385\u038a\u038e\u0394\u0397", + "\u03a0\u03a5\u03a8\u03ae\u03be\u03c4\u03c7\u03cc\u03cf\u03d6\u03e9\u03ef", + "\u03f2\u03f4\u0403\u0407\u040e\u0413\u0420\u0429\u0432\u0445\u0448\u0450", + "\u0453\u0457\u045c\u0469\u046d\u0478\u047d\u0480\u048b\u0493\u04a6\u04aa", + "\u04ae\u04b6\u04ba\u04bf\u04ca\u04d1\u04d4\u04df\u04e8\u04ed\u050a\u0512", + "\u0515\u0519\u0524"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -509,37 +531,38 @@ var sharedContextCache = new antlr4.PredictionContextCache(); var literalNames = [ 'null', "'__extension__'", "'__builtin_va_arg'", "'__builtin_offsetof'", "'__m128'", "'__m128d'", "'__m128i'", "'__typeof__'", "'__inline__'", "'__stdcall'", "'__declspec'", "'__asm'", - "'__attribute__'", "'__asm__'", "'__volatile__'", "'auto'", - "'break'", "'case'", "'char'", "'const'", "'continue'", - "'default'", "'do'", "'double'", "'else'", "'enum'", - "'extern'", "'float'", "'for'", "'goto'", "'if'", "'inline'", - "'int'", "'long'", "'register'", "'restrict'", "'return'", - "'short'", "'signed'", "'sizeof'", "'static'", "'struct'", - "'switch'", "'typedef'", "'union'", "'unsigned'", "'void'", - "'volatile'", "'while'", "'_Alignas'", "'_Alignof'", - "'_Atomic'", "'_Bool'", "'_Complex'", "'_Generic'", - "'_Imaginary'", "'_Noreturn'", "'_Static_assert'", - "'_Thread_local'", "'('", "')'", "'['", "']'", "'{'", - "'}'", "'<'", "'<='", "'>'", "'>='", "'<<'", "'>>'", - "'+'", "'++'", "'-'", "'--'", "'*'", "'/'", "'%'", - "'&'", "'|'", "'&&'", "'||'", "'^'", "'!'", "'~'", - "'?'", "':'", "';'", "','", "'='", "'*='", "'/='", - "'%='", "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", - "'|='", "'=='", "'!='", "'->'", "'.'", "'...'" ]; + "'__attribute__'", "'__asm__'", "'__volatile__'", "'#'", + "'include'", "'define'", "'auto'", "'break'", "'case'", + "'char'", "'const'", "'continue'", "'default'", "'do'", + "'double'", "'else'", "'enum'", "'extern'", "'float'", + "'for'", "'goto'", "'if'", "'inline'", "'int'", "'long'", + "'register'", "'restrict'", "'return'", "'short'", + "'signed'", "'sizeof'", "'static'", "'struct'", "'switch'", + "'typedef'", "'union'", "'unsigned'", "'void'", "'volatile'", + "'while'", "'_Alignas'", "'_Alignof'", "'_Atomic'", + "'_Bool'", "'_Complex'", "'_Generic'", "'_Imaginary'", + "'_Noreturn'", "'_Static_assert'", "'_Thread_local'", + "'('", "')'", "'['", "']'", "'{'", "'}'", "'<'", "'<='", + "'>'", "'>='", "'<<'", "'>>'", "'+'", "'++'", "'-'", + "'--'", "'*'", "'/'", "'%'", "'&'", "'|'", "'&&'", + "'||'", "'^'", "'!'", "'~'", "'?'", "':'", "';'", "','", + "'='", "'*='", "'/='", "'%='", "'+='", "'-='", "'<<='", + "'>>='", "'&='", "'^='", "'|='", "'=='", "'!='", "'->'", + "'.'", "'...'" ]; var symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', - 'null', "Auto", "Break", "Case", "Char", "Const", - "Continue", "Default", "Do", "Double", "Else", "Enum", - "Extern", "Float", "For", "Goto", "If", "Inline", - "Int", "Long", "Register", "Restrict", "Return", "Short", - "Signed", "Sizeof", "Static", "Struct", "Switch", - "Typedef", "Union", "Unsigned", "Void", "Volatile", - "While", "Alignas", "Alignof", "Atomic", "Bool", "Complex", - "Generic", "Imaginary", "Noreturn", "StaticAssert", - "ThreadLocal", "LeftParen", "RightParen", "LeftBracket", - "RightBracket", "LeftBrace", "RightBrace", "Less", - "LessEqual", "Greater", "GreaterEqual", "LeftShift", + 'null', 'null', 'null', 'null', "Auto", "Break", "Case", + "Char", "Const", "Continue", "Default", "Do", "Double", + "Else", "Enum", "Extern", "Float", "For", "Goto", + "If", "Inline", "Int", "Long", "Register", "Restrict", + "Return", "Short", "Signed", "Sizeof", "Static", "Struct", + "Switch", "Typedef", "Union", "Unsigned", "Void", + "Volatile", "While", "Alignas", "Alignof", "Atomic", + "Bool", "Complex", "Generic", "Imaginary", "Noreturn", + "StaticAssert", "ThreadLocal", "LeftParen", "RightParen", + "LeftBracket", "RightBracket", "LeftBrace", "RightBrace", + "Less", "LessEqual", "Greater", "GreaterEqual", "LeftShift", "RightShift", "Plus", "PlusPlus", "Minus", "MinusMinus", "Star", "Div", "Mod", "And", "Or", "AndAnd", "OrOr", "Caret", "Not", "Tilde", "Question", "Colon", "Semi", @@ -547,8 +570,9 @@ var symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', 'null', "PlusAssign", "MinusAssign", "LeftShiftAssign", "RightShiftAssign", "AndAssign", "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", "Constant", - "StringLiteral", "LineDirective", "PragmaDirective", - "Whitespace", "Newline", "BlockComment", "LineComment" ]; + "StringLiteral", "SharedIncludeLiteral", "LineDirective", + "PragmaDirective", "Whitespace", "Newline", "BlockComment", + "LineComment" ]; var ruleNames = [ "primaryExpression", "genericSelection", "genericAssocList", "genericAssociation", "postfixExpression", "argumentExpressionList", @@ -561,23 +585,25 @@ var ruleNames = [ "primaryExpression", "genericSelection", "genericAssocList", "declaration", "declarationSpecifiers", "declarationSpecifiers2", "declarationSpecifier", "initDeclaratorList", "initDeclarator", "storageClassSpecifier", "typeSpecifier", "structOrUnionSpecifier", - "structOrUnion", "structDeclarationList", "structDeclaration", - "specifierQualifierList", "structDeclaratorList", "structDeclarator", - "enumSpecifier", "enumeratorList", "enumerator", "enumerationConstant", - "atomicTypeSpecifier", "typeQualifier", "functionSpecifier", - "alignmentSpecifier", "declarator", "directDeclarator", - "gccDeclaratorExtension", "gccAttributeSpecifier", "gccAttributeList", - "gccAttribute", "nestedParenthesesBlock", "pointer", - "typeQualifierList", "parameterTypeList", "parameterList", - "parameterDeclaration", "identifierList", "typeName", - "abstractDeclarator", "directAbstractDeclarator", "typedefName", - "initializer", "initializerList", "designation", "designatorList", - "designator", "staticAssertDeclaration", "statement", - "labeledStatement", "compoundStatement", "blockItemList", - "blockItem", "expressionStatement", "selectionStatement", - "iterationStatement", "jumpStatement", "compilationUnit", - "translationUnit", "externalDeclaration", "functionDefinition", - "declarationList" ]; + "structOrUnion", "structDeclarationsBlock", "structDeclarationList", + "structDeclaration", "specifierQualifierList", "structDeclaratorList", + "structDeclarator", "enumSpecifier", "enumeratorList", + "enumerator", "enumerationConstant", "atomicTypeSpecifier", + "typeQualifier", "functionSpecifier", "alignmentSpecifier", + "declarator", "directDeclarator", "gccDeclaratorExtension", + "gccAttributeSpecifier", "gccAttributeList", "gccAttribute", + "nestedParenthesesBlock", "pointer", "typeQualifierList", + "parameterTypeList", "parameterList", "parameterDeclaration", + "identifierList", "typeName", "abstractDeclarator", "directAbstractDeclarator", + "typedefName", "initializer", "initializerList", "designation", + "designatorList", "designator", "staticAssertDeclaration", + "statement", "labeledStatement", "compoundStatement", + "blockItemList", "blockItem", "expressionStatement", + "selectionStatement", "iterationStatement", "jumpStatement", + "compilationUnit", "translationUnit", "includeDirective", + "defineDirective", "defineDirectiveNoVal", "defineDirectiveNoParams", + "defineDirectiveWithParams", "macroResult", "macroParamList", + "externalDeclaration", "functionDefinition", "declarationList" ]; function CParser (input) { antlr4.Parser.call(this, input); @@ -612,105 +638,109 @@ CParser.T__10 = 11; CParser.T__11 = 12; CParser.T__12 = 13; CParser.T__13 = 14; -CParser.Auto = 15; -CParser.Break = 16; -CParser.Case = 17; -CParser.Char = 18; -CParser.Const = 19; -CParser.Continue = 20; -CParser.Default = 21; -CParser.Do = 22; -CParser.Double = 23; -CParser.Else = 24; -CParser.Enum = 25; -CParser.Extern = 26; -CParser.Float = 27; -CParser.For = 28; -CParser.Goto = 29; -CParser.If = 30; -CParser.Inline = 31; -CParser.Int = 32; -CParser.Long = 33; -CParser.Register = 34; -CParser.Restrict = 35; -CParser.Return = 36; -CParser.Short = 37; -CParser.Signed = 38; -CParser.Sizeof = 39; -CParser.Static = 40; -CParser.Struct = 41; -CParser.Switch = 42; -CParser.Typedef = 43; -CParser.Union = 44; -CParser.Unsigned = 45; -CParser.Void = 46; -CParser.Volatile = 47; -CParser.While = 48; -CParser.Alignas = 49; -CParser.Alignof = 50; -CParser.Atomic = 51; -CParser.Bool = 52; -CParser.Complex = 53; -CParser.Generic = 54; -CParser.Imaginary = 55; -CParser.Noreturn = 56; -CParser.StaticAssert = 57; -CParser.ThreadLocal = 58; -CParser.LeftParen = 59; -CParser.RightParen = 60; -CParser.LeftBracket = 61; -CParser.RightBracket = 62; -CParser.LeftBrace = 63; -CParser.RightBrace = 64; -CParser.Less = 65; -CParser.LessEqual = 66; -CParser.Greater = 67; -CParser.GreaterEqual = 68; -CParser.LeftShift = 69; -CParser.RightShift = 70; -CParser.Plus = 71; -CParser.PlusPlus = 72; -CParser.Minus = 73; -CParser.MinusMinus = 74; -CParser.Star = 75; -CParser.Div = 76; -CParser.Mod = 77; -CParser.And = 78; -CParser.Or = 79; -CParser.AndAnd = 80; -CParser.OrOr = 81; -CParser.Caret = 82; -CParser.Not = 83; -CParser.Tilde = 84; -CParser.Question = 85; -CParser.Colon = 86; -CParser.Semi = 87; -CParser.Comma = 88; -CParser.Assign = 89; -CParser.StarAssign = 90; -CParser.DivAssign = 91; -CParser.ModAssign = 92; -CParser.PlusAssign = 93; -CParser.MinusAssign = 94; -CParser.LeftShiftAssign = 95; -CParser.RightShiftAssign = 96; -CParser.AndAssign = 97; -CParser.XorAssign = 98; -CParser.OrAssign = 99; -CParser.Equal = 100; -CParser.NotEqual = 101; -CParser.Arrow = 102; -CParser.Dot = 103; -CParser.Ellipsis = 104; -CParser.Identifier = 105; -CParser.Constant = 106; -CParser.StringLiteral = 107; -CParser.LineDirective = 108; -CParser.PragmaDirective = 109; -CParser.Whitespace = 110; -CParser.Newline = 111; -CParser.BlockComment = 112; -CParser.LineComment = 113; +CParser.T__14 = 15; +CParser.T__15 = 16; +CParser.T__16 = 17; +CParser.Auto = 18; +CParser.Break = 19; +CParser.Case = 20; +CParser.Char = 21; +CParser.Const = 22; +CParser.Continue = 23; +CParser.Default = 24; +CParser.Do = 25; +CParser.Double = 26; +CParser.Else = 27; +CParser.Enum = 28; +CParser.Extern = 29; +CParser.Float = 30; +CParser.For = 31; +CParser.Goto = 32; +CParser.If = 33; +CParser.Inline = 34; +CParser.Int = 35; +CParser.Long = 36; +CParser.Register = 37; +CParser.Restrict = 38; +CParser.Return = 39; +CParser.Short = 40; +CParser.Signed = 41; +CParser.Sizeof = 42; +CParser.Static = 43; +CParser.Struct = 44; +CParser.Switch = 45; +CParser.Typedef = 46; +CParser.Union = 47; +CParser.Unsigned = 48; +CParser.Void = 49; +CParser.Volatile = 50; +CParser.While = 51; +CParser.Alignas = 52; +CParser.Alignof = 53; +CParser.Atomic = 54; +CParser.Bool = 55; +CParser.Complex = 56; +CParser.Generic = 57; +CParser.Imaginary = 58; +CParser.Noreturn = 59; +CParser.StaticAssert = 60; +CParser.ThreadLocal = 61; +CParser.LeftParen = 62; +CParser.RightParen = 63; +CParser.LeftBracket = 64; +CParser.RightBracket = 65; +CParser.LeftBrace = 66; +CParser.RightBrace = 67; +CParser.Less = 68; +CParser.LessEqual = 69; +CParser.Greater = 70; +CParser.GreaterEqual = 71; +CParser.LeftShift = 72; +CParser.RightShift = 73; +CParser.Plus = 74; +CParser.PlusPlus = 75; +CParser.Minus = 76; +CParser.MinusMinus = 77; +CParser.Star = 78; +CParser.Div = 79; +CParser.Mod = 80; +CParser.And = 81; +CParser.Or = 82; +CParser.AndAnd = 83; +CParser.OrOr = 84; +CParser.Caret = 85; +CParser.Not = 86; +CParser.Tilde = 87; +CParser.Question = 88; +CParser.Colon = 89; +CParser.Semi = 90; +CParser.Comma = 91; +CParser.Assign = 92; +CParser.StarAssign = 93; +CParser.DivAssign = 94; +CParser.ModAssign = 95; +CParser.PlusAssign = 96; +CParser.MinusAssign = 97; +CParser.LeftShiftAssign = 98; +CParser.RightShiftAssign = 99; +CParser.AndAssign = 100; +CParser.XorAssign = 101; +CParser.OrAssign = 102; +CParser.Equal = 103; +CParser.NotEqual = 104; +CParser.Arrow = 105; +CParser.Dot = 106; +CParser.Ellipsis = 107; +CParser.Identifier = 108; +CParser.Constant = 109; +CParser.StringLiteral = 110; +CParser.SharedIncludeLiteral = 111; +CParser.LineDirective = 112; +CParser.PragmaDirective = 113; +CParser.Whitespace = 114; +CParser.Newline = 115; +CParser.BlockComment = 116; +CParser.LineComment = 117; CParser.RULE_primaryExpression = 0; CParser.RULE_genericSelection = 1; @@ -746,56 +776,64 @@ CParser.RULE_storageClassSpecifier = 30; CParser.RULE_typeSpecifier = 31; CParser.RULE_structOrUnionSpecifier = 32; CParser.RULE_structOrUnion = 33; -CParser.RULE_structDeclarationList = 34; -CParser.RULE_structDeclaration = 35; -CParser.RULE_specifierQualifierList = 36; -CParser.RULE_structDeclaratorList = 37; -CParser.RULE_structDeclarator = 38; -CParser.RULE_enumSpecifier = 39; -CParser.RULE_enumeratorList = 40; -CParser.RULE_enumerator = 41; -CParser.RULE_enumerationConstant = 42; -CParser.RULE_atomicTypeSpecifier = 43; -CParser.RULE_typeQualifier = 44; -CParser.RULE_functionSpecifier = 45; -CParser.RULE_alignmentSpecifier = 46; -CParser.RULE_declarator = 47; -CParser.RULE_directDeclarator = 48; -CParser.RULE_gccDeclaratorExtension = 49; -CParser.RULE_gccAttributeSpecifier = 50; -CParser.RULE_gccAttributeList = 51; -CParser.RULE_gccAttribute = 52; -CParser.RULE_nestedParenthesesBlock = 53; -CParser.RULE_pointer = 54; -CParser.RULE_typeQualifierList = 55; -CParser.RULE_parameterTypeList = 56; -CParser.RULE_parameterList = 57; -CParser.RULE_parameterDeclaration = 58; -CParser.RULE_identifierList = 59; -CParser.RULE_typeName = 60; -CParser.RULE_abstractDeclarator = 61; -CParser.RULE_directAbstractDeclarator = 62; -CParser.RULE_typedefName = 63; -CParser.RULE_initializer = 64; -CParser.RULE_initializerList = 65; -CParser.RULE_designation = 66; -CParser.RULE_designatorList = 67; -CParser.RULE_designator = 68; -CParser.RULE_staticAssertDeclaration = 69; -CParser.RULE_statement = 70; -CParser.RULE_labeledStatement = 71; -CParser.RULE_compoundStatement = 72; -CParser.RULE_blockItemList = 73; -CParser.RULE_blockItem = 74; -CParser.RULE_expressionStatement = 75; -CParser.RULE_selectionStatement = 76; -CParser.RULE_iterationStatement = 77; -CParser.RULE_jumpStatement = 78; -CParser.RULE_compilationUnit = 79; -CParser.RULE_translationUnit = 80; -CParser.RULE_externalDeclaration = 81; -CParser.RULE_functionDefinition = 82; -CParser.RULE_declarationList = 83; +CParser.RULE_structDeclarationsBlock = 34; +CParser.RULE_structDeclarationList = 35; +CParser.RULE_structDeclaration = 36; +CParser.RULE_specifierQualifierList = 37; +CParser.RULE_structDeclaratorList = 38; +CParser.RULE_structDeclarator = 39; +CParser.RULE_enumSpecifier = 40; +CParser.RULE_enumeratorList = 41; +CParser.RULE_enumerator = 42; +CParser.RULE_enumerationConstant = 43; +CParser.RULE_atomicTypeSpecifier = 44; +CParser.RULE_typeQualifier = 45; +CParser.RULE_functionSpecifier = 46; +CParser.RULE_alignmentSpecifier = 47; +CParser.RULE_declarator = 48; +CParser.RULE_directDeclarator = 49; +CParser.RULE_gccDeclaratorExtension = 50; +CParser.RULE_gccAttributeSpecifier = 51; +CParser.RULE_gccAttributeList = 52; +CParser.RULE_gccAttribute = 53; +CParser.RULE_nestedParenthesesBlock = 54; +CParser.RULE_pointer = 55; +CParser.RULE_typeQualifierList = 56; +CParser.RULE_parameterTypeList = 57; +CParser.RULE_parameterList = 58; +CParser.RULE_parameterDeclaration = 59; +CParser.RULE_identifierList = 60; +CParser.RULE_typeName = 61; +CParser.RULE_abstractDeclarator = 62; +CParser.RULE_directAbstractDeclarator = 63; +CParser.RULE_typedefName = 64; +CParser.RULE_initializer = 65; +CParser.RULE_initializerList = 66; +CParser.RULE_designation = 67; +CParser.RULE_designatorList = 68; +CParser.RULE_designator = 69; +CParser.RULE_staticAssertDeclaration = 70; +CParser.RULE_statement = 71; +CParser.RULE_labeledStatement = 72; +CParser.RULE_compoundStatement = 73; +CParser.RULE_blockItemList = 74; +CParser.RULE_blockItem = 75; +CParser.RULE_expressionStatement = 76; +CParser.RULE_selectionStatement = 77; +CParser.RULE_iterationStatement = 78; +CParser.RULE_jumpStatement = 79; +CParser.RULE_compilationUnit = 80; +CParser.RULE_translationUnit = 81; +CParser.RULE_includeDirective = 82; +CParser.RULE_defineDirective = 83; +CParser.RULE_defineDirectiveNoVal = 84; +CParser.RULE_defineDirectiveNoParams = 85; +CParser.RULE_defineDirectiveWithParams = 86; +CParser.RULE_macroResult = 87; +CParser.RULE_macroParamList = 88; +CParser.RULE_externalDeclaration = 89; +CParser.RULE_functionDefinition = 90; +CParser.RULE_declarationList = 91; function PrimaryExpressionContext(parser, parent, invokingState) { if(parent===undefined) { @@ -876,36 +914,36 @@ CParser.prototype.primaryExpression = function() { this.enterRule(localctx, 0, CParser.RULE_primaryExpression); var _la = 0; // Token type try { - this.state = 201; + this.state = 217; var la_ = this._interp.adaptivePredict(this._input,2,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 168; + this.state = 184; this.match(CParser.Identifier); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 169; + this.state = 185; this.match(CParser.Constant); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 171; + this.state = 187; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 170; + this.state = 186; this.match(CParser.StringLiteral); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 173; + this.state = 189; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,0, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -913,66 +951,66 @@ CParser.prototype.primaryExpression = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 175; + this.state = 191; this.match(CParser.LeftParen); - this.state = 176; + this.state = 192; this.expression(0); - this.state = 177; + this.state = 193; this.match(CParser.RightParen); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 179; + this.state = 195; this.genericSelection(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 181; + this.state = 197; _la = this._input.LA(1); if(_la===CParser.T__0) { - this.state = 180; + this.state = 196; this.match(CParser.T__0); } - this.state = 183; + this.state = 199; this.match(CParser.LeftParen); - this.state = 184; + this.state = 200; this.compoundStatement(); - this.state = 185; + this.state = 201; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 187; + this.state = 203; this.match(CParser.T__1); - this.state = 188; + this.state = 204; this.match(CParser.LeftParen); - this.state = 189; + this.state = 205; this.unaryExpression(); - this.state = 190; + this.state = 206; this.match(CParser.Comma); - this.state = 191; + this.state = 207; this.typeName(); - this.state = 192; + this.state = 208; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 194; + this.state = 210; this.match(CParser.T__2); - this.state = 195; + this.state = 211; this.match(CParser.LeftParen); - this.state = 196; + this.state = 212; this.typeName(); - this.state = 197; + this.state = 213; this.match(CParser.Comma); - this.state = 198; + this.state = 214; this.unaryExpression(); - this.state = 199; + this.state = 215; this.match(CParser.RightParen); break; @@ -1038,17 +1076,17 @@ CParser.prototype.genericSelection = function() { this.enterRule(localctx, 2, CParser.RULE_genericSelection); try { this.enterOuterAlt(localctx, 1); - this.state = 203; + this.state = 219; this.match(CParser.Generic); - this.state = 204; + this.state = 220; this.match(CParser.LeftParen); - this.state = 205; + this.state = 221; this.assignmentExpression(); - this.state = 206; + this.state = 222; this.match(CParser.Comma); - this.state = 207; + this.state = 223; this.genericAssocList(0); - this.state = 208; + this.state = 224; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -1114,10 +1152,10 @@ CParser.prototype.genericAssocList = function(_p) { this.enterRecursionRule(localctx, 4, CParser.RULE_genericAssocList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 211; + this.state = 227; this.genericAssociation(); this._ctx.stop = this._input.LT(-1); - this.state = 218; + this.state = 234; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,3,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1128,16 +1166,16 @@ CParser.prototype.genericAssocList = function(_p) { _prevctx = localctx; localctx = new GenericAssocListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_genericAssocList); - this.state = 213; + this.state = 229; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 214; + this.state = 230; this.match(CParser.Comma); - this.state = 215; + this.state = 231; this.genericAssociation(); } - this.state = 220; + this.state = 236; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,3,this._ctx); } @@ -1202,7 +1240,7 @@ CParser.prototype.genericAssociation = function() { var localctx = new GenericAssociationContext(this, this._ctx, this.state); this.enterRule(localctx, 6, CParser.RULE_genericAssociation); try { - this.state = 228; + this.state = 244; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -1229,20 +1267,20 @@ CParser.prototype.genericAssociation = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 221; + this.state = 237; this.typeName(); - this.state = 222; + this.state = 238; this.match(CParser.Colon); - this.state = 223; + this.state = 239; this.assignmentExpression(); break; case CParser.Default: this.enterOuterAlt(localctx, 2); - this.state = 225; + this.state = 241; this.match(CParser.Default); - this.state = 226; + this.state = 242; this.match(CParser.Colon); - this.state = 227; + this.state = 243; this.assignmentExpression(); break; default: @@ -1333,85 +1371,85 @@ CParser.prototype.postfixExpression = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 264; + this.state = 280; var la_ = this._interp.adaptivePredict(this._input,5,this._ctx); switch(la_) { case 1: - this.state = 231; + this.state = 247; this.primaryExpression(); break; case 2: - this.state = 232; + this.state = 248; this.match(CParser.LeftParen); - this.state = 233; + this.state = 249; this.typeName(); - this.state = 234; + this.state = 250; this.match(CParser.RightParen); - this.state = 235; + this.state = 251; this.match(CParser.LeftBrace); - this.state = 236; + this.state = 252; this.initializerList(0); - this.state = 237; + this.state = 253; this.match(CParser.RightBrace); break; case 3: - this.state = 239; + this.state = 255; this.match(CParser.LeftParen); - this.state = 240; + this.state = 256; this.typeName(); - this.state = 241; + this.state = 257; this.match(CParser.RightParen); - this.state = 242; + this.state = 258; this.match(CParser.LeftBrace); - this.state = 243; + this.state = 259; this.initializerList(0); - this.state = 244; + this.state = 260; this.match(CParser.Comma); - this.state = 245; + this.state = 261; this.match(CParser.RightBrace); break; case 4: - this.state = 247; + this.state = 263; this.match(CParser.T__0); - this.state = 248; + this.state = 264; this.match(CParser.LeftParen); - this.state = 249; + this.state = 265; this.typeName(); - this.state = 250; + this.state = 266; this.match(CParser.RightParen); - this.state = 251; + this.state = 267; this.match(CParser.LeftBrace); - this.state = 252; + this.state = 268; this.initializerList(0); - this.state = 253; + this.state = 269; this.match(CParser.RightBrace); break; case 5: - this.state = 255; + this.state = 271; this.match(CParser.T__0); - this.state = 256; + this.state = 272; this.match(CParser.LeftParen); - this.state = 257; + this.state = 273; this.typeName(); - this.state = 258; + this.state = 274; this.match(CParser.RightParen); - this.state = 259; + this.state = 275; this.match(CParser.LeftBrace); - this.state = 260; + this.state = 276; this.initializerList(0); - this.state = 261; + this.state = 277; this.match(CParser.Comma); - this.state = 262; + this.state = 278; this.match(CParser.RightBrace); break; } this._ctx.stop = this._input.LT(-1); - this.state = 289; + this.state = 305; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,8,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1420,95 +1458,95 @@ CParser.prototype.postfixExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 287; + this.state = 303; var la_ = this._interp.adaptivePredict(this._input,7,this._ctx); switch(la_) { case 1: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 266; + this.state = 282; if (!( this.precpred(this._ctx, 10))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 10)"); } - this.state = 267; + this.state = 283; this.match(CParser.LeftBracket); - this.state = 268; + this.state = 284; this.expression(0); - this.state = 269; + this.state = 285; this.match(CParser.RightBracket); break; case 2: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 271; + this.state = 287; if (!( this.precpred(this._ctx, 9))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 9)"); } - this.state = 272; + this.state = 288; this.match(CParser.LeftParen); - this.state = 274; + this.state = 290; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 273; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 289; this.argumentExpressionList(0); } - this.state = 276; + this.state = 292; this.match(CParser.RightParen); break; case 3: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 277; + this.state = 293; if (!( this.precpred(this._ctx, 8))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)"); } - this.state = 278; + this.state = 294; this.match(CParser.Dot); - this.state = 279; + this.state = 295; this.match(CParser.Identifier); break; case 4: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 280; + this.state = 296; if (!( this.precpred(this._ctx, 7))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)"); } - this.state = 281; + this.state = 297; this.match(CParser.Arrow); - this.state = 282; + this.state = 298; this.match(CParser.Identifier); break; case 5: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 283; + this.state = 299; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 284; + this.state = 300; this.match(CParser.PlusPlus); break; case 6: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 285; + this.state = 301; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 286; + this.state = 302; this.match(CParser.MinusMinus); break; } } - this.state = 291; + this.state = 307; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,8,this._ctx); } @@ -1577,10 +1615,10 @@ CParser.prototype.argumentExpressionList = function(_p) { this.enterRecursionRule(localctx, 10, CParser.RULE_argumentExpressionList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 293; + this.state = 309; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 300; + this.state = 316; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,9,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1591,16 +1629,16 @@ CParser.prototype.argumentExpressionList = function(_p) { _prevctx = localctx; localctx = new ArgumentExpressionListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_argumentExpressionList); - this.state = 295; + this.state = 311; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 296; + this.state = 312; this.match(CParser.Comma); - this.state = 297; + this.state = 313; this.assignmentExpression(); } - this.state = 302; + this.state = 318; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,9,this._ctx); } @@ -1681,76 +1719,76 @@ CParser.prototype.unaryExpression = function() { var localctx = new UnaryExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 12, CParser.RULE_unaryExpression); try { - this.state = 325; + this.state = 341; var la_ = this._interp.adaptivePredict(this._input,10,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 303; + this.state = 319; this.postfixExpression(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 304; + this.state = 320; this.match(CParser.PlusPlus); - this.state = 305; + this.state = 321; this.unaryExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 306; + this.state = 322; this.match(CParser.MinusMinus); - this.state = 307; + this.state = 323; this.unaryExpression(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 308; + this.state = 324; this.unaryOperator(); - this.state = 309; + this.state = 325; this.castExpression(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 311; + this.state = 327; this.match(CParser.Sizeof); - this.state = 312; + this.state = 328; this.unaryExpression(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 313; + this.state = 329; this.match(CParser.Sizeof); - this.state = 314; + this.state = 330; this.match(CParser.LeftParen); - this.state = 315; + this.state = 331; this.typeName(); - this.state = 316; + this.state = 332; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 318; + this.state = 334; this.match(CParser.Alignof); - this.state = 319; + this.state = 335; this.match(CParser.LeftParen); - this.state = 320; + this.state = 336; this.typeName(); - this.state = 321; + this.state = 337; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 323; + this.state = 339; this.match(CParser.AndAnd); - this.state = 324; + this.state = 340; this.match(CParser.Identifier); break; @@ -1810,9 +1848,9 @@ CParser.prototype.unaryOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 327; + this.state = 343; _la = this._input.LA(1); - if(!(((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0))) { + if(!(((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -1882,38 +1920,38 @@ CParser.prototype.castExpression = function() { var localctx = new CastExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 16, CParser.RULE_castExpression); try { - this.state = 341; + this.state = 357; var la_ = this._interp.adaptivePredict(this._input,11,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 329; + this.state = 345; this.unaryExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 330; + this.state = 346; this.match(CParser.LeftParen); - this.state = 331; + this.state = 347; this.typeName(); - this.state = 332; + this.state = 348; this.match(CParser.RightParen); - this.state = 333; + this.state = 349; this.castExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 335; + this.state = 351; this.match(CParser.T__0); - this.state = 336; + this.state = 352; this.match(CParser.LeftParen); - this.state = 337; + this.state = 353; this.typeName(); - this.state = 338; + this.state = 354; this.match(CParser.RightParen); - this.state = 339; + this.state = 355; this.castExpression(); break; @@ -1982,10 +2020,10 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.enterRecursionRule(localctx, 18, CParser.RULE_multiplicativeExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 344; + this.state = 360; this.castExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 357; + this.state = 373; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,13,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1994,51 +2032,51 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 355; + this.state = 371; var la_ = this._interp.adaptivePredict(this._input,12,this._ctx); switch(la_) { case 1: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 346; + this.state = 362; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 347; + this.state = 363; this.match(CParser.Star); - this.state = 348; + this.state = 364; this.castExpression(); break; case 2: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 349; + this.state = 365; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 350; + this.state = 366; this.match(CParser.Div); - this.state = 351; + this.state = 367; this.castExpression(); break; case 3: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 352; + this.state = 368; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 353; + this.state = 369; this.match(CParser.Mod); - this.state = 354; + this.state = 370; this.castExpression(); break; } } - this.state = 359; + this.state = 375; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,13,this._ctx); } @@ -2107,10 +2145,10 @@ CParser.prototype.additiveExpression = function(_p) { this.enterRecursionRule(localctx, 20, CParser.RULE_additiveExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 361; + this.state = 377; this.multiplicativeExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 371; + this.state = 387; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,15,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2119,38 +2157,38 @@ CParser.prototype.additiveExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 369; + this.state = 385; var la_ = this._interp.adaptivePredict(this._input,14,this._ctx); switch(la_) { case 1: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 363; + this.state = 379; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 364; + this.state = 380; this.match(CParser.Plus); - this.state = 365; + this.state = 381; this.multiplicativeExpression(0); break; case 2: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 366; + this.state = 382; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 367; + this.state = 383; this.match(CParser.Minus); - this.state = 368; + this.state = 384; this.multiplicativeExpression(0); break; } } - this.state = 373; + this.state = 389; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,15,this._ctx); } @@ -2219,10 +2257,10 @@ CParser.prototype.shiftExpression = function(_p) { this.enterRecursionRule(localctx, 22, CParser.RULE_shiftExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 375; + this.state = 391; this.additiveExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 385; + this.state = 401; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,17,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2231,38 +2269,38 @@ CParser.prototype.shiftExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 383; + this.state = 399; var la_ = this._interp.adaptivePredict(this._input,16,this._ctx); switch(la_) { case 1: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 377; + this.state = 393; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 378; + this.state = 394; this.match(CParser.LeftShift); - this.state = 379; + this.state = 395; this.additiveExpression(0); break; case 2: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 380; + this.state = 396; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 381; + this.state = 397; this.match(CParser.RightShift); - this.state = 382; + this.state = 398; this.additiveExpression(0); break; } } - this.state = 387; + this.state = 403; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,17,this._ctx); } @@ -2331,10 +2369,10 @@ CParser.prototype.relationalExpression = function(_p) { this.enterRecursionRule(localctx, 24, CParser.RULE_relationalExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 389; + this.state = 405; this.shiftExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 405; + this.state = 421; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,19,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2343,64 +2381,64 @@ CParser.prototype.relationalExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 403; + this.state = 419; var la_ = this._interp.adaptivePredict(this._input,18,this._ctx); switch(la_) { case 1: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 391; + this.state = 407; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 392; + this.state = 408; this.match(CParser.Less); - this.state = 393; + this.state = 409; this.shiftExpression(0); break; case 2: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 394; + this.state = 410; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 395; + this.state = 411; this.match(CParser.Greater); - this.state = 396; + this.state = 412; this.shiftExpression(0); break; case 3: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 397; + this.state = 413; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 398; + this.state = 414; this.match(CParser.LessEqual); - this.state = 399; + this.state = 415; this.shiftExpression(0); break; case 4: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 400; + this.state = 416; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 401; + this.state = 417; this.match(CParser.GreaterEqual); - this.state = 402; + this.state = 418; this.shiftExpression(0); break; } } - this.state = 407; + this.state = 423; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,19,this._ctx); } @@ -2469,10 +2507,10 @@ CParser.prototype.equalityExpression = function(_p) { this.enterRecursionRule(localctx, 26, CParser.RULE_equalityExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 409; + this.state = 425; this.relationalExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 419; + this.state = 435; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,21,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2481,38 +2519,38 @@ CParser.prototype.equalityExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 417; + this.state = 433; var la_ = this._interp.adaptivePredict(this._input,20,this._ctx); switch(la_) { case 1: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 411; + this.state = 427; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 412; + this.state = 428; this.match(CParser.Equal); - this.state = 413; + this.state = 429; this.relationalExpression(0); break; case 2: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 414; + this.state = 430; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 415; + this.state = 431; this.match(CParser.NotEqual); - this.state = 416; + this.state = 432; this.relationalExpression(0); break; } } - this.state = 421; + this.state = 437; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,21,this._ctx); } @@ -2581,10 +2619,10 @@ CParser.prototype.andExpression = function(_p) { this.enterRecursionRule(localctx, 28, CParser.RULE_andExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 423; + this.state = 439; this.equalityExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 430; + this.state = 446; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,22,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2595,16 +2633,16 @@ CParser.prototype.andExpression = function(_p) { _prevctx = localctx; localctx = new AndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_andExpression); - this.state = 425; + this.state = 441; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 426; + this.state = 442; this.match(CParser.And); - this.state = 427; + this.state = 443; this.equalityExpression(0); } - this.state = 432; + this.state = 448; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,22,this._ctx); } @@ -2673,10 +2711,10 @@ CParser.prototype.exclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 30, CParser.RULE_exclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 434; + this.state = 450; this.andExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 441; + this.state = 457; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,23,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2687,16 +2725,16 @@ CParser.prototype.exclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new ExclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_exclusiveOrExpression); - this.state = 436; + this.state = 452; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 437; + this.state = 453; this.match(CParser.Caret); - this.state = 438; + this.state = 454; this.andExpression(0); } - this.state = 443; + this.state = 459; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,23,this._ctx); } @@ -2765,10 +2803,10 @@ CParser.prototype.inclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 32, CParser.RULE_inclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 445; + this.state = 461; this.exclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 452; + this.state = 468; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,24,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2779,16 +2817,16 @@ CParser.prototype.inclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new InclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_inclusiveOrExpression); - this.state = 447; + this.state = 463; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 448; + this.state = 464; this.match(CParser.Or); - this.state = 449; + this.state = 465; this.exclusiveOrExpression(0); } - this.state = 454; + this.state = 470; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,24,this._ctx); } @@ -2857,10 +2895,10 @@ CParser.prototype.logicalAndExpression = function(_p) { this.enterRecursionRule(localctx, 34, CParser.RULE_logicalAndExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 456; + this.state = 472; this.inclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 463; + this.state = 479; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,25,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2871,16 +2909,16 @@ CParser.prototype.logicalAndExpression = function(_p) { _prevctx = localctx; localctx = new LogicalAndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalAndExpression); - this.state = 458; + this.state = 474; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 459; + this.state = 475; this.match(CParser.AndAnd); - this.state = 460; + this.state = 476; this.inclusiveOrExpression(0); } - this.state = 465; + this.state = 481; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,25,this._ctx); } @@ -2949,10 +2987,10 @@ CParser.prototype.logicalOrExpression = function(_p) { this.enterRecursionRule(localctx, 36, CParser.RULE_logicalOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 467; + this.state = 483; this.logicalAndExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 474; + this.state = 490; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,26,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2963,16 +3001,16 @@ CParser.prototype.logicalOrExpression = function(_p) { _prevctx = localctx; localctx = new LogicalOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalOrExpression); - this.state = 469; + this.state = 485; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 470; + this.state = 486; this.match(CParser.OrOr); - this.state = 471; + this.state = 487; this.logicalAndExpression(0); } - this.state = 476; + this.state = 492; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,26,this._ctx); } @@ -3042,18 +3080,18 @@ CParser.prototype.conditionalExpression = function() { this.enterRule(localctx, 38, CParser.RULE_conditionalExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 477; + this.state = 493; this.logicalOrExpression(0); - this.state = 483; + this.state = 499; var la_ = this._interp.adaptivePredict(this._input,27,this._ctx); if(la_===1) { - this.state = 478; + this.state = 494; this.match(CParser.Question); - this.state = 479; + this.state = 495; this.expression(0); - this.state = 480; + this.state = 496; this.match(CParser.Colon); - this.state = 481; + this.state = 497; this.conditionalExpression(); } @@ -3125,22 +3163,22 @@ CParser.prototype.assignmentExpression = function() { var localctx = new AssignmentExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 40, CParser.RULE_assignmentExpression); try { - this.state = 490; + this.state = 506; var la_ = this._interp.adaptivePredict(this._input,28,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 485; + this.state = 501; this.conditionalExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 486; + this.state = 502; this.unaryExpression(); - this.state = 487; + this.state = 503; this.assignmentOperator(); - this.state = 488; + this.state = 504; this.assignmentExpression(); break; @@ -3200,9 +3238,9 @@ CParser.prototype.assignmentOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 492; + this.state = 508; _la = this._input.LA(1); - if(!(((((_la - 89)) & ~0x1f) == 0 && ((1 << (_la - 89)) & ((1 << (CParser.Assign - 89)) | (1 << (CParser.StarAssign - 89)) | (1 << (CParser.DivAssign - 89)) | (1 << (CParser.ModAssign - 89)) | (1 << (CParser.PlusAssign - 89)) | (1 << (CParser.MinusAssign - 89)) | (1 << (CParser.LeftShiftAssign - 89)) | (1 << (CParser.RightShiftAssign - 89)) | (1 << (CParser.AndAssign - 89)) | (1 << (CParser.XorAssign - 89)) | (1 << (CParser.OrAssign - 89)))) !== 0))) { + if(!(((((_la - 92)) & ~0x1f) == 0 && ((1 << (_la - 92)) & ((1 << (CParser.Assign - 92)) | (1 << (CParser.StarAssign - 92)) | (1 << (CParser.DivAssign - 92)) | (1 << (CParser.ModAssign - 92)) | (1 << (CParser.PlusAssign - 92)) | (1 << (CParser.MinusAssign - 92)) | (1 << (CParser.LeftShiftAssign - 92)) | (1 << (CParser.RightShiftAssign - 92)) | (1 << (CParser.AndAssign - 92)) | (1 << (CParser.XorAssign - 92)) | (1 << (CParser.OrAssign - 92)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -3272,10 +3310,10 @@ CParser.prototype.expression = function(_p) { this.enterRecursionRule(localctx, 44, CParser.RULE_expression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 495; + this.state = 511; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 502; + this.state = 518; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,29,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3286,16 +3324,16 @@ CParser.prototype.expression = function(_p) { _prevctx = localctx; localctx = new ExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_expression); - this.state = 497; + this.state = 513; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 498; + this.state = 514; this.match(CParser.Comma); - this.state = 499; + this.state = 515; this.assignmentExpression(); } - this.state = 504; + this.state = 520; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,29,this._ctx); } @@ -3357,7 +3395,7 @@ CParser.prototype.constantExpression = function() { this.enterRule(localctx, 46, CParser.RULE_constantExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 505; + this.state = 521; this.conditionalExpression(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -3424,7 +3462,7 @@ CParser.prototype.declaration = function() { this.enterRule(localctx, 48, CParser.RULE_declaration); var _la = 0; // Token type try { - this.state = 514; + this.state = 530; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -3464,21 +3502,21 @@ CParser.prototype.declaration = function() { case CParser.ThreadLocal: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 507; + this.state = 523; this.declarationSpecifiers(); - this.state = 509; + this.state = 525; _la = this._input.LA(1); - if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 508; + if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)))) !== 0) || _la===CParser.Identifier) { + this.state = 524; this.initDeclaratorList(0); } - this.state = 511; + this.state = 527; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 513; + this.state = 529; this.staticAssertDeclaration(); break; default: @@ -3548,19 +3586,19 @@ CParser.prototype.declarationSpecifiers = function() { this.enterRule(localctx, 50, CParser.RULE_declarationSpecifiers); try { this.enterOuterAlt(localctx, 1); - this.state = 517; + this.state = 533; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 516; + this.state = 532; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 519; + this.state = 535; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,32, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3628,19 +3666,19 @@ CParser.prototype.declarationSpecifiers2 = function() { this.enterRule(localctx, 52, CParser.RULE_declarationSpecifiers2); try { this.enterOuterAlt(localctx, 1); - this.state = 522; + this.state = 538; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 521; + this.state = 537; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 524; + this.state = 540; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,33, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3716,36 +3754,36 @@ CParser.prototype.declarationSpecifier = function() { var localctx = new DeclarationSpecifierContext(this, this._ctx, this.state); this.enterRule(localctx, 54, CParser.RULE_declarationSpecifier); try { - this.state = 531; + this.state = 547; var la_ = this._interp.adaptivePredict(this._input,34,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 526; + this.state = 542; this.storageClassSpecifier(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 527; + this.state = 543; this.typeSpecifier(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 528; + this.state = 544; this.typeQualifier(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 529; + this.state = 545; this.functionSpecifier(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 530; + this.state = 546; this.alignmentSpecifier(); break; @@ -3814,10 +3852,10 @@ CParser.prototype.initDeclaratorList = function(_p) { this.enterRecursionRule(localctx, 56, CParser.RULE_initDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 534; + this.state = 550; this.initDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 541; + this.state = 557; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,35,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3828,16 +3866,16 @@ CParser.prototype.initDeclaratorList = function(_p) { _prevctx = localctx; localctx = new InitDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initDeclaratorList); - this.state = 536; + this.state = 552; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 537; + this.state = 553; this.match(CParser.Comma); - this.state = 538; + this.state = 554; this.initDeclarator(); } - this.state = 543; + this.state = 559; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,35,this._ctx); } @@ -3902,22 +3940,22 @@ CParser.prototype.initDeclarator = function() { var localctx = new InitDeclaratorContext(this, this._ctx, this.state); this.enterRule(localctx, 58, CParser.RULE_initDeclarator); try { - this.state = 549; + this.state = 565; var la_ = this._interp.adaptivePredict(this._input,36,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 544; + this.state = 560; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 545; + this.state = 561; this.declarator(); - this.state = 546; + this.state = 562; this.match(CParser.Assign); - this.state = 547; + this.state = 563; this.initializer(); break; @@ -3977,9 +4015,9 @@ CParser.prototype.storageClassSpecifier = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 551; + this.state = 567; _la = this._input.LA(1); - if(!(_la===CParser.Auto || _la===CParser.Extern || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Register - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0))) { + if(!(_la===CParser.Auto || _la===CParser.Extern || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Register - 37)) | (1 << (CParser.Static - 37)) | (1 << (CParser.Typedef - 37)) | (1 << (CParser.ThreadLocal - 37)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -4058,7 +4096,7 @@ CParser.prototype.typeSpecifier = function() { this.enterRule(localctx, 62, CParser.RULE_typeSpecifier); var _la = 0; // Token type try { - this.state = 567; + this.state = 583; switch(this._input.LA(1)) { case CParser.T__3: case CParser.T__4: @@ -4075,9 +4113,9 @@ CParser.prototype.typeSpecifier = function() { case CParser.Bool: case CParser.Complex: this.enterOuterAlt(localctx, 1); - this.state = 553; + this.state = 569; _la = this._input.LA(1); - if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0))) { + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Int - 35)) | (1 << (CParser.Long - 35)) | (1 << (CParser.Short - 35)) | (1 << (CParser.Signed - 35)) | (1 << (CParser.Unsigned - 35)) | (1 << (CParser.Void - 35)) | (1 << (CParser.Bool - 35)) | (1 << (CParser.Complex - 35)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -4086,11 +4124,11 @@ CParser.prototype.typeSpecifier = function() { break; case CParser.T__0: this.enterOuterAlt(localctx, 2); - this.state = 554; + this.state = 570; this.match(CParser.T__0); - this.state = 555; + this.state = 571; this.match(CParser.LeftParen); - this.state = 556; + this.state = 572; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5))) !== 0))) { this._errHandler.recoverInline(this); @@ -4098,39 +4136,39 @@ CParser.prototype.typeSpecifier = function() { else { this.consume(); } - this.state = 557; + this.state = 573; this.match(CParser.RightParen); break; case CParser.Atomic: this.enterOuterAlt(localctx, 3); - this.state = 558; + this.state = 574; this.atomicTypeSpecifier(); break; case CParser.Struct: case CParser.Union: this.enterOuterAlt(localctx, 4); - this.state = 559; + this.state = 575; this.structOrUnionSpecifier(); break; case CParser.Enum: this.enterOuterAlt(localctx, 5); - this.state = 560; + this.state = 576; this.enumSpecifier(); break; case CParser.Identifier: this.enterOuterAlt(localctx, 6); - this.state = 561; + this.state = 577; this.typedefName(); break; case CParser.T__6: this.enterOuterAlt(localctx, 7); - this.state = 562; + this.state = 578; this.match(CParser.T__6); - this.state = 563; + this.state = 579; this.match(CParser.LeftParen); - this.state = 564; + this.state = 580; this.constantExpression(); - this.state = 565; + this.state = 581; this.match(CParser.RightParen); break; default: @@ -4170,8 +4208,8 @@ StructOrUnionSpecifierContext.prototype.structOrUnion = function() { return this.getTypedRuleContext(StructOrUnionContext,0); }; -StructOrUnionSpecifierContext.prototype.structDeclarationList = function() { - return this.getTypedRuleContext(StructDeclarationListContext,0); +StructOrUnionSpecifierContext.prototype.structDeclarationsBlock = function() { + return this.getTypedRuleContext(StructDeclarationsBlockContext,0); }; StructOrUnionSpecifierContext.prototype.Identifier = function() { @@ -4201,33 +4239,29 @@ CParser.prototype.structOrUnionSpecifier = function() { this.enterRule(localctx, 64, CParser.RULE_structOrUnionSpecifier); var _la = 0; // Token type try { - this.state = 580; + this.state = 594; var la_ = this._interp.adaptivePredict(this._input,39,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 569; + this.state = 585; this.structOrUnion(); - this.state = 571; + this.state = 587; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 570; + this.state = 586; this.match(CParser.Identifier); } - this.state = 573; - this.match(CParser.LeftBrace); - this.state = 574; - this.structDeclarationList(0); - this.state = 575; - this.match(CParser.RightBrace); + this.state = 589; + this.structDeclarationsBlock(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 577; + this.state = 591; this.structOrUnion(); - this.state = 578; + this.state = 592; this.match(CParser.Identifier); break; @@ -4287,7 +4321,7 @@ CParser.prototype.structOrUnion = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 582; + this.state = 596; _la = this._input.LA(1); if(!(_la===CParser.Struct || _la===CParser.Union)) { this._errHandler.recoverInline(this); @@ -4309,6 +4343,69 @@ CParser.prototype.structOrUnion = function() { return localctx; }; +function StructDeclarationsBlockContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structDeclarationsBlock; + return this; +} + +StructDeclarationsBlockContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructDeclarationsBlockContext.prototype.constructor = StructDeclarationsBlockContext; + +StructDeclarationsBlockContext.prototype.structDeclarationList = function() { + return this.getTypedRuleContext(StructDeclarationListContext,0); +}; + +StructDeclarationsBlockContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructDeclarationsBlock(this); + } +}; + +StructDeclarationsBlockContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructDeclarationsBlock(this); + } +}; + + + + +CParser.StructDeclarationsBlockContext = StructDeclarationsBlockContext; + +CParser.prototype.structDeclarationsBlock = function() { + + var localctx = new StructDeclarationsBlockContext(this, this._ctx, this.state); + this.enterRule(localctx, 68, CParser.RULE_structDeclarationsBlock); + try { + this.enterOuterAlt(localctx, 1); + this.state = 598; + this.match(CParser.LeftBrace); + this.state = 599; + this.structDeclarationList(0); + this.state = 600; + this.match(CParser.RightBrace); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + function StructDeclarationListContext(parser, parent, invokingState) { if(parent===undefined) { parent = null; @@ -4355,14 +4452,14 @@ CParser.prototype.structDeclarationList = function(_p) { var _parentState = this.state; var localctx = new StructDeclarationListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 68; - this.enterRecursionRule(localctx, 68, CParser.RULE_structDeclarationList, _p); + var _startState = 70; + this.enterRecursionRule(localctx, 70, CParser.RULE_structDeclarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 585; + this.state = 603; this.structDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 591; + this.state = 609; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,40,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4373,14 +4470,14 @@ CParser.prototype.structDeclarationList = function(_p) { _prevctx = localctx; localctx = new StructDeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclarationList); - this.state = 587; + this.state = 605; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 588; + this.state = 606; this.structDeclaration(); } - this.state = 593; + this.state = 611; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,40,this._ctx); } @@ -4447,10 +4544,10 @@ CParser.StructDeclarationContext = StructDeclarationContext; CParser.prototype.structDeclaration = function() { var localctx = new StructDeclarationContext(this, this._ctx, this.state); - this.enterRule(localctx, 70, CParser.RULE_structDeclaration); + this.enterRule(localctx, 72, CParser.RULE_structDeclaration); var _la = 0; // Token type try { - this.state = 601; + this.state = 619; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -4477,21 +4574,21 @@ CParser.prototype.structDeclaration = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 594; + this.state = 612; this.specifierQualifierList(); - this.state = 596; + this.state = 614; _la = this._input.LA(1); - if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)) | (1 << (CParser.Colon - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 595; + if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)) | (1 << (CParser.Colon - 62)))) !== 0) || _la===CParser.Identifier) { + this.state = 613; this.structDeclaratorList(0); } - this.state = 598; + this.state = 616; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 600; + this.state = 618; this.staticAssertDeclaration(); break; default: @@ -4559,19 +4656,19 @@ CParser.SpecifierQualifierListContext = SpecifierQualifierListContext; CParser.prototype.specifierQualifierList = function() { var localctx = new SpecifierQualifierListContext(this, this._ctx, this.state); - this.enterRule(localctx, 72, CParser.RULE_specifierQualifierList); + this.enterRule(localctx, 74, CParser.RULE_specifierQualifierList); try { - this.state = 611; + this.state = 629; var la_ = this._interp.adaptivePredict(this._input,45,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 603; + this.state = 621; this.typeSpecifier(); - this.state = 605; + this.state = 623; var la_ = this._interp.adaptivePredict(this._input,43,this._ctx); if(la_===1) { - this.state = 604; + this.state = 622; this.specifierQualifierList(); } @@ -4579,12 +4676,12 @@ CParser.prototype.specifierQualifierList = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 607; + this.state = 625; this.typeQualifier(); - this.state = 609; + this.state = 627; var la_ = this._interp.adaptivePredict(this._input,44,this._ctx); if(la_===1) { - this.state = 608; + this.state = 626; this.specifierQualifierList(); } @@ -4651,14 +4748,14 @@ CParser.prototype.structDeclaratorList = function(_p) { var _parentState = this.state; var localctx = new StructDeclaratorListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 74; - this.enterRecursionRule(localctx, 74, CParser.RULE_structDeclaratorList, _p); + var _startState = 76; + this.enterRecursionRule(localctx, 76, CParser.RULE_structDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 614; + this.state = 632; this.structDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 621; + this.state = 639; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,46,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4669,16 +4766,16 @@ CParser.prototype.structDeclaratorList = function(_p) { _prevctx = localctx; localctx = new StructDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclaratorList); - this.state = 616; + this.state = 634; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 617; + this.state = 635; this.match(CParser.Comma); - this.state = 618; + this.state = 636; this.structDeclarator(); } - this.state = 623; + this.state = 641; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,46,this._ctx); } @@ -4741,30 +4838,30 @@ CParser.StructDeclaratorContext = StructDeclaratorContext; CParser.prototype.structDeclarator = function() { var localctx = new StructDeclaratorContext(this, this._ctx, this.state); - this.enterRule(localctx, 76, CParser.RULE_structDeclarator); + this.enterRule(localctx, 78, CParser.RULE_structDeclarator); var _la = 0; // Token type try { - this.state = 630; + this.state = 648; var la_ = this._interp.adaptivePredict(this._input,48,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 624; + this.state = 642; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 626; + this.state = 644; _la = this._input.LA(1); - if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 625; + if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)))) !== 0) || _la===CParser.Identifier) { + this.state = 643; this.declarator(); } - this.state = 628; + this.state = 646; this.match(CParser.Colon); - this.state = 629; + this.state = 647; this.constantExpression(); break; @@ -4827,57 +4924,57 @@ CParser.EnumSpecifierContext = EnumSpecifierContext; CParser.prototype.enumSpecifier = function() { var localctx = new EnumSpecifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 78, CParser.RULE_enumSpecifier); + this.enterRule(localctx, 80, CParser.RULE_enumSpecifier); var _la = 0; // Token type try { - this.state = 651; + this.state = 669; var la_ = this._interp.adaptivePredict(this._input,51,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 632; + this.state = 650; this.match(CParser.Enum); - this.state = 634; + this.state = 652; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 633; + this.state = 651; this.match(CParser.Identifier); } - this.state = 636; + this.state = 654; this.match(CParser.LeftBrace); - this.state = 637; + this.state = 655; this.enumeratorList(0); - this.state = 638; + this.state = 656; this.match(CParser.RightBrace); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 640; + this.state = 658; this.match(CParser.Enum); - this.state = 642; + this.state = 660; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 641; + this.state = 659; this.match(CParser.Identifier); } - this.state = 644; + this.state = 662; this.match(CParser.LeftBrace); - this.state = 645; + this.state = 663; this.enumeratorList(0); - this.state = 646; + this.state = 664; this.match(CParser.Comma); - this.state = 647; + this.state = 665; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 649; + this.state = 667; this.match(CParser.Enum); - this.state = 650; + this.state = 668; this.match(CParser.Identifier); break; @@ -4942,14 +5039,14 @@ CParser.prototype.enumeratorList = function(_p) { var _parentState = this.state; var localctx = new EnumeratorListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 80; - this.enterRecursionRule(localctx, 80, CParser.RULE_enumeratorList, _p); + var _startState = 82; + this.enterRecursionRule(localctx, 82, CParser.RULE_enumeratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 654; + this.state = 672; this.enumerator(); this._ctx.stop = this._input.LT(-1); - this.state = 661; + this.state = 679; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,52,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4960,16 +5057,16 @@ CParser.prototype.enumeratorList = function(_p) { _prevctx = localctx; localctx = new EnumeratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_enumeratorList); - this.state = 656; + this.state = 674; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 657; + this.state = 675; this.match(CParser.Comma); - this.state = 658; + this.state = 676; this.enumerator(); } - this.state = 663; + this.state = 681; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,52,this._ctx); } @@ -5032,24 +5129,24 @@ CParser.EnumeratorContext = EnumeratorContext; CParser.prototype.enumerator = function() { var localctx = new EnumeratorContext(this, this._ctx, this.state); - this.enterRule(localctx, 82, CParser.RULE_enumerator); + this.enterRule(localctx, 84, CParser.RULE_enumerator); try { - this.state = 669; + this.state = 687; var la_ = this._interp.adaptivePredict(this._input,53,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 664; + this.state = 682; this.enumerationConstant(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 665; + this.state = 683; this.enumerationConstant(); - this.state = 666; + this.state = 684; this.match(CParser.Assign); - this.state = 667; + this.state = 685; this.constantExpression(); break; @@ -5108,10 +5205,10 @@ CParser.EnumerationConstantContext = EnumerationConstantContext; CParser.prototype.enumerationConstant = function() { var localctx = new EnumerationConstantContext(this, this._ctx, this.state); - this.enterRule(localctx, 84, CParser.RULE_enumerationConstant); + this.enterRule(localctx, 86, CParser.RULE_enumerationConstant); try { this.enterOuterAlt(localctx, 1); - this.state = 671; + this.state = 689; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5167,16 +5264,16 @@ CParser.AtomicTypeSpecifierContext = AtomicTypeSpecifierContext; CParser.prototype.atomicTypeSpecifier = function() { var localctx = new AtomicTypeSpecifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 86, CParser.RULE_atomicTypeSpecifier); + this.enterRule(localctx, 88, CParser.RULE_atomicTypeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 673; + this.state = 691; this.match(CParser.Atomic); - this.state = 674; + this.state = 692; this.match(CParser.LeftParen); - this.state = 675; + this.state = 693; this.typeName(); - this.state = 676; + this.state = 694; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5229,13 +5326,13 @@ CParser.TypeQualifierContext = TypeQualifierContext; CParser.prototype.typeQualifier = function() { var localctx = new TypeQualifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 88, CParser.RULE_typeQualifier); + this.enterRule(localctx, 90, CParser.RULE_typeQualifier); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 678; + this.state = 696; _la = this._input.LA(1); - if(!(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0))) { + if(!(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -5299,19 +5396,19 @@ CParser.FunctionSpecifierContext = FunctionSpecifierContext; CParser.prototype.functionSpecifier = function() { var localctx = new FunctionSpecifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 90, CParser.RULE_functionSpecifier); + this.enterRule(localctx, 92, CParser.RULE_functionSpecifier); var _la = 0; // Token type try { - this.state = 686; + this.state = 704; switch(this._input.LA(1)) { case CParser.T__7: case CParser.T__8: case CParser.Inline: case CParser.Noreturn: this.enterOuterAlt(localctx, 1); - this.state = 680; + this.state = 698; _la = this._input.LA(1); - if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Inline))) !== 0) || _la===CParser.Noreturn)) { + if(!(_la===CParser.T__7 || _la===CParser.T__8 || _la===CParser.Inline || _la===CParser.Noreturn)) { this._errHandler.recoverInline(this); } else { @@ -5320,18 +5417,18 @@ CParser.prototype.functionSpecifier = function() { break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 681; + this.state = 699; this.gccAttributeSpecifier(); break; case CParser.T__9: this.enterOuterAlt(localctx, 3); - this.state = 682; + this.state = 700; this.match(CParser.T__9); - this.state = 683; + this.state = 701; this.match(CParser.LeftParen); - this.state = 684; + this.state = 702; this.match(CParser.Identifier); - this.state = 685; + this.state = 703; this.match(CParser.RightParen); break; default: @@ -5395,32 +5492,32 @@ CParser.AlignmentSpecifierContext = AlignmentSpecifierContext; CParser.prototype.alignmentSpecifier = function() { var localctx = new AlignmentSpecifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 92, CParser.RULE_alignmentSpecifier); + this.enterRule(localctx, 94, CParser.RULE_alignmentSpecifier); try { - this.state = 698; + this.state = 716; var la_ = this._interp.adaptivePredict(this._input,55,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 688; + this.state = 706; this.match(CParser.Alignas); - this.state = 689; + this.state = 707; this.match(CParser.LeftParen); - this.state = 690; + this.state = 708; this.typeName(); - this.state = 691; + this.state = 709; this.match(CParser.RightParen); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 693; + this.state = 711; this.match(CParser.Alignas); - this.state = 694; + this.state = 712; this.match(CParser.LeftParen); - this.state = 695; + this.state = 713; this.constantExpression(); - this.state = 696; + this.state = 714; this.match(CParser.RightParen); break; @@ -5494,28 +5591,28 @@ CParser.DeclaratorContext = DeclaratorContext; CParser.prototype.declarator = function() { var localctx = new DeclaratorContext(this, this._ctx, this.state); - this.enterRule(localctx, 94, CParser.RULE_declarator); + this.enterRule(localctx, 96, CParser.RULE_declarator); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 701; + this.state = 719; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 700; + this.state = 718; this.pointer(); } - this.state = 703; + this.state = 721; this.directDeclarator(0); - this.state = 707; + this.state = 725; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,57,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 704; + this.state = 722; this.gccDeclaratorExtension(); } - this.state = 709; + this.state = 727; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,57,this._ctx); } @@ -5600,30 +5697,30 @@ CParser.prototype.directDeclarator = function(_p) { var _parentState = this.state; var localctx = new DirectDeclaratorContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 96; - this.enterRecursionRule(localctx, 96, CParser.RULE_directDeclarator, _p); + var _startState = 98; + this.enterRecursionRule(localctx, 98, CParser.RULE_directDeclarator, _p); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 716; + this.state = 734; switch(this._input.LA(1)) { case CParser.Identifier: - this.state = 711; + this.state = 729; this.match(CParser.Identifier); break; case CParser.LeftParen: - this.state = 712; + this.state = 730; this.match(CParser.LeftParen); - this.state = 713; + this.state = 731; this.declarator(); - this.state = 714; + this.state = 732; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } this._ctx.stop = this._input.LT(-1); - this.state = 763; + this.state = 781; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,65,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -5632,139 +5729,139 @@ CParser.prototype.directDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 761; + this.state = 779; var la_ = this._interp.adaptivePredict(this._input,64,this._ctx); switch(la_) { case 1: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 718; + this.state = 736; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 719; + this.state = 737; this.match(CParser.LeftBracket); - this.state = 721; + this.state = 739; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 720; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 738; this.typeQualifierList(0); } - this.state = 724; + this.state = 742; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 723; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 741; this.assignmentExpression(); } - this.state = 726; + this.state = 744; this.match(CParser.RightBracket); break; case 2: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 727; + this.state = 745; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 728; + this.state = 746; this.match(CParser.LeftBracket); - this.state = 729; + this.state = 747; this.match(CParser.Static); - this.state = 731; + this.state = 749; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 730; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 748; this.typeQualifierList(0); } - this.state = 733; + this.state = 751; this.assignmentExpression(); - this.state = 734; + this.state = 752; this.match(CParser.RightBracket); break; case 3: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 736; + this.state = 754; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 737; + this.state = 755; this.match(CParser.LeftBracket); - this.state = 738; + this.state = 756; this.typeQualifierList(0); - this.state = 739; + this.state = 757; this.match(CParser.Static); - this.state = 740; + this.state = 758; this.assignmentExpression(); - this.state = 741; + this.state = 759; this.match(CParser.RightBracket); break; case 4: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 743; + this.state = 761; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 744; + this.state = 762; this.match(CParser.LeftBracket); - this.state = 746; + this.state = 764; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 745; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 763; this.typeQualifierList(0); } - this.state = 748; + this.state = 766; this.match(CParser.Star); - this.state = 749; + this.state = 767; this.match(CParser.RightBracket); break; case 5: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 750; + this.state = 768; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 751; + this.state = 769; this.match(CParser.LeftParen); - this.state = 752; + this.state = 770; this.parameterTypeList(); - this.state = 753; + this.state = 771; this.match(CParser.RightParen); break; case 6: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 755; + this.state = 773; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 756; + this.state = 774; this.match(CParser.LeftParen); - this.state = 758; + this.state = 776; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 757; + this.state = 775; this.identifierList(0); } - this.state = 760; + this.state = 778; this.match(CParser.RightParen); break; } } - this.state = 765; + this.state = 783; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,65,this._ctx); } @@ -5835,33 +5932,33 @@ CParser.GccDeclaratorExtensionContext = GccDeclaratorExtensionContext; CParser.prototype.gccDeclaratorExtension = function() { var localctx = new GccDeclaratorExtensionContext(this, this._ctx, this.state); - this.enterRule(localctx, 98, CParser.RULE_gccDeclaratorExtension); + this.enterRule(localctx, 100, CParser.RULE_gccDeclaratorExtension); var _la = 0; // Token type try { - this.state = 775; + this.state = 793; switch(this._input.LA(1)) { case CParser.T__10: this.enterOuterAlt(localctx, 1); - this.state = 766; + this.state = 784; this.match(CParser.T__10); - this.state = 767; + this.state = 785; this.match(CParser.LeftParen); - this.state = 769; + this.state = 787; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 768; + this.state = 786; this.match(CParser.StringLiteral); - this.state = 771; + this.state = 789; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 773; + this.state = 791; this.match(CParser.RightParen); break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 774; + this.state = 792; this.gccAttributeSpecifier(); break; default: @@ -5921,20 +6018,20 @@ CParser.GccAttributeSpecifierContext = GccAttributeSpecifierContext; CParser.prototype.gccAttributeSpecifier = function() { var localctx = new GccAttributeSpecifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 100, CParser.RULE_gccAttributeSpecifier); + this.enterRule(localctx, 102, CParser.RULE_gccAttributeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 777; + this.state = 795; this.match(CParser.T__11); - this.state = 778; + this.state = 796; this.match(CParser.LeftParen); - this.state = 779; + this.state = 797; this.match(CParser.LeftParen); - this.state = 780; + this.state = 798; this.gccAttributeList(); - this.state = 781; + this.state = 799; this.match(CParser.RightParen); - this.state = 782; + this.state = 800; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5997,25 +6094,25 @@ CParser.GccAttributeListContext = GccAttributeListContext; CParser.prototype.gccAttributeList = function() { var localctx = new GccAttributeListContext(this, this._ctx, this.state); - this.enterRule(localctx, 102, CParser.RULE_gccAttributeList); + this.enterRule(localctx, 104, CParser.RULE_gccAttributeList); var _la = 0; // Token type try { - this.state = 793; + this.state = 811; var la_ = this._interp.adaptivePredict(this._input,69,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 784; + this.state = 802; this.gccAttribute(); - this.state = 789; + this.state = 807; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 785; + this.state = 803; this.match(CParser.Comma); - this.state = 786; + this.state = 804; this.gccAttribute(); - this.state = 791; + this.state = 809; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6081,10 +6178,10 @@ CParser.GccAttributeContext = GccAttributeContext; CParser.prototype.gccAttribute = function() { var localctx = new GccAttributeContext(this, this._ctx, this.state); - this.enterRule(localctx, 104, CParser.RULE_gccAttribute); + this.enterRule(localctx, 106, CParser.RULE_gccAttribute); var _la = 0; // Token type try { - this.state = 804; + this.state = 822; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6100,6 +6197,9 @@ CParser.prototype.gccAttribute = function() { case CParser.T__11: case CParser.T__12: case CParser.T__13: + case CParser.T__14: + case CParser.T__15: + case CParser.T__16: case CParser.Auto: case CParser.Break: case CParser.Case: @@ -6190,6 +6290,7 @@ CParser.prototype.gccAttribute = function() { case CParser.Identifier: case CParser.Constant: case CParser.StringLiteral: + case CParser.SharedIncludeLiteral: case CParser.LineDirective: case CParser.PragmaDirective: case CParser.Whitespace: @@ -6197,27 +6298,27 @@ CParser.prototype.gccAttribute = function() { case CParser.BlockComment: case CParser.LineComment: this.enterOuterAlt(localctx, 1); - this.state = 795; + this.state = 813; _la = this._input.LA(1); - if(_la<=0 || ((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.RightParen - 59)) | (1 << (CParser.Comma - 59)))) !== 0)) { + if(_la<=0 || ((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.RightParen - 62)) | (1 << (CParser.Comma - 62)))) !== 0)) { this._errHandler.recoverInline(this); } else { this.consume(); } - this.state = 801; + this.state = 819; _la = this._input.LA(1); if(_la===CParser.LeftParen) { - this.state = 796; + this.state = 814; this.match(CParser.LeftParen); - this.state = 798; + this.state = 816; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 797; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 815; this.argumentExpressionList(0); } - this.state = 800; + this.state = 818; this.match(CParser.RightParen); } @@ -6291,15 +6392,15 @@ CParser.NestedParenthesesBlockContext = NestedParenthesesBlockContext; CParser.prototype.nestedParenthesesBlock = function() { var localctx = new NestedParenthesesBlockContext(this, this._ctx, this.state); - this.enterRule(localctx, 106, CParser.RULE_nestedParenthesesBlock); + this.enterRule(localctx, 108, CParser.RULE_nestedParenthesesBlock); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 813; + this.state = 831; this._errHandler.sync(this); _la = this._input.LA(1); - while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.LineDirective - 96)) | (1 << (CParser.PragmaDirective - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { - this.state = 811; + while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.T__14) | (1 << CParser.T__15) | (1 << CParser.T__16) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Goto - 32)) | (1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.LeftBracket - 64)) | (1 << (CParser.RightBracket - 64)) | (1 << (CParser.LeftBrace - 64)) | (1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.PlusAssign - 96)) | (1 << (CParser.MinusAssign - 96)) | (1 << (CParser.LeftShiftAssign - 96)) | (1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.LineDirective - 96)) | (1 << (CParser.PragmaDirective - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { + this.state = 829; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6315,6 +6416,9 @@ CParser.prototype.nestedParenthesesBlock = function() { case CParser.T__11: case CParser.T__12: case CParser.T__13: + case CParser.T__14: + case CParser.T__15: + case CParser.T__16: case CParser.Auto: case CParser.Break: case CParser.Case: @@ -6406,13 +6510,14 @@ CParser.prototype.nestedParenthesesBlock = function() { case CParser.Identifier: case CParser.Constant: case CParser.StringLiteral: + case CParser.SharedIncludeLiteral: case CParser.LineDirective: case CParser.PragmaDirective: case CParser.Whitespace: case CParser.Newline: case CParser.BlockComment: case CParser.LineComment: - this.state = 806; + this.state = 824; _la = this._input.LA(1); if(_la<=0 || _la===CParser.LeftParen || _la===CParser.RightParen) { this._errHandler.recoverInline(this); @@ -6422,17 +6527,17 @@ CParser.prototype.nestedParenthesesBlock = function() { } break; case CParser.LeftParen: - this.state = 807; + this.state = 825; this.match(CParser.LeftParen); - this.state = 808; + this.state = 826; this.nestedParenthesesBlock(); - this.state = 809; + this.state = 827; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 815; + this.state = 833; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6494,20 +6599,20 @@ CParser.PointerContext = PointerContext; CParser.prototype.pointer = function() { var localctx = new PointerContext(this, this._ctx, this.state); - this.enterRule(localctx, 108, CParser.RULE_pointer); + this.enterRule(localctx, 110, CParser.RULE_pointer); var _la = 0; // Token type try { - this.state = 834; + this.state = 852; var la_ = this._interp.adaptivePredict(this._input,79,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 816; + this.state = 834; this.match(CParser.Star); - this.state = 818; + this.state = 836; var la_ = this._interp.adaptivePredict(this._input,75,this._ctx); if(la_===1) { - this.state = 817; + this.state = 835; this.typeQualifierList(0); } @@ -6515,27 +6620,27 @@ CParser.prototype.pointer = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 820; + this.state = 838; this.match(CParser.Star); - this.state = 822; + this.state = 840; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 821; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 839; this.typeQualifierList(0); } - this.state = 824; + this.state = 842; this.pointer(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 825; + this.state = 843; this.match(CParser.Caret); - this.state = 827; + this.state = 845; var la_ = this._interp.adaptivePredict(this._input,77,this._ctx); if(la_===1) { - this.state = 826; + this.state = 844; this.typeQualifierList(0); } @@ -6543,16 +6648,16 @@ CParser.prototype.pointer = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 829; + this.state = 847; this.match(CParser.Caret); - this.state = 831; + this.state = 849; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 830; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 848; this.typeQualifierList(0); } - this.state = 833; + this.state = 851; this.pointer(); break; @@ -6617,14 +6722,14 @@ CParser.prototype.typeQualifierList = function(_p) { var _parentState = this.state; var localctx = new TypeQualifierListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 110; - this.enterRecursionRule(localctx, 110, CParser.RULE_typeQualifierList, _p); + var _startState = 112; + this.enterRecursionRule(localctx, 112, CParser.RULE_typeQualifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 837; + this.state = 855; this.typeQualifier(); this._ctx.stop = this._input.LT(-1); - this.state = 843; + this.state = 861; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,80,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6635,14 +6740,14 @@ CParser.prototype.typeQualifierList = function(_p) { _prevctx = localctx; localctx = new TypeQualifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_typeQualifierList); - this.state = 839; + this.state = 857; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 840; + this.state = 858; this.typeQualifier(); } - this.state = 845; + this.state = 863; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,80,this._ctx); } @@ -6701,24 +6806,24 @@ CParser.ParameterTypeListContext = ParameterTypeListContext; CParser.prototype.parameterTypeList = function() { var localctx = new ParameterTypeListContext(this, this._ctx, this.state); - this.enterRule(localctx, 112, CParser.RULE_parameterTypeList); + this.enterRule(localctx, 114, CParser.RULE_parameterTypeList); try { - this.state = 851; + this.state = 869; var la_ = this._interp.adaptivePredict(this._input,81,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 846; + this.state = 864; this.parameterList(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 847; + this.state = 865; this.parameterList(0); - this.state = 848; + this.state = 866; this.match(CParser.Comma); - this.state = 849; + this.state = 867; this.match(CParser.Ellipsis); break; @@ -6783,14 +6888,14 @@ CParser.prototype.parameterList = function(_p) { var _parentState = this.state; var localctx = new ParameterListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 114; - this.enterRecursionRule(localctx, 114, CParser.RULE_parameterList, _p); + var _startState = 116; + this.enterRecursionRule(localctx, 116, CParser.RULE_parameterList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 854; + this.state = 872; this.parameterDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 861; + this.state = 879; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,82,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6801,16 +6906,16 @@ CParser.prototype.parameterList = function(_p) { _prevctx = localctx; localctx = new ParameterListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_parameterList); - this.state = 856; + this.state = 874; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 857; + this.state = 875; this.match(CParser.Comma); - this.state = 858; + this.state = 876; this.parameterDeclaration(); } - this.state = 863; + this.state = 881; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,82,this._ctx); } @@ -6881,27 +6986,27 @@ CParser.ParameterDeclarationContext = ParameterDeclarationContext; CParser.prototype.parameterDeclaration = function() { var localctx = new ParameterDeclarationContext(this, this._ctx, this.state); - this.enterRule(localctx, 116, CParser.RULE_parameterDeclaration); + this.enterRule(localctx, 118, CParser.RULE_parameterDeclaration); try { - this.state = 871; + this.state = 889; var la_ = this._interp.adaptivePredict(this._input,84,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 864; + this.state = 882; this.declarationSpecifiers(); - this.state = 865; + this.state = 883; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 867; + this.state = 885; this.declarationSpecifiers2(); - this.state = 869; + this.state = 887; var la_ = this._interp.adaptivePredict(this._input,83,this._ctx); if(la_===1) { - this.state = 868; + this.state = 886; this.abstractDeclarator(); } @@ -6968,14 +7073,14 @@ CParser.prototype.identifierList = function(_p) { var _parentState = this.state; var localctx = new IdentifierListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 118; - this.enterRecursionRule(localctx, 118, CParser.RULE_identifierList, _p); + var _startState = 120; + this.enterRecursionRule(localctx, 120, CParser.RULE_identifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 874; + this.state = 892; this.match(CParser.Identifier); this._ctx.stop = this._input.LT(-1); - this.state = 881; + this.state = 899; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,85,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6986,16 +7091,16 @@ CParser.prototype.identifierList = function(_p) { _prevctx = localctx; localctx = new IdentifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_identifierList); - this.state = 876; + this.state = 894; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 877; + this.state = 895; this.match(CParser.Comma); - this.state = 878; + this.state = 896; this.match(CParser.Identifier); } - this.state = 883; + this.state = 901; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,85,this._ctx); } @@ -7058,16 +7163,16 @@ CParser.TypeNameContext = TypeNameContext; CParser.prototype.typeName = function() { var localctx = new TypeNameContext(this, this._ctx, this.state); - this.enterRule(localctx, 120, CParser.RULE_typeName); + this.enterRule(localctx, 122, CParser.RULE_typeName); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 884; + this.state = 902; this.specifierQualifierList(); - this.state = 886; + this.state = 904; _la = this._input.LA(1); - if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.LeftBracket - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0)) { - this.state = 885; + if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.LeftBracket - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)))) !== 0)) { + this.state = 903; this.abstractDeclarator(); } @@ -7140,38 +7245,38 @@ CParser.AbstractDeclaratorContext = AbstractDeclaratorContext; CParser.prototype.abstractDeclarator = function() { var localctx = new AbstractDeclaratorContext(this, this._ctx, this.state); - this.enterRule(localctx, 122, CParser.RULE_abstractDeclarator); + this.enterRule(localctx, 124, CParser.RULE_abstractDeclarator); var _la = 0; // Token type try { - this.state = 899; + this.state = 917; var la_ = this._interp.adaptivePredict(this._input,89,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 888; + this.state = 906; this.pointer(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 890; + this.state = 908; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 889; + this.state = 907; this.pointer(); } - this.state = 892; + this.state = 910; this.directAbstractDeclarator(0); - this.state = 896; + this.state = 914; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,88,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 893; + this.state = 911; this.gccDeclaratorExtension(); } - this.state = 898; + this.state = 916; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,88,this._ctx); } @@ -7262,30 +7367,30 @@ CParser.prototype.directAbstractDeclarator = function(_p) { var _parentState = this.state; var localctx = new DirectAbstractDeclaratorContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 124; - this.enterRecursionRule(localctx, 124, CParser.RULE_directAbstractDeclarator, _p); + var _startState = 126; + this.enterRecursionRule(localctx, 126, CParser.RULE_directAbstractDeclarator, _p); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 947; + this.state = 965; var la_ = this._interp.adaptivePredict(this._input,96,this._ctx); switch(la_) { case 1: - this.state = 902; + this.state = 920; this.match(CParser.LeftParen); - this.state = 903; + this.state = 921; this.abstractDeclarator(); - this.state = 904; + this.state = 922; this.match(CParser.RightParen); - this.state = 908; + this.state = 926; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,90,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 905; + this.state = 923; this.gccDeclaratorExtension(); } - this.state = 910; + this.state = 928; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,90,this._ctx); } @@ -7293,87 +7398,87 @@ CParser.prototype.directAbstractDeclarator = function(_p) { break; case 2: - this.state = 911; + this.state = 929; this.match(CParser.LeftBracket); - this.state = 913; + this.state = 931; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 912; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 930; this.typeQualifierList(0); } - this.state = 916; + this.state = 934; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 915; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 933; this.assignmentExpression(); } - this.state = 918; + this.state = 936; this.match(CParser.RightBracket); break; case 3: - this.state = 919; + this.state = 937; this.match(CParser.LeftBracket); - this.state = 920; + this.state = 938; this.match(CParser.Static); - this.state = 922; + this.state = 940; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 921; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 939; this.typeQualifierList(0); } - this.state = 924; + this.state = 942; this.assignmentExpression(); - this.state = 925; + this.state = 943; this.match(CParser.RightBracket); break; case 4: - this.state = 927; + this.state = 945; this.match(CParser.LeftBracket); - this.state = 928; + this.state = 946; this.typeQualifierList(0); - this.state = 929; + this.state = 947; this.match(CParser.Static); - this.state = 930; + this.state = 948; this.assignmentExpression(); - this.state = 931; + this.state = 949; this.match(CParser.RightBracket); break; case 5: - this.state = 933; + this.state = 951; this.match(CParser.LeftBracket); - this.state = 934; + this.state = 952; this.match(CParser.Star); - this.state = 935; + this.state = 953; this.match(CParser.RightBracket); break; case 6: - this.state = 936; + this.state = 954; this.match(CParser.LeftParen); - this.state = 938; + this.state = 956; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 937; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0) || _la===CParser.Identifier) { + this.state = 955; this.parameterTypeList(); } - this.state = 940; + this.state = 958; this.match(CParser.RightParen); - this.state = 944; + this.state = 962; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,95,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 941; + this.state = 959; this.gccDeclaratorExtension(); } - this.state = 946; + this.state = 964; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,95,this._ctx); } @@ -7382,7 +7487,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } this._ctx.stop = this._input.LT(-1); - this.state = 992; + this.state = 1010; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,103,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7391,121 +7496,121 @@ CParser.prototype.directAbstractDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 990; + this.state = 1008; var la_ = this._interp.adaptivePredict(this._input,102,this._ctx); switch(la_) { case 1: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 949; + this.state = 967; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 950; + this.state = 968; this.match(CParser.LeftBracket); - this.state = 952; + this.state = 970; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 951; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 969; this.typeQualifierList(0); } - this.state = 955; + this.state = 973; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 954; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 972; this.assignmentExpression(); } - this.state = 957; + this.state = 975; this.match(CParser.RightBracket); break; case 2: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 958; + this.state = 976; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 959; + this.state = 977; this.match(CParser.LeftBracket); - this.state = 960; + this.state = 978; this.match(CParser.Static); - this.state = 962; + this.state = 980; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 961; + if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { + this.state = 979; this.typeQualifierList(0); } - this.state = 964; + this.state = 982; this.assignmentExpression(); - this.state = 965; + this.state = 983; this.match(CParser.RightBracket); break; case 3: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 967; + this.state = 985; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 968; + this.state = 986; this.match(CParser.LeftBracket); - this.state = 969; + this.state = 987; this.typeQualifierList(0); - this.state = 970; + this.state = 988; this.match(CParser.Static); - this.state = 971; + this.state = 989; this.assignmentExpression(); - this.state = 972; + this.state = 990; this.match(CParser.RightBracket); break; case 4: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 974; + this.state = 992; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 975; + this.state = 993; this.match(CParser.LeftBracket); - this.state = 976; + this.state = 994; this.match(CParser.Star); - this.state = 977; + this.state = 995; this.match(CParser.RightBracket); break; case 5: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 978; + this.state = 996; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 979; + this.state = 997; this.match(CParser.LeftParen); - this.state = 981; + this.state = 999; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 980; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0) || _la===CParser.Identifier) { + this.state = 998; this.parameterTypeList(); } - this.state = 983; + this.state = 1001; this.match(CParser.RightParen); - this.state = 987; + this.state = 1005; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,101,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 984; + this.state = 1002; this.gccDeclaratorExtension(); } - this.state = 989; + this.state = 1007; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,101,this._ctx); } @@ -7514,7 +7619,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } } - this.state = 994; + this.state = 1012; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,103,this._ctx); } @@ -7573,10 +7678,10 @@ CParser.TypedefNameContext = TypedefNameContext; CParser.prototype.typedefName = function() { var localctx = new TypedefNameContext(this, this._ctx, this.state); - this.enterRule(localctx, 126, CParser.RULE_typedefName); + this.enterRule(localctx, 128, CParser.RULE_typedefName); try { this.enterOuterAlt(localctx, 1); - this.state = 995; + this.state = 1013; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -7636,36 +7741,36 @@ CParser.InitializerContext = InitializerContext; CParser.prototype.initializer = function() { var localctx = new InitializerContext(this, this._ctx, this.state); - this.enterRule(localctx, 128, CParser.RULE_initializer); + this.enterRule(localctx, 130, CParser.RULE_initializer); try { - this.state = 1007; + this.state = 1025; var la_ = this._interp.adaptivePredict(this._input,104,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 997; + this.state = 1015; this.assignmentExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 998; + this.state = 1016; this.match(CParser.LeftBrace); - this.state = 999; + this.state = 1017; this.initializerList(0); - this.state = 1000; + this.state = 1018; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1002; + this.state = 1020; this.match(CParser.LeftBrace); - this.state = 1003; + this.state = 1021; this.initializerList(0); - this.state = 1004; + this.state = 1022; this.match(CParser.Comma); - this.state = 1005; + this.state = 1023; this.match(CParser.RightBrace); break; @@ -7734,22 +7839,22 @@ CParser.prototype.initializerList = function(_p) { var _parentState = this.state; var localctx = new InitializerListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 130; - this.enterRecursionRule(localctx, 130, CParser.RULE_initializerList, _p); + var _startState = 132; + this.enterRecursionRule(localctx, 132, CParser.RULE_initializerList, _p); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1011; + this.state = 1029; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1010; + this.state = 1028; this.designation(); } - this.state = 1013; + this.state = 1031; this.initializer(); this._ctx.stop = this._input.LT(-1); - this.state = 1023; + this.state = 1041; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,107,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7760,23 +7865,23 @@ CParser.prototype.initializerList = function(_p) { _prevctx = localctx; localctx = new InitializerListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initializerList); - this.state = 1015; + this.state = 1033; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1016; + this.state = 1034; this.match(CParser.Comma); - this.state = 1018; + this.state = 1036; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1017; + this.state = 1035; this.designation(); } - this.state = 1020; + this.state = 1038; this.initializer(); } - this.state = 1025; + this.state = 1043; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,107,this._ctx); } @@ -7835,12 +7940,12 @@ CParser.DesignationContext = DesignationContext; CParser.prototype.designation = function() { var localctx = new DesignationContext(this, this._ctx, this.state); - this.enterRule(localctx, 132, CParser.RULE_designation); + this.enterRule(localctx, 134, CParser.RULE_designation); try { this.enterOuterAlt(localctx, 1); - this.state = 1026; + this.state = 1044; this.designatorList(0); - this.state = 1027; + this.state = 1045; this.match(CParser.Assign); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -7902,14 +8007,14 @@ CParser.prototype.designatorList = function(_p) { var _parentState = this.state; var localctx = new DesignatorListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 134; - this.enterRecursionRule(localctx, 134, CParser.RULE_designatorList, _p); + var _startState = 136; + this.enterRecursionRule(localctx, 136, CParser.RULE_designatorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1030; + this.state = 1048; this.designator(); this._ctx.stop = this._input.LT(-1); - this.state = 1036; + this.state = 1054; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,108,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7920,14 +8025,14 @@ CParser.prototype.designatorList = function(_p) { _prevctx = localctx; localctx = new DesignatorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_designatorList); - this.state = 1032; + this.state = 1050; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1033; + this.state = 1051; this.designator(); } - this.state = 1038; + this.state = 1056; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,108,this._ctx); } @@ -7990,24 +8095,24 @@ CParser.DesignatorContext = DesignatorContext; CParser.prototype.designator = function() { var localctx = new DesignatorContext(this, this._ctx, this.state); - this.enterRule(localctx, 136, CParser.RULE_designator); + this.enterRule(localctx, 138, CParser.RULE_designator); try { - this.state = 1045; + this.state = 1063; switch(this._input.LA(1)) { case CParser.LeftBracket: this.enterOuterAlt(localctx, 1); - this.state = 1039; + this.state = 1057; this.match(CParser.LeftBracket); - this.state = 1040; + this.state = 1058; this.constantExpression(); - this.state = 1041; + this.state = 1059; this.match(CParser.RightBracket); break; case CParser.Dot: this.enterOuterAlt(localctx, 2); - this.state = 1043; + this.state = 1061; this.match(CParser.Dot); - this.state = 1044; + this.state = 1062; this.match(CParser.Identifier); break; default: @@ -8079,31 +8184,31 @@ CParser.StaticAssertDeclarationContext = StaticAssertDeclarationContext; CParser.prototype.staticAssertDeclaration = function() { var localctx = new StaticAssertDeclarationContext(this, this._ctx, this.state); - this.enterRule(localctx, 138, CParser.RULE_staticAssertDeclaration); + this.enterRule(localctx, 140, CParser.RULE_staticAssertDeclaration); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1047; + this.state = 1065; this.match(CParser.StaticAssert); - this.state = 1048; + this.state = 1066; this.match(CParser.LeftParen); - this.state = 1049; + this.state = 1067; this.constantExpression(); - this.state = 1050; + this.state = 1068; this.match(CParser.Comma); - this.state = 1052; + this.state = 1070; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 1051; + this.state = 1069; this.match(CParser.StringLiteral); - this.state = 1054; + this.state = 1072; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 1056; + this.state = 1074; this.match(CParser.RightParen); - this.state = 1057; + this.state = 1075; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8190,51 +8295,51 @@ CParser.StatementContext = StatementContext; CParser.prototype.statement = function() { var localctx = new StatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 140, CParser.RULE_statement); + this.enterRule(localctx, 142, CParser.RULE_statement); var _la = 0; // Token type try { - this.state = 1096; + this.state = 1114; var la_ = this._interp.adaptivePredict(this._input,116,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1059; + this.state = 1077; this.labeledStatement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1060; + this.state = 1078; this.compoundStatement(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1061; + this.state = 1079; this.expressionStatement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1062; + this.state = 1080; this.selectionStatement(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1063; + this.state = 1081; this.iterationStatement(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 1064; + this.state = 1082; this.jumpStatement(); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 1065; + this.state = 1083; _la = this._input.LA(1); if(!(_la===CParser.T__10 || _la===CParser.T__12)) { this._errHandler.recoverInline(this); @@ -8242,7 +8347,7 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1066; + this.state = 1084; _la = this._input.LA(1); if(!(_la===CParser.T__13 || _la===CParser.Volatile)) { this._errHandler.recoverInline(this); @@ -8250,59 +8355,59 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1067; + this.state = 1085; this.match(CParser.LeftParen); - this.state = 1076; + this.state = 1094; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1068; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1086; this.logicalOrExpression(0); - this.state = 1073; + this.state = 1091; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1069; + this.state = 1087; this.match(CParser.Comma); - this.state = 1070; + this.state = 1088; this.logicalOrExpression(0); - this.state = 1075; + this.state = 1093; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1091; + this.state = 1109; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Colon) { - this.state = 1078; + this.state = 1096; this.match(CParser.Colon); - this.state = 1087; + this.state = 1105; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1079; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1097; this.logicalOrExpression(0); - this.state = 1084; + this.state = 1102; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1080; + this.state = 1098; this.match(CParser.Comma); - this.state = 1081; + this.state = 1099; this.logicalOrExpression(0); - this.state = 1086; + this.state = 1104; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1093; + this.state = 1111; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 1094; + this.state = 1112; this.match(CParser.RightParen); - this.state = 1095; + this.state = 1113; this.match(CParser.Semi); break; @@ -8369,37 +8474,37 @@ CParser.LabeledStatementContext = LabeledStatementContext; CParser.prototype.labeledStatement = function() { var localctx = new LabeledStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 142, CParser.RULE_labeledStatement); + this.enterRule(localctx, 144, CParser.RULE_labeledStatement); try { - this.state = 1109; + this.state = 1127; switch(this._input.LA(1)) { case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 1098; + this.state = 1116; this.match(CParser.Identifier); - this.state = 1099; + this.state = 1117; this.match(CParser.Colon); - this.state = 1100; + this.state = 1118; this.statement(); break; case CParser.Case: this.enterOuterAlt(localctx, 2); - this.state = 1101; + this.state = 1119; this.match(CParser.Case); - this.state = 1102; + this.state = 1120; this.constantExpression(); - this.state = 1103; + this.state = 1121; this.match(CParser.Colon); - this.state = 1104; + this.state = 1122; this.statement(); break; case CParser.Default: this.enterOuterAlt(localctx, 3); - this.state = 1106; + this.state = 1124; this.match(CParser.Default); - this.state = 1107; + this.state = 1125; this.match(CParser.Colon); - this.state = 1108; + this.state = 1126; this.statement(); break; default: @@ -8459,20 +8564,20 @@ CParser.CompoundStatementContext = CompoundStatementContext; CParser.prototype.compoundStatement = function() { var localctx = new CompoundStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 144, CParser.RULE_compoundStatement); + this.enterRule(localctx, 146, CParser.RULE_compoundStatement); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1111; + this.state = 1129; this.match(CParser.LeftBrace); - this.state = 1113; + this.state = 1131; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)) | (1 << (CParser.Semi - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1112; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Goto - 32)) | (1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 66)) & ~0x1f) == 0 && ((1 << (_la - 66)) & ((1 << (CParser.LeftBrace - 66)) | (1 << (CParser.Plus - 66)) | (1 << (CParser.PlusPlus - 66)) | (1 << (CParser.Minus - 66)) | (1 << (CParser.MinusMinus - 66)) | (1 << (CParser.Star - 66)) | (1 << (CParser.And - 66)) | (1 << (CParser.AndAnd - 66)) | (1 << (CParser.Not - 66)) | (1 << (CParser.Tilde - 66)) | (1 << (CParser.Semi - 66)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1130; this.blockItemList(0); } - this.state = 1115; + this.state = 1133; this.match(CParser.RightBrace); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8534,14 +8639,14 @@ CParser.prototype.blockItemList = function(_p) { var _parentState = this.state; var localctx = new BlockItemListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 146; - this.enterRecursionRule(localctx, 146, CParser.RULE_blockItemList, _p); + var _startState = 148; + this.enterRecursionRule(localctx, 148, CParser.RULE_blockItemList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1118; + this.state = 1136; this.blockItem(); this._ctx.stop = this._input.LT(-1); - this.state = 1124; + this.state = 1142; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,119,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -8552,14 +8657,14 @@ CParser.prototype.blockItemList = function(_p) { _prevctx = localctx; localctx = new BlockItemListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_blockItemList); - this.state = 1120; + this.state = 1138; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1121; + this.state = 1139; this.blockItem(); } - this.state = 1126; + this.state = 1144; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,119,this._ctx); } @@ -8622,20 +8727,20 @@ CParser.BlockItemContext = BlockItemContext; CParser.prototype.blockItem = function() { var localctx = new BlockItemContext(this, this._ctx, this.state); - this.enterRule(localctx, 148, CParser.RULE_blockItem); + this.enterRule(localctx, 150, CParser.RULE_blockItem); try { - this.state = 1129; + this.state = 1147; var la_ = this._interp.adaptivePredict(this._input,120,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1127; + this.state = 1145; this.declaration(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1128; + this.state = 1146; this.statement(); break; @@ -8694,18 +8799,18 @@ CParser.ExpressionStatementContext = ExpressionStatementContext; CParser.prototype.expressionStatement = function() { var localctx = new ExpressionStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 150, CParser.RULE_expressionStatement); + this.enterRule(localctx, 152, CParser.RULE_expressionStatement); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1132; + this.state = 1150; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1131; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1149; this.expression(0); } - this.state = 1134; + this.state = 1152; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8772,43 +8877,43 @@ CParser.SelectionStatementContext = SelectionStatementContext; CParser.prototype.selectionStatement = function() { var localctx = new SelectionStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 152, CParser.RULE_selectionStatement); + this.enterRule(localctx, 154, CParser.RULE_selectionStatement); try { - this.state = 1151; + this.state = 1169; switch(this._input.LA(1)) { case CParser.If: this.enterOuterAlt(localctx, 1); - this.state = 1136; + this.state = 1154; this.match(CParser.If); - this.state = 1137; + this.state = 1155; this.match(CParser.LeftParen); - this.state = 1138; + this.state = 1156; this.expression(0); - this.state = 1139; + this.state = 1157; this.match(CParser.RightParen); - this.state = 1140; + this.state = 1158; this.statement(); - this.state = 1143; + this.state = 1161; var la_ = this._interp.adaptivePredict(this._input,122,this._ctx); if(la_===1) { - this.state = 1141; + this.state = 1159; this.match(CParser.Else); - this.state = 1142; + this.state = 1160; this.statement(); } break; case CParser.Switch: this.enterOuterAlt(localctx, 2); - this.state = 1145; + this.state = 1163; this.match(CParser.Switch); - this.state = 1146; + this.state = 1164; this.match(CParser.LeftParen); - this.state = 1147; + this.state = 1165; this.expression(0); - this.state = 1148; + this.state = 1166; this.match(CParser.RightParen); - this.state = 1149; + this.state = 1167; this.statement(); break; default: @@ -8883,108 +8988,108 @@ CParser.IterationStatementContext = IterationStatementContext; CParser.prototype.iterationStatement = function() { var localctx = new IterationStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 154, CParser.RULE_iterationStatement); + this.enterRule(localctx, 156, CParser.RULE_iterationStatement); var _la = 0; // Token type try { - this.state = 1195; + this.state = 1213; var la_ = this._interp.adaptivePredict(this._input,129,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1153; + this.state = 1171; this.match(CParser.While); - this.state = 1154; + this.state = 1172; this.match(CParser.LeftParen); - this.state = 1155; + this.state = 1173; this.expression(0); - this.state = 1156; + this.state = 1174; this.match(CParser.RightParen); - this.state = 1157; + this.state = 1175; this.statement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1159; + this.state = 1177; this.match(CParser.Do); - this.state = 1160; + this.state = 1178; this.statement(); - this.state = 1161; + this.state = 1179; this.match(CParser.While); - this.state = 1162; + this.state = 1180; this.match(CParser.LeftParen); - this.state = 1163; + this.state = 1181; this.expression(0); - this.state = 1164; + this.state = 1182; this.match(CParser.RightParen); - this.state = 1165; + this.state = 1183; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1167; + this.state = 1185; this.match(CParser.For); - this.state = 1168; + this.state = 1186; this.match(CParser.LeftParen); - this.state = 1170; + this.state = 1188; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1169; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1187; this.expression(0); } - this.state = 1172; + this.state = 1190; this.match(CParser.Semi); - this.state = 1174; + this.state = 1192; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1173; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1191; this.expression(0); } - this.state = 1176; + this.state = 1194; this.match(CParser.Semi); - this.state = 1178; + this.state = 1196; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1177; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1195; this.expression(0); } - this.state = 1180; + this.state = 1198; this.match(CParser.RightParen); - this.state = 1181; + this.state = 1199; this.statement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1182; + this.state = 1200; this.match(CParser.For); - this.state = 1183; + this.state = 1201; this.match(CParser.LeftParen); - this.state = 1184; + this.state = 1202; this.declaration(); - this.state = 1186; + this.state = 1204; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1185; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1203; this.expression(0); } - this.state = 1188; + this.state = 1206; this.match(CParser.Semi); - this.state = 1190; + this.state = 1208; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1189; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1207; this.expression(0); } - this.state = 1192; + this.state = 1210; this.match(CParser.RightParen); - this.state = 1193; + this.state = 1211; this.statement(); break; @@ -9051,60 +9156,60 @@ CParser.JumpStatementContext = JumpStatementContext; CParser.prototype.jumpStatement = function() { var localctx = new JumpStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 156, CParser.RULE_jumpStatement); + this.enterRule(localctx, 158, CParser.RULE_jumpStatement); var _la = 0; // Token type try { - this.state = 1213; + this.state = 1231; var la_ = this._interp.adaptivePredict(this._input,131,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1197; + this.state = 1215; this.match(CParser.Goto); - this.state = 1198; + this.state = 1216; this.match(CParser.Identifier); - this.state = 1199; + this.state = 1217; this.match(CParser.Semi); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1200; + this.state = 1218; this.match(CParser.Continue); - this.state = 1201; + this.state = 1219; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1202; + this.state = 1220; this.match(CParser.Break); - this.state = 1203; + this.state = 1221; this.match(CParser.Semi); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1204; + this.state = 1222; this.match(CParser.Return); - this.state = 1206; + this.state = 1224; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1205; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { + this.state = 1223; this.expression(0); } - this.state = 1208; + this.state = 1226; this.match(CParser.Semi); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1209; + this.state = 1227; this.match(CParser.Goto); - this.state = 1210; + this.state = 1228; this.unaryExpression(); - this.state = 1211; + this.state = 1229; this.match(CParser.Semi); break; @@ -9167,18 +9272,18 @@ CParser.CompilationUnitContext = CompilationUnitContext; CParser.prototype.compilationUnit = function() { var localctx = new CompilationUnitContext(this, this._ctx, this.state); - this.enterRule(localctx, 158, CParser.RULE_compilationUnit); + this.enterRule(localctx, 160, CParser.RULE_compilationUnit); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1216; + this.state = 1234; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) { - this.state = 1215; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.T__14) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.StaticAssert - 34)) | (1 << (CParser.ThreadLocal - 34)) | (1 << (CParser.LeftParen - 34)))) !== 0) || ((((_la - 78)) & ~0x1f) == 0 && ((1 << (_la - 78)) & ((1 << (CParser.Star - 78)) | (1 << (CParser.Caret - 78)) | (1 << (CParser.Semi - 78)) | (1 << (CParser.Identifier - 78)))) !== 0)) { + this.state = 1233; this.translationUnit(0); } - this.state = 1218; + this.state = 1236; this.match(CParser.EOF); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -9240,14 +9345,14 @@ CParser.prototype.translationUnit = function(_p) { var _parentState = this.state; var localctx = new TranslationUnitContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 160; - this.enterRecursionRule(localctx, 160, CParser.RULE_translationUnit, _p); + var _startState = 162; + this.enterRecursionRule(localctx, 162, CParser.RULE_translationUnit, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1221; + this.state = 1239; this.externalDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1227; + this.state = 1245; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,133,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -9258,14 +9363,14 @@ CParser.prototype.translationUnit = function(_p) { _prevctx = localctx; localctx = new TranslationUnitContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_translationUnit); - this.state = 1223; + this.state = 1241; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1224; + this.state = 1242; this.externalDeclaration(); } - this.state = 1229; + this.state = 1247; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,133,this._ctx); } @@ -9284,7 +9389,7 @@ CParser.prototype.translationUnit = function(_p) { return localctx; }; -function ExternalDeclarationContext(parser, parent, invokingState) { +function IncludeDirectiveContext(parser, parent, invokingState) { if(parent===undefined) { parent = null; } @@ -9293,61 +9398,613 @@ function ExternalDeclarationContext(parser, parent, invokingState) { } antlr4.ParserRuleContext.call(this, parent, invokingState); this.parser = parser; - this.ruleIndex = CParser.RULE_externalDeclaration; + this.ruleIndex = CParser.RULE_includeDirective; return this; } -ExternalDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -ExternalDeclarationContext.prototype.constructor = ExternalDeclarationContext; +IncludeDirectiveContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +IncludeDirectiveContext.prototype.constructor = IncludeDirectiveContext; -ExternalDeclarationContext.prototype.functionDefinition = function() { - return this.getTypedRuleContext(FunctionDefinitionContext,0); +IncludeDirectiveContext.prototype.StringLiteral = function() { + return this.getToken(CParser.StringLiteral, 0); }; -ExternalDeclarationContext.prototype.declaration = function() { - return this.getTypedRuleContext(DeclarationContext,0); +IncludeDirectiveContext.prototype.SharedIncludeLiteral = function() { + return this.getToken(CParser.SharedIncludeLiteral, 0); }; -ExternalDeclarationContext.prototype.enterRule = function(listener) { +IncludeDirectiveContext.prototype.enterRule = function(listener) { if(listener instanceof CListener ) { - listener.enterExternalDeclaration(this); + listener.enterIncludeDirective(this); } }; -ExternalDeclarationContext.prototype.exitRule = function(listener) { +IncludeDirectiveContext.prototype.exitRule = function(listener) { if(listener instanceof CListener ) { - listener.exitExternalDeclaration(this); + listener.exitIncludeDirective(this); } }; -CParser.ExternalDeclarationContext = ExternalDeclarationContext; +CParser.IncludeDirectiveContext = IncludeDirectiveContext; -CParser.prototype.externalDeclaration = function() { +CParser.prototype.includeDirective = function() { - var localctx = new ExternalDeclarationContext(this, this._ctx, this.state); - this.enterRule(localctx, 162, CParser.RULE_externalDeclaration); + var localctx = new IncludeDirectiveContext(this, this._ctx, this.state); + this.enterRule(localctx, 164, CParser.RULE_includeDirective); try { - this.state = 1233; + this.state = 1254; var la_ = this._interp.adaptivePredict(this._input,134,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1230; - this.functionDefinition(); + this.state = 1248; + this.match(CParser.T__14); + this.state = 1249; + this.match(CParser.T__15); + this.state = 1250; + this.match(CParser.StringLiteral); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1231; - this.declaration(); + this.state = 1251; + this.match(CParser.T__14); + this.state = 1252; + this.match(CParser.T__15); + this.state = 1253; + this.match(CParser.SharedIncludeLiteral); break; - case 3: - this.enterOuterAlt(localctx, 3); - this.state = 1232; + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DefineDirectiveContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_defineDirective; + return this; +} + +DefineDirectiveContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DefineDirectiveContext.prototype.constructor = DefineDirectiveContext; + +DefineDirectiveContext.prototype.defineDirectiveWithParams = function() { + return this.getTypedRuleContext(DefineDirectiveWithParamsContext,0); +}; + +DefineDirectiveContext.prototype.defineDirectiveNoParams = function() { + return this.getTypedRuleContext(DefineDirectiveNoParamsContext,0); +}; + +DefineDirectiveContext.prototype.defineDirectiveNoVal = function() { + return this.getTypedRuleContext(DefineDirectiveNoValContext,0); +}; + +DefineDirectiveContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDefineDirective(this); + } +}; + +DefineDirectiveContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDefineDirective(this); + } +}; + + + + +CParser.DefineDirectiveContext = DefineDirectiveContext; + +CParser.prototype.defineDirective = function() { + + var localctx = new DefineDirectiveContext(this, this._ctx, this.state); + this.enterRule(localctx, 166, CParser.RULE_defineDirective); + try { + this.state = 1259; + var la_ = this._interp.adaptivePredict(this._input,135,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1256; + this.defineDirectiveWithParams(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1257; + this.defineDirectiveNoParams(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1258; + this.defineDirectiveNoVal(); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DefineDirectiveNoValContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_defineDirectiveNoVal; + return this; +} + +DefineDirectiveNoValContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DefineDirectiveNoValContext.prototype.constructor = DefineDirectiveNoValContext; + +DefineDirectiveNoValContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +DefineDirectiveNoValContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDefineDirectiveNoVal(this); + } +}; + +DefineDirectiveNoValContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDefineDirectiveNoVal(this); + } +}; + + + + +CParser.DefineDirectiveNoValContext = DefineDirectiveNoValContext; + +CParser.prototype.defineDirectiveNoVal = function() { + + var localctx = new DefineDirectiveNoValContext(this, this._ctx, this.state); + this.enterRule(localctx, 168, CParser.RULE_defineDirectiveNoVal); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1261; + this.match(CParser.T__14); + this.state = 1262; + this.match(CParser.T__16); + this.state = 1263; + this.match(CParser.Identifier); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DefineDirectiveNoParamsContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_defineDirectiveNoParams; + return this; +} + +DefineDirectiveNoParamsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DefineDirectiveNoParamsContext.prototype.constructor = DefineDirectiveNoParamsContext; + +DefineDirectiveNoParamsContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +DefineDirectiveNoParamsContext.prototype.macroResult = function() { + return this.getTypedRuleContext(MacroResultContext,0); +}; + +DefineDirectiveNoParamsContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDefineDirectiveNoParams(this); + } +}; + +DefineDirectiveNoParamsContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDefineDirectiveNoParams(this); + } +}; + + + + +CParser.DefineDirectiveNoParamsContext = DefineDirectiveNoParamsContext; + +CParser.prototype.defineDirectiveNoParams = function() { + + var localctx = new DefineDirectiveNoParamsContext(this, this._ctx, this.state); + this.enterRule(localctx, 170, CParser.RULE_defineDirectiveNoParams); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1265; + this.match(CParser.T__14); + this.state = 1266; + this.match(CParser.T__16); + this.state = 1267; + this.match(CParser.Identifier); + this.state = 1268; + this.macroResult(); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DefineDirectiveWithParamsContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_defineDirectiveWithParams; + return this; +} + +DefineDirectiveWithParamsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DefineDirectiveWithParamsContext.prototype.constructor = DefineDirectiveWithParamsContext; + +DefineDirectiveWithParamsContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +DefineDirectiveWithParamsContext.prototype.macroParamList = function() { + return this.getTypedRuleContext(MacroParamListContext,0); +}; + +DefineDirectiveWithParamsContext.prototype.macroResult = function() { + return this.getTypedRuleContext(MacroResultContext,0); +}; + +DefineDirectiveWithParamsContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDefineDirectiveWithParams(this); + } +}; + +DefineDirectiveWithParamsContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDefineDirectiveWithParams(this); + } +}; + + + + +CParser.DefineDirectiveWithParamsContext = DefineDirectiveWithParamsContext; + +CParser.prototype.defineDirectiveWithParams = function() { + + var localctx = new DefineDirectiveWithParamsContext(this, this._ctx, this.state); + this.enterRule(localctx, 172, CParser.RULE_defineDirectiveWithParams); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1270; + this.match(CParser.T__14); + this.state = 1271; + this.match(CParser.T__16); + this.state = 1272; + this.match(CParser.Identifier); + this.state = 1273; + this.match(CParser.LeftParen); + this.state = 1274; + this.macroParamList(0); + this.state = 1275; + this.match(CParser.RightParen); + this.state = 1276; + this.macroResult(); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function MacroResultContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_macroResult; + return this; +} + +MacroResultContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +MacroResultContext.prototype.constructor = MacroResultContext; + +MacroResultContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +MacroResultContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterMacroResult(this); + } +}; + +MacroResultContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitMacroResult(this); + } +}; + + + + +CParser.MacroResultContext = MacroResultContext; + +CParser.prototype.macroResult = function() { + + var localctx = new MacroResultContext(this, this._ctx, this.state); + this.enterRule(localctx, 174, CParser.RULE_macroResult); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1278; + this.expression(0); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function MacroParamListContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_macroParamList; + return this; +} + +MacroParamListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +MacroParamListContext.prototype.constructor = MacroParamListContext; + +MacroParamListContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +MacroParamListContext.prototype.macroParamList = function() { + return this.getTypedRuleContext(MacroParamListContext,0); +}; + +MacroParamListContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterMacroParamList(this); + } +}; + +MacroParamListContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitMacroParamList(this); + } +}; + + + +CParser.prototype.macroParamList = function(_p) { + if(_p===undefined) { + _p = 0; + } + var _parentctx = this._ctx; + var _parentState = this.state; + var localctx = new MacroParamListContext(this, this._ctx, _parentState); + var _prevctx = localctx; + var _startState = 176; + this.enterRecursionRule(localctx, 176, CParser.RULE_macroParamList, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1281; + this.match(CParser.Identifier); + this._ctx.stop = this._input.LT(-1); + this.state = 1288; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,136,this._ctx) + while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1) { + if(this._parseListeners!==null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new MacroParamListContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CParser.RULE_macroParamList); + this.state = 1283; + if (!( this.precpred(this._ctx, 1))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); + } + this.state = 1284; + this.match(CParser.Comma); + this.state = 1285; + this.match(CParser.Identifier); + } + this.state = 1290; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,136,this._ctx); + } + + } catch( error) { + if(error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx) + } + return localctx; +}; + +function ExternalDeclarationContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_externalDeclaration; + return this; +} + +ExternalDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ExternalDeclarationContext.prototype.constructor = ExternalDeclarationContext; + +ExternalDeclarationContext.prototype.functionDefinition = function() { + return this.getTypedRuleContext(FunctionDefinitionContext,0); +}; + +ExternalDeclarationContext.prototype.declaration = function() { + return this.getTypedRuleContext(DeclarationContext,0); +}; + +ExternalDeclarationContext.prototype.includeDirective = function() { + return this.getTypedRuleContext(IncludeDirectiveContext,0); +}; + +ExternalDeclarationContext.prototype.defineDirective = function() { + return this.getTypedRuleContext(DefineDirectiveContext,0); +}; + +ExternalDeclarationContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterExternalDeclaration(this); + } +}; + +ExternalDeclarationContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitExternalDeclaration(this); + } +}; + + + + +CParser.ExternalDeclarationContext = ExternalDeclarationContext; + +CParser.prototype.externalDeclaration = function() { + + var localctx = new ExternalDeclarationContext(this, this._ctx, this.state); + this.enterRule(localctx, 178, CParser.RULE_externalDeclaration); + try { + this.state = 1296; + var la_ = this._interp.adaptivePredict(this._input,137,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1291; + this.functionDefinition(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1292; + this.declaration(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1293; + this.includeDirective(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1294; + this.defineDirective(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1295; this.match(CParser.Semi); break; @@ -9418,27 +10075,27 @@ CParser.FunctionDefinitionContext = FunctionDefinitionContext; CParser.prototype.functionDefinition = function() { var localctx = new FunctionDefinitionContext(this, this._ctx, this.state); - this.enterRule(localctx, 164, CParser.RULE_functionDefinition); + this.enterRule(localctx, 180, CParser.RULE_functionDefinition); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1236; - var la_ = this._interp.adaptivePredict(this._input,135,this._ctx); + this.state = 1299; + var la_ = this._interp.adaptivePredict(this._input,138,this._ctx); if(la_===1) { - this.state = 1235; + this.state = 1298; this.declarationSpecifiers(); } - this.state = 1238; + this.state = 1301; this.declarator(); - this.state = 1240; + this.state = 1303; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 1239; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.StaticAssert - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0) || _la===CParser.Identifier) { + this.state = 1302; this.declarationList(0); } - this.state = 1242; + this.state = 1305; this.compoundStatement(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -9500,16 +10157,16 @@ CParser.prototype.declarationList = function(_p) { var _parentState = this.state; var localctx = new DeclarationListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 166; - this.enterRecursionRule(localctx, 166, CParser.RULE_declarationList, _p); + var _startState = 182; + this.enterRecursionRule(localctx, 182, CParser.RULE_declarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1245; + this.state = 1308; this.declaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1251; + this.state = 1314; this._errHandler.sync(this); - var _alt = this._interp.adaptivePredict(this._input,137,this._ctx) + var _alt = this._interp.adaptivePredict(this._input,140,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { if(this._parseListeners!==null) { @@ -9518,16 +10175,16 @@ CParser.prototype.declarationList = function(_p) { _prevctx = localctx; localctx = new DeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_declarationList); - this.state = 1247; + this.state = 1310; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1248; + this.state = 1311; this.declaration(); } - this.state = 1253; + this.state = 1316; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input,137,this._ctx); + _alt = this._interp.adaptivePredict(this._input,140,this._ctx); } } catch( error) { @@ -9577,31 +10234,33 @@ CParser.prototype.sempred = function(localctx, ruleIndex, predIndex) { return this.expression_sempred(localctx, predIndex); case 28: return this.initDeclaratorList_sempred(localctx, predIndex); - case 34: + case 35: return this.structDeclarationList_sempred(localctx, predIndex); - case 37: + case 38: return this.structDeclaratorList_sempred(localctx, predIndex); - case 40: + case 41: return this.enumeratorList_sempred(localctx, predIndex); - case 48: + case 49: return this.directDeclarator_sempred(localctx, predIndex); - case 55: + case 56: return this.typeQualifierList_sempred(localctx, predIndex); - case 57: + case 58: return this.parameterList_sempred(localctx, predIndex); - case 59: + case 60: return this.identifierList_sempred(localctx, predIndex); - case 62: + case 63: return this.directAbstractDeclarator_sempred(localctx, predIndex); - case 65: + case 66: return this.initializerList_sempred(localctx, predIndex); - case 67: + case 68: return this.designatorList_sempred(localctx, predIndex); - case 73: + case 74: return this.blockItemList_sempred(localctx, predIndex); - case 80: + case 81: return this.translationUnit_sempred(localctx, predIndex); - case 83: + case 88: + return this.macroParamList_sempred(localctx, predIndex); + case 91: return this.declarationList_sempred(localctx, predIndex); default: throw "No predicate with index:" + ruleIndex; @@ -9895,7 +10554,7 @@ CParser.prototype.translationUnit_sempred = function(localctx, predIndex) { } }; -CParser.prototype.declarationList_sempred = function(localctx, predIndex) { +CParser.prototype.macroParamList_sempred = function(localctx, predIndex) { switch(predIndex) { case 49: return this.precpred(this._ctx, 1); @@ -9904,5 +10563,14 @@ CParser.prototype.declarationList_sempred = function(localctx, predIndex) { } }; +CParser.prototype.declarationList_sempred = function(localctx, predIndex) { + switch(predIndex) { + case 50: + return this.precpred(this._ctx, 1); + default: + throw "No predicate with index:" + predIndex; + } +}; + exports.CParser = CParser; diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 333ad632..6feaee5e 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -6,18 +6,28 @@ parser = require '../parser.coffee' antlrHelper = require '../antlr.coffee' -INDENTS = ['compoundStatement'] +INDENTS = ['compoundStatement', 'structDeclarationsBlock'] SKIPS = ['blockItemList', + 'macroParamList', 'compilationUnit', + 'translationUnit', + 'declarationSpecifiers', + 'declarationSpecifier', + 'typeSpecifier', + 'structOrUnionSpecifier', + 'structDeclarationList', 'declarator', 'directDeclarator', 'parameterTypeList', 'parameterList', 'argumentExpressionList', 'initDeclaratorList'] -PARENS = ['expressionStatement', 'primaryExpression'] -SOCKET_TOKENS = ['Identifier', 'StringLiteral', 'Constant'] +PARENS = ['expressionStatement', 'primaryExpression', 'structDeclaration'] +SOCKET_TOKENS = ['Identifier', 'StringLiteral', 'SharedIncludeLiteral', 'Constant'] COLORS_FORWARD = { + 'externalDeclaration': 'control' + 'structDeclaration': 'command' + 'declarationSpecifier': 'control' 'statement': 'command' 'selectionStatement': 'control' 'iterationStatement': 'control' diff --git a/src/treewalk.coffee b/src/treewalk.coffee index ce9b8399..e267db9f 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -165,6 +165,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth prefix: prefix[oldPrefix.length...prefix.length] + classes: rules for child in node.children @mark child, prefix, depth + 2, false From 6475342b6795b7b0ac3f2a582fd191277d562c9e Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 15 Jun 2016 13:41:08 -0400 Subject: [PATCH 114/268] Color comments --- src/languages/c.coffee | 2 ++ src/parser.coffee | 2 +- src/treewalk.coffee | 1 - src/view.coffee | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 6feaee5e..3e9eb7d9 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -37,6 +37,8 @@ COLORS_FORWARD = { 'multiplicativeExpression': 'value' 'declaration': 'command' 'parameterDeclaration': 'command' + 'unaryExpression': 'value' + 'typeName': 'value' } COLORS_BACKWARD = { 'iterationStatement': 'control' diff --git a/src/parser.coffee b/src/parser.coffee index 2dc5d7de..308988fa 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -205,7 +205,7 @@ exports.Parser = class Parser # Construct a handwritten block with the given # text inside constructHandwrittenBlock: (text) -> - block = new model.Block 0, 'blank', helper.ANY_DROP + block = new model.Block 0, 'comment', helper.ANY_DROP socket = new model.Socket '', 0, true socket.setParent block diff --git a/src/treewalk.coffee b/src/treewalk.coffee index e267db9f..491c9a23 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -182,7 +182,6 @@ exports.createTreewalkParser = (parse, config, root) -> for c in context.classes if c in block.classes return helper.ENCOURAGE - console.log block.classes, context.classes return helper.DISCOURAGE # Doesn't yet deal with parens diff --git a/src/view.coffee b/src/view.coffee index b56047fb..6a5c0fad 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -53,6 +53,7 @@ DEFAULT_OPTIONS = ctx: document.createElement('canvas').getContext('2d') colors: error: '#ff0000' + comment: '#c0c0c0' # gray return: '#fff59d' # yellow control: '#ffcc80' # orange value: '#a5d6a7' # green From 39aaa9e9989c202d29b5eb1d849ef77eba7ef9ed Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 15 Jun 2016 14:06:48 -0400 Subject: [PATCH 115/268] Add paren wrapping --- src/controller.coffee | 2 +- src/languages/c.coffee | 8 ++++++++ src/treewalk.coffee | 19 ++++++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 75f52ec8..ad24d166 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -1173,7 +1173,7 @@ Editor::prepareNode = (node, context) -> else trailing = node.getTrailingText() - [leading, trailing] = @session.mode.parens leading, trailing, node.getReader(), + [leading, trailing, classes] = @session.mode.parens leading, trailing, node.getReader(), context?.getReader?() ? null node.setLeadingText leading; node.setTrailingText trailing diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 3e9eb7d9..2917c071 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -53,4 +53,12 @@ config = { INDENTS, SKIPS, PARENS, SOCKET_TOKENS, COLORS_FORWARD, COLORS_BACKWARD } +config.parenRules = { + 'primaryExpression': { + 'expression': (leading, trailing, node, context) -> + leading '(' + leading() + trailing trailing() + ')' + } +} + module.exports = parser.wrapParser antlrHelper.createANTLRParser 'C', config diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 491c9a23..81071fde 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -182,9 +182,26 @@ exports.createTreewalkParser = (parse, config, root) -> for c in context.classes if c in block.classes return helper.ENCOURAGE + + # Check to see if we could paren-wrap this + if config.parenRules? and c of config.parenRules + for m in block.classes + if m of config.parenRules[c] + return helper.ENCOURAGE + return helper.DISCOURAGE # Doesn't yet deal with parens - TreewalkParser.parens = (leading, trailing, node, context) -> + TreewalkParser.parens = (leading, trailing, node, context)-> + return unless context? + # If we already match types, we're fine + for c in context.classes + if c in node.classes + return + + # Otherwise, wrap according to the provided rule + for c in context.classes when c of config.parenRules + for m in node.classes when m of config.parenRules[c] + return config.parenRules[c][m] leading, trailing, node, context return TreewalkParser From 5c367db888e49e89f942a1c4629b2a95123996c9 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 15 Jun 2016 14:18:47 -0400 Subject: [PATCH 116/268] Implement paren rule system and add paren rules for math expressions --- src/languages/c.coffee | 26 +++++++++++++++++++++++--- src/treewalk.coffee | 9 ++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 2917c071..7eb44746 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -53,12 +53,32 @@ config = { INDENTS, SKIPS, PARENS, SOCKET_TOKENS, COLORS_FORWARD, COLORS_BACKWARD } +ADD_PARENS = (leading, trailing, node, context) -> + leading '(' + leading() + trailing trailing() + ')' + config.parenRules = { 'primaryExpression': { - 'expression': (leading, trailing, node, context) -> - leading '(' + leading() - trailing trailing() + ')' + 'expression': ADD_PARENS + 'additiveExpression': ADD_PARENS + 'multiplicativeExpression': ADD_PARENS + 'assignmentExpression': ADD_PARENS + 'postfixExpression': ADD_PARENS } } +# TODO Implement removing parentheses at some point +### +config.unParenWrap = (leading, trailing, node, context) -> + while true + if leading().match(/^\s*\(/)? and trailing().match(/\)\s*/)? + leading leading().replace(/^\s*\(\s*/, '') + trailing trailing().replace(/\s*\)\s*$/, '') + else + break +### + +# DEBUG +config.unParenWrap = null + module.exports = parser.wrapParser antlrHelper.createANTLRParser 'C', config diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 81071fde..bc2d71fa 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -193,7 +193,14 @@ exports.createTreewalkParser = (parse, config, root) -> # Doesn't yet deal with parens TreewalkParser.parens = (leading, trailing, node, context)-> - return unless context? + # If we're moving to null, remove parens (where possible) + unless context? + if config.unParenWrap? + return config.unParenWrap leading, trailing, node, context + else + return + + # If we already match types, we're fine for c in context.classes if c in node.classes From d25659bbdf52d6f9b6160cfcd2304b23461c5e07 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 15 Jun 2016 14:33:34 -0400 Subject: [PATCH 117/268] Add live reparse contexts for Indents --- src/controller.coffee | 6 +++++- src/languages/c.coffee | 21 +++++++++++---------- src/model.coffee | 2 +- src/parser.coffee | 2 +- src/treewalk.coffee | 3 ++- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index ad24d166..b6114338 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2403,7 +2403,11 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> return parent = list.start.parent - context = (list.start.container ? list.start.parent).parseContext + + if parent.type is 'indent' and not list.start.container?.parseContext? + context = parent.parseContext + else + context = (list.start.container ? list.start.parent).parseContext console.log 'REPARSING', list, list.stringify(), list.start.parent, 'WITH', context diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 7eb44746..979de916 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -6,7 +6,10 @@ parser = require '../parser.coffee' antlrHelper = require '../antlr.coffee' -INDENTS = ['compoundStatement', 'structDeclarationsBlock'] +INDENTS = { + 'compoundStatement': 'blockItem', + 'structDeclarationsBlock': 'structDeclaration' +} SKIPS = ['blockItemList', 'macroParamList', 'compilationUnit', @@ -68,15 +71,13 @@ config.parenRules = { } # TODO Implement removing parentheses at some point -### -config.unParenWrap = (leading, trailing, node, context) -> - while true - if leading().match(/^\s*\(/)? and trailing().match(/\)\s*/)? - leading leading().replace(/^\s*\(\s*/, '') - trailing trailing().replace(/\s*\)\s*$/, '') - else - break -### +#config.unParenWrap = (leading, trailing, node, context) -> +# while true +# if leading().match(/^\s*\(/)? and trailing().match(/\)\s*/)? +# leading leading().replace(/^\s*\(\s*/, '') +# trailing trailing().replace(/\s*\)\s*$/, '') +# else +# break # DEBUG config.unParenWrap = null diff --git a/src/model.coffee b/src/model.coffee index 321ee4b1..24cc8c3d 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -1076,7 +1076,7 @@ exports.IndentEndToken = class IndentEndToken extends EndToken serialize: -> "" exports.Indent = class Indent extends Container - constructor: (@emptyString, @prefix = '', @classes = []) -> + constructor: (@emptyString, @prefix = '', @classes = [], @parseContext = null) -> @start = new IndentStartToken this @end = new IndentEndToken this diff --git a/src/parser.coffee b/src/parser.coffee index 308988fa..e81c6ed9 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -130,7 +130,7 @@ exports.Parser = class Parser # prefix: String # } addIndent: (opts) -> - indent = new model.Indent @emptyIndent, opts.prefix, opts.classes + indent = new model.Indent @emptyIndent, opts.prefix, opts.classes, opts.parseContext @addMarkup indent, opts.bounds, opts.depth diff --git a/src/treewalk.coffee b/src/treewalk.coffee index bc2d71fa..c27c9a98 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -41,7 +41,7 @@ exports.createTreewalkParser = (parse, config, root) -> det: (rule) -> - if rule in config.INDENTS then return 'indent' + if rule of config.INDENTS then return 'indent' else if rule in config.SKIPS then return 'skip' else if rule in config.PARENS then return 'parens' else return 'block' @@ -166,6 +166,7 @@ exports.createTreewalkParser = (parse, config, root) -> depth: depth prefix: prefix[oldPrefix.length...prefix.length] classes: rules + parseContext: config.INDENTS[node.type] for child in node.children @mark child, prefix, depth + 2, false From 502bb4745057bd9e755328a252cbd5719a38663d Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 15 Jun 2016 17:12:52 -0400 Subject: [PATCH 118/268] Bug fixes: contexts in cloning Sockets, @options.extraBottomHeight, paste context. Impelementations: color, shape, known functions. --- src/antlr.coffee | 2 ++ src/controller.coffee | 13 ++++---- src/languages/c.coffee | 67 ++++++++++++++++++++++++++++++++++++++++-- src/model.coffee | 4 +-- src/treewalk.coffee | 27 +++++++++++++---- 5 files changed, 98 insertions(+), 15 deletions(-) diff --git a/src/antlr.coffee b/src/antlr.coffee index 0bf67e7f..103a1b6f 100644 --- a/src/antlr.coffee +++ b/src/antlr.coffee @@ -47,6 +47,8 @@ exports.createANTLRParser = (name, config, root) -> result.children = [] result.bounds = getBounds node result.parent = parent + if node.symbol?.text + result.data = {text: node.symbol.text} return result diff --git a/src/controller.coffee b/src/controller.coffee index b6114338..720f957d 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -300,6 +300,10 @@ exports.Editor = class Editor @session = null @sessions = new PairDict [] + @options = { + extraBottomHeight: 10 + } + # Sessions are bound to other ace sessions; # on ace session change Droplet will also change sessions. @aceEditor.on 'changeSession', (e) => @@ -1418,7 +1422,7 @@ hook 'mousemove', 1, (point, event, state) -> # Call expansion() function with no parameter to get the initial value. if 'function' is typeof expansion then expansion = expansion() - if (expansion) then expansion = parseBlock(@session.mode, expansion) + if (expansion) then expansion = parseBlock(@session.mode, expansion, @clickedBlockPaletteEntry.context) @draggingBlock = (expansion or @draggingBlock).clone() # Special @draggingBlock setup for expansion function blocks. @@ -1999,6 +2003,7 @@ Editor::setPalette = (paletteGroups) -> newPaletteBlocks.push block: newBlock expansion: expansion + context: data.context title: data.title id: data.id @@ -2404,13 +2409,11 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> parent = list.start.parent - if parent.type is 'indent' and not list.start.container?.parseContext? + if parent?.type is 'indent' and not list.start.container?.parseContext? context = parent.parseContext else context = (list.start.container ? list.start.parent).parseContext - console.log 'REPARSING', list, list.stringify(), list.start.parent, 'WITH', context - try newList = @session.mode.parse list.stringifyInPlace(),{ wrapAtRoot: parent.type isnt 'socket' @@ -4646,7 +4649,7 @@ hook 'populate', 1, -> str = str.replace /^\n*|\n*$/g, '' try - blocks = @session.mode.parse str + blocks = @session.mode.parse str, {context: @getCursor().parent.parseContext} blocks = new model.List blocks.start.next, blocks.end.prev catch e blocks = null diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 979de916..85516722 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -35,6 +35,7 @@ COLORS_FORWARD = { 'selectionStatement': 'control' 'iterationStatement': 'control' 'functionDefinition': 'control' + 'expressionStatement': 'command' 'expression': 'value' 'additiveExpression': 'value' 'multiplicativeExpression': 'value' @@ -46,14 +47,40 @@ COLORS_FORWARD = { COLORS_BACKWARD = { 'iterationStatement': 'control' 'selectionStatement': 'control' - 'postfixExpression': 'command' 'assignmentExpression': 'command' 'relationalExpression': 'value' 'initDeclarator': 'command' } +SHAPES_FORWARD = { + 'externalDeclaration': 'block-only' + 'structDeclaration': 'block-only' + 'declarationSpecifier': 'block-only' + 'statement': 'block-only' + 'selectionStatement': 'block-only' + 'iterationStatement': 'block-only' + 'functionDefinition': 'block-only' + 'expressionStatement': 'value-only' + 'expression': 'value-only' + 'additiveExpression': 'value-only' + 'multiplicativeExpression': 'value-only' + 'declaration': 'block-only' + 'parameterDeclaration': 'block-only' + 'unaryExpression': 'value-only' + 'typeName': 'value-only' +} +SHAPES_BACKWARD = { + 'equalityExpression': 'value-only' + 'logicalAndExpression': 'value-only' + 'logicalOrExpression': 'value-only' + 'iterationStatement': 'block-only' + 'selectionStatement': 'block-only' + 'assignmentExpression': 'block-only' + 'relationalExpression': 'value-only' + 'initDeclarator': 'block-only' +} config = { - INDENTS, SKIPS, PARENS, SOCKET_TOKENS, COLORS_FORWARD, COLORS_BACKWARD + INDENTS, SKIPS, PARENS, SOCKET_TOKENS, COLORS_FORWARD, COLORS_BACKWARD, SHAPES_FORWARD, SHAPES_BACKWARD } ADD_PARENS = (leading, trailing, node, context) -> @@ -70,6 +97,42 @@ config.parenRules = { } } +config.SHOULD_SOCKET = (opts, node) -> + return true unless node.parent? and node.parent.parent? and node.parent.parent.parent? + # If it is a function call, and we are the first child + if node.parent.type is 'primaryExpression' and + node.parent.parent.type is 'postfixExpression' and + node.parent.parent.parent.type is 'postfixExpression' and + node.parent.parent.parent.children.length in [3, 4] and + node.parent.parent.parent.children[1].type is 'LeftParen' and + (node.parent.parent.parent.children[2].type is 'RightParen' or node.parent.parent.parent.children[3]?.type is 'RightParen') and + node.parent.parent is node.parent.parent.parent.children[0] and + node.data.text of opts.knownFunctions + return false + return true + +config.COLOR_CALLBACK = (opts, node) -> + if node.type is 'postfixExpression' and + node.children.length in [3, 4] and + node.children[1].type is 'LeftParen' and + (node.children[2].type is 'RightParen' or node.children[3]?.type is 'RightParen') and + node.children[0].children[0].type is 'primaryExpression' and + node.children[0].children[0].children[0].type is 'Identifier' and + node.children[0].children[0].children[0].data.text of opts.knownFunctions + return opts.knownFunctions[node.children[0].children[0].children[0].data.text].color + return null + +config.SHAPE_CALLBACK = (opts, node) -> + if node.type is 'postfixExpression' and + node.children.length in [3, 4] and + node.children[1].type is 'LeftParen' and + (node.children[2].type is 'RightParen' or node.children[3]?.type is 'RightParen') and + node.children[0].children[0].type is 'primaryExpression' and + node.children[0].children[0].children[0].type is 'Identifier' and + node.children[0].children[0].children[0].data.text of opts.knownFunctions + return opts.knownFunctions[node.children[0].children[0].children[0].data.text].shape + return null + # TODO Implement removing parentheses at some point #config.unParenWrap = (leading, trailing, node, context) -> # while true diff --git a/src/model.coffee b/src/model.coffee index 24cc8c3d..1319da1a 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -1045,7 +1045,7 @@ exports.Socket = class Socket extends Container isDroppable: -> @start.next is @end or @start.next.type is 'text' - _cloneEmpty: -> new Socket @emptyString, @precedence, @handwritten, @classes, @dropdown + _cloneEmpty: -> new Socket @emptyString, @precedence, @handwritten, @classes, @dropdown, @parseContext _serialize_header: -> " new Indent @emptyString, @prefix, @classes + _cloneEmpty: -> new Indent @emptyString, @prefix, @classes, @parseContext firstChild: -> return @_firstChild() _serialize_header: -> " 'skip': 'mostly-block' })[@detNode(context)] - getColor: (rules) -> + getColor: (node, rules) -> + color = config.COLOR_CALLBACK(@opts, node) + if color? + return color for el, i in rules by -1 if el of config.COLORS_BACKWARD return config.COLORS_BACKWARD[el] @@ -67,6 +70,18 @@ exports.createTreewalkParser = (parse, config, root) -> return config.COLORS_FORWARD[el] return 'violet' + getShape: (node, rules) -> + shape = config.SHAPE_CALLBACK(@opts, node) + if shape? + return shape + for el, i in rules by -1 + if el of config.SHAPES_BACKWARD + return config.SHAPES_BACKWARD[el] + for el, i in rules + if el of config.SHAPES_FORWARD + return config.SHAPES_FORWARD[el] + return 'mostly-block' + mark: (node, prefix, depth, pass, rules, context, wrap) -> unless pass context = node.parent @@ -98,8 +113,8 @@ exports.createTreewalkParser = (parse, config, root) -> @addBlock bounds: bounds depth: depth + 1 - color: @getColor rules - classes: rules.concat(if context? then @getDropType(context) else 'any-drop') + color: @getColor node, rules + classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) parseContext: (if wrap? then wrap.type else rules[0]) when 'parens' @@ -134,8 +149,8 @@ exports.createTreewalkParser = (parse, config, root) -> @addBlock bounds: bounds depth: depth + 1 - color: @getColor rules - classes: rules.concat(if context? then @getDropType(context) else 'any-drop') + color: @getColor node, rules + classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) parseContext: (if wrap? then wrap.type else rules[0]) when 'indent' then if @det(context) is 'block' @@ -171,7 +186,7 @@ exports.createTreewalkParser = (parse, config, root) -> for child in node.children @mark child, prefix, depth + 2, false else if context? and @detNode(context) is 'block' - if @detToken(node) is 'socket' + if @detToken(node) is 'socket' and config.SHOULD_SOCKET(@opts, node) @addSocket bounds: node.bounds depth: depth From b1a05e68164f94ae6aabfccc16b8d889cd52190e Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 15 Jun 2016 18:06:55 -0400 Subject: [PATCH 119/268] Draft of comment-style directives --- antlr/C.g4 | 43 +- antlr/C.tokens | 385 +++-- antlr/CLexer.js | 1195 +++++++------ antlr/CLexer.tokens | 385 +++-- antlr/CListener.js | 63 - antlr/CParser.js | 3595 +++++++++++++++++----------------------- src/languages/c.coffee | 25 + src/treewalk.coffee | 9 +- 8 files changed, 2489 insertions(+), 3211 deletions(-) diff --git a/antlr/C.g4 b/antlr/C.g4 index ac9d1981..b7518eb1 100644 --- a/antlr/C.g4 +++ b/antlr/C.g4 @@ -514,43 +514,9 @@ translationUnit | translationUnit externalDeclaration ; -includeDirective - : '#' 'include' StringLiteral - | '#' 'include' SharedIncludeLiteral - ; - -defineDirective - : defineDirectiveWithParams - | defineDirectiveNoParams - | defineDirectiveNoVal - ; - -defineDirectiveNoVal - : '#' 'define' Identifier - ; - -defineDirectiveNoParams - : '#' 'define' Identifier macroResult - ; - -defineDirectiveWithParams - : '#' 'define' Identifier '(' macroParamList ')' macroResult - ; - -macroResult - : expression - ; - -macroParamList - : Identifier - | macroParamList ',' Identifier - ; - externalDeclaration : functionDefinition | declaration - | includeDirective - | defineDirective | ';' // stray ; ; @@ -904,13 +870,8 @@ SChar | EscapeSequence ; -LineDirective - : '#' Whitespace? DecimalConstant Whitespace? StringLiteral ~[\r\n]* - -> skip - ; - -PragmaDirective - : '#' Whitespace? 'pragma' Whitespace ~[\r\n]* +Directive + : '#' [^\r\n]*? ~[\r\n]* -> skip ; diff --git a/antlr/C.tokens b/antlr/C.tokens index e88e63cc..c5ebf233 100644 --- a/antlr/C.tokens +++ b/antlr/C.tokens @@ -12,109 +12,105 @@ T__10=11 T__11=12 T__12=13 T__13=14 -T__14=15 -T__15=16 -T__16=17 -Auto=18 -Break=19 -Case=20 -Char=21 -Const=22 -Continue=23 -Default=24 -Do=25 -Double=26 -Else=27 -Enum=28 -Extern=29 -Float=30 -For=31 -Goto=32 -If=33 -Inline=34 -Int=35 -Long=36 -Register=37 -Restrict=38 -Return=39 -Short=40 -Signed=41 -Sizeof=42 -Static=43 -Struct=44 -Switch=45 -Typedef=46 -Union=47 -Unsigned=48 -Void=49 -Volatile=50 -While=51 -Alignas=52 -Alignof=53 -Atomic=54 -Bool=55 -Complex=56 -Generic=57 -Imaginary=58 -Noreturn=59 -StaticAssert=60 -ThreadLocal=61 -LeftParen=62 -RightParen=63 -LeftBracket=64 -RightBracket=65 -LeftBrace=66 -RightBrace=67 -Less=68 -LessEqual=69 -Greater=70 -GreaterEqual=71 -LeftShift=72 -RightShift=73 -Plus=74 -PlusPlus=75 -Minus=76 -MinusMinus=77 -Star=78 -Div=79 -Mod=80 -And=81 -Or=82 -AndAnd=83 -OrOr=84 -Caret=85 -Not=86 -Tilde=87 -Question=88 -Colon=89 -Semi=90 -Comma=91 -Assign=92 -StarAssign=93 -DivAssign=94 -ModAssign=95 -PlusAssign=96 -MinusAssign=97 -LeftShiftAssign=98 -RightShiftAssign=99 -AndAssign=100 -XorAssign=101 -OrAssign=102 -Equal=103 -NotEqual=104 -Arrow=105 -Dot=106 -Ellipsis=107 -Identifier=108 -Constant=109 -StringLiteral=110 -SharedIncludeLiteral=111 -LineDirective=112 -PragmaDirective=113 -Whitespace=114 -Newline=115 -BlockComment=116 -LineComment=117 +Auto=15 +Break=16 +Case=17 +Char=18 +Const=19 +Continue=20 +Default=21 +Do=22 +Double=23 +Else=24 +Enum=25 +Extern=26 +Float=27 +For=28 +Goto=29 +If=30 +Inline=31 +Int=32 +Long=33 +Register=34 +Restrict=35 +Return=36 +Short=37 +Signed=38 +Sizeof=39 +Static=40 +Struct=41 +Switch=42 +Typedef=43 +Union=44 +Unsigned=45 +Void=46 +Volatile=47 +While=48 +Alignas=49 +Alignof=50 +Atomic=51 +Bool=52 +Complex=53 +Generic=54 +Imaginary=55 +Noreturn=56 +StaticAssert=57 +ThreadLocal=58 +LeftParen=59 +RightParen=60 +LeftBracket=61 +RightBracket=62 +LeftBrace=63 +RightBrace=64 +Less=65 +LessEqual=66 +Greater=67 +GreaterEqual=68 +LeftShift=69 +RightShift=70 +Plus=71 +PlusPlus=72 +Minus=73 +MinusMinus=74 +Star=75 +Div=76 +Mod=77 +And=78 +Or=79 +AndAnd=80 +OrOr=81 +Caret=82 +Not=83 +Tilde=84 +Question=85 +Colon=86 +Semi=87 +Comma=88 +Assign=89 +StarAssign=90 +DivAssign=91 +ModAssign=92 +PlusAssign=93 +MinusAssign=94 +LeftShiftAssign=95 +RightShiftAssign=96 +AndAssign=97 +XorAssign=98 +OrAssign=99 +Equal=100 +NotEqual=101 +Arrow=102 +Dot=103 +Ellipsis=104 +Identifier=105 +Constant=106 +StringLiteral=107 +SharedIncludeLiteral=108 +Directive=109 +Whitespace=110 +Newline=111 +BlockComment=112 +LineComment=113 '__extension__'=1 '__builtin_va_arg'=2 '__builtin_offsetof'=3 @@ -129,96 +125,93 @@ LineComment=117 '__attribute__'=12 '__asm__'=13 '__volatile__'=14 -'#'=15 -'include'=16 -'define'=17 -'auto'=18 -'break'=19 -'case'=20 -'char'=21 -'const'=22 -'continue'=23 -'default'=24 -'do'=25 -'double'=26 -'else'=27 -'enum'=28 -'extern'=29 -'float'=30 -'for'=31 -'goto'=32 -'if'=33 -'inline'=34 -'int'=35 -'long'=36 -'register'=37 -'restrict'=38 -'return'=39 -'short'=40 -'signed'=41 -'sizeof'=42 -'static'=43 -'struct'=44 -'switch'=45 -'typedef'=46 -'union'=47 -'unsigned'=48 -'void'=49 -'volatile'=50 -'while'=51 -'_Alignas'=52 -'_Alignof'=53 -'_Atomic'=54 -'_Bool'=55 -'_Complex'=56 -'_Generic'=57 -'_Imaginary'=58 -'_Noreturn'=59 -'_Static_assert'=60 -'_Thread_local'=61 -'('=62 -')'=63 -'['=64 -']'=65 -'{'=66 -'}'=67 -'<'=68 -'<='=69 -'>'=70 -'>='=71 -'<<'=72 -'>>'=73 -'+'=74 -'++'=75 -'-'=76 -'--'=77 -'*'=78 -'/'=79 -'%'=80 -'&'=81 -'|'=82 -'&&'=83 -'||'=84 -'^'=85 -'!'=86 -'~'=87 -'?'=88 -':'=89 -';'=90 -','=91 -'='=92 -'*='=93 -'/='=94 -'%='=95 -'+='=96 -'-='=97 -'<<='=98 -'>>='=99 -'&='=100 -'^='=101 -'|='=102 -'=='=103 -'!='=104 -'->'=105 -'.'=106 -'...'=107 +'auto'=15 +'break'=16 +'case'=17 +'char'=18 +'const'=19 +'continue'=20 +'default'=21 +'do'=22 +'double'=23 +'else'=24 +'enum'=25 +'extern'=26 +'float'=27 +'for'=28 +'goto'=29 +'if'=30 +'inline'=31 +'int'=32 +'long'=33 +'register'=34 +'restrict'=35 +'return'=36 +'short'=37 +'signed'=38 +'sizeof'=39 +'static'=40 +'struct'=41 +'switch'=42 +'typedef'=43 +'union'=44 +'unsigned'=45 +'void'=46 +'volatile'=47 +'while'=48 +'_Alignas'=49 +'_Alignof'=50 +'_Atomic'=51 +'_Bool'=52 +'_Complex'=53 +'_Generic'=54 +'_Imaginary'=55 +'_Noreturn'=56 +'_Static_assert'=57 +'_Thread_local'=58 +'('=59 +')'=60 +'['=61 +']'=62 +'{'=63 +'}'=64 +'<'=65 +'<='=66 +'>'=67 +'>='=68 +'<<'=69 +'>>'=70 +'+'=71 +'++'=72 +'-'=73 +'--'=74 +'*'=75 +'/'=76 +'%'=77 +'&'=78 +'|'=79 +'&&'=80 +'||'=81 +'^'=82 +'!'=83 +'~'=84 +'?'=85 +':'=86 +';'=87 +','=88 +'='=89 +'*='=90 +'/='=91 +'%='=92 +'+='=93 +'-='=94 +'<<='=95 +'>>='=96 +'&='=97 +'^='=98 +'|='=99 +'=='=100 +'!='=101 +'->'=102 +'.'=103 +'...'=104 diff --git a/antlr/CLexer.js b/antlr/CLexer.js index 4026948b..1c424e0c 100644 --- a/antlr/CLexer.js +++ b/antlr/CLexer.js @@ -4,7 +4,7 @@ var antlr4 = require('antlr4/index'); var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\2w\u0504\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t", + "\2s\u04d5\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t", "\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20", "\t\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4", "\27\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35", @@ -23,466 +23,445 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e\t\u008e\4\u008f", "\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092\4\u0093\t\u0093", "\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098", - "\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b\4\u009c\t\u009c", - "\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3", - "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4", - "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5", - "\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7", - "\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t", - "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n", - "\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13", - "\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", - "\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17", - "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\21\3", - "\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22", - "\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3", - "\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27", - "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3", - "\31\3\31\3\31\3\31\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33", - "\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3", - "\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3", - "!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%", - "\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3", - "(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+", - "\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3", - ".\3.\3/\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61", - "\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\63\3", - "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64", - "\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3", - "\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\3", - "8\38\38\38\38\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:", - "\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3=\3", - "=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>", - "\3>\3>\3>\3>\3>\3?\3?\3@\3@\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3F\3F\3F\3", - "G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3K\3K\3L\3L\3L\3M\3M\3N\3N\3N\3O\3O", - "\3P\3P\3Q\3Q\3R\3R\3S\3S\3T\3T\3T\3U\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3", - "Z\3Z\3[\3[\3\\\3\\\3]\3]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3a\3a\3a\3b\3b\3", - "b\3c\3c\3c\3c\3d\3d\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3h\3i\3i", - "\3i\3j\3j\3j\3k\3k\3l\3l\3l\3l\3m\3m\3m\7m\u039a\nm\fm\16m\u039d\13", - "m\3n\3n\5n\u03a1\nn\3o\3o\3p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3q\3q\5q\u03b1", - "\nq\3r\3r\3r\3r\3r\3s\3s\3s\5s\u03bb\ns\3t\3t\5t\u03bf\nt\3t\3t\5t\u03c3", - "\nt\3t\3t\5t\u03c7\nt\5t\u03c9\nt\3u\3u\7u\u03cd\nu\fu\16u\u03d0\13", - "u\3v\3v\7v\u03d4\nv\fv\16v\u03d7\13v\3w\3w\6w\u03db\nw\rw\16w\u03dc", - "\3x\3x\3x\3y\3y\3z\3z\3{\3{\3|\3|\5|\u03ea\n|\3|\3|\3|\3|\3|\5|\u03f1", - "\n|\3|\3|\5|\u03f5\n|\5|\u03f7\n|\3}\3}\3~\3~\3\177\3\177\3\177\3\177", - "\5\177\u0401\n\177\3\u0080\3\u0080\5\u0080\u0405\n\u0080\3\u0081\3\u0081", - "\5\u0081\u0409\n\u0081\3\u0081\5\u0081\u040c\n\u0081\3\u0081\3\u0081", - "\3\u0081\5\u0081\u0411\n\u0081\5\u0081\u0413\n\u0081\3\u0082\3\u0082", - "\3\u0082\3\u0082\5\u0082\u0419\n\u0082\3\u0082\3\u0082\3\u0082\3\u0082", - "\5\u0082\u041f\n\u0082\5\u0082\u0421\n\u0082\3\u0083\5\u0083\u0424\n", - "\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\5\u0083\u042b\n\u0083", - "\3\u0084\3\u0084\5\u0084\u042f\n\u0084\3\u0084\3\u0084\3\u0084\5\u0084", - "\u0434\n\u0084\3\u0084\5\u0084\u0437\n\u0084\3\u0085\3\u0085\3\u0086", - "\6\u0086\u043c\n\u0086\r\u0086\16\u0086\u043d\3\u0087\5\u0087\u0441", - "\n\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\5\u0087\u0448\n\u0087", - "\3\u0088\3\u0088\5\u0088\u044c\n\u0088\3\u0088\3\u0088\3\u0088\5\u0088", - "\u0451\n\u0088\3\u0088\5\u0088\u0454\n\u0088\3\u0089\6\u0089\u0457\n", - "\u0089\r\u0089\16\u0089\u0458\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b", - "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b", - "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b", - "\3\u008b\5\u008b\u0473\n\u008b\3\u008c\6\u008c\u0476\n\u008c\r\u008c", - "\16\u008c\u0477\3\u008d\3\u008d\5\u008d\u047c\n\u008d\3\u008e\3\u008e", - "\3\u008e\3\u008e\5\u008e\u0482\n\u008e\3\u008f\3\u008f\3\u008f\3\u0090", - "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090", - "\3\u0090\5\u0090\u0492\n\u0090\3\u0091\3\u0091\3\u0091\3\u0091\6\u0091", - "\u0498\n\u0091\r\u0091\16\u0091\u0499\3\u0092\5\u0092\u049d\n\u0092", - "\3\u0092\3\u0092\5\u0092\u04a1\n\u0092\3\u0092\3\u0092\3\u0093\3\u0093", - "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\5\u0094\u04ac\n\u0094\3\u0095", - "\6\u0095\u04af\n\u0095\r\u0095\16\u0095\u04b0\3\u0096\3\u0096\5\u0096", - "\u04b5\n\u0096\3\u0097\3\u0097\5\u0097\u04b9\n\u0097\3\u0097\3\u0097", - "\5\u0097\u04bd\n\u0097\3\u0097\3\u0097\7\u0097\u04c1\n\u0097\f\u0097", - "\16\u0097\u04c4\13\u0097\3\u0097\3\u0097\3\u0098\3\u0098\5\u0098\u04ca", - "\n\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098", - "\3\u0098\7\u0098\u04d5\n\u0098\f\u0098\16\u0098\u04d8\13\u0098\3\u0098", - "\3\u0098\3\u0099\6\u0099\u04dd\n\u0099\r\u0099\16\u0099\u04de\3\u0099", - "\3\u0099\3\u009a\3\u009a\5\u009a\u04e5\n\u009a\3\u009a\5\u009a\u04e8", - "\n\u009a\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\7\u009b\u04f0", - "\n\u009b\f\u009b\16\u009b\u04f3\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b", - "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u04fe\n\u009c\f\u009c", - "\16\u009c\u0501\13\u009c\3\u009c\3\u009c\3\u04f1\2\u009d\3\3\5\4\7\5", - "\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22", - "#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"", - "C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;", - "u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008f", - "I\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3", - "S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7", - "]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cb", - "g\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db\2\u00dd\2\u00df", - "\2\u00e1\2\u00e3\2\u00e5o\u00e7\2\u00e9\2\u00eb\2\u00ed\2\u00ef\2\u00f1", + "\t\u0098\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3", + "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4", + "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4", + "\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7", + "\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", + "\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n", + "\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3", + "\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", + "\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3", + "\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20", + "\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3", + "\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25", + "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3", + "\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31", + "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3", + "\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36", + "\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3\"", + "\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$", + "\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3", + "\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3", + "+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.", + "\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3", + "\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62", + "\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", + "\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65", + "\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3", + "\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\39\39\39\3", + "9\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;", + "\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3@\3", + "@\3A\3A\3B\3B\3C\3C\3C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3I\3I", + "\3I\3J\3J\3K\3K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3Q\3Q\3Q\3R\3R\3R\3", + "S\3S\3T\3T\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3[\3\\\3\\\3\\", + "\3]\3]\3]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3c\3c\3", + "c\3d\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3i\3i\3i\3i\3j\3j\3j\7j", + "\u0381\nj\fj\16j\u0384\13j\3k\3k\5k\u0388\nk\3l\3l\3m\3m\3n\3n\3n\3", + "n\3n\3n\3n\3n\3n\3n\5n\u0398\nn\3o\3o\3o\3o\3o\3p\3p\3p\5p\u03a2\np", + "\3q\3q\5q\u03a6\nq\3q\3q\5q\u03aa\nq\3q\3q\5q\u03ae\nq\5q\u03b0\nq\3", + "r\3r\7r\u03b4\nr\fr\16r\u03b7\13r\3s\3s\7s\u03bb\ns\fs\16s\u03be\13", + "s\3t\3t\6t\u03c2\nt\rt\16t\u03c3\3u\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\5", + "y\u03d1\ny\3y\3y\3y\3y\3y\5y\u03d8\ny\3y\3y\5y\u03dc\ny\5y\u03de\ny", + "\3z\3z\3{\3{\3|\3|\3|\3|\5|\u03e8\n|\3}\3}\5}\u03ec\n}\3~\3~\5~\u03f0", + "\n~\3~\5~\u03f3\n~\3~\3~\3~\5~\u03f8\n~\5~\u03fa\n~\3\177\3\177\3\177", + "\3\177\5\177\u0400\n\177\3\177\3\177\3\177\3\177\5\177\u0406\n\177\5", + "\177\u0408\n\177\3\u0080\5\u0080\u040b\n\u0080\3\u0080\3\u0080\3\u0080", + "\3\u0080\3\u0080\5\u0080\u0412\n\u0080\3\u0081\3\u0081\5\u0081\u0416", + "\n\u0081\3\u0081\3\u0081\3\u0081\5\u0081\u041b\n\u0081\3\u0081\5\u0081", + "\u041e\n\u0081\3\u0082\3\u0082\3\u0083\6\u0083\u0423\n\u0083\r\u0083", + "\16\u0083\u0424\3\u0084\5\u0084\u0428\n\u0084\3\u0084\3\u0084\3\u0084", + "\3\u0084\3\u0084\5\u0084\u042f\n\u0084\3\u0085\3\u0085\5\u0085\u0433", + "\n\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0438\n\u0085\3\u0085\5\u0085", + "\u043b\n\u0085\3\u0086\6\u0086\u043e\n\u0086\r\u0086\16\u0086\u043f", + "\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088", + "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088", + "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u045a\n\u0088", + "\3\u0089\6\u0089\u045d\n\u0089\r\u0089\16\u0089\u045e\3\u008a\3\u008a", + "\5\u008a\u0463\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0469", + "\n\u008b\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d", + "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0479\n\u008d", + "\3\u008e\3\u008e\3\u008e\3\u008e\6\u008e\u047f\n\u008e\r\u008e\16\u008e", + "\u0480\3\u008f\5\u008f\u0484\n\u008f\3\u008f\3\u008f\5\u008f\u0488\n", + "\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091", + "\3\u0091\5\u0091\u0493\n\u0091\3\u0092\6\u0092\u0496\n\u0092\r\u0092", + "\16\u0092\u0497\3\u0093\3\u0093\5\u0093\u049c\n\u0093\3\u0094\3\u0094", + "\7\u0094\u04a0\n\u0094\f\u0094\16\u0094\u04a3\13\u0094\3\u0094\7\u0094", + "\u04a6\n\u0094\f\u0094\16\u0094\u04a9\13\u0094\3\u0094\3\u0094\3\u0095", + "\6\u0095\u04ae\n\u0095\r\u0095\16\u0095\u04af\3\u0095\3\u0095\3\u0096", + "\3\u0096\5\u0096\u04b6\n\u0096\3\u0096\5\u0096\u04b9\n\u0096\3\u0096", + "\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\7\u0097\u04c1\n\u0097\f\u0097", + "\16\u0097\u04c4\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098", + "\3\u0098\3\u0098\3\u0098\7\u0098\u04cf\n\u0098\f\u0098\16\u0098\u04d2", + "\13\u0098\3\u0098\3\u0098\4\u04a1\u04c2\2\u0099\3\3\5\4\7\5\t\6\13\7", + "\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'", + "\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K", + "\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}", + "@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091", + "J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5", + "T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9", + "^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cd", + "h\u00cfi\u00d1j\u00d3k\u00d5\2\u00d7\2\u00d9\2\u00db\2\u00dd\2\u00df", + "l\u00e1\2\u00e3\2\u00e5\2\u00e7\2\u00e9\2\u00eb\2\u00ed\2\u00ef\2\u00f1", "\2\u00f3\2\u00f5\2\u00f7\2\u00f9\2\u00fb\2\u00fd\2\u00ff\2\u0101\2\u0103", "\2\u0105\2\u0107\2\u0109\2\u010b\2\u010d\2\u010f\2\u0111\2\u0113\2\u0115", - "\2\u0117\2\u0119\2\u011b\2\u011d\2\u011f\2\u0121\2\u0123p\u0125q\u0127", - "\2\u0129\2\u012b\2\u012dr\u012fs\u0131t\u0133u\u0135v\u0137w\3\2\22", - "\5\2C\\aac|\3\2\62;\4\2ZZzz\3\2\63;\3\2\629\5\2\62;CHch\4\2WWww\4\2", - "NNnn\4\2--//\6\2HHNNhhnn\6\2\f\f\17\17))^^\f\2$$))AA^^cdhhppttvvxx\5", - "\2NNWWww\6\2\f\f\17\17$$^^\4\2\f\f\17\17\4\2\13\13\"\"\u0520\2\3\3\2", - "\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2", - "\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31", - "\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2", - "\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2", - "\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2", - ";\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G", - "\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3", - "\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2", - "\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2", - "\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2", - "\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083", - "\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2", - "\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2", - "\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d", - "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2", - "\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2", - "\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7", - "\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2", - "\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2", - "\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1", - "\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2", - "\2\2\2\u00e5\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u012d\3\2\2\2", - "\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137", - "\3\2\2\2\3\u0139\3\2\2\2\5\u0147\3\2\2\2\7\u0158\3\2\2\2\t\u016b\3\2", - "\2\2\13\u0172\3\2\2\2\r\u017a\3\2\2\2\17\u0182\3\2\2\2\21\u018d\3\2", - "\2\2\23\u0198\3\2\2\2\25\u01a2\3\2\2\2\27\u01ad\3\2\2\2\31\u01b3\3\2", - "\2\2\33\u01c1\3\2\2\2\35\u01c9\3\2\2\2\37\u01d6\3\2\2\2!\u01d8\3\2\2", - "\2#\u01e0\3\2\2\2%\u01e7\3\2\2\2\'\u01ec\3\2\2\2)\u01f2\3\2\2\2+\u01f7", - "\3\2\2\2-\u01fc\3\2\2\2/\u0202\3\2\2\2\61\u020b\3\2\2\2\63\u0213\3\2", - "\2\2\65\u0216\3\2\2\2\67\u021d\3\2\2\29\u0222\3\2\2\2;\u0227\3\2\2\2", - "=\u022e\3\2\2\2?\u0234\3\2\2\2A\u0238\3\2\2\2C\u023d\3\2\2\2E\u0240", - "\3\2\2\2G\u0247\3\2\2\2I\u024b\3\2\2\2K\u0250\3\2\2\2M\u0259\3\2\2\2", - "O\u0262\3\2\2\2Q\u0269\3\2\2\2S\u026f\3\2\2\2U\u0276\3\2\2\2W\u027d", - "\3\2\2\2Y\u0284\3\2\2\2[\u028b\3\2\2\2]\u0292\3\2\2\2_\u029a\3\2\2\2", - "a\u02a0\3\2\2\2c\u02a9\3\2\2\2e\u02ae\3\2\2\2g\u02b7\3\2\2\2i\u02bd", - "\3\2\2\2k\u02c6\3\2\2\2m\u02cf\3\2\2\2o\u02d7\3\2\2\2q\u02dd\3\2\2\2", - "s\u02e6\3\2\2\2u\u02ef\3\2\2\2w\u02fa\3\2\2\2y\u0304\3\2\2\2{\u0313", - "\3\2\2\2}\u0321\3\2\2\2\177\u0323\3\2\2\2\u0081\u0325\3\2\2\2\u0083", - "\u0327\3\2\2\2\u0085\u0329\3\2\2\2\u0087\u032b\3\2\2\2\u0089\u032d\3", - "\2\2\2\u008b\u032f\3\2\2\2\u008d\u0332\3\2\2\2\u008f\u0334\3\2\2\2\u0091", - "\u0337\3\2\2\2\u0093\u033a\3\2\2\2\u0095\u033d\3\2\2\2\u0097\u033f\3", - "\2\2\2\u0099\u0342\3\2\2\2\u009b\u0344\3\2\2\2\u009d\u0347\3\2\2\2\u009f", - "\u0349\3\2\2\2\u00a1\u034b\3\2\2\2\u00a3\u034d\3\2\2\2\u00a5\u034f\3", - "\2\2\2\u00a7\u0351\3\2\2\2\u00a9\u0354\3\2\2\2\u00ab\u0357\3\2\2\2\u00ad", - "\u0359\3\2\2\2\u00af\u035b\3\2\2\2\u00b1\u035d\3\2\2\2\u00b3\u035f\3", - "\2\2\2\u00b5\u0361\3\2\2\2\u00b7\u0363\3\2\2\2\u00b9\u0365\3\2\2\2\u00bb", - "\u0367\3\2\2\2\u00bd\u036a\3\2\2\2\u00bf\u036d\3\2\2\2\u00c1\u0370\3", - "\2\2\2\u00c3\u0373\3\2\2\2\u00c5\u0376\3\2\2\2\u00c7\u037a\3\2\2\2\u00c9", - "\u037e\3\2\2\2\u00cb\u0381\3\2\2\2\u00cd\u0384\3\2\2\2\u00cf\u0387\3", - "\2\2\2\u00d1\u038a\3\2\2\2\u00d3\u038d\3\2\2\2\u00d5\u0390\3\2\2\2\u00d7", - "\u0392\3\2\2\2\u00d9\u0396\3\2\2\2\u00db\u03a0\3\2\2\2\u00dd\u03a2\3", - "\2\2\2\u00df\u03a4\3\2\2\2\u00e1\u03b0\3\2\2\2\u00e3\u03b2\3\2\2\2\u00e5", - "\u03ba\3\2\2\2\u00e7\u03c8\3\2\2\2\u00e9\u03ca\3\2\2\2\u00eb\u03d1\3", - "\2\2\2\u00ed\u03d8\3\2\2\2\u00ef\u03de\3\2\2\2\u00f1\u03e1\3\2\2\2\u00f3", - "\u03e3\3\2\2\2\u00f5\u03e5\3\2\2\2\u00f7\u03f6\3\2\2\2\u00f9\u03f8\3", - "\2\2\2\u00fb\u03fa\3\2\2\2\u00fd\u0400\3\2\2\2\u00ff\u0404\3\2\2\2\u0101", - "\u0412\3\2\2\2\u0103\u0420\3\2\2\2\u0105\u042a\3\2\2\2\u0107\u0436\3", - "\2\2\2\u0109\u0438\3\2\2\2\u010b\u043b\3\2\2\2\u010d\u0447\3\2\2\2\u010f", - "\u0453\3\2\2\2\u0111\u0456\3\2\2\2\u0113\u045a\3\2\2\2\u0115\u0472\3", - "\2\2\2\u0117\u0475\3\2\2\2\u0119\u047b\3\2\2\2\u011b\u0481\3\2\2\2\u011d", - "\u0483\3\2\2\2\u011f\u0491\3\2\2\2\u0121\u0493\3\2\2\2\u0123\u049c\3", - "\2\2\2\u0125\u04a4\3\2\2\2\u0127\u04ab\3\2\2\2\u0129\u04ae\3\2\2\2\u012b", - "\u04b4\3\2\2\2\u012d\u04b6\3\2\2\2\u012f\u04c7\3\2\2\2\u0131\u04dc\3", - "\2\2\2\u0133\u04e7\3\2\2\2\u0135\u04eb\3\2\2\2\u0137\u04f9\3\2\2\2\u0139", - "\u013a\7a\2\2\u013a\u013b\7a\2\2\u013b\u013c\7g\2\2\u013c\u013d\7z\2", - "\2\u013d\u013e\7v\2\2\u013e\u013f\7g\2\2\u013f\u0140\7p\2\2\u0140\u0141", - "\7u\2\2\u0141\u0142\7k\2\2\u0142\u0143\7q\2\2\u0143\u0144\7p\2\2\u0144", - "\u0145\7a\2\2\u0145\u0146\7a\2\2\u0146\4\3\2\2\2\u0147\u0148\7a\2\2", - "\u0148\u0149\7a\2\2\u0149\u014a\7d\2\2\u014a\u014b\7w\2\2\u014b\u014c", - "\7k\2\2\u014c\u014d\7n\2\2\u014d\u014e\7v\2\2\u014e\u014f\7k\2\2\u014f", - "\u0150\7p\2\2\u0150\u0151\7a\2\2\u0151\u0152\7x\2\2\u0152\u0153\7c\2", - "\2\u0153\u0154\7a\2\2\u0154\u0155\7c\2\2\u0155\u0156\7t\2\2\u0156\u0157", - "\7i\2\2\u0157\6\3\2\2\2\u0158\u0159\7a\2\2\u0159\u015a\7a\2\2\u015a", - "\u015b\7d\2\2\u015b\u015c\7w\2\2\u015c\u015d\7k\2\2\u015d\u015e\7n\2", - "\2\u015e\u015f\7v\2\2\u015f\u0160\7k\2\2\u0160\u0161\7p\2\2\u0161\u0162", - "\7a\2\2\u0162\u0163\7q\2\2\u0163\u0164\7h\2\2\u0164\u0165\7h\2\2\u0165", - "\u0166\7u\2\2\u0166\u0167\7g\2\2\u0167\u0168\7v\2\2\u0168\u0169\7q\2", - "\2\u0169\u016a\7h\2\2\u016a\b\3\2\2\2\u016b\u016c\7a\2\2\u016c\u016d", - "\7a\2\2\u016d\u016e\7o\2\2\u016e\u016f\7\63\2\2\u016f\u0170\7\64\2\2", - "\u0170\u0171\7:\2\2\u0171\n\3\2\2\2\u0172\u0173\7a\2\2\u0173\u0174\7", - "a\2\2\u0174\u0175\7o\2\2\u0175\u0176\7\63\2\2\u0176\u0177\7\64\2\2\u0177", - "\u0178\7:\2\2\u0178\u0179\7f\2\2\u0179\f\3\2\2\2\u017a\u017b\7a\2\2", - "\u017b\u017c\7a\2\2\u017c\u017d\7o\2\2\u017d\u017e\7\63\2\2\u017e\u017f", - "\7\64\2\2\u017f\u0180\7:\2\2\u0180\u0181\7k\2\2\u0181\16\3\2\2\2\u0182", - "\u0183\7a\2\2\u0183\u0184\7a\2\2\u0184\u0185\7v\2\2\u0185\u0186\7{\2", - "\2\u0186\u0187\7r\2\2\u0187\u0188\7g\2\2\u0188\u0189\7q\2\2\u0189\u018a", - "\7h\2\2\u018a\u018b\7a\2\2\u018b\u018c\7a\2\2\u018c\20\3\2\2\2\u018d", - "\u018e\7a\2\2\u018e\u018f\7a\2\2\u018f\u0190\7k\2\2\u0190\u0191\7p\2", - "\2\u0191\u0192\7n\2\2\u0192\u0193\7k\2\2\u0193\u0194\7p\2\2\u0194\u0195", - "\7g\2\2\u0195\u0196\7a\2\2\u0196\u0197\7a\2\2\u0197\22\3\2\2\2\u0198", - "\u0199\7a\2\2\u0199\u019a\7a\2\2\u019a\u019b\7u\2\2\u019b\u019c\7v\2", - "\2\u019c\u019d\7f\2\2\u019d\u019e\7e\2\2\u019e\u019f\7c\2\2\u019f\u01a0", - "\7n\2\2\u01a0\u01a1\7n\2\2\u01a1\24\3\2\2\2\u01a2\u01a3\7a\2\2\u01a3", - "\u01a4\7a\2\2\u01a4\u01a5\7f\2\2\u01a5\u01a6\7g\2\2\u01a6\u01a7\7e\2", - "\2\u01a7\u01a8\7n\2\2\u01a8\u01a9\7u\2\2\u01a9\u01aa\7r\2\2\u01aa\u01ab", - "\7g\2\2\u01ab\u01ac\7e\2\2\u01ac\26\3\2\2\2\u01ad\u01ae\7a\2\2\u01ae", - "\u01af\7a\2\2\u01af\u01b0\7c\2\2\u01b0\u01b1\7u\2\2\u01b1\u01b2\7o\2", - "\2\u01b2\30\3\2\2\2\u01b3\u01b4\7a\2\2\u01b4\u01b5\7a\2\2\u01b5\u01b6", - "\7c\2\2\u01b6\u01b7\7v\2\2\u01b7\u01b8\7v\2\2\u01b8\u01b9\7t\2\2\u01b9", - "\u01ba\7k\2\2\u01ba\u01bb\7d\2\2\u01bb\u01bc\7w\2\2\u01bc\u01bd\7v\2", - "\2\u01bd\u01be\7g\2\2\u01be\u01bf\7a\2\2\u01bf\u01c0\7a\2\2\u01c0\32", - "\3\2\2\2\u01c1\u01c2\7a\2\2\u01c2\u01c3\7a\2\2\u01c3\u01c4\7c\2\2\u01c4", - "\u01c5\7u\2\2\u01c5\u01c6\7o\2\2\u01c6\u01c7\7a\2\2\u01c7\u01c8\7a\2", - "\2\u01c8\34\3\2\2\2\u01c9\u01ca\7a\2\2\u01ca\u01cb\7a\2\2\u01cb\u01cc", - "\7x\2\2\u01cc\u01cd\7q\2\2\u01cd\u01ce\7n\2\2\u01ce\u01cf\7c\2\2\u01cf", - "\u01d0\7v\2\2\u01d0\u01d1\7k\2\2\u01d1\u01d2\7n\2\2\u01d2\u01d3\7g\2", - "\2\u01d3\u01d4\7a\2\2\u01d4\u01d5\7a\2\2\u01d5\36\3\2\2\2\u01d6\u01d7", - "\7%\2\2\u01d7 \3\2\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7p\2\2\u01da\u01db", - "\7e\2\2\u01db\u01dc\7n\2\2\u01dc\u01dd\7w\2\2\u01dd\u01de\7f\2\2\u01de", - "\u01df\7g\2\2\u01df\"\3\2\2\2\u01e0\u01e1\7f\2\2\u01e1\u01e2\7g\2\2", - "\u01e2\u01e3\7h\2\2\u01e3\u01e4\7k\2\2\u01e4\u01e5\7p\2\2\u01e5\u01e6", - "\7g\2\2\u01e6$\3\2\2\2\u01e7\u01e8\7c\2\2\u01e8\u01e9\7w\2\2\u01e9\u01ea", - "\7v\2\2\u01ea\u01eb\7q\2\2\u01eb&\3\2\2\2\u01ec\u01ed\7d\2\2\u01ed\u01ee", - "\7t\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7m\2\2\u01f1", - "(\3\2\2\2\u01f2\u01f3\7e\2\2\u01f3\u01f4\7c\2\2\u01f4\u01f5\7u\2\2\u01f5", - "\u01f6\7g\2\2\u01f6*\3\2\2\2\u01f7\u01f8\7e\2\2\u01f8\u01f9\7j\2\2\u01f9", - "\u01fa\7c\2\2\u01fa\u01fb\7t\2\2\u01fb,\3\2\2\2\u01fc\u01fd\7e\2\2\u01fd", - "\u01fe\7q\2\2\u01fe\u01ff\7p\2\2\u01ff\u0200\7u\2\2\u0200\u0201\7v\2", - "\2\u0201.\3\2\2\2\u0202\u0203\7e\2\2\u0203\u0204\7q\2\2\u0204\u0205", - "\7p\2\2\u0205\u0206\7v\2\2\u0206\u0207\7k\2\2\u0207\u0208\7p\2\2\u0208", - "\u0209\7w\2\2\u0209\u020a\7g\2\2\u020a\60\3\2\2\2\u020b\u020c\7f\2\2", - "\u020c\u020d\7g\2\2\u020d\u020e\7h\2\2\u020e\u020f\7c\2\2\u020f\u0210", - "\7w\2\2\u0210\u0211\7n\2\2\u0211\u0212\7v\2\2\u0212\62\3\2\2\2\u0213", - "\u0214\7f\2\2\u0214\u0215\7q\2\2\u0215\64\3\2\2\2\u0216\u0217\7f\2\2", - "\u0217\u0218\7q\2\2\u0218\u0219\7w\2\2\u0219\u021a\7d\2\2\u021a\u021b", - "\7n\2\2\u021b\u021c\7g\2\2\u021c\66\3\2\2\2\u021d\u021e\7g\2\2\u021e", - "\u021f\7n\2\2\u021f\u0220\7u\2\2\u0220\u0221\7g\2\2\u02218\3\2\2\2\u0222", - "\u0223\7g\2\2\u0223\u0224\7p\2\2\u0224\u0225\7w\2\2\u0225\u0226\7o\2", - "\2\u0226:\3\2\2\2\u0227\u0228\7g\2\2\u0228\u0229\7z\2\2\u0229\u022a", - "\7v\2\2\u022a\u022b\7g\2\2\u022b\u022c\7t\2\2\u022c\u022d\7p\2\2\u022d", - "<\3\2\2\2\u022e\u022f\7h\2\2\u022f\u0230\7n\2\2\u0230\u0231\7q\2\2\u0231", - "\u0232\7c\2\2\u0232\u0233\7v\2\2\u0233>\3\2\2\2\u0234\u0235\7h\2\2\u0235", - "\u0236\7q\2\2\u0236\u0237\7t\2\2\u0237@\3\2\2\2\u0238\u0239\7i\2\2\u0239", - "\u023a\7q\2\2\u023a\u023b\7v\2\2\u023b\u023c\7q\2\2\u023cB\3\2\2\2\u023d", - "\u023e\7k\2\2\u023e\u023f\7h\2\2\u023fD\3\2\2\2\u0240\u0241\7k\2\2\u0241", - "\u0242\7p\2\2\u0242\u0243\7n\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2", - "\2\u0245\u0246\7g\2\2\u0246F\3\2\2\2\u0247\u0248\7k\2\2\u0248\u0249", - "\7p\2\2\u0249\u024a\7v\2\2\u024aH\3\2\2\2\u024b\u024c\7n\2\2\u024c\u024d", - "\7q\2\2\u024d\u024e\7p\2\2\u024e\u024f\7i\2\2\u024fJ\3\2\2\2\u0250\u0251", - "\7t\2\2\u0251\u0252\7g\2\2\u0252\u0253\7i\2\2\u0253\u0254\7k\2\2\u0254", - "\u0255\7u\2\2\u0255\u0256\7v\2\2\u0256\u0257\7g\2\2\u0257\u0258\7t\2", - "\2\u0258L\3\2\2\2\u0259\u025a\7t\2\2\u025a\u025b\7g\2\2\u025b\u025c", - "\7u\2\2\u025c\u025d\7v\2\2\u025d\u025e\7t\2\2\u025e\u025f\7k\2\2\u025f", - "\u0260\7e\2\2\u0260\u0261\7v\2\2\u0261N\3\2\2\2\u0262\u0263\7t\2\2\u0263", - "\u0264\7g\2\2\u0264\u0265\7v\2\2\u0265\u0266\7w\2\2\u0266\u0267\7t\2", - "\2\u0267\u0268\7p\2\2\u0268P\3\2\2\2\u0269\u026a\7u\2\2\u026a\u026b", - "\7j\2\2\u026b\u026c\7q\2\2\u026c\u026d\7t\2\2\u026d\u026e\7v\2\2\u026e", - "R\3\2\2\2\u026f\u0270\7u\2\2\u0270\u0271\7k\2\2\u0271\u0272\7i\2\2\u0272", - "\u0273\7p\2\2\u0273\u0274\7g\2\2\u0274\u0275\7f\2\2\u0275T\3\2\2\2\u0276", - "\u0277\7u\2\2\u0277\u0278\7k\2\2\u0278\u0279\7|\2\2\u0279\u027a\7g\2", - "\2\u027a\u027b\7q\2\2\u027b\u027c\7h\2\2\u027cV\3\2\2\2\u027d\u027e", - "\7u\2\2\u027e\u027f\7v\2\2\u027f\u0280\7c\2\2\u0280\u0281\7v\2\2\u0281", - "\u0282\7k\2\2\u0282\u0283\7e\2\2\u0283X\3\2\2\2\u0284\u0285\7u\2\2\u0285", - "\u0286\7v\2\2\u0286\u0287\7t\2\2\u0287\u0288\7w\2\2\u0288\u0289\7e\2", - "\2\u0289\u028a\7v\2\2\u028aZ\3\2\2\2\u028b\u028c\7u\2\2\u028c\u028d", - "\7y\2\2\u028d\u028e\7k\2\2\u028e\u028f\7v\2\2\u028f\u0290\7e\2\2\u0290", - "\u0291\7j\2\2\u0291\\\3\2\2\2\u0292\u0293\7v\2\2\u0293\u0294\7{\2\2", - "\u0294\u0295\7r\2\2\u0295\u0296\7g\2\2\u0296\u0297\7f\2\2\u0297\u0298", - "\7g\2\2\u0298\u0299\7h\2\2\u0299^\3\2\2\2\u029a\u029b\7w\2\2\u029b\u029c", - "\7p\2\2\u029c\u029d\7k\2\2\u029d\u029e\7q\2\2\u029e\u029f\7p\2\2\u029f", - "`\3\2\2\2\u02a0\u02a1\7w\2\2\u02a1\u02a2\7p\2\2\u02a2\u02a3\7u\2\2\u02a3", - "\u02a4\7k\2\2\u02a4\u02a5\7i\2\2\u02a5\u02a6\7p\2\2\u02a6\u02a7\7g\2", - "\2\u02a7\u02a8\7f\2\2\u02a8b\3\2\2\2\u02a9\u02aa\7x\2\2\u02aa\u02ab", - "\7q\2\2\u02ab\u02ac\7k\2\2\u02ac\u02ad\7f\2\2\u02add\3\2\2\2\u02ae\u02af", - "\7x\2\2\u02af\u02b0\7q\2\2\u02b0\u02b1\7n\2\2\u02b1\u02b2\7c\2\2\u02b2", - "\u02b3\7v\2\2\u02b3\u02b4\7k\2\2\u02b4\u02b5\7n\2\2\u02b5\u02b6\7g\2", - "\2\u02b6f\3\2\2\2\u02b7\u02b8\7y\2\2\u02b8\u02b9\7j\2\2\u02b9\u02ba", - "\7k\2\2\u02ba\u02bb\7n\2\2\u02bb\u02bc\7g\2\2\u02bch\3\2\2\2\u02bd\u02be", - "\7a\2\2\u02be\u02bf\7C\2\2\u02bf\u02c0\7n\2\2\u02c0\u02c1\7k\2\2\u02c1", - "\u02c2\7i\2\2\u02c2\u02c3\7p\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7u\2", - "\2\u02c5j\3\2\2\2\u02c6\u02c7\7a\2\2\u02c7\u02c8\7C\2\2\u02c8\u02c9", - "\7n\2\2\u02c9\u02ca\7k\2\2\u02ca\u02cb\7i\2\2\u02cb\u02cc\7p\2\2\u02cc", - "\u02cd\7q\2\2\u02cd\u02ce\7h\2\2\u02cel\3\2\2\2\u02cf\u02d0\7a\2\2\u02d0", - "\u02d1\7C\2\2\u02d1\u02d2\7v\2\2\u02d2\u02d3\7q\2\2\u02d3\u02d4\7o\2", - "\2\u02d4\u02d5\7k\2\2\u02d5\u02d6\7e\2\2\u02d6n\3\2\2\2\u02d7\u02d8", - "\7a\2\2\u02d8\u02d9\7D\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7q\2\2\u02db", - "\u02dc\7n\2\2\u02dcp\3\2\2\2\u02dd\u02de\7a\2\2\u02de\u02df\7E\2\2\u02df", - "\u02e0\7q\2\2\u02e0\u02e1\7o\2\2\u02e1\u02e2\7r\2\2\u02e2\u02e3\7n\2", - "\2\u02e3\u02e4\7g\2\2\u02e4\u02e5\7z\2\2\u02e5r\3\2\2\2\u02e6\u02e7", - "\7a\2\2\u02e7\u02e8\7I\2\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7p\2\2\u02ea", - "\u02eb\7g\2\2\u02eb\u02ec\7t\2\2\u02ec\u02ed\7k\2\2\u02ed\u02ee\7e\2", - "\2\u02eet\3\2\2\2\u02ef\u02f0\7a\2\2\u02f0\u02f1\7K\2\2\u02f1\u02f2", - "\7o\2\2\u02f2\u02f3\7c\2\2\u02f3\u02f4\7i\2\2\u02f4\u02f5\7k\2\2\u02f5", - "\u02f6\7p\2\2\u02f6\u02f7\7c\2\2\u02f7\u02f8\7t\2\2\u02f8\u02f9\7{\2", - "\2\u02f9v\3\2\2\2\u02fa\u02fb\7a\2\2\u02fb\u02fc\7P\2\2\u02fc\u02fd", - "\7q\2\2\u02fd\u02fe\7t\2\2\u02fe\u02ff\7g\2\2\u02ff\u0300\7v\2\2\u0300", - "\u0301\7w\2\2\u0301\u0302\7t\2\2\u0302\u0303\7p\2\2\u0303x\3\2\2\2\u0304", - "\u0305\7a\2\2\u0305\u0306\7U\2\2\u0306\u0307\7v\2\2\u0307\u0308\7c\2", - "\2\u0308\u0309\7v\2\2\u0309\u030a\7k\2\2\u030a\u030b\7e\2\2\u030b\u030c", - "\7a\2\2\u030c\u030d\7c\2\2\u030d\u030e\7u\2\2\u030e\u030f\7u\2\2\u030f", - "\u0310\7g\2\2\u0310\u0311\7t\2\2\u0311\u0312\7v\2\2\u0312z\3\2\2\2\u0313", - "\u0314\7a\2\2\u0314\u0315\7V\2\2\u0315\u0316\7j\2\2\u0316\u0317\7t\2", - "\2\u0317\u0318\7g\2\2\u0318\u0319\7c\2\2\u0319\u031a\7f\2\2\u031a\u031b", - "\7a\2\2\u031b\u031c\7n\2\2\u031c\u031d\7q\2\2\u031d\u031e\7e\2\2\u031e", - "\u031f\7c\2\2\u031f\u0320\7n\2\2\u0320|\3\2\2\2\u0321\u0322\7*\2\2\u0322", - "~\3\2\2\2\u0323\u0324\7+\2\2\u0324\u0080\3\2\2\2\u0325\u0326\7]\2\2", - "\u0326\u0082\3\2\2\2\u0327\u0328\7_\2\2\u0328\u0084\3\2\2\2\u0329\u032a", - "\7}\2\2\u032a\u0086\3\2\2\2\u032b\u032c\7\177\2\2\u032c\u0088\3\2\2", - "\2\u032d\u032e\7>\2\2\u032e\u008a\3\2\2\2\u032f\u0330\7>\2\2\u0330\u0331", - "\7?\2\2\u0331\u008c\3\2\2\2\u0332\u0333\7@\2\2\u0333\u008e\3\2\2\2\u0334", - "\u0335\7@\2\2\u0335\u0336\7?\2\2\u0336\u0090\3\2\2\2\u0337\u0338\7>", - "\2\2\u0338\u0339\7>\2\2\u0339\u0092\3\2\2\2\u033a\u033b\7@\2\2\u033b", - "\u033c\7@\2\2\u033c\u0094\3\2\2\2\u033d\u033e\7-\2\2\u033e\u0096\3\2", - "\2\2\u033f\u0340\7-\2\2\u0340\u0341\7-\2\2\u0341\u0098\3\2\2\2\u0342", - "\u0343\7/\2\2\u0343\u009a\3\2\2\2\u0344\u0345\7/\2\2\u0345\u0346\7/", - "\2\2\u0346\u009c\3\2\2\2\u0347\u0348\7,\2\2\u0348\u009e\3\2\2\2\u0349", - "\u034a\7\61\2\2\u034a\u00a0\3\2\2\2\u034b\u034c\7\'\2\2\u034c\u00a2", - "\3\2\2\2\u034d\u034e\7(\2\2\u034e\u00a4\3\2\2\2\u034f\u0350\7~\2\2\u0350", - "\u00a6\3\2\2\2\u0351\u0352\7(\2\2\u0352\u0353\7(\2\2\u0353\u00a8\3\2", - "\2\2\u0354\u0355\7~\2\2\u0355\u0356\7~\2\2\u0356\u00aa\3\2\2\2\u0357", - "\u0358\7`\2\2\u0358\u00ac\3\2\2\2\u0359\u035a\7#\2\2\u035a\u00ae\3\2", - "\2\2\u035b\u035c\7\u0080\2\2\u035c\u00b0\3\2\2\2\u035d\u035e\7A\2\2", - "\u035e\u00b2\3\2\2\2\u035f\u0360\7<\2\2\u0360\u00b4\3\2\2\2\u0361\u0362", - "\7=\2\2\u0362\u00b6\3\2\2\2\u0363\u0364\7.\2\2\u0364\u00b8\3\2\2\2\u0365", - "\u0366\7?\2\2\u0366\u00ba\3\2\2\2\u0367\u0368\7,\2\2\u0368\u0369\7?", - "\2\2\u0369\u00bc\3\2\2\2\u036a\u036b\7\61\2\2\u036b\u036c\7?\2\2\u036c", - "\u00be\3\2\2\2\u036d\u036e\7\'\2\2\u036e\u036f\7?\2\2\u036f\u00c0\3", - "\2\2\2\u0370\u0371\7-\2\2\u0371\u0372\7?\2\2\u0372\u00c2\3\2\2\2\u0373", - "\u0374\7/\2\2\u0374\u0375\7?\2\2\u0375\u00c4\3\2\2\2\u0376\u0377\7>", - "\2\2\u0377\u0378\7>\2\2\u0378\u0379\7?\2\2\u0379\u00c6\3\2\2\2\u037a", - "\u037b\7@\2\2\u037b\u037c\7@\2\2\u037c\u037d\7?\2\2\u037d\u00c8\3\2", - "\2\2\u037e\u037f\7(\2\2\u037f\u0380\7?\2\2\u0380\u00ca\3\2\2\2\u0381", - "\u0382\7`\2\2\u0382\u0383\7?\2\2\u0383\u00cc\3\2\2\2\u0384\u0385\7~", - "\2\2\u0385\u0386\7?\2\2\u0386\u00ce\3\2\2\2\u0387\u0388\7?\2\2\u0388", - "\u0389\7?\2\2\u0389\u00d0\3\2\2\2\u038a\u038b\7#\2\2\u038b\u038c\7?", - "\2\2\u038c\u00d2\3\2\2\2\u038d\u038e\7/\2\2\u038e\u038f\7@\2\2\u038f", - "\u00d4\3\2\2\2\u0390\u0391\7\60\2\2\u0391\u00d6\3\2\2\2\u0392\u0393", - "\7\60\2\2\u0393\u0394\7\60\2\2\u0394\u0395\7\60\2\2\u0395\u00d8\3\2", - "\2\2\u0396\u039b\5\u00dbn\2\u0397\u039a\5\u00dbn\2\u0398\u039a\5\u00df", - "p\2\u0399\u0397\3\2\2\2\u0399\u0398\3\2\2\2\u039a\u039d\3\2\2\2\u039b", - "\u0399\3\2\2\2\u039b\u039c\3\2\2\2\u039c\u00da\3\2\2\2\u039d\u039b\3", - "\2\2\2\u039e\u03a1\5\u00ddo\2\u039f\u03a1\5\u00e1q\2\u03a0\u039e\3\2", - "\2\2\u03a0\u039f\3\2\2\2\u03a1\u00dc\3\2\2\2\u03a2\u03a3\t\2\2\2\u03a3", - "\u00de\3\2\2\2\u03a4\u03a5\t\3\2\2\u03a5\u00e0\3\2\2\2\u03a6\u03a7\7", - "^\2\2\u03a7\u03a8\7w\2\2\u03a8\u03a9\3\2\2\2\u03a9\u03b1\5\u00e3r\2", - "\u03aa\u03ab\7^\2\2\u03ab\u03ac\7W\2\2\u03ac\u03ad\3\2\2\2\u03ad\u03ae", - "\5\u00e3r\2\u03ae\u03af\5\u00e3r\2\u03af\u03b1\3\2\2\2\u03b0\u03a6\3", - "\2\2\2\u03b0\u03aa\3\2\2\2\u03b1\u00e2\3\2\2\2\u03b2\u03b3\5\u00f5{", - "\2\u03b3\u03b4\5\u00f5{\2\u03b4\u03b5\5\u00f5{\2\u03b5\u03b6\5\u00f5", - "{\2\u03b6\u00e4\3\2\2\2\u03b7\u03bb\5\u00e7t\2\u03b8\u03bb\5\u00ff\u0080", - "\2\u03b9\u03bb\5\u0115\u008b\2\u03ba\u03b7\3\2\2\2\u03ba\u03b8\3\2\2", - "\2\u03ba\u03b9\3\2\2\2\u03bb\u00e6\3\2\2\2\u03bc\u03be\5\u00e9u\2\u03bd", - "\u03bf\5\u00f7|\2\u03be\u03bd\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c9", - "\3\2\2\2\u03c0\u03c2\5\u00ebv\2\u03c1\u03c3\5\u00f7|\2\u03c2\u03c1\3", - "\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03c9\3\2\2\2\u03c4\u03c6\5\u00edw", - "\2\u03c5\u03c7\5\u00f7|\2\u03c6\u03c5\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7", - "\u03c9\3\2\2\2\u03c8\u03bc\3\2\2\2\u03c8\u03c0\3\2\2\2\u03c8\u03c4\3", - "\2\2\2\u03c9\u00e8\3\2\2\2\u03ca\u03ce\5\u00f1y\2\u03cb\u03cd\5\u00df", - "p\2\u03cc\u03cb\3\2\2\2\u03cd\u03d0\3\2\2\2\u03ce\u03cc\3\2\2\2\u03ce", - "\u03cf\3\2\2\2\u03cf\u00ea\3\2\2\2\u03d0\u03ce\3\2\2\2\u03d1\u03d5\7", - "\62\2\2\u03d2\u03d4\5\u00f3z\2\u03d3\u03d2\3\2\2\2\u03d4\u03d7\3\2\2", - "\2\u03d5\u03d3\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u00ec\3\2\2\2\u03d7", - "\u03d5\3\2\2\2\u03d8\u03da\5\u00efx\2\u03d9\u03db\5\u00f5{\2\u03da\u03d9", - "\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc\u03da\3\2\2\2\u03dc\u03dd\3\2\2\2", - "\u03dd\u00ee\3\2\2\2\u03de\u03df\7\62\2\2\u03df\u03e0\t\4\2\2\u03e0", - "\u00f0\3\2\2\2\u03e1\u03e2\t\5\2\2\u03e2\u00f2\3\2\2\2\u03e3\u03e4\t", - "\6\2\2\u03e4\u00f4\3\2\2\2\u03e5\u03e6\t\7\2\2\u03e6\u00f6\3\2\2\2\u03e7", - "\u03e9\5\u00f9}\2\u03e8\u03ea\5\u00fb~\2\u03e9\u03e8\3\2\2\2\u03e9\u03ea", - "\3\2\2\2\u03ea\u03f7\3\2\2\2\u03eb\u03ec\5\u00f9}\2\u03ec\u03ed\5\u00fd", - "\177\2\u03ed\u03f7\3\2\2\2\u03ee\u03f0\5\u00fb~\2\u03ef\u03f1\5\u00f9", - "}\2\u03f0\u03ef\3\2\2\2\u03f0\u03f1\3\2\2\2\u03f1\u03f7\3\2\2\2\u03f2", - "\u03f4\5\u00fd\177\2\u03f3\u03f5\5\u00f9}\2\u03f4\u03f3\3\2\2\2\u03f4", - "\u03f5\3\2\2\2\u03f5\u03f7\3\2\2\2\u03f6\u03e7\3\2\2\2\u03f6\u03eb\3", - "\2\2\2\u03f6\u03ee\3\2\2\2\u03f6\u03f2\3\2\2\2\u03f7\u00f8\3\2\2\2\u03f8", - "\u03f9\t\b\2\2\u03f9\u00fa\3\2\2\2\u03fa\u03fb\t\t\2\2\u03fb\u00fc\3", - "\2\2\2\u03fc\u03fd\7n\2\2\u03fd\u0401\7n\2\2\u03fe\u03ff\7N\2\2\u03ff", - "\u0401\7N\2\2\u0400\u03fc\3\2\2\2\u0400\u03fe\3\2\2\2\u0401\u00fe\3", - "\2\2\2\u0402\u0405\5\u0101\u0081\2\u0403\u0405\5\u0103\u0082\2\u0404", - "\u0402\3\2\2\2\u0404\u0403\3\2\2\2\u0405\u0100\3\2\2\2\u0406\u0408\5", - "\u0105\u0083\2\u0407\u0409\5\u0107\u0084\2\u0408\u0407\3\2\2\2\u0408", - "\u0409\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u040c\5\u0113\u008a\2\u040b", - "\u040a\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u0413\3\2\2\2\u040d\u040e\5", - "\u010b\u0086\2\u040e\u0410\5\u0107\u0084\2\u040f\u0411\5\u0113\u008a", - "\2\u0410\u040f\3\2\2\2\u0410\u0411\3\2\2\2\u0411\u0413\3\2\2\2\u0412", - "\u0406\3\2\2\2\u0412\u040d\3\2\2\2\u0413\u0102\3\2\2\2\u0414\u0415\5", - "\u00efx\2\u0415\u0416\5\u010d\u0087\2\u0416\u0418\5\u010f\u0088\2\u0417", - "\u0419\5\u0113\u008a\2\u0418\u0417\3\2\2\2\u0418\u0419\3\2\2\2\u0419", - "\u0421\3\2\2\2\u041a\u041b\5\u00efx\2\u041b\u041c\5\u0111\u0089\2\u041c", - "\u041e\5\u010f\u0088\2\u041d\u041f\5\u0113\u008a\2\u041e\u041d\3\2\2", - "\2\u041e\u041f\3\2\2\2\u041f\u0421\3\2\2\2\u0420\u0414\3\2\2\2\u0420", - "\u041a\3\2\2\2\u0421\u0104\3\2\2\2\u0422\u0424\5\u010b\u0086\2\u0423", - "\u0422\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u0425\3\2\2\2\u0425\u0426\7", - "\60\2\2\u0426\u042b\5\u010b\u0086\2\u0427\u0428\5\u010b\u0086\2\u0428", - "\u0429\7\60\2\2\u0429\u042b\3\2\2\2\u042a\u0423\3\2\2\2\u042a\u0427", - "\3\2\2\2\u042b\u0106\3\2\2\2\u042c\u042e\7g\2\2\u042d\u042f\5\u0109", - "\u0085\2\u042e\u042d\3\2\2\2\u042e\u042f\3\2\2\2\u042f\u0430\3\2\2\2", - "\u0430\u0437\5\u010b\u0086\2\u0431\u0433\7G\2\2\u0432\u0434\5\u0109", - "\u0085\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0435\3\2\2\2", - "\u0435\u0437\5\u010b\u0086\2\u0436\u042c\3\2\2\2\u0436\u0431\3\2\2\2", - "\u0437\u0108\3\2\2\2\u0438\u0439\t\n\2\2\u0439\u010a\3\2\2\2\u043a\u043c", - "\5\u00dfp\2\u043b\u043a\3\2\2\2\u043c\u043d\3\2\2\2\u043d\u043b\3\2", - "\2\2\u043d\u043e\3\2\2\2\u043e\u010c\3\2\2\2\u043f\u0441\5\u0111\u0089", - "\2\u0440\u043f\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\3\2\2\2\u0442", - "\u0443\7\60\2\2\u0443\u0448\5\u0111\u0089\2\u0444\u0445\5\u0111\u0089", - "\2\u0445\u0446\7\60\2\2\u0446\u0448\3\2\2\2\u0447\u0440\3\2\2\2\u0447", - "\u0444\3\2\2\2\u0448\u010e\3\2\2\2\u0449\u044b\7r\2\2\u044a\u044c\5", - "\u0109\u0085\2\u044b\u044a\3\2\2\2\u044b\u044c\3\2\2\2\u044c\u044d\3", - "\2\2\2\u044d\u0454\5\u010b\u0086\2\u044e\u0450\7R\2\2\u044f\u0451\5", - "\u0109\u0085\2\u0450\u044f\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\3", - "\2\2\2\u0452\u0454\5\u010b\u0086\2\u0453\u0449\3\2\2\2\u0453\u044e\3", - "\2\2\2\u0454\u0110\3\2\2\2\u0455\u0457\5\u00f5{\2\u0456\u0455\3\2\2", - "\2\u0457\u0458\3\2\2\2\u0458\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459", - "\u0112\3\2\2\2\u045a\u045b\t\13\2\2\u045b\u0114\3\2\2\2\u045c\u045d", - "\7)\2\2\u045d\u045e\5\u0117\u008c\2\u045e\u045f\7)\2\2\u045f\u0473\3", - "\2\2\2\u0460\u0461\7N\2\2\u0461\u0462\7)\2\2\u0462\u0463\3\2\2\2\u0463", - "\u0464\5\u0117\u008c\2\u0464\u0465\7)\2\2\u0465\u0473\3\2\2\2\u0466", - "\u0467\7w\2\2\u0467\u0468\7)\2\2\u0468\u0469\3\2\2\2\u0469\u046a\5\u0117", - "\u008c\2\u046a\u046b\7)\2\2\u046b\u0473\3\2\2\2\u046c\u046d\7W\2\2\u046d", - "\u046e\7)\2\2\u046e\u046f\3\2\2\2\u046f\u0470\5\u0117\u008c\2\u0470", - "\u0471\7)\2\2\u0471\u0473\3\2\2\2\u0472\u045c\3\2\2\2\u0472\u0460\3", - "\2\2\2\u0472\u0466\3\2\2\2\u0472\u046c\3\2\2\2\u0473\u0116\3\2\2\2\u0474", - "\u0476\5\u0119\u008d\2\u0475\u0474\3\2\2\2\u0476\u0477\3\2\2\2\u0477", - "\u0475\3\2\2\2\u0477\u0478\3\2\2\2\u0478\u0118\3\2\2\2\u0479\u047c\n", - "\f\2\2\u047a\u047c\5\u011b\u008e\2\u047b\u0479\3\2\2\2\u047b\u047a\3", - "\2\2\2\u047c\u011a\3\2\2\2\u047d\u0482\5\u011d\u008f\2\u047e\u0482\5", - "\u011f\u0090\2\u047f\u0482\5\u0121\u0091\2\u0480\u0482\5\u00e1q\2\u0481", - "\u047d\3\2\2\2\u0481\u047e\3\2\2\2\u0481\u047f\3\2\2\2\u0481\u0480\3", - "\2\2\2\u0482\u011c\3\2\2\2\u0483\u0484\7^\2\2\u0484\u0485\t\r\2\2\u0485", - "\u011e\3\2\2\2\u0486\u0487\7^\2\2\u0487\u0492\5\u00f3z\2\u0488\u0489", - "\7^\2\2\u0489\u048a\5\u00f3z\2\u048a\u048b\5\u00f3z\2\u048b\u0492\3", - "\2\2\2\u048c\u048d\7^\2\2\u048d\u048e\5\u00f3z\2\u048e\u048f\5\u00f3", - "z\2\u048f\u0490\5\u00f3z\2\u0490\u0492\3\2\2\2\u0491\u0486\3\2\2\2\u0491", - "\u0488\3\2\2\2\u0491\u048c\3\2\2\2\u0492\u0120\3\2\2\2\u0493\u0494\7", - "^\2\2\u0494\u0495\7z\2\2\u0495\u0497\3\2\2\2\u0496\u0498\5\u00f5{\2", - "\u0497\u0496\3\2\2\2\u0498\u0499\3\2\2\2\u0499\u0497\3\2\2\2\u0499\u049a", - "\3\2\2\2\u049a\u0122\3\2\2\2\u049b\u049d\5\u0127\u0094\2\u049c\u049b", - "\3\2\2\2\u049c\u049d\3\2\2\2\u049d\u049e\3\2\2\2\u049e\u04a0\7$\2\2", - "\u049f\u04a1\5\u0129\u0095\2\u04a0\u049f\3\2\2\2\u04a0\u04a1\3\2\2\2", - "\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7$\2\2\u04a3\u0124\3\2\2\2\u04a4\u04a5", - "\7>\2\2\u04a5\u04a6\5\u0129\u0095\2\u04a6\u04a7\7@\2\2\u04a7\u0126\3", - "\2\2\2\u04a8\u04a9\7w\2\2\u04a9\u04ac\7:\2\2\u04aa\u04ac\t\16\2\2\u04ab", - "\u04a8\3\2\2\2\u04ab\u04aa\3\2\2\2\u04ac\u0128\3\2\2\2\u04ad\u04af\5", - "\u012b\u0096\2\u04ae\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04ae\3", - "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u012a\3\2\2\2\u04b2\u04b5\n\17\2\2", - "\u04b3\u04b5\5\u011b\u008e\2\u04b4\u04b2\3\2\2\2\u04b4\u04b3\3\2\2\2", - "\u04b5\u012c\3\2\2\2\u04b6\u04b8\7%\2\2\u04b7\u04b9\5\u0131\u0099\2", - "\u04b8\u04b7\3\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bc", - "\5\u00e9u\2\u04bb\u04bd\5\u0131\u0099\2\u04bc\u04bb\3\2\2\2\u04bc\u04bd", - "\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04c2\5\u0123\u0092\2\u04bf\u04c1", - "\n\20\2\2\u04c0\u04bf\3\2\2\2\u04c1\u04c4\3\2\2\2\u04c2\u04c0\3\2\2", - "\2\u04c2\u04c3\3\2\2\2\u04c3\u04c5\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c5", - "\u04c6\b\u0097\2\2\u04c6\u012e\3\2\2\2\u04c7\u04c9\7%\2\2\u04c8\u04ca", - "\5\u0131\u0099\2\u04c9\u04c8\3\2\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04cb", - "\3\2\2\2\u04cb\u04cc\7r\2\2\u04cc\u04cd\7t\2\2\u04cd\u04ce\7c\2\2\u04ce", - "\u04cf\7i\2\2\u04cf\u04d0\7o\2\2\u04d0\u04d1\7c\2\2\u04d1\u04d2\3\2", - "\2\2\u04d2\u04d6\5\u0131\u0099\2\u04d3\u04d5\n\20\2\2\u04d4\u04d3\3", - "\2\2\2\u04d5\u04d8\3\2\2\2\u04d6\u04d4\3\2\2\2\u04d6\u04d7\3\2\2\2\u04d7", - "\u04d9\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d9\u04da\b\u0098\2\2\u04da\u0130", - "\3\2\2\2\u04db\u04dd\t\21\2\2\u04dc\u04db\3\2\2\2\u04dd\u04de\3\2\2", - "\2\u04de\u04dc\3\2\2\2\u04de\u04df\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0", - "\u04e1\b\u0099\2\2\u04e1\u0132\3\2\2\2\u04e2\u04e4\7\17\2\2\u04e3\u04e5", - "\7\f\2\2\u04e4\u04e3\3\2\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e8\3\2\2\2", - "\u04e6\u04e8\7\f\2\2\u04e7\u04e2\3\2\2\2\u04e7\u04e6\3\2\2\2\u04e8\u04e9", - "\3\2\2\2\u04e9\u04ea\b\u009a\2\2\u04ea\u0134\3\2\2\2\u04eb\u04ec\7\61", - "\2\2\u04ec\u04ed\7,\2\2\u04ed\u04f1\3\2\2\2\u04ee\u04f0\13\2\2\2\u04ef", - "\u04ee\3\2\2\2\u04f0\u04f3\3\2\2\2\u04f1\u04f2\3\2\2\2\u04f1\u04ef\3", - "\2\2\2\u04f2\u04f4\3\2\2\2\u04f3\u04f1\3\2\2\2\u04f4\u04f5\7,\2\2\u04f5", - "\u04f6\7\61\2\2\u04f6\u04f7\3\2\2\2\u04f7\u04f8\b\u009b\2\2\u04f8\u0136", - "\3\2\2\2\u04f9\u04fa\7\61\2\2\u04fa\u04fb\7\61\2\2\u04fb\u04ff\3\2\2", - "\2\u04fc\u04fe\n\20\2\2\u04fd\u04fc\3\2\2\2\u04fe\u0501\3\2\2\2\u04ff", - "\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502\3\2\2\2\u0501\u04ff\3", - "\2\2\2\u0502\u0503\b\u009c\2\2\u0503\u0138\3\2\2\2=\2\u0399\u039b\u03a0", - "\u03b0\u03ba\u03be\u03c2\u03c6\u03c8\u03ce\u03d5\u03dc\u03e9\u03f0\u03f4", - "\u03f6\u0400\u0404\u0408\u040b\u0410\u0412\u0418\u041e\u0420\u0423\u042a", - "\u042e\u0433\u0436\u043d\u0440\u0447\u044b\u0450\u0453\u0458\u0472\u0477", - "\u047b\u0481\u0491\u0499\u049c\u04a0\u04ab\u04b0\u04b4\u04b8\u04bc\u04c2", - "\u04c9\u04d6\u04de\u04e4\u04e7\u04f1\u04ff\3\b\2\2"].join(""); + "\2\u0117\2\u0119\2\u011b\2\u011dm\u011fn\u0121\2\u0123\2\u0125\2\u0127", + "o\u0129p\u012bq\u012dr\u012fs\3\2\23\5\2C\\aac|\3\2\62;\4\2ZZzz\3\2", + "\63;\3\2\629\5\2\62;CHch\4\2WWww\4\2NNnn\4\2--//\6\2HHNNhhnn\6\2\f\f", + "\17\17))^^\f\2$$))AA^^cdhhppttvvxx\5\2NNWWww\6\2\f\f\17\17$$^^\5\2\f", + "\f\17\17``\4\2\f\f\17\17\4\2\13\13\"\"\u04ee\2\3\3\2\2\2\2\5\3\2\2\2", + "\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21", + "\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3", + "\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2", + "\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2", + "\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2", + "\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2", + "\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2", + "\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2", + "c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o", + "\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3", + "\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085", + "\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2", + "\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2", + "\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f", + "\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2", + "\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2", + "\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9", + "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2", + "\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2", + "\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3", + "\3\2\2\2\2\u00df\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0127\3\2", + "\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2\2", + "\3\u0131\3\2\2\2\5\u013f\3\2\2\2\7\u0150\3\2\2\2\t\u0163\3\2\2\2\13", + "\u016a\3\2\2\2\r\u0172\3\2\2\2\17\u017a\3\2\2\2\21\u0185\3\2\2\2\23", + "\u0190\3\2\2\2\25\u019a\3\2\2\2\27\u01a5\3\2\2\2\31\u01ab\3\2\2\2\33", + "\u01b9\3\2\2\2\35\u01c1\3\2\2\2\37\u01ce\3\2\2\2!\u01d3\3\2\2\2#\u01d9", + "\3\2\2\2%\u01de\3\2\2\2\'\u01e3\3\2\2\2)\u01e9\3\2\2\2+\u01f2\3\2\2", + "\2-\u01fa\3\2\2\2/\u01fd\3\2\2\2\61\u0204\3\2\2\2\63\u0209\3\2\2\2\65", + "\u020e\3\2\2\2\67\u0215\3\2\2\29\u021b\3\2\2\2;\u021f\3\2\2\2=\u0224", + "\3\2\2\2?\u0227\3\2\2\2A\u022e\3\2\2\2C\u0232\3\2\2\2E\u0237\3\2\2\2", + "G\u0240\3\2\2\2I\u0249\3\2\2\2K\u0250\3\2\2\2M\u0256\3\2\2\2O\u025d", + "\3\2\2\2Q\u0264\3\2\2\2S\u026b\3\2\2\2U\u0272\3\2\2\2W\u0279\3\2\2\2", + "Y\u0281\3\2\2\2[\u0287\3\2\2\2]\u0290\3\2\2\2_\u0295\3\2\2\2a\u029e", + "\3\2\2\2c\u02a4\3\2\2\2e\u02ad\3\2\2\2g\u02b6\3\2\2\2i\u02be\3\2\2\2", + "k\u02c4\3\2\2\2m\u02cd\3\2\2\2o\u02d6\3\2\2\2q\u02e1\3\2\2\2s\u02eb", + "\3\2\2\2u\u02fa\3\2\2\2w\u0308\3\2\2\2y\u030a\3\2\2\2{\u030c\3\2\2\2", + "}\u030e\3\2\2\2\177\u0310\3\2\2\2\u0081\u0312\3\2\2\2\u0083\u0314\3", + "\2\2\2\u0085\u0316\3\2\2\2\u0087\u0319\3\2\2\2\u0089\u031b\3\2\2\2\u008b", + "\u031e\3\2\2\2\u008d\u0321\3\2\2\2\u008f\u0324\3\2\2\2\u0091\u0326\3", + "\2\2\2\u0093\u0329\3\2\2\2\u0095\u032b\3\2\2\2\u0097\u032e\3\2\2\2\u0099", + "\u0330\3\2\2\2\u009b\u0332\3\2\2\2\u009d\u0334\3\2\2\2\u009f\u0336\3", + "\2\2\2\u00a1\u0338\3\2\2\2\u00a3\u033b\3\2\2\2\u00a5\u033e\3\2\2\2\u00a7", + "\u0340\3\2\2\2\u00a9\u0342\3\2\2\2\u00ab\u0344\3\2\2\2\u00ad\u0346\3", + "\2\2\2\u00af\u0348\3\2\2\2\u00b1\u034a\3\2\2\2\u00b3\u034c\3\2\2\2\u00b5", + "\u034e\3\2\2\2\u00b7\u0351\3\2\2\2\u00b9\u0354\3\2\2\2\u00bb\u0357\3", + "\2\2\2\u00bd\u035a\3\2\2\2\u00bf\u035d\3\2\2\2\u00c1\u0361\3\2\2\2\u00c3", + "\u0365\3\2\2\2\u00c5\u0368\3\2\2\2\u00c7\u036b\3\2\2\2\u00c9\u036e\3", + "\2\2\2\u00cb\u0371\3\2\2\2\u00cd\u0374\3\2\2\2\u00cf\u0377\3\2\2\2\u00d1", + "\u0379\3\2\2\2\u00d3\u037d\3\2\2\2\u00d5\u0387\3\2\2\2\u00d7\u0389\3", + "\2\2\2\u00d9\u038b\3\2\2\2\u00db\u0397\3\2\2\2\u00dd\u0399\3\2\2\2\u00df", + "\u03a1\3\2\2\2\u00e1\u03af\3\2\2\2\u00e3\u03b1\3\2\2\2\u00e5\u03b8\3", + "\2\2\2\u00e7\u03bf\3\2\2\2\u00e9\u03c5\3\2\2\2\u00eb\u03c8\3\2\2\2\u00ed", + "\u03ca\3\2\2\2\u00ef\u03cc\3\2\2\2\u00f1\u03dd\3\2\2\2\u00f3\u03df\3", + "\2\2\2\u00f5\u03e1\3\2\2\2\u00f7\u03e7\3\2\2\2\u00f9\u03eb\3\2\2\2\u00fb", + "\u03f9\3\2\2\2\u00fd\u0407\3\2\2\2\u00ff\u0411\3\2\2\2\u0101\u041d\3", + "\2\2\2\u0103\u041f\3\2\2\2\u0105\u0422\3\2\2\2\u0107\u042e\3\2\2\2\u0109", + "\u043a\3\2\2\2\u010b\u043d\3\2\2\2\u010d\u0441\3\2\2\2\u010f\u0459\3", + "\2\2\2\u0111\u045c\3\2\2\2\u0113\u0462\3\2\2\2\u0115\u0468\3\2\2\2\u0117", + "\u046a\3\2\2\2\u0119\u0478\3\2\2\2\u011b\u047a\3\2\2\2\u011d\u0483\3", + "\2\2\2\u011f\u048b\3\2\2\2\u0121\u0492\3\2\2\2\u0123\u0495\3\2\2\2\u0125", + "\u049b\3\2\2\2\u0127\u049d\3\2\2\2\u0129\u04ad\3\2\2\2\u012b\u04b8\3", + "\2\2\2\u012d\u04bc\3\2\2\2\u012f\u04ca\3\2\2\2\u0131\u0132\7a\2\2\u0132", + "\u0133\7a\2\2\u0133\u0134\7g\2\2\u0134\u0135\7z\2\2\u0135\u0136\7v\2", + "\2\u0136\u0137\7g\2\2\u0137\u0138\7p\2\2\u0138\u0139\7u\2\2\u0139\u013a", + "\7k\2\2\u013a\u013b\7q\2\2\u013b\u013c\7p\2\2\u013c\u013d\7a\2\2\u013d", + "\u013e\7a\2\2\u013e\4\3\2\2\2\u013f\u0140\7a\2\2\u0140\u0141\7a\2\2", + "\u0141\u0142\7d\2\2\u0142\u0143\7w\2\2\u0143\u0144\7k\2\2\u0144\u0145", + "\7n\2\2\u0145\u0146\7v\2\2\u0146\u0147\7k\2\2\u0147\u0148\7p\2\2\u0148", + "\u0149\7a\2\2\u0149\u014a\7x\2\2\u014a\u014b\7c\2\2\u014b\u014c\7a\2", + "\2\u014c\u014d\7c\2\2\u014d\u014e\7t\2\2\u014e\u014f\7i\2\2\u014f\6", + "\3\2\2\2\u0150\u0151\7a\2\2\u0151\u0152\7a\2\2\u0152\u0153\7d\2\2\u0153", + "\u0154\7w\2\2\u0154\u0155\7k\2\2\u0155\u0156\7n\2\2\u0156\u0157\7v\2", + "\2\u0157\u0158\7k\2\2\u0158\u0159\7p\2\2\u0159\u015a\7a\2\2\u015a\u015b", + "\7q\2\2\u015b\u015c\7h\2\2\u015c\u015d\7h\2\2\u015d\u015e\7u\2\2\u015e", + "\u015f\7g\2\2\u015f\u0160\7v\2\2\u0160\u0161\7q\2\2\u0161\u0162\7h\2", + "\2\u0162\b\3\2\2\2\u0163\u0164\7a\2\2\u0164\u0165\7a\2\2\u0165\u0166", + "\7o\2\2\u0166\u0167\7\63\2\2\u0167\u0168\7\64\2\2\u0168\u0169\7:\2\2", + "\u0169\n\3\2\2\2\u016a\u016b\7a\2\2\u016b\u016c\7a\2\2\u016c\u016d\7", + "o\2\2\u016d\u016e\7\63\2\2\u016e\u016f\7\64\2\2\u016f\u0170\7:\2\2\u0170", + "\u0171\7f\2\2\u0171\f\3\2\2\2\u0172\u0173\7a\2\2\u0173\u0174\7a\2\2", + "\u0174\u0175\7o\2\2\u0175\u0176\7\63\2\2\u0176\u0177\7\64\2\2\u0177", + "\u0178\7:\2\2\u0178\u0179\7k\2\2\u0179\16\3\2\2\2\u017a\u017b\7a\2\2", + "\u017b\u017c\7a\2\2\u017c\u017d\7v\2\2\u017d\u017e\7{\2\2\u017e\u017f", + "\7r\2\2\u017f\u0180\7g\2\2\u0180\u0181\7q\2\2\u0181\u0182\7h\2\2\u0182", + "\u0183\7a\2\2\u0183\u0184\7a\2\2\u0184\20\3\2\2\2\u0185\u0186\7a\2\2", + "\u0186\u0187\7a\2\2\u0187\u0188\7k\2\2\u0188\u0189\7p\2\2\u0189\u018a", + "\7n\2\2\u018a\u018b\7k\2\2\u018b\u018c\7p\2\2\u018c\u018d\7g\2\2\u018d", + "\u018e\7a\2\2\u018e\u018f\7a\2\2\u018f\22\3\2\2\2\u0190\u0191\7a\2\2", + "\u0191\u0192\7a\2\2\u0192\u0193\7u\2\2\u0193\u0194\7v\2\2\u0194\u0195", + "\7f\2\2\u0195\u0196\7e\2\2\u0196\u0197\7c\2\2\u0197\u0198\7n\2\2\u0198", + "\u0199\7n\2\2\u0199\24\3\2\2\2\u019a\u019b\7a\2\2\u019b\u019c\7a\2\2", + "\u019c\u019d\7f\2\2\u019d\u019e\7g\2\2\u019e\u019f\7e\2\2\u019f\u01a0", + "\7n\2\2\u01a0\u01a1\7u\2\2\u01a1\u01a2\7r\2\2\u01a2\u01a3\7g\2\2\u01a3", + "\u01a4\7e\2\2\u01a4\26\3\2\2\2\u01a5\u01a6\7a\2\2\u01a6\u01a7\7a\2\2", + "\u01a7\u01a8\7c\2\2\u01a8\u01a9\7u\2\2\u01a9\u01aa\7o\2\2\u01aa\30\3", + "\2\2\2\u01ab\u01ac\7a\2\2\u01ac\u01ad\7a\2\2\u01ad\u01ae\7c\2\2\u01ae", + "\u01af\7v\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7t\2\2\u01b1\u01b2\7k\2", + "\2\u01b2\u01b3\7d\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7v\2\2\u01b5\u01b6", + "\7g\2\2\u01b6\u01b7\7a\2\2\u01b7\u01b8\7a\2\2\u01b8\32\3\2\2\2\u01b9", + "\u01ba\7a\2\2\u01ba\u01bb\7a\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7u\2", + "\2\u01bd\u01be\7o\2\2\u01be\u01bf\7a\2\2\u01bf\u01c0\7a\2\2\u01c0\34", + "\3\2\2\2\u01c1\u01c2\7a\2\2\u01c2\u01c3\7a\2\2\u01c3\u01c4\7x\2\2\u01c4", + "\u01c5\7q\2\2\u01c5\u01c6\7n\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7v\2", + "\2\u01c8\u01c9\7k\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7g\2\2\u01cb\u01cc", + "\7a\2\2\u01cc\u01cd\7a\2\2\u01cd\36\3\2\2\2\u01ce\u01cf\7c\2\2\u01cf", + "\u01d0\7w\2\2\u01d0\u01d1\7v\2\2\u01d1\u01d2\7q\2\2\u01d2 \3\2\2\2\u01d3", + "\u01d4\7d\2\2\u01d4\u01d5\7t\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7c\2", + "\2\u01d7\u01d8\7m\2\2\u01d8\"\3\2\2\2\u01d9\u01da\7e\2\2\u01da\u01db", + "\7c\2\2\u01db\u01dc\7u\2\2\u01dc\u01dd\7g\2\2\u01dd$\3\2\2\2\u01de\u01df", + "\7e\2\2\u01df\u01e0\7j\2\2\u01e0\u01e1\7c\2\2\u01e1\u01e2\7t\2\2\u01e2", + "&\3\2\2\2\u01e3\u01e4\7e\2\2\u01e4\u01e5\7q\2\2\u01e5\u01e6\7p\2\2\u01e6", + "\u01e7\7u\2\2\u01e7\u01e8\7v\2\2\u01e8(\3\2\2\2\u01e9\u01ea\7e\2\2\u01ea", + "\u01eb\7q\2\2\u01eb\u01ec\7p\2\2\u01ec\u01ed\7v\2\2\u01ed\u01ee\7k\2", + "\2\u01ee\u01ef\7p\2\2\u01ef\u01f0\7w\2\2\u01f0\u01f1\7g\2\2\u01f1*\3", + "\2\2\2\u01f2\u01f3\7f\2\2\u01f3\u01f4\7g\2\2\u01f4\u01f5\7h\2\2\u01f5", + "\u01f6\7c\2\2\u01f6\u01f7\7w\2\2\u01f7\u01f8\7n\2\2\u01f8\u01f9\7v\2", + "\2\u01f9,\3\2\2\2\u01fa\u01fb\7f\2\2\u01fb\u01fc\7q\2\2\u01fc.\3\2\2", + "\2\u01fd\u01fe\7f\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200\7w\2\2\u0200\u0201", + "\7d\2\2\u0201\u0202\7n\2\2\u0202\u0203\7g\2\2\u0203\60\3\2\2\2\u0204", + "\u0205\7g\2\2\u0205\u0206\7n\2\2\u0206\u0207\7u\2\2\u0207\u0208\7g\2", + "\2\u0208\62\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020b\7p\2\2\u020b\u020c", + "\7w\2\2\u020c\u020d\7o\2\2\u020d\64\3\2\2\2\u020e\u020f\7g\2\2\u020f", + "\u0210\7z\2\2\u0210\u0211\7v\2\2\u0211\u0212\7g\2\2\u0212\u0213\7t\2", + "\2\u0213\u0214\7p\2\2\u0214\66\3\2\2\2\u0215\u0216\7h\2\2\u0216\u0217", + "\7n\2\2\u0217\u0218\7q\2\2\u0218\u0219\7c\2\2\u0219\u021a\7v\2\2\u021a", + "8\3\2\2\2\u021b\u021c\7h\2\2\u021c\u021d\7q\2\2\u021d\u021e\7t\2\2\u021e", + ":\3\2\2\2\u021f\u0220\7i\2\2\u0220\u0221\7q\2\2\u0221\u0222\7v\2\2\u0222", + "\u0223\7q\2\2\u0223<\3\2\2\2\u0224\u0225\7k\2\2\u0225\u0226\7h\2\2\u0226", + ">\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229\7p\2\2\u0229\u022a\7n\2\2\u022a", + "\u022b\7k\2\2\u022b\u022c\7p\2\2\u022c\u022d\7g\2\2\u022d@\3\2\2\2\u022e", + "\u022f\7k\2\2\u022f\u0230\7p\2\2\u0230\u0231\7v\2\2\u0231B\3\2\2\2\u0232", + "\u0233\7n\2\2\u0233\u0234\7q\2\2\u0234\u0235\7p\2\2\u0235\u0236\7i\2", + "\2\u0236D\3\2\2\2\u0237\u0238\7t\2\2\u0238\u0239\7g\2\2\u0239\u023a", + "\7i\2\2\u023a\u023b\7k\2\2\u023b\u023c\7u\2\2\u023c\u023d\7v\2\2\u023d", + "\u023e\7g\2\2\u023e\u023f\7t\2\2\u023fF\3\2\2\2\u0240\u0241\7t\2\2\u0241", + "\u0242\7g\2\2\u0242\u0243\7u\2\2\u0243\u0244\7v\2\2\u0244\u0245\7t\2", + "\2\u0245\u0246\7k\2\2\u0246\u0247\7e\2\2\u0247\u0248\7v\2\2\u0248H\3", + "\2\2\2\u0249\u024a\7t\2\2\u024a\u024b\7g\2\2\u024b\u024c\7v\2\2\u024c", + "\u024d\7w\2\2\u024d\u024e\7t\2\2\u024e\u024f\7p\2\2\u024fJ\3\2\2\2\u0250", + "\u0251\7u\2\2\u0251\u0252\7j\2\2\u0252\u0253\7q\2\2\u0253\u0254\7t\2", + "\2\u0254\u0255\7v\2\2\u0255L\3\2\2\2\u0256\u0257\7u\2\2\u0257\u0258", + "\7k\2\2\u0258\u0259\7i\2\2\u0259\u025a\7p\2\2\u025a\u025b\7g\2\2\u025b", + "\u025c\7f\2\2\u025cN\3\2\2\2\u025d\u025e\7u\2\2\u025e\u025f\7k\2\2\u025f", + "\u0260\7|\2\2\u0260\u0261\7g\2\2\u0261\u0262\7q\2\2\u0262\u0263\7h\2", + "\2\u0263P\3\2\2\2\u0264\u0265\7u\2\2\u0265\u0266\7v\2\2\u0266\u0267", + "\7c\2\2\u0267\u0268\7v\2\2\u0268\u0269\7k\2\2\u0269\u026a\7e\2\2\u026a", + "R\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7v\2\2\u026d\u026e\7t\2\2\u026e", + "\u026f\7w\2\2\u026f\u0270\7e\2\2\u0270\u0271\7v\2\2\u0271T\3\2\2\2\u0272", + "\u0273\7u\2\2\u0273\u0274\7y\2\2\u0274\u0275\7k\2\2\u0275\u0276\7v\2", + "\2\u0276\u0277\7e\2\2\u0277\u0278\7j\2\2\u0278V\3\2\2\2\u0279\u027a", + "\7v\2\2\u027a\u027b\7{\2\2\u027b\u027c\7r\2\2\u027c\u027d\7g\2\2\u027d", + "\u027e\7f\2\2\u027e\u027f\7g\2\2\u027f\u0280\7h\2\2\u0280X\3\2\2\2\u0281", + "\u0282\7w\2\2\u0282\u0283\7p\2\2\u0283\u0284\7k\2\2\u0284\u0285\7q\2", + "\2\u0285\u0286\7p\2\2\u0286Z\3\2\2\2\u0287\u0288\7w\2\2\u0288\u0289", + "\7p\2\2\u0289\u028a\7u\2\2\u028a\u028b\7k\2\2\u028b\u028c\7i\2\2\u028c", + "\u028d\7p\2\2\u028d\u028e\7g\2\2\u028e\u028f\7f\2\2\u028f\\\3\2\2\2", + "\u0290\u0291\7x\2\2\u0291\u0292\7q\2\2\u0292\u0293\7k\2\2\u0293\u0294", + "\7f\2\2\u0294^\3\2\2\2\u0295\u0296\7x\2\2\u0296\u0297\7q\2\2\u0297\u0298", + "\7n\2\2\u0298\u0299\7c\2\2\u0299\u029a\7v\2\2\u029a\u029b\7k\2\2\u029b", + "\u029c\7n\2\2\u029c\u029d\7g\2\2\u029d`\3\2\2\2\u029e\u029f\7y\2\2\u029f", + "\u02a0\7j\2\2\u02a0\u02a1\7k\2\2\u02a1\u02a2\7n\2\2\u02a2\u02a3\7g\2", + "\2\u02a3b\3\2\2\2\u02a4\u02a5\7a\2\2\u02a5\u02a6\7C\2\2\u02a6\u02a7", + "\7n\2\2\u02a7\u02a8\7k\2\2\u02a8\u02a9\7i\2\2\u02a9\u02aa\7p\2\2\u02aa", + "\u02ab\7c\2\2\u02ab\u02ac\7u\2\2\u02acd\3\2\2\2\u02ad\u02ae\7a\2\2\u02ae", + "\u02af\7C\2\2\u02af\u02b0\7n\2\2\u02b0\u02b1\7k\2\2\u02b1\u02b2\7i\2", + "\2\u02b2\u02b3\7p\2\2\u02b3\u02b4\7q\2\2\u02b4\u02b5\7h\2\2\u02b5f\3", + "\2\2\2\u02b6\u02b7\7a\2\2\u02b7\u02b8\7C\2\2\u02b8\u02b9\7v\2\2\u02b9", + "\u02ba\7q\2\2\u02ba\u02bb\7o\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7e\2", + "\2\u02bdh\3\2\2\2\u02be\u02bf\7a\2\2\u02bf\u02c0\7D\2\2\u02c0\u02c1", + "\7q\2\2\u02c1\u02c2\7q\2\2\u02c2\u02c3\7n\2\2\u02c3j\3\2\2\2\u02c4\u02c5", + "\7a\2\2\u02c5\u02c6\7E\2\2\u02c6\u02c7\7q\2\2\u02c7\u02c8\7o\2\2\u02c8", + "\u02c9\7r\2\2\u02c9\u02ca\7n\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7z\2", + "\2\u02ccl\3\2\2\2\u02cd\u02ce\7a\2\2\u02ce\u02cf\7I\2\2\u02cf\u02d0", + "\7g\2\2\u02d0\u02d1\7p\2\2\u02d1\u02d2\7g\2\2\u02d2\u02d3\7t\2\2\u02d3", + "\u02d4\7k\2\2\u02d4\u02d5\7e\2\2\u02d5n\3\2\2\2\u02d6\u02d7\7a\2\2\u02d7", + "\u02d8\7K\2\2\u02d8\u02d9\7o\2\2\u02d9\u02da\7c\2\2\u02da\u02db\7i\2", + "\2\u02db\u02dc\7k\2\2\u02dc\u02dd\7p\2\2\u02dd\u02de\7c\2\2\u02de\u02df", + "\7t\2\2\u02df\u02e0\7{\2\2\u02e0p\3\2\2\2\u02e1\u02e2\7a\2\2\u02e2\u02e3", + "\7P\2\2\u02e3\u02e4\7q\2\2\u02e4\u02e5\7t\2\2\u02e5\u02e6\7g\2\2\u02e6", + "\u02e7\7v\2\2\u02e7\u02e8\7w\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7p\2", + "\2\u02ear\3\2\2\2\u02eb\u02ec\7a\2\2\u02ec\u02ed\7U\2\2\u02ed\u02ee", + "\7v\2\2\u02ee\u02ef\7c\2\2\u02ef\u02f0\7v\2\2\u02f0\u02f1\7k\2\2\u02f1", + "\u02f2\7e\2\2\u02f2\u02f3\7a\2\2\u02f3\u02f4\7c\2\2\u02f4\u02f5\7u\2", + "\2\u02f5\u02f6\7u\2\2\u02f6\u02f7\7g\2\2\u02f7\u02f8\7t\2\2\u02f8\u02f9", + "\7v\2\2\u02f9t\3\2\2\2\u02fa\u02fb\7a\2\2\u02fb\u02fc\7V\2\2\u02fc\u02fd", + "\7j\2\2\u02fd\u02fe\7t\2\2\u02fe\u02ff\7g\2\2\u02ff\u0300\7c\2\2\u0300", + "\u0301\7f\2\2\u0301\u0302\7a\2\2\u0302\u0303\7n\2\2\u0303\u0304\7q\2", + "\2\u0304\u0305\7e\2\2\u0305\u0306\7c\2\2\u0306\u0307\7n\2\2\u0307v\3", + "\2\2\2\u0308\u0309\7*\2\2\u0309x\3\2\2\2\u030a\u030b\7+\2\2\u030bz\3", + "\2\2\2\u030c\u030d\7]\2\2\u030d|\3\2\2\2\u030e\u030f\7_\2\2\u030f~\3", + "\2\2\2\u0310\u0311\7}\2\2\u0311\u0080\3\2\2\2\u0312\u0313\7\177\2\2", + "\u0313\u0082\3\2\2\2\u0314\u0315\7>\2\2\u0315\u0084\3\2\2\2\u0316\u0317", + "\7>\2\2\u0317\u0318\7?\2\2\u0318\u0086\3\2\2\2\u0319\u031a\7@\2\2\u031a", + "\u0088\3\2\2\2\u031b\u031c\7@\2\2\u031c\u031d\7?\2\2\u031d\u008a\3\2", + "\2\2\u031e\u031f\7>\2\2\u031f\u0320\7>\2\2\u0320\u008c\3\2\2\2\u0321", + "\u0322\7@\2\2\u0322\u0323\7@\2\2\u0323\u008e\3\2\2\2\u0324\u0325\7-", + "\2\2\u0325\u0090\3\2\2\2\u0326\u0327\7-\2\2\u0327\u0328\7-\2\2\u0328", + "\u0092\3\2\2\2\u0329\u032a\7/\2\2\u032a\u0094\3\2\2\2\u032b\u032c\7", + "/\2\2\u032c\u032d\7/\2\2\u032d\u0096\3\2\2\2\u032e\u032f\7,\2\2\u032f", + "\u0098\3\2\2\2\u0330\u0331\7\61\2\2\u0331\u009a\3\2\2\2\u0332\u0333", + "\7\'\2\2\u0333\u009c\3\2\2\2\u0334\u0335\7(\2\2\u0335\u009e\3\2\2\2", + "\u0336\u0337\7~\2\2\u0337\u00a0\3\2\2\2\u0338\u0339\7(\2\2\u0339\u033a", + "\7(\2\2\u033a\u00a2\3\2\2\2\u033b\u033c\7~\2\2\u033c\u033d\7~\2\2\u033d", + "\u00a4\3\2\2\2\u033e\u033f\7`\2\2\u033f\u00a6\3\2\2\2\u0340\u0341\7", + "#\2\2\u0341\u00a8\3\2\2\2\u0342\u0343\7\u0080\2\2\u0343\u00aa\3\2\2", + "\2\u0344\u0345\7A\2\2\u0345\u00ac\3\2\2\2\u0346\u0347\7<\2\2\u0347\u00ae", + "\3\2\2\2\u0348\u0349\7=\2\2\u0349\u00b0\3\2\2\2\u034a\u034b\7.\2\2\u034b", + "\u00b2\3\2\2\2\u034c\u034d\7?\2\2\u034d\u00b4\3\2\2\2\u034e\u034f\7", + ",\2\2\u034f\u0350\7?\2\2\u0350\u00b6\3\2\2\2\u0351\u0352\7\61\2\2\u0352", + "\u0353\7?\2\2\u0353\u00b8\3\2\2\2\u0354\u0355\7\'\2\2\u0355\u0356\7", + "?\2\2\u0356\u00ba\3\2\2\2\u0357\u0358\7-\2\2\u0358\u0359\7?\2\2\u0359", + "\u00bc\3\2\2\2\u035a\u035b\7/\2\2\u035b\u035c\7?\2\2\u035c\u00be\3\2", + "\2\2\u035d\u035e\7>\2\2\u035e\u035f\7>\2\2\u035f\u0360\7?\2\2\u0360", + "\u00c0\3\2\2\2\u0361\u0362\7@\2\2\u0362\u0363\7@\2\2\u0363\u0364\7?", + "\2\2\u0364\u00c2\3\2\2\2\u0365\u0366\7(\2\2\u0366\u0367\7?\2\2\u0367", + "\u00c4\3\2\2\2\u0368\u0369\7`\2\2\u0369\u036a\7?\2\2\u036a\u00c6\3\2", + "\2\2\u036b\u036c\7~\2\2\u036c\u036d\7?\2\2\u036d\u00c8\3\2\2\2\u036e", + "\u036f\7?\2\2\u036f\u0370\7?\2\2\u0370\u00ca\3\2\2\2\u0371\u0372\7#", + "\2\2\u0372\u0373\7?\2\2\u0373\u00cc\3\2\2\2\u0374\u0375\7/\2\2\u0375", + "\u0376\7@\2\2\u0376\u00ce\3\2\2\2\u0377\u0378\7\60\2\2\u0378\u00d0\3", + "\2\2\2\u0379\u037a\7\60\2\2\u037a\u037b\7\60\2\2\u037b\u037c\7\60\2", + "\2\u037c\u00d2\3\2\2\2\u037d\u0382\5\u00d5k\2\u037e\u0381\5\u00d5k\2", + "\u037f\u0381\5\u00d9m\2\u0380\u037e\3\2\2\2\u0380\u037f\3\2\2\2\u0381", + "\u0384\3\2\2\2\u0382\u0380\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u00d4\3", + "\2\2\2\u0384\u0382\3\2\2\2\u0385\u0388\5\u00d7l\2\u0386\u0388\5\u00db", + "n\2\u0387\u0385\3\2\2\2\u0387\u0386\3\2\2\2\u0388\u00d6\3\2\2\2\u0389", + "\u038a\t\2\2\2\u038a\u00d8\3\2\2\2\u038b\u038c\t\3\2\2\u038c\u00da\3", + "\2\2\2\u038d\u038e\7^\2\2\u038e\u038f\7w\2\2\u038f\u0390\3\2\2\2\u0390", + "\u0398\5\u00ddo\2\u0391\u0392\7^\2\2\u0392\u0393\7W\2\2\u0393\u0394", + "\3\2\2\2\u0394\u0395\5\u00ddo\2\u0395\u0396\5\u00ddo\2\u0396\u0398\3", + "\2\2\2\u0397\u038d\3\2\2\2\u0397\u0391\3\2\2\2\u0398\u00dc\3\2\2\2\u0399", + "\u039a\5\u00efx\2\u039a\u039b\5\u00efx\2\u039b\u039c\5\u00efx\2\u039c", + "\u039d\5\u00efx\2\u039d\u00de\3\2\2\2\u039e\u03a2\5\u00e1q\2\u039f\u03a2", + "\5\u00f9}\2\u03a0\u03a2\5\u010f\u0088\2\u03a1\u039e\3\2\2\2\u03a1\u039f", + "\3\2\2\2\u03a1\u03a0\3\2\2\2\u03a2\u00e0\3\2\2\2\u03a3\u03a5\5\u00e3", + "r\2\u03a4\u03a6\5\u00f1y\2\u03a5\u03a4\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6", + "\u03b0\3\2\2\2\u03a7\u03a9\5\u00e5s\2\u03a8\u03aa\5\u00f1y\2\u03a9\u03a8", + "\3\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u03b0\3\2\2\2\u03ab\u03ad\5\u00e7", + "t\2\u03ac\u03ae\5\u00f1y\2\u03ad\u03ac\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae", + "\u03b0\3\2\2\2\u03af\u03a3\3\2\2\2\u03af\u03a7\3\2\2\2\u03af\u03ab\3", + "\2\2\2\u03b0\u00e2\3\2\2\2\u03b1\u03b5\5\u00ebv\2\u03b2\u03b4\5\u00d9", + "m\2\u03b3\u03b2\3\2\2\2\u03b4\u03b7\3\2\2\2\u03b5\u03b3\3\2\2\2\u03b5", + "\u03b6\3\2\2\2\u03b6\u00e4\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b8\u03bc\7", + "\62\2\2\u03b9\u03bb\5\u00edw\2\u03ba\u03b9\3\2\2\2\u03bb\u03be\3\2\2", + "\2\u03bc\u03ba\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd\u00e6\3\2\2\2\u03be", + "\u03bc\3\2\2\2\u03bf\u03c1\5\u00e9u\2\u03c0\u03c2\5\u00efx\2\u03c1\u03c0", + "\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03c1\3\2\2\2\u03c3\u03c4\3\2\2\2", + "\u03c4\u00e8\3\2\2\2\u03c5\u03c6\7\62\2\2\u03c6\u03c7\t\4\2\2\u03c7", + "\u00ea\3\2\2\2\u03c8\u03c9\t\5\2\2\u03c9\u00ec\3\2\2\2\u03ca\u03cb\t", + "\6\2\2\u03cb\u00ee\3\2\2\2\u03cc\u03cd\t\7\2\2\u03cd\u00f0\3\2\2\2\u03ce", + "\u03d0\5\u00f3z\2\u03cf\u03d1\5\u00f5{\2\u03d0\u03cf\3\2\2\2\u03d0\u03d1", + "\3\2\2\2\u03d1\u03de\3\2\2\2\u03d2\u03d3\5\u00f3z\2\u03d3\u03d4\5\u00f7", + "|\2\u03d4\u03de\3\2\2\2\u03d5\u03d7\5\u00f5{\2\u03d6\u03d8\5\u00f3z", + "\2\u03d7\u03d6\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03de\3\2\2\2\u03d9", + "\u03db\5\u00f7|\2\u03da\u03dc\5\u00f3z\2\u03db\u03da\3\2\2\2\u03db\u03dc", + "\3\2\2\2\u03dc\u03de\3\2\2\2\u03dd\u03ce\3\2\2\2\u03dd\u03d2\3\2\2\2", + "\u03dd\u03d5\3\2\2\2\u03dd\u03d9\3\2\2\2\u03de\u00f2\3\2\2\2\u03df\u03e0", + "\t\b\2\2\u03e0\u00f4\3\2\2\2\u03e1\u03e2\t\t\2\2\u03e2\u00f6\3\2\2\2", + "\u03e3\u03e4\7n\2\2\u03e4\u03e8\7n\2\2\u03e5\u03e6\7N\2\2\u03e6\u03e8", + "\7N\2\2\u03e7\u03e3\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u00f8\3\2\2\2", + "\u03e9\u03ec\5\u00fb~\2\u03ea\u03ec\5\u00fd\177\2\u03eb\u03e9\3\2\2", + "\2\u03eb\u03ea\3\2\2\2\u03ec\u00fa\3\2\2\2\u03ed\u03ef\5\u00ff\u0080", + "\2\u03ee\u03f0\5\u0101\u0081\2\u03ef\u03ee\3\2\2\2\u03ef\u03f0\3\2\2", + "\2\u03f0\u03f2\3\2\2\2\u03f1\u03f3\5\u010d\u0087\2\u03f2\u03f1\3\2\2", + "\2\u03f2\u03f3\3\2\2\2\u03f3\u03fa\3\2\2\2\u03f4\u03f5\5\u0105\u0083", + "\2\u03f5\u03f7\5\u0101\u0081\2\u03f6\u03f8\5\u010d\u0087\2\u03f7\u03f6", + "\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u03fa\3\2\2\2\u03f9\u03ed\3\2\2\2", + "\u03f9\u03f4\3\2\2\2\u03fa\u00fc\3\2\2\2\u03fb\u03fc\5\u00e9u\2\u03fc", + "\u03fd\5\u0107\u0084\2\u03fd\u03ff\5\u0109\u0085\2\u03fe\u0400\5\u010d", + "\u0087\2\u03ff\u03fe\3\2\2\2\u03ff\u0400\3\2\2\2\u0400\u0408\3\2\2\2", + "\u0401\u0402\5\u00e9u\2\u0402\u0403\5\u010b\u0086\2\u0403\u0405\5\u0109", + "\u0085\2\u0404\u0406\5\u010d\u0087\2\u0405\u0404\3\2\2\2\u0405\u0406", + "\3\2\2\2\u0406\u0408\3\2\2\2\u0407\u03fb\3\2\2\2\u0407\u0401\3\2\2\2", + "\u0408\u00fe\3\2\2\2\u0409\u040b\5\u0105\u0083\2\u040a\u0409\3\2\2\2", + "\u040a\u040b\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u040d\7\60\2\2\u040d", + "\u0412\5\u0105\u0083\2\u040e\u040f\5\u0105\u0083\2\u040f\u0410\7\60", + "\2\2\u0410\u0412\3\2\2\2\u0411\u040a\3\2\2\2\u0411\u040e\3\2\2\2\u0412", + "\u0100\3\2\2\2\u0413\u0415\7g\2\2\u0414\u0416\5\u0103\u0082\2\u0415", + "\u0414\3\2\2\2\u0415\u0416\3\2\2\2\u0416\u0417\3\2\2\2\u0417\u041e\5", + "\u0105\u0083\2\u0418\u041a\7G\2\2\u0419\u041b\5\u0103\u0082\2\u041a", + "\u0419\3\2\2\2\u041a\u041b\3\2\2\2\u041b\u041c\3\2\2\2\u041c\u041e\5", + "\u0105\u0083\2\u041d\u0413\3\2\2\2\u041d\u0418\3\2\2\2\u041e\u0102\3", + "\2\2\2\u041f\u0420\t\n\2\2\u0420\u0104\3\2\2\2\u0421\u0423\5\u00d9m", + "\2\u0422\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u0422\3\2\2\2\u0424", + "\u0425\3\2\2\2\u0425\u0106\3\2\2\2\u0426\u0428\5\u010b\u0086\2\u0427", + "\u0426\3\2\2\2\u0427\u0428\3\2\2\2\u0428\u0429\3\2\2\2\u0429\u042a\7", + "\60\2\2\u042a\u042f\5\u010b\u0086\2\u042b\u042c\5\u010b\u0086\2\u042c", + "\u042d\7\60\2\2\u042d\u042f\3\2\2\2\u042e\u0427\3\2\2\2\u042e\u042b", + "\3\2\2\2\u042f\u0108\3\2\2\2\u0430\u0432\7r\2\2\u0431\u0433\5\u0103", + "\u0082\2\u0432\u0431\3\2\2\2\u0432\u0433\3\2\2\2\u0433\u0434\3\2\2\2", + "\u0434\u043b\5\u0105\u0083\2\u0435\u0437\7R\2\2\u0436\u0438\5\u0103", + "\u0082\2\u0437\u0436\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\3\2\2\2", + "\u0439\u043b\5\u0105\u0083\2\u043a\u0430\3\2\2\2\u043a\u0435\3\2\2\2", + "\u043b\u010a\3\2\2\2\u043c\u043e\5\u00efx\2\u043d\u043c\3\2\2\2\u043e", + "\u043f\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u0440\3\2\2\2\u0440\u010c\3", + "\2\2\2\u0441\u0442\t\13\2\2\u0442\u010e\3\2\2\2\u0443\u0444\7)\2\2\u0444", + "\u0445\5\u0111\u0089\2\u0445\u0446\7)\2\2\u0446\u045a\3\2\2\2\u0447", + "\u0448\7N\2\2\u0448\u0449\7)\2\2\u0449\u044a\3\2\2\2\u044a\u044b\5\u0111", + "\u0089\2\u044b\u044c\7)\2\2\u044c\u045a\3\2\2\2\u044d\u044e\7w\2\2\u044e", + "\u044f\7)\2\2\u044f\u0450\3\2\2\2\u0450\u0451\5\u0111\u0089\2\u0451", + "\u0452\7)\2\2\u0452\u045a\3\2\2\2\u0453\u0454\7W\2\2\u0454\u0455\7)", + "\2\2\u0455\u0456\3\2\2\2\u0456\u0457\5\u0111\u0089\2\u0457\u0458\7)", + "\2\2\u0458\u045a\3\2\2\2\u0459\u0443\3\2\2\2\u0459\u0447\3\2\2\2\u0459", + "\u044d\3\2\2\2\u0459\u0453\3\2\2\2\u045a\u0110\3\2\2\2\u045b\u045d\5", + "\u0113\u008a\2\u045c\u045b\3\2\2\2\u045d\u045e\3\2\2\2\u045e\u045c\3", + "\2\2\2\u045e\u045f\3\2\2\2\u045f\u0112\3\2\2\2\u0460\u0463\n\f\2\2\u0461", + "\u0463\5\u0115\u008b\2\u0462\u0460\3\2\2\2\u0462\u0461\3\2\2\2\u0463", + "\u0114\3\2\2\2\u0464\u0469\5\u0117\u008c\2\u0465\u0469\5\u0119\u008d", + "\2\u0466\u0469\5\u011b\u008e\2\u0467\u0469\5\u00dbn\2\u0468\u0464\3", + "\2\2\2\u0468\u0465\3\2\2\2\u0468\u0466\3\2\2\2\u0468\u0467\3\2\2\2\u0469", + "\u0116\3\2\2\2\u046a\u046b\7^\2\2\u046b\u046c\t\r\2\2\u046c\u0118\3", + "\2\2\2\u046d\u046e\7^\2\2\u046e\u0479\5\u00edw\2\u046f\u0470\7^\2\2", + "\u0470\u0471\5\u00edw\2\u0471\u0472\5\u00edw\2\u0472\u0479\3\2\2\2\u0473", + "\u0474\7^\2\2\u0474\u0475\5\u00edw\2\u0475\u0476\5\u00edw\2\u0476\u0477", + "\5\u00edw\2\u0477\u0479\3\2\2\2\u0478\u046d\3\2\2\2\u0478\u046f\3\2", + "\2\2\u0478\u0473\3\2\2\2\u0479\u011a\3\2\2\2\u047a\u047b\7^\2\2\u047b", + "\u047c\7z\2\2\u047c\u047e\3\2\2\2\u047d\u047f\5\u00efx\2\u047e\u047d", + "\3\2\2\2\u047f\u0480\3\2\2\2\u0480\u047e\3\2\2\2\u0480\u0481\3\2\2\2", + "\u0481\u011c\3\2\2\2\u0482\u0484\5\u0121\u0091\2\u0483\u0482\3\2\2\2", + "\u0483\u0484\3\2\2\2\u0484\u0485\3\2\2\2\u0485\u0487\7$\2\2\u0486\u0488", + "\5\u0123\u0092\2\u0487\u0486\3\2\2\2\u0487\u0488\3\2\2\2\u0488\u0489", + "\3\2\2\2\u0489\u048a\7$\2\2\u048a\u011e\3\2\2\2\u048b\u048c\7>\2\2\u048c", + "\u048d\5\u0123\u0092\2\u048d\u048e\7@\2\2\u048e\u0120\3\2\2\2\u048f", + "\u0490\7w\2\2\u0490\u0493\7:\2\2\u0491\u0493\t\16\2\2\u0492\u048f\3", + "\2\2\2\u0492\u0491\3\2\2\2\u0493\u0122\3\2\2\2\u0494\u0496\5\u0125\u0093", + "\2\u0495\u0494\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0495\3\2\2\2\u0497", + "\u0498\3\2\2\2\u0498\u0124\3\2\2\2\u0499\u049c\n\17\2\2\u049a\u049c", + "\5\u0115\u008b\2\u049b\u0499\3\2\2\2\u049b\u049a\3\2\2\2\u049c\u0126", + "\3\2\2\2\u049d\u04a1\7%\2\2\u049e\u04a0\t\20\2\2\u049f\u049e\3\2\2\2", + "\u04a0\u04a3\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a1\u049f\3\2\2\2\u04a2\u04a7", + "\3\2\2\2\u04a3\u04a1\3\2\2\2\u04a4\u04a6\n\21\2\2\u04a5\u04a4\3\2\2", + "\2\u04a6\u04a9\3\2\2\2\u04a7\u04a5\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8", + "\u04aa\3\2\2\2\u04a9\u04a7\3\2\2\2\u04aa\u04ab\b\u0094\2\2\u04ab\u0128", + "\3\2\2\2\u04ac\u04ae\t\22\2\2\u04ad\u04ac\3\2\2\2\u04ae\u04af\3\2\2", + "\2\u04af\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04b1\3\2\2\2\u04b1", + "\u04b2\b\u0095\2\2\u04b2\u012a\3\2\2\2\u04b3\u04b5\7\17\2\2\u04b4\u04b6", + "\7\f\2\2\u04b5\u04b4\3\2\2\2\u04b5\u04b6\3\2\2\2\u04b6\u04b9\3\2\2\2", + "\u04b7\u04b9\7\f\2\2\u04b8\u04b3\3\2\2\2\u04b8\u04b7\3\2\2\2\u04b9\u04ba", + "\3\2\2\2\u04ba\u04bb\b\u0096\2\2\u04bb\u012c\3\2\2\2\u04bc\u04bd\7\61", + "\2\2\u04bd\u04be\7,\2\2\u04be\u04c2\3\2\2\2\u04bf\u04c1\13\2\2\2\u04c0", + "\u04bf\3\2\2\2\u04c1\u04c4\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c2\u04c0\3", + "\2\2\2\u04c3\u04c5\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c5\u04c6\7,\2\2\u04c6", + "\u04c7\7\61\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04c9\b\u0097\2\2\u04c9\u012e", + "\3\2\2\2\u04ca\u04cb\7\61\2\2\u04cb\u04cc\7\61\2\2\u04cc\u04d0\3\2\2", + "\2\u04cd\u04cf\n\21\2\2\u04ce\u04cd\3\2\2\2\u04cf\u04d2\3\2\2\2\u04d0", + "\u04ce\3\2\2\2\u04d0\u04d1\3\2\2\2\u04d1\u04d3\3\2\2\2\u04d2\u04d0\3", + "\2\2\2\u04d3\u04d4\b\u0098\2\2\u04d4\u0130\3\2\2\2:\2\u0380\u0382\u0387", + "\u0397\u03a1\u03a5\u03a9\u03ad\u03af\u03b5\u03bc\u03c3\u03d0\u03d7\u03db", + "\u03dd\u03e7\u03eb\u03ef\u03f2\u03f7\u03f9\u03ff\u0405\u0407\u040a\u0411", + "\u0415\u041a\u041d\u0424\u0427\u042e\u0432\u0437\u043a\u043f\u0459\u045e", + "\u0462\u0468\u0478\u0480\u0483\u0487\u0492\u0497\u049b\u04a1\u04a7\u04af", + "\u04b5\u04b8\u04c2\u04d0\3\b\2\2"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -513,109 +492,105 @@ CLexer.T__10 = 11; CLexer.T__11 = 12; CLexer.T__12 = 13; CLexer.T__13 = 14; -CLexer.T__14 = 15; -CLexer.T__15 = 16; -CLexer.T__16 = 17; -CLexer.Auto = 18; -CLexer.Break = 19; -CLexer.Case = 20; -CLexer.Char = 21; -CLexer.Const = 22; -CLexer.Continue = 23; -CLexer.Default = 24; -CLexer.Do = 25; -CLexer.Double = 26; -CLexer.Else = 27; -CLexer.Enum = 28; -CLexer.Extern = 29; -CLexer.Float = 30; -CLexer.For = 31; -CLexer.Goto = 32; -CLexer.If = 33; -CLexer.Inline = 34; -CLexer.Int = 35; -CLexer.Long = 36; -CLexer.Register = 37; -CLexer.Restrict = 38; -CLexer.Return = 39; -CLexer.Short = 40; -CLexer.Signed = 41; -CLexer.Sizeof = 42; -CLexer.Static = 43; -CLexer.Struct = 44; -CLexer.Switch = 45; -CLexer.Typedef = 46; -CLexer.Union = 47; -CLexer.Unsigned = 48; -CLexer.Void = 49; -CLexer.Volatile = 50; -CLexer.While = 51; -CLexer.Alignas = 52; -CLexer.Alignof = 53; -CLexer.Atomic = 54; -CLexer.Bool = 55; -CLexer.Complex = 56; -CLexer.Generic = 57; -CLexer.Imaginary = 58; -CLexer.Noreturn = 59; -CLexer.StaticAssert = 60; -CLexer.ThreadLocal = 61; -CLexer.LeftParen = 62; -CLexer.RightParen = 63; -CLexer.LeftBracket = 64; -CLexer.RightBracket = 65; -CLexer.LeftBrace = 66; -CLexer.RightBrace = 67; -CLexer.Less = 68; -CLexer.LessEqual = 69; -CLexer.Greater = 70; -CLexer.GreaterEqual = 71; -CLexer.LeftShift = 72; -CLexer.RightShift = 73; -CLexer.Plus = 74; -CLexer.PlusPlus = 75; -CLexer.Minus = 76; -CLexer.MinusMinus = 77; -CLexer.Star = 78; -CLexer.Div = 79; -CLexer.Mod = 80; -CLexer.And = 81; -CLexer.Or = 82; -CLexer.AndAnd = 83; -CLexer.OrOr = 84; -CLexer.Caret = 85; -CLexer.Not = 86; -CLexer.Tilde = 87; -CLexer.Question = 88; -CLexer.Colon = 89; -CLexer.Semi = 90; -CLexer.Comma = 91; -CLexer.Assign = 92; -CLexer.StarAssign = 93; -CLexer.DivAssign = 94; -CLexer.ModAssign = 95; -CLexer.PlusAssign = 96; -CLexer.MinusAssign = 97; -CLexer.LeftShiftAssign = 98; -CLexer.RightShiftAssign = 99; -CLexer.AndAssign = 100; -CLexer.XorAssign = 101; -CLexer.OrAssign = 102; -CLexer.Equal = 103; -CLexer.NotEqual = 104; -CLexer.Arrow = 105; -CLexer.Dot = 106; -CLexer.Ellipsis = 107; -CLexer.Identifier = 108; -CLexer.Constant = 109; -CLexer.StringLiteral = 110; -CLexer.SharedIncludeLiteral = 111; -CLexer.LineDirective = 112; -CLexer.PragmaDirective = 113; -CLexer.Whitespace = 114; -CLexer.Newline = 115; -CLexer.BlockComment = 116; -CLexer.LineComment = 117; +CLexer.Auto = 15; +CLexer.Break = 16; +CLexer.Case = 17; +CLexer.Char = 18; +CLexer.Const = 19; +CLexer.Continue = 20; +CLexer.Default = 21; +CLexer.Do = 22; +CLexer.Double = 23; +CLexer.Else = 24; +CLexer.Enum = 25; +CLexer.Extern = 26; +CLexer.Float = 27; +CLexer.For = 28; +CLexer.Goto = 29; +CLexer.If = 30; +CLexer.Inline = 31; +CLexer.Int = 32; +CLexer.Long = 33; +CLexer.Register = 34; +CLexer.Restrict = 35; +CLexer.Return = 36; +CLexer.Short = 37; +CLexer.Signed = 38; +CLexer.Sizeof = 39; +CLexer.Static = 40; +CLexer.Struct = 41; +CLexer.Switch = 42; +CLexer.Typedef = 43; +CLexer.Union = 44; +CLexer.Unsigned = 45; +CLexer.Void = 46; +CLexer.Volatile = 47; +CLexer.While = 48; +CLexer.Alignas = 49; +CLexer.Alignof = 50; +CLexer.Atomic = 51; +CLexer.Bool = 52; +CLexer.Complex = 53; +CLexer.Generic = 54; +CLexer.Imaginary = 55; +CLexer.Noreturn = 56; +CLexer.StaticAssert = 57; +CLexer.ThreadLocal = 58; +CLexer.LeftParen = 59; +CLexer.RightParen = 60; +CLexer.LeftBracket = 61; +CLexer.RightBracket = 62; +CLexer.LeftBrace = 63; +CLexer.RightBrace = 64; +CLexer.Less = 65; +CLexer.LessEqual = 66; +CLexer.Greater = 67; +CLexer.GreaterEqual = 68; +CLexer.LeftShift = 69; +CLexer.RightShift = 70; +CLexer.Plus = 71; +CLexer.PlusPlus = 72; +CLexer.Minus = 73; +CLexer.MinusMinus = 74; +CLexer.Star = 75; +CLexer.Div = 76; +CLexer.Mod = 77; +CLexer.And = 78; +CLexer.Or = 79; +CLexer.AndAnd = 80; +CLexer.OrOr = 81; +CLexer.Caret = 82; +CLexer.Not = 83; +CLexer.Tilde = 84; +CLexer.Question = 85; +CLexer.Colon = 86; +CLexer.Semi = 87; +CLexer.Comma = 88; +CLexer.Assign = 89; +CLexer.StarAssign = 90; +CLexer.DivAssign = 91; +CLexer.ModAssign = 92; +CLexer.PlusAssign = 93; +CLexer.MinusAssign = 94; +CLexer.LeftShiftAssign = 95; +CLexer.RightShiftAssign = 96; +CLexer.AndAssign = 97; +CLexer.XorAssign = 98; +CLexer.OrAssign = 99; +CLexer.Equal = 100; +CLexer.NotEqual = 101; +CLexer.Arrow = 102; +CLexer.Dot = 103; +CLexer.Ellipsis = 104; +CLexer.Identifier = 105; +CLexer.Constant = 106; +CLexer.StringLiteral = 107; +CLexer.SharedIncludeLiteral = 108; +CLexer.Directive = 109; +CLexer.Whitespace = 110; +CLexer.Newline = 111; +CLexer.BlockComment = 112; +CLexer.LineComment = 113; CLexer.modeNames = [ "DEFAULT_MODE" ]; @@ -624,17 +599,16 @@ CLexer.literalNames = [ 'null', "'__extension__'", "'__builtin_va_arg'", "'__builtin_offsetof'", "'__m128'", "'__m128d'", "'__m128i'", "'__typeof__'", "'__inline__'", "'__stdcall'", "'__declspec'", "'__asm'", "'__attribute__'", "'__asm__'", - "'__volatile__'", "'#'", "'include'", "'define'", - "'auto'", "'break'", "'case'", "'char'", "'const'", - "'continue'", "'default'", "'do'", "'double'", "'else'", - "'enum'", "'extern'", "'float'", "'for'", "'goto'", - "'if'", "'inline'", "'int'", "'long'", "'register'", - "'restrict'", "'return'", "'short'", "'signed'", - "'sizeof'", "'static'", "'struct'", "'switch'", - "'typedef'", "'union'", "'unsigned'", "'void'", - "'volatile'", "'while'", "'_Alignas'", "'_Alignof'", - "'_Atomic'", "'_Bool'", "'_Complex'", "'_Generic'", - "'_Imaginary'", "'_Noreturn'", "'_Static_assert'", + "'__volatile__'", "'auto'", "'break'", "'case'", + "'char'", "'const'", "'continue'", "'default'", + "'do'", "'double'", "'else'", "'enum'", "'extern'", + "'float'", "'for'", "'goto'", "'if'", "'inline'", + "'int'", "'long'", "'register'", "'restrict'", "'return'", + "'short'", "'signed'", "'sizeof'", "'static'", "'struct'", + "'switch'", "'typedef'", "'union'", "'unsigned'", + "'void'", "'volatile'", "'while'", "'_Alignas'", + "'_Alignof'", "'_Atomic'", "'_Bool'", "'_Complex'", + "'_Generic'", "'_Imaginary'", "'_Noreturn'", "'_Static_assert'", "'_Thread_local'", "'('", "')'", "'['", "']'", "'{'", "'}'", "'<'", "'<='", "'>'", "'>='", "'<<'", "'>>'", "'+'", "'++'", "'-'", "'--'", "'*'", "'/'", "'%'", @@ -645,18 +619,17 @@ CLexer.literalNames = [ 'null', "'__extension__'", "'__builtin_va_arg'", CLexer.symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', - 'null', 'null', 'null', 'null', 'null', 'null', - "Auto", "Break", "Case", "Char", "Const", "Continue", - "Default", "Do", "Double", "Else", "Enum", "Extern", - "Float", "For", "Goto", "If", "Inline", "Int", - "Long", "Register", "Restrict", "Return", "Short", - "Signed", "Sizeof", "Static", "Struct", "Switch", - "Typedef", "Union", "Unsigned", "Void", "Volatile", - "While", "Alignas", "Alignof", "Atomic", "Bool", - "Complex", "Generic", "Imaginary", "Noreturn", - "StaticAssert", "ThreadLocal", "LeftParen", "RightParen", - "LeftBracket", "RightBracket", "LeftBrace", "RightBrace", - "Less", "LessEqual", "Greater", "GreaterEqual", + 'null', 'null', 'null', "Auto", "Break", "Case", + "Char", "Const", "Continue", "Default", "Do", "Double", + "Else", "Enum", "Extern", "Float", "For", "Goto", + "If", "Inline", "Int", "Long", "Register", "Restrict", + "Return", "Short", "Signed", "Sizeof", "Static", + "Struct", "Switch", "Typedef", "Union", "Unsigned", + "Void", "Volatile", "While", "Alignas", "Alignof", + "Atomic", "Bool", "Complex", "Generic", "Imaginary", + "Noreturn", "StaticAssert", "ThreadLocal", "LeftParen", + "RightParen", "LeftBracket", "RightBracket", "LeftBrace", + "RightBrace", "Less", "LessEqual", "Greater", "GreaterEqual", "LeftShift", "RightShift", "Plus", "PlusPlus", "Minus", "MinusMinus", "Star", "Div", "Mod", "And", "Or", "AndAnd", "OrOr", "Caret", "Not", "Tilde", @@ -666,33 +639,33 @@ CLexer.symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', "AndAssign", "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", "Constant", "StringLiteral", "SharedIncludeLiteral", - "LineDirective", "PragmaDirective", "Whitespace", - "Newline", "BlockComment", "LineComment" ]; + "Directive", "Whitespace", "Newline", "BlockComment", + "LineComment" ]; CLexer.ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", "T__9", "T__10", "T__11", "T__12", - "T__13", "T__14", "T__15", "T__16", "Auto", "Break", - "Case", "Char", "Const", "Continue", "Default", "Do", - "Double", "Else", "Enum", "Extern", "Float", "For", - "Goto", "If", "Inline", "Int", "Long", "Register", - "Restrict", "Return", "Short", "Signed", "Sizeof", - "Static", "Struct", "Switch", "Typedef", "Union", "Unsigned", - "Void", "Volatile", "While", "Alignas", "Alignof", - "Atomic", "Bool", "Complex", "Generic", "Imaginary", - "Noreturn", "StaticAssert", "ThreadLocal", "LeftParen", - "RightParen", "LeftBracket", "RightBracket", "LeftBrace", - "RightBrace", "Less", "LessEqual", "Greater", "GreaterEqual", - "LeftShift", "RightShift", "Plus", "PlusPlus", "Minus", - "MinusMinus", "Star", "Div", "Mod", "And", "Or", "AndAnd", - "OrOr", "Caret", "Not", "Tilde", "Question", "Colon", - "Semi", "Comma", "Assign", "StarAssign", "DivAssign", - "ModAssign", "PlusAssign", "MinusAssign", "LeftShiftAssign", - "RightShiftAssign", "AndAssign", "XorAssign", "OrAssign", - "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", - "IdentifierNondigit", "Nondigit", "Digit", "UniversalCharacterName", - "HexQuad", "Constant", "IntegerConstant", "DecimalConstant", - "OctalConstant", "HexadecimalConstant", "HexadecimalPrefix", - "NonzeroDigit", "OctalDigit", "HexadecimalDigit", "IntegerSuffix", + "T__13", "Auto", "Break", "Case", "Char", "Const", + "Continue", "Default", "Do", "Double", "Else", "Enum", + "Extern", "Float", "For", "Goto", "If", "Inline", "Int", + "Long", "Register", "Restrict", "Return", "Short", + "Signed", "Sizeof", "Static", "Struct", "Switch", "Typedef", + "Union", "Unsigned", "Void", "Volatile", "While", "Alignas", + "Alignof", "Atomic", "Bool", "Complex", "Generic", + "Imaginary", "Noreturn", "StaticAssert", "ThreadLocal", + "LeftParen", "RightParen", "LeftBracket", "RightBracket", + "LeftBrace", "RightBrace", "Less", "LessEqual", "Greater", + "GreaterEqual", "LeftShift", "RightShift", "Plus", + "PlusPlus", "Minus", "MinusMinus", "Star", "Div", "Mod", + "And", "Or", "AndAnd", "OrOr", "Caret", "Not", "Tilde", + "Question", "Colon", "Semi", "Comma", "Assign", "StarAssign", + "DivAssign", "ModAssign", "PlusAssign", "MinusAssign", + "LeftShiftAssign", "RightShiftAssign", "AndAssign", + "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", + "Dot", "Ellipsis", "Identifier", "IdentifierNondigit", + "Nondigit", "Digit", "UniversalCharacterName", "HexQuad", + "Constant", "IntegerConstant", "DecimalConstant", "OctalConstant", + "HexadecimalConstant", "HexadecimalPrefix", "NonzeroDigit", + "OctalDigit", "HexadecimalDigit", "IntegerSuffix", "UnsignedSuffix", "LongSuffix", "LongLongSuffix", "FloatingConstant", "DecimalFloatingConstant", "HexadecimalFloatingConstant", "FractionalConstant", "ExponentPart", "Sign", "DigitSequence", @@ -701,8 +674,8 @@ CLexer.ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "CCharSequence", "CChar", "EscapeSequence", "SimpleEscapeSequence", "OctalEscapeSequence", "HexadecimalEscapeSequence", "StringLiteral", "SharedIncludeLiteral", "EncodingPrefix", - "SCharSequence", "SChar", "LineDirective", "PragmaDirective", - "Whitespace", "Newline", "BlockComment", "LineComment" ]; + "SCharSequence", "SChar", "Directive", "Whitespace", + "Newline", "BlockComment", "LineComment" ]; CLexer.grammarFileName = "C.g4"; diff --git a/antlr/CLexer.tokens b/antlr/CLexer.tokens index e88e63cc..c5ebf233 100644 --- a/antlr/CLexer.tokens +++ b/antlr/CLexer.tokens @@ -12,109 +12,105 @@ T__10=11 T__11=12 T__12=13 T__13=14 -T__14=15 -T__15=16 -T__16=17 -Auto=18 -Break=19 -Case=20 -Char=21 -Const=22 -Continue=23 -Default=24 -Do=25 -Double=26 -Else=27 -Enum=28 -Extern=29 -Float=30 -For=31 -Goto=32 -If=33 -Inline=34 -Int=35 -Long=36 -Register=37 -Restrict=38 -Return=39 -Short=40 -Signed=41 -Sizeof=42 -Static=43 -Struct=44 -Switch=45 -Typedef=46 -Union=47 -Unsigned=48 -Void=49 -Volatile=50 -While=51 -Alignas=52 -Alignof=53 -Atomic=54 -Bool=55 -Complex=56 -Generic=57 -Imaginary=58 -Noreturn=59 -StaticAssert=60 -ThreadLocal=61 -LeftParen=62 -RightParen=63 -LeftBracket=64 -RightBracket=65 -LeftBrace=66 -RightBrace=67 -Less=68 -LessEqual=69 -Greater=70 -GreaterEqual=71 -LeftShift=72 -RightShift=73 -Plus=74 -PlusPlus=75 -Minus=76 -MinusMinus=77 -Star=78 -Div=79 -Mod=80 -And=81 -Or=82 -AndAnd=83 -OrOr=84 -Caret=85 -Not=86 -Tilde=87 -Question=88 -Colon=89 -Semi=90 -Comma=91 -Assign=92 -StarAssign=93 -DivAssign=94 -ModAssign=95 -PlusAssign=96 -MinusAssign=97 -LeftShiftAssign=98 -RightShiftAssign=99 -AndAssign=100 -XorAssign=101 -OrAssign=102 -Equal=103 -NotEqual=104 -Arrow=105 -Dot=106 -Ellipsis=107 -Identifier=108 -Constant=109 -StringLiteral=110 -SharedIncludeLiteral=111 -LineDirective=112 -PragmaDirective=113 -Whitespace=114 -Newline=115 -BlockComment=116 -LineComment=117 +Auto=15 +Break=16 +Case=17 +Char=18 +Const=19 +Continue=20 +Default=21 +Do=22 +Double=23 +Else=24 +Enum=25 +Extern=26 +Float=27 +For=28 +Goto=29 +If=30 +Inline=31 +Int=32 +Long=33 +Register=34 +Restrict=35 +Return=36 +Short=37 +Signed=38 +Sizeof=39 +Static=40 +Struct=41 +Switch=42 +Typedef=43 +Union=44 +Unsigned=45 +Void=46 +Volatile=47 +While=48 +Alignas=49 +Alignof=50 +Atomic=51 +Bool=52 +Complex=53 +Generic=54 +Imaginary=55 +Noreturn=56 +StaticAssert=57 +ThreadLocal=58 +LeftParen=59 +RightParen=60 +LeftBracket=61 +RightBracket=62 +LeftBrace=63 +RightBrace=64 +Less=65 +LessEqual=66 +Greater=67 +GreaterEqual=68 +LeftShift=69 +RightShift=70 +Plus=71 +PlusPlus=72 +Minus=73 +MinusMinus=74 +Star=75 +Div=76 +Mod=77 +And=78 +Or=79 +AndAnd=80 +OrOr=81 +Caret=82 +Not=83 +Tilde=84 +Question=85 +Colon=86 +Semi=87 +Comma=88 +Assign=89 +StarAssign=90 +DivAssign=91 +ModAssign=92 +PlusAssign=93 +MinusAssign=94 +LeftShiftAssign=95 +RightShiftAssign=96 +AndAssign=97 +XorAssign=98 +OrAssign=99 +Equal=100 +NotEqual=101 +Arrow=102 +Dot=103 +Ellipsis=104 +Identifier=105 +Constant=106 +StringLiteral=107 +SharedIncludeLiteral=108 +Directive=109 +Whitespace=110 +Newline=111 +BlockComment=112 +LineComment=113 '__extension__'=1 '__builtin_va_arg'=2 '__builtin_offsetof'=3 @@ -129,96 +125,93 @@ LineComment=117 '__attribute__'=12 '__asm__'=13 '__volatile__'=14 -'#'=15 -'include'=16 -'define'=17 -'auto'=18 -'break'=19 -'case'=20 -'char'=21 -'const'=22 -'continue'=23 -'default'=24 -'do'=25 -'double'=26 -'else'=27 -'enum'=28 -'extern'=29 -'float'=30 -'for'=31 -'goto'=32 -'if'=33 -'inline'=34 -'int'=35 -'long'=36 -'register'=37 -'restrict'=38 -'return'=39 -'short'=40 -'signed'=41 -'sizeof'=42 -'static'=43 -'struct'=44 -'switch'=45 -'typedef'=46 -'union'=47 -'unsigned'=48 -'void'=49 -'volatile'=50 -'while'=51 -'_Alignas'=52 -'_Alignof'=53 -'_Atomic'=54 -'_Bool'=55 -'_Complex'=56 -'_Generic'=57 -'_Imaginary'=58 -'_Noreturn'=59 -'_Static_assert'=60 -'_Thread_local'=61 -'('=62 -')'=63 -'['=64 -']'=65 -'{'=66 -'}'=67 -'<'=68 -'<='=69 -'>'=70 -'>='=71 -'<<'=72 -'>>'=73 -'+'=74 -'++'=75 -'-'=76 -'--'=77 -'*'=78 -'/'=79 -'%'=80 -'&'=81 -'|'=82 -'&&'=83 -'||'=84 -'^'=85 -'!'=86 -'~'=87 -'?'=88 -':'=89 -';'=90 -','=91 -'='=92 -'*='=93 -'/='=94 -'%='=95 -'+='=96 -'-='=97 -'<<='=98 -'>>='=99 -'&='=100 -'^='=101 -'|='=102 -'=='=103 -'!='=104 -'->'=105 -'.'=106 -'...'=107 +'auto'=15 +'break'=16 +'case'=17 +'char'=18 +'const'=19 +'continue'=20 +'default'=21 +'do'=22 +'double'=23 +'else'=24 +'enum'=25 +'extern'=26 +'float'=27 +'for'=28 +'goto'=29 +'if'=30 +'inline'=31 +'int'=32 +'long'=33 +'register'=34 +'restrict'=35 +'return'=36 +'short'=37 +'signed'=38 +'sizeof'=39 +'static'=40 +'struct'=41 +'switch'=42 +'typedef'=43 +'union'=44 +'unsigned'=45 +'void'=46 +'volatile'=47 +'while'=48 +'_Alignas'=49 +'_Alignof'=50 +'_Atomic'=51 +'_Bool'=52 +'_Complex'=53 +'_Generic'=54 +'_Imaginary'=55 +'_Noreturn'=56 +'_Static_assert'=57 +'_Thread_local'=58 +'('=59 +')'=60 +'['=61 +']'=62 +'{'=63 +'}'=64 +'<'=65 +'<='=66 +'>'=67 +'>='=68 +'<<'=69 +'>>'=70 +'+'=71 +'++'=72 +'-'=73 +'--'=74 +'*'=75 +'/'=76 +'%'=77 +'&'=78 +'|'=79 +'&&'=80 +'||'=81 +'^'=82 +'!'=83 +'~'=84 +'?'=85 +':'=86 +';'=87 +','=88 +'='=89 +'*='=90 +'/='=91 +'%='=92 +'+='=93 +'-='=94 +'<<='=95 +'>>='=96 +'&='=97 +'^='=98 +'|='=99 +'=='=100 +'!='=101 +'->'=102 +'.'=103 +'...'=104 diff --git a/antlr/CListener.js b/antlr/CListener.js index b2611eef..a0bd03dd 100644 --- a/antlr/CListener.js +++ b/antlr/CListener.js @@ -749,69 +749,6 @@ CListener.prototype.exitTranslationUnit = function(ctx) { }; -// Enter a parse tree produced by CParser#includeDirective. -CListener.prototype.enterIncludeDirective = function(ctx) { -}; - -// Exit a parse tree produced by CParser#includeDirective. -CListener.prototype.exitIncludeDirective = function(ctx) { -}; - - -// Enter a parse tree produced by CParser#defineDirective. -CListener.prototype.enterDefineDirective = function(ctx) { -}; - -// Exit a parse tree produced by CParser#defineDirective. -CListener.prototype.exitDefineDirective = function(ctx) { -}; - - -// Enter a parse tree produced by CParser#defineDirectiveNoVal. -CListener.prototype.enterDefineDirectiveNoVal = function(ctx) { -}; - -// Exit a parse tree produced by CParser#defineDirectiveNoVal. -CListener.prototype.exitDefineDirectiveNoVal = function(ctx) { -}; - - -// Enter a parse tree produced by CParser#defineDirectiveNoParams. -CListener.prototype.enterDefineDirectiveNoParams = function(ctx) { -}; - -// Exit a parse tree produced by CParser#defineDirectiveNoParams. -CListener.prototype.exitDefineDirectiveNoParams = function(ctx) { -}; - - -// Enter a parse tree produced by CParser#defineDirectiveWithParams. -CListener.prototype.enterDefineDirectiveWithParams = function(ctx) { -}; - -// Exit a parse tree produced by CParser#defineDirectiveWithParams. -CListener.prototype.exitDefineDirectiveWithParams = function(ctx) { -}; - - -// Enter a parse tree produced by CParser#macroResult. -CListener.prototype.enterMacroResult = function(ctx) { -}; - -// Exit a parse tree produced by CParser#macroResult. -CListener.prototype.exitMacroResult = function(ctx) { -}; - - -// Enter a parse tree produced by CParser#macroParamList. -CListener.prototype.enterMacroParamList = function(ctx) { -}; - -// Exit a parse tree produced by CParser#macroParamList. -CListener.prototype.exitMacroParamList = function(ctx) { -}; - - // Enter a parse tree produced by CParser#externalDeclaration. CListener.prototype.enterExternalDeclaration = function(ctx) { }; diff --git a/antlr/CParser.js b/antlr/CParser.js index 54ec9897..5281f392 100644 --- a/antlr/CParser.js +++ b/antlr/CParser.js @@ -5,7 +5,7 @@ var CListener = require('./CListener').CListener; var grammarFileName = "C.g4"; var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\3w\u0528\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", + "\3s\u04ed\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", "\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t", "\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27", "\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4", @@ -14,512 +14,491 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\61\4\62\t\62\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t", "8\49\t9\4:\t:\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC", "\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4", - "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z", - "\tZ\4[\t[\4\\\t\\\4]\t]\3\2\3\2\3\2\6\2\u00be\n\2\r\2\16\2\u00bf\3\2", - "\3\2\3\2\3\2\3\2\3\2\5\2\u00c8\n\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3", - "\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00dc\n\2\3\3\3\3\3\3\3\3", - "\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u00eb\n\4\f\4\16\4\u00ee\13", - "\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u00f7\n\5\3\6\3\6\3\6\3\6\3\6\3\6", + "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\3\2\3\2\3\2\6\2\u00b0", + "\n\2\r\2\16\2\u00b1\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00ba\n\2\3\2\3\2\3", + "\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00ce", + "\n\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u00dd\n", + "\4\f\4\16\4\u00e0\13\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u00e9\n\5\3\6", "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", - "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u011b\n\6\3\6\3\6\3", - "\6\3\6\3\6\3\6\3\6\3\6\5\6\u0125\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", - "\3\6\3\6\3\6\7\6\u0132\n\6\f\6\16\6\u0135\13\6\3\7\3\7\3\7\3\7\3\7\3", - "\7\7\7\u013d\n\7\f\7\16\7\u0140\13\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", - "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\5\b\u0158\n", - "\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u0168", - "\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13", - "\u0176\n\13\f\13\16\13\u0179\13\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3", - "\f\7\f\u0184\n\f\f\f\16\f\u0187\13\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", - "\3\r\7\r\u0192\n\r\f\r\16\r\u0195\13\r\3\16\3\16\3\16\3\16\3\16\3\16", - "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\7\16\u01a6\n\16\f\16\16", - "\16\u01a9\13\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\7\17\u01b4", - "\n\17\f\17\16\17\u01b7\13\17\3\20\3\20\3\20\3\20\3\20\3\20\7\20\u01bf", - "\n\20\f\20\16\20\u01c2\13\20\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u01ca", - "\n\21\f\21\16\21\u01cd\13\21\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u01d5", - "\n\22\f\22\16\22\u01d8\13\22\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u01e0", - "\n\23\f\23\16\23\u01e3\13\23\3\24\3\24\3\24\3\24\3\24\3\24\7\24\u01eb", - "\n\24\f\24\16\24\u01ee\13\24\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u01f6", - "\n\25\3\26\3\26\3\26\3\26\3\26\5\26\u01fd\n\26\3\27\3\27\3\30\3\30\3", - "\30\3\30\3\30\3\30\7\30\u0207\n\30\f\30\16\30\u020a\13\30\3\31\3\31", - "\3\32\3\32\5\32\u0210\n\32\3\32\3\32\3\32\5\32\u0215\n\32\3\33\6\33", - "\u0218\n\33\r\33\16\33\u0219\3\34\6\34\u021d\n\34\r\34\16\34\u021e\3", - "\35\3\35\3\35\3\35\3\35\5\35\u0226\n\35\3\36\3\36\3\36\3\36\3\36\3\36", - "\7\36\u022e\n\36\f\36\16\36\u0231\13\36\3\37\3\37\3\37\3\37\3\37\5\37", - "\u0238\n\37\3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u024a", - "\n!\3\"\3\"\5\"\u024e\n\"\3\"\3\"\3\"\3\"\3\"\5\"\u0255\n\"\3#\3#\3", - "$\3$\3$\3$\3%\3%\3%\3%\3%\7%\u0262\n%\f%\16%\u0265\13%\3&\3&\5&\u0269", - "\n&\3&\3&\3&\5&\u026e\n&\3\'\3\'\5\'\u0272\n\'\3\'\3\'\5\'\u0276\n\'", - "\5\'\u0278\n\'\3(\3(\3(\3(\3(\3(\7(\u0280\n(\f(\16(\u0283\13(\3)\3)", - "\5)\u0287\n)\3)\3)\5)\u028b\n)\3*\3*\5*\u028f\n*\3*\3*\3*\3*\3*\3*\5", - "*\u0297\n*\3*\3*\3*\3*\3*\3*\3*\5*\u02a0\n*\3+\3+\3+\3+\3+\3+\7+\u02a8", - "\n+\f+\16+\u02ab\13+\3,\3,\3,\3,\3,\5,\u02b2\n,\3-\3-\3.\3.\3.\3.\3", - ".\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u02c3\n\60\3\61\3\61\3\61", - "\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02cf\n\61\3\62\5\62\u02d2", - "\n\62\3\62\3\62\7\62\u02d6\n\62\f\62\16\62\u02d9\13\62\3\63\3\63\3\63", - "\3\63\3\63\3\63\5\63\u02e1\n\63\3\63\3\63\3\63\5\63\u02e6\n\63\3\63", - "\5\63\u02e9\n\63\3\63\3\63\3\63\3\63\3\63\5\63\u02f0\n\63\3\63\3\63", - "\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u02ff\n", - "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u030b\n\63", - "\3\63\7\63\u030e\n\63\f\63\16\63\u0311\13\63\3\64\3\64\3\64\6\64\u0316", - "\n\64\r\64\16\64\u0317\3\64\3\64\5\64\u031c\n\64\3\65\3\65\3\65\3\65", - "\3\65\3\65\3\65\3\66\3\66\3\66\7\66\u0328\n\66\f\66\16\66\u032b\13\66", - "\3\66\5\66\u032e\n\66\3\67\3\67\3\67\5\67\u0333\n\67\3\67\5\67\u0336", - "\n\67\3\67\5\67\u0339\n\67\38\38\38\38\38\78\u0340\n8\f8\168\u0343\13", - "8\39\39\59\u0347\n9\39\39\59\u034b\n9\39\39\39\59\u0350\n9\39\39\59", - "\u0354\n9\39\59\u0357\n9\3:\3:\3:\3:\3:\7:\u035e\n:\f:\16:\u0361\13", - ":\3;\3;\3;\3;\3;\5;\u0368\n;\3<\3<\3<\3<\3<\3<\7<\u0370\n<\f<\16<\u0373", - "\13<\3=\3=\3=\3=\3=\5=\u037a\n=\5=\u037c\n=\3>\3>\3>\3>\3>\3>\7>\u0384", - "\n>\f>\16>\u0387\13>\3?\3?\5?\u038b\n?\3@\3@\5@\u038f\n@\3@\3@\7@\u0393", - "\n@\f@\16@\u0396\13@\5@\u0398\n@\3A\3A\3A\3A\3A\7A\u039f\nA\fA\16A\u03a2", - "\13A\3A\3A\5A\u03a6\nA\3A\5A\u03a9\nA\3A\3A\3A\3A\5A\u03af\nA\3A\3A", - "\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\5A\u03bf\nA\3A\3A\7A\u03c3\nA\f", - "A\16A\u03c6\13A\5A\u03c8\nA\3A\3A\3A\5A\u03cd\nA\3A\5A\u03d0\nA\3A\3", - "A\3A\3A\3A\5A\u03d7\nA\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A", - "\3A\3A\5A\u03ea\nA\3A\3A\7A\u03ee\nA\fA\16A\u03f1\13A\7A\u03f3\nA\f", - "A\16A\u03f6\13A\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\5C\u0404\nC\3D\3", - "D\5D\u0408\nD\3D\3D\3D\3D\3D\5D\u040f\nD\3D\7D\u0412\nD\fD\16D\u0415", - "\13D\3E\3E\3E\3F\3F\3F\3F\3F\7F\u041f\nF\fF\16F\u0422\13F\3G\3G\3G\3", - "G\3G\3G\5G\u042a\nG\3H\3H\3H\3H\3H\6H\u0431\nH\rH\16H\u0432\3H\3H\3", - "H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\7I\u0444\nI\fI\16I\u0447\13I\5", - "I\u0449\nI\3I\3I\3I\3I\7I\u044f\nI\fI\16I\u0452\13I\5I\u0454\nI\7I\u0456", - "\nI\fI\16I\u0459\13I\3I\3I\5I\u045d\nI\3J\3J\3J\3J\3J\3J\3J\3J\3J\3", - "J\3J\5J\u046a\nJ\3K\3K\5K\u046e\nK\3K\3K\3L\3L\3L\3L\3L\7L\u0477\nL", - "\fL\16L\u047a\13L\3M\3M\5M\u047e\nM\3N\5N\u0481\nN\3N\3N\3O\3O\3O\3", - "O\3O\3O\3O\5O\u048c\nO\3O\3O\3O\3O\3O\3O\5O\u0494\nO\3P\3P\3P\3P\3P", - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\5P\u04a7\nP\3P\3P\5P\u04ab\nP\3", - "P\3P\5P\u04af\nP\3P\3P\3P\3P\3P\3P\5P\u04b7\nP\3P\3P\5P\u04bb\nP\3P", - "\3P\3P\5P\u04c0\nP\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u04cb\nQ\3Q\3Q\3Q\3", - "Q\3Q\5Q\u04d2\nQ\3R\5R\u04d5\nR\3R\3R\3S\3S\3S\3S\3S\7S\u04de\nS\fS", - "\16S\u04e1\13S\3T\3T\3T\3T\3T\3T\5T\u04e9\nT\3U\3U\3U\5U\u04ee\nU\3", - "V\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Z\3Z\3Z\3Z", - "\3Z\3Z\7Z\u0509\nZ\fZ\16Z\u050c\13Z\3[\3[\3[\3[\3[\5[\u0513\n[\3\\\5", - "\\\u0516\n\\\3\\\3\\\5\\\u051a\n\\\3\\\3\\\3]\3]\3]\3]\3]\7]\u0523\n", - "]\f]\16]\u0526\13]\3]\2\37\6\n\f\24\26\30\32\34\36 \"$&.:HNTdrvz\u0080", - "\u0086\u008a\u0096\u00a4\u00b2\u00b8^\2\4\6\b\n\f\16\20\22\24\26\30", - "\32\34\36 \"$&(*,.\60\62\64\668:<>@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\2\16\7\2LLNNPPSSXY\3\2^h\b\2\24\24\37", - "\37\'\'--\60\60??\n\2\6\b\27\27\34\34 %&*+\62\639:\3\2\6\b\4\2..\61", - "\61\6\2\30\30((\64\6488\5\2\n\13$$==\4\2@A]]\3\2@A\4\2\r\r\17\17\4\2", - "\20\20\64\64\u0596\2\u00db\3\2\2\2\4\u00dd\3\2\2\2\6\u00e4\3\2\2\2\b", - "\u00f6\3\2\2\2\n\u011a\3\2\2\2\f\u0136\3\2\2\2\16\u0157\3\2\2\2\20\u0159", - "\3\2\2\2\22\u0167\3\2\2\2\24\u0169\3\2\2\2\26\u017a\3\2\2\2\30\u0188", - "\3\2\2\2\32\u0196\3\2\2\2\34\u01aa\3\2\2\2\36\u01b8\3\2\2\2 \u01c3\3", - "\2\2\2\"\u01ce\3\2\2\2$\u01d9\3\2\2\2&\u01e4\3\2\2\2(\u01ef\3\2\2\2", - "*\u01fc\3\2\2\2,\u01fe\3\2\2\2.\u0200\3\2\2\2\60\u020b\3\2\2\2\62\u0214", - "\3\2\2\2\64\u0217\3\2\2\2\66\u021c\3\2\2\28\u0225\3\2\2\2:\u0227\3\2", - "\2\2<\u0237\3\2\2\2>\u0239\3\2\2\2@\u0249\3\2\2\2B\u0254\3\2\2\2D\u0256", - "\3\2\2\2F\u0258\3\2\2\2H\u025c\3\2\2\2J\u026d\3\2\2\2L\u0277\3\2\2\2", - "N\u0279\3\2\2\2P\u028a\3\2\2\2R\u029f\3\2\2\2T\u02a1\3\2\2\2V\u02b1", - "\3\2\2\2X\u02b3\3\2\2\2Z\u02b5\3\2\2\2\\\u02ba\3\2\2\2^\u02c2\3\2\2", - "\2`\u02ce\3\2\2\2b\u02d1\3\2\2\2d\u02e0\3\2\2\2f\u031b\3\2\2\2h\u031d", - "\3\2\2\2j\u032d\3\2\2\2l\u0338\3\2\2\2n\u0341\3\2\2\2p\u0356\3\2\2\2", - "r\u0358\3\2\2\2t\u0367\3\2\2\2v\u0369\3\2\2\2x\u037b\3\2\2\2z\u037d", - "\3\2\2\2|\u0388\3\2\2\2~\u0397\3\2\2\2\u0080\u03c7\3\2\2\2\u0082\u03f7", - "\3\2\2\2\u0084\u0403\3\2\2\2\u0086\u0405\3\2\2\2\u0088\u0416\3\2\2\2", - "\u008a\u0419\3\2\2\2\u008c\u0429\3\2\2\2\u008e\u042b\3\2\2\2\u0090\u045c", - "\3\2\2\2\u0092\u0469\3\2\2\2\u0094\u046b\3\2\2\2\u0096\u0471\3\2\2\2", - "\u0098\u047d\3\2\2\2\u009a\u0480\3\2\2\2\u009c\u0493\3\2\2\2\u009e\u04bf", - "\3\2\2\2\u00a0\u04d1\3\2\2\2\u00a2\u04d4\3\2\2\2\u00a4\u04d8\3\2\2\2", - "\u00a6\u04e8\3\2\2\2\u00a8\u04ed\3\2\2\2\u00aa\u04ef\3\2\2\2\u00ac\u04f3", - "\3\2\2\2\u00ae\u04f8\3\2\2\2\u00b0\u0500\3\2\2\2\u00b2\u0502\3\2\2\2", - "\u00b4\u0512\3\2\2\2\u00b6\u0515\3\2\2\2\u00b8\u051d\3\2\2\2\u00ba\u00dc", - "\7n\2\2\u00bb\u00dc\7o\2\2\u00bc\u00be\7p\2\2\u00bd\u00bc\3\2\2\2\u00be", - "\u00bf\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00dc\3", - "\2\2\2\u00c1\u00c2\7@\2\2\u00c2\u00c3\5.\30\2\u00c3\u00c4\7A\2\2\u00c4", - "\u00dc\3\2\2\2\u00c5\u00dc\5\4\3\2\u00c6\u00c8\7\3\2\2\u00c7\u00c6\3", - "\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\u00c9\3\2\2\2\u00c9\u00ca\7@\2\2\u00ca", - "\u00cb\5\u0094K\2\u00cb\u00cc\7A\2\2\u00cc\u00dc\3\2\2\2\u00cd\u00ce", - "\7\4\2\2\u00ce\u00cf\7@\2\2\u00cf\u00d0\5\16\b\2\u00d0\u00d1\7]\2\2", - "\u00d1\u00d2\5|?\2\u00d2\u00d3\7A\2\2\u00d3\u00dc\3\2\2\2\u00d4\u00d5", - "\7\5\2\2\u00d5\u00d6\7@\2\2\u00d6\u00d7\5|?\2\u00d7\u00d8\7]\2\2\u00d8", - "\u00d9\5\16\b\2\u00d9\u00da\7A\2\2\u00da\u00dc\3\2\2\2\u00db\u00ba\3", - "\2\2\2\u00db\u00bb\3\2\2\2\u00db\u00bd\3\2\2\2\u00db\u00c1\3\2\2\2\u00db", - "\u00c5\3\2\2\2\u00db\u00c7\3\2\2\2\u00db\u00cd\3\2\2\2\u00db\u00d4\3", - "\2\2\2\u00dc\3\3\2\2\2\u00dd\u00de\7;\2\2\u00de\u00df\7@\2\2\u00df\u00e0", - "\5*\26\2\u00e0\u00e1\7]\2\2\u00e1\u00e2\5\6\4\2\u00e2\u00e3\7A\2\2\u00e3", - "\5\3\2\2\2\u00e4\u00e5\b\4\1\2\u00e5\u00e6\5\b\5\2\u00e6\u00ec\3\2\2", - "\2\u00e7\u00e8\f\3\2\2\u00e8\u00e9\7]\2\2\u00e9\u00eb\5\b\5\2\u00ea", - "\u00e7\3\2\2\2\u00eb\u00ee\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ec\u00ed\3", - "\2\2\2\u00ed\7\3\2\2\2\u00ee\u00ec\3\2\2\2\u00ef\u00f0\5|?\2\u00f0\u00f1", - "\7[\2\2\u00f1\u00f2\5*\26\2\u00f2\u00f7\3\2\2\2\u00f3\u00f4\7\32\2\2", - "\u00f4\u00f5\7[\2\2\u00f5\u00f7\5*\26\2\u00f6\u00ef\3\2\2\2\u00f6\u00f3", - "\3\2\2\2\u00f7\t\3\2\2\2\u00f8\u00f9\b\6\1\2\u00f9\u011b\5\2\2\2\u00fa", - "\u00fb\7@\2\2\u00fb\u00fc\5|?\2\u00fc\u00fd\7A\2\2\u00fd\u00fe\7D\2", - "\2\u00fe\u00ff\5\u0086D\2\u00ff\u0100\7E\2\2\u0100\u011b\3\2\2\2\u0101", - "\u0102\7@\2\2\u0102\u0103\5|?\2\u0103\u0104\7A\2\2\u0104\u0105\7D\2", - "\2\u0105\u0106\5\u0086D\2\u0106\u0107\7]\2\2\u0107\u0108\7E\2\2\u0108", - "\u011b\3\2\2\2\u0109\u010a\7\3\2\2\u010a\u010b\7@\2\2\u010b\u010c\5", - "|?\2\u010c\u010d\7A\2\2\u010d\u010e\7D\2\2\u010e\u010f\5\u0086D\2\u010f", - "\u0110\7E\2\2\u0110\u011b\3\2\2\2\u0111\u0112\7\3\2\2\u0112\u0113\7", - "@\2\2\u0113\u0114\5|?\2\u0114\u0115\7A\2\2\u0115\u0116\7D\2\2\u0116", - "\u0117\5\u0086D\2\u0117\u0118\7]\2\2\u0118\u0119\7E\2\2\u0119\u011b", - "\3\2\2\2\u011a\u00f8\3\2\2\2\u011a\u00fa\3\2\2\2\u011a\u0101\3\2\2\2", - "\u011a\u0109\3\2\2\2\u011a\u0111\3\2\2\2\u011b\u0133\3\2\2\2\u011c\u011d", - "\f\f\2\2\u011d\u011e\7B\2\2\u011e\u011f\5.\30\2\u011f\u0120\7C\2\2\u0120", - "\u0132\3\2\2\2\u0121\u0122\f\13\2\2\u0122\u0124\7@\2\2\u0123\u0125\5", - "\f\7\2\u0124\u0123\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0126\3\2\2\2\u0126", - "\u0132\7A\2\2\u0127\u0128\f\n\2\2\u0128\u0129\7l\2\2\u0129\u0132\7n", - "\2\2\u012a\u012b\f\t\2\2\u012b\u012c\7k\2\2\u012c\u0132\7n\2\2\u012d", - "\u012e\f\b\2\2\u012e\u0132\7M\2\2\u012f\u0130\f\7\2\2\u0130\u0132\7", - "O\2\2\u0131\u011c\3\2\2\2\u0131\u0121\3\2\2\2\u0131\u0127\3\2\2\2\u0131", - "\u012a\3\2\2\2\u0131\u012d\3\2\2\2\u0131\u012f\3\2\2\2\u0132\u0135\3", - "\2\2\2\u0133\u0131\3\2\2\2\u0133\u0134\3\2\2\2\u0134\13\3\2\2\2\u0135", - "\u0133\3\2\2\2\u0136\u0137\b\7\1\2\u0137\u0138\5*\26\2\u0138\u013e\3", - "\2\2\2\u0139\u013a\f\3\2\2\u013a\u013b\7]\2\2\u013b\u013d\5*\26\2\u013c", - "\u0139\3\2\2\2\u013d\u0140\3\2\2\2\u013e\u013c\3\2\2\2\u013e\u013f\3", - "\2\2\2\u013f\r\3\2\2\2\u0140\u013e\3\2\2\2\u0141\u0158\5\n\6\2\u0142", - "\u0143\7M\2\2\u0143\u0158\5\16\b\2\u0144\u0145\7O\2\2\u0145\u0158\5", - "\16\b\2\u0146\u0147\5\20\t\2\u0147\u0148\5\22\n\2\u0148\u0158\3\2\2", - "\2\u0149\u014a\7,\2\2\u014a\u0158\5\16\b\2\u014b\u014c\7,\2\2\u014c", - "\u014d\7@\2\2\u014d\u014e\5|?\2\u014e\u014f\7A\2\2\u014f\u0158\3\2\2", - "\2\u0150\u0151\7\67\2\2\u0151\u0152\7@\2\2\u0152\u0153\5|?\2\u0153\u0154", - "\7A\2\2\u0154\u0158\3\2\2\2\u0155\u0156\7U\2\2\u0156\u0158\7n\2\2\u0157", - "\u0141\3\2\2\2\u0157\u0142\3\2\2\2\u0157\u0144\3\2\2\2\u0157\u0146\3", - "\2\2\2\u0157\u0149\3\2\2\2\u0157\u014b\3\2\2\2\u0157\u0150\3\2\2\2\u0157", - "\u0155\3\2\2\2\u0158\17\3\2\2\2\u0159\u015a\t\2\2\2\u015a\21\3\2\2\2", - "\u015b\u0168\5\16\b\2\u015c\u015d\7@\2\2\u015d\u015e\5|?\2\u015e\u015f", - "\7A\2\2\u015f\u0160\5\22\n\2\u0160\u0168\3\2\2\2\u0161\u0162\7\3\2\2", - "\u0162\u0163\7@\2\2\u0163\u0164\5|?\2\u0164\u0165\7A\2\2\u0165\u0166", - "\5\22\n\2\u0166\u0168\3\2\2\2\u0167\u015b\3\2\2\2\u0167\u015c\3\2\2", - "\2\u0167\u0161\3\2\2\2\u0168\23\3\2\2\2\u0169\u016a\b\13\1\2\u016a\u016b", - "\5\22\n\2\u016b\u0177\3\2\2\2\u016c\u016d\f\5\2\2\u016d\u016e\7P\2\2", - "\u016e\u0176\5\22\n\2\u016f\u0170\f\4\2\2\u0170\u0171\7Q\2\2\u0171\u0176", - "\5\22\n\2\u0172\u0173\f\3\2\2\u0173\u0174\7R\2\2\u0174\u0176\5\22\n", - "\2\u0175\u016c\3\2\2\2\u0175\u016f\3\2\2\2\u0175\u0172\3\2\2\2\u0176", - "\u0179\3\2\2\2\u0177\u0175\3\2\2\2\u0177\u0178\3\2\2\2\u0178\25\3\2", - "\2\2\u0179\u0177\3\2\2\2\u017a\u017b\b\f\1\2\u017b\u017c\5\24\13\2\u017c", - "\u0185\3\2\2\2\u017d\u017e\f\4\2\2\u017e\u017f\7L\2\2\u017f\u0184\5", - "\24\13\2\u0180\u0181\f\3\2\2\u0181\u0182\7N\2\2\u0182\u0184\5\24\13", - "\2\u0183\u017d\3\2\2\2\u0183\u0180\3\2\2\2\u0184\u0187\3\2\2\2\u0185", - "\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\27\3\2\2\2\u0187\u0185\3\2", - "\2\2\u0188\u0189\b\r\1\2\u0189\u018a\5\26\f\2\u018a\u0193\3\2\2\2\u018b", - "\u018c\f\4\2\2\u018c\u018d\7J\2\2\u018d\u0192\5\26\f\2\u018e\u018f\f", - "\3\2\2\u018f\u0190\7K\2\2\u0190\u0192\5\26\f\2\u0191\u018b\3\2\2\2\u0191", - "\u018e\3\2\2\2\u0192\u0195\3\2\2\2\u0193\u0191\3\2\2\2\u0193\u0194\3", - "\2\2\2\u0194\31\3\2\2\2\u0195\u0193\3\2\2\2\u0196\u0197\b\16\1\2\u0197", - "\u0198\5\30\r\2\u0198\u01a7\3\2\2\2\u0199\u019a\f\6\2\2\u019a\u019b", - "\7F\2\2\u019b\u01a6\5\30\r\2\u019c\u019d\f\5\2\2\u019d\u019e\7H\2\2", - "\u019e\u01a6\5\30\r\2\u019f\u01a0\f\4\2\2\u01a0\u01a1\7G\2\2\u01a1\u01a6", - "\5\30\r\2\u01a2\u01a3\f\3\2\2\u01a3\u01a4\7I\2\2\u01a4\u01a6\5\30\r", - "\2\u01a5\u0199\3\2\2\2\u01a5\u019c\3\2\2\2\u01a5\u019f\3\2\2\2\u01a5", - "\u01a2\3\2\2\2\u01a6\u01a9\3\2\2\2\u01a7\u01a5\3\2\2\2\u01a7\u01a8\3", - "\2\2\2\u01a8\33\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa\u01ab\b\17\1\2\u01ab", - "\u01ac\5\32\16\2\u01ac\u01b5\3\2\2\2\u01ad\u01ae\f\4\2\2\u01ae\u01af", - "\7i\2\2\u01af\u01b4\5\32\16\2\u01b0\u01b1\f\3\2\2\u01b1\u01b2\7j\2\2", - "\u01b2\u01b4\5\32\16\2\u01b3\u01ad\3\2\2\2\u01b3\u01b0\3\2\2\2\u01b4", - "\u01b7\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\35\3\2", - "\2\2\u01b7\u01b5\3\2\2\2\u01b8\u01b9\b\20\1\2\u01b9\u01ba\5\34\17\2", - "\u01ba\u01c0\3\2\2\2\u01bb\u01bc\f\3\2\2\u01bc\u01bd\7S\2\2\u01bd\u01bf", - "\5\34\17\2\u01be\u01bb\3\2\2\2\u01bf\u01c2\3\2\2\2\u01c0\u01be\3\2\2", - "\2\u01c0\u01c1\3\2\2\2\u01c1\37\3\2\2\2\u01c2\u01c0\3\2\2\2\u01c3\u01c4", - "\b\21\1\2\u01c4\u01c5\5\36\20\2\u01c5\u01cb\3\2\2\2\u01c6\u01c7\f\3", - "\2\2\u01c7\u01c8\7W\2\2\u01c8\u01ca\5\36\20\2\u01c9\u01c6\3\2\2\2\u01ca", - "\u01cd\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc!\3\2\2", - "\2\u01cd\u01cb\3\2\2\2\u01ce\u01cf\b\22\1\2\u01cf\u01d0\5 \21\2\u01d0", - "\u01d6\3\2\2\2\u01d1\u01d2\f\3\2\2\u01d2\u01d3\7T\2\2\u01d3\u01d5\5", - " \21\2\u01d4\u01d1\3\2\2\2\u01d5\u01d8\3\2\2\2\u01d6\u01d4\3\2\2\2\u01d6", - "\u01d7\3\2\2\2\u01d7#\3\2\2\2\u01d8\u01d6\3\2\2\2\u01d9\u01da\b\23\1", - "\2\u01da\u01db\5\"\22\2\u01db\u01e1\3\2\2\2\u01dc\u01dd\f\3\2\2\u01dd", - "\u01de\7U\2\2\u01de\u01e0\5\"\22\2\u01df\u01dc\3\2\2\2\u01e0\u01e3\3", - "\2\2\2\u01e1\u01df\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2%\3\2\2\2\u01e3", - "\u01e1\3\2\2\2\u01e4\u01e5\b\24\1\2\u01e5\u01e6\5$\23\2\u01e6\u01ec", - "\3\2\2\2\u01e7\u01e8\f\3\2\2\u01e8\u01e9\7V\2\2\u01e9\u01eb\5$\23\2", - "\u01ea\u01e7\3\2\2\2\u01eb\u01ee\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ec\u01ed", - "\3\2\2\2\u01ed\'\3\2\2\2\u01ee\u01ec\3\2\2\2\u01ef\u01f5\5&\24\2\u01f0", - "\u01f1\7Z\2\2\u01f1\u01f2\5.\30\2\u01f2\u01f3\7[\2\2\u01f3\u01f4\5(", - "\25\2\u01f4\u01f6\3\2\2\2\u01f5\u01f0\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6", - ")\3\2\2\2\u01f7\u01fd\5(\25\2\u01f8\u01f9\5\16\b\2\u01f9\u01fa\5,\27", - "\2\u01fa\u01fb\5*\26\2\u01fb\u01fd\3\2\2\2\u01fc\u01f7\3\2\2\2\u01fc", - "\u01f8\3\2\2\2\u01fd+\3\2\2\2\u01fe\u01ff\t\3\2\2\u01ff-\3\2\2\2\u0200", - "\u0201\b\30\1\2\u0201\u0202\5*\26\2\u0202\u0208\3\2\2\2\u0203\u0204", - "\f\3\2\2\u0204\u0205\7]\2\2\u0205\u0207\5*\26\2\u0206\u0203\3\2\2\2", - "\u0207\u020a\3\2\2\2\u0208\u0206\3\2\2\2\u0208\u0209\3\2\2\2\u0209/", - "\3\2\2\2\u020a\u0208\3\2\2\2\u020b\u020c\5(\25\2\u020c\61\3\2\2\2\u020d", - "\u020f\5\64\33\2\u020e\u0210\5:\36\2\u020f\u020e\3\2\2\2\u020f\u0210", - "\3\2\2\2\u0210\u0211\3\2\2\2\u0211\u0212\7\\\2\2\u0212\u0215\3\2\2\2", - "\u0213\u0215\5\u008eH\2\u0214\u020d\3\2\2\2\u0214\u0213\3\2\2\2\u0215", - "\63\3\2\2\2\u0216\u0218\58\35\2\u0217\u0216\3\2\2\2\u0218\u0219\3\2", - "\2\2\u0219\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021a\65\3\2\2\2\u021b", - "\u021d\58\35\2\u021c\u021b\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u021c\3", - "\2\2\2\u021e\u021f\3\2\2\2\u021f\67\3\2\2\2\u0220\u0226\5> \2\u0221", - "\u0226\5@!\2\u0222\u0226\5\\/\2\u0223\u0226\5^\60\2\u0224\u0226\5`\61", - "\2\u0225\u0220\3\2\2\2\u0225\u0221\3\2\2\2\u0225\u0222\3\2\2\2\u0225", - "\u0223\3\2\2\2\u0225\u0224\3\2\2\2\u02269\3\2\2\2\u0227\u0228\b\36\1", - "\2\u0228\u0229\5<\37\2\u0229\u022f\3\2\2\2\u022a\u022b\f\3\2\2\u022b", - "\u022c\7]\2\2\u022c\u022e\5<\37\2\u022d\u022a\3\2\2\2\u022e\u0231\3", - "\2\2\2\u022f\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230;\3\2\2\2\u0231", - "\u022f\3\2\2\2\u0232\u0238\5b\62\2\u0233\u0234\5b\62\2\u0234\u0235\7", - "^\2\2\u0235\u0236\5\u0084C\2\u0236\u0238\3\2\2\2\u0237\u0232\3\2\2\2", - "\u0237\u0233\3\2\2\2\u0238=\3\2\2\2\u0239\u023a\t\4\2\2\u023a?\3\2\2", - "\2\u023b\u024a\t\5\2\2\u023c\u023d\7\3\2\2\u023d\u023e\7@\2\2\u023e", - "\u023f\t\6\2\2\u023f\u024a\7A\2\2\u0240\u024a\5Z.\2\u0241\u024a\5B\"", - "\2\u0242\u024a\5R*\2\u0243\u024a\5\u0082B\2\u0244\u0245\7\t\2\2\u0245", - "\u0246\7@\2\2\u0246\u0247\5\60\31\2\u0247\u0248\7A\2\2\u0248\u024a\3", - "\2\2\2\u0249\u023b\3\2\2\2\u0249\u023c\3\2\2\2\u0249\u0240\3\2\2\2\u0249", - "\u0241\3\2\2\2\u0249\u0242\3\2\2\2\u0249\u0243\3\2\2\2\u0249\u0244\3", - "\2\2\2\u024aA\3\2\2\2\u024b\u024d\5D#\2\u024c\u024e\7n\2\2\u024d\u024c", - "\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u024f\3\2\2\2\u024f\u0250\5F$\2\u0250", - "\u0255\3\2\2\2\u0251\u0252\5D#\2\u0252\u0253\7n\2\2\u0253\u0255\3\2", - "\2\2\u0254\u024b\3\2\2\2\u0254\u0251\3\2\2\2\u0255C\3\2\2\2\u0256\u0257", - "\t\7\2\2\u0257E\3\2\2\2\u0258\u0259\7D\2\2\u0259\u025a\5H%\2\u025a\u025b", - "\7E\2\2\u025bG\3\2\2\2\u025c\u025d\b%\1\2\u025d\u025e\5J&\2\u025e\u0263", - "\3\2\2\2\u025f\u0260\f\3\2\2\u0260\u0262\5J&\2\u0261\u025f\3\2\2\2\u0262", - "\u0265\3\2\2\2\u0263\u0261\3\2\2\2\u0263\u0264\3\2\2\2\u0264I\3\2\2", - "\2\u0265\u0263\3\2\2\2\u0266\u0268\5L\'\2\u0267\u0269\5N(\2\u0268\u0267", - "\3\2\2\2\u0268\u0269\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026b\7\\\2\2", - "\u026b\u026e\3\2\2\2\u026c\u026e\5\u008eH\2\u026d\u0266\3\2\2\2\u026d", - "\u026c\3\2\2\2\u026eK\3\2\2\2\u026f\u0271\5@!\2\u0270\u0272\5L\'\2\u0271", - "\u0270\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0278\3\2\2\2\u0273\u0275\5", - "\\/\2\u0274\u0276\5L\'\2\u0275\u0274\3\2\2\2\u0275\u0276\3\2\2\2\u0276", - "\u0278\3\2\2\2\u0277\u026f\3\2\2\2\u0277\u0273\3\2\2\2\u0278M\3\2\2", - "\2\u0279\u027a\b(\1\2\u027a\u027b\5P)\2\u027b\u0281\3\2\2\2\u027c\u027d", - "\f\3\2\2\u027d\u027e\7]\2\2\u027e\u0280\5P)\2\u027f\u027c\3\2\2\2\u0280", - "\u0283\3\2\2\2\u0281\u027f\3\2\2\2\u0281\u0282\3\2\2\2\u0282O\3\2\2", - "\2\u0283\u0281\3\2\2\2\u0284\u028b\5b\62\2\u0285\u0287\5b\62\2\u0286", - "\u0285\3\2\2\2\u0286\u0287\3\2\2\2\u0287\u0288\3\2\2\2\u0288\u0289\7", - "[\2\2\u0289\u028b\5\60\31\2\u028a\u0284\3\2\2\2\u028a\u0286\3\2\2\2", - "\u028bQ\3\2\2\2\u028c\u028e\7\36\2\2\u028d\u028f\7n\2\2\u028e\u028d", - "\3\2\2\2\u028e\u028f\3\2\2\2\u028f\u0290\3\2\2\2\u0290\u0291\7D\2\2", - "\u0291\u0292\5T+\2\u0292\u0293\7E\2\2\u0293\u02a0\3\2\2\2\u0294\u0296", - "\7\36\2\2\u0295\u0297\7n\2\2\u0296\u0295\3\2\2\2\u0296\u0297\3\2\2\2", - "\u0297\u0298\3\2\2\2\u0298\u0299\7D\2\2\u0299\u029a\5T+\2\u029a\u029b", - "\7]\2\2\u029b\u029c\7E\2\2\u029c\u02a0\3\2\2\2\u029d\u029e\7\36\2\2", - "\u029e\u02a0\7n\2\2\u029f\u028c\3\2\2\2\u029f\u0294\3\2\2\2\u029f\u029d", - "\3\2\2\2\u02a0S\3\2\2\2\u02a1\u02a2\b+\1\2\u02a2\u02a3\5V,\2\u02a3\u02a9", - "\3\2\2\2\u02a4\u02a5\f\3\2\2\u02a5\u02a6\7]\2\2\u02a6\u02a8\5V,\2\u02a7", - "\u02a4\3\2\2\2\u02a8\u02ab\3\2\2\2\u02a9\u02a7\3\2\2\2\u02a9\u02aa\3", - "\2\2\2\u02aaU\3\2\2\2\u02ab\u02a9\3\2\2\2\u02ac\u02b2\5X-\2\u02ad\u02ae", - "\5X-\2\u02ae\u02af\7^\2\2\u02af\u02b0\5\60\31\2\u02b0\u02b2\3\2\2\2", - "\u02b1\u02ac\3\2\2\2\u02b1\u02ad\3\2\2\2\u02b2W\3\2\2\2\u02b3\u02b4", - "\7n\2\2\u02b4Y\3\2\2\2\u02b5\u02b6\78\2\2\u02b6\u02b7\7@\2\2\u02b7\u02b8", - "\5|?\2\u02b8\u02b9\7A\2\2\u02b9[\3\2\2\2\u02ba\u02bb\t\b\2\2\u02bb]", - "\3\2\2\2\u02bc\u02c3\t\t\2\2\u02bd\u02c3\5h\65\2\u02be\u02bf\7\f\2\2", - "\u02bf\u02c0\7@\2\2\u02c0\u02c1\7n\2\2\u02c1\u02c3\7A\2\2\u02c2\u02bc", - "\3\2\2\2\u02c2\u02bd\3\2\2\2\u02c2\u02be\3\2\2\2\u02c3_\3\2\2\2\u02c4", - "\u02c5\7\66\2\2\u02c5\u02c6\7@\2\2\u02c6\u02c7\5|?\2\u02c7\u02c8\7A", - "\2\2\u02c8\u02cf\3\2\2\2\u02c9\u02ca\7\66\2\2\u02ca\u02cb\7@\2\2\u02cb", - "\u02cc\5\60\31\2\u02cc\u02cd\7A\2\2\u02cd\u02cf\3\2\2\2\u02ce\u02c4", - "\3\2\2\2\u02ce\u02c9\3\2\2\2\u02cfa\3\2\2\2\u02d0\u02d2\5p9\2\u02d1", - "\u02d0\3\2\2\2\u02d1\u02d2\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d7\5", - "d\63\2\u02d4\u02d6\5f\64\2\u02d5\u02d4\3\2\2\2\u02d6\u02d9\3\2\2\2\u02d7", - "\u02d5\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8c\3\2\2\2\u02d9\u02d7\3\2\2", - "\2\u02da\u02db\b\63\1\2\u02db\u02e1\7n\2\2\u02dc\u02dd\7@\2\2\u02dd", - "\u02de\5b\62\2\u02de\u02df\7A\2\2\u02df\u02e1\3\2\2\2\u02e0\u02da\3", - "\2\2\2\u02e0\u02dc\3\2\2\2\u02e1\u030f\3\2\2\2\u02e2\u02e3\f\b\2\2\u02e3", - "\u02e5\7B\2\2\u02e4\u02e6\5r:\2\u02e5\u02e4\3\2\2\2\u02e5\u02e6\3\2", - "\2\2\u02e6\u02e8\3\2\2\2\u02e7\u02e9\5*\26\2\u02e8\u02e7\3\2\2\2\u02e8", - "\u02e9\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea\u030e\7C\2\2\u02eb\u02ec\f", - "\7\2\2\u02ec\u02ed\7B\2\2\u02ed\u02ef\7-\2\2\u02ee\u02f0\5r:\2\u02ef", - "\u02ee\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f2\5", - "*\26\2\u02f2\u02f3\7C\2\2\u02f3\u030e\3\2\2\2\u02f4\u02f5\f\6\2\2\u02f5", - "\u02f6\7B\2\2\u02f6\u02f7\5r:\2\u02f7\u02f8\7-\2\2\u02f8\u02f9\5*\26", - "\2\u02f9\u02fa\7C\2\2\u02fa\u030e\3\2\2\2\u02fb\u02fc\f\5\2\2\u02fc", - "\u02fe\7B\2\2\u02fd\u02ff\5r:\2\u02fe\u02fd\3\2\2\2\u02fe\u02ff\3\2", - "\2\2\u02ff\u0300\3\2\2\2\u0300\u0301\7P\2\2\u0301\u030e\7C\2\2\u0302", - "\u0303\f\4\2\2\u0303\u0304\7@\2\2\u0304\u0305\5t;\2\u0305\u0306\7A\2", - "\2\u0306\u030e\3\2\2\2\u0307\u0308\f\3\2\2\u0308\u030a\7@\2\2\u0309", - "\u030b\5z>\2\u030a\u0309\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030c\3\2", - "\2\2\u030c\u030e\7A\2\2\u030d\u02e2\3\2\2\2\u030d\u02eb\3\2\2\2\u030d", - "\u02f4\3\2\2\2\u030d\u02fb\3\2\2\2\u030d\u0302\3\2\2\2\u030d\u0307\3", - "\2\2\2\u030e\u0311\3\2\2\2\u030f\u030d\3\2\2\2\u030f\u0310\3\2\2\2\u0310", - "e\3\2\2\2\u0311\u030f\3\2\2\2\u0312\u0313\7\r\2\2\u0313\u0315\7@\2\2", - "\u0314\u0316\7p\2\2\u0315\u0314\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0315", - "\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031c\7A\2\2", - "\u031a\u031c\5h\65\2\u031b\u0312\3\2\2\2\u031b\u031a\3\2\2\2\u031cg", - "\3\2\2\2\u031d\u031e\7\16\2\2\u031e\u031f\7@\2\2\u031f\u0320\7@\2\2", - "\u0320\u0321\5j\66\2\u0321\u0322\7A\2\2\u0322\u0323\7A\2\2\u0323i\3", - "\2\2\2\u0324\u0329\5l\67\2\u0325\u0326\7]\2\2\u0326\u0328\5l\67\2\u0327", - "\u0325\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u0327\3\2\2\2\u0329\u032a\3", - "\2\2\2\u032a\u032e\3\2\2\2\u032b\u0329\3\2\2\2\u032c\u032e\3\2\2\2\u032d", - "\u0324\3\2\2\2\u032d\u032c\3\2\2\2\u032ek\3\2\2\2\u032f\u0335\n\n\2", - "\2\u0330\u0332\7@\2\2\u0331\u0333\5\f\7\2\u0332\u0331\3\2\2\2\u0332", - "\u0333\3\2\2\2\u0333\u0334\3\2\2\2\u0334\u0336\7A\2\2\u0335\u0330\3", - "\2\2\2\u0335\u0336\3\2\2\2\u0336\u0339\3\2\2\2\u0337\u0339\3\2\2\2\u0338", - "\u032f\3\2\2\2\u0338\u0337\3\2\2\2\u0339m\3\2\2\2\u033a\u0340\n\13\2", - "\2\u033b\u033c\7@\2\2\u033c\u033d\5n8\2\u033d\u033e\7A\2\2\u033e\u0340", - "\3\2\2\2\u033f\u033a\3\2\2\2\u033f\u033b\3\2\2\2\u0340\u0343\3\2\2\2", - "\u0341\u033f\3\2\2\2\u0341\u0342\3\2\2\2\u0342o\3\2\2\2\u0343\u0341", - "\3\2\2\2\u0344\u0346\7P\2\2\u0345\u0347\5r:\2\u0346\u0345\3\2\2\2\u0346", - "\u0347\3\2\2\2\u0347\u0357\3\2\2\2\u0348\u034a\7P\2\2\u0349\u034b\5", - "r:\2\u034a\u0349\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034c\3\2\2\2\u034c", - "\u0357\5p9\2\u034d\u034f\7W\2\2\u034e\u0350\5r:\2\u034f\u034e\3\2\2", - "\2\u034f\u0350\3\2\2\2\u0350\u0357\3\2\2\2\u0351\u0353\7W\2\2\u0352", - "\u0354\5r:\2\u0353\u0352\3\2\2\2\u0353\u0354\3\2\2\2\u0354\u0355\3\2", - "\2\2\u0355\u0357\5p9\2\u0356\u0344\3\2\2\2\u0356\u0348\3\2\2\2\u0356", - "\u034d\3\2\2\2\u0356\u0351\3\2\2\2\u0357q\3\2\2\2\u0358\u0359\b:\1\2", - "\u0359\u035a\5\\/\2\u035a\u035f\3\2\2\2\u035b\u035c\f\3\2\2\u035c\u035e", - "\5\\/\2\u035d\u035b\3\2\2\2\u035e\u0361\3\2\2\2\u035f\u035d\3\2\2\2", - "\u035f\u0360\3\2\2\2\u0360s\3\2\2\2\u0361\u035f\3\2\2\2\u0362\u0368", - "\5v<\2\u0363\u0364\5v<\2\u0364\u0365\7]\2\2\u0365\u0366\7m\2\2\u0366", - "\u0368\3\2\2\2\u0367\u0362\3\2\2\2\u0367\u0363\3\2\2\2\u0368u\3\2\2", - "\2\u0369\u036a\b<\1\2\u036a\u036b\5x=\2\u036b\u0371\3\2\2\2\u036c\u036d", - "\f\3\2\2\u036d\u036e\7]\2\2\u036e\u0370\5x=\2\u036f\u036c\3\2\2\2\u0370", - "\u0373\3\2\2\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372w\3\2\2", - "\2\u0373\u0371\3\2\2\2\u0374\u0375\5\64\33\2\u0375\u0376\5b\62\2\u0376", - "\u037c\3\2\2\2\u0377\u0379\5\66\34\2\u0378\u037a\5~@\2\u0379\u0378\3", - "\2\2\2\u0379\u037a\3\2\2\2\u037a\u037c\3\2\2\2\u037b\u0374\3\2\2\2\u037b", - "\u0377\3\2\2\2\u037cy\3\2\2\2\u037d\u037e\b>\1\2\u037e\u037f\7n\2\2", - "\u037f\u0385\3\2\2\2\u0380\u0381\f\3\2\2\u0381\u0382\7]\2\2\u0382\u0384", - "\7n\2\2\u0383\u0380\3\2\2\2\u0384\u0387\3\2\2\2\u0385\u0383\3\2\2\2", - "\u0385\u0386\3\2\2\2\u0386{\3\2\2\2\u0387\u0385\3\2\2\2\u0388\u038a", - "\5L\'\2\u0389\u038b\5~@\2\u038a\u0389\3\2\2\2\u038a\u038b\3\2\2\2\u038b", - "}\3\2\2\2\u038c\u0398\5p9\2\u038d\u038f\5p9\2\u038e\u038d\3\2\2\2\u038e", - "\u038f\3\2\2\2\u038f\u0390\3\2\2\2\u0390\u0394\5\u0080A\2\u0391\u0393", - "\5f\64\2\u0392\u0391\3\2\2\2\u0393\u0396\3\2\2\2\u0394\u0392\3\2\2\2", - "\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396\u0394\3\2\2\2\u0397\u038c", - "\3\2\2\2\u0397\u038e\3\2\2\2\u0398\177\3\2\2\2\u0399\u039a\bA\1\2\u039a", - "\u039b\7@\2\2\u039b\u039c\5~@\2\u039c\u03a0\7A\2\2\u039d\u039f\5f\64", - "\2\u039e\u039d\3\2\2\2\u039f\u03a2\3\2\2\2\u03a0\u039e\3\2\2\2\u03a0", - "\u03a1\3\2\2\2\u03a1\u03c8\3\2\2\2\u03a2\u03a0\3\2\2\2\u03a3\u03a5\7", - "B\2\2\u03a4\u03a6\5r:\2\u03a5\u03a4\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6", - "\u03a8\3\2\2\2\u03a7\u03a9\5*\26\2\u03a8\u03a7\3\2\2\2\u03a8\u03a9\3", - "\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u03c8\7C\2\2\u03ab\u03ac\7B\2\2\u03ac", - "\u03ae\7-\2\2\u03ad\u03af\5r:\2\u03ae\u03ad\3\2\2\2\u03ae\u03af\3\2", - "\2\2\u03af\u03b0\3\2\2\2\u03b0\u03b1\5*\26\2\u03b1\u03b2\7C\2\2\u03b2", - "\u03c8\3\2\2\2\u03b3\u03b4\7B\2\2\u03b4\u03b5\5r:\2\u03b5\u03b6\7-\2", - "\2\u03b6\u03b7\5*\26\2\u03b7\u03b8\7C\2\2\u03b8\u03c8\3\2\2\2\u03b9", - "\u03ba\7B\2\2\u03ba\u03bb\7P\2\2\u03bb\u03c8\7C\2\2\u03bc\u03be\7@\2", - "\2\u03bd\u03bf\5t;\2\u03be\u03bd\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c0", - "\3\2\2\2\u03c0\u03c4\7A\2\2\u03c1\u03c3\5f\64\2\u03c2\u03c1\3\2\2\2", - "\u03c3\u03c6\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03c8", - "\3\2\2\2\u03c6\u03c4\3\2\2\2\u03c7\u0399\3\2\2\2\u03c7\u03a3\3\2\2\2", - "\u03c7\u03ab\3\2\2\2\u03c7\u03b3\3\2\2\2\u03c7\u03b9\3\2\2\2\u03c7\u03bc", - "\3\2\2\2\u03c8\u03f4\3\2\2\2\u03c9\u03ca\f\7\2\2\u03ca\u03cc\7B\2\2", - "\u03cb\u03cd\5r:\2\u03cc\u03cb\3\2\2\2\u03cc\u03cd\3\2\2\2\u03cd\u03cf", - "\3\2\2\2\u03ce\u03d0\5*\26\2\u03cf\u03ce\3\2\2\2\u03cf\u03d0\3\2\2\2", - "\u03d0\u03d1\3\2\2\2\u03d1\u03f3\7C\2\2\u03d2\u03d3\f\6\2\2\u03d3\u03d4", - "\7B\2\2\u03d4\u03d6\7-\2\2\u03d5\u03d7\5r:\2\u03d6\u03d5\3\2\2\2\u03d6", - "\u03d7\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03d9\5*\26\2\u03d9\u03da\7", - "C\2\2\u03da\u03f3\3\2\2\2\u03db\u03dc\f\5\2\2\u03dc\u03dd\7B\2\2\u03dd", - "\u03de\5r:\2\u03de\u03df\7-\2\2\u03df\u03e0\5*\26\2\u03e0\u03e1\7C\2", - "\2\u03e1\u03f3\3\2\2\2\u03e2\u03e3\f\4\2\2\u03e3\u03e4\7B\2\2\u03e4", - "\u03e5\7P\2\2\u03e5\u03f3\7C\2\2\u03e6\u03e7\f\3\2\2\u03e7\u03e9\7@", - "\2\2\u03e8\u03ea\5t;\2\u03e9\u03e8\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea", - "\u03eb\3\2\2\2\u03eb\u03ef\7A\2\2\u03ec\u03ee\5f\64\2\u03ed\u03ec\3", - "\2\2\2\u03ee\u03f1\3\2\2\2\u03ef\u03ed\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0", - "\u03f3\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f2\u03c9\3\2\2\2\u03f2\u03d2\3", - "\2\2\2\u03f2\u03db\3\2\2\2\u03f2\u03e2\3\2\2\2\u03f2\u03e6\3\2\2\2\u03f3", - "\u03f6\3\2\2\2\u03f4\u03f2\3\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u0081\3", - "\2\2\2\u03f6\u03f4\3\2\2\2\u03f7\u03f8\7n\2\2\u03f8\u0083\3\2\2\2\u03f9", - "\u0404\5*\26\2\u03fa\u03fb\7D\2\2\u03fb\u03fc\5\u0086D\2\u03fc\u03fd", - "\7E\2\2\u03fd\u0404\3\2\2\2\u03fe\u03ff\7D\2\2\u03ff\u0400\5\u0086D", - "\2\u0400\u0401\7]\2\2\u0401\u0402\7E\2\2\u0402\u0404\3\2\2\2\u0403\u03f9", - "\3\2\2\2\u0403\u03fa\3\2\2\2\u0403\u03fe\3\2\2\2\u0404\u0085\3\2\2\2", - "\u0405\u0407\bD\1\2\u0406\u0408\5\u0088E\2\u0407\u0406\3\2\2\2\u0407", - "\u0408\3\2\2\2\u0408\u0409\3\2\2\2\u0409\u040a\5\u0084C\2\u040a\u0413", - "\3\2\2\2\u040b\u040c\f\3\2\2\u040c\u040e\7]\2\2\u040d\u040f\5\u0088", - "E\2\u040e\u040d\3\2\2\2\u040e\u040f\3\2\2\2\u040f\u0410\3\2\2\2\u0410", - "\u0412\5\u0084C\2\u0411\u040b\3\2\2\2\u0412\u0415\3\2\2\2\u0413\u0411", - "\3\2\2\2\u0413\u0414\3\2\2\2\u0414\u0087\3\2\2\2\u0415\u0413\3\2\2\2", - "\u0416\u0417\5\u008aF\2\u0417\u0418\7^\2\2\u0418\u0089\3\2\2\2\u0419", - "\u041a\bF\1\2\u041a\u041b\5\u008cG\2\u041b\u0420\3\2\2\2\u041c\u041d", - "\f\3\2\2\u041d\u041f\5\u008cG\2\u041e\u041c\3\2\2\2\u041f\u0422\3\2", - "\2\2\u0420\u041e\3\2\2\2\u0420\u0421\3\2\2\2\u0421\u008b\3\2\2\2\u0422", - "\u0420\3\2\2\2\u0423\u0424\7B\2\2\u0424\u0425\5\60\31\2\u0425\u0426", - "\7C\2\2\u0426\u042a\3\2\2\2\u0427\u0428\7l\2\2\u0428\u042a\7n\2\2\u0429", - "\u0423\3\2\2\2\u0429\u0427\3\2\2\2\u042a\u008d\3\2\2\2\u042b\u042c\7", - ">\2\2\u042c\u042d\7@\2\2\u042d\u042e\5\60\31\2\u042e\u0430\7]\2\2\u042f", - "\u0431\7p\2\2\u0430\u042f\3\2\2\2\u0431\u0432\3\2\2\2\u0432\u0430\3", - "\2\2\2\u0432\u0433\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0435\7A\2\2\u0435", - "\u0436\7\\\2\2\u0436\u008f\3\2\2\2\u0437\u045d\5\u0092J\2\u0438\u045d", - "\5\u0094K\2\u0439\u045d\5\u009aN\2\u043a\u045d\5\u009cO\2\u043b\u045d", - "\5\u009eP\2\u043c\u045d\5\u00a0Q\2\u043d\u043e\t\f\2\2\u043e\u043f\t", - "\r\2\2\u043f\u0448\7@\2\2\u0440\u0445\5&\24\2\u0441\u0442\7]\2\2\u0442", - "\u0444\5&\24\2\u0443\u0441\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3", - "\2\2\2\u0445\u0446\3\2\2\2\u0446\u0449\3\2\2\2\u0447\u0445\3\2\2\2\u0448", - "\u0440\3\2\2\2\u0448\u0449\3\2\2\2\u0449\u0457\3\2\2\2\u044a\u0453\7", - "[\2\2\u044b\u0450\5&\24\2\u044c\u044d\7]\2\2\u044d\u044f\5&\24\2\u044e", - "\u044c\3\2\2\2\u044f\u0452\3\2\2\2\u0450\u044e\3\2\2\2\u0450\u0451\3", - "\2\2\2\u0451\u0454\3\2\2\2\u0452\u0450\3\2\2\2\u0453\u044b\3\2\2\2\u0453", - "\u0454\3\2\2\2\u0454\u0456\3\2\2\2\u0455\u044a\3\2\2\2\u0456\u0459\3", - "\2\2\2\u0457\u0455\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u045a\3\2\2\2\u0459", - "\u0457\3\2\2\2\u045a\u045b\7A\2\2\u045b\u045d\7\\\2\2\u045c\u0437\3", - "\2\2\2\u045c\u0438\3\2\2\2\u045c\u0439\3\2\2\2\u045c\u043a\3\2\2\2\u045c", - "\u043b\3\2\2\2\u045c\u043c\3\2\2\2\u045c\u043d\3\2\2\2\u045d\u0091\3", - "\2\2\2\u045e\u045f\7n\2\2\u045f\u0460\7[\2\2\u0460\u046a\5\u0090I\2", - "\u0461\u0462\7\26\2\2\u0462\u0463\5\60\31\2\u0463\u0464\7[\2\2\u0464", - "\u0465\5\u0090I\2\u0465\u046a\3\2\2\2\u0466\u0467\7\32\2\2\u0467\u0468", - "\7[\2\2\u0468\u046a\5\u0090I\2\u0469\u045e\3\2\2\2\u0469\u0461\3\2\2", - "\2\u0469\u0466\3\2\2\2\u046a\u0093\3\2\2\2\u046b\u046d\7D\2\2\u046c", - "\u046e\5\u0096L\2\u046d\u046c\3\2\2\2\u046d\u046e\3\2\2\2\u046e\u046f", - "\3\2\2\2\u046f\u0470\7E\2\2\u0470\u0095\3\2\2\2\u0471\u0472\bL\1\2\u0472", - "\u0473\5\u0098M\2\u0473\u0478\3\2\2\2\u0474\u0475\f\3\2\2\u0475\u0477", - "\5\u0098M\2\u0476\u0474\3\2\2\2\u0477\u047a\3\2\2\2\u0478\u0476\3\2", - "\2\2\u0478\u0479\3\2\2\2\u0479\u0097\3\2\2\2\u047a\u0478\3\2\2\2\u047b", - "\u047e\5\62\32\2\u047c\u047e\5\u0090I\2\u047d\u047b\3\2\2\2\u047d\u047c", - "\3\2\2\2\u047e\u0099\3\2\2\2\u047f\u0481\5.\30\2\u0480\u047f\3\2\2\2", - "\u0480\u0481\3\2\2\2\u0481\u0482\3\2\2\2\u0482\u0483\7\\\2\2\u0483\u009b", - "\3\2\2\2\u0484\u0485\7#\2\2\u0485\u0486\7@\2\2\u0486\u0487\5.\30\2\u0487", - "\u0488\7A\2\2\u0488\u048b\5\u0090I\2\u0489\u048a\7\35\2\2\u048a\u048c", - "\5\u0090I\2\u048b\u0489\3\2\2\2\u048b\u048c\3\2\2\2\u048c\u0494\3\2", - "\2\2\u048d\u048e\7/\2\2\u048e\u048f\7@\2\2\u048f\u0490\5.\30\2\u0490", - "\u0491\7A\2\2\u0491\u0492\5\u0090I\2\u0492\u0494\3\2\2\2\u0493\u0484", - "\3\2\2\2\u0493\u048d\3\2\2\2\u0494\u009d\3\2\2\2\u0495\u0496\7\65\2", - "\2\u0496\u0497\7@\2\2\u0497\u0498\5.\30\2\u0498\u0499\7A\2\2\u0499\u049a", - "\5\u0090I\2\u049a\u04c0\3\2\2\2\u049b\u049c\7\33\2\2\u049c\u049d\5\u0090", - "I\2\u049d\u049e\7\65\2\2\u049e\u049f\7@\2\2\u049f\u04a0\5.\30\2\u04a0", - "\u04a1\7A\2\2\u04a1\u04a2\7\\\2\2\u04a2\u04c0\3\2\2\2\u04a3\u04a4\7", - "!\2\2\u04a4\u04a6\7@\2\2\u04a5\u04a7\5.\30\2\u04a6\u04a5\3\2\2\2\u04a6", - "\u04a7\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8\u04aa\7\\\2\2\u04a9\u04ab\5", - ".\30\2\u04aa\u04a9\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ac\3\2\2\2\u04ac", - "\u04ae\7\\\2\2\u04ad\u04af\5.\30\2\u04ae\u04ad\3\2\2\2\u04ae\u04af\3", - "\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04b1\7A\2\2\u04b1\u04c0\5\u0090I\2", - "\u04b2\u04b3\7!\2\2\u04b3\u04b4\7@\2\2\u04b4\u04b6\5\62\32\2\u04b5\u04b7", - "\5.\30\2\u04b6\u04b5\3\2\2\2\u04b6\u04b7\3\2\2\2\u04b7\u04b8\3\2\2\2", - "\u04b8\u04ba\7\\\2\2\u04b9\u04bb\5.\30\2\u04ba\u04b9\3\2\2\2\u04ba\u04bb", - "\3\2\2\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd\7A\2\2\u04bd\u04be\5\u0090", - "I\2\u04be\u04c0\3\2\2\2\u04bf\u0495\3\2\2\2\u04bf\u049b\3\2\2\2\u04bf", - "\u04a3\3\2\2\2\u04bf\u04b2\3\2\2\2\u04c0\u009f\3\2\2\2\u04c1\u04c2\7", - "\"\2\2\u04c2\u04c3\7n\2\2\u04c3\u04d2\7\\\2\2\u04c4\u04c5\7\31\2\2\u04c5", - "\u04d2\7\\\2\2\u04c6\u04c7\7\25\2\2\u04c7\u04d2\7\\\2\2\u04c8\u04ca", - "\7)\2\2\u04c9\u04cb\5.\30\2\u04ca\u04c9\3\2\2\2\u04ca\u04cb\3\2\2\2", - "\u04cb\u04cc\3\2\2\2\u04cc\u04d2\7\\\2\2\u04cd\u04ce\7\"\2\2\u04ce\u04cf", - "\5\16\b\2\u04cf\u04d0\7\\\2\2\u04d0\u04d2\3\2\2\2\u04d1\u04c1\3\2\2", - "\2\u04d1\u04c4\3\2\2\2\u04d1\u04c6\3\2\2\2\u04d1\u04c8\3\2\2\2\u04d1", - "\u04cd\3\2\2\2\u04d2\u00a1\3\2\2\2\u04d3\u04d5\5\u00a4S\2\u04d4\u04d3", - "\3\2\2\2\u04d4\u04d5\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d7\7\2\2\3", - "\u04d7\u00a3\3\2\2\2\u04d8\u04d9\bS\1\2\u04d9\u04da\5\u00b4[\2\u04da", - "\u04df\3\2\2\2\u04db\u04dc\f\3\2\2\u04dc\u04de\5\u00b4[\2\u04dd\u04db", - "\3\2\2\2\u04de\u04e1\3\2\2\2\u04df\u04dd\3\2\2\2\u04df\u04e0\3\2\2\2", - "\u04e0\u00a5\3\2\2\2\u04e1\u04df\3\2\2\2\u04e2\u04e3\7\21\2\2\u04e3", - "\u04e4\7\22\2\2\u04e4\u04e9\7p\2\2\u04e5\u04e6\7\21\2\2\u04e6\u04e7", - "\7\22\2\2\u04e7\u04e9\7q\2\2\u04e8\u04e2\3\2\2\2\u04e8\u04e5\3\2\2\2", - "\u04e9\u00a7\3\2\2\2\u04ea\u04ee\5\u00aeX\2\u04eb\u04ee\5\u00acW\2\u04ec", - "\u04ee\5\u00aaV\2\u04ed\u04ea\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ed\u04ec", - "\3\2\2\2\u04ee\u00a9\3\2\2\2\u04ef\u04f0\7\21\2\2\u04f0\u04f1\7\23\2", - "\2\u04f1\u04f2\7n\2\2\u04f2\u00ab\3\2\2\2\u04f3\u04f4\7\21\2\2\u04f4", - "\u04f5\7\23\2\2\u04f5\u04f6\7n\2\2\u04f6\u04f7\5\u00b0Y\2\u04f7\u00ad", - "\3\2\2\2\u04f8\u04f9\7\21\2\2\u04f9\u04fa\7\23\2\2\u04fa\u04fb\7n\2", - "\2\u04fb\u04fc\7@\2\2\u04fc\u04fd\5\u00b2Z\2\u04fd\u04fe\7A\2\2\u04fe", - "\u04ff\5\u00b0Y\2\u04ff\u00af\3\2\2\2\u0500\u0501\5.\30\2\u0501\u00b1", - "\3\2\2\2\u0502\u0503\bZ\1\2\u0503\u0504\7n\2\2\u0504\u050a\3\2\2\2\u0505", - "\u0506\f\3\2\2\u0506\u0507\7]\2\2\u0507\u0509\7n\2\2\u0508\u0505\3\2", - "\2\2\u0509\u050c\3\2\2\2\u050a\u0508\3\2\2\2\u050a\u050b\3\2\2\2\u050b", - "\u00b3\3\2\2\2\u050c\u050a\3\2\2\2\u050d\u0513\5\u00b6\\\2\u050e\u0513", - "\5\62\32\2\u050f\u0513\5\u00a6T\2\u0510\u0513\5\u00a8U\2\u0511\u0513", - "\7\\\2\2\u0512\u050d\3\2\2\2\u0512\u050e\3\2\2\2\u0512\u050f\3\2\2\2", - "\u0512\u0510\3\2\2\2\u0512\u0511\3\2\2\2\u0513\u00b5\3\2\2\2\u0514\u0516", - "\5\64\33\2\u0515\u0514\3\2\2\2\u0515\u0516\3\2\2\2\u0516\u0517\3\2\2", - "\2\u0517\u0519\5b\62\2\u0518\u051a\5\u00b8]\2\u0519\u0518\3\2\2\2\u0519", - "\u051a\3\2\2\2\u051a\u051b\3\2\2\2\u051b\u051c\5\u0094K\2\u051c\u00b7", - "\3\2\2\2\u051d\u051e\b]\1\2\u051e\u051f\5\62\32\2\u051f\u0524\3\2\2", - "\2\u0520\u0521\f\3\2\2\u0521\u0523\5\62\32\2\u0522\u0520\3\2\2\2\u0523", - "\u0526\3\2\2\2\u0524\u0522\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u00b9\3", - "\2\2\2\u0526\u0524\3\2\2\2\u008f\u00bf\u00c7\u00db\u00ec\u00f6\u011a", - "\u0124\u0131\u0133\u013e\u0157\u0167\u0175\u0177\u0183\u0185\u0191\u0193", - "\u01a5\u01a7\u01b3\u01b5\u01c0\u01cb\u01d6\u01e1\u01ec\u01f5\u01fc\u0208", - "\u020f\u0214\u0219\u021e\u0225\u022f\u0237\u0249\u024d\u0254\u0263\u0268", - "\u026d\u0271\u0275\u0277\u0281\u0286\u028a\u028e\u0296\u029f\u02a9\u02b1", - "\u02c2\u02ce\u02d1\u02d7\u02e0\u02e5\u02e8\u02ef\u02fe\u030a\u030d\u030f", - "\u0317\u031b\u0329\u032d\u0332\u0335\u0338\u033f\u0341\u0346\u034a\u034f", - "\u0353\u0356\u035f\u0367\u0371\u0379\u037b\u0385\u038a\u038e\u0394\u0397", - "\u03a0\u03a5\u03a8\u03ae\u03be\u03c4\u03c7\u03cc\u03cf\u03d6\u03e9\u03ef", - "\u03f2\u03f4\u0403\u0407\u040e\u0413\u0420\u0429\u0432\u0445\u0448\u0450", - "\u0453\u0457\u045c\u0469\u046d\u0478\u047d\u0480\u048b\u0493\u04a6\u04aa", - "\u04ae\u04b6\u04ba\u04bf\u04ca\u04d1\u04d4\u04df\u04e8\u04ed\u050a\u0512", - "\u0515\u0519\u0524"].join(""); + "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6", + "\u010d\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0117\n\6\3\6\3\6\3\6", + "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u0124\n\6\f\6\16\6\u0127\13\6\3", + "\7\3\7\3\7\3\7\3\7\3\7\7\7\u012f\n\7\f\7\16\7\u0132\13\7\3\b\3\b\3\b", + "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", + "\3\b\3\b\5\b\u014a\n\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3", + "\n\3\n\3\n\5\n\u015a\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13", + "\3\13\3\13\3\13\7\13\u0168\n\13\f\13\16\13\u016b\13\13\3\f\3\f\3\f\3", + "\f\3\f\3\f\3\f\3\f\3\f\7\f\u0176\n\f\f\f\16\f\u0179\13\f\3\r\3\r\3\r", + "\3\r\3\r\3\r\3\r\3\r\3\r\7\r\u0184\n\r\f\r\16\r\u0187\13\r\3\16\3\16", + "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\7", + "\16\u0198\n\16\f\16\16\16\u019b\13\16\3\17\3\17\3\17\3\17\3\17\3\17", + "\3\17\3\17\3\17\7\17\u01a6\n\17\f\17\16\17\u01a9\13\17\3\20\3\20\3\20", + "\3\20\3\20\3\20\7\20\u01b1\n\20\f\20\16\20\u01b4\13\20\3\21\3\21\3\21", + "\3\21\3\21\3\21\7\21\u01bc\n\21\f\21\16\21\u01bf\13\21\3\22\3\22\3\22", + "\3\22\3\22\3\22\7\22\u01c7\n\22\f\22\16\22\u01ca\13\22\3\23\3\23\3\23", + "\3\23\3\23\3\23\7\23\u01d2\n\23\f\23\16\23\u01d5\13\23\3\24\3\24\3\24", + "\3\24\3\24\3\24\7\24\u01dd\n\24\f\24\16\24\u01e0\13\24\3\25\3\25\3\25", + "\3\25\3\25\3\25\5\25\u01e8\n\25\3\26\3\26\3\26\3\26\3\26\5\26\u01ef", + "\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01f9\n\30\f\30\16", + "\30\u01fc\13\30\3\31\3\31\3\32\3\32\5\32\u0202\n\32\3\32\3\32\3\32\5", + "\32\u0207\n\32\3\33\6\33\u020a\n\33\r\33\16\33\u020b\3\34\6\34\u020f", + "\n\34\r\34\16\34\u0210\3\35\3\35\3\35\3\35\3\35\5\35\u0218\n\35\3\36", + "\3\36\3\36\3\36\3\36\3\36\7\36\u0220\n\36\f\36\16\36\u0223\13\36\3\37", + "\3\37\3\37\3\37\3\37\5\37\u022a\n\37\3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3", + "!\3!\3!\3!\3!\3!\5!\u023c\n!\3\"\3\"\5\"\u0240\n\"\3\"\3\"\3\"\3\"\3", + "\"\5\"\u0247\n\"\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%\7%\u0254\n%\f%\16", + "%\u0257\13%\3&\3&\5&\u025b\n&\3&\3&\3&\5&\u0260\n&\3\'\3\'\5\'\u0264", + "\n\'\3\'\3\'\5\'\u0268\n\'\5\'\u026a\n\'\3(\3(\3(\3(\3(\3(\7(\u0272", + "\n(\f(\16(\u0275\13(\3)\3)\5)\u0279\n)\3)\3)\5)\u027d\n)\3*\3*\5*\u0281", + "\n*\3*\3*\3*\3*\3*\3*\5*\u0289\n*\3*\3*\3*\3*\3*\3*\3*\5*\u0292\n*\3", + "+\3+\3+\3+\3+\3+\7+\u029a\n+\f+\16+\u029d\13+\3,\3,\3,\3,\3,\5,\u02a4", + "\n,\3-\3-\3.\3.\3.\3.\3.\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u02b5", + "\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02c1\n", + "\61\3\62\5\62\u02c4\n\62\3\62\3\62\7\62\u02c8\n\62\f\62\16\62\u02cb", + "\13\62\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u02d3\n\63\3\63\3\63\3\63", + "\5\63\u02d8\n\63\3\63\5\63\u02db\n\63\3\63\3\63\3\63\3\63\3\63\5\63", + "\u02e2\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", + "\63\3\63\5\63\u02f1\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63", + "\3\63\5\63\u02fd\n\63\3\63\7\63\u0300\n\63\f\63\16\63\u0303\13\63\3", + "\64\3\64\3\64\6\64\u0308\n\64\r\64\16\64\u0309\3\64\3\64\5\64\u030e", + "\n\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\7\66\u031a\n", + "\66\f\66\16\66\u031d\13\66\3\66\5\66\u0320\n\66\3\67\3\67\3\67\5\67", + "\u0325\n\67\3\67\5\67\u0328\n\67\3\67\5\67\u032b\n\67\38\38\38\38\3", + "8\78\u0332\n8\f8\168\u0335\138\39\39\59\u0339\n9\39\39\59\u033d\n9\3", + "9\39\39\59\u0342\n9\39\39\59\u0346\n9\39\59\u0349\n9\3:\3:\3:\3:\3:", + "\7:\u0350\n:\f:\16:\u0353\13:\3;\3;\3;\3;\3;\5;\u035a\n;\3<\3<\3<\3", + "<\3<\3<\7<\u0362\n<\f<\16<\u0365\13<\3=\3=\3=\3=\3=\5=\u036c\n=\5=\u036e", + "\n=\3>\3>\3>\3>\3>\3>\7>\u0376\n>\f>\16>\u0379\13>\3?\3?\5?\u037d\n", + "?\3@\3@\5@\u0381\n@\3@\3@\7@\u0385\n@\f@\16@\u0388\13@\5@\u038a\n@\3", + "A\3A\3A\3A\3A\7A\u0391\nA\fA\16A\u0394\13A\3A\3A\5A\u0398\nA\3A\5A\u039b", + "\nA\3A\3A\3A\3A\5A\u03a1\nA\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3", + "A\5A\u03b1\nA\3A\3A\7A\u03b5\nA\fA\16A\u03b8\13A\5A\u03ba\nA\3A\3A\3", + "A\5A\u03bf\nA\3A\5A\u03c2\nA\3A\3A\3A\3A\3A\5A\u03c9\nA\3A\3A\3A\3A", + "\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\5A\u03dc\nA\3A\3A\7A\u03e0\n", + "A\fA\16A\u03e3\13A\7A\u03e5\nA\fA\16A\u03e8\13A\3B\3B\3C\3C\3C\3C\3", + "C\3C\3C\3C\3C\3C\5C\u03f6\nC\3D\3D\5D\u03fa\nD\3D\3D\3D\3D\3D\5D\u0401", + "\nD\3D\7D\u0404\nD\fD\16D\u0407\13D\3E\3E\3E\3F\3F\3F\3F\3F\7F\u0411", + "\nF\fF\16F\u0414\13F\3G\3G\3G\3G\3G\3G\5G\u041c\nG\3H\3H\3H\3H\3H\6", + "H\u0423\nH\rH\16H\u0424\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3", + "I\7I\u0436\nI\fI\16I\u0439\13I\5I\u043b\nI\3I\3I\3I\3I\7I\u0441\nI\f", + "I\16I\u0444\13I\5I\u0446\nI\7I\u0448\nI\fI\16I\u044b\13I\3I\3I\5I\u044f", + "\nI\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u045c\nJ\3K\3K\5K\u0460\nK\3", + "K\3K\3L\3L\3L\3L\3L\7L\u0469\nL\fL\16L\u046c\13L\3M\3M\5M\u0470\nM\3", + "N\5N\u0473\nN\3N\3N\3O\3O\3O\3O\3O\3O\3O\5O\u047e\nO\3O\3O\3O\3O\3O", + "\3O\5O\u0486\nO\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\5", + "P\u0499\nP\3P\3P\5P\u049d\nP\3P\3P\5P\u04a1\nP\3P\3P\3P\3P\3P\3P\5P", + "\u04a9\nP\3P\3P\5P\u04ad\nP\3P\3P\3P\5P\u04b2\nP\3Q\3Q\3Q\3Q\3Q\3Q\3", + "Q\3Q\3Q\5Q\u04bd\nQ\3Q\3Q\3Q\3Q\3Q\5Q\u04c4\nQ\3R\5R\u04c7\nR\3R\3R", + "\3S\3S\3S\3S\3S\7S\u04d0\nS\fS\16S\u04d3\13S\3T\3T\3T\5T\u04d8\nT\3", + "U\5U\u04db\nU\3U\3U\5U\u04df\nU\3U\3U\3V\3V\3V\3V\3V\7V\u04e8\nV\fV", + "\16V\u04eb\13V\3V\2\36\6\n\f\24\26\30\32\34\36 \"$&.:HNTdrvz\u0080\u0086", + "\u008a\u0096\u00a4\u00aaW\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"", + "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082", + "\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a", + "\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\2\16\7\2IIKKMMPPUV", + "\3\2[e\b\2\21\21\34\34$$**--<<\n\2\6\b\24\24\31\31\35\35\"#\'(/\60\66", + "\67\3\2\6\b\4\2++..\6\2\25\25%%\61\61\65\65\5\2\n\13!!::\4\2=>ZZ\3\2", + "=>\4\2\r\r\17\17\4\2\20\20\61\61\u055c\2\u00cd\3\2\2\2\4\u00cf\3\2\2", + "\2\6\u00d6\3\2\2\2\b\u00e8\3\2\2\2\n\u010c\3\2\2\2\f\u0128\3\2\2\2\16", + "\u0149\3\2\2\2\20\u014b\3\2\2\2\22\u0159\3\2\2\2\24\u015b\3\2\2\2\26", + "\u016c\3\2\2\2\30\u017a\3\2\2\2\32\u0188\3\2\2\2\34\u019c\3\2\2\2\36", + "\u01aa\3\2\2\2 \u01b5\3\2\2\2\"\u01c0\3\2\2\2$\u01cb\3\2\2\2&\u01d6", + "\3\2\2\2(\u01e1\3\2\2\2*\u01ee\3\2\2\2,\u01f0\3\2\2\2.\u01f2\3\2\2\2", + "\60\u01fd\3\2\2\2\62\u0206\3\2\2\2\64\u0209\3\2\2\2\66\u020e\3\2\2\2", + "8\u0217\3\2\2\2:\u0219\3\2\2\2<\u0229\3\2\2\2>\u022b\3\2\2\2@\u023b", + "\3\2\2\2B\u0246\3\2\2\2D\u0248\3\2\2\2F\u024a\3\2\2\2H\u024e\3\2\2\2", + "J\u025f\3\2\2\2L\u0269\3\2\2\2N\u026b\3\2\2\2P\u027c\3\2\2\2R\u0291", + "\3\2\2\2T\u0293\3\2\2\2V\u02a3\3\2\2\2X\u02a5\3\2\2\2Z\u02a7\3\2\2\2", + "\\\u02ac\3\2\2\2^\u02b4\3\2\2\2`\u02c0\3\2\2\2b\u02c3\3\2\2\2d\u02d2", + "\3\2\2\2f\u030d\3\2\2\2h\u030f\3\2\2\2j\u031f\3\2\2\2l\u032a\3\2\2\2", + "n\u0333\3\2\2\2p\u0348\3\2\2\2r\u034a\3\2\2\2t\u0359\3\2\2\2v\u035b", + "\3\2\2\2x\u036d\3\2\2\2z\u036f\3\2\2\2|\u037a\3\2\2\2~\u0389\3\2\2\2", + "\u0080\u03b9\3\2\2\2\u0082\u03e9\3\2\2\2\u0084\u03f5\3\2\2\2\u0086\u03f7", + "\3\2\2\2\u0088\u0408\3\2\2\2\u008a\u040b\3\2\2\2\u008c\u041b\3\2\2\2", + "\u008e\u041d\3\2\2\2\u0090\u044e\3\2\2\2\u0092\u045b\3\2\2\2\u0094\u045d", + "\3\2\2\2\u0096\u0463\3\2\2\2\u0098\u046f\3\2\2\2\u009a\u0472\3\2\2\2", + "\u009c\u0485\3\2\2\2\u009e\u04b1\3\2\2\2\u00a0\u04c3\3\2\2\2\u00a2\u04c6", + "\3\2\2\2\u00a4\u04ca\3\2\2\2\u00a6\u04d7\3\2\2\2\u00a8\u04da\3\2\2\2", + "\u00aa\u04e2\3\2\2\2\u00ac\u00ce\7k\2\2\u00ad\u00ce\7l\2\2\u00ae\u00b0", + "\7m\2\2\u00af\u00ae\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00af\3\2\2\2", + "\u00b1\u00b2\3\2\2\2\u00b2\u00ce\3\2\2\2\u00b3\u00b4\7=\2\2\u00b4\u00b5", + "\5.\30\2\u00b5\u00b6\7>\2\2\u00b6\u00ce\3\2\2\2\u00b7\u00ce\5\4\3\2", + "\u00b8\u00ba\7\3\2\2\u00b9\u00b8\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00bb", + "\3\2\2\2\u00bb\u00bc\7=\2\2\u00bc\u00bd\5\u0094K\2\u00bd\u00be\7>\2", + "\2\u00be\u00ce\3\2\2\2\u00bf\u00c0\7\4\2\2\u00c0\u00c1\7=\2\2\u00c1", + "\u00c2\5\16\b\2\u00c2\u00c3\7Z\2\2\u00c3\u00c4\5|?\2\u00c4\u00c5\7>", + "\2\2\u00c5\u00ce\3\2\2\2\u00c6\u00c7\7\5\2\2\u00c7\u00c8\7=\2\2\u00c8", + "\u00c9\5|?\2\u00c9\u00ca\7Z\2\2\u00ca\u00cb\5\16\b\2\u00cb\u00cc\7>", + "\2\2\u00cc\u00ce\3\2\2\2\u00cd\u00ac\3\2\2\2\u00cd\u00ad\3\2\2\2\u00cd", + "\u00af\3\2\2\2\u00cd\u00b3\3\2\2\2\u00cd\u00b7\3\2\2\2\u00cd\u00b9\3", + "\2\2\2\u00cd\u00bf\3\2\2\2\u00cd\u00c6\3\2\2\2\u00ce\3\3\2\2\2\u00cf", + "\u00d0\78\2\2\u00d0\u00d1\7=\2\2\u00d1\u00d2\5*\26\2\u00d2\u00d3\7Z", + "\2\2\u00d3\u00d4\5\6\4\2\u00d4\u00d5\7>\2\2\u00d5\5\3\2\2\2\u00d6\u00d7", + "\b\4\1\2\u00d7\u00d8\5\b\5\2\u00d8\u00de\3\2\2\2\u00d9\u00da\f\3\2\2", + "\u00da\u00db\7Z\2\2\u00db\u00dd\5\b\5\2\u00dc\u00d9\3\2\2\2\u00dd\u00e0", + "\3\2\2\2\u00de\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df\7\3\2\2\2\u00e0", + "\u00de\3\2\2\2\u00e1\u00e2\5|?\2\u00e2\u00e3\7X\2\2\u00e3\u00e4\5*\26", + "\2\u00e4\u00e9\3\2\2\2\u00e5\u00e6\7\27\2\2\u00e6\u00e7\7X\2\2\u00e7", + "\u00e9\5*\26\2\u00e8\u00e1\3\2\2\2\u00e8\u00e5\3\2\2\2\u00e9\t\3\2\2", + "\2\u00ea\u00eb\b\6\1\2\u00eb\u010d\5\2\2\2\u00ec\u00ed\7=\2\2\u00ed", + "\u00ee\5|?\2\u00ee\u00ef\7>\2\2\u00ef\u00f0\7A\2\2\u00f0\u00f1\5\u0086", + "D\2\u00f1\u00f2\7B\2\2\u00f2\u010d\3\2\2\2\u00f3\u00f4\7=\2\2\u00f4", + "\u00f5\5|?\2\u00f5\u00f6\7>\2\2\u00f6\u00f7\7A\2\2\u00f7\u00f8\5\u0086", + "D\2\u00f8\u00f9\7Z\2\2\u00f9\u00fa\7B\2\2\u00fa\u010d\3\2\2\2\u00fb", + "\u00fc\7\3\2\2\u00fc\u00fd\7=\2\2\u00fd\u00fe\5|?\2\u00fe\u00ff\7>\2", + "\2\u00ff\u0100\7A\2\2\u0100\u0101\5\u0086D\2\u0101\u0102\7B\2\2\u0102", + "\u010d\3\2\2\2\u0103\u0104\7\3\2\2\u0104\u0105\7=\2\2\u0105\u0106\5", + "|?\2\u0106\u0107\7>\2\2\u0107\u0108\7A\2\2\u0108\u0109\5\u0086D\2\u0109", + "\u010a\7Z\2\2\u010a\u010b\7B\2\2\u010b\u010d\3\2\2\2\u010c\u00ea\3\2", + "\2\2\u010c\u00ec\3\2\2\2\u010c\u00f3\3\2\2\2\u010c\u00fb\3\2\2\2\u010c", + "\u0103\3\2\2\2\u010d\u0125\3\2\2\2\u010e\u010f\f\f\2\2\u010f\u0110\7", + "?\2\2\u0110\u0111\5.\30\2\u0111\u0112\7@\2\2\u0112\u0124\3\2\2\2\u0113", + "\u0114\f\13\2\2\u0114\u0116\7=\2\2\u0115\u0117\5\f\7\2\u0116\u0115\3", + "\2\2\2\u0116\u0117\3\2\2\2\u0117\u0118\3\2\2\2\u0118\u0124\7>\2\2\u0119", + "\u011a\f\n\2\2\u011a\u011b\7i\2\2\u011b\u0124\7k\2\2\u011c\u011d\f\t", + "\2\2\u011d\u011e\7h\2\2\u011e\u0124\7k\2\2\u011f\u0120\f\b\2\2\u0120", + "\u0124\7J\2\2\u0121\u0122\f\7\2\2\u0122\u0124\7L\2\2\u0123\u010e\3\2", + "\2\2\u0123\u0113\3\2\2\2\u0123\u0119\3\2\2\2\u0123\u011c\3\2\2\2\u0123", + "\u011f\3\2\2\2\u0123\u0121\3\2\2\2\u0124\u0127\3\2\2\2\u0125\u0123\3", + "\2\2\2\u0125\u0126\3\2\2\2\u0126\13\3\2\2\2\u0127\u0125\3\2\2\2\u0128", + "\u0129\b\7\1\2\u0129\u012a\5*\26\2\u012a\u0130\3\2\2\2\u012b\u012c\f", + "\3\2\2\u012c\u012d\7Z\2\2\u012d\u012f\5*\26\2\u012e\u012b\3\2\2\2\u012f", + "\u0132\3\2\2\2\u0130\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131\r\3\2\2", + "\2\u0132\u0130\3\2\2\2\u0133\u014a\5\n\6\2\u0134\u0135\7J\2\2\u0135", + "\u014a\5\16\b\2\u0136\u0137\7L\2\2\u0137\u014a\5\16\b\2\u0138\u0139", + "\5\20\t\2\u0139\u013a\5\22\n\2\u013a\u014a\3\2\2\2\u013b\u013c\7)\2", + "\2\u013c\u014a\5\16\b\2\u013d\u013e\7)\2\2\u013e\u013f\7=\2\2\u013f", + "\u0140\5|?\2\u0140\u0141\7>\2\2\u0141\u014a\3\2\2\2\u0142\u0143\7\64", + "\2\2\u0143\u0144\7=\2\2\u0144\u0145\5|?\2\u0145\u0146\7>\2\2\u0146\u014a", + "\3\2\2\2\u0147\u0148\7R\2\2\u0148\u014a\7k\2\2\u0149\u0133\3\2\2\2\u0149", + "\u0134\3\2\2\2\u0149\u0136\3\2\2\2\u0149\u0138\3\2\2\2\u0149\u013b\3", + "\2\2\2\u0149\u013d\3\2\2\2\u0149\u0142\3\2\2\2\u0149\u0147\3\2\2\2\u014a", + "\17\3\2\2\2\u014b\u014c\t\2\2\2\u014c\21\3\2\2\2\u014d\u015a\5\16\b", + "\2\u014e\u014f\7=\2\2\u014f\u0150\5|?\2\u0150\u0151\7>\2\2\u0151\u0152", + "\5\22\n\2\u0152\u015a\3\2\2\2\u0153\u0154\7\3\2\2\u0154\u0155\7=\2\2", + "\u0155\u0156\5|?\2\u0156\u0157\7>\2\2\u0157\u0158\5\22\n\2\u0158\u015a", + "\3\2\2\2\u0159\u014d\3\2\2\2\u0159\u014e\3\2\2\2\u0159\u0153\3\2\2\2", + "\u015a\23\3\2\2\2\u015b\u015c\b\13\1\2\u015c\u015d\5\22\n\2\u015d\u0169", + "\3\2\2\2\u015e\u015f\f\5\2\2\u015f\u0160\7M\2\2\u0160\u0168\5\22\n\2", + "\u0161\u0162\f\4\2\2\u0162\u0163\7N\2\2\u0163\u0168\5\22\n\2\u0164\u0165", + "\f\3\2\2\u0165\u0166\7O\2\2\u0166\u0168\5\22\n\2\u0167\u015e\3\2\2\2", + "\u0167\u0161\3\2\2\2\u0167\u0164\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u0167", + "\3\2\2\2\u0169\u016a\3\2\2\2\u016a\25\3\2\2\2\u016b\u0169\3\2\2\2\u016c", + "\u016d\b\f\1\2\u016d\u016e\5\24\13\2\u016e\u0177\3\2\2\2\u016f\u0170", + "\f\4\2\2\u0170\u0171\7I\2\2\u0171\u0176\5\24\13\2\u0172\u0173\f\3\2", + "\2\u0173\u0174\7K\2\2\u0174\u0176\5\24\13\2\u0175\u016f\3\2\2\2\u0175", + "\u0172\3\2\2\2\u0176\u0179\3\2\2\2\u0177\u0175\3\2\2\2\u0177\u0178\3", + "\2\2\2\u0178\27\3\2\2\2\u0179\u0177\3\2\2\2\u017a\u017b\b\r\1\2\u017b", + "\u017c\5\26\f\2\u017c\u0185\3\2\2\2\u017d\u017e\f\4\2\2\u017e\u017f", + "\7G\2\2\u017f\u0184\5\26\f\2\u0180\u0181\f\3\2\2\u0181\u0182\7H\2\2", + "\u0182\u0184\5\26\f\2\u0183\u017d\3\2\2\2\u0183\u0180\3\2\2\2\u0184", + "\u0187\3\2\2\2\u0185\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\31\3\2", + "\2\2\u0187\u0185\3\2\2\2\u0188\u0189\b\16\1\2\u0189\u018a\5\30\r\2\u018a", + "\u0199\3\2\2\2\u018b\u018c\f\6\2\2\u018c\u018d\7C\2\2\u018d\u0198\5", + "\30\r\2\u018e\u018f\f\5\2\2\u018f\u0190\7E\2\2\u0190\u0198\5\30\r\2", + "\u0191\u0192\f\4\2\2\u0192\u0193\7D\2\2\u0193\u0198\5\30\r\2\u0194\u0195", + "\f\3\2\2\u0195\u0196\7F\2\2\u0196\u0198\5\30\r\2\u0197\u018b\3\2\2\2", + "\u0197\u018e\3\2\2\2\u0197\u0191\3\2\2\2\u0197\u0194\3\2\2\2\u0198\u019b", + "\3\2\2\2\u0199\u0197\3\2\2\2\u0199\u019a\3\2\2\2\u019a\33\3\2\2\2\u019b", + "\u0199\3\2\2\2\u019c\u019d\b\17\1\2\u019d\u019e\5\32\16\2\u019e\u01a7", + "\3\2\2\2\u019f\u01a0\f\4\2\2\u01a0\u01a1\7f\2\2\u01a1\u01a6\5\32\16", + "\2\u01a2\u01a3\f\3\2\2\u01a3\u01a4\7g\2\2\u01a4\u01a6\5\32\16\2\u01a5", + "\u019f\3\2\2\2\u01a5\u01a2\3\2\2\2\u01a6\u01a9\3\2\2\2\u01a7\u01a5\3", + "\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\35\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa", + "\u01ab\b\20\1\2\u01ab\u01ac\5\34\17\2\u01ac\u01b2\3\2\2\2\u01ad\u01ae", + "\f\3\2\2\u01ae\u01af\7P\2\2\u01af\u01b1\5\34\17\2\u01b0\u01ad\3\2\2", + "\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3", + "\37\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b6\b\21\1\2\u01b6\u01b7\5\36", + "\20\2\u01b7\u01bd\3\2\2\2\u01b8\u01b9\f\3\2\2\u01b9\u01ba\7T\2\2\u01ba", + "\u01bc\5\36\20\2\u01bb\u01b8\3\2\2\2\u01bc\u01bf\3\2\2\2\u01bd\u01bb", + "\3\2\2\2\u01bd\u01be\3\2\2\2\u01be!\3\2\2\2\u01bf\u01bd\3\2\2\2\u01c0", + "\u01c1\b\22\1\2\u01c1\u01c2\5 \21\2\u01c2\u01c8\3\2\2\2\u01c3\u01c4", + "\f\3\2\2\u01c4\u01c5\7Q\2\2\u01c5\u01c7\5 \21\2\u01c6\u01c3\3\2\2\2", + "\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9#", + "\3\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01cc\b\23\1\2\u01cc\u01cd\5\"\22", + "\2\u01cd\u01d3\3\2\2\2\u01ce\u01cf\f\3\2\2\u01cf\u01d0\7R\2\2\u01d0", + "\u01d2\5\"\22\2\u01d1\u01ce\3\2\2\2\u01d2\u01d5\3\2\2\2\u01d3\u01d1", + "\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4%\3\2\2\2\u01d5\u01d3\3\2\2\2\u01d6", + "\u01d7\b\24\1\2\u01d7\u01d8\5$\23\2\u01d8\u01de\3\2\2\2\u01d9\u01da", + "\f\3\2\2\u01da\u01db\7S\2\2\u01db\u01dd\5$\23\2\u01dc\u01d9\3\2\2\2", + "\u01dd\u01e0\3\2\2\2\u01de\u01dc\3\2\2\2\u01de\u01df\3\2\2\2\u01df\'", + "\3\2\2\2\u01e0\u01de\3\2\2\2\u01e1\u01e7\5&\24\2\u01e2\u01e3\7W\2\2", + "\u01e3\u01e4\5.\30\2\u01e4\u01e5\7X\2\2\u01e5\u01e6\5(\25\2\u01e6\u01e8", + "\3\2\2\2\u01e7\u01e2\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8)\3\2\2\2\u01e9", + "\u01ef\5(\25\2\u01ea\u01eb\5\16\b\2\u01eb\u01ec\5,\27\2\u01ec\u01ed", + "\5*\26\2\u01ed\u01ef\3\2\2\2\u01ee\u01e9\3\2\2\2\u01ee\u01ea\3\2\2\2", + "\u01ef+\3\2\2\2\u01f0\u01f1\t\3\2\2\u01f1-\3\2\2\2\u01f2\u01f3\b\30", + "\1\2\u01f3\u01f4\5*\26\2\u01f4\u01fa\3\2\2\2\u01f5\u01f6\f\3\2\2\u01f6", + "\u01f7\7Z\2\2\u01f7\u01f9\5*\26\2\u01f8\u01f5\3\2\2\2\u01f9\u01fc\3", + "\2\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb/\3\2\2\2\u01fc", + "\u01fa\3\2\2\2\u01fd\u01fe\5(\25\2\u01fe\61\3\2\2\2\u01ff\u0201\5\64", + "\33\2\u0200\u0202\5:\36\2\u0201\u0200\3\2\2\2\u0201\u0202\3\2\2\2\u0202", + "\u0203\3\2\2\2\u0203\u0204\7Y\2\2\u0204\u0207\3\2\2\2\u0205\u0207\5", + "\u008eH\2\u0206\u01ff\3\2\2\2\u0206\u0205\3\2\2\2\u0207\63\3\2\2\2\u0208", + "\u020a\58\35\2\u0209\u0208\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u0209\3", + "\2\2\2\u020b\u020c\3\2\2\2\u020c\65\3\2\2\2\u020d\u020f\58\35\2\u020e", + "\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u020e\3\2\2\2\u0210\u0211\3", + "\2\2\2\u0211\67\3\2\2\2\u0212\u0218\5> \2\u0213\u0218\5@!\2\u0214\u0218", + "\5\\/\2\u0215\u0218\5^\60\2\u0216\u0218\5`\61\2\u0217\u0212\3\2\2\2", + "\u0217\u0213\3\2\2\2\u0217\u0214\3\2\2\2\u0217\u0215\3\2\2\2\u0217\u0216", + "\3\2\2\2\u02189\3\2\2\2\u0219\u021a\b\36\1\2\u021a\u021b\5<\37\2\u021b", + "\u0221\3\2\2\2\u021c\u021d\f\3\2\2\u021d\u021e\7Z\2\2\u021e\u0220\5", + "<\37\2\u021f\u021c\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221", + "\u0222\3\2\2\2\u0222;\3\2\2\2\u0223\u0221\3\2\2\2\u0224\u022a\5b\62", + "\2\u0225\u0226\5b\62\2\u0226\u0227\7[\2\2\u0227\u0228\5\u0084C\2\u0228", + "\u022a\3\2\2\2\u0229\u0224\3\2\2\2\u0229\u0225\3\2\2\2\u022a=\3\2\2", + "\2\u022b\u022c\t\4\2\2\u022c?\3\2\2\2\u022d\u023c\t\5\2\2\u022e\u022f", + "\7\3\2\2\u022f\u0230\7=\2\2\u0230\u0231\t\6\2\2\u0231\u023c\7>\2\2\u0232", + "\u023c\5Z.\2\u0233\u023c\5B\"\2\u0234\u023c\5R*\2\u0235\u023c\5\u0082", + "B\2\u0236\u0237\7\t\2\2\u0237\u0238\7=\2\2\u0238\u0239\5\60\31\2\u0239", + "\u023a\7>\2\2\u023a\u023c\3\2\2\2\u023b\u022d\3\2\2\2\u023b\u022e\3", + "\2\2\2\u023b\u0232\3\2\2\2\u023b\u0233\3\2\2\2\u023b\u0234\3\2\2\2\u023b", + "\u0235\3\2\2\2\u023b\u0236\3\2\2\2\u023cA\3\2\2\2\u023d\u023f\5D#\2", + "\u023e\u0240\7k\2\2\u023f\u023e\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241", + "\3\2\2\2\u0241\u0242\5F$\2\u0242\u0247\3\2\2\2\u0243\u0244\5D#\2\u0244", + "\u0245\7k\2\2\u0245\u0247\3\2\2\2\u0246\u023d\3\2\2\2\u0246\u0243\3", + "\2\2\2\u0247C\3\2\2\2\u0248\u0249\t\7\2\2\u0249E\3\2\2\2\u024a\u024b", + "\7A\2\2\u024b\u024c\5H%\2\u024c\u024d\7B\2\2\u024dG\3\2\2\2\u024e\u024f", + "\b%\1\2\u024f\u0250\5J&\2\u0250\u0255\3\2\2\2\u0251\u0252\f\3\2\2\u0252", + "\u0254\5J&\2\u0253\u0251\3\2\2\2\u0254\u0257\3\2\2\2\u0255\u0253\3\2", + "\2\2\u0255\u0256\3\2\2\2\u0256I\3\2\2\2\u0257\u0255\3\2\2\2\u0258\u025a", + "\5L\'\2\u0259\u025b\5N(\2\u025a\u0259\3\2\2\2\u025a\u025b\3\2\2\2\u025b", + "\u025c\3\2\2\2\u025c\u025d\7Y\2\2\u025d\u0260\3\2\2\2\u025e\u0260\5", + "\u008eH\2\u025f\u0258\3\2\2\2\u025f\u025e\3\2\2\2\u0260K\3\2\2\2\u0261", + "\u0263\5@!\2\u0262\u0264\5L\'\2\u0263\u0262\3\2\2\2\u0263\u0264\3\2", + "\2\2\u0264\u026a\3\2\2\2\u0265\u0267\5\\/\2\u0266\u0268\5L\'\2\u0267", + "\u0266\3\2\2\2\u0267\u0268\3\2\2\2\u0268\u026a\3\2\2\2\u0269\u0261\3", + "\2\2\2\u0269\u0265\3\2\2\2\u026aM\3\2\2\2\u026b\u026c\b(\1\2\u026c\u026d", + "\5P)\2\u026d\u0273\3\2\2\2\u026e\u026f\f\3\2\2\u026f\u0270\7Z\2\2\u0270", + "\u0272\5P)\2\u0271\u026e\3\2\2\2\u0272\u0275\3\2\2\2\u0273\u0271\3\2", + "\2\2\u0273\u0274\3\2\2\2\u0274O\3\2\2\2\u0275\u0273\3\2\2\2\u0276\u027d", + "\5b\62\2\u0277\u0279\5b\62\2\u0278\u0277\3\2\2\2\u0278\u0279\3\2\2\2", + "\u0279\u027a\3\2\2\2\u027a\u027b\7X\2\2\u027b\u027d\5\60\31\2\u027c", + "\u0276\3\2\2\2\u027c\u0278\3\2\2\2\u027dQ\3\2\2\2\u027e\u0280\7\33\2", + "\2\u027f\u0281\7k\2\2\u0280\u027f\3\2\2\2\u0280\u0281\3\2\2\2\u0281", + "\u0282\3\2\2\2\u0282\u0283\7A\2\2\u0283\u0284\5T+\2\u0284\u0285\7B\2", + "\2\u0285\u0292\3\2\2\2\u0286\u0288\7\33\2\2\u0287\u0289\7k\2\2\u0288", + "\u0287\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u028a\3\2\2\2\u028a\u028b\7", + "A\2\2\u028b\u028c\5T+\2\u028c\u028d\7Z\2\2\u028d\u028e\7B\2\2\u028e", + "\u0292\3\2\2\2\u028f\u0290\7\33\2\2\u0290\u0292\7k\2\2\u0291\u027e\3", + "\2\2\2\u0291\u0286\3\2\2\2\u0291\u028f\3\2\2\2\u0292S\3\2\2\2\u0293", + "\u0294\b+\1\2\u0294\u0295\5V,\2\u0295\u029b\3\2\2\2\u0296\u0297\f\3", + "\2\2\u0297\u0298\7Z\2\2\u0298\u029a\5V,\2\u0299\u0296\3\2\2\2\u029a", + "\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3\2\2\2\u029cU\3\2\2", + "\2\u029d\u029b\3\2\2\2\u029e\u02a4\5X-\2\u029f\u02a0\5X-\2\u02a0\u02a1", + "\7[\2\2\u02a1\u02a2\5\60\31\2\u02a2\u02a4\3\2\2\2\u02a3\u029e\3\2\2", + "\2\u02a3\u029f\3\2\2\2\u02a4W\3\2\2\2\u02a5\u02a6\7k\2\2\u02a6Y\3\2", + "\2\2\u02a7\u02a8\7\65\2\2\u02a8\u02a9\7=\2\2\u02a9\u02aa\5|?\2\u02aa", + "\u02ab\7>\2\2\u02ab[\3\2\2\2\u02ac\u02ad\t\b\2\2\u02ad]\3\2\2\2\u02ae", + "\u02b5\t\t\2\2\u02af\u02b5\5h\65\2\u02b0\u02b1\7\f\2\2\u02b1\u02b2\7", + "=\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b5\7>\2\2\u02b4\u02ae\3\2\2\2\u02b4", + "\u02af\3\2\2\2\u02b4\u02b0\3\2\2\2\u02b5_\3\2\2\2\u02b6\u02b7\7\63\2", + "\2\u02b7\u02b8\7=\2\2\u02b8\u02b9\5|?\2\u02b9\u02ba\7>\2\2\u02ba\u02c1", + "\3\2\2\2\u02bb\u02bc\7\63\2\2\u02bc\u02bd\7=\2\2\u02bd\u02be\5\60\31", + "\2\u02be\u02bf\7>\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02b6\3\2\2\2\u02c0", + "\u02bb\3\2\2\2\u02c1a\3\2\2\2\u02c2\u02c4\5p9\2\u02c3\u02c2\3\2\2\2", + "\u02c3\u02c4\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5\u02c9\5d\63\2\u02c6\u02c8", + "\5f\64\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9\u02c7\3\2\2\2", + "\u02c9\u02ca\3\2\2\2\u02cac\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cd", + "\b\63\1\2\u02cd\u02d3\7k\2\2\u02ce\u02cf\7=\2\2\u02cf\u02d0\5b\62\2", + "\u02d0\u02d1\7>\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02cc\3\2\2\2\u02d2\u02ce", + "\3\2\2\2\u02d3\u0301\3\2\2\2\u02d4\u02d5\f\b\2\2\u02d5\u02d7\7?\2\2", + "\u02d6\u02d8\5r:\2\u02d7\u02d6\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u02da", + "\3\2\2\2\u02d9\u02db\5*\26\2\u02da\u02d9\3\2\2\2\u02da\u02db\3\2\2\2", + "\u02db\u02dc\3\2\2\2\u02dc\u0300\7@\2\2\u02dd\u02de\f\7\2\2\u02de\u02df", + "\7?\2\2\u02df\u02e1\7*\2\2\u02e0\u02e2\5r:\2\u02e1\u02e0\3\2\2\2\u02e1", + "\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5*\26\2\u02e4\u02e5\7", + "@\2\2\u02e5\u0300\3\2\2\2\u02e6\u02e7\f\6\2\2\u02e7\u02e8\7?\2\2\u02e8", + "\u02e9\5r:\2\u02e9\u02ea\7*\2\2\u02ea\u02eb\5*\26\2\u02eb\u02ec\7@\2", + "\2\u02ec\u0300\3\2\2\2\u02ed\u02ee\f\5\2\2\u02ee\u02f0\7?\2\2\u02ef", + "\u02f1\5r:\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f2\3\2", + "\2\2\u02f2\u02f3\7M\2\2\u02f3\u0300\7@\2\2\u02f4\u02f5\f\4\2\2\u02f5", + "\u02f6\7=\2\2\u02f6\u02f7\5t;\2\u02f7\u02f8\7>\2\2\u02f8\u0300\3\2\2", + "\2\u02f9\u02fa\f\3\2\2\u02fa\u02fc\7=\2\2\u02fb\u02fd\5z>\2\u02fc\u02fb", + "\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02fe\3\2\2\2\u02fe\u0300\7>\2\2", + "\u02ff\u02d4\3\2\2\2\u02ff\u02dd\3\2\2\2\u02ff\u02e6\3\2\2\2\u02ff\u02ed", + "\3\2\2\2\u02ff\u02f4\3\2\2\2\u02ff\u02f9\3\2\2\2\u0300\u0303\3\2\2\2", + "\u0301\u02ff\3\2\2\2\u0301\u0302\3\2\2\2\u0302e\3\2\2\2\u0303\u0301", + "\3\2\2\2\u0304\u0305\7\r\2\2\u0305\u0307\7=\2\2\u0306\u0308\7m\2\2\u0307", + "\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307\3\2\2\2\u0309\u030a\3", + "\2\2\2\u030a\u030b\3\2\2\2\u030b\u030e\7>\2\2\u030c\u030e\5h\65\2\u030d", + "\u0304\3\2\2\2\u030d\u030c\3\2\2\2\u030eg\3\2\2\2\u030f\u0310\7\16\2", + "\2\u0310\u0311\7=\2\2\u0311\u0312\7=\2\2\u0312\u0313\5j\66\2\u0313\u0314", + "\7>\2\2\u0314\u0315\7>\2\2\u0315i\3\2\2\2\u0316\u031b\5l\67\2\u0317", + "\u0318\7Z\2\2\u0318\u031a\5l\67\2\u0319\u0317\3\2\2\2\u031a\u031d\3", + "\2\2\2\u031b\u0319\3\2\2\2\u031b\u031c\3\2\2\2\u031c\u0320\3\2\2\2\u031d", + "\u031b\3\2\2\2\u031e\u0320\3\2\2\2\u031f\u0316\3\2\2\2\u031f\u031e\3", + "\2\2\2\u0320k\3\2\2\2\u0321\u0327\n\n\2\2\u0322\u0324\7=\2\2\u0323\u0325", + "\5\f\7\2\u0324\u0323\3\2\2\2\u0324\u0325\3\2\2\2\u0325\u0326\3\2\2\2", + "\u0326\u0328\7>\2\2\u0327\u0322\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u032b", + "\3\2\2\2\u0329\u032b\3\2\2\2\u032a\u0321\3\2\2\2\u032a\u0329\3\2\2\2", + "\u032bm\3\2\2\2\u032c\u0332\n\13\2\2\u032d\u032e\7=\2\2\u032e\u032f", + "\5n8\2\u032f\u0330\7>\2\2\u0330\u0332\3\2\2\2\u0331\u032c\3\2\2\2\u0331", + "\u032d\3\2\2\2\u0332\u0335\3\2\2\2\u0333\u0331\3\2\2\2\u0333\u0334\3", + "\2\2\2\u0334o\3\2\2\2\u0335\u0333\3\2\2\2\u0336\u0338\7M\2\2\u0337\u0339", + "\5r:\2\u0338\u0337\3\2\2\2\u0338\u0339\3\2\2\2\u0339\u0349\3\2\2\2\u033a", + "\u033c\7M\2\2\u033b\u033d\5r:\2\u033c\u033b\3\2\2\2\u033c\u033d\3\2", + "\2\2\u033d\u033e\3\2\2\2\u033e\u0349\5p9\2\u033f\u0341\7T\2\2\u0340", + "\u0342\5r:\2\u0341\u0340\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0349\3\2", + "\2\2\u0343\u0345\7T\2\2\u0344\u0346\5r:\2\u0345\u0344\3\2\2\2\u0345", + "\u0346\3\2\2\2\u0346\u0347\3\2\2\2\u0347\u0349\5p9\2\u0348\u0336\3\2", + "\2\2\u0348\u033a\3\2\2\2\u0348\u033f\3\2\2\2\u0348\u0343\3\2\2\2\u0349", + "q\3\2\2\2\u034a\u034b\b:\1\2\u034b\u034c\5\\/\2\u034c\u0351\3\2\2\2", + "\u034d\u034e\f\3\2\2\u034e\u0350\5\\/\2\u034f\u034d\3\2\2\2\u0350\u0353", + "\3\2\2\2\u0351\u034f\3\2\2\2\u0351\u0352\3\2\2\2\u0352s\3\2\2\2\u0353", + "\u0351\3\2\2\2\u0354\u035a\5v<\2\u0355\u0356\5v<\2\u0356\u0357\7Z\2", + "\2\u0357\u0358\7j\2\2\u0358\u035a\3\2\2\2\u0359\u0354\3\2\2\2\u0359", + "\u0355\3\2\2\2\u035au\3\2\2\2\u035b\u035c\b<\1\2\u035c\u035d\5x=\2\u035d", + "\u0363\3\2\2\2\u035e\u035f\f\3\2\2\u035f\u0360\7Z\2\2\u0360\u0362\5", + "x=\2\u0361\u035e\3\2\2\2\u0362\u0365\3\2\2\2\u0363\u0361\3\2\2\2\u0363", + "\u0364\3\2\2\2\u0364w\3\2\2\2\u0365\u0363\3\2\2\2\u0366\u0367\5\64\33", + "\2\u0367\u0368\5b\62\2\u0368\u036e\3\2\2\2\u0369\u036b\5\66\34\2\u036a", + "\u036c\5~@\2\u036b\u036a\3\2\2\2\u036b\u036c\3\2\2\2\u036c\u036e\3\2", + "\2\2\u036d\u0366\3\2\2\2\u036d\u0369\3\2\2\2\u036ey\3\2\2\2\u036f\u0370", + "\b>\1\2\u0370\u0371\7k\2\2\u0371\u0377\3\2\2\2\u0372\u0373\f\3\2\2\u0373", + "\u0374\7Z\2\2\u0374\u0376\7k\2\2\u0375\u0372\3\2\2\2\u0376\u0379\3\2", + "\2\2\u0377\u0375\3\2\2\2\u0377\u0378\3\2\2\2\u0378{\3\2\2\2\u0379\u0377", + "\3\2\2\2\u037a\u037c\5L\'\2\u037b\u037d\5~@\2\u037c\u037b\3\2\2\2\u037c", + "\u037d\3\2\2\2\u037d}\3\2\2\2\u037e\u038a\5p9\2\u037f\u0381\5p9\2\u0380", + "\u037f\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0386\5", + "\u0080A\2\u0383\u0385\5f\64\2\u0384\u0383\3\2\2\2\u0385\u0388\3\2\2", + "\2\u0386\u0384\3\2\2\2\u0386\u0387\3\2\2\2\u0387\u038a\3\2\2\2\u0388", + "\u0386\3\2\2\2\u0389\u037e\3\2\2\2\u0389\u0380\3\2\2\2\u038a\177\3\2", + "\2\2\u038b\u038c\bA\1\2\u038c\u038d\7=\2\2\u038d\u038e\5~@\2\u038e\u0392", + "\7>\2\2\u038f\u0391\5f\64\2\u0390\u038f\3\2\2\2\u0391\u0394\3\2\2\2", + "\u0392\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u03ba\3\2\2\2\u0394\u0392", + "\3\2\2\2\u0395\u0397\7?\2\2\u0396\u0398\5r:\2\u0397\u0396\3\2\2\2\u0397", + "\u0398\3\2\2\2\u0398\u039a\3\2\2\2\u0399\u039b\5*\26\2\u039a\u0399\3", + "\2\2\2\u039a\u039b\3\2\2\2\u039b\u039c\3\2\2\2\u039c\u03ba\7@\2\2\u039d", + "\u039e\7?\2\2\u039e\u03a0\7*\2\2\u039f\u03a1\5r:\2\u03a0\u039f\3\2\2", + "\2\u03a0\u03a1\3\2\2\2\u03a1\u03a2\3\2\2\2\u03a2\u03a3\5*\26\2\u03a3", + "\u03a4\7@\2\2\u03a4\u03ba\3\2\2\2\u03a5\u03a6\7?\2\2\u03a6\u03a7\5r", + ":\2\u03a7\u03a8\7*\2\2\u03a8\u03a9\5*\26\2\u03a9\u03aa\7@\2\2\u03aa", + "\u03ba\3\2\2\2\u03ab\u03ac\7?\2\2\u03ac\u03ad\7M\2\2\u03ad\u03ba\7@", + "\2\2\u03ae\u03b0\7=\2\2\u03af\u03b1\5t;\2\u03b0\u03af\3\2\2\2\u03b0", + "\u03b1\3\2\2\2\u03b1\u03b2\3\2\2\2\u03b2\u03b6\7>\2\2\u03b3\u03b5\5", + "f\64\2\u03b4\u03b3\3\2\2\2\u03b5\u03b8\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b6", + "\u03b7\3\2\2\2\u03b7\u03ba\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b9\u038b\3", + "\2\2\2\u03b9\u0395\3\2\2\2\u03b9\u039d\3\2\2\2\u03b9\u03a5\3\2\2\2\u03b9", + "\u03ab\3\2\2\2\u03b9\u03ae\3\2\2\2\u03ba\u03e6\3\2\2\2\u03bb\u03bc\f", + "\7\2\2\u03bc\u03be\7?\2\2\u03bd\u03bf\5r:\2\u03be\u03bd\3\2\2\2\u03be", + "\u03bf\3\2\2\2\u03bf\u03c1\3\2\2\2\u03c0\u03c2\5*\26\2\u03c1\u03c0\3", + "\2\2\2\u03c1\u03c2\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03e5\7@\2\2\u03c4", + "\u03c5\f\6\2\2\u03c5\u03c6\7?\2\2\u03c6\u03c8\7*\2\2\u03c7\u03c9\5r", + ":\2\u03c8\u03c7\3\2\2\2\u03c8\u03c9\3\2\2\2\u03c9\u03ca\3\2\2\2\u03ca", + "\u03cb\5*\26\2\u03cb\u03cc\7@\2\2\u03cc\u03e5\3\2\2\2\u03cd\u03ce\f", + "\5\2\2\u03ce\u03cf\7?\2\2\u03cf\u03d0\5r:\2\u03d0\u03d1\7*\2\2\u03d1", + "\u03d2\5*\26\2\u03d2\u03d3\7@\2\2\u03d3\u03e5\3\2\2\2\u03d4\u03d5\f", + "\4\2\2\u03d5\u03d6\7?\2\2\u03d6\u03d7\7M\2\2\u03d7\u03e5\7@\2\2\u03d8", + "\u03d9\f\3\2\2\u03d9\u03db\7=\2\2\u03da\u03dc\5t;\2\u03db\u03da\3\2", + "\2\2\u03db\u03dc\3\2\2\2\u03dc\u03dd\3\2\2\2\u03dd\u03e1\7>\2\2\u03de", + "\u03e0\5f\64\2\u03df\u03de\3\2\2\2\u03e0\u03e3\3\2\2\2\u03e1\u03df\3", + "\2\2\2\u03e1\u03e2\3\2\2\2\u03e2\u03e5\3\2\2\2\u03e3\u03e1\3\2\2\2\u03e4", + "\u03bb\3\2\2\2\u03e4\u03c4\3\2\2\2\u03e4\u03cd\3\2\2\2\u03e4\u03d4\3", + "\2\2\2\u03e4\u03d8\3\2\2\2\u03e5\u03e8\3\2\2\2\u03e6\u03e4\3\2\2\2\u03e6", + "\u03e7\3\2\2\2\u03e7\u0081\3\2\2\2\u03e8\u03e6\3\2\2\2\u03e9\u03ea\7", + "k\2\2\u03ea\u0083\3\2\2\2\u03eb\u03f6\5*\26\2\u03ec\u03ed\7A\2\2\u03ed", + "\u03ee\5\u0086D\2\u03ee\u03ef\7B\2\2\u03ef\u03f6\3\2\2\2\u03f0\u03f1", + "\7A\2\2\u03f1\u03f2\5\u0086D\2\u03f2\u03f3\7Z\2\2\u03f3\u03f4\7B\2\2", + "\u03f4\u03f6\3\2\2\2\u03f5\u03eb\3\2\2\2\u03f5\u03ec\3\2\2\2\u03f5\u03f0", + "\3\2\2\2\u03f6\u0085\3\2\2\2\u03f7\u03f9\bD\1\2\u03f8\u03fa\5\u0088", + "E\2\u03f9\u03f8\3\2\2\2\u03f9\u03fa\3\2\2\2\u03fa\u03fb\3\2\2\2\u03fb", + "\u03fc\5\u0084C\2\u03fc\u0405\3\2\2\2\u03fd\u03fe\f\3\2\2\u03fe\u0400", + "\7Z\2\2\u03ff\u0401\5\u0088E\2\u0400\u03ff\3\2\2\2\u0400\u0401\3\2\2", + "\2\u0401\u0402\3\2\2\2\u0402\u0404\5\u0084C\2\u0403\u03fd\3\2\2\2\u0404", + "\u0407\3\2\2\2\u0405\u0403\3\2\2\2\u0405\u0406\3\2\2\2\u0406\u0087\3", + "\2\2\2\u0407\u0405\3\2\2\2\u0408\u0409\5\u008aF\2\u0409\u040a\7[\2\2", + "\u040a\u0089\3\2\2\2\u040b\u040c\bF\1\2\u040c\u040d\5\u008cG\2\u040d", + "\u0412\3\2\2\2\u040e\u040f\f\3\2\2\u040f\u0411\5\u008cG\2\u0410\u040e", + "\3\2\2\2\u0411\u0414\3\2\2\2\u0412\u0410\3\2\2\2\u0412\u0413\3\2\2\2", + "\u0413\u008b\3\2\2\2\u0414\u0412\3\2\2\2\u0415\u0416\7?\2\2\u0416\u0417", + "\5\60\31\2\u0417\u0418\7@\2\2\u0418\u041c\3\2\2\2\u0419\u041a\7i\2\2", + "\u041a\u041c\7k\2\2\u041b\u0415\3\2\2\2\u041b\u0419\3\2\2\2\u041c\u008d", + "\3\2\2\2\u041d\u041e\7;\2\2\u041e\u041f\7=\2\2\u041f\u0420\5\60\31\2", + "\u0420\u0422\7Z\2\2\u0421\u0423\7m\2\2\u0422\u0421\3\2\2\2\u0423\u0424", + "\3\2\2\2\u0424\u0422\3\2\2\2\u0424\u0425\3\2\2\2\u0425\u0426\3\2\2\2", + "\u0426\u0427\7>\2\2\u0427\u0428\7Y\2\2\u0428\u008f\3\2\2\2\u0429\u044f", + "\5\u0092J\2\u042a\u044f\5\u0094K\2\u042b\u044f\5\u009aN\2\u042c\u044f", + "\5\u009cO\2\u042d\u044f\5\u009eP\2\u042e\u044f\5\u00a0Q\2\u042f\u0430", + "\t\f\2\2\u0430\u0431\t\r\2\2\u0431\u043a\7=\2\2\u0432\u0437\5&\24\2", + "\u0433\u0434\7Z\2\2\u0434\u0436\5&\24\2\u0435\u0433\3\2\2\2\u0436\u0439", + "\3\2\2\2\u0437\u0435\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u043b\3\2\2\2", + "\u0439\u0437\3\2\2\2\u043a\u0432\3\2\2\2\u043a\u043b\3\2\2\2\u043b\u0449", + "\3\2\2\2\u043c\u0445\7X\2\2\u043d\u0442\5&\24\2\u043e\u043f\7Z\2\2\u043f", + "\u0441\5&\24\2\u0440\u043e\3\2\2\2\u0441\u0444\3\2\2\2\u0442\u0440\3", + "\2\2\2\u0442\u0443\3\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3\2\2\2\u0445", + "\u043d\3\2\2\2\u0445\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u043c\3", + "\2\2\2\u0448\u044b\3\2\2\2\u0449\u0447\3\2\2\2\u0449\u044a\3\2\2\2\u044a", + "\u044c\3\2\2\2\u044b\u0449\3\2\2\2\u044c\u044d\7>\2\2\u044d\u044f\7", + "Y\2\2\u044e\u0429\3\2\2\2\u044e\u042a\3\2\2\2\u044e\u042b\3\2\2\2\u044e", + "\u042c\3\2\2\2\u044e\u042d\3\2\2\2\u044e\u042e\3\2\2\2\u044e\u042f\3", + "\2\2\2\u044f\u0091\3\2\2\2\u0450\u0451\7k\2\2\u0451\u0452\7X\2\2\u0452", + "\u045c\5\u0090I\2\u0453\u0454\7\23\2\2\u0454\u0455\5\60\31\2\u0455\u0456", + "\7X\2\2\u0456\u0457\5\u0090I\2\u0457\u045c\3\2\2\2\u0458\u0459\7\27", + "\2\2\u0459\u045a\7X\2\2\u045a\u045c\5\u0090I\2\u045b\u0450\3\2\2\2\u045b", + "\u0453\3\2\2\2\u045b\u0458\3\2\2\2\u045c\u0093\3\2\2\2\u045d\u045f\7", + "A\2\2\u045e\u0460\5\u0096L\2\u045f\u045e\3\2\2\2\u045f\u0460\3\2\2\2", + "\u0460\u0461\3\2\2\2\u0461\u0462\7B\2\2\u0462\u0095\3\2\2\2\u0463\u0464", + "\bL\1\2\u0464\u0465\5\u0098M\2\u0465\u046a\3\2\2\2\u0466\u0467\f\3\2", + "\2\u0467\u0469\5\u0098M\2\u0468\u0466\3\2\2\2\u0469\u046c\3\2\2\2\u046a", + "\u0468\3\2\2\2\u046a\u046b\3\2\2\2\u046b\u0097\3\2\2\2\u046c\u046a\3", + "\2\2\2\u046d\u0470\5\62\32\2\u046e\u0470\5\u0090I\2\u046f\u046d\3\2", + "\2\2\u046f\u046e\3\2\2\2\u0470\u0099\3\2\2\2\u0471\u0473\5.\30\2\u0472", + "\u0471\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0474\3\2\2\2\u0474\u0475\7", + "Y\2\2\u0475\u009b\3\2\2\2\u0476\u0477\7 \2\2\u0477\u0478\7=\2\2\u0478", + "\u0479\5.\30\2\u0479\u047a\7>\2\2\u047a\u047d\5\u0090I\2\u047b\u047c", + "\7\32\2\2\u047c\u047e\5\u0090I\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2", + "\2\2\u047e\u0486\3\2\2\2\u047f\u0480\7,\2\2\u0480\u0481\7=\2\2\u0481", + "\u0482\5.\30\2\u0482\u0483\7>\2\2\u0483\u0484\5\u0090I\2\u0484\u0486", + "\3\2\2\2\u0485\u0476\3\2\2\2\u0485\u047f\3\2\2\2\u0486\u009d\3\2\2\2", + "\u0487\u0488\7\62\2\2\u0488\u0489\7=\2\2\u0489\u048a\5.\30\2\u048a\u048b", + "\7>\2\2\u048b\u048c\5\u0090I\2\u048c\u04b2\3\2\2\2\u048d\u048e\7\30", + "\2\2\u048e\u048f\5\u0090I\2\u048f\u0490\7\62\2\2\u0490\u0491\7=\2\2", + "\u0491\u0492\5.\30\2\u0492\u0493\7>\2\2\u0493\u0494\7Y\2\2\u0494\u04b2", + "\3\2\2\2\u0495\u0496\7\36\2\2\u0496\u0498\7=\2\2\u0497\u0499\5.\30\2", + "\u0498\u0497\3\2\2\2\u0498\u0499\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049c", + "\7Y\2\2\u049b\u049d\5.\30\2\u049c\u049b\3\2\2\2\u049c\u049d\3\2\2\2", + "\u049d\u049e\3\2\2\2\u049e\u04a0\7Y\2\2\u049f\u04a1\5.\30\2\u04a0\u049f", + "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7>\2\2", + "\u04a3\u04b2\5\u0090I\2\u04a4\u04a5\7\36\2\2\u04a5\u04a6\7=\2\2\u04a6", + "\u04a8\5\62\32\2\u04a7\u04a9\5.\30\2\u04a8\u04a7\3\2\2\2\u04a8\u04a9", + "\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ac\7Y\2\2\u04ab\u04ad\5.\30\2", + "\u04ac\u04ab\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af", + "\7>\2\2\u04af\u04b0\5\u0090I\2\u04b0\u04b2\3\2\2\2\u04b1\u0487\3\2\2", + "\2\u04b1\u048d\3\2\2\2\u04b1\u0495\3\2\2\2\u04b1\u04a4\3\2\2\2\u04b2", + "\u009f\3\2\2\2\u04b3\u04b4\7\37\2\2\u04b4\u04b5\7k\2\2\u04b5\u04c4\7", + "Y\2\2\u04b6\u04b7\7\26\2\2\u04b7\u04c4\7Y\2\2\u04b8\u04b9\7\22\2\2\u04b9", + "\u04c4\7Y\2\2\u04ba\u04bc\7&\2\2\u04bb\u04bd\5.\30\2\u04bc\u04bb\3\2", + "\2\2\u04bc\u04bd\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04c4\7Y\2\2\u04bf", + "\u04c0\7\37\2\2\u04c0\u04c1\5\16\b\2\u04c1\u04c2\7Y\2\2\u04c2\u04c4", + "\3\2\2\2\u04c3\u04b3\3\2\2\2\u04c3\u04b6\3\2\2\2\u04c3\u04b8\3\2\2\2", + "\u04c3\u04ba\3\2\2\2\u04c3\u04bf\3\2\2\2\u04c4\u00a1\3\2\2\2\u04c5\u04c7", + "\5\u00a4S\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2", + "\2\2\u04c8\u04c9\7\2\2\3\u04c9\u00a3\3\2\2\2\u04ca\u04cb\bS\1\2\u04cb", + "\u04cc\5\u00a6T\2\u04cc\u04d1\3\2\2\2\u04cd\u04ce\f\3\2\2\u04ce\u04d0", + "\5\u00a6T\2\u04cf\u04cd\3\2\2\2\u04d0\u04d3\3\2\2\2\u04d1\u04cf\3\2", + "\2\2\u04d1\u04d2\3\2\2\2\u04d2\u00a5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d4", + "\u04d8\5\u00a8U\2\u04d5\u04d8\5\62\32\2\u04d6\u04d8\7Y\2\2\u04d7\u04d4", + "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d7\u04d6\3\2\2\2\u04d8\u00a7\3\2\2\2", + "\u04d9\u04db\5\64\33\2\u04da\u04d9\3\2\2\2\u04da\u04db\3\2\2\2\u04db", + "\u04dc\3\2\2\2\u04dc\u04de\5b\62\2\u04dd\u04df\5\u00aaV\2\u04de\u04dd", + "\3\2\2\2\u04de\u04df\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0\u04e1\5\u0094", + "K\2\u04e1\u00a9\3\2\2\2\u04e2\u04e3\bV\1\2\u04e3\u04e4\5\62\32\2\u04e4", + "\u04e9\3\2\2\2\u04e5\u04e6\f\3\2\2\u04e6\u04e8\5\62\32\2\u04e7\u04e5", + "\3\2\2\2\u04e8\u04eb\3\2\2\2\u04e9\u04e7\3\2\2\2\u04e9\u04ea\3\2\2\2", + "\u04ea\u00ab\3\2\2\2\u04eb\u04e9\3\2\2\2\u008c\u00b1\u00b9\u00cd\u00de", + "\u00e8\u010c\u0116\u0123\u0125\u0130\u0149\u0159\u0167\u0169\u0175\u0177", + "\u0183\u0185\u0197\u0199\u01a5\u01a7\u01b2\u01bd\u01c8\u01d3\u01de\u01e7", + "\u01ee\u01fa\u0201\u0206\u020b\u0210\u0217\u0221\u0229\u023b\u023f\u0246", + "\u0255\u025a\u025f\u0263\u0267\u0269\u0273\u0278\u027c\u0280\u0288\u0291", + "\u029b\u02a3\u02b4\u02c0\u02c3\u02c9\u02d2\u02d7\u02da\u02e1\u02f0\u02fc", + "\u02ff\u0301\u0309\u030d\u031b\u031f\u0324\u0327\u032a\u0331\u0333\u0338", + "\u033c\u0341\u0345\u0348\u0351\u0359\u0363\u036b\u036d\u0377\u037c\u0380", + "\u0386\u0389\u0392\u0397\u039a\u03a0\u03b0\u03b6\u03b9\u03be\u03c1\u03c8", + "\u03db\u03e1\u03e4\u03e6\u03f5\u03f9\u0400\u0405\u0412\u041b\u0424\u0437", + "\u043a\u0442\u0445\u0449\u044e\u045b\u045f\u046a\u046f\u0472\u047d\u0485", + "\u0498\u049c\u04a0\u04a8\u04ac\u04b1\u04bc\u04c3\u04c6\u04d1\u04d7\u04da", + "\u04de\u04e9"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -531,38 +510,37 @@ var sharedContextCache = new antlr4.PredictionContextCache(); var literalNames = [ 'null', "'__extension__'", "'__builtin_va_arg'", "'__builtin_offsetof'", "'__m128'", "'__m128d'", "'__m128i'", "'__typeof__'", "'__inline__'", "'__stdcall'", "'__declspec'", "'__asm'", - "'__attribute__'", "'__asm__'", "'__volatile__'", "'#'", - "'include'", "'define'", "'auto'", "'break'", "'case'", - "'char'", "'const'", "'continue'", "'default'", "'do'", - "'double'", "'else'", "'enum'", "'extern'", "'float'", - "'for'", "'goto'", "'if'", "'inline'", "'int'", "'long'", - "'register'", "'restrict'", "'return'", "'short'", - "'signed'", "'sizeof'", "'static'", "'struct'", "'switch'", - "'typedef'", "'union'", "'unsigned'", "'void'", "'volatile'", - "'while'", "'_Alignas'", "'_Alignof'", "'_Atomic'", - "'_Bool'", "'_Complex'", "'_Generic'", "'_Imaginary'", - "'_Noreturn'", "'_Static_assert'", "'_Thread_local'", - "'('", "')'", "'['", "']'", "'{'", "'}'", "'<'", "'<='", - "'>'", "'>='", "'<<'", "'>>'", "'+'", "'++'", "'-'", - "'--'", "'*'", "'/'", "'%'", "'&'", "'|'", "'&&'", - "'||'", "'^'", "'!'", "'~'", "'?'", "':'", "';'", "','", - "'='", "'*='", "'/='", "'%='", "'+='", "'-='", "'<<='", - "'>>='", "'&='", "'^='", "'|='", "'=='", "'!='", "'->'", - "'.'", "'...'" ]; + "'__attribute__'", "'__asm__'", "'__volatile__'", "'auto'", + "'break'", "'case'", "'char'", "'const'", "'continue'", + "'default'", "'do'", "'double'", "'else'", "'enum'", + "'extern'", "'float'", "'for'", "'goto'", "'if'", "'inline'", + "'int'", "'long'", "'register'", "'restrict'", "'return'", + "'short'", "'signed'", "'sizeof'", "'static'", "'struct'", + "'switch'", "'typedef'", "'union'", "'unsigned'", "'void'", + "'volatile'", "'while'", "'_Alignas'", "'_Alignof'", + "'_Atomic'", "'_Bool'", "'_Complex'", "'_Generic'", + "'_Imaginary'", "'_Noreturn'", "'_Static_assert'", + "'_Thread_local'", "'('", "')'", "'['", "']'", "'{'", + "'}'", "'<'", "'<='", "'>'", "'>='", "'<<'", "'>>'", + "'+'", "'++'", "'-'", "'--'", "'*'", "'/'", "'%'", + "'&'", "'|'", "'&&'", "'||'", "'^'", "'!'", "'~'", + "'?'", "':'", "';'", "','", "'='", "'*='", "'/='", + "'%='", "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", + "'|='", "'=='", "'!='", "'->'", "'.'", "'...'" ]; var symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', - 'null', 'null', 'null', 'null', "Auto", "Break", "Case", - "Char", "Const", "Continue", "Default", "Do", "Double", - "Else", "Enum", "Extern", "Float", "For", "Goto", - "If", "Inline", "Int", "Long", "Register", "Restrict", - "Return", "Short", "Signed", "Sizeof", "Static", "Struct", - "Switch", "Typedef", "Union", "Unsigned", "Void", - "Volatile", "While", "Alignas", "Alignof", "Atomic", - "Bool", "Complex", "Generic", "Imaginary", "Noreturn", - "StaticAssert", "ThreadLocal", "LeftParen", "RightParen", - "LeftBracket", "RightBracket", "LeftBrace", "RightBrace", - "Less", "LessEqual", "Greater", "GreaterEqual", "LeftShift", + 'null', "Auto", "Break", "Case", "Char", "Const", + "Continue", "Default", "Do", "Double", "Else", "Enum", + "Extern", "Float", "For", "Goto", "If", "Inline", + "Int", "Long", "Register", "Restrict", "Return", "Short", + "Signed", "Sizeof", "Static", "Struct", "Switch", + "Typedef", "Union", "Unsigned", "Void", "Volatile", + "While", "Alignas", "Alignof", "Atomic", "Bool", "Complex", + "Generic", "Imaginary", "Noreturn", "StaticAssert", + "ThreadLocal", "LeftParen", "RightParen", "LeftBracket", + "RightBracket", "LeftBrace", "RightBrace", "Less", + "LessEqual", "Greater", "GreaterEqual", "LeftShift", "RightShift", "Plus", "PlusPlus", "Minus", "MinusMinus", "Star", "Div", "Mod", "And", "Or", "AndAnd", "OrOr", "Caret", "Not", "Tilde", "Question", "Colon", "Semi", @@ -570,9 +548,8 @@ var symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', 'null', "PlusAssign", "MinusAssign", "LeftShiftAssign", "RightShiftAssign", "AndAssign", "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", "Constant", - "StringLiteral", "SharedIncludeLiteral", "LineDirective", - "PragmaDirective", "Whitespace", "Newline", "BlockComment", - "LineComment" ]; + "StringLiteral", "SharedIncludeLiteral", "Directive", + "Whitespace", "Newline", "BlockComment", "LineComment" ]; var ruleNames = [ "primaryExpression", "genericSelection", "genericAssocList", "genericAssociation", "postfixExpression", "argumentExpressionList", @@ -600,10 +577,8 @@ var ruleNames = [ "primaryExpression", "genericSelection", "genericAssocList", "statement", "labeledStatement", "compoundStatement", "blockItemList", "blockItem", "expressionStatement", "selectionStatement", "iterationStatement", "jumpStatement", - "compilationUnit", "translationUnit", "includeDirective", - "defineDirective", "defineDirectiveNoVal", "defineDirectiveNoParams", - "defineDirectiveWithParams", "macroResult", "macroParamList", - "externalDeclaration", "functionDefinition", "declarationList" ]; + "compilationUnit", "translationUnit", "externalDeclaration", + "functionDefinition", "declarationList" ]; function CParser (input) { antlr4.Parser.call(this, input); @@ -638,109 +613,105 @@ CParser.T__10 = 11; CParser.T__11 = 12; CParser.T__12 = 13; CParser.T__13 = 14; -CParser.T__14 = 15; -CParser.T__15 = 16; -CParser.T__16 = 17; -CParser.Auto = 18; -CParser.Break = 19; -CParser.Case = 20; -CParser.Char = 21; -CParser.Const = 22; -CParser.Continue = 23; -CParser.Default = 24; -CParser.Do = 25; -CParser.Double = 26; -CParser.Else = 27; -CParser.Enum = 28; -CParser.Extern = 29; -CParser.Float = 30; -CParser.For = 31; -CParser.Goto = 32; -CParser.If = 33; -CParser.Inline = 34; -CParser.Int = 35; -CParser.Long = 36; -CParser.Register = 37; -CParser.Restrict = 38; -CParser.Return = 39; -CParser.Short = 40; -CParser.Signed = 41; -CParser.Sizeof = 42; -CParser.Static = 43; -CParser.Struct = 44; -CParser.Switch = 45; -CParser.Typedef = 46; -CParser.Union = 47; -CParser.Unsigned = 48; -CParser.Void = 49; -CParser.Volatile = 50; -CParser.While = 51; -CParser.Alignas = 52; -CParser.Alignof = 53; -CParser.Atomic = 54; -CParser.Bool = 55; -CParser.Complex = 56; -CParser.Generic = 57; -CParser.Imaginary = 58; -CParser.Noreturn = 59; -CParser.StaticAssert = 60; -CParser.ThreadLocal = 61; -CParser.LeftParen = 62; -CParser.RightParen = 63; -CParser.LeftBracket = 64; -CParser.RightBracket = 65; -CParser.LeftBrace = 66; -CParser.RightBrace = 67; -CParser.Less = 68; -CParser.LessEqual = 69; -CParser.Greater = 70; -CParser.GreaterEqual = 71; -CParser.LeftShift = 72; -CParser.RightShift = 73; -CParser.Plus = 74; -CParser.PlusPlus = 75; -CParser.Minus = 76; -CParser.MinusMinus = 77; -CParser.Star = 78; -CParser.Div = 79; -CParser.Mod = 80; -CParser.And = 81; -CParser.Or = 82; -CParser.AndAnd = 83; -CParser.OrOr = 84; -CParser.Caret = 85; -CParser.Not = 86; -CParser.Tilde = 87; -CParser.Question = 88; -CParser.Colon = 89; -CParser.Semi = 90; -CParser.Comma = 91; -CParser.Assign = 92; -CParser.StarAssign = 93; -CParser.DivAssign = 94; -CParser.ModAssign = 95; -CParser.PlusAssign = 96; -CParser.MinusAssign = 97; -CParser.LeftShiftAssign = 98; -CParser.RightShiftAssign = 99; -CParser.AndAssign = 100; -CParser.XorAssign = 101; -CParser.OrAssign = 102; -CParser.Equal = 103; -CParser.NotEqual = 104; -CParser.Arrow = 105; -CParser.Dot = 106; -CParser.Ellipsis = 107; -CParser.Identifier = 108; -CParser.Constant = 109; -CParser.StringLiteral = 110; -CParser.SharedIncludeLiteral = 111; -CParser.LineDirective = 112; -CParser.PragmaDirective = 113; -CParser.Whitespace = 114; -CParser.Newline = 115; -CParser.BlockComment = 116; -CParser.LineComment = 117; +CParser.Auto = 15; +CParser.Break = 16; +CParser.Case = 17; +CParser.Char = 18; +CParser.Const = 19; +CParser.Continue = 20; +CParser.Default = 21; +CParser.Do = 22; +CParser.Double = 23; +CParser.Else = 24; +CParser.Enum = 25; +CParser.Extern = 26; +CParser.Float = 27; +CParser.For = 28; +CParser.Goto = 29; +CParser.If = 30; +CParser.Inline = 31; +CParser.Int = 32; +CParser.Long = 33; +CParser.Register = 34; +CParser.Restrict = 35; +CParser.Return = 36; +CParser.Short = 37; +CParser.Signed = 38; +CParser.Sizeof = 39; +CParser.Static = 40; +CParser.Struct = 41; +CParser.Switch = 42; +CParser.Typedef = 43; +CParser.Union = 44; +CParser.Unsigned = 45; +CParser.Void = 46; +CParser.Volatile = 47; +CParser.While = 48; +CParser.Alignas = 49; +CParser.Alignof = 50; +CParser.Atomic = 51; +CParser.Bool = 52; +CParser.Complex = 53; +CParser.Generic = 54; +CParser.Imaginary = 55; +CParser.Noreturn = 56; +CParser.StaticAssert = 57; +CParser.ThreadLocal = 58; +CParser.LeftParen = 59; +CParser.RightParen = 60; +CParser.LeftBracket = 61; +CParser.RightBracket = 62; +CParser.LeftBrace = 63; +CParser.RightBrace = 64; +CParser.Less = 65; +CParser.LessEqual = 66; +CParser.Greater = 67; +CParser.GreaterEqual = 68; +CParser.LeftShift = 69; +CParser.RightShift = 70; +CParser.Plus = 71; +CParser.PlusPlus = 72; +CParser.Minus = 73; +CParser.MinusMinus = 74; +CParser.Star = 75; +CParser.Div = 76; +CParser.Mod = 77; +CParser.And = 78; +CParser.Or = 79; +CParser.AndAnd = 80; +CParser.OrOr = 81; +CParser.Caret = 82; +CParser.Not = 83; +CParser.Tilde = 84; +CParser.Question = 85; +CParser.Colon = 86; +CParser.Semi = 87; +CParser.Comma = 88; +CParser.Assign = 89; +CParser.StarAssign = 90; +CParser.DivAssign = 91; +CParser.ModAssign = 92; +CParser.PlusAssign = 93; +CParser.MinusAssign = 94; +CParser.LeftShiftAssign = 95; +CParser.RightShiftAssign = 96; +CParser.AndAssign = 97; +CParser.XorAssign = 98; +CParser.OrAssign = 99; +CParser.Equal = 100; +CParser.NotEqual = 101; +CParser.Arrow = 102; +CParser.Dot = 103; +CParser.Ellipsis = 104; +CParser.Identifier = 105; +CParser.Constant = 106; +CParser.StringLiteral = 107; +CParser.SharedIncludeLiteral = 108; +CParser.Directive = 109; +CParser.Whitespace = 110; +CParser.Newline = 111; +CParser.BlockComment = 112; +CParser.LineComment = 113; CParser.RULE_primaryExpression = 0; CParser.RULE_genericSelection = 1; @@ -824,16 +795,9 @@ CParser.RULE_iterationStatement = 78; CParser.RULE_jumpStatement = 79; CParser.RULE_compilationUnit = 80; CParser.RULE_translationUnit = 81; -CParser.RULE_includeDirective = 82; -CParser.RULE_defineDirective = 83; -CParser.RULE_defineDirectiveNoVal = 84; -CParser.RULE_defineDirectiveNoParams = 85; -CParser.RULE_defineDirectiveWithParams = 86; -CParser.RULE_macroResult = 87; -CParser.RULE_macroParamList = 88; -CParser.RULE_externalDeclaration = 89; -CParser.RULE_functionDefinition = 90; -CParser.RULE_declarationList = 91; +CParser.RULE_externalDeclaration = 82; +CParser.RULE_functionDefinition = 83; +CParser.RULE_declarationList = 84; function PrimaryExpressionContext(parser, parent, invokingState) { if(parent===undefined) { @@ -914,36 +878,36 @@ CParser.prototype.primaryExpression = function() { this.enterRule(localctx, 0, CParser.RULE_primaryExpression); var _la = 0; // Token type try { - this.state = 217; + this.state = 203; var la_ = this._interp.adaptivePredict(this._input,2,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 184; + this.state = 170; this.match(CParser.Identifier); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 185; + this.state = 171; this.match(CParser.Constant); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 187; + this.state = 173; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 186; + this.state = 172; this.match(CParser.StringLiteral); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 189; + this.state = 175; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,0, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -951,66 +915,66 @@ CParser.prototype.primaryExpression = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 191; + this.state = 177; this.match(CParser.LeftParen); - this.state = 192; + this.state = 178; this.expression(0); - this.state = 193; + this.state = 179; this.match(CParser.RightParen); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 195; + this.state = 181; this.genericSelection(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 197; + this.state = 183; _la = this._input.LA(1); if(_la===CParser.T__0) { - this.state = 196; + this.state = 182; this.match(CParser.T__0); } - this.state = 199; + this.state = 185; this.match(CParser.LeftParen); - this.state = 200; + this.state = 186; this.compoundStatement(); - this.state = 201; + this.state = 187; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 203; + this.state = 189; this.match(CParser.T__1); - this.state = 204; + this.state = 190; this.match(CParser.LeftParen); - this.state = 205; + this.state = 191; this.unaryExpression(); - this.state = 206; + this.state = 192; this.match(CParser.Comma); - this.state = 207; + this.state = 193; this.typeName(); - this.state = 208; + this.state = 194; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 210; + this.state = 196; this.match(CParser.T__2); - this.state = 211; + this.state = 197; this.match(CParser.LeftParen); - this.state = 212; + this.state = 198; this.typeName(); - this.state = 213; + this.state = 199; this.match(CParser.Comma); - this.state = 214; + this.state = 200; this.unaryExpression(); - this.state = 215; + this.state = 201; this.match(CParser.RightParen); break; @@ -1076,17 +1040,17 @@ CParser.prototype.genericSelection = function() { this.enterRule(localctx, 2, CParser.RULE_genericSelection); try { this.enterOuterAlt(localctx, 1); - this.state = 219; + this.state = 205; this.match(CParser.Generic); - this.state = 220; + this.state = 206; this.match(CParser.LeftParen); - this.state = 221; + this.state = 207; this.assignmentExpression(); - this.state = 222; + this.state = 208; this.match(CParser.Comma); - this.state = 223; + this.state = 209; this.genericAssocList(0); - this.state = 224; + this.state = 210; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -1152,10 +1116,10 @@ CParser.prototype.genericAssocList = function(_p) { this.enterRecursionRule(localctx, 4, CParser.RULE_genericAssocList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 227; + this.state = 213; this.genericAssociation(); this._ctx.stop = this._input.LT(-1); - this.state = 234; + this.state = 220; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,3,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1166,16 +1130,16 @@ CParser.prototype.genericAssocList = function(_p) { _prevctx = localctx; localctx = new GenericAssocListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_genericAssocList); - this.state = 229; + this.state = 215; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 230; + this.state = 216; this.match(CParser.Comma); - this.state = 231; + this.state = 217; this.genericAssociation(); } - this.state = 236; + this.state = 222; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,3,this._ctx); } @@ -1240,7 +1204,7 @@ CParser.prototype.genericAssociation = function() { var localctx = new GenericAssociationContext(this, this._ctx, this.state); this.enterRule(localctx, 6, CParser.RULE_genericAssociation); try { - this.state = 244; + this.state = 230; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -1267,20 +1231,20 @@ CParser.prototype.genericAssociation = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 237; + this.state = 223; this.typeName(); - this.state = 238; + this.state = 224; this.match(CParser.Colon); - this.state = 239; + this.state = 225; this.assignmentExpression(); break; case CParser.Default: this.enterOuterAlt(localctx, 2); - this.state = 241; + this.state = 227; this.match(CParser.Default); - this.state = 242; + this.state = 228; this.match(CParser.Colon); - this.state = 243; + this.state = 229; this.assignmentExpression(); break; default: @@ -1371,85 +1335,85 @@ CParser.prototype.postfixExpression = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 280; + this.state = 266; var la_ = this._interp.adaptivePredict(this._input,5,this._ctx); switch(la_) { case 1: - this.state = 247; + this.state = 233; this.primaryExpression(); break; case 2: - this.state = 248; + this.state = 234; this.match(CParser.LeftParen); - this.state = 249; + this.state = 235; this.typeName(); - this.state = 250; + this.state = 236; this.match(CParser.RightParen); - this.state = 251; + this.state = 237; this.match(CParser.LeftBrace); - this.state = 252; + this.state = 238; this.initializerList(0); - this.state = 253; + this.state = 239; this.match(CParser.RightBrace); break; case 3: - this.state = 255; + this.state = 241; this.match(CParser.LeftParen); - this.state = 256; + this.state = 242; this.typeName(); - this.state = 257; + this.state = 243; this.match(CParser.RightParen); - this.state = 258; + this.state = 244; this.match(CParser.LeftBrace); - this.state = 259; + this.state = 245; this.initializerList(0); - this.state = 260; + this.state = 246; this.match(CParser.Comma); - this.state = 261; + this.state = 247; this.match(CParser.RightBrace); break; case 4: - this.state = 263; + this.state = 249; this.match(CParser.T__0); - this.state = 264; + this.state = 250; this.match(CParser.LeftParen); - this.state = 265; + this.state = 251; this.typeName(); - this.state = 266; + this.state = 252; this.match(CParser.RightParen); - this.state = 267; + this.state = 253; this.match(CParser.LeftBrace); - this.state = 268; + this.state = 254; this.initializerList(0); - this.state = 269; + this.state = 255; this.match(CParser.RightBrace); break; case 5: - this.state = 271; + this.state = 257; this.match(CParser.T__0); - this.state = 272; + this.state = 258; this.match(CParser.LeftParen); - this.state = 273; + this.state = 259; this.typeName(); - this.state = 274; + this.state = 260; this.match(CParser.RightParen); - this.state = 275; + this.state = 261; this.match(CParser.LeftBrace); - this.state = 276; + this.state = 262; this.initializerList(0); - this.state = 277; + this.state = 263; this.match(CParser.Comma); - this.state = 278; + this.state = 264; this.match(CParser.RightBrace); break; } this._ctx.stop = this._input.LT(-1); - this.state = 305; + this.state = 291; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,8,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1458,95 +1422,95 @@ CParser.prototype.postfixExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 303; + this.state = 289; var la_ = this._interp.adaptivePredict(this._input,7,this._ctx); switch(la_) { case 1: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 282; + this.state = 268; if (!( this.precpred(this._ctx, 10))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 10)"); } - this.state = 283; + this.state = 269; this.match(CParser.LeftBracket); - this.state = 284; + this.state = 270; this.expression(0); - this.state = 285; + this.state = 271; this.match(CParser.RightBracket); break; case 2: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 287; + this.state = 273; if (!( this.precpred(this._ctx, 9))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 9)"); } - this.state = 288; + this.state = 274; this.match(CParser.LeftParen); - this.state = 290; + this.state = 276; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 289; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 275; this.argumentExpressionList(0); } - this.state = 292; + this.state = 278; this.match(CParser.RightParen); break; case 3: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 293; + this.state = 279; if (!( this.precpred(this._ctx, 8))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)"); } - this.state = 294; + this.state = 280; this.match(CParser.Dot); - this.state = 295; + this.state = 281; this.match(CParser.Identifier); break; case 4: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 296; + this.state = 282; if (!( this.precpred(this._ctx, 7))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)"); } - this.state = 297; + this.state = 283; this.match(CParser.Arrow); - this.state = 298; + this.state = 284; this.match(CParser.Identifier); break; case 5: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 299; + this.state = 285; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 300; + this.state = 286; this.match(CParser.PlusPlus); break; case 6: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 301; + this.state = 287; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 302; + this.state = 288; this.match(CParser.MinusMinus); break; } } - this.state = 307; + this.state = 293; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,8,this._ctx); } @@ -1615,10 +1579,10 @@ CParser.prototype.argumentExpressionList = function(_p) { this.enterRecursionRule(localctx, 10, CParser.RULE_argumentExpressionList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 309; + this.state = 295; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 316; + this.state = 302; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,9,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1629,16 +1593,16 @@ CParser.prototype.argumentExpressionList = function(_p) { _prevctx = localctx; localctx = new ArgumentExpressionListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_argumentExpressionList); - this.state = 311; + this.state = 297; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 312; + this.state = 298; this.match(CParser.Comma); - this.state = 313; + this.state = 299; this.assignmentExpression(); } - this.state = 318; + this.state = 304; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,9,this._ctx); } @@ -1719,76 +1683,76 @@ CParser.prototype.unaryExpression = function() { var localctx = new UnaryExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 12, CParser.RULE_unaryExpression); try { - this.state = 341; + this.state = 327; var la_ = this._interp.adaptivePredict(this._input,10,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 319; + this.state = 305; this.postfixExpression(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 320; + this.state = 306; this.match(CParser.PlusPlus); - this.state = 321; + this.state = 307; this.unaryExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 322; + this.state = 308; this.match(CParser.MinusMinus); - this.state = 323; + this.state = 309; this.unaryExpression(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 324; + this.state = 310; this.unaryOperator(); - this.state = 325; + this.state = 311; this.castExpression(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 327; + this.state = 313; this.match(CParser.Sizeof); - this.state = 328; + this.state = 314; this.unaryExpression(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 329; + this.state = 315; this.match(CParser.Sizeof); - this.state = 330; + this.state = 316; this.match(CParser.LeftParen); - this.state = 331; + this.state = 317; this.typeName(); - this.state = 332; + this.state = 318; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 334; + this.state = 320; this.match(CParser.Alignof); - this.state = 335; + this.state = 321; this.match(CParser.LeftParen); - this.state = 336; + this.state = 322; this.typeName(); - this.state = 337; + this.state = 323; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 339; + this.state = 325; this.match(CParser.AndAnd); - this.state = 340; + this.state = 326; this.match(CParser.Identifier); break; @@ -1848,9 +1812,9 @@ CParser.prototype.unaryOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 343; + this.state = 329; _la = this._input.LA(1); - if(!(((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0))) { + if(!(((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -1920,38 +1884,38 @@ CParser.prototype.castExpression = function() { var localctx = new CastExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 16, CParser.RULE_castExpression); try { - this.state = 357; + this.state = 343; var la_ = this._interp.adaptivePredict(this._input,11,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 345; + this.state = 331; this.unaryExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 346; + this.state = 332; this.match(CParser.LeftParen); - this.state = 347; + this.state = 333; this.typeName(); - this.state = 348; + this.state = 334; this.match(CParser.RightParen); - this.state = 349; + this.state = 335; this.castExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 351; + this.state = 337; this.match(CParser.T__0); - this.state = 352; + this.state = 338; this.match(CParser.LeftParen); - this.state = 353; + this.state = 339; this.typeName(); - this.state = 354; + this.state = 340; this.match(CParser.RightParen); - this.state = 355; + this.state = 341; this.castExpression(); break; @@ -2020,10 +1984,10 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.enterRecursionRule(localctx, 18, CParser.RULE_multiplicativeExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 360; + this.state = 346; this.castExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 373; + this.state = 359; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,13,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2032,51 +1996,51 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 371; + this.state = 357; var la_ = this._interp.adaptivePredict(this._input,12,this._ctx); switch(la_) { case 1: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 362; + this.state = 348; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 363; + this.state = 349; this.match(CParser.Star); - this.state = 364; + this.state = 350; this.castExpression(); break; case 2: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 365; + this.state = 351; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 366; + this.state = 352; this.match(CParser.Div); - this.state = 367; + this.state = 353; this.castExpression(); break; case 3: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 368; + this.state = 354; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 369; + this.state = 355; this.match(CParser.Mod); - this.state = 370; + this.state = 356; this.castExpression(); break; } } - this.state = 375; + this.state = 361; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,13,this._ctx); } @@ -2145,10 +2109,10 @@ CParser.prototype.additiveExpression = function(_p) { this.enterRecursionRule(localctx, 20, CParser.RULE_additiveExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 377; + this.state = 363; this.multiplicativeExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 387; + this.state = 373; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,15,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2157,38 +2121,38 @@ CParser.prototype.additiveExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 385; + this.state = 371; var la_ = this._interp.adaptivePredict(this._input,14,this._ctx); switch(la_) { case 1: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 379; + this.state = 365; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 380; + this.state = 366; this.match(CParser.Plus); - this.state = 381; + this.state = 367; this.multiplicativeExpression(0); break; case 2: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 382; + this.state = 368; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 383; + this.state = 369; this.match(CParser.Minus); - this.state = 384; + this.state = 370; this.multiplicativeExpression(0); break; } } - this.state = 389; + this.state = 375; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,15,this._ctx); } @@ -2257,10 +2221,10 @@ CParser.prototype.shiftExpression = function(_p) { this.enterRecursionRule(localctx, 22, CParser.RULE_shiftExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 391; + this.state = 377; this.additiveExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 401; + this.state = 387; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,17,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2269,38 +2233,38 @@ CParser.prototype.shiftExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 399; + this.state = 385; var la_ = this._interp.adaptivePredict(this._input,16,this._ctx); switch(la_) { case 1: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 393; + this.state = 379; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 394; + this.state = 380; this.match(CParser.LeftShift); - this.state = 395; + this.state = 381; this.additiveExpression(0); break; case 2: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 396; + this.state = 382; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 397; + this.state = 383; this.match(CParser.RightShift); - this.state = 398; + this.state = 384; this.additiveExpression(0); break; } } - this.state = 403; + this.state = 389; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,17,this._ctx); } @@ -2369,10 +2333,10 @@ CParser.prototype.relationalExpression = function(_p) { this.enterRecursionRule(localctx, 24, CParser.RULE_relationalExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 405; + this.state = 391; this.shiftExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 421; + this.state = 407; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,19,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2381,64 +2345,64 @@ CParser.prototype.relationalExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 419; + this.state = 405; var la_ = this._interp.adaptivePredict(this._input,18,this._ctx); switch(la_) { case 1: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 407; + this.state = 393; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 408; + this.state = 394; this.match(CParser.Less); - this.state = 409; + this.state = 395; this.shiftExpression(0); break; case 2: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 410; + this.state = 396; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 411; + this.state = 397; this.match(CParser.Greater); - this.state = 412; + this.state = 398; this.shiftExpression(0); break; case 3: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 413; + this.state = 399; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 414; + this.state = 400; this.match(CParser.LessEqual); - this.state = 415; + this.state = 401; this.shiftExpression(0); break; case 4: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 416; + this.state = 402; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 417; + this.state = 403; this.match(CParser.GreaterEqual); - this.state = 418; + this.state = 404; this.shiftExpression(0); break; } } - this.state = 423; + this.state = 409; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,19,this._ctx); } @@ -2507,10 +2471,10 @@ CParser.prototype.equalityExpression = function(_p) { this.enterRecursionRule(localctx, 26, CParser.RULE_equalityExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 425; + this.state = 411; this.relationalExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 435; + this.state = 421; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,21,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2519,38 +2483,38 @@ CParser.prototype.equalityExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 433; + this.state = 419; var la_ = this._interp.adaptivePredict(this._input,20,this._ctx); switch(la_) { case 1: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 427; + this.state = 413; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 428; + this.state = 414; this.match(CParser.Equal); - this.state = 429; + this.state = 415; this.relationalExpression(0); break; case 2: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 430; + this.state = 416; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 431; + this.state = 417; this.match(CParser.NotEqual); - this.state = 432; + this.state = 418; this.relationalExpression(0); break; } } - this.state = 437; + this.state = 423; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,21,this._ctx); } @@ -2619,10 +2583,10 @@ CParser.prototype.andExpression = function(_p) { this.enterRecursionRule(localctx, 28, CParser.RULE_andExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 439; + this.state = 425; this.equalityExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 446; + this.state = 432; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,22,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2633,16 +2597,16 @@ CParser.prototype.andExpression = function(_p) { _prevctx = localctx; localctx = new AndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_andExpression); - this.state = 441; + this.state = 427; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 442; + this.state = 428; this.match(CParser.And); - this.state = 443; + this.state = 429; this.equalityExpression(0); } - this.state = 448; + this.state = 434; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,22,this._ctx); } @@ -2711,10 +2675,10 @@ CParser.prototype.exclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 30, CParser.RULE_exclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 450; + this.state = 436; this.andExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 457; + this.state = 443; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,23,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2725,16 +2689,16 @@ CParser.prototype.exclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new ExclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_exclusiveOrExpression); - this.state = 452; + this.state = 438; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 453; + this.state = 439; this.match(CParser.Caret); - this.state = 454; + this.state = 440; this.andExpression(0); } - this.state = 459; + this.state = 445; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,23,this._ctx); } @@ -2803,10 +2767,10 @@ CParser.prototype.inclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 32, CParser.RULE_inclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 461; + this.state = 447; this.exclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 468; + this.state = 454; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,24,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2817,16 +2781,16 @@ CParser.prototype.inclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new InclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_inclusiveOrExpression); - this.state = 463; + this.state = 449; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 464; + this.state = 450; this.match(CParser.Or); - this.state = 465; + this.state = 451; this.exclusiveOrExpression(0); } - this.state = 470; + this.state = 456; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,24,this._ctx); } @@ -2895,10 +2859,10 @@ CParser.prototype.logicalAndExpression = function(_p) { this.enterRecursionRule(localctx, 34, CParser.RULE_logicalAndExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 472; + this.state = 458; this.inclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 479; + this.state = 465; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,25,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2909,16 +2873,16 @@ CParser.prototype.logicalAndExpression = function(_p) { _prevctx = localctx; localctx = new LogicalAndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalAndExpression); - this.state = 474; + this.state = 460; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 475; + this.state = 461; this.match(CParser.AndAnd); - this.state = 476; + this.state = 462; this.inclusiveOrExpression(0); } - this.state = 481; + this.state = 467; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,25,this._ctx); } @@ -2987,10 +2951,10 @@ CParser.prototype.logicalOrExpression = function(_p) { this.enterRecursionRule(localctx, 36, CParser.RULE_logicalOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 483; + this.state = 469; this.logicalAndExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 490; + this.state = 476; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,26,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3001,16 +2965,16 @@ CParser.prototype.logicalOrExpression = function(_p) { _prevctx = localctx; localctx = new LogicalOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalOrExpression); - this.state = 485; + this.state = 471; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 486; + this.state = 472; this.match(CParser.OrOr); - this.state = 487; + this.state = 473; this.logicalAndExpression(0); } - this.state = 492; + this.state = 478; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,26,this._ctx); } @@ -3080,18 +3044,18 @@ CParser.prototype.conditionalExpression = function() { this.enterRule(localctx, 38, CParser.RULE_conditionalExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 493; + this.state = 479; this.logicalOrExpression(0); - this.state = 499; + this.state = 485; var la_ = this._interp.adaptivePredict(this._input,27,this._ctx); if(la_===1) { - this.state = 494; + this.state = 480; this.match(CParser.Question); - this.state = 495; + this.state = 481; this.expression(0); - this.state = 496; + this.state = 482; this.match(CParser.Colon); - this.state = 497; + this.state = 483; this.conditionalExpression(); } @@ -3163,22 +3127,22 @@ CParser.prototype.assignmentExpression = function() { var localctx = new AssignmentExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 40, CParser.RULE_assignmentExpression); try { - this.state = 506; + this.state = 492; var la_ = this._interp.adaptivePredict(this._input,28,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 501; + this.state = 487; this.conditionalExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 502; + this.state = 488; this.unaryExpression(); - this.state = 503; + this.state = 489; this.assignmentOperator(); - this.state = 504; + this.state = 490; this.assignmentExpression(); break; @@ -3238,9 +3202,9 @@ CParser.prototype.assignmentOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 508; + this.state = 494; _la = this._input.LA(1); - if(!(((((_la - 92)) & ~0x1f) == 0 && ((1 << (_la - 92)) & ((1 << (CParser.Assign - 92)) | (1 << (CParser.StarAssign - 92)) | (1 << (CParser.DivAssign - 92)) | (1 << (CParser.ModAssign - 92)) | (1 << (CParser.PlusAssign - 92)) | (1 << (CParser.MinusAssign - 92)) | (1 << (CParser.LeftShiftAssign - 92)) | (1 << (CParser.RightShiftAssign - 92)) | (1 << (CParser.AndAssign - 92)) | (1 << (CParser.XorAssign - 92)) | (1 << (CParser.OrAssign - 92)))) !== 0))) { + if(!(((((_la - 89)) & ~0x1f) == 0 && ((1 << (_la - 89)) & ((1 << (CParser.Assign - 89)) | (1 << (CParser.StarAssign - 89)) | (1 << (CParser.DivAssign - 89)) | (1 << (CParser.ModAssign - 89)) | (1 << (CParser.PlusAssign - 89)) | (1 << (CParser.MinusAssign - 89)) | (1 << (CParser.LeftShiftAssign - 89)) | (1 << (CParser.RightShiftAssign - 89)) | (1 << (CParser.AndAssign - 89)) | (1 << (CParser.XorAssign - 89)) | (1 << (CParser.OrAssign - 89)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -3310,10 +3274,10 @@ CParser.prototype.expression = function(_p) { this.enterRecursionRule(localctx, 44, CParser.RULE_expression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 511; + this.state = 497; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 518; + this.state = 504; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,29,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3324,16 +3288,16 @@ CParser.prototype.expression = function(_p) { _prevctx = localctx; localctx = new ExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_expression); - this.state = 513; + this.state = 499; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 514; + this.state = 500; this.match(CParser.Comma); - this.state = 515; + this.state = 501; this.assignmentExpression(); } - this.state = 520; + this.state = 506; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,29,this._ctx); } @@ -3395,7 +3359,7 @@ CParser.prototype.constantExpression = function() { this.enterRule(localctx, 46, CParser.RULE_constantExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 521; + this.state = 507; this.conditionalExpression(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -3462,7 +3426,7 @@ CParser.prototype.declaration = function() { this.enterRule(localctx, 48, CParser.RULE_declaration); var _la = 0; // Token type try { - this.state = 530; + this.state = 516; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -3502,21 +3466,21 @@ CParser.prototype.declaration = function() { case CParser.ThreadLocal: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 523; + this.state = 509; this.declarationSpecifiers(); - this.state = 525; + this.state = 511; _la = this._input.LA(1); - if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)))) !== 0) || _la===CParser.Identifier) { - this.state = 524; + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { + this.state = 510; this.initDeclaratorList(0); } - this.state = 527; + this.state = 513; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 529; + this.state = 515; this.staticAssertDeclaration(); break; default: @@ -3586,19 +3550,19 @@ CParser.prototype.declarationSpecifiers = function() { this.enterRule(localctx, 50, CParser.RULE_declarationSpecifiers); try { this.enterOuterAlt(localctx, 1); - this.state = 533; + this.state = 519; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 532; + this.state = 518; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 535; + this.state = 521; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,32, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3666,19 +3630,19 @@ CParser.prototype.declarationSpecifiers2 = function() { this.enterRule(localctx, 52, CParser.RULE_declarationSpecifiers2); try { this.enterOuterAlt(localctx, 1); - this.state = 538; + this.state = 524; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 537; + this.state = 523; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 540; + this.state = 526; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,33, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3754,36 +3718,36 @@ CParser.prototype.declarationSpecifier = function() { var localctx = new DeclarationSpecifierContext(this, this._ctx, this.state); this.enterRule(localctx, 54, CParser.RULE_declarationSpecifier); try { - this.state = 547; + this.state = 533; var la_ = this._interp.adaptivePredict(this._input,34,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 542; + this.state = 528; this.storageClassSpecifier(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 543; + this.state = 529; this.typeSpecifier(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 544; + this.state = 530; this.typeQualifier(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 545; + this.state = 531; this.functionSpecifier(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 546; + this.state = 532; this.alignmentSpecifier(); break; @@ -3852,10 +3816,10 @@ CParser.prototype.initDeclaratorList = function(_p) { this.enterRecursionRule(localctx, 56, CParser.RULE_initDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 550; + this.state = 536; this.initDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 557; + this.state = 543; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,35,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3866,16 +3830,16 @@ CParser.prototype.initDeclaratorList = function(_p) { _prevctx = localctx; localctx = new InitDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initDeclaratorList); - this.state = 552; + this.state = 538; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 553; + this.state = 539; this.match(CParser.Comma); - this.state = 554; + this.state = 540; this.initDeclarator(); } - this.state = 559; + this.state = 545; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,35,this._ctx); } @@ -3940,22 +3904,22 @@ CParser.prototype.initDeclarator = function() { var localctx = new InitDeclaratorContext(this, this._ctx, this.state); this.enterRule(localctx, 58, CParser.RULE_initDeclarator); try { - this.state = 565; + this.state = 551; var la_ = this._interp.adaptivePredict(this._input,36,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 560; + this.state = 546; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 561; + this.state = 547; this.declarator(); - this.state = 562; + this.state = 548; this.match(CParser.Assign); - this.state = 563; + this.state = 549; this.initializer(); break; @@ -4015,9 +3979,9 @@ CParser.prototype.storageClassSpecifier = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 567; + this.state = 553; _la = this._input.LA(1); - if(!(_la===CParser.Auto || _la===CParser.Extern || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Register - 37)) | (1 << (CParser.Static - 37)) | (1 << (CParser.Typedef - 37)) | (1 << (CParser.ThreadLocal - 37)))) !== 0))) { + if(!(_la===CParser.Auto || _la===CParser.Extern || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Register - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -4096,7 +4060,7 @@ CParser.prototype.typeSpecifier = function() { this.enterRule(localctx, 62, CParser.RULE_typeSpecifier); var _la = 0; // Token type try { - this.state = 583; + this.state = 569; switch(this._input.LA(1)) { case CParser.T__3: case CParser.T__4: @@ -4113,9 +4077,9 @@ CParser.prototype.typeSpecifier = function() { case CParser.Bool: case CParser.Complex: this.enterOuterAlt(localctx, 1); - this.state = 569; + this.state = 555; _la = this._input.LA(1); - if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Int - 35)) | (1 << (CParser.Long - 35)) | (1 << (CParser.Short - 35)) | (1 << (CParser.Signed - 35)) | (1 << (CParser.Unsigned - 35)) | (1 << (CParser.Void - 35)) | (1 << (CParser.Bool - 35)) | (1 << (CParser.Complex - 35)))) !== 0))) { + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -4124,11 +4088,11 @@ CParser.prototype.typeSpecifier = function() { break; case CParser.T__0: this.enterOuterAlt(localctx, 2); - this.state = 570; + this.state = 556; this.match(CParser.T__0); - this.state = 571; + this.state = 557; this.match(CParser.LeftParen); - this.state = 572; + this.state = 558; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5))) !== 0))) { this._errHandler.recoverInline(this); @@ -4136,39 +4100,39 @@ CParser.prototype.typeSpecifier = function() { else { this.consume(); } - this.state = 573; + this.state = 559; this.match(CParser.RightParen); break; case CParser.Atomic: this.enterOuterAlt(localctx, 3); - this.state = 574; + this.state = 560; this.atomicTypeSpecifier(); break; case CParser.Struct: case CParser.Union: this.enterOuterAlt(localctx, 4); - this.state = 575; + this.state = 561; this.structOrUnionSpecifier(); break; case CParser.Enum: this.enterOuterAlt(localctx, 5); - this.state = 576; + this.state = 562; this.enumSpecifier(); break; case CParser.Identifier: this.enterOuterAlt(localctx, 6); - this.state = 577; + this.state = 563; this.typedefName(); break; case CParser.T__6: this.enterOuterAlt(localctx, 7); - this.state = 578; + this.state = 564; this.match(CParser.T__6); - this.state = 579; + this.state = 565; this.match(CParser.LeftParen); - this.state = 580; + this.state = 566; this.constantExpression(); - this.state = 581; + this.state = 567; this.match(CParser.RightParen); break; default: @@ -4239,29 +4203,29 @@ CParser.prototype.structOrUnionSpecifier = function() { this.enterRule(localctx, 64, CParser.RULE_structOrUnionSpecifier); var _la = 0; // Token type try { - this.state = 594; + this.state = 580; var la_ = this._interp.adaptivePredict(this._input,39,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 585; + this.state = 571; this.structOrUnion(); - this.state = 587; + this.state = 573; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 586; + this.state = 572; this.match(CParser.Identifier); } - this.state = 589; + this.state = 575; this.structDeclarationsBlock(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 591; + this.state = 577; this.structOrUnion(); - this.state = 592; + this.state = 578; this.match(CParser.Identifier); break; @@ -4321,7 +4285,7 @@ CParser.prototype.structOrUnion = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 596; + this.state = 582; _la = this._input.LA(1); if(!(_la===CParser.Struct || _la===CParser.Union)) { this._errHandler.recoverInline(this); @@ -4386,11 +4350,11 @@ CParser.prototype.structDeclarationsBlock = function() { this.enterRule(localctx, 68, CParser.RULE_structDeclarationsBlock); try { this.enterOuterAlt(localctx, 1); - this.state = 598; + this.state = 584; this.match(CParser.LeftBrace); - this.state = 599; + this.state = 585; this.structDeclarationList(0); - this.state = 600; + this.state = 586; this.match(CParser.RightBrace); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -4456,10 +4420,10 @@ CParser.prototype.structDeclarationList = function(_p) { this.enterRecursionRule(localctx, 70, CParser.RULE_structDeclarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 603; + this.state = 589; this.structDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 609; + this.state = 595; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,40,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4470,14 +4434,14 @@ CParser.prototype.structDeclarationList = function(_p) { _prevctx = localctx; localctx = new StructDeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclarationList); - this.state = 605; + this.state = 591; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 606; + this.state = 592; this.structDeclaration(); } - this.state = 611; + this.state = 597; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,40,this._ctx); } @@ -4547,7 +4511,7 @@ CParser.prototype.structDeclaration = function() { this.enterRule(localctx, 72, CParser.RULE_structDeclaration); var _la = 0; // Token type try { - this.state = 619; + this.state = 605; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -4574,21 +4538,21 @@ CParser.prototype.structDeclaration = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 612; + this.state = 598; this.specifierQualifierList(); - this.state = 614; + this.state = 600; _la = this._input.LA(1); - if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)) | (1 << (CParser.Colon - 62)))) !== 0) || _la===CParser.Identifier) { - this.state = 613; + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)) | (1 << (CParser.Colon - 59)))) !== 0) || _la===CParser.Identifier) { + this.state = 599; this.structDeclaratorList(0); } - this.state = 616; + this.state = 602; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 618; + this.state = 604; this.staticAssertDeclaration(); break; default: @@ -4658,17 +4622,17 @@ CParser.prototype.specifierQualifierList = function() { var localctx = new SpecifierQualifierListContext(this, this._ctx, this.state); this.enterRule(localctx, 74, CParser.RULE_specifierQualifierList); try { - this.state = 629; + this.state = 615; var la_ = this._interp.adaptivePredict(this._input,45,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 621; + this.state = 607; this.typeSpecifier(); - this.state = 623; + this.state = 609; var la_ = this._interp.adaptivePredict(this._input,43,this._ctx); if(la_===1) { - this.state = 622; + this.state = 608; this.specifierQualifierList(); } @@ -4676,12 +4640,12 @@ CParser.prototype.specifierQualifierList = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 625; + this.state = 611; this.typeQualifier(); - this.state = 627; + this.state = 613; var la_ = this._interp.adaptivePredict(this._input,44,this._ctx); if(la_===1) { - this.state = 626; + this.state = 612; this.specifierQualifierList(); } @@ -4752,10 +4716,10 @@ CParser.prototype.structDeclaratorList = function(_p) { this.enterRecursionRule(localctx, 76, CParser.RULE_structDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 632; + this.state = 618; this.structDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 639; + this.state = 625; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,46,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4766,16 +4730,16 @@ CParser.prototype.structDeclaratorList = function(_p) { _prevctx = localctx; localctx = new StructDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclaratorList); - this.state = 634; + this.state = 620; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 635; + this.state = 621; this.match(CParser.Comma); - this.state = 636; + this.state = 622; this.structDeclarator(); } - this.state = 641; + this.state = 627; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,46,this._ctx); } @@ -4841,27 +4805,27 @@ CParser.prototype.structDeclarator = function() { this.enterRule(localctx, 78, CParser.RULE_structDeclarator); var _la = 0; // Token type try { - this.state = 648; + this.state = 634; var la_ = this._interp.adaptivePredict(this._input,48,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 642; + this.state = 628; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 644; + this.state = 630; _la = this._input.LA(1); - if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)))) !== 0) || _la===CParser.Identifier) { - this.state = 643; + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { + this.state = 629; this.declarator(); } - this.state = 646; + this.state = 632; this.match(CParser.Colon); - this.state = 647; + this.state = 633; this.constantExpression(); break; @@ -4927,54 +4891,54 @@ CParser.prototype.enumSpecifier = function() { this.enterRule(localctx, 80, CParser.RULE_enumSpecifier); var _la = 0; // Token type try { - this.state = 669; + this.state = 655; var la_ = this._interp.adaptivePredict(this._input,51,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 650; + this.state = 636; this.match(CParser.Enum); - this.state = 652; + this.state = 638; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 651; + this.state = 637; this.match(CParser.Identifier); } - this.state = 654; + this.state = 640; this.match(CParser.LeftBrace); - this.state = 655; + this.state = 641; this.enumeratorList(0); - this.state = 656; + this.state = 642; this.match(CParser.RightBrace); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 658; + this.state = 644; this.match(CParser.Enum); - this.state = 660; + this.state = 646; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 659; + this.state = 645; this.match(CParser.Identifier); } - this.state = 662; + this.state = 648; this.match(CParser.LeftBrace); - this.state = 663; + this.state = 649; this.enumeratorList(0); - this.state = 664; + this.state = 650; this.match(CParser.Comma); - this.state = 665; + this.state = 651; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 667; + this.state = 653; this.match(CParser.Enum); - this.state = 668; + this.state = 654; this.match(CParser.Identifier); break; @@ -5043,10 +5007,10 @@ CParser.prototype.enumeratorList = function(_p) { this.enterRecursionRule(localctx, 82, CParser.RULE_enumeratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 672; + this.state = 658; this.enumerator(); this._ctx.stop = this._input.LT(-1); - this.state = 679; + this.state = 665; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,52,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -5057,16 +5021,16 @@ CParser.prototype.enumeratorList = function(_p) { _prevctx = localctx; localctx = new EnumeratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_enumeratorList); - this.state = 674; + this.state = 660; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 675; + this.state = 661; this.match(CParser.Comma); - this.state = 676; + this.state = 662; this.enumerator(); } - this.state = 681; + this.state = 667; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,52,this._ctx); } @@ -5131,22 +5095,22 @@ CParser.prototype.enumerator = function() { var localctx = new EnumeratorContext(this, this._ctx, this.state); this.enterRule(localctx, 84, CParser.RULE_enumerator); try { - this.state = 687; + this.state = 673; var la_ = this._interp.adaptivePredict(this._input,53,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 682; + this.state = 668; this.enumerationConstant(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 683; + this.state = 669; this.enumerationConstant(); - this.state = 684; + this.state = 670; this.match(CParser.Assign); - this.state = 685; + this.state = 671; this.constantExpression(); break; @@ -5208,7 +5172,7 @@ CParser.prototype.enumerationConstant = function() { this.enterRule(localctx, 86, CParser.RULE_enumerationConstant); try { this.enterOuterAlt(localctx, 1); - this.state = 689; + this.state = 675; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5267,13 +5231,13 @@ CParser.prototype.atomicTypeSpecifier = function() { this.enterRule(localctx, 88, CParser.RULE_atomicTypeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 691; + this.state = 677; this.match(CParser.Atomic); - this.state = 692; + this.state = 678; this.match(CParser.LeftParen); - this.state = 693; + this.state = 679; this.typeName(); - this.state = 694; + this.state = 680; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5330,9 +5294,9 @@ CParser.prototype.typeQualifier = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 696; + this.state = 682; _la = this._input.LA(1); - if(!(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0))) { + if(!(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -5399,16 +5363,16 @@ CParser.prototype.functionSpecifier = function() { this.enterRule(localctx, 92, CParser.RULE_functionSpecifier); var _la = 0; // Token type try { - this.state = 704; + this.state = 690; switch(this._input.LA(1)) { case CParser.T__7: case CParser.T__8: case CParser.Inline: case CParser.Noreturn: this.enterOuterAlt(localctx, 1); - this.state = 698; + this.state = 684; _la = this._input.LA(1); - if(!(_la===CParser.T__7 || _la===CParser.T__8 || _la===CParser.Inline || _la===CParser.Noreturn)) { + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Inline))) !== 0) || _la===CParser.Noreturn)) { this._errHandler.recoverInline(this); } else { @@ -5417,18 +5381,18 @@ CParser.prototype.functionSpecifier = function() { break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 699; + this.state = 685; this.gccAttributeSpecifier(); break; case CParser.T__9: this.enterOuterAlt(localctx, 3); - this.state = 700; + this.state = 686; this.match(CParser.T__9); - this.state = 701; + this.state = 687; this.match(CParser.LeftParen); - this.state = 702; + this.state = 688; this.match(CParser.Identifier); - this.state = 703; + this.state = 689; this.match(CParser.RightParen); break; default: @@ -5494,30 +5458,30 @@ CParser.prototype.alignmentSpecifier = function() { var localctx = new AlignmentSpecifierContext(this, this._ctx, this.state); this.enterRule(localctx, 94, CParser.RULE_alignmentSpecifier); try { - this.state = 716; + this.state = 702; var la_ = this._interp.adaptivePredict(this._input,55,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 706; + this.state = 692; this.match(CParser.Alignas); - this.state = 707; + this.state = 693; this.match(CParser.LeftParen); - this.state = 708; + this.state = 694; this.typeName(); - this.state = 709; + this.state = 695; this.match(CParser.RightParen); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 711; + this.state = 697; this.match(CParser.Alignas); - this.state = 712; + this.state = 698; this.match(CParser.LeftParen); - this.state = 713; + this.state = 699; this.constantExpression(); - this.state = 714; + this.state = 700; this.match(CParser.RightParen); break; @@ -5595,24 +5559,24 @@ CParser.prototype.declarator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 719; + this.state = 705; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 718; + this.state = 704; this.pointer(); } - this.state = 721; + this.state = 707; this.directDeclarator(0); - this.state = 725; + this.state = 711; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,57,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 722; + this.state = 708; this.gccDeclaratorExtension(); } - this.state = 727; + this.state = 713; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,57,this._ctx); } @@ -5702,25 +5666,25 @@ CParser.prototype.directDeclarator = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 734; + this.state = 720; switch(this._input.LA(1)) { case CParser.Identifier: - this.state = 729; + this.state = 715; this.match(CParser.Identifier); break; case CParser.LeftParen: - this.state = 730; + this.state = 716; this.match(CParser.LeftParen); - this.state = 731; + this.state = 717; this.declarator(); - this.state = 732; + this.state = 718; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } this._ctx.stop = this._input.LT(-1); - this.state = 781; + this.state = 767; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,65,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -5729,139 +5693,139 @@ CParser.prototype.directDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 779; + this.state = 765; var la_ = this._interp.adaptivePredict(this._input,64,this._ctx); switch(la_) { case 1: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 736; + this.state = 722; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 737; + this.state = 723; this.match(CParser.LeftBracket); - this.state = 739; + this.state = 725; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 738; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 724; this.typeQualifierList(0); } - this.state = 742; + this.state = 728; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 741; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 727; this.assignmentExpression(); } - this.state = 744; + this.state = 730; this.match(CParser.RightBracket); break; case 2: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 745; + this.state = 731; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 746; + this.state = 732; this.match(CParser.LeftBracket); - this.state = 747; + this.state = 733; this.match(CParser.Static); - this.state = 749; + this.state = 735; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 748; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 734; this.typeQualifierList(0); } - this.state = 751; + this.state = 737; this.assignmentExpression(); - this.state = 752; + this.state = 738; this.match(CParser.RightBracket); break; case 3: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 754; + this.state = 740; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 755; + this.state = 741; this.match(CParser.LeftBracket); - this.state = 756; + this.state = 742; this.typeQualifierList(0); - this.state = 757; + this.state = 743; this.match(CParser.Static); - this.state = 758; + this.state = 744; this.assignmentExpression(); - this.state = 759; + this.state = 745; this.match(CParser.RightBracket); break; case 4: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 761; + this.state = 747; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 762; + this.state = 748; this.match(CParser.LeftBracket); - this.state = 764; + this.state = 750; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 763; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 749; this.typeQualifierList(0); } - this.state = 766; + this.state = 752; this.match(CParser.Star); - this.state = 767; + this.state = 753; this.match(CParser.RightBracket); break; case 5: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 768; + this.state = 754; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 769; + this.state = 755; this.match(CParser.LeftParen); - this.state = 770; + this.state = 756; this.parameterTypeList(); - this.state = 771; + this.state = 757; this.match(CParser.RightParen); break; case 6: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 773; + this.state = 759; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 774; + this.state = 760; this.match(CParser.LeftParen); - this.state = 776; + this.state = 762; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 775; + this.state = 761; this.identifierList(0); } - this.state = 778; + this.state = 764; this.match(CParser.RightParen); break; } } - this.state = 783; + this.state = 769; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,65,this._ctx); } @@ -5935,30 +5899,30 @@ CParser.prototype.gccDeclaratorExtension = function() { this.enterRule(localctx, 100, CParser.RULE_gccDeclaratorExtension); var _la = 0; // Token type try { - this.state = 793; + this.state = 779; switch(this._input.LA(1)) { case CParser.T__10: this.enterOuterAlt(localctx, 1); - this.state = 784; + this.state = 770; this.match(CParser.T__10); - this.state = 785; + this.state = 771; this.match(CParser.LeftParen); - this.state = 787; + this.state = 773; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 786; + this.state = 772; this.match(CParser.StringLiteral); - this.state = 789; + this.state = 775; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 791; + this.state = 777; this.match(CParser.RightParen); break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 792; + this.state = 778; this.gccAttributeSpecifier(); break; default: @@ -6021,17 +5985,17 @@ CParser.prototype.gccAttributeSpecifier = function() { this.enterRule(localctx, 102, CParser.RULE_gccAttributeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 795; + this.state = 781; this.match(CParser.T__11); - this.state = 796; + this.state = 782; this.match(CParser.LeftParen); - this.state = 797; + this.state = 783; this.match(CParser.LeftParen); - this.state = 798; + this.state = 784; this.gccAttributeList(); - this.state = 799; + this.state = 785; this.match(CParser.RightParen); - this.state = 800; + this.state = 786; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -6097,22 +6061,22 @@ CParser.prototype.gccAttributeList = function() { this.enterRule(localctx, 104, CParser.RULE_gccAttributeList); var _la = 0; // Token type try { - this.state = 811; + this.state = 797; var la_ = this._interp.adaptivePredict(this._input,69,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 802; + this.state = 788; this.gccAttribute(); - this.state = 807; + this.state = 793; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 803; + this.state = 789; this.match(CParser.Comma); - this.state = 804; + this.state = 790; this.gccAttribute(); - this.state = 809; + this.state = 795; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6181,7 +6145,7 @@ CParser.prototype.gccAttribute = function() { this.enterRule(localctx, 106, CParser.RULE_gccAttribute); var _la = 0; // Token type try { - this.state = 822; + this.state = 808; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6197,9 +6161,6 @@ CParser.prototype.gccAttribute = function() { case CParser.T__11: case CParser.T__12: case CParser.T__13: - case CParser.T__14: - case CParser.T__15: - case CParser.T__16: case CParser.Auto: case CParser.Break: case CParser.Case: @@ -6291,34 +6252,33 @@ CParser.prototype.gccAttribute = function() { case CParser.Constant: case CParser.StringLiteral: case CParser.SharedIncludeLiteral: - case CParser.LineDirective: - case CParser.PragmaDirective: + case CParser.Directive: case CParser.Whitespace: case CParser.Newline: case CParser.BlockComment: case CParser.LineComment: this.enterOuterAlt(localctx, 1); - this.state = 813; + this.state = 799; _la = this._input.LA(1); - if(_la<=0 || ((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.RightParen - 62)) | (1 << (CParser.Comma - 62)))) !== 0)) { + if(_la<=0 || ((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.RightParen - 59)) | (1 << (CParser.Comma - 59)))) !== 0)) { this._errHandler.recoverInline(this); } else { this.consume(); } - this.state = 819; + this.state = 805; _la = this._input.LA(1); if(_la===CParser.LeftParen) { - this.state = 814; + this.state = 800; this.match(CParser.LeftParen); - this.state = 816; + this.state = 802; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 815; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 801; this.argumentExpressionList(0); } - this.state = 818; + this.state = 804; this.match(CParser.RightParen); } @@ -6396,11 +6356,11 @@ CParser.prototype.nestedParenthesesBlock = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 831; + this.state = 817; this._errHandler.sync(this); _la = this._input.LA(1); - while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.T__14) | (1 << CParser.T__15) | (1 << CParser.T__16) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Goto - 32)) | (1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.LeftBracket - 64)) | (1 << (CParser.RightBracket - 64)) | (1 << (CParser.LeftBrace - 64)) | (1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.PlusAssign - 96)) | (1 << (CParser.MinusAssign - 96)) | (1 << (CParser.LeftShiftAssign - 96)) | (1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.LineDirective - 96)) | (1 << (CParser.PragmaDirective - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { - this.state = 829; + while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { + this.state = 815; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6416,9 +6376,6 @@ CParser.prototype.nestedParenthesesBlock = function() { case CParser.T__11: case CParser.T__12: case CParser.T__13: - case CParser.T__14: - case CParser.T__15: - case CParser.T__16: case CParser.Auto: case CParser.Break: case CParser.Case: @@ -6511,13 +6468,12 @@ CParser.prototype.nestedParenthesesBlock = function() { case CParser.Constant: case CParser.StringLiteral: case CParser.SharedIncludeLiteral: - case CParser.LineDirective: - case CParser.PragmaDirective: + case CParser.Directive: case CParser.Whitespace: case CParser.Newline: case CParser.BlockComment: case CParser.LineComment: - this.state = 824; + this.state = 810; _la = this._input.LA(1); if(_la<=0 || _la===CParser.LeftParen || _la===CParser.RightParen) { this._errHandler.recoverInline(this); @@ -6527,17 +6483,17 @@ CParser.prototype.nestedParenthesesBlock = function() { } break; case CParser.LeftParen: - this.state = 825; + this.state = 811; this.match(CParser.LeftParen); - this.state = 826; + this.state = 812; this.nestedParenthesesBlock(); - this.state = 827; + this.state = 813; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 833; + this.state = 819; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6602,17 +6558,17 @@ CParser.prototype.pointer = function() { this.enterRule(localctx, 110, CParser.RULE_pointer); var _la = 0; // Token type try { - this.state = 852; + this.state = 838; var la_ = this._interp.adaptivePredict(this._input,79,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 834; + this.state = 820; this.match(CParser.Star); - this.state = 836; + this.state = 822; var la_ = this._interp.adaptivePredict(this._input,75,this._ctx); if(la_===1) { - this.state = 835; + this.state = 821; this.typeQualifierList(0); } @@ -6620,27 +6576,27 @@ CParser.prototype.pointer = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 838; + this.state = 824; this.match(CParser.Star); - this.state = 840; + this.state = 826; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 839; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 825; this.typeQualifierList(0); } - this.state = 842; + this.state = 828; this.pointer(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 843; + this.state = 829; this.match(CParser.Caret); - this.state = 845; + this.state = 831; var la_ = this._interp.adaptivePredict(this._input,77,this._ctx); if(la_===1) { - this.state = 844; + this.state = 830; this.typeQualifierList(0); } @@ -6648,16 +6604,16 @@ CParser.prototype.pointer = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 847; + this.state = 833; this.match(CParser.Caret); - this.state = 849; + this.state = 835; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 848; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 834; this.typeQualifierList(0); } - this.state = 851; + this.state = 837; this.pointer(); break; @@ -6726,10 +6682,10 @@ CParser.prototype.typeQualifierList = function(_p) { this.enterRecursionRule(localctx, 112, CParser.RULE_typeQualifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 855; + this.state = 841; this.typeQualifier(); this._ctx.stop = this._input.LT(-1); - this.state = 861; + this.state = 847; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,80,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6740,14 +6696,14 @@ CParser.prototype.typeQualifierList = function(_p) { _prevctx = localctx; localctx = new TypeQualifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_typeQualifierList); - this.state = 857; + this.state = 843; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 858; + this.state = 844; this.typeQualifier(); } - this.state = 863; + this.state = 849; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,80,this._ctx); } @@ -6808,22 +6764,22 @@ CParser.prototype.parameterTypeList = function() { var localctx = new ParameterTypeListContext(this, this._ctx, this.state); this.enterRule(localctx, 114, CParser.RULE_parameterTypeList); try { - this.state = 869; + this.state = 855; var la_ = this._interp.adaptivePredict(this._input,81,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 864; + this.state = 850; this.parameterList(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 865; + this.state = 851; this.parameterList(0); - this.state = 866; + this.state = 852; this.match(CParser.Comma); - this.state = 867; + this.state = 853; this.match(CParser.Ellipsis); break; @@ -6892,10 +6848,10 @@ CParser.prototype.parameterList = function(_p) { this.enterRecursionRule(localctx, 116, CParser.RULE_parameterList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 872; + this.state = 858; this.parameterDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 879; + this.state = 865; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,82,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6906,16 +6862,16 @@ CParser.prototype.parameterList = function(_p) { _prevctx = localctx; localctx = new ParameterListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_parameterList); - this.state = 874; + this.state = 860; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 875; + this.state = 861; this.match(CParser.Comma); - this.state = 876; + this.state = 862; this.parameterDeclaration(); } - this.state = 881; + this.state = 867; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,82,this._ctx); } @@ -6988,25 +6944,25 @@ CParser.prototype.parameterDeclaration = function() { var localctx = new ParameterDeclarationContext(this, this._ctx, this.state); this.enterRule(localctx, 118, CParser.RULE_parameterDeclaration); try { - this.state = 889; + this.state = 875; var la_ = this._interp.adaptivePredict(this._input,84,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 882; + this.state = 868; this.declarationSpecifiers(); - this.state = 883; + this.state = 869; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 885; + this.state = 871; this.declarationSpecifiers2(); - this.state = 887; + this.state = 873; var la_ = this._interp.adaptivePredict(this._input,83,this._ctx); if(la_===1) { - this.state = 886; + this.state = 872; this.abstractDeclarator(); } @@ -7077,10 +7033,10 @@ CParser.prototype.identifierList = function(_p) { this.enterRecursionRule(localctx, 120, CParser.RULE_identifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 892; + this.state = 878; this.match(CParser.Identifier); this._ctx.stop = this._input.LT(-1); - this.state = 899; + this.state = 885; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,85,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7091,16 +7047,16 @@ CParser.prototype.identifierList = function(_p) { _prevctx = localctx; localctx = new IdentifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_identifierList); - this.state = 894; + this.state = 880; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 895; + this.state = 881; this.match(CParser.Comma); - this.state = 896; + this.state = 882; this.match(CParser.Identifier); } - this.state = 901; + this.state = 887; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,85,this._ctx); } @@ -7167,12 +7123,12 @@ CParser.prototype.typeName = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 902; + this.state = 888; this.specifierQualifierList(); - this.state = 904; + this.state = 890; _la = this._input.LA(1); - if(((((_la - 62)) & ~0x1f) == 0 && ((1 << (_la - 62)) & ((1 << (CParser.LeftParen - 62)) | (1 << (CParser.LeftBracket - 62)) | (1 << (CParser.Star - 62)) | (1 << (CParser.Caret - 62)))) !== 0)) { - this.state = 903; + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.LeftBracket - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0)) { + this.state = 889; this.abstractDeclarator(); } @@ -7248,35 +7204,35 @@ CParser.prototype.abstractDeclarator = function() { this.enterRule(localctx, 124, CParser.RULE_abstractDeclarator); var _la = 0; // Token type try { - this.state = 917; + this.state = 903; var la_ = this._interp.adaptivePredict(this._input,89,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 906; + this.state = 892; this.pointer(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 908; + this.state = 894; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 907; + this.state = 893; this.pointer(); } - this.state = 910; + this.state = 896; this.directAbstractDeclarator(0); - this.state = 914; + this.state = 900; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,88,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 911; + this.state = 897; this.gccDeclaratorExtension(); } - this.state = 916; + this.state = 902; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,88,this._ctx); } @@ -7372,25 +7328,25 @@ CParser.prototype.directAbstractDeclarator = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 965; + this.state = 951; var la_ = this._interp.adaptivePredict(this._input,96,this._ctx); switch(la_) { case 1: - this.state = 920; + this.state = 906; this.match(CParser.LeftParen); - this.state = 921; + this.state = 907; this.abstractDeclarator(); - this.state = 922; + this.state = 908; this.match(CParser.RightParen); - this.state = 926; + this.state = 912; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,90,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 923; + this.state = 909; this.gccDeclaratorExtension(); } - this.state = 928; + this.state = 914; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,90,this._ctx); } @@ -7398,87 +7354,87 @@ CParser.prototype.directAbstractDeclarator = function(_p) { break; case 2: - this.state = 929; + this.state = 915; this.match(CParser.LeftBracket); - this.state = 931; + this.state = 917; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 930; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 916; this.typeQualifierList(0); } - this.state = 934; + this.state = 920; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 933; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 919; this.assignmentExpression(); } - this.state = 936; + this.state = 922; this.match(CParser.RightBracket); break; case 3: - this.state = 937; + this.state = 923; this.match(CParser.LeftBracket); - this.state = 938; + this.state = 924; this.match(CParser.Static); - this.state = 940; + this.state = 926; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 939; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 925; this.typeQualifierList(0); } - this.state = 942; + this.state = 928; this.assignmentExpression(); - this.state = 943; + this.state = 929; this.match(CParser.RightBracket); break; case 4: - this.state = 945; + this.state = 931; this.match(CParser.LeftBracket); - this.state = 946; + this.state = 932; this.typeQualifierList(0); - this.state = 947; + this.state = 933; this.match(CParser.Static); - this.state = 948; + this.state = 934; this.assignmentExpression(); - this.state = 949; + this.state = 935; this.match(CParser.RightBracket); break; case 5: - this.state = 951; + this.state = 937; this.match(CParser.LeftBracket); - this.state = 952; + this.state = 938; this.match(CParser.Star); - this.state = 953; + this.state = 939; this.match(CParser.RightBracket); break; case 6: - this.state = 954; + this.state = 940; this.match(CParser.LeftParen); - this.state = 956; + this.state = 942; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0) || _la===CParser.Identifier) { - this.state = 955; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 941; this.parameterTypeList(); } - this.state = 958; + this.state = 944; this.match(CParser.RightParen); - this.state = 962; + this.state = 948; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,95,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 959; + this.state = 945; this.gccDeclaratorExtension(); } - this.state = 964; + this.state = 950; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,95,this._ctx); } @@ -7487,7 +7443,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } this._ctx.stop = this._input.LT(-1); - this.state = 1010; + this.state = 996; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,103,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7496,121 +7452,121 @@ CParser.prototype.directAbstractDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 1008; + this.state = 994; var la_ = this._interp.adaptivePredict(this._input,102,this._ctx); switch(la_) { case 1: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 967; + this.state = 953; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 968; + this.state = 954; this.match(CParser.LeftBracket); - this.state = 970; + this.state = 956; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 969; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 955; this.typeQualifierList(0); } - this.state = 973; + this.state = 959; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 972; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 958; this.assignmentExpression(); } - this.state = 975; + this.state = 961; this.match(CParser.RightBracket); break; case 2: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 976; + this.state = 962; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 977; + this.state = 963; this.match(CParser.LeftBracket); - this.state = 978; + this.state = 964; this.match(CParser.Static); - this.state = 980; + this.state = 966; _la = this._input.LA(1); - if(_la===CParser.Const || ((((_la - 38)) & ~0x1f) == 0 && ((1 << (_la - 38)) & ((1 << (CParser.Restrict - 38)) | (1 << (CParser.Volatile - 38)) | (1 << (CParser.Atomic - 38)))) !== 0)) { - this.state = 979; + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 965; this.typeQualifierList(0); } - this.state = 982; + this.state = 968; this.assignmentExpression(); - this.state = 983; + this.state = 969; this.match(CParser.RightBracket); break; case 3: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 985; + this.state = 971; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 986; + this.state = 972; this.match(CParser.LeftBracket); - this.state = 987; + this.state = 973; this.typeQualifierList(0); - this.state = 988; + this.state = 974; this.match(CParser.Static); - this.state = 989; + this.state = 975; this.assignmentExpression(); - this.state = 990; + this.state = 976; this.match(CParser.RightBracket); break; case 4: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 992; + this.state = 978; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 993; + this.state = 979; this.match(CParser.LeftBracket); - this.state = 994; + this.state = 980; this.match(CParser.Star); - this.state = 995; + this.state = 981; this.match(CParser.RightBracket); break; case 5: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 996; + this.state = 982; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 997; + this.state = 983; this.match(CParser.LeftParen); - this.state = 999; + this.state = 985; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0) || _la===CParser.Identifier) { - this.state = 998; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 984; this.parameterTypeList(); } - this.state = 1001; + this.state = 987; this.match(CParser.RightParen); - this.state = 1005; + this.state = 991; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,101,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 1002; + this.state = 988; this.gccDeclaratorExtension(); } - this.state = 1007; + this.state = 993; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,101,this._ctx); } @@ -7619,7 +7575,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } } - this.state = 1012; + this.state = 998; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,103,this._ctx); } @@ -7681,7 +7637,7 @@ CParser.prototype.typedefName = function() { this.enterRule(localctx, 128, CParser.RULE_typedefName); try { this.enterOuterAlt(localctx, 1); - this.state = 1013; + this.state = 999; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -7743,34 +7699,34 @@ CParser.prototype.initializer = function() { var localctx = new InitializerContext(this, this._ctx, this.state); this.enterRule(localctx, 130, CParser.RULE_initializer); try { - this.state = 1025; + this.state = 1011; var la_ = this._interp.adaptivePredict(this._input,104,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1015; + this.state = 1001; this.assignmentExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1016; + this.state = 1002; this.match(CParser.LeftBrace); - this.state = 1017; + this.state = 1003; this.initializerList(0); - this.state = 1018; + this.state = 1004; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1020; + this.state = 1006; this.match(CParser.LeftBrace); - this.state = 1021; + this.state = 1007; this.initializerList(0); - this.state = 1022; + this.state = 1008; this.match(CParser.Comma); - this.state = 1023; + this.state = 1009; this.match(CParser.RightBrace); break; @@ -7844,17 +7800,17 @@ CParser.prototype.initializerList = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1029; + this.state = 1015; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1028; + this.state = 1014; this.designation(); } - this.state = 1031; + this.state = 1017; this.initializer(); this._ctx.stop = this._input.LT(-1); - this.state = 1041; + this.state = 1027; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,107,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7865,23 +7821,23 @@ CParser.prototype.initializerList = function(_p) { _prevctx = localctx; localctx = new InitializerListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initializerList); - this.state = 1033; + this.state = 1019; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1034; + this.state = 1020; this.match(CParser.Comma); - this.state = 1036; + this.state = 1022; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1035; + this.state = 1021; this.designation(); } - this.state = 1038; + this.state = 1024; this.initializer(); } - this.state = 1043; + this.state = 1029; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,107,this._ctx); } @@ -7943,9 +7899,9 @@ CParser.prototype.designation = function() { this.enterRule(localctx, 134, CParser.RULE_designation); try { this.enterOuterAlt(localctx, 1); - this.state = 1044; + this.state = 1030; this.designatorList(0); - this.state = 1045; + this.state = 1031; this.match(CParser.Assign); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8011,10 +7967,10 @@ CParser.prototype.designatorList = function(_p) { this.enterRecursionRule(localctx, 136, CParser.RULE_designatorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1048; + this.state = 1034; this.designator(); this._ctx.stop = this._input.LT(-1); - this.state = 1054; + this.state = 1040; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,108,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -8025,14 +7981,14 @@ CParser.prototype.designatorList = function(_p) { _prevctx = localctx; localctx = new DesignatorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_designatorList); - this.state = 1050; + this.state = 1036; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1051; + this.state = 1037; this.designator(); } - this.state = 1056; + this.state = 1042; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,108,this._ctx); } @@ -8097,22 +8053,22 @@ CParser.prototype.designator = function() { var localctx = new DesignatorContext(this, this._ctx, this.state); this.enterRule(localctx, 138, CParser.RULE_designator); try { - this.state = 1063; + this.state = 1049; switch(this._input.LA(1)) { case CParser.LeftBracket: this.enterOuterAlt(localctx, 1); - this.state = 1057; + this.state = 1043; this.match(CParser.LeftBracket); - this.state = 1058; + this.state = 1044; this.constantExpression(); - this.state = 1059; + this.state = 1045; this.match(CParser.RightBracket); break; case CParser.Dot: this.enterOuterAlt(localctx, 2); - this.state = 1061; + this.state = 1047; this.match(CParser.Dot); - this.state = 1062; + this.state = 1048; this.match(CParser.Identifier); break; default: @@ -8188,27 +8144,27 @@ CParser.prototype.staticAssertDeclaration = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1065; + this.state = 1051; this.match(CParser.StaticAssert); - this.state = 1066; + this.state = 1052; this.match(CParser.LeftParen); - this.state = 1067; + this.state = 1053; this.constantExpression(); - this.state = 1068; + this.state = 1054; this.match(CParser.Comma); - this.state = 1070; + this.state = 1056; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 1069; + this.state = 1055; this.match(CParser.StringLiteral); - this.state = 1072; + this.state = 1058; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 1074; + this.state = 1060; this.match(CParser.RightParen); - this.state = 1075; + this.state = 1061; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8298,48 +8254,48 @@ CParser.prototype.statement = function() { this.enterRule(localctx, 142, CParser.RULE_statement); var _la = 0; // Token type try { - this.state = 1114; + this.state = 1100; var la_ = this._interp.adaptivePredict(this._input,116,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1077; + this.state = 1063; this.labeledStatement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1078; + this.state = 1064; this.compoundStatement(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1079; + this.state = 1065; this.expressionStatement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1080; + this.state = 1066; this.selectionStatement(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1081; + this.state = 1067; this.iterationStatement(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 1082; + this.state = 1068; this.jumpStatement(); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 1083; + this.state = 1069; _la = this._input.LA(1); if(!(_la===CParser.T__10 || _la===CParser.T__12)) { this._errHandler.recoverInline(this); @@ -8347,7 +8303,7 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1084; + this.state = 1070; _la = this._input.LA(1); if(!(_la===CParser.T__13 || _la===CParser.Volatile)) { this._errHandler.recoverInline(this); @@ -8355,59 +8311,59 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1085; + this.state = 1071; this.match(CParser.LeftParen); - this.state = 1094; + this.state = 1080; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1086; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1072; this.logicalOrExpression(0); - this.state = 1091; + this.state = 1077; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1087; + this.state = 1073; this.match(CParser.Comma); - this.state = 1088; + this.state = 1074; this.logicalOrExpression(0); - this.state = 1093; + this.state = 1079; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1109; + this.state = 1095; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Colon) { - this.state = 1096; + this.state = 1082; this.match(CParser.Colon); - this.state = 1105; + this.state = 1091; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1097; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1083; this.logicalOrExpression(0); - this.state = 1102; + this.state = 1088; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1098; + this.state = 1084; this.match(CParser.Comma); - this.state = 1099; + this.state = 1085; this.logicalOrExpression(0); - this.state = 1104; + this.state = 1090; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1111; + this.state = 1097; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 1112; + this.state = 1098; this.match(CParser.RightParen); - this.state = 1113; + this.state = 1099; this.match(CParser.Semi); break; @@ -8476,35 +8432,35 @@ CParser.prototype.labeledStatement = function() { var localctx = new LabeledStatementContext(this, this._ctx, this.state); this.enterRule(localctx, 144, CParser.RULE_labeledStatement); try { - this.state = 1127; + this.state = 1113; switch(this._input.LA(1)) { case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 1116; + this.state = 1102; this.match(CParser.Identifier); - this.state = 1117; + this.state = 1103; this.match(CParser.Colon); - this.state = 1118; + this.state = 1104; this.statement(); break; case CParser.Case: this.enterOuterAlt(localctx, 2); - this.state = 1119; + this.state = 1105; this.match(CParser.Case); - this.state = 1120; + this.state = 1106; this.constantExpression(); - this.state = 1121; + this.state = 1107; this.match(CParser.Colon); - this.state = 1122; + this.state = 1108; this.statement(); break; case CParser.Default: this.enterOuterAlt(localctx, 3); - this.state = 1124; + this.state = 1110; this.match(CParser.Default); - this.state = 1125; + this.state = 1111; this.match(CParser.Colon); - this.state = 1126; + this.state = 1112; this.statement(); break; default: @@ -8568,16 +8524,16 @@ CParser.prototype.compoundStatement = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1129; + this.state = 1115; this.match(CParser.LeftBrace); - this.state = 1131; + this.state = 1117; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Goto - 32)) | (1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 66)) & ~0x1f) == 0 && ((1 << (_la - 66)) & ((1 << (CParser.LeftBrace - 66)) | (1 << (CParser.Plus - 66)) | (1 << (CParser.PlusPlus - 66)) | (1 << (CParser.Minus - 66)) | (1 << (CParser.MinusMinus - 66)) | (1 << (CParser.Star - 66)) | (1 << (CParser.And - 66)) | (1 << (CParser.AndAnd - 66)) | (1 << (CParser.Not - 66)) | (1 << (CParser.Tilde - 66)) | (1 << (CParser.Semi - 66)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1130; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)) | (1 << (CParser.Semi - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1116; this.blockItemList(0); } - this.state = 1133; + this.state = 1119; this.match(CParser.RightBrace); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8643,10 +8599,10 @@ CParser.prototype.blockItemList = function(_p) { this.enterRecursionRule(localctx, 148, CParser.RULE_blockItemList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1136; + this.state = 1122; this.blockItem(); this._ctx.stop = this._input.LT(-1); - this.state = 1142; + this.state = 1128; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,119,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -8657,14 +8613,14 @@ CParser.prototype.blockItemList = function(_p) { _prevctx = localctx; localctx = new BlockItemListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_blockItemList); - this.state = 1138; + this.state = 1124; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1139; + this.state = 1125; this.blockItem(); } - this.state = 1144; + this.state = 1130; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,119,this._ctx); } @@ -8729,18 +8685,18 @@ CParser.prototype.blockItem = function() { var localctx = new BlockItemContext(this, this._ctx, this.state); this.enterRule(localctx, 150, CParser.RULE_blockItem); try { - this.state = 1147; + this.state = 1133; var la_ = this._interp.adaptivePredict(this._input,120,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1145; + this.state = 1131; this.declaration(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1146; + this.state = 1132; this.statement(); break; @@ -8803,14 +8759,14 @@ CParser.prototype.expressionStatement = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1150; + this.state = 1136; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1149; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1135; this.expression(0); } - this.state = 1152; + this.state = 1138; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8879,41 +8835,41 @@ CParser.prototype.selectionStatement = function() { var localctx = new SelectionStatementContext(this, this._ctx, this.state); this.enterRule(localctx, 154, CParser.RULE_selectionStatement); try { - this.state = 1169; + this.state = 1155; switch(this._input.LA(1)) { case CParser.If: this.enterOuterAlt(localctx, 1); - this.state = 1154; + this.state = 1140; this.match(CParser.If); - this.state = 1155; + this.state = 1141; this.match(CParser.LeftParen); - this.state = 1156; + this.state = 1142; this.expression(0); - this.state = 1157; + this.state = 1143; this.match(CParser.RightParen); - this.state = 1158; + this.state = 1144; this.statement(); - this.state = 1161; + this.state = 1147; var la_ = this._interp.adaptivePredict(this._input,122,this._ctx); if(la_===1) { - this.state = 1159; + this.state = 1145; this.match(CParser.Else); - this.state = 1160; + this.state = 1146; this.statement(); } break; case CParser.Switch: this.enterOuterAlt(localctx, 2); - this.state = 1163; + this.state = 1149; this.match(CParser.Switch); - this.state = 1164; + this.state = 1150; this.match(CParser.LeftParen); - this.state = 1165; + this.state = 1151; this.expression(0); - this.state = 1166; + this.state = 1152; this.match(CParser.RightParen); - this.state = 1167; + this.state = 1153; this.statement(); break; default: @@ -8991,105 +8947,105 @@ CParser.prototype.iterationStatement = function() { this.enterRule(localctx, 156, CParser.RULE_iterationStatement); var _la = 0; // Token type try { - this.state = 1213; + this.state = 1199; var la_ = this._interp.adaptivePredict(this._input,129,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1171; + this.state = 1157; this.match(CParser.While); - this.state = 1172; + this.state = 1158; this.match(CParser.LeftParen); - this.state = 1173; + this.state = 1159; this.expression(0); - this.state = 1174; + this.state = 1160; this.match(CParser.RightParen); - this.state = 1175; + this.state = 1161; this.statement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1177; + this.state = 1163; this.match(CParser.Do); - this.state = 1178; + this.state = 1164; this.statement(); - this.state = 1179; + this.state = 1165; this.match(CParser.While); - this.state = 1180; + this.state = 1166; this.match(CParser.LeftParen); - this.state = 1181; + this.state = 1167; this.expression(0); - this.state = 1182; + this.state = 1168; this.match(CParser.RightParen); - this.state = 1183; + this.state = 1169; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1185; + this.state = 1171; this.match(CParser.For); - this.state = 1186; + this.state = 1172; this.match(CParser.LeftParen); - this.state = 1188; + this.state = 1174; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1187; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1173; this.expression(0); } - this.state = 1190; + this.state = 1176; this.match(CParser.Semi); - this.state = 1192; + this.state = 1178; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1191; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1177; this.expression(0); } - this.state = 1194; + this.state = 1180; this.match(CParser.Semi); - this.state = 1196; + this.state = 1182; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1195; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1181; this.expression(0); } - this.state = 1198; + this.state = 1184; this.match(CParser.RightParen); - this.state = 1199; + this.state = 1185; this.statement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1200; + this.state = 1186; this.match(CParser.For); - this.state = 1201; + this.state = 1187; this.match(CParser.LeftParen); - this.state = 1202; + this.state = 1188; this.declaration(); - this.state = 1204; + this.state = 1190; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1203; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1189; this.expression(0); } - this.state = 1206; + this.state = 1192; this.match(CParser.Semi); - this.state = 1208; + this.state = 1194; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1207; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1193; this.expression(0); } - this.state = 1210; + this.state = 1196; this.match(CParser.RightParen); - this.state = 1211; + this.state = 1197; this.statement(); break; @@ -9159,57 +9115,57 @@ CParser.prototype.jumpStatement = function() { this.enterRule(localctx, 158, CParser.RULE_jumpStatement); var _la = 0; // Token type try { - this.state = 1231; + this.state = 1217; var la_ = this._interp.adaptivePredict(this._input,131,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1215; + this.state = 1201; this.match(CParser.Goto); - this.state = 1216; + this.state = 1202; this.match(CParser.Identifier); - this.state = 1217; + this.state = 1203; this.match(CParser.Semi); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1218; + this.state = 1204; this.match(CParser.Continue); - this.state = 1219; + this.state = 1205; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1220; + this.state = 1206; this.match(CParser.Break); - this.state = 1221; + this.state = 1207; this.match(CParser.Semi); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1222; + this.state = 1208; this.match(CParser.Return); - this.state = 1224; + this.state = 1210; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 42)) & ~0x1f) == 0 && ((1 << (_la - 42)) & ((1 << (CParser.Sizeof - 42)) | (1 << (CParser.Alignof - 42)) | (1 << (CParser.Generic - 42)) | (1 << (CParser.LeftParen - 42)))) !== 0) || ((((_la - 74)) & ~0x1f) == 0 && ((1 << (_la - 74)) & ((1 << (CParser.Plus - 74)) | (1 << (CParser.PlusPlus - 74)) | (1 << (CParser.Minus - 74)) | (1 << (CParser.MinusMinus - 74)) | (1 << (CParser.Star - 74)) | (1 << (CParser.And - 74)) | (1 << (CParser.AndAnd - 74)) | (1 << (CParser.Not - 74)) | (1 << (CParser.Tilde - 74)))) !== 0) || ((((_la - 108)) & ~0x1f) == 0 && ((1 << (_la - 108)) & ((1 << (CParser.Identifier - 108)) | (1 << (CParser.Constant - 108)) | (1 << (CParser.StringLiteral - 108)))) !== 0)) { - this.state = 1223; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1209; this.expression(0); } - this.state = 1226; + this.state = 1212; this.match(CParser.Semi); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1227; + this.state = 1213; this.match(CParser.Goto); - this.state = 1228; + this.state = 1214; this.unaryExpression(); - this.state = 1229; + this.state = 1215; this.match(CParser.Semi); break; @@ -9276,14 +9232,14 @@ CParser.prototype.compilationUnit = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1234; + this.state = 1220; _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.T__14) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.StaticAssert - 34)) | (1 << (CParser.ThreadLocal - 34)) | (1 << (CParser.LeftParen - 34)))) !== 0) || ((((_la - 78)) & ~0x1f) == 0 && ((1 << (_la - 78)) & ((1 << (CParser.Star - 78)) | (1 << (CParser.Caret - 78)) | (1 << (CParser.Semi - 78)) | (1 << (CParser.Identifier - 78)))) !== 0)) { - this.state = 1233; + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) { + this.state = 1219; this.translationUnit(0); } - this.state = 1236; + this.state = 1222; this.match(CParser.EOF); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -9349,10 +9305,10 @@ CParser.prototype.translationUnit = function(_p) { this.enterRecursionRule(localctx, 162, CParser.RULE_translationUnit, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1239; + this.state = 1225; this.externalDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1245; + this.state = 1231; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,133,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -9363,14 +9319,14 @@ CParser.prototype.translationUnit = function(_p) { _prevctx = localctx; localctx = new TranslationUnitContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_translationUnit); - this.state = 1241; + this.state = 1227; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1242; + this.state = 1228; this.externalDeclaration(); } - this.state = 1247; + this.state = 1233; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,133,this._ctx); } @@ -9389,7 +9345,7 @@ CParser.prototype.translationUnit = function(_p) { return localctx; }; -function IncludeDirectiveContext(parser, parent, invokingState) { +function ExternalDeclarationContext(parser, parent, invokingState) { if(parent===undefined) { parent = null; } @@ -9398,64 +9354,62 @@ function IncludeDirectiveContext(parser, parent, invokingState) { } antlr4.ParserRuleContext.call(this, parent, invokingState); this.parser = parser; - this.ruleIndex = CParser.RULE_includeDirective; + this.ruleIndex = CParser.RULE_externalDeclaration; return this; } -IncludeDirectiveContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -IncludeDirectiveContext.prototype.constructor = IncludeDirectiveContext; +ExternalDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ExternalDeclarationContext.prototype.constructor = ExternalDeclarationContext; -IncludeDirectiveContext.prototype.StringLiteral = function() { - return this.getToken(CParser.StringLiteral, 0); +ExternalDeclarationContext.prototype.functionDefinition = function() { + return this.getTypedRuleContext(FunctionDefinitionContext,0); }; -IncludeDirectiveContext.prototype.SharedIncludeLiteral = function() { - return this.getToken(CParser.SharedIncludeLiteral, 0); +ExternalDeclarationContext.prototype.declaration = function() { + return this.getTypedRuleContext(DeclarationContext,0); }; -IncludeDirectiveContext.prototype.enterRule = function(listener) { +ExternalDeclarationContext.prototype.enterRule = function(listener) { if(listener instanceof CListener ) { - listener.enterIncludeDirective(this); + listener.enterExternalDeclaration(this); } }; -IncludeDirectiveContext.prototype.exitRule = function(listener) { +ExternalDeclarationContext.prototype.exitRule = function(listener) { if(listener instanceof CListener ) { - listener.exitIncludeDirective(this); + listener.exitExternalDeclaration(this); } }; -CParser.IncludeDirectiveContext = IncludeDirectiveContext; +CParser.ExternalDeclarationContext = ExternalDeclarationContext; -CParser.prototype.includeDirective = function() { +CParser.prototype.externalDeclaration = function() { - var localctx = new IncludeDirectiveContext(this, this._ctx, this.state); - this.enterRule(localctx, 164, CParser.RULE_includeDirective); + var localctx = new ExternalDeclarationContext(this, this._ctx, this.state); + this.enterRule(localctx, 164, CParser.RULE_externalDeclaration); try { - this.state = 1254; + this.state = 1237; var la_ = this._interp.adaptivePredict(this._input,134,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1248; - this.match(CParser.T__14); - this.state = 1249; - this.match(CParser.T__15); - this.state = 1250; - this.match(CParser.StringLiteral); + this.state = 1234; + this.functionDefinition(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1251; - this.match(CParser.T__14); - this.state = 1252; - this.match(CParser.T__15); - this.state = 1253; - this.match(CParser.SharedIncludeLiteral); + this.state = 1235; + this.declaration(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1236; + this.match(CParser.Semi); break; } @@ -9473,7 +9427,7 @@ CParser.prototype.includeDirective = function() { return localctx; }; -function DefineDirectiveContext(parser, parent, invokingState) { +function FunctionDefinitionContext(parser, parent, invokingState) { if(parent===undefined) { parent = null; } @@ -9482,69 +9436,71 @@ function DefineDirectiveContext(parser, parent, invokingState) { } antlr4.ParserRuleContext.call(this, parent, invokingState); this.parser = parser; - this.ruleIndex = CParser.RULE_defineDirective; + this.ruleIndex = CParser.RULE_functionDefinition; return this; } -DefineDirectiveContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -DefineDirectiveContext.prototype.constructor = DefineDirectiveContext; +FunctionDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +FunctionDefinitionContext.prototype.constructor = FunctionDefinitionContext; + +FunctionDefinitionContext.prototype.declarator = function() { + return this.getTypedRuleContext(DeclaratorContext,0); +}; -DefineDirectiveContext.prototype.defineDirectiveWithParams = function() { - return this.getTypedRuleContext(DefineDirectiveWithParamsContext,0); +FunctionDefinitionContext.prototype.compoundStatement = function() { + return this.getTypedRuleContext(CompoundStatementContext,0); }; -DefineDirectiveContext.prototype.defineDirectiveNoParams = function() { - return this.getTypedRuleContext(DefineDirectiveNoParamsContext,0); +FunctionDefinitionContext.prototype.declarationSpecifiers = function() { + return this.getTypedRuleContext(DeclarationSpecifiersContext,0); }; -DefineDirectiveContext.prototype.defineDirectiveNoVal = function() { - return this.getTypedRuleContext(DefineDirectiveNoValContext,0); +FunctionDefinitionContext.prototype.declarationList = function() { + return this.getTypedRuleContext(DeclarationListContext,0); }; -DefineDirectiveContext.prototype.enterRule = function(listener) { +FunctionDefinitionContext.prototype.enterRule = function(listener) { if(listener instanceof CListener ) { - listener.enterDefineDirective(this); + listener.enterFunctionDefinition(this); } }; -DefineDirectiveContext.prototype.exitRule = function(listener) { +FunctionDefinitionContext.prototype.exitRule = function(listener) { if(listener instanceof CListener ) { - listener.exitDefineDirective(this); + listener.exitFunctionDefinition(this); } }; -CParser.DefineDirectiveContext = DefineDirectiveContext; +CParser.FunctionDefinitionContext = FunctionDefinitionContext; -CParser.prototype.defineDirective = function() { +CParser.prototype.functionDefinition = function() { - var localctx = new DefineDirectiveContext(this, this._ctx, this.state); - this.enterRule(localctx, 166, CParser.RULE_defineDirective); + var localctx = new FunctionDefinitionContext(this, this._ctx, this.state); + this.enterRule(localctx, 166, CParser.RULE_functionDefinition); + var _la = 0; // Token type try { - this.state = 1259; + this.enterOuterAlt(localctx, 1); + this.state = 1240; var la_ = this._interp.adaptivePredict(this._input,135,this._ctx); - switch(la_) { - case 1: - this.enterOuterAlt(localctx, 1); - this.state = 1256; - this.defineDirectiveWithParams(); - break; - - case 2: - this.enterOuterAlt(localctx, 2); - this.state = 1257; - this.defineDirectiveNoParams(); - break; - - case 3: - this.enterOuterAlt(localctx, 3); - this.state = 1258; - this.defineDirectiveNoVal(); - break; + if(la_===1) { + this.state = 1239; + this.declarationSpecifiers(); } + this.state = 1242; + this.declarator(); + this.state = 1244; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 1243; + this.declarationList(0); + } + + this.state = 1246; + this.compoundStatement(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { localctx.exception = re; @@ -9559,7 +9515,7 @@ CParser.prototype.defineDirective = function() { return localctx; }; -function DefineDirectiveNoValContext(parser, parent, invokingState) { +function DeclarationListContext(parser, parent, invokingState) { if(parent===undefined) { parent = null; } @@ -9568,567 +9524,15 @@ function DefineDirectiveNoValContext(parser, parent, invokingState) { } antlr4.ParserRuleContext.call(this, parent, invokingState); this.parser = parser; - this.ruleIndex = CParser.RULE_defineDirectiveNoVal; + this.ruleIndex = CParser.RULE_declarationList; return this; } -DefineDirectiveNoValContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -DefineDirectiveNoValContext.prototype.constructor = DefineDirectiveNoValContext; +DeclarationListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DeclarationListContext.prototype.constructor = DeclarationListContext; -DefineDirectiveNoValContext.prototype.Identifier = function() { - return this.getToken(CParser.Identifier, 0); -}; - -DefineDirectiveNoValContext.prototype.enterRule = function(listener) { - if(listener instanceof CListener ) { - listener.enterDefineDirectiveNoVal(this); - } -}; - -DefineDirectiveNoValContext.prototype.exitRule = function(listener) { - if(listener instanceof CListener ) { - listener.exitDefineDirectiveNoVal(this); - } -}; - - - - -CParser.DefineDirectiveNoValContext = DefineDirectiveNoValContext; - -CParser.prototype.defineDirectiveNoVal = function() { - - var localctx = new DefineDirectiveNoValContext(this, this._ctx, this.state); - this.enterRule(localctx, 168, CParser.RULE_defineDirectiveNoVal); - try { - this.enterOuterAlt(localctx, 1); - this.state = 1261; - this.match(CParser.T__14); - this.state = 1262; - this.match(CParser.T__16); - this.state = 1263; - this.match(CParser.Identifier); - } catch (re) { - if(re instanceof antlr4.error.RecognitionException) { - localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } finally { - this.exitRule(); - } - return localctx; -}; - -function DefineDirectiveNoParamsContext(parser, parent, invokingState) { - if(parent===undefined) { - parent = null; - } - if(invokingState===undefined || invokingState===null) { - invokingState = -1; - } - antlr4.ParserRuleContext.call(this, parent, invokingState); - this.parser = parser; - this.ruleIndex = CParser.RULE_defineDirectiveNoParams; - return this; -} - -DefineDirectiveNoParamsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -DefineDirectiveNoParamsContext.prototype.constructor = DefineDirectiveNoParamsContext; - -DefineDirectiveNoParamsContext.prototype.Identifier = function() { - return this.getToken(CParser.Identifier, 0); -}; - -DefineDirectiveNoParamsContext.prototype.macroResult = function() { - return this.getTypedRuleContext(MacroResultContext,0); -}; - -DefineDirectiveNoParamsContext.prototype.enterRule = function(listener) { - if(listener instanceof CListener ) { - listener.enterDefineDirectiveNoParams(this); - } -}; - -DefineDirectiveNoParamsContext.prototype.exitRule = function(listener) { - if(listener instanceof CListener ) { - listener.exitDefineDirectiveNoParams(this); - } -}; - - - - -CParser.DefineDirectiveNoParamsContext = DefineDirectiveNoParamsContext; - -CParser.prototype.defineDirectiveNoParams = function() { - - var localctx = new DefineDirectiveNoParamsContext(this, this._ctx, this.state); - this.enterRule(localctx, 170, CParser.RULE_defineDirectiveNoParams); - try { - this.enterOuterAlt(localctx, 1); - this.state = 1265; - this.match(CParser.T__14); - this.state = 1266; - this.match(CParser.T__16); - this.state = 1267; - this.match(CParser.Identifier); - this.state = 1268; - this.macroResult(); - } catch (re) { - if(re instanceof antlr4.error.RecognitionException) { - localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } finally { - this.exitRule(); - } - return localctx; -}; - -function DefineDirectiveWithParamsContext(parser, parent, invokingState) { - if(parent===undefined) { - parent = null; - } - if(invokingState===undefined || invokingState===null) { - invokingState = -1; - } - antlr4.ParserRuleContext.call(this, parent, invokingState); - this.parser = parser; - this.ruleIndex = CParser.RULE_defineDirectiveWithParams; - return this; -} - -DefineDirectiveWithParamsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -DefineDirectiveWithParamsContext.prototype.constructor = DefineDirectiveWithParamsContext; - -DefineDirectiveWithParamsContext.prototype.Identifier = function() { - return this.getToken(CParser.Identifier, 0); -}; - -DefineDirectiveWithParamsContext.prototype.macroParamList = function() { - return this.getTypedRuleContext(MacroParamListContext,0); -}; - -DefineDirectiveWithParamsContext.prototype.macroResult = function() { - return this.getTypedRuleContext(MacroResultContext,0); -}; - -DefineDirectiveWithParamsContext.prototype.enterRule = function(listener) { - if(listener instanceof CListener ) { - listener.enterDefineDirectiveWithParams(this); - } -}; - -DefineDirectiveWithParamsContext.prototype.exitRule = function(listener) { - if(listener instanceof CListener ) { - listener.exitDefineDirectiveWithParams(this); - } -}; - - - - -CParser.DefineDirectiveWithParamsContext = DefineDirectiveWithParamsContext; - -CParser.prototype.defineDirectiveWithParams = function() { - - var localctx = new DefineDirectiveWithParamsContext(this, this._ctx, this.state); - this.enterRule(localctx, 172, CParser.RULE_defineDirectiveWithParams); - try { - this.enterOuterAlt(localctx, 1); - this.state = 1270; - this.match(CParser.T__14); - this.state = 1271; - this.match(CParser.T__16); - this.state = 1272; - this.match(CParser.Identifier); - this.state = 1273; - this.match(CParser.LeftParen); - this.state = 1274; - this.macroParamList(0); - this.state = 1275; - this.match(CParser.RightParen); - this.state = 1276; - this.macroResult(); - } catch (re) { - if(re instanceof antlr4.error.RecognitionException) { - localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } finally { - this.exitRule(); - } - return localctx; -}; - -function MacroResultContext(parser, parent, invokingState) { - if(parent===undefined) { - parent = null; - } - if(invokingState===undefined || invokingState===null) { - invokingState = -1; - } - antlr4.ParserRuleContext.call(this, parent, invokingState); - this.parser = parser; - this.ruleIndex = CParser.RULE_macroResult; - return this; -} - -MacroResultContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -MacroResultContext.prototype.constructor = MacroResultContext; - -MacroResultContext.prototype.expression = function() { - return this.getTypedRuleContext(ExpressionContext,0); -}; - -MacroResultContext.prototype.enterRule = function(listener) { - if(listener instanceof CListener ) { - listener.enterMacroResult(this); - } -}; - -MacroResultContext.prototype.exitRule = function(listener) { - if(listener instanceof CListener ) { - listener.exitMacroResult(this); - } -}; - - - - -CParser.MacroResultContext = MacroResultContext; - -CParser.prototype.macroResult = function() { - - var localctx = new MacroResultContext(this, this._ctx, this.state); - this.enterRule(localctx, 174, CParser.RULE_macroResult); - try { - this.enterOuterAlt(localctx, 1); - this.state = 1278; - this.expression(0); - } catch (re) { - if(re instanceof antlr4.error.RecognitionException) { - localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } finally { - this.exitRule(); - } - return localctx; -}; - -function MacroParamListContext(parser, parent, invokingState) { - if(parent===undefined) { - parent = null; - } - if(invokingState===undefined || invokingState===null) { - invokingState = -1; - } - antlr4.ParserRuleContext.call(this, parent, invokingState); - this.parser = parser; - this.ruleIndex = CParser.RULE_macroParamList; - return this; -} - -MacroParamListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -MacroParamListContext.prototype.constructor = MacroParamListContext; - -MacroParamListContext.prototype.Identifier = function() { - return this.getToken(CParser.Identifier, 0); -}; - -MacroParamListContext.prototype.macroParamList = function() { - return this.getTypedRuleContext(MacroParamListContext,0); -}; - -MacroParamListContext.prototype.enterRule = function(listener) { - if(listener instanceof CListener ) { - listener.enterMacroParamList(this); - } -}; - -MacroParamListContext.prototype.exitRule = function(listener) { - if(listener instanceof CListener ) { - listener.exitMacroParamList(this); - } -}; - - - -CParser.prototype.macroParamList = function(_p) { - if(_p===undefined) { - _p = 0; - } - var _parentctx = this._ctx; - var _parentState = this.state; - var localctx = new MacroParamListContext(this, this._ctx, _parentState); - var _prevctx = localctx; - var _startState = 176; - this.enterRecursionRule(localctx, 176, CParser.RULE_macroParamList, _p); - try { - this.enterOuterAlt(localctx, 1); - this.state = 1281; - this.match(CParser.Identifier); - this._ctx.stop = this._input.LT(-1); - this.state = 1288; - this._errHandler.sync(this); - var _alt = this._interp.adaptivePredict(this._input,136,this._ctx) - while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { - if(_alt===1) { - if(this._parseListeners!==null) { - this.triggerExitRuleEvent(); - } - _prevctx = localctx; - localctx = new MacroParamListContext(this, _parentctx, _parentState); - this.pushNewRecursionContext(localctx, _startState, CParser.RULE_macroParamList); - this.state = 1283; - if (!( this.precpred(this._ctx, 1))) { - throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); - } - this.state = 1284; - this.match(CParser.Comma); - this.state = 1285; - this.match(CParser.Identifier); - } - this.state = 1290; - this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input,136,this._ctx); - } - - } catch( error) { - if(error instanceof antlr4.error.RecognitionException) { - localctx.exception = error; - this._errHandler.reportError(this, error); - this._errHandler.recover(this, error); - } else { - throw error; - } - } finally { - this.unrollRecursionContexts(_parentctx) - } - return localctx; -}; - -function ExternalDeclarationContext(parser, parent, invokingState) { - if(parent===undefined) { - parent = null; - } - if(invokingState===undefined || invokingState===null) { - invokingState = -1; - } - antlr4.ParserRuleContext.call(this, parent, invokingState); - this.parser = parser; - this.ruleIndex = CParser.RULE_externalDeclaration; - return this; -} - -ExternalDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -ExternalDeclarationContext.prototype.constructor = ExternalDeclarationContext; - -ExternalDeclarationContext.prototype.functionDefinition = function() { - return this.getTypedRuleContext(FunctionDefinitionContext,0); -}; - -ExternalDeclarationContext.prototype.declaration = function() { - return this.getTypedRuleContext(DeclarationContext,0); -}; - -ExternalDeclarationContext.prototype.includeDirective = function() { - return this.getTypedRuleContext(IncludeDirectiveContext,0); -}; - -ExternalDeclarationContext.prototype.defineDirective = function() { - return this.getTypedRuleContext(DefineDirectiveContext,0); -}; - -ExternalDeclarationContext.prototype.enterRule = function(listener) { - if(listener instanceof CListener ) { - listener.enterExternalDeclaration(this); - } -}; - -ExternalDeclarationContext.prototype.exitRule = function(listener) { - if(listener instanceof CListener ) { - listener.exitExternalDeclaration(this); - } -}; - - - - -CParser.ExternalDeclarationContext = ExternalDeclarationContext; - -CParser.prototype.externalDeclaration = function() { - - var localctx = new ExternalDeclarationContext(this, this._ctx, this.state); - this.enterRule(localctx, 178, CParser.RULE_externalDeclaration); - try { - this.state = 1296; - var la_ = this._interp.adaptivePredict(this._input,137,this._ctx); - switch(la_) { - case 1: - this.enterOuterAlt(localctx, 1); - this.state = 1291; - this.functionDefinition(); - break; - - case 2: - this.enterOuterAlt(localctx, 2); - this.state = 1292; - this.declaration(); - break; - - case 3: - this.enterOuterAlt(localctx, 3); - this.state = 1293; - this.includeDirective(); - break; - - case 4: - this.enterOuterAlt(localctx, 4); - this.state = 1294; - this.defineDirective(); - break; - - case 5: - this.enterOuterAlt(localctx, 5); - this.state = 1295; - this.match(CParser.Semi); - break; - - } - } catch (re) { - if(re instanceof antlr4.error.RecognitionException) { - localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } finally { - this.exitRule(); - } - return localctx; -}; - -function FunctionDefinitionContext(parser, parent, invokingState) { - if(parent===undefined) { - parent = null; - } - if(invokingState===undefined || invokingState===null) { - invokingState = -1; - } - antlr4.ParserRuleContext.call(this, parent, invokingState); - this.parser = parser; - this.ruleIndex = CParser.RULE_functionDefinition; - return this; -} - -FunctionDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -FunctionDefinitionContext.prototype.constructor = FunctionDefinitionContext; - -FunctionDefinitionContext.prototype.declarator = function() { - return this.getTypedRuleContext(DeclaratorContext,0); -}; - -FunctionDefinitionContext.prototype.compoundStatement = function() { - return this.getTypedRuleContext(CompoundStatementContext,0); -}; - -FunctionDefinitionContext.prototype.declarationSpecifiers = function() { - return this.getTypedRuleContext(DeclarationSpecifiersContext,0); -}; - -FunctionDefinitionContext.prototype.declarationList = function() { - return this.getTypedRuleContext(DeclarationListContext,0); -}; - -FunctionDefinitionContext.prototype.enterRule = function(listener) { - if(listener instanceof CListener ) { - listener.enterFunctionDefinition(this); - } -}; - -FunctionDefinitionContext.prototype.exitRule = function(listener) { - if(listener instanceof CListener ) { - listener.exitFunctionDefinition(this); - } -}; - - - - -CParser.FunctionDefinitionContext = FunctionDefinitionContext; - -CParser.prototype.functionDefinition = function() { - - var localctx = new FunctionDefinitionContext(this, this._ctx, this.state); - this.enterRule(localctx, 180, CParser.RULE_functionDefinition); - var _la = 0; // Token type - try { - this.enterOuterAlt(localctx, 1); - this.state = 1299; - var la_ = this._interp.adaptivePredict(this._input,138,this._ctx); - if(la_===1) { - this.state = 1298; - this.declarationSpecifiers(); - - } - this.state = 1301; - this.declarator(); - this.state = 1303; - _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Inline - 34)) | (1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Register - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Alignas - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.Noreturn - 34)) | (1 << (CParser.StaticAssert - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0) || _la===CParser.Identifier) { - this.state = 1302; - this.declarationList(0); - } - - this.state = 1305; - this.compoundStatement(); - } catch (re) { - if(re instanceof antlr4.error.RecognitionException) { - localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } finally { - this.exitRule(); - } - return localctx; -}; - -function DeclarationListContext(parser, parent, invokingState) { - if(parent===undefined) { - parent = null; - } - if(invokingState===undefined || invokingState===null) { - invokingState = -1; - } - antlr4.ParserRuleContext.call(this, parent, invokingState); - this.parser = parser; - this.ruleIndex = CParser.RULE_declarationList; - return this; -} - -DeclarationListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); -DeclarationListContext.prototype.constructor = DeclarationListContext; - -DeclarationListContext.prototype.declaration = function() { - return this.getTypedRuleContext(DeclarationContext,0); +DeclarationListContext.prototype.declaration = function() { + return this.getTypedRuleContext(DeclarationContext,0); }; DeclarationListContext.prototype.declarationList = function() { @@ -10157,16 +9561,16 @@ CParser.prototype.declarationList = function(_p) { var _parentState = this.state; var localctx = new DeclarationListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 182; - this.enterRecursionRule(localctx, 182, CParser.RULE_declarationList, _p); + var _startState = 168; + this.enterRecursionRule(localctx, 168, CParser.RULE_declarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1308; + this.state = 1249; this.declaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1314; + this.state = 1255; this._errHandler.sync(this); - var _alt = this._interp.adaptivePredict(this._input,140,this._ctx) + var _alt = this._interp.adaptivePredict(this._input,137,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { if(this._parseListeners!==null) { @@ -10175,16 +9579,16 @@ CParser.prototype.declarationList = function(_p) { _prevctx = localctx; localctx = new DeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_declarationList); - this.state = 1310; + this.state = 1251; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1311; + this.state = 1252; this.declaration(); } - this.state = 1316; + this.state = 1257; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input,140,this._ctx); + _alt = this._interp.adaptivePredict(this._input,137,this._ctx); } } catch( error) { @@ -10258,9 +9662,7 @@ CParser.prototype.sempred = function(localctx, ruleIndex, predIndex) { return this.blockItemList_sempred(localctx, predIndex); case 81: return this.translationUnit_sempred(localctx, predIndex); - case 88: - return this.macroParamList_sempred(localctx, predIndex); - case 91: + case 84: return this.declarationList_sempred(localctx, predIndex); default: throw "No predicate with index:" + ruleIndex; @@ -10554,18 +9956,9 @@ CParser.prototype.translationUnit_sempred = function(localctx, predIndex) { } }; -CParser.prototype.macroParamList_sempred = function(localctx, predIndex) { - switch(predIndex) { - case 49: - return this.precpred(this._ctx, 1); - default: - throw "No predicate with index:" + predIndex; - } -}; - CParser.prototype.declarationList_sempred = function(localctx, predIndex) { switch(predIndex) { - case 50: + case 49: return this.precpred(this._ctx, 1); default: throw "No predicate with index:" + predIndex; diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 85516722..d44f16e6 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -133,6 +133,31 @@ config.SHAPE_CALLBACK = (opts, node) -> return opts.knownFunctions[node.children[0].children[0].children[0].data.text].shape return null +config.isComment = -> + text.match(/^(\s*\/\/.*)|(#.*)$/)? + +config.parseComment = -> + # Try standard comment + comment = text.match(/^(\s*\/\/)(.*)$/) + if comment? + return [ + [comment[1].length, comment[1].length + comment[2].length] + ] + + # Try #include or #ifdef directive + unary = text.match(/^(#\s*(?:(?:include)|(?:ifdef)|(?:ifndef))\s*)(.*)$/) + if unary? + return [ + [unary[1].length, unary[1].length + unary[2].length] + ] + + # Try #define directive + binary = text.match(/^(#\s*(?:(?:define))\s*)(.*)$/) + if binary? + return [ + [binary[1].length, binary[1].length + binary[2].length] + ] + # TODO Implement removing parentheses at some point #config.unParenWrap = (leading, trailing, node, context) -> # while true diff --git a/src/treewalk.coffee b/src/treewalk.coffee index a1ade178..d55fc7f0 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -14,10 +14,13 @@ exports.createTreewalkParser = (parse, config, root) -> @lines = @text.split '\n' isComment: (text) -> - text.match(/^\s*\/\/.*$/) + if config?.isComment? + return config.isComment(text) + else + return false - indentAndCommentMarker: (text) -> - text.match(/^\s*\/\//)[0] + parseComment: (text) -> + return config.parseComment text markRoot: (context = root) -> parseTree = parse(context, @text) From 36b8dca62d78f7bee4b3d926781e3f94188d3c39 Mon Sep 17 00:00:00 2001 From: Takahiko Tsuchiya Date: Wed, 15 Jun 2016 20:17:27 -0400 Subject: [PATCH 120/268] fix text-paste with the hiddenInput value not updating --- src/controller.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controller.coffee b/src/controller.coffee index 7b0c9d55..a66e135f 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -868,6 +868,7 @@ class CapturePoint Editor::setFocusedText = (value) -> if @getCursor().type is 'socket' @populateSocket @getCursor(), value + @hiddenInput.value = value @redrawMain() # BASIC BLOCK MOVE SUPPORT From caf926f1df54d051741f54a6bc860e8c406686da Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 16 Jun 2016 13:32:14 -0400 Subject: [PATCH 121/268] Finish pipeline for comment style directives --- antlr/C.g4 | 1 + antlr/CParser.js | 905 +++++++++++++++++++++-------------------- src/antlr.coffee | 18 +- src/languages/c.coffee | 20 +- src/parser.coffee | 75 +++- 5 files changed, 547 insertions(+), 472 deletions(-) diff --git a/antlr/C.g4 b/antlr/C.g4 index b7518eb1..31fe5aee 100644 --- a/antlr/C.g4 +++ b/antlr/C.g4 @@ -507,6 +507,7 @@ jumpStatement compilationUnit : translationUnit? EOF + | ; translationUnit diff --git a/antlr/CParser.js b/antlr/CParser.js index 5281f392..6262df06 100644 --- a/antlr/CParser.js +++ b/antlr/CParser.js @@ -5,7 +5,7 @@ var CListener = require('./CListener').CListener; var grammarFileName = "C.g4"; var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\3s\u04ed\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", + "\3s\u04ef\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", "\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t", "\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27", "\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4", @@ -89,416 +89,417 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "P\u0499\nP\3P\3P\5P\u049d\nP\3P\3P\5P\u04a1\nP\3P\3P\3P\3P\3P\3P\5P", "\u04a9\nP\3P\3P\5P\u04ad\nP\3P\3P\3P\5P\u04b2\nP\3Q\3Q\3Q\3Q\3Q\3Q\3", "Q\3Q\3Q\5Q\u04bd\nQ\3Q\3Q\3Q\3Q\3Q\5Q\u04c4\nQ\3R\5R\u04c7\nR\3R\3R", - "\3S\3S\3S\3S\3S\7S\u04d0\nS\fS\16S\u04d3\13S\3T\3T\3T\5T\u04d8\nT\3", - "U\5U\u04db\nU\3U\3U\5U\u04df\nU\3U\3U\3V\3V\3V\3V\3V\7V\u04e8\nV\fV", - "\16V\u04eb\13V\3V\2\36\6\n\f\24\26\30\32\34\36 \"$&.:HNTdrvz\u0080\u0086", - "\u008a\u0096\u00a4\u00aaW\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"", - "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082", - "\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a", - "\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\2\16\7\2IIKKMMPPUV", - "\3\2[e\b\2\21\21\34\34$$**--<<\n\2\6\b\24\24\31\31\35\35\"#\'(/\60\66", - "\67\3\2\6\b\4\2++..\6\2\25\25%%\61\61\65\65\5\2\n\13!!::\4\2=>ZZ\3\2", - "=>\4\2\r\r\17\17\4\2\20\20\61\61\u055c\2\u00cd\3\2\2\2\4\u00cf\3\2\2", - "\2\6\u00d6\3\2\2\2\b\u00e8\3\2\2\2\n\u010c\3\2\2\2\f\u0128\3\2\2\2\16", - "\u0149\3\2\2\2\20\u014b\3\2\2\2\22\u0159\3\2\2\2\24\u015b\3\2\2\2\26", - "\u016c\3\2\2\2\30\u017a\3\2\2\2\32\u0188\3\2\2\2\34\u019c\3\2\2\2\36", - "\u01aa\3\2\2\2 \u01b5\3\2\2\2\"\u01c0\3\2\2\2$\u01cb\3\2\2\2&\u01d6", - "\3\2\2\2(\u01e1\3\2\2\2*\u01ee\3\2\2\2,\u01f0\3\2\2\2.\u01f2\3\2\2\2", - "\60\u01fd\3\2\2\2\62\u0206\3\2\2\2\64\u0209\3\2\2\2\66\u020e\3\2\2\2", - "8\u0217\3\2\2\2:\u0219\3\2\2\2<\u0229\3\2\2\2>\u022b\3\2\2\2@\u023b", - "\3\2\2\2B\u0246\3\2\2\2D\u0248\3\2\2\2F\u024a\3\2\2\2H\u024e\3\2\2\2", - "J\u025f\3\2\2\2L\u0269\3\2\2\2N\u026b\3\2\2\2P\u027c\3\2\2\2R\u0291", - "\3\2\2\2T\u0293\3\2\2\2V\u02a3\3\2\2\2X\u02a5\3\2\2\2Z\u02a7\3\2\2\2", - "\\\u02ac\3\2\2\2^\u02b4\3\2\2\2`\u02c0\3\2\2\2b\u02c3\3\2\2\2d\u02d2", - "\3\2\2\2f\u030d\3\2\2\2h\u030f\3\2\2\2j\u031f\3\2\2\2l\u032a\3\2\2\2", - "n\u0333\3\2\2\2p\u0348\3\2\2\2r\u034a\3\2\2\2t\u0359\3\2\2\2v\u035b", - "\3\2\2\2x\u036d\3\2\2\2z\u036f\3\2\2\2|\u037a\3\2\2\2~\u0389\3\2\2\2", - "\u0080\u03b9\3\2\2\2\u0082\u03e9\3\2\2\2\u0084\u03f5\3\2\2\2\u0086\u03f7", - "\3\2\2\2\u0088\u0408\3\2\2\2\u008a\u040b\3\2\2\2\u008c\u041b\3\2\2\2", - "\u008e\u041d\3\2\2\2\u0090\u044e\3\2\2\2\u0092\u045b\3\2\2\2\u0094\u045d", - "\3\2\2\2\u0096\u0463\3\2\2\2\u0098\u046f\3\2\2\2\u009a\u0472\3\2\2\2", - "\u009c\u0485\3\2\2\2\u009e\u04b1\3\2\2\2\u00a0\u04c3\3\2\2\2\u00a2\u04c6", - "\3\2\2\2\u00a4\u04ca\3\2\2\2\u00a6\u04d7\3\2\2\2\u00a8\u04da\3\2\2\2", - "\u00aa\u04e2\3\2\2\2\u00ac\u00ce\7k\2\2\u00ad\u00ce\7l\2\2\u00ae\u00b0", - "\7m\2\2\u00af\u00ae\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00af\3\2\2\2", - "\u00b1\u00b2\3\2\2\2\u00b2\u00ce\3\2\2\2\u00b3\u00b4\7=\2\2\u00b4\u00b5", - "\5.\30\2\u00b5\u00b6\7>\2\2\u00b6\u00ce\3\2\2\2\u00b7\u00ce\5\4\3\2", - "\u00b8\u00ba\7\3\2\2\u00b9\u00b8\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00bb", - "\3\2\2\2\u00bb\u00bc\7=\2\2\u00bc\u00bd\5\u0094K\2\u00bd\u00be\7>\2", - "\2\u00be\u00ce\3\2\2\2\u00bf\u00c0\7\4\2\2\u00c0\u00c1\7=\2\2\u00c1", - "\u00c2\5\16\b\2\u00c2\u00c3\7Z\2\2\u00c3\u00c4\5|?\2\u00c4\u00c5\7>", - "\2\2\u00c5\u00ce\3\2\2\2\u00c6\u00c7\7\5\2\2\u00c7\u00c8\7=\2\2\u00c8", - "\u00c9\5|?\2\u00c9\u00ca\7Z\2\2\u00ca\u00cb\5\16\b\2\u00cb\u00cc\7>", - "\2\2\u00cc\u00ce\3\2\2\2\u00cd\u00ac\3\2\2\2\u00cd\u00ad\3\2\2\2\u00cd", - "\u00af\3\2\2\2\u00cd\u00b3\3\2\2\2\u00cd\u00b7\3\2\2\2\u00cd\u00b9\3", - "\2\2\2\u00cd\u00bf\3\2\2\2\u00cd\u00c6\3\2\2\2\u00ce\3\3\2\2\2\u00cf", - "\u00d0\78\2\2\u00d0\u00d1\7=\2\2\u00d1\u00d2\5*\26\2\u00d2\u00d3\7Z", - "\2\2\u00d3\u00d4\5\6\4\2\u00d4\u00d5\7>\2\2\u00d5\5\3\2\2\2\u00d6\u00d7", - "\b\4\1\2\u00d7\u00d8\5\b\5\2\u00d8\u00de\3\2\2\2\u00d9\u00da\f\3\2\2", - "\u00da\u00db\7Z\2\2\u00db\u00dd\5\b\5\2\u00dc\u00d9\3\2\2\2\u00dd\u00e0", - "\3\2\2\2\u00de\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df\7\3\2\2\2\u00e0", - "\u00de\3\2\2\2\u00e1\u00e2\5|?\2\u00e2\u00e3\7X\2\2\u00e3\u00e4\5*\26", - "\2\u00e4\u00e9\3\2\2\2\u00e5\u00e6\7\27\2\2\u00e6\u00e7\7X\2\2\u00e7", - "\u00e9\5*\26\2\u00e8\u00e1\3\2\2\2\u00e8\u00e5\3\2\2\2\u00e9\t\3\2\2", - "\2\u00ea\u00eb\b\6\1\2\u00eb\u010d\5\2\2\2\u00ec\u00ed\7=\2\2\u00ed", - "\u00ee\5|?\2\u00ee\u00ef\7>\2\2\u00ef\u00f0\7A\2\2\u00f0\u00f1\5\u0086", - "D\2\u00f1\u00f2\7B\2\2\u00f2\u010d\3\2\2\2\u00f3\u00f4\7=\2\2\u00f4", - "\u00f5\5|?\2\u00f5\u00f6\7>\2\2\u00f6\u00f7\7A\2\2\u00f7\u00f8\5\u0086", - "D\2\u00f8\u00f9\7Z\2\2\u00f9\u00fa\7B\2\2\u00fa\u010d\3\2\2\2\u00fb", - "\u00fc\7\3\2\2\u00fc\u00fd\7=\2\2\u00fd\u00fe\5|?\2\u00fe\u00ff\7>\2", - "\2\u00ff\u0100\7A\2\2\u0100\u0101\5\u0086D\2\u0101\u0102\7B\2\2\u0102", - "\u010d\3\2\2\2\u0103\u0104\7\3\2\2\u0104\u0105\7=\2\2\u0105\u0106\5", - "|?\2\u0106\u0107\7>\2\2\u0107\u0108\7A\2\2\u0108\u0109\5\u0086D\2\u0109", - "\u010a\7Z\2\2\u010a\u010b\7B\2\2\u010b\u010d\3\2\2\2\u010c\u00ea\3\2", - "\2\2\u010c\u00ec\3\2\2\2\u010c\u00f3\3\2\2\2\u010c\u00fb\3\2\2\2\u010c", - "\u0103\3\2\2\2\u010d\u0125\3\2\2\2\u010e\u010f\f\f\2\2\u010f\u0110\7", - "?\2\2\u0110\u0111\5.\30\2\u0111\u0112\7@\2\2\u0112\u0124\3\2\2\2\u0113", - "\u0114\f\13\2\2\u0114\u0116\7=\2\2\u0115\u0117\5\f\7\2\u0116\u0115\3", - "\2\2\2\u0116\u0117\3\2\2\2\u0117\u0118\3\2\2\2\u0118\u0124\7>\2\2\u0119", - "\u011a\f\n\2\2\u011a\u011b\7i\2\2\u011b\u0124\7k\2\2\u011c\u011d\f\t", - "\2\2\u011d\u011e\7h\2\2\u011e\u0124\7k\2\2\u011f\u0120\f\b\2\2\u0120", - "\u0124\7J\2\2\u0121\u0122\f\7\2\2\u0122\u0124\7L\2\2\u0123\u010e\3\2", - "\2\2\u0123\u0113\3\2\2\2\u0123\u0119\3\2\2\2\u0123\u011c\3\2\2\2\u0123", - "\u011f\3\2\2\2\u0123\u0121\3\2\2\2\u0124\u0127\3\2\2\2\u0125\u0123\3", - "\2\2\2\u0125\u0126\3\2\2\2\u0126\13\3\2\2\2\u0127\u0125\3\2\2\2\u0128", - "\u0129\b\7\1\2\u0129\u012a\5*\26\2\u012a\u0130\3\2\2\2\u012b\u012c\f", - "\3\2\2\u012c\u012d\7Z\2\2\u012d\u012f\5*\26\2\u012e\u012b\3\2\2\2\u012f", - "\u0132\3\2\2\2\u0130\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131\r\3\2\2", - "\2\u0132\u0130\3\2\2\2\u0133\u014a\5\n\6\2\u0134\u0135\7J\2\2\u0135", - "\u014a\5\16\b\2\u0136\u0137\7L\2\2\u0137\u014a\5\16\b\2\u0138\u0139", - "\5\20\t\2\u0139\u013a\5\22\n\2\u013a\u014a\3\2\2\2\u013b\u013c\7)\2", - "\2\u013c\u014a\5\16\b\2\u013d\u013e\7)\2\2\u013e\u013f\7=\2\2\u013f", - "\u0140\5|?\2\u0140\u0141\7>\2\2\u0141\u014a\3\2\2\2\u0142\u0143\7\64", - "\2\2\u0143\u0144\7=\2\2\u0144\u0145\5|?\2\u0145\u0146\7>\2\2\u0146\u014a", - "\3\2\2\2\u0147\u0148\7R\2\2\u0148\u014a\7k\2\2\u0149\u0133\3\2\2\2\u0149", - "\u0134\3\2\2\2\u0149\u0136\3\2\2\2\u0149\u0138\3\2\2\2\u0149\u013b\3", - "\2\2\2\u0149\u013d\3\2\2\2\u0149\u0142\3\2\2\2\u0149\u0147\3\2\2\2\u014a", - "\17\3\2\2\2\u014b\u014c\t\2\2\2\u014c\21\3\2\2\2\u014d\u015a\5\16\b", - "\2\u014e\u014f\7=\2\2\u014f\u0150\5|?\2\u0150\u0151\7>\2\2\u0151\u0152", - "\5\22\n\2\u0152\u015a\3\2\2\2\u0153\u0154\7\3\2\2\u0154\u0155\7=\2\2", - "\u0155\u0156\5|?\2\u0156\u0157\7>\2\2\u0157\u0158\5\22\n\2\u0158\u015a", - "\3\2\2\2\u0159\u014d\3\2\2\2\u0159\u014e\3\2\2\2\u0159\u0153\3\2\2\2", - "\u015a\23\3\2\2\2\u015b\u015c\b\13\1\2\u015c\u015d\5\22\n\2\u015d\u0169", - "\3\2\2\2\u015e\u015f\f\5\2\2\u015f\u0160\7M\2\2\u0160\u0168\5\22\n\2", - "\u0161\u0162\f\4\2\2\u0162\u0163\7N\2\2\u0163\u0168\5\22\n\2\u0164\u0165", - "\f\3\2\2\u0165\u0166\7O\2\2\u0166\u0168\5\22\n\2\u0167\u015e\3\2\2\2", - "\u0167\u0161\3\2\2\2\u0167\u0164\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u0167", - "\3\2\2\2\u0169\u016a\3\2\2\2\u016a\25\3\2\2\2\u016b\u0169\3\2\2\2\u016c", - "\u016d\b\f\1\2\u016d\u016e\5\24\13\2\u016e\u0177\3\2\2\2\u016f\u0170", - "\f\4\2\2\u0170\u0171\7I\2\2\u0171\u0176\5\24\13\2\u0172\u0173\f\3\2", - "\2\u0173\u0174\7K\2\2\u0174\u0176\5\24\13\2\u0175\u016f\3\2\2\2\u0175", - "\u0172\3\2\2\2\u0176\u0179\3\2\2\2\u0177\u0175\3\2\2\2\u0177\u0178\3", - "\2\2\2\u0178\27\3\2\2\2\u0179\u0177\3\2\2\2\u017a\u017b\b\r\1\2\u017b", - "\u017c\5\26\f\2\u017c\u0185\3\2\2\2\u017d\u017e\f\4\2\2\u017e\u017f", - "\7G\2\2\u017f\u0184\5\26\f\2\u0180\u0181\f\3\2\2\u0181\u0182\7H\2\2", - "\u0182\u0184\5\26\f\2\u0183\u017d\3\2\2\2\u0183\u0180\3\2\2\2\u0184", - "\u0187\3\2\2\2\u0185\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\31\3\2", - "\2\2\u0187\u0185\3\2\2\2\u0188\u0189\b\16\1\2\u0189\u018a\5\30\r\2\u018a", - "\u0199\3\2\2\2\u018b\u018c\f\6\2\2\u018c\u018d\7C\2\2\u018d\u0198\5", - "\30\r\2\u018e\u018f\f\5\2\2\u018f\u0190\7E\2\2\u0190\u0198\5\30\r\2", - "\u0191\u0192\f\4\2\2\u0192\u0193\7D\2\2\u0193\u0198\5\30\r\2\u0194\u0195", - "\f\3\2\2\u0195\u0196\7F\2\2\u0196\u0198\5\30\r\2\u0197\u018b\3\2\2\2", - "\u0197\u018e\3\2\2\2\u0197\u0191\3\2\2\2\u0197\u0194\3\2\2\2\u0198\u019b", - "\3\2\2\2\u0199\u0197\3\2\2\2\u0199\u019a\3\2\2\2\u019a\33\3\2\2\2\u019b", - "\u0199\3\2\2\2\u019c\u019d\b\17\1\2\u019d\u019e\5\32\16\2\u019e\u01a7", - "\3\2\2\2\u019f\u01a0\f\4\2\2\u01a0\u01a1\7f\2\2\u01a1\u01a6\5\32\16", - "\2\u01a2\u01a3\f\3\2\2\u01a3\u01a4\7g\2\2\u01a4\u01a6\5\32\16\2\u01a5", - "\u019f\3\2\2\2\u01a5\u01a2\3\2\2\2\u01a6\u01a9\3\2\2\2\u01a7\u01a5\3", - "\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\35\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa", - "\u01ab\b\20\1\2\u01ab\u01ac\5\34\17\2\u01ac\u01b2\3\2\2\2\u01ad\u01ae", - "\f\3\2\2\u01ae\u01af\7P\2\2\u01af\u01b1\5\34\17\2\u01b0\u01ad\3\2\2", - "\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3", - "\37\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b6\b\21\1\2\u01b6\u01b7\5\36", - "\20\2\u01b7\u01bd\3\2\2\2\u01b8\u01b9\f\3\2\2\u01b9\u01ba\7T\2\2\u01ba", - "\u01bc\5\36\20\2\u01bb\u01b8\3\2\2\2\u01bc\u01bf\3\2\2\2\u01bd\u01bb", - "\3\2\2\2\u01bd\u01be\3\2\2\2\u01be!\3\2\2\2\u01bf\u01bd\3\2\2\2\u01c0", - "\u01c1\b\22\1\2\u01c1\u01c2\5 \21\2\u01c2\u01c8\3\2\2\2\u01c3\u01c4", - "\f\3\2\2\u01c4\u01c5\7Q\2\2\u01c5\u01c7\5 \21\2\u01c6\u01c3\3\2\2\2", - "\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9#", - "\3\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01cc\b\23\1\2\u01cc\u01cd\5\"\22", - "\2\u01cd\u01d3\3\2\2\2\u01ce\u01cf\f\3\2\2\u01cf\u01d0\7R\2\2\u01d0", - "\u01d2\5\"\22\2\u01d1\u01ce\3\2\2\2\u01d2\u01d5\3\2\2\2\u01d3\u01d1", - "\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4%\3\2\2\2\u01d5\u01d3\3\2\2\2\u01d6", - "\u01d7\b\24\1\2\u01d7\u01d8\5$\23\2\u01d8\u01de\3\2\2\2\u01d9\u01da", - "\f\3\2\2\u01da\u01db\7S\2\2\u01db\u01dd\5$\23\2\u01dc\u01d9\3\2\2\2", - "\u01dd\u01e0\3\2\2\2\u01de\u01dc\3\2\2\2\u01de\u01df\3\2\2\2\u01df\'", - "\3\2\2\2\u01e0\u01de\3\2\2\2\u01e1\u01e7\5&\24\2\u01e2\u01e3\7W\2\2", - "\u01e3\u01e4\5.\30\2\u01e4\u01e5\7X\2\2\u01e5\u01e6\5(\25\2\u01e6\u01e8", - "\3\2\2\2\u01e7\u01e2\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8)\3\2\2\2\u01e9", - "\u01ef\5(\25\2\u01ea\u01eb\5\16\b\2\u01eb\u01ec\5,\27\2\u01ec\u01ed", - "\5*\26\2\u01ed\u01ef\3\2\2\2\u01ee\u01e9\3\2\2\2\u01ee\u01ea\3\2\2\2", - "\u01ef+\3\2\2\2\u01f0\u01f1\t\3\2\2\u01f1-\3\2\2\2\u01f2\u01f3\b\30", - "\1\2\u01f3\u01f4\5*\26\2\u01f4\u01fa\3\2\2\2\u01f5\u01f6\f\3\2\2\u01f6", - "\u01f7\7Z\2\2\u01f7\u01f9\5*\26\2\u01f8\u01f5\3\2\2\2\u01f9\u01fc\3", - "\2\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb/\3\2\2\2\u01fc", - "\u01fa\3\2\2\2\u01fd\u01fe\5(\25\2\u01fe\61\3\2\2\2\u01ff\u0201\5\64", - "\33\2\u0200\u0202\5:\36\2\u0201\u0200\3\2\2\2\u0201\u0202\3\2\2\2\u0202", - "\u0203\3\2\2\2\u0203\u0204\7Y\2\2\u0204\u0207\3\2\2\2\u0205\u0207\5", - "\u008eH\2\u0206\u01ff\3\2\2\2\u0206\u0205\3\2\2\2\u0207\63\3\2\2\2\u0208", - "\u020a\58\35\2\u0209\u0208\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u0209\3", - "\2\2\2\u020b\u020c\3\2\2\2\u020c\65\3\2\2\2\u020d\u020f\58\35\2\u020e", - "\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u020e\3\2\2\2\u0210\u0211\3", - "\2\2\2\u0211\67\3\2\2\2\u0212\u0218\5> \2\u0213\u0218\5@!\2\u0214\u0218", - "\5\\/\2\u0215\u0218\5^\60\2\u0216\u0218\5`\61\2\u0217\u0212\3\2\2\2", - "\u0217\u0213\3\2\2\2\u0217\u0214\3\2\2\2\u0217\u0215\3\2\2\2\u0217\u0216", - "\3\2\2\2\u02189\3\2\2\2\u0219\u021a\b\36\1\2\u021a\u021b\5<\37\2\u021b", - "\u0221\3\2\2\2\u021c\u021d\f\3\2\2\u021d\u021e\7Z\2\2\u021e\u0220\5", - "<\37\2\u021f\u021c\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221", - "\u0222\3\2\2\2\u0222;\3\2\2\2\u0223\u0221\3\2\2\2\u0224\u022a\5b\62", - "\2\u0225\u0226\5b\62\2\u0226\u0227\7[\2\2\u0227\u0228\5\u0084C\2\u0228", - "\u022a\3\2\2\2\u0229\u0224\3\2\2\2\u0229\u0225\3\2\2\2\u022a=\3\2\2", - "\2\u022b\u022c\t\4\2\2\u022c?\3\2\2\2\u022d\u023c\t\5\2\2\u022e\u022f", - "\7\3\2\2\u022f\u0230\7=\2\2\u0230\u0231\t\6\2\2\u0231\u023c\7>\2\2\u0232", - "\u023c\5Z.\2\u0233\u023c\5B\"\2\u0234\u023c\5R*\2\u0235\u023c\5\u0082", - "B\2\u0236\u0237\7\t\2\2\u0237\u0238\7=\2\2\u0238\u0239\5\60\31\2\u0239", - "\u023a\7>\2\2\u023a\u023c\3\2\2\2\u023b\u022d\3\2\2\2\u023b\u022e\3", - "\2\2\2\u023b\u0232\3\2\2\2\u023b\u0233\3\2\2\2\u023b\u0234\3\2\2\2\u023b", - "\u0235\3\2\2\2\u023b\u0236\3\2\2\2\u023cA\3\2\2\2\u023d\u023f\5D#\2", - "\u023e\u0240\7k\2\2\u023f\u023e\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241", - "\3\2\2\2\u0241\u0242\5F$\2\u0242\u0247\3\2\2\2\u0243\u0244\5D#\2\u0244", - "\u0245\7k\2\2\u0245\u0247\3\2\2\2\u0246\u023d\3\2\2\2\u0246\u0243\3", - "\2\2\2\u0247C\3\2\2\2\u0248\u0249\t\7\2\2\u0249E\3\2\2\2\u024a\u024b", - "\7A\2\2\u024b\u024c\5H%\2\u024c\u024d\7B\2\2\u024dG\3\2\2\2\u024e\u024f", - "\b%\1\2\u024f\u0250\5J&\2\u0250\u0255\3\2\2\2\u0251\u0252\f\3\2\2\u0252", - "\u0254\5J&\2\u0253\u0251\3\2\2\2\u0254\u0257\3\2\2\2\u0255\u0253\3\2", - "\2\2\u0255\u0256\3\2\2\2\u0256I\3\2\2\2\u0257\u0255\3\2\2\2\u0258\u025a", - "\5L\'\2\u0259\u025b\5N(\2\u025a\u0259\3\2\2\2\u025a\u025b\3\2\2\2\u025b", - "\u025c\3\2\2\2\u025c\u025d\7Y\2\2\u025d\u0260\3\2\2\2\u025e\u0260\5", - "\u008eH\2\u025f\u0258\3\2\2\2\u025f\u025e\3\2\2\2\u0260K\3\2\2\2\u0261", - "\u0263\5@!\2\u0262\u0264\5L\'\2\u0263\u0262\3\2\2\2\u0263\u0264\3\2", - "\2\2\u0264\u026a\3\2\2\2\u0265\u0267\5\\/\2\u0266\u0268\5L\'\2\u0267", - "\u0266\3\2\2\2\u0267\u0268\3\2\2\2\u0268\u026a\3\2\2\2\u0269\u0261\3", - "\2\2\2\u0269\u0265\3\2\2\2\u026aM\3\2\2\2\u026b\u026c\b(\1\2\u026c\u026d", - "\5P)\2\u026d\u0273\3\2\2\2\u026e\u026f\f\3\2\2\u026f\u0270\7Z\2\2\u0270", - "\u0272\5P)\2\u0271\u026e\3\2\2\2\u0272\u0275\3\2\2\2\u0273\u0271\3\2", - "\2\2\u0273\u0274\3\2\2\2\u0274O\3\2\2\2\u0275\u0273\3\2\2\2\u0276\u027d", - "\5b\62\2\u0277\u0279\5b\62\2\u0278\u0277\3\2\2\2\u0278\u0279\3\2\2\2", - "\u0279\u027a\3\2\2\2\u027a\u027b\7X\2\2\u027b\u027d\5\60\31\2\u027c", - "\u0276\3\2\2\2\u027c\u0278\3\2\2\2\u027dQ\3\2\2\2\u027e\u0280\7\33\2", - "\2\u027f\u0281\7k\2\2\u0280\u027f\3\2\2\2\u0280\u0281\3\2\2\2\u0281", - "\u0282\3\2\2\2\u0282\u0283\7A\2\2\u0283\u0284\5T+\2\u0284\u0285\7B\2", - "\2\u0285\u0292\3\2\2\2\u0286\u0288\7\33\2\2\u0287\u0289\7k\2\2\u0288", - "\u0287\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u028a\3\2\2\2\u028a\u028b\7", - "A\2\2\u028b\u028c\5T+\2\u028c\u028d\7Z\2\2\u028d\u028e\7B\2\2\u028e", - "\u0292\3\2\2\2\u028f\u0290\7\33\2\2\u0290\u0292\7k\2\2\u0291\u027e\3", - "\2\2\2\u0291\u0286\3\2\2\2\u0291\u028f\3\2\2\2\u0292S\3\2\2\2\u0293", - "\u0294\b+\1\2\u0294\u0295\5V,\2\u0295\u029b\3\2\2\2\u0296\u0297\f\3", - "\2\2\u0297\u0298\7Z\2\2\u0298\u029a\5V,\2\u0299\u0296\3\2\2\2\u029a", - "\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3\2\2\2\u029cU\3\2\2", - "\2\u029d\u029b\3\2\2\2\u029e\u02a4\5X-\2\u029f\u02a0\5X-\2\u02a0\u02a1", - "\7[\2\2\u02a1\u02a2\5\60\31\2\u02a2\u02a4\3\2\2\2\u02a3\u029e\3\2\2", - "\2\u02a3\u029f\3\2\2\2\u02a4W\3\2\2\2\u02a5\u02a6\7k\2\2\u02a6Y\3\2", - "\2\2\u02a7\u02a8\7\65\2\2\u02a8\u02a9\7=\2\2\u02a9\u02aa\5|?\2\u02aa", - "\u02ab\7>\2\2\u02ab[\3\2\2\2\u02ac\u02ad\t\b\2\2\u02ad]\3\2\2\2\u02ae", - "\u02b5\t\t\2\2\u02af\u02b5\5h\65\2\u02b0\u02b1\7\f\2\2\u02b1\u02b2\7", - "=\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b5\7>\2\2\u02b4\u02ae\3\2\2\2\u02b4", - "\u02af\3\2\2\2\u02b4\u02b0\3\2\2\2\u02b5_\3\2\2\2\u02b6\u02b7\7\63\2", - "\2\u02b7\u02b8\7=\2\2\u02b8\u02b9\5|?\2\u02b9\u02ba\7>\2\2\u02ba\u02c1", - "\3\2\2\2\u02bb\u02bc\7\63\2\2\u02bc\u02bd\7=\2\2\u02bd\u02be\5\60\31", - "\2\u02be\u02bf\7>\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02b6\3\2\2\2\u02c0", - "\u02bb\3\2\2\2\u02c1a\3\2\2\2\u02c2\u02c4\5p9\2\u02c3\u02c2\3\2\2\2", - "\u02c3\u02c4\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5\u02c9\5d\63\2\u02c6\u02c8", - "\5f\64\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9\u02c7\3\2\2\2", - "\u02c9\u02ca\3\2\2\2\u02cac\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cd", - "\b\63\1\2\u02cd\u02d3\7k\2\2\u02ce\u02cf\7=\2\2\u02cf\u02d0\5b\62\2", - "\u02d0\u02d1\7>\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02cc\3\2\2\2\u02d2\u02ce", - "\3\2\2\2\u02d3\u0301\3\2\2\2\u02d4\u02d5\f\b\2\2\u02d5\u02d7\7?\2\2", - "\u02d6\u02d8\5r:\2\u02d7\u02d6\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u02da", - "\3\2\2\2\u02d9\u02db\5*\26\2\u02da\u02d9\3\2\2\2\u02da\u02db\3\2\2\2", - "\u02db\u02dc\3\2\2\2\u02dc\u0300\7@\2\2\u02dd\u02de\f\7\2\2\u02de\u02df", - "\7?\2\2\u02df\u02e1\7*\2\2\u02e0\u02e2\5r:\2\u02e1\u02e0\3\2\2\2\u02e1", - "\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5*\26\2\u02e4\u02e5\7", - "@\2\2\u02e5\u0300\3\2\2\2\u02e6\u02e7\f\6\2\2\u02e7\u02e8\7?\2\2\u02e8", - "\u02e9\5r:\2\u02e9\u02ea\7*\2\2\u02ea\u02eb\5*\26\2\u02eb\u02ec\7@\2", - "\2\u02ec\u0300\3\2\2\2\u02ed\u02ee\f\5\2\2\u02ee\u02f0\7?\2\2\u02ef", - "\u02f1\5r:\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f2\3\2", - "\2\2\u02f2\u02f3\7M\2\2\u02f3\u0300\7@\2\2\u02f4\u02f5\f\4\2\2\u02f5", - "\u02f6\7=\2\2\u02f6\u02f7\5t;\2\u02f7\u02f8\7>\2\2\u02f8\u0300\3\2\2", - "\2\u02f9\u02fa\f\3\2\2\u02fa\u02fc\7=\2\2\u02fb\u02fd\5z>\2\u02fc\u02fb", - "\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02fe\3\2\2\2\u02fe\u0300\7>\2\2", - "\u02ff\u02d4\3\2\2\2\u02ff\u02dd\3\2\2\2\u02ff\u02e6\3\2\2\2\u02ff\u02ed", - "\3\2\2\2\u02ff\u02f4\3\2\2\2\u02ff\u02f9\3\2\2\2\u0300\u0303\3\2\2\2", - "\u0301\u02ff\3\2\2\2\u0301\u0302\3\2\2\2\u0302e\3\2\2\2\u0303\u0301", - "\3\2\2\2\u0304\u0305\7\r\2\2\u0305\u0307\7=\2\2\u0306\u0308\7m\2\2\u0307", - "\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307\3\2\2\2\u0309\u030a\3", - "\2\2\2\u030a\u030b\3\2\2\2\u030b\u030e\7>\2\2\u030c\u030e\5h\65\2\u030d", - "\u0304\3\2\2\2\u030d\u030c\3\2\2\2\u030eg\3\2\2\2\u030f\u0310\7\16\2", - "\2\u0310\u0311\7=\2\2\u0311\u0312\7=\2\2\u0312\u0313\5j\66\2\u0313\u0314", - "\7>\2\2\u0314\u0315\7>\2\2\u0315i\3\2\2\2\u0316\u031b\5l\67\2\u0317", - "\u0318\7Z\2\2\u0318\u031a\5l\67\2\u0319\u0317\3\2\2\2\u031a\u031d\3", - "\2\2\2\u031b\u0319\3\2\2\2\u031b\u031c\3\2\2\2\u031c\u0320\3\2\2\2\u031d", - "\u031b\3\2\2\2\u031e\u0320\3\2\2\2\u031f\u0316\3\2\2\2\u031f\u031e\3", - "\2\2\2\u0320k\3\2\2\2\u0321\u0327\n\n\2\2\u0322\u0324\7=\2\2\u0323\u0325", - "\5\f\7\2\u0324\u0323\3\2\2\2\u0324\u0325\3\2\2\2\u0325\u0326\3\2\2\2", - "\u0326\u0328\7>\2\2\u0327\u0322\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u032b", - "\3\2\2\2\u0329\u032b\3\2\2\2\u032a\u0321\3\2\2\2\u032a\u0329\3\2\2\2", - "\u032bm\3\2\2\2\u032c\u0332\n\13\2\2\u032d\u032e\7=\2\2\u032e\u032f", - "\5n8\2\u032f\u0330\7>\2\2\u0330\u0332\3\2\2\2\u0331\u032c\3\2\2\2\u0331", - "\u032d\3\2\2\2\u0332\u0335\3\2\2\2\u0333\u0331\3\2\2\2\u0333\u0334\3", - "\2\2\2\u0334o\3\2\2\2\u0335\u0333\3\2\2\2\u0336\u0338\7M\2\2\u0337\u0339", - "\5r:\2\u0338\u0337\3\2\2\2\u0338\u0339\3\2\2\2\u0339\u0349\3\2\2\2\u033a", - "\u033c\7M\2\2\u033b\u033d\5r:\2\u033c\u033b\3\2\2\2\u033c\u033d\3\2", - "\2\2\u033d\u033e\3\2\2\2\u033e\u0349\5p9\2\u033f\u0341\7T\2\2\u0340", - "\u0342\5r:\2\u0341\u0340\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0349\3\2", - "\2\2\u0343\u0345\7T\2\2\u0344\u0346\5r:\2\u0345\u0344\3\2\2\2\u0345", - "\u0346\3\2\2\2\u0346\u0347\3\2\2\2\u0347\u0349\5p9\2\u0348\u0336\3\2", - "\2\2\u0348\u033a\3\2\2\2\u0348\u033f\3\2\2\2\u0348\u0343\3\2\2\2\u0349", - "q\3\2\2\2\u034a\u034b\b:\1\2\u034b\u034c\5\\/\2\u034c\u0351\3\2\2\2", - "\u034d\u034e\f\3\2\2\u034e\u0350\5\\/\2\u034f\u034d\3\2\2\2\u0350\u0353", - "\3\2\2\2\u0351\u034f\3\2\2\2\u0351\u0352\3\2\2\2\u0352s\3\2\2\2\u0353", - "\u0351\3\2\2\2\u0354\u035a\5v<\2\u0355\u0356\5v<\2\u0356\u0357\7Z\2", - "\2\u0357\u0358\7j\2\2\u0358\u035a\3\2\2\2\u0359\u0354\3\2\2\2\u0359", - "\u0355\3\2\2\2\u035au\3\2\2\2\u035b\u035c\b<\1\2\u035c\u035d\5x=\2\u035d", - "\u0363\3\2\2\2\u035e\u035f\f\3\2\2\u035f\u0360\7Z\2\2\u0360\u0362\5", - "x=\2\u0361\u035e\3\2\2\2\u0362\u0365\3\2\2\2\u0363\u0361\3\2\2\2\u0363", - "\u0364\3\2\2\2\u0364w\3\2\2\2\u0365\u0363\3\2\2\2\u0366\u0367\5\64\33", - "\2\u0367\u0368\5b\62\2\u0368\u036e\3\2\2\2\u0369\u036b\5\66\34\2\u036a", - "\u036c\5~@\2\u036b\u036a\3\2\2\2\u036b\u036c\3\2\2\2\u036c\u036e\3\2", - "\2\2\u036d\u0366\3\2\2\2\u036d\u0369\3\2\2\2\u036ey\3\2\2\2\u036f\u0370", - "\b>\1\2\u0370\u0371\7k\2\2\u0371\u0377\3\2\2\2\u0372\u0373\f\3\2\2\u0373", - "\u0374\7Z\2\2\u0374\u0376\7k\2\2\u0375\u0372\3\2\2\2\u0376\u0379\3\2", - "\2\2\u0377\u0375\3\2\2\2\u0377\u0378\3\2\2\2\u0378{\3\2\2\2\u0379\u0377", - "\3\2\2\2\u037a\u037c\5L\'\2\u037b\u037d\5~@\2\u037c\u037b\3\2\2\2\u037c", - "\u037d\3\2\2\2\u037d}\3\2\2\2\u037e\u038a\5p9\2\u037f\u0381\5p9\2\u0380", - "\u037f\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0386\5", - "\u0080A\2\u0383\u0385\5f\64\2\u0384\u0383\3\2\2\2\u0385\u0388\3\2\2", - "\2\u0386\u0384\3\2\2\2\u0386\u0387\3\2\2\2\u0387\u038a\3\2\2\2\u0388", - "\u0386\3\2\2\2\u0389\u037e\3\2\2\2\u0389\u0380\3\2\2\2\u038a\177\3\2", - "\2\2\u038b\u038c\bA\1\2\u038c\u038d\7=\2\2\u038d\u038e\5~@\2\u038e\u0392", - "\7>\2\2\u038f\u0391\5f\64\2\u0390\u038f\3\2\2\2\u0391\u0394\3\2\2\2", - "\u0392\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u03ba\3\2\2\2\u0394\u0392", - "\3\2\2\2\u0395\u0397\7?\2\2\u0396\u0398\5r:\2\u0397\u0396\3\2\2\2\u0397", - "\u0398\3\2\2\2\u0398\u039a\3\2\2\2\u0399\u039b\5*\26\2\u039a\u0399\3", - "\2\2\2\u039a\u039b\3\2\2\2\u039b\u039c\3\2\2\2\u039c\u03ba\7@\2\2\u039d", - "\u039e\7?\2\2\u039e\u03a0\7*\2\2\u039f\u03a1\5r:\2\u03a0\u039f\3\2\2", - "\2\u03a0\u03a1\3\2\2\2\u03a1\u03a2\3\2\2\2\u03a2\u03a3\5*\26\2\u03a3", - "\u03a4\7@\2\2\u03a4\u03ba\3\2\2\2\u03a5\u03a6\7?\2\2\u03a6\u03a7\5r", - ":\2\u03a7\u03a8\7*\2\2\u03a8\u03a9\5*\26\2\u03a9\u03aa\7@\2\2\u03aa", - "\u03ba\3\2\2\2\u03ab\u03ac\7?\2\2\u03ac\u03ad\7M\2\2\u03ad\u03ba\7@", - "\2\2\u03ae\u03b0\7=\2\2\u03af\u03b1\5t;\2\u03b0\u03af\3\2\2\2\u03b0", - "\u03b1\3\2\2\2\u03b1\u03b2\3\2\2\2\u03b2\u03b6\7>\2\2\u03b3\u03b5\5", - "f\64\2\u03b4\u03b3\3\2\2\2\u03b5\u03b8\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b6", - "\u03b7\3\2\2\2\u03b7\u03ba\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b9\u038b\3", - "\2\2\2\u03b9\u0395\3\2\2\2\u03b9\u039d\3\2\2\2\u03b9\u03a5\3\2\2\2\u03b9", - "\u03ab\3\2\2\2\u03b9\u03ae\3\2\2\2\u03ba\u03e6\3\2\2\2\u03bb\u03bc\f", - "\7\2\2\u03bc\u03be\7?\2\2\u03bd\u03bf\5r:\2\u03be\u03bd\3\2\2\2\u03be", - "\u03bf\3\2\2\2\u03bf\u03c1\3\2\2\2\u03c0\u03c2\5*\26\2\u03c1\u03c0\3", - "\2\2\2\u03c1\u03c2\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03e5\7@\2\2\u03c4", - "\u03c5\f\6\2\2\u03c5\u03c6\7?\2\2\u03c6\u03c8\7*\2\2\u03c7\u03c9\5r", - ":\2\u03c8\u03c7\3\2\2\2\u03c8\u03c9\3\2\2\2\u03c9\u03ca\3\2\2\2\u03ca", - "\u03cb\5*\26\2\u03cb\u03cc\7@\2\2\u03cc\u03e5\3\2\2\2\u03cd\u03ce\f", - "\5\2\2\u03ce\u03cf\7?\2\2\u03cf\u03d0\5r:\2\u03d0\u03d1\7*\2\2\u03d1", - "\u03d2\5*\26\2\u03d2\u03d3\7@\2\2\u03d3\u03e5\3\2\2\2\u03d4\u03d5\f", - "\4\2\2\u03d5\u03d6\7?\2\2\u03d6\u03d7\7M\2\2\u03d7\u03e5\7@\2\2\u03d8", - "\u03d9\f\3\2\2\u03d9\u03db\7=\2\2\u03da\u03dc\5t;\2\u03db\u03da\3\2", - "\2\2\u03db\u03dc\3\2\2\2\u03dc\u03dd\3\2\2\2\u03dd\u03e1\7>\2\2\u03de", - "\u03e0\5f\64\2\u03df\u03de\3\2\2\2\u03e0\u03e3\3\2\2\2\u03e1\u03df\3", - "\2\2\2\u03e1\u03e2\3\2\2\2\u03e2\u03e5\3\2\2\2\u03e3\u03e1\3\2\2\2\u03e4", - "\u03bb\3\2\2\2\u03e4\u03c4\3\2\2\2\u03e4\u03cd\3\2\2\2\u03e4\u03d4\3", - "\2\2\2\u03e4\u03d8\3\2\2\2\u03e5\u03e8\3\2\2\2\u03e6\u03e4\3\2\2\2\u03e6", - "\u03e7\3\2\2\2\u03e7\u0081\3\2\2\2\u03e8\u03e6\3\2\2\2\u03e9\u03ea\7", - "k\2\2\u03ea\u0083\3\2\2\2\u03eb\u03f6\5*\26\2\u03ec\u03ed\7A\2\2\u03ed", - "\u03ee\5\u0086D\2\u03ee\u03ef\7B\2\2\u03ef\u03f6\3\2\2\2\u03f0\u03f1", - "\7A\2\2\u03f1\u03f2\5\u0086D\2\u03f2\u03f3\7Z\2\2\u03f3\u03f4\7B\2\2", - "\u03f4\u03f6\3\2\2\2\u03f5\u03eb\3\2\2\2\u03f5\u03ec\3\2\2\2\u03f5\u03f0", - "\3\2\2\2\u03f6\u0085\3\2\2\2\u03f7\u03f9\bD\1\2\u03f8\u03fa\5\u0088", - "E\2\u03f9\u03f8\3\2\2\2\u03f9\u03fa\3\2\2\2\u03fa\u03fb\3\2\2\2\u03fb", - "\u03fc\5\u0084C\2\u03fc\u0405\3\2\2\2\u03fd\u03fe\f\3\2\2\u03fe\u0400", - "\7Z\2\2\u03ff\u0401\5\u0088E\2\u0400\u03ff\3\2\2\2\u0400\u0401\3\2\2", - "\2\u0401\u0402\3\2\2\2\u0402\u0404\5\u0084C\2\u0403\u03fd\3\2\2\2\u0404", - "\u0407\3\2\2\2\u0405\u0403\3\2\2\2\u0405\u0406\3\2\2\2\u0406\u0087\3", - "\2\2\2\u0407\u0405\3\2\2\2\u0408\u0409\5\u008aF\2\u0409\u040a\7[\2\2", - "\u040a\u0089\3\2\2\2\u040b\u040c\bF\1\2\u040c\u040d\5\u008cG\2\u040d", - "\u0412\3\2\2\2\u040e\u040f\f\3\2\2\u040f\u0411\5\u008cG\2\u0410\u040e", - "\3\2\2\2\u0411\u0414\3\2\2\2\u0412\u0410\3\2\2\2\u0412\u0413\3\2\2\2", - "\u0413\u008b\3\2\2\2\u0414\u0412\3\2\2\2\u0415\u0416\7?\2\2\u0416\u0417", - "\5\60\31\2\u0417\u0418\7@\2\2\u0418\u041c\3\2\2\2\u0419\u041a\7i\2\2", - "\u041a\u041c\7k\2\2\u041b\u0415\3\2\2\2\u041b\u0419\3\2\2\2\u041c\u008d", - "\3\2\2\2\u041d\u041e\7;\2\2\u041e\u041f\7=\2\2\u041f\u0420\5\60\31\2", - "\u0420\u0422\7Z\2\2\u0421\u0423\7m\2\2\u0422\u0421\3\2\2\2\u0423\u0424", - "\3\2\2\2\u0424\u0422\3\2\2\2\u0424\u0425\3\2\2\2\u0425\u0426\3\2\2\2", - "\u0426\u0427\7>\2\2\u0427\u0428\7Y\2\2\u0428\u008f\3\2\2\2\u0429\u044f", - "\5\u0092J\2\u042a\u044f\5\u0094K\2\u042b\u044f\5\u009aN\2\u042c\u044f", - "\5\u009cO\2\u042d\u044f\5\u009eP\2\u042e\u044f\5\u00a0Q\2\u042f\u0430", - "\t\f\2\2\u0430\u0431\t\r\2\2\u0431\u043a\7=\2\2\u0432\u0437\5&\24\2", - "\u0433\u0434\7Z\2\2\u0434\u0436\5&\24\2\u0435\u0433\3\2\2\2\u0436\u0439", - "\3\2\2\2\u0437\u0435\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u043b\3\2\2\2", - "\u0439\u0437\3\2\2\2\u043a\u0432\3\2\2\2\u043a\u043b\3\2\2\2\u043b\u0449", - "\3\2\2\2\u043c\u0445\7X\2\2\u043d\u0442\5&\24\2\u043e\u043f\7Z\2\2\u043f", - "\u0441\5&\24\2\u0440\u043e\3\2\2\2\u0441\u0444\3\2\2\2\u0442\u0440\3", - "\2\2\2\u0442\u0443\3\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3\2\2\2\u0445", - "\u043d\3\2\2\2\u0445\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u043c\3", - "\2\2\2\u0448\u044b\3\2\2\2\u0449\u0447\3\2\2\2\u0449\u044a\3\2\2\2\u044a", - "\u044c\3\2\2\2\u044b\u0449\3\2\2\2\u044c\u044d\7>\2\2\u044d\u044f\7", - "Y\2\2\u044e\u0429\3\2\2\2\u044e\u042a\3\2\2\2\u044e\u042b\3\2\2\2\u044e", - "\u042c\3\2\2\2\u044e\u042d\3\2\2\2\u044e\u042e\3\2\2\2\u044e\u042f\3", - "\2\2\2\u044f\u0091\3\2\2\2\u0450\u0451\7k\2\2\u0451\u0452\7X\2\2\u0452", - "\u045c\5\u0090I\2\u0453\u0454\7\23\2\2\u0454\u0455\5\60\31\2\u0455\u0456", - "\7X\2\2\u0456\u0457\5\u0090I\2\u0457\u045c\3\2\2\2\u0458\u0459\7\27", - "\2\2\u0459\u045a\7X\2\2\u045a\u045c\5\u0090I\2\u045b\u0450\3\2\2\2\u045b", - "\u0453\3\2\2\2\u045b\u0458\3\2\2\2\u045c\u0093\3\2\2\2\u045d\u045f\7", - "A\2\2\u045e\u0460\5\u0096L\2\u045f\u045e\3\2\2\2\u045f\u0460\3\2\2\2", - "\u0460\u0461\3\2\2\2\u0461\u0462\7B\2\2\u0462\u0095\3\2\2\2\u0463\u0464", - "\bL\1\2\u0464\u0465\5\u0098M\2\u0465\u046a\3\2\2\2\u0466\u0467\f\3\2", - "\2\u0467\u0469\5\u0098M\2\u0468\u0466\3\2\2\2\u0469\u046c\3\2\2\2\u046a", - "\u0468\3\2\2\2\u046a\u046b\3\2\2\2\u046b\u0097\3\2\2\2\u046c\u046a\3", - "\2\2\2\u046d\u0470\5\62\32\2\u046e\u0470\5\u0090I\2\u046f\u046d\3\2", - "\2\2\u046f\u046e\3\2\2\2\u0470\u0099\3\2\2\2\u0471\u0473\5.\30\2\u0472", - "\u0471\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0474\3\2\2\2\u0474\u0475\7", - "Y\2\2\u0475\u009b\3\2\2\2\u0476\u0477\7 \2\2\u0477\u0478\7=\2\2\u0478", - "\u0479\5.\30\2\u0479\u047a\7>\2\2\u047a\u047d\5\u0090I\2\u047b\u047c", - "\7\32\2\2\u047c\u047e\5\u0090I\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2", - "\2\2\u047e\u0486\3\2\2\2\u047f\u0480\7,\2\2\u0480\u0481\7=\2\2\u0481", - "\u0482\5.\30\2\u0482\u0483\7>\2\2\u0483\u0484\5\u0090I\2\u0484\u0486", - "\3\2\2\2\u0485\u0476\3\2\2\2\u0485\u047f\3\2\2\2\u0486\u009d\3\2\2\2", - "\u0487\u0488\7\62\2\2\u0488\u0489\7=\2\2\u0489\u048a\5.\30\2\u048a\u048b", - "\7>\2\2\u048b\u048c\5\u0090I\2\u048c\u04b2\3\2\2\2\u048d\u048e\7\30", - "\2\2\u048e\u048f\5\u0090I\2\u048f\u0490\7\62\2\2\u0490\u0491\7=\2\2", - "\u0491\u0492\5.\30\2\u0492\u0493\7>\2\2\u0493\u0494\7Y\2\2\u0494\u04b2", - "\3\2\2\2\u0495\u0496\7\36\2\2\u0496\u0498\7=\2\2\u0497\u0499\5.\30\2", - "\u0498\u0497\3\2\2\2\u0498\u0499\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049c", - "\7Y\2\2\u049b\u049d\5.\30\2\u049c\u049b\3\2\2\2\u049c\u049d\3\2\2\2", - "\u049d\u049e\3\2\2\2\u049e\u04a0\7Y\2\2\u049f\u04a1\5.\30\2\u04a0\u049f", - "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7>\2\2", - "\u04a3\u04b2\5\u0090I\2\u04a4\u04a5\7\36\2\2\u04a5\u04a6\7=\2\2\u04a6", - "\u04a8\5\62\32\2\u04a7\u04a9\5.\30\2\u04a8\u04a7\3\2\2\2\u04a8\u04a9", - "\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ac\7Y\2\2\u04ab\u04ad\5.\30\2", - "\u04ac\u04ab\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af", - "\7>\2\2\u04af\u04b0\5\u0090I\2\u04b0\u04b2\3\2\2\2\u04b1\u0487\3\2\2", - "\2\u04b1\u048d\3\2\2\2\u04b1\u0495\3\2\2\2\u04b1\u04a4\3\2\2\2\u04b2", - "\u009f\3\2\2\2\u04b3\u04b4\7\37\2\2\u04b4\u04b5\7k\2\2\u04b5\u04c4\7", - "Y\2\2\u04b6\u04b7\7\26\2\2\u04b7\u04c4\7Y\2\2\u04b8\u04b9\7\22\2\2\u04b9", - "\u04c4\7Y\2\2\u04ba\u04bc\7&\2\2\u04bb\u04bd\5.\30\2\u04bc\u04bb\3\2", - "\2\2\u04bc\u04bd\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04c4\7Y\2\2\u04bf", - "\u04c0\7\37\2\2\u04c0\u04c1\5\16\b\2\u04c1\u04c2\7Y\2\2\u04c2\u04c4", - "\3\2\2\2\u04c3\u04b3\3\2\2\2\u04c3\u04b6\3\2\2\2\u04c3\u04b8\3\2\2\2", - "\u04c3\u04ba\3\2\2\2\u04c3\u04bf\3\2\2\2\u04c4\u00a1\3\2\2\2\u04c5\u04c7", - "\5\u00a4S\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2", - "\2\2\u04c8\u04c9\7\2\2\3\u04c9\u00a3\3\2\2\2\u04ca\u04cb\bS\1\2\u04cb", - "\u04cc\5\u00a6T\2\u04cc\u04d1\3\2\2\2\u04cd\u04ce\f\3\2\2\u04ce\u04d0", - "\5\u00a6T\2\u04cf\u04cd\3\2\2\2\u04d0\u04d3\3\2\2\2\u04d1\u04cf\3\2", - "\2\2\u04d1\u04d2\3\2\2\2\u04d2\u00a5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d4", - "\u04d8\5\u00a8U\2\u04d5\u04d8\5\62\32\2\u04d6\u04d8\7Y\2\2\u04d7\u04d4", - "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d7\u04d6\3\2\2\2\u04d8\u00a7\3\2\2\2", - "\u04d9\u04db\5\64\33\2\u04da\u04d9\3\2\2\2\u04da\u04db\3\2\2\2\u04db", - "\u04dc\3\2\2\2\u04dc\u04de\5b\62\2\u04dd\u04df\5\u00aaV\2\u04de\u04dd", - "\3\2\2\2\u04de\u04df\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0\u04e1\5\u0094", - "K\2\u04e1\u00a9\3\2\2\2\u04e2\u04e3\bV\1\2\u04e3\u04e4\5\62\32\2\u04e4", - "\u04e9\3\2\2\2\u04e5\u04e6\f\3\2\2\u04e6\u04e8\5\62\32\2\u04e7\u04e5", - "\3\2\2\2\u04e8\u04eb\3\2\2\2\u04e9\u04e7\3\2\2\2\u04e9\u04ea\3\2\2\2", - "\u04ea\u00ab\3\2\2\2\u04eb\u04e9\3\2\2\2\u008c\u00b1\u00b9\u00cd\u00de", - "\u00e8\u010c\u0116\u0123\u0125\u0130\u0149\u0159\u0167\u0169\u0175\u0177", - "\u0183\u0185\u0197\u0199\u01a5\u01a7\u01b2\u01bd\u01c8\u01d3\u01de\u01e7", - "\u01ee\u01fa\u0201\u0206\u020b\u0210\u0217\u0221\u0229\u023b\u023f\u0246", - "\u0255\u025a\u025f\u0263\u0267\u0269\u0273\u0278\u027c\u0280\u0288\u0291", - "\u029b\u02a3\u02b4\u02c0\u02c3\u02c9\u02d2\u02d7\u02da\u02e1\u02f0\u02fc", - "\u02ff\u0301\u0309\u030d\u031b\u031f\u0324\u0327\u032a\u0331\u0333\u0338", - "\u033c\u0341\u0345\u0348\u0351\u0359\u0363\u036b\u036d\u0377\u037c\u0380", - "\u0386\u0389\u0392\u0397\u039a\u03a0\u03b0\u03b6\u03b9\u03be\u03c1\u03c8", - "\u03db\u03e1\u03e4\u03e6\u03f5\u03f9\u0400\u0405\u0412\u041b\u0424\u0437", - "\u043a\u0442\u0445\u0449\u044e\u045b\u045f\u046a\u046f\u0472\u047d\u0485", - "\u0498\u049c\u04a0\u04a8\u04ac\u04b1\u04bc\u04c3\u04c6\u04d1\u04d7\u04da", - "\u04de\u04e9"].join(""); + "\5R\u04cb\nR\3S\3S\3S\3S\3S\7S\u04d2\nS\fS\16S\u04d5\13S\3T\3T\3T\5", + "T\u04da\nT\3U\5U\u04dd\nU\3U\3U\5U\u04e1\nU\3U\3U\3V\3V\3V\3V\3V\7V", + "\u04ea\nV\fV\16V\u04ed\13V\3V\2\36\6\n\f\24\26\30\32\34\36 \"$&.:HN", + "Tdrvz\u0080\u0086\u008a\u0096\u00a4\u00aaW\2\4\6\b\n\f\16\20\22\24\26", + "\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvx", + "z|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094", + "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\2", + "\16\7\2IIKKMMPPUV\3\2[e\b\2\21\21\34\34$$**--<<\n\2\6\b\24\24\31\31", + "\35\35\"#\'(/\60\66\67\3\2\6\b\4\2++..\6\2\25\25%%\61\61\65\65\5\2\n", + "\13!!::\4\2=>ZZ\3\2=>\4\2\r\r\17\17\4\2\20\20\61\61\u055f\2\u00cd\3", + "\2\2\2\4\u00cf\3\2\2\2\6\u00d6\3\2\2\2\b\u00e8\3\2\2\2\n\u010c\3\2\2", + "\2\f\u0128\3\2\2\2\16\u0149\3\2\2\2\20\u014b\3\2\2\2\22\u0159\3\2\2", + "\2\24\u015b\3\2\2\2\26\u016c\3\2\2\2\30\u017a\3\2\2\2\32\u0188\3\2\2", + "\2\34\u019c\3\2\2\2\36\u01aa\3\2\2\2 \u01b5\3\2\2\2\"\u01c0\3\2\2\2", + "$\u01cb\3\2\2\2&\u01d6\3\2\2\2(\u01e1\3\2\2\2*\u01ee\3\2\2\2,\u01f0", + "\3\2\2\2.\u01f2\3\2\2\2\60\u01fd\3\2\2\2\62\u0206\3\2\2\2\64\u0209\3", + "\2\2\2\66\u020e\3\2\2\28\u0217\3\2\2\2:\u0219\3\2\2\2<\u0229\3\2\2\2", + ">\u022b\3\2\2\2@\u023b\3\2\2\2B\u0246\3\2\2\2D\u0248\3\2\2\2F\u024a", + "\3\2\2\2H\u024e\3\2\2\2J\u025f\3\2\2\2L\u0269\3\2\2\2N\u026b\3\2\2\2", + "P\u027c\3\2\2\2R\u0291\3\2\2\2T\u0293\3\2\2\2V\u02a3\3\2\2\2X\u02a5", + "\3\2\2\2Z\u02a7\3\2\2\2\\\u02ac\3\2\2\2^\u02b4\3\2\2\2`\u02c0\3\2\2", + "\2b\u02c3\3\2\2\2d\u02d2\3\2\2\2f\u030d\3\2\2\2h\u030f\3\2\2\2j\u031f", + "\3\2\2\2l\u032a\3\2\2\2n\u0333\3\2\2\2p\u0348\3\2\2\2r\u034a\3\2\2\2", + "t\u0359\3\2\2\2v\u035b\3\2\2\2x\u036d\3\2\2\2z\u036f\3\2\2\2|\u037a", + "\3\2\2\2~\u0389\3\2\2\2\u0080\u03b9\3\2\2\2\u0082\u03e9\3\2\2\2\u0084", + "\u03f5\3\2\2\2\u0086\u03f7\3\2\2\2\u0088\u0408\3\2\2\2\u008a\u040b\3", + "\2\2\2\u008c\u041b\3\2\2\2\u008e\u041d\3\2\2\2\u0090\u044e\3\2\2\2\u0092", + "\u045b\3\2\2\2\u0094\u045d\3\2\2\2\u0096\u0463\3\2\2\2\u0098\u046f\3", + "\2\2\2\u009a\u0472\3\2\2\2\u009c\u0485\3\2\2\2\u009e\u04b1\3\2\2\2\u00a0", + "\u04c3\3\2\2\2\u00a2\u04ca\3\2\2\2\u00a4\u04cc\3\2\2\2\u00a6\u04d9\3", + "\2\2\2\u00a8\u04dc\3\2\2\2\u00aa\u04e4\3\2\2\2\u00ac\u00ce\7k\2\2\u00ad", + "\u00ce\7l\2\2\u00ae\u00b0\7m\2\2\u00af\u00ae\3\2\2\2\u00b0\u00b1\3\2", + "\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00ce\3\2\2\2\u00b3", + "\u00b4\7=\2\2\u00b4\u00b5\5.\30\2\u00b5\u00b6\7>\2\2\u00b6\u00ce\3\2", + "\2\2\u00b7\u00ce\5\4\3\2\u00b8\u00ba\7\3\2\2\u00b9\u00b8\3\2\2\2\u00b9", + "\u00ba\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb\u00bc\7=\2\2\u00bc\u00bd\5", + "\u0094K\2\u00bd\u00be\7>\2\2\u00be\u00ce\3\2\2\2\u00bf\u00c0\7\4\2\2", + "\u00c0\u00c1\7=\2\2\u00c1\u00c2\5\16\b\2\u00c2\u00c3\7Z\2\2\u00c3\u00c4", + "\5|?\2\u00c4\u00c5\7>\2\2\u00c5\u00ce\3\2\2\2\u00c6\u00c7\7\5\2\2\u00c7", + "\u00c8\7=\2\2\u00c8\u00c9\5|?\2\u00c9\u00ca\7Z\2\2\u00ca\u00cb\5\16", + "\b\2\u00cb\u00cc\7>\2\2\u00cc\u00ce\3\2\2\2\u00cd\u00ac\3\2\2\2\u00cd", + "\u00ad\3\2\2\2\u00cd\u00af\3\2\2\2\u00cd\u00b3\3\2\2\2\u00cd\u00b7\3", + "\2\2\2\u00cd\u00b9\3\2\2\2\u00cd\u00bf\3\2\2\2\u00cd\u00c6\3\2\2\2\u00ce", + "\3\3\2\2\2\u00cf\u00d0\78\2\2\u00d0\u00d1\7=\2\2\u00d1\u00d2\5*\26\2", + "\u00d2\u00d3\7Z\2\2\u00d3\u00d4\5\6\4\2\u00d4\u00d5\7>\2\2\u00d5\5\3", + "\2\2\2\u00d6\u00d7\b\4\1\2\u00d7\u00d8\5\b\5\2\u00d8\u00de\3\2\2\2\u00d9", + "\u00da\f\3\2\2\u00da\u00db\7Z\2\2\u00db\u00dd\5\b\5\2\u00dc\u00d9\3", + "\2\2\2\u00dd\u00e0\3\2\2\2\u00de\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df", + "\7\3\2\2\2\u00e0\u00de\3\2\2\2\u00e1\u00e2\5|?\2\u00e2\u00e3\7X\2\2", + "\u00e3\u00e4\5*\26\2\u00e4\u00e9\3\2\2\2\u00e5\u00e6\7\27\2\2\u00e6", + "\u00e7\7X\2\2\u00e7\u00e9\5*\26\2\u00e8\u00e1\3\2\2\2\u00e8\u00e5\3", + "\2\2\2\u00e9\t\3\2\2\2\u00ea\u00eb\b\6\1\2\u00eb\u010d\5\2\2\2\u00ec", + "\u00ed\7=\2\2\u00ed\u00ee\5|?\2\u00ee\u00ef\7>\2\2\u00ef\u00f0\7A\2", + "\2\u00f0\u00f1\5\u0086D\2\u00f1\u00f2\7B\2\2\u00f2\u010d\3\2\2\2\u00f3", + "\u00f4\7=\2\2\u00f4\u00f5\5|?\2\u00f5\u00f6\7>\2\2\u00f6\u00f7\7A\2", + "\2\u00f7\u00f8\5\u0086D\2\u00f8\u00f9\7Z\2\2\u00f9\u00fa\7B\2\2\u00fa", + "\u010d\3\2\2\2\u00fb\u00fc\7\3\2\2\u00fc\u00fd\7=\2\2\u00fd\u00fe\5", + "|?\2\u00fe\u00ff\7>\2\2\u00ff\u0100\7A\2\2\u0100\u0101\5\u0086D\2\u0101", + "\u0102\7B\2\2\u0102\u010d\3\2\2\2\u0103\u0104\7\3\2\2\u0104\u0105\7", + "=\2\2\u0105\u0106\5|?\2\u0106\u0107\7>\2\2\u0107\u0108\7A\2\2\u0108", + "\u0109\5\u0086D\2\u0109\u010a\7Z\2\2\u010a\u010b\7B\2\2\u010b\u010d", + "\3\2\2\2\u010c\u00ea\3\2\2\2\u010c\u00ec\3\2\2\2\u010c\u00f3\3\2\2\2", + "\u010c\u00fb\3\2\2\2\u010c\u0103\3\2\2\2\u010d\u0125\3\2\2\2\u010e\u010f", + "\f\f\2\2\u010f\u0110\7?\2\2\u0110\u0111\5.\30\2\u0111\u0112\7@\2\2\u0112", + "\u0124\3\2\2\2\u0113\u0114\f\13\2\2\u0114\u0116\7=\2\2\u0115\u0117\5", + "\f\7\2\u0116\u0115\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u0118\3\2\2\2\u0118", + "\u0124\7>\2\2\u0119\u011a\f\n\2\2\u011a\u011b\7i\2\2\u011b\u0124\7k", + "\2\2\u011c\u011d\f\t\2\2\u011d\u011e\7h\2\2\u011e\u0124\7k\2\2\u011f", + "\u0120\f\b\2\2\u0120\u0124\7J\2\2\u0121\u0122\f\7\2\2\u0122\u0124\7", + "L\2\2\u0123\u010e\3\2\2\2\u0123\u0113\3\2\2\2\u0123\u0119\3\2\2\2\u0123", + "\u011c\3\2\2\2\u0123\u011f\3\2\2\2\u0123\u0121\3\2\2\2\u0124\u0127\3", + "\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2\2\2\u0126\13\3\2\2\2\u0127", + "\u0125\3\2\2\2\u0128\u0129\b\7\1\2\u0129\u012a\5*\26\2\u012a\u0130\3", + "\2\2\2\u012b\u012c\f\3\2\2\u012c\u012d\7Z\2\2\u012d\u012f\5*\26\2\u012e", + "\u012b\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u012e\3\2\2\2\u0130\u0131\3", + "\2\2\2\u0131\r\3\2\2\2\u0132\u0130\3\2\2\2\u0133\u014a\5\n\6\2\u0134", + "\u0135\7J\2\2\u0135\u014a\5\16\b\2\u0136\u0137\7L\2\2\u0137\u014a\5", + "\16\b\2\u0138\u0139\5\20\t\2\u0139\u013a\5\22\n\2\u013a\u014a\3\2\2", + "\2\u013b\u013c\7)\2\2\u013c\u014a\5\16\b\2\u013d\u013e\7)\2\2\u013e", + "\u013f\7=\2\2\u013f\u0140\5|?\2\u0140\u0141\7>\2\2\u0141\u014a\3\2\2", + "\2\u0142\u0143\7\64\2\2\u0143\u0144\7=\2\2\u0144\u0145\5|?\2\u0145\u0146", + "\7>\2\2\u0146\u014a\3\2\2\2\u0147\u0148\7R\2\2\u0148\u014a\7k\2\2\u0149", + "\u0133\3\2\2\2\u0149\u0134\3\2\2\2\u0149\u0136\3\2\2\2\u0149\u0138\3", + "\2\2\2\u0149\u013b\3\2\2\2\u0149\u013d\3\2\2\2\u0149\u0142\3\2\2\2\u0149", + "\u0147\3\2\2\2\u014a\17\3\2\2\2\u014b\u014c\t\2\2\2\u014c\21\3\2\2\2", + "\u014d\u015a\5\16\b\2\u014e\u014f\7=\2\2\u014f\u0150\5|?\2\u0150\u0151", + "\7>\2\2\u0151\u0152\5\22\n\2\u0152\u015a\3\2\2\2\u0153\u0154\7\3\2\2", + "\u0154\u0155\7=\2\2\u0155\u0156\5|?\2\u0156\u0157\7>\2\2\u0157\u0158", + "\5\22\n\2\u0158\u015a\3\2\2\2\u0159\u014d\3\2\2\2\u0159\u014e\3\2\2", + "\2\u0159\u0153\3\2\2\2\u015a\23\3\2\2\2\u015b\u015c\b\13\1\2\u015c\u015d", + "\5\22\n\2\u015d\u0169\3\2\2\2\u015e\u015f\f\5\2\2\u015f\u0160\7M\2\2", + "\u0160\u0168\5\22\n\2\u0161\u0162\f\4\2\2\u0162\u0163\7N\2\2\u0163\u0168", + "\5\22\n\2\u0164\u0165\f\3\2\2\u0165\u0166\7O\2\2\u0166\u0168\5\22\n", + "\2\u0167\u015e\3\2\2\2\u0167\u0161\3\2\2\2\u0167\u0164\3\2\2\2\u0168", + "\u016b\3\2\2\2\u0169\u0167\3\2\2\2\u0169\u016a\3\2\2\2\u016a\25\3\2", + "\2\2\u016b\u0169\3\2\2\2\u016c\u016d\b\f\1\2\u016d\u016e\5\24\13\2\u016e", + "\u0177\3\2\2\2\u016f\u0170\f\4\2\2\u0170\u0171\7I\2\2\u0171\u0176\5", + "\24\13\2\u0172\u0173\f\3\2\2\u0173\u0174\7K\2\2\u0174\u0176\5\24\13", + "\2\u0175\u016f\3\2\2\2\u0175\u0172\3\2\2\2\u0176\u0179\3\2\2\2\u0177", + "\u0175\3\2\2\2\u0177\u0178\3\2\2\2\u0178\27\3\2\2\2\u0179\u0177\3\2", + "\2\2\u017a\u017b\b\r\1\2\u017b\u017c\5\26\f\2\u017c\u0185\3\2\2\2\u017d", + "\u017e\f\4\2\2\u017e\u017f\7G\2\2\u017f\u0184\5\26\f\2\u0180\u0181\f", + "\3\2\2\u0181\u0182\7H\2\2\u0182\u0184\5\26\f\2\u0183\u017d\3\2\2\2\u0183", + "\u0180\3\2\2\2\u0184\u0187\3\2\2\2\u0185\u0183\3\2\2\2\u0185\u0186\3", + "\2\2\2\u0186\31\3\2\2\2\u0187\u0185\3\2\2\2\u0188\u0189\b\16\1\2\u0189", + "\u018a\5\30\r\2\u018a\u0199\3\2\2\2\u018b\u018c\f\6\2\2\u018c\u018d", + "\7C\2\2\u018d\u0198\5\30\r\2\u018e\u018f\f\5\2\2\u018f\u0190\7E\2\2", + "\u0190\u0198\5\30\r\2\u0191\u0192\f\4\2\2\u0192\u0193\7D\2\2\u0193\u0198", + "\5\30\r\2\u0194\u0195\f\3\2\2\u0195\u0196\7F\2\2\u0196\u0198\5\30\r", + "\2\u0197\u018b\3\2\2\2\u0197\u018e\3\2\2\2\u0197\u0191\3\2\2\2\u0197", + "\u0194\3\2\2\2\u0198\u019b\3\2\2\2\u0199\u0197\3\2\2\2\u0199\u019a\3", + "\2\2\2\u019a\33\3\2\2\2\u019b\u0199\3\2\2\2\u019c\u019d\b\17\1\2\u019d", + "\u019e\5\32\16\2\u019e\u01a7\3\2\2\2\u019f\u01a0\f\4\2\2\u01a0\u01a1", + "\7f\2\2\u01a1\u01a6\5\32\16\2\u01a2\u01a3\f\3\2\2\u01a3\u01a4\7g\2\2", + "\u01a4\u01a6\5\32\16\2\u01a5\u019f\3\2\2\2\u01a5\u01a2\3\2\2\2\u01a6", + "\u01a9\3\2\2\2\u01a7\u01a5\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\35\3\2", + "\2\2\u01a9\u01a7\3\2\2\2\u01aa\u01ab\b\20\1\2\u01ab\u01ac\5\34\17\2", + "\u01ac\u01b2\3\2\2\2\u01ad\u01ae\f\3\2\2\u01ae\u01af\7P\2\2\u01af\u01b1", + "\5\34\17\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2\2", + "\2\u01b2\u01b3\3\2\2\2\u01b3\37\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b6", + "\b\21\1\2\u01b6\u01b7\5\36\20\2\u01b7\u01bd\3\2\2\2\u01b8\u01b9\f\3", + "\2\2\u01b9\u01ba\7T\2\2\u01ba\u01bc\5\36\20\2\u01bb\u01b8\3\2\2\2\u01bc", + "\u01bf\3\2\2\2\u01bd\u01bb\3\2\2\2\u01bd\u01be\3\2\2\2\u01be!\3\2\2", + "\2\u01bf\u01bd\3\2\2\2\u01c0\u01c1\b\22\1\2\u01c1\u01c2\5 \21\2\u01c2", + "\u01c8\3\2\2\2\u01c3\u01c4\f\3\2\2\u01c4\u01c5\7Q\2\2\u01c5\u01c7\5", + " \21\2\u01c6\u01c3\3\2\2\2\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8", + "\u01c9\3\2\2\2\u01c9#\3\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01cc\b\23\1", + "\2\u01cc\u01cd\5\"\22\2\u01cd\u01d3\3\2\2\2\u01ce\u01cf\f\3\2\2\u01cf", + "\u01d0\7R\2\2\u01d0\u01d2\5\"\22\2\u01d1\u01ce\3\2\2\2\u01d2\u01d5\3", + "\2\2\2\u01d3\u01d1\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4%\3\2\2\2\u01d5", + "\u01d3\3\2\2\2\u01d6\u01d7\b\24\1\2\u01d7\u01d8\5$\23\2\u01d8\u01de", + "\3\2\2\2\u01d9\u01da\f\3\2\2\u01da\u01db\7S\2\2\u01db\u01dd\5$\23\2", + "\u01dc\u01d9\3\2\2\2\u01dd\u01e0\3\2\2\2\u01de\u01dc\3\2\2\2\u01de\u01df", + "\3\2\2\2\u01df\'\3\2\2\2\u01e0\u01de\3\2\2\2\u01e1\u01e7\5&\24\2\u01e2", + "\u01e3\7W\2\2\u01e3\u01e4\5.\30\2\u01e4\u01e5\7X\2\2\u01e5\u01e6\5(", + "\25\2\u01e6\u01e8\3\2\2\2\u01e7\u01e2\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8", + ")\3\2\2\2\u01e9\u01ef\5(\25\2\u01ea\u01eb\5\16\b\2\u01eb\u01ec\5,\27", + "\2\u01ec\u01ed\5*\26\2\u01ed\u01ef\3\2\2\2\u01ee\u01e9\3\2\2\2\u01ee", + "\u01ea\3\2\2\2\u01ef+\3\2\2\2\u01f0\u01f1\t\3\2\2\u01f1-\3\2\2\2\u01f2", + "\u01f3\b\30\1\2\u01f3\u01f4\5*\26\2\u01f4\u01fa\3\2\2\2\u01f5\u01f6", + "\f\3\2\2\u01f6\u01f7\7Z\2\2\u01f7\u01f9\5*\26\2\u01f8\u01f5\3\2\2\2", + "\u01f9\u01fc\3\2\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb/", + "\3\2\2\2\u01fc\u01fa\3\2\2\2\u01fd\u01fe\5(\25\2\u01fe\61\3\2\2\2\u01ff", + "\u0201\5\64\33\2\u0200\u0202\5:\36\2\u0201\u0200\3\2\2\2\u0201\u0202", + "\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0204\7Y\2\2\u0204\u0207\3\2\2\2", + "\u0205\u0207\5\u008eH\2\u0206\u01ff\3\2\2\2\u0206\u0205\3\2\2\2\u0207", + "\63\3\2\2\2\u0208\u020a\58\35\2\u0209\u0208\3\2\2\2\u020a\u020b\3\2", + "\2\2\u020b\u0209\3\2\2\2\u020b\u020c\3\2\2\2\u020c\65\3\2\2\2\u020d", + "\u020f\58\35\2\u020e\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u020e\3", + "\2\2\2\u0210\u0211\3\2\2\2\u0211\67\3\2\2\2\u0212\u0218\5> \2\u0213", + "\u0218\5@!\2\u0214\u0218\5\\/\2\u0215\u0218\5^\60\2\u0216\u0218\5`\61", + "\2\u0217\u0212\3\2\2\2\u0217\u0213\3\2\2\2\u0217\u0214\3\2\2\2\u0217", + "\u0215\3\2\2\2\u0217\u0216\3\2\2\2\u02189\3\2\2\2\u0219\u021a\b\36\1", + "\2\u021a\u021b\5<\37\2\u021b\u0221\3\2\2\2\u021c\u021d\f\3\2\2\u021d", + "\u021e\7Z\2\2\u021e\u0220\5<\37\2\u021f\u021c\3\2\2\2\u0220\u0223\3", + "\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222\3\2\2\2\u0222;\3\2\2\2\u0223", + "\u0221\3\2\2\2\u0224\u022a\5b\62\2\u0225\u0226\5b\62\2\u0226\u0227\7", + "[\2\2\u0227\u0228\5\u0084C\2\u0228\u022a\3\2\2\2\u0229\u0224\3\2\2\2", + "\u0229\u0225\3\2\2\2\u022a=\3\2\2\2\u022b\u022c\t\4\2\2\u022c?\3\2\2", + "\2\u022d\u023c\t\5\2\2\u022e\u022f\7\3\2\2\u022f\u0230\7=\2\2\u0230", + "\u0231\t\6\2\2\u0231\u023c\7>\2\2\u0232\u023c\5Z.\2\u0233\u023c\5B\"", + "\2\u0234\u023c\5R*\2\u0235\u023c\5\u0082B\2\u0236\u0237\7\t\2\2\u0237", + "\u0238\7=\2\2\u0238\u0239\5\60\31\2\u0239\u023a\7>\2\2\u023a\u023c\3", + "\2\2\2\u023b\u022d\3\2\2\2\u023b\u022e\3\2\2\2\u023b\u0232\3\2\2\2\u023b", + "\u0233\3\2\2\2\u023b\u0234\3\2\2\2\u023b\u0235\3\2\2\2\u023b\u0236\3", + "\2\2\2\u023cA\3\2\2\2\u023d\u023f\5D#\2\u023e\u0240\7k\2\2\u023f\u023e", + "\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241\3\2\2\2\u0241\u0242\5F$\2\u0242", + "\u0247\3\2\2\2\u0243\u0244\5D#\2\u0244\u0245\7k\2\2\u0245\u0247\3\2", + "\2\2\u0246\u023d\3\2\2\2\u0246\u0243\3\2\2\2\u0247C\3\2\2\2\u0248\u0249", + "\t\7\2\2\u0249E\3\2\2\2\u024a\u024b\7A\2\2\u024b\u024c\5H%\2\u024c\u024d", + "\7B\2\2\u024dG\3\2\2\2\u024e\u024f\b%\1\2\u024f\u0250\5J&\2\u0250\u0255", + "\3\2\2\2\u0251\u0252\f\3\2\2\u0252\u0254\5J&\2\u0253\u0251\3\2\2\2\u0254", + "\u0257\3\2\2\2\u0255\u0253\3\2\2\2\u0255\u0256\3\2\2\2\u0256I\3\2\2", + "\2\u0257\u0255\3\2\2\2\u0258\u025a\5L\'\2\u0259\u025b\5N(\2\u025a\u0259", + "\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u025c\3\2\2\2\u025c\u025d\7Y\2\2", + "\u025d\u0260\3\2\2\2\u025e\u0260\5\u008eH\2\u025f\u0258\3\2\2\2\u025f", + "\u025e\3\2\2\2\u0260K\3\2\2\2\u0261\u0263\5@!\2\u0262\u0264\5L\'\2\u0263", + "\u0262\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u026a\3\2\2\2\u0265\u0267\5", + "\\/\2\u0266\u0268\5L\'\2\u0267\u0266\3\2\2\2\u0267\u0268\3\2\2\2\u0268", + "\u026a\3\2\2\2\u0269\u0261\3\2\2\2\u0269\u0265\3\2\2\2\u026aM\3\2\2", + "\2\u026b\u026c\b(\1\2\u026c\u026d\5P)\2\u026d\u0273\3\2\2\2\u026e\u026f", + "\f\3\2\2\u026f\u0270\7Z\2\2\u0270\u0272\5P)\2\u0271\u026e\3\2\2\2\u0272", + "\u0275\3\2\2\2\u0273\u0271\3\2\2\2\u0273\u0274\3\2\2\2\u0274O\3\2\2", + "\2\u0275\u0273\3\2\2\2\u0276\u027d\5b\62\2\u0277\u0279\5b\62\2\u0278", + "\u0277\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u027a\3\2\2\2\u027a\u027b\7", + "X\2\2\u027b\u027d\5\60\31\2\u027c\u0276\3\2\2\2\u027c\u0278\3\2\2\2", + "\u027dQ\3\2\2\2\u027e\u0280\7\33\2\2\u027f\u0281\7k\2\2\u0280\u027f", + "\3\2\2\2\u0280\u0281\3\2\2\2\u0281\u0282\3\2\2\2\u0282\u0283\7A\2\2", + "\u0283\u0284\5T+\2\u0284\u0285\7B\2\2\u0285\u0292\3\2\2\2\u0286\u0288", + "\7\33\2\2\u0287\u0289\7k\2\2\u0288\u0287\3\2\2\2\u0288\u0289\3\2\2\2", + "\u0289\u028a\3\2\2\2\u028a\u028b\7A\2\2\u028b\u028c\5T+\2\u028c\u028d", + "\7Z\2\2\u028d\u028e\7B\2\2\u028e\u0292\3\2\2\2\u028f\u0290\7\33\2\2", + "\u0290\u0292\7k\2\2\u0291\u027e\3\2\2\2\u0291\u0286\3\2\2\2\u0291\u028f", + "\3\2\2\2\u0292S\3\2\2\2\u0293\u0294\b+\1\2\u0294\u0295\5V,\2\u0295\u029b", + "\3\2\2\2\u0296\u0297\f\3\2\2\u0297\u0298\7Z\2\2\u0298\u029a\5V,\2\u0299", + "\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3", + "\2\2\2\u029cU\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u02a4\5X-\2\u029f\u02a0", + "\5X-\2\u02a0\u02a1\7[\2\2\u02a1\u02a2\5\60\31\2\u02a2\u02a4\3\2\2\2", + "\u02a3\u029e\3\2\2\2\u02a3\u029f\3\2\2\2\u02a4W\3\2\2\2\u02a5\u02a6", + "\7k\2\2\u02a6Y\3\2\2\2\u02a7\u02a8\7\65\2\2\u02a8\u02a9\7=\2\2\u02a9", + "\u02aa\5|?\2\u02aa\u02ab\7>\2\2\u02ab[\3\2\2\2\u02ac\u02ad\t\b\2\2\u02ad", + "]\3\2\2\2\u02ae\u02b5\t\t\2\2\u02af\u02b5\5h\65\2\u02b0\u02b1\7\f\2", + "\2\u02b1\u02b2\7=\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b5\7>\2\2\u02b4\u02ae", + "\3\2\2\2\u02b4\u02af\3\2\2\2\u02b4\u02b0\3\2\2\2\u02b5_\3\2\2\2\u02b6", + "\u02b7\7\63\2\2\u02b7\u02b8\7=\2\2\u02b8\u02b9\5|?\2\u02b9\u02ba\7>", + "\2\2\u02ba\u02c1\3\2\2\2\u02bb\u02bc\7\63\2\2\u02bc\u02bd\7=\2\2\u02bd", + "\u02be\5\60\31\2\u02be\u02bf\7>\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02b6", + "\3\2\2\2\u02c0\u02bb\3\2\2\2\u02c1a\3\2\2\2\u02c2\u02c4\5p9\2\u02c3", + "\u02c2\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5\u02c9\5", + "d\63\2\u02c6\u02c8\5f\64\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9", + "\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02cac\3\2\2\2\u02cb\u02c9\3\2\2", + "\2\u02cc\u02cd\b\63\1\2\u02cd\u02d3\7k\2\2\u02ce\u02cf\7=\2\2\u02cf", + "\u02d0\5b\62\2\u02d0\u02d1\7>\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02cc\3", + "\2\2\2\u02d2\u02ce\3\2\2\2\u02d3\u0301\3\2\2\2\u02d4\u02d5\f\b\2\2\u02d5", + "\u02d7\7?\2\2\u02d6\u02d8\5r:\2\u02d7\u02d6\3\2\2\2\u02d7\u02d8\3\2", + "\2\2\u02d8\u02da\3\2\2\2\u02d9\u02db\5*\26\2\u02da\u02d9\3\2\2\2\u02da", + "\u02db\3\2\2\2\u02db\u02dc\3\2\2\2\u02dc\u0300\7@\2\2\u02dd\u02de\f", + "\7\2\2\u02de\u02df\7?\2\2\u02df\u02e1\7*\2\2\u02e0\u02e2\5r:\2\u02e1", + "\u02e0\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5", + "*\26\2\u02e4\u02e5\7@\2\2\u02e5\u0300\3\2\2\2\u02e6\u02e7\f\6\2\2\u02e7", + "\u02e8\7?\2\2\u02e8\u02e9\5r:\2\u02e9\u02ea\7*\2\2\u02ea\u02eb\5*\26", + "\2\u02eb\u02ec\7@\2\2\u02ec\u0300\3\2\2\2\u02ed\u02ee\f\5\2\2\u02ee", + "\u02f0\7?\2\2\u02ef\u02f1\5r:\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1\3\2", + "\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f3\7M\2\2\u02f3\u0300\7@\2\2\u02f4", + "\u02f5\f\4\2\2\u02f5\u02f6\7=\2\2\u02f6\u02f7\5t;\2\u02f7\u02f8\7>\2", + "\2\u02f8\u0300\3\2\2\2\u02f9\u02fa\f\3\2\2\u02fa\u02fc\7=\2\2\u02fb", + "\u02fd\5z>\2\u02fc\u02fb\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02fe\3\2", + "\2\2\u02fe\u0300\7>\2\2\u02ff\u02d4\3\2\2\2\u02ff\u02dd\3\2\2\2\u02ff", + "\u02e6\3\2\2\2\u02ff\u02ed\3\2\2\2\u02ff\u02f4\3\2\2\2\u02ff\u02f9\3", + "\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff\3\2\2\2\u0301\u0302\3\2\2\2\u0302", + "e\3\2\2\2\u0303\u0301\3\2\2\2\u0304\u0305\7\r\2\2\u0305\u0307\7=\2\2", + "\u0306\u0308\7m\2\2\u0307\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307", + "\3\2\2\2\u0309\u030a\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030e\7>\2\2", + "\u030c\u030e\5h\65\2\u030d\u0304\3\2\2\2\u030d\u030c\3\2\2\2\u030eg", + "\3\2\2\2\u030f\u0310\7\16\2\2\u0310\u0311\7=\2\2\u0311\u0312\7=\2\2", + "\u0312\u0313\5j\66\2\u0313\u0314\7>\2\2\u0314\u0315\7>\2\2\u0315i\3", + "\2\2\2\u0316\u031b\5l\67\2\u0317\u0318\7Z\2\2\u0318\u031a\5l\67\2\u0319", + "\u0317\3\2\2\2\u031a\u031d\3\2\2\2\u031b\u0319\3\2\2\2\u031b\u031c\3", + "\2\2\2\u031c\u0320\3\2\2\2\u031d\u031b\3\2\2\2\u031e\u0320\3\2\2\2\u031f", + "\u0316\3\2\2\2\u031f\u031e\3\2\2\2\u0320k\3\2\2\2\u0321\u0327\n\n\2", + "\2\u0322\u0324\7=\2\2\u0323\u0325\5\f\7\2\u0324\u0323\3\2\2\2\u0324", + "\u0325\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u0328\7>\2\2\u0327\u0322\3", + "\2\2\2\u0327\u0328\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u032b\3\2\2\2\u032a", + "\u0321\3\2\2\2\u032a\u0329\3\2\2\2\u032bm\3\2\2\2\u032c\u0332\n\13\2", + "\2\u032d\u032e\7=\2\2\u032e\u032f\5n8\2\u032f\u0330\7>\2\2\u0330\u0332", + "\3\2\2\2\u0331\u032c\3\2\2\2\u0331\u032d\3\2\2\2\u0332\u0335\3\2\2\2", + "\u0333\u0331\3\2\2\2\u0333\u0334\3\2\2\2\u0334o\3\2\2\2\u0335\u0333", + "\3\2\2\2\u0336\u0338\7M\2\2\u0337\u0339\5r:\2\u0338\u0337\3\2\2\2\u0338", + "\u0339\3\2\2\2\u0339\u0349\3\2\2\2\u033a\u033c\7M\2\2\u033b\u033d\5", + "r:\2\u033c\u033b\3\2\2\2\u033c\u033d\3\2\2\2\u033d\u033e\3\2\2\2\u033e", + "\u0349\5p9\2\u033f\u0341\7T\2\2\u0340\u0342\5r:\2\u0341\u0340\3\2\2", + "\2\u0341\u0342\3\2\2\2\u0342\u0349\3\2\2\2\u0343\u0345\7T\2\2\u0344", + "\u0346\5r:\2\u0345\u0344\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0347\3\2", + "\2\2\u0347\u0349\5p9\2\u0348\u0336\3\2\2\2\u0348\u033a\3\2\2\2\u0348", + "\u033f\3\2\2\2\u0348\u0343\3\2\2\2\u0349q\3\2\2\2\u034a\u034b\b:\1\2", + "\u034b\u034c\5\\/\2\u034c\u0351\3\2\2\2\u034d\u034e\f\3\2\2\u034e\u0350", + "\5\\/\2\u034f\u034d\3\2\2\2\u0350\u0353\3\2\2\2\u0351\u034f\3\2\2\2", + "\u0351\u0352\3\2\2\2\u0352s\3\2\2\2\u0353\u0351\3\2\2\2\u0354\u035a", + "\5v<\2\u0355\u0356\5v<\2\u0356\u0357\7Z\2\2\u0357\u0358\7j\2\2\u0358", + "\u035a\3\2\2\2\u0359\u0354\3\2\2\2\u0359\u0355\3\2\2\2\u035au\3\2\2", + "\2\u035b\u035c\b<\1\2\u035c\u035d\5x=\2\u035d\u0363\3\2\2\2\u035e\u035f", + "\f\3\2\2\u035f\u0360\7Z\2\2\u0360\u0362\5x=\2\u0361\u035e\3\2\2\2\u0362", + "\u0365\3\2\2\2\u0363\u0361\3\2\2\2\u0363\u0364\3\2\2\2\u0364w\3\2\2", + "\2\u0365\u0363\3\2\2\2\u0366\u0367\5\64\33\2\u0367\u0368\5b\62\2\u0368", + "\u036e\3\2\2\2\u0369\u036b\5\66\34\2\u036a\u036c\5~@\2\u036b\u036a\3", + "\2\2\2\u036b\u036c\3\2\2\2\u036c\u036e\3\2\2\2\u036d\u0366\3\2\2\2\u036d", + "\u0369\3\2\2\2\u036ey\3\2\2\2\u036f\u0370\b>\1\2\u0370\u0371\7k\2\2", + "\u0371\u0377\3\2\2\2\u0372\u0373\f\3\2\2\u0373\u0374\7Z\2\2\u0374\u0376", + "\7k\2\2\u0375\u0372\3\2\2\2\u0376\u0379\3\2\2\2\u0377\u0375\3\2\2\2", + "\u0377\u0378\3\2\2\2\u0378{\3\2\2\2\u0379\u0377\3\2\2\2\u037a\u037c", + "\5L\'\2\u037b\u037d\5~@\2\u037c\u037b\3\2\2\2\u037c\u037d\3\2\2\2\u037d", + "}\3\2\2\2\u037e\u038a\5p9\2\u037f\u0381\5p9\2\u0380\u037f\3\2\2\2\u0380", + "\u0381\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0386\5\u0080A\2\u0383\u0385", + "\5f\64\2\u0384\u0383\3\2\2\2\u0385\u0388\3\2\2\2\u0386\u0384\3\2\2\2", + "\u0386\u0387\3\2\2\2\u0387\u038a\3\2\2\2\u0388\u0386\3\2\2\2\u0389\u037e", + "\3\2\2\2\u0389\u0380\3\2\2\2\u038a\177\3\2\2\2\u038b\u038c\bA\1\2\u038c", + "\u038d\7=\2\2\u038d\u038e\5~@\2\u038e\u0392\7>\2\2\u038f\u0391\5f\64", + "\2\u0390\u038f\3\2\2\2\u0391\u0394\3\2\2\2\u0392\u0390\3\2\2\2\u0392", + "\u0393\3\2\2\2\u0393\u03ba\3\2\2\2\u0394\u0392\3\2\2\2\u0395\u0397\7", + "?\2\2\u0396\u0398\5r:\2\u0397\u0396\3\2\2\2\u0397\u0398\3\2\2\2\u0398", + "\u039a\3\2\2\2\u0399\u039b\5*\26\2\u039a\u0399\3\2\2\2\u039a\u039b\3", + "\2\2\2\u039b\u039c\3\2\2\2\u039c\u03ba\7@\2\2\u039d\u039e\7?\2\2\u039e", + "\u03a0\7*\2\2\u039f\u03a1\5r:\2\u03a0\u039f\3\2\2\2\u03a0\u03a1\3\2", + "\2\2\u03a1\u03a2\3\2\2\2\u03a2\u03a3\5*\26\2\u03a3\u03a4\7@\2\2\u03a4", + "\u03ba\3\2\2\2\u03a5\u03a6\7?\2\2\u03a6\u03a7\5r:\2\u03a7\u03a8\7*\2", + "\2\u03a8\u03a9\5*\26\2\u03a9\u03aa\7@\2\2\u03aa\u03ba\3\2\2\2\u03ab", + "\u03ac\7?\2\2\u03ac\u03ad\7M\2\2\u03ad\u03ba\7@\2\2\u03ae\u03b0\7=\2", + "\2\u03af\u03b1\5t;\2\u03b0\u03af\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2", + "\3\2\2\2\u03b2\u03b6\7>\2\2\u03b3\u03b5\5f\64\2\u03b4\u03b3\3\2\2\2", + "\u03b5\u03b8\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7\u03ba", + "\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b9\u038b\3\2\2\2\u03b9\u0395\3\2\2\2", + "\u03b9\u039d\3\2\2\2\u03b9\u03a5\3\2\2\2\u03b9\u03ab\3\2\2\2\u03b9\u03ae", + "\3\2\2\2\u03ba\u03e6\3\2\2\2\u03bb\u03bc\f\7\2\2\u03bc\u03be\7?\2\2", + "\u03bd\u03bf\5r:\2\u03be\u03bd\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c1", + "\3\2\2\2\u03c0\u03c2\5*\26\2\u03c1\u03c0\3\2\2\2\u03c1\u03c2\3\2\2\2", + "\u03c2\u03c3\3\2\2\2\u03c3\u03e5\7@\2\2\u03c4\u03c5\f\6\2\2\u03c5\u03c6", + "\7?\2\2\u03c6\u03c8\7*\2\2\u03c7\u03c9\5r:\2\u03c8\u03c7\3\2\2\2\u03c8", + "\u03c9\3\2\2\2\u03c9\u03ca\3\2\2\2\u03ca\u03cb\5*\26\2\u03cb\u03cc\7", + "@\2\2\u03cc\u03e5\3\2\2\2\u03cd\u03ce\f\5\2\2\u03ce\u03cf\7?\2\2\u03cf", + "\u03d0\5r:\2\u03d0\u03d1\7*\2\2\u03d1\u03d2\5*\26\2\u03d2\u03d3\7@\2", + "\2\u03d3\u03e5\3\2\2\2\u03d4\u03d5\f\4\2\2\u03d5\u03d6\7?\2\2\u03d6", + "\u03d7\7M\2\2\u03d7\u03e5\7@\2\2\u03d8\u03d9\f\3\2\2\u03d9\u03db\7=", + "\2\2\u03da\u03dc\5t;\2\u03db\u03da\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc", + "\u03dd\3\2\2\2\u03dd\u03e1\7>\2\2\u03de\u03e0\5f\64\2\u03df\u03de\3", + "\2\2\2\u03e0\u03e3\3\2\2\2\u03e1\u03df\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2", + "\u03e5\3\2\2\2\u03e3\u03e1\3\2\2\2\u03e4\u03bb\3\2\2\2\u03e4\u03c4\3", + "\2\2\2\u03e4\u03cd\3\2\2\2\u03e4\u03d4\3\2\2\2\u03e4\u03d8\3\2\2\2\u03e5", + "\u03e8\3\2\2\2\u03e6\u03e4\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u0081\3", + "\2\2\2\u03e8\u03e6\3\2\2\2\u03e9\u03ea\7k\2\2\u03ea\u0083\3\2\2\2\u03eb", + "\u03f6\5*\26\2\u03ec\u03ed\7A\2\2\u03ed\u03ee\5\u0086D\2\u03ee\u03ef", + "\7B\2\2\u03ef\u03f6\3\2\2\2\u03f0\u03f1\7A\2\2\u03f1\u03f2\5\u0086D", + "\2\u03f2\u03f3\7Z\2\2\u03f3\u03f4\7B\2\2\u03f4\u03f6\3\2\2\2\u03f5\u03eb", + "\3\2\2\2\u03f5\u03ec\3\2\2\2\u03f5\u03f0\3\2\2\2\u03f6\u0085\3\2\2\2", + "\u03f7\u03f9\bD\1\2\u03f8\u03fa\5\u0088E\2\u03f9\u03f8\3\2\2\2\u03f9", + "\u03fa\3\2\2\2\u03fa\u03fb\3\2\2\2\u03fb\u03fc\5\u0084C\2\u03fc\u0405", + "\3\2\2\2\u03fd\u03fe\f\3\2\2\u03fe\u0400\7Z\2\2\u03ff\u0401\5\u0088", + "E\2\u0400\u03ff\3\2\2\2\u0400\u0401\3\2\2\2\u0401\u0402\3\2\2\2\u0402", + "\u0404\5\u0084C\2\u0403\u03fd\3\2\2\2\u0404\u0407\3\2\2\2\u0405\u0403", + "\3\2\2\2\u0405\u0406\3\2\2\2\u0406\u0087\3\2\2\2\u0407\u0405\3\2\2\2", + "\u0408\u0409\5\u008aF\2\u0409\u040a\7[\2\2\u040a\u0089\3\2\2\2\u040b", + "\u040c\bF\1\2\u040c\u040d\5\u008cG\2\u040d\u0412\3\2\2\2\u040e\u040f", + "\f\3\2\2\u040f\u0411\5\u008cG\2\u0410\u040e\3\2\2\2\u0411\u0414\3\2", + "\2\2\u0412\u0410\3\2\2\2\u0412\u0413\3\2\2\2\u0413\u008b\3\2\2\2\u0414", + "\u0412\3\2\2\2\u0415\u0416\7?\2\2\u0416\u0417\5\60\31\2\u0417\u0418", + "\7@\2\2\u0418\u041c\3\2\2\2\u0419\u041a\7i\2\2\u041a\u041c\7k\2\2\u041b", + "\u0415\3\2\2\2\u041b\u0419\3\2\2\2\u041c\u008d\3\2\2\2\u041d\u041e\7", + ";\2\2\u041e\u041f\7=\2\2\u041f\u0420\5\60\31\2\u0420\u0422\7Z\2\2\u0421", + "\u0423\7m\2\2\u0422\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u0422\3", + "\2\2\2\u0424\u0425\3\2\2\2\u0425\u0426\3\2\2\2\u0426\u0427\7>\2\2\u0427", + "\u0428\7Y\2\2\u0428\u008f\3\2\2\2\u0429\u044f\5\u0092J\2\u042a\u044f", + "\5\u0094K\2\u042b\u044f\5\u009aN\2\u042c\u044f\5\u009cO\2\u042d\u044f", + "\5\u009eP\2\u042e\u044f\5\u00a0Q\2\u042f\u0430\t\f\2\2\u0430\u0431\t", + "\r\2\2\u0431\u043a\7=\2\2\u0432\u0437\5&\24\2\u0433\u0434\7Z\2\2\u0434", + "\u0436\5&\24\2\u0435\u0433\3\2\2\2\u0436\u0439\3\2\2\2\u0437\u0435\3", + "\2\2\2\u0437\u0438\3\2\2\2\u0438\u043b\3\2\2\2\u0439\u0437\3\2\2\2\u043a", + "\u0432\3\2\2\2\u043a\u043b\3\2\2\2\u043b\u0449\3\2\2\2\u043c\u0445\7", + "X\2\2\u043d\u0442\5&\24\2\u043e\u043f\7Z\2\2\u043f\u0441\5&\24\2\u0440", + "\u043e\3\2\2\2\u0441\u0444\3\2\2\2\u0442\u0440\3\2\2\2\u0442\u0443\3", + "\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3\2\2\2\u0445\u043d\3\2\2\2\u0445", + "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u043c\3\2\2\2\u0448\u044b\3", + "\2\2\2\u0449\u0447\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u044c\3\2\2\2\u044b", + "\u0449\3\2\2\2\u044c\u044d\7>\2\2\u044d\u044f\7Y\2\2\u044e\u0429\3\2", + "\2\2\u044e\u042a\3\2\2\2\u044e\u042b\3\2\2\2\u044e\u042c\3\2\2\2\u044e", + "\u042d\3\2\2\2\u044e\u042e\3\2\2\2\u044e\u042f\3\2\2\2\u044f\u0091\3", + "\2\2\2\u0450\u0451\7k\2\2\u0451\u0452\7X\2\2\u0452\u045c\5\u0090I\2", + "\u0453\u0454\7\23\2\2\u0454\u0455\5\60\31\2\u0455\u0456\7X\2\2\u0456", + "\u0457\5\u0090I\2\u0457\u045c\3\2\2\2\u0458\u0459\7\27\2\2\u0459\u045a", + "\7X\2\2\u045a\u045c\5\u0090I\2\u045b\u0450\3\2\2\2\u045b\u0453\3\2\2", + "\2\u045b\u0458\3\2\2\2\u045c\u0093\3\2\2\2\u045d\u045f\7A\2\2\u045e", + "\u0460\5\u0096L\2\u045f\u045e\3\2\2\2\u045f\u0460\3\2\2\2\u0460\u0461", + "\3\2\2\2\u0461\u0462\7B\2\2\u0462\u0095\3\2\2\2\u0463\u0464\bL\1\2\u0464", + "\u0465\5\u0098M\2\u0465\u046a\3\2\2\2\u0466\u0467\f\3\2\2\u0467\u0469", + "\5\u0098M\2\u0468\u0466\3\2\2\2\u0469\u046c\3\2\2\2\u046a\u0468\3\2", + "\2\2\u046a\u046b\3\2\2\2\u046b\u0097\3\2\2\2\u046c\u046a\3\2\2\2\u046d", + "\u0470\5\62\32\2\u046e\u0470\5\u0090I\2\u046f\u046d\3\2\2\2\u046f\u046e", + "\3\2\2\2\u0470\u0099\3\2\2\2\u0471\u0473\5.\30\2\u0472\u0471\3\2\2\2", + "\u0472\u0473\3\2\2\2\u0473\u0474\3\2\2\2\u0474\u0475\7Y\2\2\u0475\u009b", + "\3\2\2\2\u0476\u0477\7 \2\2\u0477\u0478\7=\2\2\u0478\u0479\5.\30\2\u0479", + "\u047a\7>\2\2\u047a\u047d\5\u0090I\2\u047b\u047c\7\32\2\2\u047c\u047e", + "\5\u0090I\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0486\3\2", + "\2\2\u047f\u0480\7,\2\2\u0480\u0481\7=\2\2\u0481\u0482\5.\30\2\u0482", + "\u0483\7>\2\2\u0483\u0484\5\u0090I\2\u0484\u0486\3\2\2\2\u0485\u0476", + "\3\2\2\2\u0485\u047f\3\2\2\2\u0486\u009d\3\2\2\2\u0487\u0488\7\62\2", + "\2\u0488\u0489\7=\2\2\u0489\u048a\5.\30\2\u048a\u048b\7>\2\2\u048b\u048c", + "\5\u0090I\2\u048c\u04b2\3\2\2\2\u048d\u048e\7\30\2\2\u048e\u048f\5\u0090", + "I\2\u048f\u0490\7\62\2\2\u0490\u0491\7=\2\2\u0491\u0492\5.\30\2\u0492", + "\u0493\7>\2\2\u0493\u0494\7Y\2\2\u0494\u04b2\3\2\2\2\u0495\u0496\7\36", + "\2\2\u0496\u0498\7=\2\2\u0497\u0499\5.\30\2\u0498\u0497\3\2\2\2\u0498", + "\u0499\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049c\7Y\2\2\u049b\u049d\5", + ".\30\2\u049c\u049b\3\2\2\2\u049c\u049d\3\2\2\2\u049d\u049e\3\2\2\2\u049e", + "\u04a0\7Y\2\2\u049f\u04a1\5.\30\2\u04a0\u049f\3\2\2\2\u04a0\u04a1\3", + "\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7>\2\2\u04a3\u04b2\5\u0090I\2", + "\u04a4\u04a5\7\36\2\2\u04a5\u04a6\7=\2\2\u04a6\u04a8\5\62\32\2\u04a7", + "\u04a9\5.\30\2\u04a8\u04a7\3\2\2\2\u04a8\u04a9\3\2\2\2\u04a9\u04aa\3", + "\2\2\2\u04aa\u04ac\7Y\2\2\u04ab\u04ad\5.\30\2\u04ac\u04ab\3\2\2\2\u04ac", + "\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af\7>\2\2\u04af\u04b0\5", + "\u0090I\2\u04b0\u04b2\3\2\2\2\u04b1\u0487\3\2\2\2\u04b1\u048d\3\2\2", + "\2\u04b1\u0495\3\2\2\2\u04b1\u04a4\3\2\2\2\u04b2\u009f\3\2\2\2\u04b3", + "\u04b4\7\37\2\2\u04b4\u04b5\7k\2\2\u04b5\u04c4\7Y\2\2\u04b6\u04b7\7", + "\26\2\2\u04b7\u04c4\7Y\2\2\u04b8\u04b9\7\22\2\2\u04b9\u04c4\7Y\2\2\u04ba", + "\u04bc\7&\2\2\u04bb\u04bd\5.\30\2\u04bc\u04bb\3\2\2\2\u04bc\u04bd\3", + "\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04c4\7Y\2\2\u04bf\u04c0\7\37\2\2\u04c0", + "\u04c1\5\16\b\2\u04c1\u04c2\7Y\2\2\u04c2\u04c4\3\2\2\2\u04c3\u04b3\3", + "\2\2\2\u04c3\u04b6\3\2\2\2\u04c3\u04b8\3\2\2\2\u04c3\u04ba\3\2\2\2\u04c3", + "\u04bf\3\2\2\2\u04c4\u00a1\3\2\2\2\u04c5\u04c7\5\u00a4S\2\u04c6\u04c5", + "\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04cb\7\2\2\3", + "\u04c9\u04cb\3\2\2\2\u04ca\u04c6\3\2\2\2\u04ca\u04c9\3\2\2\2\u04cb\u00a3", + "\3\2\2\2\u04cc\u04cd\bS\1\2\u04cd\u04ce\5\u00a6T\2\u04ce\u04d3\3\2\2", + "\2\u04cf\u04d0\f\3\2\2\u04d0\u04d2\5\u00a6T\2\u04d1\u04cf\3\2\2\2\u04d2", + "\u04d5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d3\u04d4\3\2\2\2\u04d4\u00a5\3", + "\2\2\2\u04d5\u04d3\3\2\2\2\u04d6\u04da\5\u00a8U\2\u04d7\u04da\5\62\32", + "\2\u04d8\u04da\7Y\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9", + "\u04d8\3\2\2\2\u04da\u00a7\3\2\2\2\u04db\u04dd\5\64\33\2\u04dc\u04db", + "\3\2\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04e0\5b\62\2", + "\u04df\u04e1\5\u00aaV\2\u04e0\u04df\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1", + "\u04e2\3\2\2\2\u04e2\u04e3\5\u0094K\2\u04e3\u00a9\3\2\2\2\u04e4\u04e5", + "\bV\1\2\u04e5\u04e6\5\62\32\2\u04e6\u04eb\3\2\2\2\u04e7\u04e8\f\3\2", + "\2\u04e8\u04ea\5\62\32\2\u04e9\u04e7\3\2\2\2\u04ea\u04ed\3\2\2\2\u04eb", + "\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u00ab\3\2\2\2\u04ed\u04eb\3", + "\2\2\2\u008d\u00b1\u00b9\u00cd\u00de\u00e8\u010c\u0116\u0123\u0125\u0130", + "\u0149\u0159\u0167\u0169\u0175\u0177\u0183\u0185\u0197\u0199\u01a5\u01a7", + "\u01b2\u01bd\u01c8\u01d3\u01de\u01e7\u01ee\u01fa\u0201\u0206\u020b\u0210", + "\u0217\u0221\u0229\u023b\u023f\u0246\u0255\u025a\u025f\u0263\u0267\u0269", + "\u0273\u0278\u027c\u0280\u0288\u0291\u029b\u02a3\u02b4\u02c0\u02c3\u02c9", + "\u02d2\u02d7\u02da\u02e1\u02f0\u02fc\u02ff\u0301\u0309\u030d\u031b\u031f", + "\u0324\u0327\u032a\u0331\u0333\u0338\u033c\u0341\u0345\u0348\u0351\u0359", + "\u0363\u036b\u036d\u0377\u037c\u0380\u0386\u0389\u0392\u0397\u039a\u03a0", + "\u03b0\u03b6\u03b9\u03be\u03c1\u03c8\u03db\u03e1\u03e4\u03e6\u03f5\u03f9", + "\u0400\u0405\u0412\u041b\u0424\u0437\u043a\u0442\u0445\u0449\u044e\u045b", + "\u045f\u046a\u046f\u0472\u047d\u0485\u0498\u049c\u04a0\u04a8\u04ac\u04b1", + "\u04bc\u04c3\u04c6\u04ca\u04d3\u04d9\u04dc\u04e0\u04eb"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -9231,16 +9232,28 @@ CParser.prototype.compilationUnit = function() { this.enterRule(localctx, 160, CParser.RULE_compilationUnit); var _la = 0; // Token type try { - this.enterOuterAlt(localctx, 1); - this.state = 1220; - _la = this._input.LA(1); - if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) { - this.state = 1219; - this.translationUnit(0); - } + this.state = 1224; + var la_ = this._interp.adaptivePredict(this._input,133,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1220; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) { + this.state = 1219; + this.translationUnit(0); + } + + this.state = 1222; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + + break; - this.state = 1222; - this.match(CParser.EOF); + } } catch (re) { if(re instanceof antlr4.error.RecognitionException) { localctx.exception = re; @@ -9305,12 +9318,12 @@ CParser.prototype.translationUnit = function(_p) { this.enterRecursionRule(localctx, 162, CParser.RULE_translationUnit, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1225; + this.state = 1227; this.externalDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1231; + this.state = 1233; this._errHandler.sync(this); - var _alt = this._interp.adaptivePredict(this._input,133,this._ctx) + var _alt = this._interp.adaptivePredict(this._input,134,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { if(this._parseListeners!==null) { @@ -9319,16 +9332,16 @@ CParser.prototype.translationUnit = function(_p) { _prevctx = localctx; localctx = new TranslationUnitContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_translationUnit); - this.state = 1227; + this.state = 1229; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1228; + this.state = 1230; this.externalDeclaration(); } - this.state = 1233; + this.state = 1235; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input,133,this._ctx); + _alt = this._interp.adaptivePredict(this._input,134,this._ctx); } } catch( error) { @@ -9391,24 +9404,24 @@ CParser.prototype.externalDeclaration = function() { var localctx = new ExternalDeclarationContext(this, this._ctx, this.state); this.enterRule(localctx, 164, CParser.RULE_externalDeclaration); try { - this.state = 1237; - var la_ = this._interp.adaptivePredict(this._input,134,this._ctx); + this.state = 1239; + var la_ = this._interp.adaptivePredict(this._input,135,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1234; + this.state = 1236; this.functionDefinition(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1235; + this.state = 1237; this.declaration(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1236; + this.state = 1238; this.match(CParser.Semi); break; @@ -9483,23 +9496,23 @@ CParser.prototype.functionDefinition = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1240; - var la_ = this._interp.adaptivePredict(this._input,135,this._ctx); + this.state = 1242; + var la_ = this._interp.adaptivePredict(this._input,136,this._ctx); if(la_===1) { - this.state = 1239; + this.state = 1241; this.declarationSpecifiers(); } - this.state = 1242; - this.declarator(); this.state = 1244; + this.declarator(); + this.state = 1246; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 1243; + this.state = 1245; this.declarationList(0); } - this.state = 1246; + this.state = 1248; this.compoundStatement(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -9565,12 +9578,12 @@ CParser.prototype.declarationList = function(_p) { this.enterRecursionRule(localctx, 168, CParser.RULE_declarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1249; + this.state = 1251; this.declaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1255; + this.state = 1257; this._errHandler.sync(this); - var _alt = this._interp.adaptivePredict(this._input,137,this._ctx) + var _alt = this._interp.adaptivePredict(this._input,138,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { if(this._parseListeners!==null) { @@ -9579,16 +9592,16 @@ CParser.prototype.declarationList = function(_p) { _prevctx = localctx; localctx = new DeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_declarationList); - this.state = 1251; + this.state = 1253; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1252; + this.state = 1254; this.declaration(); } - this.state = 1257; + this.state = 1259; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input,137,this._ctx); + _alt = this._interp.adaptivePredict(this._input,138,this._ctx); } } catch( error) { diff --git a/src/antlr.coffee b/src/antlr.coffee index 103a1b6f..e3f5f741 100644 --- a/src/antlr.coffee +++ b/src/antlr.coffee @@ -43,12 +43,15 @@ exports.createANTLRParser = (name, config, root) -> result.parent = parent else result.terminal = true - result.type = (node.parser ? node.parentCtx.parser).symbolicNames[node.symbol.type] result.children = [] result.bounds = getBounds node result.parent = parent - if node.symbol?.text + if node.symbol? + result.type = (node.parser ? node.parentCtx.parser).symbolicNames[node.symbol.type] result.data = {text: node.symbol.text} + else + result.type = node.parser.ruleNames[node.ruleIndex] + result.data = {} return result @@ -64,6 +67,17 @@ exports.createANTLRParser = (name, config, root) -> column: node.stop.column + node.stop.stop - node.stop.start + 1 } } + else if node.start? and not node.symbol? + return { + start: { + line: node.start.line - 1 + column: node.start.column + } + end: { + line: node.start.line - 1 + column: node.start.column + } + } else return { start: { diff --git a/src/languages/c.coffee b/src/languages/c.coffee index d44f16e6..c7a6a931 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -133,10 +133,10 @@ config.SHAPE_CALLBACK = (opts, node) -> return opts.knownFunctions[node.children[0].children[0].children[0].data.text].shape return null -config.isComment = -> +config.isComment = (text) -> text.match(/^(\s*\/\/.*)|(#.*)$/)? -config.parseComment = -> +config.parseComment = (text) -> # Try standard comment comment = text.match(/^(\s*\/\/)(.*)$/) if comment? @@ -144,18 +144,30 @@ config.parseComment = -> [comment[1].length, comment[1].length + comment[2].length] ] + if text.match(/^#\s*((?:else)|(?:endif))$/) + return [] + # Try #include or #ifdef directive - unary = text.match(/^(#\s*(?:(?:include)|(?:ifdef)|(?:ifndef))\s*)(.*)$/) + unary = text.match(/^(#\s*(?:(?:include)|(?:ifdef)|(?:ifndef)|(?:undef))\s*)(.*)$/) if unary? return [ [unary[1].length, unary[1].length + unary[2].length] ] # Try #define directive - binary = text.match(/^(#\s*(?:(?:define))\s*)(.*)$/) + binary = text.match(/^(#\s*(?:(?:define))\s*)([a-zA-Z_][0-9a-zA-Z_]*)(\s+)(.*)$/) + if binary? + return [ + [binary[1].length, binary[1].length + binary[2].length] + [binary[1].length + binary[2].length + binary[3].length, binary[1].length + binary[2].length + binary[3].length + binary[4].length] + ] + + # Try functional #define directive. + binary = text.match(/^(#\s*define\s*)([a-zA-Z_][0-9a-zA-Z_]*\s*\((?:[a-zA-Z_][0-9a-zA-Z_]*,\s)*[a-zA-Z_][0-9a-zA-Z_]*\s*\))(\s+)(.*)$/) if binary? return [ [binary[1].length, binary[1].length + binary[2].length] + [binary[1].length + binary[2].length + binary[3].length, binary[1].length + binary[2].length + binary[3].length + binary[4].length] ] # TODO Implement removing parentheses at some point diff --git a/src/parser.coffee b/src/parser.coffee index e81c6ed9..937c781d 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -206,34 +206,69 @@ exports.Parser = class Parser # text inside constructHandwrittenBlock: (text) -> block = new model.Block 0, 'comment', helper.ANY_DROP - socket = new model.Socket '', 0, true - socket.setParent block - if @isComment text - posAfterIndentAndCommentMarker = @indentAndCommentMarker(text).length - if posAfterIndentAndCommentMarker - textPrefix = text[...posAfterIndentAndCommentMarker] - text = text[posAfterIndentAndCommentMarker..] block.socketLevel = helper.BLOCK_ONLY block.classes = ['__comment__', 'block-only'] - socket.classes = ['__comment__'] - else - block.classes = ['__handwritten__', 'block-only'] - textToken = new model.TextToken text - textToken.setParent block + head = block.start + + sockets = @parseComment(text) + + lastPosition = 0 + + console.log sockets + + for socketPosition in sockets + socket = new model.Socket '', 0, true + socket.setParent block + + socket.classes = ['__comment__'] + + padText = text[lastPosition...socketPosition[0]] + + if padText.length > 0 + padTextToken = new model.TextToken padText + padTextToken.setParent block + + helper.connect head, padTextToken + + head = padTextToken + + textToken = new model.TextToken text[socketPosition[0]...socketPosition[1]] + textToken.setParent block + + helper.connect head, socket.start + helper.connect socket.start, textToken + helper.connect textToken, socket.end + + head = socket.end + + lastPosition = socketPosition[1] + + finalPadText = text[lastPosition...text.length] + + if finalPadText.length > 0 + finalPadTextToken = new model.TextToken finalPadText + finalPadTextToken.setParent block + + helper.connect head, finalPadTextToken + + head = finalPadTextToken + + helper.connect head, block.end - if textPrefix - textPrefixToken = new model.TextToken textPrefix - textPrefixToken.setParent block - helper.connect block.start, textPrefixToken - helper.connect textPrefixToken, socket.start else + socket = new model.Socket '', 0, true + textToken = new model.TextToken text + textToken.setParent socket + + block.classes = ['__handwritten__', 'block-only'] helper.connect block.start, socket.start - helper.connect socket.start, textToken - helper.connect textToken, socket.end - helper.connect socket.end, block.end + helper.connect socket.start, textToken + helper.connect textToken, socket.end + helper.connect socket.end, block.end + return block From cbf1ffa0a0d6a9e3f4f4d06f3874c8466c6f6c78 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 16 Jun 2016 13:39:32 -0400 Subject: [PATCH 122/268] Fix parseContext of handwritten blocks --- src/controller.coffee | 2 ++ src/languages/c.coffee | 20 +++++++++++++++----- src/parser.coffee | 5 ++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 720f957d..373ffb50 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -3215,6 +3215,8 @@ hook 'keydown', 0, (event, state) -> while head.type is 'newline' head = head.prev + newSocket.parseContext = head.parent.parseContext + @spliceIn newBlock, head #MUTATION @redrawMain() diff --git a/src/languages/c.coffee b/src/languages/c.coffee index c7a6a931..370f95e2 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -140,35 +140,45 @@ config.parseComment = (text) -> # Try standard comment comment = text.match(/^(\s*\/\/)(.*)$/) if comment? - return [ + ranges = [ [comment[1].length, comment[1].length + comment[2].length] ] + color = 'comment' if text.match(/^#\s*((?:else)|(?:endif))$/) - return [] + ranges = [] + color = 'purple' # Try #include or #ifdef directive unary = text.match(/^(#\s*(?:(?:include)|(?:ifdef)|(?:ifndef)|(?:undef))\s*)(.*)$/) if unary? - return [ + ranges = [ [unary[1].length, unary[1].length + unary[2].length] ] + color = 'purple' # Try #define directive binary = text.match(/^(#\s*(?:(?:define))\s*)([a-zA-Z_][0-9a-zA-Z_]*)(\s+)(.*)$/) if binary? - return [ + ranges = [ [binary[1].length, binary[1].length + binary[2].length] [binary[1].length + binary[2].length + binary[3].length, binary[1].length + binary[2].length + binary[3].length + binary[4].length] ] + color = 'purple' # Try functional #define directive. binary = text.match(/^(#\s*define\s*)([a-zA-Z_][0-9a-zA-Z_]*\s*\((?:[a-zA-Z_][0-9a-zA-Z_]*,\s)*[a-zA-Z_][0-9a-zA-Z_]*\s*\))(\s+)(.*)$/) if binary? - return [ + ranges = [ [binary[1].length, binary[1].length + binary[2].length] [binary[1].length + binary[2].length + binary[3].length, binary[1].length + binary[2].length + binary[3].length + binary[4].length] ] + color = 'purple' + + return { + sockets: ranges + color + } # TODO Implement removing parentheses at some point #config.unParenWrap = (leading, trailing, node, context) -> diff --git a/src/parser.coffee b/src/parser.coffee index 937c781d..9ae6fb1e 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -212,7 +212,10 @@ exports.Parser = class Parser head = block.start - sockets = @parseComment(text) + {sockets, color} = @parseComment(text) + + if color? + block.color = color lastPosition = 0 From c46a6cba1ed56b9c129e374edbc4c5083b3e30f0 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 16 Jun 2016 15:49:43 -0400 Subject: [PATCH 123/268] Fix bugs with the new pipeline --- src/controller.coffee | 2 ++ src/languages/c.coffee | 1 + src/languages/coffee.coffee | 4 +++- src/languages/javascript.coffee | 8 +++++--- src/treewalk.coffee | 2 ++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 373ffb50..62421dbc 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -180,6 +180,8 @@ exports.Editor = class Editor # element with all the necessary ICE editor components. @debugging = true + @options = helper.deepCopy @options + # ### Wrapper # Create the div that will contain all the ICE Editor graphics diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 370f95e2..e931c0e9 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -21,6 +21,7 @@ SKIPS = ['blockItemList', 'structDeclarationList', 'declarator', 'directDeclarator', + 'rootDeclarator', 'parameterTypeList', 'parameterList', 'argumentExpressionList', diff --git a/src/languages/coffee.coffee b/src/languages/coffee.coffee index 25e59414..1e911f13 100644 --- a/src/languages/coffee.coffee +++ b/src/languages/coffee.coffee @@ -218,7 +218,9 @@ exports.CoffeeScriptParser = class CoffeeScriptParser extends parser.Parser str.match(/^\s*#.*$/)? indentAndCommentMarker: (str) -> - str.match(/^\s*#/)?[0] + { + sockets: [[str.match(/^\s*#/)?[0].length, str.length]] + } stripComments: -> # Preprocess comment lines: diff --git a/src/languages/javascript.coffee b/src/languages/javascript.coffee index 47062509..9ca83128 100644 --- a/src/languages/javascript.coffee +++ b/src/languages/javascript.coffee @@ -343,10 +343,12 @@ exports.JavaScriptParser = class JavaScriptParser extends parser.Parser return line[indentDepth...(line.length - line.trimLeft().length)] isComment: (text) -> - text.match(/^\s*\/\/.*$/) + text.match(/^\s*\/\/.*$/)? - indentAndCommentMarker: (text) -> - text.match(/^\s*\/\//)[0] + parseComment: (text) -> + { + sockets: [[text.match(/^\s*\/\//)[0].length, text.length]] + } handleButton: (text, button, oldBlock) -> if button is 'add-button' and 'IfStatement' in oldBlock.classes diff --git a/src/treewalk.coffee b/src/treewalk.coffee index d55fc7f0..7c9b5a4d 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -198,6 +198,8 @@ exports.createTreewalkParser = (parse, config, root) -> TreewalkParser.drop = (block, context, pred) -> if context.type is 'socket' + if '__comment__' in context.classes + return helper.DISCOURAGE for c in context.classes if c in block.classes return helper.ENCOURAGE From fde7aa5a45ebae84f4ed0e80e8a393f0c825fb66 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 16 Jun 2016 17:27:41 -0400 Subject: [PATCH 124/268] Fix all the tests --- antlr/C.g4 | 9 +- antlr/CListener.js | 9 + antlr/CParser.js | 2637 ++++++++++++++++++----------------- src/controller.coffee | 6 +- src/helper.coffee | 9 +- src/languages/c.coffee | 17 +- src/languages/coffee.coffee | 2 +- src/parser.coffee | 2 - src/treewalk.coffee | 2 +- 9 files changed, 1403 insertions(+), 1290 deletions(-) diff --git a/antlr/C.g4 b/antlr/C.g4 index 31fe5aee..0b0547dc 100644 --- a/antlr/C.g4 +++ b/antlr/C.g4 @@ -476,11 +476,18 @@ blockItemList | blockItemList blockItem ; +// A block item can be a special kind of function call, which we +// check before we check declarations to avoid conflicts with a (b);. blockItem - : declaration + : specialMethodCall + | declaration | statement ; +specialMethodCall + : postfixExpression '(' assignmentExpression ')' ';' + ; + expressionStatement : expression? ';' ; diff --git a/antlr/CListener.js b/antlr/CListener.js index a0bd03dd..69af17b0 100644 --- a/antlr/CListener.js +++ b/antlr/CListener.js @@ -695,6 +695,15 @@ CListener.prototype.exitBlockItem = function(ctx) { }; +// Enter a parse tree produced by CParser#specialMethodCall. +CListener.prototype.enterSpecialMethodCall = function(ctx) { +}; + +// Exit a parse tree produced by CParser#specialMethodCall. +CListener.prototype.exitSpecialMethodCall = function(ctx) { +}; + + // Enter a parse tree produced by CParser#expressionStatement. CListener.prototype.enterExpressionStatement = function(ctx) { }; diff --git a/antlr/CParser.js b/antlr/CParser.js index 6262df06..5033c668 100644 --- a/antlr/CParser.js +++ b/antlr/CParser.js @@ -5,7 +5,7 @@ var CListener = require('./CListener').CListener; var grammarFileName = "C.g4"; var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\3s\u04ef\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", + "\3s\u04f8\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", "\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t", "\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27", "\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4", @@ -14,492 +14,495 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\61\4\62\t\62\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t", "8\49\t9\4:\t:\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC", "\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4", - "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\3\2\3\2\3\2\6\2\u00b0", - "\n\2\r\2\16\2\u00b1\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00ba\n\2\3\2\3\2\3", - "\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00ce", - "\n\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u00dd\n", - "\4\f\4\16\4\u00e0\13\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u00e9\n\5\3\6", + "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\3\2\3\2\3\2\6\2", + "\u00b2\n\2\r\2\16\2\u00b3\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00bc\n\2\3\2", + "\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2", + "\5\2\u00d0\n\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7", + "\4\u00df\n\4\f\4\16\4\u00e2\13\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u00eb", + "\n\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", - "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6", - "\u010d\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0117\n\6\3\6\3\6\3\6", - "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u0124\n\6\f\6\16\6\u0127\13\6\3", - "\7\3\7\3\7\3\7\3\7\3\7\7\7\u012f\n\7\f\7\16\7\u0132\13\7\3\b\3\b\3\b", + "\3\6\5\6\u010f\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0119\n\6\3\6", + "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u0126\n\6\f\6\16\6\u0129", + "\13\6\3\7\3\7\3\7\3\7\3\7\3\7\7\7\u0131\n\7\f\7\16\7\u0134\13\7\3\b", "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", - "\3\b\3\b\5\b\u014a\n\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3", - "\n\3\n\3\n\5\n\u015a\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13", - "\3\13\3\13\3\13\7\13\u0168\n\13\f\13\16\13\u016b\13\13\3\f\3\f\3\f\3", - "\f\3\f\3\f\3\f\3\f\3\f\7\f\u0176\n\f\f\f\16\f\u0179\13\f\3\r\3\r\3\r", - "\3\r\3\r\3\r\3\r\3\r\3\r\7\r\u0184\n\r\f\r\16\r\u0187\13\r\3\16\3\16", - "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\7", - "\16\u0198\n\16\f\16\16\16\u019b\13\16\3\17\3\17\3\17\3\17\3\17\3\17", - "\3\17\3\17\3\17\7\17\u01a6\n\17\f\17\16\17\u01a9\13\17\3\20\3\20\3\20", - "\3\20\3\20\3\20\7\20\u01b1\n\20\f\20\16\20\u01b4\13\20\3\21\3\21\3\21", - "\3\21\3\21\3\21\7\21\u01bc\n\21\f\21\16\21\u01bf\13\21\3\22\3\22\3\22", - "\3\22\3\22\3\22\7\22\u01c7\n\22\f\22\16\22\u01ca\13\22\3\23\3\23\3\23", - "\3\23\3\23\3\23\7\23\u01d2\n\23\f\23\16\23\u01d5\13\23\3\24\3\24\3\24", - "\3\24\3\24\3\24\7\24\u01dd\n\24\f\24\16\24\u01e0\13\24\3\25\3\25\3\25", - "\3\25\3\25\3\25\5\25\u01e8\n\25\3\26\3\26\3\26\3\26\3\26\5\26\u01ef", - "\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01f9\n\30\f\30\16", - "\30\u01fc\13\30\3\31\3\31\3\32\3\32\5\32\u0202\n\32\3\32\3\32\3\32\5", - "\32\u0207\n\32\3\33\6\33\u020a\n\33\r\33\16\33\u020b\3\34\6\34\u020f", - "\n\34\r\34\16\34\u0210\3\35\3\35\3\35\3\35\3\35\5\35\u0218\n\35\3\36", - "\3\36\3\36\3\36\3\36\3\36\7\36\u0220\n\36\f\36\16\36\u0223\13\36\3\37", - "\3\37\3\37\3\37\3\37\5\37\u022a\n\37\3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3", - "!\3!\3!\3!\3!\3!\5!\u023c\n!\3\"\3\"\5\"\u0240\n\"\3\"\3\"\3\"\3\"\3", - "\"\5\"\u0247\n\"\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%\7%\u0254\n%\f%\16", - "%\u0257\13%\3&\3&\5&\u025b\n&\3&\3&\3&\5&\u0260\n&\3\'\3\'\5\'\u0264", - "\n\'\3\'\3\'\5\'\u0268\n\'\5\'\u026a\n\'\3(\3(\3(\3(\3(\3(\7(\u0272", - "\n(\f(\16(\u0275\13(\3)\3)\5)\u0279\n)\3)\3)\5)\u027d\n)\3*\3*\5*\u0281", - "\n*\3*\3*\3*\3*\3*\3*\5*\u0289\n*\3*\3*\3*\3*\3*\3*\3*\5*\u0292\n*\3", - "+\3+\3+\3+\3+\3+\7+\u029a\n+\f+\16+\u029d\13+\3,\3,\3,\3,\3,\5,\u02a4", - "\n,\3-\3-\3.\3.\3.\3.\3.\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u02b5", - "\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02c1\n", - "\61\3\62\5\62\u02c4\n\62\3\62\3\62\7\62\u02c8\n\62\f\62\16\62\u02cb", - "\13\62\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u02d3\n\63\3\63\3\63\3\63", - "\5\63\u02d8\n\63\3\63\5\63\u02db\n\63\3\63\3\63\3\63\3\63\3\63\5\63", - "\u02e2\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", - "\63\3\63\5\63\u02f1\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63", - "\3\63\5\63\u02fd\n\63\3\63\7\63\u0300\n\63\f\63\16\63\u0303\13\63\3", - "\64\3\64\3\64\6\64\u0308\n\64\r\64\16\64\u0309\3\64\3\64\5\64\u030e", - "\n\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\7\66\u031a\n", - "\66\f\66\16\66\u031d\13\66\3\66\5\66\u0320\n\66\3\67\3\67\3\67\5\67", - "\u0325\n\67\3\67\5\67\u0328\n\67\3\67\5\67\u032b\n\67\38\38\38\38\3", - "8\78\u0332\n8\f8\168\u0335\138\39\39\59\u0339\n9\39\39\59\u033d\n9\3", - "9\39\39\59\u0342\n9\39\39\59\u0346\n9\39\59\u0349\n9\3:\3:\3:\3:\3:", - "\7:\u0350\n:\f:\16:\u0353\13:\3;\3;\3;\3;\3;\5;\u035a\n;\3<\3<\3<\3", - "<\3<\3<\7<\u0362\n<\f<\16<\u0365\13<\3=\3=\3=\3=\3=\5=\u036c\n=\5=\u036e", - "\n=\3>\3>\3>\3>\3>\3>\7>\u0376\n>\f>\16>\u0379\13>\3?\3?\5?\u037d\n", - "?\3@\3@\5@\u0381\n@\3@\3@\7@\u0385\n@\f@\16@\u0388\13@\5@\u038a\n@\3", - "A\3A\3A\3A\3A\7A\u0391\nA\fA\16A\u0394\13A\3A\3A\5A\u0398\nA\3A\5A\u039b", - "\nA\3A\3A\3A\3A\5A\u03a1\nA\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3", - "A\5A\u03b1\nA\3A\3A\7A\u03b5\nA\fA\16A\u03b8\13A\5A\u03ba\nA\3A\3A\3", - "A\5A\u03bf\nA\3A\5A\u03c2\nA\3A\3A\3A\3A\3A\5A\u03c9\nA\3A\3A\3A\3A", - "\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\5A\u03dc\nA\3A\3A\7A\u03e0\n", - "A\fA\16A\u03e3\13A\7A\u03e5\nA\fA\16A\u03e8\13A\3B\3B\3C\3C\3C\3C\3", - "C\3C\3C\3C\3C\3C\5C\u03f6\nC\3D\3D\5D\u03fa\nD\3D\3D\3D\3D\3D\5D\u0401", - "\nD\3D\7D\u0404\nD\fD\16D\u0407\13D\3E\3E\3E\3F\3F\3F\3F\3F\7F\u0411", - "\nF\fF\16F\u0414\13F\3G\3G\3G\3G\3G\3G\5G\u041c\nG\3H\3H\3H\3H\3H\6", - "H\u0423\nH\rH\16H\u0424\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3", - "I\7I\u0436\nI\fI\16I\u0439\13I\5I\u043b\nI\3I\3I\3I\3I\7I\u0441\nI\f", - "I\16I\u0444\13I\5I\u0446\nI\7I\u0448\nI\fI\16I\u044b\13I\3I\3I\5I\u044f", - "\nI\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u045c\nJ\3K\3K\5K\u0460\nK\3", - "K\3K\3L\3L\3L\3L\3L\7L\u0469\nL\fL\16L\u046c\13L\3M\3M\5M\u0470\nM\3", - "N\5N\u0473\nN\3N\3N\3O\3O\3O\3O\3O\3O\3O\5O\u047e\nO\3O\3O\3O\3O\3O", - "\3O\5O\u0486\nO\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\5", - "P\u0499\nP\3P\3P\5P\u049d\nP\3P\3P\5P\u04a1\nP\3P\3P\3P\3P\3P\3P\5P", - "\u04a9\nP\3P\3P\5P\u04ad\nP\3P\3P\3P\5P\u04b2\nP\3Q\3Q\3Q\3Q\3Q\3Q\3", - "Q\3Q\3Q\5Q\u04bd\nQ\3Q\3Q\3Q\3Q\3Q\5Q\u04c4\nQ\3R\5R\u04c7\nR\3R\3R", - "\5R\u04cb\nR\3S\3S\3S\3S\3S\7S\u04d2\nS\fS\16S\u04d5\13S\3T\3T\3T\5", - "T\u04da\nT\3U\5U\u04dd\nU\3U\3U\5U\u04e1\nU\3U\3U\3V\3V\3V\3V\3V\7V", - "\u04ea\nV\fV\16V\u04ed\13V\3V\2\36\6\n\f\24\26\30\32\34\36 \"$&.:HN", - "Tdrvz\u0080\u0086\u008a\u0096\u00a4\u00aaW\2\4\6\b\n\f\16\20\22\24\26", - "\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvx", - "z|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094", - "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\2", - "\16\7\2IIKKMMPPUV\3\2[e\b\2\21\21\34\34$$**--<<\n\2\6\b\24\24\31\31", - "\35\35\"#\'(/\60\66\67\3\2\6\b\4\2++..\6\2\25\25%%\61\61\65\65\5\2\n", - "\13!!::\4\2=>ZZ\3\2=>\4\2\r\r\17\17\4\2\20\20\61\61\u055f\2\u00cd\3", - "\2\2\2\4\u00cf\3\2\2\2\6\u00d6\3\2\2\2\b\u00e8\3\2\2\2\n\u010c\3\2\2", - "\2\f\u0128\3\2\2\2\16\u0149\3\2\2\2\20\u014b\3\2\2\2\22\u0159\3\2\2", - "\2\24\u015b\3\2\2\2\26\u016c\3\2\2\2\30\u017a\3\2\2\2\32\u0188\3\2\2", - "\2\34\u019c\3\2\2\2\36\u01aa\3\2\2\2 \u01b5\3\2\2\2\"\u01c0\3\2\2\2", - "$\u01cb\3\2\2\2&\u01d6\3\2\2\2(\u01e1\3\2\2\2*\u01ee\3\2\2\2,\u01f0", - "\3\2\2\2.\u01f2\3\2\2\2\60\u01fd\3\2\2\2\62\u0206\3\2\2\2\64\u0209\3", - "\2\2\2\66\u020e\3\2\2\28\u0217\3\2\2\2:\u0219\3\2\2\2<\u0229\3\2\2\2", - ">\u022b\3\2\2\2@\u023b\3\2\2\2B\u0246\3\2\2\2D\u0248\3\2\2\2F\u024a", - "\3\2\2\2H\u024e\3\2\2\2J\u025f\3\2\2\2L\u0269\3\2\2\2N\u026b\3\2\2\2", - "P\u027c\3\2\2\2R\u0291\3\2\2\2T\u0293\3\2\2\2V\u02a3\3\2\2\2X\u02a5", - "\3\2\2\2Z\u02a7\3\2\2\2\\\u02ac\3\2\2\2^\u02b4\3\2\2\2`\u02c0\3\2\2", - "\2b\u02c3\3\2\2\2d\u02d2\3\2\2\2f\u030d\3\2\2\2h\u030f\3\2\2\2j\u031f", - "\3\2\2\2l\u032a\3\2\2\2n\u0333\3\2\2\2p\u0348\3\2\2\2r\u034a\3\2\2\2", - "t\u0359\3\2\2\2v\u035b\3\2\2\2x\u036d\3\2\2\2z\u036f\3\2\2\2|\u037a", - "\3\2\2\2~\u0389\3\2\2\2\u0080\u03b9\3\2\2\2\u0082\u03e9\3\2\2\2\u0084", - "\u03f5\3\2\2\2\u0086\u03f7\3\2\2\2\u0088\u0408\3\2\2\2\u008a\u040b\3", - "\2\2\2\u008c\u041b\3\2\2\2\u008e\u041d\3\2\2\2\u0090\u044e\3\2\2\2\u0092", - "\u045b\3\2\2\2\u0094\u045d\3\2\2\2\u0096\u0463\3\2\2\2\u0098\u046f\3", - "\2\2\2\u009a\u0472\3\2\2\2\u009c\u0485\3\2\2\2\u009e\u04b1\3\2\2\2\u00a0", - "\u04c3\3\2\2\2\u00a2\u04ca\3\2\2\2\u00a4\u04cc\3\2\2\2\u00a6\u04d9\3", - "\2\2\2\u00a8\u04dc\3\2\2\2\u00aa\u04e4\3\2\2\2\u00ac\u00ce\7k\2\2\u00ad", - "\u00ce\7l\2\2\u00ae\u00b0\7m\2\2\u00af\u00ae\3\2\2\2\u00b0\u00b1\3\2", - "\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00ce\3\2\2\2\u00b3", - "\u00b4\7=\2\2\u00b4\u00b5\5.\30\2\u00b5\u00b6\7>\2\2\u00b6\u00ce\3\2", - "\2\2\u00b7\u00ce\5\4\3\2\u00b8\u00ba\7\3\2\2\u00b9\u00b8\3\2\2\2\u00b9", - "\u00ba\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb\u00bc\7=\2\2\u00bc\u00bd\5", - "\u0094K\2\u00bd\u00be\7>\2\2\u00be\u00ce\3\2\2\2\u00bf\u00c0\7\4\2\2", - "\u00c0\u00c1\7=\2\2\u00c1\u00c2\5\16\b\2\u00c2\u00c3\7Z\2\2\u00c3\u00c4", - "\5|?\2\u00c4\u00c5\7>\2\2\u00c5\u00ce\3\2\2\2\u00c6\u00c7\7\5\2\2\u00c7", - "\u00c8\7=\2\2\u00c8\u00c9\5|?\2\u00c9\u00ca\7Z\2\2\u00ca\u00cb\5\16", - "\b\2\u00cb\u00cc\7>\2\2\u00cc\u00ce\3\2\2\2\u00cd\u00ac\3\2\2\2\u00cd", - "\u00ad\3\2\2\2\u00cd\u00af\3\2\2\2\u00cd\u00b3\3\2\2\2\u00cd\u00b7\3", - "\2\2\2\u00cd\u00b9\3\2\2\2\u00cd\u00bf\3\2\2\2\u00cd\u00c6\3\2\2\2\u00ce", - "\3\3\2\2\2\u00cf\u00d0\78\2\2\u00d0\u00d1\7=\2\2\u00d1\u00d2\5*\26\2", - "\u00d2\u00d3\7Z\2\2\u00d3\u00d4\5\6\4\2\u00d4\u00d5\7>\2\2\u00d5\5\3", - "\2\2\2\u00d6\u00d7\b\4\1\2\u00d7\u00d8\5\b\5\2\u00d8\u00de\3\2\2\2\u00d9", - "\u00da\f\3\2\2\u00da\u00db\7Z\2\2\u00db\u00dd\5\b\5\2\u00dc\u00d9\3", - "\2\2\2\u00dd\u00e0\3\2\2\2\u00de\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df", - "\7\3\2\2\2\u00e0\u00de\3\2\2\2\u00e1\u00e2\5|?\2\u00e2\u00e3\7X\2\2", - "\u00e3\u00e4\5*\26\2\u00e4\u00e9\3\2\2\2\u00e5\u00e6\7\27\2\2\u00e6", - "\u00e7\7X\2\2\u00e7\u00e9\5*\26\2\u00e8\u00e1\3\2\2\2\u00e8\u00e5\3", - "\2\2\2\u00e9\t\3\2\2\2\u00ea\u00eb\b\6\1\2\u00eb\u010d\5\2\2\2\u00ec", - "\u00ed\7=\2\2\u00ed\u00ee\5|?\2\u00ee\u00ef\7>\2\2\u00ef\u00f0\7A\2", - "\2\u00f0\u00f1\5\u0086D\2\u00f1\u00f2\7B\2\2\u00f2\u010d\3\2\2\2\u00f3", - "\u00f4\7=\2\2\u00f4\u00f5\5|?\2\u00f5\u00f6\7>\2\2\u00f6\u00f7\7A\2", - "\2\u00f7\u00f8\5\u0086D\2\u00f8\u00f9\7Z\2\2\u00f9\u00fa\7B\2\2\u00fa", - "\u010d\3\2\2\2\u00fb\u00fc\7\3\2\2\u00fc\u00fd\7=\2\2\u00fd\u00fe\5", - "|?\2\u00fe\u00ff\7>\2\2\u00ff\u0100\7A\2\2\u0100\u0101\5\u0086D\2\u0101", - "\u0102\7B\2\2\u0102\u010d\3\2\2\2\u0103\u0104\7\3\2\2\u0104\u0105\7", - "=\2\2\u0105\u0106\5|?\2\u0106\u0107\7>\2\2\u0107\u0108\7A\2\2\u0108", - "\u0109\5\u0086D\2\u0109\u010a\7Z\2\2\u010a\u010b\7B\2\2\u010b\u010d", - "\3\2\2\2\u010c\u00ea\3\2\2\2\u010c\u00ec\3\2\2\2\u010c\u00f3\3\2\2\2", - "\u010c\u00fb\3\2\2\2\u010c\u0103\3\2\2\2\u010d\u0125\3\2\2\2\u010e\u010f", - "\f\f\2\2\u010f\u0110\7?\2\2\u0110\u0111\5.\30\2\u0111\u0112\7@\2\2\u0112", - "\u0124\3\2\2\2\u0113\u0114\f\13\2\2\u0114\u0116\7=\2\2\u0115\u0117\5", - "\f\7\2\u0116\u0115\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u0118\3\2\2\2\u0118", - "\u0124\7>\2\2\u0119\u011a\f\n\2\2\u011a\u011b\7i\2\2\u011b\u0124\7k", - "\2\2\u011c\u011d\f\t\2\2\u011d\u011e\7h\2\2\u011e\u0124\7k\2\2\u011f", - "\u0120\f\b\2\2\u0120\u0124\7J\2\2\u0121\u0122\f\7\2\2\u0122\u0124\7", - "L\2\2\u0123\u010e\3\2\2\2\u0123\u0113\3\2\2\2\u0123\u0119\3\2\2\2\u0123", - "\u011c\3\2\2\2\u0123\u011f\3\2\2\2\u0123\u0121\3\2\2\2\u0124\u0127\3", - "\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2\2\2\u0126\13\3\2\2\2\u0127", - "\u0125\3\2\2\2\u0128\u0129\b\7\1\2\u0129\u012a\5*\26\2\u012a\u0130\3", - "\2\2\2\u012b\u012c\f\3\2\2\u012c\u012d\7Z\2\2\u012d\u012f\5*\26\2\u012e", - "\u012b\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u012e\3\2\2\2\u0130\u0131\3", - "\2\2\2\u0131\r\3\2\2\2\u0132\u0130\3\2\2\2\u0133\u014a\5\n\6\2\u0134", - "\u0135\7J\2\2\u0135\u014a\5\16\b\2\u0136\u0137\7L\2\2\u0137\u014a\5", - "\16\b\2\u0138\u0139\5\20\t\2\u0139\u013a\5\22\n\2\u013a\u014a\3\2\2", - "\2\u013b\u013c\7)\2\2\u013c\u014a\5\16\b\2\u013d\u013e\7)\2\2\u013e", - "\u013f\7=\2\2\u013f\u0140\5|?\2\u0140\u0141\7>\2\2\u0141\u014a\3\2\2", - "\2\u0142\u0143\7\64\2\2\u0143\u0144\7=\2\2\u0144\u0145\5|?\2\u0145\u0146", - "\7>\2\2\u0146\u014a\3\2\2\2\u0147\u0148\7R\2\2\u0148\u014a\7k\2\2\u0149", - "\u0133\3\2\2\2\u0149\u0134\3\2\2\2\u0149\u0136\3\2\2\2\u0149\u0138\3", - "\2\2\2\u0149\u013b\3\2\2\2\u0149\u013d\3\2\2\2\u0149\u0142\3\2\2\2\u0149", - "\u0147\3\2\2\2\u014a\17\3\2\2\2\u014b\u014c\t\2\2\2\u014c\21\3\2\2\2", - "\u014d\u015a\5\16\b\2\u014e\u014f\7=\2\2\u014f\u0150\5|?\2\u0150\u0151", - "\7>\2\2\u0151\u0152\5\22\n\2\u0152\u015a\3\2\2\2\u0153\u0154\7\3\2\2", - "\u0154\u0155\7=\2\2\u0155\u0156\5|?\2\u0156\u0157\7>\2\2\u0157\u0158", - "\5\22\n\2\u0158\u015a\3\2\2\2\u0159\u014d\3\2\2\2\u0159\u014e\3\2\2", - "\2\u0159\u0153\3\2\2\2\u015a\23\3\2\2\2\u015b\u015c\b\13\1\2\u015c\u015d", - "\5\22\n\2\u015d\u0169\3\2\2\2\u015e\u015f\f\5\2\2\u015f\u0160\7M\2\2", - "\u0160\u0168\5\22\n\2\u0161\u0162\f\4\2\2\u0162\u0163\7N\2\2\u0163\u0168", - "\5\22\n\2\u0164\u0165\f\3\2\2\u0165\u0166\7O\2\2\u0166\u0168\5\22\n", - "\2\u0167\u015e\3\2\2\2\u0167\u0161\3\2\2\2\u0167\u0164\3\2\2\2\u0168", - "\u016b\3\2\2\2\u0169\u0167\3\2\2\2\u0169\u016a\3\2\2\2\u016a\25\3\2", - "\2\2\u016b\u0169\3\2\2\2\u016c\u016d\b\f\1\2\u016d\u016e\5\24\13\2\u016e", - "\u0177\3\2\2\2\u016f\u0170\f\4\2\2\u0170\u0171\7I\2\2\u0171\u0176\5", - "\24\13\2\u0172\u0173\f\3\2\2\u0173\u0174\7K\2\2\u0174\u0176\5\24\13", - "\2\u0175\u016f\3\2\2\2\u0175\u0172\3\2\2\2\u0176\u0179\3\2\2\2\u0177", - "\u0175\3\2\2\2\u0177\u0178\3\2\2\2\u0178\27\3\2\2\2\u0179\u0177\3\2", - "\2\2\u017a\u017b\b\r\1\2\u017b\u017c\5\26\f\2\u017c\u0185\3\2\2\2\u017d", - "\u017e\f\4\2\2\u017e\u017f\7G\2\2\u017f\u0184\5\26\f\2\u0180\u0181\f", - "\3\2\2\u0181\u0182\7H\2\2\u0182\u0184\5\26\f\2\u0183\u017d\3\2\2\2\u0183", - "\u0180\3\2\2\2\u0184\u0187\3\2\2\2\u0185\u0183\3\2\2\2\u0185\u0186\3", - "\2\2\2\u0186\31\3\2\2\2\u0187\u0185\3\2\2\2\u0188\u0189\b\16\1\2\u0189", - "\u018a\5\30\r\2\u018a\u0199\3\2\2\2\u018b\u018c\f\6\2\2\u018c\u018d", - "\7C\2\2\u018d\u0198\5\30\r\2\u018e\u018f\f\5\2\2\u018f\u0190\7E\2\2", - "\u0190\u0198\5\30\r\2\u0191\u0192\f\4\2\2\u0192\u0193\7D\2\2\u0193\u0198", - "\5\30\r\2\u0194\u0195\f\3\2\2\u0195\u0196\7F\2\2\u0196\u0198\5\30\r", - "\2\u0197\u018b\3\2\2\2\u0197\u018e\3\2\2\2\u0197\u0191\3\2\2\2\u0197", - "\u0194\3\2\2\2\u0198\u019b\3\2\2\2\u0199\u0197\3\2\2\2\u0199\u019a\3", - "\2\2\2\u019a\33\3\2\2\2\u019b\u0199\3\2\2\2\u019c\u019d\b\17\1\2\u019d", - "\u019e\5\32\16\2\u019e\u01a7\3\2\2\2\u019f\u01a0\f\4\2\2\u01a0\u01a1", - "\7f\2\2\u01a1\u01a6\5\32\16\2\u01a2\u01a3\f\3\2\2\u01a3\u01a4\7g\2\2", - "\u01a4\u01a6\5\32\16\2\u01a5\u019f\3\2\2\2\u01a5\u01a2\3\2\2\2\u01a6", - "\u01a9\3\2\2\2\u01a7\u01a5\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\35\3\2", - "\2\2\u01a9\u01a7\3\2\2\2\u01aa\u01ab\b\20\1\2\u01ab\u01ac\5\34\17\2", - "\u01ac\u01b2\3\2\2\2\u01ad\u01ae\f\3\2\2\u01ae\u01af\7P\2\2\u01af\u01b1", - "\5\34\17\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2\2", - "\2\u01b2\u01b3\3\2\2\2\u01b3\37\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b6", - "\b\21\1\2\u01b6\u01b7\5\36\20\2\u01b7\u01bd\3\2\2\2\u01b8\u01b9\f\3", - "\2\2\u01b9\u01ba\7T\2\2\u01ba\u01bc\5\36\20\2\u01bb\u01b8\3\2\2\2\u01bc", - "\u01bf\3\2\2\2\u01bd\u01bb\3\2\2\2\u01bd\u01be\3\2\2\2\u01be!\3\2\2", - "\2\u01bf\u01bd\3\2\2\2\u01c0\u01c1\b\22\1\2\u01c1\u01c2\5 \21\2\u01c2", - "\u01c8\3\2\2\2\u01c3\u01c4\f\3\2\2\u01c4\u01c5\7Q\2\2\u01c5\u01c7\5", - " \21\2\u01c6\u01c3\3\2\2\2\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8", - "\u01c9\3\2\2\2\u01c9#\3\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01cc\b\23\1", - "\2\u01cc\u01cd\5\"\22\2\u01cd\u01d3\3\2\2\2\u01ce\u01cf\f\3\2\2\u01cf", - "\u01d0\7R\2\2\u01d0\u01d2\5\"\22\2\u01d1\u01ce\3\2\2\2\u01d2\u01d5\3", - "\2\2\2\u01d3\u01d1\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4%\3\2\2\2\u01d5", - "\u01d3\3\2\2\2\u01d6\u01d7\b\24\1\2\u01d7\u01d8\5$\23\2\u01d8\u01de", - "\3\2\2\2\u01d9\u01da\f\3\2\2\u01da\u01db\7S\2\2\u01db\u01dd\5$\23\2", - "\u01dc\u01d9\3\2\2\2\u01dd\u01e0\3\2\2\2\u01de\u01dc\3\2\2\2\u01de\u01df", - "\3\2\2\2\u01df\'\3\2\2\2\u01e0\u01de\3\2\2\2\u01e1\u01e7\5&\24\2\u01e2", - "\u01e3\7W\2\2\u01e3\u01e4\5.\30\2\u01e4\u01e5\7X\2\2\u01e5\u01e6\5(", - "\25\2\u01e6\u01e8\3\2\2\2\u01e7\u01e2\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8", - ")\3\2\2\2\u01e9\u01ef\5(\25\2\u01ea\u01eb\5\16\b\2\u01eb\u01ec\5,\27", - "\2\u01ec\u01ed\5*\26\2\u01ed\u01ef\3\2\2\2\u01ee\u01e9\3\2\2\2\u01ee", - "\u01ea\3\2\2\2\u01ef+\3\2\2\2\u01f0\u01f1\t\3\2\2\u01f1-\3\2\2\2\u01f2", - "\u01f3\b\30\1\2\u01f3\u01f4\5*\26\2\u01f4\u01fa\3\2\2\2\u01f5\u01f6", - "\f\3\2\2\u01f6\u01f7\7Z\2\2\u01f7\u01f9\5*\26\2\u01f8\u01f5\3\2\2\2", - "\u01f9\u01fc\3\2\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb/", - "\3\2\2\2\u01fc\u01fa\3\2\2\2\u01fd\u01fe\5(\25\2\u01fe\61\3\2\2\2\u01ff", - "\u0201\5\64\33\2\u0200\u0202\5:\36\2\u0201\u0200\3\2\2\2\u0201\u0202", - "\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0204\7Y\2\2\u0204\u0207\3\2\2\2", - "\u0205\u0207\5\u008eH\2\u0206\u01ff\3\2\2\2\u0206\u0205\3\2\2\2\u0207", - "\63\3\2\2\2\u0208\u020a\58\35\2\u0209\u0208\3\2\2\2\u020a\u020b\3\2", - "\2\2\u020b\u0209\3\2\2\2\u020b\u020c\3\2\2\2\u020c\65\3\2\2\2\u020d", - "\u020f\58\35\2\u020e\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u020e\3", - "\2\2\2\u0210\u0211\3\2\2\2\u0211\67\3\2\2\2\u0212\u0218\5> \2\u0213", - "\u0218\5@!\2\u0214\u0218\5\\/\2\u0215\u0218\5^\60\2\u0216\u0218\5`\61", - "\2\u0217\u0212\3\2\2\2\u0217\u0213\3\2\2\2\u0217\u0214\3\2\2\2\u0217", - "\u0215\3\2\2\2\u0217\u0216\3\2\2\2\u02189\3\2\2\2\u0219\u021a\b\36\1", - "\2\u021a\u021b\5<\37\2\u021b\u0221\3\2\2\2\u021c\u021d\f\3\2\2\u021d", - "\u021e\7Z\2\2\u021e\u0220\5<\37\2\u021f\u021c\3\2\2\2\u0220\u0223\3", - "\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222\3\2\2\2\u0222;\3\2\2\2\u0223", - "\u0221\3\2\2\2\u0224\u022a\5b\62\2\u0225\u0226\5b\62\2\u0226\u0227\7", - "[\2\2\u0227\u0228\5\u0084C\2\u0228\u022a\3\2\2\2\u0229\u0224\3\2\2\2", - "\u0229\u0225\3\2\2\2\u022a=\3\2\2\2\u022b\u022c\t\4\2\2\u022c?\3\2\2", - "\2\u022d\u023c\t\5\2\2\u022e\u022f\7\3\2\2\u022f\u0230\7=\2\2\u0230", - "\u0231\t\6\2\2\u0231\u023c\7>\2\2\u0232\u023c\5Z.\2\u0233\u023c\5B\"", - "\2\u0234\u023c\5R*\2\u0235\u023c\5\u0082B\2\u0236\u0237\7\t\2\2\u0237", - "\u0238\7=\2\2\u0238\u0239\5\60\31\2\u0239\u023a\7>\2\2\u023a\u023c\3", - "\2\2\2\u023b\u022d\3\2\2\2\u023b\u022e\3\2\2\2\u023b\u0232\3\2\2\2\u023b", - "\u0233\3\2\2\2\u023b\u0234\3\2\2\2\u023b\u0235\3\2\2\2\u023b\u0236\3", - "\2\2\2\u023cA\3\2\2\2\u023d\u023f\5D#\2\u023e\u0240\7k\2\2\u023f\u023e", - "\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241\3\2\2\2\u0241\u0242\5F$\2\u0242", - "\u0247\3\2\2\2\u0243\u0244\5D#\2\u0244\u0245\7k\2\2\u0245\u0247\3\2", - "\2\2\u0246\u023d\3\2\2\2\u0246\u0243\3\2\2\2\u0247C\3\2\2\2\u0248\u0249", - "\t\7\2\2\u0249E\3\2\2\2\u024a\u024b\7A\2\2\u024b\u024c\5H%\2\u024c\u024d", - "\7B\2\2\u024dG\3\2\2\2\u024e\u024f\b%\1\2\u024f\u0250\5J&\2\u0250\u0255", - "\3\2\2\2\u0251\u0252\f\3\2\2\u0252\u0254\5J&\2\u0253\u0251\3\2\2\2\u0254", - "\u0257\3\2\2\2\u0255\u0253\3\2\2\2\u0255\u0256\3\2\2\2\u0256I\3\2\2", - "\2\u0257\u0255\3\2\2\2\u0258\u025a\5L\'\2\u0259\u025b\5N(\2\u025a\u0259", - "\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u025c\3\2\2\2\u025c\u025d\7Y\2\2", - "\u025d\u0260\3\2\2\2\u025e\u0260\5\u008eH\2\u025f\u0258\3\2\2\2\u025f", - "\u025e\3\2\2\2\u0260K\3\2\2\2\u0261\u0263\5@!\2\u0262\u0264\5L\'\2\u0263", - "\u0262\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u026a\3\2\2\2\u0265\u0267\5", - "\\/\2\u0266\u0268\5L\'\2\u0267\u0266\3\2\2\2\u0267\u0268\3\2\2\2\u0268", - "\u026a\3\2\2\2\u0269\u0261\3\2\2\2\u0269\u0265\3\2\2\2\u026aM\3\2\2", - "\2\u026b\u026c\b(\1\2\u026c\u026d\5P)\2\u026d\u0273\3\2\2\2\u026e\u026f", - "\f\3\2\2\u026f\u0270\7Z\2\2\u0270\u0272\5P)\2\u0271\u026e\3\2\2\2\u0272", - "\u0275\3\2\2\2\u0273\u0271\3\2\2\2\u0273\u0274\3\2\2\2\u0274O\3\2\2", - "\2\u0275\u0273\3\2\2\2\u0276\u027d\5b\62\2\u0277\u0279\5b\62\2\u0278", - "\u0277\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u027a\3\2\2\2\u027a\u027b\7", - "X\2\2\u027b\u027d\5\60\31\2\u027c\u0276\3\2\2\2\u027c\u0278\3\2\2\2", - "\u027dQ\3\2\2\2\u027e\u0280\7\33\2\2\u027f\u0281\7k\2\2\u0280\u027f", - "\3\2\2\2\u0280\u0281\3\2\2\2\u0281\u0282\3\2\2\2\u0282\u0283\7A\2\2", - "\u0283\u0284\5T+\2\u0284\u0285\7B\2\2\u0285\u0292\3\2\2\2\u0286\u0288", - "\7\33\2\2\u0287\u0289\7k\2\2\u0288\u0287\3\2\2\2\u0288\u0289\3\2\2\2", - "\u0289\u028a\3\2\2\2\u028a\u028b\7A\2\2\u028b\u028c\5T+\2\u028c\u028d", - "\7Z\2\2\u028d\u028e\7B\2\2\u028e\u0292\3\2\2\2\u028f\u0290\7\33\2\2", - "\u0290\u0292\7k\2\2\u0291\u027e\3\2\2\2\u0291\u0286\3\2\2\2\u0291\u028f", - "\3\2\2\2\u0292S\3\2\2\2\u0293\u0294\b+\1\2\u0294\u0295\5V,\2\u0295\u029b", - "\3\2\2\2\u0296\u0297\f\3\2\2\u0297\u0298\7Z\2\2\u0298\u029a\5V,\2\u0299", - "\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3", - "\2\2\2\u029cU\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u02a4\5X-\2\u029f\u02a0", - "\5X-\2\u02a0\u02a1\7[\2\2\u02a1\u02a2\5\60\31\2\u02a2\u02a4\3\2\2\2", - "\u02a3\u029e\3\2\2\2\u02a3\u029f\3\2\2\2\u02a4W\3\2\2\2\u02a5\u02a6", - "\7k\2\2\u02a6Y\3\2\2\2\u02a7\u02a8\7\65\2\2\u02a8\u02a9\7=\2\2\u02a9", - "\u02aa\5|?\2\u02aa\u02ab\7>\2\2\u02ab[\3\2\2\2\u02ac\u02ad\t\b\2\2\u02ad", - "]\3\2\2\2\u02ae\u02b5\t\t\2\2\u02af\u02b5\5h\65\2\u02b0\u02b1\7\f\2", - "\2\u02b1\u02b2\7=\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b5\7>\2\2\u02b4\u02ae", - "\3\2\2\2\u02b4\u02af\3\2\2\2\u02b4\u02b0\3\2\2\2\u02b5_\3\2\2\2\u02b6", - "\u02b7\7\63\2\2\u02b7\u02b8\7=\2\2\u02b8\u02b9\5|?\2\u02b9\u02ba\7>", - "\2\2\u02ba\u02c1\3\2\2\2\u02bb\u02bc\7\63\2\2\u02bc\u02bd\7=\2\2\u02bd", - "\u02be\5\60\31\2\u02be\u02bf\7>\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02b6", - "\3\2\2\2\u02c0\u02bb\3\2\2\2\u02c1a\3\2\2\2\u02c2\u02c4\5p9\2\u02c3", - "\u02c2\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5\u02c9\5", - "d\63\2\u02c6\u02c8\5f\64\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9", - "\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02cac\3\2\2\2\u02cb\u02c9\3\2\2", - "\2\u02cc\u02cd\b\63\1\2\u02cd\u02d3\7k\2\2\u02ce\u02cf\7=\2\2\u02cf", - "\u02d0\5b\62\2\u02d0\u02d1\7>\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02cc\3", - "\2\2\2\u02d2\u02ce\3\2\2\2\u02d3\u0301\3\2\2\2\u02d4\u02d5\f\b\2\2\u02d5", - "\u02d7\7?\2\2\u02d6\u02d8\5r:\2\u02d7\u02d6\3\2\2\2\u02d7\u02d8\3\2", - "\2\2\u02d8\u02da\3\2\2\2\u02d9\u02db\5*\26\2\u02da\u02d9\3\2\2\2\u02da", - "\u02db\3\2\2\2\u02db\u02dc\3\2\2\2\u02dc\u0300\7@\2\2\u02dd\u02de\f", - "\7\2\2\u02de\u02df\7?\2\2\u02df\u02e1\7*\2\2\u02e0\u02e2\5r:\2\u02e1", - "\u02e0\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5", - "*\26\2\u02e4\u02e5\7@\2\2\u02e5\u0300\3\2\2\2\u02e6\u02e7\f\6\2\2\u02e7", - "\u02e8\7?\2\2\u02e8\u02e9\5r:\2\u02e9\u02ea\7*\2\2\u02ea\u02eb\5*\26", - "\2\u02eb\u02ec\7@\2\2\u02ec\u0300\3\2\2\2\u02ed\u02ee\f\5\2\2\u02ee", - "\u02f0\7?\2\2\u02ef\u02f1\5r:\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1\3\2", - "\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f3\7M\2\2\u02f3\u0300\7@\2\2\u02f4", - "\u02f5\f\4\2\2\u02f5\u02f6\7=\2\2\u02f6\u02f7\5t;\2\u02f7\u02f8\7>\2", - "\2\u02f8\u0300\3\2\2\2\u02f9\u02fa\f\3\2\2\u02fa\u02fc\7=\2\2\u02fb", - "\u02fd\5z>\2\u02fc\u02fb\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02fe\3\2", - "\2\2\u02fe\u0300\7>\2\2\u02ff\u02d4\3\2\2\2\u02ff\u02dd\3\2\2\2\u02ff", - "\u02e6\3\2\2\2\u02ff\u02ed\3\2\2\2\u02ff\u02f4\3\2\2\2\u02ff\u02f9\3", - "\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff\3\2\2\2\u0301\u0302\3\2\2\2\u0302", - "e\3\2\2\2\u0303\u0301\3\2\2\2\u0304\u0305\7\r\2\2\u0305\u0307\7=\2\2", - "\u0306\u0308\7m\2\2\u0307\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307", - "\3\2\2\2\u0309\u030a\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030e\7>\2\2", - "\u030c\u030e\5h\65\2\u030d\u0304\3\2\2\2\u030d\u030c\3\2\2\2\u030eg", - "\3\2\2\2\u030f\u0310\7\16\2\2\u0310\u0311\7=\2\2\u0311\u0312\7=\2\2", - "\u0312\u0313\5j\66\2\u0313\u0314\7>\2\2\u0314\u0315\7>\2\2\u0315i\3", - "\2\2\2\u0316\u031b\5l\67\2\u0317\u0318\7Z\2\2\u0318\u031a\5l\67\2\u0319", - "\u0317\3\2\2\2\u031a\u031d\3\2\2\2\u031b\u0319\3\2\2\2\u031b\u031c\3", - "\2\2\2\u031c\u0320\3\2\2\2\u031d\u031b\3\2\2\2\u031e\u0320\3\2\2\2\u031f", - "\u0316\3\2\2\2\u031f\u031e\3\2\2\2\u0320k\3\2\2\2\u0321\u0327\n\n\2", - "\2\u0322\u0324\7=\2\2\u0323\u0325\5\f\7\2\u0324\u0323\3\2\2\2\u0324", - "\u0325\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u0328\7>\2\2\u0327\u0322\3", - "\2\2\2\u0327\u0328\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u032b\3\2\2\2\u032a", - "\u0321\3\2\2\2\u032a\u0329\3\2\2\2\u032bm\3\2\2\2\u032c\u0332\n\13\2", - "\2\u032d\u032e\7=\2\2\u032e\u032f\5n8\2\u032f\u0330\7>\2\2\u0330\u0332", - "\3\2\2\2\u0331\u032c\3\2\2\2\u0331\u032d\3\2\2\2\u0332\u0335\3\2\2\2", - "\u0333\u0331\3\2\2\2\u0333\u0334\3\2\2\2\u0334o\3\2\2\2\u0335\u0333", - "\3\2\2\2\u0336\u0338\7M\2\2\u0337\u0339\5r:\2\u0338\u0337\3\2\2\2\u0338", - "\u0339\3\2\2\2\u0339\u0349\3\2\2\2\u033a\u033c\7M\2\2\u033b\u033d\5", - "r:\2\u033c\u033b\3\2\2\2\u033c\u033d\3\2\2\2\u033d\u033e\3\2\2\2\u033e", - "\u0349\5p9\2\u033f\u0341\7T\2\2\u0340\u0342\5r:\2\u0341\u0340\3\2\2", - "\2\u0341\u0342\3\2\2\2\u0342\u0349\3\2\2\2\u0343\u0345\7T\2\2\u0344", - "\u0346\5r:\2\u0345\u0344\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0347\3\2", - "\2\2\u0347\u0349\5p9\2\u0348\u0336\3\2\2\2\u0348\u033a\3\2\2\2\u0348", - "\u033f\3\2\2\2\u0348\u0343\3\2\2\2\u0349q\3\2\2\2\u034a\u034b\b:\1\2", - "\u034b\u034c\5\\/\2\u034c\u0351\3\2\2\2\u034d\u034e\f\3\2\2\u034e\u0350", - "\5\\/\2\u034f\u034d\3\2\2\2\u0350\u0353\3\2\2\2\u0351\u034f\3\2\2\2", - "\u0351\u0352\3\2\2\2\u0352s\3\2\2\2\u0353\u0351\3\2\2\2\u0354\u035a", - "\5v<\2\u0355\u0356\5v<\2\u0356\u0357\7Z\2\2\u0357\u0358\7j\2\2\u0358", - "\u035a\3\2\2\2\u0359\u0354\3\2\2\2\u0359\u0355\3\2\2\2\u035au\3\2\2", - "\2\u035b\u035c\b<\1\2\u035c\u035d\5x=\2\u035d\u0363\3\2\2\2\u035e\u035f", - "\f\3\2\2\u035f\u0360\7Z\2\2\u0360\u0362\5x=\2\u0361\u035e\3\2\2\2\u0362", - "\u0365\3\2\2\2\u0363\u0361\3\2\2\2\u0363\u0364\3\2\2\2\u0364w\3\2\2", - "\2\u0365\u0363\3\2\2\2\u0366\u0367\5\64\33\2\u0367\u0368\5b\62\2\u0368", - "\u036e\3\2\2\2\u0369\u036b\5\66\34\2\u036a\u036c\5~@\2\u036b\u036a\3", - "\2\2\2\u036b\u036c\3\2\2\2\u036c\u036e\3\2\2\2\u036d\u0366\3\2\2\2\u036d", - "\u0369\3\2\2\2\u036ey\3\2\2\2\u036f\u0370\b>\1\2\u0370\u0371\7k\2\2", - "\u0371\u0377\3\2\2\2\u0372\u0373\f\3\2\2\u0373\u0374\7Z\2\2\u0374\u0376", - "\7k\2\2\u0375\u0372\3\2\2\2\u0376\u0379\3\2\2\2\u0377\u0375\3\2\2\2", - "\u0377\u0378\3\2\2\2\u0378{\3\2\2\2\u0379\u0377\3\2\2\2\u037a\u037c", - "\5L\'\2\u037b\u037d\5~@\2\u037c\u037b\3\2\2\2\u037c\u037d\3\2\2\2\u037d", - "}\3\2\2\2\u037e\u038a\5p9\2\u037f\u0381\5p9\2\u0380\u037f\3\2\2\2\u0380", - "\u0381\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0386\5\u0080A\2\u0383\u0385", - "\5f\64\2\u0384\u0383\3\2\2\2\u0385\u0388\3\2\2\2\u0386\u0384\3\2\2\2", - "\u0386\u0387\3\2\2\2\u0387\u038a\3\2\2\2\u0388\u0386\3\2\2\2\u0389\u037e", - "\3\2\2\2\u0389\u0380\3\2\2\2\u038a\177\3\2\2\2\u038b\u038c\bA\1\2\u038c", - "\u038d\7=\2\2\u038d\u038e\5~@\2\u038e\u0392\7>\2\2\u038f\u0391\5f\64", - "\2\u0390\u038f\3\2\2\2\u0391\u0394\3\2\2\2\u0392\u0390\3\2\2\2\u0392", - "\u0393\3\2\2\2\u0393\u03ba\3\2\2\2\u0394\u0392\3\2\2\2\u0395\u0397\7", - "?\2\2\u0396\u0398\5r:\2\u0397\u0396\3\2\2\2\u0397\u0398\3\2\2\2\u0398", - "\u039a\3\2\2\2\u0399\u039b\5*\26\2\u039a\u0399\3\2\2\2\u039a\u039b\3", - "\2\2\2\u039b\u039c\3\2\2\2\u039c\u03ba\7@\2\2\u039d\u039e\7?\2\2\u039e", - "\u03a0\7*\2\2\u039f\u03a1\5r:\2\u03a0\u039f\3\2\2\2\u03a0\u03a1\3\2", - "\2\2\u03a1\u03a2\3\2\2\2\u03a2\u03a3\5*\26\2\u03a3\u03a4\7@\2\2\u03a4", - "\u03ba\3\2\2\2\u03a5\u03a6\7?\2\2\u03a6\u03a7\5r:\2\u03a7\u03a8\7*\2", - "\2\u03a8\u03a9\5*\26\2\u03a9\u03aa\7@\2\2\u03aa\u03ba\3\2\2\2\u03ab", - "\u03ac\7?\2\2\u03ac\u03ad\7M\2\2\u03ad\u03ba\7@\2\2\u03ae\u03b0\7=\2", - "\2\u03af\u03b1\5t;\2\u03b0\u03af\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2", - "\3\2\2\2\u03b2\u03b6\7>\2\2\u03b3\u03b5\5f\64\2\u03b4\u03b3\3\2\2\2", - "\u03b5\u03b8\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7\u03ba", - "\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b9\u038b\3\2\2\2\u03b9\u0395\3\2\2\2", - "\u03b9\u039d\3\2\2\2\u03b9\u03a5\3\2\2\2\u03b9\u03ab\3\2\2\2\u03b9\u03ae", - "\3\2\2\2\u03ba\u03e6\3\2\2\2\u03bb\u03bc\f\7\2\2\u03bc\u03be\7?\2\2", - "\u03bd\u03bf\5r:\2\u03be\u03bd\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c1", - "\3\2\2\2\u03c0\u03c2\5*\26\2\u03c1\u03c0\3\2\2\2\u03c1\u03c2\3\2\2\2", - "\u03c2\u03c3\3\2\2\2\u03c3\u03e5\7@\2\2\u03c4\u03c5\f\6\2\2\u03c5\u03c6", - "\7?\2\2\u03c6\u03c8\7*\2\2\u03c7\u03c9\5r:\2\u03c8\u03c7\3\2\2\2\u03c8", - "\u03c9\3\2\2\2\u03c9\u03ca\3\2\2\2\u03ca\u03cb\5*\26\2\u03cb\u03cc\7", - "@\2\2\u03cc\u03e5\3\2\2\2\u03cd\u03ce\f\5\2\2\u03ce\u03cf\7?\2\2\u03cf", - "\u03d0\5r:\2\u03d0\u03d1\7*\2\2\u03d1\u03d2\5*\26\2\u03d2\u03d3\7@\2", - "\2\u03d3\u03e5\3\2\2\2\u03d4\u03d5\f\4\2\2\u03d5\u03d6\7?\2\2\u03d6", - "\u03d7\7M\2\2\u03d7\u03e5\7@\2\2\u03d8\u03d9\f\3\2\2\u03d9\u03db\7=", - "\2\2\u03da\u03dc\5t;\2\u03db\u03da\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc", - "\u03dd\3\2\2\2\u03dd\u03e1\7>\2\2\u03de\u03e0\5f\64\2\u03df\u03de\3", - "\2\2\2\u03e0\u03e3\3\2\2\2\u03e1\u03df\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2", - "\u03e5\3\2\2\2\u03e3\u03e1\3\2\2\2\u03e4\u03bb\3\2\2\2\u03e4\u03c4\3", - "\2\2\2\u03e4\u03cd\3\2\2\2\u03e4\u03d4\3\2\2\2\u03e4\u03d8\3\2\2\2\u03e5", - "\u03e8\3\2\2\2\u03e6\u03e4\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u0081\3", - "\2\2\2\u03e8\u03e6\3\2\2\2\u03e9\u03ea\7k\2\2\u03ea\u0083\3\2\2\2\u03eb", - "\u03f6\5*\26\2\u03ec\u03ed\7A\2\2\u03ed\u03ee\5\u0086D\2\u03ee\u03ef", - "\7B\2\2\u03ef\u03f6\3\2\2\2\u03f0\u03f1\7A\2\2\u03f1\u03f2\5\u0086D", - "\2\u03f2\u03f3\7Z\2\2\u03f3\u03f4\7B\2\2\u03f4\u03f6\3\2\2\2\u03f5\u03eb", - "\3\2\2\2\u03f5\u03ec\3\2\2\2\u03f5\u03f0\3\2\2\2\u03f6\u0085\3\2\2\2", - "\u03f7\u03f9\bD\1\2\u03f8\u03fa\5\u0088E\2\u03f9\u03f8\3\2\2\2\u03f9", - "\u03fa\3\2\2\2\u03fa\u03fb\3\2\2\2\u03fb\u03fc\5\u0084C\2\u03fc\u0405", - "\3\2\2\2\u03fd\u03fe\f\3\2\2\u03fe\u0400\7Z\2\2\u03ff\u0401\5\u0088", - "E\2\u0400\u03ff\3\2\2\2\u0400\u0401\3\2\2\2\u0401\u0402\3\2\2\2\u0402", - "\u0404\5\u0084C\2\u0403\u03fd\3\2\2\2\u0404\u0407\3\2\2\2\u0405\u0403", - "\3\2\2\2\u0405\u0406\3\2\2\2\u0406\u0087\3\2\2\2\u0407\u0405\3\2\2\2", - "\u0408\u0409\5\u008aF\2\u0409\u040a\7[\2\2\u040a\u0089\3\2\2\2\u040b", - "\u040c\bF\1\2\u040c\u040d\5\u008cG\2\u040d\u0412\3\2\2\2\u040e\u040f", - "\f\3\2\2\u040f\u0411\5\u008cG\2\u0410\u040e\3\2\2\2\u0411\u0414\3\2", - "\2\2\u0412\u0410\3\2\2\2\u0412\u0413\3\2\2\2\u0413\u008b\3\2\2\2\u0414", - "\u0412\3\2\2\2\u0415\u0416\7?\2\2\u0416\u0417\5\60\31\2\u0417\u0418", - "\7@\2\2\u0418\u041c\3\2\2\2\u0419\u041a\7i\2\2\u041a\u041c\7k\2\2\u041b", - "\u0415\3\2\2\2\u041b\u0419\3\2\2\2\u041c\u008d\3\2\2\2\u041d\u041e\7", - ";\2\2\u041e\u041f\7=\2\2\u041f\u0420\5\60\31\2\u0420\u0422\7Z\2\2\u0421", - "\u0423\7m\2\2\u0422\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u0422\3", - "\2\2\2\u0424\u0425\3\2\2\2\u0425\u0426\3\2\2\2\u0426\u0427\7>\2\2\u0427", - "\u0428\7Y\2\2\u0428\u008f\3\2\2\2\u0429\u044f\5\u0092J\2\u042a\u044f", - "\5\u0094K\2\u042b\u044f\5\u009aN\2\u042c\u044f\5\u009cO\2\u042d\u044f", - "\5\u009eP\2\u042e\u044f\5\u00a0Q\2\u042f\u0430\t\f\2\2\u0430\u0431\t", - "\r\2\2\u0431\u043a\7=\2\2\u0432\u0437\5&\24\2\u0433\u0434\7Z\2\2\u0434", - "\u0436\5&\24\2\u0435\u0433\3\2\2\2\u0436\u0439\3\2\2\2\u0437\u0435\3", - "\2\2\2\u0437\u0438\3\2\2\2\u0438\u043b\3\2\2\2\u0439\u0437\3\2\2\2\u043a", - "\u0432\3\2\2\2\u043a\u043b\3\2\2\2\u043b\u0449\3\2\2\2\u043c\u0445\7", - "X\2\2\u043d\u0442\5&\24\2\u043e\u043f\7Z\2\2\u043f\u0441\5&\24\2\u0440", - "\u043e\3\2\2\2\u0441\u0444\3\2\2\2\u0442\u0440\3\2\2\2\u0442\u0443\3", - "\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3\2\2\2\u0445\u043d\3\2\2\2\u0445", - "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u043c\3\2\2\2\u0448\u044b\3", - "\2\2\2\u0449\u0447\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u044c\3\2\2\2\u044b", - "\u0449\3\2\2\2\u044c\u044d\7>\2\2\u044d\u044f\7Y\2\2\u044e\u0429\3\2", - "\2\2\u044e\u042a\3\2\2\2\u044e\u042b\3\2\2\2\u044e\u042c\3\2\2\2\u044e", - "\u042d\3\2\2\2\u044e\u042e\3\2\2\2\u044e\u042f\3\2\2\2\u044f\u0091\3", - "\2\2\2\u0450\u0451\7k\2\2\u0451\u0452\7X\2\2\u0452\u045c\5\u0090I\2", - "\u0453\u0454\7\23\2\2\u0454\u0455\5\60\31\2\u0455\u0456\7X\2\2\u0456", - "\u0457\5\u0090I\2\u0457\u045c\3\2\2\2\u0458\u0459\7\27\2\2\u0459\u045a", - "\7X\2\2\u045a\u045c\5\u0090I\2\u045b\u0450\3\2\2\2\u045b\u0453\3\2\2", - "\2\u045b\u0458\3\2\2\2\u045c\u0093\3\2\2\2\u045d\u045f\7A\2\2\u045e", - "\u0460\5\u0096L\2\u045f\u045e\3\2\2\2\u045f\u0460\3\2\2\2\u0460\u0461", - "\3\2\2\2\u0461\u0462\7B\2\2\u0462\u0095\3\2\2\2\u0463\u0464\bL\1\2\u0464", - "\u0465\5\u0098M\2\u0465\u046a\3\2\2\2\u0466\u0467\f\3\2\2\u0467\u0469", - "\5\u0098M\2\u0468\u0466\3\2\2\2\u0469\u046c\3\2\2\2\u046a\u0468\3\2", - "\2\2\u046a\u046b\3\2\2\2\u046b\u0097\3\2\2\2\u046c\u046a\3\2\2\2\u046d", - "\u0470\5\62\32\2\u046e\u0470\5\u0090I\2\u046f\u046d\3\2\2\2\u046f\u046e", - "\3\2\2\2\u0470\u0099\3\2\2\2\u0471\u0473\5.\30\2\u0472\u0471\3\2\2\2", - "\u0472\u0473\3\2\2\2\u0473\u0474\3\2\2\2\u0474\u0475\7Y\2\2\u0475\u009b", - "\3\2\2\2\u0476\u0477\7 \2\2\u0477\u0478\7=\2\2\u0478\u0479\5.\30\2\u0479", - "\u047a\7>\2\2\u047a\u047d\5\u0090I\2\u047b\u047c\7\32\2\2\u047c\u047e", - "\5\u0090I\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0486\3\2", - "\2\2\u047f\u0480\7,\2\2\u0480\u0481\7=\2\2\u0481\u0482\5.\30\2\u0482", - "\u0483\7>\2\2\u0483\u0484\5\u0090I\2\u0484\u0486\3\2\2\2\u0485\u0476", - "\3\2\2\2\u0485\u047f\3\2\2\2\u0486\u009d\3\2\2\2\u0487\u0488\7\62\2", - "\2\u0488\u0489\7=\2\2\u0489\u048a\5.\30\2\u048a\u048b\7>\2\2\u048b\u048c", - "\5\u0090I\2\u048c\u04b2\3\2\2\2\u048d\u048e\7\30\2\2\u048e\u048f\5\u0090", - "I\2\u048f\u0490\7\62\2\2\u0490\u0491\7=\2\2\u0491\u0492\5.\30\2\u0492", - "\u0493\7>\2\2\u0493\u0494\7Y\2\2\u0494\u04b2\3\2\2\2\u0495\u0496\7\36", - "\2\2\u0496\u0498\7=\2\2\u0497\u0499\5.\30\2\u0498\u0497\3\2\2\2\u0498", - "\u0499\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049c\7Y\2\2\u049b\u049d\5", - ".\30\2\u049c\u049b\3\2\2\2\u049c\u049d\3\2\2\2\u049d\u049e\3\2\2\2\u049e", - "\u04a0\7Y\2\2\u049f\u04a1\5.\30\2\u04a0\u049f\3\2\2\2\u04a0\u04a1\3", - "\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7>\2\2\u04a3\u04b2\5\u0090I\2", - "\u04a4\u04a5\7\36\2\2\u04a5\u04a6\7=\2\2\u04a6\u04a8\5\62\32\2\u04a7", - "\u04a9\5.\30\2\u04a8\u04a7\3\2\2\2\u04a8\u04a9\3\2\2\2\u04a9\u04aa\3", - "\2\2\2\u04aa\u04ac\7Y\2\2\u04ab\u04ad\5.\30\2\u04ac\u04ab\3\2\2\2\u04ac", - "\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af\7>\2\2\u04af\u04b0\5", - "\u0090I\2\u04b0\u04b2\3\2\2\2\u04b1\u0487\3\2\2\2\u04b1\u048d\3\2\2", - "\2\u04b1\u0495\3\2\2\2\u04b1\u04a4\3\2\2\2\u04b2\u009f\3\2\2\2\u04b3", - "\u04b4\7\37\2\2\u04b4\u04b5\7k\2\2\u04b5\u04c4\7Y\2\2\u04b6\u04b7\7", - "\26\2\2\u04b7\u04c4\7Y\2\2\u04b8\u04b9\7\22\2\2\u04b9\u04c4\7Y\2\2\u04ba", - "\u04bc\7&\2\2\u04bb\u04bd\5.\30\2\u04bc\u04bb\3\2\2\2\u04bc\u04bd\3", - "\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04c4\7Y\2\2\u04bf\u04c0\7\37\2\2\u04c0", - "\u04c1\5\16\b\2\u04c1\u04c2\7Y\2\2\u04c2\u04c4\3\2\2\2\u04c3\u04b3\3", - "\2\2\2\u04c3\u04b6\3\2\2\2\u04c3\u04b8\3\2\2\2\u04c3\u04ba\3\2\2\2\u04c3", - "\u04bf\3\2\2\2\u04c4\u00a1\3\2\2\2\u04c5\u04c7\5\u00a4S\2\u04c6\u04c5", - "\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04cb\7\2\2\3", - "\u04c9\u04cb\3\2\2\2\u04ca\u04c6\3\2\2\2\u04ca\u04c9\3\2\2\2\u04cb\u00a3", - "\3\2\2\2\u04cc\u04cd\bS\1\2\u04cd\u04ce\5\u00a6T\2\u04ce\u04d3\3\2\2", - "\2\u04cf\u04d0\f\3\2\2\u04d0\u04d2\5\u00a6T\2\u04d1\u04cf\3\2\2\2\u04d2", - "\u04d5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d3\u04d4\3\2\2\2\u04d4\u00a5\3", - "\2\2\2\u04d5\u04d3\3\2\2\2\u04d6\u04da\5\u00a8U\2\u04d7\u04da\5\62\32", - "\2\u04d8\u04da\7Y\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9", - "\u04d8\3\2\2\2\u04da\u00a7\3\2\2\2\u04db\u04dd\5\64\33\2\u04dc\u04db", - "\3\2\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04e0\5b\62\2", - "\u04df\u04e1\5\u00aaV\2\u04e0\u04df\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1", - "\u04e2\3\2\2\2\u04e2\u04e3\5\u0094K\2\u04e3\u00a9\3\2\2\2\u04e4\u04e5", - "\bV\1\2\u04e5\u04e6\5\62\32\2\u04e6\u04eb\3\2\2\2\u04e7\u04e8\f\3\2", - "\2\u04e8\u04ea\5\62\32\2\u04e9\u04e7\3\2\2\2\u04ea\u04ed\3\2\2\2\u04eb", - "\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u00ab\3\2\2\2\u04ed\u04eb\3", - "\2\2\2\u008d\u00b1\u00b9\u00cd\u00de\u00e8\u010c\u0116\u0123\u0125\u0130", - "\u0149\u0159\u0167\u0169\u0175\u0177\u0183\u0185\u0197\u0199\u01a5\u01a7", - "\u01b2\u01bd\u01c8\u01d3\u01de\u01e7\u01ee\u01fa\u0201\u0206\u020b\u0210", - "\u0217\u0221\u0229\u023b\u023f\u0246\u0255\u025a\u025f\u0263\u0267\u0269", - "\u0273\u0278\u027c\u0280\u0288\u0291\u029b\u02a3\u02b4\u02c0\u02c3\u02c9", - "\u02d2\u02d7\u02da\u02e1\u02f0\u02fc\u02ff\u0301\u0309\u030d\u031b\u031f", - "\u0324\u0327\u032a\u0331\u0333\u0338\u033c\u0341\u0345\u0348\u0351\u0359", - "\u0363\u036b\u036d\u0377\u037c\u0380\u0386\u0389\u0392\u0397\u039a\u03a0", - "\u03b0\u03b6\u03b9\u03be\u03c1\u03c8\u03db\u03e1\u03e4\u03e6\u03f5\u03f9", - "\u0400\u0405\u0412\u041b\u0424\u0437\u043a\u0442\u0445\u0449\u044e\u045b", - "\u045f\u046a\u046f\u0472\u047d\u0485\u0498\u049c\u04a0\u04a8\u04ac\u04b1", - "\u04bc\u04c3\u04c6\u04ca\u04d3\u04d9\u04dc\u04e0\u04eb"].join(""); + "\3\b\3\b\3\b\3\b\5\b\u014c\n\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3", + "\n\3\n\3\n\3\n\3\n\5\n\u015c\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13", + "\3\13\3\13\3\13\3\13\3\13\7\13\u016a\n\13\f\13\16\13\u016d\13\13\3\f", + "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\7\f\u0178\n\f\f\f\16\f\u017b\13\f\3", + "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\7\r\u0186\n\r\f\r\16\r\u0189\13\r", + "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3", + "\16\3\16\7\16\u019a\n\16\f\16\16\16\u019d\13\16\3\17\3\17\3\17\3\17", + "\3\17\3\17\3\17\3\17\3\17\7\17\u01a8\n\17\f\17\16\17\u01ab\13\17\3\20", + "\3\20\3\20\3\20\3\20\3\20\7\20\u01b3\n\20\f\20\16\20\u01b6\13\20\3\21", + "\3\21\3\21\3\21\3\21\3\21\7\21\u01be\n\21\f\21\16\21\u01c1\13\21\3\22", + "\3\22\3\22\3\22\3\22\3\22\7\22\u01c9\n\22\f\22\16\22\u01cc\13\22\3\23", + "\3\23\3\23\3\23\3\23\3\23\7\23\u01d4\n\23\f\23\16\23\u01d7\13\23\3\24", + "\3\24\3\24\3\24\3\24\3\24\7\24\u01df\n\24\f\24\16\24\u01e2\13\24\3\25", + "\3\25\3\25\3\25\3\25\3\25\5\25\u01ea\n\25\3\26\3\26\3\26\3\26\3\26\5", + "\26\u01f1\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01fb\n", + "\30\f\30\16\30\u01fe\13\30\3\31\3\31\3\32\3\32\5\32\u0204\n\32\3\32", + "\3\32\3\32\5\32\u0209\n\32\3\33\6\33\u020c\n\33\r\33\16\33\u020d\3\34", + "\6\34\u0211\n\34\r\34\16\34\u0212\3\35\3\35\3\35\3\35\3\35\5\35\u021a", + "\n\35\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0222\n\36\f\36\16\36\u0225", + "\13\36\3\37\3\37\3\37\3\37\3\37\5\37\u022c\n\37\3 \3 \3!\3!\3!\3!\3", + "!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u023e\n!\3\"\3\"\5\"\u0242\n\"\3\"\3", + "\"\3\"\3\"\3\"\5\"\u0249\n\"\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%\7%\u0256", + "\n%\f%\16%\u0259\13%\3&\3&\5&\u025d\n&\3&\3&\3&\5&\u0262\n&\3\'\3\'", + "\5\'\u0266\n\'\3\'\3\'\5\'\u026a\n\'\5\'\u026c\n\'\3(\3(\3(\3(\3(\3", + "(\7(\u0274\n(\f(\16(\u0277\13(\3)\3)\5)\u027b\n)\3)\3)\5)\u027f\n)\3", + "*\3*\5*\u0283\n*\3*\3*\3*\3*\3*\3*\5*\u028b\n*\3*\3*\3*\3*\3*\3*\3*", + "\5*\u0294\n*\3+\3+\3+\3+\3+\3+\7+\u029c\n+\f+\16+\u029f\13+\3,\3,\3", + ",\3,\3,\5,\u02a6\n,\3-\3-\3.\3.\3.\3.\3.\3/\3/\3\60\3\60\3\60\3\60\3", + "\60\3\60\5\60\u02b7\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61", + "\3\61\5\61\u02c3\n\61\3\62\5\62\u02c6\n\62\3\62\3\62\7\62\u02ca\n\62", + "\f\62\16\62\u02cd\13\62\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u02d5\n\63", + "\3\63\3\63\3\63\5\63\u02da\n\63\3\63\5\63\u02dd\n\63\3\63\3\63\3\63", + "\3\63\3\63\5\63\u02e4\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", + "\63\3\63\3\63\3\63\3\63\5\63\u02f3\n\63\3\63\3\63\3\63\3\63\3\63\3\63", + "\3\63\3\63\3\63\3\63\5\63\u02ff\n\63\3\63\7\63\u0302\n\63\f\63\16\63", + "\u0305\13\63\3\64\3\64\3\64\6\64\u030a\n\64\r\64\16\64\u030b\3\64\3", + "\64\5\64\u0310\n\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66", + "\7\66\u031c\n\66\f\66\16\66\u031f\13\66\3\66\5\66\u0322\n\66\3\67\3", + "\67\3\67\5\67\u0327\n\67\3\67\5\67\u032a\n\67\3\67\5\67\u032d\n\67\3", + "8\38\38\38\38\78\u0334\n8\f8\168\u0337\138\39\39\59\u033b\n9\39\39\5", + "9\u033f\n9\39\39\39\59\u0344\n9\39\39\59\u0348\n9\39\59\u034b\n9\3:", + "\3:\3:\3:\3:\7:\u0352\n:\f:\16:\u0355\13:\3;\3;\3;\3;\3;\5;\u035c\n", + ";\3<\3<\3<\3<\3<\3<\7<\u0364\n<\f<\16<\u0367\13<\3=\3=\3=\3=\3=\5=\u036e", + "\n=\5=\u0370\n=\3>\3>\3>\3>\3>\3>\7>\u0378\n>\f>\16>\u037b\13>\3?\3", + "?\5?\u037f\n?\3@\3@\5@\u0383\n@\3@\3@\7@\u0387\n@\f@\16@\u038a\13@\5", + "@\u038c\n@\3A\3A\3A\3A\3A\7A\u0393\nA\fA\16A\u0396\13A\3A\3A\5A\u039a", + "\nA\3A\5A\u039d\nA\3A\3A\3A\3A\5A\u03a3\nA\3A\3A\3A\3A\3A\3A\3A\3A\3", + "A\3A\3A\3A\3A\3A\5A\u03b3\nA\3A\3A\7A\u03b7\nA\fA\16A\u03ba\13A\5A\u03bc", + "\nA\3A\3A\3A\5A\u03c1\nA\3A\5A\u03c4\nA\3A\3A\3A\3A\3A\5A\u03cb\nA\3", + "A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\5A\u03de\nA\3A\3A", + "\7A\u03e2\nA\fA\16A\u03e5\13A\7A\u03e7\nA\fA\16A\u03ea\13A\3B\3B\3C", + "\3C\3C\3C\3C\3C\3C\3C\3C\3C\5C\u03f8\nC\3D\3D\5D\u03fc\nD\3D\3D\3D\3", + "D\3D\5D\u0403\nD\3D\7D\u0406\nD\fD\16D\u0409\13D\3E\3E\3E\3F\3F\3F\3", + "F\3F\7F\u0413\nF\fF\16F\u0416\13F\3G\3G\3G\3G\3G\3G\5G\u041e\nG\3H\3", + "H\3H\3H\3H\6H\u0425\nH\rH\16H\u0426\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3", + "I\3I\3I\3I\3I\7I\u0438\nI\fI\16I\u043b\13I\5I\u043d\nI\3I\3I\3I\3I\7", + "I\u0443\nI\fI\16I\u0446\13I\5I\u0448\nI\7I\u044a\nI\fI\16I\u044d\13", + "I\3I\3I\5I\u0451\nI\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u045e\nJ\3K", + "\3K\5K\u0462\nK\3K\3K\3L\3L\3L\3L\3L\7L\u046b\nL\fL\16L\u046e\13L\3", + "M\3M\3M\5M\u0473\nM\3N\3N\3N\3N\3N\3N\3O\5O\u047c\nO\3O\3O\3P\3P\3P", + "\3P\3P\3P\3P\5P\u0487\nP\3P\3P\3P\3P\3P\3P\5P\u048f\nP\3Q\3Q\3Q\3Q\3", + "Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u04a2\nQ\3Q\3Q\5Q\u04a6\nQ", + "\3Q\3Q\5Q\u04aa\nQ\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u04b2\nQ\3Q\3Q\5Q\u04b6\nQ\3", + "Q\3Q\3Q\5Q\u04bb\nQ\3R\3R\3R\3R\3R\3R\3R\3R\3R\5R\u04c6\nR\3R\3R\3R", + "\3R\3R\5R\u04cd\nR\3S\5S\u04d0\nS\3S\3S\5S\u04d4\nS\3T\3T\3T\3T\3T\7", + "T\u04db\nT\fT\16T\u04de\13T\3U\3U\3U\5U\u04e3\nU\3V\5V\u04e6\nV\3V\3", + "V\5V\u04ea\nV\3V\3V\3W\3W\3W\3W\3W\7W\u04f3\nW\fW\16W\u04f6\13W\3W\2", + "\36\6\n\f\24\26\30\32\34\36 \"$&.:HNTdrvz\u0080\u0086\u008a\u0096\u00a6", + "\u00acX\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66", + "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\2\16\7\2IIKKMMPPUV\3\2[e\b\2\21", + "\21\34\34$$**--<<\n\2\6\b\24\24\31\31\35\35\"#\'(/\60\66\67\3\2\6\b", + "\4\2++..\6\2\25\25%%\61\61\65\65\5\2\n\13!!::\4\2=>ZZ\3\2=>\4\2\r\r", + "\17\17\4\2\20\20\61\61\u0568\2\u00cf\3\2\2\2\4\u00d1\3\2\2\2\6\u00d8", + "\3\2\2\2\b\u00ea\3\2\2\2\n\u010e\3\2\2\2\f\u012a\3\2\2\2\16\u014b\3", + "\2\2\2\20\u014d\3\2\2\2\22\u015b\3\2\2\2\24\u015d\3\2\2\2\26\u016e\3", + "\2\2\2\30\u017c\3\2\2\2\32\u018a\3\2\2\2\34\u019e\3\2\2\2\36\u01ac\3", + "\2\2\2 \u01b7\3\2\2\2\"\u01c2\3\2\2\2$\u01cd\3\2\2\2&\u01d8\3\2\2\2", + "(\u01e3\3\2\2\2*\u01f0\3\2\2\2,\u01f2\3\2\2\2.\u01f4\3\2\2\2\60\u01ff", + "\3\2\2\2\62\u0208\3\2\2\2\64\u020b\3\2\2\2\66\u0210\3\2\2\28\u0219\3", + "\2\2\2:\u021b\3\2\2\2<\u022b\3\2\2\2>\u022d\3\2\2\2@\u023d\3\2\2\2B", + "\u0248\3\2\2\2D\u024a\3\2\2\2F\u024c\3\2\2\2H\u0250\3\2\2\2J\u0261\3", + "\2\2\2L\u026b\3\2\2\2N\u026d\3\2\2\2P\u027e\3\2\2\2R\u0293\3\2\2\2T", + "\u0295\3\2\2\2V\u02a5\3\2\2\2X\u02a7\3\2\2\2Z\u02a9\3\2\2\2\\\u02ae", + "\3\2\2\2^\u02b6\3\2\2\2`\u02c2\3\2\2\2b\u02c5\3\2\2\2d\u02d4\3\2\2\2", + "f\u030f\3\2\2\2h\u0311\3\2\2\2j\u0321\3\2\2\2l\u032c\3\2\2\2n\u0335", + "\3\2\2\2p\u034a\3\2\2\2r\u034c\3\2\2\2t\u035b\3\2\2\2v\u035d\3\2\2\2", + "x\u036f\3\2\2\2z\u0371\3\2\2\2|\u037c\3\2\2\2~\u038b\3\2\2\2\u0080\u03bb", + "\3\2\2\2\u0082\u03eb\3\2\2\2\u0084\u03f7\3\2\2\2\u0086\u03f9\3\2\2\2", + "\u0088\u040a\3\2\2\2\u008a\u040d\3\2\2\2\u008c\u041d\3\2\2\2\u008e\u041f", + "\3\2\2\2\u0090\u0450\3\2\2\2\u0092\u045d\3\2\2\2\u0094\u045f\3\2\2\2", + "\u0096\u0465\3\2\2\2\u0098\u0472\3\2\2\2\u009a\u0474\3\2\2\2\u009c\u047b", + "\3\2\2\2\u009e\u048e\3\2\2\2\u00a0\u04ba\3\2\2\2\u00a2\u04cc\3\2\2\2", + "\u00a4\u04d3\3\2\2\2\u00a6\u04d5\3\2\2\2\u00a8\u04e2\3\2\2\2\u00aa\u04e5", + "\3\2\2\2\u00ac\u04ed\3\2\2\2\u00ae\u00d0\7k\2\2\u00af\u00d0\7l\2\2\u00b0", + "\u00b2\7m\2\2\u00b1\u00b0\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b1\3", + "\2\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00d0\3\2\2\2\u00b5\u00b6\7=\2\2\u00b6", + "\u00b7\5.\30\2\u00b7\u00b8\7>\2\2\u00b8\u00d0\3\2\2\2\u00b9\u00d0\5", + "\4\3\2\u00ba\u00bc\7\3\2\2\u00bb\u00ba\3\2\2\2\u00bb\u00bc\3\2\2\2\u00bc", + "\u00bd\3\2\2\2\u00bd\u00be\7=\2\2\u00be\u00bf\5\u0094K\2\u00bf\u00c0", + "\7>\2\2\u00c0\u00d0\3\2\2\2\u00c1\u00c2\7\4\2\2\u00c2\u00c3\7=\2\2\u00c3", + "\u00c4\5\16\b\2\u00c4\u00c5\7Z\2\2\u00c5\u00c6\5|?\2\u00c6\u00c7\7>", + "\2\2\u00c7\u00d0\3\2\2\2\u00c8\u00c9\7\5\2\2\u00c9\u00ca\7=\2\2\u00ca", + "\u00cb\5|?\2\u00cb\u00cc\7Z\2\2\u00cc\u00cd\5\16\b\2\u00cd\u00ce\7>", + "\2\2\u00ce\u00d0\3\2\2\2\u00cf\u00ae\3\2\2\2\u00cf\u00af\3\2\2\2\u00cf", + "\u00b1\3\2\2\2\u00cf\u00b5\3\2\2\2\u00cf\u00b9\3\2\2\2\u00cf\u00bb\3", + "\2\2\2\u00cf\u00c1\3\2\2\2\u00cf\u00c8\3\2\2\2\u00d0\3\3\2\2\2\u00d1", + "\u00d2\78\2\2\u00d2\u00d3\7=\2\2\u00d3\u00d4\5*\26\2\u00d4\u00d5\7Z", + "\2\2\u00d5\u00d6\5\6\4\2\u00d6\u00d7\7>\2\2\u00d7\5\3\2\2\2\u00d8\u00d9", + "\b\4\1\2\u00d9\u00da\5\b\5\2\u00da\u00e0\3\2\2\2\u00db\u00dc\f\3\2\2", + "\u00dc\u00dd\7Z\2\2\u00dd\u00df\5\b\5\2\u00de\u00db\3\2\2\2\u00df\u00e2", + "\3\2\2\2\u00e0\u00de\3\2\2\2\u00e0\u00e1\3\2\2\2\u00e1\7\3\2\2\2\u00e2", + "\u00e0\3\2\2\2\u00e3\u00e4\5|?\2\u00e4\u00e5\7X\2\2\u00e5\u00e6\5*\26", + "\2\u00e6\u00eb\3\2\2\2\u00e7\u00e8\7\27\2\2\u00e8\u00e9\7X\2\2\u00e9", + "\u00eb\5*\26\2\u00ea\u00e3\3\2\2\2\u00ea\u00e7\3\2\2\2\u00eb\t\3\2\2", + "\2\u00ec\u00ed\b\6\1\2\u00ed\u010f\5\2\2\2\u00ee\u00ef\7=\2\2\u00ef", + "\u00f0\5|?\2\u00f0\u00f1\7>\2\2\u00f1\u00f2\7A\2\2\u00f2\u00f3\5\u0086", + "D\2\u00f3\u00f4\7B\2\2\u00f4\u010f\3\2\2\2\u00f5\u00f6\7=\2\2\u00f6", + "\u00f7\5|?\2\u00f7\u00f8\7>\2\2\u00f8\u00f9\7A\2\2\u00f9\u00fa\5\u0086", + "D\2\u00fa\u00fb\7Z\2\2\u00fb\u00fc\7B\2\2\u00fc\u010f\3\2\2\2\u00fd", + "\u00fe\7\3\2\2\u00fe\u00ff\7=\2\2\u00ff\u0100\5|?\2\u0100\u0101\7>\2", + "\2\u0101\u0102\7A\2\2\u0102\u0103\5\u0086D\2\u0103\u0104\7B\2\2\u0104", + "\u010f\3\2\2\2\u0105\u0106\7\3\2\2\u0106\u0107\7=\2\2\u0107\u0108\5", + "|?\2\u0108\u0109\7>\2\2\u0109\u010a\7A\2\2\u010a\u010b\5\u0086D\2\u010b", + "\u010c\7Z\2\2\u010c\u010d\7B\2\2\u010d\u010f\3\2\2\2\u010e\u00ec\3\2", + "\2\2\u010e\u00ee\3\2\2\2\u010e\u00f5\3\2\2\2\u010e\u00fd\3\2\2\2\u010e", + "\u0105\3\2\2\2\u010f\u0127\3\2\2\2\u0110\u0111\f\f\2\2\u0111\u0112\7", + "?\2\2\u0112\u0113\5.\30\2\u0113\u0114\7@\2\2\u0114\u0126\3\2\2\2\u0115", + "\u0116\f\13\2\2\u0116\u0118\7=\2\2\u0117\u0119\5\f\7\2\u0118\u0117\3", + "\2\2\2\u0118\u0119\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u0126\7>\2\2\u011b", + "\u011c\f\n\2\2\u011c\u011d\7i\2\2\u011d\u0126\7k\2\2\u011e\u011f\f\t", + "\2\2\u011f\u0120\7h\2\2\u0120\u0126\7k\2\2\u0121\u0122\f\b\2\2\u0122", + "\u0126\7J\2\2\u0123\u0124\f\7\2\2\u0124\u0126\7L\2\2\u0125\u0110\3\2", + "\2\2\u0125\u0115\3\2\2\2\u0125\u011b\3\2\2\2\u0125\u011e\3\2\2\2\u0125", + "\u0121\3\2\2\2\u0125\u0123\3\2\2\2\u0126\u0129\3\2\2\2\u0127\u0125\3", + "\2\2\2\u0127\u0128\3\2\2\2\u0128\13\3\2\2\2\u0129\u0127\3\2\2\2\u012a", + "\u012b\b\7\1\2\u012b\u012c\5*\26\2\u012c\u0132\3\2\2\2\u012d\u012e\f", + "\3\2\2\u012e\u012f\7Z\2\2\u012f\u0131\5*\26\2\u0130\u012d\3\2\2\2\u0131", + "\u0134\3\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2\2\2\u0133\r\3\2\2", + "\2\u0134\u0132\3\2\2\2\u0135\u014c\5\n\6\2\u0136\u0137\7J\2\2\u0137", + "\u014c\5\16\b\2\u0138\u0139\7L\2\2\u0139\u014c\5\16\b\2\u013a\u013b", + "\5\20\t\2\u013b\u013c\5\22\n\2\u013c\u014c\3\2\2\2\u013d\u013e\7)\2", + "\2\u013e\u014c\5\16\b\2\u013f\u0140\7)\2\2\u0140\u0141\7=\2\2\u0141", + "\u0142\5|?\2\u0142\u0143\7>\2\2\u0143\u014c\3\2\2\2\u0144\u0145\7\64", + "\2\2\u0145\u0146\7=\2\2\u0146\u0147\5|?\2\u0147\u0148\7>\2\2\u0148\u014c", + "\3\2\2\2\u0149\u014a\7R\2\2\u014a\u014c\7k\2\2\u014b\u0135\3\2\2\2\u014b", + "\u0136\3\2\2\2\u014b\u0138\3\2\2\2\u014b\u013a\3\2\2\2\u014b\u013d\3", + "\2\2\2\u014b\u013f\3\2\2\2\u014b\u0144\3\2\2\2\u014b\u0149\3\2\2\2\u014c", + "\17\3\2\2\2\u014d\u014e\t\2\2\2\u014e\21\3\2\2\2\u014f\u015c\5\16\b", + "\2\u0150\u0151\7=\2\2\u0151\u0152\5|?\2\u0152\u0153\7>\2\2\u0153\u0154", + "\5\22\n\2\u0154\u015c\3\2\2\2\u0155\u0156\7\3\2\2\u0156\u0157\7=\2\2", + "\u0157\u0158\5|?\2\u0158\u0159\7>\2\2\u0159\u015a\5\22\n\2\u015a\u015c", + "\3\2\2\2\u015b\u014f\3\2\2\2\u015b\u0150\3\2\2\2\u015b\u0155\3\2\2\2", + "\u015c\23\3\2\2\2\u015d\u015e\b\13\1\2\u015e\u015f\5\22\n\2\u015f\u016b", + "\3\2\2\2\u0160\u0161\f\5\2\2\u0161\u0162\7M\2\2\u0162\u016a\5\22\n\2", + "\u0163\u0164\f\4\2\2\u0164\u0165\7N\2\2\u0165\u016a\5\22\n\2\u0166\u0167", + "\f\3\2\2\u0167\u0168\7O\2\2\u0168\u016a\5\22\n\2\u0169\u0160\3\2\2\2", + "\u0169\u0163\3\2\2\2\u0169\u0166\3\2\2\2\u016a\u016d\3\2\2\2\u016b\u0169", + "\3\2\2\2\u016b\u016c\3\2\2\2\u016c\25\3\2\2\2\u016d\u016b\3\2\2\2\u016e", + "\u016f\b\f\1\2\u016f\u0170\5\24\13\2\u0170\u0179\3\2\2\2\u0171\u0172", + "\f\4\2\2\u0172\u0173\7I\2\2\u0173\u0178\5\24\13\2\u0174\u0175\f\3\2", + "\2\u0175\u0176\7K\2\2\u0176\u0178\5\24\13\2\u0177\u0171\3\2\2\2\u0177", + "\u0174\3\2\2\2\u0178\u017b\3\2\2\2\u0179\u0177\3\2\2\2\u0179\u017a\3", + "\2\2\2\u017a\27\3\2\2\2\u017b\u0179\3\2\2\2\u017c\u017d\b\r\1\2\u017d", + "\u017e\5\26\f\2\u017e\u0187\3\2\2\2\u017f\u0180\f\4\2\2\u0180\u0181", + "\7G\2\2\u0181\u0186\5\26\f\2\u0182\u0183\f\3\2\2\u0183\u0184\7H\2\2", + "\u0184\u0186\5\26\f\2\u0185\u017f\3\2\2\2\u0185\u0182\3\2\2\2\u0186", + "\u0189\3\2\2\2\u0187\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\31\3\2", + "\2\2\u0189\u0187\3\2\2\2\u018a\u018b\b\16\1\2\u018b\u018c\5\30\r\2\u018c", + "\u019b\3\2\2\2\u018d\u018e\f\6\2\2\u018e\u018f\7C\2\2\u018f\u019a\5", + "\30\r\2\u0190\u0191\f\5\2\2\u0191\u0192\7E\2\2\u0192\u019a\5\30\r\2", + "\u0193\u0194\f\4\2\2\u0194\u0195\7D\2\2\u0195\u019a\5\30\r\2\u0196\u0197", + "\f\3\2\2\u0197\u0198\7F\2\2\u0198\u019a\5\30\r\2\u0199\u018d\3\2\2\2", + "\u0199\u0190\3\2\2\2\u0199\u0193\3\2\2\2\u0199\u0196\3\2\2\2\u019a\u019d", + "\3\2\2\2\u019b\u0199\3\2\2\2\u019b\u019c\3\2\2\2\u019c\33\3\2\2\2\u019d", + "\u019b\3\2\2\2\u019e\u019f\b\17\1\2\u019f\u01a0\5\32\16\2\u01a0\u01a9", + "\3\2\2\2\u01a1\u01a2\f\4\2\2\u01a2\u01a3\7f\2\2\u01a3\u01a8\5\32\16", + "\2\u01a4\u01a5\f\3\2\2\u01a5\u01a6\7g\2\2\u01a6\u01a8\5\32\16\2\u01a7", + "\u01a1\3\2\2\2\u01a7\u01a4\3\2\2\2\u01a8\u01ab\3\2\2\2\u01a9\u01a7\3", + "\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\35\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ac", + "\u01ad\b\20\1\2\u01ad\u01ae\5\34\17\2\u01ae\u01b4\3\2\2\2\u01af\u01b0", + "\f\3\2\2\u01b0\u01b1\7P\2\2\u01b1\u01b3\5\34\17\2\u01b2\u01af\3\2\2", + "\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5", + "\37\3\2\2\2\u01b6\u01b4\3\2\2\2\u01b7\u01b8\b\21\1\2\u01b8\u01b9\5\36", + "\20\2\u01b9\u01bf\3\2\2\2\u01ba\u01bb\f\3\2\2\u01bb\u01bc\7T\2\2\u01bc", + "\u01be\5\36\20\2\u01bd\u01ba\3\2\2\2\u01be\u01c1\3\2\2\2\u01bf\u01bd", + "\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0!\3\2\2\2\u01c1\u01bf\3\2\2\2\u01c2", + "\u01c3\b\22\1\2\u01c3\u01c4\5 \21\2\u01c4\u01ca\3\2\2\2\u01c5\u01c6", + "\f\3\2\2\u01c6\u01c7\7Q\2\2\u01c7\u01c9\5 \21\2\u01c8\u01c5\3\2\2\2", + "\u01c9\u01cc\3\2\2\2\u01ca\u01c8\3\2\2\2\u01ca\u01cb\3\2\2\2\u01cb#", + "\3\2\2\2\u01cc\u01ca\3\2\2\2\u01cd\u01ce\b\23\1\2\u01ce\u01cf\5\"\22", + "\2\u01cf\u01d5\3\2\2\2\u01d0\u01d1\f\3\2\2\u01d1\u01d2\7R\2\2\u01d2", + "\u01d4\5\"\22\2\u01d3\u01d0\3\2\2\2\u01d4\u01d7\3\2\2\2\u01d5\u01d3", + "\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6%\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d8", + "\u01d9\b\24\1\2\u01d9\u01da\5$\23\2\u01da\u01e0\3\2\2\2\u01db\u01dc", + "\f\3\2\2\u01dc\u01dd\7S\2\2\u01dd\u01df\5$\23\2\u01de\u01db\3\2\2\2", + "\u01df\u01e2\3\2\2\2\u01e0\u01de\3\2\2\2\u01e0\u01e1\3\2\2\2\u01e1\'", + "\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01e9\5&\24\2\u01e4\u01e5\7W\2\2", + "\u01e5\u01e6\5.\30\2\u01e6\u01e7\7X\2\2\u01e7\u01e8\5(\25\2\u01e8\u01ea", + "\3\2\2\2\u01e9\u01e4\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea)\3\2\2\2\u01eb", + "\u01f1\5(\25\2\u01ec\u01ed\5\16\b\2\u01ed\u01ee\5,\27\2\u01ee\u01ef", + "\5*\26\2\u01ef\u01f1\3\2\2\2\u01f0\u01eb\3\2\2\2\u01f0\u01ec\3\2\2\2", + "\u01f1+\3\2\2\2\u01f2\u01f3\t\3\2\2\u01f3-\3\2\2\2\u01f4\u01f5\b\30", + "\1\2\u01f5\u01f6\5*\26\2\u01f6\u01fc\3\2\2\2\u01f7\u01f8\f\3\2\2\u01f8", + "\u01f9\7Z\2\2\u01f9\u01fb\5*\26\2\u01fa\u01f7\3\2\2\2\u01fb\u01fe\3", + "\2\2\2\u01fc\u01fa\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd/\3\2\2\2\u01fe", + "\u01fc\3\2\2\2\u01ff\u0200\5(\25\2\u0200\61\3\2\2\2\u0201\u0203\5\64", + "\33\2\u0202\u0204\5:\36\2\u0203\u0202\3\2\2\2\u0203\u0204\3\2\2\2\u0204", + "\u0205\3\2\2\2\u0205\u0206\7Y\2\2\u0206\u0209\3\2\2\2\u0207\u0209\5", + "\u008eH\2\u0208\u0201\3\2\2\2\u0208\u0207\3\2\2\2\u0209\63\3\2\2\2\u020a", + "\u020c\58\35\2\u020b\u020a\3\2\2\2\u020c\u020d\3\2\2\2\u020d\u020b\3", + "\2\2\2\u020d\u020e\3\2\2\2\u020e\65\3\2\2\2\u020f\u0211\58\35\2\u0210", + "\u020f\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3", + "\2\2\2\u0213\67\3\2\2\2\u0214\u021a\5> \2\u0215\u021a\5@!\2\u0216\u021a", + "\5\\/\2\u0217\u021a\5^\60\2\u0218\u021a\5`\61\2\u0219\u0214\3\2\2\2", + "\u0219\u0215\3\2\2\2\u0219\u0216\3\2\2\2\u0219\u0217\3\2\2\2\u0219\u0218", + "\3\2\2\2\u021a9\3\2\2\2\u021b\u021c\b\36\1\2\u021c\u021d\5<\37\2\u021d", + "\u0223\3\2\2\2\u021e\u021f\f\3\2\2\u021f\u0220\7Z\2\2\u0220\u0222\5", + "<\37\2\u0221\u021e\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223", + "\u0224\3\2\2\2\u0224;\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u022c\5b\62", + "\2\u0227\u0228\5b\62\2\u0228\u0229\7[\2\2\u0229\u022a\5\u0084C\2\u022a", + "\u022c\3\2\2\2\u022b\u0226\3\2\2\2\u022b\u0227\3\2\2\2\u022c=\3\2\2", + "\2\u022d\u022e\t\4\2\2\u022e?\3\2\2\2\u022f\u023e\t\5\2\2\u0230\u0231", + "\7\3\2\2\u0231\u0232\7=\2\2\u0232\u0233\t\6\2\2\u0233\u023e\7>\2\2\u0234", + "\u023e\5Z.\2\u0235\u023e\5B\"\2\u0236\u023e\5R*\2\u0237\u023e\5\u0082", + "B\2\u0238\u0239\7\t\2\2\u0239\u023a\7=\2\2\u023a\u023b\5\60\31\2\u023b", + "\u023c\7>\2\2\u023c\u023e\3\2\2\2\u023d\u022f\3\2\2\2\u023d\u0230\3", + "\2\2\2\u023d\u0234\3\2\2\2\u023d\u0235\3\2\2\2\u023d\u0236\3\2\2\2\u023d", + "\u0237\3\2\2\2\u023d\u0238\3\2\2\2\u023eA\3\2\2\2\u023f\u0241\5D#\2", + "\u0240\u0242\7k\2\2\u0241\u0240\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243", + "\3\2\2\2\u0243\u0244\5F$\2\u0244\u0249\3\2\2\2\u0245\u0246\5D#\2\u0246", + "\u0247\7k\2\2\u0247\u0249\3\2\2\2\u0248\u023f\3\2\2\2\u0248\u0245\3", + "\2\2\2\u0249C\3\2\2\2\u024a\u024b\t\7\2\2\u024bE\3\2\2\2\u024c\u024d", + "\7A\2\2\u024d\u024e\5H%\2\u024e\u024f\7B\2\2\u024fG\3\2\2\2\u0250\u0251", + "\b%\1\2\u0251\u0252\5J&\2\u0252\u0257\3\2\2\2\u0253\u0254\f\3\2\2\u0254", + "\u0256\5J&\2\u0255\u0253\3\2\2\2\u0256\u0259\3\2\2\2\u0257\u0255\3\2", + "\2\2\u0257\u0258\3\2\2\2\u0258I\3\2\2\2\u0259\u0257\3\2\2\2\u025a\u025c", + "\5L\'\2\u025b\u025d\5N(\2\u025c\u025b\3\2\2\2\u025c\u025d\3\2\2\2\u025d", + "\u025e\3\2\2\2\u025e\u025f\7Y\2\2\u025f\u0262\3\2\2\2\u0260\u0262\5", + "\u008eH\2\u0261\u025a\3\2\2\2\u0261\u0260\3\2\2\2\u0262K\3\2\2\2\u0263", + "\u0265\5@!\2\u0264\u0266\5L\'\2\u0265\u0264\3\2\2\2\u0265\u0266\3\2", + "\2\2\u0266\u026c\3\2\2\2\u0267\u0269\5\\/\2\u0268\u026a\5L\'\2\u0269", + "\u0268\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026c\3\2\2\2\u026b\u0263\3", + "\2\2\2\u026b\u0267\3\2\2\2\u026cM\3\2\2\2\u026d\u026e\b(\1\2\u026e\u026f", + "\5P)\2\u026f\u0275\3\2\2\2\u0270\u0271\f\3\2\2\u0271\u0272\7Z\2\2\u0272", + "\u0274\5P)\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2", + "\2\2\u0275\u0276\3\2\2\2\u0276O\3\2\2\2\u0277\u0275\3\2\2\2\u0278\u027f", + "\5b\62\2\u0279\u027b\5b\62\2\u027a\u0279\3\2\2\2\u027a\u027b\3\2\2\2", + "\u027b\u027c\3\2\2\2\u027c\u027d\7X\2\2\u027d\u027f\5\60\31\2\u027e", + "\u0278\3\2\2\2\u027e\u027a\3\2\2\2\u027fQ\3\2\2\2\u0280\u0282\7\33\2", + "\2\u0281\u0283\7k\2\2\u0282\u0281\3\2\2\2\u0282\u0283\3\2\2\2\u0283", + "\u0284\3\2\2\2\u0284\u0285\7A\2\2\u0285\u0286\5T+\2\u0286\u0287\7B\2", + "\2\u0287\u0294\3\2\2\2\u0288\u028a\7\33\2\2\u0289\u028b\7k\2\2\u028a", + "\u0289\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u028d\7", + "A\2\2\u028d\u028e\5T+\2\u028e\u028f\7Z\2\2\u028f\u0290\7B\2\2\u0290", + "\u0294\3\2\2\2\u0291\u0292\7\33\2\2\u0292\u0294\7k\2\2\u0293\u0280\3", + "\2\2\2\u0293\u0288\3\2\2\2\u0293\u0291\3\2\2\2\u0294S\3\2\2\2\u0295", + "\u0296\b+\1\2\u0296\u0297\5V,\2\u0297\u029d\3\2\2\2\u0298\u0299\f\3", + "\2\2\u0299\u029a\7Z\2\2\u029a\u029c\5V,\2\u029b\u0298\3\2\2\2\u029c", + "\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029eU\3\2\2", + "\2\u029f\u029d\3\2\2\2\u02a0\u02a6\5X-\2\u02a1\u02a2\5X-\2\u02a2\u02a3", + "\7[\2\2\u02a3\u02a4\5\60\31\2\u02a4\u02a6\3\2\2\2\u02a5\u02a0\3\2\2", + "\2\u02a5\u02a1\3\2\2\2\u02a6W\3\2\2\2\u02a7\u02a8\7k\2\2\u02a8Y\3\2", + "\2\2\u02a9\u02aa\7\65\2\2\u02aa\u02ab\7=\2\2\u02ab\u02ac\5|?\2\u02ac", + "\u02ad\7>\2\2\u02ad[\3\2\2\2\u02ae\u02af\t\b\2\2\u02af]\3\2\2\2\u02b0", + "\u02b7\t\t\2\2\u02b1\u02b7\5h\65\2\u02b2\u02b3\7\f\2\2\u02b3\u02b4\7", + "=\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b7\7>\2\2\u02b6\u02b0\3\2\2\2\u02b6", + "\u02b1\3\2\2\2\u02b6\u02b2\3\2\2\2\u02b7_\3\2\2\2\u02b8\u02b9\7\63\2", + "\2\u02b9\u02ba\7=\2\2\u02ba\u02bb\5|?\2\u02bb\u02bc\7>\2\2\u02bc\u02c3", + "\3\2\2\2\u02bd\u02be\7\63\2\2\u02be\u02bf\7=\2\2\u02bf\u02c0\5\60\31", + "\2\u02c0\u02c1\7>\2\2\u02c1\u02c3\3\2\2\2\u02c2\u02b8\3\2\2\2\u02c2", + "\u02bd\3\2\2\2\u02c3a\3\2\2\2\u02c4\u02c6\5p9\2\u02c5\u02c4\3\2\2\2", + "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02cb\5d\63\2\u02c8\u02ca", + "\5f\64\2\u02c9\u02c8\3\2\2\2\u02ca\u02cd\3\2\2\2\u02cb\u02c9\3\2\2\2", + "\u02cb\u02cc\3\2\2\2\u02ccc\3\2\2\2\u02cd\u02cb\3\2\2\2\u02ce\u02cf", + "\b\63\1\2\u02cf\u02d5\7k\2\2\u02d0\u02d1\7=\2\2\u02d1\u02d2\5b\62\2", + "\u02d2\u02d3\7>\2\2\u02d3\u02d5\3\2\2\2\u02d4\u02ce\3\2\2\2\u02d4\u02d0", + "\3\2\2\2\u02d5\u0303\3\2\2\2\u02d6\u02d7\f\b\2\2\u02d7\u02d9\7?\2\2", + "\u02d8\u02da\5r:\2\u02d9\u02d8\3\2\2\2\u02d9\u02da\3\2\2\2\u02da\u02dc", + "\3\2\2\2\u02db\u02dd\5*\26\2\u02dc\u02db\3\2\2\2\u02dc\u02dd\3\2\2\2", + "\u02dd\u02de\3\2\2\2\u02de\u0302\7@\2\2\u02df\u02e0\f\7\2\2\u02e0\u02e1", + "\7?\2\2\u02e1\u02e3\7*\2\2\u02e2\u02e4\5r:\2\u02e3\u02e2\3\2\2\2\u02e3", + "\u02e4\3\2\2\2\u02e4\u02e5\3\2\2\2\u02e5\u02e6\5*\26\2\u02e6\u02e7\7", + "@\2\2\u02e7\u0302\3\2\2\2\u02e8\u02e9\f\6\2\2\u02e9\u02ea\7?\2\2\u02ea", + "\u02eb\5r:\2\u02eb\u02ec\7*\2\2\u02ec\u02ed\5*\26\2\u02ed\u02ee\7@\2", + "\2\u02ee\u0302\3\2\2\2\u02ef\u02f0\f\5\2\2\u02f0\u02f2\7?\2\2\u02f1", + "\u02f3\5r:\2\u02f2\u02f1\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f4\3\2", + "\2\2\u02f4\u02f5\7M\2\2\u02f5\u0302\7@\2\2\u02f6\u02f7\f\4\2\2\u02f7", + "\u02f8\7=\2\2\u02f8\u02f9\5t;\2\u02f9\u02fa\7>\2\2\u02fa\u0302\3\2\2", + "\2\u02fb\u02fc\f\3\2\2\u02fc\u02fe\7=\2\2\u02fd\u02ff\5z>\2\u02fe\u02fd", + "\3\2\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0302\7>\2\2", + "\u0301\u02d6\3\2\2\2\u0301\u02df\3\2\2\2\u0301\u02e8\3\2\2\2\u0301\u02ef", + "\3\2\2\2\u0301\u02f6\3\2\2\2\u0301\u02fb\3\2\2\2\u0302\u0305\3\2\2\2", + "\u0303\u0301\3\2\2\2\u0303\u0304\3\2\2\2\u0304e\3\2\2\2\u0305\u0303", + "\3\2\2\2\u0306\u0307\7\r\2\2\u0307\u0309\7=\2\2\u0308\u030a\7m\2\2\u0309", + "\u0308\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u0309\3\2\2\2\u030b\u030c\3", + "\2\2\2\u030c\u030d\3\2\2\2\u030d\u0310\7>\2\2\u030e\u0310\5h\65\2\u030f", + "\u0306\3\2\2\2\u030f\u030e\3\2\2\2\u0310g\3\2\2\2\u0311\u0312\7\16\2", + "\2\u0312\u0313\7=\2\2\u0313\u0314\7=\2\2\u0314\u0315\5j\66\2\u0315\u0316", + "\7>\2\2\u0316\u0317\7>\2\2\u0317i\3\2\2\2\u0318\u031d\5l\67\2\u0319", + "\u031a\7Z\2\2\u031a\u031c\5l\67\2\u031b\u0319\3\2\2\2\u031c\u031f\3", + "\2\2\2\u031d\u031b\3\2\2\2\u031d\u031e\3\2\2\2\u031e\u0322\3\2\2\2\u031f", + "\u031d\3\2\2\2\u0320\u0322\3\2\2\2\u0321\u0318\3\2\2\2\u0321\u0320\3", + "\2\2\2\u0322k\3\2\2\2\u0323\u0329\n\n\2\2\u0324\u0326\7=\2\2\u0325\u0327", + "\5\f\7\2\u0326\u0325\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u0328\3\2\2\2", + "\u0328\u032a\7>\2\2\u0329\u0324\3\2\2\2\u0329\u032a\3\2\2\2\u032a\u032d", + "\3\2\2\2\u032b\u032d\3\2\2\2\u032c\u0323\3\2\2\2\u032c\u032b\3\2\2\2", + "\u032dm\3\2\2\2\u032e\u0334\n\13\2\2\u032f\u0330\7=\2\2\u0330\u0331", + "\5n8\2\u0331\u0332\7>\2\2\u0332\u0334\3\2\2\2\u0333\u032e\3\2\2\2\u0333", + "\u032f\3\2\2\2\u0334\u0337\3\2\2\2\u0335\u0333\3\2\2\2\u0335\u0336\3", + "\2\2\2\u0336o\3\2\2\2\u0337\u0335\3\2\2\2\u0338\u033a\7M\2\2\u0339\u033b", + "\5r:\2\u033a\u0339\3\2\2\2\u033a\u033b\3\2\2\2\u033b\u034b\3\2\2\2\u033c", + "\u033e\7M\2\2\u033d\u033f\5r:\2\u033e\u033d\3\2\2\2\u033e\u033f\3\2", + "\2\2\u033f\u0340\3\2\2\2\u0340\u034b\5p9\2\u0341\u0343\7T\2\2\u0342", + "\u0344\5r:\2\u0343\u0342\3\2\2\2\u0343\u0344\3\2\2\2\u0344\u034b\3\2", + "\2\2\u0345\u0347\7T\2\2\u0346\u0348\5r:\2\u0347\u0346\3\2\2\2\u0347", + "\u0348\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u034b\5p9\2\u034a\u0338\3\2", + "\2\2\u034a\u033c\3\2\2\2\u034a\u0341\3\2\2\2\u034a\u0345\3\2\2\2\u034b", + "q\3\2\2\2\u034c\u034d\b:\1\2\u034d\u034e\5\\/\2\u034e\u0353\3\2\2\2", + "\u034f\u0350\f\3\2\2\u0350\u0352\5\\/\2\u0351\u034f\3\2\2\2\u0352\u0355", + "\3\2\2\2\u0353\u0351\3\2\2\2\u0353\u0354\3\2\2\2\u0354s\3\2\2\2\u0355", + "\u0353\3\2\2\2\u0356\u035c\5v<\2\u0357\u0358\5v<\2\u0358\u0359\7Z\2", + "\2\u0359\u035a\7j\2\2\u035a\u035c\3\2\2\2\u035b\u0356\3\2\2\2\u035b", + "\u0357\3\2\2\2\u035cu\3\2\2\2\u035d\u035e\b<\1\2\u035e\u035f\5x=\2\u035f", + "\u0365\3\2\2\2\u0360\u0361\f\3\2\2\u0361\u0362\7Z\2\2\u0362\u0364\5", + "x=\2\u0363\u0360\3\2\2\2\u0364\u0367\3\2\2\2\u0365\u0363\3\2\2\2\u0365", + "\u0366\3\2\2\2\u0366w\3\2\2\2\u0367\u0365\3\2\2\2\u0368\u0369\5\64\33", + "\2\u0369\u036a\5b\62\2\u036a\u0370\3\2\2\2\u036b\u036d\5\66\34\2\u036c", + "\u036e\5~@\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u0370\3\2", + "\2\2\u036f\u0368\3\2\2\2\u036f\u036b\3\2\2\2\u0370y\3\2\2\2\u0371\u0372", + "\b>\1\2\u0372\u0373\7k\2\2\u0373\u0379\3\2\2\2\u0374\u0375\f\3\2\2\u0375", + "\u0376\7Z\2\2\u0376\u0378\7k\2\2\u0377\u0374\3\2\2\2\u0378\u037b\3\2", + "\2\2\u0379\u0377\3\2\2\2\u0379\u037a\3\2\2\2\u037a{\3\2\2\2\u037b\u0379", + "\3\2\2\2\u037c\u037e\5L\'\2\u037d\u037f\5~@\2\u037e\u037d\3\2\2\2\u037e", + "\u037f\3\2\2\2\u037f}\3\2\2\2\u0380\u038c\5p9\2\u0381\u0383\5p9\2\u0382", + "\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0388\5", + "\u0080A\2\u0385\u0387\5f\64\2\u0386\u0385\3\2\2\2\u0387\u038a\3\2\2", + "\2\u0388\u0386\3\2\2\2\u0388\u0389\3\2\2\2\u0389\u038c\3\2\2\2\u038a", + "\u0388\3\2\2\2\u038b\u0380\3\2\2\2\u038b\u0382\3\2\2\2\u038c\177\3\2", + "\2\2\u038d\u038e\bA\1\2\u038e\u038f\7=\2\2\u038f\u0390\5~@\2\u0390\u0394", + "\7>\2\2\u0391\u0393\5f\64\2\u0392\u0391\3\2\2\2\u0393\u0396\3\2\2\2", + "\u0394\u0392\3\2\2\2\u0394\u0395\3\2\2\2\u0395\u03bc\3\2\2\2\u0396\u0394", + "\3\2\2\2\u0397\u0399\7?\2\2\u0398\u039a\5r:\2\u0399\u0398\3\2\2\2\u0399", + "\u039a\3\2\2\2\u039a\u039c\3\2\2\2\u039b\u039d\5*\26\2\u039c\u039b\3", + "\2\2\2\u039c\u039d\3\2\2\2\u039d\u039e\3\2\2\2\u039e\u03bc\7@\2\2\u039f", + "\u03a0\7?\2\2\u03a0\u03a2\7*\2\2\u03a1\u03a3\5r:\2\u03a2\u03a1\3\2\2", + "\2\u03a2\u03a3\3\2\2\2\u03a3\u03a4\3\2\2\2\u03a4\u03a5\5*\26\2\u03a5", + "\u03a6\7@\2\2\u03a6\u03bc\3\2\2\2\u03a7\u03a8\7?\2\2\u03a8\u03a9\5r", + ":\2\u03a9\u03aa\7*\2\2\u03aa\u03ab\5*\26\2\u03ab\u03ac\7@\2\2\u03ac", + "\u03bc\3\2\2\2\u03ad\u03ae\7?\2\2\u03ae\u03af\7M\2\2\u03af\u03bc\7@", + "\2\2\u03b0\u03b2\7=\2\2\u03b1\u03b3\5t;\2\u03b2\u03b1\3\2\2\2\u03b2", + "\u03b3\3\2\2\2\u03b3\u03b4\3\2\2\2\u03b4\u03b8\7>\2\2\u03b5\u03b7\5", + "f\64\2\u03b6\u03b5\3\2\2\2\u03b7\u03ba\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b8", + "\u03b9\3\2\2\2\u03b9\u03bc\3\2\2\2\u03ba\u03b8\3\2\2\2\u03bb\u038d\3", + "\2\2\2\u03bb\u0397\3\2\2\2\u03bb\u039f\3\2\2\2\u03bb\u03a7\3\2\2\2\u03bb", + "\u03ad\3\2\2\2\u03bb\u03b0\3\2\2\2\u03bc\u03e8\3\2\2\2\u03bd\u03be\f", + "\7\2\2\u03be\u03c0\7?\2\2\u03bf\u03c1\5r:\2\u03c0\u03bf\3\2\2\2\u03c0", + "\u03c1\3\2\2\2\u03c1\u03c3\3\2\2\2\u03c2\u03c4\5*\26\2\u03c3\u03c2\3", + "\2\2\2\u03c3\u03c4\3\2\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03e7\7@\2\2\u03c6", + "\u03c7\f\6\2\2\u03c7\u03c8\7?\2\2\u03c8\u03ca\7*\2\2\u03c9\u03cb\5r", + ":\2\u03ca\u03c9\3\2\2\2\u03ca\u03cb\3\2\2\2\u03cb\u03cc\3\2\2\2\u03cc", + "\u03cd\5*\26\2\u03cd\u03ce\7@\2\2\u03ce\u03e7\3\2\2\2\u03cf\u03d0\f", + "\5\2\2\u03d0\u03d1\7?\2\2\u03d1\u03d2\5r:\2\u03d2\u03d3\7*\2\2\u03d3", + "\u03d4\5*\26\2\u03d4\u03d5\7@\2\2\u03d5\u03e7\3\2\2\2\u03d6\u03d7\f", + "\4\2\2\u03d7\u03d8\7?\2\2\u03d8\u03d9\7M\2\2\u03d9\u03e7\7@\2\2\u03da", + "\u03db\f\3\2\2\u03db\u03dd\7=\2\2\u03dc\u03de\5t;\2\u03dd\u03dc\3\2", + "\2\2\u03dd\u03de\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e3\7>\2\2\u03e0", + "\u03e2\5f\64\2\u03e1\u03e0\3\2\2\2\u03e2\u03e5\3\2\2\2\u03e3\u03e1\3", + "\2\2\2\u03e3\u03e4\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e6", + "\u03bd\3\2\2\2\u03e6\u03c6\3\2\2\2\u03e6\u03cf\3\2\2\2\u03e6\u03d6\3", + "\2\2\2\u03e6\u03da\3\2\2\2\u03e7\u03ea\3\2\2\2\u03e8\u03e6\3\2\2\2\u03e8", + "\u03e9\3\2\2\2\u03e9\u0081\3\2\2\2\u03ea\u03e8\3\2\2\2\u03eb\u03ec\7", + "k\2\2\u03ec\u0083\3\2\2\2\u03ed\u03f8\5*\26\2\u03ee\u03ef\7A\2\2\u03ef", + "\u03f0\5\u0086D\2\u03f0\u03f1\7B\2\2\u03f1\u03f8\3\2\2\2\u03f2\u03f3", + "\7A\2\2\u03f3\u03f4\5\u0086D\2\u03f4\u03f5\7Z\2\2\u03f5\u03f6\7B\2\2", + "\u03f6\u03f8\3\2\2\2\u03f7\u03ed\3\2\2\2\u03f7\u03ee\3\2\2\2\u03f7\u03f2", + "\3\2\2\2\u03f8\u0085\3\2\2\2\u03f9\u03fb\bD\1\2\u03fa\u03fc\5\u0088", + "E\2\u03fb\u03fa\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u03fd\3\2\2\2\u03fd", + "\u03fe\5\u0084C\2\u03fe\u0407\3\2\2\2\u03ff\u0400\f\3\2\2\u0400\u0402", + "\7Z\2\2\u0401\u0403\5\u0088E\2\u0402\u0401\3\2\2\2\u0402\u0403\3\2\2", + "\2\u0403\u0404\3\2\2\2\u0404\u0406\5\u0084C\2\u0405\u03ff\3\2\2\2\u0406", + "\u0409\3\2\2\2\u0407\u0405\3\2\2\2\u0407\u0408\3\2\2\2\u0408\u0087\3", + "\2\2\2\u0409\u0407\3\2\2\2\u040a\u040b\5\u008aF\2\u040b\u040c\7[\2\2", + "\u040c\u0089\3\2\2\2\u040d\u040e\bF\1\2\u040e\u040f\5\u008cG\2\u040f", + "\u0414\3\2\2\2\u0410\u0411\f\3\2\2\u0411\u0413\5\u008cG\2\u0412\u0410", + "\3\2\2\2\u0413\u0416\3\2\2\2\u0414\u0412\3\2\2\2\u0414\u0415\3\2\2\2", + "\u0415\u008b\3\2\2\2\u0416\u0414\3\2\2\2\u0417\u0418\7?\2\2\u0418\u0419", + "\5\60\31\2\u0419\u041a\7@\2\2\u041a\u041e\3\2\2\2\u041b\u041c\7i\2\2", + "\u041c\u041e\7k\2\2\u041d\u0417\3\2\2\2\u041d\u041b\3\2\2\2\u041e\u008d", + "\3\2\2\2\u041f\u0420\7;\2\2\u0420\u0421\7=\2\2\u0421\u0422\5\60\31\2", + "\u0422\u0424\7Z\2\2\u0423\u0425\7m\2\2\u0424\u0423\3\2\2\2\u0425\u0426", + "\3\2\2\2\u0426\u0424\3\2\2\2\u0426\u0427\3\2\2\2\u0427\u0428\3\2\2\2", + "\u0428\u0429\7>\2\2\u0429\u042a\7Y\2\2\u042a\u008f\3\2\2\2\u042b\u0451", + "\5\u0092J\2\u042c\u0451\5\u0094K\2\u042d\u0451\5\u009cO\2\u042e\u0451", + "\5\u009eP\2\u042f\u0451\5\u00a0Q\2\u0430\u0451\5\u00a2R\2\u0431\u0432", + "\t\f\2\2\u0432\u0433\t\r\2\2\u0433\u043c\7=\2\2\u0434\u0439\5&\24\2", + "\u0435\u0436\7Z\2\2\u0436\u0438\5&\24\2\u0437\u0435\3\2\2\2\u0438\u043b", + "\3\2\2\2\u0439\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u043d\3\2\2\2", + "\u043b\u0439\3\2\2\2\u043c\u0434\3\2\2\2\u043c\u043d\3\2\2\2\u043d\u044b", + "\3\2\2\2\u043e\u0447\7X\2\2\u043f\u0444\5&\24\2\u0440\u0441\7Z\2\2\u0441", + "\u0443\5&\24\2\u0442\u0440\3\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3", + "\2\2\2\u0444\u0445\3\2\2\2\u0445\u0448\3\2\2\2\u0446\u0444\3\2\2\2\u0447", + "\u043f\3\2\2\2\u0447\u0448\3\2\2\2\u0448\u044a\3\2\2\2\u0449\u043e\3", + "\2\2\2\u044a\u044d\3\2\2\2\u044b\u0449\3\2\2\2\u044b\u044c\3\2\2\2\u044c", + "\u044e\3\2\2\2\u044d\u044b\3\2\2\2\u044e\u044f\7>\2\2\u044f\u0451\7", + "Y\2\2\u0450\u042b\3\2\2\2\u0450\u042c\3\2\2\2\u0450\u042d\3\2\2\2\u0450", + "\u042e\3\2\2\2\u0450\u042f\3\2\2\2\u0450\u0430\3\2\2\2\u0450\u0431\3", + "\2\2\2\u0451\u0091\3\2\2\2\u0452\u0453\7k\2\2\u0453\u0454\7X\2\2\u0454", + "\u045e\5\u0090I\2\u0455\u0456\7\23\2\2\u0456\u0457\5\60\31\2\u0457\u0458", + "\7X\2\2\u0458\u0459\5\u0090I\2\u0459\u045e\3\2\2\2\u045a\u045b\7\27", + "\2\2\u045b\u045c\7X\2\2\u045c\u045e\5\u0090I\2\u045d\u0452\3\2\2\2\u045d", + "\u0455\3\2\2\2\u045d\u045a\3\2\2\2\u045e\u0093\3\2\2\2\u045f\u0461\7", + "A\2\2\u0460\u0462\5\u0096L\2\u0461\u0460\3\2\2\2\u0461\u0462\3\2\2\2", + "\u0462\u0463\3\2\2\2\u0463\u0464\7B\2\2\u0464\u0095\3\2\2\2\u0465\u0466", + "\bL\1\2\u0466\u0467\5\u0098M\2\u0467\u046c\3\2\2\2\u0468\u0469\f\3\2", + "\2\u0469\u046b\5\u0098M\2\u046a\u0468\3\2\2\2\u046b\u046e\3\2\2\2\u046c", + "\u046a\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u0097\3\2\2\2\u046e\u046c\3", + "\2\2\2\u046f\u0473\5\u009aN\2\u0470\u0473\5\62\32\2\u0471\u0473\5\u0090", + "I\2\u0472\u046f\3\2\2\2\u0472\u0470\3\2\2\2\u0472\u0471\3\2\2\2\u0473", + "\u0099\3\2\2\2\u0474\u0475\5\n\6\2\u0475\u0476\7=\2\2\u0476\u0477\5", + "*\26\2\u0477\u0478\7>\2\2\u0478\u0479\7Y\2\2\u0479\u009b\3\2\2\2\u047a", + "\u047c\5.\30\2\u047b\u047a\3\2\2\2\u047b\u047c\3\2\2\2\u047c\u047d\3", + "\2\2\2\u047d\u047e\7Y\2\2\u047e\u009d\3\2\2\2\u047f\u0480\7 \2\2\u0480", + "\u0481\7=\2\2\u0481\u0482\5.\30\2\u0482\u0483\7>\2\2\u0483\u0486\5\u0090", + "I\2\u0484\u0485\7\32\2\2\u0485\u0487\5\u0090I\2\u0486\u0484\3\2\2\2", + "\u0486\u0487\3\2\2\2\u0487\u048f\3\2\2\2\u0488\u0489\7,\2\2\u0489\u048a", + "\7=\2\2\u048a\u048b\5.\30\2\u048b\u048c\7>\2\2\u048c\u048d\5\u0090I", + "\2\u048d\u048f\3\2\2\2\u048e\u047f\3\2\2\2\u048e\u0488\3\2\2\2\u048f", + "\u009f\3\2\2\2\u0490\u0491\7\62\2\2\u0491\u0492\7=\2\2\u0492\u0493\5", + ".\30\2\u0493\u0494\7>\2\2\u0494\u0495\5\u0090I\2\u0495\u04bb\3\2\2\2", + "\u0496\u0497\7\30\2\2\u0497\u0498\5\u0090I\2\u0498\u0499\7\62\2\2\u0499", + "\u049a\7=\2\2\u049a\u049b\5.\30\2\u049b\u049c\7>\2\2\u049c\u049d\7Y", + "\2\2\u049d\u04bb\3\2\2\2\u049e\u049f\7\36\2\2\u049f\u04a1\7=\2\2\u04a0", + "\u04a2\5.\30\2\u04a1\u04a0\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\3", + "\2\2\2\u04a3\u04a5\7Y\2\2\u04a4\u04a6\5.\30\2\u04a5\u04a4\3\2\2\2\u04a5", + "\u04a6\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7\u04a9\7Y\2\2\u04a8\u04aa\5", + ".\30\2\u04a9\u04a8\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab", + "\u04ac\7>\2\2\u04ac\u04bb\5\u0090I\2\u04ad\u04ae\7\36\2\2\u04ae\u04af", + "\7=\2\2\u04af\u04b1\5\62\32\2\u04b0\u04b2\5.\30\2\u04b1\u04b0\3\2\2", + "\2\u04b1\u04b2\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3\u04b5\7Y\2\2\u04b4", + "\u04b6\5.\30\2\u04b5\u04b4\3\2\2\2\u04b5\u04b6\3\2\2\2\u04b6\u04b7\3", + "\2\2\2\u04b7\u04b8\7>\2\2\u04b8\u04b9\5\u0090I\2\u04b9\u04bb\3\2\2\2", + "\u04ba\u0490\3\2\2\2\u04ba\u0496\3\2\2\2\u04ba\u049e\3\2\2\2\u04ba\u04ad", + "\3\2\2\2\u04bb\u00a1\3\2\2\2\u04bc\u04bd\7\37\2\2\u04bd\u04be\7k\2\2", + "\u04be\u04cd\7Y\2\2\u04bf\u04c0\7\26\2\2\u04c0\u04cd\7Y\2\2\u04c1\u04c2", + "\7\22\2\2\u04c2\u04cd\7Y\2\2\u04c3\u04c5\7&\2\2\u04c4\u04c6\5.\30\2", + "\u04c5\u04c4\3\2\2\2\u04c5\u04c6\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04cd", + "\7Y\2\2\u04c8\u04c9\7\37\2\2\u04c9\u04ca\5\16\b\2\u04ca\u04cb\7Y\2\2", + "\u04cb\u04cd\3\2\2\2\u04cc\u04bc\3\2\2\2\u04cc\u04bf\3\2\2\2\u04cc\u04c1", + "\3\2\2\2\u04cc\u04c3\3\2\2\2\u04cc\u04c8\3\2\2\2\u04cd\u00a3\3\2\2\2", + "\u04ce\u04d0\5\u00a6T\2\u04cf\u04ce\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0", + "\u04d1\3\2\2\2\u04d1\u04d4\7\2\2\3\u04d2\u04d4\3\2\2\2\u04d3\u04cf\3", + "\2\2\2\u04d3\u04d2\3\2\2\2\u04d4\u00a5\3\2\2\2\u04d5\u04d6\bT\1\2\u04d6", + "\u04d7\5\u00a8U\2\u04d7\u04dc\3\2\2\2\u04d8\u04d9\f\3\2\2\u04d9\u04db", + "\5\u00a8U\2\u04da\u04d8\3\2\2\2\u04db\u04de\3\2\2\2\u04dc\u04da\3\2", + "\2\2\u04dc\u04dd\3\2\2\2\u04dd\u00a7\3\2\2\2\u04de\u04dc\3\2\2\2\u04df", + "\u04e3\5\u00aaV\2\u04e0\u04e3\5\62\32\2\u04e1\u04e3\7Y\2\2\u04e2\u04df", + "\3\2\2\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2\u04e3\u00a9\3\2\2\2", + "\u04e4\u04e6\5\64\33\2\u04e5\u04e4\3\2\2\2\u04e5\u04e6\3\2\2\2\u04e6", + "\u04e7\3\2\2\2\u04e7\u04e9\5b\62\2\u04e8\u04ea\5\u00acW\2\u04e9\u04e8", + "\3\2\2\2\u04e9\u04ea\3\2\2\2\u04ea\u04eb\3\2\2\2\u04eb\u04ec\5\u0094", + "K\2\u04ec\u00ab\3\2\2\2\u04ed\u04ee\bW\1\2\u04ee\u04ef\5\62\32\2\u04ef", + "\u04f4\3\2\2\2\u04f0\u04f1\f\3\2\2\u04f1\u04f3\5\62\32\2\u04f2\u04f0", + "\3\2\2\2\u04f3\u04f6\3\2\2\2\u04f4\u04f2\3\2\2\2\u04f4\u04f5\3\2\2\2", + "\u04f5\u00ad\3\2\2\2\u04f6\u04f4\3\2\2\2\u008d\u00b3\u00bb\u00cf\u00e0", + "\u00ea\u010e\u0118\u0125\u0127\u0132\u014b\u015b\u0169\u016b\u0177\u0179", + "\u0185\u0187\u0199\u019b\u01a7\u01a9\u01b4\u01bf\u01ca\u01d5\u01e0\u01e9", + "\u01f0\u01fc\u0203\u0208\u020d\u0212\u0219\u0223\u022b\u023d\u0241\u0248", + "\u0257\u025c\u0261\u0265\u0269\u026b\u0275\u027a\u027e\u0282\u028a\u0293", + "\u029d\u02a5\u02b6\u02c2\u02c5\u02cb\u02d4\u02d9\u02dc\u02e3\u02f2\u02fe", + "\u0301\u0303\u030b\u030f\u031d\u0321\u0326\u0329\u032c\u0333\u0335\u033a", + "\u033e\u0343\u0347\u034a\u0353\u035b\u0365\u036d\u036f\u0379\u037e\u0382", + "\u0388\u038b\u0394\u0399\u039c\u03a2\u03b2\u03b8\u03bb\u03c0\u03c3\u03ca", + "\u03dd\u03e3\u03e6\u03e8\u03f7\u03fb\u0402\u0407\u0414\u041d\u0426\u0439", + "\u043c\u0444\u0447\u044b\u0450\u045d\u0461\u046c\u0472\u047b\u0486\u048e", + "\u04a1\u04a5\u04a9\u04b1\u04b5\u04ba\u04c5\u04cc\u04cf\u04d3\u04dc\u04e2", + "\u04e5\u04e9\u04f4"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -576,7 +579,7 @@ var ruleNames = [ "primaryExpression", "genericSelection", "genericAssocList", "typedefName", "initializer", "initializerList", "designation", "designatorList", "designator", "staticAssertDeclaration", "statement", "labeledStatement", "compoundStatement", - "blockItemList", "blockItem", "expressionStatement", + "blockItemList", "blockItem", "specialMethodCall", "expressionStatement", "selectionStatement", "iterationStatement", "jumpStatement", "compilationUnit", "translationUnit", "externalDeclaration", "functionDefinition", "declarationList" ]; @@ -790,15 +793,16 @@ CParser.RULE_labeledStatement = 72; CParser.RULE_compoundStatement = 73; CParser.RULE_blockItemList = 74; CParser.RULE_blockItem = 75; -CParser.RULE_expressionStatement = 76; -CParser.RULE_selectionStatement = 77; -CParser.RULE_iterationStatement = 78; -CParser.RULE_jumpStatement = 79; -CParser.RULE_compilationUnit = 80; -CParser.RULE_translationUnit = 81; -CParser.RULE_externalDeclaration = 82; -CParser.RULE_functionDefinition = 83; -CParser.RULE_declarationList = 84; +CParser.RULE_specialMethodCall = 76; +CParser.RULE_expressionStatement = 77; +CParser.RULE_selectionStatement = 78; +CParser.RULE_iterationStatement = 79; +CParser.RULE_jumpStatement = 80; +CParser.RULE_compilationUnit = 81; +CParser.RULE_translationUnit = 82; +CParser.RULE_externalDeclaration = 83; +CParser.RULE_functionDefinition = 84; +CParser.RULE_declarationList = 85; function PrimaryExpressionContext(parser, parent, invokingState) { if(parent===undefined) { @@ -879,36 +883,36 @@ CParser.prototype.primaryExpression = function() { this.enterRule(localctx, 0, CParser.RULE_primaryExpression); var _la = 0; // Token type try { - this.state = 203; + this.state = 205; var la_ = this._interp.adaptivePredict(this._input,2,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 170; + this.state = 172; this.match(CParser.Identifier); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 171; + this.state = 173; this.match(CParser.Constant); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 173; + this.state = 175; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 172; + this.state = 174; this.match(CParser.StringLiteral); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 175; + this.state = 177; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,0, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -916,66 +920,66 @@ CParser.prototype.primaryExpression = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 177; + this.state = 179; this.match(CParser.LeftParen); - this.state = 178; + this.state = 180; this.expression(0); - this.state = 179; + this.state = 181; this.match(CParser.RightParen); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 181; + this.state = 183; this.genericSelection(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 183; + this.state = 185; _la = this._input.LA(1); if(_la===CParser.T__0) { - this.state = 182; + this.state = 184; this.match(CParser.T__0); } - this.state = 185; + this.state = 187; this.match(CParser.LeftParen); - this.state = 186; + this.state = 188; this.compoundStatement(); - this.state = 187; + this.state = 189; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 189; + this.state = 191; this.match(CParser.T__1); - this.state = 190; + this.state = 192; this.match(CParser.LeftParen); - this.state = 191; + this.state = 193; this.unaryExpression(); - this.state = 192; + this.state = 194; this.match(CParser.Comma); - this.state = 193; + this.state = 195; this.typeName(); - this.state = 194; + this.state = 196; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 196; + this.state = 198; this.match(CParser.T__2); - this.state = 197; + this.state = 199; this.match(CParser.LeftParen); - this.state = 198; + this.state = 200; this.typeName(); - this.state = 199; + this.state = 201; this.match(CParser.Comma); - this.state = 200; + this.state = 202; this.unaryExpression(); - this.state = 201; + this.state = 203; this.match(CParser.RightParen); break; @@ -1041,17 +1045,17 @@ CParser.prototype.genericSelection = function() { this.enterRule(localctx, 2, CParser.RULE_genericSelection); try { this.enterOuterAlt(localctx, 1); - this.state = 205; + this.state = 207; this.match(CParser.Generic); - this.state = 206; + this.state = 208; this.match(CParser.LeftParen); - this.state = 207; + this.state = 209; this.assignmentExpression(); - this.state = 208; + this.state = 210; this.match(CParser.Comma); - this.state = 209; + this.state = 211; this.genericAssocList(0); - this.state = 210; + this.state = 212; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -1117,10 +1121,10 @@ CParser.prototype.genericAssocList = function(_p) { this.enterRecursionRule(localctx, 4, CParser.RULE_genericAssocList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 213; + this.state = 215; this.genericAssociation(); this._ctx.stop = this._input.LT(-1); - this.state = 220; + this.state = 222; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,3,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1131,16 +1135,16 @@ CParser.prototype.genericAssocList = function(_p) { _prevctx = localctx; localctx = new GenericAssocListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_genericAssocList); - this.state = 215; + this.state = 217; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 216; + this.state = 218; this.match(CParser.Comma); - this.state = 217; + this.state = 219; this.genericAssociation(); } - this.state = 222; + this.state = 224; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,3,this._ctx); } @@ -1205,7 +1209,7 @@ CParser.prototype.genericAssociation = function() { var localctx = new GenericAssociationContext(this, this._ctx, this.state); this.enterRule(localctx, 6, CParser.RULE_genericAssociation); try { - this.state = 230; + this.state = 232; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -1232,20 +1236,20 @@ CParser.prototype.genericAssociation = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 223; + this.state = 225; this.typeName(); - this.state = 224; + this.state = 226; this.match(CParser.Colon); - this.state = 225; + this.state = 227; this.assignmentExpression(); break; case CParser.Default: this.enterOuterAlt(localctx, 2); - this.state = 227; + this.state = 229; this.match(CParser.Default); - this.state = 228; + this.state = 230; this.match(CParser.Colon); - this.state = 229; + this.state = 231; this.assignmentExpression(); break; default: @@ -1336,85 +1340,85 @@ CParser.prototype.postfixExpression = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 266; + this.state = 268; var la_ = this._interp.adaptivePredict(this._input,5,this._ctx); switch(la_) { case 1: - this.state = 233; + this.state = 235; this.primaryExpression(); break; case 2: - this.state = 234; + this.state = 236; this.match(CParser.LeftParen); - this.state = 235; + this.state = 237; this.typeName(); - this.state = 236; + this.state = 238; this.match(CParser.RightParen); - this.state = 237; + this.state = 239; this.match(CParser.LeftBrace); - this.state = 238; + this.state = 240; this.initializerList(0); - this.state = 239; + this.state = 241; this.match(CParser.RightBrace); break; case 3: - this.state = 241; + this.state = 243; this.match(CParser.LeftParen); - this.state = 242; + this.state = 244; this.typeName(); - this.state = 243; + this.state = 245; this.match(CParser.RightParen); - this.state = 244; + this.state = 246; this.match(CParser.LeftBrace); - this.state = 245; + this.state = 247; this.initializerList(0); - this.state = 246; + this.state = 248; this.match(CParser.Comma); - this.state = 247; + this.state = 249; this.match(CParser.RightBrace); break; case 4: - this.state = 249; + this.state = 251; this.match(CParser.T__0); - this.state = 250; + this.state = 252; this.match(CParser.LeftParen); - this.state = 251; + this.state = 253; this.typeName(); - this.state = 252; + this.state = 254; this.match(CParser.RightParen); - this.state = 253; + this.state = 255; this.match(CParser.LeftBrace); - this.state = 254; + this.state = 256; this.initializerList(0); - this.state = 255; + this.state = 257; this.match(CParser.RightBrace); break; case 5: - this.state = 257; + this.state = 259; this.match(CParser.T__0); - this.state = 258; + this.state = 260; this.match(CParser.LeftParen); - this.state = 259; + this.state = 261; this.typeName(); - this.state = 260; + this.state = 262; this.match(CParser.RightParen); - this.state = 261; + this.state = 263; this.match(CParser.LeftBrace); - this.state = 262; + this.state = 264; this.initializerList(0); - this.state = 263; + this.state = 265; this.match(CParser.Comma); - this.state = 264; + this.state = 266; this.match(CParser.RightBrace); break; } this._ctx.stop = this._input.LT(-1); - this.state = 291; + this.state = 293; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,8,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1423,95 +1427,95 @@ CParser.prototype.postfixExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 289; + this.state = 291; var la_ = this._interp.adaptivePredict(this._input,7,this._ctx); switch(la_) { case 1: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 268; + this.state = 270; if (!( this.precpred(this._ctx, 10))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 10)"); } - this.state = 269; + this.state = 271; this.match(CParser.LeftBracket); - this.state = 270; + this.state = 272; this.expression(0); - this.state = 271; + this.state = 273; this.match(CParser.RightBracket); break; case 2: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 273; + this.state = 275; if (!( this.precpred(this._ctx, 9))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 9)"); } - this.state = 274; - this.match(CParser.LeftParen); this.state = 276; + this.match(CParser.LeftParen); + this.state = 278; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 275; + this.state = 277; this.argumentExpressionList(0); } - this.state = 278; + this.state = 280; this.match(CParser.RightParen); break; case 3: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 279; + this.state = 281; if (!( this.precpred(this._ctx, 8))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)"); } - this.state = 280; + this.state = 282; this.match(CParser.Dot); - this.state = 281; + this.state = 283; this.match(CParser.Identifier); break; case 4: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 282; + this.state = 284; if (!( this.precpred(this._ctx, 7))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)"); } - this.state = 283; + this.state = 285; this.match(CParser.Arrow); - this.state = 284; + this.state = 286; this.match(CParser.Identifier); break; case 5: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 285; + this.state = 287; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 286; + this.state = 288; this.match(CParser.PlusPlus); break; case 6: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 287; + this.state = 289; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 288; + this.state = 290; this.match(CParser.MinusMinus); break; } } - this.state = 293; + this.state = 295; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,8,this._ctx); } @@ -1580,10 +1584,10 @@ CParser.prototype.argumentExpressionList = function(_p) { this.enterRecursionRule(localctx, 10, CParser.RULE_argumentExpressionList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 295; + this.state = 297; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 302; + this.state = 304; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,9,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1594,16 +1598,16 @@ CParser.prototype.argumentExpressionList = function(_p) { _prevctx = localctx; localctx = new ArgumentExpressionListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_argumentExpressionList); - this.state = 297; + this.state = 299; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 298; + this.state = 300; this.match(CParser.Comma); - this.state = 299; + this.state = 301; this.assignmentExpression(); } - this.state = 304; + this.state = 306; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,9,this._ctx); } @@ -1684,76 +1688,76 @@ CParser.prototype.unaryExpression = function() { var localctx = new UnaryExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 12, CParser.RULE_unaryExpression); try { - this.state = 327; + this.state = 329; var la_ = this._interp.adaptivePredict(this._input,10,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 305; + this.state = 307; this.postfixExpression(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 306; + this.state = 308; this.match(CParser.PlusPlus); - this.state = 307; + this.state = 309; this.unaryExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 308; + this.state = 310; this.match(CParser.MinusMinus); - this.state = 309; + this.state = 311; this.unaryExpression(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 310; + this.state = 312; this.unaryOperator(); - this.state = 311; + this.state = 313; this.castExpression(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 313; + this.state = 315; this.match(CParser.Sizeof); - this.state = 314; + this.state = 316; this.unaryExpression(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 315; + this.state = 317; this.match(CParser.Sizeof); - this.state = 316; + this.state = 318; this.match(CParser.LeftParen); - this.state = 317; + this.state = 319; this.typeName(); - this.state = 318; + this.state = 320; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 320; + this.state = 322; this.match(CParser.Alignof); - this.state = 321; + this.state = 323; this.match(CParser.LeftParen); - this.state = 322; + this.state = 324; this.typeName(); - this.state = 323; + this.state = 325; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 325; + this.state = 327; this.match(CParser.AndAnd); - this.state = 326; + this.state = 328; this.match(CParser.Identifier); break; @@ -1813,7 +1817,7 @@ CParser.prototype.unaryOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 329; + this.state = 331; _la = this._input.LA(1); if(!(((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0))) { this._errHandler.recoverInline(this); @@ -1885,38 +1889,38 @@ CParser.prototype.castExpression = function() { var localctx = new CastExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 16, CParser.RULE_castExpression); try { - this.state = 343; + this.state = 345; var la_ = this._interp.adaptivePredict(this._input,11,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 331; + this.state = 333; this.unaryExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 332; + this.state = 334; this.match(CParser.LeftParen); - this.state = 333; + this.state = 335; this.typeName(); - this.state = 334; + this.state = 336; this.match(CParser.RightParen); - this.state = 335; + this.state = 337; this.castExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 337; + this.state = 339; this.match(CParser.T__0); - this.state = 338; + this.state = 340; this.match(CParser.LeftParen); - this.state = 339; + this.state = 341; this.typeName(); - this.state = 340; + this.state = 342; this.match(CParser.RightParen); - this.state = 341; + this.state = 343; this.castExpression(); break; @@ -1985,10 +1989,10 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.enterRecursionRule(localctx, 18, CParser.RULE_multiplicativeExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 346; + this.state = 348; this.castExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 359; + this.state = 361; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,13,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1997,51 +2001,51 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 357; + this.state = 359; var la_ = this._interp.adaptivePredict(this._input,12,this._ctx); switch(la_) { case 1: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 348; + this.state = 350; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 349; + this.state = 351; this.match(CParser.Star); - this.state = 350; + this.state = 352; this.castExpression(); break; case 2: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 351; + this.state = 353; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 352; + this.state = 354; this.match(CParser.Div); - this.state = 353; + this.state = 355; this.castExpression(); break; case 3: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 354; + this.state = 356; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 355; + this.state = 357; this.match(CParser.Mod); - this.state = 356; + this.state = 358; this.castExpression(); break; } } - this.state = 361; + this.state = 363; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,13,this._ctx); } @@ -2110,10 +2114,10 @@ CParser.prototype.additiveExpression = function(_p) { this.enterRecursionRule(localctx, 20, CParser.RULE_additiveExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 363; + this.state = 365; this.multiplicativeExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 373; + this.state = 375; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,15,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2122,38 +2126,38 @@ CParser.prototype.additiveExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 371; + this.state = 373; var la_ = this._interp.adaptivePredict(this._input,14,this._ctx); switch(la_) { case 1: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 365; + this.state = 367; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 366; + this.state = 368; this.match(CParser.Plus); - this.state = 367; + this.state = 369; this.multiplicativeExpression(0); break; case 2: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 368; + this.state = 370; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 369; + this.state = 371; this.match(CParser.Minus); - this.state = 370; + this.state = 372; this.multiplicativeExpression(0); break; } } - this.state = 375; + this.state = 377; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,15,this._ctx); } @@ -2222,10 +2226,10 @@ CParser.prototype.shiftExpression = function(_p) { this.enterRecursionRule(localctx, 22, CParser.RULE_shiftExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 377; + this.state = 379; this.additiveExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 387; + this.state = 389; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,17,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2234,38 +2238,38 @@ CParser.prototype.shiftExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 385; + this.state = 387; var la_ = this._interp.adaptivePredict(this._input,16,this._ctx); switch(la_) { case 1: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 379; + this.state = 381; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 380; + this.state = 382; this.match(CParser.LeftShift); - this.state = 381; + this.state = 383; this.additiveExpression(0); break; case 2: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 382; + this.state = 384; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 383; + this.state = 385; this.match(CParser.RightShift); - this.state = 384; + this.state = 386; this.additiveExpression(0); break; } } - this.state = 389; + this.state = 391; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,17,this._ctx); } @@ -2334,10 +2338,10 @@ CParser.prototype.relationalExpression = function(_p) { this.enterRecursionRule(localctx, 24, CParser.RULE_relationalExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 391; + this.state = 393; this.shiftExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 407; + this.state = 409; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,19,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2346,64 +2350,64 @@ CParser.prototype.relationalExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 405; + this.state = 407; var la_ = this._interp.adaptivePredict(this._input,18,this._ctx); switch(la_) { case 1: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 393; + this.state = 395; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 394; + this.state = 396; this.match(CParser.Less); - this.state = 395; + this.state = 397; this.shiftExpression(0); break; case 2: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 396; + this.state = 398; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 397; + this.state = 399; this.match(CParser.Greater); - this.state = 398; + this.state = 400; this.shiftExpression(0); break; case 3: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 399; + this.state = 401; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 400; + this.state = 402; this.match(CParser.LessEqual); - this.state = 401; + this.state = 403; this.shiftExpression(0); break; case 4: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 402; + this.state = 404; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 403; + this.state = 405; this.match(CParser.GreaterEqual); - this.state = 404; + this.state = 406; this.shiftExpression(0); break; } } - this.state = 409; + this.state = 411; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,19,this._ctx); } @@ -2472,10 +2476,10 @@ CParser.prototype.equalityExpression = function(_p) { this.enterRecursionRule(localctx, 26, CParser.RULE_equalityExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 411; + this.state = 413; this.relationalExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 421; + this.state = 423; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,21,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2484,38 +2488,38 @@ CParser.prototype.equalityExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 419; + this.state = 421; var la_ = this._interp.adaptivePredict(this._input,20,this._ctx); switch(la_) { case 1: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 413; + this.state = 415; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 414; + this.state = 416; this.match(CParser.Equal); - this.state = 415; + this.state = 417; this.relationalExpression(0); break; case 2: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 416; + this.state = 418; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 417; + this.state = 419; this.match(CParser.NotEqual); - this.state = 418; + this.state = 420; this.relationalExpression(0); break; } } - this.state = 423; + this.state = 425; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,21,this._ctx); } @@ -2584,10 +2588,10 @@ CParser.prototype.andExpression = function(_p) { this.enterRecursionRule(localctx, 28, CParser.RULE_andExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 425; + this.state = 427; this.equalityExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 432; + this.state = 434; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,22,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2598,16 +2602,16 @@ CParser.prototype.andExpression = function(_p) { _prevctx = localctx; localctx = new AndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_andExpression); - this.state = 427; + this.state = 429; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 428; + this.state = 430; this.match(CParser.And); - this.state = 429; + this.state = 431; this.equalityExpression(0); } - this.state = 434; + this.state = 436; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,22,this._ctx); } @@ -2676,10 +2680,10 @@ CParser.prototype.exclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 30, CParser.RULE_exclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 436; + this.state = 438; this.andExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 443; + this.state = 445; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,23,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2690,16 +2694,16 @@ CParser.prototype.exclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new ExclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_exclusiveOrExpression); - this.state = 438; + this.state = 440; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 439; + this.state = 441; this.match(CParser.Caret); - this.state = 440; + this.state = 442; this.andExpression(0); } - this.state = 445; + this.state = 447; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,23,this._ctx); } @@ -2768,10 +2772,10 @@ CParser.prototype.inclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 32, CParser.RULE_inclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 447; + this.state = 449; this.exclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 454; + this.state = 456; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,24,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2782,16 +2786,16 @@ CParser.prototype.inclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new InclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_inclusiveOrExpression); - this.state = 449; + this.state = 451; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 450; + this.state = 452; this.match(CParser.Or); - this.state = 451; + this.state = 453; this.exclusiveOrExpression(0); } - this.state = 456; + this.state = 458; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,24,this._ctx); } @@ -2860,10 +2864,10 @@ CParser.prototype.logicalAndExpression = function(_p) { this.enterRecursionRule(localctx, 34, CParser.RULE_logicalAndExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 458; + this.state = 460; this.inclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 465; + this.state = 467; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,25,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2874,16 +2878,16 @@ CParser.prototype.logicalAndExpression = function(_p) { _prevctx = localctx; localctx = new LogicalAndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalAndExpression); - this.state = 460; + this.state = 462; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 461; + this.state = 463; this.match(CParser.AndAnd); - this.state = 462; + this.state = 464; this.inclusiveOrExpression(0); } - this.state = 467; + this.state = 469; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,25,this._ctx); } @@ -2952,10 +2956,10 @@ CParser.prototype.logicalOrExpression = function(_p) { this.enterRecursionRule(localctx, 36, CParser.RULE_logicalOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 469; + this.state = 471; this.logicalAndExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 476; + this.state = 478; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,26,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2966,16 +2970,16 @@ CParser.prototype.logicalOrExpression = function(_p) { _prevctx = localctx; localctx = new LogicalOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalOrExpression); - this.state = 471; + this.state = 473; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 472; + this.state = 474; this.match(CParser.OrOr); - this.state = 473; + this.state = 475; this.logicalAndExpression(0); } - this.state = 478; + this.state = 480; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,26,this._ctx); } @@ -3045,18 +3049,18 @@ CParser.prototype.conditionalExpression = function() { this.enterRule(localctx, 38, CParser.RULE_conditionalExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 479; + this.state = 481; this.logicalOrExpression(0); - this.state = 485; + this.state = 487; var la_ = this._interp.adaptivePredict(this._input,27,this._ctx); if(la_===1) { - this.state = 480; + this.state = 482; this.match(CParser.Question); - this.state = 481; + this.state = 483; this.expression(0); - this.state = 482; + this.state = 484; this.match(CParser.Colon); - this.state = 483; + this.state = 485; this.conditionalExpression(); } @@ -3128,22 +3132,22 @@ CParser.prototype.assignmentExpression = function() { var localctx = new AssignmentExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 40, CParser.RULE_assignmentExpression); try { - this.state = 492; + this.state = 494; var la_ = this._interp.adaptivePredict(this._input,28,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 487; + this.state = 489; this.conditionalExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 488; + this.state = 490; this.unaryExpression(); - this.state = 489; + this.state = 491; this.assignmentOperator(); - this.state = 490; + this.state = 492; this.assignmentExpression(); break; @@ -3203,7 +3207,7 @@ CParser.prototype.assignmentOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 494; + this.state = 496; _la = this._input.LA(1); if(!(((((_la - 89)) & ~0x1f) == 0 && ((1 << (_la - 89)) & ((1 << (CParser.Assign - 89)) | (1 << (CParser.StarAssign - 89)) | (1 << (CParser.DivAssign - 89)) | (1 << (CParser.ModAssign - 89)) | (1 << (CParser.PlusAssign - 89)) | (1 << (CParser.MinusAssign - 89)) | (1 << (CParser.LeftShiftAssign - 89)) | (1 << (CParser.RightShiftAssign - 89)) | (1 << (CParser.AndAssign - 89)) | (1 << (CParser.XorAssign - 89)) | (1 << (CParser.OrAssign - 89)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3275,10 +3279,10 @@ CParser.prototype.expression = function(_p) { this.enterRecursionRule(localctx, 44, CParser.RULE_expression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 497; + this.state = 499; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 504; + this.state = 506; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,29,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3289,16 +3293,16 @@ CParser.prototype.expression = function(_p) { _prevctx = localctx; localctx = new ExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_expression); - this.state = 499; + this.state = 501; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 500; + this.state = 502; this.match(CParser.Comma); - this.state = 501; + this.state = 503; this.assignmentExpression(); } - this.state = 506; + this.state = 508; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,29,this._ctx); } @@ -3360,7 +3364,7 @@ CParser.prototype.constantExpression = function() { this.enterRule(localctx, 46, CParser.RULE_constantExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 507; + this.state = 509; this.conditionalExpression(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -3427,7 +3431,7 @@ CParser.prototype.declaration = function() { this.enterRule(localctx, 48, CParser.RULE_declaration); var _la = 0; // Token type try { - this.state = 516; + this.state = 518; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -3467,21 +3471,21 @@ CParser.prototype.declaration = function() { case CParser.ThreadLocal: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 509; - this.declarationSpecifiers(); this.state = 511; + this.declarationSpecifiers(); + this.state = 513; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 510; + this.state = 512; this.initDeclaratorList(0); } - this.state = 513; + this.state = 515; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 515; + this.state = 517; this.staticAssertDeclaration(); break; default: @@ -3551,19 +3555,19 @@ CParser.prototype.declarationSpecifiers = function() { this.enterRule(localctx, 50, CParser.RULE_declarationSpecifiers); try { this.enterOuterAlt(localctx, 1); - this.state = 519; + this.state = 521; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 518; + this.state = 520; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 521; + this.state = 523; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,32, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3631,19 +3635,19 @@ CParser.prototype.declarationSpecifiers2 = function() { this.enterRule(localctx, 52, CParser.RULE_declarationSpecifiers2); try { this.enterOuterAlt(localctx, 1); - this.state = 524; + this.state = 526; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 523; + this.state = 525; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 526; + this.state = 528; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,33, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3719,36 +3723,36 @@ CParser.prototype.declarationSpecifier = function() { var localctx = new DeclarationSpecifierContext(this, this._ctx, this.state); this.enterRule(localctx, 54, CParser.RULE_declarationSpecifier); try { - this.state = 533; + this.state = 535; var la_ = this._interp.adaptivePredict(this._input,34,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 528; + this.state = 530; this.storageClassSpecifier(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 529; + this.state = 531; this.typeSpecifier(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 530; + this.state = 532; this.typeQualifier(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 531; + this.state = 533; this.functionSpecifier(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 532; + this.state = 534; this.alignmentSpecifier(); break; @@ -3817,10 +3821,10 @@ CParser.prototype.initDeclaratorList = function(_p) { this.enterRecursionRule(localctx, 56, CParser.RULE_initDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 536; + this.state = 538; this.initDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 543; + this.state = 545; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,35,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3831,16 +3835,16 @@ CParser.prototype.initDeclaratorList = function(_p) { _prevctx = localctx; localctx = new InitDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initDeclaratorList); - this.state = 538; + this.state = 540; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 539; + this.state = 541; this.match(CParser.Comma); - this.state = 540; + this.state = 542; this.initDeclarator(); } - this.state = 545; + this.state = 547; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,35,this._ctx); } @@ -3905,22 +3909,22 @@ CParser.prototype.initDeclarator = function() { var localctx = new InitDeclaratorContext(this, this._ctx, this.state); this.enterRule(localctx, 58, CParser.RULE_initDeclarator); try { - this.state = 551; + this.state = 553; var la_ = this._interp.adaptivePredict(this._input,36,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 546; + this.state = 548; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 547; + this.state = 549; this.declarator(); - this.state = 548; + this.state = 550; this.match(CParser.Assign); - this.state = 549; + this.state = 551; this.initializer(); break; @@ -3980,7 +3984,7 @@ CParser.prototype.storageClassSpecifier = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 553; + this.state = 555; _la = this._input.LA(1); if(!(_la===CParser.Auto || _la===CParser.Extern || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Register - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0))) { this._errHandler.recoverInline(this); @@ -4061,7 +4065,7 @@ CParser.prototype.typeSpecifier = function() { this.enterRule(localctx, 62, CParser.RULE_typeSpecifier); var _la = 0; // Token type try { - this.state = 569; + this.state = 571; switch(this._input.LA(1)) { case CParser.T__3: case CParser.T__4: @@ -4078,7 +4082,7 @@ CParser.prototype.typeSpecifier = function() { case CParser.Bool: case CParser.Complex: this.enterOuterAlt(localctx, 1); - this.state = 555; + this.state = 557; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0))) { this._errHandler.recoverInline(this); @@ -4089,11 +4093,11 @@ CParser.prototype.typeSpecifier = function() { break; case CParser.T__0: this.enterOuterAlt(localctx, 2); - this.state = 556; + this.state = 558; this.match(CParser.T__0); - this.state = 557; + this.state = 559; this.match(CParser.LeftParen); - this.state = 558; + this.state = 560; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5))) !== 0))) { this._errHandler.recoverInline(this); @@ -4101,39 +4105,39 @@ CParser.prototype.typeSpecifier = function() { else { this.consume(); } - this.state = 559; + this.state = 561; this.match(CParser.RightParen); break; case CParser.Atomic: this.enterOuterAlt(localctx, 3); - this.state = 560; + this.state = 562; this.atomicTypeSpecifier(); break; case CParser.Struct: case CParser.Union: this.enterOuterAlt(localctx, 4); - this.state = 561; + this.state = 563; this.structOrUnionSpecifier(); break; case CParser.Enum: this.enterOuterAlt(localctx, 5); - this.state = 562; + this.state = 564; this.enumSpecifier(); break; case CParser.Identifier: this.enterOuterAlt(localctx, 6); - this.state = 563; + this.state = 565; this.typedefName(); break; case CParser.T__6: this.enterOuterAlt(localctx, 7); - this.state = 564; + this.state = 566; this.match(CParser.T__6); - this.state = 565; + this.state = 567; this.match(CParser.LeftParen); - this.state = 566; + this.state = 568; this.constantExpression(); - this.state = 567; + this.state = 569; this.match(CParser.RightParen); break; default: @@ -4204,29 +4208,29 @@ CParser.prototype.structOrUnionSpecifier = function() { this.enterRule(localctx, 64, CParser.RULE_structOrUnionSpecifier); var _la = 0; // Token type try { - this.state = 580; + this.state = 582; var la_ = this._interp.adaptivePredict(this._input,39,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 571; - this.structOrUnion(); this.state = 573; + this.structOrUnion(); + this.state = 575; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 572; + this.state = 574; this.match(CParser.Identifier); } - this.state = 575; + this.state = 577; this.structDeclarationsBlock(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 577; + this.state = 579; this.structOrUnion(); - this.state = 578; + this.state = 580; this.match(CParser.Identifier); break; @@ -4286,7 +4290,7 @@ CParser.prototype.structOrUnion = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 582; + this.state = 584; _la = this._input.LA(1); if(!(_la===CParser.Struct || _la===CParser.Union)) { this._errHandler.recoverInline(this); @@ -4351,11 +4355,11 @@ CParser.prototype.structDeclarationsBlock = function() { this.enterRule(localctx, 68, CParser.RULE_structDeclarationsBlock); try { this.enterOuterAlt(localctx, 1); - this.state = 584; + this.state = 586; this.match(CParser.LeftBrace); - this.state = 585; + this.state = 587; this.structDeclarationList(0); - this.state = 586; + this.state = 588; this.match(CParser.RightBrace); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -4421,10 +4425,10 @@ CParser.prototype.structDeclarationList = function(_p) { this.enterRecursionRule(localctx, 70, CParser.RULE_structDeclarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 589; + this.state = 591; this.structDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 595; + this.state = 597; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,40,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4435,14 +4439,14 @@ CParser.prototype.structDeclarationList = function(_p) { _prevctx = localctx; localctx = new StructDeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclarationList); - this.state = 591; + this.state = 593; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 592; + this.state = 594; this.structDeclaration(); } - this.state = 597; + this.state = 599; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,40,this._ctx); } @@ -4512,7 +4516,7 @@ CParser.prototype.structDeclaration = function() { this.enterRule(localctx, 72, CParser.RULE_structDeclaration); var _la = 0; // Token type try { - this.state = 605; + this.state = 607; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -4539,21 +4543,21 @@ CParser.prototype.structDeclaration = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 598; - this.specifierQualifierList(); this.state = 600; + this.specifierQualifierList(); + this.state = 602; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)) | (1 << (CParser.Colon - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 599; + this.state = 601; this.structDeclaratorList(0); } - this.state = 602; + this.state = 604; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 604; + this.state = 606; this.staticAssertDeclaration(); break; default: @@ -4623,17 +4627,17 @@ CParser.prototype.specifierQualifierList = function() { var localctx = new SpecifierQualifierListContext(this, this._ctx, this.state); this.enterRule(localctx, 74, CParser.RULE_specifierQualifierList); try { - this.state = 615; + this.state = 617; var la_ = this._interp.adaptivePredict(this._input,45,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 607; - this.typeSpecifier(); this.state = 609; + this.typeSpecifier(); + this.state = 611; var la_ = this._interp.adaptivePredict(this._input,43,this._ctx); if(la_===1) { - this.state = 608; + this.state = 610; this.specifierQualifierList(); } @@ -4641,12 +4645,12 @@ CParser.prototype.specifierQualifierList = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 611; - this.typeQualifier(); this.state = 613; + this.typeQualifier(); + this.state = 615; var la_ = this._interp.adaptivePredict(this._input,44,this._ctx); if(la_===1) { - this.state = 612; + this.state = 614; this.specifierQualifierList(); } @@ -4717,10 +4721,10 @@ CParser.prototype.structDeclaratorList = function(_p) { this.enterRecursionRule(localctx, 76, CParser.RULE_structDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 618; + this.state = 620; this.structDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 625; + this.state = 627; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,46,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4731,16 +4735,16 @@ CParser.prototype.structDeclaratorList = function(_p) { _prevctx = localctx; localctx = new StructDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclaratorList); - this.state = 620; + this.state = 622; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 621; + this.state = 623; this.match(CParser.Comma); - this.state = 622; + this.state = 624; this.structDeclarator(); } - this.state = 627; + this.state = 629; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,46,this._ctx); } @@ -4806,27 +4810,27 @@ CParser.prototype.structDeclarator = function() { this.enterRule(localctx, 78, CParser.RULE_structDeclarator); var _la = 0; // Token type try { - this.state = 634; + this.state = 636; var la_ = this._interp.adaptivePredict(this._input,48,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 628; + this.state = 630; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 630; + this.state = 632; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 629; + this.state = 631; this.declarator(); } - this.state = 632; + this.state = 634; this.match(CParser.Colon); - this.state = 633; + this.state = 635; this.constantExpression(); break; @@ -4892,54 +4896,54 @@ CParser.prototype.enumSpecifier = function() { this.enterRule(localctx, 80, CParser.RULE_enumSpecifier); var _la = 0; // Token type try { - this.state = 655; + this.state = 657; var la_ = this._interp.adaptivePredict(this._input,51,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 636; - this.match(CParser.Enum); this.state = 638; + this.match(CParser.Enum); + this.state = 640; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 637; + this.state = 639; this.match(CParser.Identifier); } - this.state = 640; + this.state = 642; this.match(CParser.LeftBrace); - this.state = 641; + this.state = 643; this.enumeratorList(0); - this.state = 642; + this.state = 644; this.match(CParser.RightBrace); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 644; - this.match(CParser.Enum); this.state = 646; + this.match(CParser.Enum); + this.state = 648; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 645; + this.state = 647; this.match(CParser.Identifier); } - this.state = 648; + this.state = 650; this.match(CParser.LeftBrace); - this.state = 649; + this.state = 651; this.enumeratorList(0); - this.state = 650; + this.state = 652; this.match(CParser.Comma); - this.state = 651; + this.state = 653; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 653; + this.state = 655; this.match(CParser.Enum); - this.state = 654; + this.state = 656; this.match(CParser.Identifier); break; @@ -5008,10 +5012,10 @@ CParser.prototype.enumeratorList = function(_p) { this.enterRecursionRule(localctx, 82, CParser.RULE_enumeratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 658; + this.state = 660; this.enumerator(); this._ctx.stop = this._input.LT(-1); - this.state = 665; + this.state = 667; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,52,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -5022,16 +5026,16 @@ CParser.prototype.enumeratorList = function(_p) { _prevctx = localctx; localctx = new EnumeratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_enumeratorList); - this.state = 660; + this.state = 662; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 661; + this.state = 663; this.match(CParser.Comma); - this.state = 662; + this.state = 664; this.enumerator(); } - this.state = 667; + this.state = 669; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,52,this._ctx); } @@ -5096,22 +5100,22 @@ CParser.prototype.enumerator = function() { var localctx = new EnumeratorContext(this, this._ctx, this.state); this.enterRule(localctx, 84, CParser.RULE_enumerator); try { - this.state = 673; + this.state = 675; var la_ = this._interp.adaptivePredict(this._input,53,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 668; + this.state = 670; this.enumerationConstant(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 669; + this.state = 671; this.enumerationConstant(); - this.state = 670; + this.state = 672; this.match(CParser.Assign); - this.state = 671; + this.state = 673; this.constantExpression(); break; @@ -5173,7 +5177,7 @@ CParser.prototype.enumerationConstant = function() { this.enterRule(localctx, 86, CParser.RULE_enumerationConstant); try { this.enterOuterAlt(localctx, 1); - this.state = 675; + this.state = 677; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5232,13 +5236,13 @@ CParser.prototype.atomicTypeSpecifier = function() { this.enterRule(localctx, 88, CParser.RULE_atomicTypeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 677; + this.state = 679; this.match(CParser.Atomic); - this.state = 678; + this.state = 680; this.match(CParser.LeftParen); - this.state = 679; + this.state = 681; this.typeName(); - this.state = 680; + this.state = 682; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5295,7 +5299,7 @@ CParser.prototype.typeQualifier = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 682; + this.state = 684; _la = this._input.LA(1); if(!(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0))) { this._errHandler.recoverInline(this); @@ -5364,14 +5368,14 @@ CParser.prototype.functionSpecifier = function() { this.enterRule(localctx, 92, CParser.RULE_functionSpecifier); var _la = 0; // Token type try { - this.state = 690; + this.state = 692; switch(this._input.LA(1)) { case CParser.T__7: case CParser.T__8: case CParser.Inline: case CParser.Noreturn: this.enterOuterAlt(localctx, 1); - this.state = 684; + this.state = 686; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Inline))) !== 0) || _la===CParser.Noreturn)) { this._errHandler.recoverInline(this); @@ -5382,18 +5386,18 @@ CParser.prototype.functionSpecifier = function() { break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 685; + this.state = 687; this.gccAttributeSpecifier(); break; case CParser.T__9: this.enterOuterAlt(localctx, 3); - this.state = 686; + this.state = 688; this.match(CParser.T__9); - this.state = 687; + this.state = 689; this.match(CParser.LeftParen); - this.state = 688; + this.state = 690; this.match(CParser.Identifier); - this.state = 689; + this.state = 691; this.match(CParser.RightParen); break; default: @@ -5459,30 +5463,30 @@ CParser.prototype.alignmentSpecifier = function() { var localctx = new AlignmentSpecifierContext(this, this._ctx, this.state); this.enterRule(localctx, 94, CParser.RULE_alignmentSpecifier); try { - this.state = 702; + this.state = 704; var la_ = this._interp.adaptivePredict(this._input,55,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 692; + this.state = 694; this.match(CParser.Alignas); - this.state = 693; + this.state = 695; this.match(CParser.LeftParen); - this.state = 694; + this.state = 696; this.typeName(); - this.state = 695; + this.state = 697; this.match(CParser.RightParen); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 697; + this.state = 699; this.match(CParser.Alignas); - this.state = 698; + this.state = 700; this.match(CParser.LeftParen); - this.state = 699; + this.state = 701; this.constantExpression(); - this.state = 700; + this.state = 702; this.match(CParser.RightParen); break; @@ -5560,24 +5564,24 @@ CParser.prototype.declarator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 705; + this.state = 707; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 704; + this.state = 706; this.pointer(); } - this.state = 707; + this.state = 709; this.directDeclarator(0); - this.state = 711; + this.state = 713; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,57,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 708; + this.state = 710; this.gccDeclaratorExtension(); } - this.state = 713; + this.state = 715; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,57,this._ctx); } @@ -5667,25 +5671,25 @@ CParser.prototype.directDeclarator = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 720; + this.state = 722; switch(this._input.LA(1)) { case CParser.Identifier: - this.state = 715; + this.state = 717; this.match(CParser.Identifier); break; case CParser.LeftParen: - this.state = 716; + this.state = 718; this.match(CParser.LeftParen); - this.state = 717; + this.state = 719; this.declarator(); - this.state = 718; + this.state = 720; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } this._ctx.stop = this._input.LT(-1); - this.state = 767; + this.state = 769; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,65,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -5694,139 +5698,139 @@ CParser.prototype.directDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 765; + this.state = 767; var la_ = this._interp.adaptivePredict(this._input,64,this._ctx); switch(la_) { case 1: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 722; + this.state = 724; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 723; - this.match(CParser.LeftBracket); this.state = 725; + this.match(CParser.LeftBracket); + this.state = 727; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 724; + this.state = 726; this.typeQualifierList(0); } - this.state = 728; + this.state = 730; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 727; + this.state = 729; this.assignmentExpression(); } - this.state = 730; + this.state = 732; this.match(CParser.RightBracket); break; case 2: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 731; + this.state = 733; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 732; + this.state = 734; this.match(CParser.LeftBracket); - this.state = 733; - this.match(CParser.Static); this.state = 735; + this.match(CParser.Static); + this.state = 737; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 734; + this.state = 736; this.typeQualifierList(0); } - this.state = 737; + this.state = 739; this.assignmentExpression(); - this.state = 738; + this.state = 740; this.match(CParser.RightBracket); break; case 3: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 740; + this.state = 742; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 741; + this.state = 743; this.match(CParser.LeftBracket); - this.state = 742; + this.state = 744; this.typeQualifierList(0); - this.state = 743; + this.state = 745; this.match(CParser.Static); - this.state = 744; + this.state = 746; this.assignmentExpression(); - this.state = 745; + this.state = 747; this.match(CParser.RightBracket); break; case 4: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 747; + this.state = 749; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 748; - this.match(CParser.LeftBracket); this.state = 750; + this.match(CParser.LeftBracket); + this.state = 752; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 749; + this.state = 751; this.typeQualifierList(0); } - this.state = 752; + this.state = 754; this.match(CParser.Star); - this.state = 753; + this.state = 755; this.match(CParser.RightBracket); break; case 5: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 754; + this.state = 756; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 755; + this.state = 757; this.match(CParser.LeftParen); - this.state = 756; + this.state = 758; this.parameterTypeList(); - this.state = 757; + this.state = 759; this.match(CParser.RightParen); break; case 6: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 759; + this.state = 761; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 760; - this.match(CParser.LeftParen); this.state = 762; + this.match(CParser.LeftParen); + this.state = 764; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 761; + this.state = 763; this.identifierList(0); } - this.state = 764; + this.state = 766; this.match(CParser.RightParen); break; } } - this.state = 769; + this.state = 771; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,65,this._ctx); } @@ -5900,30 +5904,30 @@ CParser.prototype.gccDeclaratorExtension = function() { this.enterRule(localctx, 100, CParser.RULE_gccDeclaratorExtension); var _la = 0; // Token type try { - this.state = 779; + this.state = 781; switch(this._input.LA(1)) { case CParser.T__10: this.enterOuterAlt(localctx, 1); - this.state = 770; + this.state = 772; this.match(CParser.T__10); - this.state = 771; + this.state = 773; this.match(CParser.LeftParen); - this.state = 773; + this.state = 775; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 772; + this.state = 774; this.match(CParser.StringLiteral); - this.state = 775; + this.state = 777; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 777; + this.state = 779; this.match(CParser.RightParen); break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 778; + this.state = 780; this.gccAttributeSpecifier(); break; default: @@ -5986,17 +5990,17 @@ CParser.prototype.gccAttributeSpecifier = function() { this.enterRule(localctx, 102, CParser.RULE_gccAttributeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 781; + this.state = 783; this.match(CParser.T__11); - this.state = 782; + this.state = 784; this.match(CParser.LeftParen); - this.state = 783; + this.state = 785; this.match(CParser.LeftParen); - this.state = 784; + this.state = 786; this.gccAttributeList(); - this.state = 785; + this.state = 787; this.match(CParser.RightParen); - this.state = 786; + this.state = 788; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -6062,22 +6066,22 @@ CParser.prototype.gccAttributeList = function() { this.enterRule(localctx, 104, CParser.RULE_gccAttributeList); var _la = 0; // Token type try { - this.state = 797; + this.state = 799; var la_ = this._interp.adaptivePredict(this._input,69,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 788; + this.state = 790; this.gccAttribute(); - this.state = 793; + this.state = 795; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 789; + this.state = 791; this.match(CParser.Comma); - this.state = 790; + this.state = 792; this.gccAttribute(); - this.state = 795; + this.state = 797; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6146,7 +6150,7 @@ CParser.prototype.gccAttribute = function() { this.enterRule(localctx, 106, CParser.RULE_gccAttribute); var _la = 0; // Token type try { - this.state = 808; + this.state = 810; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6259,7 +6263,7 @@ CParser.prototype.gccAttribute = function() { case CParser.BlockComment: case CParser.LineComment: this.enterOuterAlt(localctx, 1); - this.state = 799; + this.state = 801; _la = this._input.LA(1); if(_la<=0 || ((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.RightParen - 59)) | (1 << (CParser.Comma - 59)))) !== 0)) { this._errHandler.recoverInline(this); @@ -6267,19 +6271,19 @@ CParser.prototype.gccAttribute = function() { else { this.consume(); } - this.state = 805; + this.state = 807; _la = this._input.LA(1); if(_la===CParser.LeftParen) { - this.state = 800; - this.match(CParser.LeftParen); this.state = 802; + this.match(CParser.LeftParen); + this.state = 804; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 801; + this.state = 803; this.argumentExpressionList(0); } - this.state = 804; + this.state = 806; this.match(CParser.RightParen); } @@ -6357,11 +6361,11 @@ CParser.prototype.nestedParenthesesBlock = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 817; + this.state = 819; this._errHandler.sync(this); _la = this._input.LA(1); while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { - this.state = 815; + this.state = 817; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6474,7 +6478,7 @@ CParser.prototype.nestedParenthesesBlock = function() { case CParser.Newline: case CParser.BlockComment: case CParser.LineComment: - this.state = 810; + this.state = 812; _la = this._input.LA(1); if(_la<=0 || _la===CParser.LeftParen || _la===CParser.RightParen) { this._errHandler.recoverInline(this); @@ -6484,17 +6488,17 @@ CParser.prototype.nestedParenthesesBlock = function() { } break; case CParser.LeftParen: - this.state = 811; + this.state = 813; this.match(CParser.LeftParen); - this.state = 812; + this.state = 814; this.nestedParenthesesBlock(); - this.state = 813; + this.state = 815; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 819; + this.state = 821; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6559,17 +6563,17 @@ CParser.prototype.pointer = function() { this.enterRule(localctx, 110, CParser.RULE_pointer); var _la = 0; // Token type try { - this.state = 838; + this.state = 840; var la_ = this._interp.adaptivePredict(this._input,79,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 820; - this.match(CParser.Star); this.state = 822; + this.match(CParser.Star); + this.state = 824; var la_ = this._interp.adaptivePredict(this._input,75,this._ctx); if(la_===1) { - this.state = 821; + this.state = 823; this.typeQualifierList(0); } @@ -6577,27 +6581,27 @@ CParser.prototype.pointer = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 824; - this.match(CParser.Star); this.state = 826; + this.match(CParser.Star); + this.state = 828; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 825; + this.state = 827; this.typeQualifierList(0); } - this.state = 828; + this.state = 830; this.pointer(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 829; - this.match(CParser.Caret); this.state = 831; + this.match(CParser.Caret); + this.state = 833; var la_ = this._interp.adaptivePredict(this._input,77,this._ctx); if(la_===1) { - this.state = 830; + this.state = 832; this.typeQualifierList(0); } @@ -6605,16 +6609,16 @@ CParser.prototype.pointer = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 833; - this.match(CParser.Caret); this.state = 835; + this.match(CParser.Caret); + this.state = 837; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 834; + this.state = 836; this.typeQualifierList(0); } - this.state = 837; + this.state = 839; this.pointer(); break; @@ -6683,10 +6687,10 @@ CParser.prototype.typeQualifierList = function(_p) { this.enterRecursionRule(localctx, 112, CParser.RULE_typeQualifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 841; + this.state = 843; this.typeQualifier(); this._ctx.stop = this._input.LT(-1); - this.state = 847; + this.state = 849; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,80,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6697,14 +6701,14 @@ CParser.prototype.typeQualifierList = function(_p) { _prevctx = localctx; localctx = new TypeQualifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_typeQualifierList); - this.state = 843; + this.state = 845; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 844; + this.state = 846; this.typeQualifier(); } - this.state = 849; + this.state = 851; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,80,this._ctx); } @@ -6765,22 +6769,22 @@ CParser.prototype.parameterTypeList = function() { var localctx = new ParameterTypeListContext(this, this._ctx, this.state); this.enterRule(localctx, 114, CParser.RULE_parameterTypeList); try { - this.state = 855; + this.state = 857; var la_ = this._interp.adaptivePredict(this._input,81,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 850; + this.state = 852; this.parameterList(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 851; + this.state = 853; this.parameterList(0); - this.state = 852; + this.state = 854; this.match(CParser.Comma); - this.state = 853; + this.state = 855; this.match(CParser.Ellipsis); break; @@ -6849,10 +6853,10 @@ CParser.prototype.parameterList = function(_p) { this.enterRecursionRule(localctx, 116, CParser.RULE_parameterList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 858; + this.state = 860; this.parameterDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 865; + this.state = 867; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,82,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6863,16 +6867,16 @@ CParser.prototype.parameterList = function(_p) { _prevctx = localctx; localctx = new ParameterListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_parameterList); - this.state = 860; + this.state = 862; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 861; + this.state = 863; this.match(CParser.Comma); - this.state = 862; + this.state = 864; this.parameterDeclaration(); } - this.state = 867; + this.state = 869; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,82,this._ctx); } @@ -6945,25 +6949,25 @@ CParser.prototype.parameterDeclaration = function() { var localctx = new ParameterDeclarationContext(this, this._ctx, this.state); this.enterRule(localctx, 118, CParser.RULE_parameterDeclaration); try { - this.state = 875; + this.state = 877; var la_ = this._interp.adaptivePredict(this._input,84,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 868; + this.state = 870; this.declarationSpecifiers(); - this.state = 869; + this.state = 871; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 871; - this.declarationSpecifiers2(); this.state = 873; + this.declarationSpecifiers2(); + this.state = 875; var la_ = this._interp.adaptivePredict(this._input,83,this._ctx); if(la_===1) { - this.state = 872; + this.state = 874; this.abstractDeclarator(); } @@ -7034,10 +7038,10 @@ CParser.prototype.identifierList = function(_p) { this.enterRecursionRule(localctx, 120, CParser.RULE_identifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 878; + this.state = 880; this.match(CParser.Identifier); this._ctx.stop = this._input.LT(-1); - this.state = 885; + this.state = 887; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,85,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7048,16 +7052,16 @@ CParser.prototype.identifierList = function(_p) { _prevctx = localctx; localctx = new IdentifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_identifierList); - this.state = 880; + this.state = 882; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 881; + this.state = 883; this.match(CParser.Comma); - this.state = 882; + this.state = 884; this.match(CParser.Identifier); } - this.state = 887; + this.state = 889; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,85,this._ctx); } @@ -7124,12 +7128,12 @@ CParser.prototype.typeName = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 888; - this.specifierQualifierList(); this.state = 890; + this.specifierQualifierList(); + this.state = 892; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.LeftBracket - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0)) { - this.state = 889; + this.state = 891; this.abstractDeclarator(); } @@ -7205,35 +7209,35 @@ CParser.prototype.abstractDeclarator = function() { this.enterRule(localctx, 124, CParser.RULE_abstractDeclarator); var _la = 0; // Token type try { - this.state = 903; + this.state = 905; var la_ = this._interp.adaptivePredict(this._input,89,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 892; + this.state = 894; this.pointer(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 894; + this.state = 896; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 893; + this.state = 895; this.pointer(); } - this.state = 896; + this.state = 898; this.directAbstractDeclarator(0); - this.state = 900; + this.state = 902; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,88,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 897; + this.state = 899; this.gccDeclaratorExtension(); } - this.state = 902; + this.state = 904; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,88,this._ctx); } @@ -7329,25 +7333,25 @@ CParser.prototype.directAbstractDeclarator = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 951; + this.state = 953; var la_ = this._interp.adaptivePredict(this._input,96,this._ctx); switch(la_) { case 1: - this.state = 906; + this.state = 908; this.match(CParser.LeftParen); - this.state = 907; + this.state = 909; this.abstractDeclarator(); - this.state = 908; + this.state = 910; this.match(CParser.RightParen); - this.state = 912; + this.state = 914; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,90,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 909; + this.state = 911; this.gccDeclaratorExtension(); } - this.state = 914; + this.state = 916; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,90,this._ctx); } @@ -7355,87 +7359,87 @@ CParser.prototype.directAbstractDeclarator = function(_p) { break; case 2: - this.state = 915; - this.match(CParser.LeftBracket); this.state = 917; + this.match(CParser.LeftBracket); + this.state = 919; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 916; + this.state = 918; this.typeQualifierList(0); } - this.state = 920; + this.state = 922; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 919; + this.state = 921; this.assignmentExpression(); } - this.state = 922; + this.state = 924; this.match(CParser.RightBracket); break; case 3: - this.state = 923; + this.state = 925; this.match(CParser.LeftBracket); - this.state = 924; - this.match(CParser.Static); this.state = 926; + this.match(CParser.Static); + this.state = 928; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 925; + this.state = 927; this.typeQualifierList(0); } - this.state = 928; + this.state = 930; this.assignmentExpression(); - this.state = 929; + this.state = 931; this.match(CParser.RightBracket); break; case 4: - this.state = 931; + this.state = 933; this.match(CParser.LeftBracket); - this.state = 932; + this.state = 934; this.typeQualifierList(0); - this.state = 933; + this.state = 935; this.match(CParser.Static); - this.state = 934; + this.state = 936; this.assignmentExpression(); - this.state = 935; + this.state = 937; this.match(CParser.RightBracket); break; case 5: - this.state = 937; + this.state = 939; this.match(CParser.LeftBracket); - this.state = 938; + this.state = 940; this.match(CParser.Star); - this.state = 939; + this.state = 941; this.match(CParser.RightBracket); break; case 6: - this.state = 940; - this.match(CParser.LeftParen); this.state = 942; + this.match(CParser.LeftParen); + this.state = 944; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 941; + this.state = 943; this.parameterTypeList(); } - this.state = 944; + this.state = 946; this.match(CParser.RightParen); - this.state = 948; + this.state = 950; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,95,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 945; + this.state = 947; this.gccDeclaratorExtension(); } - this.state = 950; + this.state = 952; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,95,this._ctx); } @@ -7444,7 +7448,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } this._ctx.stop = this._input.LT(-1); - this.state = 996; + this.state = 998; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,103,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7453,121 +7457,121 @@ CParser.prototype.directAbstractDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 994; + this.state = 996; var la_ = this._interp.adaptivePredict(this._input,102,this._ctx); switch(la_) { case 1: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 953; + this.state = 955; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 954; - this.match(CParser.LeftBracket); this.state = 956; + this.match(CParser.LeftBracket); + this.state = 958; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 955; + this.state = 957; this.typeQualifierList(0); } - this.state = 959; + this.state = 961; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 958; + this.state = 960; this.assignmentExpression(); } - this.state = 961; + this.state = 963; this.match(CParser.RightBracket); break; case 2: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 962; + this.state = 964; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 963; + this.state = 965; this.match(CParser.LeftBracket); - this.state = 964; - this.match(CParser.Static); this.state = 966; + this.match(CParser.Static); + this.state = 968; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 965; + this.state = 967; this.typeQualifierList(0); } - this.state = 968; + this.state = 970; this.assignmentExpression(); - this.state = 969; + this.state = 971; this.match(CParser.RightBracket); break; case 3: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 971; + this.state = 973; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 972; + this.state = 974; this.match(CParser.LeftBracket); - this.state = 973; + this.state = 975; this.typeQualifierList(0); - this.state = 974; + this.state = 976; this.match(CParser.Static); - this.state = 975; + this.state = 977; this.assignmentExpression(); - this.state = 976; + this.state = 978; this.match(CParser.RightBracket); break; case 4: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 978; + this.state = 980; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 979; + this.state = 981; this.match(CParser.LeftBracket); - this.state = 980; + this.state = 982; this.match(CParser.Star); - this.state = 981; + this.state = 983; this.match(CParser.RightBracket); break; case 5: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 982; + this.state = 984; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 983; - this.match(CParser.LeftParen); this.state = 985; + this.match(CParser.LeftParen); + this.state = 987; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 984; + this.state = 986; this.parameterTypeList(); } - this.state = 987; + this.state = 989; this.match(CParser.RightParen); - this.state = 991; + this.state = 993; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,101,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 988; + this.state = 990; this.gccDeclaratorExtension(); } - this.state = 993; + this.state = 995; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,101,this._ctx); } @@ -7576,7 +7580,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } } - this.state = 998; + this.state = 1000; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,103,this._ctx); } @@ -7638,7 +7642,7 @@ CParser.prototype.typedefName = function() { this.enterRule(localctx, 128, CParser.RULE_typedefName); try { this.enterOuterAlt(localctx, 1); - this.state = 999; + this.state = 1001; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -7700,34 +7704,34 @@ CParser.prototype.initializer = function() { var localctx = new InitializerContext(this, this._ctx, this.state); this.enterRule(localctx, 130, CParser.RULE_initializer); try { - this.state = 1011; + this.state = 1013; var la_ = this._interp.adaptivePredict(this._input,104,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1001; + this.state = 1003; this.assignmentExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1002; + this.state = 1004; this.match(CParser.LeftBrace); - this.state = 1003; + this.state = 1005; this.initializerList(0); - this.state = 1004; + this.state = 1006; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1006; + this.state = 1008; this.match(CParser.LeftBrace); - this.state = 1007; + this.state = 1009; this.initializerList(0); - this.state = 1008; + this.state = 1010; this.match(CParser.Comma); - this.state = 1009; + this.state = 1011; this.match(CParser.RightBrace); break; @@ -7801,17 +7805,17 @@ CParser.prototype.initializerList = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1015; + this.state = 1017; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1014; + this.state = 1016; this.designation(); } - this.state = 1017; + this.state = 1019; this.initializer(); this._ctx.stop = this._input.LT(-1); - this.state = 1027; + this.state = 1029; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,107,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7822,23 +7826,23 @@ CParser.prototype.initializerList = function(_p) { _prevctx = localctx; localctx = new InitializerListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initializerList); - this.state = 1019; + this.state = 1021; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1020; - this.match(CParser.Comma); this.state = 1022; + this.match(CParser.Comma); + this.state = 1024; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1021; + this.state = 1023; this.designation(); } - this.state = 1024; + this.state = 1026; this.initializer(); } - this.state = 1029; + this.state = 1031; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,107,this._ctx); } @@ -7900,9 +7904,9 @@ CParser.prototype.designation = function() { this.enterRule(localctx, 134, CParser.RULE_designation); try { this.enterOuterAlt(localctx, 1); - this.state = 1030; + this.state = 1032; this.designatorList(0); - this.state = 1031; + this.state = 1033; this.match(CParser.Assign); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -7968,10 +7972,10 @@ CParser.prototype.designatorList = function(_p) { this.enterRecursionRule(localctx, 136, CParser.RULE_designatorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1034; + this.state = 1036; this.designator(); this._ctx.stop = this._input.LT(-1); - this.state = 1040; + this.state = 1042; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,108,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7982,14 +7986,14 @@ CParser.prototype.designatorList = function(_p) { _prevctx = localctx; localctx = new DesignatorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_designatorList); - this.state = 1036; + this.state = 1038; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1037; + this.state = 1039; this.designator(); } - this.state = 1042; + this.state = 1044; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,108,this._ctx); } @@ -8054,22 +8058,22 @@ CParser.prototype.designator = function() { var localctx = new DesignatorContext(this, this._ctx, this.state); this.enterRule(localctx, 138, CParser.RULE_designator); try { - this.state = 1049; + this.state = 1051; switch(this._input.LA(1)) { case CParser.LeftBracket: this.enterOuterAlt(localctx, 1); - this.state = 1043; + this.state = 1045; this.match(CParser.LeftBracket); - this.state = 1044; + this.state = 1046; this.constantExpression(); - this.state = 1045; + this.state = 1047; this.match(CParser.RightBracket); break; case CParser.Dot: this.enterOuterAlt(localctx, 2); - this.state = 1047; + this.state = 1049; this.match(CParser.Dot); - this.state = 1048; + this.state = 1050; this.match(CParser.Identifier); break; default: @@ -8145,27 +8149,27 @@ CParser.prototype.staticAssertDeclaration = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1051; + this.state = 1053; this.match(CParser.StaticAssert); - this.state = 1052; + this.state = 1054; this.match(CParser.LeftParen); - this.state = 1053; + this.state = 1055; this.constantExpression(); - this.state = 1054; + this.state = 1056; this.match(CParser.Comma); - this.state = 1056; + this.state = 1058; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 1055; + this.state = 1057; this.match(CParser.StringLiteral); - this.state = 1058; + this.state = 1060; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 1060; + this.state = 1062; this.match(CParser.RightParen); - this.state = 1061; + this.state = 1063; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8255,48 +8259,48 @@ CParser.prototype.statement = function() { this.enterRule(localctx, 142, CParser.RULE_statement); var _la = 0; // Token type try { - this.state = 1100; + this.state = 1102; var la_ = this._interp.adaptivePredict(this._input,116,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1063; + this.state = 1065; this.labeledStatement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1064; + this.state = 1066; this.compoundStatement(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1065; + this.state = 1067; this.expressionStatement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1066; + this.state = 1068; this.selectionStatement(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1067; + this.state = 1069; this.iterationStatement(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 1068; + this.state = 1070; this.jumpStatement(); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 1069; + this.state = 1071; _la = this._input.LA(1); if(!(_la===CParser.T__10 || _la===CParser.T__12)) { this._errHandler.recoverInline(this); @@ -8304,7 +8308,7 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1070; + this.state = 1072; _la = this._input.LA(1); if(!(_la===CParser.T__13 || _la===CParser.Volatile)) { this._errHandler.recoverInline(this); @@ -8312,59 +8316,59 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1071; + this.state = 1073; this.match(CParser.LeftParen); - this.state = 1080; + this.state = 1082; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1072; + this.state = 1074; this.logicalOrExpression(0); - this.state = 1077; + this.state = 1079; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1073; + this.state = 1075; this.match(CParser.Comma); - this.state = 1074; + this.state = 1076; this.logicalOrExpression(0); - this.state = 1079; + this.state = 1081; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1095; + this.state = 1097; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Colon) { - this.state = 1082; + this.state = 1084; this.match(CParser.Colon); - this.state = 1091; + this.state = 1093; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1083; + this.state = 1085; this.logicalOrExpression(0); - this.state = 1088; + this.state = 1090; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1084; + this.state = 1086; this.match(CParser.Comma); - this.state = 1085; + this.state = 1087; this.logicalOrExpression(0); - this.state = 1090; + this.state = 1092; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1097; + this.state = 1099; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 1098; + this.state = 1100; this.match(CParser.RightParen); - this.state = 1099; + this.state = 1101; this.match(CParser.Semi); break; @@ -8433,35 +8437,35 @@ CParser.prototype.labeledStatement = function() { var localctx = new LabeledStatementContext(this, this._ctx, this.state); this.enterRule(localctx, 144, CParser.RULE_labeledStatement); try { - this.state = 1113; + this.state = 1115; switch(this._input.LA(1)) { case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 1102; + this.state = 1104; this.match(CParser.Identifier); - this.state = 1103; + this.state = 1105; this.match(CParser.Colon); - this.state = 1104; + this.state = 1106; this.statement(); break; case CParser.Case: this.enterOuterAlt(localctx, 2); - this.state = 1105; + this.state = 1107; this.match(CParser.Case); - this.state = 1106; + this.state = 1108; this.constantExpression(); - this.state = 1107; + this.state = 1109; this.match(CParser.Colon); - this.state = 1108; + this.state = 1110; this.statement(); break; case CParser.Default: this.enterOuterAlt(localctx, 3); - this.state = 1110; + this.state = 1112; this.match(CParser.Default); - this.state = 1111; + this.state = 1113; this.match(CParser.Colon); - this.state = 1112; + this.state = 1114; this.statement(); break; default: @@ -8525,16 +8529,16 @@ CParser.prototype.compoundStatement = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1115; - this.match(CParser.LeftBrace); this.state = 1117; + this.match(CParser.LeftBrace); + this.state = 1119; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)) | (1 << (CParser.Semi - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1116; + this.state = 1118; this.blockItemList(0); } - this.state = 1119; + this.state = 1121; this.match(CParser.RightBrace); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8600,10 +8604,10 @@ CParser.prototype.blockItemList = function(_p) { this.enterRecursionRule(localctx, 148, CParser.RULE_blockItemList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1122; + this.state = 1124; this.blockItem(); this._ctx.stop = this._input.LT(-1); - this.state = 1128; + this.state = 1130; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,119,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -8614,14 +8618,14 @@ CParser.prototype.blockItemList = function(_p) { _prevctx = localctx; localctx = new BlockItemListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_blockItemList); - this.state = 1124; + this.state = 1126; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1125; + this.state = 1127; this.blockItem(); } - this.state = 1130; + this.state = 1132; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,119,this._ctx); } @@ -8656,6 +8660,10 @@ function BlockItemContext(parser, parent, invokingState) { BlockItemContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); BlockItemContext.prototype.constructor = BlockItemContext; +BlockItemContext.prototype.specialMethodCall = function() { + return this.getTypedRuleContext(SpecialMethodCallContext,0); +}; + BlockItemContext.prototype.declaration = function() { return this.getTypedRuleContext(DeclarationContext,0); }; @@ -8686,18 +8694,24 @@ CParser.prototype.blockItem = function() { var localctx = new BlockItemContext(this, this._ctx, this.state); this.enterRule(localctx, 150, CParser.RULE_blockItem); try { - this.state = 1133; + this.state = 1136; var la_ = this._interp.adaptivePredict(this._input,120,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1131; - this.declaration(); + this.state = 1133; + this.specialMethodCall(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1132; + this.state = 1134; + this.declaration(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1135; this.statement(); break; @@ -8716,6 +8730,77 @@ CParser.prototype.blockItem = function() { return localctx; }; +function SpecialMethodCallContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_specialMethodCall; + return this; +} + +SpecialMethodCallContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +SpecialMethodCallContext.prototype.constructor = SpecialMethodCallContext; + +SpecialMethodCallContext.prototype.postfixExpression = function() { + return this.getTypedRuleContext(PostfixExpressionContext,0); +}; + +SpecialMethodCallContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +SpecialMethodCallContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterSpecialMethodCall(this); + } +}; + +SpecialMethodCallContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitSpecialMethodCall(this); + } +}; + + + + +CParser.SpecialMethodCallContext = SpecialMethodCallContext; + +CParser.prototype.specialMethodCall = function() { + + var localctx = new SpecialMethodCallContext(this, this._ctx, this.state); + this.enterRule(localctx, 152, CParser.RULE_specialMethodCall); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1138; + this.postfixExpression(0); + this.state = 1139; + this.match(CParser.LeftParen); + this.state = 1140; + this.assignmentExpression(); + this.state = 1141; + this.match(CParser.RightParen); + this.state = 1142; + this.match(CParser.Semi); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + function ExpressionStatementContext(parser, parent, invokingState) { if(parent===undefined) { parent = null; @@ -8756,18 +8841,18 @@ CParser.ExpressionStatementContext = ExpressionStatementContext; CParser.prototype.expressionStatement = function() { var localctx = new ExpressionStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 152, CParser.RULE_expressionStatement); + this.enterRule(localctx, 154, CParser.RULE_expressionStatement); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1136; + this.state = 1145; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1135; + this.state = 1144; this.expression(0); } - this.state = 1138; + this.state = 1147; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8834,43 +8919,43 @@ CParser.SelectionStatementContext = SelectionStatementContext; CParser.prototype.selectionStatement = function() { var localctx = new SelectionStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 154, CParser.RULE_selectionStatement); + this.enterRule(localctx, 156, CParser.RULE_selectionStatement); try { - this.state = 1155; + this.state = 1164; switch(this._input.LA(1)) { case CParser.If: this.enterOuterAlt(localctx, 1); - this.state = 1140; + this.state = 1149; this.match(CParser.If); - this.state = 1141; + this.state = 1150; this.match(CParser.LeftParen); - this.state = 1142; + this.state = 1151; this.expression(0); - this.state = 1143; + this.state = 1152; this.match(CParser.RightParen); - this.state = 1144; + this.state = 1153; this.statement(); - this.state = 1147; + this.state = 1156; var la_ = this._interp.adaptivePredict(this._input,122,this._ctx); if(la_===1) { - this.state = 1145; + this.state = 1154; this.match(CParser.Else); - this.state = 1146; + this.state = 1155; this.statement(); } break; case CParser.Switch: this.enterOuterAlt(localctx, 2); - this.state = 1149; + this.state = 1158; this.match(CParser.Switch); - this.state = 1150; + this.state = 1159; this.match(CParser.LeftParen); - this.state = 1151; + this.state = 1160; this.expression(0); - this.state = 1152; + this.state = 1161; this.match(CParser.RightParen); - this.state = 1153; + this.state = 1162; this.statement(); break; default: @@ -8945,108 +9030,108 @@ CParser.IterationStatementContext = IterationStatementContext; CParser.prototype.iterationStatement = function() { var localctx = new IterationStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 156, CParser.RULE_iterationStatement); + this.enterRule(localctx, 158, CParser.RULE_iterationStatement); var _la = 0; // Token type try { - this.state = 1199; + this.state = 1208; var la_ = this._interp.adaptivePredict(this._input,129,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1157; + this.state = 1166; this.match(CParser.While); - this.state = 1158; + this.state = 1167; this.match(CParser.LeftParen); - this.state = 1159; + this.state = 1168; this.expression(0); - this.state = 1160; + this.state = 1169; this.match(CParser.RightParen); - this.state = 1161; + this.state = 1170; this.statement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1163; + this.state = 1172; this.match(CParser.Do); - this.state = 1164; + this.state = 1173; this.statement(); - this.state = 1165; + this.state = 1174; this.match(CParser.While); - this.state = 1166; + this.state = 1175; this.match(CParser.LeftParen); - this.state = 1167; + this.state = 1176; this.expression(0); - this.state = 1168; + this.state = 1177; this.match(CParser.RightParen); - this.state = 1169; + this.state = 1178; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1171; + this.state = 1180; this.match(CParser.For); - this.state = 1172; + this.state = 1181; this.match(CParser.LeftParen); - this.state = 1174; + this.state = 1183; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1173; + this.state = 1182; this.expression(0); } - this.state = 1176; + this.state = 1185; this.match(CParser.Semi); - this.state = 1178; + this.state = 1187; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1177; + this.state = 1186; this.expression(0); } - this.state = 1180; + this.state = 1189; this.match(CParser.Semi); - this.state = 1182; + this.state = 1191; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1181; + this.state = 1190; this.expression(0); } - this.state = 1184; + this.state = 1193; this.match(CParser.RightParen); - this.state = 1185; + this.state = 1194; this.statement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1186; + this.state = 1195; this.match(CParser.For); - this.state = 1187; + this.state = 1196; this.match(CParser.LeftParen); - this.state = 1188; + this.state = 1197; this.declaration(); - this.state = 1190; + this.state = 1199; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1189; + this.state = 1198; this.expression(0); } - this.state = 1192; + this.state = 1201; this.match(CParser.Semi); - this.state = 1194; + this.state = 1203; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1193; + this.state = 1202; this.expression(0); } - this.state = 1196; + this.state = 1205; this.match(CParser.RightParen); - this.state = 1197; + this.state = 1206; this.statement(); break; @@ -9113,60 +9198,60 @@ CParser.JumpStatementContext = JumpStatementContext; CParser.prototype.jumpStatement = function() { var localctx = new JumpStatementContext(this, this._ctx, this.state); - this.enterRule(localctx, 158, CParser.RULE_jumpStatement); + this.enterRule(localctx, 160, CParser.RULE_jumpStatement); var _la = 0; // Token type try { - this.state = 1217; + this.state = 1226; var la_ = this._interp.adaptivePredict(this._input,131,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1201; + this.state = 1210; this.match(CParser.Goto); - this.state = 1202; + this.state = 1211; this.match(CParser.Identifier); - this.state = 1203; + this.state = 1212; this.match(CParser.Semi); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1204; + this.state = 1213; this.match(CParser.Continue); - this.state = 1205; + this.state = 1214; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1206; + this.state = 1215; this.match(CParser.Break); - this.state = 1207; + this.state = 1216; this.match(CParser.Semi); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1208; + this.state = 1217; this.match(CParser.Return); - this.state = 1210; + this.state = 1219; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1209; + this.state = 1218; this.expression(0); } - this.state = 1212; + this.state = 1221; this.match(CParser.Semi); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1213; + this.state = 1222; this.match(CParser.Goto); - this.state = 1214; + this.state = 1223; this.unaryExpression(); - this.state = 1215; + this.state = 1224; this.match(CParser.Semi); break; @@ -9229,22 +9314,22 @@ CParser.CompilationUnitContext = CompilationUnitContext; CParser.prototype.compilationUnit = function() { var localctx = new CompilationUnitContext(this, this._ctx, this.state); - this.enterRule(localctx, 160, CParser.RULE_compilationUnit); + this.enterRule(localctx, 162, CParser.RULE_compilationUnit); var _la = 0; // Token type try { - this.state = 1224; + this.state = 1233; var la_ = this._interp.adaptivePredict(this._input,133,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1220; + this.state = 1229; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) { - this.state = 1219; + this.state = 1228; this.translationUnit(0); } - this.state = 1222; + this.state = 1231; this.match(CParser.EOF); break; @@ -9314,14 +9399,14 @@ CParser.prototype.translationUnit = function(_p) { var _parentState = this.state; var localctx = new TranslationUnitContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 162; - this.enterRecursionRule(localctx, 162, CParser.RULE_translationUnit, _p); + var _startState = 164; + this.enterRecursionRule(localctx, 164, CParser.RULE_translationUnit, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1227; + this.state = 1236; this.externalDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1233; + this.state = 1242; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,134,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -9332,14 +9417,14 @@ CParser.prototype.translationUnit = function(_p) { _prevctx = localctx; localctx = new TranslationUnitContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_translationUnit); - this.state = 1229; + this.state = 1238; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1230; + this.state = 1239; this.externalDeclaration(); } - this.state = 1235; + this.state = 1244; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,134,this._ctx); } @@ -9402,26 +9487,26 @@ CParser.ExternalDeclarationContext = ExternalDeclarationContext; CParser.prototype.externalDeclaration = function() { var localctx = new ExternalDeclarationContext(this, this._ctx, this.state); - this.enterRule(localctx, 164, CParser.RULE_externalDeclaration); + this.enterRule(localctx, 166, CParser.RULE_externalDeclaration); try { - this.state = 1239; + this.state = 1248; var la_ = this._interp.adaptivePredict(this._input,135,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1236; + this.state = 1245; this.functionDefinition(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1237; + this.state = 1246; this.declaration(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1238; + this.state = 1247; this.match(CParser.Semi); break; @@ -9492,27 +9577,27 @@ CParser.FunctionDefinitionContext = FunctionDefinitionContext; CParser.prototype.functionDefinition = function() { var localctx = new FunctionDefinitionContext(this, this._ctx, this.state); - this.enterRule(localctx, 166, CParser.RULE_functionDefinition); + this.enterRule(localctx, 168, CParser.RULE_functionDefinition); var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1242; + this.state = 1251; var la_ = this._interp.adaptivePredict(this._input,136,this._ctx); if(la_===1) { - this.state = 1241; + this.state = 1250; this.declarationSpecifiers(); } - this.state = 1244; + this.state = 1253; this.declarator(); - this.state = 1246; + this.state = 1255; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 1245; + this.state = 1254; this.declarationList(0); } - this.state = 1248; + this.state = 1257; this.compoundStatement(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -9574,14 +9659,14 @@ CParser.prototype.declarationList = function(_p) { var _parentState = this.state; var localctx = new DeclarationListContext(this, this._ctx, _parentState); var _prevctx = localctx; - var _startState = 168; - this.enterRecursionRule(localctx, 168, CParser.RULE_declarationList, _p); + var _startState = 170; + this.enterRecursionRule(localctx, 170, CParser.RULE_declarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1251; + this.state = 1260; this.declaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1257; + this.state = 1266; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,138,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -9592,14 +9677,14 @@ CParser.prototype.declarationList = function(_p) { _prevctx = localctx; localctx = new DeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_declarationList); - this.state = 1253; + this.state = 1262; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1254; + this.state = 1263; this.declaration(); } - this.state = 1259; + this.state = 1268; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,138,this._ctx); } @@ -9673,9 +9758,9 @@ CParser.prototype.sempred = function(localctx, ruleIndex, predIndex) { return this.designatorList_sempred(localctx, predIndex); case 74: return this.blockItemList_sempred(localctx, predIndex); - case 81: + case 82: return this.translationUnit_sempred(localctx, predIndex); - case 84: + case 85: return this.declarationList_sempred(localctx, predIndex); default: throw "No predicate with index:" + ruleIndex; diff --git a/src/controller.coffee b/src/controller.coffee index 62421dbc..74c21281 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2650,8 +2650,10 @@ Editor::getDropdownList = (socket) -> result = socket.dropdown if result.options result = result.options - return result.map (x) -> - if 'string' is typeof x then { text: x, display: x } else x + newresult = {} + for key, val of result + newresult = if 'string' is typeof val then { text: val, display: val } else val + return newresult Editor::showDropdown = (socket = @getCursor(), inPalette = false) -> @dropdownVisible = true diff --git a/src/helper.coffee b/src/helper.coffee index ab6986c1..0f8949cc 100644 --- a/src/helper.coffee +++ b/src/helper.coffee @@ -154,11 +154,16 @@ exports.string = (arr) -> return last exports.deepCopy = deepCopy = (a) -> - if a instanceof Object + if a instanceof Array + return a.map (el) -> deepCopy el + else if a instanceof Object newObject = {} for key, val of a - newObject[key] = deepCopy val + if val instanceof Function + newObject[key] = val + else + newObject[key] = deepCopy val return newObject diff --git a/src/languages/c.coffee b/src/languages/c.coffee index e931c0e9..b7c9cd61 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -25,6 +25,7 @@ SKIPS = ['blockItemList', 'parameterTypeList', 'parameterList', 'argumentExpressionList', + 'initializerList', 'initDeclaratorList'] PARENS = ['expressionStatement', 'primaryExpression', 'structDeclaration'] SOCKET_TOKENS = ['Identifier', 'StringLiteral', 'SharedIncludeLiteral', 'Constant'] @@ -44,6 +45,9 @@ COLORS_FORWARD = { 'parameterDeclaration': 'command' 'unaryExpression': 'value' 'typeName': 'value' + 'initializer': 'value' + 'castExpression': 'value' + 'postfixExpression': 'value' } COLORS_BACKWARD = { 'iterationStatement': 'control' @@ -68,6 +72,9 @@ SHAPES_FORWARD = { 'parameterDeclaration': 'block-only' 'unaryExpression': 'value-only' 'typeName': 'value-only' + 'initializer': 'value-only' + 'castExpression': 'value-only' + 'postfixExpression': 'value-only' } SHAPES_BACKWARD = { 'equalityExpression': 'value-only' @@ -103,7 +110,7 @@ config.SHOULD_SOCKET = (opts, node) -> # If it is a function call, and we are the first child if node.parent.type is 'primaryExpression' and node.parent.parent.type is 'postfixExpression' and - node.parent.parent.parent.type is 'postfixExpression' and + node.parent.parent.parent.type in ['postfixExpression', 'specialMethodCall'] and node.parent.parent.parent.children.length in [3, 4] and node.parent.parent.parent.children[1].type is 'LeftParen' and (node.parent.parent.parent.children[2].type is 'RightParen' or node.parent.parent.parent.children[3]?.type is 'RightParen') and @@ -113,8 +120,8 @@ config.SHOULD_SOCKET = (opts, node) -> return true config.COLOR_CALLBACK = (opts, node) -> - if node.type is 'postfixExpression' and - node.children.length in [3, 4] and + if node.type in ['postfixExpression', 'specialMethodCall'] and + node.children.length in [4, 5] and node.children[1].type is 'LeftParen' and (node.children[2].type is 'RightParen' or node.children[3]?.type is 'RightParen') and node.children[0].children[0].type is 'primaryExpression' and @@ -124,8 +131,8 @@ config.COLOR_CALLBACK = (opts, node) -> return null config.SHAPE_CALLBACK = (opts, node) -> - if node.type is 'postfixExpression' and - node.children.length in [3, 4] and + if node.type in ['postfixExpression', 'specialMethodCall'] and + node.children.length in [4, 5] and node.children[1].type is 'LeftParen' and (node.children[2].type is 'RightParen' or node.children[3]?.type is 'RightParen') and node.children[0].children[0].type is 'primaryExpression' and diff --git a/src/languages/coffee.coffee b/src/languages/coffee.coffee index 1e911f13..bf3b4231 100644 --- a/src/languages/coffee.coffee +++ b/src/languages/coffee.coffee @@ -217,7 +217,7 @@ exports.CoffeeScriptParser = class CoffeeScriptParser extends parser.Parser isComment: (str) -> str.match(/^\s*#.*$/)? - indentAndCommentMarker: (str) -> + parseComment: (str) -> { sockets: [[str.match(/^\s*#/)?[0].length, str.length]] } diff --git a/src/parser.coffee b/src/parser.coffee index 9ae6fb1e..a15ff7c1 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -219,8 +219,6 @@ exports.Parser = class Parser lastPosition = 0 - console.log sockets - for socketPosition in sockets socket = new model.Socket '', 0, true socket.setParent block diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 7c9b5a4d..c39c0c04 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -71,7 +71,7 @@ exports.createTreewalkParser = (parse, config, root) -> for el, i in rules if el of config.COLORS_FORWARD return config.COLORS_FORWARD[el] - return 'violet' + return 'purple' getShape: (node, rules) -> shape = config.SHAPE_CALLBACK(@opts, node) From e55b3f4add34dab852420f032db4bb70bb42586b Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 17 Jun 2016 12:00:19 -0400 Subject: [PATCH 125/268] New rule pipeline and fix lone indents --- src/languages/c.coffee | 185 +++++++++++++++++++++++------------------ src/treewalk.coffee | 73 ++++++++++------ 2 files changed, 148 insertions(+), 110 deletions(-) diff --git a/src/languages/c.coffee b/src/languages/c.coffee index b7c9cd61..64cc54bd 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -6,89 +6,108 @@ parser = require '../parser.coffee' antlrHelper = require '../antlr.coffee' -INDENTS = { - 'compoundStatement': 'blockItem', - 'structDeclarationsBlock': 'structDeclaration' -} -SKIPS = ['blockItemList', - 'macroParamList', - 'compilationUnit', - 'translationUnit', - 'declarationSpecifiers', - 'declarationSpecifier', - 'typeSpecifier', - 'structOrUnionSpecifier', - 'structDeclarationList', - 'declarator', - 'directDeclarator', - 'rootDeclarator', - 'parameterTypeList', - 'parameterList', - 'argumentExpressionList', - 'initializerList', - 'initDeclaratorList'] -PARENS = ['expressionStatement', 'primaryExpression', 'structDeclaration'] -SOCKET_TOKENS = ['Identifier', 'StringLiteral', 'SharedIncludeLiteral', 'Constant'] -COLORS_FORWARD = { - 'externalDeclaration': 'control' - 'structDeclaration': 'command' - 'declarationSpecifier': 'control' - 'statement': 'command' - 'selectionStatement': 'control' - 'iterationStatement': 'control' - 'functionDefinition': 'control' - 'expressionStatement': 'command' - 'expression': 'value' - 'additiveExpression': 'value' - 'multiplicativeExpression': 'value' - 'declaration': 'command' - 'parameterDeclaration': 'command' - 'unaryExpression': 'value' - 'typeName': 'value' - 'initializer': 'value' - 'castExpression': 'value' - 'postfixExpression': 'value' -} -COLORS_BACKWARD = { - 'iterationStatement': 'control' - 'selectionStatement': 'control' - 'assignmentExpression': 'command' - 'relationalExpression': 'value' - 'initDeclarator': 'command' -} -SHAPES_FORWARD = { - 'externalDeclaration': 'block-only' - 'structDeclaration': 'block-only' - 'declarationSpecifier': 'block-only' - 'statement': 'block-only' - 'selectionStatement': 'block-only' - 'iterationStatement': 'block-only' - 'functionDefinition': 'block-only' - 'expressionStatement': 'value-only' - 'expression': 'value-only' - 'additiveExpression': 'value-only' - 'multiplicativeExpression': 'value-only' - 'declaration': 'block-only' - 'parameterDeclaration': 'block-only' - 'unaryExpression': 'value-only' - 'typeName': 'value-only' - 'initializer': 'value-only' - 'castExpression': 'value-only' - 'postfixExpression': 'value-only' -} -SHAPES_BACKWARD = { - 'equalityExpression': 'value-only' - 'logicalAndExpression': 'value-only' - 'logicalOrExpression': 'value-only' - 'iterationStatement': 'block-only' - 'selectionStatement': 'block-only' - 'assignmentExpression': 'block-only' - 'relationalExpression': 'value-only' - 'initDeclarator': 'block-only' +RULES = { + # Indents + 'compoundStatement': { + 'type': 'indent', + 'indentContext': 'blockItem', + }, + 'structDeclarationsBlock': { + 'type': 'indent', + 'indentContext': 'structDeclaration' + }, + + # Parens + 'expressionStatement': 'parens', + 'primaryExpression': 'parens', + 'structDeclaration': 'parens', + + # Skips + 'blockItemList': 'skip', + 'macroParamList': 'skip', + 'compilationUnit': 'skip', + 'translationUnit': 'skip', + 'declarationSpecifiers': 'skip', + 'declarationSpecifier': 'skip', + 'typeSpecifier': 'skip', + 'structOrUnionSpecifier': 'skip', + 'structDeclarationList': 'skip', + 'declarator': 'skip', + 'directDeclarator': 'skip', + 'rootDeclarator': 'skip', + 'parameterTypeList': 'skip', + 'parameterList': 'skip', + 'argumentExpressionList': 'skip', + 'initializerList': 'skip', + 'initDeclaratorList': 'skip', + + # Sockets + 'Identifier': 'socket', + 'StringLiteral': 'socket', + 'SharedIncludeLiteral': 'socket', + 'Constant': 'socket' } +COLOR_RULES = [ + ['declaration', 'control'], + ['specialMethodCall', 'command'], + ['postfixExpression', 'command'], + ['iterationStatement', 'control'], + ['selectionStatement', 'control'], + ['assignmentExpression', 'command'], + ['relationalExpression', 'value'], + ['initDeclarator', 'command'], + ['blockItemList', 'control'], + ['compoundStatement', 'control'], + ['externalDeclaration', 'control'], + ['structDeclaration', 'command'], + ['declarationSpecifier', 'control'], + ['statement', 'command'], + ['selectionStatement', 'control'], + ['iterationStatement', 'control'], + ['functionDefinition', 'control'], + ['expressionStatement', 'command'], + ['expression', 'value'], + ['additiveExpression', 'value'], + ['multiplicativeExpression', 'value'], + ['parameterDeclaration', 'command'], + ['unaryExpression', 'value'], + ['typeName', 'value'], + ['initializer', 'value'], + ['castExpression', 'value'], +] + +SHAPE_RULES = [ + ['postfixExpression', 'block-only'], + ['equalityExpression', 'value-only'], + ['logicalAndExpression', 'value-only'], + ['logicalOrExpression', 'value-only'], + ['iterationStatement', 'block-only'], + ['selectionStatement', 'block-only'], + ['assignmentExpression', 'block-only'], + ['relationalExpression', 'value-only'], + ['initDeclarator', 'block-only'], + ['externalDeclaration', 'block-only'], + ['structDeclaration', 'block-only'], + ['declarationSpecifier', 'block-only'], + ['statement', 'block-only'], + ['selectionStatement', 'block-only'], + ['iterationStatement', 'block-only'], + ['functionDefinition', 'block-only'], + ['expressionStatement', 'value-only'], + ['expression', 'value-only'], + ['additiveExpression', 'value-only'], + ['multiplicativeExpression', 'value-only'], + ['declaration', 'block-only'], + ['parameterDeclaration', 'block-only'], + ['unaryExpression', 'value-only'], + ['typeName', 'value-only'], + ['initializer', 'value-only'], + ['castExpression', 'value-only'] +] + config = { - INDENTS, SKIPS, PARENS, SOCKET_TOKENS, COLORS_FORWARD, COLORS_BACKWARD, SHAPES_FORWARD, SHAPES_BACKWARD + RULES, COLOR_RULES, SHAPES_FORWARD, SHAPES_BACKWARD } ADD_PARENS = (leading, trailing, node, context) -> @@ -121,7 +140,7 @@ config.SHOULD_SOCKET = (opts, node) -> config.COLOR_CALLBACK = (opts, node) -> if node.type in ['postfixExpression', 'specialMethodCall'] and - node.children.length in [4, 5] and + node.children.length in [3, 4, 5] and node.children[1].type is 'LeftParen' and (node.children[2].type is 'RightParen' or node.children[3]?.type is 'RightParen') and node.children[0].children[0].type is 'primaryExpression' and @@ -157,8 +176,8 @@ config.parseComment = (text) -> ranges = [] color = 'purple' - # Try #include or #ifdef directive - unary = text.match(/^(#\s*(?:(?:include)|(?:ifdef)|(?:ifndef)|(?:undef))\s*)(.*)$/) + # Try any of the unary directives: #include, #if, #ifdef, #ifndef, #undef, #pragma + unary = text.match(/^(#\s*(?:(?:include)|(?:ifdef)|(?:if)|(?:ifndef)|(?:undef)|(?:pragma))\s*)(.*)$/) if unary? ranges = [ [unary[1].length, unary[1].length + unary[2].length] diff --git a/src/treewalk.coffee b/src/treewalk.coffee index c39c0c04..d5a270b2 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -42,18 +42,20 @@ exports.createTreewalkParser = (parse, config, root) -> max = val return best + applyRule: (rule, node) -> + if 'string' is typeof rule + return {type: rule} + else if rule instanceof Function + return rule(node) + else + return rule - det: (rule) -> - if rule of config.INDENTS then return 'indent' - else if rule in config.SKIPS then return 'skip' - else if rule in config.PARENS then return 'parens' - else return 'block' + det: (node) -> + if node.type of config.RULES + return @applyRule(config.RULES[node.type], node).type + return 'block' - detNode: (node) -> if node.blockified then 'block' else @det(node.type) - detToken: (node) -> - if node.type? - if node.type in config.SOCKET_TOKENS then 'socket' else 'none' - else 'none' + detNode: (node) -> if node.blockified then 'block' else @det(node) getDropType: (context) -> ({ 'block': 'mostly-value' @@ -65,25 +67,31 @@ exports.createTreewalkParser = (parse, config, root) -> color = config.COLOR_CALLBACK(@opts, node) if color? return color - for el, i in rules by -1 - if el of config.COLORS_BACKWARD - return config.COLORS_BACKWARD[el] - for el, i in rules - if el of config.COLORS_FORWARD - return config.COLORS_FORWARD[el] - return 'purple' + + # Apply the static rules set given in config + rulesSet = {} + rules.forEach (el) -> rulesSet[el] = true + + for colorRule in config.COLOR_RULES + if colorRule[0] of rulesSet + return colorRule[1] + + return 'comment' getShape: (node, rules) -> shape = config.SHAPE_CALLBACK(@opts, node) if shape? return shape - for el, i in rules by -1 - if el of config.SHAPES_BACKWARD - return config.SHAPES_BACKWARD[el] - for el, i in rules - if el of config.SHAPES_FORWARD - return config.SHAPES_FORWARD[el] - return 'mostly-block' + + # Apply the static rules set given in config + rulesSet = {} + rules.forEach (el) -> rulesSet[el] = true + + for shapeRule in config.SHAPE_RULES + if shapeRule[0] of rulesSet + return shapeRule[1] + + return 'comment' mark: (node, prefix, depth, pass, rules, context, wrap) -> unless pass @@ -156,7 +164,18 @@ exports.createTreewalkParser = (parse, config, root) -> classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) parseContext: (if wrap? then wrap.type else rules[0]) - when 'indent' then if @det(context) is 'block' + when 'indent' + # A lone indent needs to be wrapped in a block. + if @det(context) isnt 'block' + @addBlock + bounds: node.bounds + depth: depth + color: @getColor node, rules + classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) + parseContext: (if wrap? then wrap.type else rules[0]) + + depth += 1 + start = origin = node.children[0].bounds.start for child, i in node.children if child.children.length > 0 @@ -184,12 +203,12 @@ exports.createTreewalkParser = (parse, config, root) -> depth: depth prefix: prefix[oldPrefix.length...prefix.length] classes: rules - parseContext: config.INDENTS[node.type] + parseContext: @applyRule(config.RULES[node.type], node).indentContext for child in node.children @mark child, prefix, depth + 2, false else if context? and @detNode(context) is 'block' - if @detToken(node) is 'socket' and config.SHOULD_SOCKET(@opts, node) + if @det(node) is 'socket' and config.SHOULD_SOCKET(@opts, node) @addSocket bounds: node.bounds depth: depth From d7249126b7e74682592e5e98fb28d488cb4e20b8 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 17 Jun 2016 15:36:46 -0400 Subject: [PATCH 126/268] Make an attempt at grouping multiline comments --- Gruntfile.coffee | 9 +++ src/languages/c.coffee | 4 +- src/parser.coffee | 131 ++++++++++++++++++++++++++++++----------- src/treewalk.coffee | 16 ++--- 4 files changed, 116 insertions(+), 44 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 51805c7f..92714ca2 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -62,8 +62,17 @@ module.exports = (grunt) -> 'http://localhost:8942/' + x) mochaTest: + c: + src: ['test/src/cParserTests.coffee'] + bail: true + options: + reporter: 'list' + compilers: + 'coffee': 'coffee-script/register' + timeout: 10000 test: src: [ + 'test/src/cParserTests.coffee' 'test/src/parserTests.coffee' 'test/src/modelTests.coffee' ] diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 64cc54bd..567b4de7 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -107,14 +107,14 @@ SHAPE_RULES = [ ] config = { - RULES, COLOR_RULES, SHAPES_FORWARD, SHAPES_BACKWARD + RULES, COLOR_RULES, SHAPE_RULES } ADD_PARENS = (leading, trailing, node, context) -> leading '(' + leading() trailing trailing() + ')' -config.parenRules = { +config.PAREN_RULES = { 'primaryExpression': { 'expression': ADD_PARENS 'additiveExpression': ADD_PARENS diff --git a/src/parser.coffee b/src/parser.coffee index a15ff7c1..2dfe8808 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -18,6 +18,8 @@ _extend = (opts, defaults) -> YES = -> true +isPrefix = (a, b) -> a[...b.length] is b + exports.ParserFactory = class ParserFactory constructor: (@opts = {}) -> @@ -219,32 +221,33 @@ exports.Parser = class Parser lastPosition = 0 - for socketPosition in sockets - socket = new model.Socket '', 0, true - socket.setParent block + if sockets? + for socketPosition in sockets + socket = new model.Socket '', 0, true + socket.setParent block - socket.classes = ['__comment__'] + socket.classes = ['__comment__'] - padText = text[lastPosition...socketPosition[0]] + padText = text[lastPosition...socketPosition[0]] - if padText.length > 0 - padTextToken = new model.TextToken padText - padTextToken.setParent block + if padText.length > 0 + padTextToken = new model.TextToken padText + padTextToken.setParent block - helper.connect head, padTextToken + helper.connect head, padTextToken - head = padTextToken + head = padTextToken - textToken = new model.TextToken text[socketPosition[0]...socketPosition[1]] - textToken.setParent block + textToken = new model.TextToken text[socketPosition[0]...socketPosition[1]] + textToken.setParent block - helper.connect head, socket.start - helper.connect socket.start, textToken - helper.connect textToken, socket.end + helper.connect head, socket.start + helper.connect socket.start, textToken + helper.connect textToken, socket.end - head = socket.end + head = socket.end - lastPosition = socketPosition[1] + lastPosition = socketPosition[1] finalPadText = text[lastPosition...text.length] @@ -294,6 +297,8 @@ exports.Parser = class Parser stack = [] document = new model.Document(); head = document.start + currentlyCommented = false + for line, i in lines # If there is no markup on this line, # helper.connect simply, the text of this line to the document @@ -310,17 +315,45 @@ exports.Parser = class Parser # If we have some text here that # is floating (not surrounded by a block), # wrap it in a generic block automatically. - if line.length > 0 - if (opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent' - block = @constructHandwrittenBlock line + placedSomething = false + while line.length > 0 + if currentlyCommented + placedSomething = true + if line.indexOf(@endComment) > -1 + head = helper.connect head, + new model.TextToken line[...line.indexOf(@endComment) + @endComment.length] + line = line[line.indexOf(@endComment) + @endComment.length...] + + head = helper.connect head, stack.pop().end + currentlyCommented = false + + if not currentlyCommented and ( + (opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent' + ) and line.length > 0 + placedSomething = true + if isPrefix(line.trimLeft(), @startComment) + currentlyCommented = true + block = new model.Block 0, 'comment', helper.ANY_DROP + stack.push block + + helper.connect head, block.start + head = block.start + + else + block = @constructHandwrittenBlock line - helper.connect head, block.start - head = block.end + helper.connect head, block.start + head = block.end + + line = '' - else + else if line.length > 0 + placedSomething = true head = helper.connect head, new model.TextToken line - else if stack[stack.length - 1]?.type in ['indent', 'document', undefined] and + line = '' + + if line.length is 0 and not placedSomething and stack[stack.length - 1]?.type in ['indent', 'document', undefined] and hasSomeTextAfter(lines, i) block = new model.Block 0, @opts.emptyLineColor, helper.BLOCK_ONLY @@ -342,15 +375,19 @@ exports.Parser = class Parser # Insert a text token for all the text up until this markup # (unless there is no such text unless lastIndex >= mark.location.column or lastIndex >= line.length - if (opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent' + if (not currentlyCommented) and + (opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent' block = @constructHandwrittenBlock line[lastIndex...mark.location.column] helper.connect head, block.start head = block.end - else head = helper.connect head, new model.TextToken(line[lastIndex...mark.location.column]) + if currentlyCommented + head = helper.connect head, stack.pop().end + currentlyCommented = false + # Note, if we have inserted something, # the new indent depth and the new stack. switch mark.token.type @@ -390,17 +427,41 @@ exports.Parser = class Parser # Append the rest of the string # (after the last piece of markup) - unless lastIndex >= line.length - if stack.length is 0 or stack[stack.length - 1].type is 'indent' - block = @constructHandwrittenBlock line[lastIndex...line.length] + until lastIndex >= line.length + if currentlyCommented + if line[lastIndex...].indexOf(@endComment) > -1 + head = helper.connect head, + new model.TextToken line[lastIndex...line.indexOf(@endComment) + @endComment.length] + + lastIndex += line.indexOf(@endComment) + @endComment.length + + head = helper.connect head, stack.pop().end + currentlyCommented = false + + if not currentlyCommented and ( + (opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent' + ) and line.length > 0 + if isPrefix(line[lastIndex...].trimLeft(), @startComment) + currentlyCommented = true + block = new model.Block 0, 'comment', helper.ANY_DROP + stack.push block + + helper.connect head, block.start + head = block.start + + else + block = @constructHandwrittenBlock line[lastIndex...] + + helper.connect head, block.start + head = block.end + + lastIndex = line.length - helper.connect head, block.start - head = block.end + else if lastIndex < line.length + head = helper.connect head, new model.TextToken line[lastIndex...] - else - head = helper.connect head, new model.TextToken(line[lastIndex...line.length]) + lastIndex = line.length - # Append the needed newline token head = helper.connect head, new model.NewlineToken() # Pop off the last newline token, which is not necessary @@ -544,6 +605,8 @@ exports.wrapParser = (CustomParser) -> # maybe change the api? createParser: (text) -> parser = new CustomParser text, @opts + parser.startComment = @startComment + parser.endComment = @endComment parser.empty = @empty parser.emptyIndent = @emptyIndent return parser diff --git a/src/treewalk.coffee b/src/treewalk.coffee index d5a270b2..288228f7 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -64,7 +64,7 @@ exports.createTreewalkParser = (parse, config, root) -> })[@detNode(context)] getColor: (node, rules) -> - color = config.COLOR_CALLBACK(@opts, node) + color = config.COLOR_CALLBACK?(@opts, node) if color? return color @@ -79,7 +79,7 @@ exports.createTreewalkParser = (parse, config, root) -> return 'comment' getShape: (node, rules) -> - shape = config.SHAPE_CALLBACK(@opts, node) + shape = config.SHAPE_CALLBACK?(@opts, node) if shape? return shape @@ -185,7 +185,7 @@ exports.createTreewalkParser = (parse, config, root) -> start = child.bounds.end end = node.children[node.children.length - 1].bounds.end - for child, i in node.children by -1 + for child, i in node.children.reverse() # by -1 if child.children.length > 0 end = child.bounds.end break @@ -224,9 +224,9 @@ exports.createTreewalkParser = (parse, config, root) -> return helper.ENCOURAGE # Check to see if we could paren-wrap this - if config.parenRules? and c of config.parenRules + if config.PAREN_RULES? and c of config.PAREN_RULES for m in block.classes - if m of config.parenRules[c] + if m of config.PAREN_RULES[c] return helper.ENCOURAGE return helper.DISCOURAGE @@ -247,8 +247,8 @@ exports.createTreewalkParser = (parse, config, root) -> return # Otherwise, wrap according to the provided rule - for c in context.classes when c of config.parenRules - for m in node.classes when m of config.parenRules[c] - return config.parenRules[c][m] leading, trailing, node, context + for c in context.classes when c of config.PAREN_RULES + for m in node.classes when m of config.PAREN_RULES[c] + return config.PAREN_RULES[c][m] leading, trailing, node, context return TreewalkParser From 74407db9aaeb0e5fdfc81f9828028909e22ef0a1 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 17 Jun 2016 15:59:24 -0400 Subject: [PATCH 127/268] Fixed a nasty view bug --- src/view.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/view.coffee b/src/view.coffee index 6a5c0fad..7673ea93 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -1142,8 +1142,13 @@ exports.View = class View for size, line in @dimensions child = @lineChildren[line][0] childView = @view.getViewNodeFor child.child - top = childView.bounds[line - child.startLine].y + oldY = childView.bounds[line - child.startLine].y + top = childView.bounds[line - child.startLine].y + + childView.distanceToBase[line - child.startLine].above - + @distanceToBase[line].above @computeBoundingBoxY top, line + unless childView.bounds[line - child.startLine].y is oldY # TODO make this a test. + throw new Error 'BAD!' @computePath() @computeDropAreas() From baa1e72ad8b3774b8953c0ab9af2f53f0d863911 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 17 Jun 2016 16:38:23 -0400 Subject: [PATCH 128/268] Fix SpecialMethodCall ambiguity --- antlr/C.g4 | 2 +- antlr/CParser.js | 10 +++++----- src/controller.coffee | 2 ++ src/languages/c.coffee | 19 ++++++++++++------- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/antlr/C.g4 b/antlr/C.g4 index 0b0547dc..0fc947cf 100644 --- a/antlr/C.g4 +++ b/antlr/C.g4 @@ -485,7 +485,7 @@ blockItem ; specialMethodCall - : postfixExpression '(' assignmentExpression ')' ';' + : Identifier '(' assignmentExpression ')' ';' ; expressionStatement diff --git a/antlr/CParser.js b/antlr/CParser.js index 5033c668..3f3fa027 100644 --- a/antlr/CParser.js +++ b/antlr/CParser.js @@ -445,8 +445,8 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\u046a\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u0097\3\2\2\2\u046e\u046c\3", "\2\2\2\u046f\u0473\5\u009aN\2\u0470\u0473\5\62\32\2\u0471\u0473\5\u0090", "I\2\u0472\u046f\3\2\2\2\u0472\u0470\3\2\2\2\u0472\u0471\3\2\2\2\u0473", - "\u0099\3\2\2\2\u0474\u0475\5\n\6\2\u0475\u0476\7=\2\2\u0476\u0477\5", - "*\26\2\u0477\u0478\7>\2\2\u0478\u0479\7Y\2\2\u0479\u009b\3\2\2\2\u047a", + "\u0099\3\2\2\2\u0474\u0475\7k\2\2\u0475\u0476\7=\2\2\u0476\u0477\5*", + "\26\2\u0477\u0478\7>\2\2\u0478\u0479\7Y\2\2\u0479\u009b\3\2\2\2\u047a", "\u047c\5.\30\2\u047b\u047a\3\2\2\2\u047b\u047c\3\2\2\2\u047c\u047d\3", "\2\2\2\u047d\u047e\7Y\2\2\u047e\u009d\3\2\2\2\u047f\u0480\7 \2\2\u0480", "\u0481\7=\2\2\u0481\u0482\5.\30\2\u0482\u0483\7>\2\2\u0483\u0486\5\u0090", @@ -8746,8 +8746,8 @@ function SpecialMethodCallContext(parser, parent, invokingState) { SpecialMethodCallContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); SpecialMethodCallContext.prototype.constructor = SpecialMethodCallContext; -SpecialMethodCallContext.prototype.postfixExpression = function() { - return this.getTypedRuleContext(PostfixExpressionContext,0); +SpecialMethodCallContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); }; SpecialMethodCallContext.prototype.assignmentExpression = function() { @@ -8778,7 +8778,7 @@ CParser.prototype.specialMethodCall = function() { try { this.enterOuterAlt(localctx, 1); this.state = 1138; - this.postfixExpression(0); + this.match(CParser.Identifier); this.state = 1139; this.match(CParser.LeftParen); this.state = 1140; diff --git a/src/controller.coffee b/src/controller.coffee index 74c21281..e534030f 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2416,6 +2416,8 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> else context = (list.start.container ? list.start.parent).parseContext + console.log 'USING CONTEXT', context + try newList = @session.mode.parse list.stringifyInPlace(),{ wrapAtRoot: parent.type isnt 'socket' diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 567b4de7..b60c6d1a 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -127,37 +127,42 @@ config.PAREN_RULES = { config.SHOULD_SOCKET = (opts, node) -> return true unless node.parent? and node.parent.parent? and node.parent.parent.parent? # If it is a function call, and we are the first child - if node.parent.type is 'primaryExpression' and + if (node.parent.type is 'primaryExpression' and node.parent.parent.type is 'postfixExpression' and - node.parent.parent.parent.type in ['postfixExpression', 'specialMethodCall'] and + node.parent.parent.parent.type is 'postfixExpression' and node.parent.parent.parent.children.length in [3, 4] and node.parent.parent.parent.children[1].type is 'LeftParen' and (node.parent.parent.parent.children[2].type is 'RightParen' or node.parent.parent.parent.children[3]?.type is 'RightParen') and - node.parent.parent is node.parent.parent.parent.children[0] and + node.parent.parent is node.parent.parent.parent.children[0] or + node.parent.type is 'specialMethodCall') and node.data.text of opts.knownFunctions return false return true config.COLOR_CALLBACK = (opts, node) -> - if node.type in ['postfixExpression', 'specialMethodCall'] and - node.children.length in [3, 4, 5] and + if node.type is 'postfixExpression' and + node.children.length in [3, 4] and node.children[1].type is 'LeftParen' and (node.children[2].type is 'RightParen' or node.children[3]?.type is 'RightParen') and node.children[0].children[0].type is 'primaryExpression' and node.children[0].children[0].children[0].type is 'Identifier' and node.children[0].children[0].children[0].data.text of opts.knownFunctions return opts.knownFunctions[node.children[0].children[0].children[0].data.text].color + else if node.type is 'specialMethodCall' and node.children[0].data.text of opts.knownFunctions + return opts.knownFunctions[node.children[0].data.text].color return null config.SHAPE_CALLBACK = (opts, node) -> - if node.type in ['postfixExpression', 'specialMethodCall'] and - node.children.length in [4, 5] and + if node.type is 'postfixExpression' and + node.children.length in [3, 4] and node.children[1].type is 'LeftParen' and (node.children[2].type is 'RightParen' or node.children[3]?.type is 'RightParen') and node.children[0].children[0].type is 'primaryExpression' and node.children[0].children[0].children[0].type is 'Identifier' and node.children[0].children[0].children[0].data.text of opts.knownFunctions return opts.knownFunctions[node.children[0].children[0].children[0].data.text].shape + else if node.type is 'specialMethodCall' + return opts.knownFunctions[node.children[0].data.text].color return null config.isComment = (text) -> From 796e2f7697bc8ee59bcd7b99a046e568632148b7 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 17 Jun 2016 17:52:32 -0400 Subject: [PATCH 129/268] Clean up reparse() method to avoid locations problems. Note: breaks CoffeeScript autoescape; create alternative pipeline --- src/controller.coffee | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index e534030f..675eb0ff 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2397,7 +2397,6 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> originalText = list.textContent() originalUpdates = updates.map (location) -> count: location.count, type: location.type - @reparse new model.List(list.start.next, list.end.prev), recovery, updates, originalTrigger # Try reparsing the parent again after the reparse. If it fails, # repopulate with the original text and try again. @@ -2416,8 +2415,6 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> else context = (list.start.container ? list.start.parent).parseContext - console.log 'USING CONTEXT', context - try newList = @session.mode.parse list.stringifyInPlace(),{ wrapAtRoot: parent.type isnt 'socket' From 6eef1068ea4472f7fcf9d03814bc6e36a1c31bd1 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 10:20:34 -0400 Subject: [PATCH 130/268] Fix scrollbar bug --- css/droplet.css | 5 +++++ src/controller.coffee | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/css/droplet.css b/css/droplet.css index 98f39b15..badde989 100644 --- a/css/droplet.css +++ b/css/droplet.css @@ -153,6 +153,10 @@ .droplet-main-scroller-stuffing { z-index: 10; } +.main-scroller-intermediary { + z-index; 10; + width: 100%; +} .droplet-palette-scroller-stuffing { /* Temporary hack to prevent bad side-scrolling * behaviour when dragging blocks out of the palette */ @@ -308,3 +312,4 @@ letter-spacing: normal; pointer-events: none; } + diff --git a/src/controller.coffee b/src/controller.coffee index 675eb0ff..c94e91e5 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -338,9 +338,12 @@ exports.Editor = class Editor # ## Tracker Events # We allow binding to the tracker element. dispatchMouseEvent = (event) => - # ignore mouse clicks that are not the left-button + # Ignore mouse clicks that are not the left-button if event.type isnt 'mousemove' and event.which isnt 1 then return + # Ignore mouse clicks whose target is the scrollbar + if event.target is @mainScroller then return + trackPoint = new @draw.Point(event.clientX, event.clientY) # We keep a state object so that handlers @@ -3782,10 +3785,14 @@ hook 'populate', 2, -> @mainScroller = document.createElement 'div' @mainScroller.className = 'droplet-main-scroller' + @mainScrollerIntermediary = document.createElement 'div' + @mainScrollerIntermediary.className = 'droplet-main-scroller-intermediary' + @mainScrollerStuffing = document.createElement 'div' @mainScrollerStuffing.className = 'droplet-main-scroller-stuffing' - @mainScroller.appendChild @mainScrollerStuffing + @mainScroller.appendChild @mainScrollerIntermediary + @mainScrollerIntermediary.appendChild @mainScrollerStuffing @dropletElement.appendChild @mainScroller # Prevent scrolling on wrapper element From 165d4af608eab33a009ec87a75acb9bd38ccbc66 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 10:34:08 -0400 Subject: [PATCH 131/268] Fix droplet-main-scroller-intermediary css --- css/droplet.css | 5 +++-- src/controller.coffee | 5 ++++- src/languages/coffee.coffee | 6 ++++++ src/parser.coffee | 2 ++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/css/droplet.css b/css/droplet.css index badde989..e5012720 100644 --- a/css/droplet.css +++ b/css/droplet.css @@ -153,9 +153,10 @@ .droplet-main-scroller-stuffing { z-index: 10; } -.main-scroller-intermediary { +.droplet-main-scroller-intermediary { z-index; 10; - width: 100%; + min-width: 100%; + min-height: 100%; } .droplet-palette-scroller-stuffing { /* Temporary hack to prevent bad side-scrolling diff --git a/src/controller.coffee b/src/controller.coffee index c94e91e5..d26924de 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2401,7 +2401,10 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> originalUpdates = updates.map (location) -> count: location.count, type: location.type - # Try reparsing the parent again after the reparse. If it fails, + if @session.mode.stringFixer? + @populateSocket list, @session.mode.stringFixer list.textContent() + + # Try reparsing the parent after beforetextfocus. If it fails, # repopulate with the original text and try again. unless @reparse list.parent, recovery, updates, originalTrigger @populateSocket list, originalText diff --git a/src/languages/coffee.coffee b/src/languages/coffee.coffee index bf3b4231..cc2f093e 100644 --- a/src/languages/coffee.coffee +++ b/src/languages/coffee.coffee @@ -1231,4 +1231,10 @@ CoffeeScriptParser.getDefaultSelectionRange = (string) -> start += 2; end -= 2 return {start, end} +CoffeeScriptParser.stringFixer = (string) -> + if /^['"]|['"]$/.test string + return fixQuotedString [string] + else + return string + module.exports = parser.wrapParser CoffeeScriptParser diff --git a/src/parser.coffee b/src/parser.coffee index 2dfe8808..a423f6bd 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -611,6 +611,8 @@ exports.wrapParser = (CustomParser) -> parser.emptyIndent = @emptyIndent return parser + stringFixer: -> CustomParser.stringFixer.apply @, arguments + parse: (text, opts) -> @opts.parseOptions = opts opts ?= wrapAtRoot: true From 414ed0b9f0b479a9759b15dc80939c9ddc65a962 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 11:52:11 -0400 Subject: [PATCH 132/268] Fix string fixer --- src/controller.coffee | 6 +++--- src/parser.coffee | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index d26924de..e6004993 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -126,11 +126,11 @@ class Session @mode = null # Instantiate an Droplet editor view - @view = new view.View standardViewSettings - @paletteView = new view.View helper.extend {}, standardViewSettings, { + @view = new view.View helper.extend standardViewSettings, @options.viewSettings ? {} + @paletteView = new view.View helper.extend {}, standardViewSettings, @options.viewSettings ? {}, { showDropdowns: @options.showDropdownInPalette ? false } - @dragView = new view.View standardViewSettings + @dragView = new view.View helper.extend {}, standardViewSettings, @options.viewSettings ? {} # ## Document initialization # We start of with an empty document diff --git a/src/parser.coffee b/src/parser.coffee index a423f6bd..4bc50216 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -611,7 +611,9 @@ exports.wrapParser = (CustomParser) -> parser.emptyIndent = @emptyIndent return parser - stringFixer: -> CustomParser.stringFixer.apply @, arguments + stringFixer: -> + if CustomParser.stringFixer? + CustomParser.stringFixer.apply @, arguments parse: (text, opts) -> @opts.parseOptions = opts From 09ce98d4d87184d30c0074381ae6361dbfe8d745 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 11:52:50 -0400 Subject: [PATCH 133/268] Actually fix string fixer --- src/parser.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/parser.coffee b/src/parser.coffee index 4bc50216..413888fb 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -611,9 +611,11 @@ exports.wrapParser = (CustomParser) -> parser.emptyIndent = @emptyIndent return parser - stringFixer: -> + stringFixer: (string) -> if CustomParser.stringFixer? CustomParser.stringFixer.apply @, arguments + else + return string parse: (text, opts) -> @opts.parseOptions = opts From a3fd4ed42633b5ad75cafb9e09c036dcd1f0dc3d Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 11:59:17 -0400 Subject: [PATCH 134/268] Small color rule adjustment --- src/languages/c.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/c.coffee b/src/languages/c.coffee index b60c6d1a..df4ad39e 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -51,6 +51,8 @@ RULES = { COLOR_RULES = [ ['declaration', 'control'], ['specialMethodCall', 'command'], + ['additiveExpression', 'value'], + ['multiplicativeExpression', 'value'], ['postfixExpression', 'command'], ['iterationStatement', 'control'], ['selectionStatement', 'control'], @@ -68,8 +70,6 @@ COLOR_RULES = [ ['functionDefinition', 'control'], ['expressionStatement', 'command'], ['expression', 'value'], - ['additiveExpression', 'value'], - ['multiplicativeExpression', 'value'], ['parameterDeclaration', 'command'], ['unaryExpression', 'value'], ['typeName', 'value'], From 171c7b53bb7044d2232c8314eef57c6edfdee879 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 13:02:37 -0400 Subject: [PATCH 135/268] Fix tests --- Gruntfile.coffee | 11 +---------- src/parser.coffee | 12 ++++++------ src/treewalk.coffee | 2 +- test/src/uitest.coffee | 12 ++++++------ 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 92714ca2..8fdc8855 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -62,17 +62,8 @@ module.exports = (grunt) -> 'http://localhost:8942/' + x) mochaTest: - c: - src: ['test/src/cParserTests.coffee'] - bail: true - options: - reporter: 'list' - compilers: - 'coffee': 'coffee-script/register' - timeout: 10000 test: src: [ - 'test/src/cParserTests.coffee' 'test/src/parserTests.coffee' 'test/src/modelTests.coffee' ] @@ -80,7 +71,7 @@ module.exports = (grunt) -> reporter: 'list' compilers: 'coffee': 'coffee-script/register' - timeout: 10000 + timeout: 20000 browserify: build: diff --git a/src/parser.coffee b/src/parser.coffee index 413888fb..aafe4cec 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -327,9 +327,9 @@ exports.Parser = class Parser head = helper.connect head, stack.pop().end currentlyCommented = false - if not currentlyCommented and ( - (opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent' - ) and line.length > 0 + if not currentlyCommented and + ((opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent') and + line.length > 0 placedSomething = true if isPrefix(line.trimLeft(), @startComment) currentlyCommented = true @@ -438,9 +438,9 @@ exports.Parser = class Parser head = helper.connect head, stack.pop().end currentlyCommented = false - if not currentlyCommented and ( - (opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent' - ) and line.length > 0 + if not currentlyCommented and + ((opts.wrapAtRoot and stack.length is 0) or stack[stack.length - 1]?.type is 'indent') and + line.length > 0 if isPrefix(line[lastIndex...].trimLeft(), @startComment) currentlyCommented = true block = new model.Block 0, 'comment', helper.ANY_DROP diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 288228f7..8d00d73e 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -185,7 +185,7 @@ exports.createTreewalkParser = (parse, config, root) -> start = child.bounds.end end = node.children[node.children.length - 1].bounds.end - for child, i in node.children.reverse() # by -1 + for child, i in node.children by -1 if child.children.length > 0 end = child.bounds.end break diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee index ec9ce9e1..5db721c0 100644 --- a/test/src/uitest.coffee +++ b/test/src/uitest.coffee @@ -376,12 +376,12 @@ performTextOperation = (editor, text, cb) -> $(editor.hiddenInput).sendkeys(text.text) setTimeout (-> # Unfocus - simulate('mousedown', editor.mainScroller, { + simulate('mousedown', editor.mainScrollerIntermediary, { location: editor.mainCanvas dx: editor.mainCanvas.offsetWidth - 1 dy: editor.mainCanvas.offsetHeight - 1 }) - simulate('mouseup', editor.mainScroller, { + simulate('mouseup', editor.mainScrollerIntermediary, { location: editor.mainCanvas dx: editor.mainCanvas.offsetWidth - 1 dy: editor.mainCanvas.offsetHeight - 1 @@ -405,19 +405,19 @@ performDragOperation = (editor, drag, cb) -> dx: drag.drop.point.x + 5 dy: drag.drop.point.y + 5 }) - simulate('mouseup', editor.mainScroller, { + simulate('mouseup', editor.mainScrollerIntermediary, { dx: drag.drop.point.x + 5 dy: drag.drop.point.y + 5 }) # Unfocus the text input that may have been focused # when we dragged setTimeout (-> - simulate('mousedown', editor.mainScroller, { + simulate('mousedown', editor.mainScrollerIntermediary, { location: editor.mainCanvas dx: editor.mainCanvas.offsetWidth - 1 dy: editor.mainCanvas.offsetHeight - 1 }) - simulate('mouseup', editor.mainScroller, { + simulate('mouseup', editor.mainScrollerIntermediary, { location: editor.mainCanvas dx: editor.mainCanvas.offsetWidth - 1 dy: editor.mainCanvas.offsetHeight - 1 @@ -446,7 +446,7 @@ dropLocation = (editor, document, location) -> dx: blockView.dropPoint.x + 5, dy: blockView.dropPoint.y + 5 }) - simulate('mouseup', editor.mainScroller, { + simulate('mouseup', editor.mainScrollerIntermediary, { dx: blockView.dropPoint.x + 5 dy: blockView.dropPoint.y + 5 }) From 01d659d567cfc91fc4d3c437a963cf42a1a9c1a1 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 13:31:01 -0400 Subject: [PATCH 136/268] Indent droppability rules --- src/model.coffee | 1 + src/treewalk.coffee | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/model.coffee b/src/model.coffee index 1319da1a..426a8de1 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -500,6 +500,7 @@ exports.Container = class Container extends List type: @type precedence: @precedence classes: @classes + parseContext: @parseContext } setParent: (parent) -> diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 8d00d73e..171f9850 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -228,9 +228,31 @@ exports.createTreewalkParser = (parse, config, root) -> for m in block.classes if m of config.PAREN_RULES[c] return helper.ENCOURAGE + return helper.DISCOURAGE + + else if context.type is 'indent' + console.log context.parseContext, block.classes + if '__comment__' in block.classes + return helper.ENCOURAGE + + if context.parseContext in block.classes + return helper.ENCOURAGE return helper.DISCOURAGE + else if context.type is 'document' + if '__comment__' in block.classes + return helper.ENCOURAGE + + if 'externalDeclaration' in block.classes or + 'translationUnit' in block.classes + return helper.ENCOURAGE + + return helper.DISCOURAGE + + return helper.DISCOURAGE + + # Doesn't yet deal with parens TreewalkParser.parens = (leading, trailing, node, context)-> # If we're moving to null, remove parens (where possible) From 50532c304095472bc8dc9b67658fb9312099eee9 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 13:36:26 -0400 Subject: [PATCH 137/268] Fix to reparse context necessitated by indent parse contexts --- src/treewalk.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 171f9850..6cbf3ee4 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -119,14 +119,14 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth classes: rules - parseContext: (if wrap? then wrap.type else rules[0]) + parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) @addBlock bounds: bounds depth: depth + 1 color: @getColor node, rules classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) - parseContext: (if wrap? then wrap.type else rules[0]) + parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) when 'parens' # Parens are assumed to wrap the only child that has children @@ -155,14 +155,14 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth classes: rules - parseContext: (if wrap? then wrap.type else rules[0]) + parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) @addBlock bounds: bounds depth: depth + 1 color: @getColor node, rules classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) - parseContext: (if wrap? then wrap.type else rules[0]) + parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) when 'indent' # A lone indent needs to be wrapped in a block. @@ -172,7 +172,7 @@ exports.createTreewalkParser = (parse, config, root) -> depth: depth color: @getColor node, rules classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) - parseContext: (if wrap? then wrap.type else rules[0]) + parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) depth += 1 @@ -213,7 +213,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: node.bounds depth: depth classes: rules - parseContext: (if wrap? then wrap.type else rules[0]) + parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) TreewalkParser.drop = (block, context, pred) -> if context.type is 'socket' From 252ddab380a95a5d4773fd4f5429bce2f613f5db Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 14:07:15 -0400 Subject: [PATCH 138/268] Fix drop rules to avoid ambiguities with parens --- src/treewalk.coffee | 53 +++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 6cbf3ee4..2fa73e10 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -93,18 +93,19 @@ exports.createTreewalkParser = (parse, config, root) -> return 'comment' - mark: (node, prefix, depth, pass, rules, context, wrap) -> + mark: (node, prefix, depth, pass, rules, context, wrap, wrapRules) -> unless pass context = node.parent while context? and @detNode(context) in ['skip', 'parens'] context = context.parent rules ?= [] + rules = rules.slice 0 rules.push node.type # Pass through to child if single-child if node.children.length is 1 - @mark node.children[0], prefix, depth, true, rules, context, wrap + @mark node.children[0], prefix, depth, true, rules, context, wrap, wrapRules else if node.children.length > 0 switch @detNode node @@ -118,14 +119,14 @@ exports.createTreewalkParser = (parse, config, root) -> @addSocket bounds: bounds depth: depth - classes: rules + classes: padRules(wrapRules ? rules) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) @addBlock bounds: bounds depth: depth + 1 color: @getColor node, rules - classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) + classes: padRules(wrapRules ? rules).concat(if context? then @getDropType(context) else @getShape(node, rules)) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) when 'parens' @@ -139,7 +140,7 @@ exports.createTreewalkParser = (parse, config, root) -> else child = el if ok - @mark child, prefix, depth, true, rules, context, wrap ? node + @mark child, prefix, depth, true, rules, context, wrap ? node, wrapRules ? rules return else @@ -154,14 +155,14 @@ exports.createTreewalkParser = (parse, config, root) -> @addSocket bounds: bounds depth: depth - classes: rules + classes: padRules(wrapRules ? rules) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) @addBlock bounds: bounds depth: depth + 1 color: @getColor node, rules - classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) + classes: padRules(wrapRules ? rules).concat(if context? then @getDropType(context) else @getShape(node, rules)) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) when 'indent' @@ -171,7 +172,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: node.bounds depth: depth color: @getColor node, rules - classes: rules.concat(if context? then @getDropType(context) else @getShape(node, rules)) + classes: padRules(wrapRules ? rules).concat(if context? then @getDropType(context) else @getShape(node, rules)) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) depth += 1 @@ -202,7 +203,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth prefix: prefix[oldPrefix.length...prefix.length] - classes: rules + classes: padRules(wrapRules ? rules) parseContext: @applyRule(config.RULES[node.type], node).indentContext for child in node.children @@ -212,40 +213,40 @@ exports.createTreewalkParser = (parse, config, root) -> @addSocket bounds: node.bounds depth: depth - classes: rules + classes: padRules(wrapRules ? rules) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) TreewalkParser.drop = (block, context, pred) -> if context.type is 'socket' - if '__comment__' in context.classes + if '__comment__' in parseClasses(context) return helper.DISCOURAGE - for c in context.classes - if c in block.classes + for c in parseClasses(context) + if c in parseClasses(block) return helper.ENCOURAGE # Check to see if we could paren-wrap this if config.PAREN_RULES? and c of config.PAREN_RULES - for m in block.classes + for m in parseClasses(block) if m of config.PAREN_RULES[c] return helper.ENCOURAGE return helper.DISCOURAGE else if context.type is 'indent' - console.log context.parseContext, block.classes - if '__comment__' in block.classes + console.log context.parseContext, parseClasses(block) + if '__comment__' in parseClasses(block) return helper.ENCOURAGE - if context.parseContext in block.classes + if context.parseContext in parseClasses(block) return helper.ENCOURAGE return helper.DISCOURAGE else if context.type is 'document' - if '__comment__' in block.classes + if '__comment__' in parseClasses(block) return helper.ENCOURAGE - if 'externalDeclaration' in block.classes or - 'translationUnit' in block.classes + if 'externalDeclaration' in parseClasses(block) or + 'translationUnit' in parseClasses(block) return helper.ENCOURAGE return helper.DISCOURAGE @@ -264,13 +265,17 @@ exports.createTreewalkParser = (parse, config, root) -> # If we already match types, we're fine - for c in context.classes - if c in node.classes + for c in parseClasses(context) + if c in parseClasses(node) return # Otherwise, wrap according to the provided rule - for c in context.classes when c of config.PAREN_RULES - for m in node.classes when m of config.PAREN_RULES[c] + for c in parseClasses(context) when c of config.PAREN_RULES + for m in parseClasses(node) when m of config.PAREN_RULES[c] return config.PAREN_RULES[c][m] leading, trailing, node, context return TreewalkParser + +PARSE_PREFIX = "_parse_" +padRules = (rules) -> rules.map (x) -> "#{PARSE_PREFIX}#{x}" +parseClasses = (node) -> node.classes.filter((x) -> x[...PARSE_PREFIX.length] is PARSE_PREFIX).map((x) -> x[PARSE_PREFIX.length..]) From 50d0cc75c8f4210fca880b6493131ae7a778293a Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 15:06:23 -0400 Subject: [PATCH 139/268] Add test for sessions --- src/controller.coffee | 9 ++- test/src/uitest.coffee | 138 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 2 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index e6004993..d6e9b262 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -528,7 +528,7 @@ exports.Editor = class Editor @session = session @aceEditor.getSession()._dropletSession = @session @session.currentlyUsingBlocks = false - @setValue @getAceValue() + @setValue_raw @getAceValue() @setPalette @session.paletteGroups return session @@ -3788,6 +3788,9 @@ hook 'populate', 2, -> @mainScroller = document.createElement 'div' @mainScroller.className = 'droplet-main-scroller' + # @mainScrollerIntermediary -- this is so that we can be certain that + # any event directly on @mainScroller is in fact on the @mainScroller scrollbar, + # so should not be captured by editor mouse event handlers. @mainScrollerIntermediary = document.createElement 'div' @mainScrollerIntermediary.className = 'droplet-main-scroller-intermediary' @@ -4124,7 +4127,7 @@ Editor::setEditorState = (useBlocks) -> throw new ArgumentError 'cannot switch to blocks if a session has not been set up.' unless @session.currentlyUsingBlocks - @setValue @getAceValue() + @setValue_raw @getAceValue() @dropletElement.style.top = '0px' if @session.paletteEnabled @@ -4390,6 +4393,8 @@ Editor::editorHasFocus = -> document.hasFocus() Editor::flash = -> + return unless @session? + if @lassoSelection? or @draggingBlock? or (@cursorAtSocket() and @textInputHighlighted) or not @highlightsCurrentlyShown or diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee index 5db721c0..9e98005e 100644 --- a/test/src/uitest.coffee +++ b/test/src/uitest.coffee @@ -695,6 +695,144 @@ asyncTest 'Controller: Quoted string CoffeeScript autoescape', -> ) ] +asyncTest 'Controller: Session switch test', -> + document.getElementById('test-main').innerHTML = '' + window.editor = editor = new droplet.Editor(document.getElementById('test-main'), { + mode: 'coffeescript', + modeOptions: + functions: + fd: {command: true, value: false} + bk: {command: true, value: false} + palette: [ + { + name: 'Blocks 1' + blocks: [ + {block: 'a is b'} + ] + } + { + name: 'Blocks 2' + blocks: [ + {block: 'a is b'} + ] + } + { + name: 'Blocks 3' + blocks: [ + {block: 'a is b'} + ] + } + { + name: 'Blocks 4' + blocks: [ + {block: 'a is b'} + ] + } + { + name: 'Blocks 5' + blocks: [ + {block: 'a is b'} + ] + } + { + name: 'Blocks 6' + blocks: [ + {block: 'a is b'} + ] + } + ] + }) + + originalSession = editor.aceEditor.getSession() + + editor.setEditorState(true) + editor.setValue(''' + for i in [0..10] + if i % 2 is 0 + fd 10 + else + bk 10 + ''') + + equal editor.paletteHeader.childElementCount, 3, 'Palette header originally has three rows' + + newSession = ace.createEditSession(''' + for (var i = 0; i < 10; i++) { + if (i % 2 === 0) { + fd(10); + } + else { + bk(10); + } + } + ''', 'ace/mode/javascript') + + executeAsyncSequence [ + (-> + editor.aceEditor.setSession newSession + ), + (-> + editor.bindNewSession({ + mode: 'javascript', + palette: [] + }) + + editor.setEditorState(true) + equal editor.getValue(), ''' + for (var i = 0; i < 10; i++) { + if (i % 2 === 0) { + fd(10); + } + else { + bk(10); + } + }\n + ''', 'Set value of new session' + + equal editor.paletteHeader.childElementCount, 0, 'Palette header now empty' + + equal editor.paletteWrapper.style.left is '0px', true, 'Using blocks' + editor.setEditorState(false) + + equal editor.paletteWrapper.style.left is '0px', false, 'No longer using blocks' + ), + (-> + editor.aceEditor.setSession originalSession + ), + (-> + equal editor.getValue(), ''' + for i in [0..10] + if i % 2 is 0 + fd 10 + else + bk 10\n + ''', 'Original text restored' + + equal editor.paletteWrapper.style.left is '0px', true, 'Using blocks again' + equal editor.paletteHeader.childElementCount, 3, 'Original palette header size restored' + ), + (-> + editor.aceEditor.setSession newSession + ), + (-> + equal editor.getValue(), ''' + for (var i = 0; i < 10; i++) { + if (i % 2 === 0) { + fd(10); + } + else { + bk(10); + } + }\n + ''', 'Set value of new session' + + equal editor.paletteWrapper.style.left is '0px', false, 'No longer using blocks' + equal editor.paletteHeader.childElementCount, 0, 'Palette header now empty' + + start() + ) + ] + asyncTest 'Controller: Random drag undo test', -> document.getElementById('test-main').innerHTML = '' window.editor = editor = new droplet.Editor(document.getElementById('test-main'), { From 7056bb981f0b0cb792945ed7ed81859af16412c3 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 16:24:24 -0400 Subject: [PATCH 140/268] Add test for absorbCache() bug and fix other absorbCache() bug --- src/languages/c.coffee | 6 ++++- src/treewalk.coffee | 1 - src/view.coffee | 14 +++++++--- test/src/tests.coffee | 59 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/languages/c.coffee b/src/languages/c.coffee index df4ad39e..f601c3db 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -125,7 +125,7 @@ config.PAREN_RULES = { } config.SHOULD_SOCKET = (opts, node) -> - return true unless node.parent? and node.parent.parent? and node.parent.parent.parent? + return true unless opts.knownFunctions? and node.parent? and node.parent.parent? and node.parent.parent.parent? # If it is a function call, and we are the first child if (node.parent.type is 'primaryExpression' and node.parent.parent.type is 'postfixExpression' and @@ -140,6 +140,8 @@ config.SHOULD_SOCKET = (opts, node) -> return true config.COLOR_CALLBACK = (opts, node) -> + return null unless opts.knownFunctions? + if node.type is 'postfixExpression' and node.children.length in [3, 4] and node.children[1].type is 'LeftParen' and @@ -153,6 +155,8 @@ config.COLOR_CALLBACK = (opts, node) -> return null config.SHAPE_CALLBACK = (opts, node) -> + return null unless opts.knwonFunctions? + if node.type is 'postfixExpression' and node.children.length in [3, 4] and node.children[1].type is 'LeftParen' and diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 2fa73e10..0a449506 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -232,7 +232,6 @@ exports.createTreewalkParser = (parse, config, root) -> return helper.DISCOURAGE else if context.type is 'indent' - console.log context.parseContext, parseClasses(block) if '__comment__' in parseClasses(block) return helper.ENCOURAGE diff --git a/src/view.coffee b/src/view.coffee index 7673ea93..d9fa9239 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -1130,7 +1130,15 @@ exports.View = class View @computeMargins() @computeBevels() @computeMinDimensions() - @computeDimensions 0, true + # Replacement for computeDimensions + for size, line in @minDimensions + @distanceToBase[line] = { + above: @lineChildren[line].map((child) => @view.getViewNodeFor(child.child).distanceToBase[line - child.startLine].above).reduce((a, b) -> Math.max(a, b)) + below: @lineChildren[line].map((child) => @view.getViewNodeFor(child.child).distanceToBase[line - child.startLine].below).reduce((a, b) -> Math.max(a, b)) + } + @dimensions[line] = new draw.Size @minDimensions[line].width, @minDimensions[line].height + + #@computeDimensions false, true # Replacement for computeAllBoundingBoxX for size, line in @dimensions child = @lineChildren[line][0] @@ -1147,8 +1155,6 @@ exports.View = class View childView.distanceToBase[line - child.startLine].above - @distanceToBase[line].above @computeBoundingBoxY top, line - unless childView.bounds[line - child.startLine].y is oldY # TODO make this a test. - throw new Error 'BAD!' @computePath() @computeDropAreas() @@ -1715,7 +1721,7 @@ exports.View = class View path.style.fillColor = avgColor @path.style.fillColor, 0.5, '#888' if style.selected path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F' - path.bevel = true; + path.bevel = true path.draw ctx textElement = new @view.draw.Text(new @view.draw.Point(0, 0), text) dx = rect.width - textElement.bounds().width diff --git a/test/src/tests.coffee b/test/src/tests.coffee index 28845cbd..c09886da 100644 --- a/test/src/tests.coffee +++ b/test/src/tests.coffee @@ -6,11 +6,13 @@ controller = require '../../src/controller.coffee' parser = require '../../src/parser.coffee' Coffee = require '../../src/languages/coffee.coffee' +C = require '../../src/languages/c.coffee' JavaScript = require '../../src/languages/javascript.coffee' droplet = require '../../dist/droplet-full.js' coffee = new Coffee() +c = new C() asyncTest 'Parser success', -> window.dumpObj = [] @@ -418,6 +420,63 @@ asyncTest 'Controller: melt/freeze events', -> strictEqual states[1], true start() +asyncTest 'View: absorbCache', -> + view_ = new view.View() + + document = c.parse ''' + int main() { + /* some comment + some comment */ puts("Hello"); /* more comments + more comments */ + return 0; + } + ''' + + documentView = view_.getViewNodeFor document + documentView.layout() + + start_ = document.getBlockOnLine(1).start + end = document.getBlockOnLine(3).end + + list = new model.List start_, end + + for i in [0...10] + oldY = [ + view_.getViewNodeFor(document.getBlockOnLine(1)).bounds[1].y # some comment */ + view_.getViewNodeFor(document.getFromTextLocation({ # return 0; + row: 2 + col: 18 + type: 'block' + })).bounds[0].y + view_.getViewNodeFor(document.getFromTextLocation({ # /* more comments + row: 2 + col: 31 + type: 'block' + })).bounds[0].y + ] + + view_.getViewNodeFor(list).absorbCache() + + newY = [ + view_.getViewNodeFor(document.getBlockOnLine(1)).bounds[1].y # some comment */ + view_.getViewNodeFor(document.getFromTextLocation({ # return 0; + row: 2 + col: 18 + type: 'block' + })).bounds[0].y + view_.getViewNodeFor(document.getFromTextLocation({ # /* more comments + row: 2 + col: 31 + type: 'block' + })).bounds[0].y + ] + + equal newY[0], oldY[0], 'First block preserved' + equal newY[1], oldY[1], 'Second block preserved' + equal newY[2], oldY[2], 'Third block preserved' + + start() + asyncTest 'Controller: palette events', -> document.getElementById('test-main').innerHTML = '' editor = new droplet.Editor document.getElementById('test-main'), { From ba848d1ad9adec13085be37fdf59d9769b3487a5 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 17:55:54 -0400 Subject: [PATCH 141/268] Refactor quotes and round-trip empty indents --- src/helper.coffee | 34 ++++++++++++++++++++++++++++++++++ src/languages/c.coffee | 24 +++++++++++++++++++++++- src/languages/coffee.coffee | 37 ++----------------------------------- src/modes.coffee | 1 + src/treewalk.coffee | 20 ++++++++++++++------ 5 files changed, 74 insertions(+), 42 deletions(-) diff --git a/src/helper.coffee b/src/helper.coffee index 0f8949cc..55f35052 100644 --- a/src/helper.coffee +++ b/src/helper.coffee @@ -184,3 +184,37 @@ exports.deepEquals = deepEquals = (a, b) -> else return a is b +# To fix quoting errors, we first do a lenient C-unescape, then +# we do a string C-escaping, to add backlsashes where needed, but +# not where we already have good ones. +exports.fixQuotedString = (lines) -> + line = lines[0] + quotechar = if /^"|"$/.test(line) then '"' else "'" + if line.charAt(0) is quotechar + line = line.substr(1) + if line.charAt(line.length - 1) is quotechar + line = line.substr(0, line.length - 1) + return lines[0] = quoteAndCEscape looseCUnescape(line), quotechar + +exports.looseCUnescape = looseCUnescape = (str) -> + codes = + '\\b': '\b' + '\\t': '\t' + '\\n': '\n' + '\\f': '\f' + '\\"': '"' + "\\'": "'" + "\\\\": "\\" + "\\0": "\0" + str.replace /\\[btnf'"\\0]|\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, (m) -> + if m.length is 2 then return codes[m] + return String.fromCharCode(parseInt(m.substr(1), 16)) + +exports.quoteAndCEscape = quoteAndCEscape = (str, quotechar) -> + result = JSON.stringify(str) + if quotechar is "'" + return quotechar + + result.substr(1, result.length - 2). + replace(/((?:^|[^\\])(?:\\\\)*)\\"/g, '$1"'). + replace(/'/g, "\\'") + quotechar + return result diff --git a/src/languages/c.coffee b/src/languages/c.coffee index f601c3db..67cc667b 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -3,9 +3,12 @@ # Copyright (c) 2015 Anthony Bau # MIT License +helper = require '../helper.coffee' parser = require '../parser.coffee' antlrHelper = require '../antlr.coffee' +{fixQuotedString, looseCUnescape, quoteAndCEscape} = helper + RULES = { # Indents 'compoundStatement': { @@ -49,6 +52,7 @@ RULES = { } COLOR_RULES = [ + ['jumpStatement', 'return'] ['declaration', 'control'], ['specialMethodCall', 'command'], ['additiveExpression', 'value'], @@ -125,7 +129,9 @@ config.PAREN_RULES = { } config.SHOULD_SOCKET = (opts, node) -> - return true unless opts.knownFunctions? and node.parent? and node.parent.parent? and node.parent.parent.parent? + return true unless opts.knownFunctions? and (node.parent? and node.parent.parent? and node.parent.parent.parent?) or + node.parent?.type is 'specialMethodCall' + # If it is a function call, and we are the first child if (node.parent.type is 'primaryExpression' and node.parent.parent.type is 'postfixExpression' and @@ -216,6 +222,22 @@ config.parseComment = (text) -> color } +config.getDefaultSelectionRange = (string) -> + start = 0; end = string.length + if string.length > 1 and string[0] is string[string.length - 1] and string[0] is '"' + start += 1; end -= 1 + if string.length > 1 and string[0] is '<' and string[string.length - 1] is '>' + start += 1; end -= 1 + if string.length is 3 and string[0] is string[string.length - 1] is '\'' + start += 1; end -= 1 + return {start, end} + +config.stringFixer = (string) -> + if /^['"]|['"]$/.test string + return fixQuotedString [string] + else + return string + # TODO Implement removing parentheses at some point #config.unParenWrap = (leading, trailing, node, context) -> # while true diff --git a/src/languages/coffee.coffee b/src/languages/coffee.coffee index cc2f093e..6fdc9770 100644 --- a/src/languages/coffee.coffee +++ b/src/languages/coffee.coffee @@ -7,6 +7,8 @@ helper = require '../helper.coffee' model = require '../model.coffee' parser = require '../parser.coffee' +{fixQuotedString, looseCUnescape, quoteAndCEscape} = helper + {CoffeeScript} = require '../../vendor/coffee-script.js' ANY_DROP = ['any-drop'] @@ -1100,41 +1102,6 @@ fixCoffeeScriptError = (lines, e) -> return null -# To fix quoting errors, we first do a lenient C-unescape, then -# we do a string C-escaping, to add backlsashes where needed, but -# not where we already have good ones. -fixQuotedString = (lines) -> - line = lines[0] - quotechar = if /^"|"$/.test(line) then '"' else "'" - if line.charAt(0) is quotechar - line = line.substr(1) - if line.charAt(line.length - 1) is quotechar - line = line.substr(0, line.length - 1) - return lines[0] = quoteAndCEscape looseCUnescape(line), quotechar - -looseCUnescape = (str) -> - codes = - '\\b': '\b' - '\\t': '\t' - '\\n': '\n' - '\\f': '\f' - '\\"': '"' - "\\'": "'" - "\\\\": "\\" - "\\0": "\0" - str.replace /\\[btnf'"\\0]|\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, (m) -> - if m.length is 2 then return codes[m] - return String.fromCharCode(parseInt(m.substr(1), 16)) - -quoteAndCEscape = (str, quotechar) -> - result = JSON.stringify(str) - if quotechar is "'" - return quotechar + - result.substr(1, result.length - 2). - replace(/((?:^|[^\\])(?:\\\\)*)\\"/g, '$1"'). - replace(/'/g, "\\'") + quotechar - return result - findUnmatchedLine = (lines, above) -> # Not done yet return null diff --git a/src/modes.coffee b/src/modes.coffee index ce7510e2..479cce98 100644 --- a/src/modes.coffee +++ b/src/modes.coffee @@ -10,6 +10,7 @@ module.exports = { 'coffee': coffee 'coffeescript': coffee 'c': c + 'c_cpp': c 'java': java 'python': python 'html': html diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 0a449506..67cab6ac 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -181,8 +181,8 @@ exports.createTreewalkParser = (parse, config, root) -> for child, i in node.children if child.children.length > 0 break - else unless helper.clipLines(@lines, origin, child.bounds.end).trim().length is 0 - #console.log 'excluding start', helper.clipLines(@lines, origin, child.bounds.end) + else unless helper.clipLines(@lines, origin, child.bounds.end).trim().length is 0 or i is node.children.length - 1 + console.log 'excluding start', helper.clipLines(@lines, origin, child.bounds.end) start = child.bounds.end end = node.children[node.children.length - 1].bounds.end @@ -190,6 +190,11 @@ exports.createTreewalkParser = (parse, config, root) -> if child.children.length > 0 end = child.bounds.end break + else unless i is 0 + end = child.bounds.start + if end.column is 0 + end.line -= 1 + end.column = @lines[end.line].length bounds = { start: start @@ -218,7 +223,7 @@ exports.createTreewalkParser = (parse, config, root) -> TreewalkParser.drop = (block, context, pred) -> if context.type is 'socket' - if '__comment__' in parseClasses(context) + if '__comment__' in block.classes return helper.DISCOURAGE for c in parseClasses(context) if c in parseClasses(block) @@ -232,7 +237,7 @@ exports.createTreewalkParser = (parse, config, root) -> return helper.DISCOURAGE else if context.type is 'indent' - if '__comment__' in parseClasses(block) + if '__comment__' in block.classes return helper.ENCOURAGE if context.parseContext in parseClasses(block) @@ -241,7 +246,7 @@ exports.createTreewalkParser = (parse, config, root) -> return helper.DISCOURAGE else if context.type is 'document' - if '__comment__' in parseClasses(block) + if '__comment__' in block.classes return helper.ENCOURAGE if 'externalDeclaration' in parseClasses(block) or @@ -273,8 +278,11 @@ exports.createTreewalkParser = (parse, config, root) -> for m in parseClasses(node) when m of config.PAREN_RULES[c] return config.PAREN_RULES[c][m] leading, trailing, node, context + TreewalkParser.stringFixer = config.stringFixer + TreewalkParser.getDefaultSelectionRange = config.getDefaultSelectionRange + return TreewalkParser -PARSE_PREFIX = "_parse_" +PARSE_PREFIX = "__parse__" padRules = (rules) -> rules.map (x) -> "#{PARSE_PREFIX}#{x}" parseClasses = (node) -> node.classes.filter((x) -> x[...PARSE_PREFIX.length] is PARSE_PREFIX).map((x) -> x[PARSE_PREFIX.length..]) From b245def0ddfc3403dcab2db70472050c360eb607 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 20 Jun 2016 17:59:12 -0400 Subject: [PATCH 142/268] Fix a bug with that empty-indent thing --- src/treewalk.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 67cab6ac..f7bc7864 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -192,7 +192,7 @@ exports.createTreewalkParser = (parse, config, root) -> break else unless i is 0 end = child.bounds.start - if end.column is 0 + if @lines[end.line][...end.column].trim().length is 0 end.line -= 1 end.column = @lines[end.line].length From 34fa5a6af38c026f0843cc5ab5fd783f36fa0a6b Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 11:20:53 -0400 Subject: [PATCH 143/268] Add empty string and options for including them or not --- src/languages/c.coffee | 9 +++++++-- src/model.coffee | 14 +++++++------- src/parser.coffee | 8 ++++++++ src/treewalk.coffee | 5 ++++- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 67cc667b..4ad18201 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -82,6 +82,8 @@ COLOR_RULES = [ ] SHAPE_RULES = [ + ['blockItem', 'block-only'], + ['expression', 'value-only'], ['postfixExpression', 'block-only'], ['equalityExpression', 'value-only'], ['logicalAndExpression', 'value-only'], @@ -129,8 +131,9 @@ config.PAREN_RULES = { } config.SHOULD_SOCKET = (opts, node) -> - return true unless opts.knownFunctions? and (node.parent? and node.parent.parent? and node.parent.parent.parent?) or - node.parent?.type is 'specialMethodCall' + unless opts.knownFunctions? and ((node.parent? and node.parent.parent? and node.parent.parent.parent?) or + node.parent?.type is 'specialMethodCall') + return true # If it is a function call, and we are the first child if (node.parent.type is 'primaryExpression' and @@ -238,6 +241,8 @@ config.stringFixer = (string) -> else return string +config.empty = '__0_droplet__' + # TODO Implement removing parentheses at some point #config.unParenWrap = (leading, trailing, node, context) -> # while true diff --git a/src/model.coffee b/src/model.coffee index 426a8de1..bb7f43d9 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -414,13 +414,13 @@ exports.List = class List # Get a string representation of us, # using the `stringify()` method on all of # the tokens that we contain. - stringify: -> + stringify: (opts = {}) -> head = @start - str = head.stringify() + str = head.stringify(opts) until head is @end head = head.next - str += head.stringify() + str += head.stringify(opts) return str @@ -1018,8 +1018,8 @@ exports.SocketStartToken = class SocketStartToken extends StartToken exports.SocketEndToken = class SocketEndToken extends EndToken constructor: (@container) -> super; @type = 'socketEnd' - stringify: -> - if @prev is @container.start or + stringify: (opts = {}) -> + if not opts.preserveEmpty and @prev is @container.start or @prev.type is 'text' and @prev.value is '' return @container.emptyString else '' @@ -1070,8 +1070,8 @@ exports.IndentStartToken = class IndentStartToken extends StartToken exports.IndentEndToken = class IndentEndToken extends EndToken constructor: (@container) -> super; @type = 'indentEnd' - stringify: -> - if @prev.prev is @container.start + stringify: (opts = {}) -> + if not opts.preserveEmpty and @prev.prev is @container.start return @container.emptyString else '' serialize: -> "" diff --git a/src/parser.coffee b/src/parser.coffee index aafe4cec..86ec2f2b 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -103,6 +103,14 @@ exports.Parser = class Parser @addMarkup block, opts.bounds, opts.depth + # flagToRemove + flagToRemove: (bounds, depth) -> + block = new model.Block() + + block.flagToRemove = true + + @addMarkup block, bounds, depth + # ## addSocket ## # addSocket takes { # bounds: { diff --git a/src/treewalk.coffee b/src/treewalk.coffee index f7bc7864..88e3c423 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -182,7 +182,6 @@ exports.createTreewalkParser = (parse, config, root) -> if child.children.length > 0 break else unless helper.clipLines(@lines, origin, child.bounds.end).trim().length is 0 or i is node.children.length - 1 - console.log 'excluding start', helper.clipLines(@lines, origin, child.bounds.end) start = child.bounds.end end = node.children[node.children.length - 1].bounds.end @@ -221,6 +220,9 @@ exports.createTreewalkParser = (parse, config, root) -> classes: padRules(wrapRules ? rules) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) + if config.empty? and not @opts.preserveEmpty and helper.clipLines(@lines, node.bounds.start, node.bounds.end) is config.empty + @flagToRemove node.bounds, depth + 1 + TreewalkParser.drop = (block, context, pred) -> if context.type is 'socket' if '__comment__' in block.classes @@ -280,6 +282,7 @@ exports.createTreewalkParser = (parse, config, root) -> TreewalkParser.stringFixer = config.stringFixer TreewalkParser.getDefaultSelectionRange = config.getDefaultSelectionRange + TreewalkParser.empty = config.empty return TreewalkParser From 706429cc84dcf636a6c5b09d5fd00575c1e5f8e3 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 11:46:24 -0400 Subject: [PATCH 144/268] Add extra pipeline options for preserving empty sockets on round-trip or not --- src/controller.coffee | 12 ++++++++++-- src/model.coffee | 12 +++++++----- src/parser.coffee | 9 +++++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index d6e9b262..a40dac78 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -117,6 +117,9 @@ class Session @dropIntoAceAtLineStart = @options.dropIntoAceAtLineStart ? false @allowFloatingBlocks = @options.allowFloatingBlocks ? true + # By default, attempt to preserve empty sockets when round-tripping + @options.preserveEmpty ?= true + # Mode @options.mode = @options.mode.replace /$\/ace\/mode\//, '' @@ -4039,7 +4042,10 @@ Editor::setValue_raw = (value) -> try if @trimWhitespace then value = value.trim() - newParse = @session.mode.parse value, wrapAtRoot: true + newParse = @session.mode.parse value, { + wrapAtRoot: true + preserveEmpty: @session.options.preserveEmpty + } unless @session.tree.start.next is @session.tree.end removal = new model.List @session.tree.start.next, @session.tree.end.prev @@ -4083,7 +4089,9 @@ Editor::addEmptyLine = (str) -> Editor::getValue = -> if @session?.currentlyUsingBlocks - return @addEmptyLine @session.tree.stringify() + return @addEmptyLine @session.tree.stringify({ + preserveEmpty: @session.options.preserveEmpty + }) else @getAceValue() diff --git a/src/model.coffee b/src/model.coffee index bb7f43d9..ef6f6104 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -10,6 +10,8 @@ NO = -> no NORMAL = default: helper.NORMAL FORBID = default: helper.FORBID +DEFAULT_STRINGIFY_OPTS = {preserveEmpty: true} + _id = 0 # Getter/setter utility function @@ -414,7 +416,7 @@ exports.List = class List # Get a string representation of us, # using the `stringify()` method on all of # the tokens that we contain. - stringify: (opts = {}) -> + stringify: (opts = DEFAULT_STRINGIFY_OPTS) -> head = @start str = head.stringify(opts) @@ -1018,8 +1020,8 @@ exports.SocketStartToken = class SocketStartToken extends StartToken exports.SocketEndToken = class SocketEndToken extends EndToken constructor: (@container) -> super; @type = 'socketEnd' - stringify: (opts = {}) -> - if not opts.preserveEmpty and @prev is @container.start or + stringify: (opts = DEFAULT_STRINGIFY_OPTS) -> + if opts.preserveEmpty and @prev is @container.start or @prev.type is 'text' and @prev.value is '' return @container.emptyString else '' @@ -1070,8 +1072,8 @@ exports.IndentStartToken = class IndentStartToken extends StartToken exports.IndentEndToken = class IndentEndToken extends EndToken constructor: (@container) -> super; @type = 'indentEnd' - stringify: (opts = {}) -> - if not opts.preserveEmpty and @prev.prev is @container.start + stringify: (opts = DEFAULT_STRINGIFY_OPTS) -> + if opts.preserveEmpty and @prev.prev is @container.start return @container.emptyString else '' serialize: -> "" diff --git a/src/parser.coffee b/src/parser.coffee index 86ec2f2b..5bcf1ca8 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -41,6 +41,7 @@ exports.Parser = class Parser _parse: (opts) -> opts = _extend opts, { wrapAtRoot: true + preserveEmpty: true } # Generate the list of tokens @markRoot opts.context @@ -53,13 +54,13 @@ exports.Parser = class Parser @detectParenWrap document - # Correct parent tree document.correctParentTree() # Strip away blocks flagged to be removed # (for `` hack and error recovery) - stripFlaggedBlocks document + if opts.preserveEmpty + stripFlaggedBlocks document return document @@ -380,6 +381,10 @@ exports.Parser = class Parser lastIndex = indentDepth for mark in markupOnLines[i] + # If we are not supposed to be flagging to remove, + # ignore markup that flags stuff to be removed. + continue if mark.token.container? and mark.token.container.flagToRemove and not opts.preserveEmpty + # Insert a text token for all the text up until this markup # (unless there is no such text unless lastIndex >= mark.location.column or lastIndex >= line.length From da34cc034ca86dbd89c7277aaa45b447d890439b Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 13:07:08 -0400 Subject: [PATCH 145/268] Forbid melting if it would destroy sockets --- src/antlr.coffee | 2 ++ src/controller.coffee | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/antlr.coffee b/src/antlr.coffee index e3f5f741..fa8dfd38 100644 --- a/src/antlr.coffee +++ b/src/antlr.coffee @@ -28,6 +28,8 @@ exports.createANTLRParser = (name, config, root) -> tokens = new antlr4.CommonTokenStream(lexer) parser = new ANTLR_PARSER_COLLECTION["#{name}Parser"]["#{name}Parser"](tokens) + parser._errHandler = new antlr4.error.BailErrorStrategy() + # Build the actual parse tree parser.buildParseTrees = true return transform parser[context]() diff --git a/src/controller.coffee b/src/controller.coffee index a40dac78..a9149aad 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -3388,8 +3388,27 @@ Editor::computePlaintextTranslationVectors = -> translationVectors: translationVectors } +Editor::checkAndHighlightEmptySockets = -> + head = @session.tree.start + ok = true + until head is @session.tree.end + if (head.type is 'socketStart' and head.next is head.container.end or + head.type is 'socketStart' and head.next.type is 'text' and head.next.value is '') and + head.container.emptyString isnt '' + @markBlock head.container, {color: '#F00'} + ok = false + head = head.next + return ok + Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -> if @session.currentlyUsingBlocks and not @currentlyAnimating + + # Forbid melting if there is an empty socket. If there is, + # highlight it in red. + if not @session.options.preserveEmpty and not @checkAndHighlightEmptySockets() + @redrawMain() + return + @hideDropdown() @fireEvent 'statechange', [false] @@ -4157,6 +4176,12 @@ Editor::setEditorState = (useBlocks) -> @resizeBlockMode(); @redrawMain() else + # Forbid melting if there is an empty socket. If there is, + # highlight it in red. + if not @session.options.preserveEmpty and not @checkAndHighlightEmptySockets() + @redrawMain() + return + @hideDropdown() paletteVisibleInNewState = @session?.paletteEnabled and @session.showPaletteInTextMode From f90e1048260688acca349a15a97464b45762f714 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 13:16:36 -0400 Subject: [PATCH 146/268] Fix bug --- src/controller.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controller.coffee b/src/controller.coffee index a9149aad..9174667f 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -4178,7 +4178,7 @@ Editor::setEditorState = (useBlocks) -> else # Forbid melting if there is an empty socket. If there is, # highlight it in red. - if not @session.options.preserveEmpty and not @checkAndHighlightEmptySockets() + if @session? and not @session.options.preserveEmpty and not @checkAndHighlightEmptySockets() @redrawMain() return From 40cdce65331ca80e5a02a7ca8819e82c0df265cf Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 13:42:55 -0400 Subject: [PATCH 147/268] Fix test --- test/src/jstest.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/jstest.coffee b/test/src/jstest.coffee index 52902f77..38f8d4e6 100644 --- a/test/src/jstest.coffee +++ b/test/src/jstest.coffee @@ -228,7 +228,7 @@ asyncTest 'JS empty indents', -> customJS = new JavaScript() code = 'if (__) {\n\n}' customSerialization = customJS.parse('if (__) {\n\n}') - stringifiedJS = customSerialization.stringify(customJS) + stringifiedJS = customSerialization.stringify() strictEqual(stringifiedJS, code) start() From 9f56434b073d7928724421ea28ae584701bded93 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 17:07:59 -0400 Subject: [PATCH 148/268] Add, and fix for, ANTLR reparse rule test. Note: breaks other ANTLR grammars. --- Gruntfile.coffee | 1 + antlr/C.g4 | 511 +- antlr/CListener.js | 774 +++ antlr/CParser.js | 12714 +++++++++++++++++++++++++++++++++++++----- src/antlr.coffee | 5 +- src/treewalk.coffee | 14 +- 6 files changed, 12746 insertions(+), 1273 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 8fdc8855..d51a29e8 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -93,6 +93,7 @@ module.exports = (grunt) -> ''' test: files: + 'test/js/ctest.js': ['test/src/ctest.coffee'] 'test/js/tests.js': ['test/src/tests.coffee'] 'test/js/uitest.js': ['test/src/uitest.coffee'] 'test/js/jstest.js': ['test/src/jstest.coffee'] diff --git a/antlr/C.g4 b/antlr/C.g4 index 0fc947cf..3569baf1 100644 --- a/antlr/C.g4 +++ b/antlr/C.g4 @@ -514,7 +514,7 @@ jumpStatement compilationUnit : translationUnit? EOF - | + | EOF ; translationUnit @@ -537,6 +537,515 @@ declarationList | declarationList declaration ; +primaryExpression_DropletFile + : Identifier EOF + | Constant EOF + | StringLiteral+ EOF + | '(' expression ')' EOF + | genericSelection EOF + | '__extension__'? '(' compoundStatement ')' // Blocks (GCC extension) EOF + | '__builtin_va_arg' '(' unaryExpression ',' typeName ')' EOF + | '__builtin_offsetof' '(' typeName ',' unaryExpression ')' EOF + ; + +genericSelection_DropletFile + : '_Generic' '(' assignmentExpression ',' genericAssocList ')' EOF + ; + +genericAssocList_DropletFile + : genericAssociation EOF + | genericAssocList ',' genericAssociation EOF + ; + +genericAssociation_DropletFile + : typeName ':' assignmentExpression EOF + | 'default' ':' assignmentExpression EOF + ; + +postfixExpression_DropletFile + : primaryExpression EOF + | postfixExpression '[' expression ']' EOF + | postfixExpression '(' argumentExpressionList? ')' EOF + | postfixExpression '.' Identifier EOF + | postfixExpression '->' Identifier EOF + | postfixExpression '++' EOF + | postfixExpression '--' EOF + | '(' typeName ')' '{' initializerList '}' EOF + | '(' typeName ')' '{' initializerList ',' '}' EOF + | '__extension__' '(' typeName ')' '{' initializerList '}' EOF + | '__extension__' '(' typeName ')' '{' initializerList ',' '}' EOF + ; + +argumentExpressionList_DropletFile + : assignmentExpression EOF + | argumentExpressionList ',' assignmentExpression EOF + ; + +unaryExpression_DropletFile + : postfixExpression EOF + | '++' unaryExpression EOF + | '--' unaryExpression EOF + | unaryOperator castExpression EOF + | 'sizeof' unaryExpression EOF + | 'sizeof' '(' typeName ')' EOF + | '_Alignof' '(' typeName ')' EOF + | '&&' Identifier // GCC extension address of label EOF + ; + +unaryOperator_DropletFile + : '&' | '*' | '+' | '-' | '~' | '!' EOF + ; + +castExpression_DropletFile + : unaryExpression EOF + | '(' typeName ')' castExpression EOF + | '__extension__' '(' typeName ')' castExpression EOF + ; + +multiplicativeExpression_DropletFile + : castExpression EOF + | multiplicativeExpression '*' castExpression EOF + | multiplicativeExpression '/' castExpression EOF + | multiplicativeExpression '%' castExpression EOF + ; + +additiveExpression_DropletFile + : multiplicativeExpression EOF + | additiveExpression '+' multiplicativeExpression EOF + | additiveExpression '-' multiplicativeExpression EOF + ; + +shiftExpression_DropletFile + : additiveExpression EOF + | shiftExpression '<<' additiveExpression EOF + | shiftExpression '>>' additiveExpression EOF + ; + +relationalExpression_DropletFile + : shiftExpression EOF + | relationalExpression '<' shiftExpression EOF + | relationalExpression '>' shiftExpression EOF + | relationalExpression '<=' shiftExpression EOF + | relationalExpression '>=' shiftExpression EOF + ; + +equalityExpression_DropletFile + : relationalExpression EOF + | equalityExpression '==' relationalExpression EOF + | equalityExpression '!=' relationalExpression EOF + ; + +andExpression_DropletFile + : equalityExpression EOF + | andExpression '&' equalityExpression EOF + ; + +exclusiveOrExpression_DropletFile + : andExpression EOF + | exclusiveOrExpression '^' andExpression EOF + ; + +inclusiveOrExpression_DropletFile + : exclusiveOrExpression EOF + | inclusiveOrExpression '|' exclusiveOrExpression EOF + ; + +logicalAndExpression_DropletFile + : inclusiveOrExpression EOF + | logicalAndExpression '&&' inclusiveOrExpression EOF + ; + +logicalOrExpression_DropletFile + : logicalAndExpression EOF + | logicalOrExpression '||' logicalAndExpression EOF + ; + +conditionalExpression_DropletFile + : logicalOrExpression ('?' expression ':' conditionalExpression)? EOF + ; + +assignmentExpression_DropletFile + : conditionalExpression EOF + | unaryExpression assignmentOperator assignmentExpression EOF + ; + +assignmentOperator_DropletFile + : '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' EOF + ; + +expression_DropletFile + : assignmentExpression EOF + | expression ',' assignmentExpression EOF + ; + +constantExpression_DropletFile + : conditionalExpression EOF + ; + +declaration_DropletFile + : declarationSpecifiers initDeclaratorList? ';' EOF + | staticAssertDeclaration EOF + ; + +declarationSpecifiers_DropletFile + : declarationSpecifier+ EOF + ; + +declarationSpecifiers2_DropletFile + : declarationSpecifier+ EOF + ; + +declarationSpecifier_DropletFile + : storageClassSpecifier EOF + | typeSpecifier EOF + | typeQualifier EOF + | functionSpecifier EOF + | alignmentSpecifier EOF + ; + +initDeclaratorList_DropletFile + : initDeclarator EOF + | initDeclaratorList ',' initDeclarator EOF + ; + +initDeclarator_DropletFile + : declarator EOF + | declarator '=' initializer EOF + ; + +storageClassSpecifier_DropletFile + : 'typedef' EOF + | 'extern' EOF + | 'static' EOF + | '_Thread_local' EOF + | 'auto' EOF + | 'register' EOF + ; + +typeSpecifier_DropletFile + : ('void' EOF + | 'char' EOF + | 'short' EOF + | 'int' EOF + | 'long' EOF + | 'float' EOF + | 'double' EOF + | 'signed' EOF + | 'unsigned' EOF + | '_Bool' EOF + | '_Complex' EOF + | '__m128' EOF + | '__m128d' EOF + | '__m128i') EOF + | '__extension__' '(' ('__m128' | '__m128d' | '__m128i') ')' EOF + | atomicTypeSpecifier EOF + | structOrUnionSpecifier EOF + | enumSpecifier EOF + | typedefName EOF + | '__typeof__' '(' constantExpression ')' // GCC extension EOF + ; + +structOrUnionSpecifier_DropletFile + : structOrUnion Identifier? structDeclarationsBlock EOF + | structOrUnion Identifier EOF + ; + +structOrUnion_DropletFile + : 'struct' EOF + | 'union' EOF + ; + + +structDeclarationsBlock_DropletFile + : '{' structDeclarationList '}' EOF + ; + +structDeclarationList_DropletFile + : structDeclaration EOF + | structDeclarationList structDeclaration EOF + ; + +structDeclaration_DropletFile + : specifierQualifierList structDeclaratorList? ';' EOF + | staticAssertDeclaration EOF + ; + +specifierQualifierList_DropletFile + : typeSpecifier specifierQualifierList? EOF + | typeQualifier specifierQualifierList? EOF + ; + +structDeclaratorList_DropletFile + : structDeclarator EOF + | structDeclaratorList ',' structDeclarator EOF + ; + +structDeclarator_DropletFile + : declarator EOF + | declarator? ':' constantExpression EOF + ; + +enumSpecifier_DropletFile + : 'enum' Identifier? '{' enumeratorList '}' EOF + | 'enum' Identifier? '{' enumeratorList ',' '}' EOF + | 'enum' Identifier EOF + ; + +enumeratorList_DropletFile + : enumerator EOF + | enumeratorList ',' enumerator EOF + ; + +enumerator_DropletFile + : enumerationConstant EOF + | enumerationConstant '=' constantExpression EOF + ; + +enumerationConstant_DropletFile + : Identifier EOF + ; + +atomicTypeSpecifier_DropletFile + : '_Atomic' '(' typeName ')' EOF + ; + +typeQualifier_DropletFile + : 'const' EOF + | 'restrict' EOF + | 'volatile' EOF + | '_Atomic' EOF + ; + +functionSpecifier_DropletFile + : ('inline' EOF + | '_Noreturn' EOF + | '__inline__' // GCC extension EOF + | '__stdcall') EOF + | gccAttributeSpecifier EOF + | '__declspec' '(' Identifier ')' EOF + ; + +alignmentSpecifier_DropletFile + : '_Alignas' '(' typeName ')' EOF + | '_Alignas' '(' constantExpression ')' EOF + ; + +declarator_DropletFile + : pointer? directDeclarator gccDeclaratorExtension* EOF + ; + +directDeclarator_DropletFile + : Identifier EOF + | '(' declarator ')' EOF + | directDeclarator '[' typeQualifierList? assignmentExpression? ']' EOF + | directDeclarator '[' 'static' typeQualifierList? assignmentExpression ']' EOF + | directDeclarator '[' typeQualifierList 'static' assignmentExpression ']' EOF + | directDeclarator '[' typeQualifierList? '*' ']' EOF + | directDeclarator '(' parameterTypeList ')' EOF + | directDeclarator '(' identifierList? ')' EOF + ; + +gccDeclaratorExtension_DropletFile + : '__asm' '(' StringLiteral+ ')' EOF + | gccAttributeSpecifier EOF + ; + +gccAttributeSpecifier_DropletFile + : '__attribute__' '(' '(' gccAttributeList ')' ')' EOF + ; + +gccAttributeList_DropletFile + : gccAttribute (',' gccAttribute)* EOF + | // empty EOF + ; + +gccAttribute_DropletFile + : ~(',' | '(' | ')') // relaxed def for "identifier or reserved word" EOF + ('(' argumentExpressionList? ')')? + | // empty EOF + ; + +nestedParenthesesBlock_DropletFile + : ( ~('(' | ')') EOF + | '(' nestedParenthesesBlock ')' EOF + )* + ; + +pointer_DropletFile + : '*' typeQualifierList? EOF + | '*' typeQualifierList? pointer EOF + | '^' typeQualifierList? // Blocks language extension EOF + | '^' typeQualifierList? pointer // Blocks language extension EOF + ; + +typeQualifierList_DropletFile + : typeQualifier EOF + | typeQualifierList typeQualifier EOF + ; + +parameterTypeList_DropletFile + : parameterList EOF + | parameterList ',' '...' EOF + ; + +parameterList_DropletFile + : parameterDeclaration EOF + | parameterList ',' parameterDeclaration EOF + ; + +parameterDeclaration_DropletFile + : declarationSpecifiers declarator EOF + | declarationSpecifiers2 abstractDeclarator? EOF + ; + +identifierList_DropletFile + : Identifier EOF + | identifierList ',' Identifier EOF + ; + +typeName_DropletFile + : specifierQualifierList abstractDeclarator? EOF + ; + +abstractDeclarator_DropletFile + : pointer EOF + | pointer? directAbstractDeclarator gccDeclaratorExtension* EOF + ; + +directAbstractDeclarator_DropletFile + : '(' abstractDeclarator ')' gccDeclaratorExtension* EOF + | '[' typeQualifierList? assignmentExpression? ']' EOF + | '[' 'static' typeQualifierList? assignmentExpression ']' EOF + | '[' typeQualifierList 'static' assignmentExpression ']' EOF + | '[' '*' ']' EOF + | '(' parameterTypeList? ')' gccDeclaratorExtension* EOF + | directAbstractDeclarator '[' typeQualifierList? assignmentExpression? ']' EOF + | directAbstractDeclarator '[' 'static' typeQualifierList? assignmentExpression ']' EOF + | directAbstractDeclarator '[' typeQualifierList 'static' assignmentExpression ']' EOF + | directAbstractDeclarator '[' '*' ']' EOF + | directAbstractDeclarator '(' parameterTypeList? ')' gccDeclaratorExtension* EOF + ; + +typedefName_DropletFile + : Identifier EOF + ; + +initializer_DropletFile + : assignmentExpression EOF + | '{' initializerList '}' EOF + | '{' initializerList ',' '}' EOF + ; + +initializerList_DropletFile + : designation? initializer EOF + | initializerList ',' designation? initializer EOF + ; + +designation_DropletFile + : designatorList '=' EOF + ; + +designatorList_DropletFile + : designator EOF + | designatorList designator EOF + ; + +designator_DropletFile + : '[' constantExpression ']' EOF + | '.' Identifier EOF + ; + +staticAssertDeclaration_DropletFile + : '_Static_assert' '(' constantExpression ',' StringLiteral+ ')' ';' EOF + ; + +statement_DropletFile + : labeledStatement EOF + | compoundStatement EOF + | expressionStatement EOF + | selectionStatement EOF + | iterationStatement EOF + | jumpStatement EOF + | ('__asm' | '__asm__') ('volatile' | '__volatile__') '(' (logicalOrExpression (',' logicalOrExpression)*)? (':' (logicalOrExpression (',' logicalOrExpression)*)?)* ')' ';' EOF + ; + +labeledStatement_DropletFile + : Identifier ':' statement EOF + | 'case' constantExpression ':' statement EOF + | 'default' ':' statement EOF + ; + +compoundStatement_DropletFile + : '{' blockItemList? '}' EOF + ; + +blockItemList_DropletFile + : blockItem EOF + | blockItemList blockItem EOF + ; + +// A block item can be a special kind of function call, which we +// check before we check declarations to avoid conflicts with a (b);. +blockItem_DropletFile + : specialMethodCall EOF + | declaration EOF + | statement EOF + | EOF + ; + +specialMethodCall_DropletFile + : Identifier '(' assignmentExpression ')' ';' EOF + ; + +expressionStatement_DropletFile + : expression? ';' EOF + ; + +selectionStatement_DropletFile + : 'if' '(' expression ')' statement ('else' statement)? EOF + | 'switch' '(' expression ')' statement EOF + ; + +iterationStatement_DropletFile + : 'while' '(' expression ')' statement EOF + | 'do' statement 'while' '(' expression ')' ';' EOF + | 'for' '(' expression? ';' expression? ';' expression? ')' statement EOF + | 'for' '(' declaration expression? ';' expression? ')' statement EOF + ; + +jumpStatement_DropletFile + : 'goto' Identifier ';' EOF + | 'continue' ';' EOF + | 'break' ';' EOF + | 'return' expression? ';' EOF + | 'goto' unaryExpression ';' // GCC extension EOF + ; + +compilationUnit_DropletFile + : translationUnit? EOF + | EOF + ; + +translationUnit_DropletFile + : externalDeclaration EOF + | translationUnit externalDeclaration EOF + ; + +externalDeclaration_DropletFile + : functionDefinition EOF + | declaration EOF + | ';' // stray ; EOF + ; + +functionDefinition_DropletFile + : declarationSpecifiers? declarator declarationList? compoundStatement EOF + ; + +declarationList_DropletFile + : declaration EOF + | declarationList declaration EOF + ; + Auto : 'auto'; Break : 'break'; Case : 'case'; diff --git a/antlr/CListener.js b/antlr/CListener.js index 69af17b0..98c5a591 100644 --- a/antlr/CListener.js +++ b/antlr/CListener.js @@ -785,5 +785,779 @@ CListener.prototype.exitDeclarationList = function(ctx) { }; +// Enter a parse tree produced by CParser#primaryExpression_DropletFile. +CListener.prototype.enterPrimaryExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#primaryExpression_DropletFile. +CListener.prototype.exitPrimaryExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#genericSelection_DropletFile. +CListener.prototype.enterGenericSelection_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#genericSelection_DropletFile. +CListener.prototype.exitGenericSelection_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#genericAssocList_DropletFile. +CListener.prototype.enterGenericAssocList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#genericAssocList_DropletFile. +CListener.prototype.exitGenericAssocList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#genericAssociation_DropletFile. +CListener.prototype.enterGenericAssociation_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#genericAssociation_DropletFile. +CListener.prototype.exitGenericAssociation_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#postfixExpression_DropletFile. +CListener.prototype.enterPostfixExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#postfixExpression_DropletFile. +CListener.prototype.exitPostfixExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#argumentExpressionList_DropletFile. +CListener.prototype.enterArgumentExpressionList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#argumentExpressionList_DropletFile. +CListener.prototype.exitArgumentExpressionList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#unaryExpression_DropletFile. +CListener.prototype.enterUnaryExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#unaryExpression_DropletFile. +CListener.prototype.exitUnaryExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#unaryOperator_DropletFile. +CListener.prototype.enterUnaryOperator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#unaryOperator_DropletFile. +CListener.prototype.exitUnaryOperator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#castExpression_DropletFile. +CListener.prototype.enterCastExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#castExpression_DropletFile. +CListener.prototype.exitCastExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#multiplicativeExpression_DropletFile. +CListener.prototype.enterMultiplicativeExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#multiplicativeExpression_DropletFile. +CListener.prototype.exitMultiplicativeExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#additiveExpression_DropletFile. +CListener.prototype.enterAdditiveExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#additiveExpression_DropletFile. +CListener.prototype.exitAdditiveExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#shiftExpression_DropletFile. +CListener.prototype.enterShiftExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#shiftExpression_DropletFile. +CListener.prototype.exitShiftExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#relationalExpression_DropletFile. +CListener.prototype.enterRelationalExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#relationalExpression_DropletFile. +CListener.prototype.exitRelationalExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#equalityExpression_DropletFile. +CListener.prototype.enterEqualityExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#equalityExpression_DropletFile. +CListener.prototype.exitEqualityExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#andExpression_DropletFile. +CListener.prototype.enterAndExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#andExpression_DropletFile. +CListener.prototype.exitAndExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#exclusiveOrExpression_DropletFile. +CListener.prototype.enterExclusiveOrExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#exclusiveOrExpression_DropletFile. +CListener.prototype.exitExclusiveOrExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#inclusiveOrExpression_DropletFile. +CListener.prototype.enterInclusiveOrExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#inclusiveOrExpression_DropletFile. +CListener.prototype.exitInclusiveOrExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#logicalAndExpression_DropletFile. +CListener.prototype.enterLogicalAndExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#logicalAndExpression_DropletFile. +CListener.prototype.exitLogicalAndExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#logicalOrExpression_DropletFile. +CListener.prototype.enterLogicalOrExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#logicalOrExpression_DropletFile. +CListener.prototype.exitLogicalOrExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#conditionalExpression_DropletFile. +CListener.prototype.enterConditionalExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#conditionalExpression_DropletFile. +CListener.prototype.exitConditionalExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#assignmentExpression_DropletFile. +CListener.prototype.enterAssignmentExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#assignmentExpression_DropletFile. +CListener.prototype.exitAssignmentExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#assignmentOperator_DropletFile. +CListener.prototype.enterAssignmentOperator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#assignmentOperator_DropletFile. +CListener.prototype.exitAssignmentOperator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#expression_DropletFile. +CListener.prototype.enterExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#expression_DropletFile. +CListener.prototype.exitExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#constantExpression_DropletFile. +CListener.prototype.enterConstantExpression_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#constantExpression_DropletFile. +CListener.prototype.exitConstantExpression_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#declaration_DropletFile. +CListener.prototype.enterDeclaration_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#declaration_DropletFile. +CListener.prototype.exitDeclaration_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#declarationSpecifiers_DropletFile. +CListener.prototype.enterDeclarationSpecifiers_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#declarationSpecifiers_DropletFile. +CListener.prototype.exitDeclarationSpecifiers_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#declarationSpecifiers2_DropletFile. +CListener.prototype.enterDeclarationSpecifiers2_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#declarationSpecifiers2_DropletFile. +CListener.prototype.exitDeclarationSpecifiers2_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#declarationSpecifier_DropletFile. +CListener.prototype.enterDeclarationSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#declarationSpecifier_DropletFile. +CListener.prototype.exitDeclarationSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#initDeclaratorList_DropletFile. +CListener.prototype.enterInitDeclaratorList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#initDeclaratorList_DropletFile. +CListener.prototype.exitInitDeclaratorList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#initDeclarator_DropletFile. +CListener.prototype.enterInitDeclarator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#initDeclarator_DropletFile. +CListener.prototype.exitInitDeclarator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#storageClassSpecifier_DropletFile. +CListener.prototype.enterStorageClassSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#storageClassSpecifier_DropletFile. +CListener.prototype.exitStorageClassSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#typeSpecifier_DropletFile. +CListener.prototype.enterTypeSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#typeSpecifier_DropletFile. +CListener.prototype.exitTypeSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#structOrUnionSpecifier_DropletFile. +CListener.prototype.enterStructOrUnionSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structOrUnionSpecifier_DropletFile. +CListener.prototype.exitStructOrUnionSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#structOrUnion_DropletFile. +CListener.prototype.enterStructOrUnion_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structOrUnion_DropletFile. +CListener.prototype.exitStructOrUnion_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#structDeclarationsBlock_DropletFile. +CListener.prototype.enterStructDeclarationsBlock_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structDeclarationsBlock_DropletFile. +CListener.prototype.exitStructDeclarationsBlock_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#structDeclarationList_DropletFile. +CListener.prototype.enterStructDeclarationList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structDeclarationList_DropletFile. +CListener.prototype.exitStructDeclarationList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#structDeclaration_DropletFile. +CListener.prototype.enterStructDeclaration_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structDeclaration_DropletFile. +CListener.prototype.exitStructDeclaration_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#specifierQualifierList_DropletFile. +CListener.prototype.enterSpecifierQualifierList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#specifierQualifierList_DropletFile. +CListener.prototype.exitSpecifierQualifierList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#structDeclaratorList_DropletFile. +CListener.prototype.enterStructDeclaratorList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structDeclaratorList_DropletFile. +CListener.prototype.exitStructDeclaratorList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#structDeclarator_DropletFile. +CListener.prototype.enterStructDeclarator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#structDeclarator_DropletFile. +CListener.prototype.exitStructDeclarator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#enumSpecifier_DropletFile. +CListener.prototype.enterEnumSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#enumSpecifier_DropletFile. +CListener.prototype.exitEnumSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#enumeratorList_DropletFile. +CListener.prototype.enterEnumeratorList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#enumeratorList_DropletFile. +CListener.prototype.exitEnumeratorList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#enumerator_DropletFile. +CListener.prototype.enterEnumerator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#enumerator_DropletFile. +CListener.prototype.exitEnumerator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#enumerationConstant_DropletFile. +CListener.prototype.enterEnumerationConstant_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#enumerationConstant_DropletFile. +CListener.prototype.exitEnumerationConstant_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#atomicTypeSpecifier_DropletFile. +CListener.prototype.enterAtomicTypeSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#atomicTypeSpecifier_DropletFile. +CListener.prototype.exitAtomicTypeSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#typeQualifier_DropletFile. +CListener.prototype.enterTypeQualifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#typeQualifier_DropletFile. +CListener.prototype.exitTypeQualifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#functionSpecifier_DropletFile. +CListener.prototype.enterFunctionSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#functionSpecifier_DropletFile. +CListener.prototype.exitFunctionSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#alignmentSpecifier_DropletFile. +CListener.prototype.enterAlignmentSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#alignmentSpecifier_DropletFile. +CListener.prototype.exitAlignmentSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#declarator_DropletFile. +CListener.prototype.enterDeclarator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#declarator_DropletFile. +CListener.prototype.exitDeclarator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#directDeclarator_DropletFile. +CListener.prototype.enterDirectDeclarator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#directDeclarator_DropletFile. +CListener.prototype.exitDirectDeclarator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#gccDeclaratorExtension_DropletFile. +CListener.prototype.enterGccDeclaratorExtension_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#gccDeclaratorExtension_DropletFile. +CListener.prototype.exitGccDeclaratorExtension_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#gccAttributeSpecifier_DropletFile. +CListener.prototype.enterGccAttributeSpecifier_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#gccAttributeSpecifier_DropletFile. +CListener.prototype.exitGccAttributeSpecifier_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#gccAttributeList_DropletFile. +CListener.prototype.enterGccAttributeList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#gccAttributeList_DropletFile. +CListener.prototype.exitGccAttributeList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#gccAttribute_DropletFile. +CListener.prototype.enterGccAttribute_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#gccAttribute_DropletFile. +CListener.prototype.exitGccAttribute_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#nestedParenthesesBlock_DropletFile. +CListener.prototype.enterNestedParenthesesBlock_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#nestedParenthesesBlock_DropletFile. +CListener.prototype.exitNestedParenthesesBlock_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#pointer_DropletFile. +CListener.prototype.enterPointer_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#pointer_DropletFile. +CListener.prototype.exitPointer_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#typeQualifierList_DropletFile. +CListener.prototype.enterTypeQualifierList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#typeQualifierList_DropletFile. +CListener.prototype.exitTypeQualifierList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#parameterTypeList_DropletFile. +CListener.prototype.enterParameterTypeList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#parameterTypeList_DropletFile. +CListener.prototype.exitParameterTypeList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#parameterList_DropletFile. +CListener.prototype.enterParameterList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#parameterList_DropletFile. +CListener.prototype.exitParameterList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#parameterDeclaration_DropletFile. +CListener.prototype.enterParameterDeclaration_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#parameterDeclaration_DropletFile. +CListener.prototype.exitParameterDeclaration_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#identifierList_DropletFile. +CListener.prototype.enterIdentifierList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#identifierList_DropletFile. +CListener.prototype.exitIdentifierList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#typeName_DropletFile. +CListener.prototype.enterTypeName_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#typeName_DropletFile. +CListener.prototype.exitTypeName_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#abstractDeclarator_DropletFile. +CListener.prototype.enterAbstractDeclarator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#abstractDeclarator_DropletFile. +CListener.prototype.exitAbstractDeclarator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#directAbstractDeclarator_DropletFile. +CListener.prototype.enterDirectAbstractDeclarator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#directAbstractDeclarator_DropletFile. +CListener.prototype.exitDirectAbstractDeclarator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#typedefName_DropletFile. +CListener.prototype.enterTypedefName_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#typedefName_DropletFile. +CListener.prototype.exitTypedefName_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#initializer_DropletFile. +CListener.prototype.enterInitializer_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#initializer_DropletFile. +CListener.prototype.exitInitializer_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#initializerList_DropletFile. +CListener.prototype.enterInitializerList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#initializerList_DropletFile. +CListener.prototype.exitInitializerList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#designation_DropletFile. +CListener.prototype.enterDesignation_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#designation_DropletFile. +CListener.prototype.exitDesignation_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#designatorList_DropletFile. +CListener.prototype.enterDesignatorList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#designatorList_DropletFile. +CListener.prototype.exitDesignatorList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#designator_DropletFile. +CListener.prototype.enterDesignator_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#designator_DropletFile. +CListener.prototype.exitDesignator_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#staticAssertDeclaration_DropletFile. +CListener.prototype.enterStaticAssertDeclaration_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#staticAssertDeclaration_DropletFile. +CListener.prototype.exitStaticAssertDeclaration_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#statement_DropletFile. +CListener.prototype.enterStatement_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#statement_DropletFile. +CListener.prototype.exitStatement_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#labeledStatement_DropletFile. +CListener.prototype.enterLabeledStatement_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#labeledStatement_DropletFile. +CListener.prototype.exitLabeledStatement_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#compoundStatement_DropletFile. +CListener.prototype.enterCompoundStatement_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#compoundStatement_DropletFile. +CListener.prototype.exitCompoundStatement_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#blockItemList_DropletFile. +CListener.prototype.enterBlockItemList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#blockItemList_DropletFile. +CListener.prototype.exitBlockItemList_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#blockItem_DropletFile. +CListener.prototype.enterBlockItem_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#blockItem_DropletFile. +CListener.prototype.exitBlockItem_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#specialMethodCall_DropletFile. +CListener.prototype.enterSpecialMethodCall_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#specialMethodCall_DropletFile. +CListener.prototype.exitSpecialMethodCall_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#expressionStatement_DropletFile. +CListener.prototype.enterExpressionStatement_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#expressionStatement_DropletFile. +CListener.prototype.exitExpressionStatement_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#selectionStatement_DropletFile. +CListener.prototype.enterSelectionStatement_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#selectionStatement_DropletFile. +CListener.prototype.exitSelectionStatement_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#iterationStatement_DropletFile. +CListener.prototype.enterIterationStatement_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#iterationStatement_DropletFile. +CListener.prototype.exitIterationStatement_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#jumpStatement_DropletFile. +CListener.prototype.enterJumpStatement_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#jumpStatement_DropletFile. +CListener.prototype.exitJumpStatement_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#compilationUnit_DropletFile. +CListener.prototype.enterCompilationUnit_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#compilationUnit_DropletFile. +CListener.prototype.exitCompilationUnit_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#translationUnit_DropletFile. +CListener.prototype.enterTranslationUnit_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#translationUnit_DropletFile. +CListener.prototype.exitTranslationUnit_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#externalDeclaration_DropletFile. +CListener.prototype.enterExternalDeclaration_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#externalDeclaration_DropletFile. +CListener.prototype.exitExternalDeclaration_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#functionDefinition_DropletFile. +CListener.prototype.enterFunctionDefinition_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#functionDefinition_DropletFile. +CListener.prototype.exitFunctionDefinition_DropletFile = function(ctx) { +}; + + +// Enter a parse tree produced by CParser#declarationList_DropletFile. +CListener.prototype.enterDeclarationList_DropletFile = function(ctx) { +}; + +// Exit a parse tree produced by CParser#declarationList_DropletFile. +CListener.prototype.exitDeclarationList_DropletFile = function(ctx) { +}; + + exports.CListener = CListener; \ No newline at end of file diff --git a/antlr/CParser.js b/antlr/CParser.js index 3f3fa027..f2c53b16 100644 --- a/antlr/CParser.js +++ b/antlr/CParser.js @@ -5,7 +5,7 @@ var CListener = require('./CListener').CListener; var grammarFileName = "C.g4"; var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\3s\u04f8\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", + "\3s\u0af4\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", "\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t", "\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27", "\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4", @@ -14,495 +14,1142 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\61\4\62\t\62\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t", "8\49\t9\4:\t:\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC", "\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4", - "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\3\2\3\2\3\2\6\2", - "\u00b2\n\2\r\2\16\2\u00b3\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u00bc\n\2\3\2", - "\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2", - "\5\2\u00d0\n\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7", - "\4\u00df\n\4\f\4\16\4\u00e2\13\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u00eb", - "\n\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", + "O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z", + "\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4", + "e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p", + "\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4y\ty\4z\tz\4{\t", + "{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080\4\u0081\t\u0081\4\u0082", + "\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086", + "\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a\4\u008b", + "\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e\t\u008e\4\u008f\t\u008f", + "\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092\4\u0093\t\u0093\4\u0094", + "\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098\t\u0098", + "\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b\4\u009c\t\u009c\4\u009d", + "\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0\t\u00a0\4\u00a1\t\u00a1", + "\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4\4\u00a5\t\u00a5\4\u00a6", + "\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9\t\u00a9\4\u00aa\t\u00aa", + "\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad\3\2\3\2\3\2\6\2\u015e", + "\n\2\r\2\16\2\u015f\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u0168\n\2\3\2\3\2\3", + "\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2\u017c", + "\n\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u018b\n", + "\4\f\4\16\4\u018e\13\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u0197\n\5\3\6", "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6", - "\3\6\5\6\u010f\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0119\n\6\3\6", - "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u0126\n\6\f\6\16\6\u0129", - "\13\6\3\7\3\7\3\7\3\7\3\7\3\7\7\7\u0131\n\7\f\7\16\7\u0134\13\7\3\b", + "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6", + "\u01bb\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u01c5\n\6\3\6\3\6\3\6", + "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u01d2\n\6\f\6\16\6\u01d5\13\6\3", + "\7\3\7\3\7\3\7\3\7\3\7\7\7\u01dd\n\7\f\7\16\7\u01e0\13\7\3\b\3\b\3\b", "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", - "\3\b\3\b\3\b\3\b\5\b\u014c\n\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3", - "\n\3\n\3\n\3\n\3\n\5\n\u015c\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13", - "\3\13\3\13\3\13\3\13\3\13\7\13\u016a\n\13\f\13\16\13\u016d\13\13\3\f", - "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\7\f\u0178\n\f\f\f\16\f\u017b\13\f\3", - "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\7\r\u0186\n\r\f\r\16\r\u0189\13\r", - "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3", - "\16\3\16\7\16\u019a\n\16\f\16\16\16\u019d\13\16\3\17\3\17\3\17\3\17", - "\3\17\3\17\3\17\3\17\3\17\7\17\u01a8\n\17\f\17\16\17\u01ab\13\17\3\20", - "\3\20\3\20\3\20\3\20\3\20\7\20\u01b3\n\20\f\20\16\20\u01b6\13\20\3\21", - "\3\21\3\21\3\21\3\21\3\21\7\21\u01be\n\21\f\21\16\21\u01c1\13\21\3\22", - "\3\22\3\22\3\22\3\22\3\22\7\22\u01c9\n\22\f\22\16\22\u01cc\13\22\3\23", - "\3\23\3\23\3\23\3\23\3\23\7\23\u01d4\n\23\f\23\16\23\u01d7\13\23\3\24", - "\3\24\3\24\3\24\3\24\3\24\7\24\u01df\n\24\f\24\16\24\u01e2\13\24\3\25", - "\3\25\3\25\3\25\3\25\3\25\5\25\u01ea\n\25\3\26\3\26\3\26\3\26\3\26\5", - "\26\u01f1\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01fb\n", - "\30\f\30\16\30\u01fe\13\30\3\31\3\31\3\32\3\32\5\32\u0204\n\32\3\32", - "\3\32\3\32\5\32\u0209\n\32\3\33\6\33\u020c\n\33\r\33\16\33\u020d\3\34", - "\6\34\u0211\n\34\r\34\16\34\u0212\3\35\3\35\3\35\3\35\3\35\5\35\u021a", - "\n\35\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0222\n\36\f\36\16\36\u0225", - "\13\36\3\37\3\37\3\37\3\37\3\37\5\37\u022c\n\37\3 \3 \3!\3!\3!\3!\3", - "!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u023e\n!\3\"\3\"\5\"\u0242\n\"\3\"\3", - "\"\3\"\3\"\3\"\5\"\u0249\n\"\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%\7%\u0256", - "\n%\f%\16%\u0259\13%\3&\3&\5&\u025d\n&\3&\3&\3&\5&\u0262\n&\3\'\3\'", - "\5\'\u0266\n\'\3\'\3\'\5\'\u026a\n\'\5\'\u026c\n\'\3(\3(\3(\3(\3(\3", - "(\7(\u0274\n(\f(\16(\u0277\13(\3)\3)\5)\u027b\n)\3)\3)\5)\u027f\n)\3", - "*\3*\5*\u0283\n*\3*\3*\3*\3*\3*\3*\5*\u028b\n*\3*\3*\3*\3*\3*\3*\3*", - "\5*\u0294\n*\3+\3+\3+\3+\3+\3+\7+\u029c\n+\f+\16+\u029f\13+\3,\3,\3", - ",\3,\3,\5,\u02a6\n,\3-\3-\3.\3.\3.\3.\3.\3/\3/\3\60\3\60\3\60\3\60\3", - "\60\3\60\5\60\u02b7\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61", - "\3\61\5\61\u02c3\n\61\3\62\5\62\u02c6\n\62\3\62\3\62\7\62\u02ca\n\62", - "\f\62\16\62\u02cd\13\62\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u02d5\n\63", - "\3\63\3\63\3\63\5\63\u02da\n\63\3\63\5\63\u02dd\n\63\3\63\3\63\3\63", - "\3\63\3\63\5\63\u02e4\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", - "\63\3\63\3\63\3\63\3\63\5\63\u02f3\n\63\3\63\3\63\3\63\3\63\3\63\3\63", - "\3\63\3\63\3\63\3\63\5\63\u02ff\n\63\3\63\7\63\u0302\n\63\f\63\16\63", - "\u0305\13\63\3\64\3\64\3\64\6\64\u030a\n\64\r\64\16\64\u030b\3\64\3", - "\64\5\64\u0310\n\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66", - "\7\66\u031c\n\66\f\66\16\66\u031f\13\66\3\66\5\66\u0322\n\66\3\67\3", - "\67\3\67\5\67\u0327\n\67\3\67\5\67\u032a\n\67\3\67\5\67\u032d\n\67\3", - "8\38\38\38\38\78\u0334\n8\f8\168\u0337\138\39\39\59\u033b\n9\39\39\5", - "9\u033f\n9\39\39\39\59\u0344\n9\39\39\59\u0348\n9\39\59\u034b\n9\3:", - "\3:\3:\3:\3:\7:\u0352\n:\f:\16:\u0355\13:\3;\3;\3;\3;\3;\5;\u035c\n", - ";\3<\3<\3<\3<\3<\3<\7<\u0364\n<\f<\16<\u0367\13<\3=\3=\3=\3=\3=\5=\u036e", - "\n=\5=\u0370\n=\3>\3>\3>\3>\3>\3>\7>\u0378\n>\f>\16>\u037b\13>\3?\3", - "?\5?\u037f\n?\3@\3@\5@\u0383\n@\3@\3@\7@\u0387\n@\f@\16@\u038a\13@\5", - "@\u038c\n@\3A\3A\3A\3A\3A\7A\u0393\nA\fA\16A\u0396\13A\3A\3A\5A\u039a", - "\nA\3A\5A\u039d\nA\3A\3A\3A\3A\5A\u03a3\nA\3A\3A\3A\3A\3A\3A\3A\3A\3", - "A\3A\3A\3A\3A\3A\5A\u03b3\nA\3A\3A\7A\u03b7\nA\fA\16A\u03ba\13A\5A\u03bc", - "\nA\3A\3A\3A\5A\u03c1\nA\3A\5A\u03c4\nA\3A\3A\3A\3A\3A\5A\u03cb\nA\3", - "A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\5A\u03de\nA\3A\3A", - "\7A\u03e2\nA\fA\16A\u03e5\13A\7A\u03e7\nA\fA\16A\u03ea\13A\3B\3B\3C", - "\3C\3C\3C\3C\3C\3C\3C\3C\3C\5C\u03f8\nC\3D\3D\5D\u03fc\nD\3D\3D\3D\3", - "D\3D\5D\u0403\nD\3D\7D\u0406\nD\fD\16D\u0409\13D\3E\3E\3E\3F\3F\3F\3", - "F\3F\7F\u0413\nF\fF\16F\u0416\13F\3G\3G\3G\3G\3G\3G\5G\u041e\nG\3H\3", - "H\3H\3H\3H\6H\u0425\nH\rH\16H\u0426\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3", - "I\3I\3I\3I\3I\7I\u0438\nI\fI\16I\u043b\13I\5I\u043d\nI\3I\3I\3I\3I\7", - "I\u0443\nI\fI\16I\u0446\13I\5I\u0448\nI\7I\u044a\nI\fI\16I\u044d\13", - "I\3I\3I\5I\u0451\nI\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u045e\nJ\3K", - "\3K\5K\u0462\nK\3K\3K\3L\3L\3L\3L\3L\7L\u046b\nL\fL\16L\u046e\13L\3", - "M\3M\3M\5M\u0473\nM\3N\3N\3N\3N\3N\3N\3O\5O\u047c\nO\3O\3O\3P\3P\3P", - "\3P\3P\3P\3P\5P\u0487\nP\3P\3P\3P\3P\3P\3P\5P\u048f\nP\3Q\3Q\3Q\3Q\3", - "Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u04a2\nQ\3Q\3Q\5Q\u04a6\nQ", - "\3Q\3Q\5Q\u04aa\nQ\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u04b2\nQ\3Q\3Q\5Q\u04b6\nQ\3", - "Q\3Q\3Q\5Q\u04bb\nQ\3R\3R\3R\3R\3R\3R\3R\3R\3R\5R\u04c6\nR\3R\3R\3R", - "\3R\3R\5R\u04cd\nR\3S\5S\u04d0\nS\3S\3S\5S\u04d4\nS\3T\3T\3T\3T\3T\7", - "T\u04db\nT\fT\16T\u04de\13T\3U\3U\3U\5U\u04e3\nU\3V\5V\u04e6\nV\3V\3", - "V\5V\u04ea\nV\3V\3V\3W\3W\3W\3W\3W\7W\u04f3\nW\fW\16W\u04f6\13W\3W\2", - "\36\6\n\f\24\26\30\32\34\36 \"$&.:HNTdrvz\u0080\u0086\u008a\u0096\u00a6", - "\u00acX\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66", - "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\2\16\7\2IIKKMMPPUV\3\2[e\b\2\21", + "\3\b\3\b\5\b\u01f8\n\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3", + "\n\3\n\3\n\5\n\u0208\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13", + "\3\13\3\13\3\13\7\13\u0216\n\13\f\13\16\13\u0219\13\13\3\f\3\f\3\f\3", + "\f\3\f\3\f\3\f\3\f\3\f\7\f\u0224\n\f\f\f\16\f\u0227\13\f\3\r\3\r\3\r", + "\3\r\3\r\3\r\3\r\3\r\3\r\7\r\u0232\n\r\f\r\16\r\u0235\13\r\3\16\3\16", + "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\7", + "\16\u0246\n\16\f\16\16\16\u0249\13\16\3\17\3\17\3\17\3\17\3\17\3\17", + "\3\17\3\17\3\17\7\17\u0254\n\17\f\17\16\17\u0257\13\17\3\20\3\20\3\20", + "\3\20\3\20\3\20\7\20\u025f\n\20\f\20\16\20\u0262\13\20\3\21\3\21\3\21", + "\3\21\3\21\3\21\7\21\u026a\n\21\f\21\16\21\u026d\13\21\3\22\3\22\3\22", + "\3\22\3\22\3\22\7\22\u0275\n\22\f\22\16\22\u0278\13\22\3\23\3\23\3\23", + "\3\23\3\23\3\23\7\23\u0280\n\23\f\23\16\23\u0283\13\23\3\24\3\24\3\24", + "\3\24\3\24\3\24\7\24\u028b\n\24\f\24\16\24\u028e\13\24\3\25\3\25\3\25", + "\3\25\3\25\3\25\5\25\u0296\n\25\3\26\3\26\3\26\3\26\3\26\5\26\u029d", + "\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u02a7\n\30\f\30\16", + "\30\u02aa\13\30\3\31\3\31\3\32\3\32\5\32\u02b0\n\32\3\32\3\32\3\32\5", + "\32\u02b5\n\32\3\33\6\33\u02b8\n\33\r\33\16\33\u02b9\3\34\6\34\u02bd", + "\n\34\r\34\16\34\u02be\3\35\3\35\3\35\3\35\3\35\5\35\u02c6\n\35\3\36", + "\3\36\3\36\3\36\3\36\3\36\7\36\u02ce\n\36\f\36\16\36\u02d1\13\36\3\37", + "\3\37\3\37\3\37\3\37\5\37\u02d8\n\37\3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3", + "!\3!\3!\3!\3!\3!\5!\u02ea\n!\3\"\3\"\5\"\u02ee\n\"\3\"\3\"\3\"\3\"\3", + "\"\5\"\u02f5\n\"\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%\7%\u0302\n%\f%\16", + "%\u0305\13%\3&\3&\5&\u0309\n&\3&\3&\3&\5&\u030e\n&\3\'\3\'\5\'\u0312", + "\n\'\3\'\3\'\5\'\u0316\n\'\5\'\u0318\n\'\3(\3(\3(\3(\3(\3(\7(\u0320", + "\n(\f(\16(\u0323\13(\3)\3)\5)\u0327\n)\3)\3)\5)\u032b\n)\3*\3*\5*\u032f", + "\n*\3*\3*\3*\3*\3*\3*\5*\u0337\n*\3*\3*\3*\3*\3*\3*\3*\5*\u0340\n*\3", + "+\3+\3+\3+\3+\3+\7+\u0348\n+\f+\16+\u034b\13+\3,\3,\3,\3,\3,\5,\u0352", + "\n,\3-\3-\3.\3.\3.\3.\3.\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u0363", + "\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u036f\n", + "\61\3\62\5\62\u0372\n\62\3\62\3\62\7\62\u0376\n\62\f\62\16\62\u0379", + "\13\62\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u0381\n\63\3\63\3\63\3\63", + "\5\63\u0386\n\63\3\63\5\63\u0389\n\63\3\63\3\63\3\63\3\63\3\63\5\63", + "\u0390\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", + "\63\3\63\5\63\u039f\n\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63", + "\3\63\5\63\u03ab\n\63\3\63\7\63\u03ae\n\63\f\63\16\63\u03b1\13\63\3", + "\64\3\64\3\64\6\64\u03b6\n\64\r\64\16\64\u03b7\3\64\3\64\5\64\u03bc", + "\n\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\7\66\u03c8\n", + "\66\f\66\16\66\u03cb\13\66\3\66\5\66\u03ce\n\66\3\67\3\67\3\67\5\67", + "\u03d3\n\67\3\67\5\67\u03d6\n\67\3\67\5\67\u03d9\n\67\38\38\38\38\3", + "8\78\u03e0\n8\f8\168\u03e3\138\39\39\59\u03e7\n9\39\39\59\u03eb\n9\3", + "9\39\39\59\u03f0\n9\39\39\59\u03f4\n9\39\59\u03f7\n9\3:\3:\3:\3:\3:", + "\7:\u03fe\n:\f:\16:\u0401\13:\3;\3;\3;\3;\3;\5;\u0408\n;\3<\3<\3<\3", + "<\3<\3<\7<\u0410\n<\f<\16<\u0413\13<\3=\3=\3=\3=\3=\5=\u041a\n=\5=\u041c", + "\n=\3>\3>\3>\3>\3>\3>\7>\u0424\n>\f>\16>\u0427\13>\3?\3?\5?\u042b\n", + "?\3@\3@\5@\u042f\n@\3@\3@\7@\u0433\n@\f@\16@\u0436\13@\5@\u0438\n@\3", + "A\3A\3A\3A\3A\7A\u043f\nA\fA\16A\u0442\13A\3A\3A\5A\u0446\nA\3A\5A\u0449", + "\nA\3A\3A\3A\3A\5A\u044f\nA\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3", + "A\5A\u045f\nA\3A\3A\7A\u0463\nA\fA\16A\u0466\13A\5A\u0468\nA\3A\3A\3", + "A\5A\u046d\nA\3A\5A\u0470\nA\3A\3A\3A\3A\3A\5A\u0477\nA\3A\3A\3A\3A", + "\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\5A\u048a\nA\3A\3A\7A\u048e\n", + "A\fA\16A\u0491\13A\7A\u0493\nA\fA\16A\u0496\13A\3B\3B\3C\3C\3C\3C\3", + "C\3C\3C\3C\3C\3C\5C\u04a4\nC\3D\3D\5D\u04a8\nD\3D\3D\3D\3D\3D\5D\u04af", + "\nD\3D\7D\u04b2\nD\fD\16D\u04b5\13D\3E\3E\3E\3F\3F\3F\3F\3F\7F\u04bf", + "\nF\fF\16F\u04c2\13F\3G\3G\3G\3G\3G\3G\5G\u04ca\nG\3H\3H\3H\3H\3H\6", + "H\u04d1\nH\rH\16H\u04d2\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3", + "I\7I\u04e4\nI\fI\16I\u04e7\13I\5I\u04e9\nI\3I\3I\3I\3I\7I\u04ef\nI\f", + "I\16I\u04f2\13I\5I\u04f4\nI\7I\u04f6\nI\fI\16I\u04f9\13I\3I\3I\5I\u04fd", + "\nI\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u050a\nJ\3K\3K\5K\u050e\nK\3", + "K\3K\3L\3L\3L\3L\3L\7L\u0517\nL\fL\16L\u051a\13L\3M\3M\3M\5M\u051f\n", + "M\3N\3N\3N\3N\3N\3N\3O\5O\u0528\nO\3O\3O\3P\3P\3P\3P\3P\3P\3P\5P\u0533", + "\nP\3P\3P\3P\3P\3P\3P\5P\u053b\nP\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3", + "Q\3Q\3Q\3Q\3Q\3Q\5Q\u054e\nQ\3Q\3Q\5Q\u0552\nQ\3Q\3Q\5Q\u0556\nQ\3Q", + "\3Q\3Q\3Q\3Q\3Q\5Q\u055e\nQ\3Q\3Q\5Q\u0562\nQ\3Q\3Q\3Q\5Q\u0567\nQ\3", + "R\3R\3R\3R\3R\3R\3R\3R\3R\5R\u0572\nR\3R\3R\3R\3R\3R\5R\u0579\nR\3S", + "\5S\u057c\nS\3S\3S\5S\u0580\nS\3T\3T\3T\3T\3T\7T\u0587\nT\fT\16T\u058a", + "\13T\3U\3U\3U\5U\u058f\nU\3V\5V\u0592\nV\3V\3V\5V\u0596\nV\3V\3V\3W", + "\3W\3W\3W\3W\7W\u059f\nW\fW\16W\u05a2\13W\3X\3X\3X\3X\3X\6X\u05a9\n", + "X\rX\16X\u05aa\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\5X\u05b7\nX\3X\3X\3X\3", + "X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\5X\u05cd\nX\3Y\3Y", + "\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u05df\nZ\3[\3[\3[\3[\3", + "[\3[\3[\3[\3[\3[\5[\u05eb\n[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\", + "\3\\\3\\\5\\\u05f9\n\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3", + "\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3", + "\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3", + "\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\\u0634\n\\\3]\3]\3", + "]\3]\3]\3]\3]\3]\5]\u063e\n]\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^", + "\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\5^\u0661", + "\n^\3_\3_\3_\3_\3_\3_\3_\5_\u066a\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3", + "`\3`\3`\3`\3`\3`\5`\u067c\n`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a", + "\3a\3a\3a\3a\3a\5a\u0690\na\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\5", + "b\u069f\nb\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u06ae\nc\3d\3d", + "\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\3d\5d\u06c7", + "\nd\3e\3e\3e\3e\3e\3e\3e\3e\3e\3e\3e\3e\3e\5e\u06d6\ne\3f\3f\3f\3f\3", + "f\3f\3f\3f\5f\u06e0\nf\3g\3g\3g\3g\3g\3g\3g\3g\5g\u06ea\ng\3h\3h\3h", + "\3h\3h\3h\3h\3h\5h\u06f4\nh\3i\3i\3i\3i\3i\3i\3i\3i\5i\u06fe\ni\3j\3", + "j\3j\3j\3j\3j\3j\3j\5j\u0708\nj\3k\3k\3k\3k\3k\3k\5k\u0710\nk\3k\3k", + "\3l\3l\3l\3l\3l\3l\3l\3l\5l\u071c\nl\3m\3m\3m\3m\3m\3m\3m\3m\3m\3m\3", + "m\3m\5m\u072a\nm\3n\3n\3n\3n\3n\3n\3n\3n\5n\u0734\nn\3o\3o\3o\3p\3p", + "\5p\u073b\np\3p\3p\3p\3p\3p\3p\5p\u0743\np\3q\6q\u0746\nq\rq\16q\u0747", + "\3q\3q\3r\6r\u074d\nr\rr\16r\u074e\3r\3r\3s\3s\3s\3s\3s\3s\3s\3s\3s", + "\3s\3s\3s\3s\3s\3s\5s\u0762\ns\3t\3t\3t\3t\3t\3t\3t\3t\5t\u076c\nt\3", + "u\3u\3u\3u\3u\3u\3u\3u\5u\u0776\nu\3v\3v\3v\3v\3v\3v\3v\3v\3v\3v\3v", + "\3v\5v\u0784\nv\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3", + "w\3w\3w\3w\3w\3w\3w\3w\3w\3w\5w\u07a1\nw\3w\3w\3w\3w\3w\3w\3w\3w\3w", + "\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\3w\5w\u07ba\nw\3x\3x\5x\u07be", + "\nx\3x\3x\3x\3x\3x\3x\3x\5x\u07c7\nx\3y\3y\3y\3y\5y\u07cd\ny\3z\3z\3", + "z\3z\3z\3{\3{\3{\3{\3{\3{\3{\5{\u07db\n{\3|\3|\5|\u07df\n|\3|\3|\3|", + "\3|\3|\3|\5|\u07e7\n|\3}\3}\5}\u07eb\n}\3}\3}\3}\3}\5}\u07f1\n}\3}\3", + "}\5}\u07f5\n}\3~\3~\3~\3~\3~\3~\3~\3~\5~\u07ff\n~\3\177\3\177\3\177", + "\3\177\5\177\u0805\n\177\3\177\3\177\3\177\3\177\5\177\u080b\n\177\3", + "\u0080\3\u0080\5\u0080\u080f\n\u0080\3\u0080\3\u0080\3\u0080\3\u0080", + "\3\u0080\3\u0080\3\u0080\5\u0080\u0818\n\u0080\3\u0080\3\u0080\3\u0080", + "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\5\u0080\u0823\n\u0080", + "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\5\u0081", + "\u082d\n\u0081\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082", + "\3\u0082\5\u0082\u0837\n\u0082\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084", + "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085", + "\3\u0085\3\u0085\3\u0085\5\u0085\u084a\n\u0085\3\u0086\3\u0086\3\u0086", + "\3\u0086\3\u0086\3\u0086\5\u0086\u0852\n\u0086\3\u0086\3\u0086\3\u0086", + "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u085d\n\u0086", + "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087", + "\3\u0087\3\u0087\3\u0087\5\u0087\u086b\n\u0087\3\u0088\5\u0088\u086e", + "\n\u0088\3\u0088\3\u0088\7\u0088\u0872\n\u0088\f\u0088\16\u0088\u0875", + "\13\u0088\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3", + "\u0089\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u0883\n\u0089\3\u0089", + "\5\u0089\u0886\n\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089", + "\3\u0089\5\u0089\u088f\n\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089", + "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089", + "\3\u0089\5\u0089\u08a0\n\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089", + "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089", + "\u08af\n\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u08b4\n\u0089\3\u008a", + "\3\u008a\3\u008a\6\u008a\u08b9\n\u008a\r\u008a\16\u008a\u08ba\3\u008a", + "\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u08c2\n\u008a\3\u008b\3\u008b", + "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c", + "\7\u008c\u08cf\n\u008c\f\u008c\16\u008c\u08d2\13\u008c\3\u008c\3\u008c", + "\3\u008c\5\u008c\u08d7\n\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u08dc", + "\n\u008d\3\u008d\5\u008d\u08df\n\u008d\3\u008d\5\u008d\u08e2\n\u008d", + "\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\7\u008e\u08eb", + "\n\u008e\f\u008e\16\u008e\u08ee\13\u008e\3\u008f\3\u008f\5\u008f\u08f2", + "\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u08f7\n\u008f\3\u008f\3\u008f", + "\3\u008f\3\u008f\3\u008f\5\u008f\u08fe\n\u008f\3\u008f\3\u008f\5\u008f", + "\u0902\n\u008f\3\u008f\5\u008f\u0905\n\u008f\3\u0090\3\u0090\3\u0090", + "\3\u0090\3\u0090\3\u0090\3\u0090\5\u0090\u090e\n\u0090\3\u0091\3\u0091", + "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u0918\n\u0091", + "\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\5\u0092", + "\u0922\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\5\u0093", + "\u092a\n\u0093\3\u0093\3\u0093\5\u0093\u092e\n\u0093\3\u0094\3\u0094", + "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\5\u0094\u0937\n\u0094\3\u0095", + "\3\u0095\5\u0095\u093b\n\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096", + "\3\u0096\5\u0096\u0943\n\u0096\3\u0096\3\u0096\7\u0096\u0947\n\u0096", + "\f\u0096\16\u0096\u094a\13\u0096\3\u0096\3\u0096\5\u0096\u094e\n\u0096", + "\3\u0097\3\u0097\3\u0097\3\u0097\7\u0097\u0954\n\u0097\f\u0097\16\u0097", + "\u0957\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u095d\n\u0097", + "\3\u0097\5\u0097\u0960\n\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097", + "\5\u0097\u0967\n\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097", + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097", + "\3\u0097\3\u0097\5\u0097\u097a\n\u0097\3\u0097\3\u0097\7\u0097\u097e", + "\n\u0097\f\u0097\16\u0097\u0981\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097", + "\5\u0097\u0987\n\u0097\3\u0097\5\u0097\u098a\n\u0097\3\u0097\3\u0097", + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0993\n\u0097\3\u0097", + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097", + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097", + "\3\u0097\3\u0097\5\u0097\u09aa\n\u0097\3\u0097\3\u0097\7\u0097\u09ae", + "\n\u0097\f\u0097\16\u0097\u09b1\13\u0097\3\u0097\3\u0097\5\u0097\u09b5", + "\n\u0097\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099", + "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099", + "\5\u0099\u09c8\n\u0099\3\u009a\5\u009a\u09cb\n\u009a\3\u009a\3\u009a", + "\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u09d3\n\u009a\3\u009a\3\u009a", + "\3\u009a\5\u009a\u09d8\n\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c", + "\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u09e5\n\u009c", + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\5\u009d", + "\u09ef\n\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\6\u009e\u09f6", + "\n\u009e\r\u009e\16\u009e\u09f7\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f", + "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f", + "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f", + "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\7\u009f\u0a16\n\u009f\f\u009f", + "\16\u009f\u0a19\13\u009f\5\u009f\u0a1b\n\u009f\3\u009f\3\u009f\3\u009f", + "\3\u009f\7\u009f\u0a21\n\u009f\f\u009f\16\u009f\u0a24\13\u009f\5\u009f", + "\u0a26\n\u009f\7\u009f\u0a28\n\u009f\f\u009f\16\u009f\u0a2b\13\u009f", + "\3\u009f\3\u009f\3\u009f\5\u009f\u0a30\n\u009f\3\u00a0\3\u00a0\3\u00a0", + "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0", + "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u0a42\n\u00a0\3\u00a1\3\u00a1", + "\5\u00a1\u0a46\n\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2", + "\3\u00a2\3\u00a2\3\u00a2\3\u00a2\5\u00a2\u0a52\n\u00a2\3\u00a3\3\u00a3", + "\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\5\u00a3", + "\u0a5e\n\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4", + "\3\u00a5\5\u00a5\u0a68\n\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6", + "\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u0a74\n\u00a6\3\u00a6", + "\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\5\u00a6", + "\u0a7f\n\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7", + "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7", + "\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u0a94\n\u00a7\3\u00a7\3\u00a7\5\u00a7", + "\u0a98\n\u00a7\3\u00a7\3\u00a7\5\u00a7\u0a9c\n\u00a7\3\u00a7\3\u00a7", + "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u0aa6\n\u00a7", + "\3\u00a7\3\u00a7\5\u00a7\u0aaa\n\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7", + "\5\u00a7\u0ab0\n\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8", + "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8\u0abe\n\u00a8", + "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8\u0ac6\n\u00a8", + "\3\u00a9\5\u00a9\u0ac9\n\u00a9\3\u00a9\3\u00a9\5\u00a9\u0acd\n\u00a9", + "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u0ad6", + "\n\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u00ab", + "\u0adf\n\u00ab\3\u00ac\5\u00ac\u0ae2\n\u00ac\3\u00ac\3\u00ac\5\u00ac", + "\u0ae6\n\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad", + "\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u0af2\n\u00ad\3\u00ad\2\36\6\n\f\24", + "\26\30\32\34\36 \"$&.:HNTdrvz\u0080\u0086\u008a\u0096\u00a6\u00ac\u00ae", + "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BD", + "FHJLNPRTVXZ\\^`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\2\16\7\2IIKKMMPPUV\3\2[e\b\2\21", "\21\34\34$$**--<<\n\2\6\b\24\24\31\31\35\35\"#\'(/\60\66\67\3\2\6\b", "\4\2++..\6\2\25\25%%\61\61\65\65\5\2\n\13!!::\4\2=>ZZ\3\2=>\4\2\r\r", - "\17\17\4\2\20\20\61\61\u0568\2\u00cf\3\2\2\2\4\u00d1\3\2\2\2\6\u00d8", - "\3\2\2\2\b\u00ea\3\2\2\2\n\u010e\3\2\2\2\f\u012a\3\2\2\2\16\u014b\3", - "\2\2\2\20\u014d\3\2\2\2\22\u015b\3\2\2\2\24\u015d\3\2\2\2\26\u016e\3", - "\2\2\2\30\u017c\3\2\2\2\32\u018a\3\2\2\2\34\u019e\3\2\2\2\36\u01ac\3", - "\2\2\2 \u01b7\3\2\2\2\"\u01c2\3\2\2\2$\u01cd\3\2\2\2&\u01d8\3\2\2\2", - "(\u01e3\3\2\2\2*\u01f0\3\2\2\2,\u01f2\3\2\2\2.\u01f4\3\2\2\2\60\u01ff", - "\3\2\2\2\62\u0208\3\2\2\2\64\u020b\3\2\2\2\66\u0210\3\2\2\28\u0219\3", - "\2\2\2:\u021b\3\2\2\2<\u022b\3\2\2\2>\u022d\3\2\2\2@\u023d\3\2\2\2B", - "\u0248\3\2\2\2D\u024a\3\2\2\2F\u024c\3\2\2\2H\u0250\3\2\2\2J\u0261\3", - "\2\2\2L\u026b\3\2\2\2N\u026d\3\2\2\2P\u027e\3\2\2\2R\u0293\3\2\2\2T", - "\u0295\3\2\2\2V\u02a5\3\2\2\2X\u02a7\3\2\2\2Z\u02a9\3\2\2\2\\\u02ae", - "\3\2\2\2^\u02b6\3\2\2\2`\u02c2\3\2\2\2b\u02c5\3\2\2\2d\u02d4\3\2\2\2", - "f\u030f\3\2\2\2h\u0311\3\2\2\2j\u0321\3\2\2\2l\u032c\3\2\2\2n\u0335", - "\3\2\2\2p\u034a\3\2\2\2r\u034c\3\2\2\2t\u035b\3\2\2\2v\u035d\3\2\2\2", - "x\u036f\3\2\2\2z\u0371\3\2\2\2|\u037c\3\2\2\2~\u038b\3\2\2\2\u0080\u03bb", - "\3\2\2\2\u0082\u03eb\3\2\2\2\u0084\u03f7\3\2\2\2\u0086\u03f9\3\2\2\2", - "\u0088\u040a\3\2\2\2\u008a\u040d\3\2\2\2\u008c\u041d\3\2\2\2\u008e\u041f", - "\3\2\2\2\u0090\u0450\3\2\2\2\u0092\u045d\3\2\2\2\u0094\u045f\3\2\2\2", - "\u0096\u0465\3\2\2\2\u0098\u0472\3\2\2\2\u009a\u0474\3\2\2\2\u009c\u047b", - "\3\2\2\2\u009e\u048e\3\2\2\2\u00a0\u04ba\3\2\2\2\u00a2\u04cc\3\2\2\2", - "\u00a4\u04d3\3\2\2\2\u00a6\u04d5\3\2\2\2\u00a8\u04e2\3\2\2\2\u00aa\u04e5", - "\3\2\2\2\u00ac\u04ed\3\2\2\2\u00ae\u00d0\7k\2\2\u00af\u00d0\7l\2\2\u00b0", - "\u00b2\7m\2\2\u00b1\u00b0\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b1\3", - "\2\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00d0\3\2\2\2\u00b5\u00b6\7=\2\2\u00b6", - "\u00b7\5.\30\2\u00b7\u00b8\7>\2\2\u00b8\u00d0\3\2\2\2\u00b9\u00d0\5", - "\4\3\2\u00ba\u00bc\7\3\2\2\u00bb\u00ba\3\2\2\2\u00bb\u00bc\3\2\2\2\u00bc", - "\u00bd\3\2\2\2\u00bd\u00be\7=\2\2\u00be\u00bf\5\u0094K\2\u00bf\u00c0", - "\7>\2\2\u00c0\u00d0\3\2\2\2\u00c1\u00c2\7\4\2\2\u00c2\u00c3\7=\2\2\u00c3", - "\u00c4\5\16\b\2\u00c4\u00c5\7Z\2\2\u00c5\u00c6\5|?\2\u00c6\u00c7\7>", - "\2\2\u00c7\u00d0\3\2\2\2\u00c8\u00c9\7\5\2\2\u00c9\u00ca\7=\2\2\u00ca", - "\u00cb\5|?\2\u00cb\u00cc\7Z\2\2\u00cc\u00cd\5\16\b\2\u00cd\u00ce\7>", - "\2\2\u00ce\u00d0\3\2\2\2\u00cf\u00ae\3\2\2\2\u00cf\u00af\3\2\2\2\u00cf", - "\u00b1\3\2\2\2\u00cf\u00b5\3\2\2\2\u00cf\u00b9\3\2\2\2\u00cf\u00bb\3", - "\2\2\2\u00cf\u00c1\3\2\2\2\u00cf\u00c8\3\2\2\2\u00d0\3\3\2\2\2\u00d1", - "\u00d2\78\2\2\u00d2\u00d3\7=\2\2\u00d3\u00d4\5*\26\2\u00d4\u00d5\7Z", - "\2\2\u00d5\u00d6\5\6\4\2\u00d6\u00d7\7>\2\2\u00d7\5\3\2\2\2\u00d8\u00d9", - "\b\4\1\2\u00d9\u00da\5\b\5\2\u00da\u00e0\3\2\2\2\u00db\u00dc\f\3\2\2", - "\u00dc\u00dd\7Z\2\2\u00dd\u00df\5\b\5\2\u00de\u00db\3\2\2\2\u00df\u00e2", - "\3\2\2\2\u00e0\u00de\3\2\2\2\u00e0\u00e1\3\2\2\2\u00e1\7\3\2\2\2\u00e2", - "\u00e0\3\2\2\2\u00e3\u00e4\5|?\2\u00e4\u00e5\7X\2\2\u00e5\u00e6\5*\26", - "\2\u00e6\u00eb\3\2\2\2\u00e7\u00e8\7\27\2\2\u00e8\u00e9\7X\2\2\u00e9", - "\u00eb\5*\26\2\u00ea\u00e3\3\2\2\2\u00ea\u00e7\3\2\2\2\u00eb\t\3\2\2", - "\2\u00ec\u00ed\b\6\1\2\u00ed\u010f\5\2\2\2\u00ee\u00ef\7=\2\2\u00ef", - "\u00f0\5|?\2\u00f0\u00f1\7>\2\2\u00f1\u00f2\7A\2\2\u00f2\u00f3\5\u0086", - "D\2\u00f3\u00f4\7B\2\2\u00f4\u010f\3\2\2\2\u00f5\u00f6\7=\2\2\u00f6", - "\u00f7\5|?\2\u00f7\u00f8\7>\2\2\u00f8\u00f9\7A\2\2\u00f9\u00fa\5\u0086", - "D\2\u00fa\u00fb\7Z\2\2\u00fb\u00fc\7B\2\2\u00fc\u010f\3\2\2\2\u00fd", - "\u00fe\7\3\2\2\u00fe\u00ff\7=\2\2\u00ff\u0100\5|?\2\u0100\u0101\7>\2", - "\2\u0101\u0102\7A\2\2\u0102\u0103\5\u0086D\2\u0103\u0104\7B\2\2\u0104", - "\u010f\3\2\2\2\u0105\u0106\7\3\2\2\u0106\u0107\7=\2\2\u0107\u0108\5", - "|?\2\u0108\u0109\7>\2\2\u0109\u010a\7A\2\2\u010a\u010b\5\u0086D\2\u010b", - "\u010c\7Z\2\2\u010c\u010d\7B\2\2\u010d\u010f\3\2\2\2\u010e\u00ec\3\2", - "\2\2\u010e\u00ee\3\2\2\2\u010e\u00f5\3\2\2\2\u010e\u00fd\3\2\2\2\u010e", - "\u0105\3\2\2\2\u010f\u0127\3\2\2\2\u0110\u0111\f\f\2\2\u0111\u0112\7", - "?\2\2\u0112\u0113\5.\30\2\u0113\u0114\7@\2\2\u0114\u0126\3\2\2\2\u0115", - "\u0116\f\13\2\2\u0116\u0118\7=\2\2\u0117\u0119\5\f\7\2\u0118\u0117\3", - "\2\2\2\u0118\u0119\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u0126\7>\2\2\u011b", - "\u011c\f\n\2\2\u011c\u011d\7i\2\2\u011d\u0126\7k\2\2\u011e\u011f\f\t", - "\2\2\u011f\u0120\7h\2\2\u0120\u0126\7k\2\2\u0121\u0122\f\b\2\2\u0122", - "\u0126\7J\2\2\u0123\u0124\f\7\2\2\u0124\u0126\7L\2\2\u0125\u0110\3\2", - "\2\2\u0125\u0115\3\2\2\2\u0125\u011b\3\2\2\2\u0125\u011e\3\2\2\2\u0125", - "\u0121\3\2\2\2\u0125\u0123\3\2\2\2\u0126\u0129\3\2\2\2\u0127\u0125\3", - "\2\2\2\u0127\u0128\3\2\2\2\u0128\13\3\2\2\2\u0129\u0127\3\2\2\2\u012a", - "\u012b\b\7\1\2\u012b\u012c\5*\26\2\u012c\u0132\3\2\2\2\u012d\u012e\f", - "\3\2\2\u012e\u012f\7Z\2\2\u012f\u0131\5*\26\2\u0130\u012d\3\2\2\2\u0131", - "\u0134\3\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2\2\2\u0133\r\3\2\2", - "\2\u0134\u0132\3\2\2\2\u0135\u014c\5\n\6\2\u0136\u0137\7J\2\2\u0137", - "\u014c\5\16\b\2\u0138\u0139\7L\2\2\u0139\u014c\5\16\b\2\u013a\u013b", - "\5\20\t\2\u013b\u013c\5\22\n\2\u013c\u014c\3\2\2\2\u013d\u013e\7)\2", - "\2\u013e\u014c\5\16\b\2\u013f\u0140\7)\2\2\u0140\u0141\7=\2\2\u0141", - "\u0142\5|?\2\u0142\u0143\7>\2\2\u0143\u014c\3\2\2\2\u0144\u0145\7\64", - "\2\2\u0145\u0146\7=\2\2\u0146\u0147\5|?\2\u0147\u0148\7>\2\2\u0148\u014c", - "\3\2\2\2\u0149\u014a\7R\2\2\u014a\u014c\7k\2\2\u014b\u0135\3\2\2\2\u014b", - "\u0136\3\2\2\2\u014b\u0138\3\2\2\2\u014b\u013a\3\2\2\2\u014b\u013d\3", - "\2\2\2\u014b\u013f\3\2\2\2\u014b\u0144\3\2\2\2\u014b\u0149\3\2\2\2\u014c", - "\17\3\2\2\2\u014d\u014e\t\2\2\2\u014e\21\3\2\2\2\u014f\u015c\5\16\b", - "\2\u0150\u0151\7=\2\2\u0151\u0152\5|?\2\u0152\u0153\7>\2\2\u0153\u0154", - "\5\22\n\2\u0154\u015c\3\2\2\2\u0155\u0156\7\3\2\2\u0156\u0157\7=\2\2", - "\u0157\u0158\5|?\2\u0158\u0159\7>\2\2\u0159\u015a\5\22\n\2\u015a\u015c", - "\3\2\2\2\u015b\u014f\3\2\2\2\u015b\u0150\3\2\2\2\u015b\u0155\3\2\2\2", - "\u015c\23\3\2\2\2\u015d\u015e\b\13\1\2\u015e\u015f\5\22\n\2\u015f\u016b", - "\3\2\2\2\u0160\u0161\f\5\2\2\u0161\u0162\7M\2\2\u0162\u016a\5\22\n\2", - "\u0163\u0164\f\4\2\2\u0164\u0165\7N\2\2\u0165\u016a\5\22\n\2\u0166\u0167", - "\f\3\2\2\u0167\u0168\7O\2\2\u0168\u016a\5\22\n\2\u0169\u0160\3\2\2\2", - "\u0169\u0163\3\2\2\2\u0169\u0166\3\2\2\2\u016a\u016d\3\2\2\2\u016b\u0169", - "\3\2\2\2\u016b\u016c\3\2\2\2\u016c\25\3\2\2\2\u016d\u016b\3\2\2\2\u016e", - "\u016f\b\f\1\2\u016f\u0170\5\24\13\2\u0170\u0179\3\2\2\2\u0171\u0172", - "\f\4\2\2\u0172\u0173\7I\2\2\u0173\u0178\5\24\13\2\u0174\u0175\f\3\2", - "\2\u0175\u0176\7K\2\2\u0176\u0178\5\24\13\2\u0177\u0171\3\2\2\2\u0177", - "\u0174\3\2\2\2\u0178\u017b\3\2\2\2\u0179\u0177\3\2\2\2\u0179\u017a\3", - "\2\2\2\u017a\27\3\2\2\2\u017b\u0179\3\2\2\2\u017c\u017d\b\r\1\2\u017d", - "\u017e\5\26\f\2\u017e\u0187\3\2\2\2\u017f\u0180\f\4\2\2\u0180\u0181", - "\7G\2\2\u0181\u0186\5\26\f\2\u0182\u0183\f\3\2\2\u0183\u0184\7H\2\2", - "\u0184\u0186\5\26\f\2\u0185\u017f\3\2\2\2\u0185\u0182\3\2\2\2\u0186", - "\u0189\3\2\2\2\u0187\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\31\3\2", - "\2\2\u0189\u0187\3\2\2\2\u018a\u018b\b\16\1\2\u018b\u018c\5\30\r\2\u018c", - "\u019b\3\2\2\2\u018d\u018e\f\6\2\2\u018e\u018f\7C\2\2\u018f\u019a\5", - "\30\r\2\u0190\u0191\f\5\2\2\u0191\u0192\7E\2\2\u0192\u019a\5\30\r\2", - "\u0193\u0194\f\4\2\2\u0194\u0195\7D\2\2\u0195\u019a\5\30\r\2\u0196\u0197", - "\f\3\2\2\u0197\u0198\7F\2\2\u0198\u019a\5\30\r\2\u0199\u018d\3\2\2\2", - "\u0199\u0190\3\2\2\2\u0199\u0193\3\2\2\2\u0199\u0196\3\2\2\2\u019a\u019d", - "\3\2\2\2\u019b\u0199\3\2\2\2\u019b\u019c\3\2\2\2\u019c\33\3\2\2\2\u019d", - "\u019b\3\2\2\2\u019e\u019f\b\17\1\2\u019f\u01a0\5\32\16\2\u01a0\u01a9", - "\3\2\2\2\u01a1\u01a2\f\4\2\2\u01a2\u01a3\7f\2\2\u01a3\u01a8\5\32\16", - "\2\u01a4\u01a5\f\3\2\2\u01a5\u01a6\7g\2\2\u01a6\u01a8\5\32\16\2\u01a7", - "\u01a1\3\2\2\2\u01a7\u01a4\3\2\2\2\u01a8\u01ab\3\2\2\2\u01a9\u01a7\3", - "\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\35\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ac", - "\u01ad\b\20\1\2\u01ad\u01ae\5\34\17\2\u01ae\u01b4\3\2\2\2\u01af\u01b0", - "\f\3\2\2\u01b0\u01b1\7P\2\2\u01b1\u01b3\5\34\17\2\u01b2\u01af\3\2\2", - "\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5", - "\37\3\2\2\2\u01b6\u01b4\3\2\2\2\u01b7\u01b8\b\21\1\2\u01b8\u01b9\5\36", - "\20\2\u01b9\u01bf\3\2\2\2\u01ba\u01bb\f\3\2\2\u01bb\u01bc\7T\2\2\u01bc", - "\u01be\5\36\20\2\u01bd\u01ba\3\2\2\2\u01be\u01c1\3\2\2\2\u01bf\u01bd", - "\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0!\3\2\2\2\u01c1\u01bf\3\2\2\2\u01c2", - "\u01c3\b\22\1\2\u01c3\u01c4\5 \21\2\u01c4\u01ca\3\2\2\2\u01c5\u01c6", - "\f\3\2\2\u01c6\u01c7\7Q\2\2\u01c7\u01c9\5 \21\2\u01c8\u01c5\3\2\2\2", - "\u01c9\u01cc\3\2\2\2\u01ca\u01c8\3\2\2\2\u01ca\u01cb\3\2\2\2\u01cb#", - "\3\2\2\2\u01cc\u01ca\3\2\2\2\u01cd\u01ce\b\23\1\2\u01ce\u01cf\5\"\22", - "\2\u01cf\u01d5\3\2\2\2\u01d0\u01d1\f\3\2\2\u01d1\u01d2\7R\2\2\u01d2", - "\u01d4\5\"\22\2\u01d3\u01d0\3\2\2\2\u01d4\u01d7\3\2\2\2\u01d5\u01d3", - "\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6%\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d8", - "\u01d9\b\24\1\2\u01d9\u01da\5$\23\2\u01da\u01e0\3\2\2\2\u01db\u01dc", - "\f\3\2\2\u01dc\u01dd\7S\2\2\u01dd\u01df\5$\23\2\u01de\u01db\3\2\2\2", - "\u01df\u01e2\3\2\2\2\u01e0\u01de\3\2\2\2\u01e0\u01e1\3\2\2\2\u01e1\'", - "\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01e9\5&\24\2\u01e4\u01e5\7W\2\2", - "\u01e5\u01e6\5.\30\2\u01e6\u01e7\7X\2\2\u01e7\u01e8\5(\25\2\u01e8\u01ea", - "\3\2\2\2\u01e9\u01e4\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea)\3\2\2\2\u01eb", - "\u01f1\5(\25\2\u01ec\u01ed\5\16\b\2\u01ed\u01ee\5,\27\2\u01ee\u01ef", - "\5*\26\2\u01ef\u01f1\3\2\2\2\u01f0\u01eb\3\2\2\2\u01f0\u01ec\3\2\2\2", - "\u01f1+\3\2\2\2\u01f2\u01f3\t\3\2\2\u01f3-\3\2\2\2\u01f4\u01f5\b\30", - "\1\2\u01f5\u01f6\5*\26\2\u01f6\u01fc\3\2\2\2\u01f7\u01f8\f\3\2\2\u01f8", - "\u01f9\7Z\2\2\u01f9\u01fb\5*\26\2\u01fa\u01f7\3\2\2\2\u01fb\u01fe\3", - "\2\2\2\u01fc\u01fa\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd/\3\2\2\2\u01fe", - "\u01fc\3\2\2\2\u01ff\u0200\5(\25\2\u0200\61\3\2\2\2\u0201\u0203\5\64", - "\33\2\u0202\u0204\5:\36\2\u0203\u0202\3\2\2\2\u0203\u0204\3\2\2\2\u0204", - "\u0205\3\2\2\2\u0205\u0206\7Y\2\2\u0206\u0209\3\2\2\2\u0207\u0209\5", - "\u008eH\2\u0208\u0201\3\2\2\2\u0208\u0207\3\2\2\2\u0209\63\3\2\2\2\u020a", - "\u020c\58\35\2\u020b\u020a\3\2\2\2\u020c\u020d\3\2\2\2\u020d\u020b\3", - "\2\2\2\u020d\u020e\3\2\2\2\u020e\65\3\2\2\2\u020f\u0211\58\35\2\u0210", - "\u020f\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3", - "\2\2\2\u0213\67\3\2\2\2\u0214\u021a\5> \2\u0215\u021a\5@!\2\u0216\u021a", - "\5\\/\2\u0217\u021a\5^\60\2\u0218\u021a\5`\61\2\u0219\u0214\3\2\2\2", - "\u0219\u0215\3\2\2\2\u0219\u0216\3\2\2\2\u0219\u0217\3\2\2\2\u0219\u0218", - "\3\2\2\2\u021a9\3\2\2\2\u021b\u021c\b\36\1\2\u021c\u021d\5<\37\2\u021d", - "\u0223\3\2\2\2\u021e\u021f\f\3\2\2\u021f\u0220\7Z\2\2\u0220\u0222\5", - "<\37\2\u0221\u021e\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223", - "\u0224\3\2\2\2\u0224;\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u022c\5b\62", - "\2\u0227\u0228\5b\62\2\u0228\u0229\7[\2\2\u0229\u022a\5\u0084C\2\u022a", - "\u022c\3\2\2\2\u022b\u0226\3\2\2\2\u022b\u0227\3\2\2\2\u022c=\3\2\2", - "\2\u022d\u022e\t\4\2\2\u022e?\3\2\2\2\u022f\u023e\t\5\2\2\u0230\u0231", - "\7\3\2\2\u0231\u0232\7=\2\2\u0232\u0233\t\6\2\2\u0233\u023e\7>\2\2\u0234", - "\u023e\5Z.\2\u0235\u023e\5B\"\2\u0236\u023e\5R*\2\u0237\u023e\5\u0082", - "B\2\u0238\u0239\7\t\2\2\u0239\u023a\7=\2\2\u023a\u023b\5\60\31\2\u023b", - "\u023c\7>\2\2\u023c\u023e\3\2\2\2\u023d\u022f\3\2\2\2\u023d\u0230\3", - "\2\2\2\u023d\u0234\3\2\2\2\u023d\u0235\3\2\2\2\u023d\u0236\3\2\2\2\u023d", - "\u0237\3\2\2\2\u023d\u0238\3\2\2\2\u023eA\3\2\2\2\u023f\u0241\5D#\2", - "\u0240\u0242\7k\2\2\u0241\u0240\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243", - "\3\2\2\2\u0243\u0244\5F$\2\u0244\u0249\3\2\2\2\u0245\u0246\5D#\2\u0246", - "\u0247\7k\2\2\u0247\u0249\3\2\2\2\u0248\u023f\3\2\2\2\u0248\u0245\3", - "\2\2\2\u0249C\3\2\2\2\u024a\u024b\t\7\2\2\u024bE\3\2\2\2\u024c\u024d", - "\7A\2\2\u024d\u024e\5H%\2\u024e\u024f\7B\2\2\u024fG\3\2\2\2\u0250\u0251", - "\b%\1\2\u0251\u0252\5J&\2\u0252\u0257\3\2\2\2\u0253\u0254\f\3\2\2\u0254", - "\u0256\5J&\2\u0255\u0253\3\2\2\2\u0256\u0259\3\2\2\2\u0257\u0255\3\2", - "\2\2\u0257\u0258\3\2\2\2\u0258I\3\2\2\2\u0259\u0257\3\2\2\2\u025a\u025c", - "\5L\'\2\u025b\u025d\5N(\2\u025c\u025b\3\2\2\2\u025c\u025d\3\2\2\2\u025d", - "\u025e\3\2\2\2\u025e\u025f\7Y\2\2\u025f\u0262\3\2\2\2\u0260\u0262\5", - "\u008eH\2\u0261\u025a\3\2\2\2\u0261\u0260\3\2\2\2\u0262K\3\2\2\2\u0263", - "\u0265\5@!\2\u0264\u0266\5L\'\2\u0265\u0264\3\2\2\2\u0265\u0266\3\2", - "\2\2\u0266\u026c\3\2\2\2\u0267\u0269\5\\/\2\u0268\u026a\5L\'\2\u0269", - "\u0268\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026c\3\2\2\2\u026b\u0263\3", - "\2\2\2\u026b\u0267\3\2\2\2\u026cM\3\2\2\2\u026d\u026e\b(\1\2\u026e\u026f", - "\5P)\2\u026f\u0275\3\2\2\2\u0270\u0271\f\3\2\2\u0271\u0272\7Z\2\2\u0272", - "\u0274\5P)\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2", - "\2\2\u0275\u0276\3\2\2\2\u0276O\3\2\2\2\u0277\u0275\3\2\2\2\u0278\u027f", - "\5b\62\2\u0279\u027b\5b\62\2\u027a\u0279\3\2\2\2\u027a\u027b\3\2\2\2", - "\u027b\u027c\3\2\2\2\u027c\u027d\7X\2\2\u027d\u027f\5\60\31\2\u027e", - "\u0278\3\2\2\2\u027e\u027a\3\2\2\2\u027fQ\3\2\2\2\u0280\u0282\7\33\2", - "\2\u0281\u0283\7k\2\2\u0282\u0281\3\2\2\2\u0282\u0283\3\2\2\2\u0283", - "\u0284\3\2\2\2\u0284\u0285\7A\2\2\u0285\u0286\5T+\2\u0286\u0287\7B\2", - "\2\u0287\u0294\3\2\2\2\u0288\u028a\7\33\2\2\u0289\u028b\7k\2\2\u028a", - "\u0289\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u028d\7", - "A\2\2\u028d\u028e\5T+\2\u028e\u028f\7Z\2\2\u028f\u0290\7B\2\2\u0290", - "\u0294\3\2\2\2\u0291\u0292\7\33\2\2\u0292\u0294\7k\2\2\u0293\u0280\3", - "\2\2\2\u0293\u0288\3\2\2\2\u0293\u0291\3\2\2\2\u0294S\3\2\2\2\u0295", - "\u0296\b+\1\2\u0296\u0297\5V,\2\u0297\u029d\3\2\2\2\u0298\u0299\f\3", - "\2\2\u0299\u029a\7Z\2\2\u029a\u029c\5V,\2\u029b\u0298\3\2\2\2\u029c", - "\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029eU\3\2\2", - "\2\u029f\u029d\3\2\2\2\u02a0\u02a6\5X-\2\u02a1\u02a2\5X-\2\u02a2\u02a3", - "\7[\2\2\u02a3\u02a4\5\60\31\2\u02a4\u02a6\3\2\2\2\u02a5\u02a0\3\2\2", - "\2\u02a5\u02a1\3\2\2\2\u02a6W\3\2\2\2\u02a7\u02a8\7k\2\2\u02a8Y\3\2", - "\2\2\u02a9\u02aa\7\65\2\2\u02aa\u02ab\7=\2\2\u02ab\u02ac\5|?\2\u02ac", - "\u02ad\7>\2\2\u02ad[\3\2\2\2\u02ae\u02af\t\b\2\2\u02af]\3\2\2\2\u02b0", - "\u02b7\t\t\2\2\u02b1\u02b7\5h\65\2\u02b2\u02b3\7\f\2\2\u02b3\u02b4\7", - "=\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b7\7>\2\2\u02b6\u02b0\3\2\2\2\u02b6", - "\u02b1\3\2\2\2\u02b6\u02b2\3\2\2\2\u02b7_\3\2\2\2\u02b8\u02b9\7\63\2", - "\2\u02b9\u02ba\7=\2\2\u02ba\u02bb\5|?\2\u02bb\u02bc\7>\2\2\u02bc\u02c3", - "\3\2\2\2\u02bd\u02be\7\63\2\2\u02be\u02bf\7=\2\2\u02bf\u02c0\5\60\31", - "\2\u02c0\u02c1\7>\2\2\u02c1\u02c3\3\2\2\2\u02c2\u02b8\3\2\2\2\u02c2", - "\u02bd\3\2\2\2\u02c3a\3\2\2\2\u02c4\u02c6\5p9\2\u02c5\u02c4\3\2\2\2", - "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02cb\5d\63\2\u02c8\u02ca", - "\5f\64\2\u02c9\u02c8\3\2\2\2\u02ca\u02cd\3\2\2\2\u02cb\u02c9\3\2\2\2", - "\u02cb\u02cc\3\2\2\2\u02ccc\3\2\2\2\u02cd\u02cb\3\2\2\2\u02ce\u02cf", - "\b\63\1\2\u02cf\u02d5\7k\2\2\u02d0\u02d1\7=\2\2\u02d1\u02d2\5b\62\2", - "\u02d2\u02d3\7>\2\2\u02d3\u02d5\3\2\2\2\u02d4\u02ce\3\2\2\2\u02d4\u02d0", - "\3\2\2\2\u02d5\u0303\3\2\2\2\u02d6\u02d7\f\b\2\2\u02d7\u02d9\7?\2\2", - "\u02d8\u02da\5r:\2\u02d9\u02d8\3\2\2\2\u02d9\u02da\3\2\2\2\u02da\u02dc", - "\3\2\2\2\u02db\u02dd\5*\26\2\u02dc\u02db\3\2\2\2\u02dc\u02dd\3\2\2\2", - "\u02dd\u02de\3\2\2\2\u02de\u0302\7@\2\2\u02df\u02e0\f\7\2\2\u02e0\u02e1", - "\7?\2\2\u02e1\u02e3\7*\2\2\u02e2\u02e4\5r:\2\u02e3\u02e2\3\2\2\2\u02e3", - "\u02e4\3\2\2\2\u02e4\u02e5\3\2\2\2\u02e5\u02e6\5*\26\2\u02e6\u02e7\7", - "@\2\2\u02e7\u0302\3\2\2\2\u02e8\u02e9\f\6\2\2\u02e9\u02ea\7?\2\2\u02ea", - "\u02eb\5r:\2\u02eb\u02ec\7*\2\2\u02ec\u02ed\5*\26\2\u02ed\u02ee\7@\2", - "\2\u02ee\u0302\3\2\2\2\u02ef\u02f0\f\5\2\2\u02f0\u02f2\7?\2\2\u02f1", - "\u02f3\5r:\2\u02f2\u02f1\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f4\3\2", - "\2\2\u02f4\u02f5\7M\2\2\u02f5\u0302\7@\2\2\u02f6\u02f7\f\4\2\2\u02f7", - "\u02f8\7=\2\2\u02f8\u02f9\5t;\2\u02f9\u02fa\7>\2\2\u02fa\u0302\3\2\2", - "\2\u02fb\u02fc\f\3\2\2\u02fc\u02fe\7=\2\2\u02fd\u02ff\5z>\2\u02fe\u02fd", - "\3\2\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0302\7>\2\2", - "\u0301\u02d6\3\2\2\2\u0301\u02df\3\2\2\2\u0301\u02e8\3\2\2\2\u0301\u02ef", - "\3\2\2\2\u0301\u02f6\3\2\2\2\u0301\u02fb\3\2\2\2\u0302\u0305\3\2\2\2", - "\u0303\u0301\3\2\2\2\u0303\u0304\3\2\2\2\u0304e\3\2\2\2\u0305\u0303", - "\3\2\2\2\u0306\u0307\7\r\2\2\u0307\u0309\7=\2\2\u0308\u030a\7m\2\2\u0309", - "\u0308\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u0309\3\2\2\2\u030b\u030c\3", - "\2\2\2\u030c\u030d\3\2\2\2\u030d\u0310\7>\2\2\u030e\u0310\5h\65\2\u030f", - "\u0306\3\2\2\2\u030f\u030e\3\2\2\2\u0310g\3\2\2\2\u0311\u0312\7\16\2", - "\2\u0312\u0313\7=\2\2\u0313\u0314\7=\2\2\u0314\u0315\5j\66\2\u0315\u0316", - "\7>\2\2\u0316\u0317\7>\2\2\u0317i\3\2\2\2\u0318\u031d\5l\67\2\u0319", - "\u031a\7Z\2\2\u031a\u031c\5l\67\2\u031b\u0319\3\2\2\2\u031c\u031f\3", - "\2\2\2\u031d\u031b\3\2\2\2\u031d\u031e\3\2\2\2\u031e\u0322\3\2\2\2\u031f", - "\u031d\3\2\2\2\u0320\u0322\3\2\2\2\u0321\u0318\3\2\2\2\u0321\u0320\3", - "\2\2\2\u0322k\3\2\2\2\u0323\u0329\n\n\2\2\u0324\u0326\7=\2\2\u0325\u0327", - "\5\f\7\2\u0326\u0325\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u0328\3\2\2\2", - "\u0328\u032a\7>\2\2\u0329\u0324\3\2\2\2\u0329\u032a\3\2\2\2\u032a\u032d", - "\3\2\2\2\u032b\u032d\3\2\2\2\u032c\u0323\3\2\2\2\u032c\u032b\3\2\2\2", - "\u032dm\3\2\2\2\u032e\u0334\n\13\2\2\u032f\u0330\7=\2\2\u0330\u0331", - "\5n8\2\u0331\u0332\7>\2\2\u0332\u0334\3\2\2\2\u0333\u032e\3\2\2\2\u0333", - "\u032f\3\2\2\2\u0334\u0337\3\2\2\2\u0335\u0333\3\2\2\2\u0335\u0336\3", - "\2\2\2\u0336o\3\2\2\2\u0337\u0335\3\2\2\2\u0338\u033a\7M\2\2\u0339\u033b", - "\5r:\2\u033a\u0339\3\2\2\2\u033a\u033b\3\2\2\2\u033b\u034b\3\2\2\2\u033c", - "\u033e\7M\2\2\u033d\u033f\5r:\2\u033e\u033d\3\2\2\2\u033e\u033f\3\2", - "\2\2\u033f\u0340\3\2\2\2\u0340\u034b\5p9\2\u0341\u0343\7T\2\2\u0342", - "\u0344\5r:\2\u0343\u0342\3\2\2\2\u0343\u0344\3\2\2\2\u0344\u034b\3\2", - "\2\2\u0345\u0347\7T\2\2\u0346\u0348\5r:\2\u0347\u0346\3\2\2\2\u0347", - "\u0348\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u034b\5p9\2\u034a\u0338\3\2", - "\2\2\u034a\u033c\3\2\2\2\u034a\u0341\3\2\2\2\u034a\u0345\3\2\2\2\u034b", - "q\3\2\2\2\u034c\u034d\b:\1\2\u034d\u034e\5\\/\2\u034e\u0353\3\2\2\2", - "\u034f\u0350\f\3\2\2\u0350\u0352\5\\/\2\u0351\u034f\3\2\2\2\u0352\u0355", - "\3\2\2\2\u0353\u0351\3\2\2\2\u0353\u0354\3\2\2\2\u0354s\3\2\2\2\u0355", - "\u0353\3\2\2\2\u0356\u035c\5v<\2\u0357\u0358\5v<\2\u0358\u0359\7Z\2", - "\2\u0359\u035a\7j\2\2\u035a\u035c\3\2\2\2\u035b\u0356\3\2\2\2\u035b", - "\u0357\3\2\2\2\u035cu\3\2\2\2\u035d\u035e\b<\1\2\u035e\u035f\5x=\2\u035f", - "\u0365\3\2\2\2\u0360\u0361\f\3\2\2\u0361\u0362\7Z\2\2\u0362\u0364\5", - "x=\2\u0363\u0360\3\2\2\2\u0364\u0367\3\2\2\2\u0365\u0363\3\2\2\2\u0365", - "\u0366\3\2\2\2\u0366w\3\2\2\2\u0367\u0365\3\2\2\2\u0368\u0369\5\64\33", - "\2\u0369\u036a\5b\62\2\u036a\u0370\3\2\2\2\u036b\u036d\5\66\34\2\u036c", - "\u036e\5~@\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u0370\3\2", - "\2\2\u036f\u0368\3\2\2\2\u036f\u036b\3\2\2\2\u0370y\3\2\2\2\u0371\u0372", - "\b>\1\2\u0372\u0373\7k\2\2\u0373\u0379\3\2\2\2\u0374\u0375\f\3\2\2\u0375", - "\u0376\7Z\2\2\u0376\u0378\7k\2\2\u0377\u0374\3\2\2\2\u0378\u037b\3\2", - "\2\2\u0379\u0377\3\2\2\2\u0379\u037a\3\2\2\2\u037a{\3\2\2\2\u037b\u0379", - "\3\2\2\2\u037c\u037e\5L\'\2\u037d\u037f\5~@\2\u037e\u037d\3\2\2\2\u037e", - "\u037f\3\2\2\2\u037f}\3\2\2\2\u0380\u038c\5p9\2\u0381\u0383\5p9\2\u0382", - "\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0388\5", - "\u0080A\2\u0385\u0387\5f\64\2\u0386\u0385\3\2\2\2\u0387\u038a\3\2\2", - "\2\u0388\u0386\3\2\2\2\u0388\u0389\3\2\2\2\u0389\u038c\3\2\2\2\u038a", - "\u0388\3\2\2\2\u038b\u0380\3\2\2\2\u038b\u0382\3\2\2\2\u038c\177\3\2", - "\2\2\u038d\u038e\bA\1\2\u038e\u038f\7=\2\2\u038f\u0390\5~@\2\u0390\u0394", - "\7>\2\2\u0391\u0393\5f\64\2\u0392\u0391\3\2\2\2\u0393\u0396\3\2\2\2", - "\u0394\u0392\3\2\2\2\u0394\u0395\3\2\2\2\u0395\u03bc\3\2\2\2\u0396\u0394", - "\3\2\2\2\u0397\u0399\7?\2\2\u0398\u039a\5r:\2\u0399\u0398\3\2\2\2\u0399", - "\u039a\3\2\2\2\u039a\u039c\3\2\2\2\u039b\u039d\5*\26\2\u039c\u039b\3", - "\2\2\2\u039c\u039d\3\2\2\2\u039d\u039e\3\2\2\2\u039e\u03bc\7@\2\2\u039f", - "\u03a0\7?\2\2\u03a0\u03a2\7*\2\2\u03a1\u03a3\5r:\2\u03a2\u03a1\3\2\2", - "\2\u03a2\u03a3\3\2\2\2\u03a3\u03a4\3\2\2\2\u03a4\u03a5\5*\26\2\u03a5", - "\u03a6\7@\2\2\u03a6\u03bc\3\2\2\2\u03a7\u03a8\7?\2\2\u03a8\u03a9\5r", - ":\2\u03a9\u03aa\7*\2\2\u03aa\u03ab\5*\26\2\u03ab\u03ac\7@\2\2\u03ac", - "\u03bc\3\2\2\2\u03ad\u03ae\7?\2\2\u03ae\u03af\7M\2\2\u03af\u03bc\7@", - "\2\2\u03b0\u03b2\7=\2\2\u03b1\u03b3\5t;\2\u03b2\u03b1\3\2\2\2\u03b2", - "\u03b3\3\2\2\2\u03b3\u03b4\3\2\2\2\u03b4\u03b8\7>\2\2\u03b5\u03b7\5", - "f\64\2\u03b6\u03b5\3\2\2\2\u03b7\u03ba\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b8", - "\u03b9\3\2\2\2\u03b9\u03bc\3\2\2\2\u03ba\u03b8\3\2\2\2\u03bb\u038d\3", - "\2\2\2\u03bb\u0397\3\2\2\2\u03bb\u039f\3\2\2\2\u03bb\u03a7\3\2\2\2\u03bb", - "\u03ad\3\2\2\2\u03bb\u03b0\3\2\2\2\u03bc\u03e8\3\2\2\2\u03bd\u03be\f", - "\7\2\2\u03be\u03c0\7?\2\2\u03bf\u03c1\5r:\2\u03c0\u03bf\3\2\2\2\u03c0", - "\u03c1\3\2\2\2\u03c1\u03c3\3\2\2\2\u03c2\u03c4\5*\26\2\u03c3\u03c2\3", - "\2\2\2\u03c3\u03c4\3\2\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03e7\7@\2\2\u03c6", - "\u03c7\f\6\2\2\u03c7\u03c8\7?\2\2\u03c8\u03ca\7*\2\2\u03c9\u03cb\5r", - ":\2\u03ca\u03c9\3\2\2\2\u03ca\u03cb\3\2\2\2\u03cb\u03cc\3\2\2\2\u03cc", - "\u03cd\5*\26\2\u03cd\u03ce\7@\2\2\u03ce\u03e7\3\2\2\2\u03cf\u03d0\f", - "\5\2\2\u03d0\u03d1\7?\2\2\u03d1\u03d2\5r:\2\u03d2\u03d3\7*\2\2\u03d3", - "\u03d4\5*\26\2\u03d4\u03d5\7@\2\2\u03d5\u03e7\3\2\2\2\u03d6\u03d7\f", - "\4\2\2\u03d7\u03d8\7?\2\2\u03d8\u03d9\7M\2\2\u03d9\u03e7\7@\2\2\u03da", - "\u03db\f\3\2\2\u03db\u03dd\7=\2\2\u03dc\u03de\5t;\2\u03dd\u03dc\3\2", - "\2\2\u03dd\u03de\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e3\7>\2\2\u03e0", - "\u03e2\5f\64\2\u03e1\u03e0\3\2\2\2\u03e2\u03e5\3\2\2\2\u03e3\u03e1\3", - "\2\2\2\u03e3\u03e4\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e6", - "\u03bd\3\2\2\2\u03e6\u03c6\3\2\2\2\u03e6\u03cf\3\2\2\2\u03e6\u03d6\3", - "\2\2\2\u03e6\u03da\3\2\2\2\u03e7\u03ea\3\2\2\2\u03e8\u03e6\3\2\2\2\u03e8", - "\u03e9\3\2\2\2\u03e9\u0081\3\2\2\2\u03ea\u03e8\3\2\2\2\u03eb\u03ec\7", - "k\2\2\u03ec\u0083\3\2\2\2\u03ed\u03f8\5*\26\2\u03ee\u03ef\7A\2\2\u03ef", - "\u03f0\5\u0086D\2\u03f0\u03f1\7B\2\2\u03f1\u03f8\3\2\2\2\u03f2\u03f3", - "\7A\2\2\u03f3\u03f4\5\u0086D\2\u03f4\u03f5\7Z\2\2\u03f5\u03f6\7B\2\2", - "\u03f6\u03f8\3\2\2\2\u03f7\u03ed\3\2\2\2\u03f7\u03ee\3\2\2\2\u03f7\u03f2", - "\3\2\2\2\u03f8\u0085\3\2\2\2\u03f9\u03fb\bD\1\2\u03fa\u03fc\5\u0088", - "E\2\u03fb\u03fa\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u03fd\3\2\2\2\u03fd", - "\u03fe\5\u0084C\2\u03fe\u0407\3\2\2\2\u03ff\u0400\f\3\2\2\u0400\u0402", - "\7Z\2\2\u0401\u0403\5\u0088E\2\u0402\u0401\3\2\2\2\u0402\u0403\3\2\2", - "\2\u0403\u0404\3\2\2\2\u0404\u0406\5\u0084C\2\u0405\u03ff\3\2\2\2\u0406", - "\u0409\3\2\2\2\u0407\u0405\3\2\2\2\u0407\u0408\3\2\2\2\u0408\u0087\3", - "\2\2\2\u0409\u0407\3\2\2\2\u040a\u040b\5\u008aF\2\u040b\u040c\7[\2\2", - "\u040c\u0089\3\2\2\2\u040d\u040e\bF\1\2\u040e\u040f\5\u008cG\2\u040f", - "\u0414\3\2\2\2\u0410\u0411\f\3\2\2\u0411\u0413\5\u008cG\2\u0412\u0410", - "\3\2\2\2\u0413\u0416\3\2\2\2\u0414\u0412\3\2\2\2\u0414\u0415\3\2\2\2", - "\u0415\u008b\3\2\2\2\u0416\u0414\3\2\2\2\u0417\u0418\7?\2\2\u0418\u0419", - "\5\60\31\2\u0419\u041a\7@\2\2\u041a\u041e\3\2\2\2\u041b\u041c\7i\2\2", - "\u041c\u041e\7k\2\2\u041d\u0417\3\2\2\2\u041d\u041b\3\2\2\2\u041e\u008d", - "\3\2\2\2\u041f\u0420\7;\2\2\u0420\u0421\7=\2\2\u0421\u0422\5\60\31\2", - "\u0422\u0424\7Z\2\2\u0423\u0425\7m\2\2\u0424\u0423\3\2\2\2\u0425\u0426", - "\3\2\2\2\u0426\u0424\3\2\2\2\u0426\u0427\3\2\2\2\u0427\u0428\3\2\2\2", - "\u0428\u0429\7>\2\2\u0429\u042a\7Y\2\2\u042a\u008f\3\2\2\2\u042b\u0451", - "\5\u0092J\2\u042c\u0451\5\u0094K\2\u042d\u0451\5\u009cO\2\u042e\u0451", - "\5\u009eP\2\u042f\u0451\5\u00a0Q\2\u0430\u0451\5\u00a2R\2\u0431\u0432", - "\t\f\2\2\u0432\u0433\t\r\2\2\u0433\u043c\7=\2\2\u0434\u0439\5&\24\2", - "\u0435\u0436\7Z\2\2\u0436\u0438\5&\24\2\u0437\u0435\3\2\2\2\u0438\u043b", - "\3\2\2\2\u0439\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u043d\3\2\2\2", - "\u043b\u0439\3\2\2\2\u043c\u0434\3\2\2\2\u043c\u043d\3\2\2\2\u043d\u044b", - "\3\2\2\2\u043e\u0447\7X\2\2\u043f\u0444\5&\24\2\u0440\u0441\7Z\2\2\u0441", - "\u0443\5&\24\2\u0442\u0440\3\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3", - "\2\2\2\u0444\u0445\3\2\2\2\u0445\u0448\3\2\2\2\u0446\u0444\3\2\2\2\u0447", - "\u043f\3\2\2\2\u0447\u0448\3\2\2\2\u0448\u044a\3\2\2\2\u0449\u043e\3", - "\2\2\2\u044a\u044d\3\2\2\2\u044b\u0449\3\2\2\2\u044b\u044c\3\2\2\2\u044c", - "\u044e\3\2\2\2\u044d\u044b\3\2\2\2\u044e\u044f\7>\2\2\u044f\u0451\7", - "Y\2\2\u0450\u042b\3\2\2\2\u0450\u042c\3\2\2\2\u0450\u042d\3\2\2\2\u0450", - "\u042e\3\2\2\2\u0450\u042f\3\2\2\2\u0450\u0430\3\2\2\2\u0450\u0431\3", - "\2\2\2\u0451\u0091\3\2\2\2\u0452\u0453\7k\2\2\u0453\u0454\7X\2\2\u0454", - "\u045e\5\u0090I\2\u0455\u0456\7\23\2\2\u0456\u0457\5\60\31\2\u0457\u0458", - "\7X\2\2\u0458\u0459\5\u0090I\2\u0459\u045e\3\2\2\2\u045a\u045b\7\27", - "\2\2\u045b\u045c\7X\2\2\u045c\u045e\5\u0090I\2\u045d\u0452\3\2\2\2\u045d", - "\u0455\3\2\2\2\u045d\u045a\3\2\2\2\u045e\u0093\3\2\2\2\u045f\u0461\7", - "A\2\2\u0460\u0462\5\u0096L\2\u0461\u0460\3\2\2\2\u0461\u0462\3\2\2\2", - "\u0462\u0463\3\2\2\2\u0463\u0464\7B\2\2\u0464\u0095\3\2\2\2\u0465\u0466", - "\bL\1\2\u0466\u0467\5\u0098M\2\u0467\u046c\3\2\2\2\u0468\u0469\f\3\2", - "\2\u0469\u046b\5\u0098M\2\u046a\u0468\3\2\2\2\u046b\u046e\3\2\2\2\u046c", - "\u046a\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u0097\3\2\2\2\u046e\u046c\3", - "\2\2\2\u046f\u0473\5\u009aN\2\u0470\u0473\5\62\32\2\u0471\u0473\5\u0090", - "I\2\u0472\u046f\3\2\2\2\u0472\u0470\3\2\2\2\u0472\u0471\3\2\2\2\u0473", - "\u0099\3\2\2\2\u0474\u0475\7k\2\2\u0475\u0476\7=\2\2\u0476\u0477\5*", - "\26\2\u0477\u0478\7>\2\2\u0478\u0479\7Y\2\2\u0479\u009b\3\2\2\2\u047a", - "\u047c\5.\30\2\u047b\u047a\3\2\2\2\u047b\u047c\3\2\2\2\u047c\u047d\3", - "\2\2\2\u047d\u047e\7Y\2\2\u047e\u009d\3\2\2\2\u047f\u0480\7 \2\2\u0480", - "\u0481\7=\2\2\u0481\u0482\5.\30\2\u0482\u0483\7>\2\2\u0483\u0486\5\u0090", - "I\2\u0484\u0485\7\32\2\2\u0485\u0487\5\u0090I\2\u0486\u0484\3\2\2\2", - "\u0486\u0487\3\2\2\2\u0487\u048f\3\2\2\2\u0488\u0489\7,\2\2\u0489\u048a", - "\7=\2\2\u048a\u048b\5.\30\2\u048b\u048c\7>\2\2\u048c\u048d\5\u0090I", - "\2\u048d\u048f\3\2\2\2\u048e\u047f\3\2\2\2\u048e\u0488\3\2\2\2\u048f", - "\u009f\3\2\2\2\u0490\u0491\7\62\2\2\u0491\u0492\7=\2\2\u0492\u0493\5", - ".\30\2\u0493\u0494\7>\2\2\u0494\u0495\5\u0090I\2\u0495\u04bb\3\2\2\2", - "\u0496\u0497\7\30\2\2\u0497\u0498\5\u0090I\2\u0498\u0499\7\62\2\2\u0499", - "\u049a\7=\2\2\u049a\u049b\5.\30\2\u049b\u049c\7>\2\2\u049c\u049d\7Y", - "\2\2\u049d\u04bb\3\2\2\2\u049e\u049f\7\36\2\2\u049f\u04a1\7=\2\2\u04a0", - "\u04a2\5.\30\2\u04a1\u04a0\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\3", - "\2\2\2\u04a3\u04a5\7Y\2\2\u04a4\u04a6\5.\30\2\u04a5\u04a4\3\2\2\2\u04a5", - "\u04a6\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7\u04a9\7Y\2\2\u04a8\u04aa\5", - ".\30\2\u04a9\u04a8\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab", - "\u04ac\7>\2\2\u04ac\u04bb\5\u0090I\2\u04ad\u04ae\7\36\2\2\u04ae\u04af", - "\7=\2\2\u04af\u04b1\5\62\32\2\u04b0\u04b2\5.\30\2\u04b1\u04b0\3\2\2", - "\2\u04b1\u04b2\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3\u04b5\7Y\2\2\u04b4", - "\u04b6\5.\30\2\u04b5\u04b4\3\2\2\2\u04b5\u04b6\3\2\2\2\u04b6\u04b7\3", - "\2\2\2\u04b7\u04b8\7>\2\2\u04b8\u04b9\5\u0090I\2\u04b9\u04bb\3\2\2\2", - "\u04ba\u0490\3\2\2\2\u04ba\u0496\3\2\2\2\u04ba\u049e\3\2\2\2\u04ba\u04ad", - "\3\2\2\2\u04bb\u00a1\3\2\2\2\u04bc\u04bd\7\37\2\2\u04bd\u04be\7k\2\2", - "\u04be\u04cd\7Y\2\2\u04bf\u04c0\7\26\2\2\u04c0\u04cd\7Y\2\2\u04c1\u04c2", - "\7\22\2\2\u04c2\u04cd\7Y\2\2\u04c3\u04c5\7&\2\2\u04c4\u04c6\5.\30\2", - "\u04c5\u04c4\3\2\2\2\u04c5\u04c6\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04cd", - "\7Y\2\2\u04c8\u04c9\7\37\2\2\u04c9\u04ca\5\16\b\2\u04ca\u04cb\7Y\2\2", - "\u04cb\u04cd\3\2\2\2\u04cc\u04bc\3\2\2\2\u04cc\u04bf\3\2\2\2\u04cc\u04c1", - "\3\2\2\2\u04cc\u04c3\3\2\2\2\u04cc\u04c8\3\2\2\2\u04cd\u00a3\3\2\2\2", - "\u04ce\u04d0\5\u00a6T\2\u04cf\u04ce\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0", - "\u04d1\3\2\2\2\u04d1\u04d4\7\2\2\3\u04d2\u04d4\3\2\2\2\u04d3\u04cf\3", - "\2\2\2\u04d3\u04d2\3\2\2\2\u04d4\u00a5\3\2\2\2\u04d5\u04d6\bT\1\2\u04d6", - "\u04d7\5\u00a8U\2\u04d7\u04dc\3\2\2\2\u04d8\u04d9\f\3\2\2\u04d9\u04db", - "\5\u00a8U\2\u04da\u04d8\3\2\2\2\u04db\u04de\3\2\2\2\u04dc\u04da\3\2", - "\2\2\u04dc\u04dd\3\2\2\2\u04dd\u00a7\3\2\2\2\u04de\u04dc\3\2\2\2\u04df", - "\u04e3\5\u00aaV\2\u04e0\u04e3\5\62\32\2\u04e1\u04e3\7Y\2\2\u04e2\u04df", - "\3\2\2\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2\u04e3\u00a9\3\2\2\2", - "\u04e4\u04e6\5\64\33\2\u04e5\u04e4\3\2\2\2\u04e5\u04e6\3\2\2\2\u04e6", - "\u04e7\3\2\2\2\u04e7\u04e9\5b\62\2\u04e8\u04ea\5\u00acW\2\u04e9\u04e8", - "\3\2\2\2\u04e9\u04ea\3\2\2\2\u04ea\u04eb\3\2\2\2\u04eb\u04ec\5\u0094", - "K\2\u04ec\u00ab\3\2\2\2\u04ed\u04ee\bW\1\2\u04ee\u04ef\5\62\32\2\u04ef", - "\u04f4\3\2\2\2\u04f0\u04f1\f\3\2\2\u04f1\u04f3\5\62\32\2\u04f2\u04f0", - "\3\2\2\2\u04f3\u04f6\3\2\2\2\u04f4\u04f2\3\2\2\2\u04f4\u04f5\3\2\2\2", - "\u04f5\u00ad\3\2\2\2\u04f6\u04f4\3\2\2\2\u008d\u00b3\u00bb\u00cf\u00e0", - "\u00ea\u010e\u0118\u0125\u0127\u0132\u014b\u015b\u0169\u016b\u0177\u0179", - "\u0185\u0187\u0199\u019b\u01a7\u01a9\u01b4\u01bf\u01ca\u01d5\u01e0\u01e9", - "\u01f0\u01fc\u0203\u0208\u020d\u0212\u0219\u0223\u022b\u023d\u0241\u0248", - "\u0257\u025c\u0261\u0265\u0269\u026b\u0275\u027a\u027e\u0282\u028a\u0293", - "\u029d\u02a5\u02b6\u02c2\u02c5\u02cb\u02d4\u02d9\u02dc\u02e3\u02f2\u02fe", - "\u0301\u0303\u030b\u030f\u031d\u0321\u0326\u0329\u032c\u0333\u0335\u033a", - "\u033e\u0343\u0347\u034a\u0353\u035b\u0365\u036d\u036f\u0379\u037e\u0382", - "\u0388\u038b\u0394\u0399\u039c\u03a2\u03b2\u03b8\u03bb\u03c0\u03c3\u03ca", - "\u03dd\u03e3\u03e6\u03e8\u03f7\u03fb\u0402\u0407\u0414\u041d\u0426\u0439", - "\u043c\u0444\u0447\u044b\u0450\u045d\u0461\u046c\u0472\u047b\u0486\u048e", - "\u04a1\u04a5\u04a9\u04b1\u04b5\u04ba\u04c5\u04cc\u04cf\u04d3\u04dc\u04e2", - "\u04e5\u04e9\u04f4"].join(""); + "\17\17\4\2\20\20\61\61\u0bfe\2\u017b\3\2\2\2\4\u017d\3\2\2\2\6\u0184", + "\3\2\2\2\b\u0196\3\2\2\2\n\u01ba\3\2\2\2\f\u01d6\3\2\2\2\16\u01f7\3", + "\2\2\2\20\u01f9\3\2\2\2\22\u0207\3\2\2\2\24\u0209\3\2\2\2\26\u021a\3", + "\2\2\2\30\u0228\3\2\2\2\32\u0236\3\2\2\2\34\u024a\3\2\2\2\36\u0258\3", + "\2\2\2 \u0263\3\2\2\2\"\u026e\3\2\2\2$\u0279\3\2\2\2&\u0284\3\2\2\2", + "(\u028f\3\2\2\2*\u029c\3\2\2\2,\u029e\3\2\2\2.\u02a0\3\2\2\2\60\u02ab", + "\3\2\2\2\62\u02b4\3\2\2\2\64\u02b7\3\2\2\2\66\u02bc\3\2\2\28\u02c5\3", + "\2\2\2:\u02c7\3\2\2\2<\u02d7\3\2\2\2>\u02d9\3\2\2\2@\u02e9\3\2\2\2B", + "\u02f4\3\2\2\2D\u02f6\3\2\2\2F\u02f8\3\2\2\2H\u02fc\3\2\2\2J\u030d\3", + "\2\2\2L\u0317\3\2\2\2N\u0319\3\2\2\2P\u032a\3\2\2\2R\u033f\3\2\2\2T", + "\u0341\3\2\2\2V\u0351\3\2\2\2X\u0353\3\2\2\2Z\u0355\3\2\2\2\\\u035a", + "\3\2\2\2^\u0362\3\2\2\2`\u036e\3\2\2\2b\u0371\3\2\2\2d\u0380\3\2\2\2", + "f\u03bb\3\2\2\2h\u03bd\3\2\2\2j\u03cd\3\2\2\2l\u03d8\3\2\2\2n\u03e1", + "\3\2\2\2p\u03f6\3\2\2\2r\u03f8\3\2\2\2t\u0407\3\2\2\2v\u0409\3\2\2\2", + "x\u041b\3\2\2\2z\u041d\3\2\2\2|\u0428\3\2\2\2~\u0437\3\2\2\2\u0080\u0467", + "\3\2\2\2\u0082\u0497\3\2\2\2\u0084\u04a3\3\2\2\2\u0086\u04a5\3\2\2\2", + "\u0088\u04b6\3\2\2\2\u008a\u04b9\3\2\2\2\u008c\u04c9\3\2\2\2\u008e\u04cb", + "\3\2\2\2\u0090\u04fc\3\2\2\2\u0092\u0509\3\2\2\2\u0094\u050b\3\2\2\2", + "\u0096\u0511\3\2\2\2\u0098\u051e\3\2\2\2\u009a\u0520\3\2\2\2\u009c\u0527", + "\3\2\2\2\u009e\u053a\3\2\2\2\u00a0\u0566\3\2\2\2\u00a2\u0578\3\2\2\2", + "\u00a4\u057f\3\2\2\2\u00a6\u0581\3\2\2\2\u00a8\u058e\3\2\2\2\u00aa\u0591", + "\3\2\2\2\u00ac\u0599\3\2\2\2\u00ae\u05cc\3\2\2\2\u00b0\u05ce\3\2\2\2", + "\u00b2\u05de\3\2\2\2\u00b4\u05ea\3\2\2\2\u00b6\u0633\3\2\2\2\u00b8\u063d", + "\3\2\2\2\u00ba\u0660\3\2\2\2\u00bc\u0669\3\2\2\2\u00be\u067b\3\2\2\2", + "\u00c0\u068f\3\2\2\2\u00c2\u069e\3\2\2\2\u00c4\u06ad\3\2\2\2\u00c6\u06c6", + "\3\2\2\2\u00c8\u06d5\3\2\2\2\u00ca\u06df\3\2\2\2\u00cc\u06e9\3\2\2\2", + "\u00ce\u06f3\3\2\2\2\u00d0\u06fd\3\2\2\2\u00d2\u0707\3\2\2\2\u00d4\u0709", + "\3\2\2\2\u00d6\u071b\3\2\2\2\u00d8\u0729\3\2\2\2\u00da\u0733\3\2\2\2", + "\u00dc\u0735\3\2\2\2\u00de\u0742\3\2\2\2\u00e0\u0745\3\2\2\2\u00e2\u074c", + "\3\2\2\2\u00e4\u0761\3\2\2\2\u00e6\u076b\3\2\2\2\u00e8\u0775\3\2\2\2", + "\u00ea\u0783\3\2\2\2\u00ec\u07b9\3\2\2\2\u00ee\u07c6\3\2\2\2\u00f0\u07cc", + "\3\2\2\2\u00f2\u07ce\3\2\2\2\u00f4\u07da\3\2\2\2\u00f6\u07e6\3\2\2\2", + "\u00f8\u07f4\3\2\2\2\u00fa\u07fe\3\2\2\2\u00fc\u080a\3\2\2\2\u00fe\u0822", + "\3\2\2\2\u0100\u082c\3\2\2\2\u0102\u0836\3\2\2\2\u0104\u0838\3\2\2\2", + "\u0106\u083b\3\2\2\2\u0108\u0849\3\2\2\2\u010a\u085c\3\2\2\2\u010c\u086a", + "\3\2\2\2\u010e\u086d\3\2\2\2\u0110\u08b3\3\2\2\2\u0112\u08c1\3\2\2\2", + "\u0114\u08c3\3\2\2\2\u0116\u08d6\3\2\2\2\u0118\u08e1\3\2\2\2\u011a\u08ec", + "\3\2\2\2\u011c\u0904\3\2\2\2\u011e\u090d\3\2\2\2\u0120\u0917\3\2\2\2", + "\u0122\u0921\3\2\2\2\u0124\u092d\3\2\2\2\u0126\u0936\3\2\2\2\u0128\u0938", + "\3\2\2\2\u012a\u094d\3\2\2\2\u012c\u09b4\3\2\2\2\u012e\u09b6\3\2\2\2", + "\u0130\u09c7\3\2\2\2\u0132\u09d7\3\2\2\2\u0134\u09d9\3\2\2\2\u0136\u09e4", + "\3\2\2\2\u0138\u09ee\3\2\2\2\u013a\u09f0\3\2\2\2\u013c\u0a2f\3\2\2\2", + "\u013e\u0a41\3\2\2\2\u0140\u0a43\3\2\2\2\u0142\u0a51\3\2\2\2\u0144\u0a5d", + "\3\2\2\2\u0146\u0a5f\3\2\2\2\u0148\u0a67\3\2\2\2\u014a\u0a7e\3\2\2\2", + "\u014c\u0aaf\3\2\2\2\u014e\u0ac5\3\2\2\2\u0150\u0acc\3\2\2\2\u0152\u0ad5", + "\3\2\2\2\u0154\u0ade\3\2\2\2\u0156\u0ae1\3\2\2\2\u0158\u0af1\3\2\2\2", + "\u015a\u017c\7k\2\2\u015b\u017c\7l\2\2\u015c\u015e\7m\2\2\u015d\u015c", + "\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u015d\3\2\2\2\u015f\u0160\3\2\2\2", + "\u0160\u017c\3\2\2\2\u0161\u0162\7=\2\2\u0162\u0163\5.\30\2\u0163\u0164", + "\7>\2\2\u0164\u017c\3\2\2\2\u0165\u017c\5\4\3\2\u0166\u0168\7\3\2\2", + "\u0167\u0166\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u0169\3\2\2\2\u0169\u016a", + "\7=\2\2\u016a\u016b\5\u0094K\2\u016b\u016c\7>\2\2\u016c\u017c\3\2\2", + "\2\u016d\u016e\7\4\2\2\u016e\u016f\7=\2\2\u016f\u0170\5\16\b\2\u0170", + "\u0171\7Z\2\2\u0171\u0172\5|?\2\u0172\u0173\7>\2\2\u0173\u017c\3\2\2", + "\2\u0174\u0175\7\5\2\2\u0175\u0176\7=\2\2\u0176\u0177\5|?\2\u0177\u0178", + "\7Z\2\2\u0178\u0179\5\16\b\2\u0179\u017a\7>\2\2\u017a\u017c\3\2\2\2", + "\u017b\u015a\3\2\2\2\u017b\u015b\3\2\2\2\u017b\u015d\3\2\2\2\u017b\u0161", + "\3\2\2\2\u017b\u0165\3\2\2\2\u017b\u0167\3\2\2\2\u017b\u016d\3\2\2\2", + "\u017b\u0174\3\2\2\2\u017c\3\3\2\2\2\u017d\u017e\78\2\2\u017e\u017f", + "\7=\2\2\u017f\u0180\5*\26\2\u0180\u0181\7Z\2\2\u0181\u0182\5\6\4\2\u0182", + "\u0183\7>\2\2\u0183\5\3\2\2\2\u0184\u0185\b\4\1\2\u0185\u0186\5\b\5", + "\2\u0186\u018c\3\2\2\2\u0187\u0188\f\3\2\2\u0188\u0189\7Z\2\2\u0189", + "\u018b\5\b\5\2\u018a\u0187\3\2\2\2\u018b\u018e\3\2\2\2\u018c\u018a\3", + "\2\2\2\u018c\u018d\3\2\2\2\u018d\7\3\2\2\2\u018e\u018c\3\2\2\2\u018f", + "\u0190\5|?\2\u0190\u0191\7X\2\2\u0191\u0192\5*\26\2\u0192\u0197\3\2", + "\2\2\u0193\u0194\7\27\2\2\u0194\u0195\7X\2\2\u0195\u0197\5*\26\2\u0196", + "\u018f\3\2\2\2\u0196\u0193\3\2\2\2\u0197\t\3\2\2\2\u0198\u0199\b\6\1", + "\2\u0199\u01bb\5\2\2\2\u019a\u019b\7=\2\2\u019b\u019c\5|?\2\u019c\u019d", + "\7>\2\2\u019d\u019e\7A\2\2\u019e\u019f\5\u0086D\2\u019f\u01a0\7B\2\2", + "\u01a0\u01bb\3\2\2\2\u01a1\u01a2\7=\2\2\u01a2\u01a3\5|?\2\u01a3\u01a4", + "\7>\2\2\u01a4\u01a5\7A\2\2\u01a5\u01a6\5\u0086D\2\u01a6\u01a7\7Z\2\2", + "\u01a7\u01a8\7B\2\2\u01a8\u01bb\3\2\2\2\u01a9\u01aa\7\3\2\2\u01aa\u01ab", + "\7=\2\2\u01ab\u01ac\5|?\2\u01ac\u01ad\7>\2\2\u01ad\u01ae\7A\2\2\u01ae", + "\u01af\5\u0086D\2\u01af\u01b0\7B\2\2\u01b0\u01bb\3\2\2\2\u01b1\u01b2", + "\7\3\2\2\u01b2\u01b3\7=\2\2\u01b3\u01b4\5|?\2\u01b4\u01b5\7>\2\2\u01b5", + "\u01b6\7A\2\2\u01b6\u01b7\5\u0086D\2\u01b7\u01b8\7Z\2\2\u01b8\u01b9", + "\7B\2\2\u01b9\u01bb\3\2\2\2\u01ba\u0198\3\2\2\2\u01ba\u019a\3\2\2\2", + "\u01ba\u01a1\3\2\2\2\u01ba\u01a9\3\2\2\2\u01ba\u01b1\3\2\2\2\u01bb\u01d3", + "\3\2\2\2\u01bc\u01bd\f\f\2\2\u01bd\u01be\7?\2\2\u01be\u01bf\5.\30\2", + "\u01bf\u01c0\7@\2\2\u01c0\u01d2\3\2\2\2\u01c1\u01c2\f\13\2\2\u01c2\u01c4", + "\7=\2\2\u01c3\u01c5\5\f\7\2\u01c4\u01c3\3\2\2\2\u01c4\u01c5\3\2\2\2", + "\u01c5\u01c6\3\2\2\2\u01c6\u01d2\7>\2\2\u01c7\u01c8\f\n\2\2\u01c8\u01c9", + "\7i\2\2\u01c9\u01d2\7k\2\2\u01ca\u01cb\f\t\2\2\u01cb\u01cc\7h\2\2\u01cc", + "\u01d2\7k\2\2\u01cd\u01ce\f\b\2\2\u01ce\u01d2\7J\2\2\u01cf\u01d0\f\7", + "\2\2\u01d0\u01d2\7L\2\2\u01d1\u01bc\3\2\2\2\u01d1\u01c1\3\2\2\2\u01d1", + "\u01c7\3\2\2\2\u01d1\u01ca\3\2\2\2\u01d1\u01cd\3\2\2\2\u01d1\u01cf\3", + "\2\2\2\u01d2\u01d5\3\2\2\2\u01d3\u01d1\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4", + "\13\3\2\2\2\u01d5\u01d3\3\2\2\2\u01d6\u01d7\b\7\1\2\u01d7\u01d8\5*\26", + "\2\u01d8\u01de\3\2\2\2\u01d9\u01da\f\3\2\2\u01da\u01db\7Z\2\2\u01db", + "\u01dd\5*\26\2\u01dc\u01d9\3\2\2\2\u01dd\u01e0\3\2\2\2\u01de\u01dc\3", + "\2\2\2\u01de\u01df\3\2\2\2\u01df\r\3\2\2\2\u01e0\u01de\3\2\2\2\u01e1", + "\u01f8\5\n\6\2\u01e2\u01e3\7J\2\2\u01e3\u01f8\5\16\b\2\u01e4\u01e5\7", + "L\2\2\u01e5\u01f8\5\16\b\2\u01e6\u01e7\5\20\t\2\u01e7\u01e8\5\22\n\2", + "\u01e8\u01f8\3\2\2\2\u01e9\u01ea\7)\2\2\u01ea\u01f8\5\16\b\2\u01eb\u01ec", + "\7)\2\2\u01ec\u01ed\7=\2\2\u01ed\u01ee\5|?\2\u01ee\u01ef\7>\2\2\u01ef", + "\u01f8\3\2\2\2\u01f0\u01f1\7\64\2\2\u01f1\u01f2\7=\2\2\u01f2\u01f3\5", + "|?\2\u01f3\u01f4\7>\2\2\u01f4\u01f8\3\2\2\2\u01f5\u01f6\7R\2\2\u01f6", + "\u01f8\7k\2\2\u01f7\u01e1\3\2\2\2\u01f7\u01e2\3\2\2\2\u01f7\u01e4\3", + "\2\2\2\u01f7\u01e6\3\2\2\2\u01f7\u01e9\3\2\2\2\u01f7\u01eb\3\2\2\2\u01f7", + "\u01f0\3\2\2\2\u01f7\u01f5\3\2\2\2\u01f8\17\3\2\2\2\u01f9\u01fa\t\2", + "\2\2\u01fa\21\3\2\2\2\u01fb\u0208\5\16\b\2\u01fc\u01fd\7=\2\2\u01fd", + "\u01fe\5|?\2\u01fe\u01ff\7>\2\2\u01ff\u0200\5\22\n\2\u0200\u0208\3\2", + "\2\2\u0201\u0202\7\3\2\2\u0202\u0203\7=\2\2\u0203\u0204\5|?\2\u0204", + "\u0205\7>\2\2\u0205\u0206\5\22\n\2\u0206\u0208\3\2\2\2\u0207\u01fb\3", + "\2\2\2\u0207\u01fc\3\2\2\2\u0207\u0201\3\2\2\2\u0208\23\3\2\2\2\u0209", + "\u020a\b\13\1\2\u020a\u020b\5\22\n\2\u020b\u0217\3\2\2\2\u020c\u020d", + "\f\5\2\2\u020d\u020e\7M\2\2\u020e\u0216\5\22\n\2\u020f\u0210\f\4\2\2", + "\u0210\u0211\7N\2\2\u0211\u0216\5\22\n\2\u0212\u0213\f\3\2\2\u0213\u0214", + "\7O\2\2\u0214\u0216\5\22\n\2\u0215\u020c\3\2\2\2\u0215\u020f\3\2\2\2", + "\u0215\u0212\3\2\2\2\u0216\u0219\3\2\2\2\u0217\u0215\3\2\2\2\u0217\u0218", + "\3\2\2\2\u0218\25\3\2\2\2\u0219\u0217\3\2\2\2\u021a\u021b\b\f\1\2\u021b", + "\u021c\5\24\13\2\u021c\u0225\3\2\2\2\u021d\u021e\f\4\2\2\u021e\u021f", + "\7I\2\2\u021f\u0224\5\24\13\2\u0220\u0221\f\3\2\2\u0221\u0222\7K\2\2", + "\u0222\u0224\5\24\13\2\u0223\u021d\3\2\2\2\u0223\u0220\3\2\2\2\u0224", + "\u0227\3\2\2\2\u0225\u0223\3\2\2\2\u0225\u0226\3\2\2\2\u0226\27\3\2", + "\2\2\u0227\u0225\3\2\2\2\u0228\u0229\b\r\1\2\u0229\u022a\5\26\f\2\u022a", + "\u0233\3\2\2\2\u022b\u022c\f\4\2\2\u022c\u022d\7G\2\2\u022d\u0232\5", + "\26\f\2\u022e\u022f\f\3\2\2\u022f\u0230\7H\2\2\u0230\u0232\5\26\f\2", + "\u0231\u022b\3\2\2\2\u0231\u022e\3\2\2\2\u0232\u0235\3\2\2\2\u0233\u0231", + "\3\2\2\2\u0233\u0234\3\2\2\2\u0234\31\3\2\2\2\u0235\u0233\3\2\2\2\u0236", + "\u0237\b\16\1\2\u0237\u0238\5\30\r\2\u0238\u0247\3\2\2\2\u0239\u023a", + "\f\6\2\2\u023a\u023b\7C\2\2\u023b\u0246\5\30\r\2\u023c\u023d\f\5\2\2", + "\u023d\u023e\7E\2\2\u023e\u0246\5\30\r\2\u023f\u0240\f\4\2\2\u0240\u0241", + "\7D\2\2\u0241\u0246\5\30\r\2\u0242\u0243\f\3\2\2\u0243\u0244\7F\2\2", + "\u0244\u0246\5\30\r\2\u0245\u0239\3\2\2\2\u0245\u023c\3\2\2\2\u0245", + "\u023f\3\2\2\2\u0245\u0242\3\2\2\2\u0246\u0249\3\2\2\2\u0247\u0245\3", + "\2\2\2\u0247\u0248\3\2\2\2\u0248\33\3\2\2\2\u0249\u0247\3\2\2\2\u024a", + "\u024b\b\17\1\2\u024b\u024c\5\32\16\2\u024c\u0255\3\2\2\2\u024d\u024e", + "\f\4\2\2\u024e\u024f\7f\2\2\u024f\u0254\5\32\16\2\u0250\u0251\f\3\2", + "\2\u0251\u0252\7g\2\2\u0252\u0254\5\32\16\2\u0253\u024d\3\2\2\2\u0253", + "\u0250\3\2\2\2\u0254\u0257\3\2\2\2\u0255\u0253\3\2\2\2\u0255\u0256\3", + "\2\2\2\u0256\35\3\2\2\2\u0257\u0255\3\2\2\2\u0258\u0259\b\20\1\2\u0259", + "\u025a\5\34\17\2\u025a\u0260\3\2\2\2\u025b\u025c\f\3\2\2\u025c\u025d", + "\7P\2\2\u025d\u025f\5\34\17\2\u025e\u025b\3\2\2\2\u025f\u0262\3\2\2", + "\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\37\3\2\2\2\u0262\u0260", + "\3\2\2\2\u0263\u0264\b\21\1\2\u0264\u0265\5\36\20\2\u0265\u026b\3\2", + "\2\2\u0266\u0267\f\3\2\2\u0267\u0268\7T\2\2\u0268\u026a\5\36\20\2\u0269", + "\u0266\3\2\2\2\u026a\u026d\3\2\2\2\u026b\u0269\3\2\2\2\u026b\u026c\3", + "\2\2\2\u026c!\3\2\2\2\u026d\u026b\3\2\2\2\u026e\u026f\b\22\1\2\u026f", + "\u0270\5 \21\2\u0270\u0276\3\2\2\2\u0271\u0272\f\3\2\2\u0272\u0273\7", + "Q\2\2\u0273\u0275\5 \21\2\u0274\u0271\3\2\2\2\u0275\u0278\3\2\2\2\u0276", + "\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277#\3\2\2\2\u0278\u0276\3\2\2", + "\2\u0279\u027a\b\23\1\2\u027a\u027b\5\"\22\2\u027b\u0281\3\2\2\2\u027c", + "\u027d\f\3\2\2\u027d\u027e\7R\2\2\u027e\u0280\5\"\22\2\u027f\u027c\3", + "\2\2\2\u0280\u0283\3\2\2\2\u0281\u027f\3\2\2\2\u0281\u0282\3\2\2\2\u0282", + "%\3\2\2\2\u0283\u0281\3\2\2\2\u0284\u0285\b\24\1\2\u0285\u0286\5$\23", + "\2\u0286\u028c\3\2\2\2\u0287\u0288\f\3\2\2\u0288\u0289\7S\2\2\u0289", + "\u028b\5$\23\2\u028a\u0287\3\2\2\2\u028b\u028e\3\2\2\2\u028c\u028a\3", + "\2\2\2\u028c\u028d\3\2\2\2\u028d\'\3\2\2\2\u028e\u028c\3\2\2\2\u028f", + "\u0295\5&\24\2\u0290\u0291\7W\2\2\u0291\u0292\5.\30\2\u0292\u0293\7", + "X\2\2\u0293\u0294\5(\25\2\u0294\u0296\3\2\2\2\u0295\u0290\3\2\2\2\u0295", + "\u0296\3\2\2\2\u0296)\3\2\2\2\u0297\u029d\5(\25\2\u0298\u0299\5\16\b", + "\2\u0299\u029a\5,\27\2\u029a\u029b\5*\26\2\u029b\u029d\3\2\2\2\u029c", + "\u0297\3\2\2\2\u029c\u0298\3\2\2\2\u029d+\3\2\2\2\u029e\u029f\t\3\2", + "\2\u029f-\3\2\2\2\u02a0\u02a1\b\30\1\2\u02a1\u02a2\5*\26\2\u02a2\u02a8", + "\3\2\2\2\u02a3\u02a4\f\3\2\2\u02a4\u02a5\7Z\2\2\u02a5\u02a7\5*\26\2", + "\u02a6\u02a3\3\2\2\2\u02a7\u02aa\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a8\u02a9", + "\3\2\2\2\u02a9/\3\2\2\2\u02aa\u02a8\3\2\2\2\u02ab\u02ac\5(\25\2\u02ac", + "\61\3\2\2\2\u02ad\u02af\5\64\33\2\u02ae\u02b0\5:\36\2\u02af\u02ae\3", + "\2\2\2\u02af\u02b0\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u02b2\7Y\2\2\u02b2", + "\u02b5\3\2\2\2\u02b3\u02b5\5\u008eH\2\u02b4\u02ad\3\2\2\2\u02b4\u02b3", + "\3\2\2\2\u02b5\63\3\2\2\2\u02b6\u02b8\58\35\2\u02b7\u02b6\3\2\2\2\u02b8", + "\u02b9\3\2\2\2\u02b9\u02b7\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba\65\3\2", + "\2\2\u02bb\u02bd\58\35\2\u02bc\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2\u02be", + "\u02bc\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\67\3\2\2\2\u02c0\u02c6\5> ", + "\2\u02c1\u02c6\5@!\2\u02c2\u02c6\5\\/\2\u02c3\u02c6\5^\60\2\u02c4\u02c6", + "\5`\61\2\u02c5\u02c0\3\2\2\2\u02c5\u02c1\3\2\2\2\u02c5\u02c2\3\2\2\2", + "\u02c5\u02c3\3\2\2\2\u02c5\u02c4\3\2\2\2\u02c69\3\2\2\2\u02c7\u02c8", + "\b\36\1\2\u02c8\u02c9\5<\37\2\u02c9\u02cf\3\2\2\2\u02ca\u02cb\f\3\2", + "\2\u02cb\u02cc\7Z\2\2\u02cc\u02ce\5<\37\2\u02cd\u02ca\3\2\2\2\u02ce", + "\u02d1\3\2\2\2\u02cf\u02cd\3\2\2\2\u02cf\u02d0\3\2\2\2\u02d0;\3\2\2", + "\2\u02d1\u02cf\3\2\2\2\u02d2\u02d8\5b\62\2\u02d3\u02d4\5b\62\2\u02d4", + "\u02d5\7[\2\2\u02d5\u02d6\5\u0084C\2\u02d6\u02d8\3\2\2\2\u02d7\u02d2", + "\3\2\2\2\u02d7\u02d3\3\2\2\2\u02d8=\3\2\2\2\u02d9\u02da\t\4\2\2\u02da", + "?\3\2\2\2\u02db\u02ea\t\5\2\2\u02dc\u02dd\7\3\2\2\u02dd\u02de\7=\2\2", + "\u02de\u02df\t\6\2\2\u02df\u02ea\7>\2\2\u02e0\u02ea\5Z.\2\u02e1\u02ea", + "\5B\"\2\u02e2\u02ea\5R*\2\u02e3\u02ea\5\u0082B\2\u02e4\u02e5\7\t\2\2", + "\u02e5\u02e6\7=\2\2\u02e6\u02e7\5\60\31\2\u02e7\u02e8\7>\2\2\u02e8\u02ea", + "\3\2\2\2\u02e9\u02db\3\2\2\2\u02e9\u02dc\3\2\2\2\u02e9\u02e0\3\2\2\2", + "\u02e9\u02e1\3\2\2\2\u02e9\u02e2\3\2\2\2\u02e9\u02e3\3\2\2\2\u02e9\u02e4", + "\3\2\2\2\u02eaA\3\2\2\2\u02eb\u02ed\5D#\2\u02ec\u02ee\7k\2\2\u02ed\u02ec", + "\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u02ef\3\2\2\2\u02ef\u02f0\5F$\2\u02f0", + "\u02f5\3\2\2\2\u02f1\u02f2\5D#\2\u02f2\u02f3\7k\2\2\u02f3\u02f5\3\2", + "\2\2\u02f4\u02eb\3\2\2\2\u02f4\u02f1\3\2\2\2\u02f5C\3\2\2\2\u02f6\u02f7", + "\t\7\2\2\u02f7E\3\2\2\2\u02f8\u02f9\7A\2\2\u02f9\u02fa\5H%\2\u02fa\u02fb", + "\7B\2\2\u02fbG\3\2\2\2\u02fc\u02fd\b%\1\2\u02fd\u02fe\5J&\2\u02fe\u0303", + "\3\2\2\2\u02ff\u0300\f\3\2\2\u0300\u0302\5J&\2\u0301\u02ff\3\2\2\2\u0302", + "\u0305\3\2\2\2\u0303\u0301\3\2\2\2\u0303\u0304\3\2\2\2\u0304I\3\2\2", + "\2\u0305\u0303\3\2\2\2\u0306\u0308\5L\'\2\u0307\u0309\5N(\2\u0308\u0307", + "\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u030a\3\2\2\2\u030a\u030b\7Y\2\2", + "\u030b\u030e\3\2\2\2\u030c\u030e\5\u008eH\2\u030d\u0306\3\2\2\2\u030d", + "\u030c\3\2\2\2\u030eK\3\2\2\2\u030f\u0311\5@!\2\u0310\u0312\5L\'\2\u0311", + "\u0310\3\2\2\2\u0311\u0312\3\2\2\2\u0312\u0318\3\2\2\2\u0313\u0315\5", + "\\/\2\u0314\u0316\5L\'\2\u0315\u0314\3\2\2\2\u0315\u0316\3\2\2\2\u0316", + "\u0318\3\2\2\2\u0317\u030f\3\2\2\2\u0317\u0313\3\2\2\2\u0318M\3\2\2", + "\2\u0319\u031a\b(\1\2\u031a\u031b\5P)\2\u031b\u0321\3\2\2\2\u031c\u031d", + "\f\3\2\2\u031d\u031e\7Z\2\2\u031e\u0320\5P)\2\u031f\u031c\3\2\2\2\u0320", + "\u0323\3\2\2\2\u0321\u031f\3\2\2\2\u0321\u0322\3\2\2\2\u0322O\3\2\2", + "\2\u0323\u0321\3\2\2\2\u0324\u032b\5b\62\2\u0325\u0327\5b\62\2\u0326", + "\u0325\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u0329\7", + "X\2\2\u0329\u032b\5\60\31\2\u032a\u0324\3\2\2\2\u032a\u0326\3\2\2\2", + "\u032bQ\3\2\2\2\u032c\u032e\7\33\2\2\u032d\u032f\7k\2\2\u032e\u032d", + "\3\2\2\2\u032e\u032f\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0331\7A\2\2", + "\u0331\u0332\5T+\2\u0332\u0333\7B\2\2\u0333\u0340\3\2\2\2\u0334\u0336", + "\7\33\2\2\u0335\u0337\7k\2\2\u0336\u0335\3\2\2\2\u0336\u0337\3\2\2\2", + "\u0337\u0338\3\2\2\2\u0338\u0339\7A\2\2\u0339\u033a\5T+\2\u033a\u033b", + "\7Z\2\2\u033b\u033c\7B\2\2\u033c\u0340\3\2\2\2\u033d\u033e\7\33\2\2", + "\u033e\u0340\7k\2\2\u033f\u032c\3\2\2\2\u033f\u0334\3\2\2\2\u033f\u033d", + "\3\2\2\2\u0340S\3\2\2\2\u0341\u0342\b+\1\2\u0342\u0343\5V,\2\u0343\u0349", + "\3\2\2\2\u0344\u0345\f\3\2\2\u0345\u0346\7Z\2\2\u0346\u0348\5V,\2\u0347", + "\u0344\3\2\2\2\u0348\u034b\3\2\2\2\u0349\u0347\3\2\2\2\u0349\u034a\3", + "\2\2\2\u034aU\3\2\2\2\u034b\u0349\3\2\2\2\u034c\u0352\5X-\2\u034d\u034e", + "\5X-\2\u034e\u034f\7[\2\2\u034f\u0350\5\60\31\2\u0350\u0352\3\2\2\2", + "\u0351\u034c\3\2\2\2\u0351\u034d\3\2\2\2\u0352W\3\2\2\2\u0353\u0354", + "\7k\2\2\u0354Y\3\2\2\2\u0355\u0356\7\65\2\2\u0356\u0357\7=\2\2\u0357", + "\u0358\5|?\2\u0358\u0359\7>\2\2\u0359[\3\2\2\2\u035a\u035b\t\b\2\2\u035b", + "]\3\2\2\2\u035c\u0363\t\t\2\2\u035d\u0363\5h\65\2\u035e\u035f\7\f\2", + "\2\u035f\u0360\7=\2\2\u0360\u0361\7k\2\2\u0361\u0363\7>\2\2\u0362\u035c", + "\3\2\2\2\u0362\u035d\3\2\2\2\u0362\u035e\3\2\2\2\u0363_\3\2\2\2\u0364", + "\u0365\7\63\2\2\u0365\u0366\7=\2\2\u0366\u0367\5|?\2\u0367\u0368\7>", + "\2\2\u0368\u036f\3\2\2\2\u0369\u036a\7\63\2\2\u036a\u036b\7=\2\2\u036b", + "\u036c\5\60\31\2\u036c\u036d\7>\2\2\u036d\u036f\3\2\2\2\u036e\u0364", + "\3\2\2\2\u036e\u0369\3\2\2\2\u036fa\3\2\2\2\u0370\u0372\5p9\2\u0371", + "\u0370\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0377\5", + "d\63\2\u0374\u0376\5f\64\2\u0375\u0374\3\2\2\2\u0376\u0379\3\2\2\2\u0377", + "\u0375\3\2\2\2\u0377\u0378\3\2\2\2\u0378c\3\2\2\2\u0379\u0377\3\2\2", + "\2\u037a\u037b\b\63\1\2\u037b\u0381\7k\2\2\u037c\u037d\7=\2\2\u037d", + "\u037e\5b\62\2\u037e\u037f\7>\2\2\u037f\u0381\3\2\2\2\u0380\u037a\3", + "\2\2\2\u0380\u037c\3\2\2\2\u0381\u03af\3\2\2\2\u0382\u0383\f\b\2\2\u0383", + "\u0385\7?\2\2\u0384\u0386\5r:\2\u0385\u0384\3\2\2\2\u0385\u0386\3\2", + "\2\2\u0386\u0388\3\2\2\2\u0387\u0389\5*\26\2\u0388\u0387\3\2\2\2\u0388", + "\u0389\3\2\2\2\u0389\u038a\3\2\2\2\u038a\u03ae\7@\2\2\u038b\u038c\f", + "\7\2\2\u038c\u038d\7?\2\2\u038d\u038f\7*\2\2\u038e\u0390\5r:\2\u038f", + "\u038e\3\2\2\2\u038f\u0390\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\5", + "*\26\2\u0392\u0393\7@\2\2\u0393\u03ae\3\2\2\2\u0394\u0395\f\6\2\2\u0395", + "\u0396\7?\2\2\u0396\u0397\5r:\2\u0397\u0398\7*\2\2\u0398\u0399\5*\26", + "\2\u0399\u039a\7@\2\2\u039a\u03ae\3\2\2\2\u039b\u039c\f\5\2\2\u039c", + "\u039e\7?\2\2\u039d\u039f\5r:\2\u039e\u039d\3\2\2\2\u039e\u039f\3\2", + "\2\2\u039f\u03a0\3\2\2\2\u03a0\u03a1\7M\2\2\u03a1\u03ae\7@\2\2\u03a2", + "\u03a3\f\4\2\2\u03a3\u03a4\7=\2\2\u03a4\u03a5\5t;\2\u03a5\u03a6\7>\2", + "\2\u03a6\u03ae\3\2\2\2\u03a7\u03a8\f\3\2\2\u03a8\u03aa\7=\2\2\u03a9", + "\u03ab\5z>\2\u03aa\u03a9\3\2\2\2\u03aa\u03ab\3\2\2\2\u03ab\u03ac\3\2", + "\2\2\u03ac\u03ae\7>\2\2\u03ad\u0382\3\2\2\2\u03ad\u038b\3\2\2\2\u03ad", + "\u0394\3\2\2\2\u03ad\u039b\3\2\2\2\u03ad\u03a2\3\2\2\2\u03ad\u03a7\3", + "\2\2\2\u03ae\u03b1\3\2\2\2\u03af\u03ad\3\2\2\2\u03af\u03b0\3\2\2\2\u03b0", + "e\3\2\2\2\u03b1\u03af\3\2\2\2\u03b2\u03b3\7\r\2\2\u03b3\u03b5\7=\2\2", + "\u03b4\u03b6\7m\2\2\u03b5\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7\u03b5", + "\3\2\2\2\u03b7\u03b8\3\2\2\2\u03b8\u03b9\3\2\2\2\u03b9\u03bc\7>\2\2", + "\u03ba\u03bc\5h\65\2\u03bb\u03b2\3\2\2\2\u03bb\u03ba\3\2\2\2\u03bcg", + "\3\2\2\2\u03bd\u03be\7\16\2\2\u03be\u03bf\7=\2\2\u03bf\u03c0\7=\2\2", + "\u03c0\u03c1\5j\66\2\u03c1\u03c2\7>\2\2\u03c2\u03c3\7>\2\2\u03c3i\3", + "\2\2\2\u03c4\u03c9\5l\67\2\u03c5\u03c6\7Z\2\2\u03c6\u03c8\5l\67\2\u03c7", + "\u03c5\3\2\2\2\u03c8\u03cb\3\2\2\2\u03c9\u03c7\3\2\2\2\u03c9\u03ca\3", + "\2\2\2\u03ca\u03ce\3\2\2\2\u03cb\u03c9\3\2\2\2\u03cc\u03ce\3\2\2\2\u03cd", + "\u03c4\3\2\2\2\u03cd\u03cc\3\2\2\2\u03cek\3\2\2\2\u03cf\u03d5\n\n\2", + "\2\u03d0\u03d2\7=\2\2\u03d1\u03d3\5\f\7\2\u03d2\u03d1\3\2\2\2\u03d2", + "\u03d3\3\2\2\2\u03d3\u03d4\3\2\2\2\u03d4\u03d6\7>\2\2\u03d5\u03d0\3", + "\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d9\3\2\2\2\u03d7\u03d9\3\2\2\2\u03d8", + "\u03cf\3\2\2\2\u03d8\u03d7\3\2\2\2\u03d9m\3\2\2\2\u03da\u03e0\n\13\2", + "\2\u03db\u03dc\7=\2\2\u03dc\u03dd\5n8\2\u03dd\u03de\7>\2\2\u03de\u03e0", + "\3\2\2\2\u03df\u03da\3\2\2\2\u03df\u03db\3\2\2\2\u03e0\u03e3\3\2\2\2", + "\u03e1\u03df\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2o\3\2\2\2\u03e3\u03e1", + "\3\2\2\2\u03e4\u03e6\7M\2\2\u03e5\u03e7\5r:\2\u03e6\u03e5\3\2\2\2\u03e6", + "\u03e7\3\2\2\2\u03e7\u03f7\3\2\2\2\u03e8\u03ea\7M\2\2\u03e9\u03eb\5", + "r:\2\u03ea\u03e9\3\2\2\2\u03ea\u03eb\3\2\2\2\u03eb\u03ec\3\2\2\2\u03ec", + "\u03f7\5p9\2\u03ed\u03ef\7T\2\2\u03ee\u03f0\5r:\2\u03ef\u03ee\3\2\2", + "\2\u03ef\u03f0\3\2\2\2\u03f0\u03f7\3\2\2\2\u03f1\u03f3\7T\2\2\u03f2", + "\u03f4\5r:\2\u03f3\u03f2\3\2\2\2\u03f3\u03f4\3\2\2\2\u03f4\u03f5\3\2", + "\2\2\u03f5\u03f7\5p9\2\u03f6\u03e4\3\2\2\2\u03f6\u03e8\3\2\2\2\u03f6", + "\u03ed\3\2\2\2\u03f6\u03f1\3\2\2\2\u03f7q\3\2\2\2\u03f8\u03f9\b:\1\2", + "\u03f9\u03fa\5\\/\2\u03fa\u03ff\3\2\2\2\u03fb\u03fc\f\3\2\2\u03fc\u03fe", + "\5\\/\2\u03fd\u03fb\3\2\2\2\u03fe\u0401\3\2\2\2\u03ff\u03fd\3\2\2\2", + "\u03ff\u0400\3\2\2\2\u0400s\3\2\2\2\u0401\u03ff\3\2\2\2\u0402\u0408", + "\5v<\2\u0403\u0404\5v<\2\u0404\u0405\7Z\2\2\u0405\u0406\7j\2\2\u0406", + "\u0408\3\2\2\2\u0407\u0402\3\2\2\2\u0407\u0403\3\2\2\2\u0408u\3\2\2", + "\2\u0409\u040a\b<\1\2\u040a\u040b\5x=\2\u040b\u0411\3\2\2\2\u040c\u040d", + "\f\3\2\2\u040d\u040e\7Z\2\2\u040e\u0410\5x=\2\u040f\u040c\3\2\2\2\u0410", + "\u0413\3\2\2\2\u0411\u040f\3\2\2\2\u0411\u0412\3\2\2\2\u0412w\3\2\2", + "\2\u0413\u0411\3\2\2\2\u0414\u0415\5\64\33\2\u0415\u0416\5b\62\2\u0416", + "\u041c\3\2\2\2\u0417\u0419\5\66\34\2\u0418\u041a\5~@\2\u0419\u0418\3", + "\2\2\2\u0419\u041a\3\2\2\2\u041a\u041c\3\2\2\2\u041b\u0414\3\2\2\2\u041b", + "\u0417\3\2\2\2\u041cy\3\2\2\2\u041d\u041e\b>\1\2\u041e\u041f\7k\2\2", + "\u041f\u0425\3\2\2\2\u0420\u0421\f\3\2\2\u0421\u0422\7Z\2\2\u0422\u0424", + "\7k\2\2\u0423\u0420\3\2\2\2\u0424\u0427\3\2\2\2\u0425\u0423\3\2\2\2", + "\u0425\u0426\3\2\2\2\u0426{\3\2\2\2\u0427\u0425\3\2\2\2\u0428\u042a", + "\5L\'\2\u0429\u042b\5~@\2\u042a\u0429\3\2\2\2\u042a\u042b\3\2\2\2\u042b", + "}\3\2\2\2\u042c\u0438\5p9\2\u042d\u042f\5p9\2\u042e\u042d\3\2\2\2\u042e", + "\u042f\3\2\2\2\u042f\u0430\3\2\2\2\u0430\u0434\5\u0080A\2\u0431\u0433", + "\5f\64\2\u0432\u0431\3\2\2\2\u0433\u0436\3\2\2\2\u0434\u0432\3\2\2\2", + "\u0434\u0435\3\2\2\2\u0435\u0438\3\2\2\2\u0436\u0434\3\2\2\2\u0437\u042c", + "\3\2\2\2\u0437\u042e\3\2\2\2\u0438\177\3\2\2\2\u0439\u043a\bA\1\2\u043a", + "\u043b\7=\2\2\u043b\u043c\5~@\2\u043c\u0440\7>\2\2\u043d\u043f\5f\64", + "\2\u043e\u043d\3\2\2\2\u043f\u0442\3\2\2\2\u0440\u043e\3\2\2\2\u0440", + "\u0441\3\2\2\2\u0441\u0468\3\2\2\2\u0442\u0440\3\2\2\2\u0443\u0445\7", + "?\2\2\u0444\u0446\5r:\2\u0445\u0444\3\2\2\2\u0445\u0446\3\2\2\2\u0446", + "\u0448\3\2\2\2\u0447\u0449\5*\26\2\u0448\u0447\3\2\2\2\u0448\u0449\3", + "\2\2\2\u0449\u044a\3\2\2\2\u044a\u0468\7@\2\2\u044b\u044c\7?\2\2\u044c", + "\u044e\7*\2\2\u044d\u044f\5r:\2\u044e\u044d\3\2\2\2\u044e\u044f\3\2", + "\2\2\u044f\u0450\3\2\2\2\u0450\u0451\5*\26\2\u0451\u0452\7@\2\2\u0452", + "\u0468\3\2\2\2\u0453\u0454\7?\2\2\u0454\u0455\5r:\2\u0455\u0456\7*\2", + "\2\u0456\u0457\5*\26\2\u0457\u0458\7@\2\2\u0458\u0468\3\2\2\2\u0459", + "\u045a\7?\2\2\u045a\u045b\7M\2\2\u045b\u0468\7@\2\2\u045c\u045e\7=\2", + "\2\u045d\u045f\5t;\2\u045e\u045d\3\2\2\2\u045e\u045f\3\2\2\2\u045f\u0460", + "\3\2\2\2\u0460\u0464\7>\2\2\u0461\u0463\5f\64\2\u0462\u0461\3\2\2\2", + "\u0463\u0466\3\2\2\2\u0464\u0462\3\2\2\2\u0464\u0465\3\2\2\2\u0465\u0468", + "\3\2\2\2\u0466\u0464\3\2\2\2\u0467\u0439\3\2\2\2\u0467\u0443\3\2\2\2", + "\u0467\u044b\3\2\2\2\u0467\u0453\3\2\2\2\u0467\u0459\3\2\2\2\u0467\u045c", + "\3\2\2\2\u0468\u0494\3\2\2\2\u0469\u046a\f\7\2\2\u046a\u046c\7?\2\2", + "\u046b\u046d\5r:\2\u046c\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046f", + "\3\2\2\2\u046e\u0470\5*\26\2\u046f\u046e\3\2\2\2\u046f\u0470\3\2\2\2", + "\u0470\u0471\3\2\2\2\u0471\u0493\7@\2\2\u0472\u0473\f\6\2\2\u0473\u0474", + "\7?\2\2\u0474\u0476\7*\2\2\u0475\u0477\5r:\2\u0476\u0475\3\2\2\2\u0476", + "\u0477\3\2\2\2\u0477\u0478\3\2\2\2\u0478\u0479\5*\26\2\u0479\u047a\7", + "@\2\2\u047a\u0493\3\2\2\2\u047b\u047c\f\5\2\2\u047c\u047d\7?\2\2\u047d", + "\u047e\5r:\2\u047e\u047f\7*\2\2\u047f\u0480\5*\26\2\u0480\u0481\7@\2", + "\2\u0481\u0493\3\2\2\2\u0482\u0483\f\4\2\2\u0483\u0484\7?\2\2\u0484", + "\u0485\7M\2\2\u0485\u0493\7@\2\2\u0486\u0487\f\3\2\2\u0487\u0489\7=", + "\2\2\u0488\u048a\5t;\2\u0489\u0488\3\2\2\2\u0489\u048a\3\2\2\2\u048a", + "\u048b\3\2\2\2\u048b\u048f\7>\2\2\u048c\u048e\5f\64\2\u048d\u048c\3", + "\2\2\2\u048e\u0491\3\2\2\2\u048f\u048d\3\2\2\2\u048f\u0490\3\2\2\2\u0490", + "\u0493\3\2\2\2\u0491\u048f\3\2\2\2\u0492\u0469\3\2\2\2\u0492\u0472\3", + "\2\2\2\u0492\u047b\3\2\2\2\u0492\u0482\3\2\2\2\u0492\u0486\3\2\2\2\u0493", + "\u0496\3\2\2\2\u0494\u0492\3\2\2\2\u0494\u0495\3\2\2\2\u0495\u0081\3", + "\2\2\2\u0496\u0494\3\2\2\2\u0497\u0498\7k\2\2\u0498\u0083\3\2\2\2\u0499", + "\u04a4\5*\26\2\u049a\u049b\7A\2\2\u049b\u049c\5\u0086D\2\u049c\u049d", + "\7B\2\2\u049d\u04a4\3\2\2\2\u049e\u049f\7A\2\2\u049f\u04a0\5\u0086D", + "\2\u04a0\u04a1\7Z\2\2\u04a1\u04a2\7B\2\2\u04a2\u04a4\3\2\2\2\u04a3\u0499", + "\3\2\2\2\u04a3\u049a\3\2\2\2\u04a3\u049e\3\2\2\2\u04a4\u0085\3\2\2\2", + "\u04a5\u04a7\bD\1\2\u04a6\u04a8\5\u0088E\2\u04a7\u04a6\3\2\2\2\u04a7", + "\u04a8\3\2\2\2\u04a8\u04a9\3\2\2\2\u04a9\u04aa\5\u0084C\2\u04aa\u04b3", + "\3\2\2\2\u04ab\u04ac\f\3\2\2\u04ac\u04ae\7Z\2\2\u04ad\u04af\5\u0088", + "E\2\u04ae\u04ad\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0", + "\u04b2\5\u0084C\2\u04b1\u04ab\3\2\2\2\u04b2\u04b5\3\2\2\2\u04b3\u04b1", + "\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4\u0087\3\2\2\2\u04b5\u04b3\3\2\2\2", + "\u04b6\u04b7\5\u008aF\2\u04b7\u04b8\7[\2\2\u04b8\u0089\3\2\2\2\u04b9", + "\u04ba\bF\1\2\u04ba\u04bb\5\u008cG\2\u04bb\u04c0\3\2\2\2\u04bc\u04bd", + "\f\3\2\2\u04bd\u04bf\5\u008cG\2\u04be\u04bc\3\2\2\2\u04bf\u04c2\3\2", + "\2\2\u04c0\u04be\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u008b\3\2\2\2\u04c2", + "\u04c0\3\2\2\2\u04c3\u04c4\7?\2\2\u04c4\u04c5\5\60\31\2\u04c5\u04c6", + "\7@\2\2\u04c6\u04ca\3\2\2\2\u04c7\u04c8\7i\2\2\u04c8\u04ca\7k\2\2\u04c9", + "\u04c3\3\2\2\2\u04c9\u04c7\3\2\2\2\u04ca\u008d\3\2\2\2\u04cb\u04cc\7", + ";\2\2\u04cc\u04cd\7=\2\2\u04cd\u04ce\5\60\31\2\u04ce\u04d0\7Z\2\2\u04cf", + "\u04d1\7m\2\2\u04d0\u04cf\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u04d0\3", + "\2\2\2\u04d2\u04d3\3\2\2\2\u04d3\u04d4\3\2\2\2\u04d4\u04d5\7>\2\2\u04d5", + "\u04d6\7Y\2\2\u04d6\u008f\3\2\2\2\u04d7\u04fd\5\u0092J\2\u04d8\u04fd", + "\5\u0094K\2\u04d9\u04fd\5\u009cO\2\u04da\u04fd\5\u009eP\2\u04db\u04fd", + "\5\u00a0Q\2\u04dc\u04fd\5\u00a2R\2\u04dd\u04de\t\f\2\2\u04de\u04df\t", + "\r\2\2\u04df\u04e8\7=\2\2\u04e0\u04e5\5&\24\2\u04e1\u04e2\7Z\2\2\u04e2", + "\u04e4\5&\24\2\u04e3\u04e1\3\2\2\2\u04e4\u04e7\3\2\2\2\u04e5\u04e3\3", + "\2\2\2\u04e5\u04e6\3\2\2\2\u04e6\u04e9\3\2\2\2\u04e7\u04e5\3\2\2\2\u04e8", + "\u04e0\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u04f7\3\2\2\2\u04ea\u04f3\7", + "X\2\2\u04eb\u04f0\5&\24\2\u04ec\u04ed\7Z\2\2\u04ed\u04ef\5&\24\2\u04ee", + "\u04ec\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2\2\2\u04f0\u04f1\3", + "\2\2\2\u04f1\u04f4\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f3\u04eb\3\2\2\2\u04f3", + "\u04f4\3\2\2\2\u04f4\u04f6\3\2\2\2\u04f5\u04ea\3\2\2\2\u04f6\u04f9\3", + "\2\2\2\u04f7\u04f5\3\2\2\2\u04f7\u04f8\3\2\2\2\u04f8\u04fa\3\2\2\2\u04f9", + "\u04f7\3\2\2\2\u04fa\u04fb\7>\2\2\u04fb\u04fd\7Y\2\2\u04fc\u04d7\3\2", + "\2\2\u04fc\u04d8\3\2\2\2\u04fc\u04d9\3\2\2\2\u04fc\u04da\3\2\2\2\u04fc", + "\u04db\3\2\2\2\u04fc\u04dc\3\2\2\2\u04fc\u04dd\3\2\2\2\u04fd\u0091\3", + "\2\2\2\u04fe\u04ff\7k\2\2\u04ff\u0500\7X\2\2\u0500\u050a\5\u0090I\2", + "\u0501\u0502\7\23\2\2\u0502\u0503\5\60\31\2\u0503\u0504\7X\2\2\u0504", + "\u0505\5\u0090I\2\u0505\u050a\3\2\2\2\u0506\u0507\7\27\2\2\u0507\u0508", + "\7X\2\2\u0508\u050a\5\u0090I\2\u0509\u04fe\3\2\2\2\u0509\u0501\3\2\2", + "\2\u0509\u0506\3\2\2\2\u050a\u0093\3\2\2\2\u050b\u050d\7A\2\2\u050c", + "\u050e\5\u0096L\2\u050d\u050c\3\2\2\2\u050d\u050e\3\2\2\2\u050e\u050f", + "\3\2\2\2\u050f\u0510\7B\2\2\u0510\u0095\3\2\2\2\u0511\u0512\bL\1\2\u0512", + "\u0513\5\u0098M\2\u0513\u0518\3\2\2\2\u0514\u0515\f\3\2\2\u0515\u0517", + "\5\u0098M\2\u0516\u0514\3\2\2\2\u0517\u051a\3\2\2\2\u0518\u0516\3\2", + "\2\2\u0518\u0519\3\2\2\2\u0519\u0097\3\2\2\2\u051a\u0518\3\2\2\2\u051b", + "\u051f\5\u009aN\2\u051c\u051f\5\62\32\2\u051d\u051f\5\u0090I\2\u051e", + "\u051b\3\2\2\2\u051e\u051c\3\2\2\2\u051e\u051d\3\2\2\2\u051f\u0099\3", + "\2\2\2\u0520\u0521\7k\2\2\u0521\u0522\7=\2\2\u0522\u0523\5*\26\2\u0523", + "\u0524\7>\2\2\u0524\u0525\7Y\2\2\u0525\u009b\3\2\2\2\u0526\u0528\5.", + "\30\2\u0527\u0526\3\2\2\2\u0527\u0528\3\2\2\2\u0528\u0529\3\2\2\2\u0529", + "\u052a\7Y\2\2\u052a\u009d\3\2\2\2\u052b\u052c\7 \2\2\u052c\u052d\7=", + "\2\2\u052d\u052e\5.\30\2\u052e\u052f\7>\2\2\u052f\u0532\5\u0090I\2\u0530", + "\u0531\7\32\2\2\u0531\u0533\5\u0090I\2\u0532\u0530\3\2\2\2\u0532\u0533", + "\3\2\2\2\u0533\u053b\3\2\2\2\u0534\u0535\7,\2\2\u0535\u0536\7=\2\2\u0536", + "\u0537\5.\30\2\u0537\u0538\7>\2\2\u0538\u0539\5\u0090I\2\u0539\u053b", + "\3\2\2\2\u053a\u052b\3\2\2\2\u053a\u0534\3\2\2\2\u053b\u009f\3\2\2\2", + "\u053c\u053d\7\62\2\2\u053d\u053e\7=\2\2\u053e\u053f\5.\30\2\u053f\u0540", + "\7>\2\2\u0540\u0541\5\u0090I\2\u0541\u0567\3\2\2\2\u0542\u0543\7\30", + "\2\2\u0543\u0544\5\u0090I\2\u0544\u0545\7\62\2\2\u0545\u0546\7=\2\2", + "\u0546\u0547\5.\30\2\u0547\u0548\7>\2\2\u0548\u0549\7Y\2\2\u0549\u0567", + "\3\2\2\2\u054a\u054b\7\36\2\2\u054b\u054d\7=\2\2\u054c\u054e\5.\30\2", + "\u054d\u054c\3\2\2\2\u054d\u054e\3\2\2\2\u054e\u054f\3\2\2\2\u054f\u0551", + "\7Y\2\2\u0550\u0552\5.\30\2\u0551\u0550\3\2\2\2\u0551\u0552\3\2\2\2", + "\u0552\u0553\3\2\2\2\u0553\u0555\7Y\2\2\u0554\u0556\5.\30\2\u0555\u0554", + "\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0557\3\2\2\2\u0557\u0558\7>\2\2", + "\u0558\u0567\5\u0090I\2\u0559\u055a\7\36\2\2\u055a\u055b\7=\2\2\u055b", + "\u055d\5\62\32\2\u055c\u055e\5.\30\2\u055d\u055c\3\2\2\2\u055d\u055e", + "\3\2\2\2\u055e\u055f\3\2\2\2\u055f\u0561\7Y\2\2\u0560\u0562\5.\30\2", + "\u0561\u0560\3\2\2\2\u0561\u0562\3\2\2\2\u0562\u0563\3\2\2\2\u0563\u0564", + "\7>\2\2\u0564\u0565\5\u0090I\2\u0565\u0567\3\2\2\2\u0566\u053c\3\2\2", + "\2\u0566\u0542\3\2\2\2\u0566\u054a\3\2\2\2\u0566\u0559\3\2\2\2\u0567", + "\u00a1\3\2\2\2\u0568\u0569\7\37\2\2\u0569\u056a\7k\2\2\u056a\u0579\7", + "Y\2\2\u056b\u056c\7\26\2\2\u056c\u0579\7Y\2\2\u056d\u056e\7\22\2\2\u056e", + "\u0579\7Y\2\2\u056f\u0571\7&\2\2\u0570\u0572\5.\30\2\u0571\u0570\3\2", + "\2\2\u0571\u0572\3\2\2\2\u0572\u0573\3\2\2\2\u0573\u0579\7Y\2\2\u0574", + "\u0575\7\37\2\2\u0575\u0576\5\16\b\2\u0576\u0577\7Y\2\2\u0577\u0579", + "\3\2\2\2\u0578\u0568\3\2\2\2\u0578\u056b\3\2\2\2\u0578\u056d\3\2\2\2", + "\u0578\u056f\3\2\2\2\u0578\u0574\3\2\2\2\u0579\u00a3\3\2\2\2\u057a\u057c", + "\5\u00a6T\2\u057b\u057a\3\2\2\2\u057b\u057c\3\2\2\2\u057c\u057d\3\2", + "\2\2\u057d\u0580\7\2\2\3\u057e\u0580\7\2\2\3\u057f\u057b\3\2\2\2\u057f", + "\u057e\3\2\2\2\u0580\u00a5\3\2\2\2\u0581\u0582\bT\1\2\u0582\u0583\5", + "\u00a8U\2\u0583\u0588\3\2\2\2\u0584\u0585\f\3\2\2\u0585\u0587\5\u00a8", + "U\2\u0586\u0584\3\2\2\2\u0587\u058a\3\2\2\2\u0588\u0586\3\2\2\2\u0588", + "\u0589\3\2\2\2\u0589\u00a7\3\2\2\2\u058a\u0588\3\2\2\2\u058b\u058f\5", + "\u00aaV\2\u058c\u058f\5\62\32\2\u058d\u058f\7Y\2\2\u058e\u058b\3\2\2", + "\2\u058e\u058c\3\2\2\2\u058e\u058d\3\2\2\2\u058f\u00a9\3\2\2\2\u0590", + "\u0592\5\64\33\2\u0591\u0590\3\2\2\2\u0591\u0592\3\2\2\2\u0592\u0593", + "\3\2\2\2\u0593\u0595\5b\62\2\u0594\u0596\5\u00acW\2\u0595\u0594\3\2", + "\2\2\u0595\u0596\3\2\2\2\u0596\u0597\3\2\2\2\u0597\u0598\5\u0094K\2", + "\u0598\u00ab\3\2\2\2\u0599\u059a\bW\1\2\u059a\u059b\5\62\32\2\u059b", + "\u05a0\3\2\2\2\u059c\u059d\f\3\2\2\u059d\u059f\5\62\32\2\u059e\u059c", + "\3\2\2\2\u059f\u05a2\3\2\2\2\u05a0\u059e\3\2\2\2\u05a0\u05a1\3\2\2\2", + "\u05a1\u00ad\3\2\2\2\u05a2\u05a0\3\2\2\2\u05a3\u05a4\7k\2\2\u05a4\u05cd", + "\7\2\2\3\u05a5\u05a6\7l\2\2\u05a6\u05cd\7\2\2\3\u05a7\u05a9\7m\2\2\u05a8", + "\u05a7\3\2\2\2\u05a9\u05aa\3\2\2\2\u05aa\u05a8\3\2\2\2\u05aa\u05ab\3", + "\2\2\2\u05ab\u05ac\3\2\2\2\u05ac\u05cd\7\2\2\3\u05ad\u05ae\7=\2\2\u05ae", + "\u05af\5.\30\2\u05af\u05b0\7>\2\2\u05b0\u05b1\7\2\2\3\u05b1\u05cd\3", + "\2\2\2\u05b2\u05b3\5\4\3\2\u05b3\u05b4\7\2\2\3\u05b4\u05cd\3\2\2\2\u05b5", + "\u05b7\7\3\2\2\u05b6\u05b5\3\2\2\2\u05b6\u05b7\3\2\2\2\u05b7\u05b8\3", + "\2\2\2\u05b8\u05b9\7=\2\2\u05b9\u05ba\5\u0094K\2\u05ba\u05bb\7>\2\2", + "\u05bb\u05cd\3\2\2\2\u05bc\u05bd\7\4\2\2\u05bd\u05be\7=\2\2\u05be\u05bf", + "\5\16\b\2\u05bf\u05c0\7Z\2\2\u05c0\u05c1\5|?\2\u05c1\u05c2\7>\2\2\u05c2", + "\u05c3\7\2\2\3\u05c3\u05cd\3\2\2\2\u05c4\u05c5\7\5\2\2\u05c5\u05c6\7", + "=\2\2\u05c6\u05c7\5|?\2\u05c7\u05c8\7Z\2\2\u05c8\u05c9\5\16\b\2\u05c9", + "\u05ca\7>\2\2\u05ca\u05cb\7\2\2\3\u05cb\u05cd\3\2\2\2\u05cc\u05a3\3", + "\2\2\2\u05cc\u05a5\3\2\2\2\u05cc\u05a8\3\2\2\2\u05cc\u05ad\3\2\2\2\u05cc", + "\u05b2\3\2\2\2\u05cc\u05b6\3\2\2\2\u05cc\u05bc\3\2\2\2\u05cc\u05c4\3", + "\2\2\2\u05cd\u00af\3\2\2\2\u05ce\u05cf\78\2\2\u05cf\u05d0\7=\2\2\u05d0", + "\u05d1\5*\26\2\u05d1\u05d2\7Z\2\2\u05d2\u05d3\5\6\4\2\u05d3\u05d4\7", + ">\2\2\u05d4\u05d5\7\2\2\3\u05d5\u00b1\3\2\2\2\u05d6\u05d7\5\b\5\2\u05d7", + "\u05d8\7\2\2\3\u05d8\u05df\3\2\2\2\u05d9\u05da\5\6\4\2\u05da\u05db\7", + "Z\2\2\u05db\u05dc\5\b\5\2\u05dc\u05dd\7\2\2\3\u05dd\u05df\3\2\2\2\u05de", + "\u05d6\3\2\2\2\u05de\u05d9\3\2\2\2\u05df\u00b3\3\2\2\2\u05e0\u05e1\5", + "|?\2\u05e1\u05e2\7X\2\2\u05e2\u05e3\5*\26\2\u05e3\u05e4\7\2\2\3\u05e4", + "\u05eb\3\2\2\2\u05e5\u05e6\7\27\2\2\u05e6\u05e7\7X\2\2\u05e7\u05e8\5", + "*\26\2\u05e8\u05e9\7\2\2\3\u05e9\u05eb\3\2\2\2\u05ea\u05e0\3\2\2\2\u05ea", + "\u05e5\3\2\2\2\u05eb\u00b5\3\2\2\2\u05ec\u05ed\5\2\2\2\u05ed\u05ee\7", + "\2\2\3\u05ee\u0634\3\2\2\2\u05ef\u05f0\5\n\6\2\u05f0\u05f1\7?\2\2\u05f1", + "\u05f2\5.\30\2\u05f2\u05f3\7@\2\2\u05f3\u05f4\7\2\2\3\u05f4\u0634\3", + "\2\2\2\u05f5\u05f6\5\n\6\2\u05f6\u05f8\7=\2\2\u05f7\u05f9\5\f\7\2\u05f8", + "\u05f7\3\2\2\2\u05f8\u05f9\3\2\2\2\u05f9\u05fa\3\2\2\2\u05fa\u05fb\7", + ">\2\2\u05fb\u05fc\7\2\2\3\u05fc\u0634\3\2\2\2\u05fd\u05fe\5\n\6\2\u05fe", + "\u05ff\7i\2\2\u05ff\u0600\7k\2\2\u0600\u0601\7\2\2\3\u0601\u0634\3\2", + "\2\2\u0602\u0603\5\n\6\2\u0603\u0604\7h\2\2\u0604\u0605\7k\2\2\u0605", + "\u0606\7\2\2\3\u0606\u0634\3\2\2\2\u0607\u0608\5\n\6\2\u0608\u0609\7", + "J\2\2\u0609\u060a\7\2\2\3\u060a\u0634\3\2\2\2\u060b\u060c\5\n\6\2\u060c", + "\u060d\7L\2\2\u060d\u060e\7\2\2\3\u060e\u0634\3\2\2\2\u060f\u0610\7", + "=\2\2\u0610\u0611\5|?\2\u0611\u0612\7>\2\2\u0612\u0613\7A\2\2\u0613", + "\u0614\5\u0086D\2\u0614\u0615\7B\2\2\u0615\u0616\7\2\2\3\u0616\u0634", + "\3\2\2\2\u0617\u0618\7=\2\2\u0618\u0619\5|?\2\u0619\u061a\7>\2\2\u061a", + "\u061b\7A\2\2\u061b\u061c\5\u0086D\2\u061c\u061d\7Z\2\2\u061d\u061e", + "\7B\2\2\u061e\u061f\7\2\2\3\u061f\u0634\3\2\2\2\u0620\u0621\7\3\2\2", + "\u0621\u0622\7=\2\2\u0622\u0623\5|?\2\u0623\u0624\7>\2\2\u0624\u0625", + "\7A\2\2\u0625\u0626\5\u0086D\2\u0626\u0627\7B\2\2\u0627\u0628\7\2\2", + "\3\u0628\u0634\3\2\2\2\u0629\u062a\7\3\2\2\u062a\u062b\7=\2\2\u062b", + "\u062c\5|?\2\u062c\u062d\7>\2\2\u062d\u062e\7A\2\2\u062e\u062f\5\u0086", + "D\2\u062f\u0630\7Z\2\2\u0630\u0631\7B\2\2\u0631\u0632\7\2\2\3\u0632", + "\u0634\3\2\2\2\u0633\u05ec\3\2\2\2\u0633\u05ef\3\2\2\2\u0633\u05f5\3", + "\2\2\2\u0633\u05fd\3\2\2\2\u0633\u0602\3\2\2\2\u0633\u0607\3\2\2\2\u0633", + "\u060b\3\2\2\2\u0633\u060f\3\2\2\2\u0633\u0617\3\2\2\2\u0633\u0620\3", + "\2\2\2\u0633\u0629\3\2\2\2\u0634\u00b7\3\2\2\2\u0635\u0636\5*\26\2\u0636", + "\u0637\7\2\2\3\u0637\u063e\3\2\2\2\u0638\u0639\5\f\7\2\u0639\u063a\7", + "Z\2\2\u063a\u063b\5*\26\2\u063b\u063c\7\2\2\3\u063c\u063e\3\2\2\2\u063d", + "\u0635\3\2\2\2\u063d\u0638\3\2\2\2\u063e\u00b9\3\2\2\2\u063f\u0640\5", + "\n\6\2\u0640\u0641\7\2\2\3\u0641\u0661\3\2\2\2\u0642\u0643\7J\2\2\u0643", + "\u0644\5\16\b\2\u0644\u0645\7\2\2\3\u0645\u0661\3\2\2\2\u0646\u0647", + "\7L\2\2\u0647\u0648\5\16\b\2\u0648\u0649\7\2\2\3\u0649\u0661\3\2\2\2", + "\u064a\u064b\5\20\t\2\u064b\u064c\5\22\n\2\u064c\u064d\7\2\2\3\u064d", + "\u0661\3\2\2\2\u064e\u064f\7)\2\2\u064f\u0650\5\16\b\2\u0650\u0651\7", + "\2\2\3\u0651\u0661\3\2\2\2\u0652\u0653\7)\2\2\u0653\u0654\7=\2\2\u0654", + "\u0655\5|?\2\u0655\u0656\7>\2\2\u0656\u0657\7\2\2\3\u0657\u0661\3\2", + "\2\2\u0658\u0659\7\64\2\2\u0659\u065a\7=\2\2\u065a\u065b\5|?\2\u065b", + "\u065c\7>\2\2\u065c\u065d\7\2\2\3\u065d\u0661\3\2\2\2\u065e\u065f\7", + "R\2\2\u065f\u0661\7k\2\2\u0660\u063f\3\2\2\2\u0660\u0642\3\2\2\2\u0660", + "\u0646\3\2\2\2\u0660\u064a\3\2\2\2\u0660\u064e\3\2\2\2\u0660\u0652\3", + "\2\2\2\u0660\u0658\3\2\2\2\u0660\u065e\3\2\2\2\u0661\u00bb\3\2\2\2\u0662", + "\u066a\7P\2\2\u0663\u066a\7M\2\2\u0664\u066a\7I\2\2\u0665\u066a\7K\2", + "\2\u0666\u066a\7V\2\2\u0667\u0668\7U\2\2\u0668\u066a\7\2\2\3\u0669\u0662", + "\3\2\2\2\u0669\u0663\3\2\2\2\u0669\u0664\3\2\2\2\u0669\u0665\3\2\2\2", + "\u0669\u0666\3\2\2\2\u0669\u0667\3\2\2\2\u066a\u00bd\3\2\2\2\u066b\u066c", + "\5\16\b\2\u066c\u066d\7\2\2\3\u066d\u067c\3\2\2\2\u066e\u066f\7=\2\2", + "\u066f\u0670\5|?\2\u0670\u0671\7>\2\2\u0671\u0672\5\22\n\2\u0672\u0673", + "\7\2\2\3\u0673\u067c\3\2\2\2\u0674\u0675\7\3\2\2\u0675\u0676\7=\2\2", + "\u0676\u0677\5|?\2\u0677\u0678\7>\2\2\u0678\u0679\5\22\n\2\u0679\u067a", + "\7\2\2\3\u067a\u067c\3\2\2\2\u067b\u066b\3\2\2\2\u067b\u066e\3\2\2\2", + "\u067b\u0674\3\2\2\2\u067c\u00bf\3\2\2\2\u067d\u067e\5\22\n\2\u067e", + "\u067f\7\2\2\3\u067f\u0690\3\2\2\2\u0680\u0681\5\24\13\2\u0681\u0682", + "\7M\2\2\u0682\u0683\5\22\n\2\u0683\u0684\7\2\2\3\u0684\u0690\3\2\2\2", + "\u0685\u0686\5\24\13\2\u0686\u0687\7N\2\2\u0687\u0688\5\22\n\2\u0688", + "\u0689\7\2\2\3\u0689\u0690\3\2\2\2\u068a\u068b\5\24\13\2\u068b\u068c", + "\7O\2\2\u068c\u068d\5\22\n\2\u068d\u068e\7\2\2\3\u068e\u0690\3\2\2\2", + "\u068f\u067d\3\2\2\2\u068f\u0680\3\2\2\2\u068f\u0685\3\2\2\2\u068f\u068a", + "\3\2\2\2\u0690\u00c1\3\2\2\2\u0691\u0692\5\24\13\2\u0692\u0693\7\2\2", + "\3\u0693\u069f\3\2\2\2\u0694\u0695\5\26\f\2\u0695\u0696\7I\2\2\u0696", + "\u0697\5\24\13\2\u0697\u0698\7\2\2\3\u0698\u069f\3\2\2\2\u0699\u069a", + "\5\26\f\2\u069a\u069b\7K\2\2\u069b\u069c\5\24\13\2\u069c\u069d\7\2\2", + "\3\u069d\u069f\3\2\2\2\u069e\u0691\3\2\2\2\u069e\u0694\3\2\2\2\u069e", + "\u0699\3\2\2\2\u069f\u00c3\3\2\2\2\u06a0\u06a1\5\26\f\2\u06a1\u06a2", + "\7\2\2\3\u06a2\u06ae\3\2\2\2\u06a3\u06a4\5\30\r\2\u06a4\u06a5\7G\2\2", + "\u06a5\u06a6\5\26\f\2\u06a6\u06a7\7\2\2\3\u06a7\u06ae\3\2\2\2\u06a8", + "\u06a9\5\30\r\2\u06a9\u06aa\7H\2\2\u06aa\u06ab\5\26\f\2\u06ab\u06ac", + "\7\2\2\3\u06ac\u06ae\3\2\2\2\u06ad\u06a0\3\2\2\2\u06ad\u06a3\3\2\2\2", + "\u06ad\u06a8\3\2\2\2\u06ae\u00c5\3\2\2\2\u06af\u06b0\5\30\r\2\u06b0", + "\u06b1\7\2\2\3\u06b1\u06c7\3\2\2\2\u06b2\u06b3\5\32\16\2\u06b3\u06b4", + "\7C\2\2\u06b4\u06b5\5\30\r\2\u06b5\u06b6\7\2\2\3\u06b6\u06c7\3\2\2\2", + "\u06b7\u06b8\5\32\16\2\u06b8\u06b9\7E\2\2\u06b9\u06ba\5\30\r\2\u06ba", + "\u06bb\7\2\2\3\u06bb\u06c7\3\2\2\2\u06bc\u06bd\5\32\16\2\u06bd\u06be", + "\7D\2\2\u06be\u06bf\5\30\r\2\u06bf\u06c0\7\2\2\3\u06c0\u06c7\3\2\2\2", + "\u06c1\u06c2\5\32\16\2\u06c2\u06c3\7F\2\2\u06c3\u06c4\5\30\r\2\u06c4", + "\u06c5\7\2\2\3\u06c5\u06c7\3\2\2\2\u06c6\u06af\3\2\2\2\u06c6\u06b2\3", + "\2\2\2\u06c6\u06b7\3\2\2\2\u06c6\u06bc\3\2\2\2\u06c6\u06c1\3\2\2\2\u06c7", + "\u00c7\3\2\2\2\u06c8\u06c9\5\32\16\2\u06c9\u06ca\7\2\2\3\u06ca\u06d6", + "\3\2\2\2\u06cb\u06cc\5\34\17\2\u06cc\u06cd\7f\2\2\u06cd\u06ce\5\32\16", + "\2\u06ce\u06cf\7\2\2\3\u06cf\u06d6\3\2\2\2\u06d0\u06d1\5\34\17\2\u06d1", + "\u06d2\7g\2\2\u06d2\u06d3\5\32\16\2\u06d3\u06d4\7\2\2\3\u06d4\u06d6", + "\3\2\2\2\u06d5\u06c8\3\2\2\2\u06d5\u06cb\3\2\2\2\u06d5\u06d0\3\2\2\2", + "\u06d6\u00c9\3\2\2\2\u06d7\u06d8\5\34\17\2\u06d8\u06d9\7\2\2\3\u06d9", + "\u06e0\3\2\2\2\u06da\u06db\5\36\20\2\u06db\u06dc\7P\2\2\u06dc\u06dd", + "\5\34\17\2\u06dd\u06de\7\2\2\3\u06de\u06e0\3\2\2\2\u06df\u06d7\3\2\2", + "\2\u06df\u06da\3\2\2\2\u06e0\u00cb\3\2\2\2\u06e1\u06e2\5\36\20\2\u06e2", + "\u06e3\7\2\2\3\u06e3\u06ea\3\2\2\2\u06e4\u06e5\5 \21\2\u06e5\u06e6\7", + "T\2\2\u06e6\u06e7\5\36\20\2\u06e7\u06e8\7\2\2\3\u06e8\u06ea\3\2\2\2", + "\u06e9\u06e1\3\2\2\2\u06e9\u06e4\3\2\2\2\u06ea\u00cd\3\2\2\2\u06eb\u06ec", + "\5 \21\2\u06ec\u06ed\7\2\2\3\u06ed\u06f4\3\2\2\2\u06ee\u06ef\5\"\22", + "\2\u06ef\u06f0\7Q\2\2\u06f0\u06f1\5 \21\2\u06f1\u06f2\7\2\2\3\u06f2", + "\u06f4\3\2\2\2\u06f3\u06eb\3\2\2\2\u06f3\u06ee\3\2\2\2\u06f4\u00cf\3", + "\2\2\2\u06f5\u06f6\5\"\22\2\u06f6\u06f7\7\2\2\3\u06f7\u06fe\3\2\2\2", + "\u06f8\u06f9\5$\23\2\u06f9\u06fa\7R\2\2\u06fa\u06fb\5\"\22\2\u06fb\u06fc", + "\7\2\2\3\u06fc\u06fe\3\2\2\2\u06fd\u06f5\3\2\2\2\u06fd\u06f8\3\2\2\2", + "\u06fe\u00d1\3\2\2\2\u06ff\u0700\5$\23\2\u0700\u0701\7\2\2\3\u0701\u0708", + "\3\2\2\2\u0702\u0703\5&\24\2\u0703\u0704\7S\2\2\u0704\u0705\5$\23\2", + "\u0705\u0706\7\2\2\3\u0706\u0708\3\2\2\2\u0707\u06ff\3\2\2\2\u0707\u0702", + "\3\2\2\2\u0708\u00d3\3\2\2\2\u0709\u070f\5&\24\2\u070a\u070b\7W\2\2", + "\u070b\u070c\5.\30\2\u070c\u070d\7X\2\2\u070d\u070e\5(\25\2\u070e\u0710", + "\3\2\2\2\u070f\u070a\3\2\2\2\u070f\u0710\3\2\2\2\u0710\u0711\3\2\2\2", + "\u0711\u0712\7\2\2\3\u0712\u00d5\3\2\2\2\u0713\u0714\5(\25\2\u0714\u0715", + "\7\2\2\3\u0715\u071c\3\2\2\2\u0716\u0717\5\16\b\2\u0717\u0718\5,\27", + "\2\u0718\u0719\5*\26\2\u0719\u071a\7\2\2\3\u071a\u071c\3\2\2\2\u071b", + "\u0713\3\2\2\2\u071b\u0716\3\2\2\2\u071c\u00d7\3\2\2\2\u071d\u072a\7", + "[\2\2\u071e\u072a\7\\\2\2\u071f\u072a\7]\2\2\u0720\u072a\7^\2\2\u0721", + "\u072a\7_\2\2\u0722\u072a\7`\2\2\u0723\u072a\7a\2\2\u0724\u072a\7b\2", + "\2\u0725\u072a\7c\2\2\u0726\u072a\7d\2\2\u0727\u0728\7e\2\2\u0728\u072a", + "\7\2\2\3\u0729\u071d\3\2\2\2\u0729\u071e\3\2\2\2\u0729\u071f\3\2\2\2", + "\u0729\u0720\3\2\2\2\u0729\u0721\3\2\2\2\u0729\u0722\3\2\2\2\u0729\u0723", + "\3\2\2\2\u0729\u0724\3\2\2\2\u0729\u0725\3\2\2\2\u0729\u0726\3\2\2\2", + "\u0729\u0727\3\2\2\2\u072a\u00d9\3\2\2\2\u072b\u072c\5*\26\2\u072c\u072d", + "\7\2\2\3\u072d\u0734\3\2\2\2\u072e\u072f\5.\30\2\u072f\u0730\7Z\2\2", + "\u0730\u0731\5*\26\2\u0731\u0732\7\2\2\3\u0732\u0734\3\2\2\2\u0733\u072b", + "\3\2\2\2\u0733\u072e\3\2\2\2\u0734\u00db\3\2\2\2\u0735\u0736\5(\25\2", + "\u0736\u0737\7\2\2\3\u0737\u00dd\3\2\2\2\u0738\u073a\5\64\33\2\u0739", + "\u073b\5:\36\2\u073a\u0739\3\2\2\2\u073a\u073b\3\2\2\2\u073b\u073c\3", + "\2\2\2\u073c\u073d\7Y\2\2\u073d\u073e\7\2\2\3\u073e\u0743\3\2\2\2\u073f", + "\u0740\5\u008eH\2\u0740\u0741\7\2\2\3\u0741\u0743\3\2\2\2\u0742\u0738", + "\3\2\2\2\u0742\u073f\3\2\2\2\u0743\u00df\3\2\2\2\u0744\u0746\58\35\2", + "\u0745\u0744\3\2\2\2\u0746\u0747\3\2\2\2\u0747\u0745\3\2\2\2\u0747\u0748", + "\3\2\2\2\u0748\u0749\3\2\2\2\u0749\u074a\7\2\2\3\u074a\u00e1\3\2\2\2", + "\u074b\u074d\58\35\2\u074c\u074b\3\2\2\2\u074d\u074e\3\2\2\2\u074e\u074c", + "\3\2\2\2\u074e\u074f\3\2\2\2\u074f\u0750\3\2\2\2\u0750\u0751\7\2\2\3", + "\u0751\u00e3\3\2\2\2\u0752\u0753\5> \2\u0753\u0754\7\2\2\3\u0754\u0762", + "\3\2\2\2\u0755\u0756\5@!\2\u0756\u0757\7\2\2\3\u0757\u0762\3\2\2\2\u0758", + "\u0759\5\\/\2\u0759\u075a\7\2\2\3\u075a\u0762\3\2\2\2\u075b\u075c\5", + "^\60\2\u075c\u075d\7\2\2\3\u075d\u0762\3\2\2\2\u075e\u075f\5`\61\2\u075f", + "\u0760\7\2\2\3\u0760\u0762\3\2\2\2\u0761\u0752\3\2\2\2\u0761\u0755\3", + "\2\2\2\u0761\u0758\3\2\2\2\u0761\u075b\3\2\2\2\u0761\u075e\3\2\2\2\u0762", + "\u00e5\3\2\2\2\u0763\u0764\5<\37\2\u0764\u0765\7\2\2\3\u0765\u076c\3", + "\2\2\2\u0766\u0767\5:\36\2\u0767\u0768\7Z\2\2\u0768\u0769\5<\37\2\u0769", + "\u076a\7\2\2\3\u076a\u076c\3\2\2\2\u076b\u0763\3\2\2\2\u076b\u0766\3", + "\2\2\2\u076c\u00e7\3\2\2\2\u076d\u076e\5b\62\2\u076e\u076f\7\2\2\3\u076f", + "\u0776\3\2\2\2\u0770\u0771\5b\62\2\u0771\u0772\7[\2\2\u0772\u0773\5", + "\u0084C\2\u0773\u0774\7\2\2\3\u0774\u0776\3\2\2\2\u0775\u076d\3\2\2", + "\2\u0775\u0770\3\2\2\2\u0776\u00e9\3\2\2\2\u0777\u0778\7-\2\2\u0778", + "\u0784\7\2\2\3\u0779\u077a\7\34\2\2\u077a\u0784\7\2\2\3\u077b\u077c", + "\7*\2\2\u077c\u0784\7\2\2\3\u077d\u077e\7<\2\2\u077e\u0784\7\2\2\3\u077f", + "\u0780\7\21\2\2\u0780\u0784\7\2\2\3\u0781\u0782\7$\2\2\u0782\u0784\7", + "\2\2\3\u0783\u0777\3\2\2\2\u0783\u0779\3\2\2\2\u0783\u077b\3\2\2\2\u0783", + "\u077d\3\2\2\2\u0783\u077f\3\2\2\2\u0783\u0781\3\2\2\2\u0784\u00eb\3", + "\2\2\2\u0785\u0786\7\60\2\2\u0786\u07a1\7\2\2\3\u0787\u0788\7\24\2\2", + "\u0788\u07a1\7\2\2\3\u0789\u078a\7\'\2\2\u078a\u07a1\7\2\2\3\u078b\u078c", + "\7\"\2\2\u078c\u07a1\7\2\2\3\u078d\u078e\7#\2\2\u078e\u07a1\7\2\2\3", + "\u078f\u0790\7\35\2\2\u0790\u07a1\7\2\2\3\u0791\u0792\7\31\2\2\u0792", + "\u07a1\7\2\2\3\u0793\u0794\7(\2\2\u0794\u07a1\7\2\2\3\u0795\u0796\7", + "/\2\2\u0796\u07a1\7\2\2\3\u0797\u0798\7\66\2\2\u0798\u07a1\7\2\2\3\u0799", + "\u079a\7\67\2\2\u079a\u07a1\7\2\2\3\u079b\u079c\7\6\2\2\u079c\u07a1", + "\7\2\2\3\u079d\u079e\7\7\2\2\u079e\u07a1\7\2\2\3\u079f\u07a1\7\b\2\2", + "\u07a0\u0785\3\2\2\2\u07a0\u0787\3\2\2\2\u07a0\u0789\3\2\2\2\u07a0\u078b", + "\3\2\2\2\u07a0\u078d\3\2\2\2\u07a0\u078f\3\2\2\2\u07a0\u0791\3\2\2\2", + "\u07a0\u0793\3\2\2\2\u07a0\u0795\3\2\2\2\u07a0\u0797\3\2\2\2\u07a0\u0799", + "\3\2\2\2\u07a0\u079b\3\2\2\2\u07a0\u079d\3\2\2\2\u07a0\u079f\3\2\2\2", + "\u07a1\u07a2\3\2\2\2\u07a2\u07ba\7\2\2\3\u07a3\u07a4\7\3\2\2\u07a4\u07a5", + "\7=\2\2\u07a5\u07a6\t\6\2\2\u07a6\u07a7\7>\2\2\u07a7\u07ba\7\2\2\3\u07a8", + "\u07a9\5Z.\2\u07a9\u07aa\7\2\2\3\u07aa\u07ba\3\2\2\2\u07ab\u07ac\5B", + "\"\2\u07ac\u07ad\7\2\2\3\u07ad\u07ba\3\2\2\2\u07ae\u07af\5R*\2\u07af", + "\u07b0\7\2\2\3\u07b0\u07ba\3\2\2\2\u07b1\u07b2\5\u0082B\2\u07b2\u07b3", + "\7\2\2\3\u07b3\u07ba\3\2\2\2\u07b4\u07b5\7\t\2\2\u07b5\u07b6\7=\2\2", + "\u07b6\u07b7\5\60\31\2\u07b7\u07b8\7>\2\2\u07b8\u07ba\3\2\2\2\u07b9", + "\u07a0\3\2\2\2\u07b9\u07a3\3\2\2\2\u07b9\u07a8\3\2\2\2\u07b9\u07ab\3", + "\2\2\2\u07b9\u07ae\3\2\2\2\u07b9\u07b1\3\2\2\2\u07b9\u07b4\3\2\2\2\u07ba", + "\u00ed\3\2\2\2\u07bb\u07bd\5D#\2\u07bc\u07be\7k\2\2\u07bd\u07bc\3\2", + "\2\2\u07bd\u07be\3\2\2\2\u07be\u07bf\3\2\2\2\u07bf\u07c0\5F$\2\u07c0", + "\u07c1\7\2\2\3\u07c1\u07c7\3\2\2\2\u07c2\u07c3\5D#\2\u07c3\u07c4\7k", + "\2\2\u07c4\u07c5\7\2\2\3\u07c5\u07c7\3\2\2\2\u07c6\u07bb\3\2\2\2\u07c6", + "\u07c2\3\2\2\2\u07c7\u00ef\3\2\2\2\u07c8\u07c9\7+\2\2\u07c9\u07cd\7", + "\2\2\3\u07ca\u07cb\7.\2\2\u07cb\u07cd\7\2\2\3\u07cc\u07c8\3\2\2\2\u07cc", + "\u07ca\3\2\2\2\u07cd\u00f1\3\2\2\2\u07ce\u07cf\7A\2\2\u07cf\u07d0\5", + "H%\2\u07d0\u07d1\7B\2\2\u07d1\u07d2\7\2\2\3\u07d2\u00f3\3\2\2\2\u07d3", + "\u07d4\5J&\2\u07d4\u07d5\7\2\2\3\u07d5\u07db\3\2\2\2\u07d6\u07d7\5H", + "%\2\u07d7\u07d8\5J&\2\u07d8\u07d9\7\2\2\3\u07d9\u07db\3\2\2\2\u07da", + "\u07d3\3\2\2\2\u07da\u07d6\3\2\2\2\u07db\u00f5\3\2\2\2\u07dc\u07de\5", + "L\'\2\u07dd\u07df\5N(\2\u07de\u07dd\3\2\2\2\u07de\u07df\3\2\2\2\u07df", + "\u07e0\3\2\2\2\u07e0\u07e1\7Y\2\2\u07e1\u07e2\7\2\2\3\u07e2\u07e7\3", + "\2\2\2\u07e3\u07e4\5\u008eH\2\u07e4\u07e5\7\2\2\3\u07e5\u07e7\3\2\2", + "\2\u07e6\u07dc\3\2\2\2\u07e6\u07e3\3\2\2\2\u07e7\u00f7\3\2\2\2\u07e8", + "\u07ea\5@!\2\u07e9\u07eb\5L\'\2\u07ea\u07e9\3\2\2\2\u07ea\u07eb\3\2", + "\2\2\u07eb\u07ec\3\2\2\2\u07ec\u07ed\7\2\2\3\u07ed\u07f5\3\2\2\2\u07ee", + "\u07f0\5\\/\2\u07ef\u07f1\5L\'\2\u07f0\u07ef\3\2\2\2\u07f0\u07f1\3\2", + "\2\2\u07f1\u07f2\3\2\2\2\u07f2\u07f3\7\2\2\3\u07f3\u07f5\3\2\2\2\u07f4", + "\u07e8\3\2\2\2\u07f4\u07ee\3\2\2\2\u07f5\u00f9\3\2\2\2\u07f6\u07f7\5", + "P)\2\u07f7\u07f8\7\2\2\3\u07f8\u07ff\3\2\2\2\u07f9\u07fa\5N(\2\u07fa", + "\u07fb\7Z\2\2\u07fb\u07fc\5P)\2\u07fc\u07fd\7\2\2\3\u07fd\u07ff\3\2", + "\2\2\u07fe\u07f6\3\2\2\2\u07fe\u07f9\3\2\2\2\u07ff\u00fb\3\2\2\2\u0800", + "\u0801\5b\62\2\u0801\u0802\7\2\2\3\u0802\u080b\3\2\2\2\u0803\u0805\5", + "b\62\2\u0804\u0803\3\2\2\2\u0804\u0805\3\2\2\2\u0805\u0806\3\2\2\2\u0806", + "\u0807\7X\2\2\u0807\u0808\5\60\31\2\u0808\u0809\7\2\2\3\u0809\u080b", + "\3\2\2\2\u080a\u0800\3\2\2\2\u080a\u0804\3\2\2\2\u080b\u00fd\3\2\2\2", + "\u080c\u080e\7\33\2\2\u080d\u080f\7k\2\2\u080e\u080d\3\2\2\2\u080e\u080f", + "\3\2\2\2\u080f\u0810\3\2\2\2\u0810\u0811\7A\2\2\u0811\u0812\5T+\2\u0812", + "\u0813\7B\2\2\u0813\u0814\7\2\2\3\u0814\u0823\3\2\2\2\u0815\u0817\7", + "\33\2\2\u0816\u0818\7k\2\2\u0817\u0816\3\2\2\2\u0817\u0818\3\2\2\2\u0818", + "\u0819\3\2\2\2\u0819\u081a\7A\2\2\u081a\u081b\5T+\2\u081b\u081c\7Z\2", + "\2\u081c\u081d\7B\2\2\u081d\u081e\7\2\2\3\u081e\u0823\3\2\2\2\u081f", + "\u0820\7\33\2\2\u0820\u0821\7k\2\2\u0821\u0823\7\2\2\3\u0822\u080c\3", + "\2\2\2\u0822\u0815\3\2\2\2\u0822\u081f\3\2\2\2\u0823\u00ff\3\2\2\2\u0824", + "\u0825\5V,\2\u0825\u0826\7\2\2\3\u0826\u082d\3\2\2\2\u0827\u0828\5T", + "+\2\u0828\u0829\7Z\2\2\u0829\u082a\5V,\2\u082a\u082b\7\2\2\3\u082b\u082d", + "\3\2\2\2\u082c\u0824\3\2\2\2\u082c\u0827\3\2\2\2\u082d\u0101\3\2\2\2", + "\u082e\u082f\5X-\2\u082f\u0830\7\2\2\3\u0830\u0837\3\2\2\2\u0831\u0832", + "\5X-\2\u0832\u0833\7[\2\2\u0833\u0834\5\60\31\2\u0834\u0835\7\2\2\3", + "\u0835\u0837\3\2\2\2\u0836\u082e\3\2\2\2\u0836\u0831\3\2\2\2\u0837\u0103", + "\3\2\2\2\u0838\u0839\7k\2\2\u0839\u083a\7\2\2\3\u083a\u0105\3\2\2\2", + "\u083b\u083c\7\65\2\2\u083c\u083d\7=\2\2\u083d\u083e\5|?\2\u083e\u083f", + "\7>\2\2\u083f\u0840\7\2\2\3\u0840\u0107\3\2\2\2\u0841\u0842\7\25\2\2", + "\u0842\u084a\7\2\2\3\u0843\u0844\7%\2\2\u0844\u084a\7\2\2\3\u0845\u0846", + "\7\61\2\2\u0846\u084a\7\2\2\3\u0847\u0848\7\65\2\2\u0848\u084a\7\2\2", + "\3\u0849\u0841\3\2\2\2\u0849\u0843\3\2\2\2\u0849\u0845\3\2\2\2\u0849", + "\u0847\3\2\2\2\u084a\u0109\3\2\2\2\u084b\u084c\7!\2\2\u084c\u0852\7", + "\2\2\3\u084d\u084e\7:\2\2\u084e\u0852\7\2\2\3\u084f\u0852\7\n\2\2\u0850", + "\u0852\7\13\2\2\u0851\u084b\3\2\2\2\u0851\u084d\3\2\2\2\u0851\u084f", + "\3\2\2\2\u0851\u0850\3\2\2\2\u0852\u0853\3\2\2\2\u0853\u085d\7\2\2\3", + "\u0854\u0855\5h\65\2\u0855\u0856\7\2\2\3\u0856\u085d\3\2\2\2\u0857\u0858", + "\7\f\2\2\u0858\u0859\7=\2\2\u0859\u085a\7k\2\2\u085a\u085b\7>\2\2\u085b", + "\u085d\7\2\2\3\u085c\u0851\3\2\2\2\u085c\u0854\3\2\2\2\u085c\u0857\3", + "\2\2\2\u085d\u010b\3\2\2\2\u085e\u085f\7\63\2\2\u085f\u0860\7=\2\2\u0860", + "\u0861\5|?\2\u0861\u0862\7>\2\2\u0862\u0863\7\2\2\3\u0863\u086b\3\2", + "\2\2\u0864\u0865\7\63\2\2\u0865\u0866\7=\2\2\u0866\u0867\5\60\31\2\u0867", + "\u0868\7>\2\2\u0868\u0869\7\2\2\3\u0869\u086b\3\2\2\2\u086a\u085e\3", + "\2\2\2\u086a\u0864\3\2\2\2\u086b\u010d\3\2\2\2\u086c\u086e\5p9\2\u086d", + "\u086c\3\2\2\2\u086d\u086e\3\2\2\2\u086e\u086f\3\2\2\2\u086f\u0873\5", + "d\63\2\u0870\u0872\5f\64\2\u0871\u0870\3\2\2\2\u0872\u0875\3\2\2\2\u0873", + "\u0871\3\2\2\2\u0873\u0874\3\2\2\2\u0874\u0876\3\2\2\2\u0875\u0873\3", + "\2\2\2\u0876\u0877\7\2\2\3\u0877\u010f\3\2\2\2\u0878\u0879\7k\2\2\u0879", + "\u08b4\7\2\2\3\u087a\u087b\7=\2\2\u087b\u087c\5b\62\2\u087c\u087d\7", + ">\2\2\u087d\u087e\7\2\2\3\u087e\u08b4\3\2\2\2\u087f\u0880\5d\63\2\u0880", + "\u0882\7?\2\2\u0881\u0883\5r:\2\u0882\u0881\3\2\2\2\u0882\u0883\3\2", + "\2\2\u0883\u0885\3\2\2\2\u0884\u0886\5*\26\2\u0885\u0884\3\2\2\2\u0885", + "\u0886\3\2\2\2\u0886\u0887\3\2\2\2\u0887\u0888\7@\2\2\u0888\u0889\7", + "\2\2\3\u0889\u08b4\3\2\2\2\u088a\u088b\5d\63\2\u088b\u088c\7?\2\2\u088c", + "\u088e\7*\2\2\u088d\u088f\5r:\2\u088e\u088d\3\2\2\2\u088e\u088f\3\2", + "\2\2\u088f\u0890\3\2\2\2\u0890\u0891\5*\26\2\u0891\u0892\7@\2\2\u0892", + "\u0893\7\2\2\3\u0893\u08b4\3\2\2\2\u0894\u0895\5d\63\2\u0895\u0896\7", + "?\2\2\u0896\u0897\5r:\2\u0897\u0898\7*\2\2\u0898\u0899\5*\26\2\u0899", + "\u089a\7@\2\2\u089a\u089b\7\2\2\3\u089b\u08b4\3\2\2\2\u089c\u089d\5", + "d\63\2\u089d\u089f\7?\2\2\u089e\u08a0\5r:\2\u089f\u089e\3\2\2\2\u089f", + "\u08a0\3\2\2\2\u08a0\u08a1\3\2\2\2\u08a1\u08a2\7M\2\2\u08a2\u08a3\7", + "@\2\2\u08a3\u08a4\7\2\2\3\u08a4\u08b4\3\2\2\2\u08a5\u08a6\5d\63\2\u08a6", + "\u08a7\7=\2\2\u08a7\u08a8\5t;\2\u08a8\u08a9\7>\2\2\u08a9\u08aa\7\2\2", + "\3\u08aa\u08b4\3\2\2\2\u08ab\u08ac\5d\63\2\u08ac\u08ae\7=\2\2\u08ad", + "\u08af\5z>\2\u08ae\u08ad\3\2\2\2\u08ae\u08af\3\2\2\2\u08af\u08b0\3\2", + "\2\2\u08b0\u08b1\7>\2\2\u08b1\u08b2\7\2\2\3\u08b2\u08b4\3\2\2\2\u08b3", + "\u0878\3\2\2\2\u08b3\u087a\3\2\2\2\u08b3\u087f\3\2\2\2\u08b3\u088a\3", + "\2\2\2\u08b3\u0894\3\2\2\2\u08b3\u089c\3\2\2\2\u08b3\u08a5\3\2\2\2\u08b3", + "\u08ab\3\2\2\2\u08b4\u0111\3\2\2\2\u08b5\u08b6\7\r\2\2\u08b6\u08b8\7", + "=\2\2\u08b7\u08b9\7m\2\2\u08b8\u08b7\3\2\2\2\u08b9\u08ba\3\2\2\2\u08ba", + "\u08b8\3\2\2\2\u08ba\u08bb\3\2\2\2\u08bb\u08bc\3\2\2\2\u08bc\u08bd\7", + ">\2\2\u08bd\u08c2\7\2\2\3\u08be\u08bf\5h\65\2\u08bf\u08c0\7\2\2\3\u08c0", + "\u08c2\3\2\2\2\u08c1\u08b5\3\2\2\2\u08c1\u08be\3\2\2\2\u08c2\u0113\3", + "\2\2\2\u08c3\u08c4\7\16\2\2\u08c4\u08c5\7=\2\2\u08c5\u08c6\7=\2\2\u08c6", + "\u08c7\5j\66\2\u08c7\u08c8\7>\2\2\u08c8\u08c9\7>\2\2\u08c9\u08ca\7\2", + "\2\3\u08ca\u0115\3\2\2\2\u08cb\u08d0\5l\67\2\u08cc\u08cd\7Z\2\2\u08cd", + "\u08cf\5l\67\2\u08ce\u08cc\3\2\2\2\u08cf\u08d2\3\2\2\2\u08d0\u08ce\3", + "\2\2\2\u08d0\u08d1\3\2\2\2\u08d1\u08d3\3\2\2\2\u08d2\u08d0\3\2\2\2\u08d3", + "\u08d4\7\2\2\3\u08d4\u08d7\3\2\2\2\u08d5\u08d7\3\2\2\2\u08d6\u08cb\3", + "\2\2\2\u08d6\u08d5\3\2\2\2\u08d7\u0117\3\2\2\2\u08d8\u08de\n\n\2\2\u08d9", + "\u08db\7=\2\2\u08da\u08dc\5\f\7\2\u08db\u08da\3\2\2\2\u08db\u08dc\3", + "\2\2\2\u08dc\u08dd\3\2\2\2\u08dd\u08df\7>\2\2\u08de\u08d9\3\2\2\2\u08de", + "\u08df\3\2\2\2\u08df\u08e2\3\2\2\2\u08e0\u08e2\3\2\2\2\u08e1\u08d8\3", + "\2\2\2\u08e1\u08e0\3\2\2\2\u08e2\u0119\3\2\2\2\u08e3\u08e4\n\13\2\2", + "\u08e4\u08eb\7\2\2\3\u08e5\u08e6\7=\2\2\u08e6\u08e7\5n8\2\u08e7\u08e8", + "\7>\2\2\u08e8\u08e9\7\2\2\3\u08e9\u08eb\3\2\2\2\u08ea\u08e3\3\2\2\2", + "\u08ea\u08e5\3\2\2\2\u08eb\u08ee\3\2\2\2\u08ec\u08ea\3\2\2\2\u08ec\u08ed", + "\3\2\2\2\u08ed\u011b\3\2\2\2\u08ee\u08ec\3\2\2\2\u08ef\u08f1\7M\2\2", + "\u08f0\u08f2\5r:\2\u08f1\u08f0\3\2\2\2\u08f1\u08f2\3\2\2\2\u08f2\u08f3", + "\3\2\2\2\u08f3\u0905\7\2\2\3\u08f4\u08f6\7M\2\2\u08f5\u08f7\5r:\2\u08f6", + "\u08f5\3\2\2\2\u08f6\u08f7\3\2\2\2\u08f7\u08f8\3\2\2\2\u08f8\u08f9\5", + "p9\2\u08f9\u08fa\7\2\2\3\u08fa\u0905\3\2\2\2\u08fb\u08fd\7T\2\2\u08fc", + "\u08fe\5r:\2\u08fd\u08fc\3\2\2\2\u08fd\u08fe\3\2\2\2\u08fe\u0905\3\2", + "\2\2\u08ff\u0901\7T\2\2\u0900\u0902\5r:\2\u0901\u0900\3\2\2\2\u0901", + "\u0902\3\2\2\2\u0902\u0903\3\2\2\2\u0903\u0905\5p9\2\u0904\u08ef\3\2", + "\2\2\u0904\u08f4\3\2\2\2\u0904\u08fb\3\2\2\2\u0904\u08ff\3\2\2\2\u0905", + "\u011d\3\2\2\2\u0906\u0907\5\\/\2\u0907\u0908\7\2\2\3\u0908\u090e\3", + "\2\2\2\u0909\u090a\5r:\2\u090a\u090b\5\\/\2\u090b\u090c\7\2\2\3\u090c", + "\u090e\3\2\2\2\u090d\u0906\3\2\2\2\u090d\u0909\3\2\2\2\u090e\u011f\3", + "\2\2\2\u090f\u0910\5v<\2\u0910\u0911\7\2\2\3\u0911\u0918\3\2\2\2\u0912", + "\u0913\5v<\2\u0913\u0914\7Z\2\2\u0914\u0915\7j\2\2\u0915\u0916\7\2\2", + "\3\u0916\u0918\3\2\2\2\u0917\u090f\3\2\2\2\u0917\u0912\3\2\2\2\u0918", + "\u0121\3\2\2\2\u0919\u091a\5x=\2\u091a\u091b\7\2\2\3\u091b\u0922\3\2", + "\2\2\u091c\u091d\5v<\2\u091d\u091e\7Z\2\2\u091e\u091f\5x=\2\u091f\u0920", + "\7\2\2\3\u0920\u0922\3\2\2\2\u0921\u0919\3\2\2\2\u0921\u091c\3\2\2\2", + "\u0922\u0123\3\2\2\2\u0923\u0924\5\64\33\2\u0924\u0925\5b\62\2\u0925", + "\u0926\7\2\2\3\u0926\u092e\3\2\2\2\u0927\u0929\5\66\34\2\u0928\u092a", + "\5~@\2\u0929\u0928\3\2\2\2\u0929\u092a\3\2\2\2\u092a\u092b\3\2\2\2\u092b", + "\u092c\7\2\2\3\u092c\u092e\3\2\2\2\u092d\u0923\3\2\2\2\u092d\u0927\3", + "\2\2\2\u092e\u0125\3\2\2\2\u092f\u0930\7k\2\2\u0930\u0937\7\2\2\3\u0931", + "\u0932\5z>\2\u0932\u0933\7Z\2\2\u0933\u0934\7k\2\2\u0934\u0935\7\2\2", + "\3\u0935\u0937\3\2\2\2\u0936\u092f\3\2\2\2\u0936\u0931\3\2\2\2\u0937", + "\u0127\3\2\2\2\u0938\u093a\5L\'\2\u0939\u093b\5~@\2\u093a\u0939\3\2", + "\2\2\u093a\u093b\3\2\2\2\u093b\u093c\3\2\2\2\u093c\u093d\7\2\2\3\u093d", + "\u0129\3\2\2\2\u093e\u093f\5p9\2\u093f\u0940\7\2\2\3\u0940\u094e\3\2", + "\2\2\u0941\u0943\5p9\2\u0942\u0941\3\2\2\2\u0942\u0943\3\2\2\2\u0943", + "\u0944\3\2\2\2\u0944\u0948\5\u0080A\2\u0945\u0947\5f\64\2\u0946\u0945", + "\3\2\2\2\u0947\u094a\3\2\2\2\u0948\u0946\3\2\2\2\u0948\u0949\3\2\2\2", + "\u0949\u094b\3\2\2\2\u094a\u0948\3\2\2\2\u094b\u094c\7\2\2\3\u094c\u094e", + "\3\2\2\2\u094d\u093e\3\2\2\2\u094d\u0942\3\2\2\2\u094e\u012b\3\2\2\2", + "\u094f\u0950\7=\2\2\u0950\u0951\5~@\2\u0951\u0955\7>\2\2\u0952\u0954", + "\5f\64\2\u0953\u0952\3\2\2\2\u0954\u0957\3\2\2\2\u0955\u0953\3\2\2\2", + "\u0955\u0956\3\2\2\2\u0956\u0958\3\2\2\2\u0957\u0955\3\2\2\2\u0958\u0959", + "\7\2\2\3\u0959\u09b5\3\2\2\2\u095a\u095c\7?\2\2\u095b\u095d\5r:\2\u095c", + "\u095b\3\2\2\2\u095c\u095d\3\2\2\2\u095d\u095f\3\2\2\2\u095e\u0960\5", + "*\26\2\u095f\u095e\3\2\2\2\u095f\u0960\3\2\2\2\u0960\u0961\3\2\2\2\u0961", + "\u0962\7@\2\2\u0962\u09b5\7\2\2\3\u0963\u0964\7?\2\2\u0964\u0966\7*", + "\2\2\u0965\u0967\5r:\2\u0966\u0965\3\2\2\2\u0966\u0967\3\2\2\2\u0967", + "\u0968\3\2\2\2\u0968\u0969\5*\26\2\u0969\u096a\7@\2\2\u096a\u096b\7", + "\2\2\3\u096b\u09b5\3\2\2\2\u096c\u096d\7?\2\2\u096d\u096e\5r:\2\u096e", + "\u096f\7*\2\2\u096f\u0970\5*\26\2\u0970\u0971\7@\2\2\u0971\u0972\7\2", + "\2\3\u0972\u09b5\3\2\2\2\u0973\u0974\7?\2\2\u0974\u0975\7M\2\2\u0975", + "\u0976\7@\2\2\u0976\u09b5\7\2\2\3\u0977\u0979\7=\2\2\u0978\u097a\5t", + ";\2\u0979\u0978\3\2\2\2\u0979\u097a\3\2\2\2\u097a\u097b\3\2\2\2\u097b", + "\u097f\7>\2\2\u097c\u097e\5f\64\2\u097d\u097c\3\2\2\2\u097e\u0981\3", + "\2\2\2\u097f\u097d\3\2\2\2\u097f\u0980\3\2\2\2\u0980\u0982\3\2\2\2\u0981", + "\u097f\3\2\2\2\u0982\u09b5\7\2\2\3\u0983\u0984\5\u0080A\2\u0984\u0986", + "\7?\2\2\u0985\u0987\5r:\2\u0986\u0985\3\2\2\2\u0986\u0987\3\2\2\2\u0987", + "\u0989\3\2\2\2\u0988\u098a\5*\26\2\u0989\u0988\3\2\2\2\u0989\u098a\3", + "\2\2\2\u098a\u098b\3\2\2\2\u098b\u098c\7@\2\2\u098c\u098d\7\2\2\3\u098d", + "\u09b5\3\2\2\2\u098e\u098f\5\u0080A\2\u098f\u0990\7?\2\2\u0990\u0992", + "\7*\2\2\u0991\u0993\5r:\2\u0992\u0991\3\2\2\2\u0992\u0993\3\2\2\2\u0993", + "\u0994\3\2\2\2\u0994\u0995\5*\26\2\u0995\u0996\7@\2\2\u0996\u0997\7", + "\2\2\3\u0997\u09b5\3\2\2\2\u0998\u0999\5\u0080A\2\u0999\u099a\7?\2\2", + "\u099a\u099b\5r:\2\u099b\u099c\7*\2\2\u099c\u099d\5*\26\2\u099d\u099e", + "\7@\2\2\u099e\u099f\7\2\2\3\u099f\u09b5\3\2\2\2\u09a0\u09a1\5\u0080", + "A\2\u09a1\u09a2\7?\2\2\u09a2\u09a3\7M\2\2\u09a3\u09a4\7@\2\2\u09a4\u09a5", + "\7\2\2\3\u09a5\u09b5\3\2\2\2\u09a6\u09a7\5\u0080A\2\u09a7\u09a9\7=\2", + "\2\u09a8\u09aa\5t;\2\u09a9\u09a8\3\2\2\2\u09a9\u09aa\3\2\2\2\u09aa\u09ab", + "\3\2\2\2\u09ab\u09af\7>\2\2\u09ac\u09ae\5f\64\2\u09ad\u09ac\3\2\2\2", + "\u09ae\u09b1\3\2\2\2\u09af\u09ad\3\2\2\2\u09af\u09b0\3\2\2\2\u09b0\u09b2", + "\3\2\2\2\u09b1\u09af\3\2\2\2\u09b2\u09b3\7\2\2\3\u09b3\u09b5\3\2\2\2", + "\u09b4\u094f\3\2\2\2\u09b4\u095a\3\2\2\2\u09b4\u0963\3\2\2\2\u09b4\u096c", + "\3\2\2\2\u09b4\u0973\3\2\2\2\u09b4\u0977\3\2\2\2\u09b4\u0983\3\2\2\2", + "\u09b4\u098e\3\2\2\2\u09b4\u0998\3\2\2\2\u09b4\u09a0\3\2\2\2\u09b4\u09a6", + "\3\2\2\2\u09b5\u012d\3\2\2\2\u09b6\u09b7\7k\2\2\u09b7\u09b8\7\2\2\3", + "\u09b8\u012f\3\2\2\2\u09b9\u09ba\5*\26\2\u09ba\u09bb\7\2\2\3\u09bb\u09c8", + "\3\2\2\2\u09bc\u09bd\7A\2\2\u09bd\u09be\5\u0086D\2\u09be\u09bf\7B\2", + "\2\u09bf\u09c0\7\2\2\3\u09c0\u09c8\3\2\2\2\u09c1\u09c2\7A\2\2\u09c2", + "\u09c3\5\u0086D\2\u09c3\u09c4\7Z\2\2\u09c4\u09c5\7B\2\2\u09c5\u09c6", + "\7\2\2\3\u09c6\u09c8\3\2\2\2\u09c7\u09b9\3\2\2\2\u09c7\u09bc\3\2\2\2", + "\u09c7\u09c1\3\2\2\2\u09c8\u0131\3\2\2\2\u09c9\u09cb\5\u0088E\2\u09ca", + "\u09c9\3\2\2\2\u09ca\u09cb\3\2\2\2\u09cb\u09cc\3\2\2\2\u09cc\u09cd\5", + "\u0084C\2\u09cd\u09ce\7\2\2\3\u09ce\u09d8\3\2\2\2\u09cf\u09d0\5\u0086", + "D\2\u09d0\u09d2\7Z\2\2\u09d1\u09d3\5\u0088E\2\u09d2\u09d1\3\2\2\2\u09d2", + "\u09d3\3\2\2\2\u09d3\u09d4\3\2\2\2\u09d4\u09d5\5\u0084C\2\u09d5\u09d6", + "\7\2\2\3\u09d6\u09d8\3\2\2\2\u09d7\u09ca\3\2\2\2\u09d7\u09cf\3\2\2\2", + "\u09d8\u0133\3\2\2\2\u09d9\u09da\5\u008aF\2\u09da\u09db\7[\2\2\u09db", + "\u09dc\7\2\2\3\u09dc\u0135\3\2\2\2\u09dd\u09de\5\u008cG\2\u09de\u09df", + "\7\2\2\3\u09df\u09e5\3\2\2\2\u09e0\u09e1\5\u008aF\2\u09e1\u09e2\5\u008c", + "G\2\u09e2\u09e3\7\2\2\3\u09e3\u09e5\3\2\2\2\u09e4\u09dd\3\2\2\2\u09e4", + "\u09e0\3\2\2\2\u09e5\u0137\3\2\2\2\u09e6\u09e7\7?\2\2\u09e7\u09e8\5", + "\60\31\2\u09e8\u09e9\7@\2\2\u09e9\u09ea\7\2\2\3\u09ea\u09ef\3\2\2\2", + "\u09eb\u09ec\7i\2\2\u09ec\u09ed\7k\2\2\u09ed\u09ef\7\2\2\3\u09ee\u09e6", + "\3\2\2\2\u09ee\u09eb\3\2\2\2\u09ef\u0139\3\2\2\2\u09f0\u09f1\7;\2\2", + "\u09f1\u09f2\7=\2\2\u09f2\u09f3\5\60\31\2\u09f3\u09f5\7Z\2\2\u09f4\u09f6", + "\7m\2\2\u09f5\u09f4\3\2\2\2\u09f6\u09f7\3\2\2\2\u09f7\u09f5\3\2\2\2", + "\u09f7\u09f8\3\2\2\2\u09f8\u09f9\3\2\2\2\u09f9\u09fa\7>\2\2\u09fa\u09fb", + "\7Y\2\2\u09fb\u09fc\7\2\2\3\u09fc\u013b\3\2\2\2\u09fd\u09fe\5\u0092", + "J\2\u09fe\u09ff\7\2\2\3\u09ff\u0a30\3\2\2\2\u0a00\u0a01\5\u0094K\2\u0a01", + "\u0a02\7\2\2\3\u0a02\u0a30\3\2\2\2\u0a03\u0a04\5\u009cO\2\u0a04\u0a05", + "\7\2\2\3\u0a05\u0a30\3\2\2\2\u0a06\u0a07\5\u009eP\2\u0a07\u0a08\7\2", + "\2\3\u0a08\u0a30\3\2\2\2\u0a09\u0a0a\5\u00a0Q\2\u0a0a\u0a0b\7\2\2\3", + "\u0a0b\u0a30\3\2\2\2\u0a0c\u0a0d\5\u00a2R\2\u0a0d\u0a0e\7\2\2\3\u0a0e", + "\u0a30\3\2\2\2\u0a0f\u0a10\t\f\2\2\u0a10\u0a11\t\r\2\2\u0a11\u0a1a\7", + "=\2\2\u0a12\u0a17\5&\24\2\u0a13\u0a14\7Z\2\2\u0a14\u0a16\5&\24\2\u0a15", + "\u0a13\3\2\2\2\u0a16\u0a19\3\2\2\2\u0a17\u0a15\3\2\2\2\u0a17\u0a18\3", + "\2\2\2\u0a18\u0a1b\3\2\2\2\u0a19\u0a17\3\2\2\2\u0a1a\u0a12\3\2\2\2\u0a1a", + "\u0a1b\3\2\2\2\u0a1b\u0a29\3\2\2\2\u0a1c\u0a25\7X\2\2\u0a1d\u0a22\5", + "&\24\2\u0a1e\u0a1f\7Z\2\2\u0a1f\u0a21\5&\24\2\u0a20\u0a1e\3\2\2\2\u0a21", + "\u0a24\3\2\2\2\u0a22\u0a20\3\2\2\2\u0a22\u0a23\3\2\2\2\u0a23\u0a26\3", + "\2\2\2\u0a24\u0a22\3\2\2\2\u0a25\u0a1d\3\2\2\2\u0a25\u0a26\3\2\2\2\u0a26", + "\u0a28\3\2\2\2\u0a27\u0a1c\3\2\2\2\u0a28\u0a2b\3\2\2\2\u0a29\u0a27\3", + "\2\2\2\u0a29\u0a2a\3\2\2\2\u0a2a\u0a2c\3\2\2\2\u0a2b\u0a29\3\2\2\2\u0a2c", + "\u0a2d\7>\2\2\u0a2d\u0a2e\7Y\2\2\u0a2e\u0a30\7\2\2\3\u0a2f\u09fd\3\2", + "\2\2\u0a2f\u0a00\3\2\2\2\u0a2f\u0a03\3\2\2\2\u0a2f\u0a06\3\2\2\2\u0a2f", + "\u0a09\3\2\2\2\u0a2f\u0a0c\3\2\2\2\u0a2f\u0a0f\3\2\2\2\u0a30\u013d\3", + "\2\2\2\u0a31\u0a32\7k\2\2\u0a32\u0a33\7X\2\2\u0a33\u0a34\5\u0090I\2", + "\u0a34\u0a35\7\2\2\3\u0a35\u0a42\3\2\2\2\u0a36\u0a37\7\23\2\2\u0a37", + "\u0a38\5\60\31\2\u0a38\u0a39\7X\2\2\u0a39\u0a3a\5\u0090I\2\u0a3a\u0a3b", + "\7\2\2\3\u0a3b\u0a42\3\2\2\2\u0a3c\u0a3d\7\27\2\2\u0a3d\u0a3e\7X\2\2", + "\u0a3e\u0a3f\5\u0090I\2\u0a3f\u0a40\7\2\2\3\u0a40\u0a42\3\2\2\2\u0a41", + "\u0a31\3\2\2\2\u0a41\u0a36\3\2\2\2\u0a41\u0a3c\3\2\2\2\u0a42\u013f\3", + "\2\2\2\u0a43\u0a45\7A\2\2\u0a44\u0a46\5\u0096L\2\u0a45\u0a44\3\2\2\2", + "\u0a45\u0a46\3\2\2\2\u0a46\u0a47\3\2\2\2\u0a47\u0a48\7B\2\2\u0a48\u0a49", + "\7\2\2\3\u0a49\u0141\3\2\2\2\u0a4a\u0a4b\5\u0098M\2\u0a4b\u0a4c\7\2", + "\2\3\u0a4c\u0a52\3\2\2\2\u0a4d\u0a4e\5\u0096L\2\u0a4e\u0a4f\5\u0098", + "M\2\u0a4f\u0a50\7\2\2\3\u0a50\u0a52\3\2\2\2\u0a51\u0a4a\3\2\2\2\u0a51", + "\u0a4d\3\2\2\2\u0a52\u0143\3\2\2\2\u0a53\u0a54\5\u009aN\2\u0a54\u0a55", + "\7\2\2\3\u0a55\u0a5e\3\2\2\2\u0a56\u0a57\5\62\32\2\u0a57\u0a58\7\2\2", + "\3\u0a58\u0a5e\3\2\2\2\u0a59\u0a5a\5\u0090I\2\u0a5a\u0a5b\7\2\2\3\u0a5b", + "\u0a5e\3\2\2\2\u0a5c\u0a5e\7\2\2\3\u0a5d\u0a53\3\2\2\2\u0a5d\u0a56\3", + "\2\2\2\u0a5d\u0a59\3\2\2\2\u0a5d\u0a5c\3\2\2\2\u0a5e\u0145\3\2\2\2\u0a5f", + "\u0a60\7k\2\2\u0a60\u0a61\7=\2\2\u0a61\u0a62\5*\26\2\u0a62\u0a63\7>", + "\2\2\u0a63\u0a64\7Y\2\2\u0a64\u0a65\7\2\2\3\u0a65\u0147\3\2\2\2\u0a66", + "\u0a68\5.\30\2\u0a67\u0a66\3\2\2\2\u0a67\u0a68\3\2\2\2\u0a68\u0a69\3", + "\2\2\2\u0a69\u0a6a\7Y\2\2\u0a6a\u0a6b\7\2\2\3\u0a6b\u0149\3\2\2\2\u0a6c", + "\u0a6d\7 \2\2\u0a6d\u0a6e\7=\2\2\u0a6e\u0a6f\5.\30\2\u0a6f\u0a70\7>", + "\2\2\u0a70\u0a73\5\u0090I\2\u0a71\u0a72\7\32\2\2\u0a72\u0a74\5\u0090", + "I\2\u0a73\u0a71\3\2\2\2\u0a73\u0a74\3\2\2\2\u0a74\u0a75\3\2\2\2\u0a75", + "\u0a76\7\2\2\3\u0a76\u0a7f\3\2\2\2\u0a77\u0a78\7,\2\2\u0a78\u0a79\7", + "=\2\2\u0a79\u0a7a\5.\30\2\u0a7a\u0a7b\7>\2\2\u0a7b\u0a7c\5\u0090I\2", + "\u0a7c\u0a7d\7\2\2\3\u0a7d\u0a7f\3\2\2\2\u0a7e\u0a6c\3\2\2\2\u0a7e\u0a77", + "\3\2\2\2\u0a7f\u014b\3\2\2\2\u0a80\u0a81\7\62\2\2\u0a81\u0a82\7=\2\2", + "\u0a82\u0a83\5.\30\2\u0a83\u0a84\7>\2\2\u0a84\u0a85\5\u0090I\2\u0a85", + "\u0a86\7\2\2\3\u0a86\u0ab0\3\2\2\2\u0a87\u0a88\7\30\2\2\u0a88\u0a89", + "\5\u0090I\2\u0a89\u0a8a\7\62\2\2\u0a8a\u0a8b\7=\2\2\u0a8b\u0a8c\5.\30", + "\2\u0a8c\u0a8d\7>\2\2\u0a8d\u0a8e\7Y\2\2\u0a8e\u0a8f\7\2\2\3\u0a8f\u0ab0", + "\3\2\2\2\u0a90\u0a91\7\36\2\2\u0a91\u0a93\7=\2\2\u0a92\u0a94\5.\30\2", + "\u0a93\u0a92\3\2\2\2\u0a93\u0a94\3\2\2\2\u0a94\u0a95\3\2\2\2\u0a95\u0a97", + "\7Y\2\2\u0a96\u0a98\5.\30\2\u0a97\u0a96\3\2\2\2\u0a97\u0a98\3\2\2\2", + "\u0a98\u0a99\3\2\2\2\u0a99\u0a9b\7Y\2\2\u0a9a\u0a9c\5.\30\2\u0a9b\u0a9a", + "\3\2\2\2\u0a9b\u0a9c\3\2\2\2\u0a9c\u0a9d\3\2\2\2\u0a9d\u0a9e\7>\2\2", + "\u0a9e\u0a9f\5\u0090I\2\u0a9f\u0aa0\7\2\2\3\u0aa0\u0ab0\3\2\2\2\u0aa1", + "\u0aa2\7\36\2\2\u0aa2\u0aa3\7=\2\2\u0aa3\u0aa5\5\62\32\2\u0aa4\u0aa6", + "\5.\30\2\u0aa5\u0aa4\3\2\2\2\u0aa5\u0aa6\3\2\2\2\u0aa6\u0aa7\3\2\2\2", + "\u0aa7\u0aa9\7Y\2\2\u0aa8\u0aaa\5.\30\2\u0aa9\u0aa8\3\2\2\2\u0aa9\u0aaa", + "\3\2\2\2\u0aaa\u0aab\3\2\2\2\u0aab\u0aac\7>\2\2\u0aac\u0aad\5\u0090", + "I\2\u0aad\u0aae\7\2\2\3\u0aae\u0ab0\3\2\2\2\u0aaf\u0a80\3\2\2\2\u0aaf", + "\u0a87\3\2\2\2\u0aaf\u0a90\3\2\2\2\u0aaf\u0aa1\3\2\2\2\u0ab0\u014d\3", + "\2\2\2\u0ab1\u0ab2\7\37\2\2\u0ab2\u0ab3\7k\2\2\u0ab3\u0ab4\7Y\2\2\u0ab4", + "\u0ac6\7\2\2\3\u0ab5\u0ab6\7\26\2\2\u0ab6\u0ab7\7Y\2\2\u0ab7\u0ac6\7", + "\2\2\3\u0ab8\u0ab9\7\22\2\2\u0ab9\u0aba\7Y\2\2\u0aba\u0ac6\7\2\2\3\u0abb", + "\u0abd\7&\2\2\u0abc\u0abe\5.\30\2\u0abd\u0abc\3\2\2\2\u0abd\u0abe\3", + "\2\2\2\u0abe\u0abf\3\2\2\2\u0abf\u0ac0\7Y\2\2\u0ac0\u0ac6\7\2\2\3\u0ac1", + "\u0ac2\7\37\2\2\u0ac2\u0ac3\5\16\b\2\u0ac3\u0ac4\7Y\2\2\u0ac4\u0ac6", + "\3\2\2\2\u0ac5\u0ab1\3\2\2\2\u0ac5\u0ab5\3\2\2\2\u0ac5\u0ab8\3\2\2\2", + "\u0ac5\u0abb\3\2\2\2\u0ac5\u0ac1\3\2\2\2\u0ac6\u014f\3\2\2\2\u0ac7\u0ac9", + "\5\u00a6T\2\u0ac8\u0ac7\3\2\2\2\u0ac8\u0ac9\3\2\2\2\u0ac9\u0aca\3\2", + "\2\2\u0aca\u0acd\7\2\2\3\u0acb\u0acd\7\2\2\3\u0acc\u0ac8\3\2\2\2\u0acc", + "\u0acb\3\2\2\2\u0acd\u0151\3\2\2\2\u0ace\u0acf\5\u00a8U\2\u0acf\u0ad0", + "\7\2\2\3\u0ad0\u0ad6\3\2\2\2\u0ad1\u0ad2\5\u00a6T\2\u0ad2\u0ad3\5\u00a8", + "U\2\u0ad3\u0ad4\7\2\2\3\u0ad4\u0ad6\3\2\2\2\u0ad5\u0ace\3\2\2\2\u0ad5", + "\u0ad1\3\2\2\2\u0ad6\u0153\3\2\2\2\u0ad7\u0ad8\5\u00aaV\2\u0ad8\u0ad9", + "\7\2\2\3\u0ad9\u0adf\3\2\2\2\u0ada\u0adb\5\62\32\2\u0adb\u0adc\7\2\2", + "\3\u0adc\u0adf\3\2\2\2\u0add\u0adf\7Y\2\2\u0ade\u0ad7\3\2\2\2\u0ade", + "\u0ada\3\2\2\2\u0ade\u0add\3\2\2\2\u0adf\u0155\3\2\2\2\u0ae0\u0ae2\5", + "\64\33\2\u0ae1\u0ae0\3\2\2\2\u0ae1\u0ae2\3\2\2\2\u0ae2\u0ae3\3\2\2\2", + "\u0ae3\u0ae5\5b\62\2\u0ae4\u0ae6\5\u00acW\2\u0ae5\u0ae4\3\2\2\2\u0ae5", + "\u0ae6\3\2\2\2\u0ae6\u0ae7\3\2\2\2\u0ae7\u0ae8\5\u0094K\2\u0ae8\u0ae9", + "\7\2\2\3\u0ae9\u0157\3\2\2\2\u0aea\u0aeb\5\62\32\2\u0aeb\u0aec\7\2\2", + "\3\u0aec\u0af2\3\2\2\2\u0aed\u0aee\5\u00acW\2\u0aee\u0aef\5\62\32\2", + "\u0aef\u0af0\7\2\2\3\u0af0\u0af2\3\2\2\2\u0af1\u0aea\3\2\2\2\u0af1\u0aed", + "\3\2\2\2\u0af2\u0159\3\2\2\2\u0114\u015f\u0167\u017b\u018c\u0196\u01ba", + "\u01c4\u01d1\u01d3\u01de\u01f7\u0207\u0215\u0217\u0223\u0225\u0231\u0233", + "\u0245\u0247\u0253\u0255\u0260\u026b\u0276\u0281\u028c\u0295\u029c\u02a8", + "\u02af\u02b4\u02b9\u02be\u02c5\u02cf\u02d7\u02e9\u02ed\u02f4\u0303\u0308", + "\u030d\u0311\u0315\u0317\u0321\u0326\u032a\u032e\u0336\u033f\u0349\u0351", + "\u0362\u036e\u0371\u0377\u0380\u0385\u0388\u038f\u039e\u03aa\u03ad\u03af", + "\u03b7\u03bb\u03c9\u03cd\u03d2\u03d5\u03d8\u03df\u03e1\u03e6\u03ea\u03ef", + "\u03f3\u03f6\u03ff\u0407\u0411\u0419\u041b\u0425\u042a\u042e\u0434\u0437", + "\u0440\u0445\u0448\u044e\u045e\u0464\u0467\u046c\u046f\u0476\u0489\u048f", + "\u0492\u0494\u04a3\u04a7\u04ae\u04b3\u04c0\u04c9\u04d2\u04e5\u04e8\u04f0", + "\u04f3\u04f7\u04fc\u0509\u050d\u0518\u051e\u0527\u0532\u053a\u054d\u0551", + "\u0555\u055d\u0561\u0566\u0571\u0578\u057b\u057f\u0588\u058e\u0591\u0595", + "\u05a0\u05aa\u05b6\u05cc\u05de\u05ea\u05f8\u0633\u063d\u0660\u0669\u067b", + "\u068f\u069e\u06ad\u06c6\u06d5\u06df\u06e9\u06f3\u06fd\u0707\u070f\u071b", + "\u0729\u0733\u073a\u0742\u0747\u074e\u0761\u076b\u0775\u0783\u07a0\u07b9", + "\u07bd\u07c6\u07cc\u07da\u07de\u07e6\u07ea\u07f0\u07f4\u07fe\u0804\u080a", + "\u080e\u0817\u0822\u082c\u0836\u0849\u0851\u085c\u086a\u086d\u0873\u0882", + "\u0885\u088e\u089f\u08ae\u08b3\u08ba\u08c1\u08d0\u08d6\u08db\u08de\u08e1", + "\u08ea\u08ec\u08f1\u08f6\u08fd\u0901\u0904\u090d\u0917\u0921\u0929\u092d", + "\u0936\u093a\u0942\u0948\u094d\u0955\u095c\u095f\u0966\u0979\u097f\u0986", + "\u0989\u0992\u09a9\u09af\u09b4\u09c7\u09ca\u09d2\u09d7\u09e4\u09ee\u09f7", + "\u0a17\u0a1a\u0a22\u0a25\u0a29\u0a2f\u0a41\u0a45\u0a51\u0a5d\u0a67\u0a73", + "\u0a7e\u0a93\u0a97\u0a9b\u0aa5\u0aa9\u0aaf\u0abd\u0ac5\u0ac8\u0acc\u0ad5", + "\u0ade\u0ae1\u0ae5\u0af1"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -582,7 +1229,50 @@ var ruleNames = [ "primaryExpression", "genericSelection", "genericAssocList", "blockItemList", "blockItem", "specialMethodCall", "expressionStatement", "selectionStatement", "iterationStatement", "jumpStatement", "compilationUnit", "translationUnit", "externalDeclaration", - "functionDefinition", "declarationList" ]; + "functionDefinition", "declarationList", "primaryExpression_DropletFile", + "genericSelection_DropletFile", "genericAssocList_DropletFile", + "genericAssociation_DropletFile", "postfixExpression_DropletFile", + "argumentExpressionList_DropletFile", "unaryExpression_DropletFile", + "unaryOperator_DropletFile", "castExpression_DropletFile", + "multiplicativeExpression_DropletFile", "additiveExpression_DropletFile", + "shiftExpression_DropletFile", "relationalExpression_DropletFile", + "equalityExpression_DropletFile", "andExpression_DropletFile", + "exclusiveOrExpression_DropletFile", "inclusiveOrExpression_DropletFile", + "logicalAndExpression_DropletFile", "logicalOrExpression_DropletFile", + "conditionalExpression_DropletFile", "assignmentExpression_DropletFile", + "assignmentOperator_DropletFile", "expression_DropletFile", + "constantExpression_DropletFile", "declaration_DropletFile", + "declarationSpecifiers_DropletFile", "declarationSpecifiers2_DropletFile", + "declarationSpecifier_DropletFile", "initDeclaratorList_DropletFile", + "initDeclarator_DropletFile", "storageClassSpecifier_DropletFile", + "typeSpecifier_DropletFile", "structOrUnionSpecifier_DropletFile", + "structOrUnion_DropletFile", "structDeclarationsBlock_DropletFile", + "structDeclarationList_DropletFile", "structDeclaration_DropletFile", + "specifierQualifierList_DropletFile", "structDeclaratorList_DropletFile", + "structDeclarator_DropletFile", "enumSpecifier_DropletFile", + "enumeratorList_DropletFile", "enumerator_DropletFile", + "enumerationConstant_DropletFile", "atomicTypeSpecifier_DropletFile", + "typeQualifier_DropletFile", "functionSpecifier_DropletFile", + "alignmentSpecifier_DropletFile", "declarator_DropletFile", + "directDeclarator_DropletFile", "gccDeclaratorExtension_DropletFile", + "gccAttributeSpecifier_DropletFile", "gccAttributeList_DropletFile", + "gccAttribute_DropletFile", "nestedParenthesesBlock_DropletFile", + "pointer_DropletFile", "typeQualifierList_DropletFile", + "parameterTypeList_DropletFile", "parameterList_DropletFile", + "parameterDeclaration_DropletFile", "identifierList_DropletFile", + "typeName_DropletFile", "abstractDeclarator_DropletFile", + "directAbstractDeclarator_DropletFile", "typedefName_DropletFile", + "initializer_DropletFile", "initializerList_DropletFile", + "designation_DropletFile", "designatorList_DropletFile", + "designator_DropletFile", "staticAssertDeclaration_DropletFile", + "statement_DropletFile", "labeledStatement_DropletFile", + "compoundStatement_DropletFile", "blockItemList_DropletFile", + "blockItem_DropletFile", "specialMethodCall_DropletFile", + "expressionStatement_DropletFile", "selectionStatement_DropletFile", + "iterationStatement_DropletFile", "jumpStatement_DropletFile", + "compilationUnit_DropletFile", "translationUnit_DropletFile", + "externalDeclaration_DropletFile", "functionDefinition_DropletFile", + "declarationList_DropletFile" ]; function CParser (input) { antlr4.Parser.call(this, input); @@ -803,6 +1493,92 @@ CParser.RULE_translationUnit = 82; CParser.RULE_externalDeclaration = 83; CParser.RULE_functionDefinition = 84; CParser.RULE_declarationList = 85; +CParser.RULE_primaryExpression_DropletFile = 86; +CParser.RULE_genericSelection_DropletFile = 87; +CParser.RULE_genericAssocList_DropletFile = 88; +CParser.RULE_genericAssociation_DropletFile = 89; +CParser.RULE_postfixExpression_DropletFile = 90; +CParser.RULE_argumentExpressionList_DropletFile = 91; +CParser.RULE_unaryExpression_DropletFile = 92; +CParser.RULE_unaryOperator_DropletFile = 93; +CParser.RULE_castExpression_DropletFile = 94; +CParser.RULE_multiplicativeExpression_DropletFile = 95; +CParser.RULE_additiveExpression_DropletFile = 96; +CParser.RULE_shiftExpression_DropletFile = 97; +CParser.RULE_relationalExpression_DropletFile = 98; +CParser.RULE_equalityExpression_DropletFile = 99; +CParser.RULE_andExpression_DropletFile = 100; +CParser.RULE_exclusiveOrExpression_DropletFile = 101; +CParser.RULE_inclusiveOrExpression_DropletFile = 102; +CParser.RULE_logicalAndExpression_DropletFile = 103; +CParser.RULE_logicalOrExpression_DropletFile = 104; +CParser.RULE_conditionalExpression_DropletFile = 105; +CParser.RULE_assignmentExpression_DropletFile = 106; +CParser.RULE_assignmentOperator_DropletFile = 107; +CParser.RULE_expression_DropletFile = 108; +CParser.RULE_constantExpression_DropletFile = 109; +CParser.RULE_declaration_DropletFile = 110; +CParser.RULE_declarationSpecifiers_DropletFile = 111; +CParser.RULE_declarationSpecifiers2_DropletFile = 112; +CParser.RULE_declarationSpecifier_DropletFile = 113; +CParser.RULE_initDeclaratorList_DropletFile = 114; +CParser.RULE_initDeclarator_DropletFile = 115; +CParser.RULE_storageClassSpecifier_DropletFile = 116; +CParser.RULE_typeSpecifier_DropletFile = 117; +CParser.RULE_structOrUnionSpecifier_DropletFile = 118; +CParser.RULE_structOrUnion_DropletFile = 119; +CParser.RULE_structDeclarationsBlock_DropletFile = 120; +CParser.RULE_structDeclarationList_DropletFile = 121; +CParser.RULE_structDeclaration_DropletFile = 122; +CParser.RULE_specifierQualifierList_DropletFile = 123; +CParser.RULE_structDeclaratorList_DropletFile = 124; +CParser.RULE_structDeclarator_DropletFile = 125; +CParser.RULE_enumSpecifier_DropletFile = 126; +CParser.RULE_enumeratorList_DropletFile = 127; +CParser.RULE_enumerator_DropletFile = 128; +CParser.RULE_enumerationConstant_DropletFile = 129; +CParser.RULE_atomicTypeSpecifier_DropletFile = 130; +CParser.RULE_typeQualifier_DropletFile = 131; +CParser.RULE_functionSpecifier_DropletFile = 132; +CParser.RULE_alignmentSpecifier_DropletFile = 133; +CParser.RULE_declarator_DropletFile = 134; +CParser.RULE_directDeclarator_DropletFile = 135; +CParser.RULE_gccDeclaratorExtension_DropletFile = 136; +CParser.RULE_gccAttributeSpecifier_DropletFile = 137; +CParser.RULE_gccAttributeList_DropletFile = 138; +CParser.RULE_gccAttribute_DropletFile = 139; +CParser.RULE_nestedParenthesesBlock_DropletFile = 140; +CParser.RULE_pointer_DropletFile = 141; +CParser.RULE_typeQualifierList_DropletFile = 142; +CParser.RULE_parameterTypeList_DropletFile = 143; +CParser.RULE_parameterList_DropletFile = 144; +CParser.RULE_parameterDeclaration_DropletFile = 145; +CParser.RULE_identifierList_DropletFile = 146; +CParser.RULE_typeName_DropletFile = 147; +CParser.RULE_abstractDeclarator_DropletFile = 148; +CParser.RULE_directAbstractDeclarator_DropletFile = 149; +CParser.RULE_typedefName_DropletFile = 150; +CParser.RULE_initializer_DropletFile = 151; +CParser.RULE_initializerList_DropletFile = 152; +CParser.RULE_designation_DropletFile = 153; +CParser.RULE_designatorList_DropletFile = 154; +CParser.RULE_designator_DropletFile = 155; +CParser.RULE_staticAssertDeclaration_DropletFile = 156; +CParser.RULE_statement_DropletFile = 157; +CParser.RULE_labeledStatement_DropletFile = 158; +CParser.RULE_compoundStatement_DropletFile = 159; +CParser.RULE_blockItemList_DropletFile = 160; +CParser.RULE_blockItem_DropletFile = 161; +CParser.RULE_specialMethodCall_DropletFile = 162; +CParser.RULE_expressionStatement_DropletFile = 163; +CParser.RULE_selectionStatement_DropletFile = 164; +CParser.RULE_iterationStatement_DropletFile = 165; +CParser.RULE_jumpStatement_DropletFile = 166; +CParser.RULE_compilationUnit_DropletFile = 167; +CParser.RULE_translationUnit_DropletFile = 168; +CParser.RULE_externalDeclaration_DropletFile = 169; +CParser.RULE_functionDefinition_DropletFile = 170; +CParser.RULE_declarationList_DropletFile = 171; function PrimaryExpressionContext(parser, parent, invokingState) { if(parent===undefined) { @@ -883,36 +1659,36 @@ CParser.prototype.primaryExpression = function() { this.enterRule(localctx, 0, CParser.RULE_primaryExpression); var _la = 0; // Token type try { - this.state = 205; + this.state = 377; var la_ = this._interp.adaptivePredict(this._input,2,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 172; + this.state = 344; this.match(CParser.Identifier); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 173; + this.state = 345; this.match(CParser.Constant); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 175; + this.state = 347; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 174; + this.state = 346; this.match(CParser.StringLiteral); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 177; + this.state = 349; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,0, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -920,66 +1696,66 @@ CParser.prototype.primaryExpression = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 179; + this.state = 351; this.match(CParser.LeftParen); - this.state = 180; + this.state = 352; this.expression(0); - this.state = 181; + this.state = 353; this.match(CParser.RightParen); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 183; + this.state = 355; this.genericSelection(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 185; + this.state = 357; _la = this._input.LA(1); if(_la===CParser.T__0) { - this.state = 184; + this.state = 356; this.match(CParser.T__0); } - this.state = 187; + this.state = 359; this.match(CParser.LeftParen); - this.state = 188; + this.state = 360; this.compoundStatement(); - this.state = 189; + this.state = 361; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 191; + this.state = 363; this.match(CParser.T__1); - this.state = 192; + this.state = 364; this.match(CParser.LeftParen); - this.state = 193; + this.state = 365; this.unaryExpression(); - this.state = 194; + this.state = 366; this.match(CParser.Comma); - this.state = 195; + this.state = 367; this.typeName(); - this.state = 196; + this.state = 368; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 198; + this.state = 370; this.match(CParser.T__2); - this.state = 199; + this.state = 371; this.match(CParser.LeftParen); - this.state = 200; + this.state = 372; this.typeName(); - this.state = 201; + this.state = 373; this.match(CParser.Comma); - this.state = 202; + this.state = 374; this.unaryExpression(); - this.state = 203; + this.state = 375; this.match(CParser.RightParen); break; @@ -1045,17 +1821,17 @@ CParser.prototype.genericSelection = function() { this.enterRule(localctx, 2, CParser.RULE_genericSelection); try { this.enterOuterAlt(localctx, 1); - this.state = 207; + this.state = 379; this.match(CParser.Generic); - this.state = 208; + this.state = 380; this.match(CParser.LeftParen); - this.state = 209; + this.state = 381; this.assignmentExpression(); - this.state = 210; + this.state = 382; this.match(CParser.Comma); - this.state = 211; + this.state = 383; this.genericAssocList(0); - this.state = 212; + this.state = 384; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -1121,10 +1897,10 @@ CParser.prototype.genericAssocList = function(_p) { this.enterRecursionRule(localctx, 4, CParser.RULE_genericAssocList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 215; + this.state = 387; this.genericAssociation(); this._ctx.stop = this._input.LT(-1); - this.state = 222; + this.state = 394; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,3,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1135,16 +1911,16 @@ CParser.prototype.genericAssocList = function(_p) { _prevctx = localctx; localctx = new GenericAssocListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_genericAssocList); - this.state = 217; + this.state = 389; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 218; + this.state = 390; this.match(CParser.Comma); - this.state = 219; + this.state = 391; this.genericAssociation(); } - this.state = 224; + this.state = 396; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,3,this._ctx); } @@ -1209,7 +1985,7 @@ CParser.prototype.genericAssociation = function() { var localctx = new GenericAssociationContext(this, this._ctx, this.state); this.enterRule(localctx, 6, CParser.RULE_genericAssociation); try { - this.state = 232; + this.state = 404; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -1236,20 +2012,20 @@ CParser.prototype.genericAssociation = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 225; + this.state = 397; this.typeName(); - this.state = 226; + this.state = 398; this.match(CParser.Colon); - this.state = 227; + this.state = 399; this.assignmentExpression(); break; case CParser.Default: this.enterOuterAlt(localctx, 2); - this.state = 229; + this.state = 401; this.match(CParser.Default); - this.state = 230; + this.state = 402; this.match(CParser.Colon); - this.state = 231; + this.state = 403; this.assignmentExpression(); break; default: @@ -1340,85 +2116,85 @@ CParser.prototype.postfixExpression = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 268; + this.state = 440; var la_ = this._interp.adaptivePredict(this._input,5,this._ctx); switch(la_) { case 1: - this.state = 235; + this.state = 407; this.primaryExpression(); break; case 2: - this.state = 236; + this.state = 408; this.match(CParser.LeftParen); - this.state = 237; + this.state = 409; this.typeName(); - this.state = 238; + this.state = 410; this.match(CParser.RightParen); - this.state = 239; + this.state = 411; this.match(CParser.LeftBrace); - this.state = 240; + this.state = 412; this.initializerList(0); - this.state = 241; + this.state = 413; this.match(CParser.RightBrace); break; case 3: - this.state = 243; + this.state = 415; this.match(CParser.LeftParen); - this.state = 244; + this.state = 416; this.typeName(); - this.state = 245; + this.state = 417; this.match(CParser.RightParen); - this.state = 246; + this.state = 418; this.match(CParser.LeftBrace); - this.state = 247; + this.state = 419; this.initializerList(0); - this.state = 248; + this.state = 420; this.match(CParser.Comma); - this.state = 249; + this.state = 421; this.match(CParser.RightBrace); break; case 4: - this.state = 251; + this.state = 423; this.match(CParser.T__0); - this.state = 252; + this.state = 424; this.match(CParser.LeftParen); - this.state = 253; + this.state = 425; this.typeName(); - this.state = 254; + this.state = 426; this.match(CParser.RightParen); - this.state = 255; + this.state = 427; this.match(CParser.LeftBrace); - this.state = 256; + this.state = 428; this.initializerList(0); - this.state = 257; + this.state = 429; this.match(CParser.RightBrace); break; case 5: - this.state = 259; + this.state = 431; this.match(CParser.T__0); - this.state = 260; + this.state = 432; this.match(CParser.LeftParen); - this.state = 261; + this.state = 433; this.typeName(); - this.state = 262; + this.state = 434; this.match(CParser.RightParen); - this.state = 263; + this.state = 435; this.match(CParser.LeftBrace); - this.state = 264; + this.state = 436; this.initializerList(0); - this.state = 265; + this.state = 437; this.match(CParser.Comma); - this.state = 266; + this.state = 438; this.match(CParser.RightBrace); break; } this._ctx.stop = this._input.LT(-1); - this.state = 293; + this.state = 465; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,8,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1427,95 +2203,95 @@ CParser.prototype.postfixExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 291; + this.state = 463; var la_ = this._interp.adaptivePredict(this._input,7,this._ctx); switch(la_) { case 1: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 270; + this.state = 442; if (!( this.precpred(this._ctx, 10))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 10)"); } - this.state = 271; + this.state = 443; this.match(CParser.LeftBracket); - this.state = 272; + this.state = 444; this.expression(0); - this.state = 273; + this.state = 445; this.match(CParser.RightBracket); break; case 2: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 275; + this.state = 447; if (!( this.precpred(this._ctx, 9))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 9)"); } - this.state = 276; + this.state = 448; this.match(CParser.LeftParen); - this.state = 278; + this.state = 450; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 277; + this.state = 449; this.argumentExpressionList(0); } - this.state = 280; + this.state = 452; this.match(CParser.RightParen); break; case 3: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 281; + this.state = 453; if (!( this.precpred(this._ctx, 8))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)"); } - this.state = 282; + this.state = 454; this.match(CParser.Dot); - this.state = 283; + this.state = 455; this.match(CParser.Identifier); break; case 4: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 284; + this.state = 456; if (!( this.precpred(this._ctx, 7))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)"); } - this.state = 285; + this.state = 457; this.match(CParser.Arrow); - this.state = 286; + this.state = 458; this.match(CParser.Identifier); break; case 5: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 287; + this.state = 459; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 288; + this.state = 460; this.match(CParser.PlusPlus); break; case 6: localctx = new PostfixExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression); - this.state = 289; + this.state = 461; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 290; + this.state = 462; this.match(CParser.MinusMinus); break; } } - this.state = 295; + this.state = 467; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,8,this._ctx); } @@ -1584,10 +2360,10 @@ CParser.prototype.argumentExpressionList = function(_p) { this.enterRecursionRule(localctx, 10, CParser.RULE_argumentExpressionList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 297; + this.state = 469; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 304; + this.state = 476; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,9,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -1598,16 +2374,16 @@ CParser.prototype.argumentExpressionList = function(_p) { _prevctx = localctx; localctx = new ArgumentExpressionListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_argumentExpressionList); - this.state = 299; + this.state = 471; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 300; + this.state = 472; this.match(CParser.Comma); - this.state = 301; + this.state = 473; this.assignmentExpression(); } - this.state = 306; + this.state = 478; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,9,this._ctx); } @@ -1688,76 +2464,76 @@ CParser.prototype.unaryExpression = function() { var localctx = new UnaryExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 12, CParser.RULE_unaryExpression); try { - this.state = 329; + this.state = 501; var la_ = this._interp.adaptivePredict(this._input,10,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 307; + this.state = 479; this.postfixExpression(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 308; + this.state = 480; this.match(CParser.PlusPlus); - this.state = 309; + this.state = 481; this.unaryExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 310; + this.state = 482; this.match(CParser.MinusMinus); - this.state = 311; + this.state = 483; this.unaryExpression(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 312; + this.state = 484; this.unaryOperator(); - this.state = 313; + this.state = 485; this.castExpression(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 315; + this.state = 487; this.match(CParser.Sizeof); - this.state = 316; + this.state = 488; this.unaryExpression(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 317; + this.state = 489; this.match(CParser.Sizeof); - this.state = 318; + this.state = 490; this.match(CParser.LeftParen); - this.state = 319; + this.state = 491; this.typeName(); - this.state = 320; + this.state = 492; this.match(CParser.RightParen); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 322; + this.state = 494; this.match(CParser.Alignof); - this.state = 323; + this.state = 495; this.match(CParser.LeftParen); - this.state = 324; + this.state = 496; this.typeName(); - this.state = 325; + this.state = 497; this.match(CParser.RightParen); break; case 8: this.enterOuterAlt(localctx, 8); - this.state = 327; + this.state = 499; this.match(CParser.AndAnd); - this.state = 328; + this.state = 500; this.match(CParser.Identifier); break; @@ -1817,7 +2593,7 @@ CParser.prototype.unaryOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 331; + this.state = 503; _la = this._input.LA(1); if(!(((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0))) { this._errHandler.recoverInline(this); @@ -1889,38 +2665,38 @@ CParser.prototype.castExpression = function() { var localctx = new CastExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 16, CParser.RULE_castExpression); try { - this.state = 345; + this.state = 517; var la_ = this._interp.adaptivePredict(this._input,11,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 333; + this.state = 505; this.unaryExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 334; + this.state = 506; this.match(CParser.LeftParen); - this.state = 335; + this.state = 507; this.typeName(); - this.state = 336; + this.state = 508; this.match(CParser.RightParen); - this.state = 337; + this.state = 509; this.castExpression(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 339; + this.state = 511; this.match(CParser.T__0); - this.state = 340; + this.state = 512; this.match(CParser.LeftParen); - this.state = 341; + this.state = 513; this.typeName(); - this.state = 342; + this.state = 514; this.match(CParser.RightParen); - this.state = 343; + this.state = 515; this.castExpression(); break; @@ -1989,10 +2765,10 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.enterRecursionRule(localctx, 18, CParser.RULE_multiplicativeExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 348; + this.state = 520; this.castExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 361; + this.state = 533; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,13,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2001,51 +2777,51 @@ CParser.prototype.multiplicativeExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 359; + this.state = 531; var la_ = this._interp.adaptivePredict(this._input,12,this._ctx); switch(la_) { case 1: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 350; + this.state = 522; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 351; + this.state = 523; this.match(CParser.Star); - this.state = 352; + this.state = 524; this.castExpression(); break; case 2: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 353; + this.state = 525; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 354; + this.state = 526; this.match(CParser.Div); - this.state = 355; + this.state = 527; this.castExpression(); break; case 3: localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression); - this.state = 356; + this.state = 528; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 357; + this.state = 529; this.match(CParser.Mod); - this.state = 358; + this.state = 530; this.castExpression(); break; } } - this.state = 363; + this.state = 535; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,13,this._ctx); } @@ -2114,10 +2890,10 @@ CParser.prototype.additiveExpression = function(_p) { this.enterRecursionRule(localctx, 20, CParser.RULE_additiveExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 365; + this.state = 537; this.multiplicativeExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 375; + this.state = 547; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,15,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2126,38 +2902,38 @@ CParser.prototype.additiveExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 373; + this.state = 545; var la_ = this._interp.adaptivePredict(this._input,14,this._ctx); switch(la_) { case 1: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 367; + this.state = 539; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 368; + this.state = 540; this.match(CParser.Plus); - this.state = 369; + this.state = 541; this.multiplicativeExpression(0); break; case 2: localctx = new AdditiveExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression); - this.state = 370; + this.state = 542; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 371; + this.state = 543; this.match(CParser.Minus); - this.state = 372; + this.state = 544; this.multiplicativeExpression(0); break; } } - this.state = 377; + this.state = 549; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,15,this._ctx); } @@ -2226,10 +3002,10 @@ CParser.prototype.shiftExpression = function(_p) { this.enterRecursionRule(localctx, 22, CParser.RULE_shiftExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 379; + this.state = 551; this.additiveExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 389; + this.state = 561; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,17,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2238,38 +3014,38 @@ CParser.prototype.shiftExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 387; + this.state = 559; var la_ = this._interp.adaptivePredict(this._input,16,this._ctx); switch(la_) { case 1: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 381; + this.state = 553; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 382; + this.state = 554; this.match(CParser.LeftShift); - this.state = 383; + this.state = 555; this.additiveExpression(0); break; case 2: localctx = new ShiftExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression); - this.state = 384; + this.state = 556; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 385; + this.state = 557; this.match(CParser.RightShift); - this.state = 386; + this.state = 558; this.additiveExpression(0); break; } } - this.state = 391; + this.state = 563; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,17,this._ctx); } @@ -2338,10 +3114,10 @@ CParser.prototype.relationalExpression = function(_p) { this.enterRecursionRule(localctx, 24, CParser.RULE_relationalExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 393; + this.state = 565; this.shiftExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 409; + this.state = 581; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,19,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2350,64 +3126,64 @@ CParser.prototype.relationalExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 407; + this.state = 579; var la_ = this._interp.adaptivePredict(this._input,18,this._ctx); switch(la_) { case 1: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 395; + this.state = 567; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 396; + this.state = 568; this.match(CParser.Less); - this.state = 397; + this.state = 569; this.shiftExpression(0); break; case 2: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 398; + this.state = 570; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 399; + this.state = 571; this.match(CParser.Greater); - this.state = 400; + this.state = 572; this.shiftExpression(0); break; case 3: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 401; + this.state = 573; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 402; + this.state = 574; this.match(CParser.LessEqual); - this.state = 403; + this.state = 575; this.shiftExpression(0); break; case 4: localctx = new RelationalExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression); - this.state = 404; + this.state = 576; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 405; + this.state = 577; this.match(CParser.GreaterEqual); - this.state = 406; + this.state = 578; this.shiftExpression(0); break; } } - this.state = 411; + this.state = 583; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,19,this._ctx); } @@ -2476,10 +3252,10 @@ CParser.prototype.equalityExpression = function(_p) { this.enterRecursionRule(localctx, 26, CParser.RULE_equalityExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 413; + this.state = 585; this.relationalExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 423; + this.state = 595; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,21,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2488,38 +3264,38 @@ CParser.prototype.equalityExpression = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 421; + this.state = 593; var la_ = this._interp.adaptivePredict(this._input,20,this._ctx); switch(la_) { case 1: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 415; + this.state = 587; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 416; + this.state = 588; this.match(CParser.Equal); - this.state = 417; + this.state = 589; this.relationalExpression(0); break; case 2: localctx = new EqualityExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression); - this.state = 418; + this.state = 590; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 419; + this.state = 591; this.match(CParser.NotEqual); - this.state = 420; + this.state = 592; this.relationalExpression(0); break; } } - this.state = 425; + this.state = 597; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,21,this._ctx); } @@ -2588,10 +3364,10 @@ CParser.prototype.andExpression = function(_p) { this.enterRecursionRule(localctx, 28, CParser.RULE_andExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 427; + this.state = 599; this.equalityExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 434; + this.state = 606; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,22,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2602,16 +3378,16 @@ CParser.prototype.andExpression = function(_p) { _prevctx = localctx; localctx = new AndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_andExpression); - this.state = 429; + this.state = 601; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 430; + this.state = 602; this.match(CParser.And); - this.state = 431; + this.state = 603; this.equalityExpression(0); } - this.state = 436; + this.state = 608; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,22,this._ctx); } @@ -2680,10 +3456,10 @@ CParser.prototype.exclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 30, CParser.RULE_exclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 438; + this.state = 610; this.andExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 445; + this.state = 617; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,23,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2694,16 +3470,16 @@ CParser.prototype.exclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new ExclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_exclusiveOrExpression); - this.state = 440; + this.state = 612; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 441; + this.state = 613; this.match(CParser.Caret); - this.state = 442; + this.state = 614; this.andExpression(0); } - this.state = 447; + this.state = 619; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,23,this._ctx); } @@ -2772,10 +3548,10 @@ CParser.prototype.inclusiveOrExpression = function(_p) { this.enterRecursionRule(localctx, 32, CParser.RULE_inclusiveOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 449; + this.state = 621; this.exclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 456; + this.state = 628; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,24,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2786,16 +3562,16 @@ CParser.prototype.inclusiveOrExpression = function(_p) { _prevctx = localctx; localctx = new InclusiveOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_inclusiveOrExpression); - this.state = 451; + this.state = 623; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 452; + this.state = 624; this.match(CParser.Or); - this.state = 453; + this.state = 625; this.exclusiveOrExpression(0); } - this.state = 458; + this.state = 630; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,24,this._ctx); } @@ -2864,10 +3640,10 @@ CParser.prototype.logicalAndExpression = function(_p) { this.enterRecursionRule(localctx, 34, CParser.RULE_logicalAndExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 460; + this.state = 632; this.inclusiveOrExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 467; + this.state = 639; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,25,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2878,16 +3654,16 @@ CParser.prototype.logicalAndExpression = function(_p) { _prevctx = localctx; localctx = new LogicalAndExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalAndExpression); - this.state = 462; + this.state = 634; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 463; + this.state = 635; this.match(CParser.AndAnd); - this.state = 464; + this.state = 636; this.inclusiveOrExpression(0); } - this.state = 469; + this.state = 641; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,25,this._ctx); } @@ -2956,10 +3732,10 @@ CParser.prototype.logicalOrExpression = function(_p) { this.enterRecursionRule(localctx, 36, CParser.RULE_logicalOrExpression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 471; + this.state = 643; this.logicalAndExpression(0); this._ctx.stop = this._input.LT(-1); - this.state = 478; + this.state = 650; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,26,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -2970,16 +3746,16 @@ CParser.prototype.logicalOrExpression = function(_p) { _prevctx = localctx; localctx = new LogicalOrExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalOrExpression); - this.state = 473; + this.state = 645; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 474; + this.state = 646; this.match(CParser.OrOr); - this.state = 475; + this.state = 647; this.logicalAndExpression(0); } - this.state = 480; + this.state = 652; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,26,this._ctx); } @@ -3049,18 +3825,18 @@ CParser.prototype.conditionalExpression = function() { this.enterRule(localctx, 38, CParser.RULE_conditionalExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 481; + this.state = 653; this.logicalOrExpression(0); - this.state = 487; + this.state = 659; var la_ = this._interp.adaptivePredict(this._input,27,this._ctx); if(la_===1) { - this.state = 482; + this.state = 654; this.match(CParser.Question); - this.state = 483; + this.state = 655; this.expression(0); - this.state = 484; + this.state = 656; this.match(CParser.Colon); - this.state = 485; + this.state = 657; this.conditionalExpression(); } @@ -3132,22 +3908,22 @@ CParser.prototype.assignmentExpression = function() { var localctx = new AssignmentExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 40, CParser.RULE_assignmentExpression); try { - this.state = 494; + this.state = 666; var la_ = this._interp.adaptivePredict(this._input,28,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 489; + this.state = 661; this.conditionalExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 490; + this.state = 662; this.unaryExpression(); - this.state = 491; + this.state = 663; this.assignmentOperator(); - this.state = 492; + this.state = 664; this.assignmentExpression(); break; @@ -3207,7 +3983,7 @@ CParser.prototype.assignmentOperator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 496; + this.state = 668; _la = this._input.LA(1); if(!(((((_la - 89)) & ~0x1f) == 0 && ((1 << (_la - 89)) & ((1 << (CParser.Assign - 89)) | (1 << (CParser.StarAssign - 89)) | (1 << (CParser.DivAssign - 89)) | (1 << (CParser.ModAssign - 89)) | (1 << (CParser.PlusAssign - 89)) | (1 << (CParser.MinusAssign - 89)) | (1 << (CParser.LeftShiftAssign - 89)) | (1 << (CParser.RightShiftAssign - 89)) | (1 << (CParser.AndAssign - 89)) | (1 << (CParser.XorAssign - 89)) | (1 << (CParser.OrAssign - 89)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3279,10 +4055,10 @@ CParser.prototype.expression = function(_p) { this.enterRecursionRule(localctx, 44, CParser.RULE_expression, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 499; + this.state = 671; this.assignmentExpression(); this._ctx.stop = this._input.LT(-1); - this.state = 506; + this.state = 678; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,29,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3293,16 +4069,16 @@ CParser.prototype.expression = function(_p) { _prevctx = localctx; localctx = new ExpressionContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_expression); - this.state = 501; + this.state = 673; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 502; + this.state = 674; this.match(CParser.Comma); - this.state = 503; + this.state = 675; this.assignmentExpression(); } - this.state = 508; + this.state = 680; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,29,this._ctx); } @@ -3364,7 +4140,7 @@ CParser.prototype.constantExpression = function() { this.enterRule(localctx, 46, CParser.RULE_constantExpression); try { this.enterOuterAlt(localctx, 1); - this.state = 509; + this.state = 681; this.conditionalExpression(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -3431,7 +4207,7 @@ CParser.prototype.declaration = function() { this.enterRule(localctx, 48, CParser.RULE_declaration); var _la = 0; // Token type try { - this.state = 518; + this.state = 690; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -3471,21 +4247,21 @@ CParser.prototype.declaration = function() { case CParser.ThreadLocal: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 511; + this.state = 683; this.declarationSpecifiers(); - this.state = 513; + this.state = 685; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 512; + this.state = 684; this.initDeclaratorList(0); } - this.state = 515; + this.state = 687; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 517; + this.state = 689; this.staticAssertDeclaration(); break; default: @@ -3555,19 +4331,19 @@ CParser.prototype.declarationSpecifiers = function() { this.enterRule(localctx, 50, CParser.RULE_declarationSpecifiers); try { this.enterOuterAlt(localctx, 1); - this.state = 521; + this.state = 693; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 520; + this.state = 692; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 523; + this.state = 695; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,32, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3635,19 +4411,19 @@ CParser.prototype.declarationSpecifiers2 = function() { this.enterRule(localctx, 52, CParser.RULE_declarationSpecifiers2); try { this.enterOuterAlt(localctx, 1); - this.state = 526; + this.state = 698; this._errHandler.sync(this); var _alt = 1; do { switch (_alt) { case 1: - this.state = 525; + this.state = 697; this.declarationSpecifier(); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 528; + this.state = 700; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,33, this._ctx); } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER ); @@ -3723,36 +4499,36 @@ CParser.prototype.declarationSpecifier = function() { var localctx = new DeclarationSpecifierContext(this, this._ctx, this.state); this.enterRule(localctx, 54, CParser.RULE_declarationSpecifier); try { - this.state = 535; + this.state = 707; var la_ = this._interp.adaptivePredict(this._input,34,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 530; + this.state = 702; this.storageClassSpecifier(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 531; + this.state = 703; this.typeSpecifier(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 532; + this.state = 704; this.typeQualifier(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 533; + this.state = 705; this.functionSpecifier(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 534; + this.state = 706; this.alignmentSpecifier(); break; @@ -3821,10 +4597,10 @@ CParser.prototype.initDeclaratorList = function(_p) { this.enterRecursionRule(localctx, 56, CParser.RULE_initDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 538; + this.state = 710; this.initDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 545; + this.state = 717; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,35,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -3835,16 +4611,16 @@ CParser.prototype.initDeclaratorList = function(_p) { _prevctx = localctx; localctx = new InitDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initDeclaratorList); - this.state = 540; + this.state = 712; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 541; + this.state = 713; this.match(CParser.Comma); - this.state = 542; + this.state = 714; this.initDeclarator(); } - this.state = 547; + this.state = 719; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,35,this._ctx); } @@ -3909,22 +4685,22 @@ CParser.prototype.initDeclarator = function() { var localctx = new InitDeclaratorContext(this, this._ctx, this.state); this.enterRule(localctx, 58, CParser.RULE_initDeclarator); try { - this.state = 553; + this.state = 725; var la_ = this._interp.adaptivePredict(this._input,36,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 548; + this.state = 720; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 549; + this.state = 721; this.declarator(); - this.state = 550; + this.state = 722; this.match(CParser.Assign); - this.state = 551; + this.state = 723; this.initializer(); break; @@ -3984,7 +4760,7 @@ CParser.prototype.storageClassSpecifier = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 555; + this.state = 727; _la = this._input.LA(1); if(!(_la===CParser.Auto || _la===CParser.Extern || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Register - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0))) { this._errHandler.recoverInline(this); @@ -4065,7 +4841,7 @@ CParser.prototype.typeSpecifier = function() { this.enterRule(localctx, 62, CParser.RULE_typeSpecifier); var _la = 0; // Token type try { - this.state = 571; + this.state = 743; switch(this._input.LA(1)) { case CParser.T__3: case CParser.T__4: @@ -4082,7 +4858,7 @@ CParser.prototype.typeSpecifier = function() { case CParser.Bool: case CParser.Complex: this.enterOuterAlt(localctx, 1); - this.state = 557; + this.state = 729; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0))) { this._errHandler.recoverInline(this); @@ -4093,11 +4869,11 @@ CParser.prototype.typeSpecifier = function() { break; case CParser.T__0: this.enterOuterAlt(localctx, 2); - this.state = 558; + this.state = 730; this.match(CParser.T__0); - this.state = 559; + this.state = 731; this.match(CParser.LeftParen); - this.state = 560; + this.state = 732; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5))) !== 0))) { this._errHandler.recoverInline(this); @@ -4105,39 +4881,39 @@ CParser.prototype.typeSpecifier = function() { else { this.consume(); } - this.state = 561; + this.state = 733; this.match(CParser.RightParen); break; case CParser.Atomic: this.enterOuterAlt(localctx, 3); - this.state = 562; + this.state = 734; this.atomicTypeSpecifier(); break; case CParser.Struct: case CParser.Union: this.enterOuterAlt(localctx, 4); - this.state = 563; + this.state = 735; this.structOrUnionSpecifier(); break; case CParser.Enum: this.enterOuterAlt(localctx, 5); - this.state = 564; + this.state = 736; this.enumSpecifier(); break; case CParser.Identifier: this.enterOuterAlt(localctx, 6); - this.state = 565; + this.state = 737; this.typedefName(); break; case CParser.T__6: this.enterOuterAlt(localctx, 7); - this.state = 566; + this.state = 738; this.match(CParser.T__6); - this.state = 567; + this.state = 739; this.match(CParser.LeftParen); - this.state = 568; + this.state = 740; this.constantExpression(); - this.state = 569; + this.state = 741; this.match(CParser.RightParen); break; default: @@ -4208,29 +4984,29 @@ CParser.prototype.structOrUnionSpecifier = function() { this.enterRule(localctx, 64, CParser.RULE_structOrUnionSpecifier); var _la = 0; // Token type try { - this.state = 582; + this.state = 754; var la_ = this._interp.adaptivePredict(this._input,39,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 573; + this.state = 745; this.structOrUnion(); - this.state = 575; + this.state = 747; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 574; + this.state = 746; this.match(CParser.Identifier); } - this.state = 577; + this.state = 749; this.structDeclarationsBlock(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 579; + this.state = 751; this.structOrUnion(); - this.state = 580; + this.state = 752; this.match(CParser.Identifier); break; @@ -4290,7 +5066,7 @@ CParser.prototype.structOrUnion = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 584; + this.state = 756; _la = this._input.LA(1); if(!(_la===CParser.Struct || _la===CParser.Union)) { this._errHandler.recoverInline(this); @@ -4355,11 +5131,11 @@ CParser.prototype.structDeclarationsBlock = function() { this.enterRule(localctx, 68, CParser.RULE_structDeclarationsBlock); try { this.enterOuterAlt(localctx, 1); - this.state = 586; + this.state = 758; this.match(CParser.LeftBrace); - this.state = 587; + this.state = 759; this.structDeclarationList(0); - this.state = 588; + this.state = 760; this.match(CParser.RightBrace); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -4425,10 +5201,10 @@ CParser.prototype.structDeclarationList = function(_p) { this.enterRecursionRule(localctx, 70, CParser.RULE_structDeclarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 591; + this.state = 763; this.structDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 597; + this.state = 769; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,40,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4439,14 +5215,14 @@ CParser.prototype.structDeclarationList = function(_p) { _prevctx = localctx; localctx = new StructDeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclarationList); - this.state = 593; + this.state = 765; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 594; + this.state = 766; this.structDeclaration(); } - this.state = 599; + this.state = 771; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,40,this._ctx); } @@ -4516,7 +5292,7 @@ CParser.prototype.structDeclaration = function() { this.enterRule(localctx, 72, CParser.RULE_structDeclaration); var _la = 0; // Token type try { - this.state = 607; + this.state = 779; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__3: @@ -4543,21 +5319,21 @@ CParser.prototype.structDeclaration = function() { case CParser.Complex: case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 600; + this.state = 772; this.specifierQualifierList(); - this.state = 602; + this.state = 774; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)) | (1 << (CParser.Colon - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 601; + this.state = 773; this.structDeclaratorList(0); } - this.state = 604; + this.state = 776; this.match(CParser.Semi); break; case CParser.StaticAssert: this.enterOuterAlt(localctx, 2); - this.state = 606; + this.state = 778; this.staticAssertDeclaration(); break; default: @@ -4627,17 +5403,17 @@ CParser.prototype.specifierQualifierList = function() { var localctx = new SpecifierQualifierListContext(this, this._ctx, this.state); this.enterRule(localctx, 74, CParser.RULE_specifierQualifierList); try { - this.state = 617; + this.state = 789; var la_ = this._interp.adaptivePredict(this._input,45,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 609; + this.state = 781; this.typeSpecifier(); - this.state = 611; + this.state = 783; var la_ = this._interp.adaptivePredict(this._input,43,this._ctx); if(la_===1) { - this.state = 610; + this.state = 782; this.specifierQualifierList(); } @@ -4645,12 +5421,12 @@ CParser.prototype.specifierQualifierList = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 613; + this.state = 785; this.typeQualifier(); - this.state = 615; + this.state = 787; var la_ = this._interp.adaptivePredict(this._input,44,this._ctx); if(la_===1) { - this.state = 614; + this.state = 786; this.specifierQualifierList(); } @@ -4721,10 +5497,10 @@ CParser.prototype.structDeclaratorList = function(_p) { this.enterRecursionRule(localctx, 76, CParser.RULE_structDeclaratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 620; + this.state = 792; this.structDeclarator(); this._ctx.stop = this._input.LT(-1); - this.state = 627; + this.state = 799; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,46,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -4735,16 +5511,16 @@ CParser.prototype.structDeclaratorList = function(_p) { _prevctx = localctx; localctx = new StructDeclaratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclaratorList); - this.state = 622; + this.state = 794; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 623; + this.state = 795; this.match(CParser.Comma); - this.state = 624; + this.state = 796; this.structDeclarator(); } - this.state = 629; + this.state = 801; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,46,this._ctx); } @@ -4810,27 +5586,27 @@ CParser.prototype.structDeclarator = function() { this.enterRule(localctx, 78, CParser.RULE_structDeclarator); var _la = 0; // Token type try { - this.state = 636; + this.state = 808; var la_ = this._interp.adaptivePredict(this._input,48,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 630; + this.state = 802; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 632; + this.state = 804; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { - this.state = 631; + this.state = 803; this.declarator(); } - this.state = 634; + this.state = 806; this.match(CParser.Colon); - this.state = 635; + this.state = 807; this.constantExpression(); break; @@ -4896,54 +5672,54 @@ CParser.prototype.enumSpecifier = function() { this.enterRule(localctx, 80, CParser.RULE_enumSpecifier); var _la = 0; // Token type try { - this.state = 657; + this.state = 829; var la_ = this._interp.adaptivePredict(this._input,51,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 638; + this.state = 810; this.match(CParser.Enum); - this.state = 640; + this.state = 812; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 639; + this.state = 811; this.match(CParser.Identifier); } - this.state = 642; + this.state = 814; this.match(CParser.LeftBrace); - this.state = 643; + this.state = 815; this.enumeratorList(0); - this.state = 644; + this.state = 816; this.match(CParser.RightBrace); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 646; + this.state = 818; this.match(CParser.Enum); - this.state = 648; + this.state = 820; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 647; + this.state = 819; this.match(CParser.Identifier); } - this.state = 650; + this.state = 822; this.match(CParser.LeftBrace); - this.state = 651; + this.state = 823; this.enumeratorList(0); - this.state = 652; + this.state = 824; this.match(CParser.Comma); - this.state = 653; + this.state = 825; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 655; + this.state = 827; this.match(CParser.Enum); - this.state = 656; + this.state = 828; this.match(CParser.Identifier); break; @@ -5012,10 +5788,10 @@ CParser.prototype.enumeratorList = function(_p) { this.enterRecursionRule(localctx, 82, CParser.RULE_enumeratorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 660; + this.state = 832; this.enumerator(); this._ctx.stop = this._input.LT(-1); - this.state = 667; + this.state = 839; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,52,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -5026,16 +5802,16 @@ CParser.prototype.enumeratorList = function(_p) { _prevctx = localctx; localctx = new EnumeratorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_enumeratorList); - this.state = 662; + this.state = 834; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 663; + this.state = 835; this.match(CParser.Comma); - this.state = 664; + this.state = 836; this.enumerator(); } - this.state = 669; + this.state = 841; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,52,this._ctx); } @@ -5100,22 +5876,22 @@ CParser.prototype.enumerator = function() { var localctx = new EnumeratorContext(this, this._ctx, this.state); this.enterRule(localctx, 84, CParser.RULE_enumerator); try { - this.state = 675; + this.state = 847; var la_ = this._interp.adaptivePredict(this._input,53,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 670; + this.state = 842; this.enumerationConstant(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 671; + this.state = 843; this.enumerationConstant(); - this.state = 672; + this.state = 844; this.match(CParser.Assign); - this.state = 673; + this.state = 845; this.constantExpression(); break; @@ -5177,7 +5953,7 @@ CParser.prototype.enumerationConstant = function() { this.enterRule(localctx, 86, CParser.RULE_enumerationConstant); try { this.enterOuterAlt(localctx, 1); - this.state = 677; + this.state = 849; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5236,13 +6012,13 @@ CParser.prototype.atomicTypeSpecifier = function() { this.enterRule(localctx, 88, CParser.RULE_atomicTypeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 679; + this.state = 851; this.match(CParser.Atomic); - this.state = 680; + this.state = 852; this.match(CParser.LeftParen); - this.state = 681; + this.state = 853; this.typeName(); - this.state = 682; + this.state = 854; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -5299,7 +6075,7 @@ CParser.prototype.typeQualifier = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 684; + this.state = 856; _la = this._input.LA(1); if(!(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0))) { this._errHandler.recoverInline(this); @@ -5368,14 +6144,14 @@ CParser.prototype.functionSpecifier = function() { this.enterRule(localctx, 92, CParser.RULE_functionSpecifier); var _la = 0; // Token type try { - this.state = 692; + this.state = 864; switch(this._input.LA(1)) { case CParser.T__7: case CParser.T__8: case CParser.Inline: case CParser.Noreturn: this.enterOuterAlt(localctx, 1); - this.state = 686; + this.state = 858; _la = this._input.LA(1); if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Inline))) !== 0) || _la===CParser.Noreturn)) { this._errHandler.recoverInline(this); @@ -5386,18 +6162,18 @@ CParser.prototype.functionSpecifier = function() { break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 687; + this.state = 859; this.gccAttributeSpecifier(); break; case CParser.T__9: this.enterOuterAlt(localctx, 3); - this.state = 688; + this.state = 860; this.match(CParser.T__9); - this.state = 689; + this.state = 861; this.match(CParser.LeftParen); - this.state = 690; + this.state = 862; this.match(CParser.Identifier); - this.state = 691; + this.state = 863; this.match(CParser.RightParen); break; default: @@ -5463,30 +6239,30 @@ CParser.prototype.alignmentSpecifier = function() { var localctx = new AlignmentSpecifierContext(this, this._ctx, this.state); this.enterRule(localctx, 94, CParser.RULE_alignmentSpecifier); try { - this.state = 704; + this.state = 876; var la_ = this._interp.adaptivePredict(this._input,55,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 694; + this.state = 866; this.match(CParser.Alignas); - this.state = 695; + this.state = 867; this.match(CParser.LeftParen); - this.state = 696; + this.state = 868; this.typeName(); - this.state = 697; + this.state = 869; this.match(CParser.RightParen); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 699; + this.state = 871; this.match(CParser.Alignas); - this.state = 700; + this.state = 872; this.match(CParser.LeftParen); - this.state = 701; + this.state = 873; this.constantExpression(); - this.state = 702; + this.state = 874; this.match(CParser.RightParen); break; @@ -5564,24 +6340,24 @@ CParser.prototype.declarator = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 707; + this.state = 879; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 706; + this.state = 878; this.pointer(); } - this.state = 709; + this.state = 881; this.directDeclarator(0); - this.state = 713; + this.state = 885; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,57,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 710; + this.state = 882; this.gccDeclaratorExtension(); } - this.state = 715; + this.state = 887; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,57,this._ctx); } @@ -5671,25 +6447,25 @@ CParser.prototype.directDeclarator = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 722; + this.state = 894; switch(this._input.LA(1)) { case CParser.Identifier: - this.state = 717; + this.state = 889; this.match(CParser.Identifier); break; case CParser.LeftParen: - this.state = 718; + this.state = 890; this.match(CParser.LeftParen); - this.state = 719; + this.state = 891; this.declarator(); - this.state = 720; + this.state = 892; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } this._ctx.stop = this._input.LT(-1); - this.state = 769; + this.state = 941; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,65,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -5698,139 +6474,139 @@ CParser.prototype.directDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 767; + this.state = 939; var la_ = this._interp.adaptivePredict(this._input,64,this._ctx); switch(la_) { case 1: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 724; + this.state = 896; if (!( this.precpred(this._ctx, 6))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 725; + this.state = 897; this.match(CParser.LeftBracket); - this.state = 727; + this.state = 899; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 726; + this.state = 898; this.typeQualifierList(0); } - this.state = 730; + this.state = 902; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 729; + this.state = 901; this.assignmentExpression(); } - this.state = 732; + this.state = 904; this.match(CParser.RightBracket); break; case 2: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 733; + this.state = 905; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 734; + this.state = 906; this.match(CParser.LeftBracket); - this.state = 735; + this.state = 907; this.match(CParser.Static); - this.state = 737; + this.state = 909; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 736; + this.state = 908; this.typeQualifierList(0); } - this.state = 739; + this.state = 911; this.assignmentExpression(); - this.state = 740; + this.state = 912; this.match(CParser.RightBracket); break; case 3: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 742; + this.state = 914; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 743; + this.state = 915; this.match(CParser.LeftBracket); - this.state = 744; + this.state = 916; this.typeQualifierList(0); - this.state = 745; + this.state = 917; this.match(CParser.Static); - this.state = 746; + this.state = 918; this.assignmentExpression(); - this.state = 747; + this.state = 919; this.match(CParser.RightBracket); break; case 4: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 749; + this.state = 921; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 750; + this.state = 922; this.match(CParser.LeftBracket); - this.state = 752; + this.state = 924; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 751; + this.state = 923; this.typeQualifierList(0); } - this.state = 754; + this.state = 926; this.match(CParser.Star); - this.state = 755; + this.state = 927; this.match(CParser.RightBracket); break; case 5: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 756; + this.state = 928; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 757; + this.state = 929; this.match(CParser.LeftParen); - this.state = 758; + this.state = 930; this.parameterTypeList(); - this.state = 759; + this.state = 931; this.match(CParser.RightParen); break; case 6: localctx = new DirectDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator); - this.state = 761; + this.state = 933; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 762; + this.state = 934; this.match(CParser.LeftParen); - this.state = 764; + this.state = 936; _la = this._input.LA(1); if(_la===CParser.Identifier) { - this.state = 763; + this.state = 935; this.identifierList(0); } - this.state = 766; + this.state = 938; this.match(CParser.RightParen); break; } } - this.state = 771; + this.state = 943; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,65,this._ctx); } @@ -5904,30 +6680,30 @@ CParser.prototype.gccDeclaratorExtension = function() { this.enterRule(localctx, 100, CParser.RULE_gccDeclaratorExtension); var _la = 0; // Token type try { - this.state = 781; + this.state = 953; switch(this._input.LA(1)) { case CParser.T__10: this.enterOuterAlt(localctx, 1); - this.state = 772; + this.state = 944; this.match(CParser.T__10); - this.state = 773; + this.state = 945; this.match(CParser.LeftParen); - this.state = 775; + this.state = 947; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 774; + this.state = 946; this.match(CParser.StringLiteral); - this.state = 777; + this.state = 949; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 779; + this.state = 951; this.match(CParser.RightParen); break; case CParser.T__11: this.enterOuterAlt(localctx, 2); - this.state = 780; + this.state = 952; this.gccAttributeSpecifier(); break; default: @@ -5990,17 +6766,17 @@ CParser.prototype.gccAttributeSpecifier = function() { this.enterRule(localctx, 102, CParser.RULE_gccAttributeSpecifier); try { this.enterOuterAlt(localctx, 1); - this.state = 783; + this.state = 955; this.match(CParser.T__11); - this.state = 784; + this.state = 956; this.match(CParser.LeftParen); - this.state = 785; + this.state = 957; this.match(CParser.LeftParen); - this.state = 786; + this.state = 958; this.gccAttributeList(); - this.state = 787; + this.state = 959; this.match(CParser.RightParen); - this.state = 788; + this.state = 960; this.match(CParser.RightParen); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -6066,22 +6842,22 @@ CParser.prototype.gccAttributeList = function() { this.enterRule(localctx, 104, CParser.RULE_gccAttributeList); var _la = 0; // Token type try { - this.state = 799; + this.state = 971; var la_ = this._interp.adaptivePredict(this._input,69,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 790; + this.state = 962; this.gccAttribute(); - this.state = 795; + this.state = 967; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 791; + this.state = 963; this.match(CParser.Comma); - this.state = 792; + this.state = 964; this.gccAttribute(); - this.state = 797; + this.state = 969; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6150,7 +6926,7 @@ CParser.prototype.gccAttribute = function() { this.enterRule(localctx, 106, CParser.RULE_gccAttribute); var _la = 0; // Token type try { - this.state = 810; + this.state = 982; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6263,7 +7039,7 @@ CParser.prototype.gccAttribute = function() { case CParser.BlockComment: case CParser.LineComment: this.enterOuterAlt(localctx, 1); - this.state = 801; + this.state = 973; _la = this._input.LA(1); if(_la<=0 || ((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.RightParen - 59)) | (1 << (CParser.Comma - 59)))) !== 0)) { this._errHandler.recoverInline(this); @@ -6271,23 +7047,24 @@ CParser.prototype.gccAttribute = function() { else { this.consume(); } - this.state = 807; + this.state = 979; _la = this._input.LA(1); if(_la===CParser.LeftParen) { - this.state = 802; + this.state = 974; this.match(CParser.LeftParen); - this.state = 804; + this.state = 976; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 803; + this.state = 975; this.argumentExpressionList(0); } - this.state = 806; + this.state = 978; this.match(CParser.RightParen); } break; + case CParser.EOF: case CParser.RightParen: case CParser.Comma: this.enterOuterAlt(localctx, 2); @@ -6361,11 +7138,11 @@ CParser.prototype.nestedParenthesesBlock = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 819; + this.state = 991; this._errHandler.sync(this); _la = this._input.LA(1); while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { - this.state = 817; + this.state = 989; switch(this._input.LA(1)) { case CParser.T__0: case CParser.T__1: @@ -6478,7 +7255,7 @@ CParser.prototype.nestedParenthesesBlock = function() { case CParser.Newline: case CParser.BlockComment: case CParser.LineComment: - this.state = 812; + this.state = 984; _la = this._input.LA(1); if(_la<=0 || _la===CParser.LeftParen || _la===CParser.RightParen) { this._errHandler.recoverInline(this); @@ -6488,17 +7265,17 @@ CParser.prototype.nestedParenthesesBlock = function() { } break; case CParser.LeftParen: - this.state = 813; + this.state = 985; this.match(CParser.LeftParen); - this.state = 814; + this.state = 986; this.nestedParenthesesBlock(); - this.state = 815; + this.state = 987; this.match(CParser.RightParen); break; default: throw new antlr4.error.NoViableAltException(this); } - this.state = 821; + this.state = 993; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -6563,17 +7340,17 @@ CParser.prototype.pointer = function() { this.enterRule(localctx, 110, CParser.RULE_pointer); var _la = 0; // Token type try { - this.state = 840; + this.state = 1012; var la_ = this._interp.adaptivePredict(this._input,79,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 822; + this.state = 994; this.match(CParser.Star); - this.state = 824; + this.state = 996; var la_ = this._interp.adaptivePredict(this._input,75,this._ctx); if(la_===1) { - this.state = 823; + this.state = 995; this.typeQualifierList(0); } @@ -6581,27 +7358,27 @@ CParser.prototype.pointer = function() { case 2: this.enterOuterAlt(localctx, 2); - this.state = 826; + this.state = 998; this.match(CParser.Star); - this.state = 828; + this.state = 1000; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 827; + this.state = 999; this.typeQualifierList(0); } - this.state = 830; + this.state = 1002; this.pointer(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 831; + this.state = 1003; this.match(CParser.Caret); - this.state = 833; + this.state = 1005; var la_ = this._interp.adaptivePredict(this._input,77,this._ctx); if(la_===1) { - this.state = 832; + this.state = 1004; this.typeQualifierList(0); } @@ -6609,16 +7386,16 @@ CParser.prototype.pointer = function() { case 4: this.enterOuterAlt(localctx, 4); - this.state = 835; + this.state = 1007; this.match(CParser.Caret); - this.state = 837; + this.state = 1009; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 836; + this.state = 1008; this.typeQualifierList(0); } - this.state = 839; + this.state = 1011; this.pointer(); break; @@ -6687,10 +7464,10 @@ CParser.prototype.typeQualifierList = function(_p) { this.enterRecursionRule(localctx, 112, CParser.RULE_typeQualifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 843; + this.state = 1015; this.typeQualifier(); this._ctx.stop = this._input.LT(-1); - this.state = 849; + this.state = 1021; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,80,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6701,14 +7478,14 @@ CParser.prototype.typeQualifierList = function(_p) { _prevctx = localctx; localctx = new TypeQualifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_typeQualifierList); - this.state = 845; + this.state = 1017; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 846; + this.state = 1018; this.typeQualifier(); } - this.state = 851; + this.state = 1023; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,80,this._ctx); } @@ -6769,22 +7546,22 @@ CParser.prototype.parameterTypeList = function() { var localctx = new ParameterTypeListContext(this, this._ctx, this.state); this.enterRule(localctx, 114, CParser.RULE_parameterTypeList); try { - this.state = 857; + this.state = 1029; var la_ = this._interp.adaptivePredict(this._input,81,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 852; + this.state = 1024; this.parameterList(0); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 853; + this.state = 1025; this.parameterList(0); - this.state = 854; + this.state = 1026; this.match(CParser.Comma); - this.state = 855; + this.state = 1027; this.match(CParser.Ellipsis); break; @@ -6853,10 +7630,10 @@ CParser.prototype.parameterList = function(_p) { this.enterRecursionRule(localctx, 116, CParser.RULE_parameterList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 860; + this.state = 1032; this.parameterDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 867; + this.state = 1039; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,82,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -6867,16 +7644,16 @@ CParser.prototype.parameterList = function(_p) { _prevctx = localctx; localctx = new ParameterListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_parameterList); - this.state = 862; + this.state = 1034; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 863; + this.state = 1035; this.match(CParser.Comma); - this.state = 864; + this.state = 1036; this.parameterDeclaration(); } - this.state = 869; + this.state = 1041; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,82,this._ctx); } @@ -6949,25 +7726,25 @@ CParser.prototype.parameterDeclaration = function() { var localctx = new ParameterDeclarationContext(this, this._ctx, this.state); this.enterRule(localctx, 118, CParser.RULE_parameterDeclaration); try { - this.state = 877; + this.state = 1049; var la_ = this._interp.adaptivePredict(this._input,84,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 870; + this.state = 1042; this.declarationSpecifiers(); - this.state = 871; + this.state = 1043; this.declarator(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 873; + this.state = 1045; this.declarationSpecifiers2(); - this.state = 875; + this.state = 1047; var la_ = this._interp.adaptivePredict(this._input,83,this._ctx); if(la_===1) { - this.state = 874; + this.state = 1046; this.abstractDeclarator(); } @@ -7038,10 +7815,10 @@ CParser.prototype.identifierList = function(_p) { this.enterRecursionRule(localctx, 120, CParser.RULE_identifierList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 880; + this.state = 1052; this.match(CParser.Identifier); this._ctx.stop = this._input.LT(-1); - this.state = 887; + this.state = 1059; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,85,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7052,16 +7829,16 @@ CParser.prototype.identifierList = function(_p) { _prevctx = localctx; localctx = new IdentifierListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_identifierList); - this.state = 882; + this.state = 1054; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 883; + this.state = 1055; this.match(CParser.Comma); - this.state = 884; + this.state = 1056; this.match(CParser.Identifier); } - this.state = 889; + this.state = 1061; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,85,this._ctx); } @@ -7128,12 +7905,12 @@ CParser.prototype.typeName = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 890; + this.state = 1062; this.specifierQualifierList(); - this.state = 892; + this.state = 1064; _la = this._input.LA(1); if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.LeftBracket - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0)) { - this.state = 891; + this.state = 1063; this.abstractDeclarator(); } @@ -7209,35 +7986,35 @@ CParser.prototype.abstractDeclarator = function() { this.enterRule(localctx, 124, CParser.RULE_abstractDeclarator); var _la = 0; // Token type try { - this.state = 905; + this.state = 1077; var la_ = this._interp.adaptivePredict(this._input,89,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 894; + this.state = 1066; this.pointer(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 896; + this.state = 1068; _la = this._input.LA(1); if(_la===CParser.Star || _la===CParser.Caret) { - this.state = 895; + this.state = 1067; this.pointer(); } - this.state = 898; + this.state = 1070; this.directAbstractDeclarator(0); - this.state = 902; + this.state = 1074; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,88,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 899; + this.state = 1071; this.gccDeclaratorExtension(); } - this.state = 904; + this.state = 1076; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,88,this._ctx); } @@ -7333,25 +8110,25 @@ CParser.prototype.directAbstractDeclarator = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 953; + this.state = 1125; var la_ = this._interp.adaptivePredict(this._input,96,this._ctx); switch(la_) { case 1: - this.state = 908; + this.state = 1080; this.match(CParser.LeftParen); - this.state = 909; + this.state = 1081; this.abstractDeclarator(); - this.state = 910; + this.state = 1082; this.match(CParser.RightParen); - this.state = 914; + this.state = 1086; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,90,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 911; + this.state = 1083; this.gccDeclaratorExtension(); } - this.state = 916; + this.state = 1088; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,90,this._ctx); } @@ -7359,87 +8136,87 @@ CParser.prototype.directAbstractDeclarator = function(_p) { break; case 2: - this.state = 917; + this.state = 1089; this.match(CParser.LeftBracket); - this.state = 919; + this.state = 1091; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 918; + this.state = 1090; this.typeQualifierList(0); } - this.state = 922; + this.state = 1094; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 921; + this.state = 1093; this.assignmentExpression(); } - this.state = 924; + this.state = 1096; this.match(CParser.RightBracket); break; case 3: - this.state = 925; + this.state = 1097; this.match(CParser.LeftBracket); - this.state = 926; + this.state = 1098; this.match(CParser.Static); - this.state = 928; + this.state = 1100; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 927; + this.state = 1099; this.typeQualifierList(0); } - this.state = 930; + this.state = 1102; this.assignmentExpression(); - this.state = 931; + this.state = 1103; this.match(CParser.RightBracket); break; case 4: - this.state = 933; + this.state = 1105; this.match(CParser.LeftBracket); - this.state = 934; + this.state = 1106; this.typeQualifierList(0); - this.state = 935; + this.state = 1107; this.match(CParser.Static); - this.state = 936; + this.state = 1108; this.assignmentExpression(); - this.state = 937; + this.state = 1109; this.match(CParser.RightBracket); break; case 5: - this.state = 939; + this.state = 1111; this.match(CParser.LeftBracket); - this.state = 940; + this.state = 1112; this.match(CParser.Star); - this.state = 941; + this.state = 1113; this.match(CParser.RightBracket); break; case 6: - this.state = 942; + this.state = 1114; this.match(CParser.LeftParen); - this.state = 944; + this.state = 1116; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 943; + this.state = 1115; this.parameterTypeList(); } - this.state = 946; + this.state = 1118; this.match(CParser.RightParen); - this.state = 950; + this.state = 1122; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,95,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 947; + this.state = 1119; this.gccDeclaratorExtension(); } - this.state = 952; + this.state = 1124; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,95,this._ctx); } @@ -7448,7 +8225,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } this._ctx.stop = this._input.LT(-1); - this.state = 998; + this.state = 1170; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,103,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7457,121 +8234,121 @@ CParser.prototype.directAbstractDeclarator = function(_p) { this.triggerExitRuleEvent(); } _prevctx = localctx; - this.state = 996; + this.state = 1168; var la_ = this._interp.adaptivePredict(this._input,102,this._ctx); switch(la_) { case 1: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 955; + this.state = 1127; if (!( this.precpred(this._ctx, 5))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 956; + this.state = 1128; this.match(CParser.LeftBracket); - this.state = 958; + this.state = 1130; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 957; + this.state = 1129; this.typeQualifierList(0); } - this.state = 961; + this.state = 1133; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 960; + this.state = 1132; this.assignmentExpression(); } - this.state = 963; + this.state = 1135; this.match(CParser.RightBracket); break; case 2: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 964; + this.state = 1136; if (!( this.precpred(this._ctx, 4))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 965; + this.state = 1137; this.match(CParser.LeftBracket); - this.state = 966; + this.state = 1138; this.match(CParser.Static); - this.state = 968; + this.state = 1140; _la = this._input.LA(1); if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { - this.state = 967; + this.state = 1139; this.typeQualifierList(0); } - this.state = 970; + this.state = 1142; this.assignmentExpression(); - this.state = 971; + this.state = 1143; this.match(CParser.RightBracket); break; case 3: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 973; + this.state = 1145; if (!( this.precpred(this._ctx, 3))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 974; + this.state = 1146; this.match(CParser.LeftBracket); - this.state = 975; + this.state = 1147; this.typeQualifierList(0); - this.state = 976; + this.state = 1148; this.match(CParser.Static); - this.state = 977; + this.state = 1149; this.assignmentExpression(); - this.state = 978; + this.state = 1150; this.match(CParser.RightBracket); break; case 4: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 980; + this.state = 1152; if (!( this.precpred(this._ctx, 2))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 981; + this.state = 1153; this.match(CParser.LeftBracket); - this.state = 982; + this.state = 1154; this.match(CParser.Star); - this.state = 983; + this.state = 1155; this.match(CParser.RightBracket); break; case 5: localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator); - this.state = 984; + this.state = 1156; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 985; + this.state = 1157; this.match(CParser.LeftParen); - this.state = 987; + this.state = 1159; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 986; + this.state = 1158; this.parameterTypeList(); } - this.state = 989; + this.state = 1161; this.match(CParser.RightParen); - this.state = 993; + this.state = 1165; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,101,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { if(_alt===1) { - this.state = 990; + this.state = 1162; this.gccDeclaratorExtension(); } - this.state = 995; + this.state = 1167; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,101,this._ctx); } @@ -7580,7 +8357,7 @@ CParser.prototype.directAbstractDeclarator = function(_p) { } } - this.state = 1000; + this.state = 1172; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,103,this._ctx); } @@ -7642,7 +8419,7 @@ CParser.prototype.typedefName = function() { this.enterRule(localctx, 128, CParser.RULE_typedefName); try { this.enterOuterAlt(localctx, 1); - this.state = 1001; + this.state = 1173; this.match(CParser.Identifier); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -7704,34 +8481,34 @@ CParser.prototype.initializer = function() { var localctx = new InitializerContext(this, this._ctx, this.state); this.enterRule(localctx, 130, CParser.RULE_initializer); try { - this.state = 1013; + this.state = 1185; var la_ = this._interp.adaptivePredict(this._input,104,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1003; + this.state = 1175; this.assignmentExpression(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1004; + this.state = 1176; this.match(CParser.LeftBrace); - this.state = 1005; + this.state = 1177; this.initializerList(0); - this.state = 1006; + this.state = 1178; this.match(CParser.RightBrace); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1008; + this.state = 1180; this.match(CParser.LeftBrace); - this.state = 1009; + this.state = 1181; this.initializerList(0); - this.state = 1010; + this.state = 1182; this.match(CParser.Comma); - this.state = 1011; + this.state = 1183; this.match(CParser.RightBrace); break; @@ -7805,17 +8582,17 @@ CParser.prototype.initializerList = function(_p) { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1017; + this.state = 1189; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1016; + this.state = 1188; this.designation(); } - this.state = 1019; + this.state = 1191; this.initializer(); this._ctx.stop = this._input.LT(-1); - this.state = 1029; + this.state = 1201; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,107,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7826,23 +8603,23 @@ CParser.prototype.initializerList = function(_p) { _prevctx = localctx; localctx = new InitializerListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initializerList); - this.state = 1021; + this.state = 1193; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1022; + this.state = 1194; this.match(CParser.Comma); - this.state = 1024; + this.state = 1196; _la = this._input.LA(1); if(_la===CParser.LeftBracket || _la===CParser.Dot) { - this.state = 1023; + this.state = 1195; this.designation(); } - this.state = 1026; + this.state = 1198; this.initializer(); } - this.state = 1031; + this.state = 1203; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,107,this._ctx); } @@ -7904,9 +8681,9 @@ CParser.prototype.designation = function() { this.enterRule(localctx, 134, CParser.RULE_designation); try { this.enterOuterAlt(localctx, 1); - this.state = 1032; + this.state = 1204; this.designatorList(0); - this.state = 1033; + this.state = 1205; this.match(CParser.Assign); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -7972,10 +8749,10 @@ CParser.prototype.designatorList = function(_p) { this.enterRecursionRule(localctx, 136, CParser.RULE_designatorList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1036; + this.state = 1208; this.designator(); this._ctx.stop = this._input.LT(-1); - this.state = 1042; + this.state = 1214; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,108,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -7986,14 +8763,14 @@ CParser.prototype.designatorList = function(_p) { _prevctx = localctx; localctx = new DesignatorListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_designatorList); - this.state = 1038; + this.state = 1210; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1039; + this.state = 1211; this.designator(); } - this.state = 1044; + this.state = 1216; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,108,this._ctx); } @@ -8058,22 +8835,22 @@ CParser.prototype.designator = function() { var localctx = new DesignatorContext(this, this._ctx, this.state); this.enterRule(localctx, 138, CParser.RULE_designator); try { - this.state = 1051; + this.state = 1223; switch(this._input.LA(1)) { case CParser.LeftBracket: this.enterOuterAlt(localctx, 1); - this.state = 1045; + this.state = 1217; this.match(CParser.LeftBracket); - this.state = 1046; + this.state = 1218; this.constantExpression(); - this.state = 1047; + this.state = 1219; this.match(CParser.RightBracket); break; case CParser.Dot: this.enterOuterAlt(localctx, 2); - this.state = 1049; + this.state = 1221; this.match(CParser.Dot); - this.state = 1050; + this.state = 1222; this.match(CParser.Identifier); break; default: @@ -8149,27 +8926,27 @@ CParser.prototype.staticAssertDeclaration = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1053; + this.state = 1225; this.match(CParser.StaticAssert); - this.state = 1054; + this.state = 1226; this.match(CParser.LeftParen); - this.state = 1055; + this.state = 1227; this.constantExpression(); - this.state = 1056; + this.state = 1228; this.match(CParser.Comma); - this.state = 1058; + this.state = 1230; this._errHandler.sync(this); _la = this._input.LA(1); do { - this.state = 1057; + this.state = 1229; this.match(CParser.StringLiteral); - this.state = 1060; + this.state = 1232; this._errHandler.sync(this); _la = this._input.LA(1); } while(_la===CParser.StringLiteral); - this.state = 1062; + this.state = 1234; this.match(CParser.RightParen); - this.state = 1063; + this.state = 1235; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8259,48 +9036,48 @@ CParser.prototype.statement = function() { this.enterRule(localctx, 142, CParser.RULE_statement); var _la = 0; // Token type try { - this.state = 1102; + this.state = 1274; var la_ = this._interp.adaptivePredict(this._input,116,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1065; + this.state = 1237; this.labeledStatement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1066; + this.state = 1238; this.compoundStatement(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1067; + this.state = 1239; this.expressionStatement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1068; + this.state = 1240; this.selectionStatement(); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1069; + this.state = 1241; this.iterationStatement(); break; case 6: this.enterOuterAlt(localctx, 6); - this.state = 1070; + this.state = 1242; this.jumpStatement(); break; case 7: this.enterOuterAlt(localctx, 7); - this.state = 1071; + this.state = 1243; _la = this._input.LA(1); if(!(_la===CParser.T__10 || _la===CParser.T__12)) { this._errHandler.recoverInline(this); @@ -8308,7 +9085,7 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1072; + this.state = 1244; _la = this._input.LA(1); if(!(_la===CParser.T__13 || _la===CParser.Volatile)) { this._errHandler.recoverInline(this); @@ -8316,59 +9093,59 @@ CParser.prototype.statement = function() { else { this.consume(); } - this.state = 1073; + this.state = 1245; this.match(CParser.LeftParen); - this.state = 1082; + this.state = 1254; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1074; + this.state = 1246; this.logicalOrExpression(0); - this.state = 1079; + this.state = 1251; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1075; + this.state = 1247; this.match(CParser.Comma); - this.state = 1076; + this.state = 1248; this.logicalOrExpression(0); - this.state = 1081; + this.state = 1253; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1097; + this.state = 1269; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Colon) { - this.state = 1084; + this.state = 1256; this.match(CParser.Colon); - this.state = 1093; + this.state = 1265; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1085; + this.state = 1257; this.logicalOrExpression(0); - this.state = 1090; + this.state = 1262; this._errHandler.sync(this); _la = this._input.LA(1); while(_la===CParser.Comma) { - this.state = 1086; + this.state = 1258; this.match(CParser.Comma); - this.state = 1087; + this.state = 1259; this.logicalOrExpression(0); - this.state = 1092; + this.state = 1264; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 1099; + this.state = 1271; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 1100; + this.state = 1272; this.match(CParser.RightParen); - this.state = 1101; + this.state = 1273; this.match(CParser.Semi); break; @@ -8437,35 +9214,35 @@ CParser.prototype.labeledStatement = function() { var localctx = new LabeledStatementContext(this, this._ctx, this.state); this.enterRule(localctx, 144, CParser.RULE_labeledStatement); try { - this.state = 1115; + this.state = 1287; switch(this._input.LA(1)) { case CParser.Identifier: this.enterOuterAlt(localctx, 1); - this.state = 1104; + this.state = 1276; this.match(CParser.Identifier); - this.state = 1105; + this.state = 1277; this.match(CParser.Colon); - this.state = 1106; + this.state = 1278; this.statement(); break; case CParser.Case: this.enterOuterAlt(localctx, 2); - this.state = 1107; + this.state = 1279; this.match(CParser.Case); - this.state = 1108; + this.state = 1280; this.constantExpression(); - this.state = 1109; + this.state = 1281; this.match(CParser.Colon); - this.state = 1110; + this.state = 1282; this.statement(); break; case CParser.Default: this.enterOuterAlt(localctx, 3); - this.state = 1112; + this.state = 1284; this.match(CParser.Default); - this.state = 1113; + this.state = 1285; this.match(CParser.Colon); - this.state = 1114; + this.state = 1286; this.statement(); break; default: @@ -8529,16 +9306,16 @@ CParser.prototype.compoundStatement = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1117; + this.state = 1289; this.match(CParser.LeftBrace); - this.state = 1119; + this.state = 1291; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)) | (1 << (CParser.Semi - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1118; + this.state = 1290; this.blockItemList(0); } - this.state = 1121; + this.state = 1293; this.match(CParser.RightBrace); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8604,10 +9381,10 @@ CParser.prototype.blockItemList = function(_p) { this.enterRecursionRule(localctx, 148, CParser.RULE_blockItemList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1124; + this.state = 1296; this.blockItem(); this._ctx.stop = this._input.LT(-1); - this.state = 1130; + this.state = 1302; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,119,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -8618,14 +9395,14 @@ CParser.prototype.blockItemList = function(_p) { _prevctx = localctx; localctx = new BlockItemListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_blockItemList); - this.state = 1126; + this.state = 1298; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1127; + this.state = 1299; this.blockItem(); } - this.state = 1132; + this.state = 1304; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,119,this._ctx); } @@ -8694,24 +9471,24 @@ CParser.prototype.blockItem = function() { var localctx = new BlockItemContext(this, this._ctx, this.state); this.enterRule(localctx, 150, CParser.RULE_blockItem); try { - this.state = 1136; + this.state = 1308; var la_ = this._interp.adaptivePredict(this._input,120,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1133; + this.state = 1305; this.specialMethodCall(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1134; + this.state = 1306; this.declaration(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1135; + this.state = 1307; this.statement(); break; @@ -8777,15 +9554,15 @@ CParser.prototype.specialMethodCall = function() { this.enterRule(localctx, 152, CParser.RULE_specialMethodCall); try { this.enterOuterAlt(localctx, 1); - this.state = 1138; + this.state = 1310; this.match(CParser.Identifier); - this.state = 1139; + this.state = 1311; this.match(CParser.LeftParen); - this.state = 1140; + this.state = 1312; this.assignmentExpression(); - this.state = 1141; + this.state = 1313; this.match(CParser.RightParen); - this.state = 1142; + this.state = 1314; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8845,14 +9622,14 @@ CParser.prototype.expressionStatement = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1145; + this.state = 1317; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1144; + this.state = 1316; this.expression(0); } - this.state = 1147; + this.state = 1319; this.match(CParser.Semi); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -8921,41 +9698,41 @@ CParser.prototype.selectionStatement = function() { var localctx = new SelectionStatementContext(this, this._ctx, this.state); this.enterRule(localctx, 156, CParser.RULE_selectionStatement); try { - this.state = 1164; + this.state = 1336; switch(this._input.LA(1)) { case CParser.If: this.enterOuterAlt(localctx, 1); - this.state = 1149; + this.state = 1321; this.match(CParser.If); - this.state = 1150; + this.state = 1322; this.match(CParser.LeftParen); - this.state = 1151; + this.state = 1323; this.expression(0); - this.state = 1152; + this.state = 1324; this.match(CParser.RightParen); - this.state = 1153; + this.state = 1325; this.statement(); - this.state = 1156; + this.state = 1328; var la_ = this._interp.adaptivePredict(this._input,122,this._ctx); if(la_===1) { - this.state = 1154; + this.state = 1326; this.match(CParser.Else); - this.state = 1155; + this.state = 1327; this.statement(); } break; case CParser.Switch: this.enterOuterAlt(localctx, 2); - this.state = 1158; + this.state = 1330; this.match(CParser.Switch); - this.state = 1159; + this.state = 1331; this.match(CParser.LeftParen); - this.state = 1160; + this.state = 1332; this.expression(0); - this.state = 1161; + this.state = 1333; this.match(CParser.RightParen); - this.state = 1162; + this.state = 1334; this.statement(); break; default: @@ -9033,105 +9810,105 @@ CParser.prototype.iterationStatement = function() { this.enterRule(localctx, 158, CParser.RULE_iterationStatement); var _la = 0; // Token type try { - this.state = 1208; + this.state = 1380; var la_ = this._interp.adaptivePredict(this._input,129,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1166; + this.state = 1338; this.match(CParser.While); - this.state = 1167; + this.state = 1339; this.match(CParser.LeftParen); - this.state = 1168; + this.state = 1340; this.expression(0); - this.state = 1169; + this.state = 1341; this.match(CParser.RightParen); - this.state = 1170; + this.state = 1342; this.statement(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1172; + this.state = 1344; this.match(CParser.Do); - this.state = 1173; + this.state = 1345; this.statement(); - this.state = 1174; + this.state = 1346; this.match(CParser.While); - this.state = 1175; + this.state = 1347; this.match(CParser.LeftParen); - this.state = 1176; + this.state = 1348; this.expression(0); - this.state = 1177; + this.state = 1349; this.match(CParser.RightParen); - this.state = 1178; + this.state = 1350; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1180; + this.state = 1352; this.match(CParser.For); - this.state = 1181; + this.state = 1353; this.match(CParser.LeftParen); - this.state = 1183; + this.state = 1355; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1182; + this.state = 1354; this.expression(0); } - this.state = 1185; + this.state = 1357; this.match(CParser.Semi); - this.state = 1187; + this.state = 1359; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1186; + this.state = 1358; this.expression(0); } - this.state = 1189; + this.state = 1361; this.match(CParser.Semi); - this.state = 1191; + this.state = 1363; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1190; + this.state = 1362; this.expression(0); } - this.state = 1193; + this.state = 1365; this.match(CParser.RightParen); - this.state = 1194; + this.state = 1366; this.statement(); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1195; + this.state = 1367; this.match(CParser.For); - this.state = 1196; + this.state = 1368; this.match(CParser.LeftParen); - this.state = 1197; + this.state = 1369; this.declaration(); - this.state = 1199; + this.state = 1371; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1198; + this.state = 1370; this.expression(0); } - this.state = 1201; + this.state = 1373; this.match(CParser.Semi); - this.state = 1203; + this.state = 1375; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1202; + this.state = 1374; this.expression(0); } - this.state = 1205; + this.state = 1377; this.match(CParser.RightParen); - this.state = 1206; + this.state = 1378; this.statement(); break; @@ -9201,57 +9978,57 @@ CParser.prototype.jumpStatement = function() { this.enterRule(localctx, 160, CParser.RULE_jumpStatement); var _la = 0; // Token type try { - this.state = 1226; + this.state = 1398; var la_ = this._interp.adaptivePredict(this._input,131,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1210; + this.state = 1382; this.match(CParser.Goto); - this.state = 1211; + this.state = 1383; this.match(CParser.Identifier); - this.state = 1212; + this.state = 1384; this.match(CParser.Semi); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1213; + this.state = 1385; this.match(CParser.Continue); - this.state = 1214; + this.state = 1386; this.match(CParser.Semi); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1215; + this.state = 1387; this.match(CParser.Break); - this.state = 1216; + this.state = 1388; this.match(CParser.Semi); break; case 4: this.enterOuterAlt(localctx, 4); - this.state = 1217; + this.state = 1389; this.match(CParser.Return); - this.state = 1219; + this.state = 1391; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { - this.state = 1218; + this.state = 1390; this.expression(0); } - this.state = 1221; + this.state = 1393; this.match(CParser.Semi); break; case 5: this.enterOuterAlt(localctx, 5); - this.state = 1222; + this.state = 1394; this.match(CParser.Goto); - this.state = 1223; + this.state = 1395; this.unaryExpression(); - this.state = 1224; + this.state = 1396; this.match(CParser.Semi); break; @@ -9317,25 +10094,26 @@ CParser.prototype.compilationUnit = function() { this.enterRule(localctx, 162, CParser.RULE_compilationUnit); var _la = 0; // Token type try { - this.state = 1233; + this.state = 1405; var la_ = this._interp.adaptivePredict(this._input,133,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1229; + this.state = 1401; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) { - this.state = 1228; + this.state = 1400; this.translationUnit(0); } - this.state = 1231; + this.state = 1403; this.match(CParser.EOF); break; case 2: this.enterOuterAlt(localctx, 2); - + this.state = 1404; + this.match(CParser.EOF); break; } @@ -9403,10 +10181,10 @@ CParser.prototype.translationUnit = function(_p) { this.enterRecursionRule(localctx, 164, CParser.RULE_translationUnit, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1236; + this.state = 1408; this.externalDeclaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1242; + this.state = 1414; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,134,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -9417,14 +10195,14 @@ CParser.prototype.translationUnit = function(_p) { _prevctx = localctx; localctx = new TranslationUnitContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_translationUnit); - this.state = 1238; + this.state = 1410; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1239; + this.state = 1411; this.externalDeclaration(); } - this.state = 1244; + this.state = 1416; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,134,this._ctx); } @@ -9489,24 +10267,24 @@ CParser.prototype.externalDeclaration = function() { var localctx = new ExternalDeclarationContext(this, this._ctx, this.state); this.enterRule(localctx, 166, CParser.RULE_externalDeclaration); try { - this.state = 1248; + this.state = 1420; var la_ = this._interp.adaptivePredict(this._input,135,this._ctx); switch(la_) { case 1: this.enterOuterAlt(localctx, 1); - this.state = 1245; + this.state = 1417; this.functionDefinition(); break; case 2: this.enterOuterAlt(localctx, 2); - this.state = 1246; + this.state = 1418; this.declaration(); break; case 3: this.enterOuterAlt(localctx, 3); - this.state = 1247; + this.state = 1419; this.match(CParser.Semi); break; @@ -9581,23 +10359,23 @@ CParser.prototype.functionDefinition = function() { var _la = 0; // Token type try { this.enterOuterAlt(localctx, 1); - this.state = 1251; + this.state = 1423; var la_ = this._interp.adaptivePredict(this._input,136,this._ctx); if(la_===1) { - this.state = 1250; + this.state = 1422; this.declarationSpecifiers(); } - this.state = 1253; + this.state = 1425; this.declarator(); - this.state = 1255; + this.state = 1427; _la = this._input.LA(1); if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { - this.state = 1254; + this.state = 1426; this.declarationList(0); } - this.state = 1257; + this.state = 1429; this.compoundStatement(); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { @@ -9663,10 +10441,10 @@ CParser.prototype.declarationList = function(_p) { this.enterRecursionRule(localctx, 170, CParser.RULE_declarationList, _p); try { this.enterOuterAlt(localctx, 1); - this.state = 1260; + this.state = 1432; this.declaration(); this._ctx.stop = this._input.LT(-1); - this.state = 1266; + this.state = 1438; this._errHandler.sync(this); var _alt = this._interp.adaptivePredict(this._input,138,this._ctx) while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { @@ -9677,14 +10455,14 @@ CParser.prototype.declarationList = function(_p) { _prevctx = localctx; localctx = new DeclarationListContext(this, _parentctx, _parentState); this.pushNewRecursionContext(localctx, _startState, CParser.RULE_declarationList); - this.state = 1262; + this.state = 1434; if (!( this.precpred(this._ctx, 1))) { throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 1263; + this.state = 1435; this.declaration(); } - this.state = 1268; + this.state = 1440; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input,138,this._ctx); } @@ -9703,6 +10481,9420 @@ CParser.prototype.declarationList = function(_p) { return localctx; }; +function PrimaryExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_primaryExpression_DropletFile; + return this; +} + +PrimaryExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +PrimaryExpression_DropletFileContext.prototype.constructor = PrimaryExpression_DropletFileContext; + +PrimaryExpression_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +PrimaryExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +PrimaryExpression_DropletFileContext.prototype.Constant = function() { + return this.getToken(CParser.Constant, 0); +}; + +PrimaryExpression_DropletFileContext.prototype.StringLiteral = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CParser.StringLiteral); + } else { + return this.getToken(CParser.StringLiteral, i); + } +}; + + +PrimaryExpression_DropletFileContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +PrimaryExpression_DropletFileContext.prototype.genericSelection = function() { + return this.getTypedRuleContext(GenericSelectionContext,0); +}; + +PrimaryExpression_DropletFileContext.prototype.compoundStatement = function() { + return this.getTypedRuleContext(CompoundStatementContext,0); +}; + +PrimaryExpression_DropletFileContext.prototype.unaryExpression = function() { + return this.getTypedRuleContext(UnaryExpressionContext,0); +}; + +PrimaryExpression_DropletFileContext.prototype.typeName = function() { + return this.getTypedRuleContext(TypeNameContext,0); +}; + +PrimaryExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterPrimaryExpression_DropletFile(this); + } +}; + +PrimaryExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitPrimaryExpression_DropletFile(this); + } +}; + + + + +CParser.PrimaryExpression_DropletFileContext = PrimaryExpression_DropletFileContext; + +CParser.prototype.primaryExpression_DropletFile = function() { + + var localctx = new PrimaryExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 172, CParser.RULE_primaryExpression_DropletFile); + var _la = 0; // Token type + try { + this.state = 1482; + var la_ = this._interp.adaptivePredict(this._input,141,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1441; + this.match(CParser.Identifier); + this.state = 1442; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1443; + this.match(CParser.Constant); + this.state = 1444; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1446; + this._errHandler.sync(this); + _la = this._input.LA(1); + do { + this.state = 1445; + this.match(CParser.StringLiteral); + this.state = 1448; + this._errHandler.sync(this); + _la = this._input.LA(1); + } while(_la===CParser.StringLiteral); + this.state = 1450; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1451; + this.match(CParser.LeftParen); + this.state = 1452; + this.expression(0); + this.state = 1453; + this.match(CParser.RightParen); + this.state = 1454; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1456; + this.genericSelection(); + this.state = 1457; + this.match(CParser.EOF); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 1460; + _la = this._input.LA(1); + if(_la===CParser.T__0) { + this.state = 1459; + this.match(CParser.T__0); + } + + this.state = 1462; + this.match(CParser.LeftParen); + this.state = 1463; + this.compoundStatement(); + this.state = 1464; + this.match(CParser.RightParen); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 1466; + this.match(CParser.T__1); + this.state = 1467; + this.match(CParser.LeftParen); + this.state = 1468; + this.unaryExpression(); + this.state = 1469; + this.match(CParser.Comma); + this.state = 1470; + this.typeName(); + this.state = 1471; + this.match(CParser.RightParen); + this.state = 1472; + this.match(CParser.EOF); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 1474; + this.match(CParser.T__2); + this.state = 1475; + this.match(CParser.LeftParen); + this.state = 1476; + this.typeName(); + this.state = 1477; + this.match(CParser.Comma); + this.state = 1478; + this.unaryExpression(); + this.state = 1479; + this.match(CParser.RightParen); + this.state = 1480; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function GenericSelection_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_genericSelection_DropletFile; + return this; +} + +GenericSelection_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +GenericSelection_DropletFileContext.prototype.constructor = GenericSelection_DropletFileContext; + +GenericSelection_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +GenericSelection_DropletFileContext.prototype.genericAssocList = function() { + return this.getTypedRuleContext(GenericAssocListContext,0); +}; + +GenericSelection_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +GenericSelection_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterGenericSelection_DropletFile(this); + } +}; + +GenericSelection_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitGenericSelection_DropletFile(this); + } +}; + + + + +CParser.GenericSelection_DropletFileContext = GenericSelection_DropletFileContext; + +CParser.prototype.genericSelection_DropletFile = function() { + + var localctx = new GenericSelection_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 174, CParser.RULE_genericSelection_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1484; + this.match(CParser.Generic); + this.state = 1485; + this.match(CParser.LeftParen); + this.state = 1486; + this.assignmentExpression(); + this.state = 1487; + this.match(CParser.Comma); + this.state = 1488; + this.genericAssocList(0); + this.state = 1489; + this.match(CParser.RightParen); + this.state = 1490; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function GenericAssocList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_genericAssocList_DropletFile; + return this; +} + +GenericAssocList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +GenericAssocList_DropletFileContext.prototype.constructor = GenericAssocList_DropletFileContext; + +GenericAssocList_DropletFileContext.prototype.genericAssociation = function() { + return this.getTypedRuleContext(GenericAssociationContext,0); +}; + +GenericAssocList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +GenericAssocList_DropletFileContext.prototype.genericAssocList = function() { + return this.getTypedRuleContext(GenericAssocListContext,0); +}; + +GenericAssocList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterGenericAssocList_DropletFile(this); + } +}; + +GenericAssocList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitGenericAssocList_DropletFile(this); + } +}; + + + + +CParser.GenericAssocList_DropletFileContext = GenericAssocList_DropletFileContext; + +CParser.prototype.genericAssocList_DropletFile = function() { + + var localctx = new GenericAssocList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 176, CParser.RULE_genericAssocList_DropletFile); + try { + this.state = 1500; + var la_ = this._interp.adaptivePredict(this._input,142,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1492; + this.genericAssociation(); + this.state = 1493; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1495; + this.genericAssocList(0); + this.state = 1496; + this.match(CParser.Comma); + this.state = 1497; + this.genericAssociation(); + this.state = 1498; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function GenericAssociation_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_genericAssociation_DropletFile; + return this; +} + +GenericAssociation_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +GenericAssociation_DropletFileContext.prototype.constructor = GenericAssociation_DropletFileContext; + +GenericAssociation_DropletFileContext.prototype.typeName = function() { + return this.getTypedRuleContext(TypeNameContext,0); +}; + +GenericAssociation_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +GenericAssociation_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +GenericAssociation_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterGenericAssociation_DropletFile(this); + } +}; + +GenericAssociation_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitGenericAssociation_DropletFile(this); + } +}; + + + + +CParser.GenericAssociation_DropletFileContext = GenericAssociation_DropletFileContext; + +CParser.prototype.genericAssociation_DropletFile = function() { + + var localctx = new GenericAssociation_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 178, CParser.RULE_genericAssociation_DropletFile); + try { + this.state = 1512; + switch(this._input.LA(1)) { + case CParser.T__0: + case CParser.T__3: + case CParser.T__4: + case CParser.T__5: + case CParser.T__6: + case CParser.Char: + case CParser.Const: + case CParser.Double: + case CParser.Enum: + case CParser.Float: + case CParser.Int: + case CParser.Long: + case CParser.Restrict: + case CParser.Short: + case CParser.Signed: + case CParser.Struct: + case CParser.Union: + case CParser.Unsigned: + case CParser.Void: + case CParser.Volatile: + case CParser.Atomic: + case CParser.Bool: + case CParser.Complex: + case CParser.Identifier: + this.enterOuterAlt(localctx, 1); + this.state = 1502; + this.typeName(); + this.state = 1503; + this.match(CParser.Colon); + this.state = 1504; + this.assignmentExpression(); + this.state = 1505; + this.match(CParser.EOF); + break; + case CParser.Default: + this.enterOuterAlt(localctx, 2); + this.state = 1507; + this.match(CParser.Default); + this.state = 1508; + this.match(CParser.Colon); + this.state = 1509; + this.assignmentExpression(); + this.state = 1510; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function PostfixExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_postfixExpression_DropletFile; + return this; +} + +PostfixExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +PostfixExpression_DropletFileContext.prototype.constructor = PostfixExpression_DropletFileContext; + +PostfixExpression_DropletFileContext.prototype.primaryExpression = function() { + return this.getTypedRuleContext(PrimaryExpressionContext,0); +}; + +PostfixExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +PostfixExpression_DropletFileContext.prototype.postfixExpression = function() { + return this.getTypedRuleContext(PostfixExpressionContext,0); +}; + +PostfixExpression_DropletFileContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +PostfixExpression_DropletFileContext.prototype.argumentExpressionList = function() { + return this.getTypedRuleContext(ArgumentExpressionListContext,0); +}; + +PostfixExpression_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +PostfixExpression_DropletFileContext.prototype.typeName = function() { + return this.getTypedRuleContext(TypeNameContext,0); +}; + +PostfixExpression_DropletFileContext.prototype.initializerList = function() { + return this.getTypedRuleContext(InitializerListContext,0); +}; + +PostfixExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterPostfixExpression_DropletFile(this); + } +}; + +PostfixExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitPostfixExpression_DropletFile(this); + } +}; + + + + +CParser.PostfixExpression_DropletFileContext = PostfixExpression_DropletFileContext; + +CParser.prototype.postfixExpression_DropletFile = function() { + + var localctx = new PostfixExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 180, CParser.RULE_postfixExpression_DropletFile); + var _la = 0; // Token type + try { + this.state = 1585; + var la_ = this._interp.adaptivePredict(this._input,145,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1514; + this.primaryExpression(); + this.state = 1515; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1517; + this.postfixExpression(0); + this.state = 1518; + this.match(CParser.LeftBracket); + this.state = 1519; + this.expression(0); + this.state = 1520; + this.match(CParser.RightBracket); + this.state = 1521; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1523; + this.postfixExpression(0); + this.state = 1524; + this.match(CParser.LeftParen); + this.state = 1526; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 1525; + this.argumentExpressionList(0); + } + + this.state = 1528; + this.match(CParser.RightParen); + this.state = 1529; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1531; + this.postfixExpression(0); + this.state = 1532; + this.match(CParser.Dot); + this.state = 1533; + this.match(CParser.Identifier); + this.state = 1534; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1536; + this.postfixExpression(0); + this.state = 1537; + this.match(CParser.Arrow); + this.state = 1538; + this.match(CParser.Identifier); + this.state = 1539; + this.match(CParser.EOF); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 1541; + this.postfixExpression(0); + this.state = 1542; + this.match(CParser.PlusPlus); + this.state = 1543; + this.match(CParser.EOF); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 1545; + this.postfixExpression(0); + this.state = 1546; + this.match(CParser.MinusMinus); + this.state = 1547; + this.match(CParser.EOF); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 1549; + this.match(CParser.LeftParen); + this.state = 1550; + this.typeName(); + this.state = 1551; + this.match(CParser.RightParen); + this.state = 1552; + this.match(CParser.LeftBrace); + this.state = 1553; + this.initializerList(0); + this.state = 1554; + this.match(CParser.RightBrace); + this.state = 1555; + this.match(CParser.EOF); + break; + + case 9: + this.enterOuterAlt(localctx, 9); + this.state = 1557; + this.match(CParser.LeftParen); + this.state = 1558; + this.typeName(); + this.state = 1559; + this.match(CParser.RightParen); + this.state = 1560; + this.match(CParser.LeftBrace); + this.state = 1561; + this.initializerList(0); + this.state = 1562; + this.match(CParser.Comma); + this.state = 1563; + this.match(CParser.RightBrace); + this.state = 1564; + this.match(CParser.EOF); + break; + + case 10: + this.enterOuterAlt(localctx, 10); + this.state = 1566; + this.match(CParser.T__0); + this.state = 1567; + this.match(CParser.LeftParen); + this.state = 1568; + this.typeName(); + this.state = 1569; + this.match(CParser.RightParen); + this.state = 1570; + this.match(CParser.LeftBrace); + this.state = 1571; + this.initializerList(0); + this.state = 1572; + this.match(CParser.RightBrace); + this.state = 1573; + this.match(CParser.EOF); + break; + + case 11: + this.enterOuterAlt(localctx, 11); + this.state = 1575; + this.match(CParser.T__0); + this.state = 1576; + this.match(CParser.LeftParen); + this.state = 1577; + this.typeName(); + this.state = 1578; + this.match(CParser.RightParen); + this.state = 1579; + this.match(CParser.LeftBrace); + this.state = 1580; + this.initializerList(0); + this.state = 1581; + this.match(CParser.Comma); + this.state = 1582; + this.match(CParser.RightBrace); + this.state = 1583; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ArgumentExpressionList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_argumentExpressionList_DropletFile; + return this; +} + +ArgumentExpressionList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ArgumentExpressionList_DropletFileContext.prototype.constructor = ArgumentExpressionList_DropletFileContext; + +ArgumentExpressionList_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +ArgumentExpressionList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ArgumentExpressionList_DropletFileContext.prototype.argumentExpressionList = function() { + return this.getTypedRuleContext(ArgumentExpressionListContext,0); +}; + +ArgumentExpressionList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterArgumentExpressionList_DropletFile(this); + } +}; + +ArgumentExpressionList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitArgumentExpressionList_DropletFile(this); + } +}; + + + + +CParser.ArgumentExpressionList_DropletFileContext = ArgumentExpressionList_DropletFileContext; + +CParser.prototype.argumentExpressionList_DropletFile = function() { + + var localctx = new ArgumentExpressionList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 182, CParser.RULE_argumentExpressionList_DropletFile); + try { + this.state = 1595; + var la_ = this._interp.adaptivePredict(this._input,146,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1587; + this.assignmentExpression(); + this.state = 1588; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1590; + this.argumentExpressionList(0); + this.state = 1591; + this.match(CParser.Comma); + this.state = 1592; + this.assignmentExpression(); + this.state = 1593; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function UnaryExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_unaryExpression_DropletFile; + return this; +} + +UnaryExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +UnaryExpression_DropletFileContext.prototype.constructor = UnaryExpression_DropletFileContext; + +UnaryExpression_DropletFileContext.prototype.postfixExpression = function() { + return this.getTypedRuleContext(PostfixExpressionContext,0); +}; + +UnaryExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +UnaryExpression_DropletFileContext.prototype.unaryExpression = function() { + return this.getTypedRuleContext(UnaryExpressionContext,0); +}; + +UnaryExpression_DropletFileContext.prototype.unaryOperator = function() { + return this.getTypedRuleContext(UnaryOperatorContext,0); +}; + +UnaryExpression_DropletFileContext.prototype.castExpression = function() { + return this.getTypedRuleContext(CastExpressionContext,0); +}; + +UnaryExpression_DropletFileContext.prototype.typeName = function() { + return this.getTypedRuleContext(TypeNameContext,0); +}; + +UnaryExpression_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +UnaryExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterUnaryExpression_DropletFile(this); + } +}; + +UnaryExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitUnaryExpression_DropletFile(this); + } +}; + + + + +CParser.UnaryExpression_DropletFileContext = UnaryExpression_DropletFileContext; + +CParser.prototype.unaryExpression_DropletFile = function() { + + var localctx = new UnaryExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 184, CParser.RULE_unaryExpression_DropletFile); + try { + this.state = 1630; + var la_ = this._interp.adaptivePredict(this._input,147,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1597; + this.postfixExpression(0); + this.state = 1598; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1600; + this.match(CParser.PlusPlus); + this.state = 1601; + this.unaryExpression(); + this.state = 1602; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1604; + this.match(CParser.MinusMinus); + this.state = 1605; + this.unaryExpression(); + this.state = 1606; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1608; + this.unaryOperator(); + this.state = 1609; + this.castExpression(); + this.state = 1610; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1612; + this.match(CParser.Sizeof); + this.state = 1613; + this.unaryExpression(); + this.state = 1614; + this.match(CParser.EOF); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 1616; + this.match(CParser.Sizeof); + this.state = 1617; + this.match(CParser.LeftParen); + this.state = 1618; + this.typeName(); + this.state = 1619; + this.match(CParser.RightParen); + this.state = 1620; + this.match(CParser.EOF); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 1622; + this.match(CParser.Alignof); + this.state = 1623; + this.match(CParser.LeftParen); + this.state = 1624; + this.typeName(); + this.state = 1625; + this.match(CParser.RightParen); + this.state = 1626; + this.match(CParser.EOF); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 1628; + this.match(CParser.AndAnd); + this.state = 1629; + this.match(CParser.Identifier); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function UnaryOperator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_unaryOperator_DropletFile; + return this; +} + +UnaryOperator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +UnaryOperator_DropletFileContext.prototype.constructor = UnaryOperator_DropletFileContext; + +UnaryOperator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +UnaryOperator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterUnaryOperator_DropletFile(this); + } +}; + +UnaryOperator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitUnaryOperator_DropletFile(this); + } +}; + + + + +CParser.UnaryOperator_DropletFileContext = UnaryOperator_DropletFileContext; + +CParser.prototype.unaryOperator_DropletFile = function() { + + var localctx = new UnaryOperator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 186, CParser.RULE_unaryOperator_DropletFile); + try { + this.state = 1639; + switch(this._input.LA(1)) { + case CParser.And: + this.enterOuterAlt(localctx, 1); + this.state = 1632; + this.match(CParser.And); + break; + case CParser.Star: + this.enterOuterAlt(localctx, 2); + this.state = 1633; + this.match(CParser.Star); + break; + case CParser.Plus: + this.enterOuterAlt(localctx, 3); + this.state = 1634; + this.match(CParser.Plus); + break; + case CParser.Minus: + this.enterOuterAlt(localctx, 4); + this.state = 1635; + this.match(CParser.Minus); + break; + case CParser.Tilde: + this.enterOuterAlt(localctx, 5); + this.state = 1636; + this.match(CParser.Tilde); + break; + case CParser.Not: + this.enterOuterAlt(localctx, 6); + this.state = 1637; + this.match(CParser.Not); + this.state = 1638; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function CastExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_castExpression_DropletFile; + return this; +} + +CastExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +CastExpression_DropletFileContext.prototype.constructor = CastExpression_DropletFileContext; + +CastExpression_DropletFileContext.prototype.unaryExpression = function() { + return this.getTypedRuleContext(UnaryExpressionContext,0); +}; + +CastExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +CastExpression_DropletFileContext.prototype.typeName = function() { + return this.getTypedRuleContext(TypeNameContext,0); +}; + +CastExpression_DropletFileContext.prototype.castExpression = function() { + return this.getTypedRuleContext(CastExpressionContext,0); +}; + +CastExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterCastExpression_DropletFile(this); + } +}; + +CastExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitCastExpression_DropletFile(this); + } +}; + + + + +CParser.CastExpression_DropletFileContext = CastExpression_DropletFileContext; + +CParser.prototype.castExpression_DropletFile = function() { + + var localctx = new CastExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 188, CParser.RULE_castExpression_DropletFile); + try { + this.state = 1657; + var la_ = this._interp.adaptivePredict(this._input,149,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1641; + this.unaryExpression(); + this.state = 1642; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1644; + this.match(CParser.LeftParen); + this.state = 1645; + this.typeName(); + this.state = 1646; + this.match(CParser.RightParen); + this.state = 1647; + this.castExpression(); + this.state = 1648; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1650; + this.match(CParser.T__0); + this.state = 1651; + this.match(CParser.LeftParen); + this.state = 1652; + this.typeName(); + this.state = 1653; + this.match(CParser.RightParen); + this.state = 1654; + this.castExpression(); + this.state = 1655; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function MultiplicativeExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_multiplicativeExpression_DropletFile; + return this; +} + +MultiplicativeExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +MultiplicativeExpression_DropletFileContext.prototype.constructor = MultiplicativeExpression_DropletFileContext; + +MultiplicativeExpression_DropletFileContext.prototype.castExpression = function() { + return this.getTypedRuleContext(CastExpressionContext,0); +}; + +MultiplicativeExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +MultiplicativeExpression_DropletFileContext.prototype.multiplicativeExpression = function() { + return this.getTypedRuleContext(MultiplicativeExpressionContext,0); +}; + +MultiplicativeExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterMultiplicativeExpression_DropletFile(this); + } +}; + +MultiplicativeExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitMultiplicativeExpression_DropletFile(this); + } +}; + + + + +CParser.MultiplicativeExpression_DropletFileContext = MultiplicativeExpression_DropletFileContext; + +CParser.prototype.multiplicativeExpression_DropletFile = function() { + + var localctx = new MultiplicativeExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 190, CParser.RULE_multiplicativeExpression_DropletFile); + try { + this.state = 1677; + var la_ = this._interp.adaptivePredict(this._input,150,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1659; + this.castExpression(); + this.state = 1660; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1662; + this.multiplicativeExpression(0); + this.state = 1663; + this.match(CParser.Star); + this.state = 1664; + this.castExpression(); + this.state = 1665; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1667; + this.multiplicativeExpression(0); + this.state = 1668; + this.match(CParser.Div); + this.state = 1669; + this.castExpression(); + this.state = 1670; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1672; + this.multiplicativeExpression(0); + this.state = 1673; + this.match(CParser.Mod); + this.state = 1674; + this.castExpression(); + this.state = 1675; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function AdditiveExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_additiveExpression_DropletFile; + return this; +} + +AdditiveExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +AdditiveExpression_DropletFileContext.prototype.constructor = AdditiveExpression_DropletFileContext; + +AdditiveExpression_DropletFileContext.prototype.multiplicativeExpression = function() { + return this.getTypedRuleContext(MultiplicativeExpressionContext,0); +}; + +AdditiveExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +AdditiveExpression_DropletFileContext.prototype.additiveExpression = function() { + return this.getTypedRuleContext(AdditiveExpressionContext,0); +}; + +AdditiveExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterAdditiveExpression_DropletFile(this); + } +}; + +AdditiveExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitAdditiveExpression_DropletFile(this); + } +}; + + + + +CParser.AdditiveExpression_DropletFileContext = AdditiveExpression_DropletFileContext; + +CParser.prototype.additiveExpression_DropletFile = function() { + + var localctx = new AdditiveExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 192, CParser.RULE_additiveExpression_DropletFile); + try { + this.state = 1692; + var la_ = this._interp.adaptivePredict(this._input,151,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1679; + this.multiplicativeExpression(0); + this.state = 1680; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1682; + this.additiveExpression(0); + this.state = 1683; + this.match(CParser.Plus); + this.state = 1684; + this.multiplicativeExpression(0); + this.state = 1685; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1687; + this.additiveExpression(0); + this.state = 1688; + this.match(CParser.Minus); + this.state = 1689; + this.multiplicativeExpression(0); + this.state = 1690; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ShiftExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_shiftExpression_DropletFile; + return this; +} + +ShiftExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ShiftExpression_DropletFileContext.prototype.constructor = ShiftExpression_DropletFileContext; + +ShiftExpression_DropletFileContext.prototype.additiveExpression = function() { + return this.getTypedRuleContext(AdditiveExpressionContext,0); +}; + +ShiftExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ShiftExpression_DropletFileContext.prototype.shiftExpression = function() { + return this.getTypedRuleContext(ShiftExpressionContext,0); +}; + +ShiftExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterShiftExpression_DropletFile(this); + } +}; + +ShiftExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitShiftExpression_DropletFile(this); + } +}; + + + + +CParser.ShiftExpression_DropletFileContext = ShiftExpression_DropletFileContext; + +CParser.prototype.shiftExpression_DropletFile = function() { + + var localctx = new ShiftExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 194, CParser.RULE_shiftExpression_DropletFile); + try { + this.state = 1707; + var la_ = this._interp.adaptivePredict(this._input,152,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1694; + this.additiveExpression(0); + this.state = 1695; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1697; + this.shiftExpression(0); + this.state = 1698; + this.match(CParser.LeftShift); + this.state = 1699; + this.additiveExpression(0); + this.state = 1700; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1702; + this.shiftExpression(0); + this.state = 1703; + this.match(CParser.RightShift); + this.state = 1704; + this.additiveExpression(0); + this.state = 1705; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function RelationalExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_relationalExpression_DropletFile; + return this; +} + +RelationalExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +RelationalExpression_DropletFileContext.prototype.constructor = RelationalExpression_DropletFileContext; + +RelationalExpression_DropletFileContext.prototype.shiftExpression = function() { + return this.getTypedRuleContext(ShiftExpressionContext,0); +}; + +RelationalExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +RelationalExpression_DropletFileContext.prototype.relationalExpression = function() { + return this.getTypedRuleContext(RelationalExpressionContext,0); +}; + +RelationalExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterRelationalExpression_DropletFile(this); + } +}; + +RelationalExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitRelationalExpression_DropletFile(this); + } +}; + + + + +CParser.RelationalExpression_DropletFileContext = RelationalExpression_DropletFileContext; + +CParser.prototype.relationalExpression_DropletFile = function() { + + var localctx = new RelationalExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 196, CParser.RULE_relationalExpression_DropletFile); + try { + this.state = 1732; + var la_ = this._interp.adaptivePredict(this._input,153,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1709; + this.shiftExpression(0); + this.state = 1710; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1712; + this.relationalExpression(0); + this.state = 1713; + this.match(CParser.Less); + this.state = 1714; + this.shiftExpression(0); + this.state = 1715; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1717; + this.relationalExpression(0); + this.state = 1718; + this.match(CParser.Greater); + this.state = 1719; + this.shiftExpression(0); + this.state = 1720; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1722; + this.relationalExpression(0); + this.state = 1723; + this.match(CParser.LessEqual); + this.state = 1724; + this.shiftExpression(0); + this.state = 1725; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1727; + this.relationalExpression(0); + this.state = 1728; + this.match(CParser.GreaterEqual); + this.state = 1729; + this.shiftExpression(0); + this.state = 1730; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function EqualityExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_equalityExpression_DropletFile; + return this; +} + +EqualityExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +EqualityExpression_DropletFileContext.prototype.constructor = EqualityExpression_DropletFileContext; + +EqualityExpression_DropletFileContext.prototype.relationalExpression = function() { + return this.getTypedRuleContext(RelationalExpressionContext,0); +}; + +EqualityExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +EqualityExpression_DropletFileContext.prototype.equalityExpression = function() { + return this.getTypedRuleContext(EqualityExpressionContext,0); +}; + +EqualityExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterEqualityExpression_DropletFile(this); + } +}; + +EqualityExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitEqualityExpression_DropletFile(this); + } +}; + + + + +CParser.EqualityExpression_DropletFileContext = EqualityExpression_DropletFileContext; + +CParser.prototype.equalityExpression_DropletFile = function() { + + var localctx = new EqualityExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 198, CParser.RULE_equalityExpression_DropletFile); + try { + this.state = 1747; + var la_ = this._interp.adaptivePredict(this._input,154,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1734; + this.relationalExpression(0); + this.state = 1735; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1737; + this.equalityExpression(0); + this.state = 1738; + this.match(CParser.Equal); + this.state = 1739; + this.relationalExpression(0); + this.state = 1740; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1742; + this.equalityExpression(0); + this.state = 1743; + this.match(CParser.NotEqual); + this.state = 1744; + this.relationalExpression(0); + this.state = 1745; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function AndExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_andExpression_DropletFile; + return this; +} + +AndExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +AndExpression_DropletFileContext.prototype.constructor = AndExpression_DropletFileContext; + +AndExpression_DropletFileContext.prototype.equalityExpression = function() { + return this.getTypedRuleContext(EqualityExpressionContext,0); +}; + +AndExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +AndExpression_DropletFileContext.prototype.andExpression = function() { + return this.getTypedRuleContext(AndExpressionContext,0); +}; + +AndExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterAndExpression_DropletFile(this); + } +}; + +AndExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitAndExpression_DropletFile(this); + } +}; + + + + +CParser.AndExpression_DropletFileContext = AndExpression_DropletFileContext; + +CParser.prototype.andExpression_DropletFile = function() { + + var localctx = new AndExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 200, CParser.RULE_andExpression_DropletFile); + try { + this.state = 1757; + var la_ = this._interp.adaptivePredict(this._input,155,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1749; + this.equalityExpression(0); + this.state = 1750; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1752; + this.andExpression(0); + this.state = 1753; + this.match(CParser.And); + this.state = 1754; + this.equalityExpression(0); + this.state = 1755; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ExclusiveOrExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_exclusiveOrExpression_DropletFile; + return this; +} + +ExclusiveOrExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ExclusiveOrExpression_DropletFileContext.prototype.constructor = ExclusiveOrExpression_DropletFileContext; + +ExclusiveOrExpression_DropletFileContext.prototype.andExpression = function() { + return this.getTypedRuleContext(AndExpressionContext,0); +}; + +ExclusiveOrExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ExclusiveOrExpression_DropletFileContext.prototype.exclusiveOrExpression = function() { + return this.getTypedRuleContext(ExclusiveOrExpressionContext,0); +}; + +ExclusiveOrExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterExclusiveOrExpression_DropletFile(this); + } +}; + +ExclusiveOrExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitExclusiveOrExpression_DropletFile(this); + } +}; + + + + +CParser.ExclusiveOrExpression_DropletFileContext = ExclusiveOrExpression_DropletFileContext; + +CParser.prototype.exclusiveOrExpression_DropletFile = function() { + + var localctx = new ExclusiveOrExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 202, CParser.RULE_exclusiveOrExpression_DropletFile); + try { + this.state = 1767; + var la_ = this._interp.adaptivePredict(this._input,156,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1759; + this.andExpression(0); + this.state = 1760; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1762; + this.exclusiveOrExpression(0); + this.state = 1763; + this.match(CParser.Caret); + this.state = 1764; + this.andExpression(0); + this.state = 1765; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function InclusiveOrExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_inclusiveOrExpression_DropletFile; + return this; +} + +InclusiveOrExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +InclusiveOrExpression_DropletFileContext.prototype.constructor = InclusiveOrExpression_DropletFileContext; + +InclusiveOrExpression_DropletFileContext.prototype.exclusiveOrExpression = function() { + return this.getTypedRuleContext(ExclusiveOrExpressionContext,0); +}; + +InclusiveOrExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +InclusiveOrExpression_DropletFileContext.prototype.inclusiveOrExpression = function() { + return this.getTypedRuleContext(InclusiveOrExpressionContext,0); +}; + +InclusiveOrExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterInclusiveOrExpression_DropletFile(this); + } +}; + +InclusiveOrExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitInclusiveOrExpression_DropletFile(this); + } +}; + + + + +CParser.InclusiveOrExpression_DropletFileContext = InclusiveOrExpression_DropletFileContext; + +CParser.prototype.inclusiveOrExpression_DropletFile = function() { + + var localctx = new InclusiveOrExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 204, CParser.RULE_inclusiveOrExpression_DropletFile); + try { + this.state = 1777; + var la_ = this._interp.adaptivePredict(this._input,157,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1769; + this.exclusiveOrExpression(0); + this.state = 1770; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1772; + this.inclusiveOrExpression(0); + this.state = 1773; + this.match(CParser.Or); + this.state = 1774; + this.exclusiveOrExpression(0); + this.state = 1775; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function LogicalAndExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_logicalAndExpression_DropletFile; + return this; +} + +LogicalAndExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +LogicalAndExpression_DropletFileContext.prototype.constructor = LogicalAndExpression_DropletFileContext; + +LogicalAndExpression_DropletFileContext.prototype.inclusiveOrExpression = function() { + return this.getTypedRuleContext(InclusiveOrExpressionContext,0); +}; + +LogicalAndExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +LogicalAndExpression_DropletFileContext.prototype.logicalAndExpression = function() { + return this.getTypedRuleContext(LogicalAndExpressionContext,0); +}; + +LogicalAndExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterLogicalAndExpression_DropletFile(this); + } +}; + +LogicalAndExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitLogicalAndExpression_DropletFile(this); + } +}; + + + + +CParser.LogicalAndExpression_DropletFileContext = LogicalAndExpression_DropletFileContext; + +CParser.prototype.logicalAndExpression_DropletFile = function() { + + var localctx = new LogicalAndExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 206, CParser.RULE_logicalAndExpression_DropletFile); + try { + this.state = 1787; + var la_ = this._interp.adaptivePredict(this._input,158,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1779; + this.inclusiveOrExpression(0); + this.state = 1780; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1782; + this.logicalAndExpression(0); + this.state = 1783; + this.match(CParser.AndAnd); + this.state = 1784; + this.inclusiveOrExpression(0); + this.state = 1785; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function LogicalOrExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_logicalOrExpression_DropletFile; + return this; +} + +LogicalOrExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +LogicalOrExpression_DropletFileContext.prototype.constructor = LogicalOrExpression_DropletFileContext; + +LogicalOrExpression_DropletFileContext.prototype.logicalAndExpression = function() { + return this.getTypedRuleContext(LogicalAndExpressionContext,0); +}; + +LogicalOrExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +LogicalOrExpression_DropletFileContext.prototype.logicalOrExpression = function() { + return this.getTypedRuleContext(LogicalOrExpressionContext,0); +}; + +LogicalOrExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterLogicalOrExpression_DropletFile(this); + } +}; + +LogicalOrExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitLogicalOrExpression_DropletFile(this); + } +}; + + + + +CParser.LogicalOrExpression_DropletFileContext = LogicalOrExpression_DropletFileContext; + +CParser.prototype.logicalOrExpression_DropletFile = function() { + + var localctx = new LogicalOrExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 208, CParser.RULE_logicalOrExpression_DropletFile); + try { + this.state = 1797; + var la_ = this._interp.adaptivePredict(this._input,159,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1789; + this.logicalAndExpression(0); + this.state = 1790; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1792; + this.logicalOrExpression(0); + this.state = 1793; + this.match(CParser.OrOr); + this.state = 1794; + this.logicalAndExpression(0); + this.state = 1795; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ConditionalExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_conditionalExpression_DropletFile; + return this; +} + +ConditionalExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ConditionalExpression_DropletFileContext.prototype.constructor = ConditionalExpression_DropletFileContext; + +ConditionalExpression_DropletFileContext.prototype.logicalOrExpression = function() { + return this.getTypedRuleContext(LogicalOrExpressionContext,0); +}; + +ConditionalExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ConditionalExpression_DropletFileContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +ConditionalExpression_DropletFileContext.prototype.conditionalExpression = function() { + return this.getTypedRuleContext(ConditionalExpressionContext,0); +}; + +ConditionalExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterConditionalExpression_DropletFile(this); + } +}; + +ConditionalExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitConditionalExpression_DropletFile(this); + } +}; + + + + +CParser.ConditionalExpression_DropletFileContext = ConditionalExpression_DropletFileContext; + +CParser.prototype.conditionalExpression_DropletFile = function() { + + var localctx = new ConditionalExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 210, CParser.RULE_conditionalExpression_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1799; + this.logicalOrExpression(0); + this.state = 1805; + _la = this._input.LA(1); + if(_la===CParser.Question) { + this.state = 1800; + this.match(CParser.Question); + this.state = 1801; + this.expression(0); + this.state = 1802; + this.match(CParser.Colon); + this.state = 1803; + this.conditionalExpression(); + } + + this.state = 1807; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function AssignmentExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_assignmentExpression_DropletFile; + return this; +} + +AssignmentExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +AssignmentExpression_DropletFileContext.prototype.constructor = AssignmentExpression_DropletFileContext; + +AssignmentExpression_DropletFileContext.prototype.conditionalExpression = function() { + return this.getTypedRuleContext(ConditionalExpressionContext,0); +}; + +AssignmentExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +AssignmentExpression_DropletFileContext.prototype.unaryExpression = function() { + return this.getTypedRuleContext(UnaryExpressionContext,0); +}; + +AssignmentExpression_DropletFileContext.prototype.assignmentOperator = function() { + return this.getTypedRuleContext(AssignmentOperatorContext,0); +}; + +AssignmentExpression_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +AssignmentExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterAssignmentExpression_DropletFile(this); + } +}; + +AssignmentExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitAssignmentExpression_DropletFile(this); + } +}; + + + + +CParser.AssignmentExpression_DropletFileContext = AssignmentExpression_DropletFileContext; + +CParser.prototype.assignmentExpression_DropletFile = function() { + + var localctx = new AssignmentExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 212, CParser.RULE_assignmentExpression_DropletFile); + try { + this.state = 1817; + var la_ = this._interp.adaptivePredict(this._input,161,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1809; + this.conditionalExpression(); + this.state = 1810; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1812; + this.unaryExpression(); + this.state = 1813; + this.assignmentOperator(); + this.state = 1814; + this.assignmentExpression(); + this.state = 1815; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function AssignmentOperator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_assignmentOperator_DropletFile; + return this; +} + +AssignmentOperator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +AssignmentOperator_DropletFileContext.prototype.constructor = AssignmentOperator_DropletFileContext; + +AssignmentOperator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +AssignmentOperator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterAssignmentOperator_DropletFile(this); + } +}; + +AssignmentOperator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitAssignmentOperator_DropletFile(this); + } +}; + + + + +CParser.AssignmentOperator_DropletFileContext = AssignmentOperator_DropletFileContext; + +CParser.prototype.assignmentOperator_DropletFile = function() { + + var localctx = new AssignmentOperator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 214, CParser.RULE_assignmentOperator_DropletFile); + try { + this.state = 1831; + switch(this._input.LA(1)) { + case CParser.Assign: + this.enterOuterAlt(localctx, 1); + this.state = 1819; + this.match(CParser.Assign); + break; + case CParser.StarAssign: + this.enterOuterAlt(localctx, 2); + this.state = 1820; + this.match(CParser.StarAssign); + break; + case CParser.DivAssign: + this.enterOuterAlt(localctx, 3); + this.state = 1821; + this.match(CParser.DivAssign); + break; + case CParser.ModAssign: + this.enterOuterAlt(localctx, 4); + this.state = 1822; + this.match(CParser.ModAssign); + break; + case CParser.PlusAssign: + this.enterOuterAlt(localctx, 5); + this.state = 1823; + this.match(CParser.PlusAssign); + break; + case CParser.MinusAssign: + this.enterOuterAlt(localctx, 6); + this.state = 1824; + this.match(CParser.MinusAssign); + break; + case CParser.LeftShiftAssign: + this.enterOuterAlt(localctx, 7); + this.state = 1825; + this.match(CParser.LeftShiftAssign); + break; + case CParser.RightShiftAssign: + this.enterOuterAlt(localctx, 8); + this.state = 1826; + this.match(CParser.RightShiftAssign); + break; + case CParser.AndAssign: + this.enterOuterAlt(localctx, 9); + this.state = 1827; + this.match(CParser.AndAssign); + break; + case CParser.XorAssign: + this.enterOuterAlt(localctx, 10); + this.state = 1828; + this.match(CParser.XorAssign); + break; + case CParser.OrAssign: + this.enterOuterAlt(localctx, 11); + this.state = 1829; + this.match(CParser.OrAssign); + this.state = 1830; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Expression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_expression_DropletFile; + return this; +} + +Expression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Expression_DropletFileContext.prototype.constructor = Expression_DropletFileContext; + +Expression_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +Expression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Expression_DropletFileContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +Expression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterExpression_DropletFile(this); + } +}; + +Expression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitExpression_DropletFile(this); + } +}; + + + + +CParser.Expression_DropletFileContext = Expression_DropletFileContext; + +CParser.prototype.expression_DropletFile = function() { + + var localctx = new Expression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 216, CParser.RULE_expression_DropletFile); + try { + this.state = 1841; + var la_ = this._interp.adaptivePredict(this._input,163,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1833; + this.assignmentExpression(); + this.state = 1834; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1836; + this.expression(0); + this.state = 1837; + this.match(CParser.Comma); + this.state = 1838; + this.assignmentExpression(); + this.state = 1839; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ConstantExpression_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_constantExpression_DropletFile; + return this; +} + +ConstantExpression_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ConstantExpression_DropletFileContext.prototype.constructor = ConstantExpression_DropletFileContext; + +ConstantExpression_DropletFileContext.prototype.conditionalExpression = function() { + return this.getTypedRuleContext(ConditionalExpressionContext,0); +}; + +ConstantExpression_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ConstantExpression_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterConstantExpression_DropletFile(this); + } +}; + +ConstantExpression_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitConstantExpression_DropletFile(this); + } +}; + + + + +CParser.ConstantExpression_DropletFileContext = ConstantExpression_DropletFileContext; + +CParser.prototype.constantExpression_DropletFile = function() { + + var localctx = new ConstantExpression_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 218, CParser.RULE_constantExpression_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1843; + this.conditionalExpression(); + this.state = 1844; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Declaration_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_declaration_DropletFile; + return this; +} + +Declaration_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Declaration_DropletFileContext.prototype.constructor = Declaration_DropletFileContext; + +Declaration_DropletFileContext.prototype.declarationSpecifiers = function() { + return this.getTypedRuleContext(DeclarationSpecifiersContext,0); +}; + +Declaration_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Declaration_DropletFileContext.prototype.initDeclaratorList = function() { + return this.getTypedRuleContext(InitDeclaratorListContext,0); +}; + +Declaration_DropletFileContext.prototype.staticAssertDeclaration = function() { + return this.getTypedRuleContext(StaticAssertDeclarationContext,0); +}; + +Declaration_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDeclaration_DropletFile(this); + } +}; + +Declaration_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDeclaration_DropletFile(this); + } +}; + + + + +CParser.Declaration_DropletFileContext = Declaration_DropletFileContext; + +CParser.prototype.declaration_DropletFile = function() { + + var localctx = new Declaration_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 220, CParser.RULE_declaration_DropletFile); + var _la = 0; // Token type + try { + this.state = 1856; + switch(this._input.LA(1)) { + case CParser.T__0: + case CParser.T__3: + case CParser.T__4: + case CParser.T__5: + case CParser.T__6: + case CParser.T__7: + case CParser.T__8: + case CParser.T__9: + case CParser.T__11: + case CParser.Auto: + case CParser.Char: + case CParser.Const: + case CParser.Double: + case CParser.Enum: + case CParser.Extern: + case CParser.Float: + case CParser.Inline: + case CParser.Int: + case CParser.Long: + case CParser.Register: + case CParser.Restrict: + case CParser.Short: + case CParser.Signed: + case CParser.Static: + case CParser.Struct: + case CParser.Typedef: + case CParser.Union: + case CParser.Unsigned: + case CParser.Void: + case CParser.Volatile: + case CParser.Alignas: + case CParser.Atomic: + case CParser.Bool: + case CParser.Complex: + case CParser.Noreturn: + case CParser.ThreadLocal: + case CParser.Identifier: + this.enterOuterAlt(localctx, 1); + this.state = 1846; + this.declarationSpecifiers(); + this.state = 1848; + _la = this._input.LA(1); + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { + this.state = 1847; + this.initDeclaratorList(0); + } + + this.state = 1850; + this.match(CParser.Semi); + this.state = 1851; + this.match(CParser.EOF); + break; + case CParser.StaticAssert: + this.enterOuterAlt(localctx, 2); + this.state = 1853; + this.staticAssertDeclaration(); + this.state = 1854; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DeclarationSpecifiers_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_declarationSpecifiers_DropletFile; + return this; +} + +DeclarationSpecifiers_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DeclarationSpecifiers_DropletFileContext.prototype.constructor = DeclarationSpecifiers_DropletFileContext; + +DeclarationSpecifiers_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +DeclarationSpecifiers_DropletFileContext.prototype.declarationSpecifier = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(DeclarationSpecifierContext); + } else { + return this.getTypedRuleContext(DeclarationSpecifierContext,i); + } +}; + +DeclarationSpecifiers_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDeclarationSpecifiers_DropletFile(this); + } +}; + +DeclarationSpecifiers_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDeclarationSpecifiers_DropletFile(this); + } +}; + + + + +CParser.DeclarationSpecifiers_DropletFileContext = DeclarationSpecifiers_DropletFileContext; + +CParser.prototype.declarationSpecifiers_DropletFile = function() { + + var localctx = new DeclarationSpecifiers_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 222, CParser.RULE_declarationSpecifiers_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1859; + this._errHandler.sync(this); + _la = this._input.LA(1); + do { + this.state = 1858; + this.declarationSpecifier(); + this.state = 1861; + this._errHandler.sync(this); + _la = this._input.LA(1); + } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier); + this.state = 1863; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DeclarationSpecifiers2_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_declarationSpecifiers2_DropletFile; + return this; +} + +DeclarationSpecifiers2_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DeclarationSpecifiers2_DropletFileContext.prototype.constructor = DeclarationSpecifiers2_DropletFileContext; + +DeclarationSpecifiers2_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +DeclarationSpecifiers2_DropletFileContext.prototype.declarationSpecifier = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(DeclarationSpecifierContext); + } else { + return this.getTypedRuleContext(DeclarationSpecifierContext,i); + } +}; + +DeclarationSpecifiers2_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDeclarationSpecifiers2_DropletFile(this); + } +}; + +DeclarationSpecifiers2_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDeclarationSpecifiers2_DropletFile(this); + } +}; + + + + +CParser.DeclarationSpecifiers2_DropletFileContext = DeclarationSpecifiers2_DropletFileContext; + +CParser.prototype.declarationSpecifiers2_DropletFile = function() { + + var localctx = new DeclarationSpecifiers2_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 224, CParser.RULE_declarationSpecifiers2_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1866; + this._errHandler.sync(this); + _la = this._input.LA(1); + do { + this.state = 1865; + this.declarationSpecifier(); + this.state = 1868; + this._errHandler.sync(this); + _la = this._input.LA(1); + } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier); + this.state = 1870; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DeclarationSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_declarationSpecifier_DropletFile; + return this; +} + +DeclarationSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DeclarationSpecifier_DropletFileContext.prototype.constructor = DeclarationSpecifier_DropletFileContext; + +DeclarationSpecifier_DropletFileContext.prototype.storageClassSpecifier = function() { + return this.getTypedRuleContext(StorageClassSpecifierContext,0); +}; + +DeclarationSpecifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +DeclarationSpecifier_DropletFileContext.prototype.typeSpecifier = function() { + return this.getTypedRuleContext(TypeSpecifierContext,0); +}; + +DeclarationSpecifier_DropletFileContext.prototype.typeQualifier = function() { + return this.getTypedRuleContext(TypeQualifierContext,0); +}; + +DeclarationSpecifier_DropletFileContext.prototype.functionSpecifier = function() { + return this.getTypedRuleContext(FunctionSpecifierContext,0); +}; + +DeclarationSpecifier_DropletFileContext.prototype.alignmentSpecifier = function() { + return this.getTypedRuleContext(AlignmentSpecifierContext,0); +}; + +DeclarationSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDeclarationSpecifier_DropletFile(this); + } +}; + +DeclarationSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDeclarationSpecifier_DropletFile(this); + } +}; + + + + +CParser.DeclarationSpecifier_DropletFileContext = DeclarationSpecifier_DropletFileContext; + +CParser.prototype.declarationSpecifier_DropletFile = function() { + + var localctx = new DeclarationSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 226, CParser.RULE_declarationSpecifier_DropletFile); + try { + this.state = 1887; + var la_ = this._interp.adaptivePredict(this._input,168,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1872; + this.storageClassSpecifier(); + this.state = 1873; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1875; + this.typeSpecifier(); + this.state = 1876; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1878; + this.typeQualifier(); + this.state = 1879; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1881; + this.functionSpecifier(); + this.state = 1882; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1884; + this.alignmentSpecifier(); + this.state = 1885; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function InitDeclaratorList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_initDeclaratorList_DropletFile; + return this; +} + +InitDeclaratorList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +InitDeclaratorList_DropletFileContext.prototype.constructor = InitDeclaratorList_DropletFileContext; + +InitDeclaratorList_DropletFileContext.prototype.initDeclarator = function() { + return this.getTypedRuleContext(InitDeclaratorContext,0); +}; + +InitDeclaratorList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +InitDeclaratorList_DropletFileContext.prototype.initDeclaratorList = function() { + return this.getTypedRuleContext(InitDeclaratorListContext,0); +}; + +InitDeclaratorList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterInitDeclaratorList_DropletFile(this); + } +}; + +InitDeclaratorList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitInitDeclaratorList_DropletFile(this); + } +}; + + + + +CParser.InitDeclaratorList_DropletFileContext = InitDeclaratorList_DropletFileContext; + +CParser.prototype.initDeclaratorList_DropletFile = function() { + + var localctx = new InitDeclaratorList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 228, CParser.RULE_initDeclaratorList_DropletFile); + try { + this.state = 1897; + var la_ = this._interp.adaptivePredict(this._input,169,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1889; + this.initDeclarator(); + this.state = 1890; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1892; + this.initDeclaratorList(0); + this.state = 1893; + this.match(CParser.Comma); + this.state = 1894; + this.initDeclarator(); + this.state = 1895; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function InitDeclarator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_initDeclarator_DropletFile; + return this; +} + +InitDeclarator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +InitDeclarator_DropletFileContext.prototype.constructor = InitDeclarator_DropletFileContext; + +InitDeclarator_DropletFileContext.prototype.declarator = function() { + return this.getTypedRuleContext(DeclaratorContext,0); +}; + +InitDeclarator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +InitDeclarator_DropletFileContext.prototype.initializer = function() { + return this.getTypedRuleContext(InitializerContext,0); +}; + +InitDeclarator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterInitDeclarator_DropletFile(this); + } +}; + +InitDeclarator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitInitDeclarator_DropletFile(this); + } +}; + + + + +CParser.InitDeclarator_DropletFileContext = InitDeclarator_DropletFileContext; + +CParser.prototype.initDeclarator_DropletFile = function() { + + var localctx = new InitDeclarator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 230, CParser.RULE_initDeclarator_DropletFile); + try { + this.state = 1907; + var la_ = this._interp.adaptivePredict(this._input,170,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1899; + this.declarator(); + this.state = 1900; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1902; + this.declarator(); + this.state = 1903; + this.match(CParser.Assign); + this.state = 1904; + this.initializer(); + this.state = 1905; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StorageClassSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_storageClassSpecifier_DropletFile; + return this; +} + +StorageClassSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StorageClassSpecifier_DropletFileContext.prototype.constructor = StorageClassSpecifier_DropletFileContext; + +StorageClassSpecifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StorageClassSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStorageClassSpecifier_DropletFile(this); + } +}; + +StorageClassSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStorageClassSpecifier_DropletFile(this); + } +}; + + + + +CParser.StorageClassSpecifier_DropletFileContext = StorageClassSpecifier_DropletFileContext; + +CParser.prototype.storageClassSpecifier_DropletFile = function() { + + var localctx = new StorageClassSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 232, CParser.RULE_storageClassSpecifier_DropletFile); + try { + this.state = 1921; + switch(this._input.LA(1)) { + case CParser.Typedef: + this.enterOuterAlt(localctx, 1); + this.state = 1909; + this.match(CParser.Typedef); + this.state = 1910; + this.match(CParser.EOF); + break; + case CParser.Extern: + this.enterOuterAlt(localctx, 2); + this.state = 1911; + this.match(CParser.Extern); + this.state = 1912; + this.match(CParser.EOF); + break; + case CParser.Static: + this.enterOuterAlt(localctx, 3); + this.state = 1913; + this.match(CParser.Static); + this.state = 1914; + this.match(CParser.EOF); + break; + case CParser.ThreadLocal: + this.enterOuterAlt(localctx, 4); + this.state = 1915; + this.match(CParser.ThreadLocal); + this.state = 1916; + this.match(CParser.EOF); + break; + case CParser.Auto: + this.enterOuterAlt(localctx, 5); + this.state = 1917; + this.match(CParser.Auto); + this.state = 1918; + this.match(CParser.EOF); + break; + case CParser.Register: + this.enterOuterAlt(localctx, 6); + this.state = 1919; + this.match(CParser.Register); + this.state = 1920; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function TypeSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_typeSpecifier_DropletFile; + return this; +} + +TypeSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +TypeSpecifier_DropletFileContext.prototype.constructor = TypeSpecifier_DropletFileContext; + +TypeSpecifier_DropletFileContext.prototype.EOF = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CParser.EOF); + } else { + return this.getToken(CParser.EOF, i); + } +}; + + +TypeSpecifier_DropletFileContext.prototype.atomicTypeSpecifier = function() { + return this.getTypedRuleContext(AtomicTypeSpecifierContext,0); +}; + +TypeSpecifier_DropletFileContext.prototype.structOrUnionSpecifier = function() { + return this.getTypedRuleContext(StructOrUnionSpecifierContext,0); +}; + +TypeSpecifier_DropletFileContext.prototype.enumSpecifier = function() { + return this.getTypedRuleContext(EnumSpecifierContext,0); +}; + +TypeSpecifier_DropletFileContext.prototype.typedefName = function() { + return this.getTypedRuleContext(TypedefNameContext,0); +}; + +TypeSpecifier_DropletFileContext.prototype.constantExpression = function() { + return this.getTypedRuleContext(ConstantExpressionContext,0); +}; + +TypeSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterTypeSpecifier_DropletFile(this); + } +}; + +TypeSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitTypeSpecifier_DropletFile(this); + } +}; + + + + +CParser.TypeSpecifier_DropletFileContext = TypeSpecifier_DropletFileContext; + +CParser.prototype.typeSpecifier_DropletFile = function() { + + var localctx = new TypeSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 234, CParser.RULE_typeSpecifier_DropletFile); + var _la = 0; // Token type + try { + this.state = 1975; + switch(this._input.LA(1)) { + case CParser.T__3: + case CParser.T__4: + case CParser.T__5: + case CParser.Char: + case CParser.Double: + case CParser.Float: + case CParser.Int: + case CParser.Long: + case CParser.Short: + case CParser.Signed: + case CParser.Unsigned: + case CParser.Void: + case CParser.Bool: + case CParser.Complex: + this.enterOuterAlt(localctx, 1); + this.state = 1950; + switch(this._input.LA(1)) { + case CParser.Void: + this.state = 1923; + this.match(CParser.Void); + this.state = 1924; + this.match(CParser.EOF); + break; + case CParser.Char: + this.state = 1925; + this.match(CParser.Char); + this.state = 1926; + this.match(CParser.EOF); + break; + case CParser.Short: + this.state = 1927; + this.match(CParser.Short); + this.state = 1928; + this.match(CParser.EOF); + break; + case CParser.Int: + this.state = 1929; + this.match(CParser.Int); + this.state = 1930; + this.match(CParser.EOF); + break; + case CParser.Long: + this.state = 1931; + this.match(CParser.Long); + this.state = 1932; + this.match(CParser.EOF); + break; + case CParser.Float: + this.state = 1933; + this.match(CParser.Float); + this.state = 1934; + this.match(CParser.EOF); + break; + case CParser.Double: + this.state = 1935; + this.match(CParser.Double); + this.state = 1936; + this.match(CParser.EOF); + break; + case CParser.Signed: + this.state = 1937; + this.match(CParser.Signed); + this.state = 1938; + this.match(CParser.EOF); + break; + case CParser.Unsigned: + this.state = 1939; + this.match(CParser.Unsigned); + this.state = 1940; + this.match(CParser.EOF); + break; + case CParser.Bool: + this.state = 1941; + this.match(CParser.Bool); + this.state = 1942; + this.match(CParser.EOF); + break; + case CParser.Complex: + this.state = 1943; + this.match(CParser.Complex); + this.state = 1944; + this.match(CParser.EOF); + break; + case CParser.T__3: + this.state = 1945; + this.match(CParser.T__3); + this.state = 1946; + this.match(CParser.EOF); + break; + case CParser.T__4: + this.state = 1947; + this.match(CParser.T__4); + this.state = 1948; + this.match(CParser.EOF); + break; + case CParser.T__5: + this.state = 1949; + this.match(CParser.T__5); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + this.state = 1952; + this.match(CParser.EOF); + break; + case CParser.T__0: + this.enterOuterAlt(localctx, 2); + this.state = 1953; + this.match(CParser.T__0); + this.state = 1954; + this.match(CParser.LeftParen); + this.state = 1955; + _la = this._input.LA(1); + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this.consume(); + } + this.state = 1956; + this.match(CParser.RightParen); + this.state = 1957; + this.match(CParser.EOF); + break; + case CParser.Atomic: + this.enterOuterAlt(localctx, 3); + this.state = 1958; + this.atomicTypeSpecifier(); + this.state = 1959; + this.match(CParser.EOF); + break; + case CParser.Struct: + case CParser.Union: + this.enterOuterAlt(localctx, 4); + this.state = 1961; + this.structOrUnionSpecifier(); + this.state = 1962; + this.match(CParser.EOF); + break; + case CParser.Enum: + this.enterOuterAlt(localctx, 5); + this.state = 1964; + this.enumSpecifier(); + this.state = 1965; + this.match(CParser.EOF); + break; + case CParser.Identifier: + this.enterOuterAlt(localctx, 6); + this.state = 1967; + this.typedefName(); + this.state = 1968; + this.match(CParser.EOF); + break; + case CParser.T__6: + this.enterOuterAlt(localctx, 7); + this.state = 1970; + this.match(CParser.T__6); + this.state = 1971; + this.match(CParser.LeftParen); + this.state = 1972; + this.constantExpression(); + this.state = 1973; + this.match(CParser.RightParen); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StructOrUnionSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structOrUnionSpecifier_DropletFile; + return this; +} + +StructOrUnionSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructOrUnionSpecifier_DropletFileContext.prototype.constructor = StructOrUnionSpecifier_DropletFileContext; + +StructOrUnionSpecifier_DropletFileContext.prototype.structOrUnion = function() { + return this.getTypedRuleContext(StructOrUnionContext,0); +}; + +StructOrUnionSpecifier_DropletFileContext.prototype.structDeclarationsBlock = function() { + return this.getTypedRuleContext(StructDeclarationsBlockContext,0); +}; + +StructOrUnionSpecifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StructOrUnionSpecifier_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +StructOrUnionSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructOrUnionSpecifier_DropletFile(this); + } +}; + +StructOrUnionSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructOrUnionSpecifier_DropletFile(this); + } +}; + + + + +CParser.StructOrUnionSpecifier_DropletFileContext = StructOrUnionSpecifier_DropletFileContext; + +CParser.prototype.structOrUnionSpecifier_DropletFile = function() { + + var localctx = new StructOrUnionSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 236, CParser.RULE_structOrUnionSpecifier_DropletFile); + var _la = 0; // Token type + try { + this.state = 1988; + var la_ = this._interp.adaptivePredict(this._input,175,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1977; + this.structOrUnion(); + this.state = 1979; + _la = this._input.LA(1); + if(_la===CParser.Identifier) { + this.state = 1978; + this.match(CParser.Identifier); + } + + this.state = 1981; + this.structDeclarationsBlock(); + this.state = 1982; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1984; + this.structOrUnion(); + this.state = 1985; + this.match(CParser.Identifier); + this.state = 1986; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StructOrUnion_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structOrUnion_DropletFile; + return this; +} + +StructOrUnion_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructOrUnion_DropletFileContext.prototype.constructor = StructOrUnion_DropletFileContext; + +StructOrUnion_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StructOrUnion_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructOrUnion_DropletFile(this); + } +}; + +StructOrUnion_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructOrUnion_DropletFile(this); + } +}; + + + + +CParser.StructOrUnion_DropletFileContext = StructOrUnion_DropletFileContext; + +CParser.prototype.structOrUnion_DropletFile = function() { + + var localctx = new StructOrUnion_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 238, CParser.RULE_structOrUnion_DropletFile); + try { + this.state = 1994; + switch(this._input.LA(1)) { + case CParser.Struct: + this.enterOuterAlt(localctx, 1); + this.state = 1990; + this.match(CParser.Struct); + this.state = 1991; + this.match(CParser.EOF); + break; + case CParser.Union: + this.enterOuterAlt(localctx, 2); + this.state = 1992; + this.match(CParser.Union); + this.state = 1993; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StructDeclarationsBlock_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structDeclarationsBlock_DropletFile; + return this; +} + +StructDeclarationsBlock_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructDeclarationsBlock_DropletFileContext.prototype.constructor = StructDeclarationsBlock_DropletFileContext; + +StructDeclarationsBlock_DropletFileContext.prototype.structDeclarationList = function() { + return this.getTypedRuleContext(StructDeclarationListContext,0); +}; + +StructDeclarationsBlock_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StructDeclarationsBlock_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructDeclarationsBlock_DropletFile(this); + } +}; + +StructDeclarationsBlock_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructDeclarationsBlock_DropletFile(this); + } +}; + + + + +CParser.StructDeclarationsBlock_DropletFileContext = StructDeclarationsBlock_DropletFileContext; + +CParser.prototype.structDeclarationsBlock_DropletFile = function() { + + var localctx = new StructDeclarationsBlock_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 240, CParser.RULE_structDeclarationsBlock_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1996; + this.match(CParser.LeftBrace); + this.state = 1997; + this.structDeclarationList(0); + this.state = 1998; + this.match(CParser.RightBrace); + this.state = 1999; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StructDeclarationList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structDeclarationList_DropletFile; + return this; +} + +StructDeclarationList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructDeclarationList_DropletFileContext.prototype.constructor = StructDeclarationList_DropletFileContext; + +StructDeclarationList_DropletFileContext.prototype.structDeclaration = function() { + return this.getTypedRuleContext(StructDeclarationContext,0); +}; + +StructDeclarationList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StructDeclarationList_DropletFileContext.prototype.structDeclarationList = function() { + return this.getTypedRuleContext(StructDeclarationListContext,0); +}; + +StructDeclarationList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructDeclarationList_DropletFile(this); + } +}; + +StructDeclarationList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructDeclarationList_DropletFile(this); + } +}; + + + + +CParser.StructDeclarationList_DropletFileContext = StructDeclarationList_DropletFileContext; + +CParser.prototype.structDeclarationList_DropletFile = function() { + + var localctx = new StructDeclarationList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 242, CParser.RULE_structDeclarationList_DropletFile); + try { + this.state = 2008; + var la_ = this._interp.adaptivePredict(this._input,177,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2001; + this.structDeclaration(); + this.state = 2002; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2004; + this.structDeclarationList(0); + this.state = 2005; + this.structDeclaration(); + this.state = 2006; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StructDeclaration_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structDeclaration_DropletFile; + return this; +} + +StructDeclaration_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructDeclaration_DropletFileContext.prototype.constructor = StructDeclaration_DropletFileContext; + +StructDeclaration_DropletFileContext.prototype.specifierQualifierList = function() { + return this.getTypedRuleContext(SpecifierQualifierListContext,0); +}; + +StructDeclaration_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StructDeclaration_DropletFileContext.prototype.structDeclaratorList = function() { + return this.getTypedRuleContext(StructDeclaratorListContext,0); +}; + +StructDeclaration_DropletFileContext.prototype.staticAssertDeclaration = function() { + return this.getTypedRuleContext(StaticAssertDeclarationContext,0); +}; + +StructDeclaration_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructDeclaration_DropletFile(this); + } +}; + +StructDeclaration_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructDeclaration_DropletFile(this); + } +}; + + + + +CParser.StructDeclaration_DropletFileContext = StructDeclaration_DropletFileContext; + +CParser.prototype.structDeclaration_DropletFile = function() { + + var localctx = new StructDeclaration_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 244, CParser.RULE_structDeclaration_DropletFile); + var _la = 0; // Token type + try { + this.state = 2020; + switch(this._input.LA(1)) { + case CParser.T__0: + case CParser.T__3: + case CParser.T__4: + case CParser.T__5: + case CParser.T__6: + case CParser.Char: + case CParser.Const: + case CParser.Double: + case CParser.Enum: + case CParser.Float: + case CParser.Int: + case CParser.Long: + case CParser.Restrict: + case CParser.Short: + case CParser.Signed: + case CParser.Struct: + case CParser.Union: + case CParser.Unsigned: + case CParser.Void: + case CParser.Volatile: + case CParser.Atomic: + case CParser.Bool: + case CParser.Complex: + case CParser.Identifier: + this.enterOuterAlt(localctx, 1); + this.state = 2010; + this.specifierQualifierList(); + this.state = 2012; + _la = this._input.LA(1); + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)) | (1 << (CParser.Colon - 59)))) !== 0) || _la===CParser.Identifier) { + this.state = 2011; + this.structDeclaratorList(0); + } + + this.state = 2014; + this.match(CParser.Semi); + this.state = 2015; + this.match(CParser.EOF); + break; + case CParser.StaticAssert: + this.enterOuterAlt(localctx, 2); + this.state = 2017; + this.staticAssertDeclaration(); + this.state = 2018; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function SpecifierQualifierList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_specifierQualifierList_DropletFile; + return this; +} + +SpecifierQualifierList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +SpecifierQualifierList_DropletFileContext.prototype.constructor = SpecifierQualifierList_DropletFileContext; + +SpecifierQualifierList_DropletFileContext.prototype.typeSpecifier = function() { + return this.getTypedRuleContext(TypeSpecifierContext,0); +}; + +SpecifierQualifierList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +SpecifierQualifierList_DropletFileContext.prototype.specifierQualifierList = function() { + return this.getTypedRuleContext(SpecifierQualifierListContext,0); +}; + +SpecifierQualifierList_DropletFileContext.prototype.typeQualifier = function() { + return this.getTypedRuleContext(TypeQualifierContext,0); +}; + +SpecifierQualifierList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterSpecifierQualifierList_DropletFile(this); + } +}; + +SpecifierQualifierList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitSpecifierQualifierList_DropletFile(this); + } +}; + + + + +CParser.SpecifierQualifierList_DropletFileContext = SpecifierQualifierList_DropletFileContext; + +CParser.prototype.specifierQualifierList_DropletFile = function() { + + var localctx = new SpecifierQualifierList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 246, CParser.RULE_specifierQualifierList_DropletFile); + var _la = 0; // Token type + try { + this.state = 2034; + var la_ = this._interp.adaptivePredict(this._input,182,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2022; + this.typeSpecifier(); + this.state = 2024; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 2023; + this.specifierQualifierList(); + } + + this.state = 2026; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2028; + this.typeQualifier(); + this.state = 2030; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 2029; + this.specifierQualifierList(); + } + + this.state = 2032; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StructDeclaratorList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structDeclaratorList_DropletFile; + return this; +} + +StructDeclaratorList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructDeclaratorList_DropletFileContext.prototype.constructor = StructDeclaratorList_DropletFileContext; + +StructDeclaratorList_DropletFileContext.prototype.structDeclarator = function() { + return this.getTypedRuleContext(StructDeclaratorContext,0); +}; + +StructDeclaratorList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StructDeclaratorList_DropletFileContext.prototype.structDeclaratorList = function() { + return this.getTypedRuleContext(StructDeclaratorListContext,0); +}; + +StructDeclaratorList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructDeclaratorList_DropletFile(this); + } +}; + +StructDeclaratorList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructDeclaratorList_DropletFile(this); + } +}; + + + + +CParser.StructDeclaratorList_DropletFileContext = StructDeclaratorList_DropletFileContext; + +CParser.prototype.structDeclaratorList_DropletFile = function() { + + var localctx = new StructDeclaratorList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 248, CParser.RULE_structDeclaratorList_DropletFile); + try { + this.state = 2044; + var la_ = this._interp.adaptivePredict(this._input,183,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2036; + this.structDeclarator(); + this.state = 2037; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2039; + this.structDeclaratorList(0); + this.state = 2040; + this.match(CParser.Comma); + this.state = 2041; + this.structDeclarator(); + this.state = 2042; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StructDeclarator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_structDeclarator_DropletFile; + return this; +} + +StructDeclarator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StructDeclarator_DropletFileContext.prototype.constructor = StructDeclarator_DropletFileContext; + +StructDeclarator_DropletFileContext.prototype.declarator = function() { + return this.getTypedRuleContext(DeclaratorContext,0); +}; + +StructDeclarator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StructDeclarator_DropletFileContext.prototype.constantExpression = function() { + return this.getTypedRuleContext(ConstantExpressionContext,0); +}; + +StructDeclarator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStructDeclarator_DropletFile(this); + } +}; + +StructDeclarator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStructDeclarator_DropletFile(this); + } +}; + + + + +CParser.StructDeclarator_DropletFileContext = StructDeclarator_DropletFileContext; + +CParser.prototype.structDeclarator_DropletFile = function() { + + var localctx = new StructDeclarator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 250, CParser.RULE_structDeclarator_DropletFile); + var _la = 0; // Token type + try { + this.state = 2056; + var la_ = this._interp.adaptivePredict(this._input,185,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2046; + this.declarator(); + this.state = 2047; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2050; + _la = this._input.LA(1); + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) { + this.state = 2049; + this.declarator(); + } + + this.state = 2052; + this.match(CParser.Colon); + this.state = 2053; + this.constantExpression(); + this.state = 2054; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function EnumSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_enumSpecifier_DropletFile; + return this; +} + +EnumSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +EnumSpecifier_DropletFileContext.prototype.constructor = EnumSpecifier_DropletFileContext; + +EnumSpecifier_DropletFileContext.prototype.enumeratorList = function() { + return this.getTypedRuleContext(EnumeratorListContext,0); +}; + +EnumSpecifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +EnumSpecifier_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +EnumSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterEnumSpecifier_DropletFile(this); + } +}; + +EnumSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitEnumSpecifier_DropletFile(this); + } +}; + + + + +CParser.EnumSpecifier_DropletFileContext = EnumSpecifier_DropletFileContext; + +CParser.prototype.enumSpecifier_DropletFile = function() { + + var localctx = new EnumSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 252, CParser.RULE_enumSpecifier_DropletFile); + var _la = 0; // Token type + try { + this.state = 2080; + var la_ = this._interp.adaptivePredict(this._input,188,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2058; + this.match(CParser.Enum); + this.state = 2060; + _la = this._input.LA(1); + if(_la===CParser.Identifier) { + this.state = 2059; + this.match(CParser.Identifier); + } + + this.state = 2062; + this.match(CParser.LeftBrace); + this.state = 2063; + this.enumeratorList(0); + this.state = 2064; + this.match(CParser.RightBrace); + this.state = 2065; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2067; + this.match(CParser.Enum); + this.state = 2069; + _la = this._input.LA(1); + if(_la===CParser.Identifier) { + this.state = 2068; + this.match(CParser.Identifier); + } + + this.state = 2071; + this.match(CParser.LeftBrace); + this.state = 2072; + this.enumeratorList(0); + this.state = 2073; + this.match(CParser.Comma); + this.state = 2074; + this.match(CParser.RightBrace); + this.state = 2075; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2077; + this.match(CParser.Enum); + this.state = 2078; + this.match(CParser.Identifier); + this.state = 2079; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function EnumeratorList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_enumeratorList_DropletFile; + return this; +} + +EnumeratorList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +EnumeratorList_DropletFileContext.prototype.constructor = EnumeratorList_DropletFileContext; + +EnumeratorList_DropletFileContext.prototype.enumerator = function() { + return this.getTypedRuleContext(EnumeratorContext,0); +}; + +EnumeratorList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +EnumeratorList_DropletFileContext.prototype.enumeratorList = function() { + return this.getTypedRuleContext(EnumeratorListContext,0); +}; + +EnumeratorList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterEnumeratorList_DropletFile(this); + } +}; + +EnumeratorList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitEnumeratorList_DropletFile(this); + } +}; + + + + +CParser.EnumeratorList_DropletFileContext = EnumeratorList_DropletFileContext; + +CParser.prototype.enumeratorList_DropletFile = function() { + + var localctx = new EnumeratorList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 254, CParser.RULE_enumeratorList_DropletFile); + try { + this.state = 2090; + var la_ = this._interp.adaptivePredict(this._input,189,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2082; + this.enumerator(); + this.state = 2083; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2085; + this.enumeratorList(0); + this.state = 2086; + this.match(CParser.Comma); + this.state = 2087; + this.enumerator(); + this.state = 2088; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Enumerator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_enumerator_DropletFile; + return this; +} + +Enumerator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Enumerator_DropletFileContext.prototype.constructor = Enumerator_DropletFileContext; + +Enumerator_DropletFileContext.prototype.enumerationConstant = function() { + return this.getTypedRuleContext(EnumerationConstantContext,0); +}; + +Enumerator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Enumerator_DropletFileContext.prototype.constantExpression = function() { + return this.getTypedRuleContext(ConstantExpressionContext,0); +}; + +Enumerator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterEnumerator_DropletFile(this); + } +}; + +Enumerator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitEnumerator_DropletFile(this); + } +}; + + + + +CParser.Enumerator_DropletFileContext = Enumerator_DropletFileContext; + +CParser.prototype.enumerator_DropletFile = function() { + + var localctx = new Enumerator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 256, CParser.RULE_enumerator_DropletFile); + try { + this.state = 2100; + var la_ = this._interp.adaptivePredict(this._input,190,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2092; + this.enumerationConstant(); + this.state = 2093; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2095; + this.enumerationConstant(); + this.state = 2096; + this.match(CParser.Assign); + this.state = 2097; + this.constantExpression(); + this.state = 2098; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function EnumerationConstant_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_enumerationConstant_DropletFile; + return this; +} + +EnumerationConstant_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +EnumerationConstant_DropletFileContext.prototype.constructor = EnumerationConstant_DropletFileContext; + +EnumerationConstant_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +EnumerationConstant_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +EnumerationConstant_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterEnumerationConstant_DropletFile(this); + } +}; + +EnumerationConstant_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitEnumerationConstant_DropletFile(this); + } +}; + + + + +CParser.EnumerationConstant_DropletFileContext = EnumerationConstant_DropletFileContext; + +CParser.prototype.enumerationConstant_DropletFile = function() { + + var localctx = new EnumerationConstant_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 258, CParser.RULE_enumerationConstant_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2102; + this.match(CParser.Identifier); + this.state = 2103; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function AtomicTypeSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_atomicTypeSpecifier_DropletFile; + return this; +} + +AtomicTypeSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +AtomicTypeSpecifier_DropletFileContext.prototype.constructor = AtomicTypeSpecifier_DropletFileContext; + +AtomicTypeSpecifier_DropletFileContext.prototype.typeName = function() { + return this.getTypedRuleContext(TypeNameContext,0); +}; + +AtomicTypeSpecifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +AtomicTypeSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterAtomicTypeSpecifier_DropletFile(this); + } +}; + +AtomicTypeSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitAtomicTypeSpecifier_DropletFile(this); + } +}; + + + + +CParser.AtomicTypeSpecifier_DropletFileContext = AtomicTypeSpecifier_DropletFileContext; + +CParser.prototype.atomicTypeSpecifier_DropletFile = function() { + + var localctx = new AtomicTypeSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 260, CParser.RULE_atomicTypeSpecifier_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2105; + this.match(CParser.Atomic); + this.state = 2106; + this.match(CParser.LeftParen); + this.state = 2107; + this.typeName(); + this.state = 2108; + this.match(CParser.RightParen); + this.state = 2109; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function TypeQualifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_typeQualifier_DropletFile; + return this; +} + +TypeQualifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +TypeQualifier_DropletFileContext.prototype.constructor = TypeQualifier_DropletFileContext; + +TypeQualifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +TypeQualifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterTypeQualifier_DropletFile(this); + } +}; + +TypeQualifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitTypeQualifier_DropletFile(this); + } +}; + + + + +CParser.TypeQualifier_DropletFileContext = TypeQualifier_DropletFileContext; + +CParser.prototype.typeQualifier_DropletFile = function() { + + var localctx = new TypeQualifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 262, CParser.RULE_typeQualifier_DropletFile); + try { + this.state = 2119; + switch(this._input.LA(1)) { + case CParser.Const: + this.enterOuterAlt(localctx, 1); + this.state = 2111; + this.match(CParser.Const); + this.state = 2112; + this.match(CParser.EOF); + break; + case CParser.Restrict: + this.enterOuterAlt(localctx, 2); + this.state = 2113; + this.match(CParser.Restrict); + this.state = 2114; + this.match(CParser.EOF); + break; + case CParser.Volatile: + this.enterOuterAlt(localctx, 3); + this.state = 2115; + this.match(CParser.Volatile); + this.state = 2116; + this.match(CParser.EOF); + break; + case CParser.Atomic: + this.enterOuterAlt(localctx, 4); + this.state = 2117; + this.match(CParser.Atomic); + this.state = 2118; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function FunctionSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_functionSpecifier_DropletFile; + return this; +} + +FunctionSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +FunctionSpecifier_DropletFileContext.prototype.constructor = FunctionSpecifier_DropletFileContext; + +FunctionSpecifier_DropletFileContext.prototype.EOF = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CParser.EOF); + } else { + return this.getToken(CParser.EOF, i); + } +}; + + +FunctionSpecifier_DropletFileContext.prototype.gccAttributeSpecifier = function() { + return this.getTypedRuleContext(GccAttributeSpecifierContext,0); +}; + +FunctionSpecifier_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +FunctionSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterFunctionSpecifier_DropletFile(this); + } +}; + +FunctionSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitFunctionSpecifier_DropletFile(this); + } +}; + + + + +CParser.FunctionSpecifier_DropletFileContext = FunctionSpecifier_DropletFileContext; + +CParser.prototype.functionSpecifier_DropletFile = function() { + + var localctx = new FunctionSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 264, CParser.RULE_functionSpecifier_DropletFile); + try { + this.state = 2138; + switch(this._input.LA(1)) { + case CParser.T__7: + case CParser.T__8: + case CParser.Inline: + case CParser.Noreturn: + this.enterOuterAlt(localctx, 1); + this.state = 2127; + switch(this._input.LA(1)) { + case CParser.Inline: + this.state = 2121; + this.match(CParser.Inline); + this.state = 2122; + this.match(CParser.EOF); + break; + case CParser.Noreturn: + this.state = 2123; + this.match(CParser.Noreturn); + this.state = 2124; + this.match(CParser.EOF); + break; + case CParser.T__7: + this.state = 2125; + this.match(CParser.T__7); + break; + case CParser.T__8: + this.state = 2126; + this.match(CParser.T__8); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + this.state = 2129; + this.match(CParser.EOF); + break; + case CParser.T__11: + this.enterOuterAlt(localctx, 2); + this.state = 2130; + this.gccAttributeSpecifier(); + this.state = 2131; + this.match(CParser.EOF); + break; + case CParser.T__9: + this.enterOuterAlt(localctx, 3); + this.state = 2133; + this.match(CParser.T__9); + this.state = 2134; + this.match(CParser.LeftParen); + this.state = 2135; + this.match(CParser.Identifier); + this.state = 2136; + this.match(CParser.RightParen); + this.state = 2137; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function AlignmentSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_alignmentSpecifier_DropletFile; + return this; +} + +AlignmentSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +AlignmentSpecifier_DropletFileContext.prototype.constructor = AlignmentSpecifier_DropletFileContext; + +AlignmentSpecifier_DropletFileContext.prototype.typeName = function() { + return this.getTypedRuleContext(TypeNameContext,0); +}; + +AlignmentSpecifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +AlignmentSpecifier_DropletFileContext.prototype.constantExpression = function() { + return this.getTypedRuleContext(ConstantExpressionContext,0); +}; + +AlignmentSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterAlignmentSpecifier_DropletFile(this); + } +}; + +AlignmentSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitAlignmentSpecifier_DropletFile(this); + } +}; + + + + +CParser.AlignmentSpecifier_DropletFileContext = AlignmentSpecifier_DropletFileContext; + +CParser.prototype.alignmentSpecifier_DropletFile = function() { + + var localctx = new AlignmentSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 266, CParser.RULE_alignmentSpecifier_DropletFile); + try { + this.state = 2152; + var la_ = this._interp.adaptivePredict(this._input,194,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2140; + this.match(CParser.Alignas); + this.state = 2141; + this.match(CParser.LeftParen); + this.state = 2142; + this.typeName(); + this.state = 2143; + this.match(CParser.RightParen); + this.state = 2144; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2146; + this.match(CParser.Alignas); + this.state = 2147; + this.match(CParser.LeftParen); + this.state = 2148; + this.constantExpression(); + this.state = 2149; + this.match(CParser.RightParen); + this.state = 2150; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Declarator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_declarator_DropletFile; + return this; +} + +Declarator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Declarator_DropletFileContext.prototype.constructor = Declarator_DropletFileContext; + +Declarator_DropletFileContext.prototype.directDeclarator = function() { + return this.getTypedRuleContext(DirectDeclaratorContext,0); +}; + +Declarator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Declarator_DropletFileContext.prototype.pointer = function() { + return this.getTypedRuleContext(PointerContext,0); +}; + +Declarator_DropletFileContext.prototype.gccDeclaratorExtension = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(GccDeclaratorExtensionContext); + } else { + return this.getTypedRuleContext(GccDeclaratorExtensionContext,i); + } +}; + +Declarator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDeclarator_DropletFile(this); + } +}; + +Declarator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDeclarator_DropletFile(this); + } +}; + + + + +CParser.Declarator_DropletFileContext = Declarator_DropletFileContext; + +CParser.prototype.declarator_DropletFile = function() { + + var localctx = new Declarator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 268, CParser.RULE_declarator_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2155; + _la = this._input.LA(1); + if(_la===CParser.Star || _la===CParser.Caret) { + this.state = 2154; + this.pointer(); + } + + this.state = 2157; + this.directDeclarator(0); + this.state = 2161; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.T__10 || _la===CParser.T__11) { + this.state = 2158; + this.gccDeclaratorExtension(); + this.state = 2163; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 2164; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DirectDeclarator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_directDeclarator_DropletFile; + return this; +} + +DirectDeclarator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DirectDeclarator_DropletFileContext.prototype.constructor = DirectDeclarator_DropletFileContext; + +DirectDeclarator_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +DirectDeclarator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +DirectDeclarator_DropletFileContext.prototype.declarator = function() { + return this.getTypedRuleContext(DeclaratorContext,0); +}; + +DirectDeclarator_DropletFileContext.prototype.directDeclarator = function() { + return this.getTypedRuleContext(DirectDeclaratorContext,0); +}; + +DirectDeclarator_DropletFileContext.prototype.typeQualifierList = function() { + return this.getTypedRuleContext(TypeQualifierListContext,0); +}; + +DirectDeclarator_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +DirectDeclarator_DropletFileContext.prototype.parameterTypeList = function() { + return this.getTypedRuleContext(ParameterTypeListContext,0); +}; + +DirectDeclarator_DropletFileContext.prototype.identifierList = function() { + return this.getTypedRuleContext(IdentifierListContext,0); +}; + +DirectDeclarator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDirectDeclarator_DropletFile(this); + } +}; + +DirectDeclarator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDirectDeclarator_DropletFile(this); + } +}; + + + + +CParser.DirectDeclarator_DropletFileContext = DirectDeclarator_DropletFileContext; + +CParser.prototype.directDeclarator_DropletFile = function() { + + var localctx = new DirectDeclarator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 270, CParser.RULE_directDeclarator_DropletFile); + var _la = 0; // Token type + try { + this.state = 2225; + var la_ = this._interp.adaptivePredict(this._input,202,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2166; + this.match(CParser.Identifier); + this.state = 2167; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2168; + this.match(CParser.LeftParen); + this.state = 2169; + this.declarator(); + this.state = 2170; + this.match(CParser.RightParen); + this.state = 2171; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2173; + this.directDeclarator(0); + this.state = 2174; + this.match(CParser.LeftBracket); + this.state = 2176; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2175; + this.typeQualifierList(0); + } + + this.state = 2179; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2178; + this.assignmentExpression(); + } + + this.state = 2181; + this.match(CParser.RightBracket); + this.state = 2182; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2184; + this.directDeclarator(0); + this.state = 2185; + this.match(CParser.LeftBracket); + this.state = 2186; + this.match(CParser.Static); + this.state = 2188; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2187; + this.typeQualifierList(0); + } + + this.state = 2190; + this.assignmentExpression(); + this.state = 2191; + this.match(CParser.RightBracket); + this.state = 2192; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2194; + this.directDeclarator(0); + this.state = 2195; + this.match(CParser.LeftBracket); + this.state = 2196; + this.typeQualifierList(0); + this.state = 2197; + this.match(CParser.Static); + this.state = 2198; + this.assignmentExpression(); + this.state = 2199; + this.match(CParser.RightBracket); + this.state = 2200; + this.match(CParser.EOF); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 2202; + this.directDeclarator(0); + this.state = 2203; + this.match(CParser.LeftBracket); + this.state = 2205; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2204; + this.typeQualifierList(0); + } + + this.state = 2207; + this.match(CParser.Star); + this.state = 2208; + this.match(CParser.RightBracket); + this.state = 2209; + this.match(CParser.EOF); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 2211; + this.directDeclarator(0); + this.state = 2212; + this.match(CParser.LeftParen); + this.state = 2213; + this.parameterTypeList(); + this.state = 2214; + this.match(CParser.RightParen); + this.state = 2215; + this.match(CParser.EOF); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 2217; + this.directDeclarator(0); + this.state = 2218; + this.match(CParser.LeftParen); + this.state = 2220; + _la = this._input.LA(1); + if(_la===CParser.Identifier) { + this.state = 2219; + this.identifierList(0); + } + + this.state = 2222; + this.match(CParser.RightParen); + this.state = 2223; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function GccDeclaratorExtension_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_gccDeclaratorExtension_DropletFile; + return this; +} + +GccDeclaratorExtension_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +GccDeclaratorExtension_DropletFileContext.prototype.constructor = GccDeclaratorExtension_DropletFileContext; + +GccDeclaratorExtension_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +GccDeclaratorExtension_DropletFileContext.prototype.StringLiteral = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CParser.StringLiteral); + } else { + return this.getToken(CParser.StringLiteral, i); + } +}; + + +GccDeclaratorExtension_DropletFileContext.prototype.gccAttributeSpecifier = function() { + return this.getTypedRuleContext(GccAttributeSpecifierContext,0); +}; + +GccDeclaratorExtension_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterGccDeclaratorExtension_DropletFile(this); + } +}; + +GccDeclaratorExtension_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitGccDeclaratorExtension_DropletFile(this); + } +}; + + + + +CParser.GccDeclaratorExtension_DropletFileContext = GccDeclaratorExtension_DropletFileContext; + +CParser.prototype.gccDeclaratorExtension_DropletFile = function() { + + var localctx = new GccDeclaratorExtension_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 272, CParser.RULE_gccDeclaratorExtension_DropletFile); + var _la = 0; // Token type + try { + this.state = 2239; + switch(this._input.LA(1)) { + case CParser.T__10: + this.enterOuterAlt(localctx, 1); + this.state = 2227; + this.match(CParser.T__10); + this.state = 2228; + this.match(CParser.LeftParen); + this.state = 2230; + this._errHandler.sync(this); + _la = this._input.LA(1); + do { + this.state = 2229; + this.match(CParser.StringLiteral); + this.state = 2232; + this._errHandler.sync(this); + _la = this._input.LA(1); + } while(_la===CParser.StringLiteral); + this.state = 2234; + this.match(CParser.RightParen); + this.state = 2235; + this.match(CParser.EOF); + break; + case CParser.T__11: + this.enterOuterAlt(localctx, 2); + this.state = 2236; + this.gccAttributeSpecifier(); + this.state = 2237; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function GccAttributeSpecifier_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_gccAttributeSpecifier_DropletFile; + return this; +} + +GccAttributeSpecifier_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +GccAttributeSpecifier_DropletFileContext.prototype.constructor = GccAttributeSpecifier_DropletFileContext; + +GccAttributeSpecifier_DropletFileContext.prototype.gccAttributeList = function() { + return this.getTypedRuleContext(GccAttributeListContext,0); +}; + +GccAttributeSpecifier_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +GccAttributeSpecifier_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterGccAttributeSpecifier_DropletFile(this); + } +}; + +GccAttributeSpecifier_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitGccAttributeSpecifier_DropletFile(this); + } +}; + + + + +CParser.GccAttributeSpecifier_DropletFileContext = GccAttributeSpecifier_DropletFileContext; + +CParser.prototype.gccAttributeSpecifier_DropletFile = function() { + + var localctx = new GccAttributeSpecifier_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 274, CParser.RULE_gccAttributeSpecifier_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2241; + this.match(CParser.T__11); + this.state = 2242; + this.match(CParser.LeftParen); + this.state = 2243; + this.match(CParser.LeftParen); + this.state = 2244; + this.gccAttributeList(); + this.state = 2245; + this.match(CParser.RightParen); + this.state = 2246; + this.match(CParser.RightParen); + this.state = 2247; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function GccAttributeList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_gccAttributeList_DropletFile; + return this; +} + +GccAttributeList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +GccAttributeList_DropletFileContext.prototype.constructor = GccAttributeList_DropletFileContext; + +GccAttributeList_DropletFileContext.prototype.gccAttribute = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(GccAttributeContext); + } else { + return this.getTypedRuleContext(GccAttributeContext,i); + } +}; + +GccAttributeList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +GccAttributeList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterGccAttributeList_DropletFile(this); + } +}; + +GccAttributeList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitGccAttributeList_DropletFile(this); + } +}; + + + + +CParser.GccAttributeList_DropletFileContext = GccAttributeList_DropletFileContext; + +CParser.prototype.gccAttributeList_DropletFile = function() { + + var localctx = new GccAttributeList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 276, CParser.RULE_gccAttributeList_DropletFile); + var _la = 0; // Token type + try { + this.state = 2260; + var la_ = this._interp.adaptivePredict(this._input,206,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2249; + this.gccAttribute(); + this.state = 2254; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.Comma) { + this.state = 2250; + this.match(CParser.Comma); + this.state = 2251; + this.gccAttribute(); + this.state = 2256; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 2257; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function GccAttribute_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_gccAttribute_DropletFile; + return this; +} + +GccAttribute_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +GccAttribute_DropletFileContext.prototype.constructor = GccAttribute_DropletFileContext; + +GccAttribute_DropletFileContext.prototype.argumentExpressionList = function() { + return this.getTypedRuleContext(ArgumentExpressionListContext,0); +}; + +GccAttribute_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterGccAttribute_DropletFile(this); + } +}; + +GccAttribute_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitGccAttribute_DropletFile(this); + } +}; + + + + +CParser.GccAttribute_DropletFileContext = GccAttribute_DropletFileContext; + +CParser.prototype.gccAttribute_DropletFile = function() { + + var localctx = new GccAttribute_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 278, CParser.RULE_gccAttribute_DropletFile); + var _la = 0; // Token type + try { + this.state = 2271; + switch(this._input.LA(1)) { + case CParser.T__0: + case CParser.T__1: + case CParser.T__2: + case CParser.T__3: + case CParser.T__4: + case CParser.T__5: + case CParser.T__6: + case CParser.T__7: + case CParser.T__8: + case CParser.T__9: + case CParser.T__10: + case CParser.T__11: + case CParser.T__12: + case CParser.T__13: + case CParser.Auto: + case CParser.Break: + case CParser.Case: + case CParser.Char: + case CParser.Const: + case CParser.Continue: + case CParser.Default: + case CParser.Do: + case CParser.Double: + case CParser.Else: + case CParser.Enum: + case CParser.Extern: + case CParser.Float: + case CParser.For: + case CParser.Goto: + case CParser.If: + case CParser.Inline: + case CParser.Int: + case CParser.Long: + case CParser.Register: + case CParser.Restrict: + case CParser.Return: + case CParser.Short: + case CParser.Signed: + case CParser.Sizeof: + case CParser.Static: + case CParser.Struct: + case CParser.Switch: + case CParser.Typedef: + case CParser.Union: + case CParser.Unsigned: + case CParser.Void: + case CParser.Volatile: + case CParser.While: + case CParser.Alignas: + case CParser.Alignof: + case CParser.Atomic: + case CParser.Bool: + case CParser.Complex: + case CParser.Generic: + case CParser.Imaginary: + case CParser.Noreturn: + case CParser.StaticAssert: + case CParser.ThreadLocal: + case CParser.LeftBracket: + case CParser.RightBracket: + case CParser.LeftBrace: + case CParser.RightBrace: + case CParser.Less: + case CParser.LessEqual: + case CParser.Greater: + case CParser.GreaterEqual: + case CParser.LeftShift: + case CParser.RightShift: + case CParser.Plus: + case CParser.PlusPlus: + case CParser.Minus: + case CParser.MinusMinus: + case CParser.Star: + case CParser.Div: + case CParser.Mod: + case CParser.And: + case CParser.Or: + case CParser.AndAnd: + case CParser.OrOr: + case CParser.Caret: + case CParser.Not: + case CParser.Tilde: + case CParser.Question: + case CParser.Colon: + case CParser.Semi: + case CParser.Assign: + case CParser.StarAssign: + case CParser.DivAssign: + case CParser.ModAssign: + case CParser.PlusAssign: + case CParser.MinusAssign: + case CParser.LeftShiftAssign: + case CParser.RightShiftAssign: + case CParser.AndAssign: + case CParser.XorAssign: + case CParser.OrAssign: + case CParser.Equal: + case CParser.NotEqual: + case CParser.Arrow: + case CParser.Dot: + case CParser.Ellipsis: + case CParser.Identifier: + case CParser.Constant: + case CParser.StringLiteral: + case CParser.SharedIncludeLiteral: + case CParser.Directive: + case CParser.Whitespace: + case CParser.Newline: + case CParser.BlockComment: + case CParser.LineComment: + this.enterOuterAlt(localctx, 1); + this.state = 2262; + _la = this._input.LA(1); + if(_la<=0 || ((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.RightParen - 59)) | (1 << (CParser.Comma - 59)))) !== 0)) { + this._errHandler.recoverInline(this); + } + else { + this.consume(); + } + this.state = 2268; + _la = this._input.LA(1); + if(_la===CParser.LeftParen) { + this.state = 2263; + this.match(CParser.LeftParen); + this.state = 2265; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2264; + this.argumentExpressionList(0); + } + + this.state = 2267; + this.match(CParser.RightParen); + } + + break; + case CParser.EOF: + this.enterOuterAlt(localctx, 2); + + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function NestedParenthesesBlock_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_nestedParenthesesBlock_DropletFile; + return this; +} + +NestedParenthesesBlock_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +NestedParenthesesBlock_DropletFileContext.prototype.constructor = NestedParenthesesBlock_DropletFileContext; + +NestedParenthesesBlock_DropletFileContext.prototype.EOF = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CParser.EOF); + } else { + return this.getToken(CParser.EOF, i); + } +}; + + +NestedParenthesesBlock_DropletFileContext.prototype.nestedParenthesesBlock = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(NestedParenthesesBlockContext); + } else { + return this.getTypedRuleContext(NestedParenthesesBlockContext,i); + } +}; + +NestedParenthesesBlock_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterNestedParenthesesBlock_DropletFile(this); + } +}; + +NestedParenthesesBlock_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitNestedParenthesesBlock_DropletFile(this); + } +}; + + + + +CParser.NestedParenthesesBlock_DropletFileContext = NestedParenthesesBlock_DropletFileContext; + +CParser.prototype.nestedParenthesesBlock_DropletFile = function() { + + var localctx = new NestedParenthesesBlock_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 280, CParser.RULE_nestedParenthesesBlock_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2282; + this._errHandler.sync(this); + _la = this._input.LA(1); + while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { + this.state = 2280; + switch(this._input.LA(1)) { + case CParser.T__0: + case CParser.T__1: + case CParser.T__2: + case CParser.T__3: + case CParser.T__4: + case CParser.T__5: + case CParser.T__6: + case CParser.T__7: + case CParser.T__8: + case CParser.T__9: + case CParser.T__10: + case CParser.T__11: + case CParser.T__12: + case CParser.T__13: + case CParser.Auto: + case CParser.Break: + case CParser.Case: + case CParser.Char: + case CParser.Const: + case CParser.Continue: + case CParser.Default: + case CParser.Do: + case CParser.Double: + case CParser.Else: + case CParser.Enum: + case CParser.Extern: + case CParser.Float: + case CParser.For: + case CParser.Goto: + case CParser.If: + case CParser.Inline: + case CParser.Int: + case CParser.Long: + case CParser.Register: + case CParser.Restrict: + case CParser.Return: + case CParser.Short: + case CParser.Signed: + case CParser.Sizeof: + case CParser.Static: + case CParser.Struct: + case CParser.Switch: + case CParser.Typedef: + case CParser.Union: + case CParser.Unsigned: + case CParser.Void: + case CParser.Volatile: + case CParser.While: + case CParser.Alignas: + case CParser.Alignof: + case CParser.Atomic: + case CParser.Bool: + case CParser.Complex: + case CParser.Generic: + case CParser.Imaginary: + case CParser.Noreturn: + case CParser.StaticAssert: + case CParser.ThreadLocal: + case CParser.LeftBracket: + case CParser.RightBracket: + case CParser.LeftBrace: + case CParser.RightBrace: + case CParser.Less: + case CParser.LessEqual: + case CParser.Greater: + case CParser.GreaterEqual: + case CParser.LeftShift: + case CParser.RightShift: + case CParser.Plus: + case CParser.PlusPlus: + case CParser.Minus: + case CParser.MinusMinus: + case CParser.Star: + case CParser.Div: + case CParser.Mod: + case CParser.And: + case CParser.Or: + case CParser.AndAnd: + case CParser.OrOr: + case CParser.Caret: + case CParser.Not: + case CParser.Tilde: + case CParser.Question: + case CParser.Colon: + case CParser.Semi: + case CParser.Comma: + case CParser.Assign: + case CParser.StarAssign: + case CParser.DivAssign: + case CParser.ModAssign: + case CParser.PlusAssign: + case CParser.MinusAssign: + case CParser.LeftShiftAssign: + case CParser.RightShiftAssign: + case CParser.AndAssign: + case CParser.XorAssign: + case CParser.OrAssign: + case CParser.Equal: + case CParser.NotEqual: + case CParser.Arrow: + case CParser.Dot: + case CParser.Ellipsis: + case CParser.Identifier: + case CParser.Constant: + case CParser.StringLiteral: + case CParser.SharedIncludeLiteral: + case CParser.Directive: + case CParser.Whitespace: + case CParser.Newline: + case CParser.BlockComment: + case CParser.LineComment: + this.state = 2273; + _la = this._input.LA(1); + if(_la<=0 || _la===CParser.LeftParen || _la===CParser.RightParen) { + this._errHandler.recoverInline(this); + } + else { + this.consume(); + } + this.state = 2274; + this.match(CParser.EOF); + break; + case CParser.LeftParen: + this.state = 2275; + this.match(CParser.LeftParen); + this.state = 2276; + this.nestedParenthesesBlock(); + this.state = 2277; + this.match(CParser.RightParen); + this.state = 2278; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + this.state = 2284; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Pointer_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_pointer_DropletFile; + return this; +} + +Pointer_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Pointer_DropletFileContext.prototype.constructor = Pointer_DropletFileContext; + +Pointer_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Pointer_DropletFileContext.prototype.typeQualifierList = function() { + return this.getTypedRuleContext(TypeQualifierListContext,0); +}; + +Pointer_DropletFileContext.prototype.pointer = function() { + return this.getTypedRuleContext(PointerContext,0); +}; + +Pointer_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterPointer_DropletFile(this); + } +}; + +Pointer_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitPointer_DropletFile(this); + } +}; + + + + +CParser.Pointer_DropletFileContext = Pointer_DropletFileContext; + +CParser.prototype.pointer_DropletFile = function() { + + var localctx = new Pointer_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 282, CParser.RULE_pointer_DropletFile); + var _la = 0; // Token type + try { + this.state = 2306; + var la_ = this._interp.adaptivePredict(this._input,216,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2285; + this.match(CParser.Star); + this.state = 2287; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2286; + this.typeQualifierList(0); + } + + this.state = 2289; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2290; + this.match(CParser.Star); + this.state = 2292; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2291; + this.typeQualifierList(0); + } + + this.state = 2294; + this.pointer(); + this.state = 2295; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2297; + this.match(CParser.Caret); + this.state = 2299; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2298; + this.typeQualifierList(0); + } + + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2301; + this.match(CParser.Caret); + this.state = 2303; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2302; + this.typeQualifierList(0); + } + + this.state = 2305; + this.pointer(); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function TypeQualifierList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_typeQualifierList_DropletFile; + return this; +} + +TypeQualifierList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +TypeQualifierList_DropletFileContext.prototype.constructor = TypeQualifierList_DropletFileContext; + +TypeQualifierList_DropletFileContext.prototype.typeQualifier = function() { + return this.getTypedRuleContext(TypeQualifierContext,0); +}; + +TypeQualifierList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +TypeQualifierList_DropletFileContext.prototype.typeQualifierList = function() { + return this.getTypedRuleContext(TypeQualifierListContext,0); +}; + +TypeQualifierList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterTypeQualifierList_DropletFile(this); + } +}; + +TypeQualifierList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitTypeQualifierList_DropletFile(this); + } +}; + + + + +CParser.TypeQualifierList_DropletFileContext = TypeQualifierList_DropletFileContext; + +CParser.prototype.typeQualifierList_DropletFile = function() { + + var localctx = new TypeQualifierList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 284, CParser.RULE_typeQualifierList_DropletFile); + try { + this.state = 2315; + var la_ = this._interp.adaptivePredict(this._input,217,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2308; + this.typeQualifier(); + this.state = 2309; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2311; + this.typeQualifierList(0); + this.state = 2312; + this.typeQualifier(); + this.state = 2313; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ParameterTypeList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_parameterTypeList_DropletFile; + return this; +} + +ParameterTypeList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ParameterTypeList_DropletFileContext.prototype.constructor = ParameterTypeList_DropletFileContext; + +ParameterTypeList_DropletFileContext.prototype.parameterList = function() { + return this.getTypedRuleContext(ParameterListContext,0); +}; + +ParameterTypeList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ParameterTypeList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterParameterTypeList_DropletFile(this); + } +}; + +ParameterTypeList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitParameterTypeList_DropletFile(this); + } +}; + + + + +CParser.ParameterTypeList_DropletFileContext = ParameterTypeList_DropletFileContext; + +CParser.prototype.parameterTypeList_DropletFile = function() { + + var localctx = new ParameterTypeList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 286, CParser.RULE_parameterTypeList_DropletFile); + try { + this.state = 2325; + var la_ = this._interp.adaptivePredict(this._input,218,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2317; + this.parameterList(0); + this.state = 2318; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2320; + this.parameterList(0); + this.state = 2321; + this.match(CParser.Comma); + this.state = 2322; + this.match(CParser.Ellipsis); + this.state = 2323; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ParameterList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_parameterList_DropletFile; + return this; +} + +ParameterList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ParameterList_DropletFileContext.prototype.constructor = ParameterList_DropletFileContext; + +ParameterList_DropletFileContext.prototype.parameterDeclaration = function() { + return this.getTypedRuleContext(ParameterDeclarationContext,0); +}; + +ParameterList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ParameterList_DropletFileContext.prototype.parameterList = function() { + return this.getTypedRuleContext(ParameterListContext,0); +}; + +ParameterList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterParameterList_DropletFile(this); + } +}; + +ParameterList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitParameterList_DropletFile(this); + } +}; + + + + +CParser.ParameterList_DropletFileContext = ParameterList_DropletFileContext; + +CParser.prototype.parameterList_DropletFile = function() { + + var localctx = new ParameterList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 288, CParser.RULE_parameterList_DropletFile); + try { + this.state = 2335; + var la_ = this._interp.adaptivePredict(this._input,219,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2327; + this.parameterDeclaration(); + this.state = 2328; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2330; + this.parameterList(0); + this.state = 2331; + this.match(CParser.Comma); + this.state = 2332; + this.parameterDeclaration(); + this.state = 2333; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ParameterDeclaration_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_parameterDeclaration_DropletFile; + return this; +} + +ParameterDeclaration_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ParameterDeclaration_DropletFileContext.prototype.constructor = ParameterDeclaration_DropletFileContext; + +ParameterDeclaration_DropletFileContext.prototype.declarationSpecifiers = function() { + return this.getTypedRuleContext(DeclarationSpecifiersContext,0); +}; + +ParameterDeclaration_DropletFileContext.prototype.declarator = function() { + return this.getTypedRuleContext(DeclaratorContext,0); +}; + +ParameterDeclaration_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ParameterDeclaration_DropletFileContext.prototype.declarationSpecifiers2 = function() { + return this.getTypedRuleContext(DeclarationSpecifiers2Context,0); +}; + +ParameterDeclaration_DropletFileContext.prototype.abstractDeclarator = function() { + return this.getTypedRuleContext(AbstractDeclaratorContext,0); +}; + +ParameterDeclaration_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterParameterDeclaration_DropletFile(this); + } +}; + +ParameterDeclaration_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitParameterDeclaration_DropletFile(this); + } +}; + + + + +CParser.ParameterDeclaration_DropletFileContext = ParameterDeclaration_DropletFileContext; + +CParser.prototype.parameterDeclaration_DropletFile = function() { + + var localctx = new ParameterDeclaration_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 290, CParser.RULE_parameterDeclaration_DropletFile); + var _la = 0; // Token type + try { + this.state = 2347; + var la_ = this._interp.adaptivePredict(this._input,221,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2337; + this.declarationSpecifiers(); + this.state = 2338; + this.declarator(); + this.state = 2339; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2341; + this.declarationSpecifiers2(); + this.state = 2343; + _la = this._input.LA(1); + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.LeftBracket - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0)) { + this.state = 2342; + this.abstractDeclarator(); + } + + this.state = 2345; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function IdentifierList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_identifierList_DropletFile; + return this; +} + +IdentifierList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +IdentifierList_DropletFileContext.prototype.constructor = IdentifierList_DropletFileContext; + +IdentifierList_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +IdentifierList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +IdentifierList_DropletFileContext.prototype.identifierList = function() { + return this.getTypedRuleContext(IdentifierListContext,0); +}; + +IdentifierList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterIdentifierList_DropletFile(this); + } +}; + +IdentifierList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitIdentifierList_DropletFile(this); + } +}; + + + + +CParser.IdentifierList_DropletFileContext = IdentifierList_DropletFileContext; + +CParser.prototype.identifierList_DropletFile = function() { + + var localctx = new IdentifierList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 292, CParser.RULE_identifierList_DropletFile); + try { + this.state = 2356; + var la_ = this._interp.adaptivePredict(this._input,222,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2349; + this.match(CParser.Identifier); + this.state = 2350; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2351; + this.identifierList(0); + this.state = 2352; + this.match(CParser.Comma); + this.state = 2353; + this.match(CParser.Identifier); + this.state = 2354; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function TypeName_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_typeName_DropletFile; + return this; +} + +TypeName_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +TypeName_DropletFileContext.prototype.constructor = TypeName_DropletFileContext; + +TypeName_DropletFileContext.prototype.specifierQualifierList = function() { + return this.getTypedRuleContext(SpecifierQualifierListContext,0); +}; + +TypeName_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +TypeName_DropletFileContext.prototype.abstractDeclarator = function() { + return this.getTypedRuleContext(AbstractDeclaratorContext,0); +}; + +TypeName_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterTypeName_DropletFile(this); + } +}; + +TypeName_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitTypeName_DropletFile(this); + } +}; + + + + +CParser.TypeName_DropletFileContext = TypeName_DropletFileContext; + +CParser.prototype.typeName_DropletFile = function() { + + var localctx = new TypeName_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 294, CParser.RULE_typeName_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2358; + this.specifierQualifierList(); + this.state = 2360; + _la = this._input.LA(1); + if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.LeftBracket - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0)) { + this.state = 2359; + this.abstractDeclarator(); + } + + this.state = 2362; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function AbstractDeclarator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_abstractDeclarator_DropletFile; + return this; +} + +AbstractDeclarator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +AbstractDeclarator_DropletFileContext.prototype.constructor = AbstractDeclarator_DropletFileContext; + +AbstractDeclarator_DropletFileContext.prototype.pointer = function() { + return this.getTypedRuleContext(PointerContext,0); +}; + +AbstractDeclarator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +AbstractDeclarator_DropletFileContext.prototype.directAbstractDeclarator = function() { + return this.getTypedRuleContext(DirectAbstractDeclaratorContext,0); +}; + +AbstractDeclarator_DropletFileContext.prototype.gccDeclaratorExtension = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(GccDeclaratorExtensionContext); + } else { + return this.getTypedRuleContext(GccDeclaratorExtensionContext,i); + } +}; + +AbstractDeclarator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterAbstractDeclarator_DropletFile(this); + } +}; + +AbstractDeclarator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitAbstractDeclarator_DropletFile(this); + } +}; + + + + +CParser.AbstractDeclarator_DropletFileContext = AbstractDeclarator_DropletFileContext; + +CParser.prototype.abstractDeclarator_DropletFile = function() { + + var localctx = new AbstractDeclarator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 296, CParser.RULE_abstractDeclarator_DropletFile); + var _la = 0; // Token type + try { + this.state = 2379; + var la_ = this._interp.adaptivePredict(this._input,226,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2364; + this.pointer(); + this.state = 2365; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2368; + _la = this._input.LA(1); + if(_la===CParser.Star || _la===CParser.Caret) { + this.state = 2367; + this.pointer(); + } + + this.state = 2370; + this.directAbstractDeclarator(0); + this.state = 2374; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.T__10 || _la===CParser.T__11) { + this.state = 2371; + this.gccDeclaratorExtension(); + this.state = 2376; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 2377; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DirectAbstractDeclarator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_directAbstractDeclarator_DropletFile; + return this; +} + +DirectAbstractDeclarator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DirectAbstractDeclarator_DropletFileContext.prototype.constructor = DirectAbstractDeclarator_DropletFileContext; + +DirectAbstractDeclarator_DropletFileContext.prototype.abstractDeclarator = function() { + return this.getTypedRuleContext(AbstractDeclaratorContext,0); +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.gccDeclaratorExtension = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(GccDeclaratorExtensionContext); + } else { + return this.getTypedRuleContext(GccDeclaratorExtensionContext,i); + } +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.typeQualifierList = function() { + return this.getTypedRuleContext(TypeQualifierListContext,0); +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.parameterTypeList = function() { + return this.getTypedRuleContext(ParameterTypeListContext,0); +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.directAbstractDeclarator = function() { + return this.getTypedRuleContext(DirectAbstractDeclaratorContext,0); +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDirectAbstractDeclarator_DropletFile(this); + } +}; + +DirectAbstractDeclarator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDirectAbstractDeclarator_DropletFile(this); + } +}; + + + + +CParser.DirectAbstractDeclarator_DropletFileContext = DirectAbstractDeclarator_DropletFileContext; + +CParser.prototype.directAbstractDeclarator_DropletFile = function() { + + var localctx = new DirectAbstractDeclarator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 298, CParser.RULE_directAbstractDeclarator_DropletFile); + var _la = 0; // Token type + try { + this.state = 2482; + var la_ = this._interp.adaptivePredict(this._input,238,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2381; + this.match(CParser.LeftParen); + this.state = 2382; + this.abstractDeclarator(); + this.state = 2383; + this.match(CParser.RightParen); + this.state = 2387; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.T__10 || _la===CParser.T__11) { + this.state = 2384; + this.gccDeclaratorExtension(); + this.state = 2389; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 2390; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2392; + this.match(CParser.LeftBracket); + this.state = 2394; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2393; + this.typeQualifierList(0); + } + + this.state = 2397; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2396; + this.assignmentExpression(); + } + + this.state = 2399; + this.match(CParser.RightBracket); + this.state = 2400; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2401; + this.match(CParser.LeftBracket); + this.state = 2402; + this.match(CParser.Static); + this.state = 2404; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2403; + this.typeQualifierList(0); + } + + this.state = 2406; + this.assignmentExpression(); + this.state = 2407; + this.match(CParser.RightBracket); + this.state = 2408; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2410; + this.match(CParser.LeftBracket); + this.state = 2411; + this.typeQualifierList(0); + this.state = 2412; + this.match(CParser.Static); + this.state = 2413; + this.assignmentExpression(); + this.state = 2414; + this.match(CParser.RightBracket); + this.state = 2415; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2417; + this.match(CParser.LeftBracket); + this.state = 2418; + this.match(CParser.Star); + this.state = 2419; + this.match(CParser.RightBracket); + this.state = 2420; + this.match(CParser.EOF); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 2421; + this.match(CParser.LeftParen); + this.state = 2423; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 2422; + this.parameterTypeList(); + } + + this.state = 2425; + this.match(CParser.RightParen); + this.state = 2429; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.T__10 || _la===CParser.T__11) { + this.state = 2426; + this.gccDeclaratorExtension(); + this.state = 2431; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 2432; + this.match(CParser.EOF); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 2433; + this.directAbstractDeclarator(0); + this.state = 2434; + this.match(CParser.LeftBracket); + this.state = 2436; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2435; + this.typeQualifierList(0); + } + + this.state = 2439; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2438; + this.assignmentExpression(); + } + + this.state = 2441; + this.match(CParser.RightBracket); + this.state = 2442; + this.match(CParser.EOF); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 2444; + this.directAbstractDeclarator(0); + this.state = 2445; + this.match(CParser.LeftBracket); + this.state = 2446; + this.match(CParser.Static); + this.state = 2448; + _la = this._input.LA(1); + if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) { + this.state = 2447; + this.typeQualifierList(0); + } + + this.state = 2450; + this.assignmentExpression(); + this.state = 2451; + this.match(CParser.RightBracket); + this.state = 2452; + this.match(CParser.EOF); + break; + + case 9: + this.enterOuterAlt(localctx, 9); + this.state = 2454; + this.directAbstractDeclarator(0); + this.state = 2455; + this.match(CParser.LeftBracket); + this.state = 2456; + this.typeQualifierList(0); + this.state = 2457; + this.match(CParser.Static); + this.state = 2458; + this.assignmentExpression(); + this.state = 2459; + this.match(CParser.RightBracket); + this.state = 2460; + this.match(CParser.EOF); + break; + + case 10: + this.enterOuterAlt(localctx, 10); + this.state = 2462; + this.directAbstractDeclarator(0); + this.state = 2463; + this.match(CParser.LeftBracket); + this.state = 2464; + this.match(CParser.Star); + this.state = 2465; + this.match(CParser.RightBracket); + this.state = 2466; + this.match(CParser.EOF); + break; + + case 11: + this.enterOuterAlt(localctx, 11); + this.state = 2468; + this.directAbstractDeclarator(0); + this.state = 2469; + this.match(CParser.LeftParen); + this.state = 2471; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 2470; + this.parameterTypeList(); + } + + this.state = 2473; + this.match(CParser.RightParen); + this.state = 2477; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.T__10 || _la===CParser.T__11) { + this.state = 2474; + this.gccDeclaratorExtension(); + this.state = 2479; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 2480; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function TypedefName_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_typedefName_DropletFile; + return this; +} + +TypedefName_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +TypedefName_DropletFileContext.prototype.constructor = TypedefName_DropletFileContext; + +TypedefName_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +TypedefName_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +TypedefName_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterTypedefName_DropletFile(this); + } +}; + +TypedefName_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitTypedefName_DropletFile(this); + } +}; + + + + +CParser.TypedefName_DropletFileContext = TypedefName_DropletFileContext; + +CParser.prototype.typedefName_DropletFile = function() { + + var localctx = new TypedefName_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 300, CParser.RULE_typedefName_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2484; + this.match(CParser.Identifier); + this.state = 2485; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Initializer_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_initializer_DropletFile; + return this; +} + +Initializer_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Initializer_DropletFileContext.prototype.constructor = Initializer_DropletFileContext; + +Initializer_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +Initializer_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Initializer_DropletFileContext.prototype.initializerList = function() { + return this.getTypedRuleContext(InitializerListContext,0); +}; + +Initializer_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterInitializer_DropletFile(this); + } +}; + +Initializer_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitInitializer_DropletFile(this); + } +}; + + + + +CParser.Initializer_DropletFileContext = Initializer_DropletFileContext; + +CParser.prototype.initializer_DropletFile = function() { + + var localctx = new Initializer_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 302, CParser.RULE_initializer_DropletFile); + try { + this.state = 2501; + var la_ = this._interp.adaptivePredict(this._input,239,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2487; + this.assignmentExpression(); + this.state = 2488; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2490; + this.match(CParser.LeftBrace); + this.state = 2491; + this.initializerList(0); + this.state = 2492; + this.match(CParser.RightBrace); + this.state = 2493; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2495; + this.match(CParser.LeftBrace); + this.state = 2496; + this.initializerList(0); + this.state = 2497; + this.match(CParser.Comma); + this.state = 2498; + this.match(CParser.RightBrace); + this.state = 2499; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function InitializerList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_initializerList_DropletFile; + return this; +} + +InitializerList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +InitializerList_DropletFileContext.prototype.constructor = InitializerList_DropletFileContext; + +InitializerList_DropletFileContext.prototype.initializer = function() { + return this.getTypedRuleContext(InitializerContext,0); +}; + +InitializerList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +InitializerList_DropletFileContext.prototype.designation = function() { + return this.getTypedRuleContext(DesignationContext,0); +}; + +InitializerList_DropletFileContext.prototype.initializerList = function() { + return this.getTypedRuleContext(InitializerListContext,0); +}; + +InitializerList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterInitializerList_DropletFile(this); + } +}; + +InitializerList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitInitializerList_DropletFile(this); + } +}; + + + + +CParser.InitializerList_DropletFileContext = InitializerList_DropletFileContext; + +CParser.prototype.initializerList_DropletFile = function() { + + var localctx = new InitializerList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 304, CParser.RULE_initializerList_DropletFile); + var _la = 0; // Token type + try { + this.state = 2517; + var la_ = this._interp.adaptivePredict(this._input,242,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2504; + _la = this._input.LA(1); + if(_la===CParser.LeftBracket || _la===CParser.Dot) { + this.state = 2503; + this.designation(); + } + + this.state = 2506; + this.initializer(); + this.state = 2507; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2509; + this.initializerList(0); + this.state = 2510; + this.match(CParser.Comma); + this.state = 2512; + _la = this._input.LA(1); + if(_la===CParser.LeftBracket || _la===CParser.Dot) { + this.state = 2511; + this.designation(); + } + + this.state = 2514; + this.initializer(); + this.state = 2515; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Designation_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_designation_DropletFile; + return this; +} + +Designation_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Designation_DropletFileContext.prototype.constructor = Designation_DropletFileContext; + +Designation_DropletFileContext.prototype.designatorList = function() { + return this.getTypedRuleContext(DesignatorListContext,0); +}; + +Designation_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Designation_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDesignation_DropletFile(this); + } +}; + +Designation_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDesignation_DropletFile(this); + } +}; + + + + +CParser.Designation_DropletFileContext = Designation_DropletFileContext; + +CParser.prototype.designation_DropletFile = function() { + + var localctx = new Designation_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 306, CParser.RULE_designation_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2519; + this.designatorList(0); + this.state = 2520; + this.match(CParser.Assign); + this.state = 2521; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DesignatorList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_designatorList_DropletFile; + return this; +} + +DesignatorList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DesignatorList_DropletFileContext.prototype.constructor = DesignatorList_DropletFileContext; + +DesignatorList_DropletFileContext.prototype.designator = function() { + return this.getTypedRuleContext(DesignatorContext,0); +}; + +DesignatorList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +DesignatorList_DropletFileContext.prototype.designatorList = function() { + return this.getTypedRuleContext(DesignatorListContext,0); +}; + +DesignatorList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDesignatorList_DropletFile(this); + } +}; + +DesignatorList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDesignatorList_DropletFile(this); + } +}; + + + + +CParser.DesignatorList_DropletFileContext = DesignatorList_DropletFileContext; + +CParser.prototype.designatorList_DropletFile = function() { + + var localctx = new DesignatorList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 308, CParser.RULE_designatorList_DropletFile); + try { + this.state = 2530; + var la_ = this._interp.adaptivePredict(this._input,243,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2523; + this.designator(); + this.state = 2524; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2526; + this.designatorList(0); + this.state = 2527; + this.designator(); + this.state = 2528; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Designator_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_designator_DropletFile; + return this; +} + +Designator_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Designator_DropletFileContext.prototype.constructor = Designator_DropletFileContext; + +Designator_DropletFileContext.prototype.constantExpression = function() { + return this.getTypedRuleContext(ConstantExpressionContext,0); +}; + +Designator_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Designator_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +Designator_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDesignator_DropletFile(this); + } +}; + +Designator_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDesignator_DropletFile(this); + } +}; + + + + +CParser.Designator_DropletFileContext = Designator_DropletFileContext; + +CParser.prototype.designator_DropletFile = function() { + + var localctx = new Designator_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 310, CParser.RULE_designator_DropletFile); + try { + this.state = 2540; + switch(this._input.LA(1)) { + case CParser.LeftBracket: + this.enterOuterAlt(localctx, 1); + this.state = 2532; + this.match(CParser.LeftBracket); + this.state = 2533; + this.constantExpression(); + this.state = 2534; + this.match(CParser.RightBracket); + this.state = 2535; + this.match(CParser.EOF); + break; + case CParser.Dot: + this.enterOuterAlt(localctx, 2); + this.state = 2537; + this.match(CParser.Dot); + this.state = 2538; + this.match(CParser.Identifier); + this.state = 2539; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function StaticAssertDeclaration_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_staticAssertDeclaration_DropletFile; + return this; +} + +StaticAssertDeclaration_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +StaticAssertDeclaration_DropletFileContext.prototype.constructor = StaticAssertDeclaration_DropletFileContext; + +StaticAssertDeclaration_DropletFileContext.prototype.constantExpression = function() { + return this.getTypedRuleContext(ConstantExpressionContext,0); +}; + +StaticAssertDeclaration_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +StaticAssertDeclaration_DropletFileContext.prototype.StringLiteral = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CParser.StringLiteral); + } else { + return this.getToken(CParser.StringLiteral, i); + } +}; + + +StaticAssertDeclaration_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStaticAssertDeclaration_DropletFile(this); + } +}; + +StaticAssertDeclaration_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStaticAssertDeclaration_DropletFile(this); + } +}; + + + + +CParser.StaticAssertDeclaration_DropletFileContext = StaticAssertDeclaration_DropletFileContext; + +CParser.prototype.staticAssertDeclaration_DropletFile = function() { + + var localctx = new StaticAssertDeclaration_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 312, CParser.RULE_staticAssertDeclaration_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2542; + this.match(CParser.StaticAssert); + this.state = 2543; + this.match(CParser.LeftParen); + this.state = 2544; + this.constantExpression(); + this.state = 2545; + this.match(CParser.Comma); + this.state = 2547; + this._errHandler.sync(this); + _la = this._input.LA(1); + do { + this.state = 2546; + this.match(CParser.StringLiteral); + this.state = 2549; + this._errHandler.sync(this); + _la = this._input.LA(1); + } while(_la===CParser.StringLiteral); + this.state = 2551; + this.match(CParser.RightParen); + this.state = 2552; + this.match(CParser.Semi); + this.state = 2553; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function Statement_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_statement_DropletFile; + return this; +} + +Statement_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +Statement_DropletFileContext.prototype.constructor = Statement_DropletFileContext; + +Statement_DropletFileContext.prototype.labeledStatement = function() { + return this.getTypedRuleContext(LabeledStatementContext,0); +}; + +Statement_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +Statement_DropletFileContext.prototype.compoundStatement = function() { + return this.getTypedRuleContext(CompoundStatementContext,0); +}; + +Statement_DropletFileContext.prototype.expressionStatement = function() { + return this.getTypedRuleContext(ExpressionStatementContext,0); +}; + +Statement_DropletFileContext.prototype.selectionStatement = function() { + return this.getTypedRuleContext(SelectionStatementContext,0); +}; + +Statement_DropletFileContext.prototype.iterationStatement = function() { + return this.getTypedRuleContext(IterationStatementContext,0); +}; + +Statement_DropletFileContext.prototype.jumpStatement = function() { + return this.getTypedRuleContext(JumpStatementContext,0); +}; + +Statement_DropletFileContext.prototype.logicalOrExpression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(LogicalOrExpressionContext); + } else { + return this.getTypedRuleContext(LogicalOrExpressionContext,i); + } +}; + +Statement_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterStatement_DropletFile(this); + } +}; + +Statement_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitStatement_DropletFile(this); + } +}; + + + + +CParser.Statement_DropletFileContext = Statement_DropletFileContext; + +CParser.prototype.statement_DropletFile = function() { + + var localctx = new Statement_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 314, CParser.RULE_statement_DropletFile); + var _la = 0; // Token type + try { + this.state = 2605; + var la_ = this._interp.adaptivePredict(this._input,251,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2555; + this.labeledStatement(); + this.state = 2556; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2558; + this.compoundStatement(); + this.state = 2559; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2561; + this.expressionStatement(); + this.state = 2562; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2564; + this.selectionStatement(); + this.state = 2565; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2567; + this.iterationStatement(); + this.state = 2568; + this.match(CParser.EOF); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 2570; + this.jumpStatement(); + this.state = 2571; + this.match(CParser.EOF); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 2573; + _la = this._input.LA(1); + if(!(_la===CParser.T__10 || _la===CParser.T__12)) { + this._errHandler.recoverInline(this); + } + else { + this.consume(); + } + this.state = 2574; + _la = this._input.LA(1); + if(!(_la===CParser.T__13 || _la===CParser.Volatile)) { + this._errHandler.recoverInline(this); + } + else { + this.consume(); + } + this.state = 2575; + this.match(CParser.LeftParen); + this.state = 2584; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2576; + this.logicalOrExpression(0); + this.state = 2581; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.Comma) { + this.state = 2577; + this.match(CParser.Comma); + this.state = 2578; + this.logicalOrExpression(0); + this.state = 2583; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } + + this.state = 2599; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.Colon) { + this.state = 2586; + this.match(CParser.Colon); + this.state = 2595; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2587; + this.logicalOrExpression(0); + this.state = 2592; + this._errHandler.sync(this); + _la = this._input.LA(1); + while(_la===CParser.Comma) { + this.state = 2588; + this.match(CParser.Comma); + this.state = 2589; + this.logicalOrExpression(0); + this.state = 2594; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } + + this.state = 2601; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 2602; + this.match(CParser.RightParen); + this.state = 2603; + this.match(CParser.Semi); + this.state = 2604; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function LabeledStatement_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_labeledStatement_DropletFile; + return this; +} + +LabeledStatement_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +LabeledStatement_DropletFileContext.prototype.constructor = LabeledStatement_DropletFileContext; + +LabeledStatement_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +LabeledStatement_DropletFileContext.prototype.statement = function() { + return this.getTypedRuleContext(StatementContext,0); +}; + +LabeledStatement_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +LabeledStatement_DropletFileContext.prototype.constantExpression = function() { + return this.getTypedRuleContext(ConstantExpressionContext,0); +}; + +LabeledStatement_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterLabeledStatement_DropletFile(this); + } +}; + +LabeledStatement_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitLabeledStatement_DropletFile(this); + } +}; + + + + +CParser.LabeledStatement_DropletFileContext = LabeledStatement_DropletFileContext; + +CParser.prototype.labeledStatement_DropletFile = function() { + + var localctx = new LabeledStatement_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 316, CParser.RULE_labeledStatement_DropletFile); + try { + this.state = 2623; + switch(this._input.LA(1)) { + case CParser.Identifier: + this.enterOuterAlt(localctx, 1); + this.state = 2607; + this.match(CParser.Identifier); + this.state = 2608; + this.match(CParser.Colon); + this.state = 2609; + this.statement(); + this.state = 2610; + this.match(CParser.EOF); + break; + case CParser.Case: + this.enterOuterAlt(localctx, 2); + this.state = 2612; + this.match(CParser.Case); + this.state = 2613; + this.constantExpression(); + this.state = 2614; + this.match(CParser.Colon); + this.state = 2615; + this.statement(); + this.state = 2616; + this.match(CParser.EOF); + break; + case CParser.Default: + this.enterOuterAlt(localctx, 3); + this.state = 2618; + this.match(CParser.Default); + this.state = 2619; + this.match(CParser.Colon); + this.state = 2620; + this.statement(); + this.state = 2621; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function CompoundStatement_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_compoundStatement_DropletFile; + return this; +} + +CompoundStatement_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +CompoundStatement_DropletFileContext.prototype.constructor = CompoundStatement_DropletFileContext; + +CompoundStatement_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +CompoundStatement_DropletFileContext.prototype.blockItemList = function() { + return this.getTypedRuleContext(BlockItemListContext,0); +}; + +CompoundStatement_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterCompoundStatement_DropletFile(this); + } +}; + +CompoundStatement_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitCompoundStatement_DropletFile(this); + } +}; + + + + +CParser.CompoundStatement_DropletFileContext = CompoundStatement_DropletFileContext; + +CParser.prototype.compoundStatement_DropletFile = function() { + + var localctx = new CompoundStatement_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 318, CParser.RULE_compoundStatement_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2625; + this.match(CParser.LeftBrace); + this.state = 2627; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)) | (1 << (CParser.Semi - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2626; + this.blockItemList(0); + } + + this.state = 2629; + this.match(CParser.RightBrace); + this.state = 2630; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function BlockItemList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_blockItemList_DropletFile; + return this; +} + +BlockItemList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +BlockItemList_DropletFileContext.prototype.constructor = BlockItemList_DropletFileContext; + +BlockItemList_DropletFileContext.prototype.blockItem = function() { + return this.getTypedRuleContext(BlockItemContext,0); +}; + +BlockItemList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +BlockItemList_DropletFileContext.prototype.blockItemList = function() { + return this.getTypedRuleContext(BlockItemListContext,0); +}; + +BlockItemList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterBlockItemList_DropletFile(this); + } +}; + +BlockItemList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitBlockItemList_DropletFile(this); + } +}; + + + + +CParser.BlockItemList_DropletFileContext = BlockItemList_DropletFileContext; + +CParser.prototype.blockItemList_DropletFile = function() { + + var localctx = new BlockItemList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 320, CParser.RULE_blockItemList_DropletFile); + try { + this.state = 2639; + var la_ = this._interp.adaptivePredict(this._input,254,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2632; + this.blockItem(); + this.state = 2633; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2635; + this.blockItemList(0); + this.state = 2636; + this.blockItem(); + this.state = 2637; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function BlockItem_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_blockItem_DropletFile; + return this; +} + +BlockItem_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +BlockItem_DropletFileContext.prototype.constructor = BlockItem_DropletFileContext; + +BlockItem_DropletFileContext.prototype.specialMethodCall = function() { + return this.getTypedRuleContext(SpecialMethodCallContext,0); +}; + +BlockItem_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +BlockItem_DropletFileContext.prototype.declaration = function() { + return this.getTypedRuleContext(DeclarationContext,0); +}; + +BlockItem_DropletFileContext.prototype.statement = function() { + return this.getTypedRuleContext(StatementContext,0); +}; + +BlockItem_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterBlockItem_DropletFile(this); + } +}; + +BlockItem_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitBlockItem_DropletFile(this); + } +}; + + + + +CParser.BlockItem_DropletFileContext = BlockItem_DropletFileContext; + +CParser.prototype.blockItem_DropletFile = function() { + + var localctx = new BlockItem_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 322, CParser.RULE_blockItem_DropletFile); + try { + this.state = 2651; + var la_ = this._interp.adaptivePredict(this._input,255,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2641; + this.specialMethodCall(); + this.state = 2642; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2644; + this.declaration(); + this.state = 2645; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2647; + this.statement(); + this.state = 2648; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2650; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function SpecialMethodCall_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_specialMethodCall_DropletFile; + return this; +} + +SpecialMethodCall_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +SpecialMethodCall_DropletFileContext.prototype.constructor = SpecialMethodCall_DropletFileContext; + +SpecialMethodCall_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +SpecialMethodCall_DropletFileContext.prototype.assignmentExpression = function() { + return this.getTypedRuleContext(AssignmentExpressionContext,0); +}; + +SpecialMethodCall_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +SpecialMethodCall_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterSpecialMethodCall_DropletFile(this); + } +}; + +SpecialMethodCall_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitSpecialMethodCall_DropletFile(this); + } +}; + + + + +CParser.SpecialMethodCall_DropletFileContext = SpecialMethodCall_DropletFileContext; + +CParser.prototype.specialMethodCall_DropletFile = function() { + + var localctx = new SpecialMethodCall_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 324, CParser.RULE_specialMethodCall_DropletFile); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2653; + this.match(CParser.Identifier); + this.state = 2654; + this.match(CParser.LeftParen); + this.state = 2655; + this.assignmentExpression(); + this.state = 2656; + this.match(CParser.RightParen); + this.state = 2657; + this.match(CParser.Semi); + this.state = 2658; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ExpressionStatement_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_expressionStatement_DropletFile; + return this; +} + +ExpressionStatement_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ExpressionStatement_DropletFileContext.prototype.constructor = ExpressionStatement_DropletFileContext; + +ExpressionStatement_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ExpressionStatement_DropletFileContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +ExpressionStatement_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterExpressionStatement_DropletFile(this); + } +}; + +ExpressionStatement_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitExpressionStatement_DropletFile(this); + } +}; + + + + +CParser.ExpressionStatement_DropletFileContext = ExpressionStatement_DropletFileContext; + +CParser.prototype.expressionStatement_DropletFile = function() { + + var localctx = new ExpressionStatement_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 326, CParser.RULE_expressionStatement_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2661; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2660; + this.expression(0); + } + + this.state = 2663; + this.match(CParser.Semi); + this.state = 2664; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function SelectionStatement_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_selectionStatement_DropletFile; + return this; +} + +SelectionStatement_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +SelectionStatement_DropletFileContext.prototype.constructor = SelectionStatement_DropletFileContext; + +SelectionStatement_DropletFileContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +SelectionStatement_DropletFileContext.prototype.statement = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(StatementContext); + } else { + return this.getTypedRuleContext(StatementContext,i); + } +}; + +SelectionStatement_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +SelectionStatement_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterSelectionStatement_DropletFile(this); + } +}; + +SelectionStatement_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitSelectionStatement_DropletFile(this); + } +}; + + + + +CParser.SelectionStatement_DropletFileContext = SelectionStatement_DropletFileContext; + +CParser.prototype.selectionStatement_DropletFile = function() { + + var localctx = new SelectionStatement_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 328, CParser.RULE_selectionStatement_DropletFile); + var _la = 0; // Token type + try { + this.state = 2684; + switch(this._input.LA(1)) { + case CParser.If: + this.enterOuterAlt(localctx, 1); + this.state = 2666; + this.match(CParser.If); + this.state = 2667; + this.match(CParser.LeftParen); + this.state = 2668; + this.expression(0); + this.state = 2669; + this.match(CParser.RightParen); + this.state = 2670; + this.statement(); + this.state = 2673; + _la = this._input.LA(1); + if(_la===CParser.Else) { + this.state = 2671; + this.match(CParser.Else); + this.state = 2672; + this.statement(); + } + + this.state = 2675; + this.match(CParser.EOF); + break; + case CParser.Switch: + this.enterOuterAlt(localctx, 2); + this.state = 2677; + this.match(CParser.Switch); + this.state = 2678; + this.match(CParser.LeftParen); + this.state = 2679; + this.expression(0); + this.state = 2680; + this.match(CParser.RightParen); + this.state = 2681; + this.statement(); + this.state = 2682; + this.match(CParser.EOF); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function IterationStatement_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_iterationStatement_DropletFile; + return this; +} + +IterationStatement_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +IterationStatement_DropletFileContext.prototype.constructor = IterationStatement_DropletFileContext; + +IterationStatement_DropletFileContext.prototype.expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } +}; + +IterationStatement_DropletFileContext.prototype.statement = function() { + return this.getTypedRuleContext(StatementContext,0); +}; + +IterationStatement_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +IterationStatement_DropletFileContext.prototype.declaration = function() { + return this.getTypedRuleContext(DeclarationContext,0); +}; + +IterationStatement_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterIterationStatement_DropletFile(this); + } +}; + +IterationStatement_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitIterationStatement_DropletFile(this); + } +}; + + + + +CParser.IterationStatement_DropletFileContext = IterationStatement_DropletFileContext; + +CParser.prototype.iterationStatement_DropletFile = function() { + + var localctx = new IterationStatement_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 330, CParser.RULE_iterationStatement_DropletFile); + var _la = 0; // Token type + try { + this.state = 2733; + var la_ = this._interp.adaptivePredict(this._input,264,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2686; + this.match(CParser.While); + this.state = 2687; + this.match(CParser.LeftParen); + this.state = 2688; + this.expression(0); + this.state = 2689; + this.match(CParser.RightParen); + this.state = 2690; + this.statement(); + this.state = 2691; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2693; + this.match(CParser.Do); + this.state = 2694; + this.statement(); + this.state = 2695; + this.match(CParser.While); + this.state = 2696; + this.match(CParser.LeftParen); + this.state = 2697; + this.expression(0); + this.state = 2698; + this.match(CParser.RightParen); + this.state = 2699; + this.match(CParser.Semi); + this.state = 2700; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2702; + this.match(CParser.For); + this.state = 2703; + this.match(CParser.LeftParen); + this.state = 2705; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2704; + this.expression(0); + } + + this.state = 2707; + this.match(CParser.Semi); + this.state = 2709; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2708; + this.expression(0); + } + + this.state = 2711; + this.match(CParser.Semi); + this.state = 2713; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2712; + this.expression(0); + } + + this.state = 2715; + this.match(CParser.RightParen); + this.state = 2716; + this.statement(); + this.state = 2717; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2719; + this.match(CParser.For); + this.state = 2720; + this.match(CParser.LeftParen); + this.state = 2721; + this.declaration(); + this.state = 2723; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2722; + this.expression(0); + } + + this.state = 2725; + this.match(CParser.Semi); + this.state = 2727; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2726; + this.expression(0); + } + + this.state = 2729; + this.match(CParser.RightParen); + this.state = 2730; + this.statement(); + this.state = 2731; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function JumpStatement_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_jumpStatement_DropletFile; + return this; +} + +JumpStatement_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +JumpStatement_DropletFileContext.prototype.constructor = JumpStatement_DropletFileContext; + +JumpStatement_DropletFileContext.prototype.Identifier = function() { + return this.getToken(CParser.Identifier, 0); +}; + +JumpStatement_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +JumpStatement_DropletFileContext.prototype.expression = function() { + return this.getTypedRuleContext(ExpressionContext,0); +}; + +JumpStatement_DropletFileContext.prototype.unaryExpression = function() { + return this.getTypedRuleContext(UnaryExpressionContext,0); +}; + +JumpStatement_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterJumpStatement_DropletFile(this); + } +}; + +JumpStatement_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitJumpStatement_DropletFile(this); + } +}; + + + + +CParser.JumpStatement_DropletFileContext = JumpStatement_DropletFileContext; + +CParser.prototype.jumpStatement_DropletFile = function() { + + var localctx = new JumpStatement_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 332, CParser.RULE_jumpStatement_DropletFile); + var _la = 0; // Token type + try { + this.state = 2755; + var la_ = this._interp.adaptivePredict(this._input,266,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2735; + this.match(CParser.Goto); + this.state = 2736; + this.match(CParser.Identifier); + this.state = 2737; + this.match(CParser.Semi); + this.state = 2738; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2739; + this.match(CParser.Continue); + this.state = 2740; + this.match(CParser.Semi); + this.state = 2741; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2742; + this.match(CParser.Break); + this.state = 2743; + this.match(CParser.Semi); + this.state = 2744; + this.match(CParser.EOF); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2745; + this.match(CParser.Return); + this.state = 2747; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) { + this.state = 2746; + this.expression(0); + } + + this.state = 2749; + this.match(CParser.Semi); + this.state = 2750; + this.match(CParser.EOF); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2751; + this.match(CParser.Goto); + this.state = 2752; + this.unaryExpression(); + this.state = 2753; + this.match(CParser.Semi); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function CompilationUnit_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_compilationUnit_DropletFile; + return this; +} + +CompilationUnit_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +CompilationUnit_DropletFileContext.prototype.constructor = CompilationUnit_DropletFileContext; + +CompilationUnit_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +CompilationUnit_DropletFileContext.prototype.translationUnit = function() { + return this.getTypedRuleContext(TranslationUnitContext,0); +}; + +CompilationUnit_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterCompilationUnit_DropletFile(this); + } +}; + +CompilationUnit_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitCompilationUnit_DropletFile(this); + } +}; + + + + +CParser.CompilationUnit_DropletFileContext = CompilationUnit_DropletFileContext; + +CParser.prototype.compilationUnit_DropletFile = function() { + + var localctx = new CompilationUnit_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 334, CParser.RULE_compilationUnit_DropletFile); + var _la = 0; // Token type + try { + this.state = 2762; + var la_ = this._interp.adaptivePredict(this._input,268,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2758; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) { + this.state = 2757; + this.translationUnit(0); + } + + this.state = 2760; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2761; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function TranslationUnit_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_translationUnit_DropletFile; + return this; +} + +TranslationUnit_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +TranslationUnit_DropletFileContext.prototype.constructor = TranslationUnit_DropletFileContext; + +TranslationUnit_DropletFileContext.prototype.externalDeclaration = function() { + return this.getTypedRuleContext(ExternalDeclarationContext,0); +}; + +TranslationUnit_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +TranslationUnit_DropletFileContext.prototype.translationUnit = function() { + return this.getTypedRuleContext(TranslationUnitContext,0); +}; + +TranslationUnit_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterTranslationUnit_DropletFile(this); + } +}; + +TranslationUnit_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitTranslationUnit_DropletFile(this); + } +}; + + + + +CParser.TranslationUnit_DropletFileContext = TranslationUnit_DropletFileContext; + +CParser.prototype.translationUnit_DropletFile = function() { + + var localctx = new TranslationUnit_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 336, CParser.RULE_translationUnit_DropletFile); + try { + this.state = 2771; + var la_ = this._interp.adaptivePredict(this._input,269,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2764; + this.externalDeclaration(); + this.state = 2765; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2767; + this.translationUnit(0); + this.state = 2768; + this.externalDeclaration(); + this.state = 2769; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function ExternalDeclaration_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_externalDeclaration_DropletFile; + return this; +} + +ExternalDeclaration_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +ExternalDeclaration_DropletFileContext.prototype.constructor = ExternalDeclaration_DropletFileContext; + +ExternalDeclaration_DropletFileContext.prototype.functionDefinition = function() { + return this.getTypedRuleContext(FunctionDefinitionContext,0); +}; + +ExternalDeclaration_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +ExternalDeclaration_DropletFileContext.prototype.declaration = function() { + return this.getTypedRuleContext(DeclarationContext,0); +}; + +ExternalDeclaration_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterExternalDeclaration_DropletFile(this); + } +}; + +ExternalDeclaration_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitExternalDeclaration_DropletFile(this); + } +}; + + + + +CParser.ExternalDeclaration_DropletFileContext = ExternalDeclaration_DropletFileContext; + +CParser.prototype.externalDeclaration_DropletFile = function() { + + var localctx = new ExternalDeclaration_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 338, CParser.RULE_externalDeclaration_DropletFile); + try { + this.state = 2780; + var la_ = this._interp.adaptivePredict(this._input,270,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2773; + this.functionDefinition(); + this.state = 2774; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2776; + this.declaration(); + this.state = 2777; + this.match(CParser.EOF); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2779; + this.match(CParser.Semi); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function FunctionDefinition_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_functionDefinition_DropletFile; + return this; +} + +FunctionDefinition_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +FunctionDefinition_DropletFileContext.prototype.constructor = FunctionDefinition_DropletFileContext; + +FunctionDefinition_DropletFileContext.prototype.declarator = function() { + return this.getTypedRuleContext(DeclaratorContext,0); +}; + +FunctionDefinition_DropletFileContext.prototype.compoundStatement = function() { + return this.getTypedRuleContext(CompoundStatementContext,0); +}; + +FunctionDefinition_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +FunctionDefinition_DropletFileContext.prototype.declarationSpecifiers = function() { + return this.getTypedRuleContext(DeclarationSpecifiersContext,0); +}; + +FunctionDefinition_DropletFileContext.prototype.declarationList = function() { + return this.getTypedRuleContext(DeclarationListContext,0); +}; + +FunctionDefinition_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterFunctionDefinition_DropletFile(this); + } +}; + +FunctionDefinition_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitFunctionDefinition_DropletFile(this); + } +}; + + + + +CParser.FunctionDefinition_DropletFileContext = FunctionDefinition_DropletFileContext; + +CParser.prototype.functionDefinition_DropletFile = function() { + + var localctx = new FunctionDefinition_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 340, CParser.RULE_functionDefinition_DropletFile); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2783; + var la_ = this._interp.adaptivePredict(this._input,271,this._ctx); + if(la_===1) { + this.state = 2782; + this.declarationSpecifiers(); + + } + this.state = 2785; + this.declarator(); + this.state = 2787; + _la = this._input.LA(1); + if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) { + this.state = 2786; + this.declarationList(0); + } + + this.state = 2789; + this.compoundStatement(); + this.state = 2790; + this.match(CParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + +function DeclarationList_DropletFileContext(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + antlr4.ParserRuleContext.call(this, parent, invokingState); + this.parser = parser; + this.ruleIndex = CParser.RULE_declarationList_DropletFile; + return this; +} + +DeclarationList_DropletFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype); +DeclarationList_DropletFileContext.prototype.constructor = DeclarationList_DropletFileContext; + +DeclarationList_DropletFileContext.prototype.declaration = function() { + return this.getTypedRuleContext(DeclarationContext,0); +}; + +DeclarationList_DropletFileContext.prototype.EOF = function() { + return this.getToken(CParser.EOF, 0); +}; + +DeclarationList_DropletFileContext.prototype.declarationList = function() { + return this.getTypedRuleContext(DeclarationListContext,0); +}; + +DeclarationList_DropletFileContext.prototype.enterRule = function(listener) { + if(listener instanceof CListener ) { + listener.enterDeclarationList_DropletFile(this); + } +}; + +DeclarationList_DropletFileContext.prototype.exitRule = function(listener) { + if(listener instanceof CListener ) { + listener.exitDeclarationList_DropletFile(this); + } +}; + + + + +CParser.DeclarationList_DropletFileContext = DeclarationList_DropletFileContext; + +CParser.prototype.declarationList_DropletFile = function() { + + var localctx = new DeclarationList_DropletFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 342, CParser.RULE_declarationList_DropletFile); + try { + this.state = 2799; + var la_ = this._interp.adaptivePredict(this._input,273,this._ctx); + switch(la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2792; + this.declaration(); + this.state = 2793; + this.match(CParser.EOF); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2795; + this.declarationList(0); + this.state = 2796; + this.declaration(); + this.state = 2797; + this.match(CParser.EOF); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; +}; + CParser.prototype.sempred = function(localctx, ruleIndex, predIndex) { switch(ruleIndex) { diff --git a/src/antlr.coffee b/src/antlr.coffee index fa8dfd38..623dd41a 100644 --- a/src/antlr.coffee +++ b/src/antlr.coffee @@ -32,7 +32,7 @@ exports.createANTLRParser = (name, config, root) -> # Build the actual parse tree parser.buildParseTrees = true - return transform parser[context]() + return transform parser[context + '_DropletFile']() # Transform an ANTLR tree into a treewalker-type tree transform = (node, parent = null) -> @@ -54,6 +54,9 @@ exports.createANTLRParser = (name, config, root) -> else result.type = node.parser.ruleNames[node.ruleIndex] result.data = {} + if result.type? and result.type[-'_DropletFile'.length...] is '_DropletFile' + result.type = result.type[...-'_DropletFile'.length] + result.children.pop() return result diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 88e3c423..aa7b6847 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -57,12 +57,6 @@ exports.createTreewalkParser = (parse, config, root) -> detNode: (node) -> if node.blockified then 'block' else @det(node) - getDropType: (context) -> ({ - 'block': 'mostly-value' - 'indent': 'mostly-block' - 'skip': 'mostly-block' - })[@detNode(context)] - getColor: (node, rules) -> color = config.COLOR_CALLBACK?(@opts, node) if color? @@ -91,7 +85,7 @@ exports.createTreewalkParser = (parse, config, root) -> if shapeRule[0] of rulesSet return shapeRule[1] - return 'comment' + return 'any-drop' mark: (node, prefix, depth, pass, rules, context, wrap, wrapRules) -> unless pass @@ -126,7 +120,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth + 1 color: @getColor node, rules - classes: padRules(wrapRules ? rules).concat(if context? then @getDropType(context) else @getShape(node, rules)) + classes: padRules(wrapRules ? rules).concat(@getShape(node, rules)) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) when 'parens' @@ -162,7 +156,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: bounds depth: depth + 1 color: @getColor node, rules - classes: padRules(wrapRules ? rules).concat(if context? then @getDropType(context) else @getShape(node, rules)) + classes: padRules(wrapRules ? rules).concat(@getShape(node, rules)) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) when 'indent' @@ -172,7 +166,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: node.bounds depth: depth color: @getColor node, rules - classes: padRules(wrapRules ? rules).concat(if context? then @getDropType(context) else @getShape(node, rules)) + classes: padRules(wrapRules ? rules).concat(@getShape(node, rules)) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) depth += 1 From 884fc7c2268ec6a57e5e297bf2d1a02ff593b73d Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 17:44:43 -0400 Subject: [PATCH 149/268] Better droppability for lists --- src/controller.coffee | 9 +++++++++ src/model.coffee | 1 + src/treewalk.coffee | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/src/controller.coffee b/src/controller.coffee index 9174667f..5ee7b7d9 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -1571,6 +1571,15 @@ Editor::getAcceptLevel = (drag, drop) -> return helper.FORBID else return @session.mode.drop drag.getReader(), drop.getReader(), null, null + + # If it's a list/selection, try all of its children + else if drag.type is 'list' + minimum = helper.ENCOURAGE + drag.traverseOneLevel (child) => + if child instanceof model.Container + minimum = Math.min minimum, @getAcceptLevel child, drop + return minimum + else if drop.type is 'block' if drop.parent.type is 'socket' return helper.FORBID diff --git a/src/model.coffee b/src/model.coffee index ef6f6104..f5c11887 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -110,6 +110,7 @@ class ReplaceOperation exports.List = class List constructor: (@start, @end) -> @id = ++_id + @type = 'list' contains: (token) -> if token instanceof Container diff --git a/src/treewalk.coffee b/src/treewalk.coffee index aa7b6847..e28b2c9b 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -218,6 +218,13 @@ exports.createTreewalkParser = (parse, config, root) -> @flagToRemove node.bounds, depth + 1 TreewalkParser.drop = (block, context, pred) -> + if block instanceof model.List + console.log 'ya ya' + block.traverseOneLevel (child) -> + if child instanceof Container and TreewalkParser.drop(child, context, pred) isnt helper.ENCOURAGE + return helper.DISCOURAGE + return helper.ENCOURAGE + if context.type is 'socket' if '__comment__' in block.classes return helper.DISCOURAGE From 6b3c0a7b8713f012d6eb1b22bc57bf373840060e Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 21 Jun 2016 17:53:27 -0400 Subject: [PATCH 150/268] Classes for empty lines --- src/parser.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/parser.coffee b/src/parser.coffee index 5bcf1ca8..36870dc0 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -324,6 +324,10 @@ exports.Parser = class Parser # If we have some text here that # is floating (not surrounded by a block), # wrap it in a generic block automatically. + # + # We will also send it through a pass through a comment parser here, + # for special handling of different forms of comments (or, e.g. in C mode, directives), + # and amalgamate multiline comments. placedSomething = false while line.length > 0 if currentlyCommented @@ -365,6 +369,7 @@ exports.Parser = class Parser if line.length is 0 and not placedSomething and stack[stack.length - 1]?.type in ['indent', 'document', undefined] and hasSomeTextAfter(lines, i) block = new model.Block 0, @opts.emptyLineColor, helper.BLOCK_ONLY + block.classes = ['__comment__', 'any-drop'] head = helper.connect head, block.start head = helper.connect head, block.end From c4418ce70a50ccc3114282fe277aa4ad851a071c Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 22 Jun 2016 14:26:47 -0400 Subject: [PATCH 151/268] Remove extraneous check --- src/treewalk.coffee | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/treewalk.coffee b/src/treewalk.coffee index e28b2c9b..aa7b6847 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -218,13 +218,6 @@ exports.createTreewalkParser = (parse, config, root) -> @flagToRemove node.bounds, depth + 1 TreewalkParser.drop = (block, context, pred) -> - if block instanceof model.List - console.log 'ya ya' - block.traverseOneLevel (child) -> - if child instanceof Container and TreewalkParser.drop(child, context, pred) isnt helper.ENCOURAGE - return helper.DISCOURAGE - return helper.ENCOURAGE - if context.type is 'socket' if '__comment__' in block.classes return helper.DISCOURAGE From 04abf25cef5276e7247c0fee3e34d98a33d1aa31 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 22 Jun 2016 14:27:02 -0400 Subject: [PATCH 152/268] Update README --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 1e56fd3e..0c545ee7 100644 --- a/README.md +++ b/README.md @@ -233,3 +233,32 @@ MyParser.handleButton = (text, command, block) -> # Return 'text' is you don't want to change anything return text ``` + +View Options +------------ +You can pass a `viewSettings` object into the options to configure various aspects of the renderer. + +```javascript +{ + viewSettings: { + padding: 5 // Padding around each block + indentWidth: 20 // Width of the left side of indent C-shaped blocks + indentTongueHeight: 20 // Height of the bottom of indent C-shaped blocks when there is no other text on that bottom line (used mainly in Python/Coffee modes) + tabOffset: 10 // Distance from the left side of the puzzle-piece tab to the left side of the block + tabWidth: 15 // Width of the bottom of the tab (from top point to top point) + tabHeight: 4 // Height of the tab + tabSideWidth: 1 / 4 // Fraction the width that is taken up by the sides of the tab (larger means flatter/fatter slanted sides) + emptySocketWidth: 20 // Size of a socket with no text in it + emptyLineHeight: 25 // Height of a line with no blocks on it + shadowBlur: 5 // Blur factor for the drop shadow when dragging + colors: { // Color aliases used in various places elsewhere; changing these will change lots of colors + error: '#ff0000' + comment: '#c0c0c0' // currently grayish + return: '#fff59d' // currently yellowish + control: '#ffcc80' // currently orangeish + value: '#a5d6a7' // currently greenish + command: '#90caf9' // currently blueish + } + } +} +``` From ba812867eb0cb8d9e0d288c1d17b85d89523bd28 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 22 Jun 2016 14:58:50 -0400 Subject: [PATCH 153/268] Whoops add commas --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0c545ee7..61c372db 100644 --- a/README.md +++ b/README.md @@ -241,22 +241,22 @@ You can pass a `viewSettings` object into the options to configure various aspec ```javascript { viewSettings: { - padding: 5 // Padding around each block - indentWidth: 20 // Width of the left side of indent C-shaped blocks - indentTongueHeight: 20 // Height of the bottom of indent C-shaped blocks when there is no other text on that bottom line (used mainly in Python/Coffee modes) - tabOffset: 10 // Distance from the left side of the puzzle-piece tab to the left side of the block - tabWidth: 15 // Width of the bottom of the tab (from top point to top point) - tabHeight: 4 // Height of the tab - tabSideWidth: 1 / 4 // Fraction the width that is taken up by the sides of the tab (larger means flatter/fatter slanted sides) - emptySocketWidth: 20 // Size of a socket with no text in it - emptyLineHeight: 25 // Height of a line with no blocks on it - shadowBlur: 5 // Blur factor for the drop shadow when dragging + padding: 5, // Padding around each block + indentWidth: 20, // Width of the left side of indent C-shaped blocks + indentTongueHeight: 20, // Height of the bottom of indent C-shaped blocks when there is no other text on that bottom line (used mainly in Python/Coffee modes) + tabOffset: 10, // Distance from the left side of the puzzle-piece tab to the left side of the block + tabWidth: 15, // Width of the bottom of the tab (from top point to top point) + tabHeight: 4, // Height of the tab + tabSideWidth: 1, / 4 // Fraction the width that is taken up by the sides of the tab (larger means flatter/fatter slanted sides) + emptySocketWidth: 20, // Size of a socket with no text in it + emptyLineHeight: 25, // Height of a line with no blocks on it + shadowBlur: 5, // Blur factor for the drop shadow when dragging colors: { // Color aliases used in various places elsewhere; changing these will change lots of colors - error: '#ff0000' - comment: '#c0c0c0' // currently grayish - return: '#fff59d' // currently yellowish - control: '#ffcc80' // currently orangeish - value: '#a5d6a7' // currently greenish + error: '#ff0000', + comment: '#c0c0c0', // currently grayish + return: '#fff59d', // currently yellowish + control: '#ffcc80', // currently orangeish + value: '#a5d6a7', // currently greenish command: '#90caf9' // currently blueish } } From 9880b7e1fb5bb130a00e68719c6443abad10a784 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Wed, 22 Jun 2016 15:45:47 -0400 Subject: [PATCH 154/268] Add and fix for droppability rule stress test --- antlr/C.g4 | 4 - antlr/C.tokens | 11 +- antlr/CLexer.js | 900 ++++++++++++++++++++--------------------- antlr/CLexer.tokens | 11 +- antlr/CParser.js | 25 +- test/src/uitest.coffee | 112 +++++ 6 files changed, 580 insertions(+), 483 deletions(-) diff --git a/antlr/C.g4 b/antlr/C.g4 index 3569baf1..3b10ead0 100644 --- a/antlr/C.g4 +++ b/antlr/C.g4 @@ -1364,10 +1364,6 @@ StringLiteral : EncodingPrefix? '"' SCharSequence? '"' ; -SharedIncludeLiteral - : '<' SCharSequence '>' - ; - fragment EncodingPrefix : 'u8' diff --git a/antlr/C.tokens b/antlr/C.tokens index c5ebf233..433c241e 100644 --- a/antlr/C.tokens +++ b/antlr/C.tokens @@ -105,12 +105,11 @@ Ellipsis=104 Identifier=105 Constant=106 StringLiteral=107 -SharedIncludeLiteral=108 -Directive=109 -Whitespace=110 -Newline=111 -BlockComment=112 -LineComment=113 +Directive=108 +Whitespace=109 +Newline=110 +BlockComment=111 +LineComment=112 '__extension__'=1 '__builtin_va_arg'=2 '__builtin_offsetof'=3 diff --git a/antlr/CLexer.js b/antlr/CLexer.js index 1c424e0c..6017dc87 100644 --- a/antlr/CLexer.js +++ b/antlr/CLexer.js @@ -4,7 +4,7 @@ var antlr4 = require('antlr4/index'); var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\2s\u04d5\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t", + "\2r\u04cf\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t", "\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20", "\t\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4", "\27\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35", @@ -22,446 +22,444 @@ var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", "\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a", "\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e\t\u008e\4\u008f", "\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092\4\u0093\t\u0093", - "\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098", - "\t\u0098\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3", - "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4", - "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4", - "\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7", - "\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b", - "\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n", - "\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3", - "\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", - "\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3", - "\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20", - "\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3", - "\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25", - "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3", - "\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31", - "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3", - "\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36", - "\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3\"", - "\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$", - "\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3", - "\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3", - "+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.", - "\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3", - "\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62", - "\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3", - "\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65", - "\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3", - "\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\39\39\39\3", - "9\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;", - "\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3@\3", - "@\3A\3A\3B\3B\3C\3C\3C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3I\3I", - "\3I\3J\3J\3K\3K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3Q\3Q\3Q\3R\3R\3R\3", - "S\3S\3T\3T\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3[\3\\\3\\\3\\", - "\3]\3]\3]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3c\3c\3", - "c\3d\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3i\3i\3i\3i\3j\3j\3j\7j", - "\u0381\nj\fj\16j\u0384\13j\3k\3k\5k\u0388\nk\3l\3l\3m\3m\3n\3n\3n\3", - "n\3n\3n\3n\3n\3n\3n\5n\u0398\nn\3o\3o\3o\3o\3o\3p\3p\3p\5p\u03a2\np", - "\3q\3q\5q\u03a6\nq\3q\3q\5q\u03aa\nq\3q\3q\5q\u03ae\nq\5q\u03b0\nq\3", - "r\3r\7r\u03b4\nr\fr\16r\u03b7\13r\3s\3s\7s\u03bb\ns\fs\16s\u03be\13", - "s\3t\3t\6t\u03c2\nt\rt\16t\u03c3\3u\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\5", - "y\u03d1\ny\3y\3y\3y\3y\3y\5y\u03d8\ny\3y\3y\5y\u03dc\ny\5y\u03de\ny", - "\3z\3z\3{\3{\3|\3|\3|\3|\5|\u03e8\n|\3}\3}\5}\u03ec\n}\3~\3~\5~\u03f0", - "\n~\3~\5~\u03f3\n~\3~\3~\3~\5~\u03f8\n~\5~\u03fa\n~\3\177\3\177\3\177", - "\3\177\5\177\u0400\n\177\3\177\3\177\3\177\3\177\5\177\u0406\n\177\5", - "\177\u0408\n\177\3\u0080\5\u0080\u040b\n\u0080\3\u0080\3\u0080\3\u0080", - "\3\u0080\3\u0080\5\u0080\u0412\n\u0080\3\u0081\3\u0081\5\u0081\u0416", - "\n\u0081\3\u0081\3\u0081\3\u0081\5\u0081\u041b\n\u0081\3\u0081\5\u0081", - "\u041e\n\u0081\3\u0082\3\u0082\3\u0083\6\u0083\u0423\n\u0083\r\u0083", - "\16\u0083\u0424\3\u0084\5\u0084\u0428\n\u0084\3\u0084\3\u0084\3\u0084", - "\3\u0084\3\u0084\5\u0084\u042f\n\u0084\3\u0085\3\u0085\5\u0085\u0433", - "\n\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0438\n\u0085\3\u0085\5\u0085", - "\u043b\n\u0085\3\u0086\6\u0086\u043e\n\u0086\r\u0086\16\u0086\u043f", - "\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088", + "\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097\t\u0097\3\2", + "\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3", + "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4", + "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5", + "\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7", + "\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t", + "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n", + "\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f", + "\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r", + "\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17", + "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3", + "\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23", + "\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3", + "\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27", + "\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3", + "\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34", + "\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3", + "\36\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"", + "\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%", + "\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(", + "\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3", + "+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.", + "\3.\3.\3.\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60", + "\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3", + "\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64", + "\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3", + "\66\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67", + "\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\39\39\39\39\39\39\39\39", + "\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3", + ";\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3@\3@\3A\3A\3B\3B", + "\3C\3C\3C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3I\3I\3I\3J\3J\3K\3", + "K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3Q\3Q\3Q\3R\3R\3R\3S\3S\3T\3T\3U", + "\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3^\3", + "^\3^\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3c\3c\3c\3d\3d\3d\3e", + "\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3i\3i\3i\3i\3j\3j\3j\7j\u037f\nj\fj\16", + "j\u0382\13j\3k\3k\5k\u0386\nk\3l\3l\3m\3m\3n\3n\3n\3n\3n\3n\3n\3n\3", + "n\3n\5n\u0396\nn\3o\3o\3o\3o\3o\3p\3p\3p\5p\u03a0\np\3q\3q\5q\u03a4", + "\nq\3q\3q\5q\u03a8\nq\3q\3q\5q\u03ac\nq\5q\u03ae\nq\3r\3r\7r\u03b2\n", + "r\fr\16r\u03b5\13r\3s\3s\7s\u03b9\ns\fs\16s\u03bc\13s\3t\3t\6t\u03c0", + "\nt\rt\16t\u03c1\3u\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\5y\u03cf\ny\3y\3y", + "\3y\3y\3y\5y\u03d6\ny\3y\3y\5y\u03da\ny\5y\u03dc\ny\3z\3z\3{\3{\3|\3", + "|\3|\3|\5|\u03e6\n|\3}\3}\5}\u03ea\n}\3~\3~\5~\u03ee\n~\3~\5~\u03f1", + "\n~\3~\3~\3~\5~\u03f6\n~\5~\u03f8\n~\3\177\3\177\3\177\3\177\5\177\u03fe", + "\n\177\3\177\3\177\3\177\3\177\5\177\u0404\n\177\5\177\u0406\n\177\3", + "\u0080\5\u0080\u0409\n\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080", + "\5\u0080\u0410\n\u0080\3\u0081\3\u0081\5\u0081\u0414\n\u0081\3\u0081", + "\3\u0081\3\u0081\5\u0081\u0419\n\u0081\3\u0081\5\u0081\u041c\n\u0081", + "\3\u0082\3\u0082\3\u0083\6\u0083\u0421\n\u0083\r\u0083\16\u0083\u0422", + "\3\u0084\5\u0084\u0426\n\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084", + "\5\u0084\u042d\n\u0084\3\u0085\3\u0085\5\u0085\u0431\n\u0085\3\u0085", + "\3\u0085\3\u0085\5\u0085\u0436\n\u0085\3\u0085\5\u0085\u0439\n\u0085", + "\3\u0086\6\u0086\u043c\n\u0086\r\u0086\16\u0086\u043d\3\u0087\3\u0087", "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088", - "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u045a\n\u0088", - "\3\u0089\6\u0089\u045d\n\u0089\r\u0089\16\u0089\u045e\3\u008a\3\u008a", - "\5\u008a\u0463\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0469", - "\n\u008b\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d", - "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0479\n\u008d", - "\3\u008e\3\u008e\3\u008e\3\u008e\6\u008e\u047f\n\u008e\r\u008e\16\u008e", - "\u0480\3\u008f\5\u008f\u0484\n\u008f\3\u008f\3\u008f\5\u008f\u0488\n", - "\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091", - "\3\u0091\5\u0091\u0493\n\u0091\3\u0092\6\u0092\u0496\n\u0092\r\u0092", - "\16\u0092\u0497\3\u0093\3\u0093\5\u0093\u049c\n\u0093\3\u0094\3\u0094", - "\7\u0094\u04a0\n\u0094\f\u0094\16\u0094\u04a3\13\u0094\3\u0094\7\u0094", - "\u04a6\n\u0094\f\u0094\16\u0094\u04a9\13\u0094\3\u0094\3\u0094\3\u0095", - "\6\u0095\u04ae\n\u0095\r\u0095\16\u0095\u04af\3\u0095\3\u0095\3\u0096", - "\3\u0096\5\u0096\u04b6\n\u0096\3\u0096\5\u0096\u04b9\n\u0096\3\u0096", - "\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\7\u0097\u04c1\n\u0097\f\u0097", - "\16\u0097\u04c4\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098", - "\3\u0098\3\u0098\3\u0098\7\u0098\u04cf\n\u0098\f\u0098\16\u0098\u04d2", - "\13\u0098\3\u0098\3\u0098\4\u04a1\u04c2\2\u0099\3\3\5\4\7\5\t\6\13\7", - "\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'", - "\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K", - "\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}", - "@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091", - "J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5", - "T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9", - "^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cd", - "h\u00cfi\u00d1j\u00d3k\u00d5\2\u00d7\2\u00d9\2\u00db\2\u00dd\2\u00df", - "l\u00e1\2\u00e3\2\u00e5\2\u00e7\2\u00e9\2\u00eb\2\u00ed\2\u00ef\2\u00f1", - "\2\u00f3\2\u00f5\2\u00f7\2\u00f9\2\u00fb\2\u00fd\2\u00ff\2\u0101\2\u0103", - "\2\u0105\2\u0107\2\u0109\2\u010b\2\u010d\2\u010f\2\u0111\2\u0113\2\u0115", - "\2\u0117\2\u0119\2\u011b\2\u011dm\u011fn\u0121\2\u0123\2\u0125\2\u0127", - "o\u0129p\u012bq\u012dr\u012fs\3\2\23\5\2C\\aac|\3\2\62;\4\2ZZzz\3\2", - "\63;\3\2\629\5\2\62;CHch\4\2WWww\4\2NNnn\4\2--//\6\2HHNNhhnn\6\2\f\f", - "\17\17))^^\f\2$$))AA^^cdhhppttvvxx\5\2NNWWww\6\2\f\f\17\17$$^^\5\2\f", - "\f\17\17``\4\2\f\f\17\17\4\2\13\13\"\"\u04ee\2\3\3\2\2\2\2\5\3\2\2\2", - "\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21", - "\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3", - "\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2", - "\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2", - "\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2", - "\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2", - "\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2", - "\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2", - "c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o", - "\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3", - "\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085", - "\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2", - "\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2", - "\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f", - "\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2", - "\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2", - "\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9", - "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2", - "\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2", - "\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3", - "\3\2\2\2\2\u00df\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0127\3\2", - "\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2\2", - "\3\u0131\3\2\2\2\5\u013f\3\2\2\2\7\u0150\3\2\2\2\t\u0163\3\2\2\2\13", - "\u016a\3\2\2\2\r\u0172\3\2\2\2\17\u017a\3\2\2\2\21\u0185\3\2\2\2\23", - "\u0190\3\2\2\2\25\u019a\3\2\2\2\27\u01a5\3\2\2\2\31\u01ab\3\2\2\2\33", - "\u01b9\3\2\2\2\35\u01c1\3\2\2\2\37\u01ce\3\2\2\2!\u01d3\3\2\2\2#\u01d9", - "\3\2\2\2%\u01de\3\2\2\2\'\u01e3\3\2\2\2)\u01e9\3\2\2\2+\u01f2\3\2\2", - "\2-\u01fa\3\2\2\2/\u01fd\3\2\2\2\61\u0204\3\2\2\2\63\u0209\3\2\2\2\65", - "\u020e\3\2\2\2\67\u0215\3\2\2\29\u021b\3\2\2\2;\u021f\3\2\2\2=\u0224", - "\3\2\2\2?\u0227\3\2\2\2A\u022e\3\2\2\2C\u0232\3\2\2\2E\u0237\3\2\2\2", - "G\u0240\3\2\2\2I\u0249\3\2\2\2K\u0250\3\2\2\2M\u0256\3\2\2\2O\u025d", - "\3\2\2\2Q\u0264\3\2\2\2S\u026b\3\2\2\2U\u0272\3\2\2\2W\u0279\3\2\2\2", - "Y\u0281\3\2\2\2[\u0287\3\2\2\2]\u0290\3\2\2\2_\u0295\3\2\2\2a\u029e", - "\3\2\2\2c\u02a4\3\2\2\2e\u02ad\3\2\2\2g\u02b6\3\2\2\2i\u02be\3\2\2\2", - "k\u02c4\3\2\2\2m\u02cd\3\2\2\2o\u02d6\3\2\2\2q\u02e1\3\2\2\2s\u02eb", - "\3\2\2\2u\u02fa\3\2\2\2w\u0308\3\2\2\2y\u030a\3\2\2\2{\u030c\3\2\2\2", - "}\u030e\3\2\2\2\177\u0310\3\2\2\2\u0081\u0312\3\2\2\2\u0083\u0314\3", - "\2\2\2\u0085\u0316\3\2\2\2\u0087\u0319\3\2\2\2\u0089\u031b\3\2\2\2\u008b", - "\u031e\3\2\2\2\u008d\u0321\3\2\2\2\u008f\u0324\3\2\2\2\u0091\u0326\3", - "\2\2\2\u0093\u0329\3\2\2\2\u0095\u032b\3\2\2\2\u0097\u032e\3\2\2\2\u0099", - "\u0330\3\2\2\2\u009b\u0332\3\2\2\2\u009d\u0334\3\2\2\2\u009f\u0336\3", - "\2\2\2\u00a1\u0338\3\2\2\2\u00a3\u033b\3\2\2\2\u00a5\u033e\3\2\2\2\u00a7", - "\u0340\3\2\2\2\u00a9\u0342\3\2\2\2\u00ab\u0344\3\2\2\2\u00ad\u0346\3", - "\2\2\2\u00af\u0348\3\2\2\2\u00b1\u034a\3\2\2\2\u00b3\u034c\3\2\2\2\u00b5", - "\u034e\3\2\2\2\u00b7\u0351\3\2\2\2\u00b9\u0354\3\2\2\2\u00bb\u0357\3", - "\2\2\2\u00bd\u035a\3\2\2\2\u00bf\u035d\3\2\2\2\u00c1\u0361\3\2\2\2\u00c3", - "\u0365\3\2\2\2\u00c5\u0368\3\2\2\2\u00c7\u036b\3\2\2\2\u00c9\u036e\3", - "\2\2\2\u00cb\u0371\3\2\2\2\u00cd\u0374\3\2\2\2\u00cf\u0377\3\2\2\2\u00d1", - "\u0379\3\2\2\2\u00d3\u037d\3\2\2\2\u00d5\u0387\3\2\2\2\u00d7\u0389\3", - "\2\2\2\u00d9\u038b\3\2\2\2\u00db\u0397\3\2\2\2\u00dd\u0399\3\2\2\2\u00df", - "\u03a1\3\2\2\2\u00e1\u03af\3\2\2\2\u00e3\u03b1\3\2\2\2\u00e5\u03b8\3", - "\2\2\2\u00e7\u03bf\3\2\2\2\u00e9\u03c5\3\2\2\2\u00eb\u03c8\3\2\2\2\u00ed", - "\u03ca\3\2\2\2\u00ef\u03cc\3\2\2\2\u00f1\u03dd\3\2\2\2\u00f3\u03df\3", - "\2\2\2\u00f5\u03e1\3\2\2\2\u00f7\u03e7\3\2\2\2\u00f9\u03eb\3\2\2\2\u00fb", - "\u03f9\3\2\2\2\u00fd\u0407\3\2\2\2\u00ff\u0411\3\2\2\2\u0101\u041d\3", - "\2\2\2\u0103\u041f\3\2\2\2\u0105\u0422\3\2\2\2\u0107\u042e\3\2\2\2\u0109", - "\u043a\3\2\2\2\u010b\u043d\3\2\2\2\u010d\u0441\3\2\2\2\u010f\u0459\3", - "\2\2\2\u0111\u045c\3\2\2\2\u0113\u0462\3\2\2\2\u0115\u0468\3\2\2\2\u0117", - "\u046a\3\2\2\2\u0119\u0478\3\2\2\2\u011b\u047a\3\2\2\2\u011d\u0483\3", - "\2\2\2\u011f\u048b\3\2\2\2\u0121\u0492\3\2\2\2\u0123\u0495\3\2\2\2\u0125", - "\u049b\3\2\2\2\u0127\u049d\3\2\2\2\u0129\u04ad\3\2\2\2\u012b\u04b8\3", - "\2\2\2\u012d\u04bc\3\2\2\2\u012f\u04ca\3\2\2\2\u0131\u0132\7a\2\2\u0132", - "\u0133\7a\2\2\u0133\u0134\7g\2\2\u0134\u0135\7z\2\2\u0135\u0136\7v\2", - "\2\u0136\u0137\7g\2\2\u0137\u0138\7p\2\2\u0138\u0139\7u\2\2\u0139\u013a", - "\7k\2\2\u013a\u013b\7q\2\2\u013b\u013c\7p\2\2\u013c\u013d\7a\2\2\u013d", - "\u013e\7a\2\2\u013e\4\3\2\2\2\u013f\u0140\7a\2\2\u0140\u0141\7a\2\2", - "\u0141\u0142\7d\2\2\u0142\u0143\7w\2\2\u0143\u0144\7k\2\2\u0144\u0145", - "\7n\2\2\u0145\u0146\7v\2\2\u0146\u0147\7k\2\2\u0147\u0148\7p\2\2\u0148", - "\u0149\7a\2\2\u0149\u014a\7x\2\2\u014a\u014b\7c\2\2\u014b\u014c\7a\2", - "\2\u014c\u014d\7c\2\2\u014d\u014e\7t\2\2\u014e\u014f\7i\2\2\u014f\6", - "\3\2\2\2\u0150\u0151\7a\2\2\u0151\u0152\7a\2\2\u0152\u0153\7d\2\2\u0153", - "\u0154\7w\2\2\u0154\u0155\7k\2\2\u0155\u0156\7n\2\2\u0156\u0157\7v\2", - "\2\u0157\u0158\7k\2\2\u0158\u0159\7p\2\2\u0159\u015a\7a\2\2\u015a\u015b", - "\7q\2\2\u015b\u015c\7h\2\2\u015c\u015d\7h\2\2\u015d\u015e\7u\2\2\u015e", - "\u015f\7g\2\2\u015f\u0160\7v\2\2\u0160\u0161\7q\2\2\u0161\u0162\7h\2", - "\2\u0162\b\3\2\2\2\u0163\u0164\7a\2\2\u0164\u0165\7a\2\2\u0165\u0166", - "\7o\2\2\u0166\u0167\7\63\2\2\u0167\u0168\7\64\2\2\u0168\u0169\7:\2\2", - "\u0169\n\3\2\2\2\u016a\u016b\7a\2\2\u016b\u016c\7a\2\2\u016c\u016d\7", - "o\2\2\u016d\u016e\7\63\2\2\u016e\u016f\7\64\2\2\u016f\u0170\7:\2\2\u0170", - "\u0171\7f\2\2\u0171\f\3\2\2\2\u0172\u0173\7a\2\2\u0173\u0174\7a\2\2", - "\u0174\u0175\7o\2\2\u0175\u0176\7\63\2\2\u0176\u0177\7\64\2\2\u0177", - "\u0178\7:\2\2\u0178\u0179\7k\2\2\u0179\16\3\2\2\2\u017a\u017b\7a\2\2", - "\u017b\u017c\7a\2\2\u017c\u017d\7v\2\2\u017d\u017e\7{\2\2\u017e\u017f", - "\7r\2\2\u017f\u0180\7g\2\2\u0180\u0181\7q\2\2\u0181\u0182\7h\2\2\u0182", - "\u0183\7a\2\2\u0183\u0184\7a\2\2\u0184\20\3\2\2\2\u0185\u0186\7a\2\2", - "\u0186\u0187\7a\2\2\u0187\u0188\7k\2\2\u0188\u0189\7p\2\2\u0189\u018a", - "\7n\2\2\u018a\u018b\7k\2\2\u018b\u018c\7p\2\2\u018c\u018d\7g\2\2\u018d", - "\u018e\7a\2\2\u018e\u018f\7a\2\2\u018f\22\3\2\2\2\u0190\u0191\7a\2\2", - "\u0191\u0192\7a\2\2\u0192\u0193\7u\2\2\u0193\u0194\7v\2\2\u0194\u0195", - "\7f\2\2\u0195\u0196\7e\2\2\u0196\u0197\7c\2\2\u0197\u0198\7n\2\2\u0198", - "\u0199\7n\2\2\u0199\24\3\2\2\2\u019a\u019b\7a\2\2\u019b\u019c\7a\2\2", - "\u019c\u019d\7f\2\2\u019d\u019e\7g\2\2\u019e\u019f\7e\2\2\u019f\u01a0", - "\7n\2\2\u01a0\u01a1\7u\2\2\u01a1\u01a2\7r\2\2\u01a2\u01a3\7g\2\2\u01a3", - "\u01a4\7e\2\2\u01a4\26\3\2\2\2\u01a5\u01a6\7a\2\2\u01a6\u01a7\7a\2\2", - "\u01a7\u01a8\7c\2\2\u01a8\u01a9\7u\2\2\u01a9\u01aa\7o\2\2\u01aa\30\3", - "\2\2\2\u01ab\u01ac\7a\2\2\u01ac\u01ad\7a\2\2\u01ad\u01ae\7c\2\2\u01ae", - "\u01af\7v\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7t\2\2\u01b1\u01b2\7k\2", - "\2\u01b2\u01b3\7d\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7v\2\2\u01b5\u01b6", - "\7g\2\2\u01b6\u01b7\7a\2\2\u01b7\u01b8\7a\2\2\u01b8\32\3\2\2\2\u01b9", - "\u01ba\7a\2\2\u01ba\u01bb\7a\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7u\2", - "\2\u01bd\u01be\7o\2\2\u01be\u01bf\7a\2\2\u01bf\u01c0\7a\2\2\u01c0\34", - "\3\2\2\2\u01c1\u01c2\7a\2\2\u01c2\u01c3\7a\2\2\u01c3\u01c4\7x\2\2\u01c4", - "\u01c5\7q\2\2\u01c5\u01c6\7n\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7v\2", - "\2\u01c8\u01c9\7k\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7g\2\2\u01cb\u01cc", - "\7a\2\2\u01cc\u01cd\7a\2\2\u01cd\36\3\2\2\2\u01ce\u01cf\7c\2\2\u01cf", - "\u01d0\7w\2\2\u01d0\u01d1\7v\2\2\u01d1\u01d2\7q\2\2\u01d2 \3\2\2\2\u01d3", - "\u01d4\7d\2\2\u01d4\u01d5\7t\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7c\2", - "\2\u01d7\u01d8\7m\2\2\u01d8\"\3\2\2\2\u01d9\u01da\7e\2\2\u01da\u01db", - "\7c\2\2\u01db\u01dc\7u\2\2\u01dc\u01dd\7g\2\2\u01dd$\3\2\2\2\u01de\u01df", - "\7e\2\2\u01df\u01e0\7j\2\2\u01e0\u01e1\7c\2\2\u01e1\u01e2\7t\2\2\u01e2", - "&\3\2\2\2\u01e3\u01e4\7e\2\2\u01e4\u01e5\7q\2\2\u01e5\u01e6\7p\2\2\u01e6", - "\u01e7\7u\2\2\u01e7\u01e8\7v\2\2\u01e8(\3\2\2\2\u01e9\u01ea\7e\2\2\u01ea", - "\u01eb\7q\2\2\u01eb\u01ec\7p\2\2\u01ec\u01ed\7v\2\2\u01ed\u01ee\7k\2", - "\2\u01ee\u01ef\7p\2\2\u01ef\u01f0\7w\2\2\u01f0\u01f1\7g\2\2\u01f1*\3", - "\2\2\2\u01f2\u01f3\7f\2\2\u01f3\u01f4\7g\2\2\u01f4\u01f5\7h\2\2\u01f5", - "\u01f6\7c\2\2\u01f6\u01f7\7w\2\2\u01f7\u01f8\7n\2\2\u01f8\u01f9\7v\2", - "\2\u01f9,\3\2\2\2\u01fa\u01fb\7f\2\2\u01fb\u01fc\7q\2\2\u01fc.\3\2\2", - "\2\u01fd\u01fe\7f\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200\7w\2\2\u0200\u0201", - "\7d\2\2\u0201\u0202\7n\2\2\u0202\u0203\7g\2\2\u0203\60\3\2\2\2\u0204", - "\u0205\7g\2\2\u0205\u0206\7n\2\2\u0206\u0207\7u\2\2\u0207\u0208\7g\2", - "\2\u0208\62\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020b\7p\2\2\u020b\u020c", - "\7w\2\2\u020c\u020d\7o\2\2\u020d\64\3\2\2\2\u020e\u020f\7g\2\2\u020f", - "\u0210\7z\2\2\u0210\u0211\7v\2\2\u0211\u0212\7g\2\2\u0212\u0213\7t\2", - "\2\u0213\u0214\7p\2\2\u0214\66\3\2\2\2\u0215\u0216\7h\2\2\u0216\u0217", - "\7n\2\2\u0217\u0218\7q\2\2\u0218\u0219\7c\2\2\u0219\u021a\7v\2\2\u021a", - "8\3\2\2\2\u021b\u021c\7h\2\2\u021c\u021d\7q\2\2\u021d\u021e\7t\2\2\u021e", - ":\3\2\2\2\u021f\u0220\7i\2\2\u0220\u0221\7q\2\2\u0221\u0222\7v\2\2\u0222", - "\u0223\7q\2\2\u0223<\3\2\2\2\u0224\u0225\7k\2\2\u0225\u0226\7h\2\2\u0226", - ">\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229\7p\2\2\u0229\u022a\7n\2\2\u022a", - "\u022b\7k\2\2\u022b\u022c\7p\2\2\u022c\u022d\7g\2\2\u022d@\3\2\2\2\u022e", - "\u022f\7k\2\2\u022f\u0230\7p\2\2\u0230\u0231\7v\2\2\u0231B\3\2\2\2\u0232", - "\u0233\7n\2\2\u0233\u0234\7q\2\2\u0234\u0235\7p\2\2\u0235\u0236\7i\2", - "\2\u0236D\3\2\2\2\u0237\u0238\7t\2\2\u0238\u0239\7g\2\2\u0239\u023a", - "\7i\2\2\u023a\u023b\7k\2\2\u023b\u023c\7u\2\2\u023c\u023d\7v\2\2\u023d", - "\u023e\7g\2\2\u023e\u023f\7t\2\2\u023fF\3\2\2\2\u0240\u0241\7t\2\2\u0241", - "\u0242\7g\2\2\u0242\u0243\7u\2\2\u0243\u0244\7v\2\2\u0244\u0245\7t\2", - "\2\u0245\u0246\7k\2\2\u0246\u0247\7e\2\2\u0247\u0248\7v\2\2\u0248H\3", - "\2\2\2\u0249\u024a\7t\2\2\u024a\u024b\7g\2\2\u024b\u024c\7v\2\2\u024c", - "\u024d\7w\2\2\u024d\u024e\7t\2\2\u024e\u024f\7p\2\2\u024fJ\3\2\2\2\u0250", - "\u0251\7u\2\2\u0251\u0252\7j\2\2\u0252\u0253\7q\2\2\u0253\u0254\7t\2", - "\2\u0254\u0255\7v\2\2\u0255L\3\2\2\2\u0256\u0257\7u\2\2\u0257\u0258", - "\7k\2\2\u0258\u0259\7i\2\2\u0259\u025a\7p\2\2\u025a\u025b\7g\2\2\u025b", - "\u025c\7f\2\2\u025cN\3\2\2\2\u025d\u025e\7u\2\2\u025e\u025f\7k\2\2\u025f", - "\u0260\7|\2\2\u0260\u0261\7g\2\2\u0261\u0262\7q\2\2\u0262\u0263\7h\2", - "\2\u0263P\3\2\2\2\u0264\u0265\7u\2\2\u0265\u0266\7v\2\2\u0266\u0267", - "\7c\2\2\u0267\u0268\7v\2\2\u0268\u0269\7k\2\2\u0269\u026a\7e\2\2\u026a", - "R\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7v\2\2\u026d\u026e\7t\2\2\u026e", - "\u026f\7w\2\2\u026f\u0270\7e\2\2\u0270\u0271\7v\2\2\u0271T\3\2\2\2\u0272", - "\u0273\7u\2\2\u0273\u0274\7y\2\2\u0274\u0275\7k\2\2\u0275\u0276\7v\2", - "\2\u0276\u0277\7e\2\2\u0277\u0278\7j\2\2\u0278V\3\2\2\2\u0279\u027a", - "\7v\2\2\u027a\u027b\7{\2\2\u027b\u027c\7r\2\2\u027c\u027d\7g\2\2\u027d", - "\u027e\7f\2\2\u027e\u027f\7g\2\2\u027f\u0280\7h\2\2\u0280X\3\2\2\2\u0281", - "\u0282\7w\2\2\u0282\u0283\7p\2\2\u0283\u0284\7k\2\2\u0284\u0285\7q\2", - "\2\u0285\u0286\7p\2\2\u0286Z\3\2\2\2\u0287\u0288\7w\2\2\u0288\u0289", - "\7p\2\2\u0289\u028a\7u\2\2\u028a\u028b\7k\2\2\u028b\u028c\7i\2\2\u028c", - "\u028d\7p\2\2\u028d\u028e\7g\2\2\u028e\u028f\7f\2\2\u028f\\\3\2\2\2", - "\u0290\u0291\7x\2\2\u0291\u0292\7q\2\2\u0292\u0293\7k\2\2\u0293\u0294", - "\7f\2\2\u0294^\3\2\2\2\u0295\u0296\7x\2\2\u0296\u0297\7q\2\2\u0297\u0298", - "\7n\2\2\u0298\u0299\7c\2\2\u0299\u029a\7v\2\2\u029a\u029b\7k\2\2\u029b", - "\u029c\7n\2\2\u029c\u029d\7g\2\2\u029d`\3\2\2\2\u029e\u029f\7y\2\2\u029f", - "\u02a0\7j\2\2\u02a0\u02a1\7k\2\2\u02a1\u02a2\7n\2\2\u02a2\u02a3\7g\2", - "\2\u02a3b\3\2\2\2\u02a4\u02a5\7a\2\2\u02a5\u02a6\7C\2\2\u02a6\u02a7", - "\7n\2\2\u02a7\u02a8\7k\2\2\u02a8\u02a9\7i\2\2\u02a9\u02aa\7p\2\2\u02aa", - "\u02ab\7c\2\2\u02ab\u02ac\7u\2\2\u02acd\3\2\2\2\u02ad\u02ae\7a\2\2\u02ae", - "\u02af\7C\2\2\u02af\u02b0\7n\2\2\u02b0\u02b1\7k\2\2\u02b1\u02b2\7i\2", - "\2\u02b2\u02b3\7p\2\2\u02b3\u02b4\7q\2\2\u02b4\u02b5\7h\2\2\u02b5f\3", - "\2\2\2\u02b6\u02b7\7a\2\2\u02b7\u02b8\7C\2\2\u02b8\u02b9\7v\2\2\u02b9", - "\u02ba\7q\2\2\u02ba\u02bb\7o\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7e\2", - "\2\u02bdh\3\2\2\2\u02be\u02bf\7a\2\2\u02bf\u02c0\7D\2\2\u02c0\u02c1", - "\7q\2\2\u02c1\u02c2\7q\2\2\u02c2\u02c3\7n\2\2\u02c3j\3\2\2\2\u02c4\u02c5", - "\7a\2\2\u02c5\u02c6\7E\2\2\u02c6\u02c7\7q\2\2\u02c7\u02c8\7o\2\2\u02c8", - "\u02c9\7r\2\2\u02c9\u02ca\7n\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7z\2", - "\2\u02ccl\3\2\2\2\u02cd\u02ce\7a\2\2\u02ce\u02cf\7I\2\2\u02cf\u02d0", - "\7g\2\2\u02d0\u02d1\7p\2\2\u02d1\u02d2\7g\2\2\u02d2\u02d3\7t\2\2\u02d3", - "\u02d4\7k\2\2\u02d4\u02d5\7e\2\2\u02d5n\3\2\2\2\u02d6\u02d7\7a\2\2\u02d7", - "\u02d8\7K\2\2\u02d8\u02d9\7o\2\2\u02d9\u02da\7c\2\2\u02da\u02db\7i\2", - "\2\u02db\u02dc\7k\2\2\u02dc\u02dd\7p\2\2\u02dd\u02de\7c\2\2\u02de\u02df", - "\7t\2\2\u02df\u02e0\7{\2\2\u02e0p\3\2\2\2\u02e1\u02e2\7a\2\2\u02e2\u02e3", - "\7P\2\2\u02e3\u02e4\7q\2\2\u02e4\u02e5\7t\2\2\u02e5\u02e6\7g\2\2\u02e6", - "\u02e7\7v\2\2\u02e7\u02e8\7w\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7p\2", - "\2\u02ear\3\2\2\2\u02eb\u02ec\7a\2\2\u02ec\u02ed\7U\2\2\u02ed\u02ee", - "\7v\2\2\u02ee\u02ef\7c\2\2\u02ef\u02f0\7v\2\2\u02f0\u02f1\7k\2\2\u02f1", - "\u02f2\7e\2\2\u02f2\u02f3\7a\2\2\u02f3\u02f4\7c\2\2\u02f4\u02f5\7u\2", - "\2\u02f5\u02f6\7u\2\2\u02f6\u02f7\7g\2\2\u02f7\u02f8\7t\2\2\u02f8\u02f9", - "\7v\2\2\u02f9t\3\2\2\2\u02fa\u02fb\7a\2\2\u02fb\u02fc\7V\2\2\u02fc\u02fd", - "\7j\2\2\u02fd\u02fe\7t\2\2\u02fe\u02ff\7g\2\2\u02ff\u0300\7c\2\2\u0300", - "\u0301\7f\2\2\u0301\u0302\7a\2\2\u0302\u0303\7n\2\2\u0303\u0304\7q\2", - "\2\u0304\u0305\7e\2\2\u0305\u0306\7c\2\2\u0306\u0307\7n\2\2\u0307v\3", - "\2\2\2\u0308\u0309\7*\2\2\u0309x\3\2\2\2\u030a\u030b\7+\2\2\u030bz\3", - "\2\2\2\u030c\u030d\7]\2\2\u030d|\3\2\2\2\u030e\u030f\7_\2\2\u030f~\3", - "\2\2\2\u0310\u0311\7}\2\2\u0311\u0080\3\2\2\2\u0312\u0313\7\177\2\2", - "\u0313\u0082\3\2\2\2\u0314\u0315\7>\2\2\u0315\u0084\3\2\2\2\u0316\u0317", - "\7>\2\2\u0317\u0318\7?\2\2\u0318\u0086\3\2\2\2\u0319\u031a\7@\2\2\u031a", - "\u0088\3\2\2\2\u031b\u031c\7@\2\2\u031c\u031d\7?\2\2\u031d\u008a\3\2", - "\2\2\u031e\u031f\7>\2\2\u031f\u0320\7>\2\2\u0320\u008c\3\2\2\2\u0321", - "\u0322\7@\2\2\u0322\u0323\7@\2\2\u0323\u008e\3\2\2\2\u0324\u0325\7-", - "\2\2\u0325\u0090\3\2\2\2\u0326\u0327\7-\2\2\u0327\u0328\7-\2\2\u0328", - "\u0092\3\2\2\2\u0329\u032a\7/\2\2\u032a\u0094\3\2\2\2\u032b\u032c\7", - "/\2\2\u032c\u032d\7/\2\2\u032d\u0096\3\2\2\2\u032e\u032f\7,\2\2\u032f", - "\u0098\3\2\2\2\u0330\u0331\7\61\2\2\u0331\u009a\3\2\2\2\u0332\u0333", - "\7\'\2\2\u0333\u009c\3\2\2\2\u0334\u0335\7(\2\2\u0335\u009e\3\2\2\2", - "\u0336\u0337\7~\2\2\u0337\u00a0\3\2\2\2\u0338\u0339\7(\2\2\u0339\u033a", - "\7(\2\2\u033a\u00a2\3\2\2\2\u033b\u033c\7~\2\2\u033c\u033d\7~\2\2\u033d", - "\u00a4\3\2\2\2\u033e\u033f\7`\2\2\u033f\u00a6\3\2\2\2\u0340\u0341\7", - "#\2\2\u0341\u00a8\3\2\2\2\u0342\u0343\7\u0080\2\2\u0343\u00aa\3\2\2", - "\2\u0344\u0345\7A\2\2\u0345\u00ac\3\2\2\2\u0346\u0347\7<\2\2\u0347\u00ae", - "\3\2\2\2\u0348\u0349\7=\2\2\u0349\u00b0\3\2\2\2\u034a\u034b\7.\2\2\u034b", - "\u00b2\3\2\2\2\u034c\u034d\7?\2\2\u034d\u00b4\3\2\2\2\u034e\u034f\7", - ",\2\2\u034f\u0350\7?\2\2\u0350\u00b6\3\2\2\2\u0351\u0352\7\61\2\2\u0352", - "\u0353\7?\2\2\u0353\u00b8\3\2\2\2\u0354\u0355\7\'\2\2\u0355\u0356\7", - "?\2\2\u0356\u00ba\3\2\2\2\u0357\u0358\7-\2\2\u0358\u0359\7?\2\2\u0359", - "\u00bc\3\2\2\2\u035a\u035b\7/\2\2\u035b\u035c\7?\2\2\u035c\u00be\3\2", - "\2\2\u035d\u035e\7>\2\2\u035e\u035f\7>\2\2\u035f\u0360\7?\2\2\u0360", - "\u00c0\3\2\2\2\u0361\u0362\7@\2\2\u0362\u0363\7@\2\2\u0363\u0364\7?", - "\2\2\u0364\u00c2\3\2\2\2\u0365\u0366\7(\2\2\u0366\u0367\7?\2\2\u0367", - "\u00c4\3\2\2\2\u0368\u0369\7`\2\2\u0369\u036a\7?\2\2\u036a\u00c6\3\2", - "\2\2\u036b\u036c\7~\2\2\u036c\u036d\7?\2\2\u036d\u00c8\3\2\2\2\u036e", - "\u036f\7?\2\2\u036f\u0370\7?\2\2\u0370\u00ca\3\2\2\2\u0371\u0372\7#", - "\2\2\u0372\u0373\7?\2\2\u0373\u00cc\3\2\2\2\u0374\u0375\7/\2\2\u0375", - "\u0376\7@\2\2\u0376\u00ce\3\2\2\2\u0377\u0378\7\60\2\2\u0378\u00d0\3", - "\2\2\2\u0379\u037a\7\60\2\2\u037a\u037b\7\60\2\2\u037b\u037c\7\60\2", - "\2\u037c\u00d2\3\2\2\2\u037d\u0382\5\u00d5k\2\u037e\u0381\5\u00d5k\2", - "\u037f\u0381\5\u00d9m\2\u0380\u037e\3\2\2\2\u0380\u037f\3\2\2\2\u0381", - "\u0384\3\2\2\2\u0382\u0380\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u00d4\3", - "\2\2\2\u0384\u0382\3\2\2\2\u0385\u0388\5\u00d7l\2\u0386\u0388\5\u00db", - "n\2\u0387\u0385\3\2\2\2\u0387\u0386\3\2\2\2\u0388\u00d6\3\2\2\2\u0389", - "\u038a\t\2\2\2\u038a\u00d8\3\2\2\2\u038b\u038c\t\3\2\2\u038c\u00da\3", - "\2\2\2\u038d\u038e\7^\2\2\u038e\u038f\7w\2\2\u038f\u0390\3\2\2\2\u0390", - "\u0398\5\u00ddo\2\u0391\u0392\7^\2\2\u0392\u0393\7W\2\2\u0393\u0394", - "\3\2\2\2\u0394\u0395\5\u00ddo\2\u0395\u0396\5\u00ddo\2\u0396\u0398\3", - "\2\2\2\u0397\u038d\3\2\2\2\u0397\u0391\3\2\2\2\u0398\u00dc\3\2\2\2\u0399", - "\u039a\5\u00efx\2\u039a\u039b\5\u00efx\2\u039b\u039c\5\u00efx\2\u039c", - "\u039d\5\u00efx\2\u039d\u00de\3\2\2\2\u039e\u03a2\5\u00e1q\2\u039f\u03a2", - "\5\u00f9}\2\u03a0\u03a2\5\u010f\u0088\2\u03a1\u039e\3\2\2\2\u03a1\u039f", - "\3\2\2\2\u03a1\u03a0\3\2\2\2\u03a2\u00e0\3\2\2\2\u03a3\u03a5\5\u00e3", - "r\2\u03a4\u03a6\5\u00f1y\2\u03a5\u03a4\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6", - "\u03b0\3\2\2\2\u03a7\u03a9\5\u00e5s\2\u03a8\u03aa\5\u00f1y\2\u03a9\u03a8", - "\3\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u03b0\3\2\2\2\u03ab\u03ad\5\u00e7", - "t\2\u03ac\u03ae\5\u00f1y\2\u03ad\u03ac\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae", - "\u03b0\3\2\2\2\u03af\u03a3\3\2\2\2\u03af\u03a7\3\2\2\2\u03af\u03ab\3", - "\2\2\2\u03b0\u00e2\3\2\2\2\u03b1\u03b5\5\u00ebv\2\u03b2\u03b4\5\u00d9", - "m\2\u03b3\u03b2\3\2\2\2\u03b4\u03b7\3\2\2\2\u03b5\u03b3\3\2\2\2\u03b5", - "\u03b6\3\2\2\2\u03b6\u00e4\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b8\u03bc\7", - "\62\2\2\u03b9\u03bb\5\u00edw\2\u03ba\u03b9\3\2\2\2\u03bb\u03be\3\2\2", - "\2\u03bc\u03ba\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd\u00e6\3\2\2\2\u03be", - "\u03bc\3\2\2\2\u03bf\u03c1\5\u00e9u\2\u03c0\u03c2\5\u00efx\2\u03c1\u03c0", - "\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03c1\3\2\2\2\u03c3\u03c4\3\2\2\2", - "\u03c4\u00e8\3\2\2\2\u03c5\u03c6\7\62\2\2\u03c6\u03c7\t\4\2\2\u03c7", - "\u00ea\3\2\2\2\u03c8\u03c9\t\5\2\2\u03c9\u00ec\3\2\2\2\u03ca\u03cb\t", - "\6\2\2\u03cb\u00ee\3\2\2\2\u03cc\u03cd\t\7\2\2\u03cd\u00f0\3\2\2\2\u03ce", - "\u03d0\5\u00f3z\2\u03cf\u03d1\5\u00f5{\2\u03d0\u03cf\3\2\2\2\u03d0\u03d1", - "\3\2\2\2\u03d1\u03de\3\2\2\2\u03d2\u03d3\5\u00f3z\2\u03d3\u03d4\5\u00f7", - "|\2\u03d4\u03de\3\2\2\2\u03d5\u03d7\5\u00f5{\2\u03d6\u03d8\5\u00f3z", - "\2\u03d7\u03d6\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03de\3\2\2\2\u03d9", - "\u03db\5\u00f7|\2\u03da\u03dc\5\u00f3z\2\u03db\u03da\3\2\2\2\u03db\u03dc", - "\3\2\2\2\u03dc\u03de\3\2\2\2\u03dd\u03ce\3\2\2\2\u03dd\u03d2\3\2\2\2", - "\u03dd\u03d5\3\2\2\2\u03dd\u03d9\3\2\2\2\u03de\u00f2\3\2\2\2\u03df\u03e0", - "\t\b\2\2\u03e0\u00f4\3\2\2\2\u03e1\u03e2\t\t\2\2\u03e2\u00f6\3\2\2\2", - "\u03e3\u03e4\7n\2\2\u03e4\u03e8\7n\2\2\u03e5\u03e6\7N\2\2\u03e6\u03e8", - "\7N\2\2\u03e7\u03e3\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u00f8\3\2\2\2", - "\u03e9\u03ec\5\u00fb~\2\u03ea\u03ec\5\u00fd\177\2\u03eb\u03e9\3\2\2", - "\2\u03eb\u03ea\3\2\2\2\u03ec\u00fa\3\2\2\2\u03ed\u03ef\5\u00ff\u0080", - "\2\u03ee\u03f0\5\u0101\u0081\2\u03ef\u03ee\3\2\2\2\u03ef\u03f0\3\2\2", - "\2\u03f0\u03f2\3\2\2\2\u03f1\u03f3\5\u010d\u0087\2\u03f2\u03f1\3\2\2", - "\2\u03f2\u03f3\3\2\2\2\u03f3\u03fa\3\2\2\2\u03f4\u03f5\5\u0105\u0083", - "\2\u03f5\u03f7\5\u0101\u0081\2\u03f6\u03f8\5\u010d\u0087\2\u03f7\u03f6", - "\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u03fa\3\2\2\2\u03f9\u03ed\3\2\2\2", - "\u03f9\u03f4\3\2\2\2\u03fa\u00fc\3\2\2\2\u03fb\u03fc\5\u00e9u\2\u03fc", - "\u03fd\5\u0107\u0084\2\u03fd\u03ff\5\u0109\u0085\2\u03fe\u0400\5\u010d", - "\u0087\2\u03ff\u03fe\3\2\2\2\u03ff\u0400\3\2\2\2\u0400\u0408\3\2\2\2", - "\u0401\u0402\5\u00e9u\2\u0402\u0403\5\u010b\u0086\2\u0403\u0405\5\u0109", - "\u0085\2\u0404\u0406\5\u010d\u0087\2\u0405\u0404\3\2\2\2\u0405\u0406", - "\3\2\2\2\u0406\u0408\3\2\2\2\u0407\u03fb\3\2\2\2\u0407\u0401\3\2\2\2", - "\u0408\u00fe\3\2\2\2\u0409\u040b\5\u0105\u0083\2\u040a\u0409\3\2\2\2", - "\u040a\u040b\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u040d\7\60\2\2\u040d", - "\u0412\5\u0105\u0083\2\u040e\u040f\5\u0105\u0083\2\u040f\u0410\7\60", - "\2\2\u0410\u0412\3\2\2\2\u0411\u040a\3\2\2\2\u0411\u040e\3\2\2\2\u0412", - "\u0100\3\2\2\2\u0413\u0415\7g\2\2\u0414\u0416\5\u0103\u0082\2\u0415", - "\u0414\3\2\2\2\u0415\u0416\3\2\2\2\u0416\u0417\3\2\2\2\u0417\u041e\5", - "\u0105\u0083\2\u0418\u041a\7G\2\2\u0419\u041b\5\u0103\u0082\2\u041a", - "\u0419\3\2\2\2\u041a\u041b\3\2\2\2\u041b\u041c\3\2\2\2\u041c\u041e\5", - "\u0105\u0083\2\u041d\u0413\3\2\2\2\u041d\u0418\3\2\2\2\u041e\u0102\3", - "\2\2\2\u041f\u0420\t\n\2\2\u0420\u0104\3\2\2\2\u0421\u0423\5\u00d9m", - "\2\u0422\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u0422\3\2\2\2\u0424", - "\u0425\3\2\2\2\u0425\u0106\3\2\2\2\u0426\u0428\5\u010b\u0086\2\u0427", - "\u0426\3\2\2\2\u0427\u0428\3\2\2\2\u0428\u0429\3\2\2\2\u0429\u042a\7", - "\60\2\2\u042a\u042f\5\u010b\u0086\2\u042b\u042c\5\u010b\u0086\2\u042c", - "\u042d\7\60\2\2\u042d\u042f\3\2\2\2\u042e\u0427\3\2\2\2\u042e\u042b", - "\3\2\2\2\u042f\u0108\3\2\2\2\u0430\u0432\7r\2\2\u0431\u0433\5\u0103", - "\u0082\2\u0432\u0431\3\2\2\2\u0432\u0433\3\2\2\2\u0433\u0434\3\2\2\2", - "\u0434\u043b\5\u0105\u0083\2\u0435\u0437\7R\2\2\u0436\u0438\5\u0103", - "\u0082\2\u0437\u0436\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\3\2\2\2", - "\u0439\u043b\5\u0105\u0083\2\u043a\u0430\3\2\2\2\u043a\u0435\3\2\2\2", - "\u043b\u010a\3\2\2\2\u043c\u043e\5\u00efx\2\u043d\u043c\3\2\2\2\u043e", - "\u043f\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u0440\3\2\2\2\u0440\u010c\3", - "\2\2\2\u0441\u0442\t\13\2\2\u0442\u010e\3\2\2\2\u0443\u0444\7)\2\2\u0444", - "\u0445\5\u0111\u0089\2\u0445\u0446\7)\2\2\u0446\u045a\3\2\2\2\u0447", - "\u0448\7N\2\2\u0448\u0449\7)\2\2\u0449\u044a\3\2\2\2\u044a\u044b\5\u0111", - "\u0089\2\u044b\u044c\7)\2\2\u044c\u045a\3\2\2\2\u044d\u044e\7w\2\2\u044e", - "\u044f\7)\2\2\u044f\u0450\3\2\2\2\u0450\u0451\5\u0111\u0089\2\u0451", - "\u0452\7)\2\2\u0452\u045a\3\2\2\2\u0453\u0454\7W\2\2\u0454\u0455\7)", - "\2\2\u0455\u0456\3\2\2\2\u0456\u0457\5\u0111\u0089\2\u0457\u0458\7)", - "\2\2\u0458\u045a\3\2\2\2\u0459\u0443\3\2\2\2\u0459\u0447\3\2\2\2\u0459", - "\u044d\3\2\2\2\u0459\u0453\3\2\2\2\u045a\u0110\3\2\2\2\u045b\u045d\5", - "\u0113\u008a\2\u045c\u045b\3\2\2\2\u045d\u045e\3\2\2\2\u045e\u045c\3", - "\2\2\2\u045e\u045f\3\2\2\2\u045f\u0112\3\2\2\2\u0460\u0463\n\f\2\2\u0461", - "\u0463\5\u0115\u008b\2\u0462\u0460\3\2\2\2\u0462\u0461\3\2\2\2\u0463", - "\u0114\3\2\2\2\u0464\u0469\5\u0117\u008c\2\u0465\u0469\5\u0119\u008d", - "\2\u0466\u0469\5\u011b\u008e\2\u0467\u0469\5\u00dbn\2\u0468\u0464\3", - "\2\2\2\u0468\u0465\3\2\2\2\u0468\u0466\3\2\2\2\u0468\u0467\3\2\2\2\u0469", - "\u0116\3\2\2\2\u046a\u046b\7^\2\2\u046b\u046c\t\r\2\2\u046c\u0118\3", - "\2\2\2\u046d\u046e\7^\2\2\u046e\u0479\5\u00edw\2\u046f\u0470\7^\2\2", - "\u0470\u0471\5\u00edw\2\u0471\u0472\5\u00edw\2\u0472\u0479\3\2\2\2\u0473", - "\u0474\7^\2\2\u0474\u0475\5\u00edw\2\u0475\u0476\5\u00edw\2\u0476\u0477", - "\5\u00edw\2\u0477\u0479\3\2\2\2\u0478\u046d\3\2\2\2\u0478\u046f\3\2", - "\2\2\u0478\u0473\3\2\2\2\u0479\u011a\3\2\2\2\u047a\u047b\7^\2\2\u047b", - "\u047c\7z\2\2\u047c\u047e\3\2\2\2\u047d\u047f\5\u00efx\2\u047e\u047d", - "\3\2\2\2\u047f\u0480\3\2\2\2\u0480\u047e\3\2\2\2\u0480\u0481\3\2\2\2", - "\u0481\u011c\3\2\2\2\u0482\u0484\5\u0121\u0091\2\u0483\u0482\3\2\2\2", - "\u0483\u0484\3\2\2\2\u0484\u0485\3\2\2\2\u0485\u0487\7$\2\2\u0486\u0488", - "\5\u0123\u0092\2\u0487\u0486\3\2\2\2\u0487\u0488\3\2\2\2\u0488\u0489", - "\3\2\2\2\u0489\u048a\7$\2\2\u048a\u011e\3\2\2\2\u048b\u048c\7>\2\2\u048c", - "\u048d\5\u0123\u0092\2\u048d\u048e\7@\2\2\u048e\u0120\3\2\2\2\u048f", - "\u0490\7w\2\2\u0490\u0493\7:\2\2\u0491\u0493\t\16\2\2\u0492\u048f\3", - "\2\2\2\u0492\u0491\3\2\2\2\u0493\u0122\3\2\2\2\u0494\u0496\5\u0125\u0093", - "\2\u0495\u0494\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0495\3\2\2\2\u0497", - "\u0498\3\2\2\2\u0498\u0124\3\2\2\2\u0499\u049c\n\17\2\2\u049a\u049c", - "\5\u0115\u008b\2\u049b\u0499\3\2\2\2\u049b\u049a\3\2\2\2\u049c\u0126", - "\3\2\2\2\u049d\u04a1\7%\2\2\u049e\u04a0\t\20\2\2\u049f\u049e\3\2\2\2", - "\u04a0\u04a3\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a1\u049f\3\2\2\2\u04a2\u04a7", - "\3\2\2\2\u04a3\u04a1\3\2\2\2\u04a4\u04a6\n\21\2\2\u04a5\u04a4\3\2\2", - "\2\u04a6\u04a9\3\2\2\2\u04a7\u04a5\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8", - "\u04aa\3\2\2\2\u04a9\u04a7\3\2\2\2\u04aa\u04ab\b\u0094\2\2\u04ab\u0128", - "\3\2\2\2\u04ac\u04ae\t\22\2\2\u04ad\u04ac\3\2\2\2\u04ae\u04af\3\2\2", - "\2\u04af\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04b1\3\2\2\2\u04b1", - "\u04b2\b\u0095\2\2\u04b2\u012a\3\2\2\2\u04b3\u04b5\7\17\2\2\u04b4\u04b6", - "\7\f\2\2\u04b5\u04b4\3\2\2\2\u04b5\u04b6\3\2\2\2\u04b6\u04b9\3\2\2\2", - "\u04b7\u04b9\7\f\2\2\u04b8\u04b3\3\2\2\2\u04b8\u04b7\3\2\2\2\u04b9\u04ba", - "\3\2\2\2\u04ba\u04bb\b\u0096\2\2\u04bb\u012c\3\2\2\2\u04bc\u04bd\7\61", - "\2\2\u04bd\u04be\7,\2\2\u04be\u04c2\3\2\2\2\u04bf\u04c1\13\2\2\2\u04c0", - "\u04bf\3\2\2\2\u04c1\u04c4\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c2\u04c0\3", - "\2\2\2\u04c3\u04c5\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c5\u04c6\7,\2\2\u04c6", - "\u04c7\7\61\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04c9\b\u0097\2\2\u04c9\u012e", - "\3\2\2\2\u04ca\u04cb\7\61\2\2\u04cb\u04cc\7\61\2\2\u04cc\u04d0\3\2\2", - "\2\u04cd\u04cf\n\21\2\2\u04ce\u04cd\3\2\2\2\u04cf\u04d2\3\2\2\2\u04d0", - "\u04ce\3\2\2\2\u04d0\u04d1\3\2\2\2\u04d1\u04d3\3\2\2\2\u04d2\u04d0\3", - "\2\2\2\u04d3\u04d4\b\u0098\2\2\u04d4\u0130\3\2\2\2:\2\u0380\u0382\u0387", - "\u0397\u03a1\u03a5\u03a9\u03ad\u03af\u03b5\u03bc\u03c3\u03d0\u03d7\u03db", - "\u03dd\u03e7\u03eb\u03ef\u03f2\u03f7\u03f9\u03ff\u0405\u0407\u040a\u0411", - "\u0415\u041a\u041d\u0424\u0427\u042e\u0432\u0437\u043a\u043f\u0459\u045e", - "\u0462\u0468\u0478\u0480\u0483\u0487\u0492\u0497\u049b\u04a1\u04a7\u04af", - "\u04b5\u04b8\u04c2\u04d0\3\b\2\2"].join(""); + "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088", + "\3\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u0458\n\u0088\3\u0089\6\u0089", + "\u045b\n\u0089\r\u0089\16\u0089\u045c\3\u008a\3\u008a\5\u008a\u0461", + "\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0467\n\u008b\3\u008c", + "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d", + "\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0477\n\u008d\3\u008e\3\u008e", + "\3\u008e\3\u008e\6\u008e\u047d\n\u008e\r\u008e\16\u008e\u047e\3\u008f", + "\5\u008f\u0482\n\u008f\3\u008f\3\u008f\5\u008f\u0486\n\u008f\3\u008f", + "\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090\u048d\n\u0090\3\u0091\6\u0091", + "\u0490\n\u0091\r\u0091\16\u0091\u0491\3\u0092\3\u0092\5\u0092\u0496", + "\n\u0092\3\u0093\3\u0093\7\u0093\u049a\n\u0093\f\u0093\16\u0093\u049d", + "\13\u0093\3\u0093\7\u0093\u04a0\n\u0093\f\u0093\16\u0093\u04a3\13\u0093", + "\3\u0093\3\u0093\3\u0094\6\u0094\u04a8\n\u0094\r\u0094\16\u0094\u04a9", + "\3\u0094\3\u0094\3\u0095\3\u0095\5\u0095\u04b0\n\u0095\3\u0095\5\u0095", + "\u04b3\n\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\7\u0096", + "\u04bb\n\u0096\f\u0096\16\u0096\u04be\13\u0096\3\u0096\3\u0096\3\u0096", + "\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\7\u0097\u04c9\n\u0097", + "\f\u0097\16\u0097\u04cc\13\u0097\3\u0097\3\u0097\4\u049b\u04bc\2\u0098", + "\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20", + "\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36", + ";\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k", + "\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b", + "G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009f", + "Q\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3", + "[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7", + "e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5\2\u00d7\2\u00d9\2", + "\u00db\2\u00dd\2\u00dfl\u00e1\2\u00e3\2\u00e5\2\u00e7\2\u00e9\2\u00eb", + "\2\u00ed\2\u00ef\2\u00f1\2\u00f3\2\u00f5\2\u00f7\2\u00f9\2\u00fb\2\u00fd", + "\2\u00ff\2\u0101\2\u0103\2\u0105\2\u0107\2\u0109\2\u010b\2\u010d\2\u010f", + "\2\u0111\2\u0113\2\u0115\2\u0117\2\u0119\2\u011b\2\u011dm\u011f\2\u0121", + "\2\u0123\2\u0125n\u0127o\u0129p\u012bq\u012dr\3\2\23\5\2C\\aac|\3\2", + "\62;\4\2ZZzz\3\2\63;\3\2\629\5\2\62;CHch\4\2WWww\4\2NNnn\4\2--//\6\2", + "HHNNhhnn\6\2\f\f\17\17))^^\f\2$$))AA^^cdhhppttvvxx\5\2NNWWww\6\2\f\f", + "\17\17$$^^\5\2\f\f\17\17``\4\2\f\f\17\17\4\2\13\13\"\"\u04e8\2\3\3\2", + "\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2", + "\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31", + "\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2", + "\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2", + "\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2", + ";\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G", + "\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3", + "\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2", + "\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2", + "\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2", + "\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083", + "\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2", + "\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2", + "\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d", + "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2", + "\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2", + "\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7", + "\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2", + "\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2", + "\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1", + "\3\2\2\2\2\u00d3\3\2\2\2\2\u00df\3\2\2\2\2\u011d\3\2\2\2\2\u0125\3\2", + "\2\2\2\u0127\3\2\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2", + "\3\u012f\3\2\2\2\5\u013d\3\2\2\2\7\u014e\3\2\2\2\t\u0161\3\2\2\2\13", + "\u0168\3\2\2\2\r\u0170\3\2\2\2\17\u0178\3\2\2\2\21\u0183\3\2\2\2\23", + "\u018e\3\2\2\2\25\u0198\3\2\2\2\27\u01a3\3\2\2\2\31\u01a9\3\2\2\2\33", + "\u01b7\3\2\2\2\35\u01bf\3\2\2\2\37\u01cc\3\2\2\2!\u01d1\3\2\2\2#\u01d7", + "\3\2\2\2%\u01dc\3\2\2\2\'\u01e1\3\2\2\2)\u01e7\3\2\2\2+\u01f0\3\2\2", + "\2-\u01f8\3\2\2\2/\u01fb\3\2\2\2\61\u0202\3\2\2\2\63\u0207\3\2\2\2\65", + "\u020c\3\2\2\2\67\u0213\3\2\2\29\u0219\3\2\2\2;\u021d\3\2\2\2=\u0222", + "\3\2\2\2?\u0225\3\2\2\2A\u022c\3\2\2\2C\u0230\3\2\2\2E\u0235\3\2\2\2", + "G\u023e\3\2\2\2I\u0247\3\2\2\2K\u024e\3\2\2\2M\u0254\3\2\2\2O\u025b", + "\3\2\2\2Q\u0262\3\2\2\2S\u0269\3\2\2\2U\u0270\3\2\2\2W\u0277\3\2\2\2", + "Y\u027f\3\2\2\2[\u0285\3\2\2\2]\u028e\3\2\2\2_\u0293\3\2\2\2a\u029c", + "\3\2\2\2c\u02a2\3\2\2\2e\u02ab\3\2\2\2g\u02b4\3\2\2\2i\u02bc\3\2\2\2", + "k\u02c2\3\2\2\2m\u02cb\3\2\2\2o\u02d4\3\2\2\2q\u02df\3\2\2\2s\u02e9", + "\3\2\2\2u\u02f8\3\2\2\2w\u0306\3\2\2\2y\u0308\3\2\2\2{\u030a\3\2\2\2", + "}\u030c\3\2\2\2\177\u030e\3\2\2\2\u0081\u0310\3\2\2\2\u0083\u0312\3", + "\2\2\2\u0085\u0314\3\2\2\2\u0087\u0317\3\2\2\2\u0089\u0319\3\2\2\2\u008b", + "\u031c\3\2\2\2\u008d\u031f\3\2\2\2\u008f\u0322\3\2\2\2\u0091\u0324\3", + "\2\2\2\u0093\u0327\3\2\2\2\u0095\u0329\3\2\2\2\u0097\u032c\3\2\2\2\u0099", + "\u032e\3\2\2\2\u009b\u0330\3\2\2\2\u009d\u0332\3\2\2\2\u009f\u0334\3", + "\2\2\2\u00a1\u0336\3\2\2\2\u00a3\u0339\3\2\2\2\u00a5\u033c\3\2\2\2\u00a7", + "\u033e\3\2\2\2\u00a9\u0340\3\2\2\2\u00ab\u0342\3\2\2\2\u00ad\u0344\3", + "\2\2\2\u00af\u0346\3\2\2\2\u00b1\u0348\3\2\2\2\u00b3\u034a\3\2\2\2\u00b5", + "\u034c\3\2\2\2\u00b7\u034f\3\2\2\2\u00b9\u0352\3\2\2\2\u00bb\u0355\3", + "\2\2\2\u00bd\u0358\3\2\2\2\u00bf\u035b\3\2\2\2\u00c1\u035f\3\2\2\2\u00c3", + "\u0363\3\2\2\2\u00c5\u0366\3\2\2\2\u00c7\u0369\3\2\2\2\u00c9\u036c\3", + "\2\2\2\u00cb\u036f\3\2\2\2\u00cd\u0372\3\2\2\2\u00cf\u0375\3\2\2\2\u00d1", + "\u0377\3\2\2\2\u00d3\u037b\3\2\2\2\u00d5\u0385\3\2\2\2\u00d7\u0387\3", + "\2\2\2\u00d9\u0389\3\2\2\2\u00db\u0395\3\2\2\2\u00dd\u0397\3\2\2\2\u00df", + "\u039f\3\2\2\2\u00e1\u03ad\3\2\2\2\u00e3\u03af\3\2\2\2\u00e5\u03b6\3", + "\2\2\2\u00e7\u03bd\3\2\2\2\u00e9\u03c3\3\2\2\2\u00eb\u03c6\3\2\2\2\u00ed", + "\u03c8\3\2\2\2\u00ef\u03ca\3\2\2\2\u00f1\u03db\3\2\2\2\u00f3\u03dd\3", + "\2\2\2\u00f5\u03df\3\2\2\2\u00f7\u03e5\3\2\2\2\u00f9\u03e9\3\2\2\2\u00fb", + "\u03f7\3\2\2\2\u00fd\u0405\3\2\2\2\u00ff\u040f\3\2\2\2\u0101\u041b\3", + "\2\2\2\u0103\u041d\3\2\2\2\u0105\u0420\3\2\2\2\u0107\u042c\3\2\2\2\u0109", + "\u0438\3\2\2\2\u010b\u043b\3\2\2\2\u010d\u043f\3\2\2\2\u010f\u0457\3", + "\2\2\2\u0111\u045a\3\2\2\2\u0113\u0460\3\2\2\2\u0115\u0466\3\2\2\2\u0117", + "\u0468\3\2\2\2\u0119\u0476\3\2\2\2\u011b\u0478\3\2\2\2\u011d\u0481\3", + "\2\2\2\u011f\u048c\3\2\2\2\u0121\u048f\3\2\2\2\u0123\u0495\3\2\2\2\u0125", + "\u0497\3\2\2\2\u0127\u04a7\3\2\2\2\u0129\u04b2\3\2\2\2\u012b\u04b6\3", + "\2\2\2\u012d\u04c4\3\2\2\2\u012f\u0130\7a\2\2\u0130\u0131\7a\2\2\u0131", + "\u0132\7g\2\2\u0132\u0133\7z\2\2\u0133\u0134\7v\2\2\u0134\u0135\7g\2", + "\2\u0135\u0136\7p\2\2\u0136\u0137\7u\2\2\u0137\u0138\7k\2\2\u0138\u0139", + "\7q\2\2\u0139\u013a\7p\2\2\u013a\u013b\7a\2\2\u013b\u013c\7a\2\2\u013c", + "\4\3\2\2\2\u013d\u013e\7a\2\2\u013e\u013f\7a\2\2\u013f\u0140\7d\2\2", + "\u0140\u0141\7w\2\2\u0141\u0142\7k\2\2\u0142\u0143\7n\2\2\u0143\u0144", + "\7v\2\2\u0144\u0145\7k\2\2\u0145\u0146\7p\2\2\u0146\u0147\7a\2\2\u0147", + "\u0148\7x\2\2\u0148\u0149\7c\2\2\u0149\u014a\7a\2\2\u014a\u014b\7c\2", + "\2\u014b\u014c\7t\2\2\u014c\u014d\7i\2\2\u014d\6\3\2\2\2\u014e\u014f", + "\7a\2\2\u014f\u0150\7a\2\2\u0150\u0151\7d\2\2\u0151\u0152\7w\2\2\u0152", + "\u0153\7k\2\2\u0153\u0154\7n\2\2\u0154\u0155\7v\2\2\u0155\u0156\7k\2", + "\2\u0156\u0157\7p\2\2\u0157\u0158\7a\2\2\u0158\u0159\7q\2\2\u0159\u015a", + "\7h\2\2\u015a\u015b\7h\2\2\u015b\u015c\7u\2\2\u015c\u015d\7g\2\2\u015d", + "\u015e\7v\2\2\u015e\u015f\7q\2\2\u015f\u0160\7h\2\2\u0160\b\3\2\2\2", + "\u0161\u0162\7a\2\2\u0162\u0163\7a\2\2\u0163\u0164\7o\2\2\u0164\u0165", + "\7\63\2\2\u0165\u0166\7\64\2\2\u0166\u0167\7:\2\2\u0167\n\3\2\2\2\u0168", + "\u0169\7a\2\2\u0169\u016a\7a\2\2\u016a\u016b\7o\2\2\u016b\u016c\7\63", + "\2\2\u016c\u016d\7\64\2\2\u016d\u016e\7:\2\2\u016e\u016f\7f\2\2\u016f", + "\f\3\2\2\2\u0170\u0171\7a\2\2\u0171\u0172\7a\2\2\u0172\u0173\7o\2\2", + "\u0173\u0174\7\63\2\2\u0174\u0175\7\64\2\2\u0175\u0176\7:\2\2\u0176", + "\u0177\7k\2\2\u0177\16\3\2\2\2\u0178\u0179\7a\2\2\u0179\u017a\7a\2\2", + "\u017a\u017b\7v\2\2\u017b\u017c\7{\2\2\u017c\u017d\7r\2\2\u017d\u017e", + "\7g\2\2\u017e\u017f\7q\2\2\u017f\u0180\7h\2\2\u0180\u0181\7a\2\2\u0181", + "\u0182\7a\2\2\u0182\20\3\2\2\2\u0183\u0184\7a\2\2\u0184\u0185\7a\2\2", + "\u0185\u0186\7k\2\2\u0186\u0187\7p\2\2\u0187\u0188\7n\2\2\u0188\u0189", + "\7k\2\2\u0189\u018a\7p\2\2\u018a\u018b\7g\2\2\u018b\u018c\7a\2\2\u018c", + "\u018d\7a\2\2\u018d\22\3\2\2\2\u018e\u018f\7a\2\2\u018f\u0190\7a\2\2", + "\u0190\u0191\7u\2\2\u0191\u0192\7v\2\2\u0192\u0193\7f\2\2\u0193\u0194", + "\7e\2\2\u0194\u0195\7c\2\2\u0195\u0196\7n\2\2\u0196\u0197\7n\2\2\u0197", + "\24\3\2\2\2\u0198\u0199\7a\2\2\u0199\u019a\7a\2\2\u019a\u019b\7f\2\2", + "\u019b\u019c\7g\2\2\u019c\u019d\7e\2\2\u019d\u019e\7n\2\2\u019e\u019f", + "\7u\2\2\u019f\u01a0\7r\2\2\u01a0\u01a1\7g\2\2\u01a1\u01a2\7e\2\2\u01a2", + "\26\3\2\2\2\u01a3\u01a4\7a\2\2\u01a4\u01a5\7a\2\2\u01a5\u01a6\7c\2\2", + "\u01a6\u01a7\7u\2\2\u01a7\u01a8\7o\2\2\u01a8\30\3\2\2\2\u01a9\u01aa", + "\7a\2\2\u01aa\u01ab\7a\2\2\u01ab\u01ac\7c\2\2\u01ac\u01ad\7v\2\2\u01ad", + "\u01ae\7v\2\2\u01ae\u01af\7t\2\2\u01af\u01b0\7k\2\2\u01b0\u01b1\7d\2", + "\2\u01b1\u01b2\7w\2\2\u01b2\u01b3\7v\2\2\u01b3\u01b4\7g\2\2\u01b4\u01b5", + "\7a\2\2\u01b5\u01b6\7a\2\2\u01b6\32\3\2\2\2\u01b7\u01b8\7a\2\2\u01b8", + "\u01b9\7a\2\2\u01b9\u01ba\7c\2\2\u01ba\u01bb\7u\2\2\u01bb\u01bc\7o\2", + "\2\u01bc\u01bd\7a\2\2\u01bd\u01be\7a\2\2\u01be\34\3\2\2\2\u01bf\u01c0", + "\7a\2\2\u01c0\u01c1\7a\2\2\u01c1\u01c2\7x\2\2\u01c2\u01c3\7q\2\2\u01c3", + "\u01c4\7n\2\2\u01c4\u01c5\7c\2\2\u01c5\u01c6\7v\2\2\u01c6\u01c7\7k\2", + "\2\u01c7\u01c8\7n\2\2\u01c8\u01c9\7g\2\2\u01c9\u01ca\7a\2\2\u01ca\u01cb", + "\7a\2\2\u01cb\36\3\2\2\2\u01cc\u01cd\7c\2\2\u01cd\u01ce\7w\2\2\u01ce", + "\u01cf\7v\2\2\u01cf\u01d0\7q\2\2\u01d0 \3\2\2\2\u01d1\u01d2\7d\2\2\u01d2", + "\u01d3\7t\2\2\u01d3\u01d4\7g\2\2\u01d4\u01d5\7c\2\2\u01d5\u01d6\7m\2", + "\2\u01d6\"\3\2\2\2\u01d7\u01d8\7e\2\2\u01d8\u01d9\7c\2\2\u01d9\u01da", + "\7u\2\2\u01da\u01db\7g\2\2\u01db$\3\2\2\2\u01dc\u01dd\7e\2\2\u01dd\u01de", + "\7j\2\2\u01de\u01df\7c\2\2\u01df\u01e0\7t\2\2\u01e0&\3\2\2\2\u01e1\u01e2", + "\7e\2\2\u01e2\u01e3\7q\2\2\u01e3\u01e4\7p\2\2\u01e4\u01e5\7u\2\2\u01e5", + "\u01e6\7v\2\2\u01e6(\3\2\2\2\u01e7\u01e8\7e\2\2\u01e8\u01e9\7q\2\2\u01e9", + "\u01ea\7p\2\2\u01ea\u01eb\7v\2\2\u01eb\u01ec\7k\2\2\u01ec\u01ed\7p\2", + "\2\u01ed\u01ee\7w\2\2\u01ee\u01ef\7g\2\2\u01ef*\3\2\2\2\u01f0\u01f1", + "\7f\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3\7h\2\2\u01f3\u01f4\7c\2\2\u01f4", + "\u01f5\7w\2\2\u01f5\u01f6\7n\2\2\u01f6\u01f7\7v\2\2\u01f7,\3\2\2\2\u01f8", + "\u01f9\7f\2\2\u01f9\u01fa\7q\2\2\u01fa.\3\2\2\2\u01fb\u01fc\7f\2\2\u01fc", + "\u01fd\7q\2\2\u01fd\u01fe\7w\2\2\u01fe\u01ff\7d\2\2\u01ff\u0200\7n\2", + "\2\u0200\u0201\7g\2\2\u0201\60\3\2\2\2\u0202\u0203\7g\2\2\u0203\u0204", + "\7n\2\2\u0204\u0205\7u\2\2\u0205\u0206\7g\2\2\u0206\62\3\2\2\2\u0207", + "\u0208\7g\2\2\u0208\u0209\7p\2\2\u0209\u020a\7w\2\2\u020a\u020b\7o\2", + "\2\u020b\64\3\2\2\2\u020c\u020d\7g\2\2\u020d\u020e\7z\2\2\u020e\u020f", + "\7v\2\2\u020f\u0210\7g\2\2\u0210\u0211\7t\2\2\u0211\u0212\7p\2\2\u0212", + "\66\3\2\2\2\u0213\u0214\7h\2\2\u0214\u0215\7n\2\2\u0215\u0216\7q\2\2", + "\u0216\u0217\7c\2\2\u0217\u0218\7v\2\2\u02188\3\2\2\2\u0219\u021a\7", + "h\2\2\u021a\u021b\7q\2\2\u021b\u021c\7t\2\2\u021c:\3\2\2\2\u021d\u021e", + "\7i\2\2\u021e\u021f\7q\2\2\u021f\u0220\7v\2\2\u0220\u0221\7q\2\2\u0221", + "<\3\2\2\2\u0222\u0223\7k\2\2\u0223\u0224\7h\2\2\u0224>\3\2\2\2\u0225", + "\u0226\7k\2\2\u0226\u0227\7p\2\2\u0227\u0228\7n\2\2\u0228\u0229\7k\2", + "\2\u0229\u022a\7p\2\2\u022a\u022b\7g\2\2\u022b@\3\2\2\2\u022c\u022d", + "\7k\2\2\u022d\u022e\7p\2\2\u022e\u022f\7v\2\2\u022fB\3\2\2\2\u0230\u0231", + "\7n\2\2\u0231\u0232\7q\2\2\u0232\u0233\7p\2\2\u0233\u0234\7i\2\2\u0234", + "D\3\2\2\2\u0235\u0236\7t\2\2\u0236\u0237\7g\2\2\u0237\u0238\7i\2\2\u0238", + "\u0239\7k\2\2\u0239\u023a\7u\2\2\u023a\u023b\7v\2\2\u023b\u023c\7g\2", + "\2\u023c\u023d\7t\2\2\u023dF\3\2\2\2\u023e\u023f\7t\2\2\u023f\u0240", + "\7g\2\2\u0240\u0241\7u\2\2\u0241\u0242\7v\2\2\u0242\u0243\7t\2\2\u0243", + "\u0244\7k\2\2\u0244\u0245\7e\2\2\u0245\u0246\7v\2\2\u0246H\3\2\2\2\u0247", + "\u0248\7t\2\2\u0248\u0249\7g\2\2\u0249\u024a\7v\2\2\u024a\u024b\7w\2", + "\2\u024b\u024c\7t\2\2\u024c\u024d\7p\2\2\u024dJ\3\2\2\2\u024e\u024f", + "\7u\2\2\u024f\u0250\7j\2\2\u0250\u0251\7q\2\2\u0251\u0252\7t\2\2\u0252", + "\u0253\7v\2\2\u0253L\3\2\2\2\u0254\u0255\7u\2\2\u0255\u0256\7k\2\2\u0256", + "\u0257\7i\2\2\u0257\u0258\7p\2\2\u0258\u0259\7g\2\2\u0259\u025a\7f\2", + "\2\u025aN\3\2\2\2\u025b\u025c\7u\2\2\u025c\u025d\7k\2\2\u025d\u025e", + "\7|\2\2\u025e\u025f\7g\2\2\u025f\u0260\7q\2\2\u0260\u0261\7h\2\2\u0261", + "P\3\2\2\2\u0262\u0263\7u\2\2\u0263\u0264\7v\2\2\u0264\u0265\7c\2\2\u0265", + "\u0266\7v\2\2\u0266\u0267\7k\2\2\u0267\u0268\7e\2\2\u0268R\3\2\2\2\u0269", + "\u026a\7u\2\2\u026a\u026b\7v\2\2\u026b\u026c\7t\2\2\u026c\u026d\7w\2", + "\2\u026d\u026e\7e\2\2\u026e\u026f\7v\2\2\u026fT\3\2\2\2\u0270\u0271", + "\7u\2\2\u0271\u0272\7y\2\2\u0272\u0273\7k\2\2\u0273\u0274\7v\2\2\u0274", + "\u0275\7e\2\2\u0275\u0276\7j\2\2\u0276V\3\2\2\2\u0277\u0278\7v\2\2\u0278", + "\u0279\7{\2\2\u0279\u027a\7r\2\2\u027a\u027b\7g\2\2\u027b\u027c\7f\2", + "\2\u027c\u027d\7g\2\2\u027d\u027e\7h\2\2\u027eX\3\2\2\2\u027f\u0280", + "\7w\2\2\u0280\u0281\7p\2\2\u0281\u0282\7k\2\2\u0282\u0283\7q\2\2\u0283", + "\u0284\7p\2\2\u0284Z\3\2\2\2\u0285\u0286\7w\2\2\u0286\u0287\7p\2\2\u0287", + "\u0288\7u\2\2\u0288\u0289\7k\2\2\u0289\u028a\7i\2\2\u028a\u028b\7p\2", + "\2\u028b\u028c\7g\2\2\u028c\u028d\7f\2\2\u028d\\\3\2\2\2\u028e\u028f", + "\7x\2\2\u028f\u0290\7q\2\2\u0290\u0291\7k\2\2\u0291\u0292\7f\2\2\u0292", + "^\3\2\2\2\u0293\u0294\7x\2\2\u0294\u0295\7q\2\2\u0295\u0296\7n\2\2\u0296", + "\u0297\7c\2\2\u0297\u0298\7v\2\2\u0298\u0299\7k\2\2\u0299\u029a\7n\2", + "\2\u029a\u029b\7g\2\2\u029b`\3\2\2\2\u029c\u029d\7y\2\2\u029d\u029e", + "\7j\2\2\u029e\u029f\7k\2\2\u029f\u02a0\7n\2\2\u02a0\u02a1\7g\2\2\u02a1", + "b\3\2\2\2\u02a2\u02a3\7a\2\2\u02a3\u02a4\7C\2\2\u02a4\u02a5\7n\2\2\u02a5", + "\u02a6\7k\2\2\u02a6\u02a7\7i\2\2\u02a7\u02a8\7p\2\2\u02a8\u02a9\7c\2", + "\2\u02a9\u02aa\7u\2\2\u02aad\3\2\2\2\u02ab\u02ac\7a\2\2\u02ac\u02ad", + "\7C\2\2\u02ad\u02ae\7n\2\2\u02ae\u02af\7k\2\2\u02af\u02b0\7i\2\2\u02b0", + "\u02b1\7p\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3\7h\2\2\u02b3f\3\2\2\2\u02b4", + "\u02b5\7a\2\2\u02b5\u02b6\7C\2\2\u02b6\u02b7\7v\2\2\u02b7\u02b8\7q\2", + "\2\u02b8\u02b9\7o\2\2\u02b9\u02ba\7k\2\2\u02ba\u02bb\7e\2\2\u02bbh\3", + "\2\2\2\u02bc\u02bd\7a\2\2\u02bd\u02be\7D\2\2\u02be\u02bf\7q\2\2\u02bf", + "\u02c0\7q\2\2\u02c0\u02c1\7n\2\2\u02c1j\3\2\2\2\u02c2\u02c3\7a\2\2\u02c3", + "\u02c4\7E\2\2\u02c4\u02c5\7q\2\2\u02c5\u02c6\7o\2\2\u02c6\u02c7\7r\2", + "\2\u02c7\u02c8\7n\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca\7z\2\2\u02cal\3", + "\2\2\2\u02cb\u02cc\7a\2\2\u02cc\u02cd\7I\2\2\u02cd\u02ce\7g\2\2\u02ce", + "\u02cf\7p\2\2\u02cf\u02d0\7g\2\2\u02d0\u02d1\7t\2\2\u02d1\u02d2\7k\2", + "\2\u02d2\u02d3\7e\2\2\u02d3n\3\2\2\2\u02d4\u02d5\7a\2\2\u02d5\u02d6", + "\7K\2\2\u02d6\u02d7\7o\2\2\u02d7\u02d8\7c\2\2\u02d8\u02d9\7i\2\2\u02d9", + "\u02da\7k\2\2\u02da\u02db\7p\2\2\u02db\u02dc\7c\2\2\u02dc\u02dd\7t\2", + "\2\u02dd\u02de\7{\2\2\u02dep\3\2\2\2\u02df\u02e0\7a\2\2\u02e0\u02e1", + "\7P\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7t\2\2\u02e3\u02e4\7g\2\2\u02e4", + "\u02e5\7v\2\2\u02e5\u02e6\7w\2\2\u02e6\u02e7\7t\2\2\u02e7\u02e8\7p\2", + "\2\u02e8r\3\2\2\2\u02e9\u02ea\7a\2\2\u02ea\u02eb\7U\2\2\u02eb\u02ec", + "\7v\2\2\u02ec\u02ed\7c\2\2\u02ed\u02ee\7v\2\2\u02ee\u02ef\7k\2\2\u02ef", + "\u02f0\7e\2\2\u02f0\u02f1\7a\2\2\u02f1\u02f2\7c\2\2\u02f2\u02f3\7u\2", + "\2\u02f3\u02f4\7u\2\2\u02f4\u02f5\7g\2\2\u02f5\u02f6\7t\2\2\u02f6\u02f7", + "\7v\2\2\u02f7t\3\2\2\2\u02f8\u02f9\7a\2\2\u02f9\u02fa\7V\2\2\u02fa\u02fb", + "\7j\2\2\u02fb\u02fc\7t\2\2\u02fc\u02fd\7g\2\2\u02fd\u02fe\7c\2\2\u02fe", + "\u02ff\7f\2\2\u02ff\u0300\7a\2\2\u0300\u0301\7n\2\2\u0301\u0302\7q\2", + "\2\u0302\u0303\7e\2\2\u0303\u0304\7c\2\2\u0304\u0305\7n\2\2\u0305v\3", + "\2\2\2\u0306\u0307\7*\2\2\u0307x\3\2\2\2\u0308\u0309\7+\2\2\u0309z\3", + "\2\2\2\u030a\u030b\7]\2\2\u030b|\3\2\2\2\u030c\u030d\7_\2\2\u030d~\3", + "\2\2\2\u030e\u030f\7}\2\2\u030f\u0080\3\2\2\2\u0310\u0311\7\177\2\2", + "\u0311\u0082\3\2\2\2\u0312\u0313\7>\2\2\u0313\u0084\3\2\2\2\u0314\u0315", + "\7>\2\2\u0315\u0316\7?\2\2\u0316\u0086\3\2\2\2\u0317\u0318\7@\2\2\u0318", + "\u0088\3\2\2\2\u0319\u031a\7@\2\2\u031a\u031b\7?\2\2\u031b\u008a\3\2", + "\2\2\u031c\u031d\7>\2\2\u031d\u031e\7>\2\2\u031e\u008c\3\2\2\2\u031f", + "\u0320\7@\2\2\u0320\u0321\7@\2\2\u0321\u008e\3\2\2\2\u0322\u0323\7-", + "\2\2\u0323\u0090\3\2\2\2\u0324\u0325\7-\2\2\u0325\u0326\7-\2\2\u0326", + "\u0092\3\2\2\2\u0327\u0328\7/\2\2\u0328\u0094\3\2\2\2\u0329\u032a\7", + "/\2\2\u032a\u032b\7/\2\2\u032b\u0096\3\2\2\2\u032c\u032d\7,\2\2\u032d", + "\u0098\3\2\2\2\u032e\u032f\7\61\2\2\u032f\u009a\3\2\2\2\u0330\u0331", + "\7\'\2\2\u0331\u009c\3\2\2\2\u0332\u0333\7(\2\2\u0333\u009e\3\2\2\2", + "\u0334\u0335\7~\2\2\u0335\u00a0\3\2\2\2\u0336\u0337\7(\2\2\u0337\u0338", + "\7(\2\2\u0338\u00a2\3\2\2\2\u0339\u033a\7~\2\2\u033a\u033b\7~\2\2\u033b", + "\u00a4\3\2\2\2\u033c\u033d\7`\2\2\u033d\u00a6\3\2\2\2\u033e\u033f\7", + "#\2\2\u033f\u00a8\3\2\2\2\u0340\u0341\7\u0080\2\2\u0341\u00aa\3\2\2", + "\2\u0342\u0343\7A\2\2\u0343\u00ac\3\2\2\2\u0344\u0345\7<\2\2\u0345\u00ae", + "\3\2\2\2\u0346\u0347\7=\2\2\u0347\u00b0\3\2\2\2\u0348\u0349\7.\2\2\u0349", + "\u00b2\3\2\2\2\u034a\u034b\7?\2\2\u034b\u00b4\3\2\2\2\u034c\u034d\7", + ",\2\2\u034d\u034e\7?\2\2\u034e\u00b6\3\2\2\2\u034f\u0350\7\61\2\2\u0350", + "\u0351\7?\2\2\u0351\u00b8\3\2\2\2\u0352\u0353\7\'\2\2\u0353\u0354\7", + "?\2\2\u0354\u00ba\3\2\2\2\u0355\u0356\7-\2\2\u0356\u0357\7?\2\2\u0357", + "\u00bc\3\2\2\2\u0358\u0359\7/\2\2\u0359\u035a\7?\2\2\u035a\u00be\3\2", + "\2\2\u035b\u035c\7>\2\2\u035c\u035d\7>\2\2\u035d\u035e\7?\2\2\u035e", + "\u00c0\3\2\2\2\u035f\u0360\7@\2\2\u0360\u0361\7@\2\2\u0361\u0362\7?", + "\2\2\u0362\u00c2\3\2\2\2\u0363\u0364\7(\2\2\u0364\u0365\7?\2\2\u0365", + "\u00c4\3\2\2\2\u0366\u0367\7`\2\2\u0367\u0368\7?\2\2\u0368\u00c6\3\2", + "\2\2\u0369\u036a\7~\2\2\u036a\u036b\7?\2\2\u036b\u00c8\3\2\2\2\u036c", + "\u036d\7?\2\2\u036d\u036e\7?\2\2\u036e\u00ca\3\2\2\2\u036f\u0370\7#", + "\2\2\u0370\u0371\7?\2\2\u0371\u00cc\3\2\2\2\u0372\u0373\7/\2\2\u0373", + "\u0374\7@\2\2\u0374\u00ce\3\2\2\2\u0375\u0376\7\60\2\2\u0376\u00d0\3", + "\2\2\2\u0377\u0378\7\60\2\2\u0378\u0379\7\60\2\2\u0379\u037a\7\60\2", + "\2\u037a\u00d2\3\2\2\2\u037b\u0380\5\u00d5k\2\u037c\u037f\5\u00d5k\2", + "\u037d\u037f\5\u00d9m\2\u037e\u037c\3\2\2\2\u037e\u037d\3\2\2\2\u037f", + "\u0382\3\2\2\2\u0380\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u00d4\3", + "\2\2\2\u0382\u0380\3\2\2\2\u0383\u0386\5\u00d7l\2\u0384\u0386\5\u00db", + "n\2\u0385\u0383\3\2\2\2\u0385\u0384\3\2\2\2\u0386\u00d6\3\2\2\2\u0387", + "\u0388\t\2\2\2\u0388\u00d8\3\2\2\2\u0389\u038a\t\3\2\2\u038a\u00da\3", + "\2\2\2\u038b\u038c\7^\2\2\u038c\u038d\7w\2\2\u038d\u038e\3\2\2\2\u038e", + "\u0396\5\u00ddo\2\u038f\u0390\7^\2\2\u0390\u0391\7W\2\2\u0391\u0392", + "\3\2\2\2\u0392\u0393\5\u00ddo\2\u0393\u0394\5\u00ddo\2\u0394\u0396\3", + "\2\2\2\u0395\u038b\3\2\2\2\u0395\u038f\3\2\2\2\u0396\u00dc\3\2\2\2\u0397", + "\u0398\5\u00efx\2\u0398\u0399\5\u00efx\2\u0399\u039a\5\u00efx\2\u039a", + "\u039b\5\u00efx\2\u039b\u00de\3\2\2\2\u039c\u03a0\5\u00e1q\2\u039d\u03a0", + "\5\u00f9}\2\u039e\u03a0\5\u010f\u0088\2\u039f\u039c\3\2\2\2\u039f\u039d", + "\3\2\2\2\u039f\u039e\3\2\2\2\u03a0\u00e0\3\2\2\2\u03a1\u03a3\5\u00e3", + "r\2\u03a2\u03a4\5\u00f1y\2\u03a3\u03a2\3\2\2\2\u03a3\u03a4\3\2\2\2\u03a4", + "\u03ae\3\2\2\2\u03a5\u03a7\5\u00e5s\2\u03a6\u03a8\5\u00f1y\2\u03a7\u03a6", + "\3\2\2\2\u03a7\u03a8\3\2\2\2\u03a8\u03ae\3\2\2\2\u03a9\u03ab\5\u00e7", + "t\2\u03aa\u03ac\5\u00f1y\2\u03ab\u03aa\3\2\2\2\u03ab\u03ac\3\2\2\2\u03ac", + "\u03ae\3\2\2\2\u03ad\u03a1\3\2\2\2\u03ad\u03a5\3\2\2\2\u03ad\u03a9\3", + "\2\2\2\u03ae\u00e2\3\2\2\2\u03af\u03b3\5\u00ebv\2\u03b0\u03b2\5\u00d9", + "m\2\u03b1\u03b0\3\2\2\2\u03b2\u03b5\3\2\2\2\u03b3\u03b1\3\2\2\2\u03b3", + "\u03b4\3\2\2\2\u03b4\u00e4\3\2\2\2\u03b5\u03b3\3\2\2\2\u03b6\u03ba\7", + "\62\2\2\u03b7\u03b9\5\u00edw\2\u03b8\u03b7\3\2\2\2\u03b9\u03bc\3\2\2", + "\2\u03ba\u03b8\3\2\2\2\u03ba\u03bb\3\2\2\2\u03bb\u00e6\3\2\2\2\u03bc", + "\u03ba\3\2\2\2\u03bd\u03bf\5\u00e9u\2\u03be\u03c0\5\u00efx\2\u03bf\u03be", + "\3\2\2\2\u03c0\u03c1\3\2\2\2\u03c1\u03bf\3\2\2\2\u03c1\u03c2\3\2\2\2", + "\u03c2\u00e8\3\2\2\2\u03c3\u03c4\7\62\2\2\u03c4\u03c5\t\4\2\2\u03c5", + "\u00ea\3\2\2\2\u03c6\u03c7\t\5\2\2\u03c7\u00ec\3\2\2\2\u03c8\u03c9\t", + "\6\2\2\u03c9\u00ee\3\2\2\2\u03ca\u03cb\t\7\2\2\u03cb\u00f0\3\2\2\2\u03cc", + "\u03ce\5\u00f3z\2\u03cd\u03cf\5\u00f5{\2\u03ce\u03cd\3\2\2\2\u03ce\u03cf", + "\3\2\2\2\u03cf\u03dc\3\2\2\2\u03d0\u03d1\5\u00f3z\2\u03d1\u03d2\5\u00f7", + "|\2\u03d2\u03dc\3\2\2\2\u03d3\u03d5\5\u00f5{\2\u03d4\u03d6\5\u00f3z", + "\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03dc\3\2\2\2\u03d7", + "\u03d9\5\u00f7|\2\u03d8\u03da\5\u00f3z\2\u03d9\u03d8\3\2\2\2\u03d9\u03da", + "\3\2\2\2\u03da\u03dc\3\2\2\2\u03db\u03cc\3\2\2\2\u03db\u03d0\3\2\2\2", + "\u03db\u03d3\3\2\2\2\u03db\u03d7\3\2\2\2\u03dc\u00f2\3\2\2\2\u03dd\u03de", + "\t\b\2\2\u03de\u00f4\3\2\2\2\u03df\u03e0\t\t\2\2\u03e0\u00f6\3\2\2\2", + "\u03e1\u03e2\7n\2\2\u03e2\u03e6\7n\2\2\u03e3\u03e4\7N\2\2\u03e4\u03e6", + "\7N\2\2\u03e5\u03e1\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e6\u00f8\3\2\2\2", + "\u03e7\u03ea\5\u00fb~\2\u03e8\u03ea\5\u00fd\177\2\u03e9\u03e7\3\2\2", + "\2\u03e9\u03e8\3\2\2\2\u03ea\u00fa\3\2\2\2\u03eb\u03ed\5\u00ff\u0080", + "\2\u03ec\u03ee\5\u0101\u0081\2\u03ed\u03ec\3\2\2\2\u03ed\u03ee\3\2\2", + "\2\u03ee\u03f0\3\2\2\2\u03ef\u03f1\5\u010d\u0087\2\u03f0\u03ef\3\2\2", + "\2\u03f0\u03f1\3\2\2\2\u03f1\u03f8\3\2\2\2\u03f2\u03f3\5\u0105\u0083", + "\2\u03f3\u03f5\5\u0101\u0081\2\u03f4\u03f6\5\u010d\u0087\2\u03f5\u03f4", + "\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u03f8\3\2\2\2\u03f7\u03eb\3\2\2\2", + "\u03f7\u03f2\3\2\2\2\u03f8\u00fc\3\2\2\2\u03f9\u03fa\5\u00e9u\2\u03fa", + "\u03fb\5\u0107\u0084\2\u03fb\u03fd\5\u0109\u0085\2\u03fc\u03fe\5\u010d", + "\u0087\2\u03fd\u03fc\3\2\2\2\u03fd\u03fe\3\2\2\2\u03fe\u0406\3\2\2\2", + "\u03ff\u0400\5\u00e9u\2\u0400\u0401\5\u010b\u0086\2\u0401\u0403\5\u0109", + "\u0085\2\u0402\u0404\5\u010d\u0087\2\u0403\u0402\3\2\2\2\u0403\u0404", + "\3\2\2\2\u0404\u0406\3\2\2\2\u0405\u03f9\3\2\2\2\u0405\u03ff\3\2\2\2", + "\u0406\u00fe\3\2\2\2\u0407\u0409\5\u0105\u0083\2\u0408\u0407\3\2\2\2", + "\u0408\u0409\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u040b\7\60\2\2\u040b", + "\u0410\5\u0105\u0083\2\u040c\u040d\5\u0105\u0083\2\u040d\u040e\7\60", + "\2\2\u040e\u0410\3\2\2\2\u040f\u0408\3\2\2\2\u040f\u040c\3\2\2\2\u0410", + "\u0100\3\2\2\2\u0411\u0413\7g\2\2\u0412\u0414\5\u0103\u0082\2\u0413", + "\u0412\3\2\2\2\u0413\u0414\3\2\2\2\u0414\u0415\3\2\2\2\u0415\u041c\5", + "\u0105\u0083\2\u0416\u0418\7G\2\2\u0417\u0419\5\u0103\u0082\2\u0418", + "\u0417\3\2\2\2\u0418\u0419\3\2\2\2\u0419\u041a\3\2\2\2\u041a\u041c\5", + "\u0105\u0083\2\u041b\u0411\3\2\2\2\u041b\u0416\3\2\2\2\u041c\u0102\3", + "\2\2\2\u041d\u041e\t\n\2\2\u041e\u0104\3\2\2\2\u041f\u0421\5\u00d9m", + "\2\u0420\u041f\3\2\2\2\u0421\u0422\3\2\2\2\u0422\u0420\3\2\2\2\u0422", + "\u0423\3\2\2\2\u0423\u0106\3\2\2\2\u0424\u0426\5\u010b\u0086\2\u0425", + "\u0424\3\2\2\2\u0425\u0426\3\2\2\2\u0426\u0427\3\2\2\2\u0427\u0428\7", + "\60\2\2\u0428\u042d\5\u010b\u0086\2\u0429\u042a\5\u010b\u0086\2\u042a", + "\u042b\7\60\2\2\u042b\u042d\3\2\2\2\u042c\u0425\3\2\2\2\u042c\u0429", + "\3\2\2\2\u042d\u0108\3\2\2\2\u042e\u0430\7r\2\2\u042f\u0431\5\u0103", + "\u0082\2\u0430\u042f\3\2\2\2\u0430\u0431\3\2\2\2\u0431\u0432\3\2\2\2", + "\u0432\u0439\5\u0105\u0083\2\u0433\u0435\7R\2\2\u0434\u0436\5\u0103", + "\u0082\2\u0435\u0434\3\2\2\2\u0435\u0436\3\2\2\2\u0436\u0437\3\2\2\2", + "\u0437\u0439\5\u0105\u0083\2\u0438\u042e\3\2\2\2\u0438\u0433\3\2\2\2", + "\u0439\u010a\3\2\2\2\u043a\u043c\5\u00efx\2\u043b\u043a\3\2\2\2\u043c", + "\u043d\3\2\2\2\u043d\u043b\3\2\2\2\u043d\u043e\3\2\2\2\u043e\u010c\3", + "\2\2\2\u043f\u0440\t\13\2\2\u0440\u010e\3\2\2\2\u0441\u0442\7)\2\2\u0442", + "\u0443\5\u0111\u0089\2\u0443\u0444\7)\2\2\u0444\u0458\3\2\2\2\u0445", + "\u0446\7N\2\2\u0446\u0447\7)\2\2\u0447\u0448\3\2\2\2\u0448\u0449\5\u0111", + "\u0089\2\u0449\u044a\7)\2\2\u044a\u0458\3\2\2\2\u044b\u044c\7w\2\2\u044c", + "\u044d\7)\2\2\u044d\u044e\3\2\2\2\u044e\u044f\5\u0111\u0089\2\u044f", + "\u0450\7)\2\2\u0450\u0458\3\2\2\2\u0451\u0452\7W\2\2\u0452\u0453\7)", + "\2\2\u0453\u0454\3\2\2\2\u0454\u0455\5\u0111\u0089\2\u0455\u0456\7)", + "\2\2\u0456\u0458\3\2\2\2\u0457\u0441\3\2\2\2\u0457\u0445\3\2\2\2\u0457", + "\u044b\3\2\2\2\u0457\u0451\3\2\2\2\u0458\u0110\3\2\2\2\u0459\u045b\5", + "\u0113\u008a\2\u045a\u0459\3\2\2\2\u045b\u045c\3\2\2\2\u045c\u045a\3", + "\2\2\2\u045c\u045d\3\2\2\2\u045d\u0112\3\2\2\2\u045e\u0461\n\f\2\2\u045f", + "\u0461\5\u0115\u008b\2\u0460\u045e\3\2\2\2\u0460\u045f\3\2\2\2\u0461", + "\u0114\3\2\2\2\u0462\u0467\5\u0117\u008c\2\u0463\u0467\5\u0119\u008d", + "\2\u0464\u0467\5\u011b\u008e\2\u0465\u0467\5\u00dbn\2\u0466\u0462\3", + "\2\2\2\u0466\u0463\3\2\2\2\u0466\u0464\3\2\2\2\u0466\u0465\3\2\2\2\u0467", + "\u0116\3\2\2\2\u0468\u0469\7^\2\2\u0469\u046a\t\r\2\2\u046a\u0118\3", + "\2\2\2\u046b\u046c\7^\2\2\u046c\u0477\5\u00edw\2\u046d\u046e\7^\2\2", + "\u046e\u046f\5\u00edw\2\u046f\u0470\5\u00edw\2\u0470\u0477\3\2\2\2\u0471", + "\u0472\7^\2\2\u0472\u0473\5\u00edw\2\u0473\u0474\5\u00edw\2\u0474\u0475", + "\5\u00edw\2\u0475\u0477\3\2\2\2\u0476\u046b\3\2\2\2\u0476\u046d\3\2", + "\2\2\u0476\u0471\3\2\2\2\u0477\u011a\3\2\2\2\u0478\u0479\7^\2\2\u0479", + "\u047a\7z\2\2\u047a\u047c\3\2\2\2\u047b\u047d\5\u00efx\2\u047c\u047b", + "\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u047c\3\2\2\2\u047e\u047f\3\2\2\2", + "\u047f\u011c\3\2\2\2\u0480\u0482\5\u011f\u0090\2\u0481\u0480\3\2\2\2", + "\u0481\u0482\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0485\7$\2\2\u0484\u0486", + "\5\u0121\u0091\2\u0485\u0484\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0487", + "\3\2\2\2\u0487\u0488\7$\2\2\u0488\u011e\3\2\2\2\u0489\u048a\7w\2\2\u048a", + "\u048d\7:\2\2\u048b\u048d\t\16\2\2\u048c\u0489\3\2\2\2\u048c\u048b\3", + "\2\2\2\u048d\u0120\3\2\2\2\u048e\u0490\5\u0123\u0092\2\u048f\u048e\3", + "\2\2\2\u0490\u0491\3\2\2\2\u0491\u048f\3\2\2\2\u0491\u0492\3\2\2\2\u0492", + "\u0122\3\2\2\2\u0493\u0496\n\17\2\2\u0494\u0496\5\u0115\u008b\2\u0495", + "\u0493\3\2\2\2\u0495\u0494\3\2\2\2\u0496\u0124\3\2\2\2\u0497\u049b\7", + "%\2\2\u0498\u049a\t\20\2\2\u0499\u0498\3\2\2\2\u049a\u049d\3\2\2\2\u049b", + "\u049c\3\2\2\2\u049b\u0499\3\2\2\2\u049c\u04a1\3\2\2\2\u049d\u049b\3", + "\2\2\2\u049e\u04a0\n\21\2\2\u049f\u049e\3\2\2\2\u04a0\u04a3\3\2\2\2", + "\u04a1\u049f\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a4\3\2\2\2\u04a3\u04a1", + "\3\2\2\2\u04a4\u04a5\b\u0093\2\2\u04a5\u0126\3\2\2\2\u04a6\u04a8\t\22", + "\2\2\u04a7\u04a6\3\2\2\2\u04a8\u04a9\3\2\2\2\u04a9\u04a7\3\2\2\2\u04a9", + "\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ac\b\u0094\2\2\u04ac\u0128", + "\3\2\2\2\u04ad\u04af\7\17\2\2\u04ae\u04b0\7\f\2\2\u04af\u04ae\3\2\2", + "\2\u04af\u04b0\3\2\2\2\u04b0\u04b3\3\2\2\2\u04b1\u04b3\7\f\2\2\u04b2", + "\u04ad\3\2\2\2\u04b2\u04b1\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4\u04b5\b", + "\u0095\2\2\u04b5\u012a\3\2\2\2\u04b6\u04b7\7\61\2\2\u04b7\u04b8\7,\2", + "\2\u04b8\u04bc\3\2\2\2\u04b9\u04bb\13\2\2\2\u04ba\u04b9\3\2\2\2\u04bb", + "\u04be\3\2\2\2\u04bc\u04bd\3\2\2\2\u04bc\u04ba\3\2\2\2\u04bd\u04bf\3", + "\2\2\2\u04be\u04bc\3\2\2\2\u04bf\u04c0\7,\2\2\u04c0\u04c1\7\61\2\2\u04c1", + "\u04c2\3\2\2\2\u04c2\u04c3\b\u0096\2\2\u04c3\u012c\3\2\2\2\u04c4\u04c5", + "\7\61\2\2\u04c5\u04c6\7\61\2\2\u04c6\u04ca\3\2\2\2\u04c7\u04c9\n\21", + "\2\2\u04c8\u04c7\3\2\2\2\u04c9\u04cc\3\2\2\2\u04ca\u04c8\3\2\2\2\u04ca", + "\u04cb\3\2\2\2\u04cb\u04cd\3\2\2\2\u04cc\u04ca\3\2\2\2\u04cd\u04ce\b", + "\u0097\2\2\u04ce\u012e\3\2\2\2:\2\u037e\u0380\u0385\u0395\u039f\u03a3", + "\u03a7\u03ab\u03ad\u03b3\u03ba\u03c1\u03ce\u03d5\u03d9\u03db\u03e5\u03e9", + "\u03ed\u03f0\u03f5\u03f7\u03fd\u0403\u0405\u0408\u040f\u0413\u0418\u041b", + "\u0422\u0425\u042c\u0430\u0435\u0438\u043d\u0457\u045c\u0460\u0466\u0476", + "\u047e\u0481\u0485\u048c\u0491\u0495\u049b\u04a1\u04a9\u04af\u04b2\u04bc", + "\u04ca\3\b\2\2"].join(""); var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); @@ -585,12 +583,11 @@ CLexer.Ellipsis = 104; CLexer.Identifier = 105; CLexer.Constant = 106; CLexer.StringLiteral = 107; -CLexer.SharedIncludeLiteral = 108; -CLexer.Directive = 109; -CLexer.Whitespace = 110; -CLexer.Newline = 111; -CLexer.BlockComment = 112; -CLexer.LineComment = 113; +CLexer.Directive = 108; +CLexer.Whitespace = 109; +CLexer.Newline = 110; +CLexer.BlockComment = 111; +CLexer.LineComment = 112; CLexer.modeNames = [ "DEFAULT_MODE" ]; @@ -638,9 +635,8 @@ CLexer.symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', "MinusAssign", "LeftShiftAssign", "RightShiftAssign", "AndAssign", "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", - "Constant", "StringLiteral", "SharedIncludeLiteral", - "Directive", "Whitespace", "Newline", "BlockComment", - "LineComment" ]; + "Constant", "StringLiteral", "Directive", "Whitespace", + "Newline", "BlockComment", "LineComment" ]; CLexer.ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", "T__9", "T__10", "T__11", "T__12", @@ -673,9 +669,9 @@ CLexer.ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "HexadecimalDigitSequence", "FloatingSuffix", "CharacterConstant", "CCharSequence", "CChar", "EscapeSequence", "SimpleEscapeSequence", "OctalEscapeSequence", "HexadecimalEscapeSequence", - "StringLiteral", "SharedIncludeLiteral", "EncodingPrefix", - "SCharSequence", "SChar", "Directive", "Whitespace", - "Newline", "BlockComment", "LineComment" ]; + "StringLiteral", "EncodingPrefix", "SCharSequence", + "SChar", "Directive", "Whitespace", "Newline", "BlockComment", + "LineComment" ]; CLexer.grammarFileName = "C.g4"; diff --git a/antlr/CLexer.tokens b/antlr/CLexer.tokens index c5ebf233..433c241e 100644 --- a/antlr/CLexer.tokens +++ b/antlr/CLexer.tokens @@ -105,12 +105,11 @@ Ellipsis=104 Identifier=105 Constant=106 StringLiteral=107 -SharedIncludeLiteral=108 -Directive=109 -Whitespace=110 -Newline=111 -BlockComment=112 -LineComment=113 +Directive=108 +Whitespace=109 +Newline=110 +BlockComment=111 +LineComment=112 '__extension__'=1 '__builtin_va_arg'=2 '__builtin_offsetof'=3 diff --git a/antlr/CParser.js b/antlr/CParser.js index f2c53b16..c0a6cca3 100644 --- a/antlr/CParser.js +++ b/antlr/CParser.js @@ -5,7 +5,7 @@ var CListener = require('./CListener').CListener; var grammarFileName = "C.g4"; var serializedATN = ["\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd", - "\3s\u0af4\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", + "\3r\u0af4\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4", "\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t", "\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27", "\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4", @@ -1199,8 +1199,8 @@ var symbolicNames = [ 'null', 'null', 'null', 'null', 'null', 'null', 'null', "PlusAssign", "MinusAssign", "LeftShiftAssign", "RightShiftAssign", "AndAssign", "XorAssign", "OrAssign", "Equal", "NotEqual", "Arrow", "Dot", "Ellipsis", "Identifier", "Constant", - "StringLiteral", "SharedIncludeLiteral", "Directive", - "Whitespace", "Newline", "BlockComment", "LineComment" ]; + "StringLiteral", "Directive", "Whitespace", "Newline", + "BlockComment", "LineComment" ]; var ruleNames = [ "primaryExpression", "genericSelection", "genericAssocList", "genericAssociation", "postfixExpression", "argumentExpressionList", @@ -1400,12 +1400,11 @@ CParser.Ellipsis = 104; CParser.Identifier = 105; CParser.Constant = 106; CParser.StringLiteral = 107; -CParser.SharedIncludeLiteral = 108; -CParser.Directive = 109; -CParser.Whitespace = 110; -CParser.Newline = 111; -CParser.BlockComment = 112; -CParser.LineComment = 113; +CParser.Directive = 108; +CParser.Whitespace = 109; +CParser.Newline = 110; +CParser.BlockComment = 111; +CParser.LineComment = 112; CParser.RULE_primaryExpression = 0; CParser.RULE_genericSelection = 1; @@ -7032,7 +7031,6 @@ CParser.prototype.gccAttribute = function() { case CParser.Identifier: case CParser.Constant: case CParser.StringLiteral: - case CParser.SharedIncludeLiteral: case CParser.Directive: case CParser.Whitespace: case CParser.Newline: @@ -7141,7 +7139,7 @@ CParser.prototype.nestedParenthesesBlock = function() { this.state = 991; this._errHandler.sync(this); _la = this._input.LA(1); - while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { + while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { this.state = 989; switch(this._input.LA(1)) { case CParser.T__0: @@ -7249,7 +7247,6 @@ CParser.prototype.nestedParenthesesBlock = function() { case CParser.Identifier: case CParser.Constant: case CParser.StringLiteral: - case CParser.SharedIncludeLiteral: case CParser.Directive: case CParser.Whitespace: case CParser.Newline: @@ -16299,7 +16296,6 @@ CParser.prototype.gccAttribute_DropletFile = function() { case CParser.Identifier: case CParser.Constant: case CParser.StringLiteral: - case CParser.SharedIncludeLiteral: case CParser.Directive: case CParser.Whitespace: case CParser.Newline: @@ -16418,7 +16414,7 @@ CParser.prototype.nestedParenthesesBlock_DropletFile = function() { this.state = 2282; this._errHandler.sync(this); _la = this._input.LA(1); - while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.SharedIncludeLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { + while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.Directive - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) { this.state = 2280; switch(this._input.LA(1)) { case CParser.T__0: @@ -16526,7 +16522,6 @@ CParser.prototype.nestedParenthesesBlock_DropletFile = function() { case CParser.Identifier: case CParser.Constant: case CParser.StringLiteral: - case CParser.SharedIncludeLiteral: case CParser.Directive: case CParser.Whitespace: case CParser.Newline: diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee index 9e98005e..fc8219e3 100644 --- a/test/src/uitest.coffee +++ b/test/src/uitest.coffee @@ -332,6 +332,10 @@ getRandomDragOp = (editor, rng) -> } head = head.next + # If this block is not droppable, try again. + if dropPossibilities.length is 0 + return getRandomDragOp(editor, rng) + drop = dropPossibilities[Math.floor rng() * dropPossibilities.length] return {drag, drop} @@ -902,3 +906,111 @@ asyncTest 'Controller: Random drag undo test', -> performTextOperation editor, op, cb tick 100 + +asyncTest 'Controller: ANTLR random drag reparse test', -> + document.getElementById('test-main').innerHTML = '' + window.editor = editor = new droplet.Editor(document.getElementById('test-main'), { + mode: 'c_cpp', + modeOptions: + knownFunctions: + printf: {color: 'blue', shape: 'block-only'} + puts: {color: 'blue', shape: 'block-only'} + scanf: {color: 'blue', shape: 'block-only'} + malloc: {color: 'red', shape: 'value-only'} + palette: [] + }) + + editor.setEditorState(true) + editor.setValue(''' + #include + #include + #define MAXLEN 100 + + // Linked list + struct List { + long long data; + struct List *next; + struct List *prev; + }; + typedef struct List List; + + // Memoryless swap + void swap(long long *a, long long *b) { + *a ^= *b; + *b ^= *a; + *a ^= *b; + } + + // Test if sorted + int sorted(List *head, int (*fn)(long long, long long)) { + for (List *cursor = head; cursor && cursor->next; cursor = cursor->next) { + if (!fn(cursor->data, cursor->next->data)) { + return 0; + } + } + return 1; + } + + // Bubble sort + void sort(List *head, int (*fn)(long long, long long)) { + while (!sorted(head, fn)) { + for (List *cursor = head; cursor && cursor->next; cursor = cursor->next) { + if (!fn(cursor->data, cursor->next->data)) + swap(&cursor->data, &cursor->next->data); + } + } + } + + // Comparator + int comparator(long long a, long long b) { + return (a > b); + } + + // Main + int main(int n, char *args[]) { + // Arbitrary array initializer just o test that syntax + int arbitraryArray[] = {1, 2, 3, 4, 5}; + int length; + scanf("%d", &length); + if (length > MAXLEN) { + puts("Error: list is too large"); + return 1; + } + List *head = (List*)malloc(sizeof(List)); + scanf("%d", &head->data); + head->prev = NULL; + List *cursor = head; + int temp; + for (int i = 0; i < length - 1; i++) { + cursor->next = (List*)malloc(sizeof(List)); + cursor = cursor->next; + scanf("%d", &temp); + cursor->data = (long long)temp; + } + sort(head, comparator); + for (cursor = head; cursor; cursor = cursor->next) { + printf("%d ", cursor->data); + } + puts("\\n"); + return 0; + } + ''') + rng = seedrandom('droplet') + stateStack = [] + + tick = (count) -> + cb = -> + if count is 0 + start() + else + ok editor.session.mode.parse(editor.getValue()), 'Still in a parseable state' + setTimeout (-> tick count - 1), 0 + + if rng() > 0.1 + op = getRandomDragOp(editor, rng) + performDragOperation editor, op, cb + else + op = getRandomTextOp(editor, rng) + performTextOperation editor, op, cb + + tick 100 From f13407c462be58b61a727bc223246eafefe2aa68 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 23 Jun 2016 14:17:21 -0400 Subject: [PATCH 155/268] Add C freeze test --- test/ctest.html | 23 +++++ test/src/ctest.coffee | 201 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 test/ctest.html create mode 100644 test/src/ctest.coffee diff --git a/test/ctest.html b/test/ctest.html new file mode 100644 index 00000000..a3b738ca --- /dev/null +++ b/test/ctest.html @@ -0,0 +1,23 @@ + + + + + + +
+
+
+
+ + + + + + + + diff --git a/test/src/ctest.coffee b/test/src/ctest.coffee new file mode 100644 index 00000000..3da28943 --- /dev/null +++ b/test/src/ctest.coffee @@ -0,0 +1,201 @@ +C = require '../../src/languages/c.coffee' +droplet = require '../../dist/droplet-full.js' + +load = (file) -> + q = new XMLHttpRequest() + q.open 'GET', file, false + q.send() + return q.responseText + +asyncTest 'Parser: parser freeze test for C mode', -> + c = new C({ + knownFunctions: { + puts: {color: 'blue'} + printf: {color: 'blue'} + scanf: {color: 'blue'} + } + }) + + result = c.parse ''' + #include + #include + #define MAXLEN 100 + + // Linked list + struct List { + long long data; + struct List *next; + struct List *prev; + }; + typedef struct List List; + + // Memoryless swap + void swap(long long *a, long long *b) { + *a ^= *b; + *b ^= *a; + *a ^= *b; + } + + // Test if sorted + int sorted(List *head, int (*fn)(long long, long long)) { + for (List *cursor = head; cursor && cursor->next; cursor = cursor->next) { + if (!fn(cursor->data, cursor->next->data)) { + return 0; + } + } + return 1; + } + + // Bubble sort + void sort(List *head, int (*fn)(long long, long long)) { + while (!sorted(head, fn)) { + for (List *cursor = head; cursor && cursor->next; cursor = cursor->next) { + if (!fn(cursor->data, cursor->next->data)) + swap(&cursor->data, &cursor->next->data); + } + } + } + + // Comparator + int comparator(long long a, long long b) { + return (a > b); + } + + // Main + int main(int n, char *args[]) { + // Arbitrary array initializer just o test that syntax + int arbitraryArray[] = {1, 2, 3, 4, 5}; + int length; + scanf("%d", &length); + if (length > MAXLEN) { + puts("Error: list is too large"); + return 1; + } + List *head = (List*)malloc(sizeof(List)); + scanf("%d", &head->data); + head->prev = NULL; + List *cursor = head; + int temp; + for (int i = 0; i < length - 1; i++) { + cursor->next = (List*)malloc(sizeof(List)); + cursor = cursor->next; + scanf("%d", &temp); + cursor->data = (long long)temp; + } + sort(head, comparator); + for (cursor = head; cursor; cursor = cursor->next) { + printf("%d ", cursor->data); + } + puts("\\n"); + return 0; + } + ''' + + equal result.serialize(), FREEZE_DATA, 'Match C parser freeze file as of 2016-06-23' + + start() + +asyncTest 'Controller: palette block expansion', -> + document.getElementById('test-main').innerHTML = '' + window.editor = editor = new droplet.Editor(document.getElementById('test-main'), { + mode: 'c', + palette: [] + }) + + editor.setValue ''' + #include + #include + #define MAXLEN 100 + + // Linked list + struct List { + long long data; + struct List *next; + struct List *prev; + }; + typedef struct List List; + + // Memoryless swap + void swap(long long *a, long long *b) { + *a ^= *b; + *b ^= *a; + *a ^= *b; + } + + // Test if sorted + int sorted(List *head, int (*fn)(long long, long long)) { + for (List *cursor = head; cursor && cursor->next; cursor = cursor->next) { + if (!fn(cursor->data, cursor->next->data)) { + return 0; + } + } + return 1; + } + + // Bubble sort + void sort(List *head, int (*fn)(long long, long long)) { + while (!sorted(head, fn)) { + for (List *cursor = head; cursor && cursor->next; cursor = cursor->next) { + if (!fn(cursor->data, cursor->next->data)) + swap(&cursor->data, &cursor->next->data); + } + } + } + + // Comparator + int comparator(long long a, long long b) { + return (a > b); + } + + // Main + int main(int n, char *args[]) { + // Arbitrary array initializer just o test that syntax + int arbitraryArray[] = {1, 2, 3, 4, 5}; + int length; + scanf("%d", &length); + if (length > MAXLEN) { + puts("Error: list is too large"); + return 1; + } + List *head = (List*)malloc(sizeof(List)); + scanf("%d", &head->data); + head->prev = NULL; + List *cursor = head; + int temp; + for (int i = 0; i < length - 1; i++) { + cursor->next = (List*)malloc(sizeof(List)); + cursor = cursor->next; + scanf("%d", &temp); + cursor->data = (long long)temp; + } + sort(head, comparator); + for (cursor = head; cursor; cursor = cursor->next) { + printf("%d ", cursor->data); + } + puts("\\n"); + return 0; + } + ''' + + loopblock = (head) -> + if head is editor.session.tree.end + start() + return + + if head.type is 'blockStart' and head.container.stringify().length > 0 + before = head.prev + + oldLocalSerialize = head.container.serialize() + oldSerialize = editor.session.tree.serialize() + editor.reparse head.container + newSerialize = editor.session.tree.serialize() + newLocalSerialize = before.next.container.serialize() + + notEqual before.next.id, head.id, "Reparsing did indeed replace the block ('#{head.container.stringify()}', #{head.container.parseContext})." + equal oldLocalSerialize, newLocalSerialize, "Reparsing did not change the local structure ('#{head.container.stringify()}, #{head.container.parseContext}')." + equal oldSerialize, newSerialize, "Reparsing did not change the tree structure ('#{head.container.stringify()}, #{head.container.parseContext}')." + + head = before.next + + setTimeout (-> loopblock(head.next)), 0 + loopblock editor.session.tree.start From d7b06365af76dcf52f544703a7e694fa8a095bcb Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 23 Jun 2016 14:47:16 -0400 Subject: [PATCH 156/268] Add comment consolidation freeze test --- src/parser.coffee | 4 ++-- test/src/ctest.coffee | 29 ++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/parser.coffee b/src/parser.coffee index 36870dc0..feb5b6fc 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -449,9 +449,9 @@ exports.Parser = class Parser if currentlyCommented if line[lastIndex...].indexOf(@endComment) > -1 head = helper.connect head, - new model.TextToken line[lastIndex...line.indexOf(@endComment) + @endComment.length] + new model.TextToken line[lastIndex...lastIndex + line[lastIndex...].indexOf(@endComment) + @endComment.length] - lastIndex += line.indexOf(@endComment) + @endComment.length + lastIndex += line[lastIndex...].indexOf(@endComment) + @endComment.length head = helper.connect head, stack.pop().end currentlyCommented = false diff --git a/test/src/ctest.coffee b/test/src/ctest.coffee index 3da28943..364a97cb 100644 --- a/test/src/ctest.coffee +++ b/test/src/ctest.coffee @@ -91,7 +91,34 @@ asyncTest 'Parser: parser freeze test for C mode', -> } ''' - equal result.serialize(), FREEZE_DATA, 'Match C parser freeze file as of 2016-06-23' + equal result.serialize(), FREEZE_DATA.freezeTest, 'Match C parser freeze file as of 2016-06-23' + + start() + +asyncTest 'Parser: parser freeze test comment consolidation', -> + c = new C({ + knownFunctions: { + puts: {color: 'blue'} + printf: {color: 'blue'} + scanf: {color: 'blue'} + } + }) + + result = c.parse ''' + int main() { + puts("Hello"); /* start + middle + end */ puts("Hi"); /* interrupt */ /* start + end */ puts("Goodbye"); /* interrupt */ // end of line + /* start again + end again */ /* interrupt */ /* start + end */ + /* interrupt */ // end of line + return 0; + } + ''' + + equal result.serialize(), FREEZE_DATA.commentConsolidation, 'C comment consolidation' start() From 918030aea027379f500266e139bdda6b2cbd786c Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 23 Jun 2016 15:46:42 -0400 Subject: [PATCH 157/268] Add paren test for C --- test/src/ctest.coffee | 174 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 168 insertions(+), 6 deletions(-) diff --git a/test/src/ctest.coffee b/test/src/ctest.coffee index 364a97cb..ba798038 100644 --- a/test/src/ctest.coffee +++ b/test/src/ctest.coffee @@ -1,11 +1,81 @@ C = require '../../src/languages/c.coffee' droplet = require '../../dist/droplet-full.js' -load = (file) -> - q = new XMLHttpRequest() - q.open 'GET', file, false - q.send() - return q.responseText +` +// Mouse event simluation function +function simulate(type, target, options) { + if ('string' == typeof(target)) { + target = $(target).get(0) + } + options = options || {} + var pageX = pageY = clientX = clientY = dx = dy = 0 + var location = options.location || target + if (location) { + if ('string' == typeof(location)) { + location = $(location).get(0) + } + var gbcr = location.getBoundingClientRect() + clientX = gbcr.left, + clientY = gbcr.top, + pageX = clientX + window.pageXOffset + pageY = clientY + window.pageYOffset + dx = Math.floor((gbcr.right - gbcr.left) / 2) + dy = Math.floor((gbcr.bottom - gbcr.top) / 2) + } + if ('dx' in options) dx = options.dx + if ('dy' in options) dy = options.dy + pageX = (options.pageX == null ? pageX : options.pageX) + dx + pageY = (options.pageY == null ? pageY : options.pageY) + dy + clientX = pageX - window.pageXOffset + clientY = pageY - window.pageYOffset + var opts = { + bubbles: options.bubbles || true, + cancelable: options.cancelable || true, + view: options.view || target.ownerDocument.defaultView, + detail: options.detail || 1, + pageX: pageX, + pageY: pageY, + clientX: clientX, + clientY: clientY, + screenX: clientX + window.screenLeft, + screenY: clientY + window.screenTop, + ctrlKey: options.ctrlKey || false, + altKey: options.altKey || false, + shiftKey: options.shiftKey || false, + metaKey: options.metaKey || false, + button: options.button || 0, + which: options.which || 1, + relatedTarget: options.relatedTarget || null, + } + var evt + try { + // Modern API supported by IE9+ + evt = new MouseEvent(type, opts) + } catch (e) { + // Old API still required by PhantomJS. + evt = target.ownerDocument.createEvent('MouseEvents') + evt.initMouseEvent(type, opts.bubbles, opts.cancelable, opts.view, + opts.detail, opts.screenX, opts.screenY, opts.clientX, opts.clientY, + opts.ctrlKey, opts.altKey, opts.shiftKey, opts.metaKey, opts.button, + opts.relatedTarget) + } + target.dispatchEvent(evt) +} +function sequence(delay) { + var seq = [], + chain = { then: function(fn) { seq.push(fn); return chain; } } + function advance() { + setTimeout(function() { + if (seq.length) { + (seq.shift())() + advance() + } + }, delay) + } + advance() + return chain +} +` asyncTest 'Parser: parser freeze test for C mode', -> c = new C({ @@ -122,7 +192,99 @@ asyncTest 'Parser: parser freeze test comment consolidation', -> start() -asyncTest 'Controller: palette block expansion', -> +pickUpLocation = (editor, document, location) -> + block = editor.getDocument(document).getFromTextLocation(location) + bound = editor.session.view.getViewNodeFor(block).bounds[0] + simulate('mousedown', editor.mainScrollerStuffing, { + dx: bound.x + editor.gutter.offsetWidth + 5, + dy: bound.y + 5 + }) + simulate('mousemove', editor.dragCover, { + location: editor.mainCanvas + dx: bound.x + editor.gutter.offsetWidth + 10, + dy: bound.y + 10 + }) + +dropLocation = (editor, document, location) -> + block = editor.getDocument(document).getFromTextLocation(location) + blockView = editor.session.view.getViewNodeFor block + simulate('mousemove', editor.dragCover, { + location: editor.mainCanvas + dx: blockView.dropPoint.x + 5, + dy: blockView.dropPoint.y + 5 + }) + simulate('mouseup', editor.mainScrollerIntermediary, { + dx: blockView.dropPoint.x + 5 + dy: blockView.dropPoint.y + 5 + }) + +executeAsyncSequence = (sequence, i = 0) -> + if i < sequence.length + sequence[i]() + setTimeout (-> + executeAsyncSequence sequence, i + 1 + ), 0 + +asyncTest 'Controller: ANTLR paren wrap rules', -> + window.editor = editor = new droplet.Editor(document.getElementById('test-main'), { + mode: 'c', + palette: [] + }) + + editor.setValue ''' + int main() { + int y = 1 * 2; + int x = 1 + 2; + int a = 1 + 2 * 3; + } + ''' + + executeAsyncSequence [ + (-> + pickUpLocation editor, 0, { + row: 2 + col: 10 + type: 'block' + } + dropLocation editor, 0, { + row: 1 + col: 14 + type: 'socket' + } + ), (-> + equal editor.getValue(), ''' + int main() { + int y = 1 * (1 + 2); + int x = __0_droplet__; + int a = 1 + 2 * 3; + }\n + ''', 'Paren-wrapped + block dropping into * block' + ), (-> + pickUpLocation editor, 0, { + row: 1 + col: 10 + type: 'block' + } + dropLocation editor, 0, { + row: 3 + col: 10 + type: 'socket' + length: 1 + } + ), (-> + equal editor.getValue(), ''' + int main() { + int y = __0_droplet__; + int x = __0_droplet__; + int a = 1 * (1 + 2) + 2 * 3; + }\n + ''', 'Did not paren-wrap * block dropping into + block' + + start() + ) + ] + +asyncTest 'Controller: ANTLR reparse rules', -> document.getElementById('test-main').innerHTML = '' window.editor = editor = new droplet.Editor(document.getElementById('test-main'), { mode: 'c', From 0dbf643648394b7408e418dfc4999fa5f8a86c6e Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 23 Jun 2016 15:53:19 -0400 Subject: [PATCH 158/268] Add freeze populator code to tests --- test/data/c-freeze-populator.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 test/data/c-freeze-populator.js diff --git a/test/data/c-freeze-populator.js b/test/data/c-freeze-populator.js new file mode 100644 index 00000000..047672bb --- /dev/null +++ b/test/data/c-freeze-populator.js @@ -0,0 +1,5 @@ +window.FREEZE_DATA = {}; + +window.FREEZE_DATA.freezeTest = "#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#define MAXLEN 100\n\n// Linked list\nstruct List {\nlong long data;\nstruct List *next;\nstruct List *prev;\n};\ntypedef struct List List;\n\n// Memoryless swap\nvoid swap(long long *a, long long *b) {\n*a ^= *b;\n*b ^= *a;\n*a ^= *b;\n}\n\n// Test if sorted\nint sorted(List *head, int (*fn)(long long, long long)) {\nfor (List *cursor = head; cursor && cursor-&gt;next; cursor = cursor-&gt;next) {\nif (!fn(cursor-&gt;data, cursor-&gt;next-&gt;data)) {\nreturn 0;\n}\n}\nreturn 1;\n}\n\n// Bubble sort\nvoid sort(List *head, int (*fn)(long long, long long)) {\nwhile (!sorted(head, fn)) {\nfor (List *cursor = head; cursor && cursor-&gt;next; cursor = cursor-&gt;next) {\nif (!fn(cursor-&gt;data, cursor-&gt;next-&gt;data))\n swap(&cursor-&gt;data, &cursor-&gt;next-&gt;data);\n}\n}\n}\n\n// Comparator\nint comparator(long long a, long long b) {\nreturn (a &gt; b);\n}\n\n// Main\nint main(int n, char *args[]) {\n// Arbitrary array initializer just o test that syntax\nint arbitraryArray[] = {1, 2, 3, 4, 5};\nint length;\nscanf("%d", &length);\nif (length &gt; MAXLEN) {\nputs("Error: list is too large");\nreturn 1;\n}\nList *head = (List*)malloc(sizeof(List));\nscanf("%d", &head-&gt;data);\nhead-&gt;prev = NULL;\nList *cursor = head;\nint temp;\nfor (int i = 0; i &lt; length - 1; i++) {\ncursor-&gt;next = (List*)malloc(sizeof(List));\ncursor = cursor-&gt;next;\nscanf("%d", &temp);\ncursor-&gt;data = (long long)temp;\n}\nsort(head, comparator);\nfor (cursor = head; cursor; cursor = cursor-&gt;next) {\nprintf("%d ", cursor-&gt;data);\n}\nputs("\\n");\nreturn 0;\n}"; + +window.FREEZE_DATA.commentConsolidation = "int main() {\nputs("Hello"); /* start\nmiddle\nend */ puts("Hi"); /* interrupt */ /* start\nend */ puts("Goodbye"); /* interrupt */ // end of line\n/* start again\nend again */ /* interrupt */ /* start\nend */\n/* interrupt */ // end of line\nreturn 0;\n}"; From 582bdd396d5f2460e335867e40d5565568602674 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 23 Jun 2016 15:53:52 -0400 Subject: [PATCH 159/268] Add freeze populator code to tests --- test/data/c-freeze-populator.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 test/data/c-freeze-populator.js diff --git a/test/data/c-freeze-populator.js b/test/data/c-freeze-populator.js new file mode 100644 index 00000000..047672bb --- /dev/null +++ b/test/data/c-freeze-populator.js @@ -0,0 +1,5 @@ +window.FREEZE_DATA = {}; + +window.FREEZE_DATA.freezeTest = "#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#define MAXLEN 100\n\n// Linked list\nstruct List {\nlong long data;\nstruct List *next;\nstruct List *prev;\n};\ntypedef struct List List;\n\n// Memoryless swap\nvoid swap(long long *a, long long *b) {\n*a ^= *b;\n*b ^= *a;\n*a ^= *b;\n}\n\n// Test if sorted\nint sorted(List *head, int (*fn)(long long, long long)) {\nfor (List *cursor = head; cursor && cursor-&gt;next; cursor = cursor-&gt;next) {\nif (!fn(cursor-&gt;data, cursor-&gt;next-&gt;data)) {\nreturn 0;\n}\n}\nreturn 1;\n}\n\n// Bubble sort\nvoid sort(List *head, int (*fn)(long long, long long)) {\nwhile (!sorted(head, fn)) {\nfor (List *cursor = head; cursor && cursor-&gt;next; cursor = cursor-&gt;next) {\nif (!fn(cursor-&gt;data, cursor-&gt;next-&gt;data))\n swap(&cursor-&gt;data, &cursor-&gt;next-&gt;data);\n}\n}\n}\n\n// Comparator\nint comparator(long long a, long long b) {\nreturn (a &gt; b);\n}\n\n// Main\nint main(int n, char *args[]) {\n// Arbitrary array initializer just o test that syntax\nint arbitraryArray[] = {1, 2, 3, 4, 5};\nint length;\nscanf("%d", &length);\nif (length &gt; MAXLEN) {\nputs("Error: list is too large");\nreturn 1;\n}\nList *head = (List*)malloc(sizeof(List));\nscanf("%d", &head-&gt;data);\nhead-&gt;prev = NULL;\nList *cursor = head;\nint temp;\nfor (int i = 0; i &lt; length - 1; i++) {\ncursor-&gt;next = (List*)malloc(sizeof(List));\ncursor = cursor-&gt;next;\nscanf("%d", &temp);\ncursor-&gt;data = (long long)temp;\n}\nsort(head, comparator);\nfor (cursor = head; cursor; cursor = cursor-&gt;next) {\nprintf("%d ", cursor-&gt;data);\n}\nputs("\\n");\nreturn 0;\n}"; + +window.FREEZE_DATA.commentConsolidation = "int main() {\nputs("Hello"); /* start\nmiddle\nend */ puts("Hi"); /* interrupt */ /* start\nend */ puts("Goodbye"); /* interrupt */ // end of line\n/* start again\nend again */ /* interrupt */ /* start\nend */\n/* interrupt */ // end of line\nreturn 0;\n}"; From 693fcd908cfbaaa7f2891a4a9b22f4a62f7b6e1a Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 23 Jun 2016 18:18:07 -0400 Subject: [PATCH 160/268] Fix some of the conflict-induced errors in the merge --- example/example.coffee | 16 ++-- src/controller.coffee | 174 ++++++++++++++++++++--------------------- 2 files changed, 91 insertions(+), 99 deletions(-) diff --git a/example/example.coffee b/example/example.coffee index 5a8ca854..2936baee 100644 --- a/example/example.coffee +++ b/example/example.coffee @@ -43,16 +43,16 @@ unless window.ALREADY_LOADED editor = null # Droplet itself -<<<<<<< HEAD +#<<<<<<< HEAD createEditor = (options) -> $('#droplet-editor').html '' editor = new droplet.Editor $('#droplet-editor')[0], options -======= -createEditor = (options) -> - $('#droplet-editor').html '
' - aceEditor = ace.edit 'ace-target' - editor = new droplet.Editor aceEditor, options ->>>>>>> c_support +#======= +#createEditor = (options) -> +# $('#droplet-editor').html '
' +# aceEditor = ace.edit 'ace-target' +# editor = new droplet.Editor aceEditor, options +#>>>>>>> c_support editor.setEditorState localStorage.getItem('blocks') is 'yes' editor.aceEditor.getSession().setUseWrapMode true @@ -71,7 +71,7 @@ createEditor = (options) -> editor.toggleBlocks() localStorage.setItem 'blocks', (if editor.currentlyUsingBlocks then 'yes' else 'no') -# Stuff for testing convenience + # Stuff for testing convenience $('#update').on 'click', -> localStorage.setItem 'config', dropletConfig.getValue() createEditor eval dropletConfig.getValue() diff --git a/src/controller.coffee b/src/controller.coffee index 5a208788..61f14b85 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -121,7 +121,7 @@ hook = (event, priority, fn) -> } class Session - constructor: (@options, standardViewSettings) -> + constructor: (_main, _palette, _drag, @options, standardViewSettings) -> # TODO rearchitecture so that a session is independent of elements again # Option flags @readOnly = false @paletteGroups = @options.palette @@ -142,11 +142,11 @@ class Session @mode = null # Instantiate an Droplet editor view - @view = new view.View helper.extend standardViewSettings, @options.viewSettings ? {} - @paletteView = new view.View helper.extend {}, standardViewSettings, @options.viewSettings ? {}, { + @view = new view.View _main, helper.extend standardViewSettings, @options.viewSettings ? {} + @paletteView = new view.View _palette, helper.extend {}, standardViewSettings, @options.viewSettings ? {}, { showDropdowns: @options.showDropdownInPalette ? false } - @dragView = new view.View helper.extend {}, standardViewSettings, @options.viewSettings ? {} + @dragView = new view.View _drag, helper.extend {}, standardViewSettings, @options.viewSettings ? {} # ## Document initialization # We start of with an empty document @@ -251,18 +251,10 @@ exports.Editor = class Editor @dragCanvas.style.top = '0px' @dragCanvas.style.transform = 'translate(-9999px,-9999px)' - # Instantiate the Droplet views - @view = new view.View @mainCtx, @standardViewSettings - @paletteView = new view.View @paletteCtx, helper.extend {}, @standardViewSettings, { - showDropdowns: @options.showDropdownInPalette ? false - } - @dragView = new view.View @dragCtx, @standardViewSettings @draw = new draw.Draw(@mainCtx) @dropletElement.style.left = @paletteWrapper.clientWidth + 'px' - @draw = new draw.Draw() - do @draw.refreshFontCapital @standardViewSettings = @@ -327,7 +319,7 @@ exports.Editor = class Editor @dropletElement.appendChild @transitionContainer if @options? - @session = new Session @options, @standardViewSettings + @session = new Session @mainCanvas, @paletteCanvas, @dragCanvas, @options, @standardViewSettings @sessions = new PairDict([ [@aceEditor.getSession(), @session] ]) @@ -479,8 +471,8 @@ exports.Editor = class Editor #@resizeGutter() - @viewports.main.height = @dropletElement.clientHeight - @viewports.main.width = @dropletElement.clientWidth - @gutter.clientWidth + @session.viewports.main.height = @dropletElement.clientHeight + @session.viewports.main.width = @dropletElement.clientWidth - @gutter.clientWidth @mainCanvas.setAttribute 'width', @dropletElement.clientWidth - @gutter.clientWidth @@ -494,8 +486,8 @@ exports.Editor = class Editor @resizeDragCanvas() # Re-scroll and redraw main - @viewports.main.y = @mainScroller.scrollTop - @viewports.main.x = @mainScroller.scrollLeft + @session.viewports.main.y = @mainScroller.scrollTop + @session.viewports.main.x = @mainScroller.scrollLeft resizePalette: -> for binding in editorBindings.resize_palette @@ -534,7 +526,7 @@ exports.Editor = class Editor if @sessions.contains(@aceEditor.getSession()) throw new ArgumentError 'Cannot bind a new session where one already exists.' else - session = new Session opts, @standardViewSettings + session = new Session @mainCanvas, @paletteCanvas, @dragCanvas, opts, @standardViewSettings @sessions.set(@aceEditor.getSession(), session) @session = session @aceEditor.getSession()._dropletSession = @session @@ -568,12 +560,12 @@ Editor::setTopNubbyStyle = (height = 10, color = '#EBEBEB') -> points.push new @draw.Point @mainCanvas.clientWidth, -5 points.push new @draw.Point @mainCanvas.clientWidth, height - points.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth, height - points.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * (1 - @view.opts.tabSideWidth), - @view.opts.tabHeight + height - points.push new @draw.Point @view.opts.tabOffset + @view.opts.tabWidth * @view.opts.tabSideWidth, - @view.opts.tabHeight + height - points.push new @draw.Point @view.opts.tabOffset, height + points.push new @draw.Point @session.view.opts.tabOffset + @session.view.opts.tabWidth, height + points.push new @draw.Point @session.view.opts.tabOffset + @session.view.opts.tabWidth * (1 - @session.view.opts.tabSideWidth), + @session.view.opts.tabHeight + height + points.push new @draw.Point @session.view.opts.tabOffset + @session.view.opts.tabWidth * @session.view.opts.tabSideWidth, + @session.view.opts.tabHeight + height + points.push new @draw.Point @session.view.opts.tabOffset, height points.push new @draw.Point -5, height points.push new @draw.Point -5, -5 @@ -588,10 +580,10 @@ Editor::resizeNubby = -> @setTopNubbyStyle @nubbyHeight, @nubbyColor Editor::initializeFloatingBlock = (record, i) -> - record.renderGroup = new @view.draw.Group() + record.renderGroup = new @session.view.draw.Group() - record.grayBox = new @view.draw.NoRectangle() - record.grayBoxPath = new @view.draw.Path( + record.grayBox = new @session.view.draw.NoRectangle() + record.grayBoxPath = new @session.view.draw.Path( [], false, { fillColor: GRAY_BLOCK_COLOR strokeColor: GRAY_BLOCK_BORDER @@ -600,17 +592,17 @@ Editor::initializeFloatingBlock = (record, i) -> cssClass: 'droplet-floating-container' } ) - record.startText = new @view.draw.Text( - (new @view.draw.Point(0, 0)), @mode.startComment + record.startText = new @session.view.draw.Text( + (new @session.view.draw.Point(0, 0)), @mode.startComment ) - record.endText = new @view.draw.Text( - (new @view.draw.Point(0, 0)), @mode.endComment + record.endText = new @session.view.draw.Text( + (new @session.view.draw.Point(0, 0)), @mode.endComment ) for element in [record.grayBoxPath, record.startText, record.endText] element.setParent record.renderGroup - @view.getViewNodeFor(record.block).group.setParent record.renderGroup + @session.view.getViewNodeFor(record.block).group.setParent record.renderGroup # TODO maybe refactor into qualifiedFocus if i < @floatingBlocks.length @@ -663,7 +655,7 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) -> points.push new @session.view.draw.Point rectangle.x - startWidth, rectangle.y + 5 points.push new @session.view.draw.Point rectangle.x - startWidth + 5, rectangle.y - points.push new @view.draw.Point rectangle.x, rectangle.y + points.push new @session.view.draw.Point rectangle.x, rectangle.y record.grayBoxPath.setPoints points @@ -675,7 +667,7 @@ Editor::drawFloatingBlock = (record, startWidth, endWidth, rect, opts) -> record.grayBoxPath.update() record.startText.point.x = blockView.totalBounds.x - startWidth - record.startText.point.y = blockView.totalBounds.y + blockView.distanceToBase[0].above - @fontSize + record.startText.point.y = blockView.totalBounds.y + blockView.distanceToBase[0].above - @session.fontSize record.startText.update() record.endText.point.x = record.grayBox.right() - endWidth - 5 @@ -702,7 +694,7 @@ Editor::redrawMain = (opts = {}) -> @topNubbyPath.update() - rect = @viewports.main + rect = @session.viewports.main options = { grayscale: false @@ -724,8 +716,8 @@ Editor::redrawMain = (opts = {}) -> @currentlyDrawnFloatingBlocks = [] # Draw floating blocks - startWidth = @mode.startComment.length * @fontWidth - endWidth = @mode.endComment.length * @fontWidth + startWidth = @mode.startComment.length * @session.fontWidth + endWidth = @mode.endComment.length * @session.fontWidth for record in @session.floatingBlocks element = @drawFloatingBlock(record, startWidth, endWidth, rect, opts) @currentlyDrawnFloatingBlocks.push { @@ -744,13 +736,13 @@ Editor::redrawMain = (opts = {}) -> @fireEvent 'change', [] - @view.cleanupDraw() + @session.view.cleanupDraw() unless @alreadyScheduledCleanup @alreadyScheduledCleanup = true setTimeout (=> @alreadyScheduledCleanup = false - @view.garbageCollect() + @session.view.garbageCollect() ), 0 return null @@ -793,7 +785,7 @@ Editor::redrawPalette = -> @clearPalette() - @paletteView.beginDraw() + @session.paletteView.beginDraw() # We will construct a vertical layout # with padding for the palette blocks. @@ -824,7 +816,7 @@ Editor::redrawPalette = -> @paletteCanvas.style.height = lastBottomEdge + 'px' - @paletteView.garbageCollect() + @session.paletteView.garbageCollect() Editor::rebuildPalette = -> return unless @session?.currentPaletteBlocks? @@ -1468,12 +1460,12 @@ hook 'mousemove', 1, (point, event, state) -> # When we are dragging things, we draw the shadow. # Also, we translate the block 1x1 to the right, # so that we can see its borders. - @dragView.beginDraw() - draggingBlockView = @dragView.getViewNodeFor @draggingBlock + @session.dragView.beginDraw() + draggingBlockView = @session.dragView.getViewNodeFor @draggingBlock draggingBlockView.layout 1, 1 draggingBlockView.root() draggingBlockView.draw() - @dragView.garbageCollect() + @session.dragView.garbageCollect() @dragCanvas.style.width = "#{Math.min draggingBlockView.totalBounds.width + 10, window.screen.width}px" @dragCanvas.style.height = "#{Math.min draggingBlockView.totalBounds.height + 10, window.screen.height}px" @@ -1650,7 +1642,7 @@ hook 'mousemove', 0, (point, event, state) -> if head is @tree.end and @floatingBlocks.length is 0 and @session.viewports.main.right() > mainPoint.x > @session.viewports.main.x - @gutter.offsetWidth and @session.viewports.main.bottom() > mainPoint.y > @session.viewports.main.y - @view.getViewNodeFor(@tree).highlightArea.update() + @session.view.getViewNodeFor(@tree).highlightArea.update() @lastHighlight = @tree else @@ -2180,7 +2172,7 @@ hook 'rebuild_palette', 1, -> hoverDiv.addEventListener 'mousemove', (event) => palettePoint = @trackerPointToPalette new @draw.Point( event.clientX, event.clientY) - if @viewOrChildrenContains block, palettePoint, @session.paletteView + if @session.viewOrChildrenContains block, palettePoint, @session.paletteView @clearPaletteHighlightCanvas() @paletteHighlightPath = @getHighlightPath block, {color: '#FF0'}, @session.paletteView @paletteHighlightPath.draw @paletteHighlightCtx @@ -2216,11 +2208,11 @@ hook 'populate', 1, -> bounds = @session.view.getViewNodeFor(@getCursor()).bounds[0] ### - inputLeft = bounds.x + @mainCanvas.offsetLeft - @viewports.main.x + inputLeft = bounds.x + @mainCanvas.offsetLeft - @session.viewports.main.x inputLeft = Math.min inputLeft, @dropletElement.clientWidth - 10 inputLeft = Math.max @mainCanvas.offsetLeft, inputLeft @hiddenInput.style.left = inputLeft + 'px' - inputTop = bounds.y - @viewports.main.y + inputTop = bounds.y - @session.viewports.main.y inputTop = Math.min inputTop, @dropletElement.clientHeight - 10 inputTop = Math.max 0, inputTop @hiddenInput.style.top = inputTop + 'px' @@ -2350,11 +2342,11 @@ Editor::redrawTextHighlights = (scrollIntoView = false) -> lines = @getCursor().stringify().split '\n' startPosition = textFocusView.bounds[startRow].x + @session.view.opts.textPadding + - @fontWidth * last_(@getCursor().stringify()[...@hiddenInput.selectionStart].split('\n')).length + + @session.fontWidth * last_(@getCursor().stringify()[...@hiddenInput.selectionStart].split('\n')).length + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) endPosition = textFocusView.bounds[endRow].x + @session.view.opts.textPadding + - @fontWidth * last_(@getCursor().stringify()[...@hiddenInput.selectionEnd].split('\n')).length + + @session.fontWidth * last_(@getCursor().stringify()[...@hiddenInput.selectionEnd].split('\n')).length + (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0) # Now draw the highlight/typing cursor @@ -2499,7 +2491,7 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> if parent? return @reparse parent, recovery, updates, originalTrigger else - @view.getViewNodeFor(originalTrigger).mark {color: '#F00'} + @session.view.getViewNodeFor(originalTrigger).mark {color: '#F00'} return false return if newList.start.next is newList.end @@ -2589,7 +2581,7 @@ Editor::getTextPosition = (point) -> row = Math.max row, 0 row = Math.min row, textFocusView.lineLength - 1 - column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @session.view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @fontWidth) + column = Math.max 0, Math.round((point.x - textFocusView.bounds[row].x - @session.view.opts.textPadding - (if @getCursor().hasDropdown() then helper.DROPDOWN_ARROW_WIDTH else 0)) / @session.fontWidth) lines = @getCursor().stringify().split('\n')[..row] lines[lines.length - 1] = lines[lines.length - 1][...column] @@ -2783,7 +2775,7 @@ Editor::showDropdown = (socket = @getCursor(), inPalette = false) -> @dropdownElement.style.left = location.x - @session.scrollOffsets.palette.x + @paletteCanvas.offsetLeft + 'px' @dropdownElement.style.minWidth = location.width + 'px' - @dropdownElement.style.top = location.y + @fontSize - @session.viewports.main.y + 'px' + @dropdownElement.style.top = location.y + @session.fontSize - @session.viewports.main.y + 'px' @dropdownElement.style.left = location.x - @session.viewports.main.x + @dropletElement.offsetLeft + @mainCanvas.offsetLeft + 'px' @dropdownElement.style.minWidth = location.width + 'px' ), 0 @@ -3112,10 +3104,10 @@ Editor::getCursor = -> Editor::scrollCursorIntoPosition = -> axis = @determineCursorPosition().y - if axis < @viewports.main.y + if axis < @session.viewports.main.y @mainScroller.scrollTop = axis - else if axis > @viewports.main.bottom() - @mainScroller.scrollTop = axis - @viewports.main.height + else if axis > @session.viewports.main.bottom() + @mainScroller.scrollTop = axis - @session.viewports.main.height @mainScroller.scrollLeft = 0 @@ -3479,7 +3471,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - div.style.font = @session.fontSize + 'px ' + @session.fontFamily div.style.left = "#{textElement.bounds[0].x - @session.viewports.main.x}px" - div.style.top = "#{textElement.bounds[0].y - @session.viewports.main.y - @fontAscent}px" + div.style.top = "#{textElement.bounds[0].y - @session.viewports.main.y - @session.fontAscent}px" div.className = 'droplet-transitioning-element' div.style.transition = "left #{translateTime}ms, top #{translateTime}ms, font-size #{translateTime}ms" @@ -3508,9 +3500,9 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - div.innerText = div.textContent = line + 1 div.style.left = 0 - div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @session.view.opts.textHeight - @fontAscent - @session.viewports.main.y}px" + div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @session.view.opts.textHeight - @session.fontAscent - @session.viewports.main.y}px" - div.style.font = @fontSize + 'px ' + @fontFamily + div.style.font = @session.fontSize + 'px ' + @session.fontFamily div.style.width = "#{@gutter.clientWidth}px" translatingElements.push div @@ -3676,8 +3668,8 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- do (div, textElement) => setTimeout (=> div.style.left = "#{textElement.bounds[0].x - @session.viewports.main.x}px" - div.style.top = "#{textElement.bounds[0].y - @session.viewports.main.y - @fontAscent}px" - div.style.fontSize = @fontSize + 'px' + div.style.top = "#{textElement.bounds[0].y - @session.viewports.main.y - @session.fontAscent}px" + div.style.fontSize = @session.fontSize + 'px' ), 0 top = Math.max @aceEditor.getFirstVisibleRow(), 0 @@ -3713,7 +3705,7 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- do (div, line) => setTimeout (=> div.style.left = 0 - div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @view.opts.textHeight - @session.fontAscent - @session.viewports.main.y}px" + div.style.top = "#{treeView.bounds[line].y + treeView.distanceToBase[line].above - @session.view.opts.textHeight - @session.fontAscent - @session.viewports.main.y}px" div.style.fontSize = @session.fontSize + 'px' ), 0 @@ -3871,8 +3863,8 @@ Editor::resizeMainScroller = -> hook 'resize_palette', 0, -> @paletteScroller.style.top = "#{@paletteHeader.offsetHeight}px" - @viewports.palette.height = @paletteScroller.clientHeight - @viewports.palette.width = @paletteScroller.clientWidth + @session.viewports.palette.height = @paletteScroller.clientHeight + @session.viewports.palette.width = @paletteScroller.clientWidth hook 'redraw_main', 1, -> bounds = @session.view.getViewNodeFor(@session.tree).getBounds() @@ -3907,20 +3899,20 @@ hook 'redraw_palette', 0, -> # MULTIPLE FONT SIZE SUPPORT # ================================ hook 'populate', 0, -> - @fontSize = 15 - @fontFamily = 'Courier New' + @session.fontSize = 15 + @session.fontFamily = 'Courier New' @measureCtx.font = '15px Courier New' - @fontWidth = @measureCtx.measureText(' ').width + @session.fontWidth = @measureCtx.measureText(' ').width - metrics = helper.fontMetrics(@fontFamily, @fontSize) - @fontAscent = metrics.prettytop - @fontDescent = metrics.descent + metrics = helper.fontMetrics(@session.fontFamily, @session.fontSize) + @session.fontAscent = metrics.prettytop + @session.fontDescent = metrics.descent Editor::setFontSize_raw = (fontSize) -> - unless @fontSize is fontSize - @measureCtx.font = fontSize + ' px ' + @fontFamily - @fontWidth = @measureCtx.measureText(' ').width - @fontSize = fontSize + unless @session.fontSize is fontSize + @measureCtx.font = fontSize + ' px ' + @session.fontFamily + @session.fontWidth = @measureCtx.measureText(' ').width + @session.fontSize = fontSize @paletteHeader.style.fontSize = "#{fontSize}px" @gutter.style.fontSize = "#{fontSize}px" @@ -3938,9 +3930,9 @@ Editor::setFontSize_raw = (fontSize) -> @session.paletteView.clearCache() @session.dragView.clearCache() - @view.draw.setGlobalFontSize @fontSize - @paletteView.draw.setGlobalFontSize @fontSize - @dragView.draw.setGlobalFontSize @fontSize + @session.view.draw.setGlobalFontSize @session.fontSize + @session.paletteView.draw.setGlobalFontSize @session.fontSize + @session.dragView.draw.setGlobalFontSize @session.fontSize @gutter.style.width = @aceEditor.renderer.$gutterLayer.gutterWidth + 'px' @@ -3948,7 +3940,7 @@ Editor::setFontSize_raw = (fontSize) -> @rebuildPalette() Editor::setFontFamily = (fontFamily) -> - @measureCtx.font = @fontSize + 'px ' + fontFamily + @measureCtx.font = @session.fontSize + 'px ' + fontFamily @draw.setGlobalFontFamily fontFamily @session.fontFamily = fontFamily @@ -3984,12 +3976,12 @@ Editor::markLine = (line, style) -> block = @session.tree.getBlockOnLine line - @view.getViewNodeFor(block).mark style + @session.view.getViewNodeFor(block).mark style Editor::markBlock = (block, style) -> return unless @session? - @view.getViewNodeFor(block).mark style + @session.view.getViewNodeFor(block).mark style # ## Mark # `mark(line, col, style)` will mark the first block after the given (line, col) coordinate @@ -4000,7 +3992,7 @@ Editor::mark = (location, style) -> block = @session.tree.getFromTextLocation location block = block.container ? block - @view.getViewNodeFor(block).mark style + @session.view.getViewNodeFor(block).mark style @redrawHighlights() # TODO MERGE investigate @@ -4361,7 +4353,7 @@ hook 'populate', 0, -> # ================================ hook 'populate', 0, -> @cursorCtx = document.createElementNS SVG_STANDARD, 'g' - @textCursorPath = new @view.draw.Path([], false, { + @textCursorPath = new @session.view.draw.Path([], false, { 'strokeColor': '#000' 'lineWidth': '2' 'fillColor': 'rgba(0, 0, 256, 0.3)' @@ -4374,11 +4366,11 @@ hook 'populate', 0, -> cursorElement.setAttribute 'stroke', '#000' cursorElement.setAttribute 'stroke-width', '3' cursorElement.setAttribute 'stroke-linecap', 'round' - cursorElement.setAttribute 'd', "M#{@view.opts.tabOffset + CURSOR_WIDTH_DECREASE / 2} 0 " + - "Q#{@view.opts.tabOffset + @view.opts.tabWidth / 2} #{@view.opts.tabHeight}" + - " #{@view.opts.tabOffset + @view.opts.tabWidth - CURSOR_WIDTH_DECREASE / 2} 0" + cursorElement.setAttribute 'd', "M#{@session.view.opts.tabOffset + CURSOR_WIDTH_DECREASE / 2} 0 " + + "Q#{@session.view.opts.tabOffset + @session.view.opts.tabWidth / 2} #{@session.view.opts.tabHeight}" + + " #{@session.view.opts.tabOffset + @session.view.opts.tabWidth - CURSOR_WIDTH_DECREASE / 2} 0" - @cursorPath = new @view.draw.ElementWrapper(cursorElement) + @cursorPath = new @session.view.draw.ElementWrapper(cursorElement) @cursorPath.setParent @mainCtx @mainCanvas.appendChild @cursorCtx @@ -4454,7 +4446,7 @@ Editor::viewOrChildrenContains = (model, point, view = @session.view) -> return true for childObj in modelView.children - if @viewOrChildrenContains childObj.child, point, view + if @session.viewOrChildrenContains childObj.child, point, view return true return false @@ -4597,7 +4589,7 @@ Editor::addLineNumberForLine = (line) -> lineDiv.style.top = "#{treeView.bounds[line].y}px" - lineDiv.style.paddingTop = "#{treeView.distanceToBase[line].above - @view.opts.textHeight - @session.fontAscent}px" + lineDiv.style.paddingTop = "#{treeView.distanceToBase[line].above - @session.view.opts.textHeight - @session.fontAscent}px" lineDiv.style.paddingBottom = "#{treeView.distanceToBase[line].below - @session.fontDescent}" lineDiv.style.height = treeView.bounds[line].height + 'px' @@ -4734,10 +4726,10 @@ hook 'keyup', 0, (point, event, state) -> # ================================ Editor::overflowsX = -> - @documentDimensions().width > @viewportDimensions().width + @documentDimensions().width > @session.viewportDimensions().width Editor::overflowsY = -> - @documentDimensions().height > @viewportDimensions().height + @documentDimensions().height > @session.viewportDimensions().height Editor::documentDimensions = -> bounds = @session.view.getViewNodeFor(@session.tree).totalBounds @@ -4747,7 +4739,7 @@ Editor::documentDimensions = -> } Editor::viewportDimensions = -> - return @viewports.main + return @session.viewports.main # LINE LOCATION API # ================= From fe725130cf04d0d3a72326f62a72e0d07f848db6 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 24 Jun 2016 10:03:58 -0400 Subject: [PATCH 161/268] Some more bug fixes --- Gruntfile.coffee | 72 ++++++++++++++-------- src/controller.coffee | 17 +++--- src/draw.coffee | 137 ++++++++++++++++++------------------------ 3 files changed, 117 insertions(+), 109 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 3c897699..d51a29e8 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -1,4 +1,4 @@ -ldbrowserify = require 'browserify' +browserify = require 'browserify' coffeeify = require 'coffeeify' watchify = require 'watchify' @@ -74,29 +74,9 @@ module.exports = (grunt) -> timeout: 20000 browserify: - testserver: - files: - 'dist/droplet-full.js': ['./src/main.coffee'] - 'example/example-svg.js': ['./src/example-svg.coffee'] - options: - transform: ['coffeeify'] - browserifyOptions: - standalone: 'droplet' - noParse: NO_PARSE - banner: ''' - /* Droplet. - * Copyright (c) <%=grunt.template.today('yyyy')%> Anthony Bau. - * MIT License. - * - * Date: <%=grunt.template.today('yyyy-mm-dd')%> - */ - ''' - watch: true - keepAlive: true build: files: 'dist/droplet-full.js': ['./src/main.coffee'] - 'example/example-svg.js': ['./src/example-svg.coffee'] options: ignore: ignoredLanguages transform: ['coffeeify'] @@ -153,7 +133,7 @@ module.exports = (grunt) -> testserver: options: hostname: '0.0.0.0' - port: 8000 + port: 8001 middleware: serveNoDottedFiles qunitserver: options: @@ -198,5 +178,49 @@ module.exports = (grunt) -> grunt.task.run 'qunit:all' grunt.task.run 'mochaTest' - - grunt.registerTask 'testserver', ['connect:testserver', 'browserify:testserver'] + grunt.task.registerTask 'watchify', -> + # Prevent the task from terminating + @async() + + b = browserify { + cache: {} + packageCache: {} + noParse: NO_PARSE + delay: 100 + standalone: 'droplet' + } + + b.require './src/main.coffee' + b.transform coffeeify + + w = watchify(b) + + # Compile once through first + stream = fs.createWriteStream 'dist/droplet-full.js' + w.bundle().pipe stream + + stream.once 'close', -> + console.log 'Initial bundle complete.' + + lrserver = livereload() + + lrserver.listen 35729, -> + console.log 'Livereload server listening on 35729' + + w.on 'update', -> + console.log 'File changed...' + stream = fs.createWriteStream 'dist/droplet-full.js' + try + w.bundle().pipe stream + stream.once 'close', -> + console.log 'Rebuilt.' + lrserver.changed { + body: { + files: ['dist/droplet-full.js'] + } + } + catch e + console.log 'BUILD FAILED.' + console.log e.stack + + grunt.registerTask 'testserver', ['connect:testserver', 'watchify'] diff --git a/src/controller.coffee b/src/controller.coffee index 61f14b85..af6af355 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2,6 +2,7 @@ # # Copyright (c) 2014 Anthony Bau (dab1998@gmail.com) # MIT License. +# Test helper = require './helper.coffee' draw = require './draw.coffee' @@ -169,11 +170,11 @@ class Session @cursor = new CrossDocumentLocation(0, new model.Location(0, 'documentStart')) # Scrolling - @scrollOffsets = { - main: new draw.Point 0, 0 - palette: new draw.Point 0, 0 - } + @viewports = { + main: new draw.Rectangle 0, 0, 0, 0 + palette: new draw.Rectangle 0, 0, 0, 0 + } # Block toggle @currentlyUsingBlocks = true @@ -593,10 +594,10 @@ Editor::initializeFloatingBlock = (record, i) -> } ) record.startText = new @session.view.draw.Text( - (new @session.view.draw.Point(0, 0)), @mode.startComment + (new @session.view.draw.Point(0, 0)), @session.mode.startComment ) record.endText = new @session.view.draw.Text( - (new @session.view.draw.Point(0, 0)), @mode.endComment + (new @session.view.draw.Point(0, 0)), @session.mode.endComment ) for element in [record.grayBoxPath, record.startText, record.endText] @@ -716,8 +717,8 @@ Editor::redrawMain = (opts = {}) -> @currentlyDrawnFloatingBlocks = [] # Draw floating blocks - startWidth = @mode.startComment.length * @session.fontWidth - endWidth = @mode.endComment.length * @session.fontWidth + startWidth = @session.mode.startComment.length * @session.fontWidth + endWidth = @session.mode.endComment.length * @session.fontWidth for record in @session.floatingBlocks element = @drawFloatingBlock(record, startWidth, endWidth, rect, opts) @currentlyDrawnFloatingBlocks.push { diff --git a/src/draw.coffee b/src/draw.coffee index b18f4706..27eccbcc 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -115,83 +115,7 @@ exports.Draw = class Draw # A Rectangle knows its upper-left corner, width, and height, # and can do rectangular overlap, polygonal intersection, # and rectangle or point union (point union is called "swallow"). - @Rectangle = class Rectangle - constructor: (@x, @y, @width, @height) -> - - contains: (point) -> @x? and @y? and not ((point.x < @x) or (point.x > @x + @width) or (point.y < @y) or (point.y > @y + @height)) - - equals: (other) -> - unless other instanceof Rectangle - return false - return @x is other.x and - @y is other.y and - @width is other.width and - @height is other.height - - copy: (rect) -> - @x = rect.x; @y = rect.y - @width = rect.width; @height = rect.height - return @ - - clip: (ctx) -> - ctx.rect @x, @y, @width, @height - ctx.clip() - - clearRect: (ctx) -> - ctx.clearRect @x, @y, @width, @height - - clone: -> - rect = new Rectangle(0, 0, 0, 0) - rect.copy this - return rect - - clear: -> @width = @height = 0; @x = @y = null - - bottom: -> @y + @height - right: -> @x + @width - - fill: (ctx, style) -> - ctx.fillStyle = style - ctx.fillRect @x, @y, @width, @height - - unite: (rectangle) -> - unless @x? and @y? then @copy rectangle - else unless rectangle.x? and rectangle.y? then return - else - @width = max(@right(), rectangle.right()) - (@x = min @x, rectangle.x) - @height = max(@bottom(), rectangle.bottom()) - (@y = min @y, rectangle.y) - - swallow: (point) -> - unless @x? and @y? then @copy new Rectangle point.x, point.y, 0, 0 - else - @width = max(@right(), point.x) - (@x = min @x, point.x) - @height = max(@bottom(), point.y) - (@y = min @y, point.y) - - overlap: (rectangle) -> @x? and @y? and not ((rectangle.right()) < @x or (rectangle.bottom() < @y) or (rectangle.x > @right()) or (rectangle.y > @bottom())) - - translate: (vector) -> - @x += vector.x; @y += vector.y - - stroke: (ctx, style) -> - ctx.strokeStyle = style - ctx.strokeRect @x, @y, @width, @height - - fill: (ctx, style) -> - ctx.fillStyle = style - ctx.fillRect @x, @y, @width, @height - - upperLeftCorner: -> new Point @x, @y - - toPath: -> - path = new Path() - path.push new Point(point[0], point[1]) for point in [ - [@x, @y] - [@x, @bottom()] - [@right(), @bottom()] - [@right(), @y] - ] - return path - + @Rectangle = Rectangle # ## NoRectangle ## # NoRectangle is an alternate constructor for Rectangle which starts # the rectangle as nothing (without even a location). It can gain location and size @@ -778,3 +702,62 @@ exports.Size = class Size @width is size.width and @height is size.height @copy: (size) -> new Size(size.width, size.height) + +exports.Rectangle = class Rectangle + constructor: (@x, @y, @width, @height) -> + + contains: (point) -> @x? and @y? and not ((point.x < @x) or (point.x > @x + @width) or (point.y < @y) or (point.y > @y + @height)) + + equals: (other) -> + unless other instanceof Rectangle + return false + return @x is other.x and + @y is other.y and + @width is other.width and + @height is other.height + + copy: (rect) -> + @x = rect.x; @y = rect.y + @width = rect.width; @height = rect.height + return @ + + clone: -> + rect = new Rectangle(0, 0, 0, 0) + rect.copy this + return rect + + clear: -> @width = @height = 0; @x = @y = null + + bottom: -> @y + @height + right: -> @x + @width + + unite: (rectangle) -> + unless @x? and @y? then @copy rectangle + else unless rectangle.x? and rectangle.y? then return + else + @width = max(@right(), rectangle.right()) - (@x = min @x, rectangle.x) + @height = max(@bottom(), rectangle.bottom()) - (@y = min @y, rectangle.y) + + swallow: (point) -> + unless @x? and @y? then @copy new Rectangle point.x, point.y, 0, 0 + else + @width = max(@right(), point.x) - (@x = min @x, point.x) + @height = max(@bottom(), point.y) - (@y = min @y, point.y) + + overlap: (rectangle) -> @x? and @y? and not ((rectangle.right()) < @x or (rectangle.bottom() < @y) or (rectangle.x > @right()) or (rectangle.y > @bottom())) + + translate: (vector) -> + @x += vector.x; @y += vector.y + + upperLeftCorner: -> new Point @x, @y + + toPath: -> + path = new Path() + path.push new Point(point[0], point[1]) for point in [ + [@x, @y] + [@x, @bottom()] + [@right(), @bottom()] + [@right(), @y] + ] + return path + From 413c70303168311cf20678f2c5935c0e34add26c Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 24 Jun 2016 10:31:14 -0400 Subject: [PATCH 162/268] To the point where the controller can render --- src/controller.coffee | 50 +++++++++++++++++++++++++------------------ src/main.coffee | 1 - 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index af6af355..af0a0f1e 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2,7 +2,6 @@ # # Copyright (c) 2014 Anthony Bau (dab1998@gmail.com) # MIT License. -# Test helper = require './helper.coffee' draw = require './draw.coffee' @@ -280,6 +279,13 @@ exports.Editor = class Editor if @aceEditor instanceof Node @wrapperElement = @aceEditor + @wrapperElement.style.position = 'absolute' + @wrapperElement.style.right = + @wrapperElement.style.left = + @wrapperElement.style.top = + @wrapperElement.style.bottom = '0px' + @wrapperElement.style.overflow = 'hidden' + @aceElement = document.createElement 'div' @aceElement.className = 'droplet-ace' @@ -297,7 +303,10 @@ exports.Editor = class Editor else @wrapperElement = document.createElement 'div' @wrapperElement.style.position = 'absolute' - @wrapperElement.style.right = @wrapperElement.style.left = @wrapperElement.style.top = @wrapperElement.style.bottom = '0px' + @wrapperElement.style.right = + @wrapperElement.style.left = + @wrapperElement.style.top = + @wrapperElement.style.bottom = '0px' @wrapperElement.style.overflow = 'hidden' @aceElement = @aceEditor.container @@ -462,13 +471,13 @@ exports.Editor = class Editor @resizeTextMode() - @dropletElement.style.height = "#{@wrapperElement.offsetHeight}px" + @dropletElement.style.height = "#{@wrapperElement.clientHeight}px" if @session.paletteEnabled - @dropletElement.style.left = "#{@paletteWrapper.offsetWidth}px" - @dropletElement.style.width = "#{@wrapperElement.offsetWidth - @paletteWrapper.offsetWidth}px" + @dropletElement.style.left = "#{@paletteWrapper.clientWidth}px" + @dropletElement.style.width = "#{@wrapperElement.clientWidth - @paletteWrapper.clientWidth}px" else @dropletElement.style.left = "0px" - @dropletElement.style.width = "#{@wrapperElement.offsetWidth}px" + @dropletElement.style.width = "#{@wrapperElement.clientWidth}px" #@resizeGutter() @@ -495,7 +504,7 @@ exports.Editor = class Editor binding.call this unless @session?.currentlyUsingBlocks or @session?.showPaletteInTextMode and @session?.paletteEnabled - @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px" + @paletteWrapper.style.left = "#{-@paletteWrapper.clientWidth}px" @rebuildPalette() @@ -606,8 +615,8 @@ Editor::initializeFloatingBlock = (record, i) -> @session.view.getViewNodeFor(record.block).group.setParent record.renderGroup # TODO maybe refactor into qualifiedFocus - if i < @floatingBlocks.length - @mainCtx.insertBefore record.renderGroup.element, @floatingBlocks[i].renderGroup.element + if i < @session.floatingBlocks.length + @mainCtx.insertBefore record.renderGroup.element, @session.floatingBlocks[i].renderGroup.element else @mainCtx.appendChild record.renderGroup @@ -1640,8 +1649,8 @@ hook 'mousemove', 0, (point, event, state) -> while head.type in ['newline', 'cursor'] or head.type is 'text' and head.value is '' head = head.next - if head is @tree.end and @floatingBlocks.length is 0 and - @session.viewports.main.right() > mainPoint.x > @session.viewports.main.x - @gutter.offsetWidth and + if head is @tree.end and @session.floatingBlocks.length is 0 and + @session.viewports.main.right() > mainPoint.x > @session.viewports.main.x - @gutter.clientWidth and @session.viewports.main.bottom() > mainPoint.y > @session.viewports.main.y @session.view.getViewNodeFor(@tree).highlightArea.update() @lastHighlight = @tree @@ -1686,9 +1695,9 @@ hook 'mousemove', 0, (point, event, state) -> Editor::qualifiedFocus = (node, path) -> documentIndex = @documentIndex node - if documentIndex < @floatingBlocks.length + if documentIndex < @session.floatingBlocks.length path.activate() - @mainCtx.insertBefore path.element, @floatingBlocks[documentIndex].renderGroup.element + @mainCtx.insertBefore path.element, @session.floatingBlocks[documentIndex].renderGroup.element else path.focus() @@ -1918,7 +1927,7 @@ hook 'mouseup', 0, (point, event, state) -> renderPoint ) - @initializeFloatingBlock record, @floatingBlocks.length - 1 + @initializeFloatingBlock record, @session.floatingBlocks.length - 1 @setCursor @draggingBlock.start @@ -2133,7 +2142,7 @@ hook 'populate', 1, -> @paletteElement.appendChild @paletteHighlightCanvas Editor::resizePaletteHighlight = -> - @paletteHighlightCanvas.style.top = @paletteHeader.offsetHeight + 'px' + @paletteHighlightCanvas.style.top = @paletteHeader.clientHeight + 'px' @paletteHighlightCanvas.style.width = "#{@paletteCanvas.clientWidth}px" @paletteHighlightCanvas.style.height = "#{@paletteCanvas.clientHeight}px" @@ -2252,7 +2261,7 @@ hook 'populate', 1, -> Editor::resizeAceElement = -> width = @wrapperElement.clientWidth if @session?.showPaletteInTextMode and @session?.paletteEnabled - width -= @paletteWrapper.offsetWidth + width -= @paletteWrapper.clientWidth @aceElement.style.width = "#{width}px" @aceElement.style.height = "#{@wrapperElement.clientHeight}px" @@ -3530,8 +3539,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - # Kick off fade-out transition @mainCanvas.style.transition = - @highlightCanvas.style.transition = - @cursorCanvas.style.transition = "opacity #{fadeTime}ms linear" + @highlightCanvas.style.transition = "opacity #{fadeTime}ms linear" @mainCanvas.style.opacity = 0 @@ -3862,7 +3870,7 @@ Editor::resizeMainScroller = -> @mainScroller.style.height = "#{@dropletElement.clientHeight}px" hook 'resize_palette', 0, -> - @paletteScroller.style.top = "#{@paletteHeader.offsetHeight}px" + @paletteScroller.style.top = "#{@paletteHeader.clientHeight}px" @session.viewports.palette.height = @paletteScroller.clientHeight @session.viewports.palette.width = @paletteScroller.clientWidth @@ -4146,7 +4154,7 @@ Editor::setEditorState = (useBlocks) -> @dropletElement.style.left = "#{@paletteWrapper.clientWidth}px" else @paletteWrapper.style.top = '0px' - @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px" + @paletteWrapper.style.left = "#{-@paletteWrapper.clientWidth}px" @dropletElement.style.left = '0px' @aceElement.style.top = @aceElement.style.left = '-9999px' @@ -4184,7 +4192,7 @@ Editor::setEditorState = (useBlocks) -> @paletteWrapper.style.top = @paletteWrapper.style.left = '0px' else @paletteWrapper.style.top = '0px' - @paletteWrapper.style.left = "#{-@paletteWrapper.offsetWidth}px" + @paletteWrapper.style.left = "#{-@paletteWrapper.clientWidth}px" @aceElement.style.top = '0px' if paletteVisibleInNewState diff --git a/src/main.coffee b/src/main.coffee index 9d50eb3d..ccad653b 100644 --- a/src/main.coffee +++ b/src/main.coffee @@ -1,4 +1,3 @@ module.exports = { Editor: require('./controller.coffee').Editor - helper: require './helper.coffee' } From 3fed59a0ca33aeba45e4d86b3678867cbc3a1b0d Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 24 Jun 2016 11:35:29 -0400 Subject: [PATCH 163/268] Fix old weird bevel bug yay --- src/controller.coffee | 48 ++++++++++++++++++++++++------------------- src/draw.coffee | 25 +++++++++++++++++++--- src/view.coffee | 28 +++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 24 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index af0a0f1e..9281b2c7 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -518,8 +518,8 @@ exports.Editor = class Editor return unless @session? # Force scroll into our position - offsetY =@session.scrollOffsets.main.y - offsetX = @session.scrollOffsets.main.x + offsetY = @session.viewports.main.y + offsetX = @session.viewports.main.x @setEditorState @session.currentlyUsingBlocks @@ -856,23 +856,23 @@ Editor::absoluteOffset = (el) -> # Convert a point relative to the page into # a point relative to one of the two canvases. Editor::trackerPointToMain = (point) -> - if not @mainCanvas.offsetParent? + if not @mainCanvas.parentElement? return new @draw.Point(NaN, NaN) gbr = @mainCanvas.getBoundingClientRect() - new @draw.Point(point.x - gbr.left + @session.scrollOffsets.main.x, - point.y - gbr.top + @session.scrollOffsets.main.y) + new @draw.Point(point.x - gbr.left + @session.viewports.main.x, + point.y - gbr.top + @session.viewports.main.y) Editor::trackerPointToPalette = (point) -> - if not @paletteCanvas.offsetParent? + if not @paletteCanvas.parentElement? return new @draw.Point(NaN, NaN) gbr = @paletteCanvas.getBoundingClientRect() - new @draw.Point(point.x - gbr.left + @session.scrollOffsets.palette.x, - point.y - gbr.top + @session.scrollOffsets.palette.y) + new @draw.Point(point.x - gbr.left + @session.viewports.palette.x, + point.y - gbr.top + @session.viewports.palette.y) Editor::trackerPointIsInElement = (point, element) -> if not @session? or @session.readOnly return false - if not element.offsetParent? + if not element.parentElement? return false gbr = element.getBoundingClientRect() return point.x >= gbr.left and point.x < gbr.right and @@ -1270,12 +1270,15 @@ Editor::toCrossDocumentLocation = (block) -> # We do not do anything until the user # drags their mouse five pixels hook 'mousedown', 1, (point, event, state) -> + console.log 'testing' # If someone else has already taken this click, pass. if state.consumedHitTest then return + console.log 'taking and testing main', @trackerPointIsInMain point # If it's not in the main pane, pass. if not @trackerPointIsInMain(point) then return + console.log 'on main pane' # Hit test against the tree. mainPoint = @trackerPointToMain(point) @@ -1288,6 +1291,7 @@ hook 'mousedown', 1, (point, event, state) -> @setCursor @session.cursor, ((token) -> token.type isnt 'socketStart') hitTestResult = @hitTest mainPoint, dropletDocument + console.log 'Hit test result is', mainPoint, hitTestResult # Produce debugging output if @debugging and event.shiftKey @@ -1649,11 +1653,11 @@ hook 'mousemove', 0, (point, event, state) -> while head.type in ['newline', 'cursor'] or head.type is 'text' and head.value is '' head = head.next - if head is @tree.end and @session.floatingBlocks.length is 0 and + if head is @session.tree.end and @session.floatingBlocks.length is 0 and @session.viewports.main.right() > mainPoint.x > @session.viewports.main.x - @gutter.clientWidth and @session.viewports.main.bottom() > mainPoint.y > @session.viewports.main.y - @session.view.getViewNodeFor(@tree).highlightArea.update() - @lastHighlight = @tree + @session.view.getViewNodeFor(@session.tree).highlightArea.update() + @lastHighlight = @session.tree else # If the user is touching the original location, @@ -1669,18 +1673,20 @@ hook 'mousemove', 0, (point, event, state) -> # Update highlight if necessary. if dropBlock isnt @lastHighlight + console.log 'Updating now!' # TODO if this becomes a performance issue, # pull the drop highlights out into a new canvas. @redrawHighlights() @lastHighlightPath?.deactivate?() - if best? - @lastHighlightPath = @session.view.getViewNodeFor(best).highlightArea + if dropBlock? + @lastHighlightPath = @session.view.getViewNodeFor(dropBlock).highlightArea @lastHighlightPath.update() - @qualifiedFocus best, @lastHighlightPath - @lastHighlight = dropBlock + @qualifiedFocus dropBlock, @lastHighlightPath + + @lastHighlight = dropBlock palettePoint = @trackerPointToPalette position @@ -1894,8 +1900,8 @@ hook 'mouseup', 0, (point, event, state) -> addBlockAsFloatingBlock = false else - if renderPoint.x - @session.scrollOffsets.main.x < 0 - renderPoint.x = @session.scrollOffsets.main.x + if renderPoint.x - @session.viewports.main.x < 0 + renderPoint.x = @session.viewports.main.x # If @session.allowFloatingBlocks is false, we end the drag without deleting the block. if not @session.allowFloatingBlocks @@ -2194,8 +2200,8 @@ hook 'rebuild_palette', 1, -> hoverDiv.addEventListener 'mouseout', (event) => if block is @currentHighlightedPaletteBlock @currentHighlightedPaletteBlock = null - @paletteHighlightCtx.clearRect @session.scrollOffsets.palette.x, @session.scrollOffsets.palette.y, - @paletteHighlightCanvas.width + @session.scrollOffsets.palette.x, @paletteHighlightCanvas.height + @session.scrollOffsets.palette.y + @paletteHighlightCtx.clearRect @session.viewports.palette.x, @session.viewports.palette.y, + @paletteHighlightCanvas.width + @session.viewports.palette.x, @paletteHighlightCanvas.height + @session.viewports.palette.y @paletteScrollerStuffing.appendChild hoverDiv @@ -2782,7 +2788,7 @@ Editor::showDropdown = (socket = @getCursor(), inPalette = false) -> if inPalette location = @session.paletteView.getViewNodeFor(socket).bounds[0] - @dropdownElement.style.left = location.x - @session.scrollOffsets.palette.x + @paletteCanvas.offsetLeft + 'px' + @dropdownElement.style.left = location.x - @session.viewports.palette.x + @paletteCanvas.offsetLeft + 'px' @dropdownElement.style.minWidth = location.width + 'px' @dropdownElement.style.top = location.y + @session.fontSize - @session.viewports.main.y + 'px' diff --git a/src/draw.coffee b/src/draw.coffee index 27eccbcc..97217dd3 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -14,6 +14,10 @@ SVG_STANDARD = helper.SVG_STANDARD # Signed area of the triangle formed by vectors [ab] and [ac] _area = (a, b, c) -> (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y) +isWrong = (coord) -> + return Math.abs(coord.x) > 1000 or Math.abs(coord.y > 1000 or + coord.x isnt coord.x or coord.y isnt coord.y) + # ## _intersects ## # Test the intersection of two line segments _intersects = (a, b, c, d) -> @@ -29,9 +33,9 @@ _bisector = (a, b, c, magnitude = 1) -> sampleB = c.from(b).normalize() ) - if diagonal.x is 0 and diagonal.y is 0 + if diagonal.almostEquals ZERO return null - else if sample.almostEquals(sampleB) + else if sample.almostEquals sampleB return null diagonal = diagonal.normalize() @@ -237,13 +241,17 @@ exports.Draw = class Draw if insetCoord? outsidePoints.push @_points[i] insidePoints.push insetCoord + if isWrong insetCoord + debugger insetCoord = @getInsetCoordinate i + 1, BEVEL_SIZE if insetCoord? outsidePoints.push point insidePoints.push insetCoord + if isWrong insetCoord + debugger else unless point.equals(@_points[i]) or outsidePoints.length is 0 subpaths.push( - 'M' + outsidePoints.concat(insidePoints.reverse()).map((point) -> "#{ point.x} #{ point.y}").join(" L") + ' Z' + 'M' + outsidePoints.concat(insidePoints.reverse()).map((point) -> "#{point.x} #{point.y}").join(" L") + ' Z' ) outsidePoints.length = insidePoints.length = 0 @@ -254,10 +262,14 @@ exports.Draw = class Draw if insetCoord? outsidePoints.push @_points[@_points.length - 1] insidePoints.push insetCoord + if isWrong insetCoord + debugger insetCoord = @getInsetCoordinate 0, BEVEL_SIZE if insetCoord? outsidePoints.push @_points[0] insidePoints.push insetCoord + if isWrong insetCoord + debugger if outsidePoints.length > 0 subpaths.push( @@ -445,10 +457,15 @@ exports.Draw = class Draw next = @_points[k %% @_points.length] vector = _bisector prev, @_points[i], next, length + if vector? and isWrong vector + debugger return null unless vector? point = @_points[i].plus vector + if isWrong point + debugger + return point getLightBevelPath: -> @_clearCache(); @_lightBevelPath @@ -696,6 +713,8 @@ exports.Point = class Point Math.abs(point.x - @x) < EPSILON and Math.abs(point.y - @y) < EPSILON +ZERO = new Point 0, 0 + exports.Size = class Size constructor: (@width, @height) -> equals: (size) -> diff --git a/src/view.coffee b/src/view.coffee index a9ad220b..47499a8d 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -1839,6 +1839,34 @@ exports.View = class View unmark: -> @markStyle = null + # ## drawSelf + # Draw our path, with applied + # styles if necessary. + drawSelf: (style = {}) -> + # We might want to apply some + # temporary color changes, + # so store the old colors + oldFill = @path.style.fillColor + oldStroke = @path.style.strokeColor + + if style.grayscale + @path.style.fillColor = avgColor @path.style.fillColor, 0.5, '#888' + @path.style.strokeColor = avgColor @path.style.strokeColor, 0.5, '#888' + + if style.selected + @path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F' + @path.style.strokeColor = avgColor @path.style.strokeColor, 0.7, '#00F' + + @path.setMarkStyle @markStyle + + @path.update() + + # Unset all the things we changed + @path.style.fillColor = oldFill + @path.style.strokeColor = oldStroke + + return null + # ## computeOwnDropArea # By default, we will not have a # drop area (not be droppable). From 75650614c0eb1dd57031f5195cd8e4d7b7459da5 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 24 Jun 2016 13:18:15 -0400 Subject: [PATCH 164/268] Fix floating blocks and lasso select style --- css/droplet.css | 6 +++++- src/controller.coffee | 33 ++++++++++++++++++++++++--------- src/view.coffee | 17 ++++++++++++----- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/css/droplet.css b/css/droplet.css index 2dc5ba8b..eb751b5f 100644 --- a/css/droplet.css +++ b/css/droplet.css @@ -374,7 +374,7 @@ text { cursor: pointer; } .droplet-socket-path { - fill: #FFF; + /*fill: #FFF;*/ } .droplet-empty-socket-path { opacity: 0; @@ -382,3 +382,7 @@ text { .droplet-empty-socket-path:hover { opacity: 1; } +.droplet-socket-selected { + fill: '#88F' + stroke: '#88F' +} diff --git a/src/controller.coffee b/src/controller.coffee index 9281b2c7..b1ebcc03 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -329,7 +329,7 @@ exports.Editor = class Editor @dropletElement.appendChild @transitionContainer if @options? - @session = new Session @mainCanvas, @paletteCanvas, @dragCanvas, @options, @standardViewSettings + @session = new Session @mainCtx, @paletteCanvas, @dragCanvas, @options, @standardViewSettings @sessions = new PairDict([ [@aceEditor.getSession(), @session] ]) @@ -611,9 +611,12 @@ Editor::initializeFloatingBlock = (record, i) -> for element in [record.grayBoxPath, record.startText, record.endText] element.setParent record.renderGroup + element.activate() @session.view.getViewNodeFor(record.block).group.setParent record.renderGroup + record.renderGroup.activate() + # TODO maybe refactor into qualifiedFocus if i < @session.floatingBlocks.length @mainCtx.insertBefore record.renderGroup.element, @session.floatingBlocks[i].renderGroup.element @@ -859,15 +862,15 @@ Editor::trackerPointToMain = (point) -> if not @mainCanvas.parentElement? return new @draw.Point(NaN, NaN) gbr = @mainCanvas.getBoundingClientRect() - new @draw.Point(point.x - gbr.left + @session.viewports.main.x, - point.y - gbr.top + @session.viewports.main.y) + new @draw.Point(point.x - gbr.left, + point.y - gbr.top) Editor::trackerPointToPalette = (point) -> if not @paletteCanvas.parentElement? return new @draw.Point(NaN, NaN) gbr = @paletteCanvas.getBoundingClientRect() - new @draw.Point(point.x - gbr.left + @session.viewports.palette.x, - point.y - gbr.top + @session.viewports.palette.y) + new @draw.Point(point.x - gbr.left, + point.y - gbr.top) Editor::trackerPointIsInElement = (point, element) -> if not @session? or @session.readOnly @@ -1663,17 +1666,23 @@ hook 'mousemove', 0, (point, event, state) -> # If the user is touching the original location, # assume they want to replace the block where they found it. if @hitTest mainPoint, @draggingBlock - dropBlock = null @dragReplacing = true + dropBlock = null + + # If the user's block is outside the main pane, delete it + else if not @trackerPointIsInMain position + console.log 'Getting rid' + @dragReplacing = false + dropBlock= null # Otherwise, find the closest droppable block else + console.log 'Finding closest droppable block' @dragReplacing = false dropBlock = @getClosestDroppableBlock(mainPoint, event.shiftKey) # Update highlight if necessary. if dropBlock isnt @lastHighlight - console.log 'Updating now!' # TODO if this becomes a performance issue, # pull the drop highlights out into a new canvas. @redrawHighlights() @@ -1686,7 +1695,7 @@ hook 'mousemove', 0, (point, event, state) -> @qualifiedFocus dropBlock, @lastHighlightPath - @lastHighlight = dropBlock + @lastHighlight = dropBlock palettePoint = @trackerPointToPalette position @@ -1705,7 +1714,8 @@ Editor::qualifiedFocus = (node, path) -> path.activate() @mainCtx.insertBefore path.element, @session.floatingBlocks[documentIndex].renderGroup.element else - path.focus() + path.activate() + @mainCtx.appendChild path.element hook 'mouseup', 0, -> clearTimeout @discourageDropTimeout; @discourageDropTimeout = null @@ -1779,6 +1789,7 @@ hook 'mouseup', 1, (point, event, state) -> @aceEditor.onTextInput text else if @lastHighlight? + console.log '@lastHighlight is present so dropping @lastHighlight and consuming' @undoCapture() # Remove the block from the tree. @@ -1892,9 +1903,12 @@ hook 'mouseup', 0, (point, event, state) -> removeBlock = true addBlockAsFloatingBlock = true + console.log 'The main viewport is', @session.viewports.main + # If we dropped it off in the palette, abort (so as to delete the block). unless @session.viewports.main.right() > renderPoint.x > @session.viewports.main.x - @gutter.clientWidth and @session.viewports.main.bottom() > renderPoint.y > @session.viewports.main.y + console.log 'Block should now be removed theoretically' if @draggingBlock is @lassoSelection @lassoSelection = null @@ -1909,6 +1923,7 @@ hook 'mouseup', 0, (point, event, state) -> removeBlock = false if removeBlock + console.log 'REMOVING THE BLOCK!' # Remove the block from the tree. @undoCapture() rememberedSocketOffsets = @spliceRememberedSocketOffsets(@draggingBlock) diff --git a/src/view.coffee b/src/view.coffee index 47499a8d..02900c3f 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -1850,12 +1850,16 @@ exports.View = class View oldStroke = @path.style.strokeColor if style.grayscale - @path.style.fillColor = avgColor @path.style.fillColor, 0.5, '#888' - @path.style.strokeColor = avgColor @path.style.strokeColor, 0.5, '#888' + if @path.style.fillColor isnt 'none' + @path.style.fillColor = avgColor @path.style.fillColor, 0.5, '#888' + if @path.style.strokeColor isnt 'none' + @path.style.strokeColor = avgColor @path.style.strokeColor, 0.5, '#888' if style.selected - @path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F' - @path.style.strokeColor = avgColor @path.style.strokeColor, 0.7, '#00F' + if @path.style.fillColor isnt 'none' + @path.style.fillColor = avgColor @path.style.fillColor, 0.7, '#00F' + if @path.style.strokeColor isnt 'none' + @path.style.strokeColor = avgColor @path.style.strokeColor, 0.7, '#00F' @path.setMarkStyle @markStyle @@ -2096,14 +2100,17 @@ exports.View = class View # for mouseover if '' is @model.emptyString and @model.start?.next is @model.end @path.style.cssClass = 'droplet-socket-path droplet-empty-socket-path' + @path.style.fillColor = 'none' else @path.style.cssClass = 'droplet-socket-path' + @path.style.fillColor = '#FFF' return @path # ## drawSelf (SocketViewNode) - drawSelf: (style) -> + drawSelf: (style = {}) -> super + if @model.hasDropdown() and @view.opts.showDropdowns @dropdownElement.setPoints([new @view.draw.Point(@bounds[0].x + helper.DROPDOWN_ARROW_PADDING, @bounds[0].y + (@bounds[0].height - DROPDOWN_ARROW_HEIGHT) / 2), From 76f8d8cb0801d0d09082d42344ccdfc682036cc6 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Fri, 24 Jun 2016 13:56:57 -0400 Subject: [PATCH 165/268] Fix some of the tests --- src/controller.coffee | 62 +------------------------------------ src/draw.coffee | 17 ---------- test/src/ctest.coffee | 8 ++--- test/src/tests.coffee | 8 ----- test/src/uitest.coffee | 70 ++---------------------------------------- 5 files changed, 8 insertions(+), 157 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index b1ebcc03..253b3841 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -1273,15 +1273,12 @@ Editor::toCrossDocumentLocation = (block) -> # We do not do anything until the user # drags their mouse five pixels hook 'mousedown', 1, (point, event, state) -> - console.log 'testing' # If someone else has already taken this click, pass. if state.consumedHitTest then return - console.log 'taking and testing main', @trackerPointIsInMain point # If it's not in the main pane, pass. if not @trackerPointIsInMain(point) then return - console.log 'on main pane' # Hit test against the tree. mainPoint = @trackerPointToMain(point) @@ -1294,7 +1291,6 @@ hook 'mousedown', 1, (point, event, state) -> @setCursor @session.cursor, ((token) -> token.type isnt 'socketStart') hitTestResult = @hitTest mainPoint, dropletDocument - console.log 'Hit test result is', mainPoint, hitTestResult # Produce debugging output if @debugging and event.shiftKey @@ -1397,8 +1393,7 @@ Editor::drawDraggingBlock = -> @dragCanvas.width = Math.min draggingBlockView.totalBounds.width + 10, window.screen.width @dragCanvas.height = Math.min draggingBlockView.totalBounds.height + 10, window.screen.height - draggingBlockView.drawShadow @dragCtx, 5, 5 - draggingBlockView.draw @dragCtx, new @draw.Rectangle 0, 0, @dragCanvas.width, @dragCanvas.height + draggingBlockView.draw new @draw.Rectangle 0, 0, @dragCanvas.width, @dragCanvas.height Editor::wouldDelete = (position) -> @@ -1671,13 +1666,11 @@ hook 'mousemove', 0, (point, event, state) -> # If the user's block is outside the main pane, delete it else if not @trackerPointIsInMain position - console.log 'Getting rid' @dragReplacing = false dropBlock= null # Otherwise, find the closest droppable block else - console.log 'Finding closest droppable block' @dragReplacing = false dropBlock = @getClosestDroppableBlock(mainPoint, event.shiftKey) @@ -1789,7 +1782,6 @@ hook 'mouseup', 1, (point, event, state) -> @aceEditor.onTextInput text else if @lastHighlight? - console.log '@lastHighlight is present so dropping @lastHighlight and consuming' @undoCapture() # Remove the block from the tree. @@ -1903,12 +1895,9 @@ hook 'mouseup', 0, (point, event, state) -> removeBlock = true addBlockAsFloatingBlock = true - console.log 'The main viewport is', @session.viewports.main - # If we dropped it off in the palette, abort (so as to delete the block). unless @session.viewports.main.right() > renderPoint.x > @session.viewports.main.x - @gutter.clientWidth and @session.viewports.main.bottom() > renderPoint.y > @session.viewports.main.y - console.log 'Block should now be removed theoretically' if @draggingBlock is @lassoSelection @lassoSelection = null @@ -1923,7 +1912,6 @@ hook 'mouseup', 0, (point, event, state) -> removeBlock = false if removeBlock - console.log 'REMOVING THE BLOCK!' # Remove the block from the tree. @undoCapture() rememberedSocketOffsets = @spliceRememberedSocketOffsets(@draggingBlock) @@ -2172,54 +2160,6 @@ hook 'redraw_palette', 0, -> if @currentHighlightedPaletteBlock? @paletteHighlightPath.update() -hook 'rebuild_palette', 1, -> - # Remove the existent blocks - @paletteScrollerStuffing.innerHTML = '' - - @currentHighlightedPaletteBlock = null - - # Add new blocks - for data in @session.currentPaletteMetadata - block = data.block - - hoverDiv = document.createElement 'div' - hoverDiv.className = 'droplet-hover-div' - - hoverDiv.title = data.title ? block.stringify() - - if data.id? - hoverDiv.setAttribute 'data-id', data.id - - bounds = @session.paletteView.getViewNodeFor(block).totalBounds - - hoverDiv.style.top = "#{bounds.y}px" - hoverDiv.style.left = "#{bounds.x}px" - - # Clip boxes to the width of the palette to prevent x-scrolling. TODO: fix x-scrolling behaviour. - hoverDiv.style.width = "#{Math.min(bounds.width, Infinity)}px" - hoverDiv.style.height = "#{bounds.height}px" - - do (block) => - hoverDiv.addEventListener 'mousemove', (event) => - palettePoint = @trackerPointToPalette new @draw.Point( - event.clientX, event.clientY) - if @session.viewOrChildrenContains block, palettePoint, @session.paletteView - @clearPaletteHighlightCanvas() - @paletteHighlightPath = @getHighlightPath block, {color: '#FF0'}, @session.paletteView - @paletteHighlightPath.draw @paletteHighlightCtx - @currentHighlightedPaletteBlock = block - else if block is @currentHighlightedPaletteBlock - @currentHighlightedPaletteBlock = null - @clearPaletteHighlightCanvas() - - hoverDiv.addEventListener 'mouseout', (event) => - if block is @currentHighlightedPaletteBlock - @currentHighlightedPaletteBlock = null - @paletteHighlightCtx.clearRect @session.viewports.palette.x, @session.viewports.palette.y, - @paletteHighlightCanvas.width + @session.viewports.palette.x, @paletteHighlightCanvas.height + @session.viewports.palette.y - - @paletteScrollerStuffing.appendChild hoverDiv - # TEXT INPUT SUPPORT # ================================ diff --git a/src/draw.coffee b/src/draw.coffee index 97217dd3..6fa8b142 100644 --- a/src/draw.coffee +++ b/src/draw.coffee @@ -14,10 +14,6 @@ SVG_STANDARD = helper.SVG_STANDARD # Signed area of the triangle formed by vectors [ab] and [ac] _area = (a, b, c) -> (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y) -isWrong = (coord) -> - return Math.abs(coord.x) > 1000 or Math.abs(coord.y > 1000 or - coord.x isnt coord.x or coord.y isnt coord.y) - # ## _intersects ## # Test the intersection of two line segments _intersects = (a, b, c, d) -> @@ -241,14 +237,10 @@ exports.Draw = class Draw if insetCoord? outsidePoints.push @_points[i] insidePoints.push insetCoord - if isWrong insetCoord - debugger insetCoord = @getInsetCoordinate i + 1, BEVEL_SIZE if insetCoord? outsidePoints.push point insidePoints.push insetCoord - if isWrong insetCoord - debugger else unless point.equals(@_points[i]) or outsidePoints.length is 0 subpaths.push( 'M' + outsidePoints.concat(insidePoints.reverse()).map((point) -> "#{point.x} #{point.y}").join(" L") + ' Z' @@ -262,14 +254,10 @@ exports.Draw = class Draw if insetCoord? outsidePoints.push @_points[@_points.length - 1] insidePoints.push insetCoord - if isWrong insetCoord - debugger insetCoord = @getInsetCoordinate 0, BEVEL_SIZE if insetCoord? outsidePoints.push @_points[0] insidePoints.push insetCoord - if isWrong insetCoord - debugger if outsidePoints.length > 0 subpaths.push( @@ -457,15 +445,10 @@ exports.Draw = class Draw next = @_points[k %% @_points.length] vector = _bisector prev, @_points[i], next, length - if vector? and isWrong vector - debugger return null unless vector? point = @_points[i].plus vector - if isWrong point - debugger - return point getLightBevelPath: -> @_clearCache(); @_lightBevelPath diff --git a/test/src/ctest.coffee b/test/src/ctest.coffee index ba798038..7e4953e1 100644 --- a/test/src/ctest.coffee +++ b/test/src/ctest.coffee @@ -195,13 +195,13 @@ asyncTest 'Parser: parser freeze test comment consolidation', -> pickUpLocation = (editor, document, location) -> block = editor.getDocument(document).getFromTextLocation(location) bound = editor.session.view.getViewNodeFor(block).bounds[0] - simulate('mousedown', editor.mainScrollerStuffing, { - dx: bound.x + editor.gutter.offsetWidth + 5, + simulate('mousedown', editor.mainCanvas, { + dx: bound.x + 5, dy: bound.y + 5 }) simulate('mousemove', editor.dragCover, { location: editor.mainCanvas - dx: bound.x + editor.gutter.offsetWidth + 10, + dx: bound.x + 10, dy: bound.y + 10 }) @@ -213,7 +213,7 @@ dropLocation = (editor, document, location) -> dx: blockView.dropPoint.x + 5, dy: blockView.dropPoint.y + 5 }) - simulate('mouseup', editor.mainScrollerIntermediary, { + simulate('mouseup', editor.mainCanvas, { dx: blockView.dropPoint.x + 5 dy: blockView.dropPoint.y + 5 }) diff --git a/test/src/tests.coffee b/test/src/tests.coffee index a4c6a8c8..a4c41e5b 100644 --- a/test/src/tests.coffee +++ b/test/src/tests.coffee @@ -696,7 +696,6 @@ asyncTest 'Controller: arbitrary row/column marking', -> equal editor.tree.getFromTextLocation({row: 2, col: 9, type: 'block'}).stringify(), '10 - 10', 'Selected the right block' -<<<<<<< HEAD before = $('[stroke=#F00]').length key = editor.mark {row: 2, col: 9, type: 'block'}, {color: '#F00'} @@ -705,13 +704,6 @@ asyncTest 'Controller: arbitrary row/column marking', -> ok after > before, 'Added a red mark' -======= - strictEqual editor.session.markedBlocks[key].model.stringify({}), '10 - 10' - strictEqual editor.session.markedBlocks[key].style.color, '#F00' - - editor.unmark key - ok key not of editor.session.markedBlocks ->>>>>>> c_support start() asyncTest 'Controller: dropdown menus', -> diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee index 362dd141..2100e316 100644 --- a/test/src/uitest.coffee +++ b/test/src/uitest.coffee @@ -117,13 +117,8 @@ asyncTest 'Controller: palette block expansion', -> { location: '.droplet-main-scroller', dx: 40, dy: 50 }) simulate('mouseup', '.droplet-drag-cover', { location: '.droplet-main-scroller', dx: 40, dy: 50 }) -<<<<<<< HEAD - equal(editor.getValue().trim(), 'pen red\na1 = b') - simulate('mousedown', '[data-id=ftest]') -======= equal(editor.getValue().trim(), 'pen red\na3 = b') - simulate('mousedown', '[title=ftest]') ->>>>>>> c_support + simulate('mousedown', '[data-id=ftest]') simulate('mousemove', '.droplet-drag-cover', { location: '[data-id=ftest]', dx: 5 }) simulate('mousemove', '.droplet-drag-cover', @@ -260,16 +255,7 @@ asyncTest 'Controller: does not throw on reparse error', -> ok(true, 'Does not throw on reparse') -<<<<<<< HEAD after = $('[stroke=#F00]').length -======= - foundErrorMark = false - for key, val of editor.session.markedBlocks - if val.model.stringify() is '18n' and - val.style.color is '#F00' - foundErrorMark = true - break ->>>>>>> c_support ok(after > before, 'Marks block with a red line') @@ -397,33 +383,15 @@ performTextOperation = (editor, text, cb) -> dy: text.socket.handle.y }) setTimeout (-> -<<<<<<< HEAD $(editor.hiddeninput).sendkeys(text.text) - # unfocus + # Unfocus evt = document.createEvent 'Event' evt.initEvent 'keydown', true, true evt.keyCode = evt.which = 13 editor.dropletElement.dispatchEvent(evt) setTimeout cb, 0 -======= - $(editor.hiddenInput).sendkeys(text.text) - setTimeout (-> - # Unfocus - simulate('mousedown', editor.mainScrollerIntermediary, { - location: editor.mainCanvas - dx: editor.mainCanvas.offsetWidth - 1 - dy: editor.mainCanvas.offsetHeight - 1 - }) - simulate('mouseup', editor.mainScrollerIntermediary, { - location: editor.mainCanvas - dx: editor.mainCanvas.offsetWidth - 1 - dy: editor.mainCanvas.offsetHeight - 1 - }) - setTimeout cb, 0 - ), 0 ->>>>>>> c_support ), 0 performDragOperation = (editor, drag, cb) -> @@ -441,13 +409,12 @@ performDragOperation = (editor, drag, cb) -> dx: drag.drop.point.x + 5 dy: drag.drop.point.y + 5 }) -<<<<<<< HEAD simulate('mouseup', editor.mainCanvas, { dx: drag.drop.point.x + 5 dy: drag.drop.point.y + 5 }) - # unfocus + # Unfocus evt = document.createEvent 'Event' evt.initEvent 'keydown', true, true evt.keyCode = evt.which = 13 @@ -460,33 +427,6 @@ pickUpLocation = (editor, document, location) -> bound = editor.view.getViewNodeFor(block).bounds[0] simulate('mousedown', editor.mainCanvas, { dx: bound.x + 5, -======= - simulate('mouseup', editor.mainScrollerIntermediary, { - dx: drag.drop.point.x + 5 - dy: drag.drop.point.y + 5 - }) - # Unfocus the text input that may have been focused - # when we dragged - setTimeout (-> - simulate('mousedown', editor.mainScrollerIntermediary, { - location: editor.mainCanvas - dx: editor.mainCanvas.offsetWidth - 1 - dy: editor.mainCanvas.offsetHeight - 1 - }) - simulate('mouseup', editor.mainScrollerIntermediary, { - location: editor.mainCanvas - dx: editor.mainCanvas.offsetWidth - 1 - dy: editor.mainCanvas.offsetHeight - 1 - }) - setTimeout cb, 0 - ), 0 - -pickUpLocation = (editor, document, location) -> - block = editor.getDocument(document).getFromTextLocation(location) - bound = editor.session.view.getViewNodeFor(block).bounds[0] - simulate('mousedown', editor.mainScrollerStuffing, { - dx: bound.x + editor.gutter.offsetWidth + 5, ->>>>>>> c_support dy: bound.y + 5 }) simulate('mousemove', editor.dragCover, { @@ -503,11 +443,7 @@ dropLocation = (editor, document, location) -> dx: blockView.dropPoint.x + 5, dy: blockView.dropPoint.y + 5 }) -<<<<<<< HEAD simulate('mouseup', editor.mainCanvas, { -======= - simulate('mouseup', editor.mainScrollerIntermediary, { ->>>>>>> c_support dx: blockView.dropPoint.x + 5 dy: blockView.dropPoint.y + 5 }) From 8de21a88e6c3e9b7749d00db483f3fb6976452eb Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Mon, 27 Jun 2016 18:22:34 -0400 Subject: [PATCH 166/268] Fix all the tests --- src/controller.coffee | 8 +++++++- test/src/uitest.coffee | 23 ++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 253b3841..201bf337 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -755,7 +755,8 @@ Editor::redrawMain = (opts = {}) -> @alreadyScheduledCleanup = true setTimeout (=> @alreadyScheduledCleanup = false - @session.view.garbageCollect() + if @session? + @session.view.garbageCollect() ), 0 return null @@ -1406,6 +1407,7 @@ Editor::wouldDelete = (position) -> # we might want to transition to a dragging the block if the user # moved their mouse far enough. hook 'mousemove', 1, (point, event, state) -> + return unless @session? if not state.capturedPickup and @clickedBlock? and point.from(@clickedPoint).magnitude() > MIN_DRAG_DISTANCE # Signify that we are now dragging a block. @@ -4351,6 +4353,8 @@ Editor::strokeCursor = (point) -> @qualifiedFocus @getCursor(), @cursorPath Editor::highlightFlashShow = -> + return unless @session? + if @flashTimeout? then clearTimeout @flashTimeout if @cursorAtSocket() @textCursorPath.activate() @@ -4360,6 +4364,8 @@ Editor::highlightFlashShow = -> @flashTimeout = setTimeout (=> @flash()), 500 Editor::highlightFlashHide = -> + return unless @session? + if @flashTimeout? then clearTimeout @flashTimeout if @cursorAtSocket() @textCursorPath.deactivate() diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee index 2100e316..449b299d 100644 --- a/test/src/uitest.coffee +++ b/test/src/uitest.coffee @@ -106,25 +106,25 @@ asyncTest 'Controller: palette block expansion', -> simulate('mousemove', '.droplet-drag-cover', { location: '[data-id=ptest]', dx: 5 }) simulate('mousemove', '.droplet-drag-cover', - { location: '.droplet-main-scroller' }) + { location: '.droplet-main-canvas' }) simulate('mouseup', '.droplet-drag-cover', - { location: '.droplet-main-scroller' }) + { location: '.droplet-main-canvas' }) equal(editor.getValue().trim(), 'pen red') simulate('mousedown', '[data-id=ftest]') simulate('mousemove', '.droplet-drag-cover', { location: '[data-id=ftest]', dx: 5 }) simulate('mousemove', '.droplet-drag-cover', - { location: '.droplet-main-scroller', dx: 40, dy: 50 }) + { location: '.droplet-main-canvas', dx: 45, dy: 50 }) simulate('mouseup', '.droplet-drag-cover', - { location: '.droplet-main-scroller', dx: 40, dy: 50 }) + { location: '.droplet-main-canvas', dx: 45, dy: 50 }) equal(editor.getValue().trim(), 'pen red\na3 = b') simulate('mousedown', '[data-id=ftest]') simulate('mousemove', '.droplet-drag-cover', { location: '[data-id=ftest]', dx: 5 }) simulate('mousemove', '.droplet-drag-cover', - { location: '.droplet-main-scroller', dx: 40, dy: 80 }) + { location: '.droplet-main-canvas', dx: 45, dy: 80 }) simulate('mouseup', '.droplet-drag-cover', - { location: '.droplet-main-scroller', dx: 40, dy: 80 }) + { location: '.droplet-main-canvas', dx: 45, dy: 80 }) equal(editor.getValue().trim(), 'pen red\na3 = b\na6 = b') start() @@ -415,16 +415,17 @@ performDragOperation = (editor, drag, cb) -> }) # Unfocus - evt = document.createEvent 'Event' - evt.initEvent 'keydown', true, true - evt.keyCode = evt.which = 13 - editor.dropletElement.dispatchEvent(evt) + if editor.cursorAtSocket() + evt = document.createEvent 'Event' + evt.initEvent 'keydown', true, true + evt.keyCode = evt.which = 13 + editor.dropletElement.dispatchEvent(evt) setTimeout cb, 0 pickUpLocation = (editor, document, location) -> block = editor.getDocument(document).getFromTextLocation(location) - bound = editor.view.getViewNodeFor(block).bounds[0] + bound = editor.session.view.getViewNodeFor(block).bounds[0] simulate('mousedown', editor.mainCanvas, { dx: bound.x + 5, dy: bound.y + 5 From 935cb7713fa79ae2bf021f4fb037cad3a0933b07 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 5 Jul 2016 08:34:38 -0400 Subject: [PATCH 167/268] Some cleanup --- src/controller.coffee | 29 +++++++---------------------- src/helper.coffee | 31 +++++++++++++++++++++++++++++++ src/model.coffee | 6 ++++++ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 5ee7b7d9..c15b1086 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -51,25 +51,6 @@ isOSX = /OS X/.test(userAgent) command_modifiers = if isOSX then META_KEYS else CONTROL_KEYS command_pressed = (e) -> if isOSX then e.metaKey else e.ctrlKey -class PairDict - constructor: (@pairs) -> - - get: (index) -> - for el, i in @pairs - if el[0] is index - return el[1] - - contains: (index) -> - @pairs.some (x) -> x[0] is index - - set: (index, value) -> - for el, i in @pairs - if el[0] is index - el[1] = index - return true - @pairs.push [index, value] - return false - # FOUNDATION # ================================ @@ -298,12 +279,12 @@ exports.Editor = class Editor if @options? @session = new Session @options, @standardViewSettings - @sessions = new PairDict([ + @sessions = new helper.PairDict([ [@aceEditor.getSession(), @session] ]) else @session = null - @sessions = new PairDict [] + @sessions = new helper.PairDict [] @options = { extraBottomHeight: 10 @@ -2413,6 +2394,8 @@ Editor::reparse = (list, recovery, updates = [], originalTrigger = list) -> originalUpdates = updates.map (location) -> count: location.count, type: location.type + # If our language mode has a string-fixing feature (in most languages, + # this will simply autoescape quoted "strings"), apply it if @session.mode.stringFixer? @populateSocket list, @session.mode.stringFixer list.textContent() @@ -3412,7 +3395,9 @@ Editor::checkAndHighlightEmptySockets = -> Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) -> if @session.currentlyUsingBlocks and not @currentlyAnimating - # Forbid melting if there is an empty socket. If there is, + # If the preserveEmpty option is turned off, we will not round-trip empty sockets. + # + # Therefore, forbid melting if there is an empty socket. If there is, # highlight it in red. if not @session.options.preserveEmpty and not @checkAndHighlightEmptySockets() @redrawMain() diff --git a/src/helper.coffee b/src/helper.coffee index 55f35052..3c03c986 100644 --- a/src/helper.coffee +++ b/src/helper.coffee @@ -184,6 +184,12 @@ exports.deepEquals = deepEquals = (a, b) -> else return a is b +_guid = 0 +exports.generateGUID = -> (_guid++).toString(16) + +# General quoted-string-fixing functionality, for use in various +# language modes' stringFixer functions. + # To fix quoting errors, we first do a lenient C-unescape, then # we do a string C-escaping, to add backlsashes where needed, but # not where we already have good ones. @@ -218,3 +224,28 @@ exports.quoteAndCEscape = quoteAndCEscape = (str, quotechar) -> replace(/((?:^|[^\\])(?:\\\\)*)\\"/g, '$1"'). replace(/'/g, "\\'") + quotechar return result + +# A naive dictionary mapping arbitrary objects to arbitrary objects, for use in +# ace-to-droplet session matching. +# +# May replace with something more sophisticated if performance becomes an issue, +# but we don't envision any use cases where sessions flip really fast, so this is unexpected. +exports.PairDict = class PairDict + constructor: (@pairs) -> + + get: (index) -> + for el, i in @pairs + if el[0] is index + return el[1] + + contains: (index) -> + @pairs.some (x) -> x[0] is index + + set: (index, value) -> + for el, i in @pairs + if el[0] is index + el[1] = index + return true + @pairs.push [index, value] + return false + diff --git a/src/model.coffee b/src/model.coffee index f5c11887..ad6b9453 100644 --- a/src/model.coffee +++ b/src/model.coffee @@ -1022,9 +1022,13 @@ exports.SocketEndToken = class SocketEndToken extends EndToken constructor: (@container) -> super; @type = 'socketEnd' stringify: (opts = DEFAULT_STRINGIFY_OPTS) -> + # If preserveEmpty is turned on, substitute our placeholder string + # for an empty socket if opts.preserveEmpty and @prev is @container.start or @prev.type is 'text' and @prev.value is '' return @container.emptyString + + # Otherwise, do nothing, and allow the socket to stringify to '' else '' exports.Socket = class Socket extends Container @@ -1074,6 +1078,8 @@ exports.IndentStartToken = class IndentStartToken extends StartToken exports.IndentEndToken = class IndentEndToken extends EndToken constructor: (@container) -> super; @type = 'indentEnd' stringify: (opts = DEFAULT_STRINGIFY_OPTS) -> + # As with sockets, substitute a placeholder string if preserveEmpty + # is turned on. if opts.preserveEmpty and @prev.prev is @container.start return @container.emptyString else '' From fc7e80dffa34aad4a915a2cbd4c77fa2c052ec29 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 5 Jul 2016 09:08:34 -0400 Subject: [PATCH 168/268] Fix dropdowns --- src/controller.coffee | 22 ++++++++++++++++------ test/src/tests.coffee | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 201bf337..7e6c964d 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2677,9 +2677,9 @@ Editor::getDropdownList = (socket) -> result = socket.dropdown if result.options result = result.options - newresult = {} + newresult = [] for key, val of result - newresult = if 'string' is typeof val then { text: val, display: val } else val + newresult.push if 'string' is typeof val then { text: val, display: val } else val return newresult Editor::showDropdown = (socket = @getCursor(), inPalette = false) -> @@ -2745,12 +2745,22 @@ Editor::showDropdown = (socket = @getCursor(), inPalette = false) -> if inPalette location = @session.paletteView.getViewNodeFor(socket).bounds[0] - @dropdownElement.style.left = location.x - @session.viewports.palette.x + @paletteCanvas.offsetLeft + 'px' + @dropdownElement.style.left = location.x - @session.viewports.palette.x + @paletteCanvas.clientLeft + 'px' @dropdownElement.style.minWidth = location.width + 'px' - @dropdownElement.style.top = location.y + @session.fontSize - @session.viewports.main.y + 'px' - @dropdownElement.style.left = location.x - @session.viewports.main.x + @dropletElement.offsetLeft + @mainCanvas.offsetLeft + 'px' - @dropdownElement.style.minWidth = location.width + 'px' + dropdownTop = location.y + @session.fontSize - @session.viewports.palette.y + @paletteCanvas.clientTop + if dropdownTop + @dropdownElement.clientHeight > @paletteElement.clientHeight + dropdownTop -= (@session.fontSize + @dropdownElement.clientHeight) + @dropdownElement.style.top = dropdownTop + 'px' + else + location = @session.view.getViewNodeFor(socket).bounds[0] + @dropdownElement.style.left = location.x - @session.viewports.main.x + @dropletElement.offsetLeft + @gutter.clientWidth + 'px' + @dropdownElement.style.minWidth = location.width + 'px' + + dropdownTop = location.y + @session.fontSize - @session.viewports.main.y + if dropdownTop + @dropdownElement.clientHeight > @dropletElement.clientHeight + dropdownTop -= (@session.fontSize + @dropdownElement.clientHeight) + @dropdownElement.style.top = dropdownTop + 'px' ), 0 Editor::hideDropdown = -> diff --git a/test/src/tests.coffee b/test/src/tests.coffee index a4c41e5b..3acff673 100644 --- a/test/src/tests.coffee +++ b/test/src/tests.coffee @@ -694,7 +694,7 @@ asyncTest 'Controller: arbitrary row/column marking', -> prompt 10 / 10 ''' - equal editor.tree.getFromTextLocation({row: 2, col: 9, type: 'block'}).stringify(), '10 - 10', 'Selected the right block' + equal editor.session.tree.getFromTextLocation({row: 2, col: 9, type: 'block'}).stringify(), '10 - 10', 'Selected the right block' before = $('[stroke=#F00]').length From 31e497acf32549ff1950393a5eede03108213eea Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Tue, 5 Jul 2016 11:31:26 -0400 Subject: [PATCH 169/268] Actually fix all the tests. --- src/controller.coffee | 5 +- src/languages/c.coffee | 1 + test/src/uitest.coffee | 104 +++++++++++++++++++++++------------------ test/uitest.html | 1 + 4 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/controller.coffee b/src/controller.coffee index 7e6c964d..0029b4db 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -3209,7 +3209,7 @@ hook 'keydown', 0, (event, state) -> if event.which is ENTER_KEY if not @cursorAtSocket() and not event.shiftKey and not event.ctrlKey and not event.metaKey # Construct the block; flag the socket as handwritten - newBlock = new model.Block(); newSocket = new model.Socket @session.mode.empty, Infinity, true + newBlock = new model.Block(); newSocket = new model.Socket '', Infinity, true newSocket.setParent newBlock helper.connect newBlock.start, newSocket.start helper.connect newSocket.end, newBlock.end @@ -3537,7 +3537,7 @@ Editor::performMeltAnimation = (fadeTime = 500, translateTime = 1000, cb = ->) - # Translate the ACE editor div into frame. @aceElement.style.top = '0px' - if @showPaletteInTextMode and @session.paletteEnabled + if @session.showPaletteInTextMode and @session.paletteEnabled @aceElement.style.left = "#{@paletteWrapper.clientWidth}px" else @aceElement.style.left = '0px' @@ -3577,7 +3577,6 @@ Editor::performFreezeAnimation = (fadeTime = 500, translateTime = 500, cb = ->)- beforeTime = +(new Date()) setValueResult = @copyAceEditor() afterTime = +(new Date()) - console.log 'elapsed:', afterTime - beforeTime unless setValueResult.success if setValueResult.error diff --git a/src/languages/c.coffee b/src/languages/c.coffee index 4ad18201..036cd567 100644 --- a/src/languages/c.coffee +++ b/src/languages/c.coffee @@ -242,6 +242,7 @@ config.stringFixer = (string) -> return string config.empty = '__0_droplet__' +config.emptyIndent = '' # TODO Implement removing parentheses at some point #config.unParenWrap = (leading, trailing, node, context) -> diff --git a/test/src/uitest.coffee b/test/src/uitest.coffee index 449b299d..70066f0f 100644 --- a/test/src/uitest.coffee +++ b/test/src/uitest.coffee @@ -51,6 +51,9 @@ function simulate(type, target, options) { which: options.which || 1, relatedTarget: options.relatedTarget || null, } + //console.log(location.className); + //console.log(JSON.stringify(location.getBoundingClientRect())); + //console.log(JSON.stringify(opts, function(key, val) { if (key == '' || key == 'pageX' || key == 'pageY' || key == 'clientX' || key == 'clientY' || key == 'screenX' || key == 'screenY') return val; })); var evt try { // Modern API supported by IE9+ @@ -81,6 +84,34 @@ function sequence(delay) { } ` +pickUpLocation = (editor, document, location) -> + block = editor.getDocument(document).getFromTextLocation(location) + bound = editor.session.view.getViewNodeFor(block).bounds[0] + simulate('mousedown', editor.mainCanvas, { + location: editor.dropletElement, + dx: bound.x + 5 + editor.gutter.clientWidth, + dy: bound.y + 5 + }) + simulate('mousemove', editor.dragCover, { + location: editor.dropletElement, + dx: bound.x + 10 + editor.gutter.clientWidth, + dy: bound.y + 10 + }) + +dropLocation = (editor, document, location) -> + block = editor.getDocument(document).getFromTextLocation(location) + blockView = editor.session.view.getViewNodeFor block + simulate('mousemove', editor.dragCover, { + location: editor.dropletElement, + dx: blockView.dropPoint.x + 5 + editor.gutter.clientWidth, + dy: blockView.dropPoint.y + 5 + }) + simulate('mouseup', editor.mainCanvas, { + location: editor.dropletElement, + dx: blockView.dropPoint.x + 5 + editor.gutter.clientWidth, + dy: blockView.dropPoint.y + 5 + }) + asyncTest 'Controller: palette block expansion', -> states = [] document.getElementById('test-main').innerHTML = '' @@ -102,29 +133,30 @@ asyncTest 'Controller: palette block expansion', -> ], }] }) + simulate('mousedown', '[data-id=ptest]') simulate('mousemove', '.droplet-drag-cover', { location: '[data-id=ptest]', dx: 5 }) simulate('mousemove', '.droplet-drag-cover', - { location: '.droplet-main-canvas' }) + { location: '.droplet-wrapper-div' }) simulate('mouseup', '.droplet-drag-cover', - { location: '.droplet-main-canvas' }) + { location: '.droplet-wrapper-div' }) equal(editor.getValue().trim(), 'pen red') simulate('mousedown', '[data-id=ftest]') simulate('mousemove', '.droplet-drag-cover', { location: '[data-id=ftest]', dx: 5 }) simulate('mousemove', '.droplet-drag-cover', - { location: '.droplet-main-canvas', dx: 45, dy: 50 }) + { location: '.droplet-wrapper-div', dx: 45 + 43, dy: 40 }) simulate('mouseup', '.droplet-drag-cover', - { location: '.droplet-main-canvas', dx: 45, dy: 50 }) + { location: '.droplet-wrapper-div', dx: 45 + 43, dy: 40 }) equal(editor.getValue().trim(), 'pen red\na3 = b') simulate('mousedown', '[data-id=ftest]') simulate('mousemove', '.droplet-drag-cover', { location: '[data-id=ftest]', dx: 5 }) simulate('mousemove', '.droplet-drag-cover', - { location: '.droplet-main-canvas', dx: 45, dy: 80 }) + { location: '.droplet-wrapper-div', dx: 45 + 43, dy: 70 }) simulate('mouseup', '.droplet-drag-cover', - { location: '.droplet-main-canvas', dx: 45, dy: 80 }) + { location: '.droplet-wrapper-div', dx: 45 + 43, dy: 70 }) equal(editor.getValue().trim(), 'pen red\na3 = b\na6 = b') start() @@ -375,11 +407,13 @@ getRandomTextOp = (editor, rng) -> performTextOperation = (editor, text, cb) -> simulate('mousedown', editor.mainCanvas, { - dx: text.socket.handle.x, + location: editor.dropletElement + dx: text.socket.handle.x + editor.gutter.clientWidth, dy: text.socket.handle.y }) simulate('mouseup', editor.mainCanvas, { - dx: text.socket.handle.x, + location: editor.dropletElement, + dx: text.socket.handle.x + editor.gutter.clientWidth, dy: text.socket.handle.y }) setTimeout (-> @@ -396,21 +430,23 @@ performTextOperation = (editor, text, cb) -> performDragOperation = (editor, drag, cb) -> simulate('mousedown', editor.mainCanvas, { - dx: drag.drag.handle.x, + location: editor.dropletElement, + dx: drag.drag.handle.x + editor.gutter.clientWidth, dy: drag.drag.handle.y }) simulate('mousemove', editor.dragCover, { - location: editor.mainCanvas - dx: drag.drag.handle.x + 5, + location: editor.dropletElement, + dx: drag.drag.handle.x + 5 + editor.gutter.clientWidth, dy: drag.drag.handle.y + 5 }) simulate('mousemove', editor.dragCover, { - location: editor.mainCanvas - dx: drag.drop.point.x + 5 + location: editor.dropletElement, + dx: drag.drop.point.x + 5 + editor.gutter.clientWidth dy: drag.drop.point.y + 5 }) simulate('mouseup', editor.mainCanvas, { - dx: drag.drop.point.x + 5 + location: editor.dropletElement, + dx: drag.drop.point.x + 5 + editor.gutter.clientWidth dy: drag.drop.point.y + 5 }) @@ -423,32 +459,6 @@ performDragOperation = (editor, drag, cb) -> setTimeout cb, 0 -pickUpLocation = (editor, document, location) -> - block = editor.getDocument(document).getFromTextLocation(location) - bound = editor.session.view.getViewNodeFor(block).bounds[0] - simulate('mousedown', editor.mainCanvas, { - dx: bound.x + 5, - dy: bound.y + 5 - }) - simulate('mousemove', editor.dragCover, { - location: editor.mainCanvas - dx: bound.x + 10, - dy: bound.y + 10 - }) - -dropLocation = (editor, document, location) -> - block = editor.getDocument(document).getFromTextLocation(location) - blockView = editor.session.view.getViewNodeFor block - simulate('mousemove', editor.dragCover, { - location: editor.mainCanvas - dx: blockView.dropPoint.x + 5, - dy: blockView.dropPoint.y + 5 - }) - simulate('mouseup', editor.mainCanvas, { - dx: blockView.dropPoint.x + 5 - dy: blockView.dropPoint.y + 5 - }) - executeAsyncSequence = (sequence, i = 0) -> if i < sequence.length sequence[i]() @@ -614,11 +624,13 @@ asyncTest 'Controller: Quoted string selection', -> {x, y} = editor.session.view.getViewNodeFor(entity).bounds[0] simulate('mousedown', editor.mainCanvas, { - dx: x + 5 + location: editor.dropletElement + dx: x + 5 + editor.gutter.clientWidth dy: y + 5 }) simulate('mouseup', editor.mainCanvas, { - dx: x + 5 + location: editor.dropletElement + dx: x + 5 + editor.gutter.clientWidth dy: y + 5 }) @@ -666,11 +678,13 @@ asyncTest 'Controller: Quoted string CoffeeScript autoescape', -> executeAsyncSequence [ (-> simulate('mousedown', editor.mainCanvas, { - dx: x + 5 + location: editor.dropletElement + dx: x + 5 + editor.gutter.clientWidth dy: y + 5 }) simulate('mouseup', editor.mainCanvas, { - dx: x + 5 + location: editor.dropletElement + dx: x + 5 + editor.gutter.clientWidth dy: y + 5 }) ), (-> @@ -1004,4 +1018,4 @@ asyncTest 'Controller: ANTLR random drag reparse test', -> op = getRandomTextOp(editor, rng) performTextOperation editor, op, cb - tick 100 + tick 50 diff --git a/test/uitest.html b/test/uitest.html index c61f5ea6..d1e020c7 100644 --- a/test/uitest.html +++ b/test/uitest.html @@ -4,6 +4,7 @@ + +
+
+
+ +
+
+
+
+
+ + + + + diff --git a/test/src/pytest.coffee b/test/src/pytest.coffee new file mode 100644 index 00000000..b3340430 --- /dev/null +++ b/test/src/pytest.coffee @@ -0,0 +1,92 @@ +helper = require '../../src/helper.coffee' +Python = require '../../src/languages/python.coffee' + +asyncTest 'Python basic parsing', -> + customPy = new Python({ + functions: { + 'print': { + value: true + } + } + }) + + customSerialization = customPy.parse( + ''' + print 'hello' + ''' + ).serialize() + + expectedSerialization = ''' + print 'hello'''' + + strictEqual( + helper.xmlPrettyPrint(customSerialization), + helper.xmlPrettyPrint(expectedSerialization), + 'Dotted known functions work' + ) + + start() + +asyncTest 'Py indent', -> + customPy = new Python({ + functions: {} + }) + code = 'for i in range(0, 10):\n continue' + customSerialization = customPy.parse('for i in range(0, 10):\n continue') + stringifiedPy = customSerialization.stringify() + strictEqual(code, stringifiedPy) + start() + +asyncTest 'Py for loop', -> + customPy = new Python({ + functions: {} + }) + + customSerialization = customPy.parse('for i in range(0, 10):\n continue').serialize() + + expectedSerialization = '''for i in range(0, 10): +continue''' + + strictEqual( + helper.xmlPrettyPrint(customSerialization), + helper.xmlPrettyPrint(expectedSerialization) + ) + start() + + From 7a1425652ab2af678513280aed8361a81b6c41a2 Mon Sep 17 00:00:00 2001 From: David Anthony Bau Date: Thu, 21 Jul 2016 10:26:06 -0400 Subject: [PATCH 263/268] Allow type changing during block reparsing --- src/controller.coffee | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/controller.coffee b/src/controller.coffee index 204a2dcc..1eec2368 100644 --- a/src/controller.coffee +++ b/src/controller.coffee @@ -2590,10 +2590,16 @@ Editor::populateSocket = (socket, string) -> @spliceIn new model.List(first, last), socket.start Editor::populateBlock = (block, string) -> + if block.type is 'block' + context = block.parent.indentContext ? block.parent.parseContext ? block.parseContext + else + context = block.parseContext + newBlock = @session.mode.parse(string, { - context: block.parseContext + context: context wrapAtRoot: false }).start.next.container + if newBlock # Find the first token before the block # that will still be around after the From 012eeeeb51914994cbc66ace44400775bbc5ed0e Mon Sep 17 00:00:00 2001 From: Takahiko Tsuchiya Date: Mon, 25 Jul 2016 14:37:59 -0400 Subject: [PATCH 264/268] typo fixed --- src/languages/python.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/python.coffee b/src/languages/python.coffee index f7cb7e2c..b861b512 100644 --- a/src/languages/python.coffee +++ b/src/languages/python.coffee @@ -83,7 +83,7 @@ insertButton = (opts, node) -> else return null -handelButton = (text, button, oldBlocks) -> +handleButton = (text, button, oldBlocks) -> checkElif = (node) -> res = 'init' if node.type is 'if_stmt' @@ -165,7 +165,7 @@ config = { DROPDOWN_CALLBACK: getDropdown COLOR_CALLBACK: getColor BUTTON_CALLBACK: insertButton - HANDLE_BUTTON_CALLBACK: handelButton + HANDLE_BUTTON_CALLBACK: handleButton COLOR_RULES: [ ['term', 'value'], From 8db958a4f2af4792c450830997c244d23e4e8a37 Mon Sep 17 00:00:00 2001 From: Takahiko Tsuchiya Date: Mon, 25 Jul 2016 15:01:22 -0400 Subject: [PATCH 265/268] tweaks to the treewalker (fixes the C mode unit tests) --- src/treewalk.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 5b891f32..35dca3fe 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -118,7 +118,7 @@ exports.createTreewalkParser = (parse, config, root) -> color: @getColor node, rules classes: padRules(wrapRules ? rules).concat(@getShape(node, rules)) parseContext: rules[0] #(if wrap? then wrap.type else rules[0]) - buttons: config.BUTTON_CALLBACK(@opts, node) ? null + buttons: if config.BUTTON_CALLBACK then config.BUTTON_CALLBACK(@opts, node) ? null else null when 'parens' # Parens are assumed to wrap the only child that has children @@ -183,8 +183,8 @@ exports.createTreewalkParser = (parse, config, root) -> else unless i is 0 end = child.bounds.start - # @lines[end.line] was breaking in python mode (index out of range) - if @lines[end.line-1][...end.column].trim().length is 0 + # For C mode, etc., end.line may be +1 longer than Python mode, etc., including the ending bracket + if end.line < @lines.length and @lines[end.line][...end.column].trim().length is 0 end.line -= 1 end.column = @lines[end.line].length From f3941bd29857030ced45be4ad4738cab8154c954 Mon Sep 17 00:00:00 2001 From: Takahiko Tsuchiya Date: Sun, 7 Aug 2016 22:36:37 -0400 Subject: [PATCH 266/268] adapting python mode to the container-buttons branch --- src/languages/python.coffee | 108 +++++++++++++++++++++--------------- src/treewalk.coffee | 3 +- 2 files changed, 64 insertions(+), 47 deletions(-) diff --git a/src/languages/python.coffee b/src/languages/python.coffee index b861b512..7b8063f2 100644 --- a/src/languages/python.coffee +++ b/src/languages/python.coffee @@ -17,6 +17,14 @@ PYTHON_BUILTIN = ['type', 'object', 'hashCount', 'none', 'NotImplemented', 'pyCh PYTHON_KEYWORDS = PYTHON_KEYWORDS.concat(PYTHON_BUILTIN) PYTHON_KEYWORDS = PYTHON_KEYWORDS.filter((v, i) -> return PYTHON_KEYWORDS.indexOf(v) == i) # remove possible duplicates +ADD_BUTTON_VERT = [ + { + key: 'add-button' + glyph: '\u25BC' + border: false + } +] + # PARSER SECTION parse = (context, text) -> result = transform skulpt.parser.parse('file.py', text, context), text.split('\n') @@ -50,7 +58,7 @@ getFunctionName = (node) -> siblingNode = node.children[0].children?[0] if siblingNode?.type in ['T_KEYWORD', 'T_NAME'] - return siblingNode.meta.value + return siblingNode.data.text if node.parent? then getFunctionName(node.parent) @@ -83,28 +91,6 @@ insertButton = (opts, node) -> else return null -handleButton = (text, button, oldBlocks) -> - checkElif = (node) -> - res = 'init' - if node.type is 'if_stmt' - node.children?.forEach((c) -> if c.type is 'T_KEYWORD' then res = c.meta.value) - else - node.children?.forEach((c) -> res = checkElif(c)) - return res - - if button is 'add-button' and 'if_stmt' in oldBlocks.classes - node = parse({}, text).children[0] - elif = checkElif(node) - - if elif is 'if' or elif is 'elif' - text += '''\nelse:\n print \'hi\'''' - else if elif is 'else' - text = text.replace('else:', 'elif a == b:') - text += '''\nelse:\n print \'hi\'''' - - return text - - transform = (node, lines, parent = null) -> type = skulpt.tables.ParseTables.number2symbol[node.type] ? skulpt.Tokenizer.tokenNames[node.type] ? node.type @@ -116,8 +102,8 @@ transform = (node, lines, parent = null) -> type: type bounds: getBounds(node, lines) parent: parent - meta: { - value: node.value ? null + data: { + text: node.value ? null } # language-specific meta-data } @@ -156,7 +142,12 @@ config = { # Sockets 'T_NAME': 'socket', 'T_NUMBER': 'socket', - 'T_STRING': 'socket' + 'T_STRING': 'socket', + + 'if_stmt': (node) -> + if node.children[0].data.text is 'if' + return {type: 'block', buttons: ADD_BUTTON_VERT} + return 'block' } PAREN_RULES: {} @@ -165,30 +156,55 @@ config = { DROPDOWN_CALLBACK: getDropdown COLOR_CALLBACK: getColor BUTTON_CALLBACK: insertButton - HANDLE_BUTTON_CALLBACK: handleButton - - COLOR_RULES: [ - ['term', 'value'], - ['funcdef', 'control'], - ['for_stmt', 'control'], - ['while_stmt', 'control'], - ['with_stmt', 'control'], - ['if_stmt', 'control'], - ['try_stmt', 'control'], - ['import_stmt', 'command'], - ['print_stmt', 'command'], - ['expr_stmt', 'command'], - ['return_stmt', 'return'], - ['testlist', 'value'], - ['comparison', 'value'], - ['test', 'value'], - ['expr', 'value'] - ] + + COLOR_RULES: { + 'term': 'value', + 'funcdef': 'control', + 'for_stmt': 'control', + 'while_stmt': 'control', + 'with_stmt': 'control', + 'if_stmt': 'control', + 'try_stmt': 'control', + 'import_stmt': 'command', + 'print_stmt': 'command', + 'expr_stmt': 'command', + 'return_stmt': 'return', + 'testlist': 'value', + 'comparison': 'value', + 'test': 'value', + 'expr': 'value' + } + SHAPE_RULES: [] } config.SHOULD_SOCKET = (opts, node) -> - return node.meta.value not in Object.keys(opts.functions) or getArgNum(node) isnt null + return node.data.text not in Object.keys(opts.functions) or getArgNum(node) isnt null + +checkElif = (node) -> + res = 'init' + if node.type is 'if_stmt' + node.children?.forEach((c) -> if c.type is 'T_KEYWORD' then res = c.data.text) + else + node.children?.forEach((c) -> res = checkElif(c)) + return res + +config.handleButton = (str, type, block) -> + blockType = block.nodeContext?.type ? block.parseContext + + if type is 'add-button' + if blockType is 'if_stmt' + node = parse({}, str).children[0] + elif = checkElif(node) + + if elif is 'if' or elif is 'elif' + str += '''\nelse:\n print \'hi\'''' + else if elif is 'else' + str = str.replace('else:', 'elif a == b:') + str += '''\nelse:\n print \'hi\'''' + return str + else + return str result = treewalk.createTreewalkParser parse, config result.canParse = (node) -> diff --git a/src/treewalk.coffee b/src/treewalk.coffee index 396c1c70..ce1696ca 100644 --- a/src/treewalk.coffee +++ b/src/treewalk.coffee @@ -70,6 +70,7 @@ exports.createTreewalkParser = (parse, config, root) -> getColor: (node) -> color = config.COLOR_CALLBACK?(@opts, node) + if color? return color @@ -263,7 +264,7 @@ exports.createTreewalkParser = (parse, config, root) -> bounds: node.bounds depth: depth parseContext: rules[0] - dropdown: config.DROPDOWN_CALLBACK?(@opts, node) ? null + dropdown: config.DROPDOWN_CALLBACK?(@opts, node) ? null if config.EMPTY_STRINGS? and not @opts.preserveEmpty and helper.clipLines(@lines, node.bounds.start, node.bounds.end) is config.empty @flagToRemove node.bounds, depth + 1 From e0d08ffb12170d5085b94f936842d1a392389493 Mon Sep 17 00:00:00 2001 From: Takahiko Tsuchiya Date: Wed, 17 Aug 2016 19:23:51 -0400 Subject: [PATCH 267/268] python mode: tests fixed, subtract button, pass stmt not working yet --- src/languages/python.coffee | 49 +++++++++++++++---- test/src/pytest.coffee | 97 +++++++++++++++---------------------- 2 files changed, 77 insertions(+), 69 deletions(-) diff --git a/src/languages/python.coffee b/src/languages/python.coffee index 7b8063f2..5ac93cfa 100644 --- a/src/languages/python.coffee +++ b/src/languages/python.coffee @@ -25,6 +25,19 @@ ADD_BUTTON_VERT = [ } ] +BOTH_BUTTON_VERT = [ + { + key: 'subtract-button' + glyph: '\u25B2' + border: false + } + { + key: 'add-button' + glyph: '\u25BC' + border: false + } +] + # PARSER SECTION parse = (context, text) -> result = transform skulpt.parser.parse('file.py', text, context), text.split('\n') @@ -146,7 +159,7 @@ config = { 'if_stmt': (node) -> if node.children[0].data.text is 'if' - return {type: 'block', buttons: ADD_BUTTON_VERT} + return {type: 'block', buttons: BOTH_BUTTON_VERT} return 'block' } @@ -168,6 +181,7 @@ config = { 'import_stmt': 'command', 'print_stmt': 'command', 'expr_stmt': 'command', + 'pass_stmt': 'command', 'return_stmt': 'return', 'testlist': 'value', 'comparison': 'value', @@ -175,7 +189,13 @@ config = { 'expr': 'value' } - SHAPE_RULES: [] + SHAPE_RULES: [], + +# empty: '__0_droplet__', +# EMPTY_STRINGS: ['pass_stmt'] # put "pass" equivalent token here + EMPTY_STRINGS: { + 'stmt': 'pass' + } } config.SHOULD_SOCKET = (opts, node) -> @@ -191,20 +211,29 @@ checkElif = (node) -> config.handleButton = (str, type, block) -> blockType = block.nodeContext?.type ? block.parseContext + if blockType is 'if_stmt' + node = parse({}, str).children[0] + elif = checkElif(node) - if type is 'add-button' - if blockType is 'if_stmt' - node = parse({}, str).children[0] - elif = checkElif(node) + console.log node + if type is 'add-button' if elif is 'if' or elif is 'elif' - str += '''\nelse:\n print \'hi\'''' + str += '''\nelse:\n pass''' else if elif is 'else' str = str.replace('else:', 'elif a == b:') - str += '''\nelse:\n print \'hi\'''' + str += '''\nelse:\n pass''' return str - else - return str + else if type is 'subtract-button' + if elif is 'if' or elif is 'elif' + str = str.substr(0, str.lastIndexOf('\nelif ')) + else if elif is 'else' + str = str.substr(0, str.indexOf('\nelse:')) + return str + else + return str + + return str result = treewalk.createTreewalkParser parse, config result.canParse = (node) -> diff --git a/test/src/pytest.coffee b/test/src/pytest.coffee index b3340430..0be139bb 100644 --- a/test/src/pytest.coffee +++ b/test/src/pytest.coffee @@ -2,7 +2,7 @@ helper = require '../../src/helper.coffee' Python = require '../../src/languages/python.coffee' asyncTest 'Python basic parsing', -> - customPy = new Python({ + py = new Python({ functions: { 'print': { value: true @@ -10,83 +10,62 @@ asyncTest 'Python basic parsing', -> } }) - customSerialization = customPy.parse( + serialRes = py.parse( ''' print 'hello' ''' ).serialize() - expectedSerialization = ''' - print 'hello'''' - - strictEqual( - helper.xmlPrettyPrint(customSerialization), - helper.xmlPrettyPrint(expectedSerialization), - 'Dotted known functions work' - ) + # why is "indentContext":undefined required here? + serialComp = [{"type":"documentStart","indentContext":undefined, + }, + {"type":"blockStart","color":"command","shape":0,"parseContext":"print_stmt","nodeContext":{"type":"print_stmt","prefix":"print ","suffix":""}}, + "print ", + {"type":"socketStart","emptyString":"__0_droplet__","parseContext":"test","handwritten":false,"dropdown":false},"'hello'",{"type":"socketEnd"}, + {"type":"blockEnd"}, + {"type":"documentEnd"}] + deepEqual serialRes, serialComp, 'Basic parsing should work' start() asyncTest 'Py indent', -> - customPy = new Python({ + py = new Python({ functions: {} }) code = 'for i in range(0, 10):\n continue' - customSerialization = customPy.parse('for i in range(0, 10):\n continue') - stringifiedPy = customSerialization.stringify() - strictEqual(code, stringifiedPy) + result = py.parse(code) + stringifiedRes = result.stringify() + strictEqual(code, stringifiedRes) start() asyncTest 'Py for loop', -> - customPy = new Python({ + py = new Python({ functions: {} }) - customSerialization = customPy.parse('for i in range(0, 10):\n continue').serialize() - - expectedSerialization = '''for i in range(0, 10): -continue''' + serialRes = py.parse('for i in range(0, 10):\n continue').serialize() + serialComp = [{"type":"documentStart","indentContext":undefined}, + {"type":"blockStart","color":"control","shape":0,"parseContext":"for_stmt","nodeContext":{"type":"for_stmt","prefix":"for ","suffix":""}}, + "for ", + {"type":"socketStart","emptyString":"__0_droplet__","parseContext":"exprlist","handwritten":false,"dropdown":false},"i",{"type":"socketEnd"}, + " in ", + {"type":"socketStart","emptyString":"__0_droplet__","parseContext":"testlist","handwritten":false,"dropdown":false}, + {"type":"blockStart","color":"comment","shape":0,"parseContext":"power","nodeContext":{"type":"power","prefix":"range(","suffix":")"}}, + "range(", + {"type":"socketStart","emptyString":"__0_droplet__","parseContext":"argument","handwritten":false,"dropdown":false},"0",{"type":"socketEnd"}, + ", ", + {"type":"socketStart","emptyString":"__0_droplet__","parseContext":"argument","handwritten":false,"dropdown":false},"10",{"type":"socketEnd"} + ,")", + {"type":"blockEnd"}, + {"type":"socketEnd"},":", + {"type":"indentStart","prefix":" ","indentContext":"small_stmt"},{"type":"newline","specialIndent":undefined, # ??? + }, + {"type":"blockStart","color":0,"shape":1,"parseContext":0,"nodeContext":{"type":"__comment__","prefix":"","suffix":""}}, + {"type":"socketStart","emptyString":"","parseContext":null,"handwritten":true,"dropdown":false},"continue",{"type":"socketEnd"},{"type":"blockEnd"},{"type":"indentEnd"}, + {"type":"blockEnd"}, + {"type":"documentEnd"}] - strictEqual( - helper.xmlPrettyPrint(customSerialization), - helper.xmlPrettyPrint(expectedSerialization) - ) + deepEqual serialRes, serialComp, 'For loop block and indent should work' start() From ce34e2d05580b729c0420153013681f7ba504f68 Mon Sep 17 00:00:00 2001 From: Takahiko Tsuchiya Date: Wed, 17 Aug 2016 19:29:30 -0400 Subject: [PATCH 268/268] dropdown menu arrow icon color fixed --- css/droplet.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/css/droplet.css b/css/droplet.css index 3433f0a4..211c97e2 100644 --- a/css/droplet.css +++ b/css/droplet.css @@ -372,11 +372,15 @@ text { cursor: -moz-grab; cursor: grab; } -.droplet-dropdown-arrow, .droplet-button-path { +.droplet-button-path { fill: #FFF; opacity: 0; cursor: pointer; } +.droplet-dropdown-arrow { + /*fill: #FFF;*/ + cursor: pointer; +} .droplet-button-path:hover { fill: #FFF; opacity: 0.5;