@accordproject/template-engine 3.1.0 → 4.2.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 (139) hide show
  1. package/README.md +41 -0
  2. package/lib/JavaScriptEvaluator.d.ts +71 -0
  3. package/lib/JavaScriptEvaluator.js +245 -0
  4. package/lib/JavaScriptEvaluator.js.map +1 -0
  5. package/lib/TemplateArchiveProcessor.d.ts +151 -0
  6. package/lib/TemplateArchiveProcessor.js +447 -0
  7. package/lib/TemplateArchiveProcessor.js.map +1 -0
  8. package/lib/TemplateMarkInterpreter.d.ts +34 -0
  9. package/lib/TemplateMarkInterpreter.js +689 -0
  10. package/lib/TemplateMarkInterpreter.js.map +1 -0
  11. package/lib/TemplateMarkNodes.d.ts +19 -0
  12. package/lib/TemplateMarkNodes.js +45 -0
  13. package/lib/TemplateMarkNodes.js.map +1 -0
  14. package/lib/TemplateMarkToJavaScriptCompiler.d.ts +20 -0
  15. package/lib/TemplateMarkToJavaScriptCompiler.js +99 -0
  16. package/lib/TemplateMarkToJavaScriptCompiler.js.map +1 -0
  17. package/lib/TypeScriptCompilationContext.d.ts +42 -0
  18. package/lib/TypeScriptCompilationContext.js +170 -0
  19. package/lib/TypeScriptCompilationContext.js.map +1 -0
  20. package/lib/TypeScriptRuntime.d.ts +17 -0
  21. package/lib/TypeScriptRuntime.js +84 -0
  22. package/lib/TypeScriptRuntime.js.map +1 -0
  23. package/lib/TypeScriptToJavaScriptCompiler.d.ts +11 -0
  24. package/lib/TypeScriptToJavaScriptCompiler.js +169 -0
  25. package/lib/TypeScriptToJavaScriptCompiler.js.map +1 -0
  26. package/lib/drafting/Boolean/index.d.ts +6 -0
  27. package/lib/drafting/Boolean/index.js +30 -0
  28. package/lib/drafting/Boolean/index.js.map +1 -0
  29. package/lib/drafting/DateTime/index.d.ts +8 -0
  30. package/lib/drafting/DateTime/index.js +33 -0
  31. package/lib/drafting/DateTime/index.js.map +1 -0
  32. package/lib/drafting/Double/format.d.ts +14 -0
  33. package/lib/drafting/Double/format.js +62 -0
  34. package/lib/drafting/Double/format.js.map +1 -0
  35. package/lib/drafting/Double/index.d.ts +8 -0
  36. package/lib/drafting/Double/index.js +33 -0
  37. package/lib/drafting/Double/index.js.map +1 -0
  38. package/lib/drafting/DraftFormat.d.ts +5 -0
  39. package/lib/drafting/DraftFormat.js +18 -0
  40. package/lib/drafting/DraftFormat.js.map +1 -0
  41. package/lib/drafting/Duration/index.d.ts +6 -0
  42. package/lib/drafting/Duration/index.js +39 -0
  43. package/lib/drafting/Duration/index.js.map +1 -0
  44. package/lib/drafting/Integer/format.d.ts +14 -0
  45. package/lib/drafting/Integer/format.js +52 -0
  46. package/lib/drafting/Integer/format.js.map +1 -0
  47. package/lib/drafting/Integer/index.d.ts +8 -0
  48. package/lib/drafting/Integer/index.js +33 -0
  49. package/lib/drafting/Integer/index.js.map +1 -0
  50. package/lib/drafting/Long/index.d.ts +8 -0
  51. package/lib/drafting/Long/index.js +33 -0
  52. package/lib/drafting/Long/index.js.map +1 -0
  53. package/lib/drafting/MonetaryAmount/currencycode.d.ts +35 -0
  54. package/lib/drafting/MonetaryAmount/currencycode.js +53 -0
  55. package/lib/drafting/MonetaryAmount/currencycode.js.map +1 -0
  56. package/lib/drafting/MonetaryAmount/formatTokens.d.ts +13 -0
  57. package/lib/drafting/MonetaryAmount/formatTokens.js +44 -0
  58. package/lib/drafting/MonetaryAmount/formatTokens.js.map +1 -0
  59. package/lib/drafting/MonetaryAmount/index.d.ts +13 -0
  60. package/lib/drafting/MonetaryAmount/index.js +51 -0
  61. package/lib/drafting/MonetaryAmount/index.js.map +1 -0
  62. package/lib/drafting/PreciseAmount/index.d.ts +17 -0
  63. package/lib/drafting/PreciseAmount/index.js +113 -0
  64. package/lib/drafting/PreciseAmount/index.js.map +1 -0
  65. package/lib/drafting/String/index.d.ts +6 -0
  66. package/lib/drafting/String/index.js +25 -0
  67. package/lib/drafting/String/index.js.map +1 -0
  68. package/lib/drafting/index.d.ts +2 -0
  69. package/lib/drafting/index.js +63 -0
  70. package/lib/drafting/index.js.map +1 -0
  71. package/lib/index.d.ts +7 -0
  72. package/lib/index.js +42 -0
  73. package/lib/index.js.map +1 -0
  74. package/lib/llm/LLMConfig.d.ts +121 -0
  75. package/lib/llm/LLMConfig.js +30 -0
  76. package/lib/llm/LLMConfig.js.map +1 -0
  77. package/lib/llm/LLMExecutor.d.ts +77 -0
  78. package/lib/llm/LLMExecutor.js +603 -0
  79. package/lib/llm/LLMExecutor.js.map +1 -0
  80. package/lib/llm/ModelManagerSchema.d.ts +14 -0
  81. package/lib/llm/ModelManagerSchema.js +67 -0
  82. package/lib/llm/ModelManagerSchema.js.map +1 -0
  83. package/lib/llm/Reasoners.d.ts +190 -0
  84. package/lib/llm/Reasoners.js +643 -0
  85. package/lib/llm/Reasoners.js.map +1 -0
  86. package/lib/model-gen/concerto.d.ts +13 -0
  87. package/lib/model-gen/concerto.js +4 -0
  88. package/lib/model-gen/concerto.js.map +1 -0
  89. package/lib/model-gen/concerto.metamodel@1.0.0.d.ts +196 -0
  90. package/lib/model-gen/concerto.metamodel@1.0.0.js +4 -0
  91. package/lib/model-gen/concerto.metamodel@1.0.0.js.map +1 -0
  92. package/lib/model-gen/concerto@1.0.0.d.ts +19 -0
  93. package/lib/model-gen/concerto@1.0.0.js +4 -0
  94. package/lib/model-gen/concerto@1.0.0.js.map +1 -0
  95. package/lib/model-gen/org.accordproject.ciceromark@0.6.0.d.ts +49 -0
  96. package/lib/model-gen/org.accordproject.ciceromark@0.6.0.js +4 -0
  97. package/lib/model-gen/org.accordproject.ciceromark@0.6.0.js.map +1 -0
  98. package/lib/model-gen/org.accordproject.commonmark@0.5.0.d.ts +89 -0
  99. package/lib/model-gen/org.accordproject.commonmark@0.5.0.js +4 -0
  100. package/lib/model-gen/org.accordproject.commonmark@0.5.0.js.map +1 -0
  101. package/lib/model-gen/org.accordproject.templatemark@0.5.0.d.ts +76 -0
  102. package/lib/model-gen/org.accordproject.templatemark@0.5.0.js +11 -0
  103. package/lib/model-gen/org.accordproject.templatemark@0.5.0.js.map +1 -0
  104. package/lib/runtime/declarations.d.ts +2 -0
  105. package/lib/runtime/declarations.js +21 -0
  106. package/lib/runtime/declarations.js.map +1 -0
  107. package/lib/slc/model-gen/concerto.d.ts +13 -0
  108. package/lib/slc/model-gen/concerto.decorator@1.0.0.d.ts +6 -0
  109. package/lib/slc/model-gen/concerto.decorator@1.0.0.js +5 -0
  110. package/lib/slc/model-gen/concerto.decorator@1.0.0.js.map +1 -0
  111. package/lib/slc/model-gen/concerto.js +5 -0
  112. package/lib/slc/model-gen/concerto.js.map +1 -0
  113. package/lib/slc/model-gen/concerto@1.0.0.d.ts +24 -0
  114. package/lib/slc/model-gen/concerto@1.0.0.js +6 -0
  115. package/lib/slc/model-gen/concerto@1.0.0.js.map +1 -0
  116. package/lib/slc/model-gen/org.accordproject.contract@0.2.0.d.ts +7 -0
  117. package/lib/slc/model-gen/org.accordproject.contract@0.2.0.js +5 -0
  118. package/lib/slc/model-gen/org.accordproject.contract@0.2.0.js.map +1 -0
  119. package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.d.ts +15 -0
  120. package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.js +4 -0
  121. package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.js.map +1 -0
  122. package/lib/slc/model-gen/org.accordproject.time@0.3.0.d.ts +46 -0
  123. package/lib/slc/model-gen/org.accordproject.time@0.3.0.js +48 -0
  124. package/lib/slc/model-gen/org.accordproject.time@0.3.0.js.map +1 -0
  125. package/lib/utils.d.ts +35 -0
  126. package/lib/utils.js +122 -0
  127. package/lib/utils.js.map +1 -0
  128. package/lib/worker.d.ts +1 -0
  129. package/{dist → lib}/worker.js +12 -10
  130. package/lib/worker.js.map +1 -0
  131. package/package.json +46 -25
  132. package/umd/template-engine.js +13 -0
  133. package/umd/template-engine.js.LICENSE.txt +21 -0
  134. package/dist/index.d.ts +0 -186
  135. package/dist/index.js +0 -1275
  136. package/dist/index.js.map +0 -1
  137. package/dist/index.mjs +0 -1248
  138. package/dist/index.mjs.map +0 -1
  139. package/dist/worker.js.map +0 -1
package/dist/index.mjs DELETED
@@ -1,1248 +0,0 @@
1
- import jp from 'jsonpath';
2
- import traverse from 'traverse';
3
- import { isBrowser } from 'browser-or-node';
4
- import os from 'os';
5
- import { Introspector, ModelManager, Factory, Serializer, ModelUtil } from '@accordproject/concerto-core';
6
- import dayjs from 'dayjs';
7
- import utc from 'dayjs/plugin/utc';
8
- import { ToWords } from 'to-words';
9
- import { TemplateMarkModel, ConcertoMetaModel, CommonMarkModel, CiceroMarkModel } from '@accordproject/markdown-common';
10
- import { createDefaultMapFromNodeModules, createDefaultMapFromCDN } from '@typescript/vfs';
11
- import { twoslasher } from '@typescript/twoslash';
12
- import { CodeGen } from '@accordproject/concerto-codegen';
13
- import { InMemoryWriter } from '@accordproject/concerto-util';
14
- import { templatemarkutil, TemplateMarkTransformer } from '@accordproject/markdown-template';
15
- import { existsSync, mkdirSync, rmSync } from 'fs';
16
- import * as lzstring from 'lz-string';
17
- import child_process from 'child_process';
18
- import path from 'path';
19
- import { transform } from '@accordproject/markdown-transform';
20
-
21
- function booleanDrafter(value) {
22
- if (value) {
23
- return "true";
24
- } else {
25
- return "false";
26
- }
27
- }
28
-
29
- dayjs.extend(utc);
30
- function dateTimeDrafter(value, format) {
31
- const f = format ? format : "MM/DD/YYYY";
32
- return dayjs.utc(value).format(f);
33
- }
34
-
35
- function draftDoubleIEEE(value) {
36
- if (Math.floor(value) === value) {
37
- return new Number(value).toFixed(1);
38
- } else {
39
- return "" + value;
40
- }
41
- }
42
- function draftDoubleFormat(value, format) {
43
- if (format === "text") {
44
- const converter = new ToWords();
45
- const res = converter.convert(value);
46
- return res;
47
- } else {
48
- return format.replace(/0(.)0((.)(0+))?/gi, function(_a, sep1, _b, sep2, digits) {
49
- const len = digits ? digits.length : 0;
50
- const vs = value.toFixed(len);
51
- let res = "";
52
- if (sep2) {
53
- const d = vs.substring(vs.length - len);
54
- res += sep2 + d;
55
- }
56
- let i = vs.substring(0, vs.length - (len === 0 ? 0 : len + 1));
57
- while (i.length > 3) {
58
- res = sep1 + i.substring(i.length - 3) + res;
59
- i = i.substring(0, i.length - 3);
60
- }
61
- return i + res;
62
- });
63
- }
64
- }
65
-
66
- function doubleDrafter(value, format) {
67
- if (format) {
68
- return draftDoubleFormat(value, format);
69
- } else {
70
- return draftDoubleIEEE(value);
71
- }
72
- }
73
-
74
- function draftInteger(value) {
75
- return "" + value;
76
- }
77
- function draftIntegerFormat(value, format) {
78
- if (format === "text") {
79
- const converter = new ToWords();
80
- const res = converter.convert(value);
81
- return res;
82
- } else {
83
- return format.replace(/0(.)0/gi, function(_a, sep1) {
84
- const vs = value.toFixed(0);
85
- let res = "";
86
- let i = vs.substring(0, vs.length);
87
- while (i.length > 3) {
88
- res = sep1 + i.substring(i.length - 3) + res;
89
- i = i.substring(0, i.length - 3);
90
- }
91
- return i + res;
92
- });
93
- }
94
- }
95
-
96
- function integerDrafter(value, format) {
97
- if (format) {
98
- return draftIntegerFormat(value, format);
99
- } else {
100
- return draftInteger(value);
101
- }
102
- }
103
-
104
- function isDuration(value) {
105
- return value != null && typeof value === "object" && "amount" in value && "unit" in value && typeof value.amount === "number" && typeof value.unit === "string";
106
- }
107
- function durationDrafter(value) {
108
- if (!isDuration(value)) {
109
- return "0 unknown";
110
- }
111
- return `${value.amount} ${value.unit}`;
112
- }
113
-
114
- function longDrafter(value, format) {
115
- if (format) {
116
- return draftIntegerFormat(value, format);
117
- } else {
118
- return draftInteger(value);
119
- }
120
- }
121
-
122
- var CurrencyCode = /* @__PURE__ */ ((CurrencyCode2) => {
123
- CurrencyCode2["USD"] = "$";
124
- CurrencyCode2["EUR"] = "\u20AC";
125
- CurrencyCode2["JPY"] = "\xA5";
126
- CurrencyCode2["GBP"] = "\xA3";
127
- CurrencyCode2["AUD"] = "A$";
128
- CurrencyCode2["CAD"] = "C$";
129
- CurrencyCode2["CHF"] = "CHF";
130
- CurrencyCode2["CNY"] = "\u5143";
131
- CurrencyCode2["HKD"] = "HK$";
132
- CurrencyCode2["NZD"] = "NZ$";
133
- CurrencyCode2["KRW"] = "\u20A9";
134
- CurrencyCode2["SGD"] = "S$";
135
- CurrencyCode2["MXN"] = "MEX$";
136
- CurrencyCode2["INR"] = "\u20B9";
137
- CurrencyCode2["RUB"] = "\u20BD";
138
- CurrencyCode2["ZAR"] = "R";
139
- CurrencyCode2["TRY"] = "\u20BA";
140
- CurrencyCode2["BRL"] = "R$";
141
- CurrencyCode2["TWD"] = "NT$";
142
- CurrencyCode2["PLN"] = "z\u0142";
143
- CurrencyCode2["THB"] = "\u0E3F";
144
- CurrencyCode2["IDR"] = "Rp";
145
- CurrencyCode2["HUF"] = "Ft";
146
- CurrencyCode2["CZK"] = "K\u010D";
147
- CurrencyCode2["ILS"] = "\u20AA";
148
- CurrencyCode2["CLP"] = "CLP$";
149
- CurrencyCode2["PHP"] = "\u20B1";
150
- CurrencyCode2["AED"] = "\u062F.\u0625";
151
- CurrencyCode2["COP"] = "COL$";
152
- CurrencyCode2["SAR"] = "\uFDFC";
153
- CurrencyCode2["MYR"] = "RM";
154
- CurrencyCode2["RON"] = "L";
155
- CurrencyCode2["BGN"] = "\u043B\u0432.";
156
- return CurrencyCode2;
157
- })(CurrencyCode || {});
158
-
159
- function monetaryAmountDefaultDrafter(value) {
160
- return "" + draftDoubleIEEE(value.doubleValue) + " " + value.currencyCode;
161
- }
162
- function codeSymbol(c) {
163
- const index = Object.keys(CurrencyCode).indexOf(c);
164
- if (index >= 0) {
165
- return Object.values(CurrencyCode)[index];
166
- } else {
167
- return c;
168
- }
169
- }
170
- function monetaryAmountFormatDrafter(value, format) {
171
- return draftDoubleFormat(
172
- value.doubleValue,
173
- format.replace(/K/gi, codeSymbol(value.currencyCode)).replace(/CCC/gi, value.currencyCode)
174
- );
175
- }
176
- function monetaryAmountDrafter(value, format) {
177
- if (format) {
178
- return monetaryAmountFormatDrafter(value, format);
179
- } else {
180
- return monetaryAmountDefaultDrafter(value);
181
- }
182
- }
183
-
184
- function stringDrafter(value) {
185
- return value;
186
- }
187
-
188
- function getDrafter(typeName) {
189
- switch (typeName) {
190
- case "Boolean":
191
- return booleanDrafter;
192
- case "DateTime":
193
- return dateTimeDrafter;
194
- case "Double":
195
- return doubleDrafter;
196
- case "Integer":
197
- return integerDrafter;
198
- case "Long":
199
- return longDrafter;
200
- case "org.accordproject.money@0.3.0.MonetaryAmount":
201
- return monetaryAmountDrafter;
202
- case "org.accordproject.time@0.3.0.Duration":
203
- return durationDrafter;
204
- case "org.accordproject.time@0.3.0.Period":
205
- return durationDrafter;
206
- case "String":
207
- return stringDrafter;
208
- default:
209
- return null;
210
- }
211
- }
212
-
213
- const TEMPLATEMARK_RE = /^(org\.accordproject\.templatemark)@(.+)\.(\w+)Definition$/;
214
- const FORMULA_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormulaDefinition$/;
215
- const VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.VariableDefinition$/;
216
- const CONDITIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ConditionalDefinition$/;
217
- const ENUM_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.EnumVariableDefinition$/;
218
- const FORMATTED_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormattedVariableDefinition$/;
219
- const WITH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.WithDefinition$/;
220
- const LISTBLOCK_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ListBlockDefinition$/;
221
- const JOIN_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.JoinDefinition$/;
222
- const OPTIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.OptionalDefinition$/;
223
- const CLAUSE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ClauseDefinition$/;
224
- const CONTRACT_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ContractDefinition$/;
225
- const FOREACH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ForeachDefinition$/;
226
- const NAVIGATION_NODES = [
227
- `${TemplateMarkModel.NAMESPACE}.ListBlockDefinition`,
228
- `${TemplateMarkModel.NAMESPACE}.WithDefinition`,
229
- `${TemplateMarkModel.NAMESPACE}.JoinDefinition`,
230
- `${TemplateMarkModel.NAMESPACE}.OptionalDefinition`,
231
- `${TemplateMarkModel.NAMESPACE}.ClauseDefinition`,
232
- `${TemplateMarkModel.NAMESPACE}.ContractDefinition`,
233
- `${TemplateMarkModel.NAMESPACE}.ForeachBlockDefinition`
234
- ];
235
-
236
- function ensureDirSync(path) {
237
- if (!existsSync(path)) {
238
- mkdirSync(path, { recursive: true });
239
- }
240
- }
241
- function removeSync(path) {
242
- rmSync(path, { recursive: true, force: true });
243
- }
244
- function writeFunctionToString(templateClass, functionName, returnType, code) {
245
- let result = "";
246
- result += "/// ---cut---\n";
247
- result += `export function ${functionName}(data:TemplateModel.I${templateClass.getName()}, library:any, options:GenerationOptions) : ${returnType} {
248
- `;
249
- result += " const now = dayjs(options?.now);\n";
250
- result += " const locale = options?.locale;\n";
251
- templateClass.getProperties().forEach((p) => {
252
- result += ` const ${p.getName()} = data.${p.getName()};
253
- `;
254
- });
255
- result += " " + code.trim() + "\n";
256
- result += "}\n";
257
- result += "\n";
258
- return result;
259
- }
260
- function nameUserCode(templateMarkDom) {
261
- return traverse(templateMarkDom).map(function(x) {
262
- if (x && (x.$class === `${TemplateMarkModel.NAMESPACE}.ConditionalDefinition` && x.condition || x.$class === `${TemplateMarkModel.NAMESPACE}.ClauseDefinition` && x.condition)) {
263
- x.functionName = `condition_${this.path.join("_")}`;
264
- }
265
- this.update(x);
266
- });
267
- }
268
- function getTemplateClassDeclaration(modelManager, templateConceptFqn) {
269
- const introspector = new Introspector(modelManager);
270
- try {
271
- return templatemarkutil.findTemplateConcept(introspector, "clause", templateConceptFqn);
272
- } catch (err) {
273
- console.log(err);
274
- throw err;
275
- }
276
- }
277
-
278
- class TypeScriptCompilationContext {
279
- constructor(modelManager, templateConceptFqn) {
280
- this.modelManager = modelManager;
281
- this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
282
- }
283
- getTypeScriptFiles() {
284
- const result = {};
285
- const visitor = new CodeGen.TypescriptVisitor();
286
- const writer = new InMemoryWriter();
287
- const params = {
288
- fileWriter: writer
289
- };
290
- this.modelManager.accept(visitor, params);
291
- writer.getFilesInMemory().forEach((value, key) => {
292
- result[key] = value;
293
- });
294
- return result;
295
- }
296
- getCompilationContext() {
297
- const files = this.getTypeScriptFiles();
298
- let result = "";
299
- Object.keys(files).forEach((key) => {
300
- const content = files[key];
301
- result += `
302
- // @filename: ${key}
303
- ${content}
304
- `;
305
- });
306
- result += `
307
- // @filename: code.ts
308
- import * as TemplateModel from './${this.templateClass.getNamespace()}';
309
- import dayjs from 'dayjs';
310
- import jp from 'jsonpath';
311
-
312
- type GenerationOptions = {
313
- now?:string,
314
- locale?:string
315
- }
316
- `;
317
- return result;
318
- }
319
- }
320
-
321
- const DAYJS_BASE64 = "Ly8vIDxyZWZlcmVuY2UgcGF0aD0iLi9sb2NhbGUvaW5kZXguZC50cyIgLz4KCmV4cG9ydCA9IGRheWpzOwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUpOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIHN0cmljdD86IGJvb2xlYW4pOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIGxvY2FsZT86IHN0cmluZywgc3RyaWN0PzogYm9vbGVhbik6IGRheWpzLkRheWpzCgpkZWNsYXJlIG5hbWVzcGFjZSBkYXlqcyB7CiAgaW50ZXJmYWNlIENvbmZpZ1R5cGVNYXAgewogICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IERheWpzIHwgbnVsbCB8IHVuZGVmaW5lZAogIH0KCiAgZXhwb3J0IHR5cGUgQ29uZmlnVHlwZSA9IENvbmZpZ1R5cGVNYXBba2V5b2YgQ29uZmlnVHlwZU1hcF0KCiAgZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPYmplY3QgeyBsb2NhbGU/OiBzdHJpbmcsIGZvcm1hdD86IHN0cmluZywgdXRjPzogYm9vbGVhbiB9CgogIGV4cG9ydCB0eXBlIE9wdGlvblR5cGUgPSBGb3JtYXRPYmplY3QgfCBzdHJpbmcgfCBzdHJpbmdbXQoKICBleHBvcnQgdHlwZSBVbml0VHlwZVNob3J0ID0gJ2QnIHwgJ0QnIHwgJ00nIHwgJ3knIHwgJ2gnIHwgJ20nIHwgJ3MnIHwgJ21zJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmcgPSAnbWlsbGlzZWNvbmQnIHwgJ3NlY29uZCcgfCAnbWludXRlJyB8ICdob3VyJyB8ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyB8ICdkYXRlJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmdQbHVyYWwgPSAnbWlsbGlzZWNvbmRzJyB8ICdzZWNvbmRzJyB8ICdtaW51dGVzJyB8ICdob3VycycgfCAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycgfCAnZGF0ZXMnCiAgCiAgZXhwb3J0IHR5cGUgVW5pdFR5cGUgPSBVbml0VHlwZUxvbmcgfCBVbml0VHlwZUxvbmdQbHVyYWwgfCBVbml0VHlwZVNob3J0OwoKICBleHBvcnQgdHlwZSBPcFVuaXRUeXBlID0gVW5pdFR5cGUgfCAid2VlayIgfCAid2Vla3MiIHwgJ3cnOwogIGV4cG9ydCB0eXBlIFFVbml0VHlwZSA9IFVuaXRUeXBlIHwgInF1YXJ0ZXIiIHwgInF1YXJ0ZXJzIiB8ICdRJzsKICBleHBvcnQgdHlwZSBNYW5pcHVsYXRlVHlwZSA9IEV4Y2x1ZGU8T3BVbml0VHlwZSwgJ2RhdGUnIHwgJ2RhdGVzJz47CiAgY2xhc3MgRGF5anMgewogICAgY29uc3RydWN0b3IgKGNvbmZpZz86IENvbmZpZ1R5cGUpCiAgICAvKioKICAgICAqIEFsbCBEYXkuanMgb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBTdGlsbCwgYGRheWpzI2Nsb25lYCBjYW4gY3JlYXRlIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGlmIHlvdSBuZWVkIG9uZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5jbG9uZSgpLy8gPT4gRGF5anMKICAgICAqIGRheWpzKGRheWpzKCcyMDE5LTAxLTI1JykpIC8vIHBhc3NpbmcgYSBEYXlqcyBvYmplY3QgdG8gYSBjb25zdHJ1Y3RvciB3aWxsIGFsc28gY2xvbmUgaXQKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvZGF5anMtY2xvbmUKICAgICAqLwogICAgY2xvbmUoKTogRGF5anMKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBjb250YWlucyBhIHZhbGlkIGRhdGUgb3Igbm90LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzVmFsaWQoKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvaXMtdmFsaWQKICAgICAqLwogICAgaXNWYWxpZCgpOiBib29sZWFuCiAgICAvKioKICAgICAqIEdldCB0aGUgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS55ZWFyKCkvLyA9PiAyMDIwCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHllYXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkueWVhcigyMDAwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1vbnRoLgogICAgICoKICAgICAqIE1vbnRocyBhcmUgemVybyBpbmRleGVkLCBzbyBKYW51YXJ5IGlzIG1vbnRoIDAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkubW9udGgoKS8vID0+IDAtMTEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9tb250aAogICAgICovCiAgICBtb250aCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtb250aC4KICAgICAqCiAgICAgKiBNb250aHMgYXJlIHplcm8gaW5kZXhlZCwgc28gSmFudWFyeSBpcyBtb250aCAwLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMTEuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5tb250aCgwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbW9udGgKICAgICAqLwogICAgbW9udGgodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF0ZSBvZiB0aGUgbW9udGguCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF0ZSgpLy8gPT4gMS0zMQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2RhdGUKICAgICAqLwogICAgZGF0ZSgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBkYXRlIG9mIHRoZSBtb250aC4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAxIHRvIDMxLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IG1vbnRocy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5kYXRlKDEpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXRlCiAgICAgKi8KICAgIGRhdGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIFJldHVybnMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmRheSgpLy8gMC02CiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZGF5CiAgICAgKi8KICAgIGRheSgpOiAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2CiAgICAvKioKICAgICAqIFNldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIG5leHQgd2Vla3MuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF5KDApLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXkKICAgICAqLwogICAgZGF5KHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIGhvdXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuaG91cigpLy8gPT4gMC0yMwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2hvdXIKICAgICAqLwogICAgaG91cigpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBob3VyLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMjMuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgZGF5LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmhvdXIoMTIpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9ob3VyCiAgICAgKi8KICAgIGhvdXIodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgbWludXRlcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taW51dGUoKS8vID0+IDAtNTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taW51dGUKICAgICAqLwogICAgbWludXRlKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG1pbnV0ZXMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA1OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBob3VyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbnV0ZSg1OSkvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L21pbnV0ZQogICAgICovCiAgICBtaW51dGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZWNvbmQoKS8vID0+IDAtNTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9zZWNvbmQKICAgICAqLwogICAgc2Vjb25kKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHNlY29uZHMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA1OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBtaW51dGVzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNlY29uZCgxKS8vIERheWpzCiAgICAgKiBgYGAKICAgICAqLwogICAgc2Vjb25kKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taWxsaXNlY29uZCgpLy8gPT4gMC05OTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taWxsaXNlY29uZAogICAgICovCiAgICBtaWxsaXNlY29uZCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtaWxsaXNlY29uZHMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA5OTkuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taWxsaXNlY29uZCgxKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbWlsbGlzZWNvbmQKICAgICAqLwogICAgbWlsbGlzZWNvbmQodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdlbmVyaWMgc2V0dGVyLCBhY2NlcHRpbmcgdW5pdCBhcyBmaXJzdCBhcmd1bWVudCwgYW5kIHZhbHVlIGFzIHNlY29uZCwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBhcHBsaWVkIGNoYW5nZXMuCiAgICAgKgogICAgICogSW4gZ2VuZXJhbDoKICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZXQodW5pdCwgdmFsdWUpID09PSBkYXlqcygpW3VuaXRdKHZhbHVlKQogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZXQoJ2RhdGUnLCAxKQogICAgICogZGF5anMoKS5zZXQoJ21vbnRoJywgMykgLy8gQXByaWwKICAgICAqIGRheWpzKCkuc2V0KCdzZWNvbmQnLCAzMCkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9zZXQKICAgICAqLwogICAgc2V0KHVuaXQ6IFVuaXRUeXBlLCB2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogU3RyaW5nIGdldHRlciwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbiBnZXR0aW5nIGZyb20gRGF5LmpzIG9iamVjdC4KICAgICAqCiAgICAgKiBJbiBnZW5lcmFsOgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmdldCh1bml0KSA9PT0gZGF5anMoKVt1bml0XSgpCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmdldCgneWVhcicpCiAgICAgKiBkYXlqcygpLmdldCgnbW9udGgnKSAvLyBzdGFydCAwCiAgICAgKiBkYXlqcygpLmdldCgnZGF0ZScpCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZ2V0CiAgICAgKi8KICAgIGdldCh1bml0OiBVbml0VHlwZSk6IG51bWJlcgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY2xvbmVkIERheS5qcyBvYmplY3Qgd2l0aCBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBhZGRlZC4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5hZGQoNywgJ2RheScpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9hZGQKICAgICAqLwogICAgYWRkKHZhbHVlOiBudW1iZXIsIHVuaXQ/OiBNYW5pcHVsYXRlVHlwZSk6IERheWpzCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjbG9uZWQgRGF5LmpzIG9iamVjdCB3aXRoIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIHN1YnRyYWN0ZWQuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuc3VidHJhY3QoNywgJ3llYXInKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvc3VidHJhY3QKICAgICAqLwogICAgc3VidHJhY3QodmFsdWU6IG51bWJlciwgdW5pdD86IE1hbmlwdWxhdGVUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IGFuZCBzZXQgaXQgdG8gdGhlIHN0YXJ0IG9mIGEgdW5pdCBvZiB0aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnN0YXJ0T2YoJ3llYXInKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvc3RhcnQtb2YKICAgICAqLwogICAgc3RhcnRPZih1bml0OiBPcFVuaXRUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IGFuZCBzZXQgaXQgdG8gdGhlIGVuZCBvZiBhIHVuaXQgb2YgdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5lbmRPZignbW9udGgnKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvZW5kLW9mCiAgICAgKi8KICAgIGVuZE9mKHVuaXQ6IE9wVW5pdFR5cGUpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIGZvcm1hdHRlZCBkYXRlIGFjY29yZGluZyB0byB0aGUgc3RyaW5nIG9mIHRva2VucyBwYXNzZWQgaW4uCiAgICAgKgogICAgICogVG8gZXNjYXBlIGNoYXJhY3RlcnMsIHdyYXAgdGhlbSBpbiBzcXVhcmUgYnJhY2tldHMgKGUuZy4gW01NXSkuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZm9ybWF0KCkvLyA9PiBjdXJyZW50IGRhdGUgaW4gSVNPODYwMSwgd2l0aG91dCBmcmFjdGlvbiBzZWNvbmRzIGUuZy4gJzIwMjAtMDQtMDJUMDg6MDI6MTctMDU6MDAnCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLmZvcm1hdCgnW1lZWVllc2NhcGVdIFlZWVktTU0tRERUSEg6bW06c3NaW1pdJykvLyAnWVlZWWVzY2FwZSAyMDE5LTAxLTI1VDAwOjAwOjAwLTAyOjAwWicKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykuZm9ybWF0KCdERC9NTS9ZWVlZJykgLy8gJzI1LzAxLzIwMTknCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvZm9ybWF0CiAgICAgKi8KICAgIGZvcm1hdCh0ZW1wbGF0ZT86IHN0cmluZyk6IHN0cmluZwogICAgLyoqCiAgICAgKiBUaGlzIGluZGljYXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRlLXRpbWUgaW4gdGhlIHNwZWNpZmllZCB1bml0LgogICAgICoKICAgICAqIFRvIGdldCB0aGUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHMsIHVzZSBgZGF5anMjZGlmZmAKICAgICAqIGBgYAogICAgICogY29uc3QgZGF0ZTEgPSBkYXlqcygnMjAxOS0wMS0yNScpCiAgICAgKiBjb25zdCBkYXRlMiA9IGRheWpzKCcyMDE4LTA2LTA1JykKICAgICAqIGRhdGUxLmRpZmYoZGF0ZTIpIC8vIDIwMjE0MDAwMDAwIGRlZmF1bHQgbWlsbGlzZWNvbmRzCiAgICAgKiBkYXRlMS5kaWZmKCkgLy8gbWlsbGlzZWNvbmRzIHRvIGN1cnJlbnQgdGltZQogICAgICogYGBgCiAgICAgKgogICAgICogVG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGluIGFub3RoZXIgdW5pdCBvZiBtZWFzdXJlbWVudCwgcGFzcyB0aGF0IG1lYXN1cmVtZW50IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCiAgICAgKiBgYGAKICAgICAqIGNvbnN0IGRhdGUxID0gZGF5anMoJzIwMTktMDEtMjUnKQogICAgICogZGF0ZTEuZGlmZignMjAxOC0wNi0wNScsICdtb250aCcpIC8vIDcKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9kaWZmZXJlbmNlCiAgICAgKi8KICAgIGRpZmYoZGF0ZT86IENvbmZpZ1R5cGUsIHVuaXQ/OiBRVW5pdFR5cGUgfCBPcFVuaXRUeXBlLCBmbG9hdD86IGJvb2xlYW4pOiBudW1iZXIKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgKiptaWxsaXNlY29uZHMqKiBzaW5jZSB0aGUgVW5peCBFcG9jaCBvZiB0aGUgRGF5LmpzIG9iamVjdC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS52YWx1ZU9mKCkgLy8gMTU0ODM4MTYwMDAwMAogICAgICogK2RheWpzKDE1NDgzODE2MDAwMDApIC8vIDE1NDgzODE2MDAwMDAKICAgICAqIGBgYAogICAgICogVG8gZ2V0IGEgVW5peCB0aW1lc3RhbXAgKHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gpIGZyb20gYSBEYXkuanMgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSBVbml4IFRpbWVzdGFtcCBgZGF5anMjdW5peCgpYC4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L3VuaXgtdGltZXN0YW1wLW1pbGxpc2Vjb25kcwogICAgICovCiAgICB2YWx1ZU9mKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUaGlzIHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wICh0aGUgbnVtYmVyIG9mICoqc2Vjb25kcyoqIHNpbmNlIHRoZSBVbml4IEVwb2NoKSBvZiB0aGUgRGF5LmpzIG9iamVjdC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS51bml4KCkgLy8gMTU0ODM4MTYwMAogICAgICogYGBgCiAgICAgKiBUaGlzIHZhbHVlIGlzIGZsb29yZWQgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kLCBhbmQgZG9lcyBub3QgaW5jbHVkZSBhIG1pbGxpc2Vjb25kcyBjb21wb25lbnQuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS91bml4LXRpbWVzdGFtcAogICAgICovCiAgICB1bml4KCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBjdXJyZW50IG1vbnRoLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLmRheXNJbk1vbnRoKCkgLy8gMzEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9kYXlzLWluLW1vbnRoCiAgICAgKi8KICAgIGRheXNJbk1vbnRoKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUbyBnZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgYERhdGVgIG9iamVjdCBwYXJzZWQgZnJvbSB0aGUgRGF5LmpzIG9iamVjdCB1c2UgYGRheWpzI3RvRGF0ZWAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykudG9EYXRlKCkvLyA9PiBEYXRlCiAgICAgKiBgYGAKICAgICAqLwogICAgdG9EYXRlKCk6IERhdGUKICAgIC8qKgogICAgICogVG8gc2VyaWFsaXplIGFzIGFuIElTTyA4NjAxIHN0cmluZy4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS50b0pTT04oKSAvLyAnMjAxOS0wMS0yNVQwMjowMDowMC4wMDBaJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLWpzb24KICAgICAqLwogICAgdG9KU09OKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBUbyBmb3JtYXQgYXMgYW4gSVNPIDg2MDEgc3RyaW5nLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvSVNPU3RyaW5nKCkgLy8gJzIwMTktMDEtMjVUMDI6MDA6MDAuMDAwWicKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9hcy1pc28tc3RyaW5nCiAgICAgKi8KICAgIHRvSVNPU3RyaW5nKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRlLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvU3RyaW5nKCkgLy8gJ0ZyaSwgMjUgSmFuIDIwMTkgMDI6MDA6MDAgR01UJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLXN0cmluZwogICAgICovCiAgICB0b1N0cmluZygpOiBzdHJpbmcKICAgIC8qKgogICAgICogR2V0IHRoZSBVVEMgb2Zmc2V0IGluIG1pbnV0ZXMuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkudXRjT2Zmc2V0KCkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS91dGMtb2Zmc2V0CiAgICAgKi8KICAgIHV0Y09mZnNldCgpOiBudW1iZXIKICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBiZWZvcmUgdGhlIG90aGVyIHN1cHBsaWVkIGRhdGUtdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0JlZm9yZShkYXlqcygnMjAxMS0wMS0wMScpKSAvLyBkZWZhdWx0IG1pbGxpc2Vjb25kcwogICAgICogYGBgCiAgICAgKiBJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgZ3JhbnVsYXJpdHkgdG8gYSB1bml0IG90aGVyIHRoYW4gbWlsbGlzZWNvbmRzLCBwYXNzIGl0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQmVmb3JlKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYmVmb3JlCiAgICAgKi8KICAgIGlzQmVmb3JlKGRhdGU/OiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzU2FtZShkYXlqcygnMjAxMS0wMS0wMScpKSAvLyBkZWZhdWx0IG1pbGxpc2Vjb25kcwogICAgICogYGBgCiAgICAgKiBJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgZ3JhbnVsYXJpdHkgdG8gYSB1bml0IG90aGVyIHRoYW4gbWlsbGlzZWNvbmRzLCBwYXNzIGl0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzU2FtZSgnMjAxMS0wMS0wMScsICd5ZWFyJykvLyA9PiBib29sZWFuCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL3F1ZXJ5L2lzLXNhbWUKICAgICAqLwogICAgaXNTYW1lKGRhdGU/OiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBhZnRlciB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQWZ0ZXIoZGF5anMoJzIwMTEtMDEtMDEnKSkgLy8gZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGBgYAogICAgICogSWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIGdyYW51bGFyaXR5IHRvIGEgdW5pdCBvdGhlciB0aGFuIG1pbGxpc2Vjb25kcywgcGFzcyBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0FmdGVyKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYWZ0ZXIKICAgICAqLwogICAgaXNBZnRlcihkYXRlPzogQ29uZmlnVHlwZSwgdW5pdD86IE9wVW5pdFR5cGUpOiBib29sZWFuCgogICAgbG9jYWxlKCk6IHN0cmluZwoKICAgIGxvY2FsZShwcmVzZXQ6IHN0cmluZyB8IElMb2NhbGUsIG9iamVjdD86IFBhcnRpYWw8SUxvY2FsZT4pOiBEYXlqcwogIH0KCiAgZXhwb3J0IHR5cGUgUGx1Z2luRnVuYzxUID0gdW5rbm93bj4gPSAob3B0aW9uOiBULCBjOiB0eXBlb2YgRGF5anMsIGQ6IHR5cGVvZiBkYXlqcykgPT4gdm9pZAoKICBleHBvcnQgZnVuY3Rpb24gZXh0ZW5kPFQgPSB1bmtub3duPihwbHVnaW46IFBsdWdpbkZ1bmM8VD4sIG9wdGlvbj86IFQpOiBEYXlqcwoKICBleHBvcnQgZnVuY3Rpb24gbG9jYWxlKHByZXNldD86IHN0cmluZyB8IElMb2NhbGUsIG9iamVjdD86IFBhcnRpYWw8SUxvY2FsZT4sIGlzTG9jYWw/OiBib29sZWFuKTogc3RyaW5nCgogIGV4cG9ydCBmdW5jdGlvbiBpc0RheWpzKGQ6IGFueSk6IGQgaXMgRGF5anMKCiAgZXhwb3J0IGZ1bmN0aW9uIHVuaXgodDogbnVtYmVyKTogRGF5anMKCiAgY29uc3QgTHMgOiB7IFtrZXk6IHN0cmluZ10gOiAgSUxvY2FsZSB9Cn0K";
322
- const JSONPATH_BASE64 = "dHlwZSBQYXRoQ29tcG9uZW50ID0gc3RyaW5nIHwgbnVtYmVyOwoKLyoqCiAqIEZpbmQgZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0CiAqIHNhdGlzZnkgdGhlIHByb3ZpZGVkIEpTT05QYXRoIGV4cHJlc3Npb24sb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZSB3ZXJlIG1hdGNoZWQuCiAqIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIGVsZW1lbnRzIGlmIHNwZWNpZmllZC4KICovCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHF1ZXJ5KG9iajogYW55LCBwYXRoRXhwcmVzc2lvbjogc3RyaW5nLCBjb3VudD86IG51bWJlcik6IGFueVtdOwoKLyoqCiAqIEZpbmQgcGF0aHMgdG8gZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZgogKiBlbGVtZW50IHBhdGhzIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgSlNPTlBhdGggZXhwcmVzc2lvbi4gRWFjaCBwYXRoIGlzIGl0c2VsZiBhbgogKiBhcnJheSBvZiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LiBSZXR1cm5zCiAqIG9ubHkgZmlyc3QgYGNvdW50YCBwYXRocyBpZiBzcGVjaWZpZWQuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXRocyhvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgY291bnQ/OiBudW1iZXIpOiBQYXRoQ29tcG9uZW50W11bXTsKCi8qKgogKiBGaW5kIGVsZW1lbnRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHBhdGhzIGluIGBvYmpgIG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuCiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9kZSBvYmplY3RzIHdoZXJlIGVhY2ggbm9kZSBoYXMgYSBgcGF0aGAgY29udGFpbmluZyBhbiBhcnJheSBvZgogKiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgLCBhbmQgYSBgdmFsdWVgIHBvaW50aW5nIHRvIHRoZSBtYXRjaGVkCiAqIGVsZW1lbnQuIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIG5vZGVzIGlmIHNwZWNpZmllZC4KICovCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIG5vZGVzKAogICAgb2JqOiBhbnksCiAgICBwYXRoRXhwcmVzc2lvbjogc3RyaW5nLAogICAgY291bnQ/OiBudW1iZXIsCik6IEFycmF5PHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55IH0+OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuIElmIGBuZXdWYWx1ZWAgaXMKICogcHJvdmlkZWQsIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB2YWx1ZShvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZyk6IGFueTsKZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gdmFsdWU8VD4ob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcsIG5ld1ZhbHVlOiBUKTogVDsKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXJlbnQob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcpOiBhbnk7CgovKioKICogUnVucyB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gYGZuYCBvbiBlYWNoIG1hdGNoaW5nIGVsZW1lbnQsIGFuZCByZXBsYWNlcyBlYWNoCiAqIG1hdGNoaW5nIGVsZW1lbnQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyB0aGUKICogdmFsdWUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQgYXMgaXRzIG9ubHkgcGFyYW1ldGVyLiBSZXR1cm5zIG1hdGNoaW5nIG5vZGVzIHdpdGgKICogdGhlaXIgdXBkYXRlZCB2YWx1ZXMuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBhcHBseSgKICAgIG9iajogYW55LAogICAgcGF0aEV4cHJlc3Npb246IHN0cmluZywKICAgIGZuOiAoeDogYW55KSA9PiBhbnksCik6IEFycmF5PHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55IH0+OwoKLyoqCiAqIFBhcnNlIHRoZSBwcm92aWRlZCBKU09OUGF0aCBleHByZXNzaW9uIGludG8gcGF0aCBjb21wb25lbnRzIGFuZCB0aGVpciBhc3NvY2lhdGVkCiAqIG9wZXJhdGlvbnMuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXJzZShwYXRoRXhwcmVzc2lvbjogc3RyaW5nKTogYW55W107CgovKioKICogUmV0dXJucyBhIHBhdGggZXhwcmVzc2lvbiBpbiBzdHJpbmcgZm9ybSwgZ2l2ZW4gYSBwYXRoLiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgZWl0aGVyCiAqIGJlIGEgZmxhdCBhcnJheSBvZiBrZXlzLCBhcyByZXR1cm5lZCBieSBganAubm9kZXNgIGZvciBleGFtcGxlLCBvciBtYXkgYWx0ZXJuYXRpdmVseSBiZSBhCiAqIGZ1bGx5IHBhcnNlZCBwYXRoIGV4cHJlc3Npb24gaW4gdGhlIGZvcm0gb2YgYW4gYXJyYXkgb2YgcGF0aCBjb21wb25lbnRzIGFzIHJldHVybmVkCiAqIGJ5IGBqcC5wYXJzZWAuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBzdHJpbmdpZnkocGF0aDogUGF0aENvbXBvbmVudFtdKTogc3RyaW5nOwoKZXhwb3J0IGFzIG5hbWVzcGFjZSBqc29ucGF0aDsK";
323
- const SMART_LEGAL_CONTRACT_BASE64 = "LyoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqLwoKLy8gd2UgZHVwbGljYXRlIHRoZXNlIGludGVyZmFjZXMgaGVyZSB0byBhdm9pZCBpbXBvcnRzIGludG8gdGhlIHJ1bnRpbWUKaW50ZXJmYWNlIElDb25jZXB0IHsKICAgICRjbGFzczogc3RyaW5nOwogfQoKaW50ZXJmYWNlIElUcmFuc2FjdGlvbiBleHRlbmRzIElDb25jZXB0IHsKICAgICR0aW1lc3RhbXA6IERhdGU7CiB9CgppbnRlcmZhY2UgSUV2ZW50IGV4dGVuZHMgSUNvbmNlcHQgewogICAkdGltZXN0YW1wOiBEYXRlOwp9CgppbnRlcmZhY2UgSVN0YXRlIHsKICAgICRpZGVudGlmaWVyOiBzdHJpbmc7Cn0KCmludGVyZmFjZSBFbmdpbmVSZXNwb25zZTxTIGV4dGVuZHMgSVN0YXRlPiB7CiAgICBzdGF0ZT86IFM7CiAgICBldmVudHM/OiBBcnJheTxJRXZlbnQ+Cn0KCmludGVyZmFjZSBJUmVxdWVzdCBleHRlbmRzIElUcmFuc2FjdGlvbiB7Cn0KCmludGVyZmFjZSBJUmVzcG9uc2UgZXh0ZW5kcyBJVHJhbnNhY3Rpb24gewp9CgppbnRlcmZhY2UgSUFzc2V0IGV4dGVuZHMgSUNvbmNlcHQgewogICAkaWRlbnRpZmllcjogc3RyaW5nOwp9CgppbnRlcmZhY2UgSUNvbnRyYWN0IGV4dGVuZHMgSUFzc2V0IHsKICAgY29udHJhY3RJZDogc3RyaW5nOwp9CgppbnRlcmZhY2UgSUNsYXVzZSBleHRlbmRzIElBc3NldCB7CiAgIGNsYXVzZUlkOiBzdHJpbmc7Cn0KCmludGVyZmFjZSBUcmlnZ2VyUmVzcG9uc2U8UyBleHRlbmRzIElTdGF0ZSA9IElTdGF0ZT4gZXh0ZW5kcyBFbmdpbmVSZXNwb25zZTxTPiB7CiAgICByZXN1bHQ6IElSZXNwb25zZTsKfQoKaW50ZXJmYWNlIEluaXRSZXNwb25zZTxTIGV4dGVuZHMgSVN0YXRlPiBleHRlbmRzIEVuZ2luZVJlc3BvbnNlPFM+IHt9Cgp0eXBlIFRlbXBsYXRlRGF0YSA9IElDb250cmFjdHxJQ2xhdXNlOwoKZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRlbXBsYXRlTG9naWM8VCBleHRlbmRzIFRlbXBsYXRlRGF0YSwgUyBleHRlbmRzIElTdGF0ZSA9IElTdGF0ZT4gewogICAgYWJzdHJhY3QgdHJpZ2dlcihkYXRhOiBULCByZXF1ZXN0OiBJUmVxdWVzdCwgc3RhdGU6UykgOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZTxTPj47CiAgICBpbml0KGRhdGE6IFQpIDogUHJvbWlzZTxJbml0UmVzcG9uc2U8Uz58dW5kZWZpbmVkPjsKfQo=";
324
-
325
- const TYPESCRIPT_URL = process.env.TYPESCRIPT_URL ? process.env.TYPESCRIPT_URL : "https://cdn.jsdelivr.net/npm/typescript@4.9.4/+esm";
326
- const SCRIPT_TARGET = 9;
327
- const MODULE_KIND = 6;
328
- class TypeScriptToJavaScriptCompiler {
329
- constructor(modelManager, templateConceptFqn) {
330
- this.context = new TypeScriptCompilationContext(modelManager, templateConceptFqn).getCompilationContext();
331
- this.typescriptUrl = TYPESCRIPT_URL;
332
- }
333
- async initialize(typescriptUrl) {
334
- if (typescriptUrl) {
335
- this.typescriptUrl = typescriptUrl;
336
- }
337
- if (typeof window === "undefined") {
338
- this.ts = (await import('typescript')).default;
339
- if (!this.ts) {
340
- throw new Error("Failed to load typescript module");
341
- }
342
- this.fsMap = createDefaultMapFromNodeModules({
343
- target: SCRIPT_TARGET
344
- });
345
- } else {
346
- this.ts = (await import(this.typescriptUrl)).default;
347
- if (!this.ts) {
348
- throw new Error("Failed to dynamically load typescript");
349
- }
350
- this.fsMap = await createDefaultMapFromCDN({ target: SCRIPT_TARGET }, this.ts.version, false, this.ts);
351
- }
352
- this.fsMap.set("/node_modules/@types/dayjs/index.d.ts", Buffer.from(DAYJS_BASE64, "base64").toString());
353
- this.fsMap.set("/node_modules/@types/jsonpath/index.d.ts", Buffer.from(JSONPATH_BASE64, "base64").toString());
354
- }
355
- compile(typescript) {
356
- if (!this.fsMap) {
357
- throw new Error("initialize must be awaited before compile is called.");
358
- }
359
- const twoSlashCode = `
360
- ${this.context}
361
- ${typescript}
362
- `;
363
- const options = {
364
- fsMap: this.fsMap,
365
- tsModule: this.ts,
366
- defaultCompilerOptions: {
367
- target: SCRIPT_TARGET,
368
- module: MODULE_KIND
369
- },
370
- lzstringModule: lzstring,
371
- defaultOptions: {
372
- showEmit: true,
373
- noErrorValidation: true,
374
- showEmittedFile: "code.js"
375
- }
376
- };
377
- const result = twoslasher(twoSlashCode, "ts", options);
378
- return result;
379
- }
380
- }
381
-
382
- var CodeType = /* @__PURE__ */ ((CodeType2) => {
383
- CodeType2["TYPESCRIPT"] = "TYPESCRIPT";
384
- CodeType2["ES_2020"] = "ES_2020";
385
- return CodeType2;
386
- })(CodeType || {});
387
-
388
- const CODE_NODES = [
389
- `${TemplateMarkModel.NAMESPACE}.FormulaDefinition`,
390
- `${TemplateMarkModel.NAMESPACE}.ConditionalDefinition`,
391
- `${TemplateMarkModel.NAMESPACE}.ClauseDefinition`
392
- ];
393
- function checkCode$1(code) {
394
- if (code.type !== CodeType.TYPESCRIPT) {
395
- throw new Error(`Cannot compile ${code.contents} as it is not Typescript.`);
396
- }
397
- }
398
- class TemplateMarkToJavaScriptCompiler {
399
- constructor(modelManager, templateConceptFqn) {
400
- this.modelManager = modelManager;
401
- this.compiler = new TypeScriptToJavaScriptCompiler(modelManager, templateConceptFqn);
402
- this.templateClass = getTemplateClassDeclaration(modelManager, templateConceptFqn);
403
- }
404
- async initialize() {
405
- await this.compiler.initialize();
406
- }
407
- compile(templateJson) {
408
- const namedTemplateMark = nameUserCode(templateJson);
409
- const that = this;
410
- const errors = Array();
411
- const compiled = traverse(namedTemplateMark).map(function(x) {
412
- if (x && CODE_NODES.includes(x.$class)) {
413
- if (x.code) {
414
- checkCode$1(x.code);
415
- const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.name, "any", x.code.contents));
416
- if (result.errors.length === 0) {
417
- x.code.contents = result.code;
418
- x.code.type = CodeType.ES_2020;
419
- this.update(x);
420
- } else {
421
- errors.push({
422
- nodeId: x.name,
423
- code: x.code.contents,
424
- errors: result.errors
425
- });
426
- }
427
- } else if (x.condition) {
428
- checkCode$1(x.condition);
429
- const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.functionName, "boolean", x.condition.contents));
430
- if (result.errors.length === 0) {
431
- x.condition.contents = result.code;
432
- x.condition.type = CodeType.ES_2020;
433
- this.update(x);
434
- } else {
435
- errors.push({
436
- nodeId: x.functionName,
437
- code: x.condition.contents,
438
- errors: result.errors
439
- });
440
- }
441
- }
442
- }
443
- });
444
- if (errors.length === 0) {
445
- return compiled;
446
- } else {
447
- throw errors;
448
- }
449
- }
450
- }
451
-
452
- function joinList(data, joinDef, options) {
453
- if (joinDef.separator) {
454
- return data.join(joinDef.separator);
455
- } else {
456
- const formatter = new Intl.ListFormat(
457
- joinDef.locale ? joinDef.locale : options?.locale,
458
- {
459
- style: joinDef.style,
460
- type: joinDef.type
461
- }
462
- );
463
- return formatter.format(data);
464
- }
465
- }
466
-
467
- async function sleep(msec) {
468
- return new Promise((resolve) => setTimeout(resolve, msec));
469
- }
470
- const _import = async (path2) => new Function("specifier", "return import(specifier)")(path2);
471
- const dynamicImport = async (path2, symbol) => {
472
- const mod = await _import(path2);
473
- return symbol ? mod.symbol : mod.default;
474
- };
475
- class JavaScriptEvaluator {
476
- // queue of work to do
477
- constructor(options = { waitInterval: 50, maxWorkers: 8, maxQueueDepth: 1e3 }) {
478
- this.options = options;
479
- this.workers = [];
480
- this.queue = [];
481
- }
482
- /**
483
- * Evaluates a JS function in process.
484
- * @param {EvalRequest} request - the eval request
485
- * @returns {Promise} a promise to the result
486
- */
487
- async evalDangerously(request) {
488
- return new Promise((resolve, reject) => {
489
- try {
490
- if (request.verbose) {
491
- console.log(request.code);
492
- }
493
- const start = (/* @__PURE__ */ new Date()).getTime();
494
- let result = null;
495
- if (!request.templateLogic) {
496
- const fun = new Function(...["dayjs", "jp", ...request.argumentNames], request.code);
497
- result = fun(...[dayjs, jp, ...request.arguments]);
498
- const end = (/* @__PURE__ */ new Date()).getTime();
499
- resolve({ result, elapsed: end - start });
500
- } else {
501
- const dataUri = "data:text/javascript;base64," + btoa(request.code);
502
- dynamicImport(dataUri).then((templateLogicConstructor) => {
503
- const instance = new templateLogicConstructor();
504
- if (!request.functionName) {
505
- throw new Error("No function name specified for template logic");
506
- }
507
- result = instance[request.functionName](...request.arguments);
508
- const end = (/* @__PURE__ */ new Date()).getTime();
509
- resolve({ result, elapsed: end - start });
510
- }).catch((err) => {
511
- console.error(err);
512
- if (err instanceof Error) {
513
- reject({
514
- message: err.message,
515
- stack: err.stack
516
- });
517
- } else {
518
- reject({
519
- message: String(err)
520
- });
521
- }
522
- });
523
- }
524
- } catch (err) {
525
- console.error(err);
526
- if (err instanceof Error) {
527
- reject({
528
- message: err.message,
529
- stack: err.stack
530
- });
531
- } else {
532
- reject({
533
- message: String(err)
534
- });
535
- }
536
- }
537
- });
538
- }
539
- /**
540
- * Evaluates a JS function using a node child process
541
- * @param {EvalRequest} request the eval request
542
- * @param {EvalOptions} options the options for the request
543
- * @returns {Promise<EvalResponse>} the async result
544
- */
545
- async evalChildProcess(request, options = { timeout: 1e4 }) {
546
- return new Promise((resolve, reject) => {
547
- const now = (/* @__PURE__ */ new Date()).getTime();
548
- const workItem = {
549
- startTime: now,
550
- expireTime: now + options.timeout,
551
- request,
552
- resolve,
553
- reject
554
- };
555
- if (this.queue.length >= this.options.maxQueueDepth) {
556
- reject({ maxQueueDepthExceeded: true, elapsed: 0 });
557
- return;
558
- }
559
- this.queue.push(workItem);
560
- this.processQueue(options);
561
- });
562
- }
563
- processQueue(options) {
564
- const now = (/* @__PURE__ */ new Date()).getTime();
565
- const notExpired = this.queue.filter((w) => now < w.expireTime);
566
- const expired = this.queue.filter((w) => now >= w.expireTime);
567
- this.queue = notExpired;
568
- expired.forEach((w) => {
569
- w.reject({ timeout: true, starvation: true, elapsed: now - w.startTime });
570
- });
571
- if (this.workers.length < this.options.maxWorkers) {
572
- const next = this.queue.shift();
573
- if (next) {
574
- this.doWork(next, options).then((result) => next.resolve(result)).catch((error) => next.reject(error));
575
- }
576
- } else {
577
- sleep(this.options.waitInterval).then(() => {
578
- this.processQueue(options);
579
- });
580
- }
581
- }
582
- getWorkerPath() {
583
- try {
584
- const thisPath = require.resolve("@accordproject/template-engine");
585
- return path.join(thisPath, "..", "worker.js");
586
- } catch (err) {
587
- return path.join(__dirname, "..", "dist", "worker.js");
588
- }
589
- }
590
- doWork(work, options) {
591
- return new Promise((resolve, reject) => {
592
- const start = (/* @__PURE__ */ new Date()).getTime();
593
- if (!child_process.fork) {
594
- reject({ message: "Cannot use evalChildProcess because child_process.fork is not defined." });
595
- }
596
- const workerPath = this.getWorkerPath();
597
- const worker = child_process.fork(workerPath, { timeout: options.timeout, env: {} });
598
- if (worker.pid === void 0 || worker.pid === null) {
599
- throw new Error("Failed to fork child process");
600
- }
601
- this.workers.push(worker);
602
- work.pid = worker.pid;
603
- let result;
604
- worker.on("error", (err) => {
605
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
606
- const end = (/* @__PURE__ */ new Date()).getTime();
607
- if (err instanceof Error) {
608
- reject({
609
- message: err.message,
610
- stack: err.stack,
611
- elapsed: end - start
612
- });
613
- } else {
614
- reject({
615
- message: String(err),
616
- elapsed: end - start
617
- });
618
- }
619
- });
620
- worker.on("message", (msg) => {
621
- result = msg;
622
- });
623
- worker.on("exit", (code) => {
624
- if (code === null) {
625
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
626
- const end = (/* @__PURE__ */ new Date()).getTime();
627
- reject({ timeout: true, elapsed: end - start });
628
- } else if (code === 0 && result) {
629
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
630
- const end = (/* @__PURE__ */ new Date()).getTime();
631
- resolve({ ...result, elapsed: end - start });
632
- } else {
633
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
634
- const end = (/* @__PURE__ */ new Date()).getTime();
635
- reject({ code, result, elapsed: end - start });
636
- }
637
- });
638
- worker.send(work.request);
639
- });
640
- }
641
- }
642
-
643
- function checkCode(code) {
644
- if (code.type !== CodeType.ES_2020) {
645
- throw new Error(`Cannot run ${code.contents} as it is not ES_2020 JavaScript.`);
646
- }
647
- }
648
- const javaScriptEvaluator = isBrowser ? new JavaScriptEvaluator() : new JavaScriptEvaluator({
649
- maxWorkers: process.env.MAX_WORKERS ? Number.parseInt(process.env.MAX_WORKERS) : os.availableParallelism(),
650
- // how many child processes
651
- waitInterval: process.env.WAIT_INTERVAL ? Number.parseInt(process.env.WAIT_INTERVAL) : 50,
652
- // how long to wait before rescheduling work
653
- maxQueueDepth: process.env.MAX_QUEUE_DEPTH ? Number.parseInt(process.env.MAX_QUEUE_DEPTH) : 1e3
654
- // max requests to queue
655
- });
656
- const TEMPLATEMARK_ROOT_NODES = [
657
- "org.accordproject.templatemark@0.5.0.ClauseDefinition",
658
- "org.accordproject.templatemark@0.5.0.ContractDefinition"
659
- ];
660
- const DOCUMENT_ROOT = "org.accordproject.commonmark@0.5.0.Document";
661
- async function evaluateJavaScript(clauseLibrary, data, fn, options) {
662
- if (options?.disableJavaScriptEvaluation) {
663
- throw new Error("JavaScript evaluation is disabled.");
664
- }
665
- if (!data || !fn) {
666
- throw new Error(`Cannot evaluate JS ${fn} against ${data}`);
667
- }
668
- const functionArgNames = new Array();
669
- functionArgNames.push("data");
670
- functionArgNames.push("library");
671
- functionArgNames.push("options");
672
- const functionArgValues = new Array();
673
- functionArgValues.push(data);
674
- functionArgValues.push(clauseLibrary);
675
- functionArgValues.push(options);
676
- const expression = fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}"));
677
- if (expression.trim().length === 0) {
678
- throw new Error("Empty expression");
679
- }
680
- try {
681
- const request = { code: expression, argumentNames: functionArgNames, arguments: functionArgValues };
682
- if (options?.childProcessJavaScriptEvaluation) {
683
- if (isBrowser) {
684
- throw new Error("Child process evaluation is not supported inside web browser");
685
- }
686
- const evalOptions = options?.timeout ? { timeout: options.timeout } : void 0;
687
- const r = await javaScriptEvaluator.evalChildProcess(request, evalOptions);
688
- return r;
689
- } else {
690
- const r = await javaScriptEvaluator.evalDangerously(request);
691
- return r;
692
- }
693
- } catch (err) {
694
- throw new Error(`Caught error ${JSON.stringify(err)} evaluating ${expression} with arguments ${JSON.stringify(functionArgValues)}`);
695
- }
696
- }
697
- function getJsonPath(rootData, currentNode, paths) {
698
- if (!currentNode) {
699
- throw new Error("Node must be supplied");
700
- }
701
- if (!currentNode.name) {
702
- throw new Error(`Node must have a name: ${JSON.stringify(currentNode)}`);
703
- }
704
- if (currentNode.name.indexOf(".") >= 0) {
705
- throw new Error(`Invalid name property ${currentNode.name}`);
706
- }
707
- if (!paths || !paths.length || paths.length < 1) {
708
- throw new Error("Paths must be supplied");
709
- }
710
- const withPath = [];
711
- for (let n = 1; n < paths.length; n++) {
712
- const sub = paths.slice(0, n);
713
- const obj = traverse.get(rootData, sub);
714
- if (obj && obj.$class) {
715
- if (NAVIGATION_NODES.indexOf(obj.$class) >= 0) {
716
- if (obj.name !== "top") {
717
- withPath.push(`['${obj.name}']`);
718
- }
719
- }
720
- }
721
- }
722
- if (currentNode.name !== "this" && currentNode.name !== "top") {
723
- withPath.push(`['${currentNode.name}']`);
724
- }
725
- return withPath.length > 0 ? `$${withPath.join("")}` : "$";
726
- }
727
- async function evaluateUserCode(clauseLibrary, templateMark, data, options) {
728
- const result = {};
729
- const paths = traverse(templateMark).paths();
730
- for (let n = 0; n < paths.length; n++) {
731
- const path = paths[n];
732
- const context = traverse(templateMark).get(path);
733
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
734
- const nodeClass = context.$class;
735
- if (FORMULA_DEFINITION_RE.test(nodeClass)) {
736
- if (context.code) {
737
- checkCode(context.code);
738
- const evalResponse = await evaluateJavaScript(clauseLibrary, data, context.code.contents, options);
739
- result[path.join("/")] = JSON.stringify(evalResponse.result);
740
- } else {
741
- throw new Error("Formula node is missing code.");
742
- }
743
- } else if (CONDITIONAL_DEFINITION_RE.test(nodeClass) || CLAUSE_DEFINITION_RE.test(nodeClass)) {
744
- if (context.condition) {
745
- checkCode(context.condition);
746
- const evalResponse = await evaluateJavaScript(clauseLibrary, data, context.condition.contents, options);
747
- result[path.join("/")] = JSON.stringify(evalResponse.result);
748
- }
749
- }
750
- }
751
- }
752
- return result;
753
- }
754
- async function generateOptionalBlocks(modelManager, clauseLibrary, templateMark, data, options) {
755
- const result = {};
756
- const paths = traverse(templateMark).paths();
757
- for (let n = 0; n < paths.length; n++) {
758
- const thisPath = paths[n];
759
- const context = traverse(templateMark).get(thisPath);
760
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
761
- const nodeClass = context.$class;
762
- if (OPTIONAL_DEFINITION_RE.test(nodeClass)) {
763
- const path = getJsonPath(templateMark, context, thisPath);
764
- const variableValues = jp.query(data, path, 1);
765
- if (variableValues.length > 0) {
766
- const optionalPropertyValue = variableValues[0];
767
- if (context.whenSome && context.whenSome.length > 0) {
768
- const whenSomeParagraph = {
769
- $class: "org.accordproject.commonmark@0.5.0.Paragraph",
770
- nodes: context.whenSome
771
- };
772
- const subResult = await generateAgreement(modelManager, clauseLibrary, whenSomeParagraph, optionalPropertyValue, options);
773
- result[thisPath.join("/")] = subResult.nodes ? subResult.nodes : [];
774
- } else {
775
- result[thisPath.join("/")] = [];
776
- }
777
- }
778
- }
779
- }
780
- }
781
- return result;
782
- }
783
- async function generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, nodeRegExp, childNodeClass, options) {
784
- const result = {};
785
- const paths = traverse(templateMark).paths();
786
- for (let n = 0; n < paths.length; n++) {
787
- const thisPath = paths[n];
788
- const context = traverse(templateMark).get(thisPath);
789
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
790
- const nodeClass = context.$class;
791
- if (nodeRegExp.test(nodeClass)) {
792
- const path = getJsonPath(templateMark, context, thisPath);
793
- const variableValues = jp.query(data, path, 1);
794
- if (variableValues.length === 0) {
795
- throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
796
- } else {
797
- const arrayData = variableValues[0];
798
- if (!Array.isArray(arrayData)) {
799
- throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
800
- } else {
801
- const firstChild = context.nodes[0];
802
- const hasListWrapper = firstChild && firstChild.$class === `${CommonMarkModel.NAMESPACE}.List` && Array.isArray(firstChild.nodes) && firstChild.nodes.length > 0;
803
- const itemTemplate = hasListWrapper ? firstChild.nodes[0] : firstChild;
804
- const nodes = [];
805
- for (let n2 = 0; n2 < arrayData.length; n2++) {
806
- const arrayItem = arrayData[n2];
807
- const subResult = await generateAgreement(modelManager, clauseLibrary, itemTemplate, arrayItem, options);
808
- const childNodes = hasListWrapper ? subResult.nodes ? subResult.nodes : [] : [subResult];
809
- nodes.push({
810
- $class: childNodeClass,
811
- nodes: childNodes
812
- });
813
- }
814
- result[thisPath.join("/")] = nodes;
815
- }
816
- }
817
- }
818
- }
819
- }
820
- return result;
821
- }
822
- async function generateAgreement(modelManager, clauseLibrary, templateMark, data, options) {
823
- const introspector = new Introspector(modelManager);
824
- const userCodeResults = await evaluateUserCode(clauseLibrary, templateMark, data, options);
825
- const listBlockResults = await generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, LISTBLOCK_DEFINITION_RE, `${CommonMarkModel.NAMESPACE}.Item`, options);
826
- const foreachBlockResults = await generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, FOREACH_DEFINITION_RE, `${CommonMarkModel.NAMESPACE}.Paragraph`, options);
827
- const optionalBlockResults = await generateOptionalBlocks(modelManager, clauseLibrary, templateMark, data, options);
828
- return traverse(templateMark).map(function(context) {
829
- let stopHere = false;
830
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
831
- const nodeClass = context.$class;
832
- const match = nodeClass.match(TEMPLATEMARK_RE);
833
- if (match && match.length > 1) {
834
- context.$class = `${CiceroMarkModel.NAMESPACE}.${match[3]}`;
835
- }
836
- if (CONTRACT_DEFINITION_RE.test(nodeClass)) {
837
- context.$class = `${CommonMarkModel.NAMESPACE}.Paragraph`;
838
- delete context.name;
839
- delete context.elementType;
840
- }
841
- if (WITH_DEFINITION_RE.test(nodeClass)) {
842
- context.$class = `${CommonMarkModel.NAMESPACE}.Paragraph`;
843
- delete context.name;
844
- delete context.elementType;
845
- } else if (FORMULA_DEFINITION_RE.test(nodeClass)) {
846
- if (context.code) {
847
- const result = userCodeResults[this.path.join("/")];
848
- if (result === null) {
849
- context.value = "<null>";
850
- } else if (typeof result === "string") {
851
- context.value = result;
852
- } else {
853
- context.value = JSON.stringify(result);
854
- }
855
- delete context.code;
856
- } else {
857
- throw new Error("Formula node is missing code.");
858
- }
859
- } else if (LISTBLOCK_DEFINITION_RE.test(nodeClass)) {
860
- context.$class = `${CommonMarkModel.NAMESPACE}.List`;
861
- delete context.elementType;
862
- delete context.name;
863
- context.nodes = listBlockResults[this.path.join("/")];
864
- stopHere = true;
865
- } else if (JOIN_DEFINITION_RE.test(nodeClass)) {
866
- const path = getJsonPath(templateMark, context, this.path);
867
- const variableValues = jp.query(data, path, 1);
868
- if (variableValues.length === 0) {
869
- throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
870
- } else {
871
- const arrayData = variableValues[0];
872
- if (!Array.isArray(arrayData)) {
873
- throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
874
- } else {
875
- context.$class = `${CommonMarkModel.NAMESPACE}.Text`;
876
- const drafter = getDrafter(context.elementType);
877
- context.text = joinList(arrayData.map((arrayItem) => {
878
- return drafter ? drafter(arrayItem, context.format) : arrayItem;
879
- }), context, options);
880
- delete context.elementType;
881
- delete context.name;
882
- delete context.separator;
883
- delete context.locale;
884
- delete context.type;
885
- delete context.style;
886
- delete context.nodes;
887
- stopHere = true;
888
- }
889
- }
890
- } else if (FOREACH_DEFINITION_RE.test(nodeClass)) {
891
- context.$class = `${CommonMarkModel.NAMESPACE}.Foreach`;
892
- delete context.elementType;
893
- delete context.name;
894
- context.nodes = foreachBlockResults[this.path.join("/")];
895
- stopHere = true;
896
- } else if (VARIABLE_DEFINITION_RE.test(nodeClass) || ENUM_VARIABLE_DEFINITION_RE.test(nodeClass) || FORMATTED_VARIABLE_DEFINITION_RE.test(nodeClass)) {
897
- if (typeof data === "object") {
898
- const path = getJsonPath(templateMark, context, this.path);
899
- const variableValues = jp.query(data, path, 1);
900
- if (variableValues.length === 0) {
901
- throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
902
- } else {
903
- const variableValue = variableValues[0];
904
- const type = ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
905
- const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
906
- context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
907
- }
908
- } else {
909
- const variableValue = data;
910
- const type = ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
911
- const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
912
- context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
913
- }
914
- } else if (CONDITIONAL_DEFINITION_RE.test(nodeClass)) {
915
- if (context.condition) {
916
- const key = this.path.join("/");
917
- const resultStr = userCodeResults[key];
918
- if (resultStr === void 0 || resultStr === null) {
919
- context.isTrue = false;
920
- } else {
921
- try {
922
- context.isTrue = !!JSON.parse(resultStr);
923
- } catch (err) {
924
- throw new Error(`Invalid JSON boolean result for condition '${key}': ${String(err)}`);
925
- }
926
- }
927
- } else {
928
- const path = getJsonPath(templateMark, context, this.path);
929
- const variableValues = jp.query(data, path, 1);
930
- if (variableValues && variableValues.length) {
931
- if (variableValues.length === 1) {
932
- context.isTrue = !!variableValues[0];
933
- } else {
934
- throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
935
- }
936
- } else {
937
- context.isTrue = false;
938
- }
939
- }
940
- context.nodes = context.isTrue ? context.whenTrue : context.whenFalse;
941
- delete context.condition;
942
- delete context.dependencies;
943
- delete context.functionName;
944
- } else if (CLAUSE_DEFINITION_RE.test(nodeClass)) {
945
- const path = getJsonPath(templateMark, context, this.path);
946
- const variableValues = jp.query(data, path, 1);
947
- if (context.condition) {
948
- checkCode(context.condition);
949
- const key = this.path.join("/");
950
- const resultStr = userCodeResults[key];
951
- let result = false;
952
- if (resultStr === void 0 || resultStr === null) {
953
- result = false;
954
- } else {
955
- try {
956
- result = !!JSON.parse(resultStr);
957
- } catch (err) {
958
- throw new Error(`Invalid JSON boolean result for condition '${key}': ${String(err)}`);
959
- }
960
- }
961
- if (!result) {
962
- delete context.nodes;
963
- stopHere = true;
964
- }
965
- } else if (context.name !== "top" && (variableValues.length === 0 || variableValues[0] === void 0 || variableValues[0] === null)) {
966
- delete context.nodes;
967
- stopHere = true;
968
- }
969
- delete context.condition;
970
- delete context.functionName;
971
- } else if (OPTIONAL_DEFINITION_RE.test(nodeClass)) {
972
- const path = getJsonPath(templateMark, context, this.path);
973
- const variableValues = jp.query(data, path, 1);
974
- if (variableValues && variableValues.length) {
975
- if (variableValues.length === 1) {
976
- context.hasSome = true;
977
- context.whenNone = [];
978
- if (optionalBlockResults[this.path.join("/")]) {
979
- context.nodes = optionalBlockResults[this.path.join("/")];
980
- context.whenSome = [];
981
- stopHere = true;
982
- } else {
983
- context.nodes = context.whenSome;
984
- }
985
- } else {
986
- throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
987
- }
988
- } else {
989
- context.hasSome = false;
990
- context.whenSome = [];
991
- context.nodes = context.whenNone;
992
- }
993
- }
994
- }
995
- this.update(context, stopHere);
996
- });
997
- }
998
- class TemplateMarkInterpreter {
999
- constructor(modelManager, clauseLibrary, templateConceptFqn) {
1000
- this.modelManager = modelManager;
1001
- this.clauseLibrary = clauseLibrary;
1002
- this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
1003
- }
1004
- /**
1005
- * Checks that a TemplateMark JSON document is valid with respect to the
1006
- * TemplateMark model, as well as the template model.
1007
- *
1008
- * Checks:
1009
- * 1. Variable names are valid properties in the template model
1010
- * 2. Optional properties have guards
1011
- * @param {*} templateMark the TemplateMark JSON object
1012
- * @returns {*} TemplateMark JSON that has been typed checked and has type metadata added
1013
- * @throws {Error} if the templateMark document is invalid
1014
- */
1015
- checkTypes(templateMark) {
1016
- const modelManager = new ModelManager();
1017
- modelManager.addCTOModel(ConcertoMetaModel.MODEL, "concertometamodel.cto");
1018
- modelManager.addCTOModel(CommonMarkModel.MODEL, "commonmark.cto");
1019
- modelManager.addCTOModel(TemplateMarkModel.MODEL, "templatemark.cto");
1020
- const factory = new Factory(modelManager);
1021
- const serializer = new Serializer(factory, modelManager, {});
1022
- try {
1023
- serializer.fromJSON(templateMark, {});
1024
- } catch (err) {
1025
- throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(templateMark, null, 2)}`);
1026
- }
1027
- const errors = [];
1028
- const templateClass = this.templateClass;
1029
- const guardBlockPaths = /* @__PURE__ */ new Map();
1030
- traverse(templateMark).forEach(function(node) {
1031
- if (!node || typeof node !== "object" || !node.$class) return;
1032
- const currentPath = this.path.join("/");
1033
- if (OPTIONAL_DEFINITION_RE.test(node.$class) || CONDITIONAL_DEFINITION_RE.test(node.$class) || WITH_DEFINITION_RE.test(node.$class)) {
1034
- guardBlockPaths.set(node.name, currentPath);
1035
- }
1036
- if (VARIABLE_DEFINITION_RE.test(node.$class) || ENUM_VARIABLE_DEFINITION_RE.test(node.$class) || FORMATTED_VARIABLE_DEFINITION_RE.test(node.$class)) {
1037
- const propName = node.name;
1038
- if (propName && propName !== "this") {
1039
- try {
1040
- const property = templateClass.getProperty(propName);
1041
- if (property && property.isOptional()) {
1042
- const guardPath = guardBlockPaths.get(propName);
1043
- const isGuarded = guardPath !== void 0 && (currentPath === guardPath || currentPath.startsWith(guardPath + "/"));
1044
- if (!isGuarded) {
1045
- errors.push({
1046
- propertyName: propName,
1047
- message: `Optional property '${propName}' is used without a guard. Wrap it in {{#optional ${propName}}}...{{/optional}} or {{#if ${propName}}}...{{/if}}.`
1048
- });
1049
- }
1050
- }
1051
- } catch {
1052
- }
1053
- }
1054
- }
1055
- });
1056
- if (errors.length > 0) {
1057
- const errorMessage = `Optional properties used without guards: ${errors.map((e) => e.propertyName).join(", ")}`;
1058
- const error = new Error(errorMessage);
1059
- error.errors = errors;
1060
- throw error;
1061
- }
1062
- return templateMark;
1063
- }
1064
- /**
1065
- * Compiles the code nodes containing TS to code nodes containing JS.
1066
- * @param {*} templateMark the TemplateMark JSON object
1067
- * @returns {*} TemplateMark JSON with JS nodes
1068
- * @throws {Error} if the templateMark document is invalid
1069
- */
1070
- async compileTypeScriptToJavaScript(templateMark) {
1071
- const clazz = templateMark.$class;
1072
- if (clazz !== DOCUMENT_ROOT) {
1073
- throw new Error(`JSON is not CommonMark. $class is '${clazz}'. ${JSON.stringify(templateMark, null, 2)}`);
1074
- }
1075
- if (!templateMark.nodes || !templateMark.nodes.length || templateMark.nodes.length < 1) {
1076
- throw new Error(`CommonMark does not have nodes: ${JSON.stringify(templateMark, null, 2)}`);
1077
- }
1078
- const firstChild = templateMark.nodes[0];
1079
- const firstChildClazz = firstChild.$class;
1080
- if (!TEMPLATEMARK_ROOT_NODES.includes(firstChildClazz)) {
1081
- throw new Error(`First child is not templatemark. $class is '${firstChildClazz}'. ${JSON.stringify(templateMark, null, 2)}`);
1082
- }
1083
- const templateConcept = firstChild.elementType;
1084
- if (!templateConcept) {
1085
- throw new Error(`First child is not typed: ${JSON.stringify(templateMark, null, 2)}`);
1086
- }
1087
- if (firstChild.name !== "top") {
1088
- throw new Error('First child is not named "top"!');
1089
- }
1090
- const compiler = new TemplateMarkToJavaScriptCompiler(this.modelManager, templateConcept);
1091
- await compiler.initialize();
1092
- return compiler.compile(templateMark);
1093
- }
1094
- validateCiceroMark(ciceroMark) {
1095
- const modelManager = new ModelManager();
1096
- modelManager.addCTOModel(ConcertoMetaModel.MODEL, "concertometamodel.cto");
1097
- modelManager.addCTOModel(CommonMarkModel.MODEL, "commonmark.cto");
1098
- modelManager.addCTOModel(CiceroMarkModel.MODEL, "ciceromark.cto");
1099
- const factory = new Factory(modelManager);
1100
- const serializer = new Serializer(factory, modelManager, {});
1101
- try {
1102
- return serializer.fromJSON(ciceroMark, {});
1103
- } catch (err) {
1104
- throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(ciceroMark, null, 2)}`);
1105
- }
1106
- }
1107
- async generate(templateMark, data, options) {
1108
- const factory = new Factory(this.modelManager);
1109
- const serializer = new Serializer(factory, this.modelManager, {});
1110
- const templateData = serializer.fromJSON(data, {});
1111
- if (templateData.getFullyQualifiedType() !== this.templateClass.getFullyQualifiedName()) {
1112
- throw new Error(`Template data must be of type '${this.templateClass.getFullyQualifiedName()}'.`);
1113
- }
1114
- const typedTemplateMark = this.checkTypes(templateMark);
1115
- const jsTemplateMark = await this.compileTypeScriptToJavaScript(typedTemplateMark);
1116
- const ciceroMark = await generateAgreement(this.modelManager, this.clauseLibrary, jsTemplateMark, data, options);
1117
- return this.validateCiceroMark(ciceroMark);
1118
- }
1119
- }
1120
-
1121
- class TemplateArchiveProcessor {
1122
- /**
1123
- * Creates a template archive processor
1124
- * @param {Template} template - the template to be used by the processor
1125
- */
1126
- constructor(template) {
1127
- this.template = template;
1128
- }
1129
- /**
1130
- * Drafts a template by merging it with data
1131
- * @param {any} data the data to merge with the template
1132
- * @param {string} format the output format
1133
- * @param {any} options merge options
1134
- * @param {[string]} currentTime the current value for 'now'
1135
- * @returns {Promise} the drafted content
1136
- */
1137
- async draft(data, format, options, currentTime) {
1138
- const metadata = this.template.getMetadata();
1139
- const templateKind = metadata.getTemplateType() !== 0 ? "clause" : "contract";
1140
- const modelManager = this.template.getModelManager();
1141
- const engine = new TemplateMarkInterpreter(modelManager, {});
1142
- const templateMarkTransformer = new TemplateMarkTransformer();
1143
- const templateMarkDom = templateMarkTransformer.fromMarkdownTemplate(
1144
- { content: this.template.getTemplate() },
1145
- modelManager,
1146
- templateKind,
1147
- { options }
1148
- );
1149
- const now = currentTime ? currentTime : (/* @__PURE__ */ new Date()).toISOString();
1150
- const ciceroMark = await engine.generate(templateMarkDom, data, { now });
1151
- const result = transform(ciceroMark.toJSON(), "ciceromark", ["ciceromark_unquoted", format], null, options);
1152
- return result;
1153
- }
1154
- /**
1155
- * Compile the logic of a template
1156
- * @param {boolean} [enableCompiledLogicCache] - whether to cache the compiled logic for future use
1157
- * @returns {Promise<Record<string, TwoSlashReturn>>} the compiled code for each typescript file
1158
- */
1159
- async compileLogic(enableCompiledLogicCache = false) {
1160
- if (enableCompiledLogicCache && this.compiledLogicCache) {
1161
- return this.compiledLogicCache;
1162
- }
1163
- const logicManager = this.template.getLogicManager();
1164
- if (logicManager.getLanguage() === "typescript") {
1165
- const compiledCode = {};
1166
- const tsFiles = logicManager.getScriptManager().getScriptsForTarget("typescript");
1167
- for (let n = 0; n < tsFiles.length; n++) {
1168
- const tsFile = tsFiles[n];
1169
- const compiler = new TypeScriptToJavaScriptCompiler(
1170
- this.template.getModelManager(),
1171
- this.template.getTemplateModel().getFullyQualifiedName()
1172
- );
1173
- await compiler.initialize();
1174
- const code = `${Buffer.from(SMART_LEGAL_CONTRACT_BASE64, "base64").toString()}
1175
- ${tsFile.getContents()}`;
1176
- const result = compiler.compile(code);
1177
- compiledCode[tsFile.getIdentifier()] = result;
1178
- }
1179
- if (enableCompiledLogicCache) {
1180
- this.compiledLogicCache = compiledCode;
1181
- }
1182
- return compiledCode;
1183
- } else {
1184
- throw new Error("Only TypeScript is supported at this time");
1185
- }
1186
- }
1187
- /**
1188
- * Trigger the logic of a template.
1189
- * @param {object} data - the data for the template
1190
- * @param {object} request - the request to send to the template logic
1191
- * @param {object} state - the current state of the template
1192
- * @param {[string]} currentTime - the current time, defaults to now
1193
- * @param {[number]} utcOffset - the UTC offset, defaults to zero
1194
- * @param {boolean} [enableCompiledLogicCache] - whether to use the compiled logic cache
1195
- * @returns {Promise<TriggerResponse>} the response and any events
1196
- */
1197
- async trigger(data, request, state, currentTime, utcOffset, enableCompiledLogicCache) {
1198
- const compiledCode = await this.compileLogic(enableCompiledLogicCache);
1199
- const resolvedTime = currentTime ?? (/* @__PURE__ */ new Date()).toISOString();
1200
- const resolvedOffset = utcOffset ?? 0;
1201
- const evaluator = new JavaScriptEvaluator();
1202
- const evalResponse = await evaluator.evalDangerously({
1203
- templateLogic: true,
1204
- verbose: false,
1205
- functionName: "trigger",
1206
- code: compiledCode["logic/logic.ts"].code,
1207
- // TODO DCS - how to find the code to run?
1208
- argumentNames: ["data", "request", "state"],
1209
- arguments: [data, request, state, resolvedTime, resolvedOffset]
1210
- });
1211
- if (evalResponse.result) {
1212
- return evalResponse.result;
1213
- } else {
1214
- throw new Error("Trigger failed with message: " + evalResponse.message);
1215
- }
1216
- }
1217
- /**
1218
- * Init the logic of a template.
1219
- * @param {object} data - the data for the template
1220
- * @param {[string]} currentTime - the current time, defaults to now
1221
- * @param {[number]} utcOffset - the UTC offset, defaults to zero
1222
- * @param {boolean} [enableCompiledLogicCache] - whether to use the compiled logic cache
1223
- * @returns {Promise<InitResponse>} the new state
1224
- */
1225
- async init(data, currentTime, utcOffset, enableCompiledLogicCache) {
1226
- const compiledCode = await this.compileLogic(enableCompiledLogicCache);
1227
- const resolvedTime = currentTime ?? (/* @__PURE__ */ new Date()).toISOString();
1228
- const resolvedOffset = utcOffset ?? 0;
1229
- const evaluator = new JavaScriptEvaluator();
1230
- const evalResponse = await evaluator.evalDangerously({
1231
- templateLogic: true,
1232
- verbose: false,
1233
- functionName: "init",
1234
- code: compiledCode["logic/logic.ts"].code,
1235
- // TODO DCS - how to find the code to run?
1236
- argumentNames: ["data"],
1237
- arguments: [data, resolvedTime, resolvedOffset]
1238
- });
1239
- if (evalResponse.result) {
1240
- return evalResponse.result;
1241
- } else {
1242
- throw new Error("Init failed with message: " + evalResponse.message);
1243
- }
1244
- }
1245
- }
1246
-
1247
- export { TemplateArchiveProcessor, TemplateMarkInterpreter, ensureDirSync, getTemplateClassDeclaration, nameUserCode, removeSync, writeFunctionToString };
1248
- //# sourceMappingURL=index.mjs.map