GeoKnow/Jassa-Core

View on GitHub
staging/sparql-parser.js

Summary

Maintainability
F
1 mo
Test Coverage
define([],function(){
 return (function() {
  /*
   * Generated by PEG.js 0.8.0.
   *
   * http://pegjs.majda.cz/
   */

  function peg$subclass(child, parent) {
    function ctor() { this.constructor = child; }
    ctor.prototype = parent.prototype;
    child.prototype = new ctor();
  }

  function SyntaxError(message, expected, found, offset, line, column) {
    this.message  = message;
    this.expected = expected;
    this.found    = found;
    this.offset   = offset;
    this.line     = line;
    this.column   = column;

    this.name     = "SyntaxError";
  }

  peg$subclass(SyntaxError, Error);

  function parse(input) {
    var options = arguments.length > 1 ? arguments[1] : {},

        peg$FAILED = {},

        peg$startRuleIndices = { DOCUMENT: 0 },
        peg$startRuleIndex   = 0,

        peg$consts = [
          { type: "other", description: "[1] QueryUnit" },
          { type: "other", description: "[2] Query" },
          peg$FAILED,
          function(p, q) {
                return {token: 'query',
                        kind: 'query',
                        prologue: p,
                        units: [q]};
          },
          { type: "other", description: "[3] Prologue" },
          null,
          [],
          function(b, pfx) {
                return { token: 'prologue',
                         base: b,
                         prefixes: pfx }
          },
          { type: "other", description: "[4] BaseDecl" },
          "B",
          { type: "literal", value: "B", description: "\"B\"" },
          "b",
          { type: "literal", value: "b", description: "\"b\"" },
          "A",
          { type: "literal", value: "A", description: "\"A\"" },
          "a",
          { type: "literal", value: "a", description: "\"a\"" },
          "S",
          { type: "literal", value: "S", description: "\"S\"" },
          "s",
          { type: "literal", value: "s", description: "\"s\"" },
          "E",
          { type: "literal", value: "E", description: "\"E\"" },
          "e",
          { type: "literal", value: "e", description: "\"e\"" },
          function(i) {
                registerDefaultPrefix(i);

                base = {};
                base.token = 'base';
                base.value = i;

                return base;
          },
          { type: "other", description: "[5] PrefixDecl" },
          "P",
          { type: "literal", value: "P", description: "\"P\"" },
          "p",
          { type: "literal", value: "p", description: "\"p\"" },
          "R",
          { type: "literal", value: "R", description: "\"R\"" },
          "r",
          { type: "literal", value: "r", description: "\"r\"" },
          "F",
          { type: "literal", value: "F", description: "\"F\"" },
          "f",
          { type: "literal", value: "f", description: "\"f\"" },
          "I",
          { type: "literal", value: "I", description: "\"I\"" },
          "i",
          { type: "literal", value: "i", description: "\"i\"" },
          "X",
          { type: "literal", value: "X", description: "\"X\"" },
          "x",
          { type: "literal", value: "x", description: "\"x\"" },
          function(p, l) {

                registerPrefix(p,l);

                prefix = {};
                prefix.token = 'prefix';
                prefix.prefix = p;
                prefix.local = l;

                return prefix;
          },
          function(sts) {
                  return sts;
              },
          ".",
          { type: "literal", value: ".", description: "\".\"" },
          function(d) {
                  return d;
              },
          function(ts) {
                  return ts;
              },
          "@base",
          { type: "literal", value: "@base", description: "\"@base\"" },
          "@prefix",
          { type: "literal", value: "@prefix", description: "\"@prefix\"" },
          ":",
          { type: "literal", value: ":", description: "\":\"" },
          { type: "other", description: "[6] SelectQuery" },
          function(s, gs, w, sm) {

                var dataset = {'named':[], 'default':[]};
                for(var i=0; gs && i<gs.length; i++) {
                    var g = gs[i];
                    if(g.kind === 'default') {
                        dataset['default'].push(g.graph);
                    } else {
                        dataset['named'].push(g.graph)
                    }
                }


                if(dataset['named'].length === 0 && dataset['default'].length === 0) {
                    dataset['default'].push({token:'uri', 
                                             prefix:null, 
                                             suffix:null, 
                                             value:'https://github.com/antoniogarrote/rdfstore-js#default_graph'});
                }

                var query = {};
                query.kind = 'select';
                query.token = 'executableunit'
                query.dataset = dataset;
                query.projection = s.vars;
                query.modifier = s.modifier;
                query.pattern = w
                
                if(sm!=null && sm.limit!=null) {
                    query.limit = sm.limit;
                }
                if(sm!=null && sm.offset!=null) {
                    query.offset = sm.offset;
                }
                if(sm!=null && (sm.order!=null && sm.order!="")) {
                    query.order = sm.order;
                }
                if(sm!=null && sm.group!=null) {
                    query.group = sm.group;
                }

                return query
          },
          { type: "other", description: "[7] SubSelect" },
          { type: "other", description: "[8] SelectClause" },
          "L",
          { type: "literal", value: "L", description: "\"L\"" },
          "l",
          { type: "literal", value: "l", description: "\"l\"" },
          "C",
          { type: "literal", value: "C", description: "\"C\"" },
          "c",
          { type: "literal", value: "c", description: "\"c\"" },
          "T",
          { type: "literal", value: "T", description: "\"T\"" },
          "t",
          { type: "literal", value: "t", description: "\"t\"" },
          "D",
          { type: "literal", value: "D", description: "\"D\"" },
          "d",
          { type: "literal", value: "d", description: "\"d\"" },
          "N",
          { type: "literal", value: "N", description: "\"N\"" },
          "n",
          { type: "literal", value: "n", description: "\"n\"" },
          "U",
          { type: "literal", value: "U", description: "\"U\"" },
          "u",
          { type: "literal", value: "u", description: "\"u\"" },
          "(",
          { type: "literal", value: "(", description: "\"(\"" },
          ")",
          { type: "literal", value: ")", description: "\")\"" },
          "*",
          { type: "literal", value: "*", description: "\"*\"" },
          function(mod, proj) {
               var vars = [];
                if(proj && proj.length === 3 && proj[1]==="*") {
                    return {vars: [{token: 'variable', kind:'*'}], modifier:arrayToString(mod)};
                }

                for(var i=0; proj && i< proj.length; i++) {
                    var aVar = proj[i];

                    if(aVar.length === 3) {
                        vars.push({token: 'variable', kind:'var', value:aVar[1]});
                    } else {
                        vars.push({token: 'variable', kind:'aliased', expression: aVar[3], alias:aVar[8]})
                    }
                }

                return {vars: vars, modifier:arrayToString(mod)};
          },
          { type: "other", description: "[9] ConstructQuery" },
          "O",
          { type: "literal", value: "O", description: "\"O\"" },
          "o",
          { type: "literal", value: "o", description: "\"o\"" },
          function(t, gs, w, sm) {
                var dataset = {'named':[], 'default':[]};
                for(var i=0; gs && i<gs.length; i++) {
                    var g = gs[i];
                    if(g.kind === 'default') {
                        dataset['default'].push(g.graph);
                    } else {
                        dataset['named'].push(g.graph)
                    }
                }


                if(dataset['named'].length === 0 && dataset['default'].length === 0) {
                    dataset['default'].push({token:'uri', 
                                             prefix:null, 
                                             suffix:null, 
                                             value:'https://github.com/antoniogarrote/rdfstore-js#default_graph'});
                }

                var query = {};
                query.kind = 'construct';
                query.token = 'executableunit'
                query.dataset = dataset;
                query.template = t;
                query.pattern = w
                
                if(sm!=null && sm.limit!=null) {
                    query.limit = sm.limit;
                }
                if(sm!=null && sm.offset!=null) {
                    query.offset = sm.offset;
                }
                if(sm!=null && (sm.order!=null && sm.order!="")) {
                    query.order = sm.order;
                }
                return query

          },
          { type: "other", description: "[10] DescribeQuery" },
          "DESCRIBE",
          { type: "literal", value: "DESCRIBE", description: "\"DESCRIBE\"" },
          { type: "other", description: "[11] AskQuery" },
          "K",
          { type: "literal", value: "K", description: "\"K\"" },
          "k",
          { type: "literal", value: "k", description: "\"k\"" },
          function(gs, w) {
                var dataset = {'named':[], 'default':[]};
                for(var i=0; gs && i<gs.length; i++) {
                    var g = gs[i];
                    if(g.kind === 'default') {
                        dataset['default'].push(g.graph);
                    } else {
                        dataset['named'].push(g.graph)
                    }
                }


                if(dataset['named'].length === 0 && dataset['default'].length === 0) {
                    dataset['default'].push({token:'uri', 
                                             prefix:null, 
                                             suffix:null, 
                                             value:'https://github.com/antoniogarrote/rdfstore-js#default_graph'});
                }

                var query = {};
                query.kind = 'ask';
                query.token = 'executableunit'
                query.dataset = dataset;
                query.pattern = w

                return query
          },
          { type: "other", description: "[12] DatasetClause" },
          "M",
          { type: "literal", value: "M", description: "\"M\"" },
          "m",
          { type: "literal", value: "m", description: "\"m\"" },
          function(gs) {
                return gs;
          },
          { type: "other", description: "[13] DefaultGraphClause" },
          function(s) {
              return {graph:s , kind:'default', token:'graphClause'}
          },
          { type: "other", description: "[14] NamedGraphClause" },
          function(s) {      
                return {graph:s, kind:'named', token:'graphCluase'};
          },
          { type: "other", description: "[15] SourceSelector" },
          { type: "other", description: "[16] WhereClause" },
          "W",
          { type: "literal", value: "W", description: "\"W\"" },
          "w",
          { type: "literal", value: "w", description: "\"w\"" },
          "H",
          { type: "literal", value: "H", description: "\"H\"" },
          "h",
          { type: "literal", value: "h", description: "\"h\"" },
          function(g) {
                return g;
          },
          { type: "other", description: "[17] SolutionModifier" },
          function(gc, oc, lo) {
                var acum = {};
                if(lo != null) {
                    if(lo.limit != null) {
                        acum.limit = lo.limit;
                    } 
                    if(lo.offset != null) {
                        acum.offset = lo.offset;
                    }
                }

                if(gc != null) {
                    acum.group = gc;
                }

                acum.order = oc;

                return acum
          },
          { type: "other", description: "[18] GroupClause" },
          "G",
          { type: "literal", value: "G", description: "\"G\"" },
          "g",
          { type: "literal", value: "g", description: "\"g\"" },
          "Y",
          { type: "literal", value: "Y", description: "\"Y\"" },
          "y",
          { type: "literal", value: "y", description: "\"y\"" },
          function(conds) {
                return conds;
          },
          { type: "other", description: "[19] GroupCondition" },
          function(b) {
                return b;
          },
          function(f) {
                return f;
          },
          function(e, alias) {
                if(alias.length != 0) {
                    return {token: 'aliased_expression',
                            expression: e,
                            alias: alias[3] };
                } else {
                    return e;
                }
          },
          function(v) {
                return v;
          },
          { type: "other", description: "[20] HavingClause" },
          "HAVING",
          { type: "literal", value: "HAVING", description: "\"HAVING\"" },
          { type: "other", description: "[21] HavingCondition" },
          { type: "other", description: "[22] OrderClause" },
          function(os) {
                return os;
          },
          { type: "other", description: "[23] OrderCondition" },
          "ASC",
          { type: "literal", value: "ASC", description: "\"ASC\"" },
          "DESC",
          { type: "literal", value: "DESC", description: "\"DESC\"" },
          function(direction, e) {
                return { direction: direction, expression:e };
          },
          function(e) {
              if(e.token === 'var') {
                  e = { token:'expression', 
                        expressionType:'atomic',
                        primaryexpression: 'var',
                        value: e };
              }
              return { direction: 'ASC', expression:e };
          },
          { type: "other", description: "[24] LimitOffsetClauses" },
          function(cls) {
                var acum = {};
                for(var i=0; cls && i<cls.length; i++) {
                    var cl = cls[i];
                    if(cl.limit != null) {
                        acum['limit'] = cl.limit;
                    } else if(cl.offset != null){
                        acum['offset'] = cl.offset;
                    }
                }

                return acum;
          },
          { type: "other", description: "[25] LimitClause" },
          function(i) {
            return { limit:parseInt(i.value) };
          },
          { type: "other", description: "[26] OffsetClause" },
          function(i) {
            return { offset:parseInt(i.value) };
          },
          { type: "other", description: "[27] BindingsClause" },
          "BINDINGS",
          { type: "literal", value: "BINDINGS", description: "\"BINDINGS\"" },
          "{",
          { type: "literal", value: "{", description: "\"{\"" },
          "}",
          { type: "literal", value: "}", description: "\"}\"" },
          { type: "other", description: "[28] BindingValue" },
          "UNDEF",
          { type: "literal", value: "UNDEF", description: "\"UNDEF\"" },
          { type: "other", description: "[29] UpdateUnit" },
          { type: "other", description: "[30] Update" },
          ";",
          { type: "literal", value: ";", description: "\";\"" },
          function(p, u, us) {

                var query = {};
                query.token = 'query';
                query.kind = 'update'
                query.prologue = p;

               var units = [u];

               if(us.length != null && us[3] != null && us[3].units != null) {
                   units = units.concat(us[3].units);
               }

               query.units = units;
               return query;
          },
          { type: "other", description: "[31] Update1" },
          { type: "other", description: "[32] Load" },
          function(sg, dg) {
                var query = {};
                query.kind = 'load';
                query.token = 'executableunit'
                query.sourceGraph = sg;
                query.destinyGraph = dg[5];
                
                return query;
          },
          { type: "other", description: "[33] Clear" },
          function(ref) {
                var query = {};
                query.kind = 'clear';
                query.token = 'executableunit'
                query.destinyGraph = ref;
                
                return query;
          },
          { type: "other", description: "[34] Drop" },
          function(ref) {
                var query = {};
                query.kind = 'drop';
                query.token = 'executableunit'
                query.destinyGraph = ref;
                
                return query;
          },
          { type: "other", description: "[35] Create" },
          function(ref) {
                var query = {};
                query.kind = 'create';
                query.token = 'executableunit'
                query.destinyGraph = ref;
                
                return query;
          },
          { type: "other", description: "[36] InsertData" },
          function(qs) {
                var query = {};
                query.kind = 'insertdata';
                query.token = 'executableunit'
                query.quads = qs;

                return query;
          },
          { type: "other", description: "[37] DeleteData" },
          function(qs) {
                var query = {};
                query.kind = 'deletedata';
                query.token = 'executableunit'
                query.quads = qs;

                return query;
          },
          { type: "other", description: "[38] DeleteWhere" },
          function(p) {
                var query = {};
                query.kind = 'modify';
                query.pattern = p;
                query.with = null;
                query.using = null;

                var quads = [];


                var patternsCollection = p.patterns[0];
                if(patternsCollection.triplesContext == null && patternsCollection.patterns!=null) {
                    patternsCollection = patternsCollection.patterns[0].triplesContext;
                } else {
                    patternsCollection = patternsCollection.triplesContext;
                }

                for(var i=0; patternsCollection && i<patternsCollection.length; i++) {
                    var quad = {};
                    var contextQuad = patternsCollection[i];

                    quad['subject'] = contextQuad['subject'];
                    quad['predicate'] = contextQuad['predicate'];
                    quad['object'] = contextQuad['object'];
                    quad['graph'] = contextQuad['graph'];

                    quads.push(quad);
                }

                query.delete = quads;

                return query;
          },
          { type: "other", description: "[39] Modify" },
          function(wg, dic, uc, p) {
                var query = {};
                query.kind = 'modify';

                if(wg != "") {
                    query.with = wg[5];
                } else {
                    query.with = null;
                }


                if(dic.length === 3 && dic[2] === '') {
                    query.delete = dic[0];
                    query.insert = null;
                } else if(dic.length === 3 && dic[0].length != null && dic[1].length != null && dic[2].length != null) {
                    query.delete = dic[0];
                    query.insert = dic[2];
                } else  {
                    query.insert = dic;
                    query.delete = null;
                }

                if(uc != '') {
                    query.using = uc;
                }

                query.pattern = p;

                return query;
          },
          { type: "other", description: "[40] DeleteClause" },
          function(q) {
                return q;
          },
          { type: "other", description: "[41] InsertClause" },
          function(q) {
            return q;
          },
          { type: "other", description: "[42] UsingClause" },
          function(g) {
                if(g.length!=null) {
                    return {kind: 'named', uri: g[6]};
                } else {
                    return {kind: 'default', uri: g};
                }
          },
          { type: "other", description: "[43] GraphRef" },
          function(i) {
                return i;
          },
          { type: "other", description: "[44] GraphRefAll" },
          function() {
                return 'default';
          },
          function() {
                return 'named';
          },
          function() {
                return 'all';
          },
          { type: "other", description: "[45] QuadPattern" },
          function(qs) {
                return qs.quadsContext;
          },
          { type: "other", description: "[46] QuadData" },
          { type: "other", description: "[47] Quads" },
          function(ts, qs) {
                var quads = []
                if(ts && ts.triplesContext != null && ts.triplesContext != null) {
                  for(var i=0; ts.triplesContext && i<ts.triplesContext.length; i++) {
                      var triple = ts.triplesContext[i]
                      triple.graph = null;
                      quads.push(triple)
                  }
                }

                if(qs && qs.length>0 && qs[0].length > 0) {
                    quads = quads.concat(qs[0][0].quadsContext);

                    if( qs[0][2] != null && qs[0][2].triplesContext != null) {
                      for(var i=0; i<qs[0][2].triplesContext.length; i++) {
                          var triple = qs[0][2].triplesContext[i]
                          triple.graph = null;
                          quads.push(triple)
                      }
                    }
                }

                return {token:'quads',
                        quadsContext: quads}
          },
          { type: "other", description: "[48] QuadsNotTriples" },
          function(g, ts) {
                var quads = []
                for(var i=0; ts && i<ts.triplesContext.length; i++) {
                    var triple = ts.triplesContext[i]
                    triple.graph = g;
                    quads.push(triple)
                }

                return {token:'quadsnottriples',
                        quadsContext: quads}
          },
          { type: "other", description: "[49] TriplesTemplate" },
          function(b, bs) {
               var triples = b.triplesContext;
               var toTest = null;
                if(bs && typeof(bs) === 'object') {
                      if(bs.length != null) {
                            if(bs[3].triplesContext!=null) {
                               triples = triples.concat(bs[3].triplesContext);
                        }
                     }
                }

               return {token:'triplestemplate',
                       triplesContext: triples}
          },
          { type: "other", description: "[50] GroupGraphPattern" },
          function(p) {
                return p;
          },
          { type: "other", description: "[51] GroupGraphPatternSub" },
          function(tb, tbs) {
                var subpatterns = [];
                if(tb != null && tb != []) {
                    subpatterns.push(tb);
                }

                for(var i=0; tbs && tbs && i<tbs.length; i++) {
                    for(var j=0; j< tbs[i].length; j++) {
                        if(tbs[i][j].token != null) {
                            subpatterns.push(tbs[i][j]);
                        }
                    }
                }

                var compactedSubpatterns = [];

                var currentBasicGraphPatterns = [];
                var currentFilters = [];

                for(var i=0; subpatterns && i<subpatterns.length; i++) {
                    if(subpatterns[i].token!='triplespattern' && subpatterns[i].token != 'filter') {
                        if(currentBasicGraphPatterns.length != 0 || currentFilters.length != 0) {
                            var triplesContext = [];
                            for(var j=0; j<currentBasicGraphPatterns.length; j++) {
                                triplesContext = triplesContext.concat(currentBasicGraphPatterns[j].triplesContext);
                            }
                            if(triplesContext.length > 0) {  
                                compactedSubpatterns.push({token: 'basicgraphpattern',
                                                           triplesContext: triplesContext});
                            }
                            currentBasicGraphPatterns = [];
                        }
                        compactedSubpatterns.push(subpatterns[i]);
                    } else {
                        if(subpatterns[i].token === 'triplespattern') {
                            currentBasicGraphPatterns.push(subpatterns[i]);
                        } else {
                            currentFilters.push(subpatterns[i]);
                        }
                    }
                }

                if(currentBasicGraphPatterns.length != 0 || currentFilters.length != 0) {
                    var triplesContext = [];
                    for(var j=0; j<currentBasicGraphPatterns.length; j++) {
                        triplesContext = triplesContext.concat(currentBasicGraphPatterns[j].triplesContext);
                    }
                    if(triplesContext.length > 0) {
                      compactedSubpatterns.push({token: 'basicgraphpattern',
                                                 triplesContext: triplesContext});
                    }
                }

          //      if(compactedSubpatterns.length == 1) {
          //          compactedSubpatterns[0].filters = currentFilters;
          //          return compactedSubpatterns[0];
          //      } else  {
                    return { token: 'groupgraphpattern',
                             patterns: compactedSubpatterns,
                             filters: currentFilters }
          //      }
          },
          { type: "other", description: "[54] TriplesBlock" },
          function(b, bs) {
               var triples = b.triplesContext;
               var toTest = null;
                if(bs && typeof(bs) === 'object') {
                      if(bs.length != null) {
                            if(bs[2].triplesContext!=null) {
                               triples = triples.concat(bs[2].triplesContext);
                        }
                     }
                }

               return {token:'triplespattern',
                       triplesContext: triples}
          },
          { type: "other", description: "[53] GraphPatternNotTriples" },
          { type: "other", description: "[54] OptionalGraphPattern" },
          "OPTIONAL",
          { type: "literal", value: "OPTIONAL", description: "\"OPTIONAL\"" },
          function(v) {
                return { token: 'optionalgraphpattern',
                         value: v }
          },
          { type: "other", description: "[55] GraphGraphPattern" },
          function(g, gg) {
                for(var i=0; i<gg.patterns.length; i++) {
                  var quads = []
                  var ts = gg.patterns[i];
                  for(var j=0; j<ts.triplesContext.length; j++) {
                      var triple = ts.triplesContext[j]
                      triple.graph = g;
                  }
                }

                gg.token = 'groupgraphpattern'
                return gg;
          },
          { type: "other", description: "[56] ServiceGraphPattern" },
          "SERVICE",
          { type: "literal", value: "SERVICE", description: "\"SERVICE\"" },
          function(v, ts) {
                return {token: 'servicegraphpattern',
                        status: 'todo',
                        value: [v,ts] }
          },
          { type: "other", description: "[57] MinusGraphPattern" },
          "MINUS",
          { type: "literal", value: "MINUS", description: "\"MINUS\"" },
          function(ts) {
                return {token: 'minusgraphpattern',
                        status: 'todo',
                        value: ts}
          },
          { type: "other", description: "[58] GroupOrUnionGraphPattern" },
          function(a, b) {
                if(b.length === 0) {
                    return a;
                } else {

                    var lastToken = {token: 'graphunionpattern',
                                     value: [a]};

                    for(var i=0; b && i<b.length; i++) {
                        if(i==b.length-1) {
                            lastToken.value.push(b[i][7]);
                        } else {
                            lastToken.value.push(b[i][7]);
                            var newToken = {token: 'graphunionpattern',
                                            value: [lastToken]}

                            lastToken = newToken;
                        }
                    }

                    return lastToken;

                }
          },
          { type: "other", description: "[59] Filter" },
          function(c) {
                return {token: 'filter',
                        value: c}
          },
          { type: "other", description: "[60] Constraint" },
          { type: "other", description: "[61] FunctionCall" },
          function(i, args) {
                var fcall = {};
                fcall.token = "expression";
                fcall.expressionType = 'irireforfunction'
                fcall.iriref = i;
                fcall.args = args.value;

                return fcall;
          },
          { type: "other", description: "[62] ArgList" },
          function() {
                var args = {};
                args.token = 'args';
                args.value = [];
                return args;
          },
          "DISTINCT",
          { type: "literal", value: "DISTINCT", description: "\"DISTINCT\"" },
          ",",
          { type: "literal", value: ",", description: "\",\"" },
          function(d, e, es) {
                cleanEx = [];

                for(var i=0; i<es.length; i++) {
                    cleanEx.push(es[i][1]);
                }
                var args = {};
                args.token = 'args';
                args.value = [e].concat(cleanEx);

                if(d==="DISTINCT") {
                    args.distinct = true;
                } else {
                    args.distinct = false;
                }

                return args;
          },
          { type: "other", description: "[63] ExpressionList" },
          function(e, es) {
                cleanEx = [];

                for(var i=0; i<es.length; i++) {
                    cleanEx.push(es[i][1]);
                }
                var args = {};
                args.token = 'args';
                args.value = [e].concat(cleanEx);

                return args;
          },
          { type: "other", description: "[64] ConstructTemplate" },
          function(ts) {
                return ts;
          },
          { type: "other", description: "[65] ConstructTriples" },
          { type: "other", description: "[66] TriplesSameSubject" },
          function(s, pairs) {
                var triplesContext = pairs.triplesContext;
                var subject = s;
                if(pairs.pairs) {
                  for(var i=0; i< pairs.pairs.length; i++) {
                      var pair = pairs.pairs[i];
                      var triple = null;
                  if(pair[1].length != null)
                    pair[1] = pair[1][0]
                      if(subject.token && subject.token==='triplesnodecollection') {
                          triple = {subject: subject.chainSubject[0], predicate: pair[0], object: pair[1]}
                          triplesContext.push(triple);
                          triplesContext = triplesContext.concat(subject.triplesContext);
                      } else {
                          triple = {subject: subject, predicate: pair[0], object: pair[1]}
                          triplesContext.push(triple);
                      }
                  }
                }

                var token = {};
                token.token = "triplessamesubject";
                token.triplesContext = triplesContext;
                token.chainSubject = subject;

                return token;
            },
          function(tn, pairs) {
                var triplesContext = tn.triplesContext;
                var subject = tn.chainSubject;

                if(pairs.pairs) {
                  for(var i=0; i< pairs.pairs.length; i++) {
                      var pair = pairs.pairs[i];
                      if(pair[1].length != null)
                    pair[1] = pair[1][0]

                      if(tn.token === "triplesnodecollection") {
                          for(var j=0; j<subject.length; j++) {
                              var subj = subject[j];
                              if(subj.triplesContext != null) {
                                  var triple = {subject: subj.chainSubject, predicate: pair[0], object: pair[1]}
                                  triplesContext.concat(subj.triplesContext);
                              } else {
                                  var triple = {subject: subject[j], predicate: pair[0], object: pair[1]}
                                  triplesContext.push(triple);
                              }
                          }
                      } else {
                          var triple = {subject: subject, predicate: pair[0], object: pair[1]}
                          triplesContext.push(triple);
                      }
                  }
                }

                var token = {};
                token.token = "triplessamesubject";
                token.triplesContext = triplesContext;
                token.chainSubject = subject;

                return token;
            },
          { type: "other", description: "[67] PropertyListNotEmpty" },
          function(v, ol, rest) {
                token = {}
                token.token = 'propertylist';
                var triplesContext = [];
                var pairs = [];
                var test = [];

                for( var i=0; i<ol.length; i++) {

                   if(ol[i].triplesContext != null) {
                       triplesContext = triplesContext.concat(ol[i].triplesContext);
                       if(ol[i].token==='triplesnodecollection' && ol[i].chainSubject.length != null) {
                           pairs.push([v, ol[i].chainSubject[0]]);
                       } else {
                           pairs.push([v, ol[i].chainSubject]);
                       }

                    } else {
                        pairs.push([v, ol[i]])
                    }

                }


                for(var i=0; i<rest.length; i++) {
                    var tok = rest[i][3];
                    var newVerb  = tok[0];
                    var newObjsList = tok[2] || [];

                    for(var j=0; j<newObjsList.length; j++) {
                     if(newObjsList[j].triplesContext != null) {
                        triplesContext = triplesContext.concat(newObjsList[j].triplesContext);
                       pairs.push([newVerb, newObjsList[j].chainSubject]);
                      } else {
                        pairs.push([newVerb, newObjsList[j]])
                      }
                    }
                }

                token.pairs = pairs;
                token.triplesContext = triplesContext;

                return token;

          },
          { type: "other", description: "[68] PropertyList" },
          { type: "other", description: "[69] ObjectList" },
          function(obj, objs) {

                  var toReturn = [];

                  toReturn.push(obj);

                  for(var i=0; i<objs.length; i++) {
                      for(var j=0; j<objs[i].length; j++) {
                          if(typeof(objs[i][j])=="object" && objs[i][j].token != null) {
                              toReturn.push(objs[i][j]);
                          }
                      }
                  }

                  return toReturn;
              },
          { type: "other", description: "[70] Object" },
          { type: "other", description: "[71] Verb" },
          function() {
                return{token: 'uri', prefix:null, suffix:null, value:"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}
            },
          { type: "other", description: "[72] TriplesSameSubjectPath" },
          function(tn, pairs) {
                var triplesContext = tn.triplesContext;
                var subject = tn.chainSubject;

                if(pairs.pairs) {
                  for(var i=0; i< pairs.pairs.length; i++) {
                      var pair = pairs.pairs[i];
                      if(pair[1].length != null)
                    pair[1] = pair[1][0]

                      if(tn.token === "triplesnodecollection") {
                          for(var j=0; j<subject.length; j++) {
                              var subj = subject[j];
                              if(subj.triplesContext != null) {
                                  var triple = {subject: subj.chainSubject, predicate: pair[0], object: pair[1]}
                                  triplesContext.concat(subj.triplesContext);
                              } else {
                                  var triple = {subject: subject[j], predicate: pair[0], object: pair[1]}
                                  triplesContext.push(triple);
                              }
                          }
                      } else {
                          var triple = {subject: subject, predicate: pair[0], object: pair[1]}
                          triplesContext.push(triple);
                      }
                  }
                }

                var token = {};
                token.token = "triplessamesubject";
                token.triplesContext = triplesContext;
                token.chainSubject = subject;

                return token;

              },
          { type: "other", description: "[73] PropertyListNotEmptyPath" },
          function(v, ol, rest) {
                token = {}
                token.token = 'propertylist';
                var triplesContext = [];
                var pairs = [];
                var test = [];

                for( var i=0; i<ol.length; i++) {

                   if(ol[i].triplesContext != null) {
                       triplesContext = triplesContext.concat(ol[i].triplesContext);
                       if(ol[i].token==='triplesnodecollection' && ol[i].chainSubject.length != null) {
                           pairs.push([v, ol[i].chainSubject[0]]);
                       } else {
                           pairs.push([v, ol[i].chainSubject]);
                       }

                    } else {
                        pairs.push([v, ol[i]])
                    }

                }


                for(var i=0; i<rest.length; i++) {
                    var tok = rest[i][3];
                    var newVerb  = tok[0];
                    var newObjsList = tok[1] || [];

                    for(var j=0; j<newObjsList.length; j++) {
                     if(newObjsList[j].triplesContext != null) {
                        triplesContext = triplesContext.concat(newObjsList[j].triplesContext);
                       pairs.push([newVerb, newObjsList[j].chainSubject]);
                      } else {
                        pairs.push([newVerb, newObjsList[j]])
                      }
                    }
                }

                token.pairs = pairs;
                token.triplesContext = triplesContext;

                return token;
          },
          { type: "other", description: "[74] PropertyListPath" },
          { type: "other", description: "[75]" },
          function(p) {
                var path = {};
                path.token = 'path';
                path.kind = 'element';
                path.value = p;

                return p;
            },
          { type: "other", description: "[76] VerbSimple" },
          { type: "other", description: "[77] Path" },
          { type: "other", description: "[78] PathAlternative" },
          "|",
          { type: "literal", value: "|", description: "\"|\"" },
          function(first, rest) {
              if(rest == null || rest.length === 0) {
                  return first;
              } else {
                  var acum = [];
                  for(var i=0; i<rest.length; i++)
                  acum.push(rest[1]);

                  var path = {};
                  path.token = 'path';
                  path.kind = 'alternative';
                  path.value = acum;

                  return path;
              }
              },
          { type: "other", description: "[79] PathSequence" },
          "/",
          { type: "literal", value: "/", description: "\"/\"" },
          function(first, rest) {
              if(rest == null || rest.length === 0) {
                  return first;
              } else {
                  var acum = [first];

                  for(var i=0; i<rest.length; i++) 
                  acum.push(rest[i][1]);

                  var path = {};
                  path.token = 'path';
                  path.kind = 'sequence';
              
                  path.value = acum;
                  
                  return path;
              }
              },
          { type: "other", description: "[88] PathElt" },
          function(p, mod) {
              if(p.token && p.token != 'path' && mod == '') {
                  return p;
              } else if(p.token && p.token != path && mod != '') {
                  var path = {};
                  path.token = 'path';
                  path.kind = 'element';
                  path.value = p;
                  path.modifier = mod;
                  return path;
              } else {
                  p.modifier = mod;
                  return p;
              }
              },
          { type: "other", description: "[81] PathEltOrInverse" },
          "^",
          { type: "literal", value: "^", description: "\"^\"" },
          function(elt) {
              var path = {};
              path.token = 'path';
              path.kind = 'inversePath';
              path.value = elt;

              return path;
              },
          { type: "other", description: "[82] PathMod" },
          "?",
          { type: "literal", value: "?", description: "\"?\"" },
          "+",
          { type: "literal", value: "+", description: "\"+\"" },
          { type: "other", description: "[83] PathPrimary" },
          function() {
              return{token: 'uri', prefix:null, suffix:null, value:"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}
              },
          "!",
          { type: "literal", value: "!", description: "\"!\"" },
          function(p) {
              return p;
              },
          { type: "other", description: "[85] PathOneInPropertySet" },
          { type: "other", description: "[86] Integer" },
          { type: "other", description: "[87] TriplesNode" },
          function(c) {
                triplesContext = [];
                chainSubject = [];

                var triple = null;

                // catch NIL
                /*
                if(c.length == 1 && c[0].token && c[0].token === 'nil') {
                    GlobalBlankNodeCounter++;
                    return  {token: "triplesnodecollection", 
                             triplesContext:[{subject: {token:'blank', label:("_:"+GlobalBlankNodeCounter)},
                                              predicate:{token:'uri', prefix:null, suffix:null, value:'http://www.w3.org/1999/02/22-rdf-syntax-ns#rest'},
                                              object:  {token:'blank', label:("_:"+(GlobalBlankNodeCounter+1))}}], 
                             chainSubject:{token:'blank', label:("_:"+GlobalBlankNodeCounter)}};

                }
                */

                // other cases
                for(var i=0; i<c.length; i++) {
                    GlobalBlankNodeCounter++;
                    //_:b0  rdf:first  1 ;
                    //rdf:rest   _:b1 .
                    var nextObject = null;
                    if(c[i].chainSubject == null && c[i].triplesContext == null) {
                        nextObject = c[i];
                    } else {
                        nextObject = c[i].chainSubject;
                        triplesContext = triplesContext.concat(nextSubject.triplesContext);
                    }
                    var currentSubject = null;
                    triple = {subject: {token:'blank', label:("_:"+GlobalBlankNodeCounter)},
                              predicate:{token:'uri', prefix:null, suffix:null, value:'http://www.w3.org/1999/02/22-rdf-syntax-ns#first'},
                              object:nextObject };

                    if(i==0) {
                        chainSubject.push(triple.subject);
                    }

                    triplesContext.push(triple);

                    if(i===(c.length-1)) {
                        triple = {subject: {token:'blank', label:("_:"+GlobalBlankNodeCounter)},
                                  predicate:{token:'uri', prefix:null, suffix:null, value:'http://www.w3.org/1999/02/22-rdf-syntax-ns#rest'},
                                  object:   {token:'uri', prefix:null, suffix:null, value:'http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'}};
                    } else {
                        triple = {subject: {token:'blank', label:("_:"+GlobalBlankNodeCounter)},
                                  predicate:{token:'uri', prefix:null, suffix:null, value:'http://www.w3.org/1999/02/22-rdf-syntax-ns#rest'},
                                  object:  {token:'blank', label:("_:"+(GlobalBlankNodeCounter+1))} };
                    }

                    triplesContext.push(triple);
                }

                return {token:"triplesnodecollection", triplesContext:triplesContext, chainSubject:chainSubject};
          },
          { type: "other", description: "[88] BlankNodePropertyList" },
          "[",
          { type: "literal", value: "[", description: "\"[\"" },
          "]",
          { type: "literal", value: "]", description: "\"]\"" },
          function(pl) {

                GlobalBlankNodeCounter++;
                var subject = {token:'blank', label:'_:'+GlobalBlankNodeCounter};
                var newTriples =  [];

                for(var i=0; i< pl.pairs.length; i++) {
                    var pair = pl.pairs[i];
                    var triple = {}
                    triple.subject = subject;
                    triple.predicate = pair[0];
                    if(pair[1].length != null)
                  pair[1] = pair[1][0]
                    triple.object = pair[1];
                    newTriples.push(triple);
                }

                return {token: 'triplesnode',
                        kind: 'blanknodepropertylist',
                        triplesContext: pl.triplesContext.concat(newTriples),
                        chainSubject: subject};
          },
          { type: "other", description: "[89] Collection" },
          function(gn) {
                return gn;
          },
          { type: "other", description: "[90] GraphNode" },
          function(gn) {
            return gn[1];
          },
          { type: "other", description: "[91] VarOrTerm" },
          { type: "other", description: "[92] VarOrIRIref" },
          { type: "other", description: "[93] Var" },
          function(v) {
                var term = {};
                term.token = 'var';
                term.value = v;
                return term;
            },
          { type: "other", description: "[94] GraphTerm" },
          { type: "other", description: "[95] Expression" },
          { type: "other", description: "[96] ConditionalOrExpression" },
          "||",
          { type: "literal", value: "||", description: "\"||\"" },
          function(v, vs) {
                if(vs.length === 0) {
                    return v;
                }

                var exp = {};
                exp.token = "expression";
                exp.expressionType = "conditionalor";
                var ops = [v];

                for(var i=0; i<vs.length; i++) {
                    ops.push(vs[i][3]);
                }

                exp.operands = ops;

                return exp;
          },
          { type: "other", description: "[97] ConditionalAndExpression" },
          "&&",
          { type: "literal", value: "&&", description: "\"&&\"" },
          function(v, vs) {
                if(vs.length === 0) {
                    return v;
                }
                var exp = {};
                exp.token = "expression";
                exp.expressionType = "conditionaland";
                var ops = [v];

                for(var i=0; i<vs.length; i++) {
                    ops.push(vs[i][3]);
                }

                exp.operands = ops;

                return exp;
          },
          { type: "other", description: "[98] ValueLogical" },
          { type: "other", description: "[99] RelationalExpression" },
          "=",
          { type: "literal", value: "=", description: "\"=\"" },
          "!=",
          { type: "literal", value: "!=", description: "\"!=\"" },
          "<",
          { type: "literal", value: "<", description: "\"<\"" },
          ">",
          { type: "literal", value: ">", description: "\">\"" },
          "<=",
          { type: "literal", value: "<=", description: "\"<=\"" },
          ">=",
          { type: "literal", value: ">=", description: "\">=\"" },
          function(op1, op2) {
                if(op2.length === 0) {
                    return op1;
                } else if(op2[0][1] === 'i' || op2[0][1] === 'I' || op2[0][1] === 'n' || op2[0][1] === 'N'){
                  var exp = {};

                  if(op2[0][1] === 'i' || op2[0][1] === 'I') {
                    var operator = "=";
                    exp.expressionType = "conditionalor"         
                  } else {
                    var operator = "!=";
                    exp.expressionType = "conditionaland"         
                  }
                  var lop = op1;
                  var rops = []
                  for(var opi=0; opi<op2[0].length; opi++) {
                    if(op2[0][opi].token ==="args") {
                      rops = op2[0][opi].value;
                      break;
                    }
                  }       

                  exp.token = "expression";
                  exp.operands = [];
                  for(var i=0; i<rops.length; i++) {
                    var nextOperand = {};
                    nextOperand.token = "expression";
                    nextOperand.expressionType = "relationalexpression";
                    nextOperand.operator = operator;
                    nextOperand.op1 = lop;
                    nextOperand.op2 = rops[i];

                    exp.operands.push(nextOperand);
                  }       
                  return exp;
                } else {
                  var exp = {};
                  exp.expressionType = "relationalexpression"
                  exp.operator = op2[0][1];
                  exp.op1 = op1;
                  exp.op2 = op2[0][3];
                  exp.token = "expression";

                  return exp;
                }
            },
          { type: "other", description: "[100] NumericExpression" },
          { type: "other", description: "[101] AdditiveExpression" },
          "-",
          { type: "literal", value: "-", description: "\"-\"" },
          function(op1, ops) {
                if(ops.length === 0) {
                    return op1;
                }

                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'additiveexpression';
                ex.summand = op1;
                ex.summands = [];

                for(var i=0; i<ops.length; i++) {
                    var summand = ops[i];
                    var sum = {};
                    if(summand.length == 4 && typeof(summand[1]) === "string") {
                        sum.operator = summand[1];
                        sum.expression = summand[3];
                    } else {
                        var subexp = {}
                        var firstFactor = sum[0];
                        var operator = sum[1][1];
                        var secondFactor = sum[1][3];
                        var operator = null;
                        if(firstFactor.value < 0) {
                            sum.operator = '-';
                            firstFactor.value = - firstFactor.value;
                        } else {
                            sum.operator = '+';
                        }
                        subexp.token = 'expression';
                        subexp.expressionType = 'multiplicativeexpression';
                        subexp.operator = firstFactor;
                        subexp.factors = [{operator: operator, expression: secondFactor}];

                        sum.expression = subexp;
                    }
                    ex.summands.push(sum);
                }

                return ex;
          },
          { type: "other", description: "[102] MultiplicativeExpression" },
          function(exp, exps) {
                if(exps.length === 0) {
                    return exp;
                }

                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'multiplicativeexpression';
                ex.factor = exp;
                ex.factors = [];
                for(var i=0; i<exps.length; i++) {
                    var factor = exps[i];
                    var fact = {};
                    fact.operator = factor[1];
                    fact.expression = factor[3];
                    ex.factors.push(fact);
                }

                return ex;
          },
          { type: "other", description: "[103] UnaryExpression" },
          function(e) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'unaryexpression';
                ex.unaryexpression = "!";
                ex.expression = e;

                return ex;
            },
          function(v) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'unaryexpression';
                ex.unaryexpression = "+";
                ex.expression = v;

                return ex;
            },
          function(v) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'unaryexpression';
                ex.unaryexpression = "-";
                ex.expression = v;

                return ex;
            },
          { type: "other", description: "[104] PrimaryExpression" },
          function(v) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'atomic';
                ex.primaryexpression = 'rdfliteral';
                ex.value = v;

                return ex;
            },
          function(v) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'atomic';
                ex.primaryexpression = 'numericliteral';
                ex.value = v;

                return ex;
            },
          function(v) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'atomic';
                ex.primaryexpression = 'booleanliteral';
                ex.value = v;

                return ex;
            },
          function(v) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'atomic';
                ex.primaryexpression = 'var';
                ex.value = v;

                return ex;
            },
          { type: "other", description: "[105] BrackettedExpression" },
          function(e) {
                return e;
          },
          { type: "other", description: "[106] BuiltInCall" },
          function(e) {
                var ex = {};
                ex.token = 'expression'
                ex.expressionType = 'builtincall'
                ex.builtincall = 'str'
                ex.args = [e]

                return ex;
            },
          function(e) {
                var ex = {};
                ex.token = 'expression'
                ex.expressionType = 'builtincall'
                ex.builtincall = 'lang'
                ex.args = [e]

                return ex;
          },
          "LANGMATCHES",
          { type: "literal", value: "LANGMATCHES", description: "\"LANGMATCHES\"" },
          function(e1, e2) {
                var ex = {};
                ex.token = 'expression'
                ex.expressionType = 'builtincall'
                ex.builtincall = 'langmatches'
                ex.args = [e1,e2]

                return ex;
          },
          function(e) {
                var ex = {};
                ex.token = 'expression'
                ex.expressionType = 'builtincall'
                ex.builtincall = 'datatype'
                ex.args = [e]

                return ex;
          },
          "BOUND",
          { type: "literal", value: "BOUND", description: "\"BOUND\"" },
          function(v) {
                var ex = {};
                ex.token = 'expression'
                ex.expressionType = 'builtincall'
                ex.builtincall = 'bound'
                ex.args = [v]

                return ex;
          },
          "IRI",
          { type: "literal", value: "IRI", description: "\"IRI\"" },
          function(e) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'builtincall';
                ex.builtincall = 'iri'
                ex.args = [e];

                return ex;
          },
          "URI",
          { type: "literal", value: "URI", description: "\"URI\"" },
          function(e) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'builtincall';
                ex.builtincall = 'uri'
                ex.args = [e];

                return ex;
          },
          "BNODE",
          { type: "literal", value: "BNODE", description: "\"BNODE\"" },
          function(arg) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'builtincall';
                ex.builtincall = 'bnode';
                if(arg.length === 5) {
                    ex.args = [arg[2]];
                } else {
                    ex.args = null;
                }

                return ex;
          },
          "COALESCE",
          { type: "literal", value: "COALESCE", description: "\"COALESCE\"" },
          function(args) {
                var ex = {};
                ex.token = 'expression';
                ex.expressionType = 'builtincall';
                ex.builtincall = 'coalesce';
                ex.args = args;

                return ex;    
          },
          "IF",
          { type: "literal", value: "IF", description: "\"IF\"" },
          function(test, trueCond, falseCond) {
              var ex = {};
              ex.token = 'expression';
              ex.expressionType = 'builtincall';
              ex.builtincall = 'if';
              ex.args = [test,trueCond,falseCond];

              return ex;
          },
          "ISLITERAL",
          { type: "literal", value: "ISLITERAL", description: "\"ISLITERAL\"" },
          function(arg) {
              var ex = {};
              ex.token = 'expression';
              ex.expressionType = 'builtincall';
              ex.builtincall = 'isliteral';
              ex.args = [arg];

              return ex;
          },
          "ISBLANK",
          { type: "literal", value: "ISBLANK", description: "\"ISBLANK\"" },
          function(arg) {
              var ex = {};
              ex.token = 'expression';
              ex.expressionType = 'builtincall';
              ex.builtincall = 'isblank';
              ex.args = [arg];

              return ex;
          },
          "SAMETERM",
          { type: "literal", value: "SAMETERM", description: "\"SAMETERM\"" },
          function(e1, e2) {
              var ex = {};
              ex.token = 'expression';
              ex.expressionType = 'builtincall';
              ex.builtincall = 'sameterm';
              ex.args = [e1, e2];
              return ex;
          },
          function(arg) {
              var ex = {};
              ex.token = 'expression';
              ex.expressionType = 'builtincall';
              ex.builtincall = 'isuri';
              ex.args = [arg];

              return ex;
          },
          { type: "other", description: "[107] RegexExpression" },
          function(e1, e2, eo) {
                var regex = {};
                regex.token = 'expression';
                regex.expressionType = 'regex';
                regex.text = e1;
                regex.pattern = e2;
                regex.flags = eo[2];

                return regex;
          },
          { type: "other", description: "[108] ExistsFunc" },
          function(ggp) {
              var ex = {};
              ex.token = 'expression';
              ex.expressionType = 'builtincall';
              ex.builtincall = 'exists';
              ex.args = [ggp];

              return ex;
          },
          { type: "other", description: "[109] NotExistsFunc" },
          function(ggp) {
              var ex = {};
              ex.token = 'expression';
              ex.expressionType = 'builtincall';
              ex.builtincall = 'notexists';
              ex.args = [ggp];

              return ex;
          },
          { type: "other", description: "[110] Aggregate" },
          function(d, e) {
                exp = {};
                exp.token = 'expression';
                exp.expressionType = 'aggregate';
                exp.aggregateType = 'count';
                exp.distinct = (d != "" ? 'DISTINCT' : d);
                exp.expression = e;

                return exp;

            },
          function(d, e) {
                exp = {};
                exp.token = 'expression';
                exp.expressionType = 'aggregate';
                exp.aggregateType = 'sum';
                exp.distinct = (d != "" ? 'DISTINCT' : d);
                exp.expression = e;

                return exp;

            },
          function(d, e) {
                exp = {};
                exp.token = 'expression';
                exp.expressionType = 'aggregate';
                exp.aggregateType = 'min';
                exp.distinct = (d != "" ? 'DISTINCT' : d);
                exp.expression = e;

                return exp;

            },
          function(d, e) {
                exp = {};
                exp.token = 'expression'
                exp.expressionType = 'aggregate'
                exp.aggregateType = 'max'
                exp.distinct = (d != "" ? 'DISTINCT' : d);
                exp.expression = e

                return exp

            },
          "V",
          { type: "literal", value: "V", description: "\"V\"" },
          "v",
          { type: "literal", value: "v", description: "\"v\"" },
          function(d, e) {
                exp = {};
                exp.token = 'expression'
                exp.expressionType = 'aggregate'
                exp.aggregateType = 'avg'
                exp.distinct = (d != "" ? 'DISTINCT' : d);
                exp.expression = e

                return exp

            },
          { type: "other", description: "[117] IRIrefOrFunction" },
          function(i, args) {
                var fcall = {};
                fcall.token = "expression";
                fcall.expressionType = 'irireforfunction';
                fcall.iriref = i;
                fcall.args = args.value;

                return fcall;
          },
          { type: "other", description: "[112] RDFLiteral" },
          "^^",
          { type: "literal", value: "^^", description: "\"^^\"" },
          function(s, e) {
                if(typeof(e) === "string" && e.length > 0) {
                    return {token:'literal', value:s.value, lang:e.slice(1), type:null}
                } else {
                    if(typeof(e) === "object") {
                        e.shift(); // remove the '^^' char
                        return {token:'literal', value:s.value, lang:null, type:e[0] }
                    } else {
                        return { token:'literal', value:s.value, lang:null, type:null }
                    }
                }
          },
          { type: "other", description: "[113] NumericLiteral" },
          { type: "other", description: "[114] NumericLiteralUnsigned" },
          { type: "other", description: "[115] NumericLiteralPositive" },
          { type: "other", description: "[116] NumericLiteralNegative" },
          { type: "other", description: "[117] BooleanLiteral" },
          function() {
                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#boolean";
                lit.value = true;
                return lit;
           },
          function() {
                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#boolean";
                lit.value = false;
                return lit;
          },
          { type: "other", description: "[118] String" },
          function(s) { return {token:'string', value:s} },
          { type: "other", description: "[119] IRIref" },
          function(iri) { return {token: 'uri', prefix:null, suffix:null, value:iri} },
          function(p) { return p },
          { type: "other", description: "[120] PrefixedName" },
          function(p) { return {token: 'uri', prefix:p[0], suffix:p[1], value:null } },
          function(p) { return {token: 'uri', prefix:p, suffix:'', value:null } },
          { type: "other", description: "[121] BlankNode" },
          function(l) { return {token:'blank', label:l}},
          function() { GlobalBlankNodeCounter++; return {token:'blank', label:'_:'+GlobalBlankNodeCounter} },
          { type: "other", description: "[122] IRI_REF" },
          /^[^<>"{}|\^`\\]/,
          { type: "class", value: "[^<>\"{}|\\^`\\\\]", description: "[^<>\"{}|\\^`\\\\]" },
          function(iri_ref) { return iri_ref.join('') },
          { type: "other", description: "[123] PNAME_NS" },
          { type: "other", description: "[124] PNAME_LN" },
          function(p, s) { return [p, s] },
          { type: "other", description: "[125] BLANK_NODE_LABEL" },
          "_:",
          { type: "literal", value: "_:", description: "\"_:\"" },
          function(l) { return l },
          { type: "other", description: "[126] VAR1" },
          function(v) { return v },
          { type: "other", description: "[127] VAR2" },
          "$",
          { type: "literal", value: "$", description: "\"$\"" },
          { type: "other", description: "[128] LANGTAG" },
          "@",
          { type: "literal", value: "@", description: "\"@\"" },
          /^[a-zA-Z]/,
          { type: "class", value: "[a-zA-Z]", description: "[a-zA-Z]" },
          /^[a-zA-Z0-9]/,
          { type: "class", value: "[a-zA-Z0-9]", description: "[a-zA-Z0-9]" },
          function(a, b) {

                if(b.length===0) {
                    return ("@"+a.join('')).toLowerCase();
                } else {
                    return ("@"+a.join('')+"-"+b[0][1].join('')).toLowerCase();
                }
          },
          { type: "other", description: "[129] INTEGER" },
          /^[0-9]/,
          { type: "class", value: "[0-9]", description: "[0-9]" },
          function(d) {
                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#integer";
                lit.value = flattenString(d);
                return lit;
          },
          { type: "other", description: "[130] DECIMAL" },
          function(a, b, c) {

                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#decimal";
                lit.value = flattenString([a,b,c]);
                return lit;
          },
          function(a, b) {
                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#decimal";
                lit.value = flattenString([a,b]);
                return lit;
           },
          { type: "other", description: "[131] DOUBLE" },
          function(a, b, c, e) {
                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#double";
                lit.value = flattenString([a,b,c,e]);
                return lit;
          },
          function(a, b, c) {
                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#double";
                lit.value = flattenString([a,b,c]);
                return lit;
          },
          function(a, b) {
                lit = {};
                lit.token = "literal";
                lit.lang = null;
                lit.type = "http://www.w3.org/2001/XMLSchema#double";
                lit.value = flattenString([a,b]);
                return lit;
          },
          { type: "other", description: "[132] INTEGER_POSITIVE" },
          function(d) { d.value = "+"+d.value; return d; },
          { type: "other", description: "[133] DECIMAL_POSITIVE" },
          function(d) { d.value = "+"+d.value; return d },
          { type: "other", description: "[134] DOUBLE_POSITIVE" },
          { type: "other", description: "[135] INTEGER_NEGATIVE" },
          function(d) { d.value = "-"+d.value; return d; },
          { type: "other", description: "[136] DECIMAL_NEGATIVE" },
          { type: "other", description: "[137] DOUBLE_NEGATIVE" },
          { type: "other", description: "[138] EXPONENT" },
          /^[eE]/,
          { type: "class", value: "[eE]", description: "[eE]" },
          /^[+\-]/,
          { type: "class", value: "[+\\-]", description: "[+\\-]" },
          function(a, b, c) { return flattenString([a,b,c]) },
          { type: "other", description: "[139] STRING_LITERAL1" },
          "'",
          { type: "literal", value: "'", description: "\"'\"" },
          /^[^'\\\n\r]/,
          { type: "class", value: "[^'\\\\\\n\\r]", description: "[^'\\\\\\n\\r]" },
          function(content) { return flattenString(content) },
          { type: "other", description: "[140] STRING_LITERAL2" },
          "\"",
          { type: "literal", value: "\"", description: "\"\\\"\"" },
          /^[^"\\\n\r]/,
          { type: "class", value: "[^\"\\\\\\n\\r]", description: "[^\"\\\\\\n\\r]" },
          { type: "other", description: "[141] STRING_LITERAL_LONG1" },
          "'''",
          { type: "literal", value: "'''", description: "\"'''\"" },
          /^[^'\\]/,
          { type: "class", value: "[^'\\\\]", description: "[^'\\\\]" },
          { type: "other", description: "[142] STRING_LITERAL_LONG2" },
          "\"\"\"",
          { type: "literal", value: "\"\"\"", description: "\"\\\"\\\"\\\"\"" },
          /^[^"\\]/,
          { type: "class", value: "[^\"\\\\]", description: "[^\"\\\\]" },
          { type: "other", description: "[143] ECHAR" },
          "\\",
          { type: "literal", value: "\\", description: "\"\\\\\"" },
          /^[tbnrf"']/,
          { type: "class", value: "[tbnrf\"']", description: "[tbnrf\"']" },
          { type: "other", description: "[144] NIL" },
          function() {

                return  {token: "triplesnodecollection", 
                         triplesContext:[], 
                         chainSubject:[{token:'uri', value:"http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"}]};
          },
          { type: "other", description: "[145] WS" },
          /^[ ]/,
          { type: "class", value: "[ ]", description: "[ ]" },
          /^[\t]/,
          { type: "class", value: "[\\t]", description: "[\\t]" },
          /^[\r]/,
          { type: "class", value: "[\\r]", description: "[\\r]" },
          /^[\n]/,
          { type: "class", value: "[\\n]", description: "[\\n]" },
          { type: "other", description: " COMMENT" },
          "#",
          { type: "literal", value: "#", description: "\"#\"" },
          /^[^\n\r]/,
          { type: "class", value: "[^\\n\\r]", description: "[^\\n\\r]" },
          { type: "other", description: "[146] ANON" },
          { type: "other", description: "[147] PN_CHARS_BASE" },
          /^[A-Z]/,
          { type: "class", value: "[A-Z]", description: "[A-Z]" },
          /^[a-z]/,
          { type: "class", value: "[a-z]", description: "[a-z]" },
          /^[\xC0-\xD6]/,
          { type: "class", value: "[\\xC0-\\xD6]", description: "[\\xC0-\\xD6]" },
          /^[\xD8-\xF6]/,
          { type: "class", value: "[\\xD8-\\xF6]", description: "[\\xD8-\\xF6]" },
          /^[\xF8-\u02FF]/,
          { type: "class", value: "[\\xF8-\\u02FF]", description: "[\\xF8-\\u02FF]" },
          /^[\u0370-\u037D]/,
          { type: "class", value: "[\\u0370-\\u037D]", description: "[\\u0370-\\u037D]" },
          /^[\u037F-\u1FFF]/,
          { type: "class", value: "[\\u037F-\\u1FFF]", description: "[\\u037F-\\u1FFF]" },
          /^[\u200C-\u200D]/,
          { type: "class", value: "[\\u200C-\\u200D]", description: "[\\u200C-\\u200D]" },
          /^[\u2070-\u218F]/,
          { type: "class", value: "[\\u2070-\\u218F]", description: "[\\u2070-\\u218F]" },
          /^[\u2C00-\u2FEF]/,
          { type: "class", value: "[\\u2C00-\\u2FEF]", description: "[\\u2C00-\\u2FEF]" },
          /^[\u3001-\uD7FF]/,
          { type: "class", value: "[\\u3001-\\uD7FF]", description: "[\\u3001-\\uD7FF]" },
          /^[\uF900-\uFDCF]/,
          { type: "class", value: "[\\uF900-\\uFDCF]", description: "[\\uF900-\\uFDCF]" },
          /^[\uFDF0-\uFFFD]/,
          { type: "class", value: "[\\uFDF0-\\uFFFD]", description: "[\\uFDF0-\\uFFFD]" },
          /^[\u1000-\uEFFF]/,
          { type: "class", value: "[\\u1000-\\uEFFF]", description: "[\\u1000-\\uEFFF]" },
          { type: "other", description: "[148] PN_CHARS_U" },
          "_",
          { type: "literal", value: "_", description: "\"_\"" },
          { type: "other", description: "[149] VARNAME" },
          /^[\xB7]/,
          { type: "class", value: "[\\xB7]", description: "[\\xB7]" },
          /^[\u0300-\u036F]/,
          { type: "class", value: "[\\u0300-\\u036F]", description: "[\\u0300-\\u036F]" },
          /^[\u203F-\u2040]/,
          { type: "class", value: "[\\u203F-\\u2040]", description: "[\\u203F-\\u2040]" },
          function(init, rpart) { return init+rpart.join('') },
          { type: "other", description: "[150] PN_CHARS" },
          { type: "other", description: "[151] PN_PREFIX" },
          function(base, rest) { if(rest[rest.length-1] == '.'){
                                                            throw new Error("Wrong PN_PREFIX, cannot finish with '.'")
                                    } else {
                                    return base + rest.join('');
                                    }},
          { type: "other", description: "[152] PN_LOCAL" },
          function(base, rest) { 
                                                                 return base + rest.join('');
                                                               }
        ],

        peg$bytecode = [
          peg$decode("7!*# \"7'"),
          peg$decode("7\"*# \"7C"),
          peg$decode("87#9*\" 3 "),
          peg$decode("8!7$+E$7,*/ \"7/*) \"70*# \"71+)%4\"6#\"\"! %$\"# \"\"# \"9*\" 3!"),
          peg$decode("8!7%*# \" %+M$ &7\xB7,#&7\xB7\"+;% &7&,#&7&\"+)%4#6'#\"\" %$## \"$\"# \"\"# \"9*\" 3$"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\xB4$.)\"\"2)3**) \".+\"\"2+3,+\x98%.-\"\"2-3.*) \"./\"\"2/30+|%.1\"\"2132*) \".3\"\"2334+`%.5\"\"2536*) \".7\"\"2738+D% &7\xB7,#&7\xB7\"+2%7\xA0+(%4'69'! %$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3("),
          peg$decode("8! &7\xB7,#&7\xB7\"+\u0109$.;\"\"2;3<*) \".=\"\"2=3>+\xED%.?\"\"2?3@*) \".A\"\"2A3B+\xD1%.5\"\"2536*) \".7\"\"2738+\xB5%.C\"\"2C3D*) \".E\"\"2E3F+\x99%.G\"\"2G3H*) \".I\"\"2I3J+}%.K\"\"2K3L*) \".M\"\"2M3N+a% &7\xB7,#&7\xB7\"+O%7\xA1+E% &7\xB7,#&7\xB7\"+3%7\xA0+)%4+6O+\"\" %$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3:"),
          peg$decode("! &7(,#&7(\"+' 4!6P!! %"),
          peg$decode("! &7\xB7,#&7\xB7\"+f$7)+\\% &7\xB7,#&7\xB7\"+J%.Q\"\"2Q3R+:% &7\xB7,#&7\xB7\"+(%4%6S%!#%$%# \"$$# \"$## \"$\"# \"\"# \"*l \"! &7\xB7,#&7\xB7\"+D$7Z+:% &7\xB7,#&7\xB7\"+(%4#6T#!!%$## \"$\"# \"\"# \"*2 \" &7\xB7+&$,#&7\xB7\"\"\" \""),
          peg$decode("7+*# \"7*"),
          peg$decode("! &7\xB7,#&7\xB7\"+[$.U\"\"2U3V+K% &7\xB7+&$,#&7\xB7\"\"\" \"+2%7\xA0+(%4$69$! %$$# \"$## \"$\"# \"\"# \""),
          peg$decode("! &7\xB7,#&7\xB7\"+\x8E$.W\"\"2W3X+~% &7\xB7+&$,#&7\xB7\"\"\" \"+e%7\xBE*# \" %+U%.Y\"\"2Y3Z+E% &7\xB7,#&7\xB7\"+3%7\xA0+)%4'6O'\"# %$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \""),
          peg$decode("8!7.+\xA3$ &7\xB7,#&7\xB7\"+\x91% &72,#&72\"+% &7\xB7,#&7\xB7\"+m%76+c% &7\xB7,#&7\xB7\"+Q%77+G% &7\xB7,#&7\xB7\"+5%7A++%4)6\\)$(&$\"%$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3["),
          peg$decode("8!7.+7$76+-%77+#%'#%$## \"$\"# \"\"# \"9*\" 3]"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\u0521$.1\"\"2132*) \".3\"\"2334+\u0505%.5\"\"2536*) \".7\"\"2738+\u04E9%._\"\"2_3`*) \".a\"\"2a3b+\u04CD%.5\"\"2536*) \".7\"\"2738+\u04B1%.c\"\"2c3d*) \".e\"\"2e3f+\u0495%.g\"\"2g3h*) \".i\"\"2i3j+\u0479% &7\xB7,#&7\xB7\"+\u0467%!.k\"\"2k3l*) \".m\"\"2m3n+\xE7$.G\"\"2G3H*) \".I\"\"2I3J+\xCB%.1\"\"2132*) \".3\"\"2334+\xAF%.g\"\"2g3h*) \".i\"\"2i3j+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.o\"\"2o3p*) \".q\"\"2q3r+[%.c\"\"2c3d*) \".e\"\"2e3f+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\xE8 \"!.?\"\"2?3@*) \".A\"\"2A3B+\xCB$.5\"\"2536*) \".7\"\"2738+\xAF%.k\"\"2k3l*) \".m\"\"2m3n+\x93%.s\"\"2s3t*) \".u\"\"2u3v+w%.c\"\"2c3d*) \".e\"\"2e3f+[%.5\"\"2536*) \".7\"\"2738+?%.k\"\"2k3l*) \".m\"\"2m3n+#%''%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+\u02AB% &7\xB7,#&7\xB7\"+\u0299% &! &7\xB7,#&7\xB7\"+?$7\x83+5% &7\xB7,#&7\xB7\"+#%'#%$## \"$\"# \"\"# \"*\xFC \"! &7\xB7,#&7\xB7\"+\xE9$.w\"\"2w3x+\xD9% &7\xB7,#&7\xB7\"+\xC7%7\x85+\xBD% &7\xB7,#&7\xB7\"+\xAB%.-\"\"2-3.*) \"./\"\"2/30+\x8F%.1\"\"2132*) \".3\"\"2334+s% &7\xB7,#&7\xB7\"+a%7\x83+W% &7\xB7,#&7\xB7\"+E%.y\"\"2y3z+5% &7\xB7,#&7\xB7\"+#%',%$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"+\u0134$,\u0131&! &7\xB7,#&7\xB7\"+?$7\x83+5% &7\xB7,#&7\xB7\"+#%'#%$## \"$\"# \"\"# \"*\xFC \"! &7\xB7,#&7\xB7\"+\xE9$.w\"\"2w3x+\xD9% &7\xB7,#&7\xB7\"+\xC7%7\x85+\xBD% &7\xB7,#&7\xB7\"+\xAB%.-\"\"2-3.*) \"./\"\"2/30+\x8F%.1\"\"2132*) \".3\"\"2334+s% &7\xB7,#&7\xB7\"+a%7\x83+W% &7\xB7,#&7\xB7\"+E%.y\"\"2y3z+5% &7\xB7,#&7\xB7\"+#%',%$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"\"\"\" \"*X \"! &7\xB7,#&7\xB7\"+E$.{\"\"2{3|+5% &7\xB7,#&7\xB7\"+#%'#%$## \"$\"# \"\"# \"+)%4+6}+\"\" %$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3^"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\u019F$.c\"\"2c3d*) \".e\"\"2e3f+\u0183%.\"\"23\x80*) \".\x81\"\"2\x813\x82+\u0167%.o\"\"2o3p*) \".q\"\"2q3r+\u014B%.1\"\"2132*) \".3\"\"2334+\u012F%.g\"\"2g3h*) \".i\"\"2i3j+\u0113%.?\"\"2?3@*) \".A\"\"2A3B+\xF7%.s\"\"2s3t*) \".u\"\"2u3v+\xDB%.c\"\"2c3d*) \".e\"\"2e3f+\xBF%.g\"\"2g3h*) \".i\"\"2i3j+\xA3% &7\xB7,#&7\xB7\"+\x91%7f+\x87% &7\xB7,#&7\xB7\"+u% &72,#&72\"+c% &7\xB7,#&7\xB7\"+Q%76+G% &7\xB7,#&7\xB7\"+5%77++%426\x832$&$\" %$2# \"$1# \"$0# \"$/# \"$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3~"),
          peg$decode("8!.\x85\"\"2\x853\x86+t$ &7\x82+&$,#&7\x82\"\"\" \"*) \".{\"\"2{3|+O% &72,#&72\"+=%76*# \" %+-%77+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\x84"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\xBD$.-\"\"2-3.*) \"./\"\"2/30+\xA1%.1\"\"2132*) \".3\"\"2334+\x85%.\x88\"\"2\x883\x89*) \".\x8A\"\"2\x8A3\x8B+i% &7\xB7,#&7\xB7\"+W% &72,#&72\"+E% &7\xB7,#&7\xB7\"+3%76+)%4(6\x8C(\"\" %$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\x87"),
          peg$decode("8!.C\"\"2C3D*) \".E\"\"2E3F+\xB0$.?\"\"2?3@*) \".A\"\"2A3B+\x94%.\"\"23\x80*) \".\x81\"\"2\x813\x82+x%.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+\\% &7\xB7,#&7\xB7\"+J%73*# \"74+:% &7\xB7,#&7\xB7\"+(%4'6\x92'!!%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\x8D"),
          peg$decode("8! &7\xB7,#&7\xB7\"+2$75+(%4\"6\x94\"! %$\"# \"\"# \"9*\" 3\x93"),
          peg$decode("8!.o\"\"2o3p*) \".q\"\"2q3r+\xB4$.-\"\"2-3.*) \"./\"\"2/30+\x98%.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+|%.5\"\"2536*) \".7\"\"2738+`%.k\"\"2k3l*) \".m\"\"2m3n+D% &7\xB7,#&7\xB7\"+2%75+(%4'6\x96'! %$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\x95"),
          peg$decode("87\x9D9*\" 3\x97"),
          peg$decode("8!!.\x99\"\"2\x993\x9A*) \".\x9B\"\"2\x9B3\x9C+\x93$.\x9D\"\"2\x9D3\x9E*) \".\x9F\"\"2\x9F3\xA0+w%.5\"\"2536*) \".7\"\"2738+[%.?\"\"2?3@*) \".A\"\"2A3B+?%.5\"\"2536*) \".7\"\"2738+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+V$ &7\xB7,#&7\xB7\"+D%7X+:% &7\xB7,#&7\xB7\"+(%4$6\xA1$!!%$$# \"$## \"$\"# \"\"# \"9*\" 3\x98"),
          peg$decode("8!78*# \" %+Z$7:*# \" %+J%7<*# \" %+:%7>*# \" %+*%4$6\xA3$##! %$$# \"$## \"$\"# \"\"# \"9*\" 3\xA2"),
          peg$decode("8!.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\u010D$.?\"\"2?3@*) \".A\"\"2A3B+\xF1%.\"\"23\x80*) \".\x81\"\"2\x813\x82+\xD5%.s\"\"2s3t*) \".u\"\"2u3v+\xB9%.;\"\"2;3<*) \".=\"\"2=3>+\x9D% &7\xB7,#&7\xB7\"+\x8B%.)\"\"2)3**) \".+\"\"2+3,+o%.\xA9\"\"2\xA93\xAA*) \".\xAB\"\"2\xAB3\xAC+S% &7\xB7,#&7\xB7\"+A% &79+&$,#&79\"\"\" \"+(%4*6\xAD*! %$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xA4"),
          peg$decode("8! &7\xB7,#&7\xB7\"+D$7\x90+:% &7\xB7,#&7\xB7\"+(%4#6\xAF#!!%$## \"$\"# \"\"# \"*\u0187 \"! &7\xB7,#&7\xB7\"+D$7c+:% &7\xB7,#&7\xB7\"+(%4#6\xB0#!!%$## \"$\"# \"\"# \"*\u014D \"! &7\xB7,#&7\xB7\"+\u0100$.w\"\"2w3x+\xF0% &7\xB7,#&7\xB7\"+\xDE%7\x85+\xD4% &7\xB7,#&7\xB7\"+\xC2%!.-\"\"2-3.*) \"./\"\"2/30+[$.1\"\"2132*) \".3\"\"2334+?% &7\xB7,#&7\xB7\"+-%7\x83+#%'$%$$# \"$## \"$\"# \"\"# \"*# \" %+]% &7\xB7,#&7\xB7\"+K%.y\"\"2y3z+;% &7\xB7,#&7\xB7\"+)%4)6\xB1)\"%#%$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*W \"! &7\xB7,#&7\xB7\"+D$7\x83+:% &7\xB7,#&7\xB7\"+(%4#6\xB2#!!%$## \"$\"# \"\"# \"9*\" 3\xAE"),
          peg$decode("8!.\xB4\"\"2\xB43\xB5+<$ &7;+&$,#&7;\"\"\" \"+#%'\"%$\"# \"\"# \"9*\" 3\xB3"),
          peg$decode("87b9*\" 3\xB6"),
          peg$decode("8!.\"\"23\x80*) \".\x81\"\"2\x813\x82+\u011F$.?\"\"2?3@*) \".A\"\"2A3B+\u0103%.k\"\"2k3l*) \".m\"\"2m3n+\xE7%.5\"\"2536*) \".7\"\"2738+\xCB%.?\"\"2?3@*) \".A\"\"2A3B+\xAF% &7\xB7,#&7\xB7\"+\x9D%.)\"\"2)3**) \".+\"\"2+3,+\x81%.\xA9\"\"2\xA93\xAA*) \".\xAB\"\"2\xAB3\xAC+e% &7\xB7,#&7\xB7\"+S% &7=+&$,#&7=\"\"\" \"+:% &7\xB7,#&7\xB7\"+(%4+6\xB8+!!%$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xB7"),
          peg$decode("8!.\xBA\"\"2\xBA3\xBB*) \".\xBC\"\"2\xBC3\xBD+W$ &7\xB7,#&7\xB7\"+E%7\x8F+;% &7\xB7,#&7\xB7\"+)%4$6\xBE$\"#!%$$# \"$## \"$\"# \"\"# \"*K \"!7b*# \"7\x83+:$ &7\xB7,#&7\xB7\"+(%4\"6\xBF\"!!%$\"# \"\"# \"9*\" 3\xB9"),
          peg$decode("8!!7?+3$7@*# \" %+#%'\"%$\"# \"\"# \"*> \"!7@+3$7?*# \" %+#%'\"%$\"# \"\"# \"+' 4!6\xC1!! %9*\" 3\xC0"),
          peg$decode("8!._\"\"2_3`*) \".a\"\"2a3b+\xC6$.G\"\"2G3H*) \".I\"\"2I3J+\xAA%.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+\x8E%.G\"\"2G3H*) \".I\"\"2I3J+r%.g\"\"2g3h*) \".i\"\"2i3j+V% &7\xB7,#&7\xB7\"+D%7\xA7+:% &7\xB7,#&7\xB7\"+(%4(6\xC3(!!%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xC2"),
          peg$decode("8!.\"\"23\x80*) \".\x81\"\"2\x813\x82+\xE2$.C\"\"2C3D*) \".E\"\"2E3F+\xC6%.C\"\"2C3D*) \".E\"\"2E3F+\xAA%.1\"\"2132*) \".3\"\"2334+\x8E%.5\"\"2536*) \".7\"\"2738+r%.g\"\"2g3h*) \".i\"\"2i3j+V% &7\xB7,#&7\xB7\"+D%7\xA7+:% &7\xB7,#&7\xB7\"+(%4)6\xC5)!!%$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xC4"),
          peg$decode("8!.\xC7\"\"2\xC73\xC8+\xE7$ &7\x83,#&7\x83\"+\xD5%.\xC9\"\"2\xC93\xCA+\xC5% &!.w\"\"2w3x+L$ &7B+&$,#&7B\"\"\" \"+3%.y\"\"2y3z+#%'#%$## \"$\"# \"\"# \"*# \"7\xB6,c&!.w\"\"2w3x+L$ &7B+&$,#&7B\"\"\" \"+3%.y\"\"2y3z+#%'#%$## \"$\"# \"\"# \"*# \"7\xB6\"+3%.\xCB\"\"2\xCB3\xCC+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %9*\" 3\xC6"),
          peg$decode("87\x9D*; \"7\x96*5 \"7\x97*/ \"7\x9B*) \".\xCE\"\"2\xCE3\xCF9*\" 3\xCD"),
          peg$decode("87D9*\" 3\xD0"),
          peg$decode("8!7$+\x9B$ &7\xB7,#&7\xB7\"+\x89%7E+%! &7\xB7,#&7\xB7\"+U$.\xD2\"\"2\xD23\xD3+E% &7\xB7,#&7\xB7\"+3%7D*# \" %+#%'$%$$# \"$## \"$\"# \"\"# \"*# \" %+*%4$6\xD4$##! %$$# \"$## \"$\"# \"\"# \"9*\" 3\xD1"),
          peg$decode("87F*G \"7G*A \"7H*; \"7I*5 \"7J*/ \"7K*) \"7L*# \"7M9*\" 3\xD5"),
          peg$decode("8!._\"\"2_3`*) \".a\"\"2a3b+\u0148$.\"\"23\x80*) \".\x81\"\"2\x813\x82+\u012C%.-\"\"2-3.*) \"./\"\"2/30+\u0110%.k\"\"2k3l*) \".m\"\"2m3n+\xF4% &7\xB7,#&7\xB7\"+\xE2%7\x9D+\xD8% &7\xB7,#&7\xB7\"+\xC6%!.G\"\"2G3H*) \".I\"\"2I3J+\x93$.o\"\"2o3p*) \".q\"\"2q3r+w%.g\"\"2g3h*) \".i\"\"2i3j+[%.\"\"23\x80*) \".\x81\"\"2\x813\x82+?% &7\xB7,#&7\xB7\"+-%7Q+#%'&%$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+)%4(6\xD7(\"\" %$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xD6"),
          peg$decode("8!.c\"\"2c3d*) \".e\"\"2e3f+\u017F$._\"\"2_3`*) \".a\"\"2a3b+\u0163%.5\"\"2536*) \".7\"\"2738+\u0147%.-\"\"2-3.*) \"./\"\"2/30+\u012B%.?\"\"2?3@*) \".A\"\"2A3B+\u010F% &7\xB7,#&7\xB7\"+\xFD%!.1\"\"2132*) \".3\"\"2334+\xAF$.G\"\"2G3H*) \".I\"\"2I3J+\x93%._\"\"2_3`*) \".a\"\"2a3b+w%.5\"\"2536*) \".7\"\"2738+[%.o\"\"2o3p*) \".q\"\"2q3r+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'&%$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+D% &7\xB7,#&7\xB7\"+2%7R+(%4)6\xD9)! %$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xD8"),
          peg$decode("8!.k\"\"2k3l*) \".m\"\"2m3n+\u0163$.?\"\"2?3@*) \".A\"\"2A3B+\u0147%.\"\"23\x80*) \".\x81\"\"2\x813\x82+\u012B%.;\"\"2;3<*) \".=\"\"2=3>+\u010F% &7\xB7,#&7\xB7\"+\xFD%!.1\"\"2132*) \".3\"\"2334+\xAF$.G\"\"2G3H*) \".I\"\"2I3J+\x93%._\"\"2_3`*) \".a\"\"2a3b+w%.5\"\"2536*) \".7\"\"2738+[%.o\"\"2o3p*) \".q\"\"2q3r+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'&%$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+D% &7\xB7,#&7\xB7\"+2%7R+(%4(6\xDB(! %$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xDA"),
          peg$decode("8!.c\"\"2c3d*) \".e\"\"2e3f+\u019B$.?\"\"2?3@*) \".A\"\"2A3B+\u017F%.5\"\"2536*) \".7\"\"2738+\u0163%.-\"\"2-3.*) \"./\"\"2/30+\u0147%.g\"\"2g3h*) \".i\"\"2i3j+\u012B%.5\"\"2536*) \".7\"\"2738+\u010F% &7\xB7,#&7\xB7\"+\xFD%!.1\"\"2132*) \".3\"\"2334+\xAF$.G\"\"2G3H*) \".I\"\"2I3J+\x93%._\"\"2_3`*) \".a\"\"2a3b+w%.5\"\"2536*) \".7\"\"2738+[%.o\"\"2o3p*) \".q\"\"2q3r+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'&%$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+D% &7\xB7,#&7\xB7\"+2%7Q+(%4*6\xDD*! %$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xDC"),
          peg$decode("8!.G\"\"2G3H*) \".I\"\"2I3J+\u0152$.o\"\"2o3p*) \".q\"\"2q3r+\u0136%.1\"\"2132*) \".3\"\"2334+\u011A%.5\"\"2536*) \".7\"\"2738+\xFE%.?\"\"2?3@*) \".A\"\"2A3B+\xE2%.g\"\"2g3h*) \".i\"\"2i3j+\xC6% &7\xB7,#&7\xB7\"+\xB4%.k\"\"2k3l*) \".m\"\"2m3n+\x98%.-\"\"2-3.*) \"./\"\"2/30+|%.g\"\"2g3h*) \".i\"\"2i3j+`%.-\"\"2-3.*) \"./\"\"2/30+D% &7\xB7,#&7\xB7\"+2%7T+(%4-6\xDF-! %$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xDE"),
          peg$decode("8!.k\"\"2k3l*) \".m\"\"2m3n+\u0140$.5\"\"2536*) \".7\"\"2738+\u0124%._\"\"2_3`*) \".a\"\"2a3b+\u0108%.5\"\"2536*) \".7\"\"2738+\xEC%.g\"\"2g3h*) \".i\"\"2i3j+\xD0%.5\"\"2536*) \".7\"\"2738+\xB4% &7\xB7,#&7\xB7\"+\xA2%.k\"\"2k3l*) \".m\"\"2m3n+\x86%.-\"\"2-3.*) \"./\"\"2/30+j%.g\"\"2g3h*) \".i\"\"2i3j+N%.-\"\"2-3.*) \"./\"\"2/30+2%7T+(%4,6\xE1,! %$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xE0"),
          peg$decode("8!.k\"\"2k3l*) \".m\"\"2m3n+\u016E$.5\"\"2536*) \".7\"\"2738+\u0152%._\"\"2_3`*) \".a\"\"2a3b+\u0136%.5\"\"2536*) \".7\"\"2738+\u011A%.g\"\"2g3h*) \".i\"\"2i3j+\xFE%.5\"\"2536*) \".7\"\"2738+\xE2% &7\xB7,#&7\xB7\"+\xD0%.\x99\"\"2\x993\x9A*) \".\x9B\"\"2\x9B3\x9C+\xB4%.\x9D\"\"2\x9D3\x9E*) \".\x9F\"\"2\x9F3\xA0+\x98%.5\"\"2536*) \".7\"\"2738+|%.?\"\"2?3@*) \".A\"\"2A3B+`%.5\"\"2536*) \".7\"\"2738+D% &7\xB7,#&7\xB7\"+2%7X+(%4.6\xE3.! %$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xE2"),
          peg$decode("8!!.\x99\"\"2\x993\x9A*) \".\x9B\"\"2\x9B3\x9C+\x93$.G\"\"2G3H*) \".I\"\"2I3J+w%.g\"\"2g3h*) \".i\"\"2i3j+[%.\x9D\"\"2\x9D3\x9E*) \".\x9F\"\"2\x9F3\xA0+?% &7\xB7,#&7\xB7\"+-%7\x9D+#%'&%$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+\u016A$ &7\xB7,#&7\xB7\"+\u0158%!7N+E$ &7\xB7,#&7\xB7\"+3%7O*# \" %+#%'#%$## \"$\"# \"\"# \"*# \"7O+\u011B% &7\xB7,#&7\xB7\"+\u0109% &7P,#&7P\"+\xF7% &7\xB7,#&7\xB7\"+\xE5%.\x99\"\"2\x993\x9A*) \".\x9B\"\"2\x9B3\x9C+\xC9%.\x9D\"\"2\x9D3\x9E*) \".\x9F\"\"2\x9F3\xA0+\xAD%.5\"\"2536*) \".7\"\"2738+\x91%.?\"\"2?3@*) \".A\"\"2A3B+u%.5\"\"2536*) \".7\"\"2738+Y% &7\xB7,#&7\xB7\"+G%7X+=% &7\xB7,#&7\xB7\"++%4.6\xE5.$-+)!%$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xE4"),
          peg$decode("8!.k\"\"2k3l*) \".m\"\"2m3n+\xBE$.5\"\"2536*) \".7\"\"2738+\xA2%._\"\"2_3`*) \".a\"\"2a3b+\x86%.5\"\"2536*) \".7\"\"2738+j%.g\"\"2g3h*) \".i\"\"2i3j+N%.5\"\"2536*) \".7\"\"2738+2%7S+(%4'6\xE7'! %$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xE6"),
          peg$decode("8!.G\"\"2G3H*) \".I\"\"2I3J+\xBE$.o\"\"2o3p*) \".q\"\"2q3r+\xA2%.1\"\"2132*) \".3\"\"2334+\x86%.5\"\"2536*) \".7\"\"2738+j%.?\"\"2?3@*) \".A\"\"2A3B+N%.g\"\"2g3h*) \".i\"\"2i3j+2%7S+(%4'6\xE9'! %$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xE8"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\u017F$.s\"\"2s3t*) \".u\"\"2u3v+\u0163%.1\"\"2132*) \".3\"\"2334+\u0147%.G\"\"2G3H*) \".I\"\"2I3J+\u012B%.o\"\"2o3p*) \".q\"\"2q3r+\u010F%.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\xF3% &7\xB7,#&7\xB7\"+\xE1%7\x9D*\xCC \"!.o\"\"2o3p*) \".q\"\"2q3r+\xAF$.-\"\"2-3.*) \"./\"\"2/30+\x93%.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+w%.5\"\"2536*) \".7\"\"2738+[%.k\"\"2k3l*) \".m\"\"2m3n+?% &7\xB7,#&7\xB7\"+-%7\x9D+#%''%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"+(%4(6\xEB(! %$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xEA"),
          peg$decode("8!.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\xB4$.?\"\"2?3@*) \".A\"\"2A3B+\x98%.-\"\"2-3.*) \"./\"\"2/30+|%.;\"\"2;3<*) \".=\"\"2=3>+`%.\x9D\"\"2\x9D3\x9E*) \".\x9F\"\"2\x9F3\xA0+D% &7\xB7,#&7\xB7\"+2%7\x9D+(%4'6\xED'! %$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xEC"),
          peg$decode("8!7Q+' 4!6\xA1!! %*\u01E2 \"!.k\"\"2k3l*) \".m\"\"2m3n+\xCF$.5\"\"2536*) \".7\"\"2738+\xB3%.C\"\"2C3D*) \".E\"\"2E3F+\x97%.-\"\"2-3.*) \"./\"\"2/30+{%.s\"\"2s3t*) \".u\"\"2u3v+_%._\"\"2_3`*) \".a\"\"2a3b+C%.g\"\"2g3h*) \".i\"\"2i3j+'%4'6\xEF' %$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0113 \"!.o\"\"2o3p*) \".q\"\"2q3r+\x97$.-\"\"2-3.*) \"./\"\"2/30+{%.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+_%.5\"\"2536*) \".7\"\"2738+C%.k\"\"2k3l*) \".m\"\"2m3n+'%4%6\xF0% %$%# \"$$# \"$## \"$\"# \"\"# \"*| \"!.-\"\"2-3.*) \"./\"\"2/30+_$._\"\"2_3`*) \".a\"\"2a3b+C%._\"\"2_3`*) \".a\"\"2a3b+'%4#6\xF1# %$## \"$\"# \"\"# \"9*\" 3\xEE"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\x88$.\xC9\"\"2\xC93\xCA+x% &7\xB7,#&7\xB7\"+f%7U+\\% &7\xB7,#&7\xB7\"+J%.\xCB\"\"2\xCB3\xCC+:% &7\xB7,#&7\xB7\"+(%4'6\xF3'!#%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xF2"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\x88$.\xC9\"\"2\xC93\xCA+x% &7\xB7,#&7\xB7\"+f%7U+\\% &7\xB7,#&7\xB7\"+J%.\xCB\"\"2\xCB3\xCC+:% &7\xB7,#&7\xB7\"+(%4'6\xF3'!#%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xF4"),
          peg$decode("8!7W*# \" %+\x9D$ &!7V+I$.Q\"\"2Q3R*# \" %+3%7W*# \" %+#%'#%$## \"$\"# \"\"# \",T&!7V+I$.Q\"\"2Q3R*# \" %+3%7W*# \" %+#%'#%$## \"$\"# \"\"# \"\"+)%4\"6\xF6\"\"! %$\"# \"\"# \"9*\" 3\xF5"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\u0149$.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\u012D%.?\"\"2?3@*) \".A\"\"2A3B+\u0111%.-\"\"2-3.*) \"./\"\"2/30+\xF5%.;\"\"2;3<*) \".=\"\"2=3>+\xD9%.\x9D\"\"2\x9D3\x9E*) \".\x9F\"\"2\x9F3\xA0+\xBD% &7\xB7,#&7\xB7\"+\xAB%7\x82+\xA1% &7\xB7,#&7\xB7\"+\x8F%.\xC9\"\"2\xC93\xCA+% &7\xB7,#&7\xB7\"+m%7W*# \" %+]% &7\xB7,#&7\xB7\"+K%.\xCB\"\"2\xCB3\xCC+;% &7\xB7,#&7\xB7\"+)%4/6\xF8/\"'#%$/# \"$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xF7"),
          peg$decode("8!7h+~$! &7\xB7,#&7\xB7\"+U$.Q\"\"2Q3R+E% &7\xB7,#&7\xB7\"+3%7W*# \" %+#%'$%$$# \"$## \"$\"# \"\"# \"*# \" %+)%4\"6\xFA\"\"! %$\"# \"\"# \"9*\" 3\xF9"),
          peg$decode("8!.\xC9\"\"2\xC93\xCA+f$ &7\xB7,#&7\xB7\"+T%7-+J% &7\xB7,#&7\xB7\"+8%.\xCB\"\"2\xCB3\xCC+(%4%6\xFC%!\"%$%# \"$$# \"$## \"$\"# \"\"# \"*w \"!.\xC9\"\"2\xC93\xCA+f$ &7\xB7,#&7\xB7\"+T%7Y+J% &7\xB7,#&7\xB7\"+8%.\xCB\"\"2\xCB3\xCC+(%4%6\xFC%!\"%$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\xFB"),
          peg$decode("8!7Z*# \" %+\xF7$ &7\xB7,#&7\xB7\"+\xE5% &!7[+m$ &7\xB7,#&7\xB7\"+[%.Q\"\"2Q3R*# \" %+E% &7\xB7,#&7\xB7\"+3%7Z*# \" %+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \",x&!7[+m$ &7\xB7,#&7\xB7\"+[%.Q\"\"2Q3R*# \" %+E% &7\xB7,#&7\xB7\"+3%7Z*# \" %+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \"\"+)%4#6\xFE#\"\" %$## \"$\"# \"\"# \"9*\" 3\xFD"),
          peg$decode("8!7n+l$! &7\xB7,#&7\xB7\"+C$.Q\"\"2Q3R+3%7Z*# \" %+#%'#%$## \"$\"# \"\"# \"*# \" %+)%4\"6\u0100\"\"! %$\"# \"\"# \"9*\" 3\xFF"),
          peg$decode("87`*; \"7\\*5 \"7_*/ \"7]*) \"7^*# \"7a9*\" 3\u0101"),
          peg$decode("8! &7\xB7,#&7\xB7\"+T$.\u0103\"\"2\u01033\u0104+D% &7\xB7,#&7\xB7\"+2%7X+(%4$6\u0105$! %$$# \"$## \"$\"# \"\"# \"9*\" 3\u0102"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\xED$.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\xD1%.?\"\"2?3@*) \".A\"\"2A3B+\xB5%.-\"\"2-3.*) \"./\"\"2/30+\x99%.;\"\"2;3<*) \".=\"\"2=3>+}%.\x9D\"\"2\x9D3\x9E*) \".\x9F\"\"2\x9F3\xA0+a% &7\xB7,#&7\xB7\"+O%7\x82+E% &7\xB7,#&7\xB7\"+3%7X+)%4*6\u0107*\"\" %$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u0106"),
          peg$decode("8!.\u0109\"\"2\u01093\u010A+=$7\x82+3%7X+)%4#6\u010B#\"! %$## \"$\"# \"\"# \"9*\" 3\u0108"),
          peg$decode("8!.\u010D\"\"2\u010D3\u010E+2$7X+(%4\"6\u010F\"! %$\"# \"\"# \"9*\" 3\u010C"),
          peg$decode("8!7X+\u01B1$ &! &7\xB7,#&7\xB7\"+\xCB$.s\"\"2s3t*) \".u\"\"2u3v+\xAF%.o\"\"2o3p*) \".q\"\"2q3r+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.\"\"23\x80*) \".\x81\"\"2\x813\x82+[%.o\"\"2o3p*) \".q\"\"2q3r+?% &7\xB7,#&7\xB7\"+-%7X+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \",\xDE&! &7\xB7,#&7\xB7\"+\xCB$.s\"\"2s3t*) \".u\"\"2u3v+\xAF%.o\"\"2o3p*) \".q\"\"2q3r+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.\"\"23\x80*) \".\x81\"\"2\x813\x82+[%.o\"\"2o3p*) \".q\"\"2q3r+?% &7\xB7,#&7\xB7\"+-%7X+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"\"+)%4\"6\u0111\"\"! %$\"# \"\"# \"9*\" 3\u0110"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\xEC$.C\"\"2C3D*) \".E\"\"2E3F+\xD0%.G\"\"2G3H*) \".I\"\"2I3J+\xB4%._\"\"2_3`*) \".a\"\"2a3b+\x98%.g\"\"2g3h*) \".i\"\"2i3j+|%.5\"\"2536*) \".7\"\"2738+`%.?\"\"2?3@*) \".A\"\"2A3B+D% &7\xB7,#&7\xB7\"+2%7b+(%4)6\u0113)! %$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u0112"),
          peg$decode("87\x8F*) \"7\x90*# \"7c9*\" 3\u0114"),
          peg$decode("8!7\x9D+3$7d+)%4\"6\u0116\"\"! %$\"# \"\"# \"9*\" 3\u0115"),
          peg$decode("8!7\xB6+& 4!6\u0118! %*\xB3 \"!.w\"\"2w3x+\xA2$.\u0119\"\"2\u01193\u011A*# \" %+\x8C%7\x85+\x82% &!.\u011B\"\"2\u011B3\u011C+-$7\x85+#%'\"%$\"# \"\"# \",>&!.\u011B\"\"2\u011B3\u011C+-$7\x85+#%'\"%$\"# \"\"# \"\"+:%.y\"\"2y3z+*%4%6\u011D%##\"!%$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u0117"),
          peg$decode("8!7\xB6+& 4!6\u0118! %*\x9C \"!.w\"\"2w3x+\x8B$7\x85+\x81% &!.\u011B\"\"2\u011B3\u011C+-$7\x85+#%'\"%$\"# \"\"# \",>&!.\u011B\"\"2\u011B3\u011C+-$7\x85+#%'\"%$\"# \"\"# \"\"+9%.y\"\"2y3z+)%4$6\u011F$\"\"!%$$# \"$## \"$\"# \"\"# \"9*\" 3\u011E"),
          peg$decode("8!.\xC9\"\"2\xC93\xCA+l$ &7\xB7,#&7\xB7\"+Z%7g*# \" %+J% &7\xB7,#&7\xB7\"+8%.\xCB\"\"2\xCB3\xCC+(%4%6\u0121%!\"%$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u0120"),
          peg$decode("8!7h+~$! &7\xB7,#&7\xB7\"+U$.Q\"\"2Q3R+E% &7\xB7,#&7\xB7\"+3%7g*# \" %+#%'$%$$# \"$## \"$\"# \"\"# \"*# \" %+)%4\"6\xFA\"\"! %$\"# \"\"# \"9*\" 3\u0122"),
          peg$decode("8! &7\xB7,#&7\xB7\"+O$7\x81+E% &7\xB7,#&7\xB7\"+3%7i+)%4$6\u0124$\"\" %$$# \"$## \"$\"# \"\"# \"*b \"! &7\xB7,#&7\xB7\"+O$7}+E% &7\xB7,#&7\xB7\"+3%7j+)%4$6\u0125$\"\" %$$# \"$## \"$\"# \"\"# \"9*\" 3\u0123"),
          peg$decode("8!7m+\u0130$ &7\xB7,#&7\xB7\"+\u011E%7k+\u0114% &! &7\xB7,#&7\xB7\"+|$.\xD2\"\"2\xD23\xD3+l% &7\xB7,#&7\xB7\"+Z%!7m+?$ &7\xB7,#&7\xB7\"+-%7k+#%'#%$## \"$\"# \"\"# \"*# \" %+#%'$%$$# \"$## \"$\"# \"\"# \",\x8F&! &7\xB7,#&7\xB7\"+|$.\xD2\"\"2\xD23\xD3+l% &7\xB7,#&7\xB7\"+Z%!7m+?$ &7\xB7,#&7\xB7\"+-%7k+#%'#%$## \"$\"# \"\"# \"*# \" %+#%'$%$$# \"$## \"$\"# \"\"# \"\"+*%4$6\u0127$##! %$$# \"$## \"$\"# \"\"# \"9*\" 3\u0126"),
          peg$decode("87i*# \" %9*\" 3\u0128"),
          peg$decode("8!7l+\xA7$ &7\xB7,#&7\xB7\"+\x95% &!.\u011B\"\"2\u011B3\u011C+?$ &7\xB7,#&7\xB7\"+-%7l+#%'#%$## \"$\"# \"\"# \",P&!.\u011B\"\"2\u011B3\u011C+?$ &7\xB7,#&7\xB7\"+-%7l+#%'#%$## \"$\"# \"\"# \"\"+)%4#6\u012A#\"\" %$## \"$\"# \"\"# \"9*\" 3\u0129"),
          peg$decode("87\x809*\" 3\u012B"),
          peg$decode("87\x82*4 \"!./\"\"2/30+& 4!6\u012D! %9*\" 3\u012C"),
          peg$decode("8! &7\xB7,#&7\xB7\"+O$7\x81+E% &7\xB7,#&7\xB7\"+3%7o+)%4$6\u0124$\"\" %$$# \"$## \"$\"# \"\"# \"*b \"! &7\xB7,#&7\xB7\"+O$7}+E% &7\xB7,#&7\xB7\"+3%7p+)%4$6\u012F$\"\" %$$# \"$## \"$\"# \"\"# \"9*\" 3\u012E"),
          peg$decode("8!7q*# \"7r+\u0118$ &7\xB7,#&7\xB7\"+\u0106%7k+\xFC% &! &7\xB7,#&7\xB7\"+p$.\xD2\"\"2\xD23\xD3+`% &7\xB7,#&7\xB7\"+N%!7q*# \"7r+-$7k+#%'\"%$\"# \"\"# \"*# \" %+#%'$%$$# \"$## \"$\"# \"\"# \",\x83&! &7\xB7,#&7\xB7\"+p$.\xD2\"\"2\xD23\xD3+`% &7\xB7,#&7\xB7\"+N%!7q*# \"7r+-$7k+#%'\"%$\"# \"\"# \"*# \" %+#%'$%$$# \"$## \"$\"# \"\"# \"\"+*%4$6\u0131$##! %$$# \"$## \"$\"# \"\"# \"9*\" 3\u0130"),
          peg$decode("87i*# \" %9*\" 3\u0132"),
          peg$decode("8!7s+' 4!6\u0134!! %9*\" 3\u0133"),
          peg$decode("87\x839*\" 3\u0135"),
          peg$decode("87t9*\" 3\u0136"),
          peg$decode("8!7u+q$ &!.\u0138\"\"2\u01383\u0139+-$7u+#%'\"%$\"# \"\"# \",>&!.\u0138\"\"2\u01383\u0139+-$7u+#%'\"%$\"# \"\"# \"\"+)%4\"6\u013A\"\"! %$\"# \"\"# \"9*\" 3\u0137"),
          peg$decode("8!7w+q$ &!.\u013C\"\"2\u013C3\u013D+-$7w+#%'\"%$\"# \"\"# \",>&!.\u013C\"\"2\u013C3\u013D+-$7w+#%'\"%$\"# \"\"# \"\"+)%4\"6\u013E\"\"! %$\"# \"\"# \"9*\" 3\u013B"),
          peg$decode("8!7y+9$7x*# \" %+)%4\"6\u0140\"\"! %$\"# \"\"# \"9*\" 3\u013F"),
          peg$decode("87v*C \"!.\u0142\"\"2\u01423\u0143+2$7v+(%4\"6\u0144\"! %$\"# \"\"# \"9*\" 3\u0141"),
          peg$decode("8.{\"\"2{3|*\xEA \".\u0146\"\"2\u01463\u0147*\xDE \".\u0148\"\"2\u01483\u0149*\xD2 \"!.\xC9\"\"2\xC93\xCA+\xC1$!7|+{$!.\u011B\"\"2\u011B3\u011C+T$.\xCB\"\"2\xCB3\xCC*> \"!7|+3$.\xCB\"\"2\xCB3\xCC+#%'\"%$\"# \"\"# \"+#%'\"%$\"# \"\"# \"*) \".\xCB\"\"2\xCB3\xCC+#%'\"%$\"# \"\"# \"*N \"!.\u011B\"\"2\u011B3\u011C+=$7|+3%.\xCB\"\"2\xCB3\xCC+#%'#%$## \"$\"# \"\"# \"+#%'\"%$\"# \"\"# \"9*\" 3\u0145"),
          peg$decode("87\x9D*\x8B \"!./\"\"2/30+& 4!6\u014B! %*t \"!.\u014C\"\"2\u014C3\u014D+-$7z+#%'\"%$\"# \"\"# \"*S \"!.w\"\"2w3x+B$7s+8%.y\"\"2y3z+(%4#6\u014E#!!%$## \"$\"# \"\"# \"9*\" 3\u014A"),
          peg$decode("7{*\xA7 \"!.w\"\"2w3x+\x96$!7{+k$ &!.\u0138\"\"2\u01383\u0139+-$7{+#%'\"%$\"# \"\"# \",>&!.\u0138\"\"2\u01383\u0139+-$7{+#%'\"%$\"# \"\"# \"\"+#%'\"%$\"# \"\"# \"*# \" %+3%.y\"\"2y3z+#%'#%$## \"$\"# \"\"# \""),
          peg$decode("87\x9D*V \"./\"\"2/30*J \"!.\u0142\"\"2\u01423\u0143+9$7\x9D*) \"./\"\"2/30+#%'\"%$\"# \"\"# \"9*\" 3\u014F"),
          peg$decode("87\xA79*\" 3\u0150"),
          peg$decode("8!7+' 4!6\u0152!! %*# \"7~9*\" 3\u0151"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\x88$.\u0154\"\"2\u01543\u0155+x% &7\xB7,#&7\xB7\"+f%7i+\\% &7\xB7,#&7\xB7\"+J%.\u0156\"\"2\u01563\u0157+:% &7\xB7,#&7\xB7\"+(%4'6\u0158'!#%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u0153"),
          peg$decode("8! &7\xB7,#&7\xB7\"+\x97$.w\"\"2w3x+\x87% &7\xB7,#&7\xB7\"+u% &7\x80+&$,#&7\x80\"\"\" \"+\\% &7\xB7,#&7\xB7\"+J%.y\"\"2y3z+:% &7\xB7,#&7\xB7\"+(%4'6\u015A'!#%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u0159"),
          peg$decode("8!! &7\xB7,#&7\xB7\"+?$7\x81+5% &7\xB7,#&7\xB7\"+#%'#%$## \"$\"# \"\"# \"*R \"! &7\xB7,#&7\xB7\"+?$7}+5% &7\xB7,#&7\xB7\"+#%'#%$## \"$\"# \"\"# \"+' 4!6\u015C!! %9*\" 3\u015B"),
          peg$decode("87\x83*# \"7\x849*\" 3\u015D"),
          peg$decode("87\x83*# \"7\x9D9*\" 3\u015E"),
          peg$decode("8!7\xA4*# \"7\xA5+' 4!6\u0160!! %9*\" 3\u015F"),
          peg$decode("87\x9D*; \"7\x96*5 \"7\x97*/ \"7\x9B*) \"7\x9F*# \"7\xB69*\" 3\u0161"),
          peg$decode("87\x869*\" 3\u0162"),
          peg$decode("8!7\x87+\xB9$ &! &7\xB7,#&7\xB7\"+O$.\u0164\"\"2\u01643\u0165+?% &7\xB7,#&7\xB7\"+-%7\x87+#%'$%$$# \"$## \"$\"# \"\"# \",b&! &7\xB7,#&7\xB7\"+O$.\u0164\"\"2\u01643\u0165+?% &7\xB7,#&7\xB7\"+-%7\x87+#%'$%$$# \"$## \"$\"# \"\"# \"\"+)%4\"6\u0166\"\"! %$\"# \"\"# \"9*\" 3\u0163"),
          peg$decode("8!7\x88+\xB9$ &! &7\xB7,#&7\xB7\"+O$.\u0168\"\"2\u01683\u0169+?% &7\xB7,#&7\xB7\"+-%7\x88+#%'$%$$# \"$## \"$\"# \"\"# \",b&! &7\xB7,#&7\xB7\"+O$.\u0168\"\"2\u01683\u0169+?% &7\xB7,#&7\xB7\"+-%7\x88+#%'$%$$# \"$## \"$\"# \"\"# \"\"+)%4\"6\u016A\"\"! %$\"# \"\"# \"9*\" 3\u0167"),
          peg$decode("87\x899*\" 3\u016B"),
          peg$decode("8!7\x8A+\u05EB$ &! &7\xB7,#&7\xB7\"+O$.\u016D\"\"2\u016D3\u016E+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u02B6 \"! &7\xB7,#&7\xB7\"+O$.\u016F\"\"2\u016F3\u0170+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u0271 \"! &7\xB7,#&7\xB7\"+O$.\u0171\"\"2\u01713\u0172+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u022C \"! &7\xB7,#&7\xB7\"+O$.\u0173\"\"2\u01733\u0174+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u01E7 \"! &7\xB7,#&7\xB7\"+O$.\u0175\"\"2\u01753\u0176+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u01A2 \"! &7\xB7,#&7\xB7\"+O$.\u0177\"\"2\u01773\u0178+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u015D \"! &7\xB7,#&7\xB7\"+w$.G\"\"2G3H*) \".I\"\"2I3J+[%.o\"\"2o3p*) \".q\"\"2q3r+?% &7\xB7,#&7\xB7\"+-%7e+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \"*\xF0 \"! &7\xB7,#&7\xB7\"+\xDD$.o\"\"2o3p*) \".q\"\"2q3r+\xC1%.\"\"23\x80*) \".\x81\"\"2\x813\x82+\xA5%.g\"\"2g3h*) \".i\"\"2i3j+\x89% &7\xB7,#&7\xB7\"+w%.G\"\"2G3H*) \".I\"\"2I3J+[%.o\"\"2o3p*) \".q\"\"2q3r+?% &7\xB7,#&7\xB7\"+-%7e+#%')%$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \",\u02FB&! &7\xB7,#&7\xB7\"+O$.\u016D\"\"2\u016D3\u016E+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u02B6 \"! &7\xB7,#&7\xB7\"+O$.\u016F\"\"2\u016F3\u0170+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u0271 \"! &7\xB7,#&7\xB7\"+O$.\u0171\"\"2\u01713\u0172+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u022C \"! &7\xB7,#&7\xB7\"+O$.\u0173\"\"2\u01733\u0174+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u01E7 \"! &7\xB7,#&7\xB7\"+O$.\u0175\"\"2\u01753\u0176+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u01A2 \"! &7\xB7,#&7\xB7\"+O$.\u0177\"\"2\u01773\u0178+?% &7\xB7,#&7\xB7\"+-%7\x8A+#%'$%$$# \"$## \"$\"# \"\"# \"*\u015D \"! &7\xB7,#&7\xB7\"+w$.G\"\"2G3H*) \".I\"\"2I3J+[%.o\"\"2o3p*) \".q\"\"2q3r+?% &7\xB7,#&7\xB7\"+-%7e+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \"*\xF0 \"! &7\xB7,#&7\xB7\"+\xDD$.o\"\"2o3p*) \".q\"\"2q3r+\xC1%.\"\"23\x80*) \".\x81\"\"2\x813\x82+\xA5%.g\"\"2g3h*) \".i\"\"2i3j+\x89% &7\xB7,#&7\xB7\"+w%.G\"\"2G3H*) \".I\"\"2I3J+[%.o\"\"2o3p*) \".q\"\"2q3r+?% &7\xB7,#&7\xB7\"+-%7e+#%')%$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"\"+)%4\"6\u0179\"\"! %$\"# \"\"# \"9*\" 3\u016C"),
          peg$decode("87\x8B9*\" 3\u017A"),
          peg$decode("8!7\x8C+\u0299$ &! &7\xB7,#&7\xB7\"+O$.\u0148\"\"2\u01483\u0149+?% &7\xB7,#&7\xB7\"+-%7\x8C+#%'$%$$# \"$## \"$\"# \"\"# \"*\u010D \"! &7\xB7,#&7\xB7\"+O$.\u017C\"\"2\u017C3\u017D+?% &7\xB7,#&7\xB7\"+-%7\x8C+#%'$%$$# \"$## \"$\"# \"\"# \"*\xC8 \"!7\x9A*# \"7\x9A+\xB7$! &7\xB7,#&7\xB7\"+O$.{\"\"2{3|+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \"*b \"! &7\xB7,#&7\xB7\"+O$.\u013C\"\"2\u013C3\u013D+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \"*# \" %+#%'\"%$\"# \"\"# \",\u0152&! &7\xB7,#&7\xB7\"+O$.\u0148\"\"2\u01483\u0149+?% &7\xB7,#&7\xB7\"+-%7\x8C+#%'$%$$# \"$## \"$\"# \"\"# \"*\u010D \"! &7\xB7,#&7\xB7\"+O$.\u017C\"\"2\u017C3\u017D+?% &7\xB7,#&7\xB7\"+-%7\x8C+#%'$%$$# \"$## \"$\"# \"\"# \"*\xC8 \"!7\x9A*# \"7\x9A+\xB7$! &7\xB7,#&7\xB7\"+O$.{\"\"2{3|+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \"*b \"! &7\xB7,#&7\xB7\"+O$.\u013C\"\"2\u013C3\u013D+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \"*# \" %+#%'\"%$\"# \"\"# \"\"+)%4\"6\u017E\"\"! %$\"# \"\"# \"9*\" 3\u017B"),
          peg$decode("8!7\x8D+\u0143$ &! &7\xB7,#&7\xB7\"+O$.{\"\"2{3|+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \"*b \"! &7\xB7,#&7\xB7\"+O$.\u013C\"\"2\u013C3\u013D+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \",\xA7&! &7\xB7,#&7\xB7\"+O$.{\"\"2{3|+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \"*b \"! &7\xB7,#&7\xB7\"+O$.\u013C\"\"2\u013C3\u013D+?% &7\xB7,#&7\xB7\"+-%7\x8D+#%'$%$$# \"$## \"$\"# \"\"# \"\"+)%4\"6\u0180\"\"! %$\"# \"\"# \"9*\" 3\u017F"),
          peg$decode("8!.\u014C\"\"2\u014C3\u014D+D$ &7\xB7,#&7\xB7\"+2%7\x8E+(%4#6\u0182#! %$## \"$\"# \"\"# \"*\x93 \"!.\u0148\"\"2\u01483\u0149+D$ &7\xB7,#&7\xB7\"+2%7\x8E+(%4#6\u0183#! %$## \"$\"# \"\"# \"*[ \"!.\u017C\"\"2\u017C3\u017D+D$ &7\xB7,#&7\xB7\"+2%7\x8E+(%4#6\u0184#! %$## \"$\"# \"\"# \"*# \"7\x8E9*\" 3\u0181"),
          peg$decode("87\x8F*w \"7\x90*q \"7\x95*k \"!7\x96+' 4!6\u0186!! %*Y \"!7\x97+' 4!6\u0187!! %*G \"!7\x9B+' 4!6\u0188!! %*5 \"7\x94*/ \"!7\x83+' 4!6\u0189!! %9*\" 3\u0185"),
          peg$decode("8!.w\"\"2w3x+f$ &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4%6\u018B%!\"%$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u018A"),
          peg$decode("8!.1\"\"2132*) \".3\"\"2334+\xC0$.g\"\"2g3h*) \".i\"\"2i3j+\xA4%.?\"\"2?3@*) \".A\"\"2A3B+\x88% &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4)6\u018D)!\"%$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u09E8 \"!._\"\"2_3`*) \".a\"\"2a3b+\xDC$.-\"\"2-3.*) \"./\"\"2/30+\xC0%.o\"\"2o3p*) \".q\"\"2q3r+\xA4%.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\x88% &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4*6\u018E*!\"%$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u090C \"!.\u018F\"\"2\u018F3\u0190+\xC7$ &7\xB7,#&7\xB7\"+\xB5%.w\"\"2w3x+\xA5% &7\xB7,#&7\xB7\"+\x93%7\x85+\x89% &7\xB7,#&7\xB7\"+w%.\u011B\"\"2\u011B3\u011C+g% &7\xB7,#&7\xB7\"+U%7\x85+K% &7\xB7,#&7\xB7\"+9%.y\"\"2y3z+)%4+6\u0191+\"&\"%$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0851 \"!.k\"\"2k3l*) \".m\"\"2m3n+\u014C$.-\"\"2-3.*) \"./\"\"2/30+\u0130%.g\"\"2g3h*) \".i\"\"2i3j+\u0114%.-\"\"2-3.*) \"./\"\"2/30+\xF8%.g\"\"2g3h*) \".i\"\"2i3j+\xDC%.\xA9\"\"2\xA93\xAA*) \".\xAB\"\"2\xAB3\xAC+\xC0%.;\"\"2;3<*) \".=\"\"2=3>+\xA4%.5\"\"2536*) \".7\"\"2738+\x88% &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4.6\u0192.!\"%$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0705 \"!.\u0193\"\"2\u01933\u0194+\x88$ &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x83+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4'6\u0195'!\"%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0689 \"!.\u0196\"\"2\u01963\u0197+\x88$ &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4'6\u0198'!\"%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u060D \"!.\u0199\"\"2\u01993\u019A+\x88$ &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4'6\u019B'!\"%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0591 \"!.\u019C\"\"2\u019C3\u019D+\x99$ &7\xB7,#&7\xB7\"+\x87%!.w\"\"2w3x+a$ &7\xB7,#&7\xB7\"+O%7\x85+E% &7\xB7,#&7\xB7\"+3%.y\"\"2y3z+#%'%%$%# \"$$# \"$## \"$\"# \"\"# \"*# \"7\xB6+(%4#6\u019E#! %$## \"$\"# \"\"# \"*\u0504 \"!.\u019F\"\"2\u019F3\u01A0+D$ &7\xB7,#&7\xB7\"+2%7e+(%4#6\u01A1#! %$## \"$\"# \"\"# \"*\u04CC \"!.\u01A2\"\"2\u01A23\u01A3+\u0106$ &7\xB7,#&7\xB7\"+\xF4%.w\"\"2w3x+\xE4% &7\xB7,#&7\xB7\"+\xD2%7\x85+\xC8% &7\xB7,#&7\xB7\"+\xB6%.\u011B\"\"2\u011B3\u011C+\xA6% &7\xB7,#&7\xB7\"+\x94%7\x85+\x8A% &7\xB7,#&7\xB7\"+x%.\u011B\"\"2\u011B3\u011C+h% &7\xB7,#&7\xB7\"+V%7\x85+L% &7\xB7,#&7\xB7\"+:%.y\"\"2y3z+*%4/6\u01A4/#*&\"%$/# \"$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u03D2 \"!.\u01A5\"\"2\u01A53\u01A6+\x88$ &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4'6\u01A7'!\"%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0356 \"!.\u01A8\"\"2\u01A83\u01A9+\x88$ &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4'6\u01AA'!\"%$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u02DA \"!.\u01AB\"\"2\u01AB3\u01AC+\xC7$ &7\xB7,#&7\xB7\"+\xB5%.w\"\"2w3x+\xA5% &7\xB7,#&7\xB7\"+\x93%7\x85+\x89% &7\xB7,#&7\xB7\"+w%.\u011B\"\"2\u011B3\u011C+g% &7\xB7,#&7\xB7\"+U%7\x85+K% &7\xB7,#&7\xB7\"+9%.y\"\"2y3z+)%4+6\u01AD+\"&\"%$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u021F \"!.G\"\"2G3H*) \".I\"\"2I3J+\xF8$.1\"\"2132*) \".3\"\"2334+\xDC%.s\"\"2s3t*) \".u\"\"2u3v+\xC0%.?\"\"2?3@*) \".A\"\"2A3B+\xA4%.G\"\"2G3H*) \".I\"\"2I3J+\x88% &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4+6\u01AE+!\"%$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0127 \"!.G\"\"2G3H*) \".I\"\"2I3J+\xF8$.1\"\"2132*) \".3\"\"2334+\xDC%.G\"\"2G3H*) \".I\"\"2I3J+\xC0%.?\"\"2?3@*) \".A\"\"2A3B+\xA4%.G\"\"2G3H*) \".I\"\"2I3J+\x88% &7\xB7,#&7\xB7\"+v%.w\"\"2w3x+f% &7\xB7,#&7\xB7\"+T%7\x85+J% &7\xB7,#&7\xB7\"+8%.y\"\"2y3z+(%4+6\u01AE+!\"%$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*/ \"7\x91*) \"7\x92*# \"7\x939*\" 3\u018C"),
          peg$decode("8!.?\"\"2?3@*) \".A\"\"2A3B+\u0187$.5\"\"2536*) \".7\"\"2738+\u016B%.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\u014F%.5\"\"2536*) \".7\"\"2738+\u0133%.K\"\"2K3L*) \".M\"\"2M3N+\u0117% &7\xB7,#&7\xB7\"+\u0105%.w\"\"2w3x+\xF5% &7\xB7,#&7\xB7\"+\xE3%7\x85+\xD9% &7\xB7,#&7\xB7\"+\xC7%.\u011B\"\"2\u011B3\u011C+\xB7% &7\xB7,#&7\xB7\"+\xA5%7\x85+\x9B% &7\xB7,#&7\xB7\"+\x89%!.\u011B\"\"2\u011B3\u011C+?$ &7\xB7,#&7\xB7\"+-%7\x85+#%'#%$## \"$\"# \"\"# \"*# \" %+L% &7\xB7,#&7\xB7\"+:%.y\"\"2y3z+*%416\u01B01#($\"%$1# \"$0# \"$/# \"$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u01AF"),
          peg$decode("8!.5\"\"2536*) \".7\"\"2738+\xD0$.K\"\"2K3L*) \".M\"\"2M3N+\xB4%.G\"\"2G3H*) \".I\"\"2I3J+\x98%.1\"\"2132*) \".3\"\"2334+|%.g\"\"2g3h*) \".i\"\"2i3j+`%.1\"\"2132*) \".3\"\"2334+D% &7\xB7,#&7\xB7\"+2%7X+(%4(6\u01B2(! %$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u01B1"),
          peg$decode("8!.o\"\"2o3p*) \".q\"\"2q3r+\u0136$.\"\"23\x80*) \".\x81\"\"2\x813\x82+\u011A%.g\"\"2g3h*) \".i\"\"2i3j+\xFE% &7\xB7,#&7\xB7\"+\xEC%.5\"\"2536*) \".7\"\"2738+\xD0%.K\"\"2K3L*) \".M\"\"2M3N+\xB4%.G\"\"2G3H*) \".I\"\"2I3J+\x98%.1\"\"2132*) \".3\"\"2334+|%.g\"\"2g3h*) \".i\"\"2i3j+`%.1\"\"2132*) \".3\"\"2334+D% &7\xB7,#&7\xB7\"+2%7X+(%4,6\u01B4,! %$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u01B3"),
          peg$decode("8!.c\"\"2c3d*) \".e\"\"2e3f+\u021A$.\"\"23\x80*) \".\x81\"\"2\x813\x82+\u01FE%.s\"\"2s3t*) \".u\"\"2u3v+\u01E2%.o\"\"2o3p*) \".q\"\"2q3r+\u01C6%.g\"\"2g3h*) \".i\"\"2i3j+\u01AA% &7\xB7,#&7\xB7\"+\u0198%.w\"\"2w3x+\u0188% &7\xB7,#&7\xB7\"+\u0176%!.k\"\"2k3l*) \".m\"\"2m3n+\xE7$.G\"\"2G3H*) \".I\"\"2I3J+\xCB%.1\"\"2132*) \".3\"\"2334+\xAF%.g\"\"2g3h*) \".i\"\"2i3j+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.o\"\"2o3p*) \".q\"\"2q3r+[%.c\"\"2c3d*) \".e\"\"2e3f+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+\x85% &7\xB7,#&7\xB7\"+s%.{\"\"2{3|*# \"7\x85+]% &7\xB7,#&7\xB7\"+K%.y\"\"2y3z+;% &7\xB7,#&7\xB7\"+)%4.6\u01B6.\"%#%$.# \"$-# \"$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u0775 \"!.1\"\"2132*) \".3\"\"2334+\u01D6$.s\"\"2s3t*) \".u\"\"2u3v+\u01BA%.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+\u019E% &7\xB7,#&7\xB7\"+\u018C%.w\"\"2w3x+\u017C% &7\xB7,#&7\xB7\"+\u016A%!.k\"\"2k3l*) \".m\"\"2m3n+\xE7$.G\"\"2G3H*) \".I\"\"2I3J+\xCB%.1\"\"2132*) \".3\"\"2334+\xAF%.g\"\"2g3h*) \".i\"\"2i3j+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.o\"\"2o3p*) \".q\"\"2q3r+[%.c\"\"2c3d*) \".e\"\"2e3f+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+y% &7\xB7,#&7\xB7\"+g%7\x85+]% &7\xB7,#&7\xB7\"+K%.y\"\"2y3z+;% &7\xB7,#&7\xB7\"+)%4,6\u01B7,\"%#%$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u059F \"!.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+\u01D6$.G\"\"2G3H*) \".I\"\"2I3J+\u01BA%.o\"\"2o3p*) \".q\"\"2q3r+\u019E% &7\xB7,#&7\xB7\"+\u018C%.w\"\"2w3x+\u017C% &7\xB7,#&7\xB7\"+\u016A%!.k\"\"2k3l*) \".m\"\"2m3n+\xE7$.G\"\"2G3H*) \".I\"\"2I3J+\xCB%.1\"\"2132*) \".3\"\"2334+\xAF%.g\"\"2g3h*) \".i\"\"2i3j+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.o\"\"2o3p*) \".q\"\"2q3r+[%.c\"\"2c3d*) \".e\"\"2e3f+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+y% &7\xB7,#&7\xB7\"+g%7\x85+]% &7\xB7,#&7\xB7\"+K%.y\"\"2y3z+;% &7\xB7,#&7\xB7\"+)%4,6\u01B8,\"%#%$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u03C9 \"!.\x8E\"\"2\x8E3\x8F*) \".\x90\"\"2\x903\x91+\u01D6$.-\"\"2-3.*) \"./\"\"2/30+\u01BA%.K\"\"2K3L*) \".M\"\"2M3N+\u019E% &7\xB7,#&7\xB7\"+\u018C%.w\"\"2w3x+\u017C% &7\xB7,#&7\xB7\"+\u016A%!.k\"\"2k3l*) \".m\"\"2m3n+\xE7$.G\"\"2G3H*) \".I\"\"2I3J+\xCB%.1\"\"2132*) \".3\"\"2334+\xAF%.g\"\"2g3h*) \".i\"\"2i3j+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.o\"\"2o3p*) \".q\"\"2q3r+[%.c\"\"2c3d*) \".e\"\"2e3f+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+y% &7\xB7,#&7\xB7\"+g%7\x85+]% &7\xB7,#&7\xB7\"+K%.y\"\"2y3z+;% &7\xB7,#&7\xB7\"+)%4,6\u01B9,\"%#%$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*\u01F3 \"!.-\"\"2-3.*) \"./\"\"2/30+\u01D6$.\u01BA\"\"2\u01BA3\u01BB*) \".\u01BC\"\"2\u01BC3\u01BD+\u01BA%.\xA5\"\"2\xA53\xA6*) \".\xA7\"\"2\xA73\xA8+\u019E% &7\xB7,#&7\xB7\"+\u018C%.w\"\"2w3x+\u017C% &7\xB7,#&7\xB7\"+\u016A%!.k\"\"2k3l*) \".m\"\"2m3n+\xE7$.G\"\"2G3H*) \".I\"\"2I3J+\xCB%.1\"\"2132*) \".3\"\"2334+\xAF%.g\"\"2g3h*) \".i\"\"2i3j+\x93%.G\"\"2G3H*) \".I\"\"2I3J+w%.o\"\"2o3p*) \".q\"\"2q3r+[%.c\"\"2c3d*) \".e\"\"2e3f+?%.g\"\"2g3h*) \".i\"\"2i3j+#%'(%$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"*# \" %+y% &7\xB7,#&7\xB7\"+g%7\x85+]% &7\xB7,#&7\xB7\"+K%.y\"\"2y3z+;% &7\xB7,#&7\xB7\"+)%4,6\u01BE,\"%#%$,# \"$+# \"$*# \"$)# \"$(# \"$'# \"$&# \"$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u01B5"),
          peg$decode("8!7\x9D+9$7d*# \" %+)%4\"6\u01C0\"\"! %$\"# \"\"# \"9*\" 3\u01BF"),
          peg$decode("8!7\x9C+Z$7\xA6*> \"!.\u01C2\"\"2\u01C23\u01C3+-$7\x9D+#%'\"%$\"# \"\"# \"*# \" %+)%4\"6\u01C4\"\"! %$\"# \"\"# \"9*\" 3\u01C1"),
          peg$decode("87\x98*) \"7\x99*# \"7\x9A9*\" 3\u01C5"),
          peg$decode("87\xA9*) \"7\xA8*# \"7\xA79*\" 3\u01C6"),
          peg$decode("87\xAC*) \"7\xAB*# \"7\xAA9*\" 3\u01C7"),
          peg$decode("87\xAF*) \"7\xAE*# \"7\xAD9*\" 3\u01C8"),
          peg$decode("8!.g\"\"2g3h*) \".i\"\"2i3j+{$.?\"\"2?3@*) \".A\"\"2A3B+_%.s\"\"2s3t*) \".u\"\"2u3v+C%.5\"\"2536*) \".7\"\"2738+'%4$6\u01CA$ %$$# \"$## \"$\"# \"\"# \"*\xB4 \"!.C\"\"2C3D*) \".E\"\"2E3F+\x97$.-\"\"2-3.*) \"./\"\"2/30+{%._\"\"2_3`*) \".a\"\"2a3b+_%.1\"\"2132*) \".3\"\"2334+C%.5\"\"2536*) \".7\"\"2738+'%4%6\u01CB% %$%# \"$$# \"$## \"$\"# \"\"# \"9*\" 3\u01C9"),
          peg$decode("8!7\xB3+' 4!6\u01CD!! %*S \"!7\xB4+' 4!6\u01CD!! %*A \"!7\xB1+' 4!6\u01CD!! %*/ \"!7\xB2+' 4!6\u01CD!! %9*\" 3\u01CC"),
          peg$decode("8!7\xA0+' 4!6\u01CF!! %*/ \"!7\x9E+' 4!6\u01D0!! %9*\" 3\u01CE"),
          peg$decode("8!7\xA2+' 4!6\u01D2!! %*/ \"!7\xA1+' 4!6\u01D3!! %9*\" 3\u01D1"),
          peg$decode("8!7\xA3+' 4!6\u01D5!! %*. \"!7\xB9+& 4!6\u01D6! %9*\" 3\u01D4"),
          peg$decode("8!.\u0171\"\"2\u01713\u0172+V$ &0\u01D8\"\"1!3\u01D9,)&0\u01D8\"\"1!3\u01D9\"+8%.\u0173\"\"2\u01733\u0174+(%4#6\u01DA#!!%$## \"$\"# \"\"# \"9*\" 3\u01D7"),
          peg$decode("8!7\xBE*# \" %+8$.Y\"\"2Y3Z+(%4\"6\u01D0\"!!%$\"# \"\"# \"9*\" 3\u01DB"),
          peg$decode("8!7\xA1+3$7\xBF+)%4\"6\u01DD\"\"! %$\"# \"\"# \"9*\" 3\u01DC"),
          peg$decode("8!.\u01DF\"\"2\u01DF3\u01E0+2$7\xBF+(%4\"6\u01E1\"! %$\"# \"\"# \"9*\" 3\u01DE"),
          peg$decode("8!.\u0146\"\"2\u01463\u0147+2$7\xBC+(%4\"6\u01E3\"! %$\"# \"\"# \"9*\" 3\u01E2"),
          peg$decode("8!.\u01E5\"\"2\u01E53\u01E6+2$7\xBC+(%4\"6\u01E3\"! %$\"# \"\"# \"9*\" 3\u01E4"),
          peg$decode("8!.\u01E8\"\"2\u01E83\u01E9+\xCC$ &0\u01EA\"\"1!3\u01EB+,$,)&0\u01EA\"\"1!3\u01EB\"\"\" \"+\xA7% &!.\u017C\"\"2\u017C3\u017D+H$ &0\u01EC\"\"1!3\u01ED+,$,)&0\u01EC\"\"1!3\u01ED\"\"\" \"+#%'\"%$\"# \"\"# \",Y&!.\u017C\"\"2\u017C3\u017D+H$ &0\u01EC\"\"1!3\u01ED+,$,)&0\u01EC\"\"1!3\u01ED\"\"\" \"+#%'\"%$\"# \"\"# \"\"+)%4#6\u01EE#\"! %$## \"$\"# \"\"# \"9*\" 3\u01E7"),
          peg$decode("8! &0\u01F0\"\"1!3\u01F1+,$,)&0\u01F0\"\"1!3\u01F1\"\"\" \"+' 4!6\u01F2!! %9*\" 3\u01EF"),
          peg$decode("8! &0\u01F0\"\"1!3\u01F1+,$,)&0\u01F0\"\"1!3\u01F1\"\"\" \"+X$.Q\"\"2Q3R+H% &0\u01F0\"\"1!3\u01F1,)&0\u01F0\"\"1!3\u01F1\"+*%4#6\u01F4##\"! %$## \"$\"# \"\"# \"*_ \"!.Q\"\"2Q3R+N$ &0\u01F0\"\"1!3\u01F1+,$,)&0\u01F0\"\"1!3\u01F1\"\"\" \"+)%4\"6\u01F5\"\"! %$\"# \"\"# \"9*\" 3\u01F3"),
          peg$decode("8! &0\u01F0\"\"1!3\u01F1+,$,)&0\u01F0\"\"1!3\u01F1\"\"\" \"+c$.Q\"\"2Q3R+S% &0\u01F0\"\"1!3\u01F1,)&0\u01F0\"\"1!3\u01F1\"+5%7\xB0++%4$6\u01F7$$#\"! %$$# \"$## \"$\"# \"\"# \"*\xA6 \"!.Q\"\"2Q3R+Y$ &0\u01F0\"\"1!3\u01F1+,$,)&0\u01F0\"\"1!3\u01F1\"\"\" \"+4%7\xB0+*%4#6\u01F8##\"! %$## \"$\"# \"\"# \"*Y \"! &0\u01F0\"\"1!3\u01F1+,$,)&0\u01F0\"\"1!3\u01F1\"\"\" \"+3$7\xB0+)%4\"6\u01F9\"\"! %$\"# \"\"# \"9*\" 3\u01F6"),
          peg$decode("8!.\u0148\"\"2\u01483\u0149+2$7\xA7+(%4\"6\u01FB\"! %$\"# \"\"# \"9*\" 3\u01FA"),
          peg$decode("8!.\u0148\"\"2\u01483\u0149+2$7\xA8+(%4\"6\u01FD\"! %$\"# \"\"# \"9*\" 3\u01FC"),
          peg$decode("8!.\u0148\"\"2\u01483\u0149+2$7\xA9+(%4\"6\u01FD\"! %$\"# \"\"# \"9*\" 3\u01FE"),
          peg$decode("8!.\u017C\"\"2\u017C3\u017D+2$7\xA7+(%4\"6\u0200\"! %$\"# \"\"# \"9*\" 3\u01FF"),
          peg$decode("8!.\u017C\"\"2\u017C3\u017D+2$7\xA8+(%4\"6\u0200\"! %$\"# \"\"# \"9*\" 3\u0201"),
          peg$decode("8!.\u017C\"\"2\u017C3\u017D+2$7\xA9+(%4\"6\u0200\"! %$\"# \"\"# \"9*\" 3\u0202"),
          peg$decode("8!0\u0204\"\"1!3\u0205+e$0\u0206\"\"1!3\u0207*# \" %+O% &0\u01F0\"\"1!3\u01F1+,$,)&0\u01F0\"\"1!3\u01F1\"\"\" \"+*%4#6\u0208##\"! %$## \"$\"# \"\"# \"9*\" 3\u0203"),
          peg$decode("8!.\u020A\"\"2\u020A3\u020B+b$ &0\u020C\"\"1!3\u020D*# \"7\xB5,/&0\u020C\"\"1!3\u020D*# \"7\xB5\"+8%.\u020A\"\"2\u020A3\u020B+(%4#6\u020E#!!%$## \"$\"# \"\"# \"9*\" 3\u0209"),
          peg$decode("8!.\u0210\"\"2\u02103\u0211+b$ &0\u0212\"\"1!3\u0213*# \"7\xB5,/&0\u0212\"\"1!3\u0213*# \"7\xB5\"+8%.\u0210\"\"2\u02103\u0211+(%4#6\u020E#!!%$## \"$\"# \"\"# \"9*\" 3\u020F"),
          peg$decode("8!.\u0215\"\"2\u02153\u0216+b$ &0\u0217\"\"1!3\u0218*# \"7\xB5,/&0\u0217\"\"1!3\u0218*# \"7\xB5\"+8%.\u0215\"\"2\u02153\u0216+(%4#6\u020E#!!%$## \"$\"# \"\"# \"9*\" 3\u0214"),
          peg$decode("8!.\u021A\"\"2\u021A3\u021B+b$ &0\u021C\"\"1!3\u021D*# \"7\xB5,/&0\u021C\"\"1!3\u021D*# \"7\xB5\"+8%.\u021A\"\"2\u021A3\u021B+(%4#6\u020E#!!%$## \"$\"# \"\"# \"9*\" 3\u0219"),
          peg$decode("8!.\u021F\"\"2\u021F3\u0220+3$0\u0221\"\"1!3\u0222+#%'\"%$\"# \"\"# \"9*\" 3\u021E"),
          peg$decode("8!.w\"\"2w3x+I$ &7\xB7,#&7\xB7\"+7%.y\"\"2y3z+'%4#6\u0224# %$## \"$\"# \"\"# \"9*\" 3\u0223"),
          peg$decode("80\u0226\"\"1!3\u0227*G \"0\u0228\"\"1!3\u0229*; \"0\u022A\"\"1!3\u022B*/ \"0\u022C\"\"1!3\u022D*# \"7\xB89*\" 3\u0225"),
          peg$decode("8!.\u022F\"\"2\u022F3\u0230+A$ &0\u0231\"\"1!3\u0232,)&0\u0231\"\"1!3\u0232\"+#%'\"%$\"# \"\"# \"9*\" 3\u022E"),
          peg$decode("8!.\u0154\"\"2\u01543\u0155+E$ &7\xB7,#&7\xB7\"+3%.\u0156\"\"2\u01563\u0157+#%'#%$## \"$\"# \"\"# \"9*\" 3\u0233"),
          peg$decode("80\u0235\"\"1!3\u0236*\xB9 \"0\u0237\"\"1!3\u0238*\xAD \"0\u0239\"\"1!3\u023A*\xA1 \"0\u023B\"\"1!3\u023C*\x95 \"0\u023D\"\"1!3\u023E*\x89 \"0\u023F\"\"1!3\u0240*} \"0\u0241\"\"1!3\u0242*q \"0\u0243\"\"1!3\u0244*e \"0\u0245\"\"1!3\u0246*Y \"0\u0247\"\"1!3\u0248*M \"0\u0249\"\"1!3\u024A*A \"0\u024B\"\"1!3\u024C*5 \"0\u024D\"\"1!3\u024E*) \"0\u024F\"\"1!3\u02509*\" 3\u0234"),
          peg$decode("87\xBA*) \".\u0252\"\"2\u02523\u02539*\" 3\u0251"),
          peg$decode("8!7\xBB*) \"0\u01F0\"\"1!3\u01F1+\x9B$ &7\xBB*M \"0\u01F0\"\"1!3\u01F1*A \"0\u0255\"\"1!3\u0256*5 \"0\u0257\"\"1!3\u0258*) \"0\u0259\"\"1!3\u025A,S&7\xBB*M \"0\u01F0\"\"1!3\u01F1*A \"0\u0255\"\"1!3\u0256*5 \"0\u0257\"\"1!3\u0258*) \"0\u0259\"\"1!3\u025A\"+)%4\"6\u025B\"\"! %$\"# \"\"# \"9*\" 3\u0254"),
          peg$decode("87\xBB*Y \".\u017C\"\"2\u017C3\u017D*M \"0\u01F0\"\"1!3\u01F1*A \"0\u0255\"\"1!3\u0256*5 \"0\u0257\"\"1!3\u0258*) \"0\u0259\"\"1!3\u025A9*\" 3\u025C"),
          peg$decode("8!7\xBA+S$ &7\xBD*) \".Q\"\"2Q3R,/&7\xBD*) \".Q\"\"2Q3R\"+)%4\"6\u025E\"\"! %$\"# \"\"# \"9*\" 3\u025D"),
          peg$decode("8!7\xBB*) \"0\u01F0\"\"1!3\u01F1+;$ &7\xBD,#&7\xBD\"+)%4\"6\u0260\"\"! %$\"# \"\"# \"9*\" 3\u025F")
        ],

        peg$currPos          = 0,
        peg$reportedPos      = 0,
        peg$cachedPos        = 0,
        peg$cachedPosDetails = { line: 1, column: 1, seenCR: false },
        peg$maxFailPos       = 0,
        peg$maxFailExpected  = [],
        peg$silentFails      = 0,

        peg$result;

    if ("startRule" in options) {
      if (!(options.startRule in peg$startRuleIndices)) {
        throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
      }

      peg$startRuleIndex = peg$startRuleIndices[options.startRule];
    }

    function text() {
      return input.substring(peg$reportedPos, peg$currPos);
    }

    function offset() {
      return peg$reportedPos;
    }

    function line() {
      return peg$computePosDetails(peg$reportedPos).line;
    }

    function column() {
      return peg$computePosDetails(peg$reportedPos).column;
    }

    function expected(description) {
      throw peg$buildException(
        null,
        [{ type: "other", description: description }],
        peg$reportedPos
      );
    }

    function error(message) {
      throw peg$buildException(message, null, peg$reportedPos);
    }

    function peg$computePosDetails(pos) {
      function advance(details, startPos, endPos) {
        var p, ch;

        for (p = startPos; p < endPos; p++) {
          ch = input.charAt(p);
          if (ch === "\n") {
            if (!details.seenCR) { details.line++; }
            details.column = 1;
            details.seenCR = false;
          } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
            details.line++;
            details.column = 1;
            details.seenCR = true;
          } else {
            details.column++;
            details.seenCR = false;
          }
        }
      }

      if (peg$cachedPos !== pos) {
        if (peg$cachedPos > pos) {
          peg$cachedPos = 0;
          peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };
        }
        advance(peg$cachedPosDetails, peg$cachedPos, pos);
        peg$cachedPos = pos;
      }

      return peg$cachedPosDetails;
    }

    function peg$fail(expected) {
      if (peg$currPos < peg$maxFailPos) { return; }

      if (peg$currPos > peg$maxFailPos) {
        peg$maxFailPos = peg$currPos;
        peg$maxFailExpected = [];
      }

      peg$maxFailExpected.push(expected);
    }

    function peg$buildException(message, expected, pos) {
      function cleanupExpected(expected) {
        var i = 1;

        expected.sort(function(a, b) {
          if (a.description < b.description) {
            return -1;
          } else if (a.description > b.description) {
            return 1;
          } else {
            return 0;
          }
        });

        while (i < expected.length) {
          if (expected[i - 1] === expected[i]) {
            expected.splice(i, 1);
          } else {
            i++;
          }
        }
      }

      function buildMessage(expected, found) {
        function stringEscape(s) {
          function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }

          return s
            .replace(/\\/g,   '\\\\')
            .replace(/"/g,    '\\"')
            .replace(/\x08/g, '\\b')
            .replace(/\t/g,   '\\t')
            .replace(/\n/g,   '\\n')
            .replace(/\f/g,   '\\f')
            .replace(/\r/g,   '\\r')
            .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
            .replace(/[\x10-\x1F\x80-\xFF]/g,    function(ch) { return '\\x'  + hex(ch); })
            .replace(/[\u0180-\u0FFF]/g,         function(ch) { return '\\u0' + hex(ch); })
            .replace(/[\u1080-\uFFFF]/g,         function(ch) { return '\\u'  + hex(ch); });
        }

        var expectedDescs = new Array(expected.length),
            expectedDesc, foundDesc, i;

        for (i = 0; i < expected.length; i++) {
          expectedDescs[i] = expected[i].description;
        }

        expectedDesc = expected.length > 1
          ? expectedDescs.slice(0, -1).join(", ")
              + " or "
              + expectedDescs[expected.length - 1]
          : expectedDescs[0];

        foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input";

        return "Expected " + expectedDesc + " but " + foundDesc + " found.";
      }

      var posDetails = peg$computePosDetails(pos),
          found      = pos < input.length ? input.charAt(pos) : null;

      if (expected !== null) {
        cleanupExpected(expected);
      }

      return new SyntaxError(
        message !== null ? message : buildMessage(expected, found),
        expected,
        found,
        pos,
        posDetails.line,
        posDetails.column
      );
    }

    function peg$decode(s) {
      var bc = new Array(s.length), i;

      for (i = 0; i < s.length; i++) {
        bc[i] = s.charCodeAt(i) - 32;
      }

      return bc;
    }

    function peg$parseRule(index) {
      var bc    = peg$bytecode[index],
          ip    = 0,
          ips   = [],
          end   = bc.length,
          ends  = [],
          stack = [],
          params, i;

      function protect(object) {
        return Object.prototype.toString.apply(object) === "[object Array]" ? [] : object;
      }

      while (true) {
        while (ip < end) {
          switch (bc[ip]) {
            case 0:
              stack.push(protect(peg$consts[bc[ip + 1]]));
              ip += 2;
              break;

            case 1:
              stack.push(peg$currPos);
              ip++;
              break;

            case 2:
              stack.pop();
              ip++;
              break;

            case 3:
              peg$currPos = stack.pop();
              ip++;
              break;

            case 4:
              stack.length -= bc[ip + 1];
              ip += 2;
              break;

            case 5:
              stack.splice(-2, 1);
              ip++;
              break;

            case 6:
              stack[stack.length - 2].push(stack.pop());
              ip++;
              break;

            case 7:
              stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));
              ip += 2;
              break;

            case 8:
              stack.pop();
              stack.push(input.substring(stack[stack.length - 1], peg$currPos));
              ip++;
              break;

            case 9:
              ends.push(end);
              ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);

              if (stack[stack.length - 1]) {
                end = ip + 3 + bc[ip + 1];
                ip += 3;
              } else {
                end = ip + 3 + bc[ip + 1] + bc[ip + 2];
                ip += 3 + bc[ip + 1];
              }

              break;

            case 10:
              ends.push(end);
              ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);

              if (stack[stack.length - 1] === peg$FAILED) {
                end = ip + 3 + bc[ip + 1];
                ip += 3;
              } else {
                end = ip + 3 + bc[ip + 1] + bc[ip + 2];
                ip += 3 + bc[ip + 1];
              }

              break;

            case 11:
              ends.push(end);
              ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);

              if (stack[stack.length - 1] !== peg$FAILED) {
                end = ip + 3 + bc[ip + 1];
                ip += 3;
              } else {
                end = ip + 3 + bc[ip + 1] + bc[ip + 2];
                ip += 3 + bc[ip + 1];
              }

              break;

            case 12:
              if (stack[stack.length - 1] !== peg$FAILED) {
                ends.push(end);
                ips.push(ip);

                end = ip + 2 + bc[ip + 1];
                ip += 2;
              } else {
                ip += 2 + bc[ip + 1];
              }

              break;

            case 13:
              ends.push(end);
              ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]);

              if (input.length > peg$currPos) {
                end = ip + 3 + bc[ip + 1];
                ip += 3;
              } else {
                end = ip + 3 + bc[ip + 1] + bc[ip + 2];
                ip += 3 + bc[ip + 1];
              }

              break;

            case 14:
              ends.push(end);
              ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]);

              if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length) === peg$consts[bc[ip + 1]]) {
                end = ip + 4 + bc[ip + 2];
                ip += 4;
              } else {
                end = ip + 4 + bc[ip + 2] + bc[ip + 3];
                ip += 4 + bc[ip + 2];
              }

              break;

            case 15:
              ends.push(end);
              ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]);

              if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length).toLowerCase() === peg$consts[bc[ip + 1]]) {
                end = ip + 4 + bc[ip + 2];
                ip += 4;
              } else {
                end = ip + 4 + bc[ip + 2] + bc[ip + 3];
                ip += 4 + bc[ip + 2];
              }

              break;

            case 16:
              ends.push(end);
              ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]);

              if (peg$consts[bc[ip + 1]].test(input.charAt(peg$currPos))) {
                end = ip + 4 + bc[ip + 2];
                ip += 4;
              } else {
                end = ip + 4 + bc[ip + 2] + bc[ip + 3];
                ip += 4 + bc[ip + 2];
              }

              break;

            case 17:
              stack.push(input.substr(peg$currPos, bc[ip + 1]));
              peg$currPos += bc[ip + 1];
              ip += 2;
              break;

            case 18:
              stack.push(peg$consts[bc[ip + 1]]);
              peg$currPos += peg$consts[bc[ip + 1]].length;
              ip += 2;
              break;

            case 19:
              stack.push(peg$FAILED);
              if (peg$silentFails === 0) {
                peg$fail(peg$consts[bc[ip + 1]]);
              }
              ip += 2;
              break;

            case 20:
              peg$reportedPos = stack[stack.length - 1 - bc[ip + 1]];
              ip += 2;
              break;

            case 21:
              peg$reportedPos = peg$currPos;
              ip++;
              break;

            case 22:
              params = bc.slice(ip + 4, ip + 4 + bc[ip + 3]);
              for (i = 0; i < bc[ip + 3]; i++) {
                params[i] = stack[stack.length - 1 - params[i]];
              }

              stack.splice(
                stack.length - bc[ip + 2],
                bc[ip + 2],
                peg$consts[bc[ip + 1]].apply(null, params)
              );

              ip += 4 + bc[ip + 3];
              break;

            case 23:
              stack.push(peg$parseRule(bc[ip + 1]));
              ip += 2;
              break;

            case 24:
              peg$silentFails++;
              ip++;
              break;

            case 25:
              peg$silentFails--;
              ip++;
              break;

            default:
              throw new Error("Invalid opcode: " + bc[ip] + ".");
          }
        }

        if (ends.length > 0) {
          end = ends.pop();
          ip = ips.pop();
        } else {
          break;
        }
      }

      return stack[0];
    }


        var flattenString = function(arrs) {
            var acum ="";
            for(var i=0; arrs && i< arrs.length; i++) {
              if(typeof(arrs[i])==='string') {
                acum = acum + arrs[i];
              } else {
                acum = acum + arrs[i].join('');
              }
            }

            return acum;
        }


        var GlobalBlankNodeCounter = 0;

        var prefixes = {};

        var registerPrefix = function(prefix, uri) {
            prefixes[prefix] = uri;
        }

        var registerDefaultPrefix = function(uri) {
            prefixes[null] = uri;
        }

        var arrayToString = function(array) {
            var tmp = "";
            for(var i=0; array && i<array.length; i++) {
                tmp = tmp + array[i];            
            }

            return tmp.toUpperCase();
        }


    peg$result = peg$parseRule(peg$startRuleIndex);

    if (peg$result !== peg$FAILED && peg$currPos === input.length) {
      return peg$result;
    } else {
      if (peg$result !== peg$FAILED && peg$currPos < input.length) {
        peg$fail({ type: "end", description: "end of input" });
      }

      throw peg$buildException(null, peg$maxFailExpected, peg$maxFailPos);
    }
  }

  return {
    SyntaxError: SyntaxError,
    parse:       parse
  };
})() });