occam-verify-cli 1.0.662 → 1.0.664

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 (211) hide show
  1. package/.swcrc +3 -0
  2. package/lib/abbreviations.js +10 -10
  3. package/lib/action/help.js +27 -2
  4. package/lib/action/verify.js +33 -205
  5. package/lib/action/version.js +6 -6
  6. package/lib/commands.js +4 -4
  7. package/lib/constants.js +16 -16
  8. package/lib/context/ephemeral.js +337 -540
  9. package/lib/context/file/nominal.js +545 -1040
  10. package/lib/context/liminal.js +159 -325
  11. package/lib/context/literal.js +34 -138
  12. package/lib/context/nominal.js +29 -124
  13. package/lib/context/scoped.js +163 -325
  14. package/lib/context/synthetic.js +31 -126
  15. package/lib/context.js +230 -482
  16. package/lib/defaults.js +8 -8
  17. package/lib/element/assertion/contained.js +159 -299
  18. package/lib/element/assertion/defined.js +145 -279
  19. package/lib/element/assertion/property.js +132 -266
  20. package/lib/element/assertion/satisfies.js +108 -239
  21. package/lib/element/assertion/subproof.js +88 -207
  22. package/lib/element/assertion/type.js +132 -262
  23. package/lib/element/assertion.js +17 -156
  24. package/lib/element/assumption.js +187 -386
  25. package/lib/element/combinator/bracketed.js +19 -142
  26. package/lib/element/combinator.js +65 -228
  27. package/lib/element/conclusion.js +72 -370
  28. package/lib/element/constructor/bracketed.js +34 -157
  29. package/lib/element/constructor.js +81 -253
  30. package/lib/element/declaration/combinator.js +41 -286
  31. package/lib/element/declaration/complexType.js +184 -452
  32. package/lib/element/declaration/constructor.js +69 -323
  33. package/lib/element/declaration/metavariable.js +70 -317
  34. package/lib/element/declaration/simpleType.js +117 -378
  35. package/lib/element/declaration/typePrefix.js +54 -299
  36. package/lib/element/declaration/variable.js +74 -328
  37. package/lib/element/declaration.js +3 -114
  38. package/lib/element/deduction.js +76 -378
  39. package/lib/element/derivation.js +31 -340
  40. package/lib/element/equality.js +152 -347
  41. package/lib/element/equivalence.js +160 -385
  42. package/lib/element/equivalences.js +132 -356
  43. package/lib/element/error.js +16 -290
  44. package/lib/element/frame.js +210 -418
  45. package/lib/element/hypothesis.js +56 -354
  46. package/lib/element/judgement.js +120 -305
  47. package/lib/element/label.js +62 -236
  48. package/lib/element/metaType.js +35 -200
  49. package/lib/element/metavariable.js +249 -459
  50. package/lib/element/parameter.js +39 -202
  51. package/lib/element/procedureCall.js +74 -381
  52. package/lib/element/procedureReference.js +27 -186
  53. package/lib/element/proof.js +38 -349
  54. package/lib/element/proofAssertion/premise.js +174 -466
  55. package/lib/element/proofAssertion/step.js +144 -495
  56. package/lib/element/proofAssertion/supposition.js +170 -466
  57. package/lib/element/proofAssertion.js +47 -195
  58. package/lib/element/property.js +36 -201
  59. package/lib/element/propertyRelation.js +62 -223
  60. package/lib/element/reference.js +173 -378
  61. package/lib/element/rule.js +178 -673
  62. package/lib/element/section.js +47 -356
  63. package/lib/element/signature.js +96 -264
  64. package/lib/element/statement.js +195 -395
  65. package/lib/element/subDerivation.js +32 -341
  66. package/lib/element/subproof.js +73 -448
  67. package/lib/element/substitution/frame.js +114 -257
  68. package/lib/element/substitution/reference.js +108 -248
  69. package/lib/element/substitution/statement.js +223 -397
  70. package/lib/element/substitution/term.js +123 -266
  71. package/lib/element/substitution.js +97 -296
  72. package/lib/element/term.js +139 -339
  73. package/lib/element/topLevelAssertion/axiom.js +153 -459
  74. package/lib/element/topLevelAssertion/conjecture.js +24 -295
  75. package/lib/element/topLevelAssertion/lemma.js +22 -289
  76. package/lib/element/topLevelAssertion/theorem.js +24 -295
  77. package/lib/element/topLevelAssertion.js +218 -718
  78. package/lib/element/topLevelMetaAssertion/metaLemma.js +24 -290
  79. package/lib/element/topLevelMetaAssertion/metatheorem.js +24 -290
  80. package/lib/element/topLevelMetaAssertion.js +109 -509
  81. package/lib/element/type.js +198 -435
  82. package/lib/element/typePrefix.js +27 -186
  83. package/lib/element/variable.js +119 -308
  84. package/lib/elements.js +4 -4
  85. package/lib/index.js +4 -4
  86. package/lib/main.js +18 -18
  87. package/lib/messages.js +2 -2
  88. package/lib/metaTypeNames.js +4 -4
  89. package/lib/metaTypes.js +10 -10
  90. package/lib/node/argument.js +15 -109
  91. package/lib/node/assertion/contained.js +33 -130
  92. package/lib/node/assertion/defined.js +29 -123
  93. package/lib/node/assertion/property.js +18 -112
  94. package/lib/node/assertion/satisfies.js +14 -105
  95. package/lib/node/assertion/subproof.js +10 -98
  96. package/lib/node/assertion/type.js +14 -105
  97. package/lib/node/assertion.js +5 -89
  98. package/lib/node/assumption.js +12 -103
  99. package/lib/node/body/axiom.js +5 -89
  100. package/lib/node/body/conjecture.js +5 -89
  101. package/lib/node/body/lemma.js +5 -89
  102. package/lib/node/body/metaLemma.js +5 -89
  103. package/lib/node/body/metatheorem.js +5 -89
  104. package/lib/node/body/rule.js +26 -126
  105. package/lib/node/body/theorem.js +5 -89
  106. package/lib/node/body.js +15 -109
  107. package/lib/node/combinator.js +9 -97
  108. package/lib/node/conclusion.js +12 -103
  109. package/lib/node/constructor.js +9 -97
  110. package/lib/node/declaration/combinator.js +10 -98
  111. package/lib/node/declaration/complexType.js +53 -162
  112. package/lib/node/declaration/constructor.js +29 -123
  113. package/lib/node/declaration/metavariable.js +18 -112
  114. package/lib/node/declaration/property.js +26 -123
  115. package/lib/node/declaration/simpleType.js +52 -158
  116. package/lib/node/declaration/typePrefix.js +14 -105
  117. package/lib/node/declaration/variable.js +33 -130
  118. package/lib/node/declaration.js +5 -89
  119. package/lib/node/deduction.js +12 -103
  120. package/lib/node/derivation.js +12 -125
  121. package/lib/node/document.js +5 -89
  122. package/lib/node/equality.js +17 -111
  123. package/lib/node/equivalence.js +9 -97
  124. package/lib/node/equivalences.js +5 -89
  125. package/lib/node/error.js +5 -89
  126. package/lib/node/frame.js +26 -123
  127. package/lib/node/header/axiom.js +10 -98
  128. package/lib/node/header/conjecture.js +5 -89
  129. package/lib/node/header/lemma.js +5 -89
  130. package/lib/node/header/metaLemma.js +5 -89
  131. package/lib/node/header/metatheorem.js +5 -89
  132. package/lib/node/header/rule.js +5 -89
  133. package/lib/node/header/theorem.js +5 -89
  134. package/lib/node/header.js +30 -130
  135. package/lib/node/hypothesis.js +12 -103
  136. package/lib/node/judgement.js +15 -109
  137. package/lib/node/label.js +9 -97
  138. package/lib/node/labels.js +9 -97
  139. package/lib/node/metaArgument.js +9 -97
  140. package/lib/node/metaType.js +16 -104
  141. package/lib/node/metavariable.js +23 -117
  142. package/lib/node/parameter.js +32 -123
  143. package/lib/node/parenthesisedLabel.js +9 -97
  144. package/lib/node/parenthesisedLabels.js +12 -103
  145. package/lib/node/placeholder.js +5 -89
  146. package/lib/node/procedureCall.js +15 -109
  147. package/lib/node/procedureReference.js +16 -104
  148. package/lib/node/proof.js +9 -97
  149. package/lib/node/proofAssertion/premise.js +10 -98
  150. package/lib/node/proofAssertion/step.js +32 -132
  151. package/lib/node/proofAssertion/supposition.js +10 -98
  152. package/lib/node/proofAssertion.js +12 -103
  153. package/lib/node/property.js +15 -106
  154. package/lib/node/propertyRelation.js +15 -109
  155. package/lib/node/qualification.js +12 -103
  156. package/lib/node/reference.js +9 -97
  157. package/lib/node/rule.js +26 -129
  158. package/lib/node/section.js +22 -122
  159. package/lib/node/signature.js +9 -97
  160. package/lib/node/statement.js +93 -238
  161. package/lib/node/subDerivation.js +12 -125
  162. package/lib/node/subproof.js +18 -115
  163. package/lib/node/substitution/frame.js +22 -119
  164. package/lib/node/substitution/reference.js +22 -119
  165. package/lib/node/substitution/statement.js +42 -151
  166. package/lib/node/substitution/term.js +22 -119
  167. package/lib/node/substitution.js +5 -89
  168. package/lib/node/term.js +51 -160
  169. package/lib/node/topLevelAssertion/axiom.js +8 -105
  170. package/lib/node/topLevelAssertion/conjecture.js +8 -105
  171. package/lib/node/topLevelAssertion/lemma.js +8 -105
  172. package/lib/node/topLevelAssertion/theorem.js +8 -105
  173. package/lib/node/topLevelAssertion.js +29 -135
  174. package/lib/node/topLevelMetaAssertion/metaLemma.js +8 -105
  175. package/lib/node/topLevelMetaAssertion/metatheorem.js +8 -105
  176. package/lib/node/topLevelMetaAssertion.js +25 -128
  177. package/lib/node/type.js +43 -140
  178. package/lib/node/typePrefix.js +16 -104
  179. package/lib/node/types.js +9 -97
  180. package/lib/node/variable.js +16 -104
  181. package/lib/nominal/lexer.js +3 -68
  182. package/lib/nominal/parser.js +7 -85
  183. package/lib/nonTerminalNodeMap.js +171 -101
  184. package/lib/options.js +6 -6
  185. package/lib/preamble.js +62 -62
  186. package/lib/prepare.js +4 -4
  187. package/lib/process/assign.js +20 -20
  188. package/lib/process/equate.js +39 -117
  189. package/lib/process/instantiate.js +10 -9
  190. package/lib/process/unify.js +199 -325
  191. package/lib/process/validate.js +87 -195
  192. package/lib/process/verify.js +263 -786
  193. package/lib/ruleNames.js +84 -84
  194. package/lib/tokenTypes.js +3 -3
  195. package/lib/utilities/bnf.js +7 -7
  196. package/lib/utilities/brackets.js +18 -18
  197. package/lib/utilities/clock.js +8 -8
  198. package/lib/utilities/context.js +23 -191
  199. package/lib/utilities/element.js +276 -276
  200. package/lib/utilities/equivalence.js +7 -7
  201. package/lib/utilities/fileContext.js +9 -9
  202. package/lib/utilities/instance.js +14 -14
  203. package/lib/utilities/json.js +211 -211
  204. package/lib/utilities/releaseContext.js +19 -147
  205. package/lib/utilities/statement.js +10 -10
  206. package/lib/utilities/string.js +47 -47
  207. package/lib/utilities/substitutions.js +19 -19
  208. package/lib/utilities/type.js +5 -5
  209. package/lib/utilities/unification.js +196 -426
  210. package/lib/utilities/validation.js +72 -72
  211. package/package.json +1 -1
@@ -8,461 +8,231 @@ Object.defineProperty(exports, "unifyStatements", {
8
8
  return unifyStatements;
9
9
  }
10
10
  });
11
- var _necessary = require("necessary");
12
- var _elements = /*#__PURE__*/ _interop_require_default(require("../elements"));
13
- var _statement = require("../utilities/statement");
14
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
15
- try {
16
- var info = gen[key](arg);
17
- var value = info.value;
18
- } catch (error) {
19
- reject(error);
20
- return;
21
- }
22
- if (info.done) {
23
- resolve(value);
24
- } else {
25
- Promise.resolve(value).then(_next, _throw);
26
- }
27
- }
28
- function _async_to_generator(fn) {
29
- return function() {
30
- var self = this, args = arguments;
31
- return new Promise(function(resolve, reject) {
32
- var gen = fn.apply(self, args);
33
- function _next(value) {
34
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
35
- }
36
- function _throw(err) {
37
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
38
- }
39
- _next(undefined);
40
- });
41
- };
42
- }
11
+ const _necessary = require("necessary");
12
+ const _elements = /*#__PURE__*/ _interop_require_default(require("../elements"));
13
+ const _statement = require("../utilities/statement");
43
14
  function _interop_require_default(obj) {
44
15
  return obj && obj.__esModule ? obj : {
45
16
  default: obj
46
17
  };
47
18
  }
48
- function _ts_generator(thisArg, body) {
49
- var f, y, t, _ = {
50
- label: 0,
51
- sent: function() {
52
- if (t[0] & 1) throw t[1];
53
- return t[1];
54
- },
55
- trys: [],
56
- ops: []
57
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
58
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
59
- return this;
60
- }), g;
61
- function verb(n) {
62
- return function(v) {
63
- return step([
64
- n,
65
- v
66
- ]);
67
- };
68
- }
69
- function step(op) {
70
- if (f) throw new TypeError("Generator is already executing.");
71
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
72
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
73
- if (y = 0, t) op = [
74
- op[0] & 2,
75
- t.value
76
- ];
77
- switch(op[0]){
78
- case 0:
79
- case 1:
80
- t = op;
81
- break;
82
- case 4:
83
- _.label++;
84
- return {
85
- value: op[1],
86
- done: false
87
- };
88
- case 5:
89
- _.label++;
90
- y = op[1];
91
- op = [
92
- 0
93
- ];
94
- continue;
95
- case 7:
96
- op = _.ops.pop();
97
- _.trys.pop();
98
- continue;
99
- default:
100
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
101
- _ = 0;
102
- continue;
103
- }
104
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
105
- _.label = op[1];
106
- break;
107
- }
108
- if (op[0] === 6 && _.label < t[1]) {
109
- _.label = t[1];
110
- t = op;
111
- break;
112
- }
113
- if (t && _.label < t[2]) {
114
- _.label = t[2];
115
- _.ops.push(op);
116
- break;
117
- }
118
- if (t[2]) _.ops.pop();
119
- _.trys.pop();
120
- continue;
19
+ const { backwardsSome } = _necessary.arrayUtilities;
20
+ async function unifyStatementWithRule(statement, reference, satisfiesAssertion, context) {
21
+ let statementUnifiesWithRule = false;
22
+ if (reference !== null) {
23
+ const rule = context.findRuleByReference(reference);
24
+ if (rule !== null) {
25
+ const ruleString = rule.getString(), statementString = statement.getString();
26
+ context.trace(`Unifying the '${statementString}' statement with the '${ruleString}' rule...`);
27
+ const subproofOrProofAssertions = context.getSubproofOrProofAssertions(), statementAndSubproofOrProofAssertionsUnify = await rule.unifyStatementAndSubproofOrProofAssertions(statement, subproofOrProofAssertions, context);
28
+ if (statementAndSubproofOrProofAssertionsUnify) {
29
+ statementUnifiesWithRule = true;
30
+ }
31
+ if (statementUnifiesWithRule) {
32
+ context.debug(`...unified the '${statementString}' statement with the '${ruleString}' rule.`);
121
33
  }
122
- op = body.call(thisArg, _);
123
- } catch (e) {
124
- op = [
125
- 6,
126
- e
127
- ];
128
- y = 0;
129
- } finally{
130
- f = t = 0;
131
34
  }
132
- if (op[0] & 5) throw op[1];
133
- return {
134
- value: op[0] ? op[1] : void 0,
135
- done: true
136
- };
137
35
  }
36
+ return statementUnifiesWithRule;
138
37
  }
139
- var backwardsSome = _necessary.arrayUtilities.backwardsSome;
140
- function unifyStatementWithRule(statement, reference, satisfiesAssertion, context) {
141
- return _async_to_generator(function() {
142
- var statementUnifiesWithRule, rule, ruleString, statementString, subproofOrProofAssertions, statementAndSubproofOrProofAssertionsUnify;
143
- return _ts_generator(this, function(_state) {
144
- switch(_state.label){
145
- case 0:
146
- statementUnifiesWithRule = false;
147
- if (!(reference !== null)) return [
148
- 3,
149
- 2
150
- ];
151
- rule = context.findRuleByReference(reference);
152
- if (!(rule !== null)) return [
153
- 3,
154
- 2
155
- ];
156
- ruleString = rule.getString(), statementString = statement.getString();
157
- context.trace("Unifying the '".concat(statementString, "' statement with the '").concat(ruleString, "' rule..."));
158
- subproofOrProofAssertions = context.getSubproofOrProofAssertions();
159
- return [
160
- 4,
161
- rule.unifyStatementAndSubproofOrProofAssertions(statement, subproofOrProofAssertions, context)
162
- ];
163
- case 1:
164
- statementAndSubproofOrProofAssertionsUnify = _state.sent();
165
- if (statementAndSubproofOrProofAssertionsUnify) {
166
- statementUnifiesWithRule = true;
167
- }
168
- if (statementUnifiesWithRule) {
169
- context.debug("...unified the '".concat(statementString, "' statement with the '").concat(ruleString, "' rule."));
170
- }
171
- _state.label = 2;
172
- case 2:
173
- return [
174
- 2,
175
- statementUnifiesWithRule
176
- ];
177
- }
178
- });
179
- })();
38
+ async function unifyStatementWithReference(statement, reference, satisfiesAssertion, context) {
39
+ let statementUnifiesWithReference = false;
40
+ if (reference !== null) {
41
+ const statementString = statement.getString(), referenceString = reference.getString();
42
+ context.trace(`Unifying the '${statementString}' statement with the '${referenceString}' reference...`);
43
+ const metavariableValidates = reference.validateMetavariable(context);
44
+ if (metavariableValidates) {
45
+ const metavariable = reference.getMetavariable();
46
+ debugger;
47
+ // synthetically((context) => {
48
+ // const { StatementSubstitution } = elements;
49
+ //
50
+ // StatementSubstitution.fromStatementAndMetavariable(statement, metavariable, context);
51
+ // validate
52
+ //
53
+ // }, generalContext, specificContext);
54
+ statementUnifiesWithReference = true;
55
+ }
56
+ if (statementUnifiesWithReference) {
57
+ context.debug(`...unified the '${statementString}' statement with the '${referenceString}' reference.`);
58
+ }
59
+ }
60
+ return statementUnifiesWithReference;
180
61
  }
181
- function unifyStatementWithReference(statement, reference, satisfiesAssertion, context) {
182
- return _async_to_generator(function() {
183
- var statementUnifiesWithReference, statementString, referenceString, metavariableValidates, metavariable;
184
- return _ts_generator(this, function(_state) {
185
- statementUnifiesWithReference = false;
186
- if (reference !== null) {
187
- statementString = statement.getString(), referenceString = reference.getString();
188
- context.trace("Unifying the '".concat(statementString, "' statement with the '").concat(referenceString, "' reference..."));
189
- metavariableValidates = reference.validateMetavariable(context);
190
- if (metavariableValidates) {
191
- metavariable = reference.getMetavariable();
192
- debugger;
193
- // synthetically((context) => {
194
- // const { StatementSubstitution } = elements;
195
- //
196
- // StatementSubstitution.fromStatementAndMetavariable(statement, metavariable, context);
197
- // validate
198
- //
199
- // }, generalContext, specificContext);
200
- statementUnifiesWithReference = true;
201
- }
202
- if (statementUnifiesWithReference) {
203
- context.debug("...unified the '".concat(statementString, "' statement with the '").concat(referenceString, "' reference."));
62
+ async function unifyStatementAsSatisfiesAssertion(statement, reference, satisfiesAssertion, context) {
63
+ let statementUnifiesAsSatisfiesAssertion = false;
64
+ satisfiesAssertion = (0, _statement.satisfiesAssertionFromStatement)(statement, context);
65
+ if (satisfiesAssertion !== null) {
66
+ const statementString = statement.getString();
67
+ context.trace(`Unifying the '${statementString}' statement as a satisfies assertion...`);
68
+ const stated = true;
69
+ satisfiesAssertion.verifySignature(stated, context);
70
+ if (reference === null) {
71
+ const subproofOrProofAssertions = context.getSubproofOrProofAssertions();
72
+ statementUnifiesAsSatisfiesAssertion = backwardsSome(subproofOrProofAssertions, (stepsOrSubproof)=>{
73
+ const stepOrSubProofUnifiesWIthSatisfiesAssertion = stepsOrSubproof.unifyWithSatisfiesAssertion(satisfiesAssertion, context);
74
+ if (stepOrSubProofUnifiesWIthSatisfiesAssertion) {
75
+ return true;
204
76
  }
205
- }
206
- return [
207
- 2,
208
- statementUnifiesWithReference
209
- ];
210
- });
211
- })();
212
- }
213
- function unifyStatementAsSatisfiesAssertion(statement, reference, satisfiesAssertion, context) {
214
- return _async_to_generator(function() {
215
- var statementUnifiesAsSatisfiesAssertion, statementString, stated, subproofOrProofAssertions, topLevelAssertion, axiom, satisfiable, substitutions, topLevelAssertionUnifies, substitutionsCorrelates, axiomString;
216
- return _ts_generator(this, function(_state) {
217
- statementUnifiesAsSatisfiesAssertion = false;
218
- satisfiesAssertion = (0, _statement.satisfiesAssertionFromStatement)(statement, context);
219
- if (satisfiesAssertion !== null) {
220
- statementString = statement.getString();
221
- context.trace("Unifying the '".concat(statementString, "' statement as a satisfies assertion..."));
222
- stated = true;
223
- satisfiesAssertion.verifySignature(stated, context);
224
- if (reference === null) {
225
- subproofOrProofAssertions = context.getSubproofOrProofAssertions();
226
- statementUnifiesAsSatisfiesAssertion = backwardsSome(subproofOrProofAssertions, function(stepsOrSubproof) {
227
- var stepOrSubProofUnifiesWIthSatisfiesAssertion = stepsOrSubproof.unifyWithSatisfiesAssertion(satisfiesAssertion, context);
228
- if (stepOrSubProofUnifiesWIthSatisfiesAssertion) {
229
- return true;
230
- }
231
- });
232
- } else {
233
- topLevelAssertion = context.findTopLevelAssertionByReference(reference);
234
- if (topLevelAssertion !== null) {
235
- reference = satisfiesAssertion.getReference();
236
- axiom = context.findAxiomByReference(reference);
237
- if (axiom !== null) {
238
- satisfiable = axiom.isSatisfiable();
239
- if (satisfiable) {
240
- substitutions = [], topLevelAssertionUnifies = axiom.unifyTopLevelAssertion(topLevelAssertion, substitutions, context);
241
- if (topLevelAssertionUnifies) {
242
- substitutionsCorrelates = satisfiesAssertion.correlateSubstitutions(substitutions, context);
243
- if (substitutionsCorrelates) {
244
- statementUnifiesAsSatisfiesAssertion = true;
245
- }
246
- }
247
- } else {
248
- axiomString = axiom.getString();
249
- context.debug("Unable to unify with the '".concat(axiomString, "' because it is not satisfiable."));
77
+ });
78
+ } else {
79
+ const topLevelAssertion = context.findTopLevelAssertionByReference(reference);
80
+ if (topLevelAssertion !== null) {
81
+ reference = satisfiesAssertion.getReference();
82
+ const axiom = context.findAxiomByReference(reference);
83
+ if (axiom !== null) {
84
+ const satisfiable = axiom.isSatisfiable();
85
+ if (satisfiable) {
86
+ const substitutions = [], topLevelAssertionUnifies = axiom.unifyTopLevelAssertion(topLevelAssertion, substitutions, context);
87
+ if (topLevelAssertionUnifies) {
88
+ const substitutionsCorrelates = satisfiesAssertion.correlateSubstitutions(substitutions, context);
89
+ if (substitutionsCorrelates) {
90
+ statementUnifiesAsSatisfiesAssertion = true;
250
91
  }
251
92
  }
93
+ } else {
94
+ const axiomString = axiom.getString();
95
+ context.debug(`Unable to unify with the '${axiomString}' because it is not satisfiable.`);
252
96
  }
253
97
  }
254
- if (statementUnifiesAsSatisfiesAssertion) {
255
- context.debug("...unified the '".concat(statementString, "' statement as a satisfies assertion."));
256
- }
257
98
  }
258
- return [
259
- 2,
260
- statementUnifiesAsSatisfiesAssertion
261
- ];
262
- });
263
- })();
99
+ }
100
+ if (statementUnifiesAsSatisfiesAssertion) {
101
+ context.debug(`...unified the '${statementString}' statement as a satisfies assertion.`);
102
+ }
103
+ }
104
+ return statementUnifiesAsSatisfiesAssertion;
264
105
  }
265
- function unifyStatementWithTopLevelAssertion(statement, reference, satisfiesAssertion, context) {
266
- return _async_to_generator(function() {
267
- var statementUnifiesWithTopLevelAssertion, topLevelAssertion, statementString, topLevelAssertionString, subproofOrProofAssertions, statementAndSubproofOrProofAssertionsUnify, metavariable;
268
- return _ts_generator(this, function(_state) {
269
- switch(_state.label){
270
- case 0:
271
- statementUnifiesWithTopLevelAssertion = false;
272
- if (!(reference !== null)) return [
273
- 3,
274
- 2
275
- ];
276
- topLevelAssertion = context.findTopLevelAssertionByReference(reference);
277
- if (!(topLevelAssertion !== null)) return [
278
- 3,
279
- 2
280
- ];
281
- statementString = statement.getString(), topLevelAssertionString = reference.getString();
282
- context.trace("Unifying the '".concat(statementString, "' statement with the '").concat(topLevelAssertionString, "' top level assertion..."));
283
- subproofOrProofAssertions = context.getSubproofOrProofAssertions();
284
- return [
285
- 4,
286
- topLevelAssertion.unifyStatementAndSubproofOrProofAssertions(statement, subproofOrProofAssertions, context)
287
- ];
288
- case 1:
289
- statementAndSubproofOrProofAssertionsUnify = _state.sent();
290
- if (statementAndSubproofOrProofAssertionsUnify) {
291
- metavariable = reference.getMetavariable();
292
- debugger;
293
- // synthetically((context) => {
294
- // const { StatementSubstitution } = elements;
295
- //
296
- // StatementSubstitution.fromStatementAndMetavariable(statement, metavariable, context);
297
- // vaiddate
298
- //
299
- // }, generalContext, specificContext);
300
- statementUnifiesWithTopLevelAssertion = true;
301
- }
302
- if (statementUnifiesWithTopLevelAssertion) {
303
- context.debug("...unified the '".concat(statementString, "' statement with the '").concat(topLevelAssertionString, "' top level assertion."));
304
- }
305
- _state.label = 2;
306
- case 2:
307
- return [
308
- 2,
309
- statementUnifiesWithTopLevelAssertion
310
- ];
106
+ async function unifyStatementWithTopLevelAssertion(statement, reference, satisfiesAssertion, context) {
107
+ let statementUnifiesWithTopLevelAssertion = false;
108
+ if (reference !== null) {
109
+ const topLevelAssertion = context.findTopLevelAssertionByReference(reference);
110
+ if (topLevelAssertion !== null) {
111
+ const statementString = statement.getString(), topLevelAssertionString = reference.getString();
112
+ context.trace(`Unifying the '${statementString}' statement with the '${topLevelAssertionString}' top level assertion...`);
113
+ const subproofOrProofAssertions = context.getSubproofOrProofAssertions(), statementAndSubproofOrProofAssertionsUnify = await topLevelAssertion.unifyStatementAndSubproofOrProofAssertions(statement, subproofOrProofAssertions, context);
114
+ if (statementAndSubproofOrProofAssertionsUnify) {
115
+ const metavariable = reference.getMetavariable();
116
+ debugger;
117
+ // synthetically((context) => {
118
+ // const { StatementSubstitution } = elements;
119
+ //
120
+ // StatementSubstitution.fromStatementAndMetavariable(statement, metavariable, context);
121
+ // vaiddate
122
+ //
123
+ // }, generalContext, specificContext);
124
+ statementUnifiesWithTopLevelAssertion = true;
311
125
  }
312
- });
313
- })();
314
- }
315
- function unifyStatementAsEquality(statement, reference, satisfiesAssertion, context) {
316
- return _async_to_generator(function() {
317
- var statementUnifiesAEquality, equality, statementString, equalityEqual;
318
- return _ts_generator(this, function(_state) {
319
- statementUnifiesAEquality = false;
320
- if (reference === null) {
321
- equality = (0, _statement.equalityFromStatement)(statement, context);
322
- if (equality !== null) {
323
- statementString = statement.getString();
324
- context.trace("Unifying the '".concat(statementString, "' statement as an equality..."));
325
- equalityEqual = equality.isEqual(context);
326
- if (equalityEqual) {
327
- statementUnifiesAEquality = true;
328
- }
329
- if (statementUnifiesAEquality) {
330
- context.debug("...unified the '".concat(statementString, "' statement as an equality."));
331
- }
332
- }
126
+ if (statementUnifiesWithTopLevelAssertion) {
127
+ context.debug(`...unified the '${statementString}' statement with the '${topLevelAssertionString}' top level assertion.`);
333
128
  }
334
- return [
335
- 2,
336
- statementUnifiesAEquality
337
- ];
338
- });
339
- })();
129
+ }
130
+ }
131
+ return statementUnifiesWithTopLevelAssertion;
340
132
  }
341
- function unifyStatementAsJudgement(statement, reference, satisfiesAssertion, context) {
342
- return _async_to_generator(function() {
343
- var statementUnifiesAsJudgement, judgement, statementString;
344
- return _ts_generator(this, function(_state) {
345
- statementUnifiesAsJudgement = false;
346
- if (reference === null) {
347
- judgement = (0, _statement.judgementFromStatement)(statement, context);
348
- if (judgement !== null) {
349
- statementString = statement.getString();
350
- context.trace("Unifying the '".concat(statementString, "' statement as a judgement..."));
351
- statementUnifiesAsJudgement = true;
352
- if (statementUnifiesAsJudgement) {
353
- context.debug("...unified the '".concat(statementString, "' statement as a judgement."));
354
- }
355
- }
133
+ async function unifyStatementAsEquality(statement, reference, satisfiesAssertion, context) {
134
+ let statementUnifiesAEquality = false;
135
+ if (reference === null) {
136
+ const equality = (0, _statement.equalityFromStatement)(statement, context);
137
+ if (equality !== null) {
138
+ const statementString = statement.getString();
139
+ context.trace(`Unifying the '${statementString}' statement as an equality...`);
140
+ const equalityEqual = equality.isEqual(context);
141
+ if (equalityEqual) {
142
+ statementUnifiesAEquality = true;
143
+ }
144
+ if (statementUnifiesAEquality) {
145
+ context.debug(`...unified the '${statementString}' statement as an equality.`);
356
146
  }
357
- return [
358
- 2,
359
- statementUnifiesAsJudgement
360
- ];
361
- });
362
- })();
147
+ }
148
+ }
149
+ return statementUnifiesAEquality;
363
150
  }
364
- function unifyStatementAsTypeAssertion(statement, reference, satisfiesAssertion, context) {
365
- return _async_to_generator(function() {
366
- var statementUnifiesAsTypeAssertion, typeAssertion, statementString;
367
- return _ts_generator(this, function(_state) {
368
- statementUnifiesAsTypeAssertion = false;
369
- if (reference === null) {
370
- typeAssertion = (0, _statement.typeAssertionFromStatement)(statement, context);
371
- if (typeAssertion !== null) {
372
- statementString = statement.getString();
373
- context.trace("Unifying the '".concat(statementString, "' statement as a type assertion..."));
374
- statementUnifiesAsTypeAssertion = true;
375
- context.debug("...unified the '".concat(statementString, "' statement as a type assertion."));
376
- }
151
+ async function unifyStatementAsJudgement(statement, reference, satisfiesAssertion, context) {
152
+ let statementUnifiesAsJudgement = false;
153
+ if (reference === null) {
154
+ const judgement = (0, _statement.judgementFromStatement)(statement, context);
155
+ if (judgement !== null) {
156
+ const statementString = statement.getString();
157
+ context.trace(`Unifying the '${statementString}' statement as a judgement...`);
158
+ statementUnifiesAsJudgement = true;
159
+ if (statementUnifiesAsJudgement) {
160
+ context.debug(`...unified the '${statementString}' statement as a judgement.`);
377
161
  }
378
- return [
379
- 2,
380
- statementUnifiesAsTypeAssertion
381
- ];
382
- });
383
- })();
162
+ }
163
+ }
164
+ return statementUnifiesAsJudgement;
384
165
  }
385
- function unifyStatementAsPropertyAssertion(statement, reference, satisfiesAssertion, context) {
386
- return _async_to_generator(function() {
387
- var statementUnifiesAsPropertyAssertion, propertyAssertion, statementString, term, equivalence, propertyAssertionMatches;
388
- return _ts_generator(this, function(_state) {
389
- statementUnifiesAsPropertyAssertion = false;
390
- if (reference === null) {
391
- propertyAssertion = (0, _statement.propertyAssertionFromStatement)(statement, context);
392
- if (propertyAssertion !== null) {
393
- statementString = statement.getString();
394
- context.trace("Unifying the '".concat(statementString, "' statement as a property assertion..."));
395
- term = propertyAssertion.getTerm(), equivalence = context.findEquivalenceByTerm(term);
396
- if (equivalence !== null) {
397
- propertyAssertionMatches = equivalence.someOtherTerm(term, function(term) {
398
- var propertyRelation = propertyAssertion.getPropertyRelation(), comparesToTermAndPropertyRelation = context.compareTermAndPropertyRelation(term, propertyRelation);
399
- if (comparesToTermAndPropertyRelation) {
400
- return true;
401
- }
402
- });
403
- if (propertyAssertionMatches) {
404
- statementUnifiesAsPropertyAssertion = true;
405
- }
406
- }
407
- if (statementUnifiesAsPropertyAssertion) {
408
- context.debug("...unified the '".concat(statementString, "' statement as a property assertion."));
166
+ async function unifyStatementAsTypeAssertion(statement, reference, satisfiesAssertion, context) {
167
+ let statementUnifiesAsTypeAssertion = false;
168
+ if (reference === null) {
169
+ const typeAssertion = (0, _statement.typeAssertionFromStatement)(statement, context);
170
+ if (typeAssertion !== null) {
171
+ const statementString = statement.getString();
172
+ context.trace(`Unifying the '${statementString}' statement as a type assertion...`);
173
+ statementUnifiesAsTypeAssertion = true;
174
+ context.debug(`...unified the '${statementString}' statement as a type assertion.`);
175
+ }
176
+ }
177
+ return statementUnifiesAsTypeAssertion;
178
+ }
179
+ async function unifyStatementAsPropertyAssertion(statement, reference, satisfiesAssertion, context) {
180
+ let statementUnifiesAsPropertyAssertion = false;
181
+ if (reference === null) {
182
+ const propertyAssertion = (0, _statement.propertyAssertionFromStatement)(statement, context);
183
+ if (propertyAssertion !== null) {
184
+ const statementString = statement.getString();
185
+ context.trace(`Unifying the '${statementString}' statement as a property assertion...`);
186
+ const term = propertyAssertion.getTerm(), equivalence = context.findEquivalenceByTerm(term);
187
+ if (equivalence !== null) {
188
+ const propertyAssertionMatches = equivalence.someOtherTerm(term, (term)=>{
189
+ const propertyRelation = propertyAssertion.getPropertyRelation(), comparesToTermAndPropertyRelation = context.compareTermAndPropertyRelation(term, propertyRelation);
190
+ if (comparesToTermAndPropertyRelation) {
191
+ return true;
409
192
  }
193
+ });
194
+ if (propertyAssertionMatches) {
195
+ statementUnifiesAsPropertyAssertion = true;
410
196
  }
411
197
  }
412
- return [
413
- 2,
414
- statementUnifiesAsPropertyAssertion
415
- ];
416
- });
417
- })();
418
- }
419
- function unifyStatementWithSatisfiesAssertion(statement, reference, satisfiesAssertion, context) {
420
- return _async_to_generator(function() {
421
- var statementUnifiesWithSatisfiesAssertion, statementString, satisfiesAssertionString, subproofOrProofAssertions, statementUnifies;
422
- return _ts_generator(this, function(_state) {
423
- statementUnifiesWithSatisfiesAssertion = false;
424
- if (satisfiesAssertion !== null) {
425
- statementString = statement.getString(), satisfiesAssertionString = satisfiesAssertion.getString();
426
- context.trace("Unifying the '".concat(statementString, "' statememnt with the '").concat(satisfiesAssertionString, "' satisfies assertion..."));
427
- subproofOrProofAssertions = context.getSubproofOrProofAssertions(), statementUnifies = satisfiesAssertion.unifyStatementAndSubproofOrProofAssertions(statement, subproofOrProofAssertions, context);
428
- if (statementUnifies) {
429
- statementUnifiesWithSatisfiesAssertion = true;
430
- }
431
- if (statementUnifiesWithSatisfiesAssertion) {
432
- context.debug("...unified the '".concat(statementString, "' statememnt with the '").concat(satisfiesAssertionString, "' satisfies assertion."));
433
- }
198
+ if (statementUnifiesAsPropertyAssertion) {
199
+ context.debug(`...unified the '${statementString}' statement as a property assertion.`);
434
200
  }
435
- return [
436
- 2,
437
- statementUnifiesWithSatisfiesAssertion
438
- ];
439
- });
440
- })();
201
+ }
202
+ }
203
+ return statementUnifiesAsPropertyAssertion;
441
204
  }
442
- function compareStatementWithSubproofOrProofAssertions(statement, reference, satisfiesAssertion, context) {
443
- return _async_to_generator(function() {
444
- var statementEquatesWithStepOrSubproofs, statementString, subproofOrProofAssertions, statementUnifiesWithSteps;
445
- return _ts_generator(this, function(_state) {
446
- statementEquatesWithStepOrSubproofs = false;
447
- if (reference === null) {
448
- statementString = statement.getString();
449
- context.trace("Comparing the '".concat(statementString, "' statement with the subproofs or proof asssertions..."));
450
- subproofOrProofAssertions = context.getSubproofOrProofAssertions(), statementUnifiesWithSteps = statement.compareSubproofOrProofAssertions(subproofOrProofAssertions, context);
451
- if (statementUnifiesWithSteps) {
452
- statementEquatesWithStepOrSubproofs = true;
453
- }
454
- if (statementEquatesWithStepOrSubproofs) {
455
- context.debug("...compared the '".concat(statementString, "' statement with the subproofs or proof asssertions."));
456
- }
457
- }
458
- return [
459
- 2,
460
- statementEquatesWithStepOrSubproofs
461
- ];
462
- });
463
- })();
205
+ async function unifyStatementWithSatisfiesAssertion(statement, reference, satisfiesAssertion, context) {
206
+ let statementUnifiesWithSatisfiesAssertion = false;
207
+ if (satisfiesAssertion !== null) {
208
+ const statementString = statement.getString(), satisfiesAssertionString = satisfiesAssertion.getString();
209
+ context.trace(`Unifying the '${statementString}' statememnt with the '${satisfiesAssertionString}' satisfies assertion...`);
210
+ const subproofOrProofAssertions = context.getSubproofOrProofAssertions(), statementUnifies = satisfiesAssertion.unifyStatementAndSubproofOrProofAssertions(statement, subproofOrProofAssertions, context);
211
+ if (statementUnifies) {
212
+ statementUnifiesWithSatisfiesAssertion = true;
213
+ }
214
+ if (statementUnifiesWithSatisfiesAssertion) {
215
+ context.debug(`...unified the '${statementString}' statememnt with the '${satisfiesAssertionString}' satisfies assertion.`);
216
+ }
217
+ }
218
+ return statementUnifiesWithSatisfiesAssertion;
219
+ }
220
+ async function compareStatementWithSubproofOrProofAssertions(statement, reference, satisfiesAssertion, context) {
221
+ let statementEquatesWithStepOrSubproofs = false;
222
+ if (reference === null) {
223
+ const statementString = statement.getString();
224
+ context.trace(`Comparing the '${statementString}' statement with the subproofs or proof asssertions...`);
225
+ const subproofOrProofAssertions = context.getSubproofOrProofAssertions(), statementUnifiesWithSteps = statement.compareSubproofOrProofAssertions(subproofOrProofAssertions, context);
226
+ if (statementUnifiesWithSteps) {
227
+ statementEquatesWithStepOrSubproofs = true;
228
+ }
229
+ if (statementEquatesWithStepOrSubproofs) {
230
+ context.debug(`...compared the '${statementString}' statement with the subproofs or proof asssertions.`);
231
+ }
232
+ }
233
+ return statementEquatesWithStepOrSubproofs;
464
234
  }
465
- var unifyStatements = [
235
+ const unifyStatements = [
466
236
  unifyStatementWithRule,
467
237
  unifyStatementWithReference,
468
238
  unifyStatementAsSatisfiesAssertion,
@@ -475,4 +245,4 @@ var unifyStatements = [
475
245
  compareStatementWithSubproofOrProofAssertions
476
246
  ];
477
247
 
478
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdW5pZmljYXRpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGVxdWFsaXR5RnJvbVN0YXRlbWVudCxcbiAgICAgICAgIGp1ZGdlbWVudEZyb21TdGF0ZW1lbnQsXG4gICAgICAgICB0eXBlQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvbkZyb21TdGF0ZW1lbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0YXRlbWVudFwiO1xuXG5jb25zdCB7IGJhY2t3YXJkc1NvbWUgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudFdpdGhSdWxlKHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNXaXRoUnVsZSA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgIT09IG51bGwpIHtcbiAgICBjb25zdCBydWxlID0gY29udGV4dC5maW5kUnVsZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7XG5cbiAgICBpZiAocnVsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcnVsZVN0cmluZyA9IHJ1bGUuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7cnVsZVN0cmluZ30nIHJ1bGUuLi5gKTtcblxuICAgICAgY29uc3Qgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyA9IGNvbnRleHQuZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucygpLFxuICAgICAgICAgICAgc3RhdGVtZW50QW5kU3VicHJvb2ZPclByb29mQXNzZXJ0aW9uc1VuaWZ5ID0gYXdhaXQgcnVsZS51bmlmeVN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoc3RhdGVtZW50LCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnNVbmlmeSkge1xuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aFJ1bGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGVtZW50VW5pZmllc1dpdGhSdWxlKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtydWxlU3RyaW5nfScgcnVsZS5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhSdWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudFdpdGhSZWZlcmVuY2Uoc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc1dpdGhSZWZlcmVuY2UgPSBmYWxzZTtcblxuICBpZiAocmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIHJlZmVyZW5jZVN0cmluZyA9IHJlZmVyZW5jZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlLi4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVWYWxpZGF0ZXMgPSByZWZlcmVuY2UudmFsaWRhdGVNZXRhdmFyaWFibGUoY29udGV4dCk7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlVmFsaWRhdGVzKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCk7XG5cbiAgICAgIGRlYnVnZ2VyXG5cbiAgICAgIC8vIHN5bnRoZXRpY2FsbHkoKGNvbnRleHQpID0+IHtcbiAgICAgIC8vICAgY29uc3QgeyBTdGF0ZW1lbnRTdWJzdGl0dXRpb24gfSA9IGVsZW1lbnRzO1xuICAgICAgLy9cbiAgICAgIC8vICAgU3RhdGVtZW50U3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUoc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICAvLyAgdmFsaWRhdGVcbiAgICAgIC8vXG4gICAgICAvLyB9LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgc3RhdGVtZW50VW5pZmllc1dpdGhSZWZlcmVuY2UgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzV2l0aFJlZmVyZW5jZSkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZS5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhSZWZlcmVuY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50QXNTYXRpc2ZpZXNBc3NlcnRpb24oc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgc2F0aXNmaWVzQXNzZXJ0aW9uID0gc2F0aXNmaWVzQXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChzYXRpc2ZpZXNBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgc2F0aXNmaWVzIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVkID0gdHJ1ZTtcblxuICAgIHNhdGlzZmllc0Fzc2VydGlvbi52ZXJpZnlTaWduYXR1cmUoc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSBjb250ZXh0LmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKTtcblxuICAgICAgc3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uID0gYmFja3dhcmRzU29tZShzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLCAoc3RlcHNPclN1YnByb29mKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0ZXBPclN1YlByb29mVW5pZmllc1dJdGhTYXRpc2ZpZXNBc3NlcnRpb24gPSBzdGVwc09yU3VicHJvb2YudW5pZnlXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uKHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN0ZXBPclN1YlByb29mVW5pZmllc1dJdGhTYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvcExldmVsQXNzZXJ0aW9uID0gY29udGV4dC5maW5kVG9wTGV2ZWxBc3NlcnRpb25CeVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICBpZiAodG9wTGV2ZWxBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgICAgcmVmZXJlbmNlID0gc2F0aXNmaWVzQXNzZXJ0aW9uLmdldFJlZmVyZW5jZSgpO1xuXG4gICAgICAgIGNvbnN0IGF4aW9tID0gY29udGV4dC5maW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICAgIGlmIChheGlvbSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHNhdGlzZmlhYmxlID0gYXhpb20uaXNTYXRpc2ZpYWJsZSgpO1xuXG4gICAgICAgICAgaWYgKHNhdGlzZmlhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gW10sXG4gICAgICAgICAgICAgICAgICB0b3BMZXZlbEFzc2VydGlvblVuaWZpZXMgPSBheGlvbS51bmlmeVRvcExldmVsQXNzZXJ0aW9uKHRvcExldmVsQXNzZXJ0aW9uLCBzdWJzdGl0dXRpb25zLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKHRvcExldmVsQXNzZXJ0aW9uVW5pZmllcykge1xuICAgICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zQ29ycmVsYXRlcyA9IHNhdGlzZmllc0Fzc2VydGlvbi5jb3JyZWxhdGVTdWJzdGl0dXRpb25zKHN1YnN0aXR1dGlvbnMsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25zQ29ycmVsYXRlcykge1xuICAgICAgICAgICAgICAgIHN0YXRlbWVudFVuaWZpZXNBc1NhdGlzZmllc0Fzc2VydGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYXhpb21TdHJpbmcgPSBheGlvbS5nZXRTdHJpbmcoKTtcblxuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZyhgVW5hYmxlIHRvIHVuaWZ5IHdpdGggdGhlICcke2F4aW9tU3RyaW5nfScgYmVjYXVzZSBpdCBpcyBub3Qgc2F0aXNmaWFibGUuYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBzYXRpc2ZpZXMgYXNzZXJ0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRVbmlmaWVzQXNTYXRpc2ZpZXNBc3NlcnRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50V2l0aFRvcExldmVsQXNzZXJ0aW9uKHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNXaXRoVG9wTGV2ZWxBc3NlcnRpb24gPSBmYWxzZTtcblxuICBpZiAocmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgY29uc3QgdG9wTGV2ZWxBc3NlcnRpb24gPSBjb250ZXh0LmZpbmRUb3BMZXZlbEFzc2VydGlvbkJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7XG5cbiAgICBpZiAodG9wTGV2ZWxBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHRvcExldmVsQXNzZXJ0aW9uU3RyaW5nID0gcmVmZXJlbmNlLmdldFN0cmluZygpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke3RvcExldmVsQXNzZXJ0aW9uU3RyaW5nfScgdG9wIGxldmVsIGFzc2VydGlvbi4uLmApO1xuXG4gICAgICBjb25zdCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gY29udGV4dC5nZXRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zKCksXG4gICAgICAgICAgICBzdGF0ZW1lbnRBbmRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zVW5pZnkgPSBhd2FpdCB0b3BMZXZlbEFzc2VydGlvbi51bmlmeVN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoc3RhdGVtZW50LCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnNVbmlmeSkge1xuICAgICAgICBjb25zdCBtZXRhdmFyaWFibGUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCk7XG5cbiAgICAgICAgZGVidWdnZXJcblxuICAgICAgICAvLyBzeW50aGV0aWNhbGx5KChjb250ZXh0KSA9PiB7XG4gICAgICAgIC8vICAgY29uc3QgeyBTdGF0ZW1lbnRTdWJzdGl0dXRpb24gfSA9IGVsZW1lbnRzO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgIFN0YXRlbWVudFN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50QW5kTWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBjb250ZXh0KTtcblxuICAgICAgICAvLyB2YWlkZGF0ZVxuICAgICAgICAvL1xuICAgICAgICAvLyB9LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aFRvcExldmVsQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXNXaXRoVG9wTGV2ZWxBc3NlcnRpb24pIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke3RvcExldmVsQXNzZXJ0aW9uU3RyaW5nfScgdG9wIGxldmVsIGFzc2VydGlvbi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhUb3BMZXZlbEFzc2VydGlvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5pZnlTdGF0ZW1lbnRBc0VxdWFsaXR5KHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNBRXF1YWxpdHkgPSBmYWxzZTtcblxuICBpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XG4gICAgY29uc3QgZXF1YWxpdHkgPSBlcXVhbGl0eUZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgIGlmIChlcXVhbGl0eSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5Li4uYCk7XG5cbiAgICAgIGNvbnN0IGVxdWFsaXR5RXF1YWwgPSBlcXVhbGl0eS5pc0VxdWFsKGNvbnRleHQpO1xuXG4gICAgICBpZiAoZXF1YWxpdHlFcXVhbCkge1xuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzQUVxdWFsaXR5ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXNBRXF1YWxpdHkpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5LmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRVbmlmaWVzQUVxdWFsaXR5O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudEFzSnVkZ2VtZW50KHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudCA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCBqdWRnZW1lbnQgPSBqdWRnZW1lbnRGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICBpZiAoanVkZ2VtZW50ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBqdWRnZW1lbnQuLi5gKTtcblxuICAgICAgc3RhdGVtZW50VW5pZmllc0FzSnVkZ2VtZW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudCkge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBqdWRnZW1lbnQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5pZnlTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24oc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc0FzVHlwZUFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgIGlmICh0eXBlQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgICBzdGF0ZW1lbnRVbmlmaWVzQXNUeXBlQXNzZXJ0aW9uID0gdHJ1ZTtcblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgdHlwZSBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNBc1R5cGVBc3NlcnRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50QXNQcm9wZXJ0eUFzc2VydGlvbihzdGF0ZW1lbnQsIHJlZmVyZW5jZSwgc2F0aXNmaWVzQXNzZXJ0aW9uLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRVbmlmaWVzQXNQcm9wZXJ0eUFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCBwcm9wZXJ0eUFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gICAgaWYgKHByb3BlcnR5QXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uLi5gKTtcblxuICAgICAgY29uc3QgdGVybSA9IHByb3BlcnR5QXNzZXJ0aW9uLmdldFRlcm0oKSxcbiAgICAgICAgICAgIGVxdWl2YWxlbmNlID0gY29udGV4dC5maW5kRXF1aXZhbGVuY2VCeVRlcm0odGVybSk7XG5cbiAgICAgIGlmIChlcXVpdmFsZW5jZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUFzc2VydGlvbk1hdGNoZXMgPSBlcXVpdmFsZW5jZS5zb21lT3RoZXJUZXJtKHRlcm0sICh0ZXJtKSA9PiB7ICAvLy9cbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eVJlbGF0aW9uID0gcHJvcGVydHlBc3NlcnRpb24uZ2V0UHJvcGVydHlSZWxhdGlvbigpLFxuICAgICAgICAgICAgICAgIGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiA9IGNvbnRleHQuY29tcGFyZVRlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uKHRlcm0sIHByb3BlcnR5UmVsYXRpb24pO1xuXG4gICAgICAgICAgaWYgKGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJvcGVydHlBc3NlcnRpb25NYXRjaGVzKSB7XG4gICAgICAgICAgc3RhdGVtZW50VW5pZmllc0FzUHJvcGVydHlBc3NlcnRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzQXNQcm9wZXJ0eUFzc2VydGlvbikge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNBc1Byb3BlcnR5QXNzZXJ0aW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudFdpdGhTYXRpc2ZpZXNBc3NlcnRpb24oc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb24gPSBmYWxzZTtcblxuICBpZiAoc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvblN0cmluZyA9IHNhdGlzZmllc0Fzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbW50IHdpdGggdGhlICcke3NhdGlzZmllc0Fzc2VydGlvblN0cmluZ30nIHNhdGlzZmllcyBhc3NlcnRpb24uLi5gKTtcblxuICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSBjb250ZXh0LmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzID0gc2F0aXNmaWVzQXNzZXJ0aW9uLnVuaWZ5U3RhdGVtZW50QW5kU3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyhzdGF0ZW1lbnQsIHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgIHN0YXRlbWVudFVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVtbnQgd2l0aCB0aGUgJyR7c2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nfScgc2F0aXNmaWVzIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBhcmVTdGF0ZW1lbnRXaXRoU3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyhzdGF0ZW1lbnQsIHJlZmVyZW5jZSwgc2F0aXNmaWVzQXNzZXJ0aW9uLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRFcXVhdGVzV2l0aFN0ZXBPclN1YnByb29mcyA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSBzdWJwcm9vZnMgb3IgcHJvb2YgYXNzc2VydGlvbnMuLi5gKTtcblxuICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSBjb250ZXh0LmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aFN0ZXBzID0gc3RhdGVtZW50LmNvbXBhcmVTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zKHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFVuaWZpZXNXaXRoU3RlcHMpIHtcbiAgICAgIHN0YXRlbWVudEVxdWF0ZXNXaXRoU3RlcE9yU3VicHJvb2ZzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50RXF1YXRlc1dpdGhTdGVwT3JTdWJwcm9vZnMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLmNvbXBhcmVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgc3VicHJvb2ZzIG9yIHByb29mIGFzc3NlcnRpb25zLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRFcXVhdGVzV2l0aFN0ZXBPclN1YnByb29mcztcbn1cblxuZXhwb3J0IGNvbnN0IHVuaWZ5U3RhdGVtZW50cyA9IFtcbiAgdW5pZnlTdGF0ZW1lbnRXaXRoUnVsZSxcbiAgdW5pZnlTdGF0ZW1lbnRXaXRoUmVmZXJlbmNlLFxuICB1bmlmeVN0YXRlbWVudEFzU2F0aXNmaWVzQXNzZXJ0aW9uLFxuICB1bmlmeVN0YXRlbWVudFdpdGhUb3BMZXZlbEFzc2VydGlvbixcbiAgdW5pZnlTdGF0ZW1lbnRBc0VxdWFsaXR5LFxuICB1bmlmeVN0YXRlbWVudEFzSnVkZ2VtZW50LFxuICB1bmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbixcbiAgdW5pZnlTdGF0ZW1lbnRBc1Byb3BlcnR5QXNzZXJ0aW9uLFxuICB1bmlmeVN0YXRlbWVudFdpdGhTYXRpc2ZpZXNBc3NlcnRpb24sXG4gIGNvbXBhcmVTdGF0ZW1lbnRXaXRoU3VicHJvb2ZPclByb29mQXNzZXJ0aW9uc1xuXTtcbiJdLCJuYW1lcyI6WyJ1bmlmeVN0YXRlbWVudHMiLCJiYWNrd2FyZHNTb21lIiwiYXJyYXlVdGlsaXRpZXMiLCJ1bmlmeVN0YXRlbWVudFdpdGhSdWxlIiwic3RhdGVtZW50IiwicmVmZXJlbmNlIiwic2F0aXNmaWVzQXNzZXJ0aW9uIiwiY29udGV4dCIsInN0YXRlbWVudFVuaWZpZXNXaXRoUnVsZSIsInJ1bGUiLCJydWxlU3RyaW5nIiwic3RhdGVtZW50U3RyaW5nIiwic3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsInN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnNVbmlmeSIsImZpbmRSdWxlQnlSZWZlcmVuY2UiLCJnZXRTdHJpbmciLCJ0cmFjZSIsImdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJ1bmlmeVN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJkZWJ1ZyIsInVuaWZ5U3RhdGVtZW50V2l0aFJlZmVyZW5jZSIsInN0YXRlbWVudFVuaWZpZXNXaXRoUmVmZXJlbmNlIiwicmVmZXJlbmNlU3RyaW5nIiwibWV0YXZhcmlhYmxlVmFsaWRhdGVzIiwibWV0YXZhcmlhYmxlIiwidmFsaWRhdGVNZXRhdmFyaWFibGUiLCJnZXRNZXRhdmFyaWFibGUiLCJ1bmlmeVN0YXRlbWVudEFzU2F0aXNmaWVzQXNzZXJ0aW9uIiwic3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uIiwic3RhdGVkIiwidG9wTGV2ZWxBc3NlcnRpb24iLCJheGlvbSIsInNhdGlzZmlhYmxlIiwic3Vic3RpdHV0aW9ucyIsInRvcExldmVsQXNzZXJ0aW9uVW5pZmllcyIsInN1YnN0aXR1dGlvbnNDb3JyZWxhdGVzIiwiYXhpb21TdHJpbmciLCJzYXRpc2ZpZXNBc3NlcnRpb25Gcm9tU3RhdGVtZW50IiwidmVyaWZ5U2lnbmF0dXJlIiwic3RlcHNPclN1YnByb29mIiwic3RlcE9yU3ViUHJvb2ZVbmlmaWVzV0l0aFNhdGlzZmllc0Fzc2VydGlvbiIsInVuaWZ5V2l0aFNhdGlzZmllc0Fzc2VydGlvbiIsImZpbmRUb3BMZXZlbEFzc2VydGlvbkJ5UmVmZXJlbmNlIiwiZ2V0UmVmZXJlbmNlIiwiZmluZEF4aW9tQnlSZWZlcmVuY2UiLCJpc1NhdGlzZmlhYmxlIiwidW5pZnlUb3BMZXZlbEFzc2VydGlvbiIsImNvcnJlbGF0ZVN1YnN0aXR1dGlvbnMiLCJ1bmlmeVN0YXRlbWVudFdpdGhUb3BMZXZlbEFzc2VydGlvbiIsInN0YXRlbWVudFVuaWZpZXNXaXRoVG9wTGV2ZWxBc3NlcnRpb24iLCJ0b3BMZXZlbEFzc2VydGlvblN0cmluZyIsInVuaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSIsInN0YXRlbWVudFVuaWZpZXNBRXF1YWxpdHkiLCJlcXVhbGl0eSIsImVxdWFsaXR5RXF1YWwiLCJlcXVhbGl0eUZyb21TdGF0ZW1lbnQiLCJpc0VxdWFsIiwidW5pZnlTdGF0ZW1lbnRBc0p1ZGdlbWVudCIsInN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudCIsImp1ZGdlbWVudCIsImp1ZGdlbWVudEZyb21TdGF0ZW1lbnQiLCJ1bmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsInN0YXRlbWVudFVuaWZpZXNBc1R5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uIiwidHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJ1bmlmeVN0YXRlbWVudEFzUHJvcGVydHlBc3NlcnRpb24iLCJzdGF0ZW1lbnRVbmlmaWVzQXNQcm9wZXJ0eUFzc2VydGlvbiIsInByb3BlcnR5QXNzZXJ0aW9uIiwidGVybSIsImVxdWl2YWxlbmNlIiwicHJvcGVydHlBc3NlcnRpb25NYXRjaGVzIiwicHJvcGVydHlBc3NlcnRpb25Gcm9tU3RhdGVtZW50IiwiZ2V0VGVybSIsImZpbmRFcXVpdmFsZW5jZUJ5VGVybSIsInNvbWVPdGhlclRlcm0iLCJwcm9wZXJ0eVJlbGF0aW9uIiwiZ2V0UHJvcGVydHlSZWxhdGlvbiIsImNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiIsImNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbiIsInVuaWZ5U3RhdGVtZW50V2l0aFNhdGlzZmllc0Fzc2VydGlvbiIsInN0YXRlbWVudFVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uIiwic2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nIiwic3RhdGVtZW50VW5pZmllcyIsImNvbXBhcmVTdGF0ZW1lbnRXaXRoU3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsInN0YXRlbWVudEVxdWF0ZXNXaXRoU3RlcE9yU3VicHJvb2ZzIiwic3RhdGVtZW50VW5pZmllc1dpdGhTdGVwcyIsImNvbXBhcmVTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkErVWFBOzs7ZUFBQUE7Ozt5QkE3VWtCOytEQUVWO3lCQU0yQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdW5pZmljYXRpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGVxdWFsaXR5RnJvbVN0YXRlbWVudCxcbiAgICAgICAgIGp1ZGdlbWVudEZyb21TdGF0ZW1lbnQsXG4gICAgICAgICB0eXBlQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvbkZyb21TdGF0ZW1lbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0YXRlbWVudFwiO1xuXG5jb25zdCB7IGJhY2t3YXJkc1NvbWUgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudFdpdGhSdWxlKHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNXaXRoUnVsZSA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgIT09IG51bGwpIHtcbiAgICBjb25zdCBydWxlID0gY29udGV4dC5maW5kUnVsZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7XG5cbiAgICBpZiAocnVsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcnVsZVN0cmluZyA9IHJ1bGUuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7cnVsZVN0cmluZ30nIHJ1bGUuLi5gKTtcblxuICAgICAgY29uc3Qgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyA9IGNvbnRleHQuZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucygpLFxuICAgICAgICAgICAgc3RhdGVtZW50QW5kU3VicHJvb2ZPclByb29mQXNzZXJ0aW9uc1VuaWZ5ID0gYXdhaXQgcnVsZS51bmlmeVN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoc3RhdGVtZW50LCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnNVbmlmeSkge1xuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aFJ1bGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGVtZW50VW5pZmllc1dpdGhSdWxlKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtydWxlU3RyaW5nfScgcnVsZS5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhSdWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudFdpdGhSZWZlcmVuY2Uoc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc1dpdGhSZWZlcmVuY2UgPSBmYWxzZTtcblxuICBpZiAocmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIHJlZmVyZW5jZVN0cmluZyA9IHJlZmVyZW5jZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlLi4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVWYWxpZGF0ZXMgPSByZWZlcmVuY2UudmFsaWRhdGVNZXRhdmFyaWFibGUoY29udGV4dCk7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlVmFsaWRhdGVzKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCk7XG5cbiAgICAgIGRlYnVnZ2VyXG5cbiAgICAgIC8vIHN5bnRoZXRpY2FsbHkoKGNvbnRleHQpID0+IHtcbiAgICAgIC8vICAgY29uc3QgeyBTdGF0ZW1lbnRTdWJzdGl0dXRpb24gfSA9IGVsZW1lbnRzO1xuICAgICAgLy9cbiAgICAgIC8vICAgU3RhdGVtZW50U3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUoc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICAvLyAgdmFsaWRhdGVcbiAgICAgIC8vXG4gICAgICAvLyB9LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgc3RhdGVtZW50VW5pZmllc1dpdGhSZWZlcmVuY2UgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzV2l0aFJlZmVyZW5jZSkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZS5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhSZWZlcmVuY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50QXNTYXRpc2ZpZXNBc3NlcnRpb24oc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgc2F0aXNmaWVzQXNzZXJ0aW9uID0gc2F0aXNmaWVzQXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChzYXRpc2ZpZXNBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgc2F0aXNmaWVzIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVkID0gdHJ1ZTtcblxuICAgIHNhdGlzZmllc0Fzc2VydGlvbi52ZXJpZnlTaWduYXR1cmUoc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSBjb250ZXh0LmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKTtcblxuICAgICAgc3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uID0gYmFja3dhcmRzU29tZShzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLCAoc3RlcHNPclN1YnByb29mKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0ZXBPclN1YlByb29mVW5pZmllc1dJdGhTYXRpc2ZpZXNBc3NlcnRpb24gPSBzdGVwc09yU3VicHJvb2YudW5pZnlXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uKHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN0ZXBPclN1YlByb29mVW5pZmllc1dJdGhTYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvcExldmVsQXNzZXJ0aW9uID0gY29udGV4dC5maW5kVG9wTGV2ZWxBc3NlcnRpb25CeVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICBpZiAodG9wTGV2ZWxBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgICAgcmVmZXJlbmNlID0gc2F0aXNmaWVzQXNzZXJ0aW9uLmdldFJlZmVyZW5jZSgpO1xuXG4gICAgICAgIGNvbnN0IGF4aW9tID0gY29udGV4dC5maW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICAgIGlmIChheGlvbSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHNhdGlzZmlhYmxlID0gYXhpb20uaXNTYXRpc2ZpYWJsZSgpO1xuXG4gICAgICAgICAgaWYgKHNhdGlzZmlhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gW10sXG4gICAgICAgICAgICAgICAgICB0b3BMZXZlbEFzc2VydGlvblVuaWZpZXMgPSBheGlvbS51bmlmeVRvcExldmVsQXNzZXJ0aW9uKHRvcExldmVsQXNzZXJ0aW9uLCBzdWJzdGl0dXRpb25zLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKHRvcExldmVsQXNzZXJ0aW9uVW5pZmllcykge1xuICAgICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zQ29ycmVsYXRlcyA9IHNhdGlzZmllc0Fzc2VydGlvbi5jb3JyZWxhdGVTdWJzdGl0dXRpb25zKHN1YnN0aXR1dGlvbnMsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25zQ29ycmVsYXRlcykge1xuICAgICAgICAgICAgICAgIHN0YXRlbWVudFVuaWZpZXNBc1NhdGlzZmllc0Fzc2VydGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYXhpb21TdHJpbmcgPSBheGlvbS5nZXRTdHJpbmcoKTtcblxuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZyhgVW5hYmxlIHRvIHVuaWZ5IHdpdGggdGhlICcke2F4aW9tU3RyaW5nfScgYmVjYXVzZSBpdCBpcyBub3Qgc2F0aXNmaWFibGUuYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBzYXRpc2ZpZXMgYXNzZXJ0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRVbmlmaWVzQXNTYXRpc2ZpZXNBc3NlcnRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50V2l0aFRvcExldmVsQXNzZXJ0aW9uKHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNXaXRoVG9wTGV2ZWxBc3NlcnRpb24gPSBmYWxzZTtcblxuICBpZiAocmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgY29uc3QgdG9wTGV2ZWxBc3NlcnRpb24gPSBjb250ZXh0LmZpbmRUb3BMZXZlbEFzc2VydGlvbkJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7XG5cbiAgICBpZiAodG9wTGV2ZWxBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHRvcExldmVsQXNzZXJ0aW9uU3RyaW5nID0gcmVmZXJlbmNlLmdldFN0cmluZygpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke3RvcExldmVsQXNzZXJ0aW9uU3RyaW5nfScgdG9wIGxldmVsIGFzc2VydGlvbi4uLmApO1xuXG4gICAgICBjb25zdCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gY29udGV4dC5nZXRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zKCksXG4gICAgICAgICAgICBzdGF0ZW1lbnRBbmRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zVW5pZnkgPSBhd2FpdCB0b3BMZXZlbEFzc2VydGlvbi51bmlmeVN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoc3RhdGVtZW50LCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnNVbmlmeSkge1xuICAgICAgICBjb25zdCBtZXRhdmFyaWFibGUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCk7XG5cbiAgICAgICAgZGVidWdnZXJcblxuICAgICAgICAvLyBzeW50aGV0aWNhbGx5KChjb250ZXh0KSA9PiB7XG4gICAgICAgIC8vICAgY29uc3QgeyBTdGF0ZW1lbnRTdWJzdGl0dXRpb24gfSA9IGVsZW1lbnRzO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgIFN0YXRlbWVudFN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50QW5kTWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBjb250ZXh0KTtcblxuICAgICAgICAvLyB2YWlkZGF0ZVxuICAgICAgICAvL1xuICAgICAgICAvLyB9LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aFRvcExldmVsQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXNXaXRoVG9wTGV2ZWxBc3NlcnRpb24pIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke3RvcExldmVsQXNzZXJ0aW9uU3RyaW5nfScgdG9wIGxldmVsIGFzc2VydGlvbi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhUb3BMZXZlbEFzc2VydGlvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5pZnlTdGF0ZW1lbnRBc0VxdWFsaXR5KHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNBRXF1YWxpdHkgPSBmYWxzZTtcblxuICBpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XG4gICAgY29uc3QgZXF1YWxpdHkgPSBlcXVhbGl0eUZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgIGlmIChlcXVhbGl0eSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5Li4uYCk7XG5cbiAgICAgIGNvbnN0IGVxdWFsaXR5RXF1YWwgPSBlcXVhbGl0eS5pc0VxdWFsKGNvbnRleHQpO1xuXG4gICAgICBpZiAoZXF1YWxpdHlFcXVhbCkge1xuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzQUVxdWFsaXR5ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXNBRXF1YWxpdHkpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5LmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRVbmlmaWVzQUVxdWFsaXR5O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudEFzSnVkZ2VtZW50KHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudCA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCBqdWRnZW1lbnQgPSBqdWRnZW1lbnRGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICBpZiAoanVkZ2VtZW50ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBqdWRnZW1lbnQuLi5gKTtcblxuICAgICAgc3RhdGVtZW50VW5pZmllc0FzSnVkZ2VtZW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudCkge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBqdWRnZW1lbnQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5pZnlTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24oc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc0FzVHlwZUFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgIGlmICh0eXBlQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgICBzdGF0ZW1lbnRVbmlmaWVzQXNUeXBlQXNzZXJ0aW9uID0gdHJ1ZTtcblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgdHlwZSBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNBc1R5cGVBc3NlcnRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50QXNQcm9wZXJ0eUFzc2VydGlvbihzdGF0ZW1lbnQsIHJlZmVyZW5jZSwgc2F0aXNmaWVzQXNzZXJ0aW9uLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRVbmlmaWVzQXNQcm9wZXJ0eUFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCBwcm9wZXJ0eUFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gICAgaWYgKHByb3BlcnR5QXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uLi5gKTtcblxuICAgICAgY29uc3QgdGVybSA9IHByb3BlcnR5QXNzZXJ0aW9uLmdldFRlcm0oKSxcbiAgICAgICAgICAgIGVxdWl2YWxlbmNlID0gY29udGV4dC5maW5kRXF1aXZhbGVuY2VCeVRlcm0odGVybSk7XG5cbiAgICAgIGlmIChlcXVpdmFsZW5jZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUFzc2VydGlvbk1hdGNoZXMgPSBlcXVpdmFsZW5jZS5zb21lT3RoZXJUZXJtKHRlcm0sICh0ZXJtKSA9PiB7ICAvLy9cbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eVJlbGF0aW9uID0gcHJvcGVydHlBc3NlcnRpb24uZ2V0UHJvcGVydHlSZWxhdGlvbigpLFxuICAgICAgICAgICAgICAgIGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiA9IGNvbnRleHQuY29tcGFyZVRlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uKHRlcm0sIHByb3BlcnR5UmVsYXRpb24pO1xuXG4gICAgICAgICAgaWYgKGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJvcGVydHlBc3NlcnRpb25NYXRjaGVzKSB7XG4gICAgICAgICAgc3RhdGVtZW50VW5pZmllc0FzUHJvcGVydHlBc3NlcnRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzQXNQcm9wZXJ0eUFzc2VydGlvbikge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNBc1Byb3BlcnR5QXNzZXJ0aW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmlmeVN0YXRlbWVudFdpdGhTYXRpc2ZpZXNBc3NlcnRpb24oc3RhdGVtZW50LCByZWZlcmVuY2UsIHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb24gPSBmYWxzZTtcblxuICBpZiAoc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvblN0cmluZyA9IHNhdGlzZmllc0Fzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbW50IHdpdGggdGhlICcke3NhdGlzZmllc0Fzc2VydGlvblN0cmluZ30nIHNhdGlzZmllcyBhc3NlcnRpb24uLi5gKTtcblxuICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSBjb250ZXh0LmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzID0gc2F0aXNmaWVzQXNzZXJ0aW9uLnVuaWZ5U3RhdGVtZW50QW5kU3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyhzdGF0ZW1lbnQsIHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgIHN0YXRlbWVudFVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVtbnQgd2l0aCB0aGUgJyR7c2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nfScgc2F0aXNmaWVzIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBhcmVTdGF0ZW1lbnRXaXRoU3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyhzdGF0ZW1lbnQsIHJlZmVyZW5jZSwgc2F0aXNmaWVzQXNzZXJ0aW9uLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRFcXVhdGVzV2l0aFN0ZXBPclN1YnByb29mcyA9IGZhbHNlO1xuXG4gIGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSBzdWJwcm9vZnMgb3IgcHJvb2YgYXNzc2VydGlvbnMuLi5gKTtcblxuICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSBjb250ZXh0LmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aFN0ZXBzID0gc3RhdGVtZW50LmNvbXBhcmVTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zKHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFVuaWZpZXNXaXRoU3RlcHMpIHtcbiAgICAgIHN0YXRlbWVudEVxdWF0ZXNXaXRoU3RlcE9yU3VicHJvb2ZzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50RXF1YXRlc1dpdGhTdGVwT3JTdWJwcm9vZnMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLmNvbXBhcmVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgc3VicHJvb2ZzIG9yIHByb29mIGFzc3NlcnRpb25zLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRFcXVhdGVzV2l0aFN0ZXBPclN1YnByb29mcztcbn1cblxuZXhwb3J0IGNvbnN0IHVuaWZ5U3RhdGVtZW50cyA9IFtcbiAgdW5pZnlTdGF0ZW1lbnRXaXRoUnVsZSxcbiAgdW5pZnlTdGF0ZW1lbnRXaXRoUmVmZXJlbmNlLFxuICB1bmlmeVN0YXRlbWVudEFzU2F0aXNmaWVzQXNzZXJ0aW9uLFxuICB1bmlmeVN0YXRlbWVudFdpdGhUb3BMZXZlbEFzc2VydGlvbixcbiAgdW5pZnlTdGF0ZW1lbnRBc0VxdWFsaXR5LFxuICB1bmlmeVN0YXRlbWVudEFzSnVkZ2VtZW50LFxuICB1bmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbixcbiAgdW5pZnlTdGF0ZW1lbnRBc1Byb3BlcnR5QXNzZXJ0aW9uLFxuICB1bmlmeVN0YXRlbWVudFdpdGhTYXRpc2ZpZXNBc3NlcnRpb24sXG4gIGNvbXBhcmVTdGF0ZW1lbnRXaXRoU3VicHJvb2ZPclByb29mQXNzZXJ0aW9uc1xuXTtcbiJdLCJuYW1lcyI6WyJ1bmlmeVN0YXRlbWVudHMiLCJiYWNrd2FyZHNTb21lIiwiYXJyYXlVdGlsaXRpZXMiLCJ1bmlmeVN0YXRlbWVudFdpdGhSdWxlIiwic3RhdGVtZW50IiwicmVmZXJlbmNlIiwic2F0aXNmaWVzQXNzZXJ0aW9uIiwiY29udGV4dCIsInN0YXRlbWVudFVuaWZpZXNXaXRoUnVsZSIsInJ1bGUiLCJmaW5kUnVsZUJ5UmVmZXJlbmNlIiwicnVsZVN0cmluZyIsImdldFN0cmluZyIsInN0YXRlbWVudFN0cmluZyIsInRyYWNlIiwic3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsImdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJzdGF0ZW1lbnRBbmRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zVW5pZnkiLCJ1bmlmeVN0YXRlbWVudEFuZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJkZWJ1ZyIsInVuaWZ5U3RhdGVtZW50V2l0aFJlZmVyZW5jZSIsInN0YXRlbWVudFVuaWZpZXNXaXRoUmVmZXJlbmNlIiwicmVmZXJlbmNlU3RyaW5nIiwibWV0YXZhcmlhYmxlVmFsaWRhdGVzIiwidmFsaWRhdGVNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJnZXRNZXRhdmFyaWFibGUiLCJ1bmlmeVN0YXRlbWVudEFzU2F0aXNmaWVzQXNzZXJ0aW9uIiwic3RhdGVtZW50VW5pZmllc0FzU2F0aXNmaWVzQXNzZXJ0aW9uIiwic2F0aXNmaWVzQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsInN0YXRlZCIsInZlcmlmeVNpZ25hdHVyZSIsInN0ZXBzT3JTdWJwcm9vZiIsInN0ZXBPclN1YlByb29mVW5pZmllc1dJdGhTYXRpc2ZpZXNBc3NlcnRpb24iLCJ1bmlmeVdpdGhTYXRpc2ZpZXNBc3NlcnRpb24iLCJ0b3BMZXZlbEFzc2VydGlvbiIsImZpbmRUb3BMZXZlbEFzc2VydGlvbkJ5UmVmZXJlbmNlIiwiZ2V0UmVmZXJlbmNlIiwiYXhpb20iLCJmaW5kQXhpb21CeVJlZmVyZW5jZSIsInNhdGlzZmlhYmxlIiwiaXNTYXRpc2ZpYWJsZSIsInN1YnN0aXR1dGlvbnMiLCJ0b3BMZXZlbEFzc2VydGlvblVuaWZpZXMiLCJ1bmlmeVRvcExldmVsQXNzZXJ0aW9uIiwic3Vic3RpdHV0aW9uc0NvcnJlbGF0ZXMiLCJjb3JyZWxhdGVTdWJzdGl0dXRpb25zIiwiYXhpb21TdHJpbmciLCJ1bmlmeVN0YXRlbWVudFdpdGhUb3BMZXZlbEFzc2VydGlvbiIsInN0YXRlbWVudFVuaWZpZXNXaXRoVG9wTGV2ZWxBc3NlcnRpb24iLCJ0b3BMZXZlbEFzc2VydGlvblN0cmluZyIsInVuaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSIsInN0YXRlbWVudFVuaWZpZXNBRXF1YWxpdHkiLCJlcXVhbGl0eSIsImVxdWFsaXR5RnJvbVN0YXRlbWVudCIsImVxdWFsaXR5RXF1YWwiLCJpc0VxdWFsIiwidW5pZnlTdGF0ZW1lbnRBc0p1ZGdlbWVudCIsInN0YXRlbWVudFVuaWZpZXNBc0p1ZGdlbWVudCIsImp1ZGdlbWVudCIsImp1ZGdlbWVudEZyb21TdGF0ZW1lbnQiLCJ1bmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsInN0YXRlbWVudFVuaWZpZXNBc1R5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uIiwidHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJ1bmlmeVN0YXRlbWVudEFzUHJvcGVydHlBc3NlcnRpb24iLCJzdGF0ZW1lbnRVbmlmaWVzQXNQcm9wZXJ0eUFzc2VydGlvbiIsInByb3BlcnR5QXNzZXJ0aW9uIiwicHJvcGVydHlBc3NlcnRpb25Gcm9tU3RhdGVtZW50IiwidGVybSIsImdldFRlcm0iLCJlcXVpdmFsZW5jZSIsImZpbmRFcXVpdmFsZW5jZUJ5VGVybSIsInByb3BlcnR5QXNzZXJ0aW9uTWF0Y2hlcyIsInNvbWVPdGhlclRlcm0iLCJwcm9wZXJ0eVJlbGF0aW9uIiwiZ2V0UHJvcGVydHlSZWxhdGlvbiIsImNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiIsImNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbiIsInVuaWZ5U3RhdGVtZW50V2l0aFNhdGlzZmllc0Fzc2VydGlvbiIsInN0YXRlbWVudFVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uIiwic2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nIiwic3RhdGVtZW50VW5pZmllcyIsImNvbXBhcmVTdGF0ZW1lbnRXaXRoU3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsInN0YXRlbWVudEVxdWF0ZXNXaXRoU3RlcE9yU3VicHJvb2ZzIiwic3RhdGVtZW50VW5pZmllc1dpdGhTdGVwcyIsImNvbXBhcmVTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkErVWFBOzs7ZUFBQUE7OzsyQkE3VWtCO2lFQUVWOzJCQU0yQjs7Ozs7O0FBRWhELE1BQU0sRUFBRUMsYUFBYSxFQUFFLEdBQUdDLHlCQUFjO0FBRXhDLGVBQWVDLHVCQUF1QkMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLGtCQUFr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