septima-lang 0.0.1

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.
Files changed (67) hide show
  1. package/dist/src/ast-node.d.ts +85 -0
  2. package/dist/src/ast-node.js +114 -0
  3. package/dist/src/cdl.d.ts +33 -0
  4. package/dist/src/cdl.js +63 -0
  5. package/dist/src/extract-message.d.ts +1 -0
  6. package/dist/src/extract-message.js +10 -0
  7. package/dist/src/fail-me.d.ts +1 -0
  8. package/dist/src/fail-me.js +11 -0
  9. package/dist/src/find-array-method.d.ts +15 -0
  10. package/dist/src/find-array-method.js +104 -0
  11. package/dist/src/find-string-method.d.ts +2 -0
  12. package/dist/src/find-string-method.js +88 -0
  13. package/dist/src/index.d.ts +1 -0
  14. package/dist/src/index.js +18 -0
  15. package/dist/src/location.d.ts +11 -0
  16. package/dist/src/location.js +3 -0
  17. package/dist/src/parser.d.ts +37 -0
  18. package/dist/src/parser.js +345 -0
  19. package/dist/src/result.d.ts +24 -0
  20. package/dist/src/result.js +29 -0
  21. package/dist/src/runtime.d.ts +25 -0
  22. package/dist/src/runtime.js +287 -0
  23. package/dist/src/scanner.d.ts +22 -0
  24. package/dist/src/scanner.js +76 -0
  25. package/dist/src/should-never-happen.d.ts +1 -0
  26. package/dist/src/should-never-happen.js +9 -0
  27. package/dist/src/source-code.d.ts +19 -0
  28. package/dist/src/source-code.js +90 -0
  29. package/dist/src/stack.d.ts +11 -0
  30. package/dist/src/stack.js +19 -0
  31. package/dist/src/switch-on.d.ts +1 -0
  32. package/dist/src/switch-on.js +9 -0
  33. package/dist/src/symbol-table.d.ts +5 -0
  34. package/dist/src/symbol-table.js +3 -0
  35. package/dist/src/value.d.ts +128 -0
  36. package/dist/src/value.js +634 -0
  37. package/dist/tests/cdl.spec.d.ts +1 -0
  38. package/dist/tests/cdl.spec.js +692 -0
  39. package/dist/tests/parser.spec.d.ts +1 -0
  40. package/dist/tests/parser.spec.js +39 -0
  41. package/dist/tests/value.spec.d.ts +1 -0
  42. package/dist/tests/value.spec.js +355 -0
  43. package/dist/tsconfig.tsbuildinfo +1 -0
  44. package/jest-output.json +1 -0
  45. package/package.json +17 -0
  46. package/src/ast-node.ts +205 -0
  47. package/src/cdl.ts +78 -0
  48. package/src/extract-message.ts +5 -0
  49. package/src/fail-me.ts +7 -0
  50. package/src/find-array-method.ts +115 -0
  51. package/src/find-string-method.ts +84 -0
  52. package/src/index.ts +1 -0
  53. package/src/location.ts +13 -0
  54. package/src/parser.ts +399 -0
  55. package/src/result.ts +45 -0
  56. package/src/runtime.ts +295 -0
  57. package/src/scanner.ts +94 -0
  58. package/src/should-never-happen.ts +4 -0
  59. package/src/source-code.ts +101 -0
  60. package/src/stack.ts +18 -0
  61. package/src/switch-on.ts +4 -0
  62. package/src/symbol-table.ts +6 -0
  63. package/src/value.ts +742 -0
  64. package/tests/cdl.spec.ts +755 -0
  65. package/tests/parser.spec.ts +14 -0
  66. package/tests/value.spec.ts +387 -0
  67. package/tsconfig.json +11 -0
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Parser = void 0;
4
+ class Parser {
5
+ constructor(scanner) {
6
+ this.scanner = scanner;
7
+ }
8
+ parse() {
9
+ const ret = this.expression();
10
+ if (!this.scanner.eof()) {
11
+ throw new Error(`Loitering input ${this.scanner.sourceRef}`);
12
+ }
13
+ return ret;
14
+ }
15
+ definitions() {
16
+ const ret = [];
17
+ while (true) {
18
+ const start = this.scanner.consumeIf('let ');
19
+ if (!start) {
20
+ return ret;
21
+ }
22
+ const ident = this.identifier();
23
+ this.scanner.consume('=');
24
+ const value = this.lambda();
25
+ this.scanner.consume(';');
26
+ ret.push({ start, ident, value });
27
+ }
28
+ }
29
+ expression() {
30
+ const definitions = this.definitions();
31
+ const computation = this.lambda();
32
+ if (definitions.length === 0) {
33
+ return computation;
34
+ }
35
+ return { tag: 'topLevelExpression', definitions, computation };
36
+ }
37
+ lambda() {
38
+ const start = this.scanner.consumeIf('fun');
39
+ if (!start) {
40
+ return this.ifExpression();
41
+ }
42
+ this.scanner.consume('(');
43
+ const args = [];
44
+ if (this.scanner.consumeIf(')')) {
45
+ // no formal args
46
+ }
47
+ else {
48
+ while (true) {
49
+ const arg = this.identifier();
50
+ args.push(arg);
51
+ if (this.scanner.consumeIf(')')) {
52
+ break;
53
+ }
54
+ this.scanner.consume(',');
55
+ }
56
+ }
57
+ const body = this.expression();
58
+ return { tag: 'lambda', start, formalArgs: args, body };
59
+ }
60
+ ifExpression() {
61
+ if (!this.scanner.consumeIf('if')) {
62
+ return this.unsink();
63
+ }
64
+ this.scanner.consume('(');
65
+ const condition = this.expression();
66
+ this.scanner.consume(')');
67
+ const positive = this.expression();
68
+ this.scanner.consume('else');
69
+ const negative = this.expression();
70
+ return { tag: 'if', condition, positive, negative };
71
+ }
72
+ unsink() {
73
+ const lhs = this.or();
74
+ if (this.scanner.consumeIf('??')) {
75
+ return { tag: 'binaryOperator', operator: '??', lhs, rhs: this.unsink() };
76
+ }
77
+ return lhs;
78
+ }
79
+ or() {
80
+ const lhs = this.and();
81
+ if (this.scanner.consumeIf('||')) {
82
+ return { tag: 'binaryOperator', operator: '||', lhs, rhs: this.or() };
83
+ }
84
+ return lhs;
85
+ }
86
+ and() {
87
+ const lhs = this.equality();
88
+ if (this.scanner.consumeIf('&&')) {
89
+ return { tag: 'binaryOperator', operator: '&&', lhs, rhs: this.and() };
90
+ }
91
+ return lhs;
92
+ }
93
+ equality() {
94
+ const lhs = this.comparison();
95
+ if (this.scanner.consumeIf('==')) {
96
+ return { tag: 'binaryOperator', operator: '==', lhs, rhs: this.equality() };
97
+ }
98
+ if (this.scanner.consumeIf('!=')) {
99
+ return { tag: 'binaryOperator', operator: '!=', lhs, rhs: this.equality() };
100
+ }
101
+ return lhs;
102
+ }
103
+ comparison() {
104
+ const lhs = this.addition();
105
+ if (this.scanner.consumeIf('>=')) {
106
+ return { tag: 'binaryOperator', operator: '>=', lhs, rhs: this.comparison() };
107
+ }
108
+ if (this.scanner.consumeIf('<=')) {
109
+ return { tag: 'binaryOperator', operator: '<=', lhs, rhs: this.comparison() };
110
+ }
111
+ if (this.scanner.consumeIf('>')) {
112
+ return { tag: 'binaryOperator', operator: '>', lhs, rhs: this.comparison() };
113
+ }
114
+ if (this.scanner.consumeIf('<')) {
115
+ return { tag: 'binaryOperator', operator: '<', lhs, rhs: this.comparison() };
116
+ }
117
+ return lhs;
118
+ }
119
+ addition() {
120
+ const lhs = this.multiplication();
121
+ if (this.scanner.consumeIf('+')) {
122
+ return { tag: 'binaryOperator', operator: '+', lhs, rhs: this.addition() };
123
+ }
124
+ if (this.scanner.consumeIf('-')) {
125
+ return { tag: 'binaryOperator', operator: '-', lhs, rhs: this.addition() };
126
+ }
127
+ return lhs;
128
+ }
129
+ multiplication() {
130
+ const lhs = this.power();
131
+ if (this.scanner.consumeIf('*')) {
132
+ return { tag: 'binaryOperator', operator: '*', lhs, rhs: this.multiplication() };
133
+ }
134
+ if (this.scanner.consumeIf('/')) {
135
+ return { tag: 'binaryOperator', operator: '/', lhs, rhs: this.multiplication() };
136
+ }
137
+ if (this.scanner.consumeIf('%')) {
138
+ return { tag: 'binaryOperator', operator: '%', lhs, rhs: this.multiplication() };
139
+ }
140
+ return lhs;
141
+ }
142
+ power() {
143
+ const lhs = this.unary();
144
+ if (this.scanner.consumeIf('**')) {
145
+ return { tag: 'binaryOperator', operator: '**', lhs, rhs: this.power() };
146
+ }
147
+ return lhs;
148
+ }
149
+ unary() {
150
+ let operatorToken = this.scanner.consumeIf('!');
151
+ if (operatorToken) {
152
+ return { tag: 'unaryOperator', operand: this.unary(), operator: '!', operatorToken };
153
+ }
154
+ operatorToken = this.scanner.consumeIf('+');
155
+ if (operatorToken) {
156
+ return { tag: 'unaryOperator', operand: this.unary(), operator: '+', operatorToken };
157
+ }
158
+ operatorToken = this.scanner.consumeIf('-');
159
+ if (operatorToken) {
160
+ return { tag: 'unaryOperator', operand: this.unary(), operator: '-', operatorToken };
161
+ }
162
+ return this.call();
163
+ }
164
+ call() {
165
+ const callee = this.memberAccess();
166
+ if (!this.scanner.consumeIf('(')) {
167
+ return callee;
168
+ }
169
+ const { actualArgs, end } = this.actualArgList();
170
+ return { tag: 'functionCall', actualArgs, callee, end };
171
+ }
172
+ actualArgList() {
173
+ const actualArgs = [];
174
+ const endEmpty = this.scanner.consumeIf(')');
175
+ if (endEmpty) {
176
+ // no actual args
177
+ return { actualArgs, end: endEmpty };
178
+ }
179
+ while (true) {
180
+ const arg = this.expression();
181
+ actualArgs.push(arg);
182
+ const end = this.scanner.consumeIf(')');
183
+ if (end) {
184
+ return { actualArgs, end };
185
+ }
186
+ this.scanner.consume(',');
187
+ }
188
+ }
189
+ memberAccess() {
190
+ let ret = this.parenthesized();
191
+ while (true) {
192
+ if (this.scanner.consumeIf('.')) {
193
+ ret = { tag: 'dot', receiver: ret, ident: this.identifier() };
194
+ continue;
195
+ }
196
+ if (this.scanner.consumeIf('[')) {
197
+ ret = { tag: 'indexAccess', receiver: ret, index: this.expression() };
198
+ this.scanner.consume(']');
199
+ continue;
200
+ }
201
+ if (this.scanner.consumeIf('(')) {
202
+ const { actualArgs, end } = this.actualArgList();
203
+ ret = { tag: 'functionCall', actualArgs, callee: ret, end };
204
+ continue;
205
+ }
206
+ return ret;
207
+ }
208
+ }
209
+ parenthesized() {
210
+ if (this.scanner.consumeIf('(')) {
211
+ const ret = this.expression();
212
+ this.scanner.consume(')');
213
+ return ret;
214
+ }
215
+ return this.literalOrIdent();
216
+ }
217
+ literalOrIdent() {
218
+ let t = this.scanner.consumeIf('sink!!');
219
+ if (t) {
220
+ return { tag: 'literal', type: 'sink!!', t };
221
+ }
222
+ t = this.scanner.consumeIf('sink!');
223
+ if (t) {
224
+ return { tag: 'literal', type: 'sink!', t };
225
+ }
226
+ t = this.scanner.consumeIf('sink');
227
+ if (t) {
228
+ return { tag: 'literal', type: 'sink', t };
229
+ }
230
+ t = this.scanner.consumeIf('true');
231
+ if (t) {
232
+ return { tag: 'literal', type: 'bool', t };
233
+ }
234
+ t = this.scanner.consumeIf('false');
235
+ if (t) {
236
+ return { tag: 'literal', type: 'bool', t };
237
+ }
238
+ t = this.scanner.consumeIf(/([0-9]*[.])?[0-9]+/);
239
+ if (t) {
240
+ return { tag: 'literal', type: 'num', t };
241
+ }
242
+ // double-quotes-enclosd string
243
+ if (this.scanner.consumeIf(`"`, false)) {
244
+ t = this.scanner.consume(/[^"]*/);
245
+ this.scanner.consume(`"`);
246
+ return { tag: 'literal', type: 'str', t };
247
+ }
248
+ // single-quotes-enclosd string
249
+ if (this.scanner.consumeIf(`'`, false)) {
250
+ t = this.scanner.consume(/[^']*/);
251
+ this.scanner.consume(`'`);
252
+ return { tag: 'literal', type: 'str', t };
253
+ }
254
+ t = this.scanner.consumeIf('[');
255
+ if (t) {
256
+ return this.arrayBody(t);
257
+ }
258
+ t = this.scanner.consumeIf('{');
259
+ if (t) {
260
+ return this.objectBody(t);
261
+ }
262
+ const ident = this.maybeIdentifier();
263
+ if (ident) {
264
+ return ident;
265
+ }
266
+ throw new Error(`Unparsable input ${this.scanner.sourceRef}`);
267
+ }
268
+ /**
269
+ * This method assumes that the caller consumed the opening '[' token. It consumes the array's elements
270
+ * (comma-separated list of expressions) as well as the closing ']' token.
271
+ */
272
+ arrayBody(start) {
273
+ const t = this.scanner.consumeIf(']');
274
+ if (t) {
275
+ // an empty array literal
276
+ return { tag: 'arrayLiteral', start, parts: [], end: t };
277
+ }
278
+ const parts = [];
279
+ while (true) {
280
+ if (this.scanner.consumeIf('...')) {
281
+ parts.push({ tag: 'spread', v: this.expression() });
282
+ }
283
+ else {
284
+ const exp = this.expression();
285
+ parts.push({ tag: 'element', v: exp });
286
+ }
287
+ const end = this.scanner.consumeIf(']');
288
+ if (end) {
289
+ return { tag: 'arrayLiteral', start, parts, end };
290
+ }
291
+ this.scanner.consume(',');
292
+ }
293
+ }
294
+ /**
295
+ * This method assumes that the caller consumed the opening '{' token. It consumes the object's attributes
296
+ * (comma-separated list of key:value parirs) as well as the closing '}' token.
297
+ */
298
+ objectBody(start) {
299
+ const t = this.scanner.consumeIf('}');
300
+ if (t) {
301
+ // an empty array literal
302
+ return { tag: 'objectLiteral', start, parts: [], end: t };
303
+ }
304
+ const parts = [];
305
+ while (true) {
306
+ if (this.scanner.consumeIf('...')) {
307
+ parts.push({ tag: 'spread', o: this.expression() });
308
+ }
309
+ else if (this.scanner.consumeIf('[')) {
310
+ const k = this.expression();
311
+ this.scanner.consume(']');
312
+ this.scanner.consume(':');
313
+ const v = this.expression();
314
+ parts.push({ tag: 'computedName', k, v });
315
+ }
316
+ else {
317
+ const k = this.identifier();
318
+ this.scanner.consume(':');
319
+ const v = this.expression();
320
+ parts.push({ tag: 'hardName', k, v });
321
+ }
322
+ const end = this.scanner.consumeIf('}');
323
+ if (end) {
324
+ return { tag: 'objectLiteral', start, parts, end };
325
+ }
326
+ this.scanner.consume(',');
327
+ }
328
+ }
329
+ identifier() {
330
+ const ret = this.maybeIdentifier();
331
+ if (!ret) {
332
+ throw new Error(`Expected an identifier ${this.scanner.sourceRef}`);
333
+ }
334
+ return ret;
335
+ }
336
+ maybeIdentifier() {
337
+ const t = this.scanner.consumeIf(/[a-zA-Z][0-9A-Za-z_]*/);
338
+ if (t) {
339
+ return { tag: 'ident', t };
340
+ }
341
+ return undefined;
342
+ }
343
+ }
344
+ exports.Parser = Parser;
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLE1BQU07SUFDakIsWUFBNkIsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztJQUFHLENBQUM7SUFFakQsS0FBSztRQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7U0FDN0Q7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxHQUFHLEdBQVUsRUFBRSxDQUFBO1FBQ3JCLE9BQU8sSUFBSSxFQUFFO1lBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDNUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDVixPQUFPLEdBQUcsQ0FBQTthQUNYO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUV6QixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELFVBQVU7UUFDUixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBRWpDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUIsT0FBTyxXQUFXLENBQUE7U0FDbkI7UUFFRCxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQTtJQUNoRSxDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtTQUMzQjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLE1BQU0sSUFBSSxHQUFZLEVBQUUsQ0FBQTtRQUV4QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLGlCQUFpQjtTQUNsQjthQUFNO1lBQ0wsT0FBTyxJQUFJLEVBQUU7Z0JBQ1gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQy9CLE1BQUs7aUJBQ047Z0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDMUI7U0FDRjtRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUM5QixPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtTQUNyQjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUV6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFFbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBRWxDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUE7SUFDckQsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUE7UUFDckIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQTtTQUMxRTtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVELEVBQUU7UUFDQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQTtTQUN0RTtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVELEdBQUc7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDM0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQTtTQUN2RTtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQTtTQUM1RTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUE7U0FDNUU7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7U0FDOUU7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFBO1NBQzlFO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQTtTQUM3RTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7U0FDN0U7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUE7U0FDM0U7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFBO1NBQzNFO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUN4QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFBO1NBQ2pGO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQTtTQUNqRjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUE7U0FDakY7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxLQUFLO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUE7U0FDekU7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0MsSUFBSSxhQUFhLEVBQUU7WUFDakIsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFBO1NBQ3JGO1FBQ0QsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNDLElBQUksYUFBYSxFQUFFO1lBQ2pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQTtTQUNyRjtRQUNELGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQyxJQUFJLGFBQWEsRUFBRTtZQUNqQixPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLENBQUE7U0FDckY7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNwQixDQUFDO0lBRUQsSUFBSTtRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUVsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxNQUFNLENBQUE7U0FDZDtRQUVELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUE7SUFDekQsQ0FBQztJQUVPLGFBQWE7UUFDbkIsTUFBTSxVQUFVLEdBQWMsRUFBRSxDQUFBO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzVDLElBQUksUUFBUSxFQUFFO1lBQ1osaUJBQWlCO1lBQ2pCLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFBO1NBQ3JDO1FBRUQsT0FBTyxJQUFJLEVBQUU7WUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDN0IsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN2QyxJQUFJLEdBQUcsRUFBRTtnQkFDUCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFBO2FBQzNCO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7U0FDMUI7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUU5QixPQUFPLElBQUksRUFBRTtZQUNYLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7Z0JBQzdELFNBQVE7YUFDVDtZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7Z0JBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN6QixTQUFRO2FBQ1Q7WUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtnQkFDaEQsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQTtnQkFDM0QsU0FBUTthQUNUO1lBRUQsT0FBTyxHQUFHLENBQUE7U0FDWDtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekIsT0FBTyxHQUFHLENBQUE7U0FDWDtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFBO1NBQzdDO1FBRUQsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLElBQUksQ0FBQyxFQUFFO1lBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUM1QztRQUVELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsQyxJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUE7U0FDM0M7UUFFRCxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFBO1NBQzNDO1FBQ0QsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLElBQUksQ0FBQyxFQUFFO1lBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUMzQztRQUVELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ2hELElBQUksQ0FBQyxFQUFFO1lBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUMxQztRQUVELCtCQUErQjtRQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN0QyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUMxQztRQUVELCtCQUErQjtRQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN0QyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUMxQztRQUVELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMvQixJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUN6QjtRQUVELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMvQixJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUMxQjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUNwQyxJQUFJLEtBQUssRUFBRTtZQUNULE9BQU8sS0FBSyxDQUFBO1NBQ2I7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxLQUFZO1FBQ3BCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxFQUFFO1lBQ0wseUJBQXlCO1lBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUN6RDtRQUVELE1BQU0sS0FBSyxHQUF1QixFQUFFLENBQUE7UUFDcEMsT0FBTyxJQUFJLEVBQUU7WUFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTthQUNwRDtpQkFBTTtnQkFDTCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7Z0JBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO2FBQ3ZDO1lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdkMsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQTthQUNsRDtZQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzFCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxLQUFZO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxFQUFFO1lBQ0wseUJBQXlCO1lBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUMxRDtRQUVELE1BQU0sS0FBSyxHQUF3QixFQUFFLENBQUE7UUFDckMsT0FBTyxJQUFJLEVBQUU7WUFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTthQUNwRDtpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDekIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTthQUMxQztpQkFBTTtnQkFDTCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7Z0JBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2FBQ3RDO1lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdkMsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQTthQUNuRDtZQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzFCO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7U0FDcEU7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFTyxlQUFlO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDekQsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUMzQjtRQUVELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7Q0FDRjtBQTNZRCx3QkEyWUMifQ==
@@ -0,0 +1,24 @@
1
+ import { Span } from './location';
2
+ import { SourceCode } from './source-code';
3
+ import { Value } from './value';
4
+ export declare type ResultSink = {
5
+ tag: 'sink';
6
+ where: Span | undefined;
7
+ trace: string | undefined;
8
+ symbols: Record<string, unknown> | undefined;
9
+ message: string;
10
+ };
11
+ export declare type Result = {
12
+ tag: 'ok';
13
+ value: unknown;
14
+ } | ResultSink;
15
+ export declare class ResultSinkImpl {
16
+ private readonly sink;
17
+ private readonly sourceCode;
18
+ readonly tag = "sink";
19
+ constructor(sink: Value, sourceCode: SourceCode);
20
+ get where(): Span | undefined;
21
+ get trace(): string | undefined;
22
+ get symbols(): Record<string, unknown> | undefined;
23
+ get message(): string;
24
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResultSinkImpl = void 0;
4
+ class ResultSinkImpl {
5
+ constructor(sink, sourceCode) {
6
+ this.sink = sink;
7
+ this.sourceCode = sourceCode;
8
+ this.tag = 'sink';
9
+ }
10
+ get where() {
11
+ return this.sink.span();
12
+ }
13
+ get trace() {
14
+ const trace = this.sink.trace();
15
+ if (trace) {
16
+ return this.sourceCode.formatTrace(trace);
17
+ }
18
+ return undefined;
19
+ }
20
+ get symbols() {
21
+ return this.sink.symbols()?.export();
22
+ }
23
+ get message() {
24
+ const at = this.trace ?? this.sourceCode.sourceRef(this.where);
25
+ return `Evaluated to sink: ${at}`;
26
+ }
27
+ }
28
+ exports.ResultSinkImpl = ResultSinkImpl;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtQkEsTUFBYSxjQUFjO0lBRXpCLFlBQTZCLElBQVcsRUFBbUIsVUFBc0I7UUFBcEQsU0FBSSxHQUFKLElBQUksQ0FBTztRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRHhFLFFBQUcsR0FBRyxNQUFNLENBQUE7SUFDK0QsQ0FBQztJQUVyRixJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDekIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDL0IsSUFBSSxLQUFLLEVBQUU7WUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQzFDO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDOUQsT0FBTyxzQkFBc0IsRUFBRSxFQUFFLENBQUE7SUFDbkMsQ0FBQztDQUNGO0FBekJELHdDQXlCQyJ9
@@ -0,0 +1,25 @@
1
+ import { AstNode } from './ast-node';
2
+ import { Parser } from './parser';
3
+ import { Value } from './value';
4
+ export declare type Verbosity = 'quiet' | 'trace';
5
+ export declare class Runtime {
6
+ private readonly root;
7
+ private readonly verbosity;
8
+ private readonly parser;
9
+ private stack;
10
+ constructor(root: AstNode, verbosity: Verbosity, parser: Parser);
11
+ compute(): {
12
+ value: Value;
13
+ expressionTrace?: undefined;
14
+ errorMessage?: undefined;
15
+ stack?: undefined;
16
+ } | {
17
+ expressionTrace: AstNode[];
18
+ errorMessage: unknown;
19
+ stack: string[] | undefined;
20
+ value?: undefined;
21
+ };
22
+ private evalNode;
23
+ private evalNodeImpl;
24
+ call(callee: Value, argValues: Value[]): Value;
25
+ }