occam-nominal 1.0.577 → 1.0.580

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.
@@ -19,173 +19,173 @@ function _interop_require_default(obj) {
19
19
  }
20
20
  const { forEach } = _occamlanguages.continuationUtilities, { push, find, first } = _necessary.arrayUtilities;
21
21
  class LiminalContext extends _context.default {
22
- constructor(context, inferredSubstitutions){
22
+ constructor(context, derivedSubstitutions){
23
23
  super(context);
24
- this.inferredSubstitutions = inferredSubstitutions;
24
+ this.derivedSubstitutions = derivedSubstitutions;
25
25
  }
26
- getInferredSubstitutions(inferredSubstitutions = []) {
26
+ getDerivedSubstitutions(derivedSubstitutions = []) {
27
27
  const context = this.getContext();
28
- push(inferredSubstitutions, this.inferredSubstitutions);
29
- context.getInferredSubstitutions(inferredSubstitutions);
30
- return inferredSubstitutions;
31
- }
32
- getSoleInferredSubstitution() {
33
- let soleInferredSubstitution = null;
34
- const inferredSubstitutionsLength = this.inferredSubstitutions.length;
35
- if (inferredSubstitutionsLength === 1) {
36
- const firstInferredSubstitution = first(this.inferredSubstitutions);
37
- soleInferredSubstitution = firstInferredSubstitution; ///
28
+ push(derivedSubstitutions, this.derivedSubstitutions);
29
+ context.getDerivedSubstitutions(derivedSubstitutions);
30
+ return derivedSubstitutions;
31
+ }
32
+ getSoleDerivedSubstitution() {
33
+ let soleDerivedSubstitution = null;
34
+ const derivedSubstitutionsLength = this.derivedSubstitutions.length;
35
+ if (derivedSubstitutionsLength === 1) {
36
+ const firstDerivedSubstitution = first(this.derivedSubstitutions);
37
+ soleDerivedSubstitution = firstDerivedSubstitution; ///
38
38
  }
39
- return soleInferredSubstitution;
40
- }
41
- getSingularNonTrivialInferredSubstitution() {
42
- let singularNonTrivialInferredSubstitution = null;
43
- const soleInferredSubstitution = this.getSoleInferredSubstitution();
44
- if (soleInferredSubstitution !== null) {
45
- const soleInferredSubstitutionNonTrivial = soleInferredSubstitution.isNonTrivial();
46
- if (soleInferredSubstitutionNonTrivial) {
47
- singularNonTrivialInferredSubstitution = soleInferredSubstitution; ///
39
+ return soleDerivedSubstitution;
40
+ }
41
+ getSingularNonTrivialDerivedSubstitution() {
42
+ let singularNonTrivialDerivedSubstitution = null;
43
+ const soleDerivedSubstitution = this.getSoleDerivedSubstitution();
44
+ if (soleDerivedSubstitution !== null) {
45
+ const soleDerivedSubstitutionNonTrivial = soleDerivedSubstitution.isNonTrivial();
46
+ if (soleDerivedSubstitutionNonTrivial) {
47
+ singularNonTrivialDerivedSubstitution = soleDerivedSubstitution; ///
48
48
  }
49
49
  }
50
- return singularNonTrivialInferredSubstitution;
50
+ return singularNonTrivialDerivedSubstitution;
51
51
  }
52
52
  addSubstitution(substitution) {
53
53
  ///
54
54
  }
55
- addInferredSubstitution(inferredSubstitution) {
56
- const context = this, inferredSubstitutionA = inferredSubstitution, inferredSubstitutionString = inferredSubstitution.getString();
57
- context.trace(`Adding the '${inferredSubstitutionString}' inferred substitution to the liminal context...`);
58
- const inferredSubstitutionB = this.inferredSubstitutions.find((inferredSubstitution)=>{
59
- const inferredSubstitutionB = inferredSubstitution, inferredSubstitutionAEqualToInferredSubstitutionB = inferredSubstitutionA.isEqualTo(inferredSubstitutionB);
60
- if (inferredSubstitutionAEqualToInferredSubstitutionB) {
55
+ addDerivedSubstitution(derivedSubstitution) {
56
+ const context = this, derivedSubstitutionA = derivedSubstitution, derivedSubstitutionString = derivedSubstitution.getString();
57
+ context.trace(`Adding the '${derivedSubstitutionString}' derived substitution to the liminal context...`);
58
+ const derivedSubstitutionB = this.derivedSubstitutions.find((derivedSubstitution)=>{
59
+ const derivedSubstitutionB = derivedSubstitution, derivedSubstitutionAEqualToDerivedSubstitutionB = derivedSubstitutionA.isEqualTo(derivedSubstitutionB);
60
+ if (derivedSubstitutionAEqualToDerivedSubstitutionB) {
61
61
  return true;
62
62
  }
63
63
  }) || null;
64
- if (inferredSubstitutionB !== null) {
65
- context.debug(`The '${inferredSubstitutionString}' inferred substitution has already been added to the liminal context.`);
64
+ if (derivedSubstitutionB !== null) {
65
+ context.debug(`The '${derivedSubstitutionString}' derived substitution has already been added to the liminal context.`);
66
66
  } else {
67
- this.inferredSubstitutions.push(inferredSubstitution);
67
+ this.derivedSubstitutions.push(derivedSubstitution);
68
68
  }
69
- context.debug(`...added the '${inferredSubstitutionString}' inferred substitution to the liminal context.`);
69
+ context.debug(`...added the '${derivedSubstitutionString}' derived substitution to the liminal context.`);
70
70
  }
71
- addInferredSubstitutions(inferredSubstitutions) {
72
- inferredSubstitutions.forEach((inferredSubstitution)=>{
73
- this.addInferredSubstitution(inferredSubstitution);
71
+ addDerivedSubstitutions(derivedSubstitutions) {
72
+ derivedSubstitutions.forEach((derivedSubstitution)=>{
73
+ this.addDerivedSubstitution(derivedSubstitution);
74
74
  });
75
75
  }
76
- solveInferredSubstitutions(forward, back) {
77
- const inferredSubstitutions = this.getInferredSubstitutions(), metavariableNodes = (0, _substitutions.metavariableNodesFromInferredSubstitutions)(inferredSubstitutions);
76
+ solveDerivedSubstitutions(forward, back) {
77
+ const derivedSubstitutions = this.getDerivedSubstitutions(), metavariableNodes = (0, _substitutions.metavariableNodesFromDerivedSubstitutions)(derivedSubstitutions);
78
78
  return forEach(metavariableNodes, (metavariableNode, forward, back)=>{
79
- const complexInferredSubstitutions = this.findComplexInferredSubstitutionsByMetavariableNode(metavariableNode);
80
- return forEach(complexInferredSubstitutions, (complexInferredSubstitution, forward, back)=>{
81
- const inferredSubstitution = complexInferredSubstitution, solved = inferredSubstitution.isSolved();
79
+ const complexDerivedSubstitutions = this.findComplexDerivedSubstitutionsByMetavariableNode(metavariableNode);
80
+ return forEach(complexDerivedSubstitutions, (complexDerivedSubstitution, forward, back)=>{
81
+ const derivedSubstitution = complexDerivedSubstitution, solved = derivedSubstitution.isSolved();
82
82
  if (solved) {
83
83
  return forward(back);
84
84
  }
85
85
  const context = this; ///
86
- return inferredSubstitution.solve(context, (context, back)=>{
86
+ return derivedSubstitution.solve(context, (context, back)=>{
87
87
  return forward(back);
88
88
  }, back);
89
89
  }, forward, back);
90
90
  }, forward, back);
91
91
  }
92
92
  areComplexSubstitutionsUnsolved() {
93
- const inferredSubstitutionsSolved = this.areInferredSubstitutionsSolved(), complexSubstitutionsUnsolved = !inferredSubstitutionsSolved;
93
+ const derivedSubstitutionsSolved = this.areDerivedSubstitutionsSolved(), complexSubstitutionsUnsolved = !derivedSubstitutionsSolved;
94
94
  return complexSubstitutionsUnsolved;
95
95
  }
96
- areInferredSubstitutionsSolved() {
97
- const inferredSubstitutions = this.getInferredSubstitutions(), metavariableNodes = (0, _substitutions.metavariableNodesFromInferredSubstitutions)(inferredSubstitutions), inferredSubstitutionsSolved = metavariableNodes.every((metavariableNode)=>{
98
- const complexInferredSubstitutions = this.findComplexInferredSubstitutionsByMetavariableNode(metavariableNode), complexInferredSubstitutionsSolved = complexInferredSubstitutions.every((complexInferredSubstitution)=>{
99
- const complexInferredSubstitutionSolved = complexInferredSubstitution.isSolved();
100
- if (complexInferredSubstitutionSolved) {
96
+ areDerivedSubstitutionsSolved() {
97
+ const derivedSubstitutions = this.getDerivedSubstitutions(), metavariableNodes = (0, _substitutions.metavariableNodesFromDerivedSubstitutions)(derivedSubstitutions), derivedSubstitutionsSolved = metavariableNodes.every((metavariableNode)=>{
98
+ const complexDerivedSubstitutions = this.findComplexDerivedSubstitutionsByMetavariableNode(metavariableNode), complexDerivedSubstitutionsSolved = complexDerivedSubstitutions.every((complexDerivedSubstitution)=>{
99
+ const complexDerivedSubstitutionSolved = complexDerivedSubstitution.isSolved();
100
+ if (complexDerivedSubstitutionSolved) {
101
101
  return true;
102
102
  }
103
103
  });
104
- if (complexInferredSubstitutionsSolved) {
104
+ if (complexDerivedSubstitutionsSolved) {
105
105
  return true;
106
106
  }
107
107
  });
108
- return inferredSubstitutionsSolved;
108
+ return derivedSubstitutionsSolved;
109
109
  }
110
110
  isEmpty() {
111
- const inferredSubstitutionsLength = this.inferredSubstitutions.length, empty = inferredSubstitutionsLength === 0;
111
+ const derivedSubstitutionsLength = this.derivedSubstitutions.length, empty = derivedSubstitutionsLength === 0;
112
112
  return empty;
113
113
  }
114
114
  merge(context) {
115
115
  context.debug(`Merging the liminal context`);
116
- context.addInferredSubstitutions(this.inferredSubstitutions);
116
+ context.addDerivedSubstitutions(this.derivedSubstitutions);
117
117
  }
118
- findInferredSubstitution(callback) {
119
- const inferredSubstitutions = this.getInferredSubstitutions(), inferredSubstitution = inferredSubstitutions.find(callback);
120
- return inferredSubstitution;
118
+ findDerivedSubstitution(callback) {
119
+ const derivedSubstitutions = this.getDerivedSubstitutions(), derivedSubstitution = derivedSubstitutions.find(callback);
120
+ return derivedSubstitution;
121
121
  }
122
- findInferredSubstitutions(callback) {
123
- let inferredSubstitutions;
124
- inferredSubstitutions = this.getInferredSubstitutions();
125
- inferredSubstitutions = find(inferredSubstitutions, callback); ///
126
- return inferredSubstitutions;
122
+ findDerivedSubstitutions(callback) {
123
+ let derivedSubstitutions;
124
+ derivedSubstitutions = this.getDerivedSubstitutions();
125
+ derivedSubstitutions = find(derivedSubstitutions, callback); ///
126
+ return derivedSubstitutions;
127
127
  }
128
- findInferredSubstitutionByVariableNode(variableNode) {
129
- const inferredSubstitution = this.findInferredSubstitution((inferredSubstitution)=>{
130
- const variableNodeMatches = inferredSubstitution.matchVariableNode(variableNode);
128
+ findDerivedSubstitutionByVariableNode(variableNode) {
129
+ const derivedSubstitution = this.findDerivedSubstitution((derivedSubstitution)=>{
130
+ const variableNodeMatches = derivedSubstitution.matchVariableNode(variableNode);
131
131
  if (variableNodeMatches) {
132
132
  return true;
133
133
  }
134
134
  }) || null;
135
- return inferredSubstitution;
135
+ return derivedSubstitution;
136
136
  }
137
- findInferredSubstitutionByMetavariableNode(metavariableNode) {
138
- const simpleInferredSubstitution = this.findSimpleInferredSubstitutionByMetavariableNode(metavariableNode), inferredSubstitution = simpleInferredSubstitution; ///
139
- return inferredSubstitution;
137
+ findDerivedSubstitutionByMetavariableNode(metavariableNode) {
138
+ const simpleDerivedSubstitution = this.findSimpleDerivedSubstitutionByMetavariableNode(metavariableNode), derivedSubstitution = simpleDerivedSubstitution; ///
139
+ return derivedSubstitution;
140
140
  }
141
- findSimpleInferredSubstitutionByMetavariableNode(metavariableNode) {
142
- const simpleInferredSubstitution = this.findInferredSubstitution((inferredSubstitution)=>{
143
- const inferredSubstitutionSimple = inferredSubstitution.isSimple();
144
- if (inferredSubstitutionSimple) {
145
- const simpleInferredSubstitution = inferredSubstitution, metavariableNodeMatches = simpleInferredSubstitution.matchMetavariableNode(metavariableNode);
141
+ findSimpleDerivedSubstitutionByMetavariableNode(metavariableNode) {
142
+ const simpleDerivedSubstitution = this.findDerivedSubstitution((derivedSubstitution)=>{
143
+ const derivedSubstitutionSimple = derivedSubstitution.isSimple();
144
+ if (derivedSubstitutionSimple) {
145
+ const simpleDerivedSubstitution = derivedSubstitution, metavariableNodeMatches = simpleDerivedSubstitution.matchMetavariableNode(metavariableNode);
146
146
  if (metavariableNodeMatches) {
147
147
  return true;
148
148
  }
149
149
  }
150
150
  }) || null;
151
- return simpleInferredSubstitution;
151
+ return simpleDerivedSubstitution;
152
152
  }
153
- findComplexInferredSubstitutionsByMetavariableNode(metavariableNode) {
154
- const complexInferredSubstitution = this.findInferredSubstitutions((inferredSubstitution)=>{
155
- const inferredSubstitutionComplex = inferredSubstitution.isComplex();
156
- if (inferredSubstitutionComplex) {
157
- const complexInferredSubstitution = inferredSubstitution, metavariableNodeMatches = complexInferredSubstitution.matchMetavariableNode(metavariableNode);
153
+ findComplexDerivedSubstitutionsByMetavariableNode(metavariableNode) {
154
+ const complexDerivedSubstitution = this.findDerivedSubstitutions((derivedSubstitution)=>{
155
+ const derivedSubstitutionComplex = derivedSubstitution.isComplex();
156
+ if (derivedSubstitutionComplex) {
157
+ const complexDerivedSubstitution = derivedSubstitution, metavariableNodeMatches = complexDerivedSubstitution.matchMetavariableNode(metavariableNode);
158
158
  if (metavariableNodeMatches) {
159
159
  return true;
160
160
  }
161
161
  }
162
162
  }) || null;
163
- return complexInferredSubstitution;
163
+ return complexDerivedSubstitution;
164
164
  }
165
- findInferredSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
166
- const inferredSubstitution = this.findInferredSubstitution((inferredSubstitution)=>{
167
- const metavariableNodeMatches = inferredSubstitution.matchMetavariableNode(metavariableNode);
165
+ findDerivedSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
166
+ const derivedSubstitution = this.findDerivedSubstitution((derivedSubstitution)=>{
167
+ const metavariableNodeMatches = derivedSubstitution.matchMetavariableNode(metavariableNode);
168
168
  if (metavariableNodeMatches) {
169
- const substitutionNodeMatches = inferredSubstitution.matchSubstitutionNode(substitutionNode);
169
+ const substitutionNodeMatches = derivedSubstitution.matchSubstitutionNode(substitutionNode);
170
170
  if (substitutionNodeMatches) {
171
171
  return true;
172
172
  }
173
173
  }
174
174
  }) || null;
175
- return inferredSubstitution;
175
+ return derivedSubstitution;
176
176
  }
177
- isInferredSubstitutionPresentByMetavariableNode(metavariableNode) {
178
- const inferredSubstitution = this.findInferredSubstitutionByMetavariableNode(metavariableNode), inferredSubstitutionPresent = inferredSubstitution !== null;
179
- return inferredSubstitutionPresent;
177
+ isDerivedSubstitutionPresentByMetavariableNode(metavariableNode) {
178
+ const derivedSubstitution = this.findDerivedSubstitutionByMetavariableNode(metavariableNode), derivedSubstitutionPresent = derivedSubstitution !== null;
179
+ return derivedSubstitutionPresent;
180
180
  }
181
- isInferredSubstitutionPresentByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
182
- const inferredSubstitution = this.findInferredSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode), inferredSubstitutionPresent = inferredSubstitution !== null;
183
- return inferredSubstitutionPresent;
181
+ isDerivedSubstitutionPresentByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
182
+ const derivedSubstitution = this.findDerivedSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode), derivedSubstitutionPresent = derivedSubstitution !== null;
183
+ return derivedSubstitutionPresent;
184
184
  }
185
185
  static fromNothing(context) {
186
- const inferredSubstitutions = [], liminalContext = new LiminalContext(context, inferredSubstitutions);
186
+ const derivedSubstitutions = [], liminalContext = new LiminalContext(context, derivedSubstitutions);
187
187
  return liminalContext;
188
188
  }
189
189
  }
190
190
 
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2xpbWluYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuaW1wb3J0IHsgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwiLi4vY29udGV4dFwiO1xuXG5pbXBvcnQgeyBtZXRhdmFyaWFibGVOb2Rlc0Zyb21JbmZlcnJlZFN1YnN0aXR1dGlvbnMgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N1YnN0aXR1dGlvbnNcIjtcblxuY29uc3QgeyBmb3JFYWNoIH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IHB1c2gsIGZpbmQsIGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGltaW5hbENvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgaW5mZXJyZWRTdWJzdGl0dXRpb25zKSB7XG4gICAgc3VwZXIoY29udGV4dCk7XG5cbiAgICB0aGlzLmluZmVycmVkU3Vic3RpdHV0aW9ucyA9IGluZmVycmVkU3Vic3RpdHV0aW9ucztcbiAgfVxuXG4gIGdldEluZmVycmVkU3Vic3RpdHV0aW9ucyhpbmZlcnJlZFN1YnN0aXR1dGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goaW5mZXJyZWRTdWJzdGl0dXRpb25zLCB0aGlzLmluZmVycmVkU3Vic3RpdHV0aW9ucyk7XG5cbiAgICBjb250ZXh0LmdldEluZmVycmVkU3Vic3RpdHV0aW9ucyhpbmZlcnJlZFN1YnN0aXR1dGlvbnMpO1xuXG4gICAgcmV0dXJuIGluZmVycmVkU3Vic3RpdHV0aW9ucztcbiAgfVxuXG4gIGdldFNvbGVJbmZlcnJlZFN1YnN0aXR1dGlvbigpIHtcbiAgICBsZXQgc29sZUluZmVycmVkU3Vic3RpdHV0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IGluZmVycmVkU3Vic3RpdHV0aW9uc0xlbmd0aCA9IHRoaXMuaW5mZXJyZWRTdWJzdGl0dXRpb25zLmxlbmd0aDtcblxuICAgIGlmIChpbmZlcnJlZFN1YnN0aXR1dGlvbnNMZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGZpcnN0SW5mZXJyZWRTdWJzdGl0dXRpb24gPSBmaXJzdCh0aGlzLmluZmVycmVkU3Vic3RpdHV0aW9ucyk7XG5cbiAgICAgIHNvbGVJbmZlcnJlZFN1YnN0aXR1dGlvbiA9IGZpcnN0SW5mZXJyZWRTdWJzdGl0dXRpb247IC8vL1xuICAgIH1cblxuICAgIHJldHVybiBzb2xlSW5mZXJyZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBnZXRTaW5ndWxhck5vblRyaXZpYWxJbmZlcnJlZFN1YnN0aXR1dGlvbigpIHtcbiAgICBsZXQgc2luZ3VsYXJOb25Ucml2aWFsSW5mZXJyZWRTdWJzdGl0dXRpb24gPSBudWxsO1xuXG4gICAgY29uc3Qgc29sZUluZmVycmVkU3Vic3RpdHV0aW9uID0gdGhpcy5nZXRTb2xlSW5mZXJyZWRTdWJzdGl0dXRpb24oKTtcblxuICAgIGlmIChzb2xlSW5mZXJyZWRTdWJzdGl0dXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNvbGVJbmZlcnJlZFN1YnN0aXR1dGlvbk5vblRyaXZpYWwgPSBzb2xlSW5mZXJyZWRTdWJzdGl0dXRpb24uaXNOb25Ucml2aWFsKCk7XG5cbiAgICAgIGlmIChzb2xlSW5mZXJyZWRTdWJzdGl0dXRpb25Ob25Ucml2aWFsKSB7XG4gICAgICAgIHNpbmd1bGFyTm9uVHJpdmlhbEluZmVycmVkU3Vic3RpdHV0aW9uID0gc29sZUluZmVycmVkU3Vic3RpdHV0aW9uOyAgLy8vXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpbmd1bGFyTm9uVHJpdmlhbEluZmVycmVkU3Vic3RpdHV0aW9uO1xuICB9XG5cbiAgYWRkU3Vic3RpdHV0aW9uKHN1YnN0aXR1dGlvbikge1xuICAgIC8vL1xuICB9XG5cbiAgYWRkSW5mZXJyZWRTdWJzdGl0dXRpb24oaW5mZXJyZWRTdWJzdGl0dXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgaW5mZXJyZWRTdWJzdGl0dXRpb25BID0gaW5mZXJyZWRTdWJzdGl0dXRpb24sIC8vL1xuICAgICAgICAgIGluZmVycmVkU3Vic3RpdHV0aW9uU3RyaW5nID0gaW5mZXJyZWRTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2luZmVycmVkU3Vic3RpdHV0aW9uU3RyaW5nfScgaW5mZXJyZWQgc3Vic3RpdHV0aW9uIHRvIHRoZSBsaW1pbmFsIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGluZmVycmVkU3Vic3RpdHV0aW9uQiA9IHRoaXMuaW5mZXJyZWRTdWJzdGl0dXRpb25zLmZpbmQoKGluZmVycmVkU3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbkIgPSBpbmZlcnJlZFN1YnN0aXR1dGlvbiwgLy8vXG4gICAgICAgICAgICBpbmZlcnJlZFN1YnN0aXR1dGlvbkFFcXVhbFRvSW5mZXJyZWRTdWJzdGl0dXRpb25CID0gaW5mZXJyZWRTdWJzdGl0dXRpb25BLmlzRXF1YWxUbyhpbmZlcnJlZFN1YnN0aXR1dGlvbkIpO1xuXG4gICAgICBpZiAoaW5mZXJyZWRTdWJzdGl0dXRpb25BRXF1YWxUb0luZmVycmVkU3Vic3RpdHV0aW9uQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKGluZmVycmVkU3Vic3RpdHV0aW9uQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgVGhlICcke2luZmVycmVkU3Vic3RpdHV0aW9uU3RyaW5nfScgaW5mZXJyZWQgc3Vic3RpdHV0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIGxpbWluYWwgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbmZlcnJlZFN1YnN0aXR1dGlvbnMucHVzaChpbmZlcnJlZFN1YnN0aXR1dGlvbik7XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2luZmVycmVkU3Vic3RpdHV0aW9uU3RyaW5nfScgaW5mZXJyZWQgc3Vic3RpdHV0aW9uIHRvIHRoZSBsaW1pbmFsIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRJbmZlcnJlZFN1YnN0aXR1dGlvbnMoaW5mZXJyZWRTdWJzdGl0dXRpb25zKSB7XG4gICAgaW5mZXJyZWRTdWJzdGl0dXRpb25zLmZvckVhY2goKGluZmVycmVkU3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICB0aGlzLmFkZEluZmVycmVkU3Vic3RpdHV0aW9uKGluZmVycmVkU3Vic3RpdHV0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNvbHZlSW5mZXJyZWRTdWJzdGl0dXRpb25zKGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldEluZmVycmVkU3Vic3RpdHV0aW9ucygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVzID0gbWV0YXZhcmlhYmxlTm9kZXNGcm9tSW5mZXJyZWRTdWJzdGl0dXRpb25zKGluZmVycmVkU3Vic3RpdHV0aW9ucyk7XG5cbiAgICByZXR1cm4gZm9yRWFjaChtZXRhdmFyaWFibGVOb2RlcywgKG1ldGF2YXJpYWJsZU5vZGUsIGZvcndhcmQsIGJhY2spID0+IHtcbiAgICAgIGNvbnN0IGNvbXBsZXhJbmZlcnJlZFN1YnN0aXR1dGlvbnMgPSB0aGlzLmZpbmRDb21wbGV4SW5mZXJyZWRTdWJzdGl0dXRpb25zQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICByZXR1cm4gZm9yRWFjaChjb21wbGV4SW5mZXJyZWRTdWJzdGl0dXRpb25zLCAoY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uLCBmb3J3YXJkLCBiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZmVycmVkU3Vic3RpdHV0aW9uID0gY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uLCAvLy9cbiAgICAgICAgICAgICAgc29sdmVkID0gaW5mZXJyZWRTdWJzdGl0dXRpb24uaXNTb2x2ZWQoKTtcblxuICAgICAgICBpZiAoc29sdmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpczsgLy8vXG5cbiAgICAgICAgcmV0dXJuIGluZmVycmVkU3Vic3RpdHV0aW9uLnNvbHZlKGNvbnRleHQsIChjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoYmFjayk7XG4gICAgICAgIH0sIGJhY2spO1xuICAgICAgfSwgZm9yd2FyZCwgYmFjayk7XG4gICAgfSwgZm9yd2FyZCwgYmFjayk7XG4gIH1cblxuICBhcmVDb21wbGV4U3Vic3RpdHV0aW9uc1Vuc29sdmVkKCkge1xuICAgIGNvbnN0IGluZmVycmVkU3Vic3RpdHV0aW9uc1NvbHZlZCA9IHRoaXMuYXJlSW5mZXJyZWRTdWJzdGl0dXRpb25zU29sdmVkKCksXG4gICAgICAgICAgY29tcGxleFN1YnN0aXR1dGlvbnNVbnNvbHZlZCA9ICFpbmZlcnJlZFN1YnN0aXR1dGlvbnNTb2x2ZWQ7XG5cbiAgICByZXR1cm4gY29tcGxleFN1YnN0aXR1dGlvbnNVbnNvbHZlZDtcbiAgfVxuXG4gIGFyZUluZmVycmVkU3Vic3RpdHV0aW9uc1NvbHZlZCgpIHtcbiAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldEluZmVycmVkU3Vic3RpdHV0aW9ucygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVzID0gbWV0YXZhcmlhYmxlTm9kZXNGcm9tSW5mZXJyZWRTdWJzdGl0dXRpb25zKGluZmVycmVkU3Vic3RpdHV0aW9ucyksXG4gICAgICAgICAgaW5mZXJyZWRTdWJzdGl0dXRpb25zU29sdmVkID0gbWV0YXZhcmlhYmxlTm9kZXMuZXZlcnkoKG1ldGF2YXJpYWJsZU5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhJbmZlcnJlZFN1YnN0aXR1dGlvbnMgPSB0aGlzLmZpbmRDb21wbGV4SW5mZXJyZWRTdWJzdGl0dXRpb25zQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgICAgICAgICAgY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uc1NvbHZlZCA9IGNvbXBsZXhJbmZlcnJlZFN1YnN0aXR1dGlvbnMuZXZlcnkoKGNvbXBsZXhJbmZlcnJlZFN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV4SW5mZXJyZWRTdWJzdGl0dXRpb25Tb2x2ZWQgPSBjb21wbGV4SW5mZXJyZWRTdWJzdGl0dXRpb24uaXNTb2x2ZWQoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uU29sdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uc1NvbHZlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBpbmZlcnJlZFN1YnN0aXR1dGlvbnNTb2x2ZWQ7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIGNvbnN0IGluZmVycmVkU3Vic3RpdHV0aW9uc0xlbmd0aCA9IHRoaXMuaW5mZXJyZWRTdWJzdGl0dXRpb25zLmxlbmd0aCxcbiAgICAgICAgICBlbXB0eSA9IChpbmZlcnJlZFN1YnN0aXR1dGlvbnNMZW5ndGggPT09IDApO1xuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgbWVyZ2UoY29udGV4dCkge1xuICAgIGNvbnRleHQuZGVidWcoYE1lcmdpbmcgdGhlIGxpbWluYWwgY29udGV4dGApO1xuXG4gICAgY29udGV4dC5hZGRJbmZlcnJlZFN1YnN0aXR1dGlvbnModGhpcy5pbmZlcnJlZFN1YnN0aXR1dGlvbnMpO1xuICB9XG5cbiAgZmluZEluZmVycmVkU3Vic3RpdHV0aW9uKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb25zID0gdGhpcy5nZXRJbmZlcnJlZFN1YnN0aXR1dGlvbnMoKSxcbiAgICAgICAgICBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IGluZmVycmVkU3Vic3RpdHV0aW9ucy5maW5kKGNhbGxiYWNrKTtcblxuICAgIHJldHVybiBpbmZlcnJlZFN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIGZpbmRJbmZlcnJlZFN1YnN0aXR1dGlvbnMoY2FsbGJhY2spIHtcbiAgICBsZXQgaW5mZXJyZWRTdWJzdGl0dXRpb25zO1xuXG4gICAgaW5mZXJyZWRTdWJzdGl0dXRpb25zID0gdGhpcy5nZXRJbmZlcnJlZFN1YnN0aXR1dGlvbnMoKTtcblxuICAgIGluZmVycmVkU3Vic3RpdHV0aW9ucyA9IGZpbmQoaW5mZXJyZWRTdWJzdGl0dXRpb25zLCBjYWxsYmFjayk7ICAvLy9cblxuICAgIHJldHVybiBpbmZlcnJlZFN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBmaW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeVZhcmlhYmxlTm9kZSh2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uKChpbmZlcnJlZFN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgY29uc3QgdmFyaWFibGVOb2RlTWF0Y2hlcyA9IGluZmVycmVkU3Vic3RpdHV0aW9uLm1hdGNoVmFyaWFibGVOb2RlKHZhcmlhYmxlTm9kZSk7XG5cbiAgICAgIGlmICh2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gaW5mZXJyZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBmaW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IHNpbXBsZUluZmVycmVkU3Vic3RpdHV0aW9uID0gdGhpcy5maW5kU2ltcGxlSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgaW5mZXJyZWRTdWJzdGl0dXRpb24gPSBzaW1wbGVJbmZlcnJlZFN1YnN0aXR1dGlvbjsgIC8vL1xuXG4gICAgcmV0dXJuIGluZmVycmVkU3Vic3RpdHV0aW9uO1xuICB9XG5cbiAgZmluZFNpbXBsZUluZmVycmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBzaW1wbGVJbmZlcnJlZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uKChpbmZlcnJlZFN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb25TaW1wbGUgPSBpbmZlcnJlZFN1YnN0aXR1dGlvbi5pc1NpbXBsZSgpO1xuXG4gICAgICBpZiAoaW5mZXJyZWRTdWJzdGl0dXRpb25TaW1wbGUpIHtcbiAgICAgICAgY29uc3Qgc2ltcGxlSW5mZXJyZWRTdWJzdGl0dXRpb24gPSBpbmZlcnJlZFN1YnN0aXR1dGlvbiwgIC8vL1xuICAgICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHNpbXBsZUluZmVycmVkU3Vic3RpdHV0aW9uLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgICBpZiAobWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gc2ltcGxlSW5mZXJyZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBmaW5kQ29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uc0J5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uID0gdGhpcy5maW5kSW5mZXJyZWRTdWJzdGl0dXRpb25zKChpbmZlcnJlZFN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb25Db21wbGV4ID0gaW5mZXJyZWRTdWJzdGl0dXRpb24uaXNDb21wbGV4KCk7XG5cbiAgICAgIGlmIChpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBsZXgpIHtcbiAgICAgICAgY29uc3QgY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uID0gaW5mZXJyZWRTdWJzdGl0dXRpb24sICAvLy9cbiAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBjb21wbGV4SW5mZXJyZWRTdWJzdGl0dXRpb24ubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBjb21wbGV4SW5mZXJyZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBmaW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpIHtcbiAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uKChpbmZlcnJlZFN1YnN0aXR1dGlvbikgPT4geyAgLy8vXG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IGluZmVycmVkU3Vic3RpdHV0aW9uLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbk5vZGVNYXRjaGVzID0gaW5mZXJyZWRTdWJzdGl0dXRpb24ubWF0Y2hTdWJzdGl0dXRpb25Ob2RlKHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBpbmZlcnJlZFN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIGlzSW5mZXJyZWRTdWJzdGl0dXRpb25QcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIGluZmVycmVkU3Vic3RpdHV0aW9uUHJlc2VudCA9IChpbmZlcnJlZFN1YnN0aXR1dGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gaW5mZXJyZWRTdWJzdGl0dXRpb25QcmVzZW50O1xuICB9XG5cbiAgaXNJbmZlcnJlZFN1YnN0aXR1dGlvblByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpIHtcbiAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZShtZXRhdmFyaWFibGVOb2RlLCBzdWJzdGl0dXRpb25Ob2RlKSxcbiAgICAgICAgICBpbmZlcnJlZFN1YnN0aXR1dGlvblByZXNlbnQgPSAoaW5mZXJyZWRTdWJzdGl0dXRpb24gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGluZmVycmVkU3Vic3RpdHV0aW9uUHJlc2VudDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTm90aGluZyhjb250ZXh0KSB7XG4gICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb25zID0gW10sXG4gICAgICAgICAgbGltaW5hbENvbnRleHQgPSBuZXcgTGltaW5hbENvbnRleHQoY29udGV4dCwgaW5mZXJyZWRTdWJzdGl0dXRpb25zKTtcblxuICAgIHJldHVybiBsaW1pbmFsQ29udGV4dDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkxpbWluYWxDb250ZXh0IiwiZm9yRWFjaCIsImNvbnRpbnVhdGlvblV0aWxpdGllcyIsInB1c2giLCJmaW5kIiwiZmlyc3QiLCJhcnJheVV0aWxpdGllcyIsIkNvbnRleHQiLCJjb250ZXh0IiwiaW5mZXJyZWRTdWJzdGl0dXRpb25zIiwiZ2V0SW5mZXJyZWRTdWJzdGl0dXRpb25zIiwiZ2V0Q29udGV4dCIsImdldFNvbGVJbmZlcnJlZFN1YnN0aXR1dGlvbiIsInNvbGVJbmZlcnJlZFN1YnN0aXR1dGlvbiIsImluZmVycmVkU3Vic3RpdHV0aW9uc0xlbmd0aCIsImxlbmd0aCIsImZpcnN0SW5mZXJyZWRTdWJzdGl0dXRpb24iLCJnZXRTaW5ndWxhck5vblRyaXZpYWxJbmZlcnJlZFN1YnN0aXR1dGlvbiIsInNpbmd1bGFyTm9uVHJpdmlhbEluZmVycmVkU3Vic3RpdHV0aW9uIiwic29sZUluZmVycmVkU3Vic3RpdHV0aW9uTm9uVHJpdmlhbCIsImlzTm9uVHJpdmlhbCIsImFkZFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsImFkZEluZmVycmVkU3Vic3RpdHV0aW9uIiwiaW5mZXJyZWRTdWJzdGl0dXRpb24iLCJpbmZlcnJlZFN1YnN0aXR1dGlvbkEiLCJpbmZlcnJlZFN1YnN0aXR1dGlvblN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwiaW5mZXJyZWRTdWJzdGl0dXRpb25CIiwiaW5mZXJyZWRTdWJzdGl0dXRpb25BRXF1YWxUb0luZmVycmVkU3Vic3RpdHV0aW9uQiIsImlzRXF1YWxUbyIsImRlYnVnIiwiYWRkSW5mZXJyZWRTdWJzdGl0dXRpb25zIiwic29sdmVJbmZlcnJlZFN1YnN0aXR1dGlvbnMiLCJmb3J3YXJkIiwiYmFjayIsIm1ldGF2YXJpYWJsZU5vZGVzIiwibWV0YXZhcmlhYmxlTm9kZXNGcm9tSW5mZXJyZWRTdWJzdGl0dXRpb25zIiwibWV0YXZhcmlhYmxlTm9kZSIsImNvbXBsZXhJbmZlcnJlZFN1YnN0aXR1dGlvbnMiLCJmaW5kQ29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uc0J5TWV0YXZhcmlhYmxlTm9kZSIsImNvbXBsZXhJbmZlcnJlZFN1YnN0aXR1dGlvbiIsInNvbHZlZCIsImlzU29sdmVkIiwic29sdmUiLCJhcmVDb21wbGV4U3Vic3RpdHV0aW9uc1Vuc29sdmVkIiwiaW5mZXJyZWRTdWJzdGl0dXRpb25zU29sdmVkIiwiYXJlSW5mZXJyZWRTdWJzdGl0dXRpb25zU29sdmVkIiwiY29tcGxleFN1YnN0aXR1dGlvbnNVbnNvbHZlZCIsImV2ZXJ5IiwiY29tcGxleEluZmVycmVkU3Vic3RpdHV0aW9uc1NvbHZlZCIsImNvbXBsZXhJbmZlcnJlZFN1YnN0aXR1dGlvblNvbHZlZCIsImlzRW1wdHkiLCJlbXB0eSIsIm1lcmdlIiwiZmluZEluZmVycmVkU3Vic3RpdHV0aW9uIiwiY2FsbGJhY2siLCJmaW5kSW5mZXJyZWRTdWJzdGl0dXRpb25zIiwiZmluZEluZmVycmVkU3Vic3RpdHV0aW9uQnlWYXJpYWJsZU5vZGUiLCJ2YXJpYWJsZU5vZGUiLCJ2YXJpYWJsZU5vZGVNYXRjaGVzIiwibWF0Y2hWYXJpYWJsZU5vZGUiLCJmaW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUiLCJzaW1wbGVJbmZlcnJlZFN1YnN0aXR1dGlvbiIsImZpbmRTaW1wbGVJbmZlcnJlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZSIsImluZmVycmVkU3Vic3RpdHV0aW9uU2ltcGxlIiwiaXNTaW1wbGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImluZmVycmVkU3Vic3RpdHV0aW9uQ29tcGxleCIsImlzQ29tcGxleCIsImZpbmRJbmZlcnJlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZUFuZFN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaFN1YnN0aXR1dGlvbk5vZGUiLCJpc0luZmVycmVkU3Vic3RpdHV0aW9uUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZSIsImluZmVycmVkU3Vic3RpdHV0aW9uUHJlc2VudCIsImlzSW5mZXJyZWRTdWJzdGl0dXRpb25QcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZSIsImZyb21Ob3RoaW5nIiwibGltaW5hbENvbnRleHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVlBOzs7ZUFBcUJBOzs7MkJBVlU7Z0NBQ087Z0VBRWxCOytCQUV1Qzs7Ozs7O0FBRTNELE1BQU0sRUFBRUMsT0FBTyxFQUFFLEdBQUdDLHFDQUFxQixFQUNuQyxFQUFFQyxJQUFJLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFLEdBQUdDLHlCQUFjO0FBRTdCLE1BQU1OLHVCQUF1Qk8sZ0JBQU87SUFDakQsWUFBWUMsT0FBTyxFQUFFQyxxQkFBcUIsQ0FBRTtRQUMx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
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2xpbWluYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuaW1wb3J0IHsgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwiLi4vY29udGV4dFwiO1xuXG5pbXBvcnQgeyBtZXRhdmFyaWFibGVOb2Rlc0Zyb21EZXJpdmVkU3Vic3RpdHV0aW9ucyB9IGZyb20gXCIuLi91dGlsaXRpZXMvc3Vic3RpdHV0aW9uc1wiO1xuXG5jb25zdCB7IGZvckVhY2ggfSA9IGNvbnRpbnVhdGlvblV0aWxpdGllcyxcbiAgICAgIHsgcHVzaCwgZmluZCwgZmlyc3QgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaW1pbmFsQ29udGV4dCBleHRlbmRzIENvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBkZXJpdmVkU3Vic3RpdHV0aW9ucykge1xuICAgIHN1cGVyKGNvbnRleHQpO1xuXG4gICAgdGhpcy5kZXJpdmVkU3Vic3RpdHV0aW9ucyA9IGRlcml2ZWRTdWJzdGl0dXRpb25zO1xuICB9XG5cbiAgZ2V0RGVyaXZlZFN1YnN0aXR1dGlvbnMoZGVyaXZlZFN1YnN0aXR1dGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goZGVyaXZlZFN1YnN0aXR1dGlvbnMsIHRoaXMuZGVyaXZlZFN1YnN0aXR1dGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXREZXJpdmVkU3Vic3RpdHV0aW9ucyhkZXJpdmVkU3Vic3RpdHV0aW9ucyk7XG5cbiAgICByZXR1cm4gZGVyaXZlZFN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBnZXRTb2xlRGVyaXZlZFN1YnN0aXR1dGlvbigpIHtcbiAgICBsZXQgc29sZURlcml2ZWRTdWJzdGl0dXRpb24gPSBudWxsO1xuXG4gICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbnNMZW5ndGggPSB0aGlzLmRlcml2ZWRTdWJzdGl0dXRpb25zLmxlbmd0aDtcblxuICAgIGlmIChkZXJpdmVkU3Vic3RpdHV0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3REZXJpdmVkU3Vic3RpdHV0aW9uID0gZmlyc3QodGhpcy5kZXJpdmVkU3Vic3RpdHV0aW9ucyk7XG5cbiAgICAgIHNvbGVEZXJpdmVkU3Vic3RpdHV0aW9uID0gZmlyc3REZXJpdmVkU3Vic3RpdHV0aW9uOyAvLy9cbiAgICB9XG5cbiAgICByZXR1cm4gc29sZURlcml2ZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBnZXRTaW5ndWxhck5vblRyaXZpYWxEZXJpdmVkU3Vic3RpdHV0aW9uKCkge1xuICAgIGxldCBzaW5ndWxhck5vblRyaXZpYWxEZXJpdmVkU3Vic3RpdHV0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IHNvbGVEZXJpdmVkU3Vic3RpdHV0aW9uID0gdGhpcy5nZXRTb2xlRGVyaXZlZFN1YnN0aXR1dGlvbigpO1xuXG4gICAgaWYgKHNvbGVEZXJpdmVkU3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzb2xlRGVyaXZlZFN1YnN0aXR1dGlvbk5vblRyaXZpYWwgPSBzb2xlRGVyaXZlZFN1YnN0aXR1dGlvbi5pc05vblRyaXZpYWwoKTtcblxuICAgICAgaWYgKHNvbGVEZXJpdmVkU3Vic3RpdHV0aW9uTm9uVHJpdmlhbCkge1xuICAgICAgICBzaW5ndWxhck5vblRyaXZpYWxEZXJpdmVkU3Vic3RpdHV0aW9uID0gc29sZURlcml2ZWRTdWJzdGl0dXRpb247ICAvLy9cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2luZ3VsYXJOb25Ucml2aWFsRGVyaXZlZFN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIGFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICAvLy9cbiAgfVxuXG4gIGFkZERlcml2ZWRTdWJzdGl0dXRpb24oZGVyaXZlZFN1YnN0aXR1dGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBkZXJpdmVkU3Vic3RpdHV0aW9uQSA9IGRlcml2ZWRTdWJzdGl0dXRpb24sIC8vL1xuICAgICAgICAgIGRlcml2ZWRTdWJzdGl0dXRpb25TdHJpbmcgPSBkZXJpdmVkU3Vic3RpdHV0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtkZXJpdmVkU3Vic3RpdHV0aW9uU3RyaW5nfScgZGVyaXZlZCBzdWJzdGl0dXRpb24gdG8gdGhlIGxpbWluYWwgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbkIgPSB0aGlzLmRlcml2ZWRTdWJzdGl0dXRpb25zLmZpbmQoKGRlcml2ZWRTdWJzdGl0dXRpb24pID0+IHtcbiAgICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25CID0gZGVyaXZlZFN1YnN0aXR1dGlvbiwgLy8vXG4gICAgICAgICAgICBkZXJpdmVkU3Vic3RpdHV0aW9uQUVxdWFsVG9EZXJpdmVkU3Vic3RpdHV0aW9uQiA9IGRlcml2ZWRTdWJzdGl0dXRpb25BLmlzRXF1YWxUbyhkZXJpdmVkU3Vic3RpdHV0aW9uQik7XG5cbiAgICAgIGlmIChkZXJpdmVkU3Vic3RpdHV0aW9uQUVxdWFsVG9EZXJpdmVkU3Vic3RpdHV0aW9uQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb25CICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGBUaGUgJyR7ZGVyaXZlZFN1YnN0aXR1dGlvblN0cmluZ30nIGRlcml2ZWQgc3Vic3RpdHV0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIGxpbWluYWwgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZXJpdmVkU3Vic3RpdHV0aW9ucy5wdXNoKGRlcml2ZWRTdWJzdGl0dXRpb24pO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtkZXJpdmVkU3Vic3RpdHV0aW9uU3RyaW5nfScgZGVyaXZlZCBzdWJzdGl0dXRpb24gdG8gdGhlIGxpbWluYWwgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZERlcml2ZWRTdWJzdGl0dXRpb25zKGRlcml2ZWRTdWJzdGl0dXRpb25zKSB7XG4gICAgZGVyaXZlZFN1YnN0aXR1dGlvbnMuZm9yRWFjaCgoZGVyaXZlZFN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgdGhpcy5hZGREZXJpdmVkU3Vic3RpdHV0aW9uKGRlcml2ZWRTdWJzdGl0dXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgc29sdmVEZXJpdmVkU3Vic3RpdHV0aW9ucyhmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldERlcml2ZWRTdWJzdGl0dXRpb25zKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZXMgPSBtZXRhdmFyaWFibGVOb2Rlc0Zyb21EZXJpdmVkU3Vic3RpdHV0aW9ucyhkZXJpdmVkU3Vic3RpdHV0aW9ucyk7XG5cbiAgICByZXR1cm4gZm9yRWFjaChtZXRhdmFyaWFibGVOb2RlcywgKG1ldGF2YXJpYWJsZU5vZGUsIGZvcndhcmQsIGJhY2spID0+IHtcbiAgICAgIGNvbnN0IGNvbXBsZXhEZXJpdmVkU3Vic3RpdHV0aW9ucyA9IHRoaXMuZmluZENvbXBsZXhEZXJpdmVkU3Vic3RpdHV0aW9uc0J5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgcmV0dXJuIGZvckVhY2goY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb25zLCAoY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb24sIGZvcndhcmQsIGJhY2spID0+IHtcbiAgICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbiA9IGNvbXBsZXhEZXJpdmVkU3Vic3RpdHV0aW9uLCAvLy9cbiAgICAgICAgICAgICAgc29sdmVkID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5pc1NvbHZlZCgpO1xuXG4gICAgICAgIGlmIChzb2x2ZWQpIHtcbiAgICAgICAgICByZXR1cm4gZm9yd2FyZChiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzOyAvLy9cblxuICAgICAgICByZXR1cm4gZGVyaXZlZFN1YnN0aXR1dGlvbi5zb2x2ZShjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgICAgIHJldHVybiBmb3J3YXJkKGJhY2spO1xuICAgICAgICB9LCBiYWNrKTtcbiAgICAgIH0sIGZvcndhcmQsIGJhY2spO1xuICAgIH0sIGZvcndhcmQsIGJhY2spO1xuICB9XG5cbiAgYXJlQ29tcGxleFN1YnN0aXR1dGlvbnNVbnNvbHZlZCgpIHtcbiAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uc1NvbHZlZCA9IHRoaXMuYXJlRGVyaXZlZFN1YnN0aXR1dGlvbnNTb2x2ZWQoKSxcbiAgICAgICAgICBjb21wbGV4U3Vic3RpdHV0aW9uc1Vuc29sdmVkID0gIWRlcml2ZWRTdWJzdGl0dXRpb25zU29sdmVkO1xuXG4gICAgcmV0dXJuIGNvbXBsZXhTdWJzdGl0dXRpb25zVW5zb2x2ZWQ7XG4gIH1cblxuICBhcmVEZXJpdmVkU3Vic3RpdHV0aW9uc1NvbHZlZCgpIHtcbiAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9ucyA9IHRoaXMuZ2V0RGVyaXZlZFN1YnN0aXR1dGlvbnMoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlcyA9IG1ldGF2YXJpYWJsZU5vZGVzRnJvbURlcml2ZWRTdWJzdGl0dXRpb25zKGRlcml2ZWRTdWJzdGl0dXRpb25zKSxcbiAgICAgICAgICBkZXJpdmVkU3Vic3RpdHV0aW9uc1NvbHZlZCA9IG1ldGF2YXJpYWJsZU5vZGVzLmV2ZXJ5KChtZXRhdmFyaWFibGVOb2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbnMgPSB0aGlzLmZpbmRDb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbnNCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgICAgICAgICBjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbnNTb2x2ZWQgPSBjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbnMuZXZlcnkoKGNvbXBsZXhEZXJpdmVkU3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhEZXJpdmVkU3Vic3RpdHV0aW9uU29sdmVkID0gY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb24uaXNTb2x2ZWQoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb25Tb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbnNTb2x2ZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZGVyaXZlZFN1YnN0aXR1dGlvbnNTb2x2ZWQ7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25zTGVuZ3RoID0gdGhpcy5kZXJpdmVkU3Vic3RpdHV0aW9ucy5sZW5ndGgsXG4gICAgICAgICAgZW1wdHkgPSAoZGVyaXZlZFN1YnN0aXR1dGlvbnNMZW5ndGggPT09IDApO1xuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgbWVyZ2UoY29udGV4dCkge1xuICAgIGNvbnRleHQuZGVidWcoYE1lcmdpbmcgdGhlIGxpbWluYWwgY29udGV4dGApO1xuXG4gICAgY29udGV4dC5hZGREZXJpdmVkU3Vic3RpdHV0aW9ucyh0aGlzLmRlcml2ZWRTdWJzdGl0dXRpb25zKTtcbiAgfVxuXG4gIGZpbmREZXJpdmVkU3Vic3RpdHV0aW9uKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldERlcml2ZWRTdWJzdGl0dXRpb25zKCksXG4gICAgICAgICAgZGVyaXZlZFN1YnN0aXR1dGlvbiA9IGRlcml2ZWRTdWJzdGl0dXRpb25zLmZpbmQoY2FsbGJhY2spO1xuXG4gICAgcmV0dXJuIGRlcml2ZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBmaW5kRGVyaXZlZFN1YnN0aXR1dGlvbnMoY2FsbGJhY2spIHtcbiAgICBsZXQgZGVyaXZlZFN1YnN0aXR1dGlvbnM7XG5cbiAgICBkZXJpdmVkU3Vic3RpdHV0aW9ucyA9IHRoaXMuZ2V0RGVyaXZlZFN1YnN0aXR1dGlvbnMoKTtcblxuICAgIGRlcml2ZWRTdWJzdGl0dXRpb25zID0gZmluZChkZXJpdmVkU3Vic3RpdHV0aW9ucywgY2FsbGJhY2spOyAgLy8vXG5cbiAgICByZXR1cm4gZGVyaXZlZFN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBmaW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5VmFyaWFibGVOb2RlKHZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb24gPSB0aGlzLmZpbmREZXJpdmVkU3Vic3RpdHV0aW9uKChkZXJpdmVkU3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICBjb25zdCB2YXJpYWJsZU5vZGVNYXRjaGVzID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5tYXRjaFZhcmlhYmxlTm9kZSh2YXJpYWJsZU5vZGUpO1xuXG4gICAgICBpZiAodmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGRlcml2ZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBmaW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3Qgc2ltcGxlRGVyaXZlZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZFNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgZGVyaXZlZFN1YnN0aXR1dGlvbiA9IHNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb247ICAvLy9cblxuICAgIHJldHVybiBkZXJpdmVkU3Vic3RpdHV0aW9uO1xuICB9XG5cbiAgZmluZFNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IHNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb24gPSB0aGlzLmZpbmREZXJpdmVkU3Vic3RpdHV0aW9uKChkZXJpdmVkU3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uU2ltcGxlID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5pc1NpbXBsZSgpO1xuXG4gICAgICBpZiAoZGVyaXZlZFN1YnN0aXR1dGlvblNpbXBsZSkge1xuICAgICAgICBjb25zdCBzaW1wbGVEZXJpdmVkU3Vic3RpdHV0aW9uID0gZGVyaXZlZFN1YnN0aXR1dGlvbiwgIC8vL1xuICAgICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb24ubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzaW1wbGVEZXJpdmVkU3Vic3RpdHV0aW9uO1xuICB9XG5cbiAgZmluZENvbXBsZXhEZXJpdmVkU3Vic3RpdHV0aW9uc0J5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb24gPSB0aGlzLmZpbmREZXJpdmVkU3Vic3RpdHV0aW9ucygoZGVyaXZlZFN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbkNvbXBsZXggPSBkZXJpdmVkU3Vic3RpdHV0aW9uLmlzQ29tcGxleCgpO1xuXG4gICAgICBpZiAoZGVyaXZlZFN1YnN0aXR1dGlvbkNvbXBsZXgpIHtcbiAgICAgICAgY29uc3QgY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb24gPSBkZXJpdmVkU3Vic3RpdHV0aW9uLCAgLy8vXG4gICAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb24ubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIGZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZShtZXRhdmFyaWFibGVOb2RlLCBzdWJzdGl0dXRpb25Ob2RlKSB7XG4gICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZERlcml2ZWRTdWJzdGl0dXRpb24oKGRlcml2ZWRTdWJzdGl0dXRpb24pID0+IHsgIC8vL1xuICAgICAgICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBkZXJpdmVkU3Vic3RpdHV0aW9uLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbk5vZGVNYXRjaGVzID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5tYXRjaFN1YnN0aXR1dGlvbk5vZGUoc3Vic3RpdHV0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGRlcml2ZWRTdWJzdGl0dXRpb247XG4gIH1cblxuICBpc0Rlcml2ZWRTdWJzdGl0dXRpb25QcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uID0gdGhpcy5maW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBkZXJpdmVkU3Vic3RpdHV0aW9uUHJlc2VudCA9IChkZXJpdmVkU3Vic3RpdHV0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBkZXJpdmVkU3Vic3RpdHV0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzRGVyaXZlZFN1YnN0aXR1dGlvblByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpIHtcbiAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uID0gdGhpcy5maW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZUFuZFN1YnN0aXR1dGlvbk5vZGUobWV0YXZhcmlhYmxlTm9kZSwgc3Vic3RpdHV0aW9uTm9kZSksXG4gICAgICAgICAgZGVyaXZlZFN1YnN0aXR1dGlvblByZXNlbnQgPSAoZGVyaXZlZFN1YnN0aXR1dGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZGVyaXZlZFN1YnN0aXR1dGlvblByZXNlbnQ7XG4gIH1cblxuICBzdGF0aWMgZnJvbU5vdGhpbmcoY29udGV4dCkge1xuICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25zID0gW10sXG4gICAgICAgICAgbGltaW5hbENvbnRleHQgPSBuZXcgTGltaW5hbENvbnRleHQoY29udGV4dCwgZGVyaXZlZFN1YnN0aXR1dGlvbnMpO1xuXG4gICAgcmV0dXJuIGxpbWluYWxDb250ZXh0O1xuICB9XG59XG4iXSwibmFtZXMiOlsiTGltaW5hbENvbnRleHQiLCJmb3JFYWNoIiwiY29udGludWF0aW9uVXRpbGl0aWVzIiwicHVzaCIsImZpbmQiLCJmaXJzdCIsImFycmF5VXRpbGl0aWVzIiwiQ29udGV4dCIsImNvbnRleHQiLCJkZXJpdmVkU3Vic3RpdHV0aW9ucyIsImdldERlcml2ZWRTdWJzdGl0dXRpb25zIiwiZ2V0Q29udGV4dCIsImdldFNvbGVEZXJpdmVkU3Vic3RpdHV0aW9uIiwic29sZURlcml2ZWRTdWJzdGl0dXRpb24iLCJkZXJpdmVkU3Vic3RpdHV0aW9uc0xlbmd0aCIsImxlbmd0aCIsImZpcnN0RGVyaXZlZFN1YnN0aXR1dGlvbiIsImdldFNpbmd1bGFyTm9uVHJpdmlhbERlcml2ZWRTdWJzdGl0dXRpb24iLCJzaW5ndWxhck5vblRyaXZpYWxEZXJpdmVkU3Vic3RpdHV0aW9uIiwic29sZURlcml2ZWRTdWJzdGl0dXRpb25Ob25Ucml2aWFsIiwiaXNOb25Ucml2aWFsIiwiYWRkU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwiYWRkRGVyaXZlZFN1YnN0aXR1dGlvbiIsImRlcml2ZWRTdWJzdGl0dXRpb24iLCJkZXJpdmVkU3Vic3RpdHV0aW9uQSIsImRlcml2ZWRTdWJzdGl0dXRpb25TdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsImRlcml2ZWRTdWJzdGl0dXRpb25CIiwiZGVyaXZlZFN1YnN0aXR1dGlvbkFFcXVhbFRvRGVyaXZlZFN1YnN0aXR1dGlvbkIiLCJpc0VxdWFsVG8iLCJkZWJ1ZyIsImFkZERlcml2ZWRTdWJzdGl0dXRpb25zIiwic29sdmVEZXJpdmVkU3Vic3RpdHV0aW9ucyIsImZvcndhcmQiLCJiYWNrIiwibWV0YXZhcmlhYmxlTm9kZXMiLCJtZXRhdmFyaWFibGVOb2Rlc0Zyb21EZXJpdmVkU3Vic3RpdHV0aW9ucyIsIm1ldGF2YXJpYWJsZU5vZGUiLCJjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbnMiLCJmaW5kQ29tcGxleERlcml2ZWRTdWJzdGl0dXRpb25zQnlNZXRhdmFyaWFibGVOb2RlIiwiY29tcGxleERlcml2ZWRTdWJzdGl0dXRpb24iLCJzb2x2ZWQiLCJpc1NvbHZlZCIsInNvbHZlIiwiYXJlQ29tcGxleFN1YnN0aXR1dGlvbnNVbnNvbHZlZCIsImRlcml2ZWRTdWJzdGl0dXRpb25zU29sdmVkIiwiYXJlRGVyaXZlZFN1YnN0aXR1dGlvbnNTb2x2ZWQiLCJjb21wbGV4U3Vic3RpdHV0aW9uc1Vuc29sdmVkIiwiZXZlcnkiLCJjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvbnNTb2x2ZWQiLCJjb21wbGV4RGVyaXZlZFN1YnN0aXR1dGlvblNvbHZlZCIsImlzRW1wdHkiLCJlbXB0eSIsIm1lcmdlIiwiZmluZERlcml2ZWRTdWJzdGl0dXRpb24iLCJjYWxsYmFjayIsImZpbmREZXJpdmVkU3Vic3RpdHV0aW9ucyIsImZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlWYXJpYWJsZU5vZGUiLCJ2YXJpYWJsZU5vZGUiLCJ2YXJpYWJsZU5vZGVNYXRjaGVzIiwibWF0Y2hWYXJpYWJsZU5vZGUiLCJmaW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZSIsInNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb24iLCJmaW5kU2ltcGxlRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZSIsImRlcml2ZWRTdWJzdGl0dXRpb25TaW1wbGUiLCJpc1NpbXBsZSIsIm1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzIiwibWF0Y2hNZXRhdmFyaWFibGVOb2RlIiwiZGVyaXZlZFN1YnN0aXR1dGlvbkNvbXBsZXgiLCJpc0NvbXBsZXgiLCJmaW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZUFuZFN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaFN1YnN0aXR1dGlvbk5vZGUiLCJpc0Rlcml2ZWRTdWJzdGl0dXRpb25QcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlIiwiZGVyaXZlZFN1YnN0aXR1dGlvblByZXNlbnQiLCJpc0Rlcml2ZWRTdWJzdGl0dXRpb25QcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZSIsImZyb21Ob3RoaW5nIiwibGltaW5hbENvbnRleHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVlBOzs7ZUFBcUJBOzs7MkJBVlU7Z0NBQ087Z0VBRWxCOytCQUVzQzs7Ozs7O0FBRTFELE1BQU0sRUFBRUMsT0FBTyxFQUFFLEdBQUdDLHFDQUFxQixFQUNuQyxFQUFFQyxJQUFJLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFLEdBQUdDLHlCQUFjO0FBRTdCLE1BQU1OLHVCQUF1Qk8sZ0JBQU87SUFDakQsWUFBWUMsT0FBTyxFQUFFQyxvQkFBb0IsQ0FBRTtRQUN6QyxLQUFLLENBQUNEO1FBRU4sSUFBSSxDQUFDQyxvQkFBb0IsR0FBR0E7SUFDOUI7SUFFQUMsd0JBQXdCRCx1QkFBdUIsRUFBRSxFQUFFO1FBQ2pELE1BQU1ELFVBQVUsSUFBSSxDQUFDRyxVQUFVO1FBRS9CUixLQUFLTSxzQkFBc0IsSUFBSSxDQUFDQSxvQkFBb0I7UUFFcERELFFBQVFFLHVCQUF1QixDQUFDRDtRQUVoQyxPQUFPQTtJQUNUO0lBRUFHLDZCQUE2QjtR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