occam-furtle 2.0.280 → 2.0.283

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +0 -11
  2. package/lib/constants.js +29 -1
  3. package/lib/context/block.js +15 -1
  4. package/lib/context/file.js +129 -52
  5. package/lib/element/assignment/array.js +186 -0
  6. package/lib/element/assignment/object.js +244 -0
  7. package/lib/element/assignment/variable.js +144 -0
  8. package/lib/element/assignments/variable.js +158 -0
  9. package/lib/element/block/return.js +198 -0
  10. package/lib/element/comparison.js +179 -0
  11. package/lib/element/declaration/procedure.js +139 -0
  12. package/lib/{dom → element}/error.js +12 -4
  13. package/lib/element/every.js +179 -0
  14. package/lib/element/expression/bitwise.js +186 -0
  15. package/lib/element/expression/bracketed.js +149 -0
  16. package/lib/element/expression/negated.js +166 -0
  17. package/lib/element/expression.js +578 -0
  18. package/lib/element/expressions.js +210 -0
  19. package/lib/{dom → element}/label.js +4 -4
  20. package/lib/element/parameter/named.js +198 -0
  21. package/lib/element/parameter.js +165 -0
  22. package/lib/element/parameters/named.js +220 -0
  23. package/lib/element/parameters.js +198 -0
  24. package/lib/element/procedure/anonymous.js +181 -0
  25. package/lib/element/procedure.js +212 -0
  26. package/lib/element/procedureCall.js +166 -0
  27. package/lib/element/query/node.js +186 -0
  28. package/lib/element/query/nodes.js +179 -0
  29. package/lib/element/reduce.js +181 -0
  30. package/lib/element/reference.js +138 -0
  31. package/lib/element/some.js +179 -0
  32. package/lib/element/statement/return.js +138 -0
  33. package/lib/element/step.js +154 -0
  34. package/lib/element/ternary.js +171 -0
  35. package/lib/element/variable.js +279 -0
  36. package/lib/elements.js +27 -0
  37. package/lib/index.js +13 -5
  38. package/lib/log.js +202 -0
  39. package/lib/preamble.js +32 -32
  40. package/lib/process/verify.js +289 -0
  41. package/lib/utilities/context.js +46 -5
  42. package/lib/utilities/element.js +3 -0
  43. package/lib/utilities/node.js +71 -0
  44. package/package.json +3 -1
  45. package/src/constants.js +16 -0
  46. package/src/context/block.js +10 -0
  47. package/src/context/file.js +97 -55
  48. package/src/{dom → element}/assignment/array.js +6 -6
  49. package/src/{dom → element}/assignment/object.js +8 -8
  50. package/src/{dom → element}/assignment/variable.js +4 -4
  51. package/src/{dom → element}/assignments/variable.js +5 -5
  52. package/src/{dom → element}/block/return.js +5 -5
  53. package/src/{dom → element}/comparison.js +5 -5
  54. package/src/{dom → element}/declaration/procedure.js +22 -4
  55. package/src/{dom → element}/error.js +13 -4
  56. package/src/{dom → element}/every.js +6 -6
  57. package/src/{dom → element}/expression/bitwise.js +5 -5
  58. package/src/{dom → element}/expression/bracketed.js +4 -4
  59. package/src/{dom → element}/expression/negated.js +5 -5
  60. package/src/{dom → element}/expression.js +4 -4
  61. package/src/{dom → element}/expressions.js +6 -6
  62. package/src/{dom → element}/label.js +4 -4
  63. package/src/{dom → element}/parameter/named.js +4 -4
  64. package/src/{dom → element}/parameter.js +4 -4
  65. package/src/{dom → element}/parameters/named.js +5 -5
  66. package/src/{dom → element}/parameters.js +5 -5
  67. package/src/{dom → element}/procedure/anonymous.js +4 -4
  68. package/src/{dom → element}/procedure.js +5 -5
  69. package/src/{dom → element}/procedureCall.js +4 -4
  70. package/src/{dom → element}/query/node.js +5 -5
  71. package/src/{dom → element}/query/nodes.js +5 -5
  72. package/src/{dom → element}/reduce.js +5 -5
  73. package/src/{dom → element}/reference.js +4 -4
  74. package/src/{dom → element}/some.js +6 -6
  75. package/src/{dom → element}/statement/return.js +4 -4
  76. package/src/{dom → element}/step.js +4 -4
  77. package/src/{dom → element}/ternary.js +4 -4
  78. package/src/{dom → element}/variable.js +5 -5
  79. package/src/elements.js +13 -0
  80. package/src/index.js +6 -2
  81. package/src/log.js +139 -0
  82. package/src/preamble.js +31 -31
  83. package/src/process/verify.js +157 -0
  84. package/src/utilities/context.js +45 -2
  85. package/src/utilities/element.js +0 -0
  86. package/src/utilities/{string.js → node.js} +9 -14
  87. package/test/Free and bound variables.ftl +112 -0
  88. package/test/context/file.js +127 -0
  89. package/{src/example → test}/context/release.js +60 -12
  90. package/test/helpers/constants.js +17 -0
  91. package/{src/example/utilities → test/helpers}/expressions.js +8 -4
  92. package/{src/example/utilities → test/helpers}/furtle.js +8 -4
  93. package/{src/example/utilities → test/helpers}/grammar.js +8 -4
  94. package/{src/example/utilities → test/helpers}/nominal.js +10 -5
  95. package/{src/example/utilities → test/helpers}/procedure.js +6 -2
  96. package/test/main.js +55 -0
  97. package/example/Free and bound variables.ftl +0 -75
  98. package/lib/dom/assignment/array.js +0 -186
  99. package/lib/dom/assignment/object.js +0 -244
  100. package/lib/dom/assignment/variable.js +0 -144
  101. package/lib/dom/assignments/variable.js +0 -158
  102. package/lib/dom/block/return.js +0 -198
  103. package/lib/dom/comparison.js +0 -179
  104. package/lib/dom/declaration/procedure.js +0 -125
  105. package/lib/dom/every.js +0 -179
  106. package/lib/dom/expression/bitwise.js +0 -186
  107. package/lib/dom/expression/bracketed.js +0 -149
  108. package/lib/dom/expression/negated.js +0 -166
  109. package/lib/dom/expression.js +0 -578
  110. package/lib/dom/expressions.js +0 -210
  111. package/lib/dom/parameter/named.js +0 -198
  112. package/lib/dom/parameter.js +0 -165
  113. package/lib/dom/parameters/named.js +0 -220
  114. package/lib/dom/parameters.js +0 -198
  115. package/lib/dom/procedure/anonymous.js +0 -181
  116. package/lib/dom/procedure.js +0 -212
  117. package/lib/dom/procedureCall.js +0 -166
  118. package/lib/dom/query/node.js +0 -186
  119. package/lib/dom/query/nodes.js +0 -179
  120. package/lib/dom/reduce.js +0 -181
  121. package/lib/dom/reference.js +0 -138
  122. package/lib/dom/some.js +0 -179
  123. package/lib/dom/statement/return.js +0 -138
  124. package/lib/dom/step.js +0 -154
  125. package/lib/dom/ternary.js +0 -171
  126. package/lib/dom/variable.js +0 -279
  127. package/lib/dom.js +0 -27
  128. package/lib/example/context/file.js +0 -130
  129. package/lib/example/context/release.js +0 -160
  130. package/lib/example/utilities/expressions.js +0 -29
  131. package/lib/example/utilities/furtle.js +0 -19
  132. package/lib/example/utilities/grammar.js +0 -26
  133. package/lib/example/utilities/nominal.js +0 -25
  134. package/lib/example/utilities/procedure.js +0 -18
  135. package/lib/utilities/string.js +0 -78
  136. package/src/dom.js +0 -13
  137. package/src/example/context/file.js +0 -69
  138. /package/{example → test}/customGrammars.json +0 -0
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
 
3
- import { fileSystemUtilities } from "necessary";
4
- import { CustomGrammar, CombinedCustomGrammar } from "occam-custom-grammars";
3
+ const { fileSystemUtilities } = require("necessary"),
4
+ { CustomGrammar, CombinedCustomGrammar } = require("occam-custom-grammars");
5
5
 
6
6
  const { readFile } = fileSystemUtilities;
7
7
 
8
- export function combinedCustomGrammarFromNothing() {
9
- const filePath = "example/customGrammars.json",
8
+ function combinedCustomGrammarFromNothing() {
9
+ const filePath = "test/customGrammars.json",
10
10
  fileContent = readFile(filePath),
11
11
  json = JSON.parse(fileContent),
12
12
  customGrammars = customGrammarsFromJSON(json),
@@ -16,6 +16,10 @@ export function combinedCustomGrammarFromNothing() {
16
16
  return combinedCustomGrammar;
17
17
  }
18
18
 
19
+ module.exports = {
20
+ combinedCustomGrammarFromNothing
21
+ };
22
+
19
23
  function customGrammarsFromJSON(json) {
20
24
  const customGrammarsJSON = json, ///
21
25
  customGrammars = customGrammarsJSON.map((customGrammarsJSON) => {
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
 
3
- import { lexersUtilities, parsersUtilities } from "occam-custom-grammars";
3
+ const { lexersUtilities, parsersUtilities } = require("occam-custom-grammars");
4
4
 
5
- import FileContext from "../context/file";
5
+ const FileContext = require("../context/file");
6
6
 
7
- import { combinedCustomGrammarFromNothing } from "../utilities/grammar";
7
+ const { combinedCustomGrammarFromNothing } = require("../helpers/grammar");
8
8
 
9
9
  const { nominalLexerFromCombinedCustomGrammar } = lexersUtilities,
10
10
  { nominalParserFromStartRuleNameAndCombinedCustomGrammar } = parsersUtilities;
11
11
 
12
- export function nominalFileContextFromReleaseContext(releaseContext) {
12
+ function nominalFileContextFromReleaseContext(releaseContext) {
13
13
  const content = `∀n m = m`,
14
14
  startRuleName = "statement",
15
15
  combinedCustomGrammar = combinedCustomGrammarFromNothing(),
@@ -20,8 +20,13 @@ export function nominalFileContextFromReleaseContext(releaseContext) {
20
20
  tokens = lexer.tokenise(content),
21
21
  node = parser.parse(tokens),
22
22
  context = releaseContext, ///
23
- fileContext = FileContext.fromNodeAndTokens(node, tokens, context),
23
+ filePath = "lemmas.nml",
24
+ fileContext = FileContext.fromNodeTokensAndFilePath(node, tokens, filePath, context),
24
25
  nominalFileContext = fileContext; ///
25
26
 
26
27
  return nominalFileContext;
27
28
  }
29
+
30
+ module.exports = {
31
+ nominalFileContextFromReleaseContext
32
+ };
@@ -1,13 +1,17 @@
1
1
  "use strict";
2
2
 
3
- import { arrayUtilities } from "necessary";
3
+ const { arrayUtilities } = require("necessary");
4
4
 
5
5
  const { first } = arrayUtilities;
6
6
 
7
- export function procedureFromReleaseContext(releaseContext) {
7
+ function procedureFromReleaseContext(releaseContext) {
8
8
  const procedures = releaseContext.getProcedures(),
9
9
  firstProcedure = first(procedures),
10
10
  procedure = firstProcedure; ///
11
11
 
12
12
  return procedure;
13
13
  }
14
+
15
+ module.exports = {
16
+ procedureFromReleaseContext
17
+ };
package/test/main.js ADDED
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ const { assert } = require("chai");
4
+
5
+ const ReleaseContext = require("./context/release");
6
+
7
+ const { furtleFileFromNothing } = require("./helpers/furtle"),
8
+ { expressionsFromFileContext } = require("./helpers/expressions"),
9
+ { procedureFromReleaseContext } = require("./helpers/procedure"),
10
+ { nominalFileContextFromReleaseContext } = require("./helpers/nominal");
11
+
12
+ describe("src/eliminateLeftRecursion", () => {
13
+ let fileContext,
14
+ releaseContext;
15
+
16
+ before(() => {
17
+ releaseContext = ReleaseContext.fromNothing();
18
+
19
+ const furtleFile = furtleFileFromNothing(),
20
+ file = furtleFile; ///
21
+
22
+ releaseContext.addFile(file);
23
+
24
+ releaseContext.verify();
25
+ });
26
+
27
+ before(() => {
28
+ const nominalFileContext = nominalFileContextFromReleaseContext(releaseContext);
29
+
30
+ fileContext = nominalFileContext; ///
31
+
32
+ releaseContext.addFileContext(fileContext);
33
+ });
34
+
35
+ it("returns true", () => {
36
+ const free = true,
37
+ procedure = procedureFromReleaseContext(releaseContext),
38
+ expressions = expressionsFromFileContext(fileContext, free);
39
+
40
+ // try {
41
+ const context = fileContext, ///
42
+ expression = procedure.call(expressions, context),
43
+ boolean = expression.getBoolean();
44
+
45
+ assert.isTrue(boolean);
46
+
47
+ console.log(boolean);
48
+ // } catch (exception) {
49
+ // const message = exception.getMessage();
50
+ //
51
+ // console.log(message);
52
+ // }
53
+
54
+ });
55
+ });
@@ -1,75 +0,0 @@
1
- Boolean isVariableFree(Node termNode, Node statementNode) {
2
- Boolean variableFree = true;
3
-
4
- Boolean variableBound = isVariableBound(termNode, statementNode);
5
-
6
- If (variableBound) {
7
- variableFree = false;
8
- }
9
-
10
- Return variableFree;
11
- }
12
-
13
- Boolean isVariableBound(Node termNode, Node statementNode) {
14
- Boolean variableBound = false;
15
-
16
- String variableName = variableNameFromTermNode(termNode);
17
-
18
- If (variableName != "") {
19
- Nodes statementNodes = nodesQuery(statementNode, //statement);
20
-
21
- ForEach(statementNodes, (Node statementNode) {
22
- If (!variableBound) {
23
- String boundVariableName = boundVariableNameFromStatementNode(statementNode);
24
-
25
- If (boundVariableName == variableName) {
26
- variableBound = true;
27
- }
28
- }
29
- });
30
- }
31
-
32
- Return variableBound;
33
- }
34
-
35
- String variableNameFromTermNode(Node termNode) {
36
- String variableName = "";
37
-
38
- Node variableIdentifierTerminalNode = nodeQuery(termNode, /term/variable/@identifier);
39
-
40
- If (variableIdentifierTerminalNode != null) {
41
- { String content } = variableIdentifierTerminalNode;
42
-
43
- variableName = content;
44
- }
45
-
46
- Return variableName;
47
- }
48
-
49
- String boundVariableNameFromStatementNode(Node statementNode) {
50
- String boundVariableName = "";
51
-
52
- { Nodes childNodes } = statementNode;
53
-
54
- [ Node firstChildNode ] = childNodes;
55
-
56
- { Boolean terminal } = firstChildNode;
57
-
58
- If (terminal) {
59
- { String content } = firstChildNode;
60
-
61
- If ((content == "∀") || (content == "∃")) {
62
- [ _, Node argumentNode ] = childNodes;
63
-
64
- Node boundVariableIdentifierTerminalNode = nodeQuery(argumentNode, /argument/term/variable!/@identifier);
65
-
66
- If (boundVariableIdentifierTerminalNode != null) {
67
- { String content } = boundVariableIdentifierTerminalNode;
68
-
69
- boundVariableName = content;
70
- }
71
- }
72
- }
73
-
74
- Return boundVariableName;
75
- }
@@ -1,186 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return _default;
9
- }
10
- });
11
- var _dom = /*#__PURE__*/ _interop_require_wildcard(require("../../dom"));
12
- var _exception = /*#__PURE__*/ _interop_require_default(require("../../exception"));
13
- var _query = require("../../utilities/query");
14
- var _types = require("../../types");
15
- function _class_call_check(instance, Constructor) {
16
- if (!(instance instanceof Constructor)) {
17
- throw new TypeError("Cannot call a class as a function");
18
- }
19
- }
20
- function _defineProperties(target, props) {
21
- for(var i = 0; i < props.length; i++){
22
- var descriptor = props[i];
23
- descriptor.enumerable = descriptor.enumerable || false;
24
- descriptor.configurable = true;
25
- if ("value" in descriptor) descriptor.writable = true;
26
- Object.defineProperty(target, descriptor.key, descriptor);
27
- }
28
- }
29
- function _create_class(Constructor, protoProps, staticProps) {
30
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
31
- if (staticProps) _defineProperties(Constructor, staticProps);
32
- return Constructor;
33
- }
34
- function _define_property(obj, key, value) {
35
- if (key in obj) {
36
- Object.defineProperty(obj, key, {
37
- value: value,
38
- enumerable: true,
39
- configurable: true,
40
- writable: true
41
- });
42
- } else {
43
- obj[key] = value;
44
- }
45
- return obj;
46
- }
47
- function _interop_require_default(obj) {
48
- return obj && obj.__esModule ? obj : {
49
- default: obj
50
- };
51
- }
52
- function _getRequireWildcardCache(nodeInterop) {
53
- if (typeof WeakMap !== "function") return null;
54
- var cacheBabelInterop = new WeakMap();
55
- var cacheNodeInterop = new WeakMap();
56
- return (_getRequireWildcardCache = function(nodeInterop) {
57
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
58
- })(nodeInterop);
59
- }
60
- function _interop_require_wildcard(obj, nodeInterop) {
61
- if (!nodeInterop && obj && obj.__esModule) {
62
- return obj;
63
- }
64
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
65
- return {
66
- default: obj
67
- };
68
- }
69
- var cache = _getRequireWildcardCache(nodeInterop);
70
- if (cache && cache.has(obj)) {
71
- return cache.get(obj);
72
- }
73
- var newObj = {
74
- __proto__: null
75
- };
76
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
77
- for(var key in obj){
78
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
79
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
80
- if (desc && (desc.get || desc.set)) {
81
- Object.defineProperty(newObj, key, desc);
82
- } else {
83
- newObj[key] = obj[key];
84
- }
85
- }
86
- }
87
- newObj.default = obj;
88
- if (cache) {
89
- cache.set(obj, newObj);
90
- }
91
- return newObj;
92
- }
93
- var _ArrayAssigment;
94
- var stepArrayAssignmentNodeQuery = (0, _query.nodeQuery)("/step/arrayAssignment");
95
- var _default = (0, _dom.domAssigned)((_ArrayAssigment = /*#__PURE__*/ function() {
96
- function ArrayAssigment(string, variable, parameters) {
97
- _class_call_check(this, ArrayAssigment);
98
- this.string = string;
99
- this.variable = variable;
100
- this.parameters = parameters;
101
- }
102
- _create_class(ArrayAssigment, [
103
- {
104
- key: "getString",
105
- value: function getString() {
106
- return this.string;
107
- }
108
- },
109
- {
110
- key: "getVariable",
111
- value: function getVariable() {
112
- return this.variable;
113
- }
114
- },
115
- {
116
- key: "getVariables",
117
- value: function getVariables() {
118
- return this.parameters;
119
- }
120
- },
121
- {
122
- key: "evaluate",
123
- value: function evaluate(context) {
124
- var _this = this;
125
- var arrayAssignmentString = this.string; ///
126
- context.trace("Evaluating the '".concat(arrayAssignmentString, "' array assignment..."));
127
- var expression = this.variable.evaluate(context), expressionType = expression.getType();
128
- if (expressionType !== _types.NODES_TYPE) {
129
- var expressionString = expression.asString(context), message = "The ".concat(expressionString, " expression's '").concat(expressionType, "' type should be '").concat(_types.NODES_TYPE, "'."), exception = _exception.default.fromMessage(message);
130
- throw exception;
131
- }
132
- var nodes = expression.getNodes(), nodesLength = nodes.length, parametersLength = this.parameters.getLength();
133
- if (parametersLength > nodesLength) {
134
- var parametersString = this.parameters.getString(), nodesString = context.nodesAsString(nodex), message1 = "The length of the '".concat(parametersString, "' parameters is greater than the length of the '").concat(nodesString, "' nodes."), exception1 = _exception.default.fromMessage(message1);
135
- throw exception1;
136
- }
137
- this.parameters.forEachParameter(function(parameter, index) {
138
- if (parameter !== null) {
139
- var Expression = _dom.default.Expression, node = nodes[index], expression = Expression.fromNode(node, context);
140
- _this.evaluateParameter(parameter, expression, context);
141
- }
142
- });
143
- context.debug("...evaluated the '".concat(arrayAssignmentString, "' array assignment."));
144
- }
145
- },
146
- {
147
- key: "evaluateParameter",
148
- value: function evaluateParameter(parameter, expression, context) {
149
- var expressionString = expression.asString(context), parameterString = parameter.getString();
150
- context.trace("Evaluating the '".concat(parameterString, "' parameter against the ").concat(expressionString, " expression..."));
151
- var parameterType = parameter.getType();
152
- if (parameterType !== _types.NODE_TYPE) {
153
- var message = "The type of the '".concat(parameterString, "' parameter should be '").concat(_types.NODE_TYPE, "'."), exception = _exception.default.fromMessage(message);
154
- throw exception;
155
- }
156
- var Variable = _dom.default.Variable, variable = Variable.fromParameter(parameter, context);
157
- variable.assign(expression, context);
158
- context.debug("...evaluated the '".concat(parameterString, "' parameter against the ").concat(expressionString, " expression."));
159
- }
160
- }
161
- ], [
162
- {
163
- key: "fromStepNode",
164
- value: function fromStepNode(stepNode, context) {
165
- var arrayAssignment = null;
166
- var stepArrayAssignmentNode = stepArrayAssignmentNodeQuery(stepNode);
167
- if (stepArrayAssignmentNode !== null) {
168
- var arrayAssignmentNode = stepArrayAssignmentNode; ///
169
- arrayAssignment = arrayAssignmentFromArrayAssignmentNode(arrayAssignmentNode, context);
170
- }
171
- return arrayAssignment;
172
- }
173
- }
174
- ]);
175
- return ArrayAssigment;
176
- }(), _define_property(_ArrayAssigment, "name", "ArrayAssignment"), _ArrayAssigment));
177
- function arrayAssignmentFromArrayAssignmentNode(arrayAssignmentNode, context) {
178
- var Variable = _dom.default.Variable, Parameters = _dom.default.Parameters, ArrayAssignment = _dom.default.ArrayAssignment, parameters = Parameters.fromArrayAssignmentNode(arrayAssignmentNode, context), variable = Variable.fromArrayAssignmentNode(arrayAssignmentNode, context), string = stringFromVariableAndParameters(variable, parameters, context), arrayAssignment = new ArrayAssignment(string, variable, parameters);
179
- return arrayAssignment;
180
- }
181
- function stringFromVariableAndParameters(variable, parameters, context) {
182
- var variableString = variable.getString(), parametersString = parameters.getString(), string = "[ ".concat(parametersString, " ] = ").concat(variableString, ";");
183
- return string;
184
- }
185
-
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb20vYXNzaWdubWVudC9hcnJheS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IGRvbSBmcm9tIFwiLi4vLi4vZG9tXCI7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gXCIuLi8uLi9leGNlcHRpb25cIjtcblxuaW1wb3J0IHsgbm9kZVF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgZG9tQXNzaWduZWQgfSBmcm9tIFwiLi4vLi4vZG9tXCI7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIE5PREVTX1RZUEUgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuY29uc3Qgc3RlcEFycmF5QXNzaWdubWVudE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGVwL2FycmF5QXNzaWdubWVudFwiKTtcblxuZXhwb3J0IGRlZmF1bHQgZG9tQXNzaWduZWQoY2xhc3MgQXJyYXlBc3NpZ21lbnQge1xuICBjb25zdHJ1Y3RvcihzdHJpbmcsIHZhcmlhYmxlLCBwYXJhbWV0ZXJzKSB7XG4gICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gIH1cblxuICBnZXRTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICB9XG5cbiAgZ2V0VmFyaWFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFibGU7XG4gIH1cblxuICBnZXRWYXJpYWJsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycztcbiAgfVxuXG4gIGV2YWx1YXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBhcnJheUFzc2lnbm1lbnRTdHJpbmcgPSB0aGlzLnN0cmluZzsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBFdmFsdWF0aW5nIHRoZSAnJHthcnJheUFzc2lnbm1lbnRTdHJpbmd9JyBhcnJheSBhc3NpZ25tZW50Li4uYCk7XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy52YXJpYWJsZS5ldmFsdWF0ZShjb250ZXh0KSxcbiAgICAgICAgICBleHByZXNzaW9uVHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpO1xuXG4gICAgaWYgKGV4cHJlc3Npb25UeXBlICE9PSBOT0RFU19UWVBFKSB7XG4gICAgICBjb25zdCBleHByZXNzaW9uU3RyaW5nID0gZXhwcmVzc2lvbi5hc1N0cmluZyhjb250ZXh0KSxcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgVGhlICR7ZXhwcmVzc2lvblN0cmluZ30gZXhwcmVzc2lvbidzICcke2V4cHJlc3Npb25UeXBlfScgdHlwZSBzaG91bGQgYmUgJyR7Tk9ERVNfVFlQRX0nLmAsXG4gICAgICAgICAgICBleGNlcHRpb24gPSBFeGNlcHRpb24uZnJvbU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlcyA9IGV4cHJlc3Npb24uZ2V0Tm9kZXMoKSxcbiAgICAgICAgICBub2Rlc0xlbmd0aCA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgICBwYXJhbWV0ZXJzTGVuZ3RoID0gdGhpcy5wYXJhbWV0ZXJzLmdldExlbmd0aCgpO1xuXG4gICAgaWYgKHBhcmFtZXRlcnNMZW5ndGggPiBub2Rlc0xlbmd0aCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyc1N0cmluZyA9IHRoaXMucGFyYW1ldGVycy5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIG5vZGVzU3RyaW5nID0gY29udGV4dC5ub2Rlc0FzU3RyaW5nKG5vZGV4KSxcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgVGhlIGxlbmd0aCBvZiB0aGUgJyR7cGFyYW1ldGVyc1N0cmluZ30nIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlICcke25vZGVzU3RyaW5nfScgbm9kZXMuYCxcbiAgICAgICAgICAgIGV4Y2VwdGlvbiA9IEV4Y2VwdGlvbi5mcm9tTWVzc2FnZShtZXNzYWdlKTtcblxuICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgIH1cblxuICAgIHRoaXMucGFyYW1ldGVycy5mb3JFYWNoUGFyYW1ldGVyKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVyICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgRXhwcmVzc2lvbiB9ID0gZG9tLFxuICAgICAgICAgICAgICBub2RlID0gbm9kZXNbaW5kZXhdLFxuICAgICAgICAgICAgICBleHByZXNzaW9uID0gRXhwcmVzc2lvbi5mcm9tTm9kZShub2RlLCBjb250ZXh0KTtcblxuICAgICAgICB0aGlzLmV2YWx1YXRlUGFyYW1ldGVyKHBhcmFtZXRlciwgZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5ldmFsdWF0ZWQgdGhlICcke2FycmF5QXNzaWdubWVudFN0cmluZ30nIGFycmF5IGFzc2lnbm1lbnQuYCk7XG4gIH1cblxuICBldmFsdWF0ZVBhcmFtZXRlcihwYXJhbWV0ZXIsIGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCBleHByZXNzaW9uU3RyaW5nID0gZXhwcmVzc2lvbi5hc1N0cmluZyhjb250ZXh0KSxcbiAgICAgICAgICBwYXJhbWV0ZXJTdHJpbmcgPSBwYXJhbWV0ZXIuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBFdmFsdWF0aW5nIHRoZSAnJHtwYXJhbWV0ZXJTdHJpbmd9JyBwYXJhbWV0ZXIgYWdhaW5zdCB0aGUgJHtleHByZXNzaW9uU3RyaW5nfSBleHByZXNzaW9uLi4uYCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyLmdldFR5cGUoKTtcblxuICAgIGlmIChwYXJhbWV0ZXJUeXBlICE9PSBOT0RFX1RZUEUpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhlIHR5cGUgb2YgdGhlICcke3BhcmFtZXRlclN0cmluZ30nIHBhcmFtZXRlciBzaG91bGQgYmUgJyR7Tk9ERV9UWVBFfScuYCxcbiAgICAgICAgICAgIGV4Y2VwdGlvbiA9IEV4Y2VwdGlvbi5mcm9tTWVzc2FnZShtZXNzYWdlKTtcblxuICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHsgVmFyaWFibGUgfSA9IGRvbSxcbiAgICAgICAgICB2YXJpYWJsZSA9IFZhcmlhYmxlLmZyb21QYXJhbWV0ZXIocGFyYW1ldGVyLCBjb250ZXh0KTtcblxuICAgIHZhcmlhYmxlLmFzc2lnbihleHByZXNzaW9uLCBjb250ZXh0KTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmV2YWx1YXRlZCB0aGUgJyR7cGFyYW1ldGVyU3RyaW5nfScgcGFyYW1ldGVyIGFnYWluc3QgdGhlICR7ZXhwcmVzc2lvblN0cmluZ30gZXhwcmVzc2lvbi5gKTtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJBcnJheUFzc2lnbm1lbnRcIjtcblxuICBzdGF0aWMgZnJvbVN0ZXBOb2RlKHN0ZXBOb2RlLCBjb250ZXh0KSB7XG4gICAgbGV0IGFycmF5QXNzaWdubWVudCA9IG51bGw7XG5cbiAgICBjb25zdCBzdGVwQXJyYXlBc3NpZ25tZW50Tm9kZSA9IHN0ZXBBcnJheUFzc2lnbm1lbnROb2RlUXVlcnkoc3RlcE5vZGUpO1xuXG4gICAgaWYgKHN0ZXBBcnJheUFzc2lnbm1lbnROb2RlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBhcnJheUFzc2lnbm1lbnROb2RlID0gc3RlcEFycmF5QXNzaWdubWVudE5vZGU7ICAvLy9cblxuICAgICAgYXJyYXlBc3NpZ25tZW50ID0gYXJyYXlBc3NpZ25tZW50RnJvbUFycmF5QXNzaWdubWVudE5vZGUoYXJyYXlBc3NpZ25tZW50Tm9kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5QXNzaWdubWVudDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGFycmF5QXNzaWdubWVudEZyb21BcnJheUFzc2lnbm1lbnROb2RlKGFycmF5QXNzaWdubWVudE5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBWYXJpYWJsZSwgUGFyYW1ldGVycywgQXJyYXlBc3NpZ25tZW50IH0gPSBkb20sXG4gICAgICAgIHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXJzLmZyb21BcnJheUFzc2lnbm1lbnROb2RlKGFycmF5QXNzaWdubWVudE5vZGUsIGNvbnRleHQpLFxuICAgICAgICB2YXJpYWJsZSA9IFZhcmlhYmxlLmZyb21BcnJheUFzc2lnbm1lbnROb2RlKGFycmF5QXNzaWdubWVudE5vZGUsIGNvbnRleHQpLFxuICAgICAgICBzdHJpbmcgPSBzdHJpbmdGcm9tVmFyaWFibGVBbmRQYXJhbWV0ZXJzKHZhcmlhYmxlLCBwYXJhbWV0ZXJzLCBjb250ZXh0KSxcbiAgICAgICAgYXJyYXlBc3NpZ25tZW50ID0gbmV3IEFycmF5QXNzaWdubWVudChzdHJpbmcsIHZhcmlhYmxlLCBwYXJhbWV0ZXJzKTtcblxuICByZXR1cm4gYXJyYXlBc3NpZ25tZW50O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdGcm9tVmFyaWFibGVBbmRQYXJhbWV0ZXJzKHZhcmlhYmxlLCBwYXJhbWV0ZXJzLCBjb250ZXh0KSB7XG4gIGNvbnN0IHZhcmlhYmxlU3RyaW5nID0gdmFyaWFibGUuZ2V0U3RyaW5nKCksXG4gICAgICAgIHBhcmFtZXRlcnNTdHJpbmcgPSBwYXJhbWV0ZXJzLmdldFN0cmluZygpLFxuICAgICAgICBzdHJpbmcgPSBgWyAke3BhcmFtZXRlcnNTdHJpbmd9IF0gPSAke3ZhcmlhYmxlU3RyaW5nfTtgO1xuXG4gIHJldHVybiBzdHJpbmc7XG59XG4iXSwibmFtZXMiOlsic3RlcEFycmF5QXNzaWdubWVudE5vZGVRdWVyeSIsIm5vZGVRdWVyeSIsImRvbUFzc2lnbmVkIiwiQXJyYXlBc3NpZ21lbnQiLCJzdHJpbmciLCJ2YXJpYWJsZSIsInBhcmFtZXRlcnMiLCJnZXRTdHJpbmciLCJnZXRWYXJpYWJsZSIsImdldFZhcmlhYmxlcyIsImV2YWx1YXRlIiwiY29udGV4dCIsImFycmF5QXNzaWdubWVudFN0cmluZyIsInRyYWNlIiwiZXhwcmVzc2lvbiIsImV4cHJlc3Npb25UeXBlIiwiZ2V0VHlwZSIsIk5PREVTX1RZUEUiLCJleHByZXNzaW9uU3RyaW5nIiwiYXNTdHJpbmciLCJtZXNzYWdlIiwiZXhjZXB0aW9uIiwiRXhjZXB0aW9uIiwiZnJvbU1lc3NhZ2UiLCJub2RlcyIsImdldE5vZGVzIiwibm9kZXNMZW5ndGgiLCJsZW5ndGgiLCJwYXJhbWV0ZXJzTGVuZ3RoIiwiZ2V0TGVuZ3RoIiwicGFyYW1ldGVyc1N0cmluZyIsIm5vZGVzU3RyaW5nIiwibm9kZXNBc1N0cmluZyIsIm5vZGV4IiwiZm9yRWFjaFBhcmFtZXRlciIsInBhcmFtZXRlciIsImluZGV4IiwiRXhwcmVzc2lvbiIsImRvbSIsIm5vZGUiLCJmcm9tTm9kZSIsImV2YWx1YXRlUGFyYW1ldGVyIiwiZGVidWciLCJwYXJhbWV0ZXJTdHJpbmciLCJwYXJhbWV0ZXJUeXBlIiwiTk9ERV9UWVBFIiwiVmFyaWFibGUiLCJmcm9tUGFyYW1ldGVyIiwiYXNzaWduIiwiZnJvbVN0ZXBOb2RlIiwic3RlcE5vZGUiLCJhcnJheUFzc2lnbm1lbnQiLCJzdGVwQXJyYXlBc3NpZ25tZW50Tm9kZSIsImFycmF5QXNzaWdubWVudE5vZGUiLCJhcnJheUFzc2lnbm1lbnRGcm9tQXJyYXlBc3NpZ25tZW50Tm9kZSIsIm5hbWUiLCJQYXJhbWV0ZXJzIiwiQXJyYXlBc3NpZ25tZW50IiwiZnJvbUFycmF5QXNzaWdubWVudE5vZGUiLCJzdHJpbmdGcm9tVmFyaWFibGVBbmRQYXJhbWV0ZXJzIiwidmFyaWFibGVTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVdBOzs7ZUFBQTs7OzJEQVRnQjtnRUFDTTtxQkFFSTtxQkFFWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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