@ibyar/expressions 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/abstract.d.ts +2 -1
- package/api/abstract.js +4 -0
- package/api/abstract.js.map +1 -1
- package/api/definition/array.d.ts +3 -1
- package/api/definition/array.js +6 -0
- package/api/definition/array.js.map +1 -1
- package/api/definition/bind.d.ts +2 -1
- package/api/definition/bind.js +4 -0
- package/api/definition/bind.js.map +1 -1
- package/api/definition/function.d.ts +6 -1
- package/api/definition/function.js +22 -2
- package/api/definition/function.js.map +1 -1
- package/api/definition/member.d.ts +2 -1
- package/api/definition/member.js +4 -0
- package/api/definition/member.js.map +1 -1
- package/api/definition/object.d.ts +4 -1
- package/api/definition/object.js +10 -0
- package/api/definition/object.js.map +1 -1
- package/api/definition/statement.d.ts +2 -1
- package/api/definition/statement.js +3 -0
- package/api/definition/statement.js.map +1 -1
- package/api/definition/values.d.ts +11 -4
- package/api/definition/values.js +16 -0
- package/api/definition/values.js.map +1 -1
- package/api/deserialize/deserialize.js +3 -3
- package/api/deserialize/deserialize.js.map +1 -1
- package/api/deserialize/type-store.d.ts +2 -0
- package/api/deserialize/type-store.js +2 -0
- package/api/deserialize/type-store.js.map +1 -0
- package/api/expression.d.ts +9 -3
- package/api/expression.js.map +1 -1
- package/api/module/export.d.ts +3 -1
- package/api/module/export.js +10 -0
- package/api/module/export.js.map +1 -1
- package/api/module/import.d.ts +3 -1
- package/api/module/import.js +10 -0
- package/api/module/import.js.map +1 -1
- package/api/module/module.d.ts +2 -1
- package/api/module/module.js +5 -0
- package/api/module/module.js.map +1 -1
- package/api/operators/assignment.d.ts +2 -1
- package/api/operators/assignment.js +4 -0
- package/api/operators/assignment.js.map +1 -1
- package/api/operators/await.d.ts +2 -1
- package/api/operators/await.js +3 -0
- package/api/operators/await.js.map +1 -1
- package/api/operators/binary.d.ts +2 -1
- package/api/operators/binary.js +4 -0
- package/api/operators/binary.js.map +1 -1
- package/api/operators/chaining.d.ts +2 -1
- package/api/operators/chaining.js +3 -0
- package/api/operators/chaining.js.map +1 -1
- package/api/operators/comma.d.ts +2 -1
- package/api/operators/comma.js +3 -0
- package/api/operators/comma.js.map +1 -1
- package/api/operators/grouping.d.ts +2 -1
- package/api/operators/grouping.js +3 -0
- package/api/operators/grouping.js.map +1 -1
- package/api/operators/logical.d.ts +2 -1
- package/api/operators/logical.js +4 -0
- package/api/operators/logical.js.map +1 -1
- package/api/operators/pipeline.d.ts +2 -1
- package/api/operators/pipeline.js +5 -0
- package/api/operators/pipeline.js.map +1 -1
- package/api/operators/ternary.d.ts +2 -1
- package/api/operators/ternary.js +5 -0
- package/api/operators/ternary.js.map +1 -1
- package/api/operators/unary.d.ts +2 -1
- package/api/operators/unary.js +3 -0
- package/api/operators/unary.js.map +1 -1
- package/api/operators/update.d.ts +2 -1
- package/api/operators/update.js +3 -0
- package/api/operators/update.js.map +1 -1
- package/api/statement/control/block.d.ts +2 -1
- package/api/statement/control/block.js +3 -0
- package/api/statement/control/block.js.map +1 -1
- package/api/statement/control/if.d.ts +2 -1
- package/api/statement/control/if.js +5 -0
- package/api/statement/control/if.js.map +1 -1
- package/api/statement/control/switch.d.ts +4 -1
- package/api/statement/control/switch.js +11 -0
- package/api/statement/control/switch.js.map +1 -1
- package/api/statement/control/terminate.d.ts +5 -3
- package/api/statement/control/terminate.js +6 -0
- package/api/statement/control/terminate.js.map +1 -1
- package/api/statement/declarations/declares.d.ts +3 -1
- package/api/statement/declarations/declares.js +8 -1
- package/api/statement/declarations/declares.js.map +1 -1
- package/api/statement/iterations/for.d.ts +5 -1
- package/api/statement/iterations/for.js +21 -0
- package/api/statement/iterations/for.js.map +1 -1
- package/api/statement/iterations/while.d.ts +3 -1
- package/api/statement/iterations/while.js +8 -0
- package/api/statement/iterations/while.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/scope/event.d.ts +5 -0
- package/scope/event.js +41 -0
- package/scope/event.js.map +1 -0
- package/scope/index.d.ts +1 -0
- package/scope/index.js +1 -0
- package/scope/index.js.map +1 -1
- package/scope/proxy.d.ts +1 -1
- package/scope/proxy.js +3 -3
- package/scope/proxy.js.map +1 -1
- package/scope/scope.d.ts +56 -48
- package/scope/scope.js +84 -29
- package/scope/scope.js.map +1 -1
- package/scope/stack.d.ts +28 -28
- package/scope/stack.js.map +1 -1
- package/v8/parser.d.ts +1 -1
- package/v8/parser.js +4 -2
- package/v8/parser.js.map +1 -1
- package/v8/stream.d.ts +4 -2
- package/v8/stream.js +34 -17
- package/v8/stream.js.map +1 -1
- package/v8/token.d.ts +1 -1
- package/v8/token.js.map +1 -1
- package/visit/index.d.ts +1 -0
- package/visit/index.js +2 -0
- package/visit/index.js.map +1 -0
- package/visit/visitor.d.ts +11 -0
- package/visit/visitor.js +42 -0
- package/visit/visitor.js.map +1 -0
package/v8/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/expressions/v8/parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAmB,MAAM,YAAY,CAAC;AACpD,OAAO,EAAsB,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EACN,MAAM,EAAE,UAAU,EAAE,QAAQ,EAC5B,aAAa,EAAE,aAAa,EAAE,eAAe,EAC7C,QAAQ,EAAE,aAAa,EAAE,eAAe,EACxC,qBAAqB,EAAE,cAAc,EACrC,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,eAAe,EAC9E,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EACN,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EACxD,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAC9C,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAsB,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAkB,MAAM,oCAAoC,CAAC;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAmB,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACN,sBAAsB,EAAE,oBAAoB,EAC5C,qBAAqB,EAAE,sCAAsC,EAC7D,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,CAAN,IAAY,oBAAkF;AAA9F,WAAY,oBAAoB;IAAG,iGAAqB,CAAA;IAAE,mFAAc,CAAA;IAAE,2FAAkB,CAAA;AAAC,CAAC,EAAlF,oBAAoB,KAApB,oBAAoB,QAA8D;AAC9F,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACvB,iDAAK,CAAA;IAAE,yDAAS,CAAA;IAAE,iFAAqB,CAAA;IACvC,mDAAM,CAAA;IAAE,mDAAM,CAAA;IAAE,2DAAU,CAAA;IAAE,mEAAc,CAAA;IAAE,mEAAc,CAAA;IAC1D,mDAAM,CAAA;IAAE,mDAAM,CAAA;AACf,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAGD,MAAM,UAAU,0BAA0B,CAAC,KAAY,EAAE,IAAsB;IAC9E,QAAQ,KAAK,EAAE;QACd,KAAK,KAAK,CAAC,KAAK;YACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC;YAC/B,OAAO,IAAI,CAAC;QACb,KAAK,KAAK,CAAC,KAAK;YACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC;YACnC,OAAO,IAAI,CAAC;QACb,KAAK,KAAK,CAAC,OAAO;YACjB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,qBAAqB,CAAC;YAC/C,OAAO,IAAI,CAAC;QACb,KAAK,KAAK,CAAC,MAAM;YAChB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;YAChC,OAAO,IAAI,CAAC;QACb,KAAK,KAAK,CAAC,aAAa;YACvB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;YAChC,OAAO,IAAI,CAAC;QACb,KAAK,KAAK,CAAC,GAAG,CAAC;QACf,KAAK,KAAK,CAAC,SAAS;YACnB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC;YACpC,OAAO,IAAI,CAAC;QACb;YACC,MAAM;KACP;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,CAAN,IAAY,uBAUX;AAVD,WAAY,uBAAuB;IAClC,4DAAiC,CAAA;IACjC,kEAAuC,CAAA;IACvC,4DAAiC,CAAA;IACjC,sEAA2C,CAAA;IAC3C,0EAA+C,CAAA;IAC/C,8DAAmC,CAAA;IACnC,8DAAmC,CAAA;IACnC,4DAAiC,CAAA;IACjC,0EAA+C,CAAA;AAChD,CAAC,EAVW,uBAAuB,KAAvB,uBAAuB,QAUlC;AAED,MAAM,OAAgB,cAAc;IACnC,YAAsB,OAAoB;QAApB,YAAO,GAAP,OAAO,CAAa;IAAI,CAAC;IAErC,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IACS,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IACS,IAAI;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACS,IAAI;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACS,SAAS;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IACS,iBAAiB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IACzC,CAAC;IACS,YAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IACS,OAAO,CAAC,KAAY;QAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;SACvE;IACF,CAAC;IACS,KAAK,CAAC,KAAY;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IACS,UAAU,CAAC,KAAqB;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE;YACxB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IACS,MAAM,CAAC,KAAY;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;SACxH;IACF,CAAC;IACS,WAAW;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YACzB,OAAO,IAAI,CAAC;SACZ;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IACS,UAAU;QACnB,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC;SACZ;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE;YACjC,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IACS,iBAAiB,CAAC,IAAoB;QAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE;YAC/B,OAAO,IAAI,CAAC;SACZ;aAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,WAAW,EAAE;YAC3C,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IACS,gBAAgB;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACrC,OAAO,KAAK,CAAC;SACb;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;QAC7C,QAAQ,aAAa,EAAE;YACtB,KAAK,KAAK,CAAC,OAAO,CAAC;YACnB,KAAK,KAAK,CAAC,UAAU,CAAC;YACtB,KAAK,KAAK,CAAC,UAAU,CAAC;YACtB,KAAK,KAAK,CAAC,MAAM,CAAC;YAClB,KAAK,KAAK,CAAC,GAAG,CAAC;YAKf,KAAK,KAAK,CAAC,KAAK,CAAC;YACjB,KAAK,KAAK,CAAC,KAAK,CAAC;YACjB,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,IAAI,CAAC;YACb;gBACC,OAAO,KAAK,CAAC;SACd;IACF,CAAC;IACS,YAAY,CAAC,UAA0B;QAChD,OAAO,UAAU,YAAY,UAAU,CAAC;IACzC,CAAC;IACS,eAAe,CAAC,UAA0B;QACnD,OAAO,UAAU,YAAY,kBAAkB,IAAI,UAAU,YAAY,kBAAkB,CAAC;IAC7F,CAAC;IACS,sBAAsB,CAAC,UAA0B;QAE1D,IAAI,CAAC,CAAC,UAAU,YAAY,UAAU,CAAC,EAAE;YACxC,OAAO,KAAK,CAAC;SACb;QACD,IAAI,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE;YACvC,OAAO,KAAK,CAAC;SACb;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACS,SAAS,CAAC,UAA0B;QAC7C,OAAO,UAAU,YAAY,aAAa,IAAI,UAAU,YAAY,YAAY,CAAC;IAClF,CAAC;IACS,UAAU,CAAC,UAA0B;QAC9C,OAAO,UAAU,YAAY,gBAAgB,CAAC;IAC/C,CAAC;IACS,SAAS,CAAC,UAA0B;QAC7C,OAAO,UAAU,YAAY,aAAa,CAAC;IAC5C,CAAC;IACS,MAAM,CAAC,UAA0B;QAC1C,OAAO,UAAU,YAAY,cAAc,CAAC;IAC7C,CAAC;IACS,gBAAgB,CAAC,UAA0B;QACpD,OAAO,UAAU,YAAY,cAAc,CAAC;IAC7C,CAAC;IACS,cAAc,CAAC,UAA0B;QAClD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;YAChC,IAAI,UAAU,CAAC,SAAS,EAAE,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE;gBACxF,OAAO,IAAI,CAAC;aACZ;SACD;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IACS,0BAA0B,CAAC,UAA0B;QAC9D,OAAO,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/E,CAAC;IACS,eAAe;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO;SACP;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACnF,OAAO;SACP;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qCAAqC,CAAC,CAAC,CAAC;SAC1E;IACF,CAAC;IACS,iBAAiB;QAC1B,OAAO,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACS,YAAY,CAAC,OAAe;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IACnD,MAAM,CAAC,KAAK,CAAC,GAAW;QACvB,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,IAAI;QACH,MAAM,IAAI,GAAqB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;SACf;QACD,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAoBS,cAAc;QACvB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;YAC1B,KAAK,KAAK,CAAC,OAAO;gBACjB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1B,KAAK,KAAK,CAAC,SAAS;gBACnB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC9B,OAAO,cAAc,CAAC,QAAQ,CAAC;YAChC,KAAK,KAAK,CAAC,EAAE;gBACZ,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChC,KAAK,KAAK,CAAC,EAAE;gBACZ,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACrC,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnC,KAAK,KAAK,CAAC,GAAG;gBAIb,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjC,KAAK,KAAK,CAAC,QAAQ;gBAClB,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACtC,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnC,KAAK,KAAK,CAAC,MAAM;gBAChB,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACpC,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnC,KAAK,KAAK,CAAC,GAAG;gBACb,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjC,KAAK,KAAK,CAAC,MAAM;gBAChB,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAYpC,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACzC,KAAK,KAAK,CAAC,KAAK;gBACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;wBAClC,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;qBAClE;oBACD,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;iBACxD;YACF;gBACC,OAAO,IAAI,CAAC,kCAAkC,EAAE,CAAC;SAClD;IACF,CAAC;IACS,iBAAiB;QAY1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,QAAQ,YAAY,cAAc,EAAE;YACvC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;SAC5B;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACjE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,0DAA0D,CAAC,CAAC,CAAC;SAC/F;QACD,IAAI,UAAsC,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAE5B,IAAI,QAAoC,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,UAAU,EAAE;gBACf,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;aACjC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,KAAK,YAAY,cAAc,EAAE;gBACpC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;aACzB;YACD,UAAU,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SAClD;QACD,IAAI,YAAwC,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAC9B,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,YAAY,YAAY,cAAc,EAAE;gBAC3C,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;aAChC;SACD;QACD,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;IACS,UAAU;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE;gBACV,OAAO,KAAK,CAAC;aACb;iBAAM,IAAI,IAAI,YAAY,cAAc,EAAE;gBAC1C,SAAS;aACT;YACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACtB;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACd,CAAC;IAmBS,sBAAsB;QAC/B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;YAC1B,KAAK,KAAK,CAAC,QAAQ;gBAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;oBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;iBAC5D;gBACD,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1D,KAAK,KAAK,CAAC,KAAK;gBACf,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACrD,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACzC,KAAK,KAAK,CAAC,KAAK;gBACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;wBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;qBAClE;oBACD,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;iBACxD;gBACD,MAAM;YACP;gBACC,MAAM;SACP;QACD,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IACS,uBAAuB,CAAC,IAAkB;QACnD,IAAI,QAAoC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YACxC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;gBAElC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC/B,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;aAC9B;iBAAM;gBACN,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;aAClC;SACD;QACD,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IACS,gBAAgB;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,aAAa,YAAY,cAAc,EAAE;YAC5C,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC;SACjC;QACD,IAAI,aAAa,CAAC;QAClB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;SACtC;QACD,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC;IACS,qBAAqB;QAG9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,IAAI,YAAY,cAAc,EAAE;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACxB;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5B,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACS,mBAAmB;QAG5B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,IAAI,YAAY,cAAc,EAAE;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACxB;QACD,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACS,mBAAmB;QAG5B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;SAClE;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IACS,oBAAoB;QAO7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEjC,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAExD,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAC5C,MAAM,UAAU,GAAqB,EAAE,CAAC;YACxC,IAAI,KAAqB,CAAC;YAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAC3B,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;aAC/B;iBAAM;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC3B,IAAI,WAAW,EAAE;oBAChB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC,CAAC;iBAClE;gBACD,WAAW,GAAG,IAAI,CAAC;aACnB;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;mBACpC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;mBACpC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;gBACzC,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAChD,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE;oBACnD,SAAS;iBACT;gBACD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC3B;YACD,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAM,EAAE,KAAK,CAAC,CAAC;YAC1F,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACnB;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,eAAe,CAAC;IACxB,CAAC;IACS,iBAAiB;QAO1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvE,IAAI,WAA2B,CAAC;QAChC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE;YAC3E,WAAW,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;SAC/C;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACxC,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC;SACtC;aAAM;YACN,WAAW,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;SACjD;QACD,IAAI,WAAW,YAAY,gBAAgB,EAAE;YAE5C,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1C,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,OAAO,IAAI,SAAS,CAAC,WAA6B,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;SAC3E;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,OAAO,EAAE;YACZ,MAAM,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,IAAI,SAAS,YAAY,cAAc,EAAE;gBACxC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;aAC7B;YACD,IAAI,OAAO,IAAI,OAAO,KAAK,IAAI,EAAE;gBAChC,OAAO,IAAI,cAAc,CAAC,WAA6B,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;aAC5E;iBAAM,IAAI,OAAO,KAAK,IAAI,EAAE;gBAC5B,OAAO,IAAI,SAAS,CAAC,WAA6B,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;aACvE;iBAAM,IAAI,OAAO,KAAK,IAAI,EAAE;gBAC5B,OAAO,IAAI,SAAS,CAAC,WAA6B,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;aACvE;iBAAM;gBACN,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;aAC3E;SACD;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,SAAqC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACjC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;SAC7B;QACD,IAAI,eAA2C,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YACrC,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;SACjC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,IAAI,YAAY,cAAc,EAAE;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACxB;QACD,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACnE,CAAC;IACS,yBAAyB;QAKlC,IAAI,IAA6B,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAChC,QAAQ,KAAK,EAAE;YACd,KAAK,KAAK,CAAC,KAAK;gBACf,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,GAAG,OAAO,CAAC;gBACf,MAAM;YACP,KAAK,KAAK,CAAC,GAAG;gBACb,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,GAAG,KAAK,CAAC;YACd,KAAK,KAAK,CAAC,GAAG,CAAC;YACf;gBACC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,GAAG,KAAK,CAAC;gBACb,MAAM;SACP;QACD,MAAM,SAAS,GAAmB,EAAE,CAAC;QACrC,GAAG;YAEF,IAAI,IAAoB,CAAC;YACzB,IAAI,KAAiC,CAAC;YAGtC,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;gBAC7C,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;oBACjC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC;iBAC5D;aAKD;iBAAM;gBACN,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;aACtC;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;gBAC7B,KAAK,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;aACzC;iBAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;gBAE9B,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,EAAE;oBACpE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qCAAqC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;iBAC3F;aAED;YACD,SAAS,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAA4B,EAAE,KAAK,CAAC,CAAC,CAAC;SACtE,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAClC,OAAO,IAAI,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IACS,mBAAmB,CAAC,SAAkB;QAM/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAChC,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;gBACjC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC;aAC5D;YACD,OAAO,IAAI,CAAC;SACZ;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE;YAC9B,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;SACzC;aAAM,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;YAClC,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;SAC1C;aAAM;YACN,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;SAClF;IACF,CAAC;IACS,0BAA0B,CAAC,IAAqB;QACzD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;SACvB;aACI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,EAA0B,CAAC;YACtE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SACnD;aACI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,EAA0B,CAAC;YACtE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SACnD;aACI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC,CAAC;SAEtE;QACD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IACS,sBAAsB;QAK/B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,iBAAiB,CAAC,iBAAiB,CAAC;IAC5C,CAAC;IACS,mBAAmB;QAK5B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC,cAAc,CAAC;IACtC,CAAC;IACS,oBAAoB;QAO7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,WAAuC,CAAC;QAE5C,IAAI,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;SAKxF;aAAM;YACN,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;SACrC;QACD,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,OAAO,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IACS,kCAAkC;QAQ3C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;YAC1B,KAAK,KAAK,CAAC,QAAQ,CAAC;YACpB,KAAK,KAAK,CAAC,OAAO;gBACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACzD,KAAK,KAAK,CAAC,KAAK;gBACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7F,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;gBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAIlC,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;oBACvC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;oBAC/E,MAAM;iBACN;gBACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,kCAAkC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;aACxF;YACD;gBACC,MAAM;SACP;QACD,MAAM,oBAAoB,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,UAAU,GAAmB,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,oBAAoB,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;YAQ7F,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAA4D;gBACjG,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC;aACvC;YACD,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;SAC7B;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC;IACnB,CAAC;IACS,eAAe;QACxB,OAAO,IAAI,CAAC,2BAA2B,EAAE,CAAC;IAC3C,CAAC;IACS,wBAAwB;QACjC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,CAAC,CAAC;SAClF;QACD,OAAO,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IACS,oCAAoC;QAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;SAC9D;QACD,OAAO,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IACS,yBAAyB,CAAC,IAAkB;QAcrD,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAEzD,IAAI,GAAG,YAAY,CAAC,eAAe,CAAC;SACpC;QACD,IAAI,IAAgC,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YAC/C,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;SAC9B;QACD,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACS,eAAe;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;SAC3E;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;SACvB;QACD,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IACS,aAAa;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC7C,QAAQ,OAAO,CAAC,KAAK,EAAE;YACtB,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,eAAe,CAAC;YACxB,KAAK,KAAK,CAAC,KAAK;gBACf,OAAO,eAAe,CAAC;YACxB,KAAK,KAAK,CAAC,YAAY;gBACtB,OAAO,IAAI,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;YACrC;gBACC,MAAM;SACP;QACD,IAAI,MAAM,IAAI,aAAa,EAAE;YAC5B,OAAO,qBAAqB,CAAC;SAC7B;QACD,IAAI,MAAM,IAAI,MAAM,EAAE;YACrB,OAAO,cAAc,CAAC;SACtB;QACD,IAAI,MAAM,IAAI,MAAM,EAAE;YACrB,OAAO,cAAc,CAAC;SACtB;aACI,IAAI,MAAM,IAAI,WAAW,EAAE;YAC/B,OAAO,mBAAmB,CAAC;SAC3B;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IACS,oBAAoB,CAAC,IAAkB,EAAE,IAAqB;QAIvE,MAAM,YAAY,GAAiB,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,OAAO,GAAqB,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,IAAI,IAAI,EAAE;YACT,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAA4B,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;SACrG;QACD,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IACS,sBAAsB;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,YAAY,EAAE;YACjB,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACpD,OAAO,UAAU,CAAC;SAClB;aAAM;YACN,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAChC;IACF,CAAC;IACS,iBAAiB;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACb,CAAC;IACS,kBAAkB,CAAC,QAAe;QAG3C,MAAM,IAAI,GAAqB,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE;gBACV,MAAM;aACN;YACD,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE;gBAChC,SAAS;aACT;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAChB;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACS,wBAAwB,CAAC,YAA0B;QAY5D,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YAC/C,OAAO,IAAI,EAAE;gBACZ,MAAM,KAAK,GAAmB,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;gBACtE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,YAAY,CAAC,IAAI,EAAE;oBACtB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACpC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;qBACvD;oBACD,MAAM;iBACN;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;oBAAE,MAAM;gBACpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;oBAE5C,MAAM;iBACN;aACD;SACD;QACD,OAAO,UAAU,CAAC;IACnB,CAAC;IACS,oBAAoB,CAAC,YAA0B;QAGxD,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,WAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAC7B,IAAI,YAAY,CAAC,IAAI,EAAE;gBACtB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC,CAAC;aAC/D;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC/C,WAAW,GAAG,IAAI,KAAK,CAAC,OAA+B,EAAE,KAAK,CAAC,CAAC;SAChE;aAAM;YACN,WAAW,GAAG,IAAI,KAAK,CAAC,OAA+B,CAAC,CAAC;SACzD;QACD,OAAO,WAAW,CAAC;IACpB,CAAC;IACS,2BAA2B,CAAC,IAAmB;QAQxD,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,IAAI,GAAqB,EAAE,CAAC;QAClC,IAAI,UAA0B,CAAC;QAC/B,OAAO,IAAI,EAAE;YACZ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACvC,IAAI,IAAI,EAAE;oBACT,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;iBACjB;gBACD,OAAO,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;aAC9D;YACD,UAAU,GAAG,IAAI,CAAC,qCAAqC,EAAE,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,MAAM;YAEpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAEpF,MAAM;aACN;SACD;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,UAAU,CAAC;QACxC,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACS,4BAA4B,CAAC,IAAsB,EAAE,aAAqB;QACnF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAmB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,mDAAmD,CAAC,CAAC,CAAC;SACxF;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,yEAAyE,CAAC,CAAC,CAAC;SAC9G;QAID,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC1F,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,6BAA6B,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;SACnF;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACS,0BAA0B,CAAC,IAAsB;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;SAAE;QAC1C,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACS,qBAAqB;QAc9B,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,iCAAiC,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IACS,WAAW,CAAC,UAA0B;QAC/C,IAAI,UAAU,YAAY,oBAAoB,EAAE;YAC/C,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,EAA0B,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;SACtF;QACD,IAAI,UAAU,YAAY,kBAAkB,EAAE;YAC7C,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,EAA0B,CAAC,CAAC;SAC/D;QACD,OAAO,IAAI,KAAK,CAAC,UAAkC,CAAC,CAAC;IACtD,CAAC;IACS,sBAAsB;QAgB/B,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,IAAI,GAAsB,iBAAiB,CAAC,MAAM,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE;gBAE7E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACvC,OAAO,IAAI,CAAC,oCAAoC,EAAE,CAAC;iBACnD;gBAAA,CAAC;gBAEF,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACrF,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBACpB,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC;iBAC/B;aACD;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACpC,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAY,EAAE,CAAC;gBAC3B,IAAI,IAAI,YAAY,kBAAkB,EAAE;oBACvC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;iBAC5D;qBAAM;oBACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;iBACpC;gBACD,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;aACpD;YACD,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;SAC9C;QAED,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACjC,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SAC1C;QAED,QAAQ,KAAK,CAAC,KAAK,EAAE;YACpB,KAAK,KAAK,CAAC,GAAG;gBACb,OAAO,IAAI,CAAC,2CAA2C,EAAE,CAAC;YAC3D,KAAK,KAAK,CAAC,IAAI;gBACd,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO,QAAQ,CAAC;YACjB,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,UAAU;gBAIpB,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAClC,KAAK,KAAK,CAAC,QAAQ;gBAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;oBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;iBAC5D;gBACD,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1D,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjB,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;aACnC;YACD,KAAK,KAAK,CAAC,MAAM;gBAChB,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAEtC,KAAK,KAAK,CAAC,UAAU;gBACpB,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEtC,KAAK,KAAK,CAAC,OAAO;gBACjB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAEvC,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAClC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;oBAIpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACrC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;qBACzF;oBACD,OAAO,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;iBACpE;gBAID,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,UAA0B,CAAC;gBAC/B,MAAM,IAAI,GAAiB,EAAE,CAAC;gBAC9B,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACrC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC7B,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;iBAC5D;qBAAM,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACpF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC7B,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;iBAC3D;qBAAM;oBACN,UAAU,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;iBACpD;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACjC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACpC,IAAI,UAAU,YAAY,kBAAkB,EAAE;wBAC7C,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;qBAC9G;yBAAM;wBACN,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;qBAC/F;iBACD;gBACD,OAAO,UAAU,CAAC;aAClB;YACD,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,IAAgC,CAAC;gBACrC,IAAI,gBAAgB,GAAG,KAAK,CAAC;gBAC7B,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;oBAC7B,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpD,gBAAgB,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;iBACpE;gBACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;aACtD;YACD,KAAK,KAAK,CAAC,iBAAiB;gBAC3B,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACpC;gBACC,MAAM;SACP;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IACS,oBAAoB,CAAC,GAAoB;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAwB,CAAC;QAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAE7E,IAAI,GAAG,EAAE;YACR,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SAClE;aAAM;YACN,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACpD;IACF,CAAC;IACS,2CAA2C;QACpD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,QAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YACrF,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC;SAC3D;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,sCAAsC,CAAC,CAAC,CAAC;SAC3E;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAC5C,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;SACxD;aAAM;YACN,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;SACxC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YAE5C,MAAM,IAAI,GAAqB,IAAI,CAAC,cAAc,EAAE,CAAC;YACrD,QAAQ,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7C,OAAO,IAAI,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;SACxD;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAAC,CAAC;SACvE;QACD,OAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IACS,cAAc,CAAC,UAAiC;QAIzD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClC,MAAM,IAAI,GAAqB,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,QAAQ,GAAmB,IAAI,CAAC,qCAAqC,EAAE,CAAC;YAC5E,IAAI,oBAAoB,CAAC,cAAc,KAAK,UAAU,EAAE;gBACvD,IAAI,QAAQ,EAAE;oBACb,IAAI,QAAQ,YAAY,oBAAoB,EAAE;wBAC7C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qDAAqD,CAAC,CAAC,CAAC;qBAC1F;oBACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACpC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC,CAAC;qBACjE;iBACD;aACD;YACD,IAAI,QAAQ,EAAE;gBACb,QAAQ,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;aACvC;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,MAAM;SACpC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,uCAAuC,CAAC,CAAC,CAAC;SAC5E;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACS,qCAAqC;QAO9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAA4B;YAC9D,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;SACnC;QACD,IAAI,UAAU,GAAmB,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAAE,OAAO,UAAU,CAAC;QAExD,IAAI,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE;gBACxE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC,CAAC;aACrE;YACD,IAAI,UAAU,YAAY,kBAAkB,EAAE;gBAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAA4B,CAAC,CAAC,CAAC;gBAChG,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;aACxE;YACD,IAAI,UAAU,YAAY,kBAAkB,EAAE;gBAC7C,OAAO,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,EAA0B,CAAC,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;aAC3H;YACD,OAAO,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;SACzF;QACD,IAAI,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE;YAC5C,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE;gBACrC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,8BAA8B,CAAC,CAAC,CAAC;aACnE;SACD;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;SAEvC;aAAM,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;YAEhE,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE;aAYrC;SAED;aAAM;YACN,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,UAAU,CAAC,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,8BAA8B,CAAC,CAAC,CAAC;aACnE;YACD,IAAI,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE;gBACpC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC,CAAC;aAChE;SACD;QAED,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEjB,MAAM,KAAK,GAAmB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAG/D,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,8BAA8B,CAAC,CAAC,CAAC;SACnE;QACD,OAAO,IAAI,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAwB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACxF,CAAC;IACS,yBAAyB;QAClC,OAAO,IAAI,CAAC,qCAAqC,EAAE,CAAC;IACrD,CAAC;IACS,yBAAyB,CAAC,UAA4B,EAAE,IAAuB,EAAE,IAAc;QACxG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC3C,OAAO,IAAI,uBAAuB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IACS,kBAAkB;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;SACvC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACS,iBAAiB,CAAC,SAAkB;QAI7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAE1B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;YACrC,IAAI,IAAoB,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACpC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,SAAS;aACT;iBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,oCAAoC,EAAE,CAAC;gBAC7D,IAAI,GAAG,SAAS;oBACf,CAAC,CAAC,IAAI,WAAW,CAAC,QAAgC,CAAC;oBACnD,CAAC,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAA;gBAE9B,IAAI,gBAAgB,GAAG,CAAC,EAAE;oBACzB,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;iBACjC;gBACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACpC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;iBAC7E;aACD;iBAAM;gBACN,IAAI,GAAG,IAAI,CAAC,oCAAoC,EAAE,CAAC;aACnD;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClB;QACD,IAAI,SAAS,EAAE;YACd,OAAO,IAAI,YAAY,CAAC,MAAgC,CAAC,CAAC;SAC1D;QACD,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACS,oCAAoC;QAC7C,OAAO,IAAI,CAAC,qCAAqC,EAAE,CAAC;IACrD,CAAC;IACS,kBAAkB,CAAC,SAAkB;QAI9C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAClC,MAAM,QAAQ,GAAmB,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC;YAC/E,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;gBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACzB;SACD;QACD,IAAI,SAAS,EAAE;YACd,OAAO,IAAI,aAAa,CAAC,UAAwC,CAAC,CAAC;SACnE;QACD,OAAO,IAAI,gBAAgB,CAAC,UAAwB,CAAC,CAAC;IACvD,CAAC;IACS,6BAA6B,CAAC,SAAkB;QACzD,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAgC,CAAC;QAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEpD,QAAQ,QAAQ,CAAC,IAAI,EAAE;YACtB,KAAK,YAAY,CAAC,MAAM;gBACvB,IAAI,KAAK,GAAgC,cAA+B,CAAC;gBACzE,IAAI,SAAS,EAAE;oBACd,KAAK,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,WAAW,EAA0B,CAAC,CAAC;iBACrE;gBACD,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,oCAAoC,EAAE,CAAC;gBAC1D,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACnD;YAED,KAAK,YAAY,CAAC,MAAM,CAAC;YACzB,KAAK,YAAY,CAAC,qBAAqB,CAAC;YACxC,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC;gBAQ5B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE;oBACtC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC;iBAC5D;gBACD,IAAI,KAAqB,CAAC;gBAC1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;oBACrC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAC7C,KAAK,GAAG,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAwB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;iBACzF;qBAAM;oBACN,KAAK,GAAG,GAAG,CAAC;iBACZ;gBACD,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACnD;YAED,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;gBAKzB,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC3D,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACnD;YAED,KAAK,YAAY,CAAC,cAAc,CAAC;YACjC,KAAK,YAAY,CAAC,cAAc,CAAC,CAAC;gBACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,IAAI,YAAY,CAAC,cAAc,CAAC;gBAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC3D,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aAClE;YAED,KAAK,YAAY,CAAC,UAAU,CAAC;YAC7B,KAAK,YAAY,CAAC,MAAM;gBACvB,OAAO,QAAQ,CAAC;SACjB;IACF,CAAC;IACS,aAAa,CAAC,QAA0B;QACjD,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAE5B,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;mBAC9B,0BAA0B,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC;mBACrD,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE;gBAC/C,OAAO,eAAe,CAAC;aACvB;YACD,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;YACpC,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC;SACvC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAE1B,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;YACpC,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC,eAAe,CAAC;SACjD;QAED,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,QAAQ,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACvG,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE;gBAC5D,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;aACnE;YACD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC5B,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,cAAc,CAAC;aAC5C;iBAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACnC,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,cAAc,CAAC;aAC5C;SACD;QACD,IAAI,YAA4B,CAAC;QACjC,QAAQ,SAAS,CAAC,KAAK,EAAE;YACxB,KAAK,KAAK,CAAC,YAAY;gBACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjC,IAAI,QAAQ,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,EAAE;oBACzC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;iBACxD;gBACD,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpC,MAAM;YACP,KAAK,KAAK,CAAC,MAAM,CAAC;YAClB,KAAK,KAAK,CAAC,MAAM,CAAC;YAClB,KAAK,KAAK,CAAC,MAAM;gBAIhB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC9B,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,GAAI,YAA8B,CAAC,QAAQ,EAAE,CAAC;gBAC3D,MAAM;YACP,KAAK,KAAK,CAAC,UAAU;gBAEpB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC/B,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC9B,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,EAAE;oBAC1C,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;iBACxD;gBACD,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;gBACxC,OAAO,YAAY,CAAC;YACrB,KAAK,KAAK,CAAC,QAAQ;gBAClB,IAAI,QAAQ,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,EAAE;oBACzC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC7B,YAAY,GAAG,IAAI,CAAC,oCAAoC,EAAE,CAAC;oBAC3D,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;oBAEpC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,EAAE;wBACnD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,yCAAyC,CAAC,CAAC,CAAC;qBAC9E;oBACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;wBACzC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC;qBACzD;oBACD,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;oBACxC,OAAO,YAAY,CAAC;iBACpB;YACF;gBACC,YAAY,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAEtE,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;gBACxC,MAAM;SACP;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,EAAE;YAC1C,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SACxD;QACD,OAAO,YAAY,CAAC;IACrB,CAAC;IACS,iCAAiC,CAAC,UAA0B;QACrE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QAC1D,OAAO,IAAI,CAAC,mCAAmC,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC;IACS,mCAAmC,CAAC,UAA0B;QACvE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC,CAAC;SAChE;QAGD,GAAG;YACF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;gBAC1B,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;oBACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;oBACjD,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;oBAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC9B,MAAM;iBACN;gBACD,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;oBAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM,GAAG,GAAmB,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACrD,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC1D,MAAM;iBACN;gBACD,KAAK,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBAC7B,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;oBACnD,MAAM;iBACN;gBACD;oBACC,MAAM;aACP;SACD,QAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;QAC5C,OAAO,UAAU,CAAC;IACnB,CAAC;IACS,iBAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,YAAY,UAAU,EAAE;YAC1C,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;SACvB;QAED,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACrC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;SAC5C;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACrF,CAAC;IACS,uBAAuB,CAAC,UAA0B;QAY3D,IAAI,KAAY,CAAC;QACjB,OAAO,KAAK,CAAC,kBAAkB,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;YAC3D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;SAChD;QACD,OAAO,UAAU,CAAC;IACnB,CAAC;IACS,iBAAiB,CAAC,GAAmB;QAC9C,IAAI,IAAgC,CAAC;QACrC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAExB,QAAQ,KAAK,CAAC,KAAK,EAAE;YACpB,KAAK,KAAK,CAAC,QAAQ;gBAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;oBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACxB,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;oBAC5D,MAAM;iBACN;gBACD,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACzD,MAAM;YACP,KAAK,KAAK,CAAC,KAAK;gBACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;wBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACxB,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;wBAClE,MAAM;qBACN;oBACD,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBACxD,MAAM;iBACN;gBACD,MAAM;YACP;gBACC,MAAM;SACP;QACD,IAAI,IAAI,EAAE;YACT,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SACzC;QACD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YAGtC,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACrC,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SACzC;QAGD,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1C,IAAI,IAAI,GAAsC,EAAE,CAAC;QACjD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;YAC1B,KAAK,KAAK,CAAC,KAAK;gBAEf,GAAG;oBACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;wBAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBAChC,IAAI,QAAQ,EAAE;4BACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;yBAClB;6BAAM;4BACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACf;qBACD;yBAAM;wBACN,MAAM,GAAG,GAAG,IAAI,CAAC,qCAAqC,EAAE,CAAC;wBACzD,IAAI,QAAQ,EAAE;4BACb,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;yBAClC;6BAAM;4BACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACf;qBACD;iBACD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAC1C,MAAM;YACP,KAAK,KAAK,CAAC,aAAa;gBAEvB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAClC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;oBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;wBAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBAChC,OAAO,GAAG,IAAI,CAAC;wBACf,IAAI,QAAQ,EAAE;4BACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;yBAClB;6BAAM;4BACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACf;qBACD;yBAAM;wBACN,MAAM,GAAG,GAAG,IAAI,CAAC,qCAAqC,EAAE,CAAC;wBACzD,IAAI,QAAQ,EAAE;4BACb,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;yBAClC;6BAAM;4BACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACf;qBACD;oBACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;iBACxB;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAEjC,IAAI,CAAC,OAAO,EAAE;oBAEb,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,IAAwB,CAAC,CAAC;oBAC1D,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;iBACzC;gBACD,MAAM;YACP;gBACC,MAAM;SACP;QACD,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IACS,0BAA0B;QAMnC,IAAI,UAAU,GAAmB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC/D,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3G,CAAC;IACS,sBAAsB;QAQ/B,IAAI,UAAU,GAAmB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC9C,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;SACrE;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACtC,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;SACrD;QACD,OAAO,UAAU,CAAC;IACnB,CAAC;IACS,uBAAuB,CAAC,CAAiB,EAAE,IAAY,EAAE,KAAa;QAC/E,GAAG;YAEF,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,KAAK,EAAE;gBACnD,IAAI,CAAiB,CAAC;gBACtB,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAErB,MAAM,oBAAoB,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAClD,MAAM,SAAS,GAAG,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC3D,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBAO1C,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;oBAE9B,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;oBACnB,QAAQ,EAAE,CAAC,KAAK,EAAE;wBACjB,KAAK,KAAK,CAAC,EAAE;4BAAE,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;4BAAC,MAAM;wBACrC,KAAK,KAAK,CAAC,SAAS;4BAAE,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;4BAAC,MAAM;wBACnD,OAAO,CAAC,CAAC,MAAM;qBACf;oBACD,CAAC,GAAG,sCAAsC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;oBACtD,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;wBAEtB,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;qBACvC;iBACD;qBAAM;oBACN,CAAC,GAAG,sCAAsC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;iBAC3D;aACD;YACD,EAAE,KAAK,CAAC;SACR,QAAQ,KAAK,IAAI,IAAI,EAAE;QAExB,OAAO,CAAC,CAAC;IACV,CAAC;IACS,qBAAqB,CAAC,UAAkB;QACjD,MAAM,CAAC,GAAmB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACtD,IAAI,WAAW,IAAI,UAAU,EAAE;YAC9B,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;SAChE;QACD,OAAO,CAAC,CAAC;IACV,CAAC;IACS,oBAAoB;QAc7B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,4BAA4B,EAAE,CAAC;SAC3C;QACD,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;SACnC;QACD,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC;IACtC,CAAC;IACS,4BAA4B;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;YAC5B,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;oBAElC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,sDAAsD,CAAC,CAAC,CAAC;iBAC3F;gBACD,IAAI,UAAU,YAAY,gBAAgB,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;oBAClG,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,0CAA0C,CAAC,CAAC,CAAC;iBAC/E;aACD;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAClC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,uCAAuC,CAAC,CAAC,CAAC;aAC5E;SACD;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;YAEvD,OAAO,oBAAoB,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;SAClD;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACrE,CAAC;IACS,sBAAsB;QAI/B,MAAM,UAAU,GAAmB,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACtE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE;YACpF,OAAO,UAAU,CAAC;SAClB;QACD,OAAO,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IACS,wBAAwB,CAAC,UAA0B;QAC5D,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,UAAU,CAAC,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC,CAAC;SACjE;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,sBAAsB,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IACS,2BAA2B;QAGpC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAC9D,OAAO,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IACS,6BAA6B,CAAC,MAAsB;QAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;eACvC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;eACzB,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;eAC/C,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;YAC1E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAEpC,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,cAAc,CAAC;gBAE5C,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;aAC7C;YACD,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAC;SAC9D;QAED,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,GAAG;YACF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;gBAE1B,KAAK,KAAK,CAAC,eAAe,CAAC,CAAC;oBAC3B,IAAI,UAAU,EAAE;wBACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC;qBACzD;oBACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBACpC,UAAU,GAAG,IAAI,CAAC;oBAClB,gBAAgB,GAAG,IAAI,CAAC;oBACxB,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;wBAAE,SAAS;oBACxD,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACrC,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;oBAC9D,MAAM;iBACN;gBAGD,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;oBACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;oBACjD,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;oBAC/D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC9B,MAAM;iBACN;gBAGD,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;oBAClB,IAAI,UAAU,EAAE;wBACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;qBAC1E;oBACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACrC,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;oBAC9D,MAAM;iBACN;gBAGD,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;oBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;oBACnC,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE;wBACjC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC,CAAC;qBACpE;oBACD,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;oBACtD,MAAM;iBACN;gBAGD,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChB,IAAI,UAAU,EAAE;wBACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;qBAC1E;oBACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACrC,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;oBAC5D,MAAM;iBACN;gBAGD,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;oBACzB,IAAI,UAAU,EAAE;wBACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC;qBACzD;oBACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBAClC,UAAU,GAAG,IAAI,CAAC;oBAClB,gBAAgB,GAAG,IAAI,CAAC;oBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACrC,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;oBAC3D,MAAM;iBACN;gBAED;oBAEC,IAAI,gBAAgB,EAAE;wBACrB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,uCAAuC,CAAC,CAAC,CAAC;qBAC5E;oBAED,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBAC3C,MAAM;aACP;YACD,IAAI,UAAU,EAAE;gBACf,UAAU,GAAG,KAAK,CAAC;aACnB;SACD,QAAQ,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;QACpD,IAAI,gBAAgB,EAAE;YACrB,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;SACrC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IACS,oBAAoB;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC,CAAC;SACnF;QACD,OAAO,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACS,sBAAsB,CAAC,UAA0B;QAW1D,MAAM,IAAI,GAAqB,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE5B,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SACtB;QACD,UAAU,GAAG,IAAI,CAAC,GAAG,EAAG,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE;aACzB,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAqB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;QAClI,OAAO,UAAU,CAAC;IACnB,CAAC;IACS,4BAA4B,CAAC,UAA0B;QAChE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,IAAI,GAAmB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC/C,OAAO,IAAI,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IACS,oBAAoB;QAG7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,UAAsC,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC1B,UAAU,GAAG,IAAI,CAAC;SAClB;QACD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;YAC1B,KAAK,KAAK,CAAC,GAAG,CAAC;YACf,KAAK,KAAK,CAAC,SAAS,CAAC;YACrB,KAAK,KAAK,CAAC,OAAO,CAAC;YACnB,KAAK,KAAK,CAAC,UAAU,CAAC;YACtB,KAAK,KAAK,CAAC,aAAa,CAAC;YACzB,KAAK,KAAK,CAAC,KAAK,CAAC;YACjB,KAAK,KAAK,CAAC,KAAK,CAAC;YACjB,KAAK,KAAK,CAAC,EAAE;gBAKZ,IAAI,CAAC,UAAU;oBAAE,MAAM;gBAGvB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAAC,CAAC;YACxE;gBACC,UAAU,GAAG,IAAI,CAAC,qCAAqC,EAAE,CAAC;gBAC1D,MAAM;SACP;QACD,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC;IACS,wBAAwB;QACjC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAC9E,CAAC;IACS,qBAAqB,CAAC,KAAmC,EAAE,aAAsB;QAC1F,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACzE,CAAC;IACS,iBAAiB,CAAC,IAAgC,EAAE,gBAAyB;QACtF,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACzE,CAAC;IACS,oBAAoB;QAC7B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACS,sBAAsB;QAC/B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC1E,CAAC;CACD","sourcesContent":["import type { CanDeclareExpression, ExpressionNode } from '../api/expression.js';\nimport { Token, TokenExpression } from './token.js';\nimport { PreTemplateLiteral, TokenStream } from './stream.js';\nimport {\n\tOfNode, Identifier, ThisNode,\n\tGetIdentifier, SetIdentifier, AsyncIdentifier,\n\tNullNode, StringLiteral, AwaitIdentifier,\n\tConstructorIdentifier, NameIdentifier,\n\tEvalIdentifier, ArgumentsIdentifier, TaggedTemplateExpression, TemplateLiteral\n} from '../api/definition/values.js';\nimport { EmptyStatement } from '../api/statement/control/empty.js';\nimport { BlockStatement } from '../api/statement/control/block.js';\nimport {\n\tArrowFunctionExpression, ArrowFunctionType, FunctionKind,\n\tParam, FunctionExpression, FunctionDeclaration\n} from '../api/definition/function.js';\nimport { IfStatement } from '../api/statement/control/if.js';\nimport { NewExpression } from '../api/computing/new.js';\nimport { SpreadElement } from '../api/computing/spread.js';\nimport { RestElement } from '../api/computing/rest.js';\nimport { AssignmentExpression, AssignmentOperator } from '../api/operators/assignment.js';\nimport { GroupingExpression } from '../api/operators/grouping.js';\nimport { MemberExpression } from '../api/definition/member.js';\nimport { BindExpression } from '../api/definition/bind.js';\nimport { ObjectExpression, Property, ObjectPattern } from '../api/definition/object.js';\nimport { ArrayExpression, ArrayPattern } from '../api/definition/array.js';\nimport { CallExpression } from '../api/computing/call.js';\nimport { DoWhileNode, WhileNode } from '../api/statement/iterations/while.js';\nimport { CatchClauseNode, ThrowStatement, TryCatchNode } from '../api/computing/throw.js';\nimport { SwitchCase, DefaultExpression, SwitchStatement } from '../api/statement/control/switch.js';\nimport { BreakStatement, ContinueStatement } from '../api/statement/control/terminate.js';\nimport { ReturnStatement } from '../api/computing/return.js';\nimport { YieldExpression } from '../api/computing/yield.js';\nimport { VariableNode, VariableDeclarationNode } from '../api/statement/declarations/declares.js';\nimport { ForNode, ForOfNode, ForInNode, ForAwaitOfNode, ForDeclaration } from '../api/statement/iterations/for.js';\nimport { ConditionalExpression } from '../api/operators/ternary.js';\nimport { PipelineExpression } from '../api/operators/pipeline.js';\nimport { LogicalExpression, LogicalOperator } from '../api/operators/logical.js';\nimport { SequenceExpression } from '../api/operators/comma.js';\nimport { ChainExpression } from '../api/operators/chaining.js';\nimport { ExpressionStatement } from '../api/definition/statement.js';\nimport {\n\tbuildPostfixExpression, buildUnaryExpression,\n\texpressionFromLiteral, shortcutNumericLiteralBinaryExpression\n} from './nodes.js';\nimport { BinaryExpression } from '../api/operators/binary.js';\n\nexport enum ParsingArrowHeadFlag { CertainlyNotArrowHead, MaybeArrowHead, AsyncArrowFunction }\nexport enum PropertyKind {\n\tValue, Shorthand, ShorthandOrClassField,\n\tAssign, Method, ClassField, AccessorGetter, AccessorSetter,\n\tSpread, NotSet\n}\nexport type PropertyKindInfo = { kind?: PropertyKind, funcFlag?: FunctionKind, name: string };\nexport type FunctionInfo = { rest?: boolean };\nexport function parsePropertyKindFromToken(token: Token, info: PropertyKindInfo) {\n\tswitch (token) {\n\t\tcase Token.COLON:\n\t\t\tinfo.kind = PropertyKind.Value;\n\t\t\treturn true;\n\t\tcase Token.COMMA:\n\t\t\tinfo.kind = PropertyKind.Shorthand;\n\t\t\treturn true;\n\t\tcase Token.R_CURLY:\n\t\t\tinfo.kind = PropertyKind.ShorthandOrClassField;\n\t\t\treturn true;\n\t\tcase Token.ASSIGN:\n\t\t\tinfo.kind = PropertyKind.Assign;\n\t\t\treturn true;\n\t\tcase Token.L_PARENTHESES:\n\t\t\tinfo.kind = PropertyKind.Method;\n\t\t\treturn true;\n\t\tcase Token.MUL:\n\t\tcase Token.SEMICOLON:\n\t\t\tinfo.kind = PropertyKind.ClassField;\n\t\t\treturn true;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\treturn false;\n}\n\nexport enum PreParserIdentifierType {\n\tNullIdentifier = 'NullIdentifier',\n\tUnknownIdentifier = 'UnknownIdentifier',\n\tEvalIdentifier = 'EvalIdentifier',\n\tArgumentsIdentifier = 'ArgumentsIdentifier',\n\tConstructorIdentifier = 'ConstructorIdentifier',\n\tAwaitIdentifier = 'AwaitIdentifier',\n\tAsyncIdentifier = 'AsyncIdentifier',\n\tNameIdentifier = 'NameIdentifier',\n\tPrivateNameIdentifier = 'PrivateNameIdentifier'\n}\n\nexport abstract class AbstractParser {\n\tconstructor(protected scanner: TokenStream) { }\n\tabstract scan(): ExpressionNode;\n\tprotected position() {\n\t\treturn this.scanner.getPos();\n\t}\n\tprotected current() {\n\t\treturn this.scanner.currentToken();\n\t}\n\tprotected next() {\n\t\treturn this.scanner.next();\n\t}\n\tprotected peek(): TokenExpression {\n\t\treturn this.scanner.peek();\n\t}\n\tprotected peekAhead(): TokenExpression {\n\t\treturn this.scanner.peekAhead();\n\t}\n\tprotected peekAheadPosition() {\n\t\treturn this.scanner.peekAheadPosition();\n\t}\n\tprotected peekPosition() {\n\t\treturn this.scanner.peekPosition();\n\t}\n\tprotected consume(token: Token) {\n\t\tif (this.scanner.next().isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing ${JSON.stringify(token)}`));\n\t\t}\n\t}\n\tprotected check(token: Token): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.isType(token)) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected checkValue(value: ExpressionNode): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.value == value) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected expect(token: Token) {\n\t\tconst current = this.scanner.next();\n\t\tif (current.isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(token)}, current is ${JSON.stringify(current)}`));\n\t\t}\n\t}\n\tprotected checkInOrOf(): 'IN' | 'OF' | false {\n\t\tif (this.check(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (this.checkValue(OfNode)) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected peekInOrOf(): 'IN' | 'OF' | false {\n\t\tvar next = this.peek();\n\t\tif (next.isType(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (next.value === OfNode) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isEvalOrArguments(name: ExpressionNode): boolean {\n\t\tif (name.toString() === 'eval') {\n\t\t\treturn true;\n\t\t} else if (name.toString() === 'arguments') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isNextLetKeyword() {\n\t\tif (this.peek().isNotType(Token.LET)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst nextNextToken = this.peekAhead().token;\n\t\tswitch (nextNextToken) {\n\t\t\tcase Token.L_CURLY:\n\t\t\tcase Token.L_BRACKETS:\n\t\t\tcase Token.IDENTIFIER:\n\t\t\tcase Token.STATIC:\n\t\t\tcase Token.LET: // `let let;` is disallowed by static semantics, but the\n\t\t\t// token must be first interpreted as a keyword in order\n\t\t\t// for those semantics to apply. This ensures that ASI is\n\t\t\t// not honored when a LineTerminator separates the\n\t\t\t// tokens.\n\t\t\tcase Token.YIELD:\n\t\t\tcase Token.AWAIT:\n\t\t\tcase Token.GET:\n\t\t\tcase Token.SET:\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tprotected isIdentifier(expression: ExpressionNode): expression is Identifier {\n\t\treturn expression instanceof Identifier;\n\t}\n\tprotected isParenthesized(expression: ExpressionNode): expression is (GroupingExpression | SequenceExpression) {\n\t\treturn expression instanceof GroupingExpression || expression instanceof SequenceExpression;\n\t}\n\tprotected isAssignableIdentifier(expression: ExpressionNode): boolean {\n\t\t// return expression instanceof AssignmentNode;\n\t\tif (!(expression instanceof Identifier)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.isEvalOrArguments(expression)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tprotected isPattern(expression: ExpressionNode): expression is (ObjectPattern | ArrayPattern) {\n\t\treturn expression instanceof ObjectPattern || expression instanceof ArrayPattern;\n\t}\n\tprotected isProperty(expression: ExpressionNode): expression is MemberExpression {\n\t\treturn expression instanceof MemberExpression;\n\t}\n\tprotected isCallNew(expression: ExpressionNode): expression is NewExpression {\n\t\treturn expression instanceof NewExpression;\n\t}\n\tprotected isCall(expression: ExpressionNode): expression is CallExpression {\n\t\treturn expression instanceof CallExpression;\n\t}\n\tprotected isEmptyStatement(expression: ExpressionNode): expression is EmptyStatement {\n\t\treturn expression instanceof EmptyStatement;\n\t}\n\tprotected isThisProperty(expression: ExpressionNode): boolean {\n\t\tif (this.isProperty(expression)) {\n\t\t\tif (expression.getObject() === ThisNode || expression.getObject().toString() === 'this') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isValidReferenceExpression(expression: ExpressionNode): boolean {\n\t\treturn this.isAssignableIdentifier(expression) || this.isProperty(expression);\n\t}\n\tprotected expectSemicolon() {\n\t\tconst tok = this.peek();\n\t\tif (tok.isType(Token.SEMICOLON)) {\n\t\t\tthis.next();\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tok.token)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.currentToken().isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`Await Not In Async Context/Function`));\n\t\t}\n\t}\n\tprotected peekAnyIdentifier() {\n\t\treturn Token.isAnyIdentifier(this.peek().token);\n\t}\n\tprotected errorMessage(message: string): string {\n\t\treturn this.scanner.createError(message);\n\t}\n}\n\nexport class JavaScriptParser extends AbstractParser {\n\tstatic parse(app: string) {\n\t\tconst stream = TokenStream.getTokenStream(app);\n\t\tconst parser = new JavaScriptParser(stream);\n\t\treturn parser.scan();\n\t}\n\tscan(): ExpressionNode {\n\t\tconst list: ExpressionNode[] = this.parseStatementList(Token.EOS);\n\t\tif (list.length === 1) {\n\t\t\treturn list[0];\n\t\t}\n\t\treturn new ExpressionStatement(list);\n\t}\n\n\t/**\n\t * Statement ::\n\t * Block\n\t * VariableStatement\n\t * EmptyStatement\n\t * ExpressionStatement\n\t * IfStatement\n\t * IterationStatement\n\t * ContinueStatement\n\t * BreakStatement\n\t * ReturnStatement\n\t * WithStatement\n\t * LabelledStatement\n\t * SwitchStatement\n\t * ThrowStatement\n\t * TryStatement\n\t * DebuggerStatement\n\t */\n\tprotected parseStatement(): ExpressionNode {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseBlock();\n\t\t\tcase Token.SEMICOLON:\n\t\t\t\tthis.consume(Token.SEMICOLON);\n\t\t\t\treturn EmptyStatement.INSTANCE;\n\t\t\tcase Token.IF:\n\t\t\t\treturn this.parseIfStatement();\n\t\t\tcase Token.DO:\n\t\t\t\treturn this.parseDoWhileStatement();\n\t\t\tcase Token.WHILE:\n\t\t\t\treturn this.parseWhileStatement();\n\t\t\tcase Token.FOR:\n\t\t\t\t// if (this.peekAhead().isType(Token.AWAIT)) {\n\t\t\t\t// \treturn this.parseForAwaitStatement();\n\t\t\t\t// }\n\t\t\t\treturn this.parseForStatement();\n\t\t\tcase Token.CONTINUE:\n\t\t\t\treturn this.parseContinueStatement();\n\t\t\tcase Token.BREAK:\n\t\t\t\treturn this.parseBreakStatement();\n\t\t\tcase Token.RETURN:\n\t\t\t\treturn this.parseReturnStatement();\n\t\t\tcase Token.THROW:\n\t\t\t\treturn this.parseThrowStatement();\n\t\t\tcase Token.TRY:\n\t\t\t\treturn this.parseTryStatement();\n\t\t\tcase Token.SWITCH:\n\t\t\t\treturn this.parseSwitchStatement();\n\t\t\t// case Token.FUNCTION:\n\t\t\t// \t// FunctionDeclaration only allowed as a StatementListItem, not in\n\t\t\t// \t// an arbitrary Statement position. Exceptions such as\n\t\t\t// \t// ES#sec-functiondeclarations-in-ifstatement-statement-clauses\n\t\t\t// \t// are handled by calling ParseScopedStatement rather than\n\t\t\t// \t// ParseStatement directly.\n\t\t\t// \timpl() -> ReportMessageAt(scanner() -> peek_location(),\n\t\t\t// \t\tis_strict(language_mode())\n\t\t\t// \t\t\t? MessageTemplate.kStrictFunction\n\t\t\t// \t\t\t: MessageTemplate.kSloppyFunction);\n\t\t\t// \treturn impl() -> NullStatement();\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn this.parseExpressionOrLabelledStatement();\n\t\t}\n\t}\n\tprotected parseTryStatement(): ExpressionNode {\n\t\t// TryStatement ::\n\t\t// 'try' Block Catch\n\t\t// 'try' Block Finally\n\t\t// 'try' Block Catch Finally\n\t\t//\n\t\t// Catch ::\n\t\t// 'catch' '(' Identifier ')' Block\n\t\t//\n\t\t// Finally ::\n\t\t// 'finally' Block\n\n\t\tthis.consume(Token.TRY);\n\t\tconst tryBlock = this.parseBlock();\n\t\tif (tryBlock instanceof BlockStatement) {\n\t\t\ttryBlock.isStatement = true;\n\t\t}\n\t\tlet peek = this.peek();\n\t\tif (peek.isNotType(Token.CATCH) && peek.isNotType(Token.FINALLY)) {\n\t\t\tthrow new Error(this.errorMessage(`Uncaught SyntaxError: Missing catch or finally after try`));\n\t\t}\n\t\tlet catchBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.CATCH)) {\n\t\t\t// bool has_binding;\n\t\t\tlet catchVar: ExpressionNode | undefined;\n\t\t\tconst hasBinding = this.check(Token.L_PARENTHESES);\n\t\t\tif (hasBinding) {\n\t\t\t\tcatchVar = this.parseIdentifier();\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t}\n\t\t\tconst block = this.parseBlock();\n\t\t\tif (block instanceof BlockStatement) {\n\t\t\t\tblock.isStatement = true;\n\t\t\t}\n\t\t\tcatchBlock = new CatchClauseNode(block, catchVar);\n\t\t}\n\t\tlet finallyBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.FINALLY)) {\n\t\t\tfinallyBlock = this.parseBlock();\n\t\t\tif (finallyBlock instanceof BlockStatement) {\n\t\t\t\tfinallyBlock.isStatement = true;\n\t\t\t}\n\t\t}\n\t\treturn new TryCatchNode(tryBlock, catchBlock, finallyBlock);\n\t}\n\tprotected parseBlock(): ExpressionNode {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst statements: ExpressionNode[] = [];\n\t\tconst block = new BlockStatement(statements, false);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\treturn block;\n\t\t\t} else if (stat instanceof EmptyStatement) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstatements.push(stat);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn block;\n\t}\n\t/**\n\t * ECMA 262 6th Edition\n\t * \tStatementListItem[Yield, Return] :\n\t * \tStatement[?Yield, ?Return]\n\t * \tDeclaration[?Yield]\n\t * //\n\t * Declaration[Yield] :\n\t * \tHoistableDeclaration[?Yield]\n\t * \tClassDeclaration[?Yield]\n\t * \tLexicalDeclaration[In, ?Yield]\n\t * //\n\t * HoistableDeclaration[Yield, Default] :\n\t * \tFunctionDeclaration[?Yield, ?Default]\n\t * \tGeneratorDeclaration[?Yield, ?Default]\n\t * //\n\t * LexicalDeclaration[In, Yield] :\n\t * \tLetOrConst BindingList[?In, ?Yield] ;\n\t */\n\tprotected parseStatementListItem(): ExpressionNode | undefined {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.CLASS:\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\treturn this.parseClassDeclaration(undefined, false);\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn this.parseStatement();\n\t}\n\tprotected parseFunctionExpression(type: FunctionKind): ExpressionNode {\n\t\tlet funcName: ExpressionNode | undefined;\n\t\tconst peek = this.peek();\n\t\tif (peek.isNotType(Token.L_PARENTHESES)) {\n\t\t\tif (peek.isType(Token.L_BRACKETS)) {\n\t\t\t\t// [Symbol.iterator]() {}\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tfuncName = this.parseMemberExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t} else {\n\t\t\t\tfuncName = this.parseIdentifier();\n\t\t\t}\n\t\t}\n\t\treturn this.parseFunctionLiteral(type, funcName);\n\t}\n\tprotected parseIfStatement(): ExpressionNode {\n\t\tthis.consume(Token.IF);\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.consume(Token.R_PARENTHESES);\n\t\tconst thenStatement = this.parseStatement();\n\t\tif (thenStatement instanceof BlockStatement) {\n\t\t\tthenStatement.isStatement = true;\n\t\t}\n\t\tlet elseStatement;\n\t\tif (this.peek().isType(Token.ELSE)) {\n\t\t\tthis.consume(Token.ELSE);\n\t\t\telseStatement = this.parseStatement();\n\t\t}\n\t\treturn new IfStatement(condition, thenStatement, elseStatement);\n\t}\n\tprotected parseDoWhileStatement(): ExpressionNode {\n\t\t// DoStatement ::\n\t\t// 'do' Statement 'while' '(' Expression ')' ';'\n\t\tthis.consume(Token.DO);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\tthis.expect(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tthis.check(Token.SEMICOLON);\n\t\treturn new DoWhileNode(condition, body);\n\t}\n\tprotected parseWhileStatement(): ExpressionNode {\n\t\t// WhileStatement ::\n\t\t// 'while' '(' Expression ')' Statement\n\t\tthis.consume(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new WhileNode(condition, body);\n\t}\n\tprotected parseThrowStatement(): ExpressionNode {\n\t\t// ThrowStatement ::\n\t\t// 'throw' Expression ';'\n\t\tthis.consume(Token.THROW);\n\t\tif (this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tthrow new Error(this.scanner.createError(`New line After Throw`));\n\t\t}\n\t\tconst exception = this.parseExpression();\n\t\tthis.expectSemicolon();\n\t\treturn new ThrowStatement(exception);\n\t}\n\tprotected parseSwitchStatement(): ExpressionNode {\n\t\t// SwitchStatement ::\n\t\t// 'switch' '(' Expression ')' '{' CaseClause* '}'\n\t\t// CaseClause ::\n\t\t// 'case' Expression ':' StatementList\n\t\t// 'default' ':' StatementList\n\n\t\tthis.consume(Token.SWITCH);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst tag = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\n\t\tconst cases: SwitchCase[] = [];\n\t\tconst switchStatement = new SwitchStatement(tag, cases);\n\n\t\tlet defaultSeen = false;\n\t\tthis.expect(Token.L_CURLY);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst statements: ExpressionNode[] = [];\n\t\t\tlet label: ExpressionNode;\n\t\t\tif (this.check(Token.CASE)) {\n\t\t\t\tlabel = this.parseExpression();\n\t\t\t} else {\n\t\t\t\tthis.expect(Token.DEFAULT);\n\t\t\t\tif (defaultSeen) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Multiple Defaults In Switch`));\n\t\t\t\t}\n\t\t\t\tdefaultSeen = true;\n\t\t\t}\n\t\t\tthis.expect(Token.COLON);\n\t\t\twhile (this.peek().isNotType(Token.CASE)\n\t\t\t\t&& this.peek().isNotType(Token.DEFAULT)\n\t\t\t\t&& this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tconst statement = this.parseStatementListItem();\n\t\t\t\tif (!statement || this.isEmptyStatement(statement)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstatements.push(statement);\n\t\t\t}\n\t\t\tconst block = new BlockStatement(statements, true);\n\t\t\tconst clause = defaultSeen ? new DefaultExpression(block) : new SwitchCase(label!, block);\n\t\t\tcases.push(clause);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn switchStatement;\n\t}\n\tprotected parseForStatement(): ExpressionNode {\n\t\t// Either a standard for loop\n\t\t// for (<init>; <cond>; <next>) { ... }\n\t\t// or a for-each loop\n\t\t// for (<each> of|in <iterable>) { ... }\n\t\t//\n\n\t\tthis.consume(Token.FOR);\n\t\tconst isAwait = this.check(Token.AWAIT);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst peek = this.peek();\n\t\tconst startsWithLet = peek.isType(Token.LET) || peek.isType(Token.VAR);\n\t\tlet initializer: ExpressionNode;\n\t\tif (peek.isType(Token.CONST) || (startsWithLet && this.isNextLetKeyword())) {\n\t\t\tinitializer = this.parseVariableDeclarations();\n\t\t} else if (peek.isType(Token.SEMICOLON)) {\n\t\t\tinitializer = EmptyStatement.INSTANCE;\n\t\t} else {\n\t\t\tinitializer = this.parseExpressionCoverGrammar();\n\t\t}\n\t\tif (initializer instanceof BinaryExpression) {\n\t\t\t// x in y \n\t\t\tconst objectNode = initializer.getRight();\n\t\t\tinitializer = initializer.getLeft();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\treturn new ForInNode(initializer as ForDeclaration, objectNode, statement);\n\t\t}\n\t\tconst forMode = this.checkInOrOf();\n\t\tif (forMode) {\n\t\t\tconst object = forMode === 'IN' ? this.parseAssignmentExpression() : this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\tif (statement instanceof BlockStatement) {\n\t\t\t\tstatement.isStatement = true;\n\t\t\t}\n\t\t\tif (isAwait && forMode === 'OF') {\n\t\t\t\treturn new ForAwaitOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'OF') {\n\t\t\t\treturn new ForOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'IN') {\n\t\t\t\treturn new ForInNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else {\n\t\t\t\tthrow new Error(this.errorMessage(`parsing for loop: ${this.position()}`));\n\t\t\t}\n\t\t}\n\t\tthis.expect(Token.SEMICOLON);\n\t\tlet condition: ExpressionNode | undefined;\n\t\tif (!this.check(Token.SEMICOLON)) {\n\t\t\tcondition = this.parseExpression();\n\t\t\tthis.expect(Token.SEMICOLON);\n\t\t}\n\t\tlet finalExpression: ExpressionNode | undefined;\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tfinalExpression = this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t}\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new ForNode(body, initializer, condition, finalExpression);\n\t}\n\tprotected parseVariableDeclarations(): ExpressionNode {\n\t\t// VariableDeclarations ::\n\t\t// ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']\n\t\t// var converted into ==> 'let' by parser\n\n\t\tlet mode: 'const' | 'let' | 'var';\n\t\tconst token = this.peek().token;\n\t\tswitch (token) {\n\t\t\tcase Token.CONST:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'const';\n\t\t\t\tbreak;\n\t\t\tcase Token.VAR:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'var';\n\t\t\tcase Token.LET:\n\t\t\tdefault:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'let';\n\t\t\t\tbreak;\n\t\t}\n\t\tconst variables: VariableNode[] = [];\n\t\tdo {\n\n\t\t\tlet name: ExpressionNode;\n\t\t\tlet value: ExpressionNode | undefined;\n\t\t\t// Check for an identifier first, so that we can elide the pattern in cases\n\t\t\t// where there is no initializer (and so no proxy needs to be created).\n\t\t\tif (Token.isAnyIdentifier(this.peek().token)) {\n\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t\t}\n\t\t\t\t// if (this.peekInOrOf()) {\n\t\t\t\t// \t// // Assignments need the variable expression for the assignment LHS, and\n\t\t\t\t// \t// // for of/in will need it later, so create the expression now.\n\t\t\t\t// }\n\t\t\t} else {\n\t\t\t\tname = this.parseBindingPattern(true);\n\t\t\t}\n\n\t\t\tif (this.check(Token.ASSIGN)) {\n\t\t\t\tvalue = this.parseAssignmentExpression();\n\t\t\t} else if (!this.peekInOrOf()) {\n\t\t\t\t// ES6 'const' and binding patterns require initializers.\n\t\t\t\tif (mode === 'const' && (name === undefined || value === undefined)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Declaration Missing Initializer : ${this.position()}`));\n\t\t\t\t}\n\t\t\t\t// value = undefined;\n\t\t\t}\n\t\t\tvariables.push(new VariableNode(name as CanDeclareExpression, value));\n\t\t} while (this.check(Token.COMMA));\n\t\treturn new VariableDeclarationNode(variables, mode);\n\t}\n\tprotected parseBindingPattern(isPattern: boolean): ExpressionNode {\n\t\t// Pattern ::\n\t\t// Identifier\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\n\t\tconst token = this.peek().token;\n\t\tif (Token.isAnyIdentifier(token)) {\n\t\t\tconst name = this.parseAndClassifyIdentifier(this.next());\n\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t}\n\t\t\treturn name;\n\t\t}\n\t\tif (token == Token.L_BRACKETS) {\n\t\t\treturn this.parseArrayLiteral(isPattern);\n\t\t} else if (token == Token.L_CURLY) {\n\t\t\treturn this.parseObjectLiteral(isPattern);\n\t\t} else {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${this.next().getValue()}`));\n\t\t}\n\t}\n\tprotected parseAndClassifyIdentifier(next: TokenExpression): ExpressionNode {\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\telse if (next.isType(Token.SET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'set');\n\t\t}\n\t\telse if (next.isType(Token.GET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'get');\n\t\t}\n\t\telse if (next.isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`un supported expression (await)`));\n\n\t\t}\n\t\treturn next.getValue();\n\t}\n\tprotected parseContinueStatement(): ExpressionNode {\n\t\t// ContinueStatement ::\n\t\t// 'continue' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.CONTINUE);\n\t\tthis.expectSemicolon();\n\t\treturn ContinueStatement.CONTINUE_INSTANCE;\n\t}\n\tprotected parseBreakStatement(): ExpressionNode {\n\t\t// BreakStatement ::\n\t\t// 'break' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.BREAK);\n\t\tthis.expectSemicolon();\n\t\treturn BreakStatement.BREAK_INSTANCE;\n\t}\n\tprotected parseReturnStatement(): ExpressionNode {\n\t\t// ReturnStatement ::\n\t\t// 'return' [no line terminator] Expression? ';'\n\n\t\t// Consume the return token. It is necessary to do that before\n\t\t// reporting any errors on it, because of the way errors are\n\t\t// reported (underlining).\n\t\tthis.consume(Token.RETURN);\n\t\tconst tokenExp = this.peek();\n\t\tlet returnValue: ExpressionNode | undefined;\n\t\t// ExpressionT return_value = impl() -> NullExpression();\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tokenExp.token)) {\n\t\t\t// check if this scope is belong to 'constructor' method to return this at the end;\n\t\t\t// if (this.isDerivedConstructor(function_state_ -> kind())) {\n\t\t\t// \treturnValue = ThisNode;\n\t\t\t// }\n\t\t} else {\n\t\t\treturnValue = this.parseExpression();\n\t\t}\n\t\tthis.expectSemicolon()\n\t\treturn new ReturnStatement(returnValue);\n\t}\n\tprotected parseExpressionOrLabelledStatement(): ExpressionNode {\n\t\t// ExpressionStatement | LabelledStatement ::\n\t\t// Expression ';'\n\t\t// Identifier ':' Statement\n\t\t//\n\t\t// ExpressionStatement[Yield] :\n\t\t// [lookahead notin {{, function, class, let [}] Expression[In, ?Yield] ;\n\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\tcase Token.L_CURLY:\n\t\t\t\tthrow new Error(this.errorMessage(`Unreachable state`));\n\t\t\tcase Token.CLASS:\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token ${this.next().getValue().toString()}`));\n\t\t\tcase Token.LET: {\n\t\t\t\tconst nextNext = this.peekAhead();\n\t\t\t\t// \"let\" followed by either \"[\", \"{\" or an identifier means a lexical\n\t\t\t\t// declaration, which should not appear here.\n\t\t\t\t// However, ASI may insert a line break before an identifier or a brace.\n\t\t\t\tif (nextNext.isNotType(Token.L_BRACKETS) &&\n\t\t\t\t\t((nextNext.isNotType(Token.L_CURLY) && nextNext.isNotType(Token.IDENTIFIER)))) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Lexical Declaration ${this.position()}`));\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tconst startsWithIdentifier = Token.isAnyIdentifier(this.peek().token);\n\t\tconst expression: ExpressionNode = this.parseExpressionCoverGrammar();\n\t\tif (this.peek().isType(Token.COLON) && startsWithIdentifier && this.isIdentifier(expression)) {\n\t\t\t// The whole expression was a single identifier, and not, e.g.,\n\t\t\t// something starting with an identifier or a parenthesized identifier.\n\n\t\t\t// Remove the \"ghost\" variable that turned out to be a label from the top\n\t\t\t// scope. This way, we don't try to resolve it during the scope\n\t\t\t// processing.\n\n\t\t\tthis.consume(Token.COLON);\n\t\t\t// ES#sec-labelled-function-declarations Labelled Function Declarations\n\t\t\tif (this.peek().isType(Token.FUNCTION) /*&& allow_function == kAllowLabelledFunctionStatement */) {\n\t\t\t\treturn this.parseFunctionDeclaration();\n\t\t\t}\n\t\t\treturn this.parseStatement();\n\t\t}\n\t\t// Parsed expression statement, followed by semicolon.\n\t\tthis.expectSemicolon();\n\t\treturn expression;\n\t}\n\tprotected parseExpression(): ExpressionNode {\n\t\treturn this.parseExpressionCoverGrammar();\n\t}\n\tprotected parseFunctionDeclaration(): ExpressionNode {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Generator In Single Statement Context`));\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseFunctionDeclarationAndGenerator() {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\treturn this.parseHoistableDeclaration(FunctionKind.GENERATOR);\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseHoistableDeclaration(flag: FunctionKind): ExpressionNode {\n\t\t// FunctionDeclaration ::\n\t\t// 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// GeneratorDeclaration ::\n\t\t// 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t//\n\t\t// The anonymous forms are allowed iff [default_export] is true.\n\t\t//\n\t\t// 'function' and '*' (if present) have been consumed by the caller.\n\n\t\t// (FunctionType.ASYNC === flag || FunctionType.GENERATOR === flag);\n\n\t\tif (FunctionKind.ASYNC === flag && this.check(Token.MUL)) {\n\t\t\t// Async generator\n\t\t\tflag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\t\tlet name: ExpressionNode | undefined;\n\t\tif (this.peek().isNotType(Token.L_PARENTHESES)) {\n\t\t\tname = this.parseIdentifier();\n\t\t}\n\t\treturn this.parseFunctionLiteral(flag, name);\n\t}\n\tprotected parseIdentifier(): ExpressionNode | undefined {\n\t\tconst next = this.next();\n\t\tif (!Token.isValidIdentifier(next.token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${next.getValue()}`));\n\t\t}\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\treturn this.getIdentifier();\n\t}\n\tprotected getIdentifier(): ExpressionNode {\n\t\tconst current = this.current();\n\t\tconst string = current.getValue().toString();\n\t\tswitch (current.token) {\n\t\t\tcase Token.AWAIT:\n\t\t\t\treturn AwaitIdentifier;\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn AsyncIdentifier;\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\treturn new Identifier(`#${string}`);\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (string == 'constructor') {\n\t\t\treturn ConstructorIdentifier;\n\t\t}\n\t\tif (string == 'name') {\n\t\t\treturn NameIdentifier;\n\t\t}\n\t\tif (string == 'eval') {\n\t\t\treturn EvalIdentifier;\n\t\t}\n\t\telse if (string == 'arguments') {\n\t\t\treturn ArgumentsIdentifier;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`can't identify token ${string}`));\n\t}\n\tprotected parseFunctionLiteral(flag: FunctionKind, name?: ExpressionNode): ExpressionNode {\n\t\t// Function ::\n\t\t// '(' FormalParameterList? ')' '{' FunctionBody '}'\n\n\t\tconst functionInfo: FunctionInfo = {};\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst formals: ExpressionNode[] = this.parseFormalParameterList(functionInfo);\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseFunctionBody();\n\t\tif (name) {\n\t\t\treturn new FunctionDeclaration(formals, body, flag, name as CanDeclareExpression, functionInfo.rest);\n\t\t}\n\t\treturn new FunctionExpression(formals, body, flag, name, functionInfo.rest);\n\t}\n\tprotected parseArrowFunctionBody(): ExpressionNode | ExpressionNode[] {\n\t\tconst isExpression = this.peek().isNotType(Token.L_CURLY);\n\t\tif (isExpression) {\n\t\t\tconst expression = this.parseAssignmentExpression();\n\t\t\treturn expression;\n\t\t} else {\n\t\t\treturn this.parseFunctionBody();\n\t\t}\n\t}\n\tprotected parseFunctionBody(): ExpressionNode[] {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst list = this.parseStatementList(Token.R_CURLY);\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn list;\n\t}\n\tprotected parseStatementList(endToken: Token): ExpressionNode[] {\n\t\t// StatementList ::\n\t\t// (StatementListItem)* <end_token>\n\t\tconst list: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(endToken)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (this.isEmptyStatement(stat)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist.push(stat);\n\t\t}\n\t\treturn list;\n\t}\n\tprotected parseFormalParameterList(functionInfo: FunctionInfo): ExpressionNode[] {\n\t\t// FormalParameters[Yield] :\n\t\t// [empty]\n\t\t// FunctionRestParameter[?Yield]\n\t\t// FormalParameterList[?Yield]\n\t\t// FormalParameterList[?Yield] ,\n\t\t// FormalParameterList[?Yield] , FunctionRestParameter[?Yield]\n\t\t//\n\t\t// FormalParameterList[Yield] :\n\t\t// FormalParameter[?Yield]\n\t\t// FormalParameterList[?Yield] , FormalParameter[?Yield]\n\n\t\tconst parameters: ExpressionNode[] = [];\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\twhile (true) {\n\t\t\t\tconst param: ExpressionNode = this.parseFormalParameter(functionInfo);\n\t\t\t\tparameters.push(param);\n\t\t\t\tif (functionInfo.rest) {\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Param After Rest`));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t\t\tif (this.peek().isType(Token.R_PARENTHESES)) {\n\t\t\t\t\t// allow the trailing comma\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn parameters;\n\t}\n\tprotected parseFormalParameter(functionInfo: FunctionInfo): ExpressionNode {\n\t\t// FormalParameter[Yield,GeneratorParameter] :\n\t\t// BindingElement[?Yield, ?GeneratorParameter]\n\t\tfunctionInfo.rest = this.check(Token.ELLIPSIS);\n\t\tlet pattern = this.parseBindingPattern(true);\n\t\tlet initializer: Param;\n\t\tif (this.check(Token.ASSIGN)) {\n\t\t\tif (functionInfo.rest) {\n\t\t\t\tthrow new Error(this.errorMessage(`Rest Default Initializer`));\n\t\t\t}\n\t\t\tconst value = this.parseAssignmentExpression();\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression, value);\n\t\t} else {\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression);\n\t\t}\n\t\treturn initializer;\n\t}\n\tprotected parseExpressionCoverGrammar(info?: FunctionInfo): ExpressionNode {\n\t\t// Expression ::\n\t\t// AssignmentExpression\n\t\t// Expression ',' AssignmentExpression\n\n\t\t// ExpressionListT list(pointer_buffer());\n\t\t// ExpressionT expression;\n\t\t// AccumulationScope accumulation_scope(expression_scope());\n\t\tlet variableIndex = 0;\n\t\tconst list: ExpressionNode[] = [];\n\t\tlet expression: ExpressionNode;\n\t\twhile (true) {\n\t\t\tif (this.peek().isType(Token.ELLIPSIS)) {\n\t\t\t\tif (info) {\n\t\t\t\t\tinfo.rest = true;\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowParametersWithRest(list, variableIndex);\n\t\t\t}\n\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tlist.push(expression);\n\n\t\t\tif (!this.check(Token.COMMA)) break;\n\n\t\t\tif (this.peek().isType(Token.R_PARENTHESES) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t// a trailing comma is allowed at the end of an arrow parameter list\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (list.length == 1) return expression;\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected parseArrowParametersWithRest(list: ExpressionNode[], variableIndex: number): ExpressionNode {\n\t\tthis.consume(Token.ELLIPSIS);\n\t\tconst pattern: ExpressionNode = this.parseBindingPattern(true);\n\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter cannot have an initializer`));\n\t\t}\n\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter or binding pattern may not have a trailing comma`));\n\t\t}\n\t\t// 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only\n\t\t// as the formal parameters of'(x, y, ...z) => foo', and is not itself a\n\t\t// valid expression.\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES) || this.peekAhead().isNotType(Token.ARROW)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Unexpected Token At ${this.position()}`));\n\t\t}\n\t\tlist.push(pattern);\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected expressionListToExpression(list: ExpressionNode[]): ExpressionNode {\n\t\tif (list.length === 1) { return list[0]; }\n\t\treturn new SequenceExpression(list);\n\t}\n\tprotected parseMemberExpression(): ExpressionNode {\n\t\t// MemberExpression ::\n\t\t// (PrimaryExpression | FunctionLiteral | ClassLiteral)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// CallExpression ::\n\t\t// (SuperCall | ImportCall)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// The '[' Expression ']' and '.' Identifier parts are parsed by\n\t\t// ParseMemberExpressionContinuation, and everything preceeding it is merged\n\t\t// into ParsePrimaryExpression.\n\n\t\t// Parse the initial primary or function expression.\n\t\tconst result = this.parsePrimaryExpression();\n\t\treturn this.parseMemberExpressionContinuation(result);\n\t}\n\tprotected toParamNode(expression: ExpressionNode): Param {\n\t\tif (expression instanceof AssignmentExpression) {\n\t\t\treturn new Param(expression.getLeft() as CanDeclareExpression, expression.getRight());\n\t\t}\n\t\tif (expression instanceof GroupingExpression) {\n\t\t\treturn new Param(expression.getNode() as CanDeclareExpression);\n\t\t}\n\t\treturn new Param(expression as CanDeclareExpression);\n\t}\n\tprotected parsePrimaryExpression(): ExpressionNode {\n\t\t// PrimaryExpression ::\n\t\t// 'this'\n\t\t// 'null'\n\t\t// 'true'\n\t\t// 'false'\n\t\t// Identifier\n\t\t// Number\n\t\t// String\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\t\t// RegExpLiteral\n\t\t// '(' Expression ')'\n\t\t// do Block\n\t\t// AsyncFunctionLiteral\n\n\t\tlet token = this.peek();\n\t\tif (Token.isAnyIdentifier(token.token)) {\n\t\t\tthis.consume(token.token);\n\t\t\tlet kind: ArrowFunctionType = ArrowFunctionType.NORMAL;\n\t\t\tif (token.isType(Token.ASYNC) && !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\t// async function ...\n\t\t\t\tif (this.peek().isType(Token.FUNCTION)) {\n\t\t\t\t\treturn this.parseFunctionDeclarationAndGenerator();\n\t\t\t\t};\n\t\t\t\t// async Identifier => ...\n\t\t\t\tif (Token.isAnyIdentifier(this.peek().token) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t\ttoken = this.next();\n\t\t\t\t\tkind = ArrowFunctionType.ASYNC;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\tconst name = this.parseAndClassifyIdentifier(token);\n\t\t\t\tconst params: Param[] = [];\n\t\t\t\tif (name instanceof SequenceExpression) {\n\t\t\t\t\tparams.push(...name.getExpressions().map(this.toParamNode));\n\t\t\t\t} else {\n\t\t\t\t\tparams.push(this.toParamNode(name));\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, kind);\n\t\t\t}\n\t\t\treturn this.parseAndClassifyIdentifier(token);\n\t\t}\n\n\t\tif (Token.isLiteral(token.token)) {\n\t\t\treturn expressionFromLiteral(this.next());\n\t\t}\n\n\t\tswitch (token.token) {\n\t\t\tcase Token.NEW:\n\t\t\t\treturn this.parseMemberWithPresentNewPrefixesExpression();\n\t\t\tcase Token.THIS:\n\t\t\t\tthis.consume(Token.THIS);\n\t\t\t\treturn ThisNode;\n\t\t\tcase Token.DIV:\n\t\t\tcase Token.DIV_ASSIGN:\n\t\t\t\t// case Token.REGEXP_LITERAL:\n\t\t\t\t// this.consume(Token.REGEXP_LITERAL);\n\t\t\t\t// return token.value!;\n\t\t\t\treturn this.parseRegExpLiteral();\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.SUPER: {\n\t\t\t\treturn this.parseSuperExpression();\n\t\t\t}\n\t\t\tcase Token.IMPORT:\n\t\t\t\treturn this.parseImportExpressions();\n\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\treturn this.parseArrayLiteral(false);\n\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseObjectLiteral(false);\n\n\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tif (this.check(Token.R_PARENTHESES)) {\n\t\t\t\t\t// ()=>x. The continuation that consumes the => is in\n\t\t\t\t\t// ParseAssignmentExpressionCoverGrammar.\n\n\t\t\t\t\tif (!this.peek().isType(Token.ARROW)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${Token.R_PARENTHESES.getName()}`));\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseArrowFunctionLiteral([], ArrowFunctionType.NORMAL);\n\t\t\t\t}\n\t\t\t\t// Heuristically try to detect immediately called functions before\n\t\t\t\t// seeing the call parentheses.\n\n\t\t\t\tconst peekToken = this.peek();\n\t\t\t\tlet expression: ExpressionNode;\n\t\t\t\tconst info: FunctionInfo = {};\n\t\t\t\tif (peekToken.isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.NORMAL);\n\t\t\t\t} else if (peekToken.isType(Token.ASYNC) && this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.ASYNC);\n\t\t\t\t} else {\n\t\t\t\t\texpression = this.parseExpressionCoverGrammar(info);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral(expression.getExpressions(), ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t} else {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral([expression], ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn expression;\n\t\t\t}\n\t\t\tcase Token.CLASS: {\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\tlet name: ExpressionNode | undefined;\n\t\t\t\tlet isStrictReserved = false;\n\t\t\t\tif (this.peekAnyIdentifier()) {\n\t\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\t\tisStrictReserved = Token.isStrictReservedWord(this.current().token);\n\t\t\t\t}\n\t\t\t\treturn this.parseClassLiteral(name, isStrictReserved);\n\t\t\t}\n\t\t\tcase Token.TEMPLATE_LITERALS:\n\t\t\t\treturn this.parseTemplateLiteral();\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(this.next())}`));\n\t}\n\tprotected parseTemplateLiteral(tag?: ExpressionNode): ExpressionNode {\n\t\tconst template = this.next().getValue() as PreTemplateLiteral;\n\t\tconst exprs = template.expressions.map(expr => JavaScriptParser.parse(expr));\n\n\t\tif (tag) {\n\t\t\treturn new TaggedTemplateExpression(tag, template.strings, exprs);\n\t\t} else {\n\t\t\treturn new TemplateLiteral(template.strings, exprs);\n\t\t}\n\t}\n\tprotected parseMemberWithPresentNewPrefixesExpression(): ExpressionNode {\n\t\tthis.consume(Token.NEW);\n\t\tlet classRef: ExpressionNode;\n\t\tif (this.peek().isType(Token.IMPORT) && this.peekAhead().isType(Token.L_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new import (`));\n\t\t} else if (this.peek().isType(Token.SUPER)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new super() is never allowed`));\n\t\t} else if (this.peek().isType(Token.PERIOD)) {\n\t\t\tclassRef = this.parseNewTargetExpression();\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t} else {\n\t\t\tclassRef = this.parseMemberExpression();\n\t\t}\n\t\tif (this.peek().isType(Token.L_PARENTHESES)) {\n\t\t\t// NewExpression with arguments.\n\t\t\tconst args: ExpressionNode[] = this.parseArguments();\n\t\t\tclassRef = new NewExpression(classRef, args);\n\t\t\t// The expression can still continue with . or [ after the arguments.\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t}\n\t\tif (this.peek().isType(Token.QUESTION_PERIOD)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new xxx?.yyy at position`));\n\t\t}\n\t\treturn new NewExpression(classRef);\n\t}\n\tprotected parseArguments(maybeArrow?: ParsingArrowHeadFlag): ExpressionNode[] {\n\t\t// Arguments ::\n\t\t// '(' (AssignmentExpression)*[','] ')'\n\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst args: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\tlet argument: ExpressionNode = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tif (ParsingArrowHeadFlag.MaybeArrowHead === maybeArrow) {\n\t\t\t\tif (isSpread) {\n\t\t\t\t\tif (argument instanceof AssignmentExpression) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(` Rest parameter may not have a default initializer'`));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`parsing '...spread,arg =>'`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isSpread) {\n\t\t\t\targument = new SpreadElement(argument);\n\t\t\t}\n\t\t\targs.push(argument);\n\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t}\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing arguments call, expecting ')'`));\n\t\t}\n\t\treturn args;\n\t}\n\tprotected parseAssignmentExpressionCoverGrammar(): ExpressionNode {\n\t\t// AssignmentExpression ::\n\t\t// ConditionalExpression\n\t\t// ArrowFunction\n\t\t// YieldExpression\n\t\t// LeftHandSideExpression AssignmentOperator AssignmentExpression\n\n\t\tif (this.peek().isType(Token.YIELD) /*&& this.isGenerator()*/) {\n\t\t\treturn this.parseYieldExpression();\n\t\t}\n\t\tlet expression: ExpressionNode = this.parseConditionalExpression();\n\t\tconst op = this.peek().token;\n\t\tif (!Token.isArrowOrAssignmentOp(op)) return expression;\n\t\t// Arrow functions.\n\t\tif (op === Token.ARROW) {\n\t\t\tif (!this.isIdentifier(expression) && !this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Malformed Arrow Fun Param List`));\n\t\t\t}\n\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\tconst params = expression.getExpressions().map(expr => new Param(expr as CanDeclareExpression));\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\tif (expression instanceof GroupingExpression) {\n\t\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression.getNode() as CanDeclareExpression)], ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression)], ArrowFunctionType.NORMAL);\n\t\t}\n\t\tif (this.isAssignableIdentifier(expression)) {\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t\t}\n\t\t} else if (this.isProperty(expression)) {\n\t\t\t// throw new Error(this.errorMessage(`Invalid Property Binding Pattern`));\n\t\t} else if (this.isPattern(expression) && Token.isAssignment(op)) {\n\t\t\t// Destructuring assignment.\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\t// Scanner.Location loc(lhs_beg_pos, end_position());\n\t\t\t\t// if (expression_scope() -> IsCertainlyDeclaration()) {\n\t\t\t\t// \timpl() -> ReportMessageAt(loc,\n\t\t\t\t// \t\tMessageTemplate.kInvalidDestructuringTarget);\n\t\t\t\t// } else {\n\t\t\t\t// \t// Syntax Error if LHS is neither object literal nor an array literal\n\t\t\t\t// \t// (Parenthesized literals are\n\t\t\t\t// \t// CoverParenthesizedExpressionAndArrowParameterList).\n\t\t\t\t// \t// #sec-assignment-operators-static-semantics-early-errors\n\t\t\t\t// \timpl() -> ReportMessageAt(loc, MessageTemplate.kInvalidLhsInAssignment);\n\t\t\t\t// }\n\t\t\t}\n\t\t\t// expression_scope() -> ValidateAsPattern(expression, lhs_beg_pos, end_position());\n\t\t} else {\n\t\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Reference Expression`));\n\t\t\t}\n\t\t\tif (Token.isLogicalAssignmentOp(op)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Lhs In Assignment`));\n\t\t\t}\n\t\t}\n\n\t\tthis.consume(op);\n\t\t// const opPosition = this.position();\n\t\tconst right: ExpressionNode = this.parseAssignmentExpression();\n\t\t// Anonymous function name inference applies to =, ||=, &&=, and ??=.\n\n\t\tif (!Token.isAssignment(op)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t}\n\t\treturn new AssignmentExpression(op.getName() as AssignmentOperator, expression, right);\n\t}\n\tprotected parseAssignmentExpression(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseArrowFunctionLiteral(parameters: ExpressionNode[], flag: ArrowFunctionType, rest?: boolean): ExpressionNode {\n\t\tthis.consume(Token.ARROW);\n\t\tconst body = this.parseArrowFunctionBody();\n\t\treturn new ArrowFunctionExpression(parameters, body, flag, rest);\n\t}\n\tprotected parseRegExpLiteral(): ExpressionNode {\n\t\tif (!this.scanner.scanRegExpPattern()) {\n\t\t\tthrow new Error('Unterminated RegExp');\n\t\t}\n\t\treturn this.scanner.currentToken().getValue();\n\t}\n\tprotected parseArrayLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ArrayLiteral ::\n\t\t// '[' Expression? (',' Expression?)* ']'\n\n\t\tthis.consume(Token.L_BRACKETS);\n\t\tconst values: ExpressionNode[] = [];\n\t\tlet firstSpreadIndex = -1;\n\n\t\twhile (!this.check(Token.R_BRACKETS)) {\n\t\t\tlet elem: ExpressionNode;\n\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\tthis.consume(Token.COMMA);\n\t\t\t\tcontinue;\n\t\t\t} else if (this.check(Token.ELLIPSIS)) {\n\t\t\t\tconst argument = this.parsePossibleDestructuringSubPattern();\n\t\t\t\telem = isPattern\n\t\t\t\t\t? new RestElement(argument as CanDeclareExpression)\n\t\t\t\t\t: new SpreadElement(argument)\n\n\t\t\t\tif (firstSpreadIndex < 0) {\n\t\t\t\t\tfirstSpreadIndex = values.length;\n\t\t\t\t}\n\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Element After Rest @${this.position()}`));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telem = this.parsePossibleDestructuringSubPattern();\n\t\t\t}\n\t\t\tvalues.push(elem);\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ArrayPattern(values as CanDeclareExpression[]);\n\t\t}\n\t\treturn new ArrayExpression(values);\n\t}\n\tprotected parsePossibleDestructuringSubPattern(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseObjectLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ObjectLiteral ::\n\t\t// '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'\n\n\t\tthis.consume(Token.L_CURLY);\n\t\tconst properties: ExpressionNode[] = [];\n\t\twhile (!this.check(Token.R_CURLY)) {\n\t\t\tconst property: ExpressionNode = this.parseObjectPropertyDefinition(isPattern);\n\t\t\tproperties.push(property);\n\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tthis.expect(Token.COMMA);\n\t\t\t}\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ObjectPattern(properties as (Property | RestElement)[]);\n\t\t}\n\t\treturn new ObjectExpression(properties as Property[]);\n\t}\n\tprotected parseObjectPropertyDefinition(isPattern: boolean): ExpressionNode {\n\t\tconst propInfo = { kind: PropertyKind.NotSet } as Required<PropertyKindInfo>;\n\t\tconst nameExpression = this.parseProperty(propInfo);\n\n\t\tswitch (propInfo.kind) {\n\t\t\tcase PropertyKind.Spread:\n\t\t\t\tlet value: SpreadElement | RestElement = nameExpression as SpreadElement;\n\t\t\t\tif (isPattern) {\n\t\t\t\t\tvalue = new RestElement(value.getArgument() as CanDeclareExpression);\n\t\t\t\t}\n\t\t\t\treturn new Property(value.getArgument(), value, 'init');\n\n\t\t\tcase PropertyKind.Value: {\n\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\tconst value = this.parsePossibleDestructuringSubPattern();\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Assign:\n\t\t\tcase PropertyKind.ShorthandOrClassField:\n\t\t\tcase PropertyKind.Shorthand: {\n\t\t\t\t// PropertyDefinition\n\t\t\t\t// IdentifierReference\n\t\t\t\t// CoverInitializedName\n\t\t\t\t//\n\t\t\t\t// CoverInitializedName\n\t\t\t\t// IdentifierReference Initializer?\n\n\t\t\t\tconst lhs = new Identifier(propInfo.name);\n\t\t\t\tif (!this.isAssignableIdentifier(lhs)) {\n\t\t\t\t\tthrow new Error(this.errorMessage('Strict Eval Arguments'));\n\t\t\t\t}\n\t\t\t\tlet value: ExpressionNode;\n\t\t\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\t\t\tthis.consume(Token.ASSIGN);\n\t\t\t\t\tconst rhs = this.parseAssignmentExpression();\n\t\t\t\t\tvalue = new AssignmentExpression(Token.ASSIGN.getName() as AssignmentOperator, lhs, rhs);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = lhs;\n\t\t\t\t}\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Method: {\n\t\t\t\t// MethodDefinition\n\t\t\t\t// PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\t\t\t\t// '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.AccessorGetter:\n\t\t\tcase PropertyKind.AccessorSetter: {\n\t\t\t\tconst isGet = propInfo.kind == PropertyKind.AccessorGetter;\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, isGet ? 'get' : 'set');\n\t\t\t}\n\n\t\t\tcase PropertyKind.ClassField:\n\t\t\tcase PropertyKind.NotSet:\n\t\t\t\treturn NullNode;\n\t\t}\n\t}\n\tprotected parseProperty(propInfo: PropertyKindInfo): ExpressionNode {\n\t\tlet nextToken = this.peek();\n\t\tif (this.check(Token.ASYNC)) {\n\t\t\t// async\n\t\t\tnextToken = this.peek();\n\t\t\tif (nextToken.isNotType(Token.MUL)\n\t\t\t\t&& parsePropertyKindFromToken(nextToken.token, propInfo)\n\t\t\t\t|| this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\treturn AsyncIdentifier;\n\t\t\t}\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC;\n\t\t}\n\n\t\tif (this.check(Token.MUL)) {\n\t\t\t// async*\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\n\t\tnextToken = this.peek();\n\t\tif (propInfo.kind == PropertyKind.NotSet && nextToken.isType(Token.GET) || nextToken.isType(Token.SET)) {\n\t\t\tconst token = this.next();\n\t\t\tif (parsePropertyKindFromToken(this.peek().token, propInfo)) {\n\t\t\t\treturn nextToken.isType(Token.GET) ? GetIdentifier : SetIdentifier;\n\t\t\t}\n\t\t\tif (token.isType(Token.GET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorGetter;\n\t\t\t} else if (token.isType(Token.SET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorSetter;\n\t\t\t}\n\t\t}\n\t\tlet propertyName: ExpressionNode;\n\t\tswitch (nextToken.token) {\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\tthis.consume(Token.PRIVATE_NAME);\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropertyName = this.getIdentifier();\n\t\t\t\tbreak;\n\t\t\tcase Token.STRING:\n\t\t\tcase Token.NUMBER:\n\t\t\tcase Token.BIGINT:\n\t\t\t\t// \"12\" -> 12\n\t\t\t\t// 12.3 -> \"12.3\"\n\t\t\t\t// 12.30 -> \"12.3\"\n\t\t\t\tthis.consume(nextToken.token);\n\t\t\t\tpropertyName = nextToken.getValue();\n\t\t\t\tpropInfo.name = (propertyName as StringLiteral).getValue();\n\t\t\t\tbreak;\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\t// [Symbol.iterator]\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tpropertyName = this.parseAssignmentExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\treturn propertyName;\n\t\t\tcase Token.ELLIPSIS:\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tthis.consume(Token.ELLIPSIS);\n\t\t\t\t\tpropertyName = this.parsePossibleDestructuringSubPattern();\n\t\t\t\t\tpropInfo.kind = PropertyKind.Spread;\n\n\t\t\t\t\tif (!this.isValidReferenceExpression(propertyName)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Invalid Rest Binding/Assignment Pattern'));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Element After Rest'));\n\t\t\t\t\t}\n\t\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\t\treturn propertyName;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpropertyName = new StringLiteral(this.parsePropertyName().toString());\n\t\t\t\t// propertyName = this.parsePropertyName();\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\tbreak;\n\t\t}\n\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t}\n\t\treturn propertyName;\n\t}\n\tprotected parseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) return expression;\n\t\treturn this.doParseMemberExpressionContinuation(expression);\n\t}\n\tprotected doParseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing member expression`));\n\t\t}\n\t\t// Parses this part of MemberExpression:\n\t\t// ('[' Expression ']' | '.' Identifier | TemplateLiteral)*\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\texpression = new MemberExpression(expression, index, true);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key: ExpressionNode = this.parsePropertyName();\n\t\t\t\t\texpression = new MemberExpression(expression, key, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.TEMPLATE_LITERALS: {\n\t\t\t\t\texpression = this.parseTemplateLiteral(expression);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (Token.isMember(this.peek().token));\n\t\treturn expression;\n\t}\n\tprotected parsePropertyName(): ExpressionNode {\n\t\tconst next = this.next();\n\t\tif (next.getValue() instanceof Identifier) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\t// check keyword as identifier\n\t\tif (Token.isPropertyName(next.token)) {\n\t\t\treturn new Identifier(next.token.getName());\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Parsing property expression: Unexpected Token`));\n\t}\n\tprotected parsePipelineExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// expression '|>' function [':' expression [':'? expression] ] *\n\t\t// expression '|>' function '('[expression ','?]* ')'\n\t\t//\n\t\t// expression '|>' function ':' expression [':' expression | '?']*]\n\t\t// expression '|>' function '(' expression [',' expression | '?']* ')'\n\t\t//\n\t\t// [~Await]PipelineExpression[?In, ?Yield, ?Await] |> LogicalORExpression[?In, ?Yield, ?Await]\n\t\t// [+Await]PipelineExpression[? In, ? Yield, ? Await] |> [lookahead ∉ { await }]LogicalORExpression[? In, ? Yield, ? Await]\n\n\t\tlet token: Token;\n\t\twhile (Token.isPipelineOperator(token = this.peek().token)) {\n\t\t\tthis.consume(token);\n\t\t\texpression = this.parsePipelineBody(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parsePipelineBody(lhs: ExpressionNode): ExpressionNode {\n\t\tlet body: ExpressionNode | undefined;\n\t\tlet token = this.peek();\n\t\t// parse function\n\t\tswitch (token.token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\t\tbreak;\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (body) {\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\t\tif (token.isType(Token.L_PARENTHESES)) {\n\t\t\t// parse arrow function\n\t\t\t// x |> ( y => y+1 )\n\t\t\tbody = this.parsePrimaryExpression();\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\n\t\t// parse angular-like and f# and partial operator syntax\n\t\tconst func = this.parseMemberExpression(); //this.parseLogicalExpression();\n\t\tlet args: (ExpressionNode | '?' | '...?')[] = [];\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.COLON:\n\t\t\t\t// support angular pipeline syntax\n\t\t\t\tdo {\n\t\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} while (this.peek().isType(Token.COLON));\n\t\t\t\tbreak;\n\t\t\tcase Token.L_PARENTHESES:\n\t\t\t\t// es2022 syntax, F# & partial operator\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tlet indexed = false;\n\t\t\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tindexed = true;\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.check(Token.COMMA);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\t// should be indexed, has partial operator\n\t\t\t\tif (!indexed) {\n\t\t\t\t\t// z |> method(x, y) === method(x, y)(z)\n\t\t\t\t\tbody = new CallExpression(func, args as ExpressionNode[]);\n\t\t\t\t\treturn new PipelineExpression(lhs, body);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new PipelineExpression(lhs, func, args);\n\t}\n\tprotected parseConditionalExpression(): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// LogicalExpression '?' AssignmentExpression ':' AssignmentExpression\n\t\t//\n\n\t\tlet expression: ExpressionNode = this.parseLogicalExpression();\n\t\texpression = this.parsePipelineExpression(expression);\n\t\treturn this.peek().isType(Token.CONDITIONAL) ? this.parseConditionalContinuation(expression) : expression;\n\t}\n\tprotected parseLogicalExpression(): ExpressionNode {\n\t\t// LogicalExpression ::\n\t\t// LogicalORExpression\n\t\t// CoalesceExpression\n\n\t\t// Both LogicalORExpression and CoalesceExpression start with BitwiseOR.\n\t\t// Parse for binary expressions >= 6 (BitwiseOR);\n\n\t\tlet expression: ExpressionNode = this.parseBinaryExpression(6);\n\t\tconst peek = this.peek();\n\t\tif (peek.isType(Token.AND) || peek.isType(Token.OR)) {\n\t\t\t// LogicalORExpression, pickup parsing where we left off.\n\t\t\tconst precedence = peek.token.getPrecedence();\n\t\t\texpression = this.parseBinaryContinuation(expression, 4, precedence);\n\t\t} else if (peek.isType(Token.NULLISH)) {\n\t\t\texpression = this.parseNullishExpression(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parseBinaryContinuation(x: ExpressionNode, prec: number, prec1: number): ExpressionNode {\n\t\tdo {\n\t\t\t// prec1 >= 4\n\t\t\twhile (this.peek().token.getPrecedence() === prec1) {\n\t\t\t\tlet y: ExpressionNode;\n\t\t\t\tlet op = this.next();\n\n\t\t\t\tconst is_right_associative = op.isType(Token.EXP);\n\t\t\t\tconst next_prec = is_right_associative ? prec1 : prec1 + 1;\n\t\t\t\ty = this.parseBinaryExpression(next_prec);\n\n\n\t\t\t\t// For now we distinguish between comparisons and other binary\n\t\t\t\t// operations. (We could combine the two and get rid of this\n\t\t\t\t// code and AST node eventually.)\n\n\t\t\t\tif (Token.isCompare(op.token)) {\n\t\t\t\t\t// We have a comparison.\n\t\t\t\t\tlet cmp = op.token;\n\t\t\t\t\tswitch (op.token) {\n\t\t\t\t\t\tcase Token.NE: cmp = Token.EQ; break;\n\t\t\t\t\t\tcase Token.NE_STRICT: cmp = Token.EQ_STRICT; break;\n\t\t\t\t\t\tdefault: break;\n\t\t\t\t\t}\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, cmp);\n\t\t\t\t\tif (op.isNotType(cmp)) {\n\t\t\t\t\t\t// The comparison was negated - add a NOT.\n\t\t\t\t\t\tx = buildUnaryExpression(x, Token.NOT);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, op.token);\n\t\t\t\t}\n\t\t\t}\n\t\t\t--prec1;\n\t\t} while (prec1 >= prec);\n\n\t\treturn x;\n\t}\n\tprotected parseBinaryExpression(precedence: number): ExpressionNode {\n\t\tconst x: ExpressionNode = this.parseUnaryExpression();\n\t\tconst precedence1 = this.peek().token.getPrecedence();\n\t\tif (precedence1 >= precedence) {\n\t\t\treturn this.parseBinaryContinuation(x, precedence, precedence1);\n\t\t}\n\t\treturn x;\n\t}\n\tprotected parseUnaryExpression(): ExpressionNode {\n\t\t// UnaryExpression ::\n\t\t// PostfixExpression\n\t\t// 'delete' UnaryExpression\n\t\t// 'void' UnaryExpression\n\t\t// 'typeof' UnaryExpression\n\t\t// '++' UnaryExpression\n\t\t// '--' UnaryExpression\n\t\t// '+' UnaryExpression\n\t\t// '-' UnaryExpression\n\t\t// '~' UnaryExpression\n\t\t// '!' UnaryExpression\n\t\t// [+Await] AwaitExpression[?Yield]\n\n\t\tconst op = this.peek();\n\t\tif (Token.isUnaryOrCount(op.token)) {\n\t\t\treturn this.parseUnaryOrPrefixExpression();\n\t\t}\n\t\tif (op.isType(Token.AWAIT)) {\n\t\t\treturn this.parseAwaitExpression();\n\t\t}\n\t\treturn this.parsePostfixExpression();\n\t}\n\tprotected parseUnaryOrPrefixExpression(): ExpressionNode {\n\t\tconst op = this.next();\n\t\tconst expression = this.parseUnaryExpression();\n\t\tif (Token.isUnary(op.token)) {\n\t\t\tif (op.isType(Token.DELETE)) {\n\t\t\t\tif (this.isIdentifier(expression)) {\n\t\t\t\t\t// \"delete identifier\" is a syntax error in strict mode.\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"delete identifier\" is a syntax error in strict mode`));\n\t\t\t\t}\n\t\t\t\tif (expression instanceof MemberExpression && expression.getProperty().toString().startsWith('#')) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"Delete Private Field\" is a syntax error`));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token Unary Exponentiation`));\n\t\t\t}\n\t\t}\n\n\t\tif (Token.isCount(op.token) || Token.isUnary(op.token)) {\n\t\t\t// Allow the parser to rewrite the expression.\n\t\t\treturn buildUnaryExpression(expression, op.token);\n\t\t}\n\t\tthrow new Error(this.errorMessage(`while rewrite unary operation`));\n\t}\n\tprotected parsePostfixExpression(): ExpressionNode {\n\t\t// PostfixExpression ::\n\t\t// LeftHandSideExpression ('++' | '--')?\n\n\t\tconst expression: ExpressionNode = this.parseLeftHandSideExpression();\n\t\tif (!Token.isCount(this.peek().token) || this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\treturn expression;\n\t\t}\n\t\treturn this.parsePostfixContinuation(expression);\n\t}\n\tprotected parsePostfixContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid LHS In Postfix Op.`));\n\t\t}\n\t\tconst op = this.next();\n\t\treturn buildPostfixExpression(expression, op.token);\n\t}\n\tprotected parseLeftHandSideExpression(): ExpressionNode {\n\t\t// LeftHandSideExpression ::\n\t\t// (NewExpression | MemberExpression) ...\n\t\tconst result = this.parseMemberExpression();\n\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\treturn this.parseLeftHandSideContinuation(result);\n\t}\n\tprotected parseLeftHandSideContinuation(result: ExpressionNode): ExpressionNode {\n\t\tif (this.peek().isType(Token.L_PARENTHESES)\n\t\t\t&& this.isIdentifier(result)\n\t\t\t&& this.scanner.currentToken().isType(Token.ASYNC)\n\t\t\t&& !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tconst args = this.parseArguments(ParsingArrowHeadFlag.AsyncArrowFunction);\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t// async () => ...\n\t\t\t\tif (!args.length) return new EmptyStatement;\n\t\t\t\t// async ( Arguments ) => ...\n\t\t\t\treturn this.expressionListToExpression(args);\n\t\t\t}\n\t\t\tresult = new CallExpression(result, args);\n\t\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\t}\n\n\t\tlet optionalChaining = false;\n\t\tlet isOptional = false;\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\t// chain\n\t\t\t\tcase Token.QUESTION_PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_PERIOD);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tif (Token.isPropertyOrCall(this.peek().token)) continue;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\tresult = new MemberExpression(result, index, true, isOptional);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Call */\n\t\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\t\tconst args = this.parseArguments();\n\t\t\t\t\tif (result.toString() === 'eval') {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`'eval(...)' is not supported.`));\n\t\t\t\t\t}\n\t\t\t\t\tresult = new CallExpression(result, args, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* bind call */\n\t\t\t\tcase Token.BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.BIND);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* chain bind call */\n\t\t\t\tcase Token.QUESTION_BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_BIND);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, true, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Template literals in/after an Optional Chain not supported:\n\t\t\t\t\tif (optionalChaining) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Optional Chaining No Template support`));\n\t\t\t\t\t}\n\t\t\t\t\t/* Tagged Template */\n\t\t\t\t\tresult = this.parseTemplateLiteral(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (isOptional) {\n\t\t\t\tisOptional = false;\n\t\t\t}\n\t\t} while (Token.isPropertyOrCall(this.peek().token));\n\t\tif (optionalChaining) {\n\t\t\tresult = new ChainExpression(result);\n\t\t}\n\t\treturn result;\n\t}\n\tprotected parseAwaitExpression(): ExpressionNode {\n\t\tthis.consume(Token.AWAIT);\n\t\tconst value = this.parseUnaryExpression();\n\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\tthrow new Error(this.scanner.createError(`Unexpected Token Unary Exponentiation`));\n\t\t}\n\t\treturn buildUnaryExpression(value, Token.AWAIT);\n\t}\n\tprotected parseNullishExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// CoalesceExpression ::\n\t\t// CoalesceExpressionHead ?? BitwiseORExpression\n\t\t//\n\t\t// CoalesceExpressionHead ::\n\t\t// CoalesceExpression\n\t\t// BitwiseORExpression\n\n\t\t// We create a binary operation for the first nullish, otherwise collapse\n\t\t// into an nary expression.\n\n\t\tconst list: ExpressionNode[] = [];\n\t\tlist.push(expression);\n\t\twhile (this.peek().isType(Token.NULLISH)) {\n\t\t\tthis.consume(Token.NULLISH);\n\t\t\t// Parse BitwiseOR or higher.\n\t\t\texpression = this.parseBinaryExpression(6);\n\t\t\tlist.push(expression);\n\t\t}\n\t\texpression = list.pop()!;\n\t\texpression = list.reverse()\n\t\t\t.reduce((previous, current) => new LogicalExpression(Token.NULLISH.getName() as LogicalOperator, current, previous), expression);\n\t\treturn expression;\n\t}\n\tprotected parseConditionalContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tthis.consume(Token.CONDITIONAL);\n\t\tconst left: ExpressionNode = this.parseAssignmentExpression();\n\t\tthis.expect(Token.COLON);\n\t\tconst right = this.parseAssignmentExpression();\n\t\treturn new ConditionalExpression(expression, left, right);\n\t}\n\tprotected parseYieldExpression(): ExpressionNode {\n\t\t// YieldExpression ::\n\t\t// 'yield' ([no line terminator] '*'? AssignmentExpression)?\n\t\tthis.consume(Token.YIELD);\n\t\tlet delegating = false; // yield*\n\t\tlet expression: ExpressionNode | undefined;\n\t\tif (this.check(Token.MUL)) {\n\t\t\tdelegating = true;\n\t\t}\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.EOS:\n\t\t\tcase Token.SEMICOLON:\n\t\t\tcase Token.R_CURLY:\n\t\t\tcase Token.R_BRACKETS:\n\t\t\tcase Token.R_PARENTHESES:\n\t\t\tcase Token.COLON:\n\t\t\tcase Token.COMMA:\n\t\t\tcase Token.IN:\n\t\t\t\t// The above set of tokens is the complete set of tokens that can appear\n\t\t\t\t// after an AssignmentExpression, and none of them can start an\n\t\t\t\t// AssignmentExpression. This allows us to avoid looking for an RHS for\n\t\t\t\t// a regular yield, given only one look-ahead token.\n\t\t\t\tif (!delegating) break;\n\t\t\t\t// Delegating yields require an RHS; fall through.\n\t\t\t\t// V8_FALLTHROUGH;\n\t\t\t\tthrow new Error(this.errorMessage(`Delegating yields require an RHS`));\n\t\t\tdefault:\n\t\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new YieldExpression(delegating, expression);\n\t}\n\tprotected parseNewTargetExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (new.target) not supported.'));\n\t}\n\tprotected parseClassDeclaration(names: ExpressionNode[] | undefined, defaultExport: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseClassLiteral(name: ExpressionNode | undefined, isStrictReserved: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseSuperExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (supper) not supported.'));\n\t}\n\tprotected parseImportExpressions(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (import) not supported.'));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/expressions/v8/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CanDeclareExpression, ExpressionNode } from '../api/expression.js';\nimport { Token, TokenExpression } from './token.js';\nimport { PreTemplateLiteral, TokenStream } from './stream.js';\nimport {\n\tOfNode, Identifier, ThisNode,\n\tGetIdentifier, SetIdentifier, AsyncIdentifier,\n\tNullNode, StringLiteral, AwaitIdentifier,\n\tConstructorIdentifier, NameIdentifier,\n\tEvalIdentifier, ArgumentsIdentifier, TaggedTemplateExpression, TemplateLiteral\n} from '../api/definition/values.js';\nimport { EmptyStatement } from '../api/statement/control/empty.js';\nimport { BlockStatement } from '../api/statement/control/block.js';\nimport {\n\tArrowFunctionExpression, ArrowFunctionType, FunctionKind,\n\tParam, FunctionExpression, FunctionDeclaration\n} from '../api/definition/function.js';\nimport { IfStatement } from '../api/statement/control/if.js';\nimport { NewExpression } from '../api/computing/new.js';\nimport { SpreadElement } from '../api/computing/spread.js';\nimport { RestElement } from '../api/computing/rest.js';\nimport { AssignmentExpression, AssignmentOperator } from '../api/operators/assignment.js';\nimport { GroupingExpression } from '../api/operators/grouping.js';\nimport { MemberExpression } from '../api/definition/member.js';\nimport { BindExpression } from '../api/definition/bind.js';\nimport { ObjectExpression, Property, ObjectPattern } from '../api/definition/object.js';\nimport { ArrayExpression, ArrayPattern } from '../api/definition/array.js';\nimport { CallExpression } from '../api/computing/call.js';\nimport { DoWhileNode, WhileNode } from '../api/statement/iterations/while.js';\nimport { CatchClauseNode, ThrowStatement, TryCatchNode } from '../api/computing/throw.js';\nimport { SwitchCase, DefaultExpression, SwitchStatement } from '../api/statement/control/switch.js';\nimport { BreakStatement, ContinueStatement } from '../api/statement/control/terminate.js';\nimport { ReturnStatement } from '../api/computing/return.js';\nimport { YieldExpression } from '../api/computing/yield.js';\nimport { VariableNode, VariableDeclarationNode } from '../api/statement/declarations/declares.js';\nimport { ForNode, ForOfNode, ForInNode, ForAwaitOfNode, ForDeclaration } from '../api/statement/iterations/for.js';\nimport { ConditionalExpression } from '../api/operators/ternary.js';\nimport { PipelineExpression } from '../api/operators/pipeline.js';\nimport { LogicalExpression, LogicalOperator } from '../api/operators/logical.js';\nimport { SequenceExpression } from '../api/operators/comma.js';\nimport { ChainExpression } from '../api/operators/chaining.js';\nimport { ExpressionStatement } from '../api/definition/statement.js';\nimport {\n\tbuildPostfixExpression, buildUnaryExpression,\n\texpressionFromLiteral, shortcutNumericLiteralBinaryExpression\n} from './nodes.js';\nimport { BinaryExpression } from '../api/operators/binary.js';\n\nexport enum ParsingArrowHeadFlag { CertainlyNotArrowHead, MaybeArrowHead, AsyncArrowFunction }\nexport enum PropertyKind {\n\tValue, Shorthand, ShorthandOrClassField,\n\tAssign, Method, ClassField, AccessorGetter, AccessorSetter,\n\tSpread, NotSet\n}\nexport type PropertyKindInfo = { kind?: PropertyKind, funcFlag?: FunctionKind, name: string };\nexport type FunctionInfo = { rest?: boolean };\nexport function parsePropertyKindFromToken(token: Token, info: PropertyKindInfo) {\n\tswitch (token) {\n\t\tcase Token.COLON:\n\t\t\tinfo.kind = PropertyKind.Value;\n\t\t\treturn true;\n\t\tcase Token.COMMA:\n\t\t\tinfo.kind = PropertyKind.Shorthand;\n\t\t\treturn true;\n\t\tcase Token.R_CURLY:\n\t\t\tinfo.kind = PropertyKind.ShorthandOrClassField;\n\t\t\treturn true;\n\t\tcase Token.ASSIGN:\n\t\t\tinfo.kind = PropertyKind.Assign;\n\t\t\treturn true;\n\t\tcase Token.L_PARENTHESES:\n\t\t\tinfo.kind = PropertyKind.Method;\n\t\t\treturn true;\n\t\tcase Token.MUL:\n\t\tcase Token.SEMICOLON:\n\t\t\tinfo.kind = PropertyKind.ClassField;\n\t\t\treturn true;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\treturn false;\n}\n\nexport enum PreParserIdentifierType {\n\tNullIdentifier = 'NullIdentifier',\n\tUnknownIdentifier = 'UnknownIdentifier',\n\tEvalIdentifier = 'EvalIdentifier',\n\tArgumentsIdentifier = 'ArgumentsIdentifier',\n\tConstructorIdentifier = 'ConstructorIdentifier',\n\tAwaitIdentifier = 'AwaitIdentifier',\n\tAsyncIdentifier = 'AsyncIdentifier',\n\tNameIdentifier = 'NameIdentifier',\n\tPrivateNameIdentifier = 'PrivateNameIdentifier'\n}\n\nexport abstract class AbstractParser {\n\tconstructor(protected scanner: TokenStream) { }\n\tabstract scan(): ExpressionNode;\n\tprotected position() {\n\t\treturn this.scanner.getPos();\n\t}\n\tprotected current() {\n\t\treturn this.scanner.currentToken();\n\t}\n\tprotected next() {\n\t\treturn this.scanner.next();\n\t}\n\tprotected peek(): TokenExpression {\n\t\treturn this.scanner.peek();\n\t}\n\tprotected peekAhead(): TokenExpression {\n\t\treturn this.scanner.peekAhead();\n\t}\n\tprotected peekAheadPosition() {\n\t\treturn this.scanner.peekAheadPosition();\n\t}\n\tprotected peekPosition() {\n\t\treturn this.scanner.peekPosition();\n\t}\n\tprotected consume(token: Token) {\n\t\tif (this.scanner.next().isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing ${JSON.stringify(token)}`));\n\t\t}\n\t}\n\tprotected check(token: Token): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.isType(token)) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected checkValue(value: ExpressionNode): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.value == value) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected expect(token: Token) {\n\t\tconst current = this.scanner.next();\n\t\tif (current.isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(token)}, current is ${JSON.stringify(current)}`));\n\t\t}\n\t}\n\tprotected checkInOrOf(): 'IN' | 'OF' | false {\n\t\tif (this.check(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (this.checkValue(OfNode)) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected peekInOrOf(): 'IN' | 'OF' | false {\n\t\tvar next = this.peek();\n\t\tif (next.isType(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (next.value === OfNode) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isEvalOrArguments(name: ExpressionNode): boolean {\n\t\tif (name.toString() === 'eval') {\n\t\t\treturn true;\n\t\t} else if (name.toString() === 'arguments') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isNextLetKeyword() {\n\t\tif (this.peek().isNotType(Token.LET)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst nextNextToken = this.peekAhead().token;\n\t\tswitch (nextNextToken) {\n\t\t\tcase Token.L_CURLY:\n\t\t\tcase Token.L_BRACKETS:\n\t\t\tcase Token.IDENTIFIER:\n\t\t\tcase Token.STATIC:\n\t\t\tcase Token.LET: // `let let;` is disallowed by static semantics, but the\n\t\t\t// token must be first interpreted as a keyword in order\n\t\t\t// for those semantics to apply. This ensures that ASI is\n\t\t\t// not honored when a LineTerminator separates the\n\t\t\t// tokens.\n\t\t\tcase Token.YIELD:\n\t\t\tcase Token.AWAIT:\n\t\t\tcase Token.GET:\n\t\t\tcase Token.SET:\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tprotected isIdentifier(expression: ExpressionNode): expression is Identifier {\n\t\treturn expression instanceof Identifier;\n\t}\n\tprotected isParenthesized(expression: ExpressionNode): expression is (GroupingExpression | SequenceExpression) {\n\t\treturn expression instanceof GroupingExpression || expression instanceof SequenceExpression;\n\t}\n\tprotected isAssignableIdentifier(expression: ExpressionNode): boolean {\n\t\t// return expression instanceof AssignmentNode;\n\t\tif (!(expression instanceof Identifier)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.isEvalOrArguments(expression)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tprotected isPattern(expression: ExpressionNode): expression is (ObjectPattern | ArrayPattern) {\n\t\treturn expression instanceof ObjectPattern || expression instanceof ArrayPattern;\n\t}\n\tprotected isProperty(expression: ExpressionNode): expression is MemberExpression {\n\t\treturn expression instanceof MemberExpression;\n\t}\n\tprotected isCallNew(expression: ExpressionNode): expression is NewExpression {\n\t\treturn expression instanceof NewExpression;\n\t}\n\tprotected isCall(expression: ExpressionNode): expression is CallExpression {\n\t\treturn expression instanceof CallExpression;\n\t}\n\tprotected isEmptyStatement(expression: ExpressionNode): expression is EmptyStatement {\n\t\treturn expression instanceof EmptyStatement;\n\t}\n\tprotected isThisProperty(expression: ExpressionNode): boolean {\n\t\tif (this.isProperty(expression)) {\n\t\t\tif (expression.getObject() === ThisNode || expression.getObject().toString() === 'this') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isValidReferenceExpression(expression: ExpressionNode): boolean {\n\t\treturn this.isAssignableIdentifier(expression) || this.isProperty(expression);\n\t}\n\tprotected expectSemicolon() {\n\t\tconst tok = this.peek();\n\t\tif (tok.isType(Token.SEMICOLON)) {\n\t\t\tthis.next();\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tok.token)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.currentToken().isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`Await Not In Async Context/Function`));\n\t\t}\n\t}\n\tprotected peekAnyIdentifier() {\n\t\treturn Token.isAnyIdentifier(this.peek().token);\n\t}\n\tprotected errorMessage(message: string): string {\n\t\treturn this.scanner.createError(message);\n\t}\n}\n\nexport class JavaScriptParser extends AbstractParser {\n\tstatic parse(source: string | TokenExpression[] | TokenStream) {\n\t\tconst stream = (typeof source === 'string' || Array.isArray(source))\n\t\t\t? TokenStream.getTokenStream(source)\n\t\t\t: source;\n\t\tconst parser = new JavaScriptParser(stream);\n\t\treturn parser.scan();\n\t}\n\tscan(): ExpressionNode {\n\t\tconst list: ExpressionNode[] = this.parseStatementList(Token.EOS);\n\t\tif (list.length === 1) {\n\t\t\treturn list[0];\n\t\t}\n\t\treturn new ExpressionStatement(list);\n\t}\n\n\t/**\n\t * Statement ::\n\t * Block\n\t * VariableStatement\n\t * EmptyStatement\n\t * ExpressionStatement\n\t * IfStatement\n\t * IterationStatement\n\t * ContinueStatement\n\t * BreakStatement\n\t * ReturnStatement\n\t * WithStatement\n\t * LabelledStatement\n\t * SwitchStatement\n\t * ThrowStatement\n\t * TryStatement\n\t * DebuggerStatement\n\t */\n\tprotected parseStatement(): ExpressionNode {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseBlock();\n\t\t\tcase Token.SEMICOLON:\n\t\t\t\tthis.consume(Token.SEMICOLON);\n\t\t\t\treturn EmptyStatement.INSTANCE;\n\t\t\tcase Token.IF:\n\t\t\t\treturn this.parseIfStatement();\n\t\t\tcase Token.DO:\n\t\t\t\treturn this.parseDoWhileStatement();\n\t\t\tcase Token.WHILE:\n\t\t\t\treturn this.parseWhileStatement();\n\t\t\tcase Token.FOR:\n\t\t\t\t// if (this.peekAhead().isType(Token.AWAIT)) {\n\t\t\t\t// \treturn this.parseForAwaitStatement();\n\t\t\t\t// }\n\t\t\t\treturn this.parseForStatement();\n\t\t\tcase Token.CONTINUE:\n\t\t\t\treturn this.parseContinueStatement();\n\t\t\tcase Token.BREAK:\n\t\t\t\treturn this.parseBreakStatement();\n\t\t\tcase Token.RETURN:\n\t\t\t\treturn this.parseReturnStatement();\n\t\t\tcase Token.THROW:\n\t\t\t\treturn this.parseThrowStatement();\n\t\t\tcase Token.TRY:\n\t\t\t\treturn this.parseTryStatement();\n\t\t\tcase Token.SWITCH:\n\t\t\t\treturn this.parseSwitchStatement();\n\t\t\t// case Token.FUNCTION:\n\t\t\t// \t// FunctionDeclaration only allowed as a StatementListItem, not in\n\t\t\t// \t// an arbitrary Statement position. Exceptions such as\n\t\t\t// \t// ES#sec-functiondeclarations-in-ifstatement-statement-clauses\n\t\t\t// \t// are handled by calling ParseScopedStatement rather than\n\t\t\t// \t// ParseStatement directly.\n\t\t\t// \timpl() -> ReportMessageAt(scanner() -> peek_location(),\n\t\t\t// \t\tis_strict(language_mode())\n\t\t\t// \t\t\t? MessageTemplate.kStrictFunction\n\t\t\t// \t\t\t: MessageTemplate.kSloppyFunction);\n\t\t\t// \treturn impl() -> NullStatement();\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn this.parseExpressionOrLabelledStatement();\n\t\t}\n\t}\n\tprotected parseTryStatement(): ExpressionNode {\n\t\t// TryStatement ::\n\t\t// 'try' Block Catch\n\t\t// 'try' Block Finally\n\t\t// 'try' Block Catch Finally\n\t\t//\n\t\t// Catch ::\n\t\t// 'catch' '(' Identifier ')' Block\n\t\t//\n\t\t// Finally ::\n\t\t// 'finally' Block\n\n\t\tthis.consume(Token.TRY);\n\t\tconst tryBlock = this.parseBlock();\n\t\tif (tryBlock instanceof BlockStatement) {\n\t\t\ttryBlock.isStatement = true;\n\t\t}\n\t\tlet peek = this.peek();\n\t\tif (peek.isNotType(Token.CATCH) && peek.isNotType(Token.FINALLY)) {\n\t\t\tthrow new Error(this.errorMessage(`Uncaught SyntaxError: Missing catch or finally after try`));\n\t\t}\n\t\tlet catchBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.CATCH)) {\n\t\t\t// bool has_binding;\n\t\t\tlet catchVar: ExpressionNode | undefined;\n\t\t\tconst hasBinding = this.check(Token.L_PARENTHESES);\n\t\t\tif (hasBinding) {\n\t\t\t\tcatchVar = this.parseIdentifier();\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t}\n\t\t\tconst block = this.parseBlock();\n\t\t\tif (block instanceof BlockStatement) {\n\t\t\t\tblock.isStatement = true;\n\t\t\t}\n\t\t\tcatchBlock = new CatchClauseNode(block, catchVar);\n\t\t}\n\t\tlet finallyBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.FINALLY)) {\n\t\t\tfinallyBlock = this.parseBlock();\n\t\t\tif (finallyBlock instanceof BlockStatement) {\n\t\t\t\tfinallyBlock.isStatement = true;\n\t\t\t}\n\t\t}\n\t\treturn new TryCatchNode(tryBlock, catchBlock, finallyBlock);\n\t}\n\tprotected parseBlock(): ExpressionNode {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst statements: ExpressionNode[] = [];\n\t\tconst block = new BlockStatement(statements, false);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\treturn block;\n\t\t\t} else if (stat instanceof EmptyStatement) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstatements.push(stat);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn block;\n\t}\n\t/**\n\t * ECMA 262 6th Edition\n\t * \tStatementListItem[Yield, Return] :\n\t * \tStatement[?Yield, ?Return]\n\t * \tDeclaration[?Yield]\n\t * //\n\t * Declaration[Yield] :\n\t * \tHoistableDeclaration[?Yield]\n\t * \tClassDeclaration[?Yield]\n\t * \tLexicalDeclaration[In, ?Yield]\n\t * //\n\t * HoistableDeclaration[Yield, Default] :\n\t * \tFunctionDeclaration[?Yield, ?Default]\n\t * \tGeneratorDeclaration[?Yield, ?Default]\n\t * //\n\t * LexicalDeclaration[In, Yield] :\n\t * \tLetOrConst BindingList[?In, ?Yield] ;\n\t */\n\tprotected parseStatementListItem(): ExpressionNode | undefined {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.CLASS:\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\treturn this.parseClassDeclaration(undefined, false);\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn this.parseStatement();\n\t}\n\tprotected parseFunctionExpression(type: FunctionKind): ExpressionNode {\n\t\tlet funcName: ExpressionNode | undefined;\n\t\tconst peek = this.peek();\n\t\tif (peek.isNotType(Token.L_PARENTHESES)) {\n\t\t\tif (peek.isType(Token.L_BRACKETS)) {\n\t\t\t\t// [Symbol.iterator]() {}\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tfuncName = this.parseMemberExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t} else {\n\t\t\t\tfuncName = this.parseIdentifier();\n\t\t\t}\n\t\t}\n\t\treturn this.parseFunctionLiteral(type, funcName);\n\t}\n\tprotected parseIfStatement(): ExpressionNode {\n\t\tthis.consume(Token.IF);\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.consume(Token.R_PARENTHESES);\n\t\tconst thenStatement = this.parseStatement();\n\t\tif (thenStatement instanceof BlockStatement) {\n\t\t\tthenStatement.isStatement = true;\n\t\t}\n\t\tlet elseStatement;\n\t\tif (this.peek().isType(Token.ELSE)) {\n\t\t\tthis.consume(Token.ELSE);\n\t\t\telseStatement = this.parseStatement();\n\t\t}\n\t\treturn new IfStatement(condition, thenStatement, elseStatement);\n\t}\n\tprotected parseDoWhileStatement(): ExpressionNode {\n\t\t// DoStatement ::\n\t\t// 'do' Statement 'while' '(' Expression ')' ';'\n\t\tthis.consume(Token.DO);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\tthis.expect(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tthis.check(Token.SEMICOLON);\n\t\treturn new DoWhileNode(condition, body);\n\t}\n\tprotected parseWhileStatement(): ExpressionNode {\n\t\t// WhileStatement ::\n\t\t// 'while' '(' Expression ')' Statement\n\t\tthis.consume(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new WhileNode(condition, body);\n\t}\n\tprotected parseThrowStatement(): ExpressionNode {\n\t\t// ThrowStatement ::\n\t\t// 'throw' Expression ';'\n\t\tthis.consume(Token.THROW);\n\t\tif (this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tthrow new Error(this.scanner.createError(`New line After Throw`));\n\t\t}\n\t\tconst exception = this.parseExpression();\n\t\tthis.expectSemicolon();\n\t\treturn new ThrowStatement(exception);\n\t}\n\tprotected parseSwitchStatement(): ExpressionNode {\n\t\t// SwitchStatement ::\n\t\t// 'switch' '(' Expression ')' '{' CaseClause* '}'\n\t\t// CaseClause ::\n\t\t// 'case' Expression ':' StatementList\n\t\t// 'default' ':' StatementList\n\n\t\tthis.consume(Token.SWITCH);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst tag = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\n\t\tconst cases: SwitchCase[] = [];\n\t\tconst switchStatement = new SwitchStatement(tag, cases);\n\n\t\tlet defaultSeen = false;\n\t\tthis.expect(Token.L_CURLY);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst statements: ExpressionNode[] = [];\n\t\t\tlet label: ExpressionNode;\n\t\t\tif (this.check(Token.CASE)) {\n\t\t\t\tlabel = this.parseExpression();\n\t\t\t} else {\n\t\t\t\tthis.expect(Token.DEFAULT);\n\t\t\t\tif (defaultSeen) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Multiple Defaults In Switch`));\n\t\t\t\t}\n\t\t\t\tdefaultSeen = true;\n\t\t\t}\n\t\t\tthis.expect(Token.COLON);\n\t\t\twhile (this.peek().isNotType(Token.CASE)\n\t\t\t\t&& this.peek().isNotType(Token.DEFAULT)\n\t\t\t\t&& this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tconst statement = this.parseStatementListItem();\n\t\t\t\tif (!statement || this.isEmptyStatement(statement)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstatements.push(statement);\n\t\t\t}\n\t\t\tconst block = new BlockStatement(statements, true);\n\t\t\tconst clause = defaultSeen ? new DefaultExpression(block) : new SwitchCase(label!, block);\n\t\t\tcases.push(clause);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn switchStatement;\n\t}\n\tprotected parseForStatement(): ExpressionNode {\n\t\t// Either a standard for loop\n\t\t// for (<init>; <cond>; <next>) { ... }\n\t\t// or a for-each loop\n\t\t// for (<each> of|in <iterable>) { ... }\n\t\t//\n\n\t\tthis.consume(Token.FOR);\n\t\tconst isAwait = this.check(Token.AWAIT);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst peek = this.peek();\n\t\tconst startsWithLet = peek.isType(Token.LET) || peek.isType(Token.VAR);\n\t\tlet initializer: ExpressionNode;\n\t\tif (peek.isType(Token.CONST) || (startsWithLet && this.isNextLetKeyword())) {\n\t\t\tinitializer = this.parseVariableDeclarations();\n\t\t} else if (peek.isType(Token.SEMICOLON)) {\n\t\t\tinitializer = EmptyStatement.INSTANCE;\n\t\t} else {\n\t\t\tinitializer = this.parseExpressionCoverGrammar();\n\t\t}\n\t\tif (initializer instanceof BinaryExpression) {\n\t\t\t// x in y \n\t\t\tconst objectNode = initializer.getRight();\n\t\t\tinitializer = initializer.getLeft();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\treturn new ForInNode(initializer as ForDeclaration, objectNode, statement);\n\t\t}\n\t\tconst forMode = this.checkInOrOf();\n\t\tif (forMode) {\n\t\t\tconst object = forMode === 'IN' ? this.parseAssignmentExpression() : this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\tif (statement instanceof BlockStatement) {\n\t\t\t\tstatement.isStatement = true;\n\t\t\t}\n\t\t\tif (isAwait && forMode === 'OF') {\n\t\t\t\treturn new ForAwaitOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'OF') {\n\t\t\t\treturn new ForOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'IN') {\n\t\t\t\treturn new ForInNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else {\n\t\t\t\tthrow new Error(this.errorMessage(`parsing for loop: ${this.position()}`));\n\t\t\t}\n\t\t}\n\t\tthis.expect(Token.SEMICOLON);\n\t\tlet condition: ExpressionNode | undefined;\n\t\tif (!this.check(Token.SEMICOLON)) {\n\t\t\tcondition = this.parseExpression();\n\t\t\tthis.expect(Token.SEMICOLON);\n\t\t}\n\t\tlet finalExpression: ExpressionNode | undefined;\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tfinalExpression = this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t}\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new ForNode(body, initializer, condition, finalExpression);\n\t}\n\tprotected parseVariableDeclarations(): ExpressionNode {\n\t\t// VariableDeclarations ::\n\t\t// ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']\n\t\t// var converted into ==> 'let' by parser\n\n\t\tlet mode: 'const' | 'let' | 'var';\n\t\tconst token = this.peek().token;\n\t\tswitch (token) {\n\t\t\tcase Token.CONST:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'const';\n\t\t\t\tbreak;\n\t\t\tcase Token.VAR:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'var';\n\t\t\tcase Token.LET:\n\t\t\tdefault:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'let';\n\t\t\t\tbreak;\n\t\t}\n\t\tconst variables: VariableNode[] = [];\n\t\tdo {\n\n\t\t\tlet name: ExpressionNode;\n\t\t\tlet value: ExpressionNode | undefined;\n\t\t\t// Check for an identifier first, so that we can elide the pattern in cases\n\t\t\t// where there is no initializer (and so no proxy needs to be created).\n\t\t\tif (Token.isAnyIdentifier(this.peek().token)) {\n\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t\t}\n\t\t\t\t// if (this.peekInOrOf()) {\n\t\t\t\t// \t// // Assignments need the variable expression for the assignment LHS, and\n\t\t\t\t// \t// // for of/in will need it later, so create the expression now.\n\t\t\t\t// }\n\t\t\t} else {\n\t\t\t\tname = this.parseBindingPattern(true);\n\t\t\t}\n\n\t\t\tif (this.check(Token.ASSIGN)) {\n\t\t\t\tvalue = this.parseAssignmentExpression();\n\t\t\t} else if (!this.peekInOrOf()) {\n\t\t\t\t// ES6 'const' and binding patterns require initializers.\n\t\t\t\tif (mode === 'const' && (name === undefined || value === undefined)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Declaration Missing Initializer : ${this.position()}`));\n\t\t\t\t}\n\t\t\t\t// value = undefined;\n\t\t\t}\n\t\t\tvariables.push(new VariableNode(name as CanDeclareExpression, value));\n\t\t} while (this.check(Token.COMMA));\n\t\treturn new VariableDeclarationNode(variables, mode);\n\t}\n\tprotected parseBindingPattern(isPattern: boolean): ExpressionNode {\n\t\t// Pattern ::\n\t\t// Identifier\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\n\t\tconst token = this.peek().token;\n\t\tif (Token.isAnyIdentifier(token)) {\n\t\t\tconst name = this.parseAndClassifyIdentifier(this.next());\n\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t}\n\t\t\treturn name;\n\t\t}\n\t\tif (token == Token.L_BRACKETS) {\n\t\t\treturn this.parseArrayLiteral(isPattern);\n\t\t} else if (token == Token.L_CURLY) {\n\t\t\treturn this.parseObjectLiteral(isPattern);\n\t\t} else {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${this.next().getValue()}`));\n\t\t}\n\t}\n\tprotected parseAndClassifyIdentifier(next: TokenExpression): ExpressionNode {\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\telse if (next.isType(Token.SET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'set');\n\t\t}\n\t\telse if (next.isType(Token.GET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'get');\n\t\t}\n\t\telse if (next.isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`un supported expression (await)`));\n\n\t\t}\n\t\treturn next.getValue();\n\t}\n\tprotected parseContinueStatement(): ExpressionNode {\n\t\t// ContinueStatement ::\n\t\t// 'continue' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.CONTINUE);\n\t\tthis.expectSemicolon();\n\t\treturn ContinueStatement.CONTINUE_INSTANCE;\n\t}\n\tprotected parseBreakStatement(): ExpressionNode {\n\t\t// BreakStatement ::\n\t\t// 'break' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.BREAK);\n\t\tthis.expectSemicolon();\n\t\treturn BreakStatement.BREAK_INSTANCE;\n\t}\n\tprotected parseReturnStatement(): ExpressionNode {\n\t\t// ReturnStatement ::\n\t\t// 'return' [no line terminator] Expression? ';'\n\n\t\t// Consume the return token. It is necessary to do that before\n\t\t// reporting any errors on it, because of the way errors are\n\t\t// reported (underlining).\n\t\tthis.consume(Token.RETURN);\n\t\tconst tokenExp = this.peek();\n\t\tlet returnValue: ExpressionNode | undefined;\n\t\t// ExpressionT return_value = impl() -> NullExpression();\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tokenExp.token)) {\n\t\t\t// check if this scope is belong to 'constructor' method to return this at the end;\n\t\t\t// if (this.isDerivedConstructor(function_state_ -> kind())) {\n\t\t\t// \treturnValue = ThisNode;\n\t\t\t// }\n\t\t} else {\n\t\t\treturnValue = this.parseExpression();\n\t\t}\n\t\tthis.expectSemicolon()\n\t\treturn new ReturnStatement(returnValue);\n\t}\n\tprotected parseExpressionOrLabelledStatement(): ExpressionNode {\n\t\t// ExpressionStatement | LabelledStatement ::\n\t\t// Expression ';'\n\t\t// Identifier ':' Statement\n\t\t//\n\t\t// ExpressionStatement[Yield] :\n\t\t// [lookahead notin {{, function, class, let [}] Expression[In, ?Yield] ;\n\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\tcase Token.L_CURLY:\n\t\t\t\tthrow new Error(this.errorMessage(`Unreachable state`));\n\t\t\tcase Token.CLASS:\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token ${this.next().getValue().toString()}`));\n\t\t\tcase Token.LET: {\n\t\t\t\tconst nextNext = this.peekAhead();\n\t\t\t\t// \"let\" followed by either \"[\", \"{\" or an identifier means a lexical\n\t\t\t\t// declaration, which should not appear here.\n\t\t\t\t// However, ASI may insert a line break before an identifier or a brace.\n\t\t\t\tif (nextNext.isNotType(Token.L_BRACKETS) &&\n\t\t\t\t\t((nextNext.isNotType(Token.L_CURLY) && nextNext.isNotType(Token.IDENTIFIER)))) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Lexical Declaration ${this.position()}`));\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tconst startsWithIdentifier = Token.isAnyIdentifier(this.peek().token);\n\t\tconst expression: ExpressionNode = this.parseExpressionCoverGrammar();\n\t\tif (this.peek().isType(Token.COLON) && startsWithIdentifier && this.isIdentifier(expression)) {\n\t\t\t// The whole expression was a single identifier, and not, e.g.,\n\t\t\t// something starting with an identifier or a parenthesized identifier.\n\n\t\t\t// Remove the \"ghost\" variable that turned out to be a label from the top\n\t\t\t// scope. This way, we don't try to resolve it during the scope\n\t\t\t// processing.\n\n\t\t\tthis.consume(Token.COLON);\n\t\t\t// ES#sec-labelled-function-declarations Labelled Function Declarations\n\t\t\tif (this.peek().isType(Token.FUNCTION) /*&& allow_function == kAllowLabelledFunctionStatement */) {\n\t\t\t\treturn this.parseFunctionDeclaration();\n\t\t\t}\n\t\t\treturn this.parseStatement();\n\t\t}\n\t\t// Parsed expression statement, followed by semicolon.\n\t\tthis.expectSemicolon();\n\t\treturn expression;\n\t}\n\tprotected parseExpression(): ExpressionNode {\n\t\treturn this.parseExpressionCoverGrammar();\n\t}\n\tprotected parseFunctionDeclaration(): ExpressionNode {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Generator In Single Statement Context`));\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseFunctionDeclarationAndGenerator() {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\treturn this.parseHoistableDeclaration(FunctionKind.GENERATOR);\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseHoistableDeclaration(flag: FunctionKind): ExpressionNode {\n\t\t// FunctionDeclaration ::\n\t\t// 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// GeneratorDeclaration ::\n\t\t// 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t//\n\t\t// The anonymous forms are allowed iff [default_export] is true.\n\t\t//\n\t\t// 'function' and '*' (if present) have been consumed by the caller.\n\n\t\t// (FunctionType.ASYNC === flag || FunctionType.GENERATOR === flag);\n\n\t\tif (FunctionKind.ASYNC === flag && this.check(Token.MUL)) {\n\t\t\t// Async generator\n\t\t\tflag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\t\tlet name: ExpressionNode | undefined;\n\t\tif (this.peek().isNotType(Token.L_PARENTHESES)) {\n\t\t\tname = this.parseIdentifier();\n\t\t}\n\t\treturn this.parseFunctionLiteral(flag, name);\n\t}\n\tprotected parseIdentifier(): ExpressionNode | undefined {\n\t\tconst next = this.next();\n\t\tif (!Token.isValidIdentifier(next.token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${next.getValue()}`));\n\t\t}\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\treturn this.getIdentifier();\n\t}\n\tprotected getIdentifier(): ExpressionNode {\n\t\tconst current = this.current();\n\t\tconst string = current.getValue().toString();\n\t\tswitch (current.token) {\n\t\t\tcase Token.AWAIT:\n\t\t\t\treturn AwaitIdentifier;\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn AsyncIdentifier;\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\treturn new Identifier(`#${string}`);\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (string == 'constructor') {\n\t\t\treturn ConstructorIdentifier;\n\t\t}\n\t\tif (string == 'name') {\n\t\t\treturn NameIdentifier;\n\t\t}\n\t\tif (string == 'eval') {\n\t\t\treturn EvalIdentifier;\n\t\t}\n\t\telse if (string == 'arguments') {\n\t\t\treturn ArgumentsIdentifier;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`can't identify token ${string}`));\n\t}\n\tprotected parseFunctionLiteral(flag: FunctionKind, name?: ExpressionNode): ExpressionNode {\n\t\t// Function ::\n\t\t// '(' FormalParameterList? ')' '{' FunctionBody '}'\n\n\t\tconst functionInfo: FunctionInfo = {};\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst formals: ExpressionNode[] = this.parseFormalParameterList(functionInfo);\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseFunctionBody();\n\t\tif (name) {\n\t\t\treturn new FunctionDeclaration(formals, body, flag, name as CanDeclareExpression, functionInfo.rest);\n\t\t}\n\t\treturn new FunctionExpression(formals, body, flag, name, functionInfo.rest);\n\t}\n\tprotected parseArrowFunctionBody(): ExpressionNode | ExpressionNode[] {\n\t\tconst isExpression = this.peek().isNotType(Token.L_CURLY);\n\t\tif (isExpression) {\n\t\t\tconst expression = this.parseAssignmentExpression();\n\t\t\treturn expression;\n\t\t} else {\n\t\t\treturn this.parseFunctionBody();\n\t\t}\n\t}\n\tprotected parseFunctionBody(): ExpressionNode[] {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst list = this.parseStatementList(Token.R_CURLY);\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn list;\n\t}\n\tprotected parseStatementList(endToken: Token): ExpressionNode[] {\n\t\t// StatementList ::\n\t\t// (StatementListItem)* <end_token>\n\t\tconst list: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(endToken)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (this.isEmptyStatement(stat)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist.push(stat);\n\t\t}\n\t\treturn list;\n\t}\n\tprotected parseFormalParameterList(functionInfo: FunctionInfo): ExpressionNode[] {\n\t\t// FormalParameters[Yield] :\n\t\t// [empty]\n\t\t// FunctionRestParameter[?Yield]\n\t\t// FormalParameterList[?Yield]\n\t\t// FormalParameterList[?Yield] ,\n\t\t// FormalParameterList[?Yield] , FunctionRestParameter[?Yield]\n\t\t//\n\t\t// FormalParameterList[Yield] :\n\t\t// FormalParameter[?Yield]\n\t\t// FormalParameterList[?Yield] , FormalParameter[?Yield]\n\n\t\tconst parameters: ExpressionNode[] = [];\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\twhile (true) {\n\t\t\t\tconst param: ExpressionNode = this.parseFormalParameter(functionInfo);\n\t\t\t\tparameters.push(param);\n\t\t\t\tif (functionInfo.rest) {\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Param After Rest`));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t\t\tif (this.peek().isType(Token.R_PARENTHESES)) {\n\t\t\t\t\t// allow the trailing comma\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn parameters;\n\t}\n\tprotected parseFormalParameter(functionInfo: FunctionInfo): ExpressionNode {\n\t\t// FormalParameter[Yield,GeneratorParameter] :\n\t\t// BindingElement[?Yield, ?GeneratorParameter]\n\t\tfunctionInfo.rest = this.check(Token.ELLIPSIS);\n\t\tlet pattern = this.parseBindingPattern(true);\n\t\tlet initializer: Param;\n\t\tif (this.check(Token.ASSIGN)) {\n\t\t\tif (functionInfo.rest) {\n\t\t\t\tthrow new Error(this.errorMessage(`Rest Default Initializer`));\n\t\t\t}\n\t\t\tconst value = this.parseAssignmentExpression();\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression, value);\n\t\t} else {\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression);\n\t\t}\n\t\treturn initializer;\n\t}\n\tprotected parseExpressionCoverGrammar(info?: FunctionInfo): ExpressionNode {\n\t\t// Expression ::\n\t\t// AssignmentExpression\n\t\t// Expression ',' AssignmentExpression\n\n\t\t// ExpressionListT list(pointer_buffer());\n\t\t// ExpressionT expression;\n\t\t// AccumulationScope accumulation_scope(expression_scope());\n\t\tlet variableIndex = 0;\n\t\tconst list: ExpressionNode[] = [];\n\t\tlet expression: ExpressionNode;\n\t\twhile (true) {\n\t\t\tif (this.peek().isType(Token.ELLIPSIS)) {\n\t\t\t\tif (info) {\n\t\t\t\t\tinfo.rest = true;\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowParametersWithRest(list, variableIndex);\n\t\t\t}\n\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tlist.push(expression);\n\n\t\t\tif (!this.check(Token.COMMA)) break;\n\n\t\t\tif (this.peek().isType(Token.R_PARENTHESES) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t// a trailing comma is allowed at the end of an arrow parameter list\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (list.length == 1) return expression;\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected parseArrowParametersWithRest(list: ExpressionNode[], variableIndex: number): ExpressionNode {\n\t\tthis.consume(Token.ELLIPSIS);\n\t\tconst pattern: ExpressionNode = this.parseBindingPattern(true);\n\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter cannot have an initializer`));\n\t\t}\n\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter or binding pattern may not have a trailing comma`));\n\t\t}\n\t\t// 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only\n\t\t// as the formal parameters of'(x, y, ...z) => foo', and is not itself a\n\t\t// valid expression.\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES) || this.peekAhead().isNotType(Token.ARROW)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Unexpected Token At ${this.position()}`));\n\t\t}\n\t\tlist.push(pattern);\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected expressionListToExpression(list: ExpressionNode[]): ExpressionNode {\n\t\tif (list.length === 1) { return list[0]; }\n\t\treturn new SequenceExpression(list);\n\t}\n\tprotected parseMemberExpression(): ExpressionNode {\n\t\t// MemberExpression ::\n\t\t// (PrimaryExpression | FunctionLiteral | ClassLiteral)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// CallExpression ::\n\t\t// (SuperCall | ImportCall)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// The '[' Expression ']' and '.' Identifier parts are parsed by\n\t\t// ParseMemberExpressionContinuation, and everything preceeding it is merged\n\t\t// into ParsePrimaryExpression.\n\n\t\t// Parse the initial primary or function expression.\n\t\tconst result = this.parsePrimaryExpression();\n\t\treturn this.parseMemberExpressionContinuation(result);\n\t}\n\tprotected toParamNode(expression: ExpressionNode): Param {\n\t\tif (expression instanceof AssignmentExpression) {\n\t\t\treturn new Param(expression.getLeft() as CanDeclareExpression, expression.getRight());\n\t\t}\n\t\tif (expression instanceof GroupingExpression) {\n\t\t\treturn new Param(expression.getNode() as CanDeclareExpression);\n\t\t}\n\t\treturn new Param(expression as CanDeclareExpression);\n\t}\n\tprotected parsePrimaryExpression(): ExpressionNode {\n\t\t// PrimaryExpression ::\n\t\t// 'this'\n\t\t// 'null'\n\t\t// 'true'\n\t\t// 'false'\n\t\t// Identifier\n\t\t// Number\n\t\t// String\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\t\t// RegExpLiteral\n\t\t// '(' Expression ')'\n\t\t// do Block\n\t\t// AsyncFunctionLiteral\n\n\t\tlet token = this.peek();\n\t\tif (Token.isAnyIdentifier(token.token)) {\n\t\t\tthis.consume(token.token);\n\t\t\tlet kind: ArrowFunctionType = ArrowFunctionType.NORMAL;\n\t\t\tif (token.isType(Token.ASYNC) && !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\t// async function ...\n\t\t\t\tif (this.peek().isType(Token.FUNCTION)) {\n\t\t\t\t\treturn this.parseFunctionDeclarationAndGenerator();\n\t\t\t\t};\n\t\t\t\t// async Identifier => ...\n\t\t\t\tif (Token.isAnyIdentifier(this.peek().token) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t\ttoken = this.next();\n\t\t\t\t\tkind = ArrowFunctionType.ASYNC;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\tconst name = this.parseAndClassifyIdentifier(token);\n\t\t\t\tconst params: Param[] = [];\n\t\t\t\tif (name instanceof SequenceExpression) {\n\t\t\t\t\tparams.push(...name.getExpressions().map(this.toParamNode));\n\t\t\t\t} else {\n\t\t\t\t\tparams.push(this.toParamNode(name));\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, kind);\n\t\t\t}\n\t\t\treturn this.parseAndClassifyIdentifier(token);\n\t\t}\n\n\t\tif (Token.isLiteral(token.token)) {\n\t\t\treturn expressionFromLiteral(this.next());\n\t\t}\n\n\t\tswitch (token.token) {\n\t\t\tcase Token.NEW:\n\t\t\t\treturn this.parseMemberWithPresentNewPrefixesExpression();\n\t\t\tcase Token.THIS:\n\t\t\t\tthis.consume(Token.THIS);\n\t\t\t\treturn ThisNode;\n\t\t\tcase Token.DIV:\n\t\t\tcase Token.DIV_ASSIGN:\n\t\t\t\t// case Token.REGEXP_LITERAL:\n\t\t\t\t// this.consume(Token.REGEXP_LITERAL);\n\t\t\t\t// return token.value!;\n\t\t\t\treturn this.parseRegExpLiteral();\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.SUPER: {\n\t\t\t\treturn this.parseSuperExpression();\n\t\t\t}\n\t\t\tcase Token.IMPORT:\n\t\t\t\treturn this.parseImportExpressions();\n\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\treturn this.parseArrayLiteral(false);\n\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseObjectLiteral(false);\n\n\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tif (this.check(Token.R_PARENTHESES)) {\n\t\t\t\t\t// ()=>x. The continuation that consumes the => is in\n\t\t\t\t\t// ParseAssignmentExpressionCoverGrammar.\n\n\t\t\t\t\tif (!this.peek().isType(Token.ARROW)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${Token.R_PARENTHESES.getName()}`));\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseArrowFunctionLiteral([], ArrowFunctionType.NORMAL);\n\t\t\t\t}\n\t\t\t\t// Heuristically try to detect immediately called functions before\n\t\t\t\t// seeing the call parentheses.\n\n\t\t\t\tconst peekToken = this.peek();\n\t\t\t\tlet expression: ExpressionNode;\n\t\t\t\tconst info: FunctionInfo = {};\n\t\t\t\tif (peekToken.isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.NORMAL);\n\t\t\t\t} else if (peekToken.isType(Token.ASYNC) && this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.ASYNC);\n\t\t\t\t} else {\n\t\t\t\t\texpression = this.parseExpressionCoverGrammar(info);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral(expression.getExpressions(), ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t} else {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral([expression], ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn expression;\n\t\t\t}\n\t\t\tcase Token.CLASS: {\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\tlet name: ExpressionNode | undefined;\n\t\t\t\tlet isStrictReserved = false;\n\t\t\t\tif (this.peekAnyIdentifier()) {\n\t\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\t\tisStrictReserved = Token.isStrictReservedWord(this.current().token);\n\t\t\t\t}\n\t\t\t\treturn this.parseClassLiteral(name, isStrictReserved);\n\t\t\t}\n\t\t\tcase Token.TEMPLATE_LITERALS:\n\t\t\t\treturn this.parseTemplateLiteral();\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(this.next())}`));\n\t}\n\tprotected parseTemplateLiteral(tag?: ExpressionNode): ExpressionNode {\n\t\tconst template = this.next().getValue() as PreTemplateLiteral;\n\t\tconst exprs = template.expressions.map(expr => JavaScriptParser.parse(expr));\n\n\t\tif (tag) {\n\t\t\treturn new TaggedTemplateExpression(tag, template.strings, exprs);\n\t\t} else {\n\t\t\treturn new TemplateLiteral(template.strings, exprs);\n\t\t}\n\t}\n\tprotected parseMemberWithPresentNewPrefixesExpression(): ExpressionNode {\n\t\tthis.consume(Token.NEW);\n\t\tlet classRef: ExpressionNode;\n\t\tif (this.peek().isType(Token.IMPORT) && this.peekAhead().isType(Token.L_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new import (`));\n\t\t} else if (this.peek().isType(Token.SUPER)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new super() is never allowed`));\n\t\t} else if (this.peek().isType(Token.PERIOD)) {\n\t\t\tclassRef = this.parseNewTargetExpression();\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t} else {\n\t\t\tclassRef = this.parseMemberExpression();\n\t\t}\n\t\tif (this.peek().isType(Token.L_PARENTHESES)) {\n\t\t\t// NewExpression with arguments.\n\t\t\tconst args: ExpressionNode[] = this.parseArguments();\n\t\t\tclassRef = new NewExpression(classRef, args);\n\t\t\t// The expression can still continue with . or [ after the arguments.\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t}\n\t\tif (this.peek().isType(Token.QUESTION_PERIOD)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new xxx?.yyy at position`));\n\t\t}\n\t\treturn new NewExpression(classRef);\n\t}\n\tprotected parseArguments(maybeArrow?: ParsingArrowHeadFlag): ExpressionNode[] {\n\t\t// Arguments ::\n\t\t// '(' (AssignmentExpression)*[','] ')'\n\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst args: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\tlet argument: ExpressionNode = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tif (ParsingArrowHeadFlag.MaybeArrowHead === maybeArrow) {\n\t\t\t\tif (isSpread) {\n\t\t\t\t\tif (argument instanceof AssignmentExpression) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(` Rest parameter may not have a default initializer'`));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`parsing '...spread,arg =>'`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isSpread) {\n\t\t\t\targument = new SpreadElement(argument);\n\t\t\t}\n\t\t\targs.push(argument);\n\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t}\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing arguments call, expecting ')'`));\n\t\t}\n\t\treturn args;\n\t}\n\tprotected parseAssignmentExpressionCoverGrammar(): ExpressionNode {\n\t\t// AssignmentExpression ::\n\t\t// ConditionalExpression\n\t\t// ArrowFunction\n\t\t// YieldExpression\n\t\t// LeftHandSideExpression AssignmentOperator AssignmentExpression\n\n\t\tif (this.peek().isType(Token.YIELD) /*&& this.isGenerator()*/) {\n\t\t\treturn this.parseYieldExpression();\n\t\t}\n\t\tlet expression: ExpressionNode = this.parseConditionalExpression();\n\t\tconst op = this.peek().token;\n\t\tif (!Token.isArrowOrAssignmentOp(op)) return expression;\n\t\t// Arrow functions.\n\t\tif (op === Token.ARROW) {\n\t\t\tif (!this.isIdentifier(expression) && !this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Malformed Arrow Fun Param List`));\n\t\t\t}\n\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\tconst params = expression.getExpressions().map(expr => new Param(expr as CanDeclareExpression));\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\tif (expression instanceof GroupingExpression) {\n\t\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression.getNode() as CanDeclareExpression)], ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression)], ArrowFunctionType.NORMAL);\n\t\t}\n\t\tif (this.isAssignableIdentifier(expression)) {\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t\t}\n\t\t} else if (this.isProperty(expression)) {\n\t\t\t// throw new Error(this.errorMessage(`Invalid Property Binding Pattern`));\n\t\t} else if (this.isPattern(expression) && Token.isAssignment(op)) {\n\t\t\t// Destructuring assignment.\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\t// Scanner.Location loc(lhs_beg_pos, end_position());\n\t\t\t\t// if (expression_scope() -> IsCertainlyDeclaration()) {\n\t\t\t\t// \timpl() -> ReportMessageAt(loc,\n\t\t\t\t// \t\tMessageTemplate.kInvalidDestructuringTarget);\n\t\t\t\t// } else {\n\t\t\t\t// \t// Syntax Error if LHS is neither object literal nor an array literal\n\t\t\t\t// \t// (Parenthesized literals are\n\t\t\t\t// \t// CoverParenthesizedExpressionAndArrowParameterList).\n\t\t\t\t// \t// #sec-assignment-operators-static-semantics-early-errors\n\t\t\t\t// \timpl() -> ReportMessageAt(loc, MessageTemplate.kInvalidLhsInAssignment);\n\t\t\t\t// }\n\t\t\t}\n\t\t\t// expression_scope() -> ValidateAsPattern(expression, lhs_beg_pos, end_position());\n\t\t} else {\n\t\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Reference Expression`));\n\t\t\t}\n\t\t\tif (Token.isLogicalAssignmentOp(op)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Lhs In Assignment`));\n\t\t\t}\n\t\t}\n\n\t\tthis.consume(op);\n\t\t// const opPosition = this.position();\n\t\tconst right: ExpressionNode = this.parseAssignmentExpression();\n\t\t// Anonymous function name inference applies to =, ||=, &&=, and ??=.\n\n\t\tif (!Token.isAssignment(op)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t}\n\t\treturn new AssignmentExpression(op.getName() as AssignmentOperator, expression, right);\n\t}\n\tprotected parseAssignmentExpression(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseArrowFunctionLiteral(parameters: ExpressionNode[], flag: ArrowFunctionType, rest?: boolean): ExpressionNode {\n\t\tthis.consume(Token.ARROW);\n\t\tconst body = this.parseArrowFunctionBody();\n\t\treturn new ArrowFunctionExpression(parameters, body, flag, rest);\n\t}\n\tprotected parseRegExpLiteral(): ExpressionNode {\n\t\tif (!this.scanner.scanRegExpPattern()) {\n\t\t\tthrow new Error('Unterminated RegExp');\n\t\t}\n\t\treturn this.scanner.currentToken().getValue();\n\t}\n\tprotected parseArrayLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ArrayLiteral ::\n\t\t// '[' Expression? (',' Expression?)* ']'\n\n\t\tthis.consume(Token.L_BRACKETS);\n\t\tconst values: ExpressionNode[] = [];\n\t\tlet firstSpreadIndex = -1;\n\n\t\twhile (!this.check(Token.R_BRACKETS)) {\n\t\t\tlet elem: ExpressionNode;\n\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\tthis.consume(Token.COMMA);\n\t\t\t\tcontinue;\n\t\t\t} else if (this.check(Token.ELLIPSIS)) {\n\t\t\t\tconst argument = this.parsePossibleDestructuringSubPattern();\n\t\t\t\telem = isPattern\n\t\t\t\t\t? new RestElement(argument as CanDeclareExpression)\n\t\t\t\t\t: new SpreadElement(argument)\n\n\t\t\t\tif (firstSpreadIndex < 0) {\n\t\t\t\t\tfirstSpreadIndex = values.length;\n\t\t\t\t}\n\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Element After Rest @${this.position()}`));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telem = this.parsePossibleDestructuringSubPattern();\n\t\t\t}\n\t\t\tvalues.push(elem);\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ArrayPattern(values as CanDeclareExpression[]);\n\t\t}\n\t\treturn new ArrayExpression(values);\n\t}\n\tprotected parsePossibleDestructuringSubPattern(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseObjectLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ObjectLiteral ::\n\t\t// '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'\n\n\t\tthis.consume(Token.L_CURLY);\n\t\tconst properties: ExpressionNode[] = [];\n\t\twhile (!this.check(Token.R_CURLY)) {\n\t\t\tconst property: ExpressionNode = this.parseObjectPropertyDefinition(isPattern);\n\t\t\tproperties.push(property);\n\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tthis.expect(Token.COMMA);\n\t\t\t}\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ObjectPattern(properties as (Property | RestElement)[]);\n\t\t}\n\t\treturn new ObjectExpression(properties as Property[]);\n\t}\n\tprotected parseObjectPropertyDefinition(isPattern: boolean): ExpressionNode {\n\t\tconst propInfo = { kind: PropertyKind.NotSet } as Required<PropertyKindInfo>;\n\t\tconst nameExpression = this.parseProperty(propInfo);\n\n\t\tswitch (propInfo.kind) {\n\t\t\tcase PropertyKind.Spread:\n\t\t\t\tlet value: SpreadElement | RestElement = nameExpression as SpreadElement;\n\t\t\t\tif (isPattern) {\n\t\t\t\t\tvalue = new RestElement(value.getArgument() as CanDeclareExpression);\n\t\t\t\t}\n\t\t\t\treturn new Property(value.getArgument(), value, 'init');\n\n\t\t\tcase PropertyKind.Value: {\n\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\tconst value = this.parsePossibleDestructuringSubPattern();\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Assign:\n\t\t\tcase PropertyKind.ShorthandOrClassField:\n\t\t\tcase PropertyKind.Shorthand: {\n\t\t\t\t// PropertyDefinition\n\t\t\t\t// IdentifierReference\n\t\t\t\t// CoverInitializedName\n\t\t\t\t//\n\t\t\t\t// CoverInitializedName\n\t\t\t\t// IdentifierReference Initializer?\n\n\t\t\t\tconst lhs = new Identifier(propInfo.name);\n\t\t\t\tif (!this.isAssignableIdentifier(lhs)) {\n\t\t\t\t\tthrow new Error(this.errorMessage('Strict Eval Arguments'));\n\t\t\t\t}\n\t\t\t\tlet value: ExpressionNode;\n\t\t\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\t\t\tthis.consume(Token.ASSIGN);\n\t\t\t\t\tconst rhs = this.parseAssignmentExpression();\n\t\t\t\t\tvalue = new AssignmentExpression(Token.ASSIGN.getName() as AssignmentOperator, lhs, rhs);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = lhs;\n\t\t\t\t}\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Method: {\n\t\t\t\t// MethodDefinition\n\t\t\t\t// PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\t\t\t\t// '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.AccessorGetter:\n\t\t\tcase PropertyKind.AccessorSetter: {\n\t\t\t\tconst isGet = propInfo.kind == PropertyKind.AccessorGetter;\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, isGet ? 'get' : 'set');\n\t\t\t}\n\n\t\t\tcase PropertyKind.ClassField:\n\t\t\tcase PropertyKind.NotSet:\n\t\t\t\treturn NullNode;\n\t\t}\n\t}\n\tprotected parseProperty(propInfo: PropertyKindInfo): ExpressionNode {\n\t\tlet nextToken = this.peek();\n\t\tif (this.check(Token.ASYNC)) {\n\t\t\t// async\n\t\t\tnextToken = this.peek();\n\t\t\tif (nextToken.isNotType(Token.MUL)\n\t\t\t\t&& parsePropertyKindFromToken(nextToken.token, propInfo)\n\t\t\t\t|| this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\treturn AsyncIdentifier;\n\t\t\t}\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC;\n\t\t}\n\n\t\tif (this.check(Token.MUL)) {\n\t\t\t// async*\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\n\t\tnextToken = this.peek();\n\t\tif (propInfo.kind == PropertyKind.NotSet && nextToken.isType(Token.GET) || nextToken.isType(Token.SET)) {\n\t\t\tconst token = this.next();\n\t\t\tif (parsePropertyKindFromToken(this.peek().token, propInfo)) {\n\t\t\t\treturn nextToken.isType(Token.GET) ? GetIdentifier : SetIdentifier;\n\t\t\t}\n\t\t\tif (token.isType(Token.GET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorGetter;\n\t\t\t} else if (token.isType(Token.SET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorSetter;\n\t\t\t}\n\t\t}\n\t\tlet propertyName: ExpressionNode;\n\t\tswitch (nextToken.token) {\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\tthis.consume(Token.PRIVATE_NAME);\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropertyName = this.getIdentifier();\n\t\t\t\tbreak;\n\t\t\tcase Token.STRING:\n\t\t\tcase Token.NUMBER:\n\t\t\tcase Token.BIGINT:\n\t\t\t\t// \"12\" -> 12\n\t\t\t\t// 12.3 -> \"12.3\"\n\t\t\t\t// 12.30 -> \"12.3\"\n\t\t\t\tthis.consume(nextToken.token);\n\t\t\t\tpropertyName = nextToken.getValue();\n\t\t\t\tpropInfo.name = (propertyName as StringLiteral).getValue();\n\t\t\t\tbreak;\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\t// [Symbol.iterator]\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tpropertyName = this.parseAssignmentExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\treturn propertyName;\n\t\t\tcase Token.ELLIPSIS:\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tthis.consume(Token.ELLIPSIS);\n\t\t\t\t\tpropertyName = this.parsePossibleDestructuringSubPattern();\n\t\t\t\t\tpropInfo.kind = PropertyKind.Spread;\n\n\t\t\t\t\tif (!this.isValidReferenceExpression(propertyName)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Invalid Rest Binding/Assignment Pattern'));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Element After Rest'));\n\t\t\t\t\t}\n\t\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\t\treturn propertyName;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpropertyName = new StringLiteral(this.parsePropertyName().toString());\n\t\t\t\t// propertyName = this.parsePropertyName();\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\tbreak;\n\t\t}\n\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t}\n\t\treturn propertyName;\n\t}\n\tprotected parseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) return expression;\n\t\treturn this.doParseMemberExpressionContinuation(expression);\n\t}\n\tprotected doParseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing member expression`));\n\t\t}\n\t\t// Parses this part of MemberExpression:\n\t\t// ('[' Expression ']' | '.' Identifier | TemplateLiteral)*\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\texpression = new MemberExpression(expression, index, true);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key: ExpressionNode = this.parsePropertyName();\n\t\t\t\t\texpression = new MemberExpression(expression, key, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.TEMPLATE_LITERALS: {\n\t\t\t\t\texpression = this.parseTemplateLiteral(expression);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (Token.isMember(this.peek().token));\n\t\treturn expression;\n\t}\n\tprotected parsePropertyName(): ExpressionNode {\n\t\tconst next = this.next();\n\t\tif (next.getValue() instanceof Identifier) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\t// check keyword as identifier\n\t\tif (Token.isPropertyName(next.token)) {\n\t\t\treturn new Identifier(next.token.getName());\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Parsing property expression: Unexpected Token`));\n\t}\n\tprotected parsePipelineExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// expression '|>' function [':' expression [':'? expression] ] *\n\t\t// expression '|>' function '('[expression ','?]* ')'\n\t\t//\n\t\t// expression '|>' function ':' expression [':' expression | '?']*]\n\t\t// expression '|>' function '(' expression [',' expression | '?']* ')'\n\t\t//\n\t\t// [~Await]PipelineExpression[?In, ?Yield, ?Await] |> LogicalORExpression[?In, ?Yield, ?Await]\n\t\t// [+Await]PipelineExpression[? In, ? Yield, ? Await] |> [lookahead ∉ { await }]LogicalORExpression[? In, ? Yield, ? Await]\n\n\t\tlet token: Token;\n\t\twhile (Token.isPipelineOperator(token = this.peek().token)) {\n\t\t\tthis.consume(token);\n\t\t\texpression = this.parsePipelineBody(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parsePipelineBody(lhs: ExpressionNode): ExpressionNode {\n\t\tlet body: ExpressionNode | undefined;\n\t\tlet token = this.peek();\n\t\t// parse function\n\t\tswitch (token.token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\t\tbreak;\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (body) {\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\t\tif (token.isType(Token.L_PARENTHESES)) {\n\t\t\t// parse arrow function\n\t\t\t// x |> ( y => y+1 )\n\t\t\tbody = this.parsePrimaryExpression();\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\n\t\t// parse angular-like and f# and partial operator syntax\n\t\tconst func = this.parseMemberExpression(); //this.parseLogicalExpression();\n\t\tlet args: (ExpressionNode | '?' | '...?')[] = [];\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.COLON:\n\t\t\t\t// support angular pipeline syntax\n\t\t\t\tdo {\n\t\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} while (this.peek().isType(Token.COLON));\n\t\t\t\tbreak;\n\t\t\tcase Token.L_PARENTHESES:\n\t\t\t\t// es2022 syntax, F# & partial operator\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tlet indexed = false;\n\t\t\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tindexed = true;\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.check(Token.COMMA);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\t// should be indexed, has partial operator\n\t\t\t\tif (!indexed) {\n\t\t\t\t\t// z |> method(x, y) === method(x, y)(z)\n\t\t\t\t\tbody = new CallExpression(func, args as ExpressionNode[]);\n\t\t\t\t\treturn new PipelineExpression(lhs, body);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new PipelineExpression(lhs, func, args);\n\t}\n\tprotected parseConditionalExpression(): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// LogicalExpression '?' AssignmentExpression ':' AssignmentExpression\n\t\t//\n\n\t\tlet expression: ExpressionNode = this.parseLogicalExpression();\n\t\texpression = this.parsePipelineExpression(expression);\n\t\treturn this.peek().isType(Token.CONDITIONAL) ? this.parseConditionalContinuation(expression) : expression;\n\t}\n\tprotected parseLogicalExpression(): ExpressionNode {\n\t\t// LogicalExpression ::\n\t\t// LogicalORExpression\n\t\t// CoalesceExpression\n\n\t\t// Both LogicalORExpression and CoalesceExpression start with BitwiseOR.\n\t\t// Parse for binary expressions >= 6 (BitwiseOR);\n\n\t\tlet expression: ExpressionNode = this.parseBinaryExpression(6);\n\t\tconst peek = this.peek();\n\t\tif (peek.isType(Token.AND) || peek.isType(Token.OR)) {\n\t\t\t// LogicalORExpression, pickup parsing where we left off.\n\t\t\tconst precedence = peek.token.getPrecedence();\n\t\t\texpression = this.parseBinaryContinuation(expression, 4, precedence);\n\t\t} else if (peek.isType(Token.NULLISH)) {\n\t\t\texpression = this.parseNullishExpression(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parseBinaryContinuation(x: ExpressionNode, prec: number, prec1: number): ExpressionNode {\n\t\tdo {\n\t\t\t// prec1 >= 4\n\t\t\twhile (this.peek().token.getPrecedence() === prec1) {\n\t\t\t\tlet y: ExpressionNode;\n\t\t\t\tlet op = this.next();\n\n\t\t\t\tconst is_right_associative = op.isType(Token.EXP);\n\t\t\t\tconst next_prec = is_right_associative ? prec1 : prec1 + 1;\n\t\t\t\ty = this.parseBinaryExpression(next_prec);\n\n\n\t\t\t\t// For now we distinguish between comparisons and other binary\n\t\t\t\t// operations. (We could combine the two and get rid of this\n\t\t\t\t// code and AST node eventually.)\n\n\t\t\t\tif (Token.isCompare(op.token)) {\n\t\t\t\t\t// We have a comparison.\n\t\t\t\t\tlet cmp = op.token;\n\t\t\t\t\tswitch (op.token) {\n\t\t\t\t\t\tcase Token.NE: cmp = Token.EQ; break;\n\t\t\t\t\t\tcase Token.NE_STRICT: cmp = Token.EQ_STRICT; break;\n\t\t\t\t\t\tdefault: break;\n\t\t\t\t\t}\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, cmp);\n\t\t\t\t\tif (op.isNotType(cmp)) {\n\t\t\t\t\t\t// The comparison was negated - add a NOT.\n\t\t\t\t\t\tx = buildUnaryExpression(x, Token.NOT);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, op.token);\n\t\t\t\t}\n\t\t\t}\n\t\t\t--prec1;\n\t\t} while (prec1 >= prec);\n\n\t\treturn x;\n\t}\n\tprotected parseBinaryExpression(precedence: number): ExpressionNode {\n\t\tconst x: ExpressionNode = this.parseUnaryExpression();\n\t\tconst precedence1 = this.peek().token.getPrecedence();\n\t\tif (precedence1 >= precedence) {\n\t\t\treturn this.parseBinaryContinuation(x, precedence, precedence1);\n\t\t}\n\t\treturn x;\n\t}\n\tprotected parseUnaryExpression(): ExpressionNode {\n\t\t// UnaryExpression ::\n\t\t// PostfixExpression\n\t\t// 'delete' UnaryExpression\n\t\t// 'void' UnaryExpression\n\t\t// 'typeof' UnaryExpression\n\t\t// '++' UnaryExpression\n\t\t// '--' UnaryExpression\n\t\t// '+' UnaryExpression\n\t\t// '-' UnaryExpression\n\t\t// '~' UnaryExpression\n\t\t// '!' UnaryExpression\n\t\t// [+Await] AwaitExpression[?Yield]\n\n\t\tconst op = this.peek();\n\t\tif (Token.isUnaryOrCount(op.token)) {\n\t\t\treturn this.parseUnaryOrPrefixExpression();\n\t\t}\n\t\tif (op.isType(Token.AWAIT)) {\n\t\t\treturn this.parseAwaitExpression();\n\t\t}\n\t\treturn this.parsePostfixExpression();\n\t}\n\tprotected parseUnaryOrPrefixExpression(): ExpressionNode {\n\t\tconst op = this.next();\n\t\tconst expression = this.parseUnaryExpression();\n\t\tif (Token.isUnary(op.token)) {\n\t\t\tif (op.isType(Token.DELETE)) {\n\t\t\t\tif (this.isIdentifier(expression)) {\n\t\t\t\t\t// \"delete identifier\" is a syntax error in strict mode.\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"delete identifier\" is a syntax error in strict mode`));\n\t\t\t\t}\n\t\t\t\tif (expression instanceof MemberExpression && expression.getProperty().toString().startsWith('#')) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"Delete Private Field\" is a syntax error`));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token Unary Exponentiation`));\n\t\t\t}\n\t\t}\n\n\t\tif (Token.isCount(op.token) || Token.isUnary(op.token)) {\n\t\t\t// Allow the parser to rewrite the expression.\n\t\t\treturn buildUnaryExpression(expression, op.token);\n\t\t}\n\t\tthrow new Error(this.errorMessage(`while rewrite unary operation`));\n\t}\n\tprotected parsePostfixExpression(): ExpressionNode {\n\t\t// PostfixExpression ::\n\t\t// LeftHandSideExpression ('++' | '--')?\n\n\t\tconst expression: ExpressionNode = this.parseLeftHandSideExpression();\n\t\tif (!Token.isCount(this.peek().token) || this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\treturn expression;\n\t\t}\n\t\treturn this.parsePostfixContinuation(expression);\n\t}\n\tprotected parsePostfixContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid LHS In Postfix Op.`));\n\t\t}\n\t\tconst op = this.next();\n\t\treturn buildPostfixExpression(expression, op.token);\n\t}\n\tprotected parseLeftHandSideExpression(): ExpressionNode {\n\t\t// LeftHandSideExpression ::\n\t\t// (NewExpression | MemberExpression) ...\n\t\tconst result = this.parseMemberExpression();\n\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\treturn this.parseLeftHandSideContinuation(result);\n\t}\n\tprotected parseLeftHandSideContinuation(result: ExpressionNode): ExpressionNode {\n\t\tif (this.peek().isType(Token.L_PARENTHESES)\n\t\t\t&& this.isIdentifier(result)\n\t\t\t&& this.scanner.currentToken().isType(Token.ASYNC)\n\t\t\t&& !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tconst args = this.parseArguments(ParsingArrowHeadFlag.AsyncArrowFunction);\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t// async () => ...\n\t\t\t\tif (!args.length) return new EmptyStatement;\n\t\t\t\t// async ( Arguments ) => ...\n\t\t\t\treturn this.expressionListToExpression(args);\n\t\t\t}\n\t\t\tresult = new CallExpression(result, args);\n\t\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\t}\n\n\t\tlet optionalChaining = false;\n\t\tlet isOptional = false;\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\t// chain\n\t\t\t\tcase Token.QUESTION_PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_PERIOD);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tif (Token.isPropertyOrCall(this.peek().token)) continue;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\tresult = new MemberExpression(result, index, true, isOptional);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Call */\n\t\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\t\tconst args = this.parseArguments();\n\t\t\t\t\tif (result.toString() === 'eval') {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`'eval(...)' is not supported.`));\n\t\t\t\t\t}\n\t\t\t\t\tresult = new CallExpression(result, args, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* bind call */\n\t\t\t\tcase Token.BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.BIND);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* chain bind call */\n\t\t\t\tcase Token.QUESTION_BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_BIND);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, true, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Template literals in/after an Optional Chain not supported:\n\t\t\t\t\tif (optionalChaining) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Optional Chaining No Template support`));\n\t\t\t\t\t}\n\t\t\t\t\t/* Tagged Template */\n\t\t\t\t\tresult = this.parseTemplateLiteral(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (isOptional) {\n\t\t\t\tisOptional = false;\n\t\t\t}\n\t\t} while (Token.isPropertyOrCall(this.peek().token));\n\t\tif (optionalChaining) {\n\t\t\tresult = new ChainExpression(result);\n\t\t}\n\t\treturn result;\n\t}\n\tprotected parseAwaitExpression(): ExpressionNode {\n\t\tthis.consume(Token.AWAIT);\n\t\tconst value = this.parseUnaryExpression();\n\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\tthrow new Error(this.scanner.createError(`Unexpected Token Unary Exponentiation`));\n\t\t}\n\t\treturn buildUnaryExpression(value, Token.AWAIT);\n\t}\n\tprotected parseNullishExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// CoalesceExpression ::\n\t\t// CoalesceExpressionHead ?? BitwiseORExpression\n\t\t//\n\t\t// CoalesceExpressionHead ::\n\t\t// CoalesceExpression\n\t\t// BitwiseORExpression\n\n\t\t// We create a binary operation for the first nullish, otherwise collapse\n\t\t// into an nary expression.\n\n\t\tconst list: ExpressionNode[] = [];\n\t\tlist.push(expression);\n\t\twhile (this.peek().isType(Token.NULLISH)) {\n\t\t\tthis.consume(Token.NULLISH);\n\t\t\t// Parse BitwiseOR or higher.\n\t\t\texpression = this.parseBinaryExpression(6);\n\t\t\tlist.push(expression);\n\t\t}\n\t\texpression = list.pop()!;\n\t\texpression = list.reverse()\n\t\t\t.reduce((previous, current) => new LogicalExpression(Token.NULLISH.getName() as LogicalOperator, current, previous), expression);\n\t\treturn expression;\n\t}\n\tprotected parseConditionalContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tthis.consume(Token.CONDITIONAL);\n\t\tconst left: ExpressionNode = this.parseAssignmentExpression();\n\t\tthis.expect(Token.COLON);\n\t\tconst right = this.parseAssignmentExpression();\n\t\treturn new ConditionalExpression(expression, left, right);\n\t}\n\tprotected parseYieldExpression(): ExpressionNode {\n\t\t// YieldExpression ::\n\t\t// 'yield' ([no line terminator] '*'? AssignmentExpression)?\n\t\tthis.consume(Token.YIELD);\n\t\tlet delegating = false; // yield*\n\t\tlet expression: ExpressionNode | undefined;\n\t\tif (this.check(Token.MUL)) {\n\t\t\tdelegating = true;\n\t\t}\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.EOS:\n\t\t\tcase Token.SEMICOLON:\n\t\t\tcase Token.R_CURLY:\n\t\t\tcase Token.R_BRACKETS:\n\t\t\tcase Token.R_PARENTHESES:\n\t\t\tcase Token.COLON:\n\t\t\tcase Token.COMMA:\n\t\t\tcase Token.IN:\n\t\t\t\t// The above set of tokens is the complete set of tokens that can appear\n\t\t\t\t// after an AssignmentExpression, and none of them can start an\n\t\t\t\t// AssignmentExpression. This allows us to avoid looking for an RHS for\n\t\t\t\t// a regular yield, given only one look-ahead token.\n\t\t\t\tif (!delegating) break;\n\t\t\t\t// Delegating yields require an RHS; fall through.\n\t\t\t\t// V8_FALLTHROUGH;\n\t\t\t\tthrow new Error(this.errorMessage(`Delegating yields require an RHS`));\n\t\t\tdefault:\n\t\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new YieldExpression(delegating, expression);\n\t}\n\tprotected parseNewTargetExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (new.target) not supported.'));\n\t}\n\tprotected parseClassDeclaration(names: ExpressionNode[] | undefined, defaultExport: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseClassLiteral(name: ExpressionNode | undefined, isStrictReserved: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseSuperExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (supper) not supported.'));\n\t}\n\tprotected parseImportExpressions(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (import) not supported.'));\n\t}\n}\n"]}
|