occam-verify-cli 0.0.449 → 0.0.451

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.
@@ -2,46 +2,79 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ default: function() {
8
13
  return verifyTerm;
14
+ },
15
+ verifyTermAsVariable: function() {
16
+ return verifyTermAsVariable;
17
+ },
18
+ verifyTermAgainstConstructors: function() {
19
+ return verifyTermAgainstConstructors;
9
20
  }
10
21
  });
11
- var _termAsVariable = /*#__PURE__*/ _interopRequireDefault(require("../verify/termAsVariable"));
12
22
  var _array = require("../utilities/array");
13
23
  var _string = require("../utilities/string");
14
24
  var _ruleNames = require("../ruleNames");
15
25
  var _query = require("../utilities/query");
16
- function _interopRequireDefault(obj) {
17
- return obj && obj.__esModule ? obj : {
18
- default: obj
19
- };
20
- }
21
- var termNodeQuery = (0, _query.nodeQuery)("/argument/term!"), typeNodeQuery = (0, _query.nodeQuery)("/argument/type!");
26
+ var termNodeQuery = (0, _query.nodeQuery)("/argument/term!"), typeNodeQuery = (0, _query.nodeQuery)("/argument/type!"), variableNodeQuery = (0, _query.nodeQuery)("/term/variable!");
22
27
  function verifyTerm(termNode, types, values, context) {
23
28
  var termVerified = false;
24
29
  context.begin(termNode);
25
- var names = [], termVerifiedAsVariable = (0, _termAsVariable.default)(termNode, types, names, values, context);
30
+ var termVerifiedAsVariable = verifyTermAsVariable(termNode, types, values, context);
26
31
  if (termVerifiedAsVariable) {
27
32
  termVerified = true;
28
33
  } else {
29
- var constructors = context.getConstructors(), constructor = constructors.find(function(constructor) {
30
- var termVerifiedAgainstConstructor = verifyTermAgainstConstructor(termNode, constructor, context);
31
- if (termVerifiedAgainstConstructor) {
32
- return true;
33
- }
34
- }) || null;
35
- if (constructor !== null) {
36
- var type = constructor.getType(), value = termNode; ///
37
- types.push(type);
38
- values.push(value);
34
+ var termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types, values, context);
35
+ if (termVerifiedAgainstConstructors) {
39
36
  termVerified = true;
40
37
  }
41
38
  }
42
39
  termVerified ? context.complete(termNode) : context.halt(termNode);
43
40
  return termVerified;
44
41
  }
42
+ function verifyTermAsVariable(termNode, types, values, context) {
43
+ var termVerifiedAsVariable = false;
44
+ context.begin(termNode);
45
+ var variableNode = variableNodeQuery(termNode);
46
+ if (variableNode !== null) {
47
+ var variableName = (0, _query.variableNameFromVariableNode)(variableNode), variablePresent = context.isVariablePresentByVariableName(variableName);
48
+ if (!variablePresent) {
49
+ context.error("The ".concat(variableName, " variable is not present."));
50
+ } else {
51
+ var variable = context.findVariableByVariableName(variableName), type = variable.getType(), value = variable.getValue();
52
+ types.push(type);
53
+ values.push(value);
54
+ termVerifiedAsVariable = true;
55
+ }
56
+ }
57
+ termVerifiedAsVariable ? context.complete(termNode) : context.halt(termNode);
58
+ return termVerifiedAsVariable;
59
+ }
60
+ function verifyTermAgainstConstructors(termNode, types, values, context) {
61
+ var termVerifiedAgainstConstructors = false;
62
+ context.begin(termNode);
63
+ var constructors = context.getConstructors(), constructor = constructors.find(function(constructor) {
64
+ var termVerifiedAgainstConstructor = verifyTermAgainstConstructor(termNode, constructor, context);
65
+ if (termVerifiedAgainstConstructor) {
66
+ return true;
67
+ }
68
+ }) || null;
69
+ if (constructor !== null) {
70
+ var type = constructor.getType(), value = termNode; ///
71
+ types.push(type);
72
+ values.push(value);
73
+ termVerifiedAgainstConstructors = true;
74
+ }
75
+ termVerifiedAgainstConstructors ? context.complete(termNode) : context.halt(termNode);
76
+ return termVerifiedAgainstConstructors;
77
+ }
45
78
  function verifyTermAgainstConstructor(termNode, constructor, context) {
46
79
  var constructorTermNode = constructor.getTermNode(), node = termNode, constructorNode = constructorTermNode, nodeVerified = verifyNode(node, constructorNode, context), termVerifiedAgainstConstructor = nodeVerified; ///
47
80
  return termVerifiedAgainstConstructor;
@@ -120,4 +153,4 @@ function verifyArgumentNode(argumentNode, constructorArgumentNode, context) {
120
153
  return argumentNodeVerified;
121
154
  }
122
155
 
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvdGVybS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHZlcmlmeVRlcm1Bc1ZhcmlhYmxlIGZyb20gXCIuLi92ZXJpZnkvdGVybUFzVmFyaWFibGVcIjtcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2FycmF5XCI7XG5pbXBvcnQgeyBub2RlQXNTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgQVJHVU1FTlRfUlVMRV9OQU1FIH0gZnJvbSBcIi4uL3J1bGVOYW1lc1wiO1xuaW1wb3J0IHsgbm9kZVF1ZXJ5LCB0eXBlTmFtZUZyb21UeXBlTm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvcXVlcnlcIjtcblxuY29uc3QgdGVybU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9hcmd1bWVudC90ZXJtIVwiKSxcbiAgICAgIHR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvYXJndW1lbnQvdHlwZSFcIilcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5VGVybSh0ZXJtTm9kZSwgdHlwZXMsIHZhbHVlcywgY29udGV4dCkge1xuICBsZXQgdGVybVZlcmlmaWVkID0gZmFsc2U7XG5cbiAgY29udGV4dC5iZWdpbih0ZXJtTm9kZSk7XG5cbiAgY29uc3QgbmFtZXMgPSBbXSxcbiAgICAgICAgdGVybVZlcmlmaWVkQXNWYXJpYWJsZSA9IHZlcmlmeVRlcm1Bc1ZhcmlhYmxlKHRlcm1Ob2RlLCB0eXBlcywgbmFtZXMsIHZhbHVlcywgY29udGV4dCk7XG5cbiAgaWYgKHRlcm1WZXJpZmllZEFzVmFyaWFibGUpIHtcbiAgICB0ZXJtVmVyaWZpZWQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9ycyA9IGNvbnRleHQuZ2V0Q29uc3RydWN0b3JzKCksXG4gICAgICAgICAgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnMuZmluZCgoY29uc3RydWN0b3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3RvciA9IHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3IodGVybU5vZGUsIGNvbnN0cnVjdG9yLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKHRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKGNvbnN0cnVjdG9yICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB0eXBlID0gY29uc3RydWN0b3IuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgdmFsdWUgPSB0ZXJtTm9kZTsgLy8vXG5cbiAgICAgIHR5cGVzLnB1c2godHlwZSk7XG5cbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcblxuICAgICAgdGVybVZlcmlmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB0ZXJtVmVyaWZpZWQgP1xuICAgIGNvbnRleHQuY29tcGxldGUodGVybU5vZGUpIDpcbiAgICAgIGNvbnRleHQuaGFsdCh0ZXJtTm9kZSk7XG5cbiAgcmV0dXJuIHRlcm1WZXJpZmllZDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3Rvcih0ZXJtTm9kZSwgY29uc3RydWN0b3IsIGNvbnRleHQpIHtcbiAgY29uc3QgY29uc3RydWN0b3JUZXJtTm9kZSA9IGNvbnN0cnVjdG9yLmdldFRlcm1Ob2RlKCksXG4gICAgICAgIG5vZGUgPSB0ZXJtTm9kZSwgIC8vL1xuICAgICAgICBjb25zdHJ1Y3Rvck5vZGUgPSBjb25zdHJ1Y3RvclRlcm1Ob2RlLCAvLy9cbiAgICAgICAgbm9kZVZlcmlmaWVkID0gdmVyaWZ5Tm9kZShub2RlLCBjb25zdHJ1Y3Rvck5vZGUsIGNvbnRleHQpLFxuICAgICAgICB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3IgPSBub2RlVmVyaWZpZWQ7ICAvLy9cblxuICByZXR1cm4gdGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlOb2RlKG5vZGUsIGNvbnN0cnVjdG9yTm9kZSwgY29udGV4dCkge1xuICBsZXQgbm9kZVZlcmlmaWVkO1xuXG4gIGNvbnN0IG5vZGVUZXJtaW5hbE5vZGUgPSBub2RlLmlzVGVybWluYWxOb2RlKCksXG4gICAgICAgIGNvbnN0cnVjdG9yTm9kZVRlcm1pbmFsTm9kZSA9IGNvbnN0cnVjdG9yTm9kZS5pc1Rlcm1pbmFsTm9kZSgpO1xuXG4gIGlmIChub2RlVGVybWluYWxOb2RlID09PSBjb25zdHJ1Y3Rvck5vZGVUZXJtaW5hbE5vZGUpIHtcbiAgICBpZiAobm9kZVRlcm1pbmFsTm9kZSkge1xuICAgICAgY29uc3QgdGVybWluYWxOb2RlID0gbm9kZSwgIC8vL1xuICAgICAgICAgICAgY29uc3RydWN0b3JUZXJtaW5hbE5vZGUgPSBjb25zdHJ1Y3Rvck5vZGUsICAvLy9cbiAgICAgICAgICAgIHRlcm1pbmFsTm9kZVZlcmlmaWVkID0gdmVyaWZ5VGVybWluYWxOb2RlKHRlcm1pbmFsTm9kZSwgY29uc3RydWN0b3JUZXJtaW5hbE5vZGUsIGNvbnRleHQpO1xuXG4gICAgICBub2RlVmVyaWZpZWQgPSB0ZXJtaW5hbE5vZGVWZXJpZmllZDsgIC8vL1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBub2RlLCAvLy9cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yTm9uVGVybWluYWxOb2RlID0gY29uc3RydWN0b3JOb2RlLCAgLy8vXG4gICAgICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IHZlcmlmeU5vblRlcm1pbmFsTm9kZShub25UZXJtaW5hbE5vZGUsIGNvbnN0cnVjdG9yTm9uVGVybWluYWxOb2RlLCBjb250ZXh0KTtcblxuICAgICAgbm9kZVZlcmlmaWVkID0gbm9uVGVybWluYWxOb2RlVmVyaWZpZWQ7IC8vL1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlVmVyaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUNoaWxkTm9kZXMoY2hpbGROb2RlcywgY29uc3RydWN0b3JDaGlsZE5vZGVzLCBjb250ZXh0KSB7XG4gIGxldCBjaGlsZE5vZGVzVmVyaWZpZWQgPSBmYWxzZTtcblxuICBjb25zdCBjaGlsZE5vZGVzTGVuZ3RoID0gY2hpbGROb2Rlcy5sZW5ndGgsXG4gICAgICAgIGNvbnN0cnVjdG9yQ2hpbGROb2Rlc0xlbmd0aCA9IGNvbnN0cnVjdG9yQ2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgaWYgKGNoaWxkTm9kZXNMZW5ndGggPT09IGNvbnN0cnVjdG9yQ2hpbGROb2Rlc0xlbmd0aCkge1xuICAgIGNoaWxkTm9kZXNWZXJpZmllZCA9IGNoaWxkTm9kZXMuZXZlcnkoKGNoaWxkTm9kZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yQ2hpbGROb2RlID0gY29uc3RydWN0b3JDaGlsZE5vZGVzW2luZGV4XSxcbiAgICAgICAgICAgIG5vZGUgPSBjaGlsZE5vZGUsIC8vL1xuICAgICAgICAgICAgY29uc3RydWN0b3JOb2RlID0gY29uc3RydWN0b3JDaGlsZE5vZGUsICAvLy9cbiAgICAgICAgICAgIG5vZGVWZXJpZmllZCA9IHZlcmlmeU5vZGUobm9kZSwgY29uc3RydWN0b3JOb2RlLCBjb250ZXh0KTtcblxuICAgICAgaWYgKG5vZGVWZXJpZmllZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZE5vZGVzVmVyaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVRlcm1pbmFsTm9kZSh0ZXJtaW5hbE5vZGUsIGNvbnN0cnVjdG9yVGVybWluYWxOb2RlLCBjb250ZXh0KSB7XG4gIGxldCB0ZXJtaW5hbE5vZGVWZXJpZmllZCA9IGZhbHNlO1xuXG4gIGNvbnN0IG1hdGNoZXMgPSB0ZXJtaW5hbE5vZGUubWF0Y2goY29uc3RydWN0b3JUZXJtaW5hbE5vZGUpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgdGVybWluYWxOb2RlVmVyaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRlcm1pbmFsTm9kZVZlcmlmaWVkO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlOb25UZXJtaW5hbE5vZGUobm9uVGVybWluYWxOb2RlLCBjb25zdHJ1Y3Rvck5vblRlcm1pbmFsTm9kZSwgY29udGV4dCkge1xuICBsZXQgbm9uVGVybWluYWxOb2RlVmVyaWZpZWQgPSBmYWxzZTtcblxuICBjb25zdCBydWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLFxuICAgICAgICBjb25zdHJ1Y3RvclJ1bGVOYW1lID0gY29uc3RydWN0b3JOb25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKTtcblxuICBpZiAocnVsZU5hbWUgPT09IGNvbnN0cnVjdG9yUnVsZU5hbWUpIHtcbiAgICBzd2l0Y2ggKHJ1bGVOYW1lKSB7XG4gICAgICBjYXNlIEFSR1VNRU5UX1JVTEVfTkFNRToge1xuICAgICAgICBjb25zdCBhcmd1bWVudE5vZGUgPSBub25UZXJtaW5hbE5vZGUsIC8vL1xuICAgICAgICAgICAgICBjb25zdHJ1Y3RvckFyZ3VtZW50Tm9kZSA9IGNvbnN0cnVjdG9yTm9uVGVybWluYWxOb2RlLCAvLy9cbiAgICAgICAgICAgICAgYXJndW1lbnROb2RlVmVyaWZpZWQgPSB2ZXJpZnlBcmd1bWVudE5vZGUoYXJndW1lbnROb2RlLCBjb25zdHJ1Y3RvckFyZ3VtZW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICAgICAgbm9uVGVybWluYWxOb2RlVmVyaWZpZWQgPSBhcmd1bWVudE5vZGVWZXJpZmllZDsgLy8vXG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IG5vblRlcm1pbmFsTm9kZS5nZXRDaGlsZE5vZGVzKCksXG4gICAgICAgICAgICAgIGNvbnN0cnVjdG9yQ2hpbGROb2RlcyA9IGNvbnN0cnVjdG9yTm9uVGVybWluYWxOb2RlLmdldENoaWxkTm9kZXMoKSxcbiAgICAgICAgICAgICAgY2hpbGROb2Rlc1ZlcmlmaWVkID0gdmVyaWZ5Q2hpbGROb2RlcyhjaGlsZE5vZGVzLCBjb25zdHJ1Y3RvckNoaWxkTm9kZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkID0gY2hpbGROb2Rlc1ZlcmlmaWVkOyAvLy9cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9uVGVybWluYWxOb2RlVmVyaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUFyZ3VtZW50Tm9kZShhcmd1bWVudE5vZGUsIGNvbnN0cnVjdG9yQXJndW1lbnROb2RlLCBjb250ZXh0KSB7XG4gIGxldCBhcmd1bWVudE5vZGVWZXJpZmllZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHRlcm1Ob2RlID0gdGVybU5vZGVRdWVyeShhcmd1bWVudE5vZGUpO1xuXG4gIGlmICh0ZXJtTm9kZSA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGFyZ3VtZW50U3RyaW5nID0gbm9kZUFzU3RyaW5nKGFyZ3VtZW50Tm9kZSk7XG5cbiAgICBjb250ZXh0LmVycm9yKGBUaGUgJHthcmd1bWVudFN0cmluZ30gYXJndW1lbnQgc2hvdWxkIGJlIGEgdGVybSwgbm90IGEgdHlwZWApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHR5cGVzID0gW10sXG4gICAgICAgICAgdmFsdWVzID0gW10sXG4gICAgICAgICAgdGVybVZlcmlmaWVkID0gdmVyaWZ5VGVybSh0ZXJtTm9kZSwgdHlwZXMsIHZhbHVlcywgY29udGV4dCk7XG5cbiAgICBpZiAodGVybVZlcmlmaWVkKSB7XG4gICAgICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCh0eXBlcyksXG4gICAgICAgICAgICB0ZXJtVHlwZSA9IGZpcnN0VHlwZSwgLy8vXG4gICAgICAgICAgICB0eXBlTm9kZSA9IHR5cGVOb2RlUXVlcnkoY29uc3RydWN0b3JBcmd1bWVudE5vZGUpLFxuICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZUZyb21UeXBlTm9kZSh0eXBlTm9kZSksXG4gICAgICAgICAgICB0eXBlID0gY29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpLFxuICAgICAgICAgICAgdGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlID0gdGVybVR5cGUuaXNFcXVhbFRvT3JTdWJUeXBlT2YodHlwZSk7XG5cbiAgICAgIGlmICh0ZXJtVHlwZUVxdWFsVG9PclN1YlR5cGVPZlR5cGUpIHtcbiAgICAgICAgYXJndW1lbnROb2RlVmVyaWZpZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcmd1bWVudE5vZGVWZXJpZmllZDtcbn1cbiJdLCJuYW1lcyI6WyJ2ZXJpZnlUZXJtIiwidGVybU5vZGVRdWVyeSIsIm5vZGVRdWVyeSIsInR5cGVOb2RlUXVlcnkiLCJ0ZXJtTm9kZSIsInR5cGVzIiwidmFsdWVzIiwiY29udGV4dCIsInRlcm1WZXJpZmllZCIsImJlZ2luIiwibmFtZXMiLCJ0ZXJtVmVyaWZpZWRBc1ZhcmlhYmxlIiwidmVyaWZ5VGVybUFzVmFyaWFibGUiLCJjb25zdHJ1Y3RvcnMiLCJnZXRDb25zdHJ1Y3RvcnMiLCJjb25zdHJ1Y3RvciIsImZpbmQiLCJ0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3IiLCJ2ZXJpZnlUZXJtQWdhaW5zdENvbnN0cnVjdG9yIiwidHlwZSIsImdldFR5cGUiLCJ2YWx1ZSIsInB1c2giLCJjb21wbGV0ZSIsImhhbHQiLCJjb25zdHJ1Y3RvclRlcm1Ob2RlIiwiZ2V0VGVybU5vZGUiLCJub2RlIiwiY29uc3RydWN0b3JOb2RlIiwibm9kZVZlcmlmaWVkIiwidmVyaWZ5Tm9kZSIsIm5vZGVUZXJtaW5hbE5vZGUiLCJpc1Rlcm1pbmFsTm9kZSIsImNvbnN0cnVjdG9yTm9kZVRlcm1pbmFsTm9kZSIsInRlcm1pbmFsTm9kZSIsImNvbnN0cnVjdG9yVGVybWluYWxOb2RlIiwidGVybWluYWxOb2RlVmVyaWZpZWQiLCJ2ZXJpZnlUZXJtaW5hbE5vZGUiLCJub25UZXJtaW5hbE5vZGUiLCJjb25zdHJ1Y3Rvck5vblRlcm1pbmFsTm9kZSIsIm5vblRlcm1pbmFsTm9kZVZlcmlmaWVkIiwidmVyaWZ5Tm9uVGVybWluYWxOb2RlIiwidmVyaWZ5Q2hpbGROb2RlcyIsImNoaWxkTm9kZXMiLCJjb25zdHJ1Y3RvckNoaWxkTm9kZXMiLCJjaGlsZE5vZGVzVmVyaWZpZWQiLCJjaGlsZE5vZGVzTGVuZ3RoIiwibGVuZ3RoIiwiY29uc3RydWN0b3JDaGlsZE5vZGVzTGVuZ3RoIiwiZXZlcnkiLCJjaGlsZE5vZGUiLCJpbmRleCIsImNvbnN0cnVjdG9yQ2hpbGROb2RlIiwibWF0Y2hlcyIsIm1hdGNoIiwicnVsZU5hbWUiLCJnZXRSdWxlTmFtZSIsImNvbnN0cnVjdG9yUnVsZU5hbWUiLCJBUkdVTUVOVF9SVUxFX05BTUUiLCJhcmd1bWVudE5vZGUiLCJjb25zdHJ1Y3RvckFyZ3VtZW50Tm9kZSIsImFyZ3VtZW50Tm9kZVZlcmlmaWVkIiwidmVyaWZ5QXJndW1lbnROb2RlIiwiZ2V0Q2hpbGROb2RlcyIsImFyZ3VtZW50U3RyaW5nIiwibm9kZUFzU3RyaW5nIiwiZXJyb3IiLCJmaXJzdFR5cGUiLCJmaXJzdCIsInRlcm1UeXBlIiwidHlwZU5vZGUiLCJ0eXBlTmFtZSIsInR5cGVOYW1lRnJvbVR5cGVOb2RlIiwiZmluZFR5cGVCeVR5cGVOYW1lIiwidGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlIiwiaXNFcXVhbFRvT3JTdWJUeXBlT2YiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVlBOzs7ZUFBd0JBOzs7bUVBVlM7cUJBRVg7c0JBQ087eUJBQ007cUJBQ2E7Ozs7OztBQUVoRCxJQUFNQyxnQkFBZ0JDLElBQUFBLGdCQUFTLEVBQUMsb0JBQzFCQyxnQkFBZ0JELElBQUFBLGdCQUFTLEVB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
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvdGVybS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2FycmF5XCI7XG5pbXBvcnQgeyBub2RlQXNTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgQVJHVU1FTlRfUlVMRV9OQU1FIH0gZnJvbSBcIi4uL3J1bGVOYW1lc1wiO1xuaW1wb3J0IHsgbm9kZVF1ZXJ5LCB0eXBlTmFtZUZyb21UeXBlTm9kZSwgdmFyaWFibGVOYW1lRnJvbVZhcmlhYmxlTm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvcXVlcnlcIjtcblxuY29uc3QgdGVybU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9hcmd1bWVudC90ZXJtIVwiKSxcbiAgICAgIHR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvYXJndW1lbnQvdHlwZSFcIiksXG4gICAgICB2YXJpYWJsZU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi90ZXJtL3ZhcmlhYmxlIVwiKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5VGVybSh0ZXJtTm9kZSwgdHlwZXMsIHZhbHVlcywgY29udGV4dCkge1xuICBsZXQgdGVybVZlcmlmaWVkID0gZmFsc2U7XG5cbiAgY29udGV4dC5iZWdpbih0ZXJtTm9kZSk7XG5cbiAgY29uc3QgdGVybVZlcmlmaWVkQXNWYXJpYWJsZSA9IHZlcmlmeVRlcm1Bc1ZhcmlhYmxlKHRlcm1Ob2RlLCB0eXBlcywgdmFsdWVzLCBjb250ZXh0KTtcblxuICBpZiAodGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgIHRlcm1WZXJpZmllZCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9ycyA9IHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzKHRlcm1Ob2RlLCB0eXBlcywgdmFsdWVzLCBjb250ZXh0KTtcblxuICAgIGlmICh0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzKSB7XG4gICAgICB0ZXJtVmVyaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRlcm1WZXJpZmllZCA/XG4gICAgY29udGV4dC5jb21wbGV0ZSh0ZXJtTm9kZSkgOlxuICAgICAgY29udGV4dC5oYWx0KHRlcm1Ob2RlKTtcblxuICByZXR1cm4gdGVybVZlcmlmaWVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5VGVybUFzVmFyaWFibGUodGVybU5vZGUsIHR5cGVzLCB2YWx1ZXMsIGNvbnRleHQpIHtcbiAgbGV0IHRlcm1WZXJpZmllZEFzVmFyaWFibGUgPSBmYWxzZTtcblxuICBjb250ZXh0LmJlZ2luKHRlcm1Ob2RlKTtcblxuICBjb25zdCB2YXJpYWJsZU5vZGUgPSB2YXJpYWJsZU5vZGVRdWVyeSh0ZXJtTm9kZSk7XG5cbiAgaWYgKHZhcmlhYmxlTm9kZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlTmFtZUZyb21WYXJpYWJsZU5vZGUodmFyaWFibGVOb2RlKSxcbiAgICAgICAgICB2YXJpYWJsZVByZXNlbnQgPSBjb250ZXh0LmlzVmFyaWFibGVQcmVzZW50QnlWYXJpYWJsZU5hbWUodmFyaWFibGVOYW1lKTtcblxuICAgIGlmICghdmFyaWFibGVQcmVzZW50KSB7XG4gICAgICBjb250ZXh0LmVycm9yKGBUaGUgJHt2YXJpYWJsZU5hbWV9IHZhcmlhYmxlIGlzIG5vdCBwcmVzZW50LmApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlID0gY29udGV4dC5maW5kVmFyaWFibGVCeVZhcmlhYmxlTmFtZSh2YXJpYWJsZU5hbWUpLFxuICAgICAgICB0eXBlID0gdmFyaWFibGUuZ2V0VHlwZSgpLFxuICAgICAgICB2YWx1ZSA9IHZhcmlhYmxlLmdldFZhbHVlKCk7XG5cbiAgICAgIHR5cGVzLnB1c2godHlwZSk7XG5cbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcblxuICAgICAgdGVybVZlcmlmaWVkQXNWYXJpYWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGVybVZlcmlmaWVkQXNWYXJpYWJsZSA/XG4gICAgY29udGV4dC5jb21wbGV0ZSh0ZXJtTm9kZSkgOlxuICAgICAgY29udGV4dC5oYWx0KHRlcm1Ob2RlKTtcblxuICByZXR1cm4gdGVybVZlcmlmaWVkQXNWYXJpYWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzKHRlcm1Ob2RlLCB0eXBlcywgdmFsdWVzLCBjb250ZXh0KSB7XG4gIGxldCB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzID0gZmFsc2U7XG5cbiAgY29udGV4dC5iZWdpbih0ZXJtTm9kZSk7XG5cbiAgY29uc3QgY29uc3RydWN0b3JzID0gY29udGV4dC5nZXRDb25zdHJ1Y3RvcnMoKSxcbiAgICAgICAgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnMuZmluZCgoY29uc3RydWN0b3IpID0+IHtcbiAgICAgICAgICBjb25zdCB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3IgPSB2ZXJpZnlUZXJtQWdhaW5zdENvbnN0cnVjdG9yKHRlcm1Ob2RlLCBjb25zdHJ1Y3RvciwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAodGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pIHx8IG51bGw7XG5cbiAgaWYgKGNvbnN0cnVjdG9yICE9PSBudWxsKSB7XG4gICAgY29uc3QgdHlwZSA9IGNvbnN0cnVjdG9yLmdldFR5cGUoKSxcbiAgICAgICAgICB2YWx1ZSA9IHRlcm1Ob2RlOyAvLy9cblxuICAgIHR5cGVzLnB1c2godHlwZSk7XG5cbiAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG5cbiAgICB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzID0gdHJ1ZTtcbiAgfVxuXG4gIHRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3RvcnMgP1xuICAgIGNvbnRleHQuY29tcGxldGUodGVybU5vZGUpIDpcbiAgICAgIGNvbnRleHQuaGFsdCh0ZXJtTm9kZSk7XG5cbiAgcmV0dXJuIHRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3RvcnM7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3IodGVybU5vZGUsIGNvbnN0cnVjdG9yLCBjb250ZXh0KSB7XG4gIGNvbnN0IGNvbnN0cnVjdG9yVGVybU5vZGUgPSBjb25zdHJ1Y3Rvci5nZXRUZXJtTm9kZSgpLFxuICAgICAgICBub2RlID0gdGVybU5vZGUsICAvLy9cbiAgICAgICAgY29uc3RydWN0b3JOb2RlID0gY29uc3RydWN0b3JUZXJtTm9kZSwgLy8vXG4gICAgICAgIG5vZGVWZXJpZmllZCA9IHZlcmlmeU5vZGUobm9kZSwgY29uc3RydWN0b3JOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgdGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9yID0gbm9kZVZlcmlmaWVkOyAgLy8vXG5cbiAgcmV0dXJuIHRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5Tm9kZShub2RlLCBjb25zdHJ1Y3Rvck5vZGUsIGNvbnRleHQpIHtcbiAgbGV0IG5vZGVWZXJpZmllZDtcblxuICBjb25zdCBub2RlVGVybWluYWxOb2RlID0gbm9kZS5pc1Rlcm1pbmFsTm9kZSgpLFxuICAgICAgICBjb25zdHJ1Y3Rvck5vZGVUZXJtaW5hbE5vZGUgPSBjb25zdHJ1Y3Rvck5vZGUuaXNUZXJtaW5hbE5vZGUoKTtcblxuICBpZiAobm9kZVRlcm1pbmFsTm9kZSA9PT0gY29uc3RydWN0b3JOb2RlVGVybWluYWxOb2RlKSB7XG4gICAgaWYgKG5vZGVUZXJtaW5hbE5vZGUpIHtcbiAgICAgIGNvbnN0IHRlcm1pbmFsTm9kZSA9IG5vZGUsICAvLy9cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yVGVybWluYWxOb2RlID0gY29uc3RydWN0b3JOb2RlLCAgLy8vXG4gICAgICAgICAgICB0ZXJtaW5hbE5vZGVWZXJpZmllZCA9IHZlcmlmeVRlcm1pbmFsTm9kZSh0ZXJtaW5hbE5vZGUsIGNvbnN0cnVjdG9yVGVybWluYWxOb2RlLCBjb250ZXh0KTtcblxuICAgICAgbm9kZVZlcmlmaWVkID0gdGVybWluYWxOb2RlVmVyaWZpZWQ7ICAvLy9cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gbm9kZSwgLy8vXG4gICAgICAgICAgICBjb25zdHJ1Y3Rvck5vblRlcm1pbmFsTm9kZSA9IGNvbnN0cnVjdG9yTm9kZSwgIC8vL1xuICAgICAgICAgICAgbm9uVGVybWluYWxOb2RlVmVyaWZpZWQgPSB2ZXJpZnlOb25UZXJtaW5hbE5vZGUobm9uVGVybWluYWxOb2RlLCBjb25zdHJ1Y3Rvck5vblRlcm1pbmFsTm9kZSwgY29udGV4dCk7XG5cbiAgICAgIG5vZGVWZXJpZmllZCA9IG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkOyAvLy9cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZVZlcmlmaWVkO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlDaGlsZE5vZGVzKGNoaWxkTm9kZXMsIGNvbnN0cnVjdG9yQ2hpbGROb2RlcywgY29udGV4dCkge1xuICBsZXQgY2hpbGROb2Rlc1ZlcmlmaWVkID0gZmFsc2U7XG5cbiAgY29uc3QgY2hpbGROb2Rlc0xlbmd0aCA9IGNoaWxkTm9kZXMubGVuZ3RoLFxuICAgICAgICBjb25zdHJ1Y3RvckNoaWxkTm9kZXNMZW5ndGggPSBjb25zdHJ1Y3RvckNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gIGlmIChjaGlsZE5vZGVzTGVuZ3RoID09PSBjb25zdHJ1Y3RvckNoaWxkTm9kZXNMZW5ndGgpIHtcbiAgICBjaGlsZE5vZGVzVmVyaWZpZWQgPSBjaGlsZE5vZGVzLmV2ZXJ5KChjaGlsZE5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvckNoaWxkTm9kZSA9IGNvbnN0cnVjdG9yQ2hpbGROb2Rlc1tpbmRleF0sXG4gICAgICAgICAgICBub2RlID0gY2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yTm9kZSA9IGNvbnN0cnVjdG9yQ2hpbGROb2RlLCAgLy8vXG4gICAgICAgICAgICBub2RlVmVyaWZpZWQgPSB2ZXJpZnlOb2RlKG5vZGUsIGNvbnN0cnVjdG9yTm9kZSwgY29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY2hpbGROb2Rlc1ZlcmlmaWVkO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlUZXJtaW5hbE5vZGUodGVybWluYWxOb2RlLCBjb25zdHJ1Y3RvclRlcm1pbmFsTm9kZSwgY29udGV4dCkge1xuICBsZXQgdGVybWluYWxOb2RlVmVyaWZpZWQgPSBmYWxzZTtcblxuICBjb25zdCBtYXRjaGVzID0gdGVybWluYWxOb2RlLm1hdGNoKGNvbnN0cnVjdG9yVGVybWluYWxOb2RlKTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIHRlcm1pbmFsTm9kZVZlcmlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0ZXJtaW5hbE5vZGVWZXJpZmllZDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5Tm9uVGVybWluYWxOb2RlKG5vblRlcm1pbmFsTm9kZSwgY29uc3RydWN0b3JOb25UZXJtaW5hbE5vZGUsIGNvbnRleHQpIHtcbiAgbGV0IG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkID0gZmFsc2U7XG5cbiAgY29uc3QgcnVsZU5hbWUgPSBub25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKSxcbiAgICAgICAgY29uc3RydWN0b3JSdWxlTmFtZSA9IGNvbnN0cnVjdG9yTm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCk7XG5cbiAgaWYgKHJ1bGVOYW1lID09PSBjb25zdHJ1Y3RvclJ1bGVOYW1lKSB7XG4gICAgc3dpdGNoIChydWxlTmFtZSkge1xuICAgICAgY2FzZSBBUkdVTUVOVF9SVUxFX05BTUU6IHtcbiAgICAgICAgY29uc3QgYXJndW1lbnROb2RlID0gbm9uVGVybWluYWxOb2RlLCAvLy9cbiAgICAgICAgICAgICAgY29uc3RydWN0b3JBcmd1bWVudE5vZGUgPSBjb25zdHJ1Y3Rvck5vblRlcm1pbmFsTm9kZSwgLy8vXG4gICAgICAgICAgICAgIGFyZ3VtZW50Tm9kZVZlcmlmaWVkID0gdmVyaWZ5QXJndW1lbnROb2RlKGFyZ3VtZW50Tm9kZSwgY29uc3RydWN0b3JBcmd1bWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgICAgIG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkID0gYXJndW1lbnROb2RlVmVyaWZpZWQ7IC8vL1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBub25UZXJtaW5hbE5vZGUuZ2V0Q2hpbGROb2RlcygpLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvckNoaWxkTm9kZXMgPSBjb25zdHJ1Y3Rvck5vblRlcm1pbmFsTm9kZS5nZXRDaGlsZE5vZGVzKCksXG4gICAgICAgICAgICAgIGNoaWxkTm9kZXNWZXJpZmllZCA9IHZlcmlmeUNoaWxkTm9kZXMoY2hpbGROb2RlcywgY29uc3RydWN0b3JDaGlsZE5vZGVzLCBjb250ZXh0KTtcblxuICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IGNoaWxkTm9kZXNWZXJpZmllZDsgLy8vXG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlBcmd1bWVudE5vZGUoYXJndW1lbnROb2RlLCBjb25zdHJ1Y3RvckFyZ3VtZW50Tm9kZSwgY29udGV4dCkge1xuICBsZXQgYXJndW1lbnROb2RlVmVyaWZpZWQgPSBmYWxzZTtcblxuICBjb25zdCB0ZXJtTm9kZSA9IHRlcm1Ob2RlUXVlcnkoYXJndW1lbnROb2RlKTtcblxuICBpZiAodGVybU5vZGUgPT09IG51bGwpIHtcbiAgICBjb25zdCBhcmd1bWVudFN0cmluZyA9IG5vZGVBc1N0cmluZyhhcmd1bWVudE5vZGUpO1xuXG4gICAgY29udGV4dC5lcnJvcihgVGhlICR7YXJndW1lbnRTdHJpbmd9IGFyZ3VtZW50IHNob3VsZCBiZSBhIHRlcm0sIG5vdCBhIHR5cGVgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0eXBlcyA9IFtdLFxuICAgICAgICAgIHZhbHVlcyA9IFtdLFxuICAgICAgICAgIHRlcm1WZXJpZmllZCA9IHZlcmlmeVRlcm0odGVybU5vZGUsIHR5cGVzLCB2YWx1ZXMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHRlcm1WZXJpZmllZCkge1xuICAgICAgY29uc3QgZmlyc3RUeXBlID0gZmlyc3QodHlwZXMpLFxuICAgICAgICAgICAgdGVybVR5cGUgPSBmaXJzdFR5cGUsIC8vL1xuICAgICAgICAgICAgdHlwZU5vZGUgPSB0eXBlTm9kZVF1ZXJ5KGNvbnN0cnVjdG9yQXJndW1lbnROb2RlKSxcbiAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWVGcm9tVHlwZU5vZGUodHlwZU5vZGUpLFxuICAgICAgICAgICAgdHlwZSA9IGNvbnRleHQuZmluZFR5cGVCeVR5cGVOYW1lKHR5cGVOYW1lKSxcbiAgICAgICAgICAgIHRlcm1UeXBlRXF1YWxUb09yU3ViVHlwZU9mVHlwZSA9IHRlcm1UeXBlLmlzRXF1YWxUb09yU3ViVHlwZU9mKHR5cGUpO1xuXG4gICAgICBpZiAodGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlKSB7XG4gICAgICAgIGFyZ3VtZW50Tm9kZVZlcmlmaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJndW1lbnROb2RlVmVyaWZpZWQ7XG59XG4iXSwibmFtZXMiOlsidmVyaWZ5VGVybSIsInZlcmlmeVRlcm1Bc1ZhcmlhYmxlIiwidmVyaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3RvcnMiLCJ0ZXJtTm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwidHlwZU5vZGVRdWVyeSIsInZhcmlhYmxlTm9kZVF1ZXJ5IiwidGVybU5vZGUiLCJ0eXBlcyIsInZhbHVlcyIsImNvbnRleHQiLCJ0ZXJtVmVyaWZpZWQiLCJiZWdpbiIsInRlcm1WZXJpZmllZEFzVmFyaWFibGUiLCJ0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzIiwiY29tcGxldGUiLCJoYWx0IiwidmFyaWFibGVOb2RlIiwidmFyaWFibGVOYW1lIiwidmFyaWFibGVOYW1lRnJvbVZhcmlhYmxlTm9kZSIsInZhcmlhYmxlUHJlc2VudCIsImlzVmFyaWFibGVQcmVzZW50QnlWYXJpYWJsZU5hbWUiLCJlcnJvciIsInZhcmlhYmxlIiwiZmluZFZhcmlhYmxlQnlWYXJpYWJsZU5hbWUiLCJ0eXBlIiwiZ2V0VHlwZSIsInZhbHVlIiwiZ2V0VmFsdWUiLCJwdXNoIiwiY29uc3RydWN0b3JzIiwiZ2V0Q29uc3RydWN0b3JzIiwiY29uc3RydWN0b3IiLCJmaW5kIiwidGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9yIiwidmVyaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yVGVybU5vZGUiLCJnZXRUZXJtTm9kZSIsIm5vZGUiLCJjb25zdHJ1Y3Rvck5vZGUiLCJub2RlVmVyaWZpZWQiLCJ2ZXJpZnlOb2RlIiwibm9kZVRlcm1pbmFsTm9kZSIsImlzVGVybWluYWxOb2RlIiwiY29uc3RydWN0b3JOb2RlVGVybWluYWxOb2RlIiwidGVybWluYWxOb2RlIiwiY29uc3RydWN0b3JUZXJtaW5hbE5vZGUiLCJ0ZXJtaW5hbE5vZGVWZXJpZmllZCIsInZlcmlmeVRlcm1pbmFsTm9kZSIsIm5vblRlcm1pbmFsTm9kZSIsImNvbnN0cnVjdG9yTm9uVGVybWluYWxOb2RlIiwibm9uVGVybWluYWxOb2RlVmVyaWZpZWQiLCJ2ZXJpZnlOb25UZXJtaW5hbE5vZGUiLCJ2ZXJpZnlDaGlsZE5vZGVzIiwiY2hpbGROb2RlcyIsImNvbnN0cnVjdG9yQ2hpbGROb2RlcyIsImNoaWxkTm9kZXNWZXJpZmllZCIsImNoaWxkTm9kZXNMZW5ndGgiLCJsZW5ndGgiLCJjb25zdHJ1Y3RvckNoaWxkTm9kZXNMZW5ndGgiLCJldmVyeSIsImNoaWxkTm9kZSIsImluZGV4IiwiY29uc3RydWN0b3JDaGlsZE5vZGUiLCJtYXRjaGVzIiwibWF0Y2giLCJydWxlTmFtZSIsImdldFJ1bGVOYW1lIiwiY29uc3RydWN0b3JSdWxlTmFtZSIsIkFSR1VNRU5UX1JVTEVfTkFNRSIsImFyZ3VtZW50Tm9kZSIsImNvbnN0cnVjdG9yQXJndW1lbnROb2RlIiwiYXJndW1lbnROb2RlVmVyaWZpZWQiLCJ2ZXJpZnlBcmd1bWVudE5vZGUiLCJnZXRDaGlsZE5vZGVzIiwiYXJndW1lbnRTdHJpbmciLCJub2RlQXNTdHJpbmciLCJmaXJzdFR5cGUiLCJmaXJzdCIsInRlcm1UeXBlIiwidHlwZU5vZGUiLCJ0eXBlTmFtZSIsInR5cGVOYW1lRnJvbVR5cGVOb2RlIiwiZmluZFR5cGVCeVR5cGVOYW1lIiwidGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlIiwiaXNFcXVhbFRvT3JTdWJUeXBlT2YiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztJQVdBLE9Bc0JDO2VBdEJ1QkE7O0lBd0JSQyxvQkFBb0I7ZUFBcEJBOztJQWlDQUMsNkJBQTZCO2VBQTdCQTs7O3FCQWxFTTtzQkFDTzt5QkFDTTtxQkFDMkM7QUFFOUUsSUFBTUMsZ0JBQWdCQyxJQUFBQSxnQkFBUyxFQUFDLG9CQUMxQkMsZ0JBQWdCRCxJQUFBQSxnQkFBUyxFQUFDLG9CQUMxQkUsb0JBQW9CRixJQUFBQSxnQkFBUyxFQUFDO0FBRXJCLFNBQVNKLFdBQVdPLFFBQVEsRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUVDLE9BQU8sRUFBRTtJQUNuRSxJQUFJQyxlQUFlLEtBQUs7SUFFeEJE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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-verify-cli",
3
3
  "author": "James Smith",
4
- "version": "0.0.449",
4
+ "version": "0.0.451",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-verify-cli",
7
7
  "description": "Occam's Verifier",
@@ -61,15 +61,17 @@ export default class Constructor {
61
61
 
62
62
  let { type } = json;
63
63
 
64
- const typeJSON = type; ///
64
+ if (type !== null) {
65
+ const typeJSON = type; ///
65
66
 
66
- json = typeJSON; ///
67
+ json = typeJSON; ///
67
68
 
68
- type = Type.fromJSON(json, releaseContext);
69
+ type = Type.fromJSON(json, releaseContext);
69
70
 
70
- const typeName = type.getName();
71
+ const typeName = type.getName();
71
72
 
72
- type = releaseContext.findTypeByTypeName(typeName); ///
73
+ type = releaseContext.findTypeByTypeName(typeName); ///
74
+ }
73
75
 
74
76
  const constructor = new Constructor(termNode, type);
75
77
 
@@ -6,7 +6,7 @@ import { push } from "../utilities/array";
6
6
  import { leastLineIndexFromNodeAndTokens, greatestLineIndexFromNodeAndTokens } from "../utilities/tokens";
7
7
 
8
8
  export default class FileContext {
9
- constructor(releaseContext, filePath, tokens, node, types, rules, axioms, variables, combinators, constructors) {
9
+ constructor(releaseContext, filePath, tokens, node, types, rules, axioms, lemmas, variables, combinators, constructors) {
10
10
  this.releaseContext = releaseContext;
11
11
  this.filePath = filePath;
12
12
  this.tokens = tokens;
@@ -14,6 +14,7 @@ export default class FileContext {
14
14
  this.types = types;
15
15
  this.rules = rules;
16
16
  this.axioms = axioms;
17
+ this.lemmas = lemmas;
17
18
  this.variables = variables;
18
19
  this.combinators = combinators;
19
20
  this.constructors = constructors;
@@ -54,6 +55,12 @@ export default class FileContext {
54
55
  push(labels, axiomLabels);
55
56
  });
56
57
 
58
+ this.lemmas.forEach((lemma) => {
59
+ const lemmaLabels = lemma.getLabels();
60
+
61
+ push(labels, lemmaLabels);
62
+ });
63
+
57
64
  if (includeRelease) {
58
65
  const releaseContextLabels = this.releaseContext.getLabels();
59
66
 
@@ -105,6 +112,20 @@ export default class FileContext {
105
112
  return axioms;
106
113
  }
107
114
 
115
+ getLemmas(includeRelease = true) {
116
+ const lemmas = [];
117
+
118
+ push(lemmas, this.lemmas);
119
+
120
+ if (includeRelease) {
121
+ const releaseContextLemmas = this.releaseContext.getLemmas();
122
+
123
+ push(lemmas, releaseContextLemmas);
124
+ }
125
+
126
+ return lemmas;
127
+ }
128
+
108
129
  getCombinators(includeRelease = true) {
109
130
  const combinators = [];
110
131
 
@@ -200,6 +221,20 @@ export default class FileContext {
200
221
  return axiom;
201
222
  }
202
223
 
224
+ findLemmaByReferenceName(referenceName) {
225
+ const labelName = referenceName, ///
226
+ lemmas = this.getLemmas(),
227
+ lemma = lemmas.find((lemma) => {
228
+ const lemmaMatchesLabelName = lemma.matchLabelName(labelName);
229
+
230
+ if (lemmaMatchesLabelName) {
231
+ return true;
232
+ }
233
+ }) || null;
234
+
235
+ return lemma;
236
+ }
237
+
203
238
  findVariableByVariableName(variableName) {
204
239
  const name = variableName, ///
205
240
  variables = this.getVariables(),
@@ -247,6 +282,10 @@ export default class FileContext {
247
282
  this.axioms.push(axiom);
248
283
  }
249
284
 
285
+ addLemma(lemma) {
286
+ this.lemmas.push(lemma);
287
+ }
288
+
250
289
  addVariable(variable) {
251
290
  this.variables.push(variable);
252
291
  }
@@ -313,6 +352,12 @@ export default class FileContext {
313
352
  json.push(axiomJSON);
314
353
  });
315
354
 
355
+ this.lemmas.forEach((lemma) => {
356
+ const lemmaJSON = lemma.toJSON();
357
+
358
+ json.push(lemmaJSON);
359
+ });
360
+
316
361
  this.combinators.forEach((combinator) => {
317
362
  const combinatorJSON = combinator.toJSON();
318
363
 
@@ -339,10 +384,11 @@ export default class FileContext {
339
384
  const types = [],
340
385
  rules = [],
341
386
  axioms = [],
387
+ lemmas = [],
342
388
  variables = [],
343
389
  combinators = [],
344
390
  constructors = [],
345
- fileContext = new FileContext(releaseContext, filePath, tokens, node, types, rules, axioms, variables, combinators, constructors);
391
+ fileContext = new FileContext(releaseContext, filePath, tokens, node, types, rules, axioms, lemmas, variables, combinators, constructors);
346
392
 
347
393
  return fileContext;
348
394
  }
@@ -112,6 +112,30 @@ export default class DirectoryReleaseContext extends ReleaseContext {
112
112
  return axioms;
113
113
  }
114
114
 
115
+ getLemmas(includeDependencies = true) {
116
+ const lemmas = [];
117
+
118
+ this.fileContexts.forEach((fileContext) => {
119
+ const includeRelease = false,
120
+ fileContextLemmas = fileContext.getLemmas(includeRelease);
121
+
122
+ push(lemmas, fileContextLemmas);
123
+ });
124
+
125
+ if (includeDependencies) {
126
+ const dependencyReleaseContexts = this.getDependencyReleaseContexts();
127
+
128
+ dependencyReleaseContexts.forEach((releaseContext) => {
129
+ const includeDependencies = false,
130
+ releaseContextLemmas = releaseContext.getLemmas(includeDependencies);
131
+
132
+ push(lemmas, releaseContextLemmas);
133
+ });
134
+ }
135
+
136
+ return lemmas;
137
+ }
138
+
115
139
  getCombinators(includeDependencies = true) {
116
140
  const combinators = [];
117
141
 
@@ -12,15 +12,16 @@ import Constructor from "../../constructor";
12
12
 
13
13
  import { push } from "../../utilities/array";
14
14
  import { customGrammarFromNameAndEntries } from "../../utilities/customGrammar";
15
- import { RULE_KIND, TYPE_KIND, AXIOM_KIND, COMBINATOR_KIND, CONSTRUCTOR_KIND } from "../../kinds";
15
+ import { RULE_KIND, TYPE_KIND, AXIOM_KIND, LEMMA_KIND, COMBINATOR_KIND, CONSTRUCTOR_KIND } from "../../kinds";
16
16
 
17
17
  export default class FileReleaseContext extends ReleaseContext {
18
- constructor(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, combinators, constructors) {
18
+ constructor(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, combinators, constructors) {
19
19
  super(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts);
20
20
 
21
21
  this.types = types;
22
22
  this.rules = rules;
23
23
  this.axioms = axioms;
24
+ this.lemmas = lemmas;
24
25
  this.combinators = combinators;
25
26
  this.constructors = constructors;
26
27
  this.contextJSON = contextJSON;
@@ -116,6 +117,25 @@ export default class FileReleaseContext extends ReleaseContext {
116
117
  return axioms;
117
118
  }
118
119
 
120
+ getLemmas(includeDependencies = true) {
121
+ const lemmas = [];
122
+
123
+ push(lemmas, this.lemmas);
124
+
125
+ if (includeDependencies) {
126
+ const dependencyReleaseContexts = this.getDependencyReleaseContexts();
127
+
128
+ dependencyReleaseContexts.forEach((releaseContext) => {
129
+ const includeDependencies = false,
130
+ releaseContextLemmas = releaseContext.getLemmas(includeDependencies);
131
+
132
+ push(lemmas, releaseContextLemmas);
133
+ });
134
+ }
135
+
136
+ return lemmas;
137
+ }
138
+
119
139
  getCombinators(includeDependencies = true) {
120
140
  const combinators = [];
121
141
 
@@ -201,6 +221,14 @@ export default class FileReleaseContext extends ReleaseContext {
201
221
  break;
202
222
  }
203
223
 
224
+ case LEMMA_KIND: {
225
+ const lemma = Lemma.fromJSON(json, releaseContext);
226
+
227
+ this.lemmas.push(lemma);
228
+
229
+ break;
230
+ }
231
+
204
232
  case COMBINATOR_KIND: {
205
233
  const combinator = Combinator.fromJSON(json, releaseContext);
206
234
 
@@ -229,9 +257,10 @@ export default class FileReleaseContext extends ReleaseContext {
229
257
  types = [],
230
258
  rules = [],
231
259
  axioms = [],
260
+ lemmas = [],
232
261
  combinators = [],
233
262
  constructors = [],
234
- releaseContext = new FileReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, combinators, constructors);
263
+ releaseContext = new FileReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, combinators, constructors);
235
264
 
236
265
  return releaseContext;
237
266
  }
package/src/kinds.js CHANGED
@@ -3,5 +3,6 @@
3
3
  export const TYPE_KIND = "type";
4
4
  export const RULE_KIND = "rule";
5
5
  export const AXIOM_KIND = "axiom";
6
+ export const LEMMA_KIND = "lemma";
6
7
  export const COMBINATOR_KIND = "combinator";
7
8
  export const CONSTRUCTOR_KIND = "constructor";
package/src/lemma.js ADDED
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ import Label from "./label";
4
+
5
+ import { LEMMA_KIND } from "./kinds";
6
+ import { nodeAsString } from "./utilities/string";
7
+
8
+ import { statementNodeFromStatementJSON } from "./utilities/node";
9
+
10
+ export default class Lemma {
11
+ constructor(labels, statementNode, suppositionStatementNodes, consequentStatementNode) {
12
+ this.labels = labels;
13
+ this.statementNode = statementNode;
14
+ this.suppositionStatementNodes = suppositionStatementNodes;
15
+ this.consequentStatementNode = consequentStatementNode;
16
+ }
17
+
18
+ getLabels() {
19
+ return this.labels;
20
+ }
21
+
22
+ getStatementNode() {
23
+ return this.statementNode;
24
+ }
25
+
26
+ getSuppositionStatementNodes() {
27
+ return this.suppositionStatementNodes;
28
+ }
29
+
30
+ getConsequentStatementNode() {
31
+ return this.consequentStatementNode;
32
+ }
33
+
34
+ matchLabelName(labelName) {
35
+ const matchesLabelName = this.labels.some((label) => {
36
+ const name = labelName, ///
37
+ labelMatchesName = label.matchName(name);
38
+
39
+ if (labelMatchesName) {
40
+ return true;
41
+ }
42
+ });
43
+
44
+ return matchesLabelName;
45
+ }
46
+
47
+ toJSON() {
48
+ const labelsJSON = this.labels.map((label) => {
49
+ const labelJSON = label.toJSON();
50
+
51
+ return labelJSON;
52
+ }),
53
+ statementString = nodeAsString(this.statementNode),
54
+ consequentStatementString = nodeAsString(this.consequentStatementNode),
55
+ suppositionStatementStrings = this.suppositionStatementNodes.map((suppositionStatementNode) => {
56
+ const suppositionStatementString = nodeAsString(suppositionStatementNode);
57
+
58
+ return suppositionStatementString;
59
+ }),
60
+ kind = LEMMA_KIND,
61
+ labels = labelsJSON, ///
62
+ statement = statementString, ///
63
+ consequent = consequentStatementString, ///
64
+ suppositions = suppositionStatementStrings, ///
65
+ json = {
66
+ kind,
67
+ labels,
68
+ statement,
69
+ consequent,
70
+ suppositions
71
+ };
72
+
73
+ return json;
74
+ }
75
+
76
+ static fromJSON(json, releaseContext) {
77
+ let { labels } = json;
78
+
79
+ const labelsJSON = labels; ///
80
+
81
+ labels = labelsJSON.map((labelJSON) => {
82
+ const json = labelJSON, ///
83
+ label = Label.fromJSON(json, releaseContext);
84
+
85
+ return label;
86
+ });
87
+
88
+ const { statement, suppositions, consequent } = json;
89
+
90
+ let lemma;
91
+
92
+ if (statement !== null) {
93
+ const statementJSON = statement, ///
94
+ statementNode = statementNodeFromStatementJSON(statementJSON, releaseContext),
95
+ suppositionStatementNodes = null,
96
+ consequentStatementNode = null;
97
+
98
+ lemma = new Lemma(labels, statementNode, suppositionStatementNodes, consequentStatementNode);
99
+ } else {
100
+ const statementNode = null,
101
+ suppositionStatementsJSON = suppositions, ///
102
+ suppositionStatementNodes = suppositionStatementsJSON.map((suppositionStatementJSON) => {
103
+ const suppositionStatementNode = statementNodeFromStatementJSON(suppositionStatementJSON, releaseContext);
104
+
105
+ return suppositionStatementNode;
106
+ }),
107
+ consequentStatementJSON = consequent, ///
108
+ consequentStatementNode = statementNodeFromStatementJSON(consequentStatementJSON, releaseContext);
109
+
110
+ lemma = new Lemma(labels, statementNode, suppositionStatementNodes, consequentStatementNode);
111
+ }
112
+
113
+ return lemma;
114
+ }
115
+
116
+ static fromLabelsAndStatementNode(labels, statementNode) {
117
+ const suppositionStatementNodes = [],
118
+ consequentStatementNode = null,
119
+ lemma = new Lemma(labels, statementNode, suppositionStatementNodes, consequentStatementNode);
120
+
121
+ return lemma;
122
+ }
123
+
124
+ static fromLabelsSuppositionStatementNodesAndConsequentStatementNode(labels, suppositionStatementNodes, consequentStatementNode) {
125
+ const statementNode = null,
126
+ lemma = new Lemma(labels, statementNode, suppositionStatementNodes, consequentStatementNode);
127
+
128
+ return lemma;
129
+ }
130
+ }
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  import Variable from "../../variable";
4
- import verifyTermAsVariable from "../../verify/termAsVariable";
4
+ import verifyTerm from "../../verify/term";
5
5
 
6
6
  import { first } from "../../utilities/array";
7
+ import { nodeAsString } from "../../utilities/string";
7
8
  import { nodeQuery, typeNameFromTypeNode } from "../../utilities/query";
9
+ import { verifyTermAsVariable, verifyTermAgainstConstructors } from "../../verify/term";
8
10
 
9
11
  const termNodeQuery = nodeQuery("/typeAssertion/term"),
10
12
  typeNodeQuery = nodeQuery("/typeAssertion/type");
@@ -27,16 +29,15 @@ export default function verifyTypeAssertion(typeAssertionNode, proofContext) {
27
29
  debugger
28
30
  } else {
29
31
  const types = [],
30
- names = [],
31
32
  values = [],
32
33
  context = proofContext, ///
33
34
  termNode = termNodeQuery(typeAssertionNode),
34
- termVerifiedAsVariable = verifyTermAsVariable(termNode, types, names, values, context);
35
+ termString = nodeAsString(termNode),
36
+ termVerifiedAsVariable = verifyTermAsVariable(termNode, types, values, context);
35
37
 
36
38
  if (termVerifiedAsVariable) {
37
- const firstName = first(names),
38
- firstValue = first(values),
39
- variableName = firstName, ///
39
+ const firstValue = first(values),
40
+ variableName = termString, ///
40
41
  value = firstValue; ///
41
42
 
42
43
  if (value !== undefined) {
@@ -45,16 +46,32 @@ export default function verifyTypeAssertion(typeAssertionNode, proofContext) {
45
46
  const type = proofContext.findTypeByTypeName(typeName),
46
47
  firstType = first(types),
47
48
  variableType = firstType, ///
48
- typeSubTypeOfVariableType = type.isSubTypeOf(variableType);
49
+ typeEqualToOrSubTypeOfVariableType = type.isEqualToOrSubTypeOf(variableType);
49
50
 
50
- if (!typeSubTypeOfVariableType) {
51
- proofContext.error(`The asserted type of the ${variableName} variable is not a sub-type of its declared type.`);
51
+ if (!typeEqualToOrSubTypeOfVariableType) {
52
+ proofContext.error(`The asserted type of the ${variableName} variable is not equal to or a sub-type of its declared type.`);
52
53
  } else {
53
54
  const name = variableName, ///
54
55
  variable = Variable.fromTypeAndName(type, name);
55
56
 
56
57
  proofContext.addVariable(variable);
57
58
 
59
+ typeAssertionVerified = true;
60
+ }
61
+ }
62
+ } else {
63
+ const termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types, values, context);
64
+
65
+ if (termVerifiedAgainstConstructors) {
66
+ const type = proofContext.findTypeByTypeName(typeName),
67
+ firstType = first(types),
68
+ termType = firstType, ///
69
+ typeEqualToOrSubTypeOfTermType = type.isEqualToOrSubTypeOf(termType);
70
+
71
+ if (!typeEqualToOrSubTypeOfTermType) {
72
+ proofContext.error(`The asserted type of the '${termString}' term is not equal to or a sub-type of its declared type.`);
73
+ } else {
74
+
58
75
  typeAssertionVerified = true;
59
76
  }
60
77
  }
@@ -2,6 +2,7 @@
2
2
 
3
3
  import verifyRule from "../../verify/rule";
4
4
  import verifyAxiom from "../../verify/axiom";
5
+ import verifyLemma from "../../verify/lemma";
5
6
  import verifyTypeDeclaration from "../../verify/declaration/type";
6
7
  import verifyVariableDeclaration from "../../verify/declaration/variable";
7
8
  import verifyCombinatorDeclaration from "../../verify/declaration/combinator";
@@ -11,6 +12,7 @@ import { nodeQuery } from "../../utilities/query";
11
12
 
12
13
  const ruleNodeQuery = nodeQuery("/topLevelDeclaration/rule!"),
13
14
  axiomNodeQuery = nodeQuery("/topLevelDeclaration/axiom!"),
15
+ lemmaNodeQuery = nodeQuery("/topLevelDeclaration/lemma!"),
14
16
  typeDeclarationNodeQuery = nodeQuery("/topLevelDeclaration/typeDeclaration!"),
15
17
  variableDeclarationNodeQuery = nodeQuery("/topLevelDeclaration/variableDeclaration!"),
16
18
  combinatorDeclarationNodeQuery = nodeQuery("/topLevelDeclaration/combinatorDeclaration!"),
@@ -24,6 +26,7 @@ export default function verifyTopLevelDeclaration(topLevelDeclarationNode, fileC
24
26
  const node = topLevelDeclarationNode, ///
25
27
  ruleNode = ruleNodeQuery(node),
26
28
  axiomNode = axiomNodeQuery(node),
29
+ lemmaNode = lemmaNodeQuery(node),
27
30
  typeDeclarationNode = typeDeclarationNodeQuery(node),
28
31
  variableDeclarationNode = variableDeclarationNodeQuery(node),
29
32
  combinatorDeclarationNode = combinatorDeclarationNodeQuery(node),
@@ -39,6 +42,10 @@ export default function verifyTopLevelDeclaration(topLevelDeclarationNode, fileC
39
42
  const axiomVerified = verifyAxiom(axiomNode, fileContext);
40
43
 
41
44
  topLevelDeclarationVerified = axiomVerified; ///
45
+ } else if (lemmaNode !== null) {
46
+ const lemmaVerified = verifyLemma(lemmaNode, fileContext);
47
+
48
+ topLevelDeclarationVerified = lemmaVerified; ///
42
49
  } else if (typeDeclarationNode !== null) {
43
50
  const typeDeclarationVerified = verifyTypeDeclaration(typeDeclarationNode, fileContext);
44
51