occam-verify-cli 1.0.806 → 1.0.814
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.
- package/lib/context/bounded.js +242 -0
- package/lib/context/branching.js +3 -3
- package/lib/context/ephemeral.js +3 -3
- package/lib/context/file/nominal.js +16 -16
- package/lib/context/liminal.js +26 -30
- package/lib/context/synoptic.js +272 -0
- package/lib/context.js +66 -54
- package/lib/element/assertion/defined.js +8 -8
- package/lib/element/assertion/satisfies.js +15 -11
- package/lib/element/assertion.js +5 -5
- package/lib/element/assumption/metaLevel.js +3 -3
- package/lib/element/conclusion.js +11 -8
- package/lib/element/deduction.js +11 -8
- package/lib/element/derivation.js +1 -7
- package/lib/element/frame.js +6 -14
- package/lib/element/label.js +5 -8
- package/lib/element/metavariable.js +17 -17
- package/lib/element/procedureCall.js +10 -6
- package/lib/element/proof.js +2 -2
- package/lib/element/proofAssertion/premise.js +27 -27
- package/lib/element/proofAssertion/step.js +26 -6
- package/lib/element/proofAssertion/supposition.js +27 -27
- package/lib/element/proofAssertion.js +10 -10
- package/lib/element/reference.js +9 -13
- package/lib/element/rule.js +42 -44
- package/lib/element/signature.js +4 -4
- package/lib/element/statement.js +35 -45
- package/lib/element/subproof.js +5 -5
- package/lib/element/substitution/frame.js +16 -11
- package/lib/element/substitution/reference.js +15 -10
- package/lib/element/substitution/statement.js +62 -56
- package/lib/element/substitution/term.js +15 -10
- package/lib/element/substitution.js +29 -31
- package/lib/element/term.js +1 -16
- package/lib/element/topLevelAssertion/axiom.js +5 -3
- package/lib/element/topLevelAssertion.js +37 -39
- package/lib/element/topLevelMetaAssertion.js +2 -2
- package/lib/element/variable.js +6 -6
- package/lib/node/frame.js +1 -9
- package/lib/node/statement.js +1 -9
- package/lib/node/term.js +1 -19
- package/lib/process/assign.js +23 -31
- package/lib/utilities/context.js +41 -42
- package/lib/utilities/element.js +33 -5
- package/lib/utilities/equivalence.js +4 -4
- package/lib/utilities/equivalences.js +28 -13
- package/lib/utilities/instance.js +3 -3
- package/lib/utilities/string.js +2 -2
- package/lib/utilities/substitutions.js +16 -15
- package/lib/utilities/unification.js +133 -124
- package/package.json +4 -4
- package/src/context/{proof.js → bounded.js} +9 -9
- package/src/context/branching.js +2 -2
- package/src/context/ephemeral.js +2 -2
- package/src/context/file/nominal.js +15 -15
- package/src/context/liminal.js +29 -35
- package/src/context/{synthetic.js → synoptic.js} +84 -4
- package/src/context.js +88 -69
- package/src/element/assertion/defined.js +8 -8
- package/src/element/assertion/satisfies.js +17 -10
- package/src/element/assertion.js +8 -8
- package/src/element/assumption/metaLevel.js +4 -2
- package/src/element/conclusion.js +12 -7
- package/src/element/deduction.js +12 -7
- package/src/element/derivation.js +0 -2
- package/src/element/frame.js +7 -20
- package/src/element/label.js +3 -5
- package/src/element/metavariable.js +27 -27
- package/src/element/procedureCall.js +15 -10
- package/src/element/proof.js +2 -2
- package/src/element/proofAssertion/premise.js +41 -41
- package/src/element/proofAssertion/step.js +39 -9
- package/src/element/proofAssertion/supposition.js +41 -41
- package/src/element/proofAssertion.js +10 -9
- package/src/element/reference.js +9 -13
- package/src/element/rule.js +59 -63
- package/src/element/signature.js +3 -3
- package/src/element/statement.js +54 -68
- package/src/element/subproof.js +5 -5
- package/src/element/substitution/frame.js +18 -8
- package/src/element/substitution/reference.js +16 -7
- package/src/element/substitution/statement.js +87 -74
- package/src/element/substitution/term.js +15 -6
- package/src/element/substitution.js +38 -41
- package/src/element/term.js +0 -26
- package/src/element/topLevelAssertion/axiom.js +5 -2
- package/src/element/topLevelAssertion.js +51 -55
- package/src/element/topLevelMetaAssertion.js +2 -2
- package/src/element/variable.js +5 -5
- package/src/node/frame.js +0 -12
- package/src/node/statement.js +0 -12
- package/src/node/term.js +0 -28
- package/src/process/assign.js +35 -46
- package/src/utilities/context.js +41 -43
- package/src/utilities/element.js +32 -4
- package/src/utilities/equivalence.js +3 -4
- package/src/utilities/equivalences.js +29 -17
- package/src/utilities/instance.js +3 -3
- package/src/utilities/string.js +2 -2
- package/src/utilities/substitutions.js +17 -15
- package/src/utilities/unification.js +145 -119
- package/lib/context/proof.js +0 -242
- package/lib/context/synthetic.js +0 -212
package/lib/context/proof.js
DELETED
|
@@ -1,242 +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
|
-
const _necessary = require("necessary");
|
|
12
|
-
const _context = /*#__PURE__*/ _interop_require_default(require("../context"));
|
|
13
|
-
const _equivalences = require("../utilities/equivalences");
|
|
14
|
-
function _interop_require_default(obj) {
|
|
15
|
-
return obj && obj.__esModule ? obj : {
|
|
16
|
-
default: obj
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
const { last, filter } = _necessary.arrayUtilities;
|
|
20
|
-
class ProofContext extends _context.default {
|
|
21
|
-
constructor(context, assignments, equivalences, declaredVariables, declaredJudgements, metaLevelAssumptions, subproofOrProofAssertions){
|
|
22
|
-
super(context);
|
|
23
|
-
this.assignments = assignments;
|
|
24
|
-
this.equivalences = equivalences;
|
|
25
|
-
this.declaredVariables = declaredVariables;
|
|
26
|
-
this.declaredJudgements = declaredJudgements;
|
|
27
|
-
this.metaLevelAssumptions = metaLevelAssumptions;
|
|
28
|
-
this.subproofOrProofAssertions = subproofOrProofAssertions;
|
|
29
|
-
}
|
|
30
|
-
getAssignments() {
|
|
31
|
-
return this.assignments;
|
|
32
|
-
}
|
|
33
|
-
getEquivalences() {
|
|
34
|
-
let equivalences;
|
|
35
|
-
let context;
|
|
36
|
-
context = this.getContext();
|
|
37
|
-
equivalences = context.getEquivalences();
|
|
38
|
-
context = this; ///
|
|
39
|
-
equivalences = (0, _equivalences.mergeEquivalences)(this.equivalences, equivalences, context); ///
|
|
40
|
-
return equivalences;
|
|
41
|
-
}
|
|
42
|
-
getDeclaredVariables() {
|
|
43
|
-
let declaredVariables;
|
|
44
|
-
const context = this.getContext();
|
|
45
|
-
declaredVariables = context.getDeclaredVariables();
|
|
46
|
-
declaredVariables = [
|
|
47
|
-
...this.declaredVariables,
|
|
48
|
-
...declaredVariables
|
|
49
|
-
];
|
|
50
|
-
return declaredVariables;
|
|
51
|
-
}
|
|
52
|
-
getDeclaredJudgements() {
|
|
53
|
-
let declaredJudgements;
|
|
54
|
-
const context = this.getContext();
|
|
55
|
-
declaredJudgements = context.getDeclaredJudgements();
|
|
56
|
-
declaredJudgements = [
|
|
57
|
-
...this.declaredJudgements,
|
|
58
|
-
...declaredJudgements
|
|
59
|
-
];
|
|
60
|
-
return declaredJudgements;
|
|
61
|
-
}
|
|
62
|
-
getMetaLevelAssumptions() {
|
|
63
|
-
return this.metaLevelAssumptions;
|
|
64
|
-
}
|
|
65
|
-
getSubproofOrProofAssertions() {
|
|
66
|
-
let subproofOrProofAssertions;
|
|
67
|
-
const context = this.getContext();
|
|
68
|
-
subproofOrProofAssertions = context.getSubproofOrProofAssertions();
|
|
69
|
-
subproofOrProofAssertions = [
|
|
70
|
-
...subproofOrProofAssertions,
|
|
71
|
-
...this.subproofOrProofAssertions
|
|
72
|
-
];
|
|
73
|
-
return subproofOrProofAssertions;
|
|
74
|
-
}
|
|
75
|
-
getProofAssertions() {
|
|
76
|
-
const subproofOrProofAssertions = this.getSubproofOrProofAssertions(), proofAssertions = subproofOrProofAssertions.filter((subproofOrProofAssertion)=>{
|
|
77
|
-
const subproofOrProofAssertionproofAssertion = subproofOrProofAssertion.isProofAssertion();
|
|
78
|
-
if (subproofOrProofAssertionproofAssertion) {
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
return proofAssertions;
|
|
83
|
-
}
|
|
84
|
-
getLastStep() {
|
|
85
|
-
let lastStep = null;
|
|
86
|
-
const proofAssertions = this.getProofAssertions(), proofAssertionsLength = proofAssertions.length;
|
|
87
|
-
if (proofAssertionsLength > 0) {
|
|
88
|
-
const lastProofAssertion = last(proofAssertions);
|
|
89
|
-
lastStep = lastProofAssertion; ///
|
|
90
|
-
}
|
|
91
|
-
return lastStep;
|
|
92
|
-
}
|
|
93
|
-
isMetaLevel() {
|
|
94
|
-
let metaLevel = false;
|
|
95
|
-
if (this.metaLevelAssumptiona !== null) {
|
|
96
|
-
metaLevel = true;
|
|
97
|
-
} else {
|
|
98
|
-
const context = this.getContext();
|
|
99
|
-
metaLevel = context.isMetaLevel();
|
|
100
|
-
}
|
|
101
|
-
return metaLevel;
|
|
102
|
-
}
|
|
103
|
-
addEquality(equality) {
|
|
104
|
-
const context = this, equalityString = equality.getString();
|
|
105
|
-
context.trace(`Adding the '${equalityString}' equality to the proof context...`);
|
|
106
|
-
const equalityRelfexive = equality.isReflexive();
|
|
107
|
-
if (!equalityRelfexive) {
|
|
108
|
-
const equivalence = (0, _equivalences.equivalencesFromEquality)(equality, context);
|
|
109
|
-
this.equivalences = (0, _equivalences.mergeEquivalences)(this.equivalences, equivalence, context);
|
|
110
|
-
context.debug(`...added the '${equalityString}' equality to the proof context.`);
|
|
111
|
-
} else {
|
|
112
|
-
context.debug(`The reflexive '${equalityString}' equality has not been added to the proof context.`);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
addAssignment(assignment) {
|
|
116
|
-
this.assignments.push(assignment);
|
|
117
|
-
}
|
|
118
|
-
assignAssignments() {
|
|
119
|
-
const context = this; ///
|
|
120
|
-
this.assignments.forEach((assignment)=>{
|
|
121
|
-
assignment(context);
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
addDEclaredVariable(declaredVariable) {
|
|
125
|
-
const context = this, declaredVariableString = declaredVariable.getString();
|
|
126
|
-
context.trace(`Adding the '${declaredVariableString}' declared variable to the proof context...`);
|
|
127
|
-
this.declaredVariables.push(declaredVariable);
|
|
128
|
-
context.debug(`...added the '${declaredVariableString}' declared variable to the proof context.`);
|
|
129
|
-
}
|
|
130
|
-
addDeclaredJudgement(declaredJudgement) {
|
|
131
|
-
const context = this, declaredJudgementString = declaredJudgement.getString();
|
|
132
|
-
context.trace(`Adding the '${declaredJudgementString}' declared judgement to the proof context...`);
|
|
133
|
-
this.declaredJudgements.push(declaredJudgement);
|
|
134
|
-
context.debug(`...added the '${declaredJudgementString}' declared judgement to the proof context.`);
|
|
135
|
-
}
|
|
136
|
-
addMetaLevelAssumption(metaLevelAssumption) {
|
|
137
|
-
if (this.metaLevelAssumptions === null) {
|
|
138
|
-
super.addMetaLevelAssumption(metaLevelAssumption);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
const context = this, metaLevelAssumptionA = metaLevelAssumption, metaLevelAssumptionString = metaLevelAssumption.getString();
|
|
142
|
-
context.trace(`Adding the '${metaLevelAssumptionString}' meta-level assumption to the proof context...`);
|
|
143
|
-
const metaLevelAssumptionB = this.metaLevelAssumptions.find((metaLevelAssumption)=>{
|
|
144
|
-
const metaLevelAssumptionB = metaLevelAssumption, metaLevelAssumptionAEqualToAssumptionB = metaLevelAssumptionA.isEqualTo(metaLevelAssumptionB);
|
|
145
|
-
if (metaLevelAssumptionAEqualToAssumptionB) {
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
}) || null;
|
|
149
|
-
if (metaLevelAssumptionB !== null) {
|
|
150
|
-
context.debug(`The '${metaLevelAssumptionString}' metaLevelAssumption has already been added to the proof context.`);
|
|
151
|
-
} else {
|
|
152
|
-
this.metaLevelAssumptions.push(metaLevelAssumption);
|
|
153
|
-
}
|
|
154
|
-
context.debug(`...added the '${metaLevelAssumptionString}' meta-level assumption to the proof context.`);
|
|
155
|
-
}
|
|
156
|
-
addSubproofOrProofAssertion(subproofOrProofAssertion) {
|
|
157
|
-
const context = this, subproofOrProofAssertionString = subproofOrProofAssertion.getString();
|
|
158
|
-
context.trace(`Adding the '${subproofOrProofAssertionString}' subproof or proof assertion to the proof context...`);
|
|
159
|
-
this.subproofOrProofAssertions.push(subproofOrProofAssertion);
|
|
160
|
-
context.debug(`...added the '${subproofOrProofAssertionString}' subproof or proof assertion to the proof context.`);
|
|
161
|
-
}
|
|
162
|
-
compareTermAndPropertyRelation(term, propertyRelation) {
|
|
163
|
-
const context = this, proofAssertions = this.getProofAssertions(), comparesToTermAndPropertyRelation = proofAssertions.some((proofAssertion)=>{
|
|
164
|
-
const comparesToTermAndPropertyRelation = proofAssertion.compareTermAndPropertyRelation(term, propertyRelation, context);
|
|
165
|
-
if (comparesToTermAndPropertyRelation) {
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
return comparesToTermAndPropertyRelation;
|
|
170
|
-
}
|
|
171
|
-
findEquivalenceByTerm(term) {
|
|
172
|
-
return (0, _equivalences.findEquivalenceByTerm)(this.equivalences, term);
|
|
173
|
-
}
|
|
174
|
-
findJudgementByMetavariableName(metavariableName) {
|
|
175
|
-
const declaredJudgements = this.getJudgements(), judgement = declaredJudgements.find((judgement)=>{
|
|
176
|
-
const judgementMetavariableComparesToMetavariable = judgement.compareMetavariableName(metavariableName);
|
|
177
|
-
if (judgementMetavariableComparesToMetavariable) {
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
}) || null;
|
|
181
|
-
return judgement;
|
|
182
|
-
}
|
|
183
|
-
findDeclaredVariableByVariableIdentifier(variableIdentifier) {
|
|
184
|
-
const declaredVariables = this.getDeclaredVariables(), declaredVariable = declaredVariables.find((declaredVariable)=>{
|
|
185
|
-
const variableComparesToVariableIdentifier = declaredVariable.compareVariableIdentifier(variableIdentifier);
|
|
186
|
-
if (variableComparesToVariableIdentifier) {
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
}) || null;
|
|
190
|
-
return declaredVariable;
|
|
191
|
-
}
|
|
192
|
-
findJudgementsByMetavariableNode(metavariableNode) {
|
|
193
|
-
const declaredJudgements = this.getJudgements();
|
|
194
|
-
filter(declaredJudgements, (judgement)=>{
|
|
195
|
-
const metavariableNodeMatches = judgement.matchMetavariableNode(metavariableNode);
|
|
196
|
-
if (metavariableNodeMatches) {
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
return declaredJudgements;
|
|
201
|
-
}
|
|
202
|
-
findMetaLevelAssumptionByMetaLevelAssumptionNode(metaLevelAssumptionNode) {
|
|
203
|
-
let metaLevelAssumption;
|
|
204
|
-
if (this.metaLevelAssumptions === null) {
|
|
205
|
-
metaLevelAssumption = super.findMetaLevelAssumptionByMetaLevelAssumptionNode(metaLevelAssumptionNode);
|
|
206
|
-
} else {
|
|
207
|
-
metaLevelAssumption = this.metaLevelAssumptions.find((metaLevelAssumption)=>{
|
|
208
|
-
const metaLevelAssumptionNodeMatches = metaLevelAssumption.matchMetaLevelAssumptionNode(metaLevelAssumptionNode);
|
|
209
|
-
if (metaLevelAssumptionNodeMatches) {
|
|
210
|
-
return true;
|
|
211
|
-
}
|
|
212
|
-
}) || null;
|
|
213
|
-
}
|
|
214
|
-
return metaLevelAssumption;
|
|
215
|
-
}
|
|
216
|
-
isJudgementPresentByMetavariableName(metavariableName) {
|
|
217
|
-
const judgement = this.findJudgementByMetavariableName(metavariableName), judgementPresent = judgement !== null;
|
|
218
|
-
return judgementPresent;
|
|
219
|
-
}
|
|
220
|
-
isDeclaredVariablePresentByVariableIdentifier(variableIdentifier) {
|
|
221
|
-
const declaredVariable = this.findDeclaredVariableByVariableIdentifier(variableIdentifier), declaredVariablePresent = declaredVariable !== null;
|
|
222
|
-
return declaredVariablePresent;
|
|
223
|
-
}
|
|
224
|
-
isTermGrounded(term) {
|
|
225
|
-
const context = this, equivalences = this.getEquivalences(), groundedTerms = [], definedVariables = [];
|
|
226
|
-
(0, _equivalences.separateGroundedTermsAndDefinedVariables)(equivalences, groundedTerms, definedVariables, context);
|
|
227
|
-
const termMatchesGroundedTerm = groundedTerms.some((groundedTerm)=>{
|
|
228
|
-
const groundedTermNode = groundedTerm.getNode(), groundedTermNodeMatches = term.matchTermNode(groundedTermNode);
|
|
229
|
-
if (groundedTermNodeMatches) {
|
|
230
|
-
return true;
|
|
231
|
-
}
|
|
232
|
-
}), termGrounded = termMatchesGroundedTerm; ///
|
|
233
|
-
return termGrounded;
|
|
234
|
-
}
|
|
235
|
-
static fromMetaLevelAssumptions(metaLevelAssumptions, context) {
|
|
236
|
-
const assignments = [], equivalences = [], declaredVariables = [], declaredJudgements = [], subproofOrProofAssertions = [], proofContext = new ProofContext(context, assignments, equivalences, declaredVariables, declaredJudgements, metaLevelAssumptions, subproofOrProofAssertions);
|
|
237
|
-
return proofContext;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
const _default = ProofContext;
|
|
241
|
-
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L3Byb29mLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IENvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcblxuaW1wb3J0IHsgbWVyZ2VFcXVpdmFsZW5jZXMsIGZpbmRFcXVpdmFsZW5jZUJ5VGVybSwgZXF1aXZhbGVuY2VzRnJvbUVxdWFsaXR5LCBzZXBhcmF0ZUdyb3VuZGVkVGVybXNBbmREZWZpbmVkVmFyaWFibGVzIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9lcXVpdmFsZW5jZXNcIjtcblxuY29uc3QgeyBsYXN0LCBmaWx0ZXIgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5jbGFzcyBQcm9vZkNvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgYXNzaWdubWVudHMsIGVxdWl2YWxlbmNlcywgZGVjbGFyZWRWYXJpYWJsZXMsIGRlY2xhcmVkSnVkZ2VtZW50cywgbWV0YUxldmVsQXNzdW1wdGlvbnMsIHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMpIHtcbiAgICBzdXBlcihjb250ZXh0KTtcblxuICAgIHRoaXMuYXNzaWdubWVudHMgPSBhc3NpZ25tZW50cztcbiAgICB0aGlzLmVxdWl2YWxlbmNlcyA9IGVxdWl2YWxlbmNlcztcbiAgICB0aGlzLmRlY2xhcmVkVmFyaWFibGVzID0gZGVjbGFyZWRWYXJpYWJsZXM7XG4gICAgdGhpcy5kZWNsYXJlZEp1ZGdlbWVudHMgPSBkZWNsYXJlZEp1ZGdlbWVudHM7XG4gICAgdGhpcy5tZXRhTGV2ZWxBc3N1bXB0aW9ucyA9IG1ldGFMZXZlbEFzc3VtcHRpb25zO1xuICAgIHRoaXMuc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyA9IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnM7XG4gIH1cblxuICBnZXRBc3NpZ25tZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25tZW50cztcbiAgfVxuXG4gIGdldEVxdWl2YWxlbmNlcygpIHtcbiAgICBsZXQgZXF1aXZhbGVuY2VzO1xuXG4gICAgbGV0IGNvbnRleHQ7XG5cbiAgICBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBlcXVpdmFsZW5jZXMgPSBjb250ZXh0LmdldEVxdWl2YWxlbmNlcygpO1xuXG4gICAgY29udGV4dCA9IHRoaXM7IC8vL1xuXG4gICAgZXF1aXZhbGVuY2VzID0gbWVyZ2VFcXVpdmFsZW5jZXModGhpcy5lcXVpdmFsZW5jZXMsIGVxdWl2YWxlbmNlcywgY29udGV4dCk7ICAvLy9cblxuICAgIHJldHVybiBlcXVpdmFsZW5jZXM7XG4gIH1cblxuICBnZXREZWNsYXJlZFZhcmlhYmxlcygpIHtcbiAgICBsZXQgZGVjbGFyZWRWYXJpYWJsZXM7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBkZWNsYXJlZFZhcmlhYmxlcyA9IGNvbnRleHQuZ2V0RGVjbGFyZWRWYXJpYWJsZXMoKTtcblxuICAgIGRlY2xhcmVkVmFyaWFibGVzID0gW1xuICAgICAgLi4udGhpcy5kZWNsYXJlZFZhcmlhYmxlcyxcbiAgICAgIC4uLmRlY2xhcmVkVmFyaWFibGVzXG4gICAgXTtcblxuICAgIHJldHVybiBkZWNsYXJlZFZhcmlhYmxlcztcbiAgfVxuXG4gIGdldERlY2xhcmVkSnVkZ2VtZW50cygpIHtcbiAgICBsZXQgZGVjbGFyZWRKdWRnZW1lbnRzO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgZGVjbGFyZWRKdWRnZW1lbnRzID0gY29udGV4dC5nZXREZWNsYXJlZEp1ZGdlbWVudHMoKTtcblxuICAgIGRlY2xhcmVkSnVkZ2VtZW50cyA9IFsgLy8vXG4gICAgICAuLi50aGlzLmRlY2xhcmVkSnVkZ2VtZW50cyxcbiAgICAgIC4uLmRlY2xhcmVkSnVkZ2VtZW50c1xuICAgIF1cblxuICAgIHJldHVybiBkZWNsYXJlZEp1ZGdlbWVudHM7XG4gIH1cblxuICBnZXRNZXRhTGV2ZWxBc3N1bXB0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhTGV2ZWxBc3N1bXB0aW9ucztcbiAgfVxuXG4gIGdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSB7XG4gICAgbGV0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnM7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gY29udGV4dC5nZXRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zKCk7XG5cbiAgICBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gWyAgLy8vXG4gICAgICAuLi5zdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLFxuICAgICAgLi4udGhpcy5zdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zXG4gICAgXTtcblxuICAgIHJldHVybiBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zO1xuICB9XG5cbiAgZ2V0UHJvb2ZBc3NlcnRpb25zKCkge1xuICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSB0aGlzLmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBwcm9vZkFzc2VydGlvbnMgPSBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLmZpbHRlcigoc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25wcm9vZkFzc2VydGlvbiA9IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbi5pc1Byb29mQXNzZXJ0aW9uKCk7XG5cbiAgICAgICAgICAgIGlmIChzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25wcm9vZkFzc2VydGlvbikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBwcm9vZkFzc2VydGlvbnM7XG4gIH1cblxuICBnZXRMYXN0U3RlcCgpIHtcbiAgICBsZXQgbGFzdFN0ZXAgPSBudWxsO1xuXG4gICAgY29uc3QgcHJvb2ZBc3NlcnRpb25zID0gdGhpcy5nZXRQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBwcm9vZkFzc2VydGlvbnNMZW5ndGggPSBwcm9vZkFzc2VydGlvbnMubGVuZ3RoO1xuXG4gICAgaWYgKHByb29mQXNzZXJ0aW9uc0xlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxhc3RQcm9vZkFzc2VydGlvbiA9IGxhc3QocHJvb2ZBc3NlcnRpb25zKTtcblxuICAgICAgbGFzdFN0ZXAgPSBsYXN0UHJvb2ZBc3NlcnRpb247ICAvLy9cbiAgICB9XG5cbiAgICByZXR1cm4gbGFzdFN0ZXA7XG4gIH1cblxuICBpc01ldGFMZXZlbCgpIHtcbiAgICBsZXQgbWV0YUxldmVsID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5tZXRhTGV2ZWxBc3N1bXB0aW9uYSAhPT0gbnVsbCkge1xuICAgICAgbWV0YUxldmVsID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgICBtZXRhTGV2ZWwgPSBjb250ZXh0LmlzTWV0YUxldmVsKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFMZXZlbDtcbiAgfVxuXG4gIGFkZEVxdWFsaXR5KGVxdWFsaXR5KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGVxdWFsaXR5U3RyaW5nID0gZXF1YWxpdHkuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2VxdWFsaXR5U3RyaW5nfScgZXF1YWxpdHkgdG8gdGhlIHByb29mIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGVxdWFsaXR5UmVsZmV4aXZlID0gZXF1YWxpdHkuaXNSZWZsZXhpdmUoKTtcblxuICAgIGlmICghZXF1YWxpdHlSZWxmZXhpdmUpIHtcbiAgICAgIGNvbnN0IGVxdWl2YWxlbmNlID0gZXF1aXZhbGVuY2VzRnJvbUVxdWFsaXR5KGVxdWFsaXR5LCBjb250ZXh0KTtcblxuICAgICAgdGhpcy5lcXVpdmFsZW5jZXMgPSBtZXJnZUVxdWl2YWxlbmNlcyh0aGlzLmVxdWl2YWxlbmNlcywgZXF1aXZhbGVuY2UsIGNvbnRleHQpO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSB0byB0aGUgcHJvb2YgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgVGhlIHJlZmxleGl2ZSAnJHtlcXVhbGl0eVN0cmluZ30nIGVxdWFsaXR5IGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgcHJvb2YgY29udGV4dC5gKTtcbiAgICB9XG4gIH1cblxuICBhZGRBc3NpZ25tZW50KGFzc2lnbm1lbnQpIHtcbiAgICB0aGlzLmFzc2lnbm1lbnRzLnB1c2goYXNzaWdubWVudCk7XG4gIH1cblxuICBhc3NpZ25Bc3NpZ25tZW50cygpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpczsgLy8vXG5cbiAgICB0aGlzLmFzc2lnbm1lbnRzLmZvckVhY2goKGFzc2lnbm1lbnQpID0+IHtcbiAgICAgIGFzc2lnbm1lbnQoY29udGV4dCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRERWNsYXJlZFZhcmlhYmxlKGRlY2xhcmVkVmFyaWFibGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgZGVjbGFyZWRWYXJpYWJsZVN0cmluZyA9IGRlY2xhcmVkVmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2RlY2xhcmVkVmFyaWFibGVTdHJpbmd9JyBkZWNsYXJlZCB2YXJpYWJsZSB0byB0aGUgcHJvb2YgY29udGV4dC4uLmApO1xuXG4gICAgdGhpcy5kZWNsYXJlZFZhcmlhYmxlcy5wdXNoKGRlY2xhcmVkVmFyaWFibGUpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2RlY2xhcmVkVmFyaWFibGVTdHJpbmd9JyBkZWNsYXJlZCB2YXJpYWJsZSB0byB0aGUgcHJvb2YgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZERlY2xhcmVkSnVkZ2VtZW50KGRlY2xhcmVkSnVkZ2VtZW50KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGRlY2xhcmVkSnVkZ2VtZW50U3RyaW5nID0gZGVjbGFyZWRKdWRnZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2RlY2xhcmVkSnVkZ2VtZW50U3RyaW5nfScgZGVjbGFyZWQganVkZ2VtZW50IHRvIHRoZSBwcm9vZiBjb250ZXh0Li4uYCk7XG5cbiAgICB0aGlzLmRlY2xhcmVkSnVkZ2VtZW50cy5wdXNoKGRlY2xhcmVkSnVkZ2VtZW50KTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtkZWNsYXJlZEp1ZGdlbWVudFN0cmluZ30nIGRlY2xhcmVkIGp1ZGdlbWVudCB0byB0aGUgcHJvb2YgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZE1ldGFMZXZlbEFzc3VtcHRpb24obWV0YUxldmVsQXNzdW1wdGlvbikge1xuICAgIGlmICh0aGlzLm1ldGFMZXZlbEFzc3VtcHRpb25zID09PSBudWxsKSB7XG4gICAgICBzdXBlci5hZGRNZXRhTGV2ZWxBc3N1bXB0aW9uKG1ldGFMZXZlbEFzc3VtcHRpb24pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIG1ldGFMZXZlbEFzc3VtcHRpb25BID0gbWV0YUxldmVsQXNzdW1wdGlvbiwgLy8vXG4gICAgICAgICAgbWV0YUxldmVsQXNzdW1wdGlvblN0cmluZyA9IG1ldGFMZXZlbEFzc3VtcHRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke21ldGFMZXZlbEFzc3VtcHRpb25TdHJpbmd9JyBtZXRhLWxldmVsIGFzc3VtcHRpb24gdG8gdGhlIHByb29mIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IG1ldGFMZXZlbEFzc3VtcHRpb25CID0gdGhpcy5tZXRhTGV2ZWxBc3N1bXB0aW9ucy5maW5kKChtZXRhTGV2ZWxBc3N1bXB0aW9uKSA9PiB7XG4gICAgICBjb25zdCBtZXRhTGV2ZWxBc3N1bXB0aW9uQiA9IG1ldGFMZXZlbEFzc3VtcHRpb24sIC8vL1xuICAgICAgICAgICAgbWV0YUxldmVsQXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIgPSBtZXRhTGV2ZWxBc3N1bXB0aW9uQS5pc0VxdWFsVG8obWV0YUxldmVsQXNzdW1wdGlvbkIpO1xuXG4gICAgICBpZiAobWV0YUxldmVsQXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIGlmIChtZXRhTGV2ZWxBc3N1bXB0aW9uQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgVGhlICcke21ldGFMZXZlbEFzc3VtcHRpb25TdHJpbmd9JyBtZXRhTGV2ZWxBc3N1bXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHByb29mIGNvbnRleHQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWV0YUxldmVsQXNzdW1wdGlvbnMucHVzaChtZXRhTGV2ZWxBc3N1bXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7bWV0YUxldmVsQXNzdW1wdGlvblN0cmluZ30nIG1ldGEtbGV2ZWwgYXNzdW1wdGlvbiB0byB0aGUgcHJvb2YgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbihzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uU3RyaW5nID0gc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25TdHJpbmd9JyBzdWJwcm9vZiBvciBwcm9vZiBhc3NlcnRpb24gdG8gdGhlIHByb29mIGNvbnRleHQuLi5gKTtcblxuICAgIHRoaXMuc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucy5wdXNoKHN1YnByb29mT3JQcm9vZkFzc2VydGlvbik7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7c3VicHJvb2ZPclByb29mQXNzZXJ0aW9uU3RyaW5nfScgc3VicHJvb2Ygb3IgcHJvb2YgYXNzZXJ0aW9uIHRvIHRoZSBwcm9vZiBjb250ZXh0LmApO1xuICB9XG5cbiAgY29tcGFyZVRlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uKHRlcm0sIHByb3BlcnR5UmVsYXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgcHJvb2ZBc3NlcnRpb25zID0gdGhpcy5nZXRQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb24gPSBwcm9vZkFzc2VydGlvbnMuc29tZSgocHJvb2ZBc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiA9IHByb29mQXNzZXJ0aW9uLmNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbih0ZXJtLCBwcm9wZXJ0eVJlbGF0aW9uLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb247XG4gIH1cblxuICBmaW5kRXF1aXZhbGVuY2VCeVRlcm0odGVybSkgeyByZXR1cm4gZmluZEVxdWl2YWxlbmNlQnlUZXJtKHRoaXMuZXF1aXZhbGVuY2VzLCB0ZXJtKTsgfVxuXG4gIGZpbmRKdWRnZW1lbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSkge1xuICAgIGNvbnN0IGRlY2xhcmVkSnVkZ2VtZW50cyA9IHRoaXMuZ2V0SnVkZ2VtZW50cygpLFxuICAgICAgICAgIGp1ZGdlbWVudCA9IGRlY2xhcmVkSnVkZ2VtZW50cy5maW5kKChqdWRnZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGUgPSBqdWRnZW1lbnQuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChqdWRnZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZERlY2xhcmVkVmFyaWFibGVCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBkZWNsYXJlZFZhcmlhYmxlcyA9IHRoaXMuZ2V0RGVjbGFyZWRWYXJpYWJsZXMoKSxcbiAgICAgICAgICBkZWNsYXJlZFZhcmlhYmxlID0gZGVjbGFyZWRWYXJpYWJsZXMuZmluZCgoZGVjbGFyZWRWYXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyID0gZGVjbGFyZWRWYXJpYWJsZS5jb21wYXJlVmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllcik7XG5cbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUNvbXBhcmVzVG9WYXJpYWJsZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBkZWNsYXJlZFZhcmlhYmxlO1xuICB9XG5cbiAgZmluZEp1ZGdlbWVudHNCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IGRlY2xhcmVkSnVkZ2VtZW50cyA9IHRoaXMuZ2V0SnVkZ2VtZW50cygpO1xuXG4gICAgZmlsdGVyKGRlY2xhcmVkSnVkZ2VtZW50cywgKGp1ZGdlbWVudCkgPT4ge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBqdWRnZW1lbnQubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVjbGFyZWRKdWRnZW1lbnRzO1xuICB9XG5cbiAgZmluZE1ldGFMZXZlbEFzc3VtcHRpb25CeU1ldGFMZXZlbEFzc3VtcHRpb25Ob2RlKG1ldGFMZXZlbEFzc3VtcHRpb25Ob2RlKSB7XG4gICAgbGV0IG1ldGFMZXZlbEFzc3VtcHRpb247XG5cbiAgICBpZiAodGhpcy5tZXRhTGV2ZWxBc3N1bXB0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgbWV0YUxldmVsQXNzdW1wdGlvbiA9IHN1cGVyLmZpbmRNZXRhTGV2ZWxBc3N1bXB0aW9uQnlNZXRhTGV2ZWxBc3N1bXB0aW9uTm9kZShtZXRhTGV2ZWxBc3N1bXB0aW9uTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGFMZXZlbEFzc3VtcHRpb24gPSB0aGlzLm1ldGFMZXZlbEFzc3VtcHRpb25zLmZpbmQoKG1ldGFMZXZlbEFzc3VtcHRpb24pID0+IHtcbiAgICAgICAgY29uc3QgbWV0YUxldmVsQXNzdW1wdGlvbk5vZGVNYXRjaGVzID0gbWV0YUxldmVsQXNzdW1wdGlvbi5tYXRjaE1ldGFMZXZlbEFzc3VtcHRpb25Ob2RlKG1ldGFMZXZlbEFzc3VtcHRpb25Ob2RlKTtcblxuICAgICAgICBpZiAobWV0YUxldmVsQXNzdW1wdGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFMZXZlbEFzc3VtcHRpb247XG4gIH1cblxuICBpc0p1ZGdlbWVudFByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSkge1xuICAgIGNvbnN0IGp1ZGdlbWVudCA9IHRoaXMuZmluZEp1ZGdlbWVudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICBqdWRnZW1lbnRQcmVzZW50ID0gKGp1ZGdlbWVudCAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50UHJlc2VudDtcbiAgfVxuXG4gIGlzRGVjbGFyZWRWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBkZWNsYXJlZFZhcmlhYmxlID0gdGhpcy5maW5kRGVjbGFyZWRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllciksXG4gICAgICAgICAgZGVjbGFyZWRWYXJpYWJsZVByZXNlbnQgPSAoZGVjbGFyZWRWYXJpYWJsZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZGVjbGFyZWRWYXJpYWJsZVByZXNlbnQ7XG4gIH1cblxuICBpc1Rlcm1Hcm91bmRlZCh0ZXJtKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGVxdWl2YWxlbmNlcyA9IHRoaXMuZ2V0RXF1aXZhbGVuY2VzKCksXG4gICAgICAgICAgZ3JvdW5kZWRUZXJtcyA9IFtdLFxuICAgICAgICAgIGRlZmluZWRWYXJpYWJsZXMgPSBbXTtcblxuICAgIHNlcGFyYXRlR3JvdW5kZWRUZXJtc0FuZERlZmluZWRWYXJpYWJsZXMoZXF1aXZhbGVuY2VzLCBncm91bmRlZFRlcm1zLCBkZWZpbmVkVmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgIGNvbnN0IHRlcm1NYXRjaGVzR3JvdW5kZWRUZXJtID0gZ3JvdW5kZWRUZXJtcy5zb21lKChncm91bmRlZFRlcm0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VuZGVkVGVybU5vZGUgPSBncm91bmRlZFRlcm0uZ2V0Tm9kZSgpLFxuICAgICAgICAgICAgICAgICAgZ3JvdW5kZWRUZXJtTm9kZU1hdGNoZXMgPSB0ZXJtLm1hdGNoVGVybU5vZGUoZ3JvdW5kZWRUZXJtTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChncm91bmRlZFRlcm1Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0ZXJtR3JvdW5kZWQgPSB0ZXJtTWF0Y2hlc0dyb3VuZGVkVGVybTsgLy8vXG5cbiAgICByZXR1cm4gdGVybUdyb3VuZGVkO1xuICB9XG5cbiAgc3RhdGljIGZyb21NZXRhTGV2ZWxBc3N1bXB0aW9ucyhtZXRhTGV2ZWxBc3N1bXB0aW9ucywgY29udGV4dCkge1xuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gW10sXG4gICAgICAgICAgZXF1aXZhbGVuY2VzID0gW10sXG4gICAgICAgICAgZGVjbGFyZWRWYXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBkZWNsYXJlZEp1ZGdlbWVudHMgPSBbXSxcbiAgICAgICAgICBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gW10sXG4gICAgICAgICAgcHJvb2ZDb250ZXh0ID0gbmV3IFByb29mQ29udGV4dChjb250ZXh0LCBhc3NpZ25tZW50cywgZXF1aXZhbGVuY2VzLCBkZWNsYXJlZFZhcmlhYmxlcywgZGVjbGFyZWRKdWRnZW1lbnRzLCBtZXRhTGV2ZWxBc3N1bXB0aW9ucywgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyk7XG5cbiAgICByZXR1cm4gcHJvb2ZDb250ZXh0O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb29mQ29udGV4dDsiXSwibmFtZXMiOlsibGFzdCIsImZpbHRlciIsImFycmF5VXRpbGl0aWVzIiwiUHJvb2ZDb250ZXh0IiwiQ29udGV4dCIsImNvbnRleHQiLCJhc3NpZ25tZW50cyIsImVxdWl2YWxlbmNlcyIsImRlY2xhcmVkVmFyaWFibGVzIiwiZGVjbGFyZWRKdWRnZW1lbnRzIiwibWV0YUxldmVsQXNzdW1wdGlvbnMiLCJzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zIiwiZ2V0QXNzaWdubWVudHMiLCJnZXRFcXVpdmFsZW5jZXMiLCJnZXRDb250ZXh0IiwibWVyZ2VFcXVpdmFsZW5jZXMiLCJnZXREZWNsYXJlZFZhcmlhYmxlcyIsImdldERlY2xhcmVkSnVkZ2VtZW50cyIsImdldE1ldGFMZXZlbEFzc3VtcHRpb25zIiwiZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsImdldFByb29mQXNzZXJ0aW9ucyIsInByb29mQXNzZXJ0aW9ucyIsInN1YnByb29mT3JQcm9vZkFzc2VydGlvbiIsInN1YnByb29mT3JQcm9vZkFzc2VydGlvbnByb29mQXNzZXJ0aW9uIiwiaXNQcm9vZkFzc2VydGlvbiIsImdldExhc3RTdGVwIiwibGFzdFN0ZXAiLCJwcm9vZkFzc2VydGlvbnNMZW5ndGgiLCJsZW5ndGgiLCJsYXN0UHJvb2ZBc3NlcnRpb24iLCJpc01ldGFMZXZlbCIsIm1ldGFMZXZlbCIsIm1ldGFMZXZlbEFzc3VtcHRpb25hIiwiYWRkRXF1YWxpdHkiLCJlcXVhbGl0eSIsImVxdWFsaXR5U3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJlcXVhbGl0eVJlbGZleGl2ZSIsImlzUmVmbGV4aXZlIiwiZXF1aXZhbGVuY2UiLCJlcXVpdmFsZW5jZXNGcm9tRXF1YWxpdHkiLCJkZWJ1ZyIsImFkZEFzc2lnbm1lbnQiLCJhc3NpZ25tZW50IiwicHVzaCIsImFzc2lnbkFzc2lnbm1lbnRzIiwiZm9yRWFjaCIsImFkZERFY2xhcmVkVmFyaWFibGUiLCJkZWNsYXJlZFZhcmlhYmxlIiwiZGVjbGFyZWRWYXJpYWJsZVN0cmluZyIsImFkZERlY2xhcmVkSnVkZ2VtZW50IiwiZGVjbGFyZWRKdWRnZW1lbnQiLCJkZWNsYXJlZEp1ZGdlbWVudFN0cmluZyIsImFkZE1ldGFMZXZlbEFzc3VtcHRpb24iLCJtZXRhTGV2ZWxBc3N1bXB0aW9uIiwibWV0YUxldmVsQXNzdW1wdGlvbkEiLCJtZXRhTGV2ZWxBc3N1bXB0aW9uU3RyaW5nIiwibWV0YUxldmVsQXNzdW1wdGlvbkIiLCJmaW5kIiwibWV0YUxldmVsQXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIiLCJpc0VxdWFsVG8iLCJhZGRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24iLCJzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25TdHJpbmciLCJjb21wYXJlVGVybUFuZFByb3BlcnR5UmVsYXRpb24iLCJ0ZXJtIiwicHJvcGVydHlSZWxhdGlvbiIsImNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiIsInNvbWUiLCJwcm9vZkFzc2VydGlvbiIsImZpbmRFcXVpdmFsZW5jZUJ5VGVybSIsImZpbmRKdWRnZW1lbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVOYW1lIiwiZ2V0SnVkZ2VtZW50cyIsImp1ZGdlbWVudCIsImp1ZGdlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGUiLCJjb21wYXJlTWV0YXZhcmlhYmxlTmFtZSIsImZpbmREZWNsYXJlZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUNvbXBhcmVzVG9WYXJpYWJsZUlkZW50aWZpZXIiLCJjb21wYXJlVmFyaWFibGVJZGVudGlmaWVyIiwiZmluZEp1ZGdlbWVudHNCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMiLCJtYXRjaE1ldGF2YXJpYWJsZU5vZGUiLCJmaW5kTWV0YUxldmVsQXNzdW1wdGlvbkJ5TWV0YUxldmVsQXNzdW1wdGlvbk5vZGUiLCJtZXRhTGV2ZWxBc3N1bXB0aW9uTm9kZSIsIm1ldGFMZXZlbEFzc3VtcHRpb25Ob2RlTWF0Y2hlcyIsIm1hdGNoTWV0YUxldmVsQXNzdW1wdGlvbk5vZGUiLCJpc0p1ZGdlbWVudFByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJqdWRnZW1lbnRQcmVzZW50IiwiaXNEZWNsYXJlZFZhcmlhYmxlUHJlc2VudEJ5VmFyaWFibGVJZGVudGlmaWVyIiwiZGVjbGFyZWRWYXJpYWJsZVByZXNlbnQiLCJpc1Rlcm1Hcm91bmRlZCIsImdyb3VuZGVkVGVybXMiLCJkZWZpbmVkVmFyaWFibGVzIiwic2VwYXJhdGVHcm91bmRlZFRlcm1zQW5kRGVmaW5lZFZhcmlhYmxlcyIsInRlcm1NYXRjaGVzR3JvdW5kZWRUZXJtIiwiZ3JvdW5kZWRUZXJtIiwiZ3JvdW5kZWRUZXJtTm9kZSIsImdldE5vZGUiLCJncm91bmRlZFRlcm1Ob2RlTWF0Y2hlcyIsIm1hdGNoVGVybU5vZGUiLCJ0ZXJtR3JvdW5kZWQiLCJmcm9tTWV0YUxldmVsQXNzdW1wdGlvbnMiLCJwcm9vZkNvbnRleHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQTZWQTs7O2VBQUE7OzsyQkEzVitCO2dFQUVYOzhCQUV5Rzs7Ozs7O0FBRTdILE1BQU0sRUFBRUEsSUFBSSxFQUFFQyxNQUFNLEVBQUUsR0FBR0MseUJBQWM7QUFFdkMsTUFBTUMscUJBQXFCQyxnQkFBTztJQUNoQyxZQUFZQyxPQUFPLEVBQUVD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
|
package/lib/context/synthetic.js
DELETED
|
@@ -1,212 +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 SyntheticContext;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _necessary = require("necessary");
|
|
12
|
-
const _context = /*#__PURE__*/ _interop_require_default(require("../context"));
|
|
13
|
-
function _interop_require_default(obj) {
|
|
14
|
-
return obj && obj.__esModule ? obj : {
|
|
15
|
-
default: obj
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
const { push, last } = _necessary.arrayUtilities;
|
|
19
|
-
class SyntheticContext extends _context.default {
|
|
20
|
-
constructor(context, contexts){
|
|
21
|
-
super(context);
|
|
22
|
-
this.contexts = contexts;
|
|
23
|
-
}
|
|
24
|
-
getContexts() {
|
|
25
|
-
return this.contexts;
|
|
26
|
-
}
|
|
27
|
-
getTerms() {
|
|
28
|
-
const terms = [];
|
|
29
|
-
this.contexts.forEach((context)=>{
|
|
30
|
-
const contextTerms = context.getTerms();
|
|
31
|
-
push(terms, contextTerms);
|
|
32
|
-
});
|
|
33
|
-
return terms;
|
|
34
|
-
}
|
|
35
|
-
getFrames() {
|
|
36
|
-
const frames = [];
|
|
37
|
-
this.contexts.forEach((context)=>{
|
|
38
|
-
const contextFrames = context.getFrames();
|
|
39
|
-
push(frames, contextFrames);
|
|
40
|
-
});
|
|
41
|
-
return frames;
|
|
42
|
-
}
|
|
43
|
-
getEqualities() {
|
|
44
|
-
const equalities = [];
|
|
45
|
-
this.contexts.forEach((context)=>{
|
|
46
|
-
const contextEqualities = context.getEqualities();
|
|
47
|
-
push(equalities, contextEqualities);
|
|
48
|
-
});
|
|
49
|
-
return equalities;
|
|
50
|
-
}
|
|
51
|
-
getJudgements() {
|
|
52
|
-
const judgements = [];
|
|
53
|
-
this.contexts.forEach((context)=>{
|
|
54
|
-
const contextJudgements = context.getJudgements();
|
|
55
|
-
push(judgements, contextJudgements);
|
|
56
|
-
});
|
|
57
|
-
return judgements;
|
|
58
|
-
}
|
|
59
|
-
getStatements() {
|
|
60
|
-
const statements = [];
|
|
61
|
-
this.contexts.forEach((context)=>{
|
|
62
|
-
const contextStatements = context.getStatements();
|
|
63
|
-
push(statements, contextStatements);
|
|
64
|
-
});
|
|
65
|
-
return statements;
|
|
66
|
-
}
|
|
67
|
-
getAssertions() {
|
|
68
|
-
const assertions = [];
|
|
69
|
-
this.contexts.forEach((context)=>{
|
|
70
|
-
const contextAssertions = context.getAssertions();
|
|
71
|
-
push(assertions, contextAssertions);
|
|
72
|
-
});
|
|
73
|
-
return assertions;
|
|
74
|
-
}
|
|
75
|
-
getReferences() {
|
|
76
|
-
const references = [];
|
|
77
|
-
this.contexts.forEach((context)=>{
|
|
78
|
-
const contextReferences = context.getReferences();
|
|
79
|
-
push(references, contextReferences);
|
|
80
|
-
});
|
|
81
|
-
return references;
|
|
82
|
-
}
|
|
83
|
-
getAssumptions() {
|
|
84
|
-
const assumptions = [];
|
|
85
|
-
this.contexts.forEach((context)=>{
|
|
86
|
-
const contextAssumptions = context.getAssumptions();
|
|
87
|
-
push(assumptions, contextAssumptions);
|
|
88
|
-
});
|
|
89
|
-
return assumptions;
|
|
90
|
-
}
|
|
91
|
-
getMetavariables() {
|
|
92
|
-
const metavariables = [];
|
|
93
|
-
this.contexts.forEach((context)=>{
|
|
94
|
-
const contextMetavariables = context.getMetavariables();
|
|
95
|
-
push(metavariables, contextMetavariables);
|
|
96
|
-
});
|
|
97
|
-
return metavariables;
|
|
98
|
-
}
|
|
99
|
-
getSubstitutions() {
|
|
100
|
-
const substitutions = [];
|
|
101
|
-
this.contexts.forEach((context)=>{
|
|
102
|
-
const contextSubstitutions = context.getSubstitutions();
|
|
103
|
-
push(substitutions, contextSubstitutions);
|
|
104
|
-
});
|
|
105
|
-
return substitutions;
|
|
106
|
-
}
|
|
107
|
-
findTermByTermNode(termNode) {
|
|
108
|
-
const terms = this.getTerms(), term = terms.find((term)=>{
|
|
109
|
-
const termNodeMatches = term.matchTermNode(termNode);
|
|
110
|
-
if (termNodeMatches) {
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
}) || null;
|
|
114
|
-
return term;
|
|
115
|
-
}
|
|
116
|
-
findFrameByFrameNode(frameNode) {
|
|
117
|
-
const frames = this.getFrames(), frame = frames.find((frame)=>{
|
|
118
|
-
const frameNodeMatches = frame.matchFrameNode(frameNode);
|
|
119
|
-
if (frameNodeMatches) {
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
}) || null;
|
|
123
|
-
return frame;
|
|
124
|
-
}
|
|
125
|
-
findEqualityByEqualityNode(equalityNode) {
|
|
126
|
-
const equalities = this.getEqualities(), equality = equalities.find((equality)=>{
|
|
127
|
-
const equalityNodeMatches = equality.matchEqualityNode(equalityNode);
|
|
128
|
-
if (equalityNodeMatches) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
}) || null;
|
|
132
|
-
return equality;
|
|
133
|
-
}
|
|
134
|
-
findJudgementByJudgementNode(judgementNode) {
|
|
135
|
-
const judgements = this.getJudgements(), judgement = judgements.find((judgement)=>{
|
|
136
|
-
const judgementNodeMatches = judgement.matchJudgementNode(judgementNode);
|
|
137
|
-
if (judgementNodeMatches) {
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
}) || null;
|
|
141
|
-
return judgement;
|
|
142
|
-
}
|
|
143
|
-
findStatementByStatementNode(statementNode) {
|
|
144
|
-
const statements = this.getStatements(), statement = statements.find((statement)=>{
|
|
145
|
-
const statementNodeMatches = statement.matchStatementNode(statementNode);
|
|
146
|
-
if (statementNodeMatches) {
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
}) || null;
|
|
150
|
-
return statement;
|
|
151
|
-
}
|
|
152
|
-
findReferenceByReferenceNode(referenceNode) {
|
|
153
|
-
const references = this.getReferences(), reference = references.find((reference)=>{
|
|
154
|
-
const referenceMatcheReferenceNode = reference.matchReferenceNode(referenceNode);
|
|
155
|
-
if (referenceMatcheReferenceNode) {
|
|
156
|
-
return true;
|
|
157
|
-
}
|
|
158
|
-
}) || null;
|
|
159
|
-
return reference;
|
|
160
|
-
}
|
|
161
|
-
findAssertionByAssertionNode(assertionNode) {
|
|
162
|
-
const assertions = this.getAssertions(), assertion = assertions.find((assertion)=>{
|
|
163
|
-
const assertionNodeMatches = assertion.matchAssertionNode(assertionNode);
|
|
164
|
-
if (assertionNodeMatches) {
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
}) || null;
|
|
168
|
-
return assertion;
|
|
169
|
-
}
|
|
170
|
-
findAssumptionByAssumptionNode(assumptionNode) {
|
|
171
|
-
const assumptions = this.getAssumptions(), assumption = assumptions.find((assumption)=>{
|
|
172
|
-
const assumptionNodeMatches = assumption.matchAssumptionNode(assumptionNode);
|
|
173
|
-
if (assumptionNodeMatches) {
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
}) || null;
|
|
177
|
-
return assumption;
|
|
178
|
-
}
|
|
179
|
-
findReferenceByMetavariableNode(metavariableNode) {
|
|
180
|
-
const references = this.getReferences(), reference = references.find((reference)=>{
|
|
181
|
-
const referenceMatcheMetavariableNode = reference.matchMetavariableNode(metavariableNode);
|
|
182
|
-
if (referenceMatcheMetavariableNode) {
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
}) || null;
|
|
186
|
-
return reference;
|
|
187
|
-
}
|
|
188
|
-
findMetavariableByMetavariableNode(metavariableNode) {
|
|
189
|
-
const metavariables = this.getMetavariables(), metavariable = metavariables.find((metavariable)=>{
|
|
190
|
-
const metavariableNodeMatches = metavariable.matchMetavariableNode(metavariableNode);
|
|
191
|
-
if (metavariableNodeMatches) {
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
}) || null;
|
|
195
|
-
return metavariable;
|
|
196
|
-
}
|
|
197
|
-
findSubstitutionBySubstitutionNode(substitutionNode) {
|
|
198
|
-
const substitutions = this.getSubstitutions(), substitution = substitutions.find((substitution)=>{
|
|
199
|
-
const substitutionNodeMatches = substitution.matchSubstitutionNode(substitutionNode);
|
|
200
|
-
if (substitutionNodeMatches) {
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
}) || null;
|
|
204
|
-
return substitution;
|
|
205
|
-
}
|
|
206
|
-
static fromContexts(...contexts) {
|
|
207
|
-
const lastContext = last(contexts), context = lastContext, syntheticContext = new SyntheticContext(context, contexts);
|
|
208
|
-
return syntheticContext;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L3N5bnRoZXRpYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmNvbnN0IHsgcHVzaCwgbGFzdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bnRoZXRpY0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgY29udGV4dHMpIHtcbiAgICBzdXBlcihjb250ZXh0KTtcblxuICAgIHRoaXMuY29udGV4dHMgPSBjb250ZXh0cztcbiAgfVxuXG4gIGdldENvbnRleHRzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRzO1xuICB9XG5cbiAgZ2V0VGVybXMoKSB7XG4gICAgY29uc3QgdGVybXMgPSBbXTtcblxuICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dFRlcm1zID0gY29udGV4dC5nZXRUZXJtcygpO1xuXG4gICAgICBwdXNoKHRlcm1zLCBjb250ZXh0VGVybXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRlcm1zO1xuICB9XG5cbiAgZ2V0RnJhbWVzKCkge1xuICAgIGNvbnN0IGZyYW1lcyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0RnJhbWVzID0gY29udGV4dC5nZXRGcmFtZXMoKTtcblxuICAgICAgcHVzaChmcmFtZXMsIGNvbnRleHRGcmFtZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZyYW1lcztcbiAgfVxuXG4gIGdldEVxdWFsaXRpZXMoKSB7XG4gICAgY29uc3QgZXF1YWxpdGllcyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0RXF1YWxpdGllcyA9IGNvbnRleHQuZ2V0RXF1YWxpdGllcygpO1xuXG4gICAgICBwdXNoKGVxdWFsaXRpZXMsIGNvbnRleHRFcXVhbGl0aWVzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBlcXVhbGl0aWVzO1xuICB9XG5cbiAgZ2V0SnVkZ2VtZW50cygpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gW107XG5cbiAgICB0aGlzLmNvbnRleHRzLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRKdWRnZW1lbnRzID0gY29udGV4dC5nZXRKdWRnZW1lbnRzKCk7XG5cbiAgICAgIHB1c2goanVkZ2VtZW50cywgY29udGV4dEp1ZGdlbWVudHMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudHM7XG4gIH1cblxuICBnZXRTdGF0ZW1lbnRzKCkge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBbXTtcblxuICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dFN0YXRlbWVudHMgPSBjb250ZXh0LmdldFN0YXRlbWVudHMoKTtcblxuICAgICAgcHVzaChzdGF0ZW1lbnRzLCBjb250ZXh0U3RhdGVtZW50cyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgfVxuXG4gIGdldEFzc2VydGlvbnMoKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0QXNzZXJ0aW9ucyA9IGNvbnRleHQuZ2V0QXNzZXJ0aW9ucygpO1xuXG4gICAgICBwdXNoKGFzc2VydGlvbnMsIGNvbnRleHRBc3NlcnRpb25zKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhc3NlcnRpb25zO1xuICB9XG5cbiAgZ2V0UmVmZXJlbmNlcygpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gW107XG5cbiAgICB0aGlzLmNvbnRleHRzLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRSZWZlcmVuY2VzID0gY29udGV4dC5nZXRSZWZlcmVuY2VzKCk7XG5cbiAgICAgIHB1c2gocmVmZXJlbmNlcywgY29udGV4dFJlZmVyZW5jZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlZmVyZW5jZXM7XG4gIH1cblxuICBnZXRBc3N1bXB0aW9ucygpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0QXNzdW1wdGlvbnMgPSBjb250ZXh0LmdldEFzc3VtcHRpb25zKCk7XG5cbiAgICAgIHB1c2goYXNzdW1wdGlvbnMsIGNvbnRleHRBc3N1bXB0aW9ucyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnM7XG4gIH1cblxuICBnZXRNZXRhdmFyaWFibGVzKCkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZXMgPSBbXTtcblxuICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dE1ldGF2YXJpYWJsZXMgPSBjb250ZXh0LmdldE1ldGF2YXJpYWJsZXMoKTtcblxuICAgICAgcHVzaChtZXRhdmFyaWFibGVzLCBjb250ZXh0TWV0YXZhcmlhYmxlcyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGdldFN1YnN0aXR1dGlvbnMoKSB7XG4gICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0U3Vic3RpdHV0aW9ucyA9IGNvbnRleHQuZ2V0U3Vic3RpdHV0aW9ucygpO1xuXG4gICAgICBwdXNoKHN1YnN0aXR1dGlvbnMsIGNvbnRleHRTdWJzdGl0dXRpb25zKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzdWJzdGl0dXRpb25zO1xuICB9XG5cbiAgZmluZFRlcm1CeVRlcm1Ob2RlKHRlcm1Ob2RlKSB7XG4gICAgY29uc3QgdGVybXMgPSB0aGlzLmdldFRlcm1zKCksXG4gICAgICAgICAgdGVybSA9IHRlcm1zLmZpbmQoKHRlcm0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1Ob2RlTWF0Y2hlcyA9IHRlcm0ubWF0Y2hUZXJtTm9kZSh0ZXJtTm9kZSk7XG5cbiAgICAgICAgICAgIGlmICh0ZXJtTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZmluZEZyYW1lQnlGcmFtZU5vZGUoZnJhbWVOb2RlKSB7XG4gICAgY29uc3QgZnJhbWVzID0gdGhpcy5nZXRGcmFtZXMoKSxcbiAgICAgICAgICBmcmFtZSA9IGZyYW1lcy5maW5kKChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVOb2RlTWF0Y2hlcyA9IGZyYW1lLm1hdGNoRnJhbWVOb2RlKGZyYW1lTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChmcmFtZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZnJhbWU7XG4gIH1cblxuICBmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpIHtcbiAgICBjb25zdCBlcXVhbGl0aWVzID0gdGhpcy5nZXRFcXVhbGl0aWVzKCksXG4gICAgICAgICAgZXF1YWxpdHkgPSBlcXVhbGl0aWVzLmZpbmQoKGVxdWFsaXR5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcXVhbGl0eU5vZGVNYXRjaGVzID0gZXF1YWxpdHkubWF0Y2hFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGVxdWFsaXR5Tm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBlcXVhbGl0eTtcbiAgfVxuXG4gIGZpbmRKdWRnZW1lbnRCeUp1ZGdlbWVudE5vZGUoanVkZ2VtZW50Tm9kZSkge1xuICAgIGNvbnN0IGp1ZGdlbWVudHMgPSB0aGlzLmdldEp1ZGdlbWVudHMoKSxcbiAgICAgICAgICBqdWRnZW1lbnQgPSBqdWRnZW1lbnRzLmZpbmQoKGp1ZGdlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QganVkZ2VtZW50Tm9kZU1hdGNoZXMgPSBqdWRnZW1lbnQubWF0Y2hKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoanVkZ2VtZW50Tm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBqdWRnZW1lbnQ7XG4gIH1cblxuICBmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gdGhpcy5nZXRTdGF0ZW1lbnRzKCksXG4gICAgICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50cy5maW5kKChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlbWVudE5vZGVNYXRjaGVzID0gc3RhdGVtZW50Lm1hdGNoU3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlbWVudE5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50O1xuICB9XG5cbiAgZmluZFJlZmVyZW5jZUJ5UmVmZXJlbmNlTm9kZShyZWZlcmVuY2VOb2RlKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IHRoaXMuZ2V0UmVmZXJlbmNlcygpLFxuICAgICAgICAgIHJlZmVyZW5jZSA9IHJlZmVyZW5jZXMuZmluZCgocmVmZXJlbmNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZlcmVuY2VNYXRjaGVSZWZlcmVuY2VOb2RlID0gcmVmZXJlbmNlLm1hdGNoUmVmZXJlbmNlTm9kZShyZWZlcmVuY2VOb2RlKTtcblxuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZU1hdGNoZVJlZmVyZW5jZU5vZGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiByZWZlcmVuY2U7XG4gIH1cblxuICBmaW5kQXNzZXJ0aW9uQnlBc3NlcnRpb25Ob2RlKGFzc2VydGlvbk5vZGUpIHtcbiAgICBjb25zdCBhc3NlcnRpb25zID0gdGhpcy5nZXRBc3NlcnRpb25zKCksXG4gICAgICAgICAgYXNzZXJ0aW9uID0gYXNzZXJ0aW9ucy5maW5kKChhc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2VydGlvbk5vZGVNYXRjaGVzID0gYXNzZXJ0aW9uLm1hdGNoQXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKGFzc2VydGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uO1xuICB9XG5cbiAgZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbnMgPSB0aGlzLmdldEFzc3VtcHRpb25zKCksXG4gICAgICAgICAgYXNzdW1wdGlvbiA9IGFzc3VtcHRpb25zLmZpbmQoKGFzc3VtcHRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFzc3VtcHRpb25Ob2RlTWF0Y2hlcyA9IGFzc3VtcHRpb24ubWF0Y2hBc3N1bXB0aW9uTm9kZShhc3N1bXB0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3N1bXB0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBhc3N1bXB0aW9uO1xuICB9XG5cbiAgZmluZFJlZmVyZW5jZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IHRoaXMuZ2V0UmVmZXJlbmNlcygpLFxuICAgICAgICAgIHJlZmVyZW5jZSA9IHJlZmVyZW5jZXMuZmluZCgocmVmZXJlbmNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZlcmVuY2VNYXRjaGVNZXRhdmFyaWFibGVOb2RlID0gcmVmZXJlbmNlLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZU1hdGNoZU1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiByZWZlcmVuY2U7XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gbWV0YXZhcmlhYmxlLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKSB7XG4gICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9IHRoaXMuZ2V0U3Vic3RpdHV0aW9ucygpLFxuICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbnMuZmluZCgoc3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25Ob2RlTWF0Y2hlcyA9IHN1YnN0aXR1dGlvbi5tYXRjaFN1YnN0aXR1dGlvbk5vZGUoc3Vic3RpdHV0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29udGV4dHMoLi4uY29udGV4dHMpIHtcbiAgICBjb25zdCBsYXN0Q29udGV4dCA9IGxhc3QoY29udGV4dHMpLFxuICAgICAgICAgIGNvbnRleHQgPSBsYXN0Q29udGV4dCwgIC8vL1xuICAgICAgICAgIHN5bnRoZXRpY0NvbnRleHQgPSBuZXcgU3ludGhldGljQ29udGV4dChjb250ZXh0LCBjb250ZXh0cyk7XG5cbiAgICByZXR1cm4gc3ludGhldGljQ29udGV4dDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlN5bnRoZXRpY0NvbnRleHQiLCJwdXNoIiwibGFzdCIsImFycmF5VXRpbGl0aWVzIiwiQ29udGV4dCIsImNvbnRleHQiLCJjb250ZXh0cyIsImdldENvbnRleHRzIiwiZ2V0VGVybXMiLCJ0ZXJtcyIsImZvckVhY2giLCJjb250ZXh0VGVybXMiLCJnZXRGcmFtZXMiLCJmcmFtZXMiLCJjb250ZXh0RnJhbWVzIiwiZ2V0RXF1YWxpdGllcyIsImVxdWFsaXRpZXMiLCJjb250ZXh0RXF1YWxpdGllcyIsImdldEp1ZGdlbWVudHMiLCJqdWRnZW1lbnRzIiwiY29udGV4dEp1ZGdlbWVudHMiLCJnZXRTdGF0ZW1lbnRzIiwic3RhdGVtZW50cyIsImNvbnRleHRTdGF0ZW1lbnRzIiwiZ2V0QXNzZXJ0aW9ucyIsImFzc2VydGlvbnMiLCJjb250ZXh0QXNzZXJ0aW9ucyIsImdldFJlZmVyZW5jZXMiLCJyZWZlcmVuY2VzIiwiY29udGV4dFJlZmVyZW5jZXMiLCJnZXRBc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zIiwiY29udGV4dEFzc3VtcHRpb25zIiwiZ2V0TWV0YXZhcmlhYmxlcyIsIm1ldGF2YXJpYWJsZXMiLCJjb250ZXh0TWV0YXZhcmlhYmxlcyIsImdldFN1YnN0aXR1dGlvbnMiLCJzdWJzdGl0dXRpb25zIiwiY29udGV4dFN1YnN0aXR1dGlvbnMiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsInRlcm0iLCJmaW5kIiwidGVybU5vZGVNYXRjaGVzIiwibWF0Y2hUZXJtTm9kZSIsImZpbmRGcmFtZUJ5RnJhbWVOb2RlIiwiZnJhbWVOb2RlIiwiZnJhbWUiLCJmcmFtZU5vZGVNYXRjaGVzIiwibWF0Y2hGcmFtZU5vZGUiLCJmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5IiwiZXF1YWxpdHlOb2RlTWF0Y2hlcyIsIm1hdGNoRXF1YWxpdHlOb2RlIiwiZmluZEp1ZGdlbWVudEJ5SnVkZ2VtZW50Tm9kZSIsImp1ZGdlbWVudE5vZGUiLCJqdWRnZW1lbnQiLCJqdWRnZW1lbnROb2RlTWF0Y2hlcyIsIm1hdGNoSnVkZ2VtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Iiwic3RhdGVtZW50Tm9kZU1hdGNoZXMiLCJtYXRjaFN0YXRlbWVudE5vZGUiLCJmaW5kUmVmZXJlbmNlQnlSZWZlcmVuY2VOb2RlIiwicmVmZXJlbmNlTm9kZSIsInJlZmVyZW5jZSIsInJlZmVyZW5jZU1hdGNoZVJlZmVyZW5jZU5vZGUiLCJtYXRjaFJlZmVyZW5jZU5vZGUiLCJmaW5kQXNzZXJ0aW9uQnlBc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvbiIsImFzc2VydGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3NlcnRpb25Ob2RlIiwiZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvbk5vZGUiLCJhc3N1bXB0aW9uIiwiYXNzdW1wdGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3N1bXB0aW9uTm9kZSIsImZpbmRSZWZlcmVuY2VCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwicmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsImZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaFN1YnN0aXR1dGlvbk5vZGUiLCJmcm9tQ29udGV4dHMiLCJsYXN0Q29udGV4dCIsInN5bnRoZXRpY0NvbnRleHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVFBOzs7ZUFBcUJBOzs7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
|