occam-verify-cli 1.0.948 → 1.0.950

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.
@@ -39,7 +39,7 @@ function validateTermAsVariable(term, context, validateForwards) {
39
39
  context.trace(`Setting the '${termString}' term's type to the '${typeString}' type${provisionallyString}.`);
40
40
  term.setType(type);
41
41
  term.setProvisional(provisional);
42
- const validatesForwards = validateForwards(term);
42
+ const validatesForwards = validateForwards(term, context);
43
43
  if (validatesForwards) {
44
44
  termValidatesAsVariable = true;
45
45
  }
@@ -51,18 +51,18 @@ function validateTermAsVariable(term, context, validateForwards) {
51
51
  return termValidatesAsVariable;
52
52
  }
53
53
  function unifyTermWithConstructors(term, context, validateForwards) {
54
- let termUnifiesWithConstructors = false;
54
+ let termUnifiesWithConstructors;
55
55
  const constructors = context.getConstructors();
56
- constructors.some((constructor)=>{
57
- let termUnifies;
56
+ termUnifiesWithConstructors = constructors.some((constructor)=>{
57
+ let termUnifiesWithConstructor = false;
58
58
  (0, _context.choose)((context)=>{
59
- termUnifies = constructor.unifyTerm(term, context, validateForwards);
59
+ const termUnifies = constructor.unifyTerm(term, context, validateForwards);
60
60
  if (termUnifies) {
61
+ termUnifiesWithConstructor = true;
61
62
  context.commit();
62
63
  }
63
64
  }, context);
64
- if (termUnifies) {
65
- termUnifiesWithConstructors = true;
65
+ if (termUnifiesWithConstructor) {
66
66
  return true;
67
67
  }
68
68
  });
@@ -288,4 +288,4 @@ const validateStatements = [
288
288
  validateStatementAsSignatureAssertion
289
289
  ];
290
290
 
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmFsaWRhdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IGVsZW1lbnRzIGZyb20gXCIuLi9lbGVtZW50c1wiO1xuXG5pbXBvcnQgeyBjaG9vc2UsIGRlc2NlbmQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBwcm92aXNpb25hbGx5U3RyaW5nRnJvbVByb3Zpc2lvbmFsIH0gZnJvbSBcIi4vc3RyaW5nXCI7XG5pbXBvcnQgeyBicmFja2V0ZWRDb25zdHJ1Y3RvckZyb21Ob3RoaW5nLCBicmFja2V0ZWRDb21iaW5hdG9yRnJvbU5vdGhpbmcgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2luc3RhbmNlXCI7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGVybUFzVmFyaWFibGUodGVybSwgY29udGV4dCwgdmFsaWRhdGVGb3J3YXJkcykge1xuICBsZXQgdGVybVZhbGlkYXRlc0FzVmFyaWFibGUgPSBmYWxzZTtcblxuICBjb25zdCB7IFZhcmlhYmxlIH0gPSBlbGVtZW50cztcblxuICBsZXQgdmFyaWFibGU7XG5cbiAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tVGVybSh0ZXJtLCBjb250ZXh0KTtcblxuICBpZiAodmFyaWFibGUgIT09IG51bGwpIHtcbiAgICBjb25zdCB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGFzIGEgdmFyaWFibGUuLi5gKTtcblxuICAgIHZhcmlhYmxlID0gdmFyaWFibGUudmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICBpZiAodmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB2YXJpYWJsZS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHByb3Zpc2lvbmFsID0gdmFyaWFibGUuaXNQcm92aXNpb25hbCgpLFxuICAgICAgICAgICAgcHJvdmlzaW9uYWxseVN0cmluZyA9IHByb3Zpc2lvbmFsbHlTdHJpbmdGcm9tUHJvdmlzaW9uYWwocHJvdmlzaW9uYWwpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBTZXR0aW5nIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSdzIHR5cGUgdG8gdGhlICcke3R5cGVTdHJpbmd9JyB0eXBlJHtwcm92aXNpb25hbGx5U3RyaW5nfS5gKTtcblxuICAgICAgdGVybS5zZXRUeXBlKHR5cGUpO1xuXG4gICAgICB0ZXJtLnNldFByb3Zpc2lvbmFsKHByb3Zpc2lvbmFsKTtcblxuICAgICAgY29uc3QgdmFsaWRhdGVzRm9yd2FyZHMgPSB2YWxpZGF0ZUZvcndhcmRzKHRlcm0pO1xuXG4gICAgICBpZiAodmFsaWRhdGVzRm9yd2FyZHMpIHtcbiAgICAgICAgdGVybVZhbGlkYXRlc0FzVmFyaWFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZSkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBhcyBhIHZhcmlhYmxlLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZTtcbn1cblxuZnVuY3Rpb24gdW5pZnlUZXJtV2l0aENvbnN0cnVjdG9ycyh0ZXJtLCBjb250ZXh0LCB2YWxpZGF0ZUZvcndhcmRzKSB7XG4gIGxldCB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvcnMgPSBmYWxzZTtcblxuICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBjb250ZXh0LmdldENvbnN0cnVjdG9ycygpO1xuXG4gIGNvbnN0cnVjdG9ycy5zb21lKChjb25zdHJ1Y3RvcikgPT4ge1xuICAgIGxldCB0ZXJtVW5pZmllcztcblxuICAgIGNob29zZSgoY29udGV4dCkgPT4ge1xuICAgICAgdGVybVVuaWZpZXMgPSBjb25zdHJ1Y3Rvci51bmlmeVRlcm0odGVybSwgY29udGV4dCwgdmFsaWRhdGVGb3J3YXJkcyk7XG5cbiAgICAgIGlmICh0ZXJtVW5pZmllcykge1xuICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgaWYgKHRlcm1VbmlmaWVzKSB7XG4gICAgICB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvcnMgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvcnM7XG59XG5cbmZ1bmN0aW9uIHVuaWZ5VGVybVdpdGhCcmFja2V0ZWRDb25zdHJ1Y3Rvcih0ZXJtLCBjb250ZXh0LCB2YWxpZGF0ZUZvcndhcmRzKSB7XG4gIGxldCB0ZXJtVW5pZmllc1dpdGhCcmFja2V0ZWRDb25zdHJ1Y3RvcjtcblxuICBjb25zdCBicmFja2V0ZWRDb25zdHJ1Y3RvciA9IGJyYWNrZXRlZENvbnN0cnVjdG9yRnJvbU5vdGhpbmcoKTtcblxuICB0ZXJtVW5pZmllc1dpdGhCcmFja2V0ZWRDb25zdHJ1Y3RvciA9IGJyYWNrZXRlZENvbnN0cnVjdG9yLnVuaWZ5VGVybSh0ZXJtLCBjb250ZXh0LCB2YWxpZGF0ZUZvcndhcmRzKTtcblxuICByZXR1cm4gdGVybVVuaWZpZXNXaXRoQnJhY2tldGVkQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50QXNNZXRhdmFyaWFibGUoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWYWxpZGF0ZXNBc01ldGF2YXJpYWJsZSA9IGZhbHNlO1xuXG4gIGNvbnN0IHsgTWV0YXZhcmlhYmxlIH0gPSBlbGVtZW50cztcblxuICBsZXQgbWV0YXZhcmlhYmxlO1xuXG4gIG1ldGF2YXJpYWJsZSA9IE1ldGF2YXJpYWJsZS5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3Qgc3RyaWN0ID0gdHJ1ZTsgIC8vL1xuXG4gICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlLnZhbGlkYXRlKHN0cmljdCwgY29udGV4dCk7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlICE9PSBudWxsKSB7XG5cbiAgICAgIGNvbnN0IHsgVGVybVN1YnN0aXR1dGlvbiwgRnJhbWVTdWJzdGl0dXRpb24gfSA9IGVsZW1lbnRzO1xuXG4gICAgICBsZXQgc3Vic3RpdHV0aW9uO1xuXG4gICAgICBjb25zdCB0ZXJtU3Vic3RpdHV0aW9uID0gVGVybVN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCksXG4gICAgICAgICAgICBmcmFtZVN1YnN0aXR1dGlvbiA9IEZyYW1lU3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgICAgc3Vic3RpdHV0aW9uID0gKHRlcm1TdWJzdGl0dXRpb24gfHwgZnJhbWVTdWJzdGl0dXRpb24pO1xuXG4gICAgICBpZiAoc3Vic3RpdHV0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHN0YXRlbWVudFZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi52YWxpZGF0ZShjb250ZXh0KTsgIC8vL1xuXG4gICAgICAgIGlmIChzdWJzdGl0dXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZW1lbnRWYWxpZGF0ZXNBc01ldGF2YXJpYWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50VmFsaWRhdGVzQXNNZXRhdmFyaWFibGUpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWYWxpZGF0ZXNBc01ldGF2YXJpYWJsZTtcbn1cblxuZnVuY3Rpb24gdW5pZnlTdGF0ZW1lbnRXaXRoQ29tYmluYXRvcnMoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRVbmlmaWVzV2l0aENvbWJpbmF0b3JzID0gZmFsc2U7XG5cbiAgY29uc3QgY29tYmluYXRvcnMgPSBjb250ZXh0LmdldENvbWJpbmF0b3JzKCk7XG5cbiAgY29tYmluYXRvcnMuc29tZSgoY29tYmluYXRvcikgPT4ge1xuICAgIGxldCBzdGF0ZW1lbnRVbmlmaWVzO1xuXG4gICAgZGVzY2VuZCgoY29udGV4dCkgPT4ge1xuICAgICAgc3RhdGVtZW50VW5pZmllcyA9IGNvbWJpbmF0b3IudW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcbiAgICB9LCBjb250ZXh0KTtcblxuICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aENvbWJpbmF0b3JzID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhDb21iaW5hdG9ycztcbn1cblxuZnVuY3Rpb24gdW5pZnlTdGF0ZW1lbnRXaXRoQnJhY2tldGVkQ29tYmluYXRvcihzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNXaXRoQnJhY2tldGVkQ29tYmluYXRvcjtcblxuICBjb25zdCBicmFja2V0ZWRDb21iaW5hdG9yID0gYnJhY2tldGVkQ29tYmluYXRvckZyb21Ob3RoaW5nKCk7XG5cbiAgc3RhdGVtZW50VW5pZmllc1dpdGhCcmFja2V0ZWRDb21iaW5hdG9yID0gYnJhY2tldGVkQ29tYmluYXRvci51bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIHJldHVybiBzdGF0ZW1lbnRVbmlmaWVzV2l0aEJyYWNrZXRlZENvbWJpbmF0b3I7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50QXNFcXVhbGl0eShzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZhbGlkYXRlc0FzRXF1YWxpdHkgPSBmYWxzZTtcblxuICBjb25zdCB7IEVxdWFsaXR5IH0gPSBlbGVtZW50cztcblxuICBsZXQgZXF1YWxpdHk7XG5cbiAgZXF1YWxpdHkgPSBFcXVhbGl0eS5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKGVxdWFsaXR5ICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5Li4uYCk7XG5cbiAgICBlcXVhbGl0eSA9IGVxdWFsaXR5LnZhbGlkYXRlKGNvbnRleHQpOyAgLy8vXG5cbiAgICBpZiAoZXF1YWxpdHkgIT09IG51bGwpIHtcbiAgICAgIHN0YXRlbWVudFZhbGlkYXRlc0FzRXF1YWxpdHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXNBc0VxdWFsaXR5KSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhbiBlcXVhbGl0eS5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmFsaWRhdGVzQXNFcXVhbGl0eTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRBc0p1ZGdlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc1N0YXRlbWVudEFzSnVkZ2VtZW50ID0gZmFsc2U7XG5cbiAgbGV0IGp1ZGdlbWVudDtcblxuICBjb25zdCB7IEp1ZGdlbWVudCB9ID0gZWxlbWVudHM7XG5cbiAganVkZ2VtZW50ID0gSnVkZ2VtZW50LmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAoanVkZ2VtZW50ICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEganVkZ2VtZW50Li4uYCk7XG5cbiAgICBqdWRnZW1lbnQgPSBqdWRnZW1lbnQudmFsaWRhdGUoY29udGV4dCk7ICAvLy9cblxuICAgIGlmIChqdWRnZW1lbnQgIT09IG51bGwpIHtcbiAgICAgIHZhbGlkYXRlc1N0YXRlbWVudEFzSnVkZ2VtZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzU3RhdGVtZW50QXNKdWRnZW1lbnQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEganVkZ2VtZW50LmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZXNTdGF0ZW1lbnRBc0p1ZGdlbWVudDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24oc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB7IFR5cGVBc3NlcnRpb24gfSA9IGVsZW1lbnRzO1xuXG4gIGxldCB0eXBlQXNzZXJ0aW9uO1xuXG4gIHR5cGVBc3NlcnRpb24gPSBUeXBlQXNzZXJ0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAodHlwZUFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHR5cGUgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICB0eXBlQXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvbi52YWxpZGF0ZShjb250ZXh0KTsgIC8vL1xuXG4gICAgaWYgKHR5cGVBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhbGlkYXRlc1N0YXRlbWVudEFzVHlwZUFzc2VydGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlc1N0YXRlbWVudEFzVHlwZUFzc2VydGlvbikge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSB0eXBlIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzU3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbihzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc1N0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHsgRGVmaW5lZEFzc2VydGlvbiB9ID0gZWxlbWVudHM7XG5cbiAgbGV0IGRlZmluZWRBc3NlcnRpb247XG5cbiAgZGVmaW5lZEFzc2VydGlvbiA9IERlZmluZWRBc3NlcnRpb24uZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChkZWZpbmVkQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgZGVmaW5lZCBhc3NlcnRpb24uLi5gKTtcblxuICAgIGRlZmluZWRBc3NlcnRpb24gPSBkZWZpbmVkQXNzZXJ0aW9uLnZhbGlkYXRlKGNvbnRleHQpOyAgLy8vXG5cbiAgICBpZiAoZGVmaW5lZEFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgICAgdmFsaWRhdGVzU3RhdGVtZW50QXNEZWZpbmVkQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzU3RhdGVtZW50QXNEZWZpbmVkQXNzZXJ0aW9uKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGRlZmluZWQgYXNzZXJ0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZXNTdGF0ZW1lbnRBc0RlZmluZWRBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50QXNQcm9wZXJ0eUFzc2VydGlvbihzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB7IFByb3BlcnR5QXNzZXJ0aW9uIH0gPSBlbGVtZW50cztcblxuICBsZXQgcHJvcGVydHlBc3NlcnRpb247XG5cbiAgcHJvcGVydHlBc3NlcnRpb24gPSBQcm9wZXJ0eUFzc2VydGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKHByb3BlcnR5QXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgcHJvcGVydHkgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBwcm9wZXJ0eUFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uLnZhbGlkYXRlKGNvbnRleHQpOyAgLy8vXG5cbiAgICBpZiAocHJvcGVydHlBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIHN0YXRlbWVudFZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHByb3BlcnR5IGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmFsaWRhdGVzQXNQcm9wZXJ0eUFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRBc1N1YnByb29mQXNzZXJ0aW9uKHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHsgU3VicHJvb2ZBc3NlcnRpb24gfSA9IGVsZW1lbnRzO1xuXG4gIGxldCBzdWJwcm9vZkFzc2VydGlvbjtcblxuICBzdWJwcm9vZkFzc2VydGlvbiA9IFN1YnByb29mQXNzZXJ0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAoc3VicHJvb2ZBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBzdWJwcm9vZiBhc3NlcnRpb24uLi5gKTtcblxuICAgIHN1YnByb29mQXNzZXJ0aW9uID0gc3VicHJvb2ZBc3NlcnRpb24udmFsaWRhdGUoY29udGV4dCk7ICAvLy9cblxuICAgIGlmIChzdWJwcm9vZkFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgICAgc3RhdGVtZW50VmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudFZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgc3VicHJvb2YgYXNzZXJ0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWYWxpZGF0ZXNBc1N1YnByb29mQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uKHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgdmFsaWRhdGVzU3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB7IENvbnRhaW5lZEFzc2VydGlvbiB9ID0gZWxlbWVudHM7XG5cbiAgbGV0IGNvbnRhaW5lZEFzc2VydGlvbjtcblxuICBjb250YWluZWRBc3NlcnRpb24gPSBDb250YWluZWRBc3NlcnRpb24uZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChjb250YWluZWRBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBjb250YWluZWQgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBjb250YWluZWRBc3NlcnRpb24gPSBjb250YWluZWRBc3NlcnRpb24udmFsaWRhdGUoY29udGV4dCk7ICAvLy9cblxuICAgIGlmIChjb250YWluZWRBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhbGlkYXRlc1N0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzU3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgY29udGFpbmVkIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzU3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50QXNTaWduYXR1cmVBc3NlcnRpb24oc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNBU3RhdGVtZW50c1NpZ25hdHVyZUFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHsgU2lnbmF0dXJlQXNzZXJ0aW9uIH0gPSBlbGVtZW50cztcblxuICBsZXQgc2lnbmF0dXJlQXNzZXJ0aW9uO1xuXG4gIHNpZ25hdHVyZUFzc2VydGlvbiA9IFNpZ25hdHVyZUFzc2VydGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKHNpZ25hdHVyZUFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHNpZ25hdHVyZSBhc3NlcnRpb24uLi5gKTtcblxuICAgIHNpZ25hdHVyZUFzc2VydGlvbiA9IHNpZ25hdHVyZUFzc2VydGlvbi52YWxpZGF0ZShjb250ZXh0KTsgIC8vL1xuXG4gICAgaWYgKHNpZ25hdHVyZUFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgICAgdmFsaWRhdGVzQVN0YXRlbWVudHNTaWduYXR1cmVBc3NlcnRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZXNBU3RhdGVtZW50c1NpZ25hdHVyZUFzc2VydGlvbikge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBzaWduYXR1cmUgYXNzZXJ0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZXNBU3RhdGVtZW50c1NpZ25hdHVyZUFzc2VydGlvbjtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVGVybXMgPSBbXG4gIHZhbGlkYXRlVGVybUFzVmFyaWFibGUsXG4gIHVuaWZ5VGVybVdpdGhDb25zdHJ1Y3RvcnMsXG4gIHVuaWZ5VGVybVdpdGhCcmFja2V0ZWRDb25zdHJ1Y3RvclxuXTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlU3RhdGVtZW50cyA9IFtcbiAgdmFsaWRhdGVTdGF0ZW1lbnRBc01ldGF2YXJpYWJsZSxcbiAgdW5pZnlTdGF0ZW1lbnRXaXRoQ29tYmluYXRvcnMsXG4gIHVuaWZ5U3RhdGVtZW50V2l0aEJyYWNrZXRlZENvbWJpbmF0b3IsXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNFcXVhbGl0eSxcbiAgdmFsaWRhdGVTdGF0ZW1lbnRBc0p1ZGdlbWVudCxcbiAgdmFsaWRhdGVTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24sXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNEZWZpbmVkQXNzZXJ0aW9uLFxuICB2YWxpZGF0ZVN0YXRlbWVudEFzUHJvcGVydHlBc3NlcnRpb24sXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNTdWJwcm9vZkFzc2VydGlvbixcbiAgdmFsaWRhdGVTdGF0ZW1lbnRBc0NvbnRhaW5lZEFzc2VydGlvbixcbiAgdmFsaWRhdGVTdGF0ZW1lbnRBc1NpZ25hdHVyZUFzc2VydGlvblxuXTtcbiJdLCJuYW1lcyI6WyJ2YWxpZGF0ZVN0YXRlbWVudHMiLCJ2YWxpZGF0ZVRlcm1zIiwidmFsaWRhdGVUZXJtQXNWYXJpYWJsZSIsInRlcm0iLCJjb250ZXh0IiwidmFsaWRhdGVGb3J3YXJkcyIsInRlcm1WYWxpZGF0ZXNBc1ZhcmlhYmxlIiwiVmFyaWFibGUiLCJlbGVtZW50cyIsInZhcmlhYmxlIiwiZnJvbVRlcm0iLCJ0ZXJtU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ2YWxpZGF0ZSIsInR5cGUiLCJnZXRUeXBlIiwidHlwZVN0cmluZyIsInByb3Zpc2lvbmFsIiwiaXNQcm92aXNpb25hbCIsInByb3Zpc2lvbmFsbHlTdHJpbmciLCJwcm92aXNpb25hbGx5U3RyaW5nRnJvbVByb3Zpc2lvbmFsIiwic2V0VHlwZSIsInNldFByb3Zpc2lvbmFsIiwidmFsaWRhdGVzRm9yd2FyZHMiLCJkZWJ1ZyIsInVuaWZ5VGVybVdpdGhDb25zdHJ1Y3RvcnMiLCJ0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvcnMiLCJjb25zdHJ1Y3RvcnMiLCJnZXRDb25zdHJ1Y3RvcnMiLCJzb21lIiwiY29uc3RydWN0b3IiLCJ0ZXJtVW5pZmllcyIsImNob29zZSIsInVuaWZ5VGVybSIsImNvbW1pdCIsInVuaWZ5VGVybVdpdGhCcmFja2V0ZWRDb25zdHJ1Y3RvciIsInRlcm1VbmlmaWVzV2l0aEJyYWNrZXRlZENvbnN0cnVjdG9yIiwiYnJhY2tldGVkQ29uc3RydWN0b3IiLCJicmFja2V0ZWRDb25zdHJ1Y3RvckZyb21Ob3RoaW5nIiwidmFsaWRhdGVTdGF0ZW1lbnRBc01ldGF2YXJpYWJsZSIsInN0YXRlbWVudCIsInN0YXRlbWVudFZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlIiwiTWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlIiwiZnJvbVN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsInN0cmljdCIsIlRlcm1TdWJzdGl0dXRpb24iLCJGcmFtZVN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInRlcm1TdWJzdGl0dXRpb24iLCJmcmFtZVN1YnN0aXR1dGlvbiIsInVuaWZ5U3RhdGVtZW50V2l0aENvbWJpbmF0b3JzIiwic3RhdGVtZW50VW5pZmllc1dpdGhDb21iaW5hdG9ycyIsImNvbWJpbmF0b3JzIiwiZ2V0Q29tYmluYXRvcnMiLCJjb21iaW5hdG9yIiwic3RhdGVtZW50VW5pZmllcyIsImRlc2NlbmQiLCJ1bmlmeVN0YXRlbWVudCIsInVuaWZ5U3RhdGVtZW50V2l0aEJyYWNrZXRlZENvbWJpbmF0b3IiLCJzdGF0ZW1lbnRVbmlmaWVzV2l0aEJyYWNrZXRlZENvbWJpbmF0b3IiLCJicmFja2V0ZWRDb21iaW5hdG9yIiwiYnJhY2tldGVkQ29tYmluYXRvckZyb21Ob3RoaW5nIiwidmFsaWRhdGVTdGF0ZW1lbnRBc0VxdWFsaXR5Iiwic3RhdGVtZW50VmFsaWRhdGVzQXNFcXVhbGl0eSIsIkVxdWFsaXR5IiwiZXF1YWxpdHkiLCJ2YWxpZGF0ZVN0YXRlbWVudEFzSnVkZ2VtZW50IiwidmFsaWRhdGVzU3RhdGVtZW50QXNKdWRnZW1lbnQiLCJqdWRnZW1lbnQiLCJKdWRnZW1lbnQiLCJ2YWxpZGF0ZVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsInZhbGlkYXRlc1N0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsIlR5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uIiwidmFsaWRhdGVTdGF0ZW1lbnRBc0RlZmluZWRBc3NlcnRpb24iLCJ2YWxpZGF0ZXNTdGF0ZW1lbnRBc0RlZmluZWRBc3NlcnRpb24iLCJEZWZpbmVkQXNzZXJ0aW9uIiwiZGVmaW5lZEFzc2VydGlvbiIsInZhbGlkYXRlU3RhdGVtZW50QXNQcm9wZXJ0eUFzc2VydGlvbiIsInN0YXRlbWVudFZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb24iLCJQcm9wZXJ0eUFzc2VydGlvbiIsInByb3BlcnR5QXNzZXJ0aW9uIiwidmFsaWRhdGVTdGF0ZW1lbnRBc1N1YnByb29mQXNzZXJ0aW9uIiwic3RhdGVtZW50VmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbiIsIlN1YnByb29mQXNzZXJ0aW9uIiwic3VicHJvb2ZBc3NlcnRpb24iLCJ2YWxpZGF0ZVN0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uIiwidmFsaWRhdGVzU3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb24iLCJDb250YWluZWRBc3NlcnRpb24iLCJjb250YWluZWRBc3NlcnRpb24iLCJ2YWxpZGF0ZVN0YXRlbWVudEFzU2lnbmF0dXJlQXNzZXJ0aW9uIiwidmFsaWRhdGVzQVN0YXRlbWVudHNTaWduYXR1cmVBc3NlcnRpb24iLCJTaWduYXR1cmVBc3NlcnRpb24iLCJzaWduYXR1cmVBc3NlcnRpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQTZZYUE7ZUFBQUE7O1FBTkFDO2VBQUFBOzs7aUVBcllRO3lCQUVXO3dCQUNtQjswQkFDNkI7Ozs7OztBQUVoRixTQUFTQyx1QkFBdUJDLElBQUksRUFBRUMsT0FBTyxFQUFFQyxnQkFBZ0I7SUFDN0QsSUFBSUMsMEJBQTBCO0lBRTlCLE1BQU0sRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGlCQUFRO0lBRTdCLElBQUlDO0lBRUpBLFdBQVdGLFNBQVNHLFFBQVEsQ0FBQ1AsTUFBTUM7SUFFbkMsSUFBSUssYUFBYSxNQUFNO1FBQ3JCLE1BQU1FLGFBQWFSLEtBQUtTLFNBQVM7UUFFakNSLFFBQVFTLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixFQUFFRixXQUFXLHVCQUF1QixDQUFDO1FBRXBFRixXQUFXQSxTQUFTSyxRQUFRLENBQUNWO1FBRTdCLElBQUlLLGFBQWEsTUFBTTtZQUNyQixNQUFNTSxPQUFPTixTQUFTTyxPQUFPLElBQ3ZCQyxhQUFhRixLQUFLSCxTQUFTLElBQzNCTSxjQUFjVCxTQUFTVSxhQUFhLElBQ3BDQyxzQkFBc0JDLElBQUFBLDBDQUFrQyxFQUFDSDtZ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
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmFsaWRhdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IGVsZW1lbnRzIGZyb20gXCIuLi9lbGVtZW50c1wiO1xuXG5pbXBvcnQgeyBjaG9vc2UsIGRlc2NlbmQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBwcm92aXNpb25hbGx5U3RyaW5nRnJvbVByb3Zpc2lvbmFsIH0gZnJvbSBcIi4vc3RyaW5nXCI7XG5pbXBvcnQgeyBicmFja2V0ZWRDb25zdHJ1Y3RvckZyb21Ob3RoaW5nLCBicmFja2V0ZWRDb21iaW5hdG9yRnJvbU5vdGhpbmcgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2luc3RhbmNlXCI7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGVybUFzVmFyaWFibGUodGVybSwgY29udGV4dCwgdmFsaWRhdGVGb3J3YXJkcykge1xuICBsZXQgdGVybVZhbGlkYXRlc0FzVmFyaWFibGUgPSBmYWxzZTtcblxuICBjb25zdCB7IFZhcmlhYmxlIH0gPSBlbGVtZW50cztcblxuICBsZXQgdmFyaWFibGU7XG5cbiAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tVGVybSh0ZXJtLCBjb250ZXh0KTtcblxuICBpZiAodmFyaWFibGUgIT09IG51bGwpIHtcbiAgICBjb25zdCB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGFzIGEgdmFyaWFibGUuLi5gKTtcblxuICAgIHZhcmlhYmxlID0gdmFyaWFibGUudmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICBpZiAodmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB2YXJpYWJsZS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHByb3Zpc2lvbmFsID0gdmFyaWFibGUuaXNQcm92aXNpb25hbCgpLFxuICAgICAgICAgICAgcHJvdmlzaW9uYWxseVN0cmluZyA9IHByb3Zpc2lvbmFsbHlTdHJpbmdGcm9tUHJvdmlzaW9uYWwocHJvdmlzaW9uYWwpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBTZXR0aW5nIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSdzIHR5cGUgdG8gdGhlICcke3R5cGVTdHJpbmd9JyB0eXBlJHtwcm92aXNpb25hbGx5U3RyaW5nfS5gKTtcblxuICAgICAgdGVybS5zZXRUeXBlKHR5cGUpO1xuXG4gICAgICB0ZXJtLnNldFByb3Zpc2lvbmFsKHByb3Zpc2lvbmFsKTtcblxuICAgICAgY29uc3QgdmFsaWRhdGVzRm9yd2FyZHMgPSB2YWxpZGF0ZUZvcndhcmRzKHRlcm0sIGNvbnRleHQpO1xuXG4gICAgICBpZiAodmFsaWRhdGVzRm9yd2FyZHMpIHtcbiAgICAgICAgdGVybVZhbGlkYXRlc0FzVmFyaWFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZSkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBhcyBhIHZhcmlhYmxlLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZTtcbn1cblxuZnVuY3Rpb24gdW5pZnlUZXJtV2l0aENvbnN0cnVjdG9ycyh0ZXJtLCBjb250ZXh0LCB2YWxpZGF0ZUZvcndhcmRzKSB7XG4gIGxldCB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvcnM7XG5cbiAgY29uc3QgY29uc3RydWN0b3JzID0gY29udGV4dC5nZXRDb25zdHJ1Y3RvcnMoKTtcblxuICB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnMuc29tZSgoY29uc3RydWN0b3IpID0+IHtcbiAgICBsZXQgdGVybVVuaWZpZXNXaXRoQ29uc3RydWN0b3IgPSBmYWxzZTtcblxuICAgIGNob29zZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgdGVybVVuaWZpZXMgPSBjb25zdHJ1Y3Rvci51bmlmeVRlcm0odGVybSwgY29udGV4dCwgdmFsaWRhdGVGb3J3YXJkcyk7XG5cbiAgICAgIGlmICh0ZXJtVW5pZmllcykge1xuICAgICAgICB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvciA9IHRydWU7XG5cbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcblxuICAgIGlmICh0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3Rvcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGVybVVuaWZpZXNXaXRoQ29uc3RydWN0b3JzO1xufVxuXG5mdW5jdGlvbiB1bmlmeVRlcm1XaXRoQnJhY2tldGVkQ29uc3RydWN0b3IodGVybSwgY29udGV4dCwgdmFsaWRhdGVGb3J3YXJkcykge1xuICBsZXQgdGVybVVuaWZpZXNXaXRoQnJhY2tldGVkQ29uc3RydWN0b3I7XG5cbiAgY29uc3QgYnJhY2tldGVkQ29uc3RydWN0b3IgPSBicmFja2V0ZWRDb25zdHJ1Y3RvckZyb21Ob3RoaW5nKCk7XG5cbiAgdGVybVVuaWZpZXNXaXRoQnJhY2tldGVkQ29uc3RydWN0b3IgPSBicmFja2V0ZWRDb25zdHJ1Y3Rvci51bmlmeVRlcm0odGVybSwgY29udGV4dCwgdmFsaWRhdGVGb3J3YXJkcyk7XG5cbiAgcmV0dXJuIHRlcm1VbmlmaWVzV2l0aEJyYWNrZXRlZENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXRlbWVudEFzTWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmFsaWRhdGVzQXNNZXRhdmFyaWFibGUgPSBmYWxzZTtcblxuICBjb25zdCB7IE1ldGF2YXJpYWJsZSB9ID0gZWxlbWVudHM7XG5cbiAgbGV0IG1ldGF2YXJpYWJsZTtcblxuICBtZXRhdmFyaWFibGUgPSBNZXRhdmFyaWFibGUuZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IHN0cmljdCA9IHRydWU7ICAvLy9cblxuICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZS52YWxpZGF0ZShzdHJpY3QsIGNvbnRleHQpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuXG4gICAgICBjb25zdCB7IFRlcm1TdWJzdGl0dXRpb24sIEZyYW1lU3Vic3RpdHV0aW9uIH0gPSBlbGVtZW50cztcblxuICAgICAgbGV0IHN1YnN0aXR1dGlvbjtcblxuICAgICAgY29uc3QgdGVybVN1YnN0aXR1dGlvbiA9IFRlcm1TdWJzdGl0dXRpb24uZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpLFxuICAgICAgICAgICAgZnJhbWVTdWJzdGl0dXRpb24gPSBGcmFtZVN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICAgIHN1YnN0aXR1dGlvbiA9ICh0ZXJtU3Vic3RpdHV0aW9uIHx8IGZyYW1lU3Vic3RpdHV0aW9uKTtcblxuICAgICAgaWYgKHN1YnN0aXR1dGlvbiA9PT0gbnVsbCkge1xuICAgICAgICBzdGF0ZW1lbnRWYWxpZGF0ZXNBc01ldGF2YXJpYWJsZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24udmFsaWRhdGUoY29udGV4dCk7ICAvLy9cblxuICAgICAgICBpZiAoc3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGVtZW50VmFsaWRhdGVzQXNNZXRhdmFyaWFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudFZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIG1ldGF2YXJpYWJsZS5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmFsaWRhdGVzQXNNZXRhdmFyaWFibGU7XG59XG5cbmZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50V2l0aENvbWJpbmF0b3JzKHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc1dpdGhDb21iaW5hdG9ycyA9IGZhbHNlO1xuXG4gIGNvbnN0IGNvbWJpbmF0b3JzID0gY29udGV4dC5nZXRDb21iaW5hdG9ycygpO1xuXG4gIGNvbWJpbmF0b3JzLnNvbWUoKGNvbWJpbmF0b3IpID0+IHtcbiAgICBsZXQgc3RhdGVtZW50VW5pZmllcztcblxuICAgIGRlc2NlbmQoKGNvbnRleHQpID0+IHtcbiAgICAgIHN0YXRlbWVudFVuaWZpZXMgPSBjb21iaW5hdG9yLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgc3RhdGVtZW50VW5pZmllc1dpdGhDb21iaW5hdG9ycyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNXaXRoQ29tYmluYXRvcnM7XG59XG5cbmZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50V2l0aEJyYWNrZXRlZENvbWJpbmF0b3Ioc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRVbmlmaWVzV2l0aEJyYWNrZXRlZENvbWJpbmF0b3I7XG5cbiAgY29uc3QgYnJhY2tldGVkQ29tYmluYXRvciA9IGJyYWNrZXRlZENvbWJpbmF0b3JGcm9tTm90aGluZygpO1xuXG4gIHN0YXRlbWVudFVuaWZpZXNXaXRoQnJhY2tldGVkQ29tYmluYXRvciA9IGJyYWNrZXRlZENvbWJpbmF0b3IudW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhCcmFja2V0ZWRDb21iaW5hdG9yO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXRlbWVudEFzRXF1YWxpdHkoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWYWxpZGF0ZXNBc0VxdWFsaXR5ID0gZmFsc2U7XG5cbiAgY29uc3QgeyBFcXVhbGl0eSB9ID0gZWxlbWVudHM7XG5cbiAgbGV0IGVxdWFsaXR5O1xuXG4gIGVxdWFsaXR5ID0gRXF1YWxpdHkuZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChlcXVhbGl0eSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhbiBlcXVhbGl0eS4uLmApO1xuXG4gICAgZXF1YWxpdHkgPSBlcXVhbGl0eS52YWxpZGF0ZShjb250ZXh0KTsgIC8vL1xuXG4gICAgaWYgKGVxdWFsaXR5ICE9PSBudWxsKSB7XG4gICAgICBzdGF0ZW1lbnRWYWxpZGF0ZXNBc0VxdWFsaXR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50VmFsaWRhdGVzQXNFcXVhbGl0eSkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYW4gZXF1YWxpdHkuYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZhbGlkYXRlc0FzRXF1YWxpdHk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50QXNKdWRnZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNTdGF0ZW1lbnRBc0p1ZGdlbWVudCA9IGZhbHNlO1xuXG4gIGxldCBqdWRnZW1lbnQ7XG5cbiAgY29uc3QgeyBKdWRnZW1lbnQgfSA9IGVsZW1lbnRzO1xuXG4gIGp1ZGdlbWVudCA9IEp1ZGdlbWVudC5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKGp1ZGdlbWVudCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGp1ZGdlbWVudC4uLmApO1xuXG4gICAganVkZ2VtZW50ID0ganVkZ2VtZW50LnZhbGlkYXRlKGNvbnRleHQpOyAgLy8vXG5cbiAgICBpZiAoanVkZ2VtZW50ICE9PSBudWxsKSB7XG4gICAgICB2YWxpZGF0ZXNTdGF0ZW1lbnRBc0p1ZGdlbWVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlc1N0YXRlbWVudEFzSnVkZ2VtZW50KSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGp1ZGdlbWVudC5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzU3RhdGVtZW50QXNKdWRnZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uKHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgdmFsaWRhdGVzU3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgeyBUeXBlQXNzZXJ0aW9uIH0gPSBlbGVtZW50cztcblxuICBsZXQgdHlwZUFzc2VydGlvbjtcblxuICB0eXBlQXNzZXJ0aW9uID0gVHlwZUFzc2VydGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKHR5cGVBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgdHlwZUFzc2VydGlvbiA9IHR5cGVBc3NlcnRpb24udmFsaWRhdGUoY29udGV4dCk7ICAvLy9cblxuICAgIGlmICh0eXBlQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YWxpZGF0ZXNTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZXNTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgdHlwZSBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlc1N0YXRlbWVudEFzVHlwZUFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRBc0RlZmluZWRBc3NlcnRpb24oc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNTdGF0ZW1lbnRBc0RlZmluZWRBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB7IERlZmluZWRBc3NlcnRpb24gfSA9IGVsZW1lbnRzO1xuXG4gIGxldCBkZWZpbmVkQXNzZXJ0aW9uO1xuXG4gIGRlZmluZWRBc3NlcnRpb24gPSBEZWZpbmVkQXNzZXJ0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAoZGVmaW5lZEFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGRlZmluZWQgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBkZWZpbmVkQXNzZXJ0aW9uID0gZGVmaW5lZEFzc2VydGlvbi52YWxpZGF0ZShjb250ZXh0KTsgIC8vL1xuXG4gICAgaWYgKGRlZmluZWRBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhbGlkYXRlc1N0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlc1N0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbikge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBkZWZpbmVkIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzU3RhdGVtZW50QXNEZWZpbmVkQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXRlbWVudEFzUHJvcGVydHlBc3NlcnRpb24oc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWYWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgeyBQcm9wZXJ0eUFzc2VydGlvbiB9ID0gZWxlbWVudHM7XG5cbiAgbGV0IHByb3BlcnR5QXNzZXJ0aW9uO1xuXG4gIHByb3BlcnR5QXNzZXJ0aW9uID0gUHJvcGVydHlBc3NlcnRpb24uZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChwcm9wZXJ0eUFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHByb3BlcnR5IGFzc2VydGlvbi4uLmApO1xuXG4gICAgcHJvcGVydHlBc3NlcnRpb24gPSBwcm9wZXJ0eUFzc2VydGlvbi52YWxpZGF0ZShjb250ZXh0KTsgIC8vL1xuXG4gICAgaWYgKHByb3BlcnR5QXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBzdGF0ZW1lbnRWYWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50VmFsaWRhdGVzQXNQcm9wZXJ0eUFzc2VydGlvbikge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50QXNTdWJwcm9vZkFzc2VydGlvbihzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB7IFN1YnByb29mQXNzZXJ0aW9uIH0gPSBlbGVtZW50cztcblxuICBsZXQgc3VicHJvb2ZBc3NlcnRpb247XG5cbiAgc3VicHJvb2ZBc3NlcnRpb24gPSBTdWJwcm9vZkFzc2VydGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKHN1YnByb29mQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgc3VicHJvb2YgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBzdWJwcm9vZkFzc2VydGlvbiA9IHN1YnByb29mQXNzZXJ0aW9uLnZhbGlkYXRlKGNvbnRleHQpOyAgLy8vXG5cbiAgICBpZiAoc3VicHJvb2ZBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIHN0YXRlbWVudFZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXNBc1N1YnByb29mQXNzZXJ0aW9uKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHN1YnByb29mIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRBc0NvbnRhaW5lZEFzc2VydGlvbihzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc1N0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgeyBDb250YWluZWRBc3NlcnRpb24gfSA9IGVsZW1lbnRzO1xuXG4gIGxldCBjb250YWluZWRBc3NlcnRpb247XG5cbiAgY29udGFpbmVkQXNzZXJ0aW9uID0gQ29udGFpbmVkQXNzZXJ0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAoY29udGFpbmVkQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgY29udGFpbmVkIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29udGFpbmVkQXNzZXJ0aW9uID0gY29udGFpbmVkQXNzZXJ0aW9uLnZhbGlkYXRlKGNvbnRleHQpOyAgLy8vXG5cbiAgICBpZiAoY29udGFpbmVkQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YWxpZGF0ZXNTdGF0ZW1lbnRBc0NvbnRhaW5lZEFzc2VydGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlc1N0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGNvbnRhaW5lZCBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlc1N0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXRlbWVudEFzU2lnbmF0dXJlQXNzZXJ0aW9uKHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgdmFsaWRhdGVzQVN0YXRlbWVudHNTaWduYXR1cmVBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB7IFNpZ25hdHVyZUFzc2VydGlvbiB9ID0gZWxlbWVudHM7XG5cbiAgbGV0IHNpZ25hdHVyZUFzc2VydGlvbjtcblxuICBzaWduYXR1cmVBc3NlcnRpb24gPSBTaWduYXR1cmVBc3NlcnRpb24uZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChzaWduYXR1cmVBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBzaWduYXR1cmUgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBzaWduYXR1cmVBc3NlcnRpb24gPSBzaWduYXR1cmVBc3NlcnRpb24udmFsaWRhdGUoY29udGV4dCk7ICAvLy9cblxuICAgIGlmIChzaWduYXR1cmVBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhbGlkYXRlc0FTdGF0ZW1lbnRzU2lnbmF0dXJlQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzQVN0YXRlbWVudHNTaWduYXR1cmVBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgc2lnbmF0dXJlIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQVN0YXRlbWVudHNTaWduYXR1cmVBc3NlcnRpb247XG59XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRlcm1zID0gW1xuICB2YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlLFxuICB1bmlmeVRlcm1XaXRoQ29uc3RydWN0b3JzLFxuICB1bmlmeVRlcm1XaXRoQnJhY2tldGVkQ29uc3RydWN0b3Jcbl07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN0YXRlbWVudHMgPSBbXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNNZXRhdmFyaWFibGUsXG4gIHVuaWZ5U3RhdGVtZW50V2l0aENvbWJpbmF0b3JzLFxuICB1bmlmeVN0YXRlbWVudFdpdGhCcmFja2V0ZWRDb21iaW5hdG9yLFxuICB2YWxpZGF0ZVN0YXRlbWVudEFzRXF1YWxpdHksXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNKdWRnZW1lbnQsXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uLFxuICB2YWxpZGF0ZVN0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbixcbiAgdmFsaWRhdGVTdGF0ZW1lbnRBc1Byb3BlcnR5QXNzZXJ0aW9uLFxuICB2YWxpZGF0ZVN0YXRlbWVudEFzU3VicHJvb2ZBc3NlcnRpb24sXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb24sXG4gIHZhbGlkYXRlU3RhdGVtZW50QXNTaWduYXR1cmVBc3NlcnRpb25cbl07XG4iXSwibmFtZXMiOlsidmFsaWRhdGVTdGF0ZW1lbnRzIiwidmFsaWRhdGVUZXJtcyIsInZhbGlkYXRlVGVybUFzVmFyaWFibGUiLCJ0ZXJtIiwiY29udGV4dCIsInZhbGlkYXRlRm9yd2FyZHMiLCJ0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZSIsIlZhcmlhYmxlIiwiZWxlbWVudHMiLCJ2YXJpYWJsZSIsImZyb21UZXJtIiwidGVybVN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwidmFsaWRhdGUiLCJ0eXBlIiwiZ2V0VHlwZSIsInR5cGVTdHJpbmciLCJwcm92aXNpb25hbCIsImlzUHJvdmlzaW9uYWwiLCJwcm92aXNpb25hbGx5U3RyaW5nIiwicHJvdmlzaW9uYWxseVN0cmluZ0Zyb21Qcm92aXNpb25hbCIsInNldFR5cGUiLCJzZXRQcm92aXNpb25hbCIsInZhbGlkYXRlc0ZvcndhcmRzIiwiZGVidWciLCJ1bmlmeVRlcm1XaXRoQ29uc3RydWN0b3JzIiwidGVybVVuaWZpZXNXaXRoQ29uc3RydWN0b3JzIiwiY29uc3RydWN0b3JzIiwiZ2V0Q29uc3RydWN0b3JzIiwic29tZSIsImNvbnN0cnVjdG9yIiwidGVybVVuaWZpZXNXaXRoQ29uc3RydWN0b3IiLCJjaG9vc2UiLCJ0ZXJtVW5pZmllcyIsInVuaWZ5VGVybSIsImNvbW1pdCIsInVuaWZ5VGVybVdpdGhCcmFja2V0ZWRDb25zdHJ1Y3RvciIsInRlcm1VbmlmaWVzV2l0aEJyYWNrZXRlZENvbnN0cnVjdG9yIiwiYnJhY2tldGVkQ29uc3RydWN0b3IiLCJicmFja2V0ZWRDb25zdHJ1Y3RvckZyb21Ob3RoaW5nIiwidmFsaWRhdGVTdGF0ZW1lbnRBc01ldGF2YXJpYWJsZSIsInN0YXRlbWVudCIsInN0YXRlbWVudFZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlIiwiTWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlIiwiZnJvbVN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsInN0cmljdCIsIlRlcm1TdWJzdGl0dXRpb24iLCJGcmFtZVN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInRlcm1TdWJzdGl0dXRpb24iLCJmcmFtZVN1YnN0aXR1dGlvbiIsInVuaWZ5U3RhdGVtZW50V2l0aENvbWJpbmF0b3JzIiwic3RhdGVtZW50VW5pZmllc1dpdGhDb21iaW5hdG9ycyIsImNvbWJpbmF0b3JzIiwiZ2V0Q29tYmluYXRvcnMiLCJjb21iaW5hdG9yIiwic3RhdGVtZW50VW5pZmllcyIsImRlc2NlbmQiLCJ1bmlmeVN0YXRlbWVudCIsInVuaWZ5U3RhdGVtZW50V2l0aEJyYWNrZXRlZENvbWJpbmF0b3IiLCJzdGF0ZW1lbnRVbmlmaWVzV2l0aEJyYWNrZXRlZENvbWJpbmF0b3IiLCJicmFja2V0ZWRDb21iaW5hdG9yIiwiYnJhY2tldGVkQ29tYmluYXRvckZyb21Ob3RoaW5nIiwidmFsaWRhdGVTdGF0ZW1lbnRBc0VxdWFsaXR5Iiwic3RhdGVtZW50VmFsaWRhdGVzQXNFcXVhbGl0eSIsIkVxdWFsaXR5IiwiZXF1YWxpdHkiLCJ2YWxpZGF0ZVN0YXRlbWVudEFzSnVkZ2VtZW50IiwidmFsaWRhdGVzU3RhdGVtZW50QXNKdWRnZW1lbnQiLCJqdWRnZW1lbnQiLCJKdWRnZW1lbnQiLCJ2YWxpZGF0ZVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsInZhbGlkYXRlc1N0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsIlR5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uIiwidmFsaWRhdGVTdGF0ZW1lbnRBc0RlZmluZWRBc3NlcnRpb24iLCJ2YWxpZGF0ZXNTdGF0ZW1lbnRBc0RlZmluZWRBc3NlcnRpb24iLCJEZWZpbmVkQXNzZXJ0aW9uIiwiZGVmaW5lZEFzc2VydGlvbiIsInZhbGlkYXRlU3RhdGVtZW50QXNQcm9wZXJ0eUFzc2VydGlvbiIsInN0YXRlbWVudFZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb24iLCJQcm9wZXJ0eUFzc2VydGlvbiIsInByb3BlcnR5QXNzZXJ0aW9uIiwidmFsaWRhdGVTdGF0ZW1lbnRBc1N1YnByb29mQXNzZXJ0aW9uIiwic3RhdGVtZW50VmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbiIsIlN1YnByb29mQXNzZXJ0aW9uIiwic3VicHJvb2ZBc3NlcnRpb24iLCJ2YWxpZGF0ZVN0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uIiwidmFsaWRhdGVzU3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb24iLCJDb250YWluZWRBc3NlcnRpb24iLCJjb250YWluZWRBc3NlcnRpb24iLCJ2YWxpZGF0ZVN0YXRlbWVudEFzU2lnbmF0dXJlQXNzZXJ0aW9uIiwidmFsaWRhdGVzQVN0YXRlbWVudHNTaWduYXR1cmVBc3NlcnRpb24iLCJTaWduYXR1cmVBc3NlcnRpb24iLCJzaWduYXR1cmVBc3NlcnRpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQTZZYUE7ZUFBQUE7O1FBTkFDO2VBQUFBOzs7aUVBcllRO3lCQUVXO3dCQUNtQjswQkFDNkI7Ozs7OztBQUVoRixTQUFTQyx1QkFBdUJDLElBQUksRUFBRUMsT0FBTyxFQUFFQyxnQkFBZ0I7SUFDN0QsSUFBSUMsMEJBQTBCO0lBRTlCLE1BQU0sRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGlCQUFRO0lBRTdCLElBQUlDO0lBRUpBLFdBQVdGLFNBQVNHLFFBQVEsQ0FBQ1AsTUFBTUM7SUFFbkMsSUFBSUssYUFBYSxNQUFNO1FBQ3JCLE1BQU1FLGFBQWFSLEtBQUtTLFNBQVM7UUFFakNSLFFBQVFTLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixFQUFFRixXQUFXLHVCQUF1QixDQUFDO1FBRXBFRixXQUFXQSxTQUFTSyxRQUFRLENBQUNWO1FBRTdCLElBQUlLLGFBQWEsTUFBTTtZQUNyQixN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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": "1.0.948",
4
+ "version": "1.0.950",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-verify-cli",
7
7
  "description": "Occam's Verifier",
@@ -12,12 +12,12 @@
12
12
  "dependencies": {
13
13
  "argumentative": "^2.0.47",
14
14
  "necessary": "^17.1.7",
15
- "occam-furtle": "^3.0.205",
15
+ "occam-furtle": "^3.0.206",
16
16
  "occam-grammars": "^1.3.524",
17
- "occam-languages": "^0.0.210",
17
+ "occam-languages": "^0.0.212",
18
18
  "occam-lexers": "^23.1.44",
19
19
  "occam-model": "^1.0.506",
20
- "occam-nominal": "^1.0.109",
20
+ "occam-nominal": "^1.0.110",
21
21
  "occam-parsers": "^23.1.50",
22
22
  "occam-server": "^7.0.7"
23
23
  },
@@ -113,7 +113,7 @@ export default define(class ContainedAssertion extends Assertion {
113
113
  const termSingular = this.term.isSingular();
114
114
 
115
115
  if (termSingular) {
116
- const term = this.term.validate(context, (term) => {
116
+ const term = this.term.validate(context, (term, context) => {
117
117
  const validatesForwards = true;
118
118
 
119
119
  return validatesForwards;
@@ -104,7 +104,7 @@ export default define(class DefinedAssertion extends Assertion {
104
104
  const termSingular = this.term.isSingular();
105
105
 
106
106
  if (termSingular) {
107
- const term = this.term.validate(context, (term) => {
107
+ const term = this.term.validate(context, (term, context) => {
108
108
  const validatesForwards = true;
109
109
 
110
110
  return validatesForwards;
@@ -127,7 +127,7 @@ export default define(class PropertyAssertion extends Assertion {
127
127
  context.trace(`Validating the '${propertyAssertionString}' property assertion's term...`);
128
128
 
129
129
  const type = this.getType(),
130
- term = this.term.validate(context, (term) => {
130
+ term = this.term.validate(context, (term, context) => {
131
131
  let validatesForwards = false;
132
132
 
133
133
  const termType = term.getType(),
@@ -123,7 +123,7 @@ export default define(class TypeAssertion extends Assertion {
123
123
 
124
124
  context.trace(`Validating the '${typeAssertionString}' stated type assertion...`);
125
125
 
126
- const term = this.term.validate(context, (term) => {
126
+ const term = this.term.validate(context, (term, context) => {
127
127
  let validatesForwards = false;
128
128
 
129
129
  const termType = term.getType(),
@@ -277,7 +277,7 @@ export default define(class TypeAssertion extends Assertion {
277
277
 
278
278
  function validateWhenDerived(term, type, context) {
279
279
  if (term !== null) {
280
- term = term.validate(context, (term) => {
280
+ term = term.validate(context, (term, context) => {
281
281
  let validatesForwards = false;
282
282
 
283
283
  const termType = term.getType(),
@@ -20,7 +20,7 @@ export default define(class BracketedConstructor extends Constructor {
20
20
 
21
21
  context.trace(`Unifying the '${termString}' term with the bracketed constructor...`);
22
22
 
23
- termUnifies = super.unifyTerm(term, context, (term) => {
23
+ termUnifies = super.unifyTerm(term, context, (term, context) => {
24
24
  let validatesForwards = false;
25
25
 
26
26
  const bracketedTerm = term, ///
@@ -34,7 +34,7 @@ export default define(class BracketedConstructor extends Constructor {
34
34
 
35
35
  bracketlessTerm = termFromTermNode(bracketlessTermNode, context);
36
36
 
37
- bracketlessTerm = bracketlessTerm.validate(context, (bracketlessTerm) => { ///
37
+ bracketlessTerm = bracketlessTerm.validate(context, (bracketlessTerm, context) => { ///
38
38
  let validatesForwards;
39
39
 
40
40
  const type = bracketlessTerm.getType(),
@@ -44,7 +44,7 @@ export default define(class BracketedConstructor extends Constructor {
44
44
 
45
45
  bracketedTerm.setProvisional(provisional);
46
46
 
47
- validatesForwards = validateForwards(bracketedTerm);
47
+ validatesForwards = validateForwards(bracketedTerm, context);
48
48
 
49
49
  return validatesForwards;
50
50
  });
@@ -8,7 +8,6 @@ import { instantiateConstructor } from "../process/instantiate";
8
8
  import { termFromConstructorNode } from "../utilities/element";
9
9
  import { unifyTermWithConstructor } from "../process/unify";
10
10
  import { validateTermAsConstructor } from "../process/validate";
11
- import { provisionallyStringFromProvisional } from "../utilities/string";
12
11
  import { attempt, serialise, unserialise, instantiate } from "../utilities/context";
13
12
  import { breakPointFromJSON, breakPointToBreakPointJSON } from "../utilities/breakPoint";
14
13
 
@@ -123,19 +122,13 @@ export default define(class Constructor extends Element {
123
122
  termUnifiesWithConstructor = unifyTermWithConstructor(term, constructor, generalContext, specifiContext);
124
123
 
125
124
  if (termUnifiesWithConstructor) {
126
- let validatesForwards;
127
-
128
- const typeString = this.type.getString(),
129
- provisional = this.type.isProvisional(),
130
- provisionallyString = provisionallyStringFromProvisional(provisional)
131
-
132
- context.trace(`Setting the '${termString}' term's type to the '${constructorString}' constructor's '${typeString}' type${provisionallyString}.`);
125
+ const provisional = this.type.isProvisional();
133
126
 
134
127
  term.setType(this.type);
135
128
 
136
129
  term.setProvisional(provisional);
137
130
 
138
- validatesForwards = validateForwards(term);
131
+ const validatesForwards = validateForwards(term, context);
139
132
 
140
133
  if (validatesForwards) {
141
134
  termUnifies = true;
@@ -180,10 +180,10 @@ export default define(class Equality extends Element {
180
180
  let leftTerm,
181
181
  rightTerm;
182
182
 
183
- leftTerm = this.leftTerm.validate(context, (leftTerm) => {
183
+ leftTerm = this.leftTerm.validate(context, (leftTerm, context) => {
184
184
  let validatesForwards = false;
185
185
 
186
- rightTerm = this.rightTerm.validate(context, (rightTerm) => {
186
+ rightTerm = this.rightTerm.validate(context, (rightTerm, context) => {
187
187
  let validatesForwards = false;
188
188
 
189
189
  const leftTermType = leftTerm.getType(),
@@ -279,7 +279,7 @@ export default define(class Metavariable extends Element {
279
279
  }
280
280
  } else {
281
281
  if (!strict) {
282
- term = this.term.validate(context, (term) => {
282
+ term = this.term.validate(context, (term, context) => {
283
283
  const validatesForwards = true;
284
284
 
285
285
  return validatesForwards;
@@ -138,7 +138,7 @@ export default define(class Property extends Element {
138
138
  if (validProperty !== null) {
139
139
  property = validProperty; ///
140
140
 
141
- const validatesForward = validateForwards(property);
141
+ const validatesForward = validateForwards(property, context);
142
142
 
143
143
  if (validatesForward) {
144
144
  validates = true;
@@ -150,7 +150,7 @@ export default define(class Property extends Element {
150
150
  } else {
151
151
  {
152
152
  const property = this, ///
153
- validatesForward = validateForwards(property);
153
+ validatesForward = validateForwards(property, context);
154
154
 
155
155
  if (validatesForward) {
156
156
  validates = true;
@@ -181,7 +181,7 @@ export default define(class Property extends Element {
181
181
 
182
182
  let validatesGivenType = false;
183
183
 
184
- property = this.validate(context, (property) => {
184
+ property = this.validate(context, (property, context) => {
185
185
  let validatesForwards = false;
186
186
 
187
187
  const propertyName = property.getName(),
@@ -104,7 +104,7 @@ export default define(class PropertyRelation extends Element {
104
104
 
105
105
  context.trace(`Validating the '${propertyRelationString}' property relation's term...`);
106
106
 
107
- const term = this.term.validate(context, (term) => {
107
+ const term = this.term.validate(context, (term, context) => {
108
108
  const validatesForwards = true;
109
109
 
110
110
  return validatesForwards;
@@ -151,7 +151,7 @@ export default define(class Signature extends Element {
151
151
  const terms = [];
152
152
 
153
153
  termsValidate = this.terms.every((term) => {
154
- term = term.validate(context, (term) => { ///
154
+ term = term.validate(context, (term, context) => { ///
155
155
  const validatesForwards = true;
156
156
 
157
157
  return validatesForwards;
@@ -140,7 +140,7 @@ export default define(class TermSubstitution extends Substitution {
140
140
  if (targetTermSingular) {
141
141
  manifest((context) => {
142
142
  descend((context) => {
143
- const targetTerm = this.targetTerm.validate(context, (targetTerm) => {
143
+ const targetTerm = this.targetTerm.validate(context, (targetTerm, context) => {
144
144
  const validatesForwards = true;
145
145
 
146
146
  return validatesForwards;
@@ -175,7 +175,7 @@ export default define(class TermSubstitution extends Substitution {
175
175
  context.trace(`Validating the '${termSubstitutionString}' term substitution's replacement term...`);
176
176
 
177
177
  descend((context) => {
178
- const replacementTerm = this.replacementTerm.validate(context, (replacementTerm) => {
178
+ const replacementTerm = this.replacementTerm.validate(context, (replacementTerm, context) => {
179
179
  const validatesForwards = true;
180
180
 
181
181
  return validatesForwards;
@@ -195,7 +195,7 @@ export default define(class Term extends Element {
195
195
  if (validTerm !== null) {
196
196
  term = validTerm; ///
197
197
 
198
- const validatesForward = validateForwards(term);
198
+ const validatesForward = validateForwards(term, context);
199
199
 
200
200
  if (validatesForward) {
201
201
  validates = true;
@@ -238,16 +238,22 @@ export default define(class Term extends Element {
238
238
 
239
239
  let validatesGivenType = false;
240
240
 
241
- term = this.validate(context, (term) => {
242
- let validatesForwards;
241
+ term = this.validate(context, (term, context) => {
242
+ let validatesForwards = false;
243
243
 
244
- const provisional = type.isProvisional();
244
+ const termType = term.getType(),
245
+ termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
245
246
 
246
- term.setType(type);
247
+ if (termTypeEqualToOrSubTypeOfType) {
248
+ validatesForwards = true;
247
249
 
248
- term.setProvisional(provisional);
250
+ const typeEstablished = type.isEstablished(),
251
+ termProvisional = term.isProvisional();
249
252
 
250
- validatesForwards = true;
253
+ if (typeEstablished && termProvisional) {
254
+ validatesForwards = false;
255
+ }
256
+ }
251
257
 
252
258
  return validatesForwards;
253
259
  });
package/src/pass/zip.js CHANGED
@@ -6,8 +6,8 @@ export default class ZipPass extends ZipPassBase {
6
6
  run(generalNonTerminalNode, specificNonTerminalNode, ...remainingArguments) {
7
7
  let success = false;
8
8
 
9
- const specificChildNodes = specificNonTerminalNode.getChildNodes(), ///
10
- generalChildNodes = generalNonTerminalNode.getChildNodes(), ///
9
+ const generalChildNodes = generalNonTerminalNode.getChildNodes(), ///
10
+ specificChildNodes = specificNonTerminalNode.getChildNodes(), ///
11
11
  descended = this.descend(generalChildNodes, specificChildNodes, ...remainingArguments);
12
12
 
13
13
  if (descended) {
@@ -57,7 +57,7 @@ class CombinatorPass extends SimplePass {
57
57
 
58
58
  term = termFromTermNode(termNode, context);
59
59
 
60
- term = term.validate(context, (term) => { ///
60
+ term = term.validate(context, (term, context) => { ///
61
61
  const validatesForwards = true;
62
62
 
63
63
  return validatesForwards;
@@ -113,7 +113,7 @@ class ConstructorPass extends SimplePass {
113
113
 
114
114
  term = termFromTermNode(termNode, context);
115
115
 
116
- term = term.validate(context, (term) => { ///
116
+ term = term.validate(context, (term, context) => { ///
117
117
  const validatesForwards = true;
118
118
 
119
119
  return validatesForwards;
@@ -46,12 +46,12 @@ export function ablate(innerFunction, context) {
46
46
  const released = context.isReleased();
47
47
 
48
48
  if (!released) {
49
- let contextNominalFileContext = (context instanceof NominalFileContext);
49
+ let contextExtraneousContext = isContextExtraneousContext(context);
50
50
 
51
- while (!contextNominalFileContext) {
51
+ while (contextExtraneousContext) {
52
52
  context = context.getContext();
53
53
 
54
- contextNominalFileContext = (context instanceof NominalFileContext);
54
+ contextExtraneousContext = isContextExtraneousContext(context);
55
55
  }
56
56
  }
57
57
 
@@ -162,12 +162,12 @@ export function ablates(innerFunction, ...contexts) {
162
162
  const released = context.isReleased();
163
163
 
164
164
  if (!released) {
165
- let contextNominalFileContext = (context instanceof NominalFileContext);
165
+ let contextExtraneousContext = isContextExtraneousContext(context);
166
166
 
167
- while (!contextNominalFileContext) {
167
+ while (contextExtraneousContext) {
168
168
  context = context.getContext();
169
169
 
170
- contextNominalFileContext = (context instanceof NominalFileContext);
170
+ contextExtraneousContext = isContextExtraneousContext(context);
171
171
  }
172
172
  }
173
173
 
@@ -215,3 +215,11 @@ export function evaluate(procedure, terms) {
215
215
 
216
216
  return procedure.call(terms, context);
217
217
  }
218
+
219
+ function isContextExtraneousContext(context) {
220
+ const contextBoundedContext = (context instanceof BoundedContext),
221
+ contextNominalFileContext = (context instanceof NominalFileContext),
222
+ contextExtraneousContext = (!contextBoundedContext && !contextNominalFileContext);
223
+
224
+ return contextExtraneousContext;
225
+ }
@@ -34,7 +34,7 @@ function validateTermAsVariable(term, context, validateForwards) {
34
34
 
35
35
  term.setProvisional(provisional);
36
36
 
37
- const validatesForwards = validateForwards(term);
37
+ const validatesForwards = validateForwards(term, context);
38
38
 
39
39
  if (validatesForwards) {
40
40
  termValidatesAsVariable = true;
@@ -50,24 +50,24 @@ function validateTermAsVariable(term, context, validateForwards) {
50
50
  }
51
51
 
52
52
  function unifyTermWithConstructors(term, context, validateForwards) {
53
- let termUnifiesWithConstructors = false;
53
+ let termUnifiesWithConstructors;
54
54
 
55
55
  const constructors = context.getConstructors();
56
56
 
57
- constructors.some((constructor) => {
58
- let termUnifies;
57
+ termUnifiesWithConstructors = constructors.some((constructor) => {
58
+ let termUnifiesWithConstructor = false;
59
59
 
60
60
  choose((context) => {
61
- termUnifies = constructor.unifyTerm(term, context, validateForwards);
61
+ const termUnifies = constructor.unifyTerm(term, context, validateForwards);
62
62
 
63
63
  if (termUnifies) {
64
+ termUnifiesWithConstructor = true;
65
+
64
66
  context.commit();
65
67
  }
66
68
  }, context);
67
69
 
68
- if (termUnifies) {
69
- termUnifiesWithConstructors = true;
70
-
70
+ if (termUnifiesWithConstructor) {
71
71
  return true;
72
72
  }
73
73
  });