occam-nominal 1.0.334 → 1.0.340

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/lib/context.js +5 -1
  2. package/lib/element/assertion/contained.js +4 -4
  3. package/lib/element/assertion/defined.js +3 -3
  4. package/lib/element/assertion/subproof.js +6 -6
  5. package/lib/element/assertion/type.js +3 -3
  6. package/lib/element/assumption.js +134 -111
  7. package/lib/element/combinator/bracketed.js +2 -2
  8. package/lib/element/constraint.js +114 -102
  9. package/lib/element/constructor/bracketed.js +3 -3
  10. package/lib/element/deduction.js +2 -2
  11. package/lib/element/equality.js +3 -3
  12. package/lib/element/frame.js +3 -3
  13. package/lib/element/goal.js +67 -57
  14. package/lib/element/hypothesis.js +2 -2
  15. package/lib/element/judgement.js +15 -16
  16. package/lib/element/label.js +25 -22
  17. package/lib/element/metaType.js +2 -2
  18. package/lib/element/metavariable.js +54 -45
  19. package/lib/element/parameter.js +2 -2
  20. package/lib/element/procedureCall.js +2 -2
  21. package/lib/element/procedureReference.js +2 -2
  22. package/lib/element/proofAssertion/step.js +7 -7
  23. package/lib/element/proofAssertion/supposition.js +2 -2
  24. package/lib/element/proofAssertion.js +2 -2
  25. package/lib/element/reference.js +27 -24
  26. package/lib/element/schema.js +165 -154
  27. package/lib/element/signature.js +2 -2
  28. package/lib/element/statement.js +7 -5
  29. package/lib/element/substitution/reference.js +22 -29
  30. package/lib/element/substitution/statement.js +5 -5
  31. package/lib/element/term.js +2 -2
  32. package/lib/element/typePrefix.js +2 -2
  33. package/lib/element/variable.js +2 -2
  34. package/lib/process/unification.js +41 -47
  35. package/lib/process/unify.js +10 -10
  36. package/lib/process/validate.js +6 -6
  37. package/lib/process/validation.js +13 -13
  38. package/package.json +9 -9
  39. package/src/context.js +6 -0
  40. package/src/element/assertion/contained.js +3 -3
  41. package/src/element/assertion/defined.js +2 -2
  42. package/src/element/assertion/subproof.js +5 -5
  43. package/src/element/assertion/type.js +2 -2
  44. package/src/element/assumption.js +158 -132
  45. package/src/element/combinator/bracketed.js +1 -1
  46. package/src/element/constraint.js +134 -125
  47. package/src/element/constructor/bracketed.js +2 -2
  48. package/src/element/deduction.js +1 -1
  49. package/src/element/equality.js +2 -2
  50. package/src/element/frame.js +2 -2
  51. package/src/element/goal.js +82 -74
  52. package/src/element/hypothesis.js +2 -2
  53. package/src/element/judgement.js +20 -22
  54. package/src/element/label.js +26 -25
  55. package/src/element/metaType.js +2 -2
  56. package/src/element/metavariable.js +70 -53
  57. package/src/element/parameter.js +2 -2
  58. package/src/element/procedureCall.js +2 -2
  59. package/src/element/procedureReference.js +2 -2
  60. package/src/element/proofAssertion/step.js +6 -6
  61. package/src/element/proofAssertion/supposition.js +1 -1
  62. package/src/element/proofAssertion.js +1 -1
  63. package/src/element/reference.js +28 -27
  64. package/src/element/schema.js +193 -195
  65. package/src/element/signature.js +2 -2
  66. package/src/element/statement.js +9 -5
  67. package/src/element/substitution/reference.js +22 -35
  68. package/src/element/substitution/statement.js +4 -4
  69. package/src/element/term.js +1 -1
  70. package/src/element/typePrefix.js +2 -2
  71. package/src/element/variable.js +1 -1
  72. package/src/process/unification.js +44 -59
  73. package/src/process/unify.js +9 -9
  74. package/src/process/validate.js +5 -5
  75. package/src/process/validation.js +12 -12
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "default", {
10
10
  });
11
11
  const _occamlanguages = require("occam-languages");
12
12
  const _elements = /*#__PURE__*/ _interop_require_wildcard(require("../elements"));
13
+ const _continuation = require("../utilities/continuation");
13
14
  const _context = require("../utilities/context");
14
15
  const _string = require("../utilities/string");
15
16
  const _json = require("../utilities/json");
@@ -54,7 +55,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
54
55
  }
55
56
  return newObj;
56
57
  }
57
- const { forwardsEvery } = _occamlanguages.continuationUtilities, { breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
58
+ const { every, forwardsEvery } = _occamlanguages.continuationUtilities, { breakable, breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
58
59
  const _default = (0, _elements.define)(class Schema extends _occamlanguages.Element {
59
60
  constructor(context, string, node, breakPoint, label, suppositions, deduction, proof, constraints){
60
61
  super(context, string, node, breakPoint);
@@ -91,204 +92,214 @@ const _default = (0, _elements.define)(class Schema extends _occamlanguages.Elem
91
92
  const label = this.getLabel(), labelComparesToRefference = label.compareReference(reference), comparesToReference = labelComparesToRefference; ///
92
93
  return comparesToReference;
93
94
  }
94
- async verify(context) {
95
- let verifies;
96
- await this.break(context);
95
+ verify = breakable(function(context, continuation) {
97
96
  const schemaString = this.getString(); ///
98
97
  context.trace(`Verifying the '${schemaString}' schema...`);
99
- await (0, _context.encapsulate)(async (context)=>{
100
- const labelVerifies = this.verifyLabel(context);
101
- if (labelVerifies) {
102
- const suppositionsVerify = await this.verifySuppositions(context);
103
- if (suppositionsVerify) {
104
- const deductionVerifies = await this.verifyDeduction(context);
105
- if (deductionVerifies) {
106
- const proofVerifies = await this.verifyProof(context);
107
- if (proofVerifies) {
108
- verifies = true;
109
- }
110
- }
98
+ (0, _context.encapsulate)((context)=>{
99
+ const verifyLabel = this.verifyLabel.bind(this), verifyProof = this.verifyProof.bind(this), verifyDeduction = this.verifyDeduction.bind(this), verifySuppositions = this.verifySuppositions.bind(this);
100
+ return (0, _continuation.all)([
101
+ verifyLabel,
102
+ verifySuppositions,
103
+ verifyDeduction,
104
+ verifyProof
105
+ ], context, (verifies)=>{
106
+ if (verifies) {
107
+ const schema = this; ///
108
+ context.addSchema(schema);
109
+ context.debug(`...verified the '${schemaString}' schema.`);
111
110
  }
112
- }
111
+ return continuation(verifies);
112
+ });
113
113
  }, this.constraints, context);
114
- if (verifies) {
115
- const schema = this; ///
116
- context.addSchema(schema);
117
- context.debug(`...verified the '${schemaString}' schema.`);
118
- }
119
- return verifies;
120
- }
121
- verifyLabel(context) {
122
- let labelVerifies;
114
+ });
115
+ verifyLabel(context, continuation) {
123
116
  const schemaString = this.getString(), labelString = this.label.getString();
124
117
  context.trace(`Verifying the '${schemaString}' schema's '${labelString}' label...`);
125
- labelVerifies = this.label.verify();
126
- if (labelVerifies) {
127
- context.debug(`...verified the '${schemaString}' schema's '${labelString}' label.`);
128
- }
129
- return labelVerifies;
118
+ return this.label.verify((labelVerifies)=>{
119
+ if (labelVerifies) {
120
+ context.debug(`...verified the '${schemaString}' schema's '${labelString}' label.`);
121
+ }
122
+ return continuation(labelVerifies);
123
+ });
130
124
  }
131
- async verifyProof(context) {
132
- let proofVerifies;
125
+ verifyProof(context, continuation) {
133
126
  const schemaString = this.getString(); ///
134
127
  context.trace(`Verifying the '${schemaString}' schema's proof...`);
135
128
  const statement = this.deduction.getStatement();
136
- proofVerifies = await this.proof.verify(statement, context);
137
- if (proofVerifies) {
138
- context.debug(`...verified the '${schemaString}' schema's proof.`);
139
- }
140
- return proofVerifies;
129
+ return this.proof.verify(statement, context, (proofVerifies)=>{
130
+ if (proofVerifies) {
131
+ context.debug(`...verified the '${schemaString}' schema's proof.`);
132
+ }
133
+ return continuation(proofVerifies);
134
+ });
141
135
  }
142
- async verifyDeduction(context) {
143
- let deductionVerifies;
136
+ verifyDeduction(context, continuation) {
144
137
  const schemaString = this.getString(), deductionString = this.deduction.getString();
145
138
  context.trace(`Verifying the '${schemaString}' top level meta assertion's '${deductionString}' deduction...`);
146
- deductionVerifies = await this.deduction.verify(context);
147
- if (deductionVerifies) {
148
- context.debug(`...verified the '${schemaString}' top level meta assertion's '${deductionString}' deduction.`);
149
- }
150
- return deductionVerifies;
151
- }
152
- async verifySupposition(supposition, context) {
153
- let suppositionVerifies;
154
- const schemaString = this.getString(), suppositionString = supposition.getString();
155
- context.trace(`Verifying the '${schemaString}' schema's '${suppositionString}' supposition...`);
156
- suppositionVerifies = await supposition.verify(context);
157
- if (suppositionVerifies) {
158
- const subproofOrProofAssertion = supposition; ////
159
- context.assignAssignments();
160
- context.addSubproofOrProofAssertion(subproofOrProofAssertion);
161
- }
162
- if (suppositionVerifies) {
163
- context.debug(`...verified the '${schemaString}' schema's '${suppositionString}' supposition.`);
164
- }
165
- return suppositionVerifies;
139
+ return this.deduction.verify(context, (deductionVerifies)=>{
140
+ if (deductionVerifies) {
141
+ context.debug(`...verified the '${schemaString}' top level meta assertion's '${deductionString}' deduction.`);
142
+ }
143
+ return continuation(deductionVerifies);
144
+ });
166
145
  }
167
- async verifySuppositions(context) {
168
- let suppositionsVerify;
146
+ verifySuppositions(context, continuation) {
169
147
  const schemaString = this.getString(); ///
170
148
  context.trace(`Verifying the '${schemaString}' schema's suppositions...`);
171
- suppositionsVerify = await forwardsEvery(this.suppositions, async (supposition)=>{
172
- const suppositionVerifies = await this.verifySupposition(supposition, context);
149
+ return forwardsEvery(this.suppositions, (supposition, continuation)=>{
150
+ return this.verifySupposition(supposition, context, continuation);
151
+ }, (suppositionsVerify)=>{
152
+ if (suppositionsVerify) {
153
+ context.debug(`...verified the '${schemaString}' schema's suppositions.`);
154
+ }
155
+ return continuation(suppositionsVerify);
156
+ });
157
+ }
158
+ verifySupposition(supposition, context, continuation) {
159
+ const schemaString = this.getString(), suppositionString = supposition.getString();
160
+ context.trace(`Verifying the '${schemaString}' schema's '${suppositionString}' supposition...`);
161
+ return supposition.verify(context, (suppositionVerifies)=>{
162
+ if (suppositionVerifies) {
163
+ const subproofOrProofAssertion = supposition; ////
164
+ context.assignAssignments();
165
+ context.addSubproofOrProofAssertion(subproofOrProofAssertion);
166
+ }
173
167
  if (suppositionVerifies) {
174
- return true;
168
+ context.debug(`...verified the '${schemaString}' schema's '${suppositionString}' supposition.`);
175
169
  }
170
+ return continuation(suppositionVerifies);
176
171
  });
177
- if (suppositionsVerify) {
178
- context.debug(`...verified the '${schemaString}' schema's suppositions.`);
179
- }
180
- return suppositionsVerify;
181
172
  }
182
- unifyJudgement(judgement, context) {
183
- let judgementUnifies = false;
173
+ unifyJudgement(judgement, context, continuation) {
184
174
  const schemaString = this.getString(), judgementString = judgement.getString();
185
175
  context.trace(`Unifying the '${judgementString}' judgement with the '${schemaString}' schema...`);
186
176
  (0, _context.reconcile)((context)=>{
187
- const reference = judgement.getReference(), referenceUnifies = this.unifyReference(reference, context);
188
- if (referenceUnifies) {
189
- let statementUnifies = false;
190
- const statement = judgement.getStatement(), conditional = this.isConditional(), subproofAssertion = subproofAssertionFromStatement(statement, context);
191
- if (conditional) {
192
- if (subproofAssertion !== null) {
193
- const subproofassertionUnifies = this.unifySubproofAssertion(subproofAssertion, context);
194
- if (subproofassertionUnifies) {
195
- statementUnifies = true;
196
- }
177
+ const reference = judgement.getReference();
178
+ return this.unifyReference(reference, context, (referenceUnifies)=>{
179
+ if (!referenceUnifies) {
180
+ const judgementUnifies = false;
181
+ return continuation(judgementUnifies);
182
+ }
183
+ const assumptions = judgement.getAssumptions(context);
184
+ return this.unifyAssumptions(assumptions, context, (assumptionsUnify)=>{
185
+ if (!assumptionsUnify) {
186
+ const judgementUnifies = false;
187
+ return continuation(judgementUnifies);
197
188
  }
198
- } else {
199
- if (subproofAssertion === null) {
200
- const deducedStatment = statement, deducedStatmentUnfifies = this.unifyDeducedStatement(deducedStatment, context);
201
- if (deducedStatmentUnfifies) {
202
- statementUnifies = true;
189
+ const statement = judgement.getStatement(), conditional = this.isConditional(), subproofAssertion = subproofAssertionFromStatement(statement, context);
190
+ if (conditional) {
191
+ if (subproofAssertion === null) {
192
+ const judgementUnifies = false;
193
+ return continuation(judgementUnifies);
203
194
  }
195
+ return this.unifySubproofAssertion(subproofAssertion, context, (subproofassertionUnifies)=>{
196
+ let judgementUnifies = false;
197
+ if (subproofassertionUnifies) {
198
+ judgementUnifies = true;
199
+ }
200
+ if (judgementUnifies) {
201
+ context.debug(`...unified the '${judgementString}' judgement with the '${schemaString}' schema.`);
202
+ }
203
+ return continuation(judgementUnifies);
204
+ });
204
205
  }
205
- }
206
- if (statementUnifies) {
207
- const assumptions = judgement.getAssumptions(context), assumptionsUnify = this.unifyAssumptions(assumptions, context);
208
- if (assumptionsUnify) {
209
- judgementUnifies = true;
206
+ if (subproofAssertion !== null) {
207
+ const judgementUnifies = false;
208
+ return continuation(judgementUnifies);
210
209
  }
211
- }
212
- }
210
+ const deducedStatment = statement; ///
211
+ return this.unifyDeducedStatement(deducedStatment, context, (deducedStatmentUnfifies)=>{
212
+ let judgementUnifies = false;
213
+ if (deducedStatmentUnfifies) {
214
+ judgementUnifies = true;
215
+ }
216
+ if (judgementUnifies) {
217
+ context.debug(`...unified the '${judgementString}' judgement with the '${schemaString}' schema.`);
218
+ }
219
+ return continuation(judgementUnifies);
220
+ });
221
+ });
222
+ });
213
223
  }, context);
214
- if (judgementUnifies) {
215
- context.debug(`...unified the '${judgementString}' judgement with the '${schemaString}' schema.`);
216
- }
217
- return judgementUnifies;
218
224
  }
219
- unifyReference(reference, context) {
220
- let referenceUnifies;
225
+ unifyReference(reference, context, continuation) {
221
226
  const schemaString = this.getString(), referenceString = reference.getString();
222
227
  context.trace(`Unifying the '${referenceString}' reference with the '${schemaString}' schema...`);
223
- referenceUnifies = this.label.unifyReference(reference, context);
224
- if (referenceUnifies) {
225
- context.debug(`...unified the '${referenceString}' reference with the '${schemaString}' schema.`);
226
- }
227
- return referenceUnifies;
228
- }
229
- unifyAssumptions(assumptions, context) {
230
- const assumptionsUnify = this.constraints.every((constraint)=>{
231
- const assumptionsUnify = constraint.unifyAssumptions(assumptions, context);
232
- if (assumptionsUnify) {
233
- return true;
228
+ return this.label.unifyReference(reference, context, (referenceUnifies)=>{
229
+ if (referenceUnifies) {
230
+ context.debug(`...unified the '${referenceString}' reference with the '${schemaString}' schema.`);
234
231
  }
232
+ return continuation(referenceUnifies);
235
233
  });
236
- return assumptionsUnify;
237
234
  }
238
- async unifyDeducedStatement(deducedStatement, context) {
239
- let deducedStatementUnifies = false;
235
+ unifyAssumptions(assumptions, context, continuation) {
236
+ every(this.constraints, (constraint, continuation)=>{
237
+ constraint.unifyAssumptions(assumptions, context, continuation);
238
+ }, continuation);
239
+ }
240
+ unifyDeducedStatement(deducedStatement, context, continuation) {
240
241
  const deductionString = this.deduction.getString(), deducedStatementString = deducedStatement.getString();
241
242
  context.trace(`Unifying the '${deducedStatementString}' deduced statement with the '${deductionString}' deductino...`);
242
- const deductionContext = this.deduction.getContext(), statement = deducedStatement, generalContext = deductionContext, specificContext = context, statementUnifies = await this.deduction.unifyStatement(statement, generalContext, specificContext);
243
- if (statementUnifies) {
244
- deducedStatementUnifies = true;
245
- }
246
- if (deducedStatementUnifies) {
247
- context.debug(`...unified the '${deducedStatementString}' deduced statement with the '${deductionString}' deduction`);
248
- }
249
- return deducedStatementUnifies;
243
+ const deductionContext = this.deduction.getContext(), statement = deducedStatement, generalContext = deductionContext, specificContext = context; ///
244
+ return this.deduction.unifyStatement(statement, generalContext, specificContext, (statementUnifies)=>{
245
+ let deducedStatementUnifies = false;
246
+ if (statementUnifies) {
247
+ deducedStatementUnifies = true;
248
+ }
249
+ if (deducedStatementUnifies) {
250
+ context.debug(`...unified the '${deducedStatementString}' deduced statement with the '${deductionString}' deduction`);
251
+ }
252
+ return continuation(deducedStatementUnifies);
253
+ });
250
254
  }
251
- unifySubproofAssertion(subproofAssertion, context) {
252
- let subproofAssertionUnifies = false;
255
+ unifySubproofAssertion(subproofAssertion, context, continuation) {
253
256
  const schemaString = this.getString(), subproofAssertionString = subproofAssertion.getString();
254
257
  context.trace(`Unifying the '${subproofAssertionString}' subproof assertion with the '${schemaString}' schema...`);
255
- const deducedStatement = subproofAssertion.getDeducedStatement(), deducedStatementUnifies = this.unifyDeducedStatement(deducedStatement, context);
256
- if (deducedStatementUnifies) {
257
- const supposedStatements = subproofAssertion.getSupposedStatements(), supposedStatementsUnify = this.unifySupposedStatements(supposedStatements, context);
258
- if (supposedStatementsUnify) {
259
- subproofAssertionUnifies = true;
258
+ const deducedStatement = subproofAssertion.getDeducedStatement();
259
+ return this.unifyDeducedStatement(deducedStatement, context, (deducedStatementUnifies)=>{
260
+ if (!deducedStatementUnifies) {
261
+ const subproofAssertionUnifies = false;
262
+ return continuation(subproofAssertionUnifies);
260
263
  }
261
- }
262
- if (subproofAssertionUnifies) {
263
- context.debug(`...unified the '${subproofAssertionString}' subproof assertion with the '${schemaString}' schema.`);
264
- }
265
- return subproofAssertionUnifies;
264
+ const supposedStatements = subproofAssertion.getSupposedStatements();
265
+ return this.unifySupposedStatements(supposedStatements, context, (supposedStatementsUnify)=>{
266
+ let subproofAssertionUnifies = false;
267
+ if (supposedStatementsUnify) {
268
+ subproofAssertionUnifies = true;
269
+ }
270
+ if (subproofAssertionUnifies) {
271
+ context.debug(`...unified the '${subproofAssertionString}' subproof assertion with the '${schemaString}' schema.`);
272
+ }
273
+ return continuation(subproofAssertionUnifies);
274
+ });
275
+ });
266
276
  }
267
- async unifySupposedStatement(supposedStatement, index, context) {
268
- let supposedStatementUnifies = false;
277
+ unifySupposedStatement(supposedStatement, index, context, continuation) {
269
278
  const supposition = this.getSupposition(index), suppositionString = supposition.getString(), supposedStatementString = supposedStatement.getString();
270
279
  context.trace(`Unifying the '${supposedStatementString}' supposed statement with the '${suppositionString}' supposition...`);
271
- const suppositionContext = supposition.getContext(), statement = supposedStatement, generalContext = suppositionContext, specificContext = context, statementUnifies = await supposition.unifyStatement(statement, generalContext, specificContext);
272
- if (statementUnifies) {
273
- supposedStatementUnifies = true;
274
- }
275
- if (supposedStatementUnifies) {
276
- context.debug(`...unified the '${supposedStatementString}' supposed statement with the '${suppositionString}' supposition`);
277
- }
278
- return supposedStatementUnifies;
280
+ const suppositionContext = supposition.getContext(), statement = supposedStatement, generalContext = suppositionContext, specificContext = context; ///
281
+ return supposition.unifyStatement(statement, generalContext, specificContext, (statementUnifies)=>{
282
+ let supposedStatementUnifies = false;
283
+ if (statementUnifies) {
284
+ supposedStatementUnifies = true;
285
+ }
286
+ if (supposedStatementUnifies) {
287
+ context.debug(`...unified the '${supposedStatementString}' supposed statement with the '${suppositionString}' supposition`);
288
+ }
289
+ return continuation(supposedStatementUnifies);
290
+ });
279
291
  }
280
- unifySupposedStatements(supposedStatements, context) {
281
- let supposedStatementsUnify = false;
292
+ unifySupposedStatements(supposedStatements, context, continuation) {
282
293
  const suppositionsLength = this.suppositions.length, supposedStatementsLength = supposedStatements.length;
283
- if (suppositionsLength === supposedStatementsLength) {
284
- supposedStatementsUnify = supposedStatements.every((supposedStatement, index)=>{
285
- const supposedStatementUnifies = this.unifySupposedStatement(supposedStatement, index, context);
286
- if (supposedStatementUnifies) {
287
- return true;
288
- }
289
- });
294
+ if (suppositionsLength !== supposedStatementsLength) {
295
+ const supposedStatementsUnify = false;
296
+ return continuation(supposedStatementsUnify);
290
297
  }
291
- return supposedStatementsUnify;
298
+ let index = -1;
299
+ every(supposedStatements, (supposedStatement, continuation)=>{
300
+ index++;
301
+ return this.unifySupposedStatement(supposedStatement, index, context, continuation);
302
+ });
292
303
  }
293
304
  toJSON() {
294
305
  const labelJSON = (0, _json.labelToLabelJSON)(this.label), deductionJSON = (0, _json.deductionToDeductionJSON)(this.deduction), suppositionsJSON = (0, _json.suppositionsToSuppositionsJSON)(this.suppositions), constraintsJSON = (0, _json.constraintsToConstraintsJSON)(this.constraints), string = this.getString();
@@ -322,4 +333,4 @@ function subproofAssertionFromStatement(statement, context) {
322
333
  return subproofAssertion;
323
334
  }
324
335
 
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L3NjaGVtYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcywgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgcmVjb25jaWxlLCBlbmNhcHN1bGF0ZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGV4dFwiO1xuaW1wb3J0IHsgc2NoZW1hU3RyaW5nRnJvbUxhYmVsU3VwcG9zaXRpb25zQW5kRGVkdWN0aW9uIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9zdHJpbmdcIjtcbmltcG9ydCB7IGxhYmVsRnJvbUpTT04sXG4gICAgICAgICBsYWJlbFRvTGFiZWxKU09OLFxuICAgICAgICAgZGVkdWN0aW9uRnJvbUpTT04sXG4gICAgICAgICBjb25zdHJhaW50c0Zyb21KU09OLFxuICAgICAgICAgc3VwcG9zaXRpb25zRnJvbUpTT04sXG4gICAgICAgICBkZWR1Y3Rpb25Ub0RlZHVjdGlvbkpTT04sXG4gICAgICAgICBjb25zdHJhaW50c1RvQ29uc3RyYWludHNKU09OLFxuICAgICAgICAgc3VwcG9zaXRpb25zVG9TdXBwb3NpdGlvbnNKU09OIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9qc29uXCI7XG5cbmNvbnN0IHsgZm9yd2FyZHNFdmVyeSB9ID0gY29udGludWF0aW9uVXRpbGl0aWVzLFxuICAgICAgeyBicmVha1BvaW50RnJvbUpTT04sIGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OIH0gPSBicmVha1BvaW50VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmUoY2xhc3MgU2NoZW1hIGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgbGFiZWwsIHN1cHBvc2l0aW9ucywgZGVkdWN0aW9uLCBwcm9vZiwgY29uc3RyYWludHMpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuICAgIHRoaXMuc3VwcG9zaXRpb25zID0gc3VwcG9zaXRpb25zO1xuICAgIHRoaXMuZGVkdWN0aW9uID0gZGVkdWN0aW9uO1xuICAgIHRoaXMucHJvb2YgPSBwcm9vZjtcbiAgICB0aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XG4gIH1cblxuICBnZXRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbDtcbiAgfVxuXG4gIGdldFN1cHBvc2l0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5zdXBwb3NpdGlvbnM7XG4gIH1cblxuICBnZXREZWR1Y3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVkdWN0aW9uO1xuICB9XG5cbiAgZ2V0UHJvb2YoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvb2Y7XG4gIH1cblxuICBnZXRNQ29uc3RyYWludCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50cztcbiAgfVxuXG4gIGdldFN1cHBvc2l0aW9uKGluZGV4KSB7XG4gICAgY29uc3Qgc3VwcG9zaXRpb24gPSB0aGlzLnN1cHBvc2l0aW9uc1tpbmRleF0gfHwgbnVsbDtcblxuICAgIHJldHVybiBzdXBwb3NpdGlvbjtcbiAgfVxuXG4gIGlzQ29uZGl0aW9uYWwoKSB7XG4gICAgY29uc3Qgc3VwcG9zaXRpb25zTGVuZ3RoID0gdGhpcy5zdXBwb3NpdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIGNvbmRpdGlvbmFsID0gKHN1cHBvc2l0aW9uc0xlbmd0aCA+IDApO1xuXG4gICAgcmV0dXJuIGNvbmRpdGlvbmFsO1xuICB9XG5cbiAgY29tcGFyZVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0TGFiZWwoKSxcbiAgICAgICAgICBsYWJlbENvbXBhcmVzVG9SZWZmZXJlbmNlID0gbGFiZWwuY29tcGFyZVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIGNvbXBhcmVzVG9SZWZlcmVuY2UgPSBsYWJlbENvbXBhcmVzVG9SZWZmZXJlbmNlOyAgLy8vXG5cbiAgICByZXR1cm4gY29tcGFyZXNUb1JlZmVyZW5jZTtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeShjb250ZXh0KSB7XG4gICAgbGV0IHZlcmlmaWVzO1xuXG4gICAgYXdhaXQgdGhpcy5icmVhayhjb250ZXh0KTtcblxuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIGF3YWl0IGVuY2Fwc3VsYXRlKGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBsYWJlbFZlcmlmaWVzID0gdGhpcy52ZXJpZnlMYWJlbChjb250ZXh0KTtcblxuICAgICAgaWYgKGxhYmVsVmVyaWZpZXMpIHtcbiAgICAgICAgY29uc3Qgc3VwcG9zaXRpb25zVmVyaWZ5ID0gYXdhaXQgdGhpcy52ZXJpZnlTdXBwb3NpdGlvbnMoY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN1cHBvc2l0aW9uc1ZlcmlmeSkge1xuICAgICAgICAgIGNvbnN0IGRlZHVjdGlvblZlcmlmaWVzID0gYXdhaXQgdGhpcy52ZXJpZnlEZWR1Y3Rpb24oY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoZGVkdWN0aW9uVmVyaWZpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb29mVmVyaWZpZXMgPSBhd2FpdCB0aGlzLnZlcmlmeVByb29mKGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAocHJvb2ZWZXJpZmllcykge1xuICAgICAgICAgICAgICB2ZXJpZmllcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGhpcy5jb25zdHJhaW50cywgY29udGV4dCk7XG5cbiAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXM7IC8vL1xuXG4gICAgICBjb250ZXh0LmFkZFNjaGVtYShzY2hlbWEpO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJpZmllcztcbiAgfVxuXG4gIHZlcmlmeUxhYmVsKGNvbnRleHQpIHtcbiAgICBsZXQgbGFiZWxWZXJpZmllcztcblxuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksICAvLy9cbiAgICAgICAgICBsYWJlbFN0cmluZyA9IHRoaXMubGFiZWwuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzICcke2xhYmVsU3RyaW5nfScgbGFiZWwuLi5gKTtcblxuICAgIGxhYmVsVmVyaWZpZXMgPSB0aGlzLmxhYmVsLnZlcmlmeSgpO1xuXG4gICAgaWYgKGxhYmVsVmVyaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtsYWJlbFN0cmluZ30nIGxhYmVsLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsYWJlbFZlcmlmaWVzO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5UHJvb2YoY29udGV4dCkge1xuICAgIGxldCBwcm9vZlZlcmlmaWVzO1xuXG4gICAgY29uc3Qgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBwcm9vZi4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5kZWR1Y3Rpb24uZ2V0U3RhdGVtZW50KCk7XG5cbiAgICBwcm9vZlZlcmlmaWVzID0gYXdhaXQgdGhpcy5wcm9vZi52ZXJpZnkoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgIGlmIChwcm9vZlZlcmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgcHJvb2YuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb29mVmVyaWZpZXM7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlEZWR1Y3Rpb24oY29udGV4dCkge1xuICAgIGxldCBkZWR1Y3Rpb25WZXJpZmllcztcblxuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksICAvL1xuICAgICAgICAgIGRlZHVjdGlvblN0cmluZyA9IHRoaXMuZGVkdWN0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyB0b3AgbGV2ZWwgbWV0YSBhc3NlcnRpb24ncyAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24uLi5gKTtcblxuICAgIGRlZHVjdGlvblZlcmlmaWVzID0gYXdhaXQgdGhpcy5kZWR1Y3Rpb24udmVyaWZ5KGNvbnRleHQpO1xuXG4gICAgaWYgKGRlZHVjdGlvblZlcmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgdG9wIGxldmVsIG1ldGEgYXNzZXJ0aW9uJ3MgJyR7ZGVkdWN0aW9uU3RyaW5nfScgZGVkdWN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBkZWR1Y3Rpb25WZXJpZmllcztcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeVN1cHBvc2l0aW9uKHN1cHBvc2l0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IHN1cHBvc2l0aW9uVmVyaWZpZXM7XG5cbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgc3VwcG9zaXRpb25TdHJpbmcgPSBzdXBwb3NpdGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBzdXBwb3NpdGlvbi4uLmApO1xuXG4gICAgc3VwcG9zaXRpb25WZXJpZmllcyA9IGF3YWl0IHN1cHBvc2l0aW9uLnZlcmlmeShjb250ZXh0KVxuXG4gICAgaWYgKHN1cHBvc2l0aW9uVmVyaWZpZXMpIHtcbiAgICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbiA9IHN1cHBvc2l0aW9uOyAgLy8vL1xuXG4gICAgICBjb250ZXh0LmFzc2lnbkFzc2lnbm1lbnRzKCk7XG5cbiAgICAgIGNvbnRleHQuYWRkU3VicHJvb2ZPclByb29mQXNzZXJ0aW9uKHN1YnByb29mT3JQcm9vZkFzc2VydGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHN1cHBvc2l0aW9uVmVyaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtzdXBwb3NpdGlvblN0cmluZ30nIHN1cHBvc2l0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBwb3NpdGlvblZlcmlmaWVzO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5U3VwcG9zaXRpb25zKGNvbnRleHQpIHtcbiAgICBsZXQgc3VwcG9zaXRpb25zVmVyaWZ5O1xuXG4gICAgY29uc3Qgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBzdXBwb3NpdGlvbnMuLi5gKTtcblxuICAgIHN1cHBvc2l0aW9uc1ZlcmlmeSA9IGF3YWl0IGZvcndhcmRzRXZlcnkodGhpcy5zdXBwb3NpdGlvbnMsIGFzeW5jIChzdXBwb3NpdGlvbikgPT4ge1xuICAgICAgY29uc3Qgc3VwcG9zaXRpb25WZXJpZmllcyA9IGF3YWl0IHRoaXMudmVyaWZ5U3VwcG9zaXRpb24oc3VwcG9zaXRpb24sIGNvbnRleHQpO1xuXG4gICAgICBpZiAoc3VwcG9zaXRpb25WZXJpZmllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChzdXBwb3NpdGlvbnNWZXJpZnkpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBzdXBwb3NpdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cHBvc2l0aW9uc1ZlcmlmeTtcbiAgfVxuXG4gIHVuaWZ5SnVkZ2VtZW50KGp1ZGdlbWVudCwgY29udGV4dCkge1xuICAgIGxldCBqdWRnZW1lbnRVbmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAganVkZ2VtZW50U3RyaW5nID0ganVkZ2VtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlID0ganVkZ2VtZW50LmdldFJlZmVyZW5jZSgpLFxuICAgICAgICAgICAgcmVmZXJlbmNlVW5pZmllcyA9IHRoaXMudW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlZmVyZW5jZVVuaWZpZXMpIHtcbiAgICAgICAgbGV0IHN0YXRlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBqdWRnZW1lbnQuZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsID0gdGhpcy5pc0NvbmRpdGlvbmFsKCksXG4gICAgICAgICAgICAgIHN1YnByb29mQXNzZXJ0aW9uID0gc3VicHJvb2ZBc3NlcnRpb25Gcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbmFsKSB7XG4gICAgICAgICAgaWYgKHN1YnByb29mQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJwcm9vZmFzc2VydGlvblVuaWZpZXMgPSB0aGlzLnVuaWZ5U3VicHJvb2ZBc3NlcnRpb24oc3VicHJvb2ZBc3NlcnRpb24sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAoc3VicHJvb2Zhc3NlcnRpb25VbmlmaWVzKSB7XG4gICAgICAgICAgICAgIHN0YXRlbWVudFVuaWZpZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3VicHJvb2ZBc3NlcnRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZHVjZWRTdGF0bWVudCA9IHN0YXRlbWVudCwgIC8vL1xuICAgICAgICAgICAgICAgICAgZGVkdWNlZFN0YXRtZW50VW5maWZpZXMgPSB0aGlzLnVuaWZ5RGVkdWNlZFN0YXRlbWVudChkZWR1Y2VkU3RhdG1lbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAoZGVkdWNlZFN0YXRtZW50VW5maWZpZXMpIHtcbiAgICAgICAgICAgICAgc3RhdGVtZW50VW5pZmllcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgICBjb25zdCBhc3N1bXB0aW9ucyA9IGp1ZGdlbWVudC5nZXRBc3N1bXB0aW9ucyhjb250ZXh0KSxcbiAgICAgICAgICAgICAgICBhc3N1bXB0aW9uc1VuaWZ5ID0gdGhpcy51bmlmeUFzc3VtcHRpb25zKGFzc3VtcHRpb25zLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChhc3N1bXB0aW9uc1VuaWZ5KSB7XG4gICAgICAgICAgICBqdWRnZW1lbnRVbmlmaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcblxuICAgIGlmIChqdWRnZW1lbnRVbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQgd2l0aCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuICAgIH1cblxuICAgIHJldHVybiBqdWRnZW1lbnRVbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBjb250ZXh0KSB7XG4gICAgbGV0IHJlZmVyZW5jZVVuaWZpZXM7XG5cbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgcmVmZXJlbmNlU3RyaW5nID0gcmVmZXJlbmNlLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJlZmVyZW5jZVVuaWZpZXMgPSB0aGlzLmxhYmVsLnVuaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgY29udGV4dCk7XG5cbiAgICBpZiAocmVmZXJlbmNlVW5pZmllcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlIHdpdGggdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlVW5pZmllcztcbiAgfVxuXG4gIHVuaWZ5QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9uc1VuaWZ5ID0gdGhpcy5jb25zdHJhaW50cy5ldmVyeSgoY29uc3RyYWludCkgPT4ge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnNVbmlmeSA9IGNvbnN0cmFpbnQudW5pZnlBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucywgY29udGV4dCk7XG5cbiAgICAgIGlmIChhc3N1bXB0aW9uc1VuaWZ5KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25zVW5pZnk7XG4gIH1cblxuICBhc3luYyB1bmlmeURlZHVjZWRTdGF0ZW1lbnQoZGVkdWNlZFN0YXRlbWVudCwgY29udGV4dCkge1xuICAgIGxldCBkZWR1Y2VkU3RhdGVtZW50VW5pZmllcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgZGVkdWN0aW9uU3RyaW5nID0gdGhpcy5kZWR1Y3Rpb24uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgZGVkdWNlZFN0YXRlbWVudFN0cmluZyA9IGRlZHVjZWRTdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7ZGVkdWNlZFN0YXRlbWVudFN0cmluZ30nIGRlZHVjZWQgc3RhdGVtZW50IHdpdGggdGhlICcke2RlZHVjdGlvblN0cmluZ30nIGRlZHVjdGluby4uLmApO1xuXG4gICAgY29uc3QgZGVkdWN0aW9uQ29udGV4dCA9IHRoaXMuZGVkdWN0aW9uLmdldENvbnRleHQoKSwgLy8vXG4gICAgICAgICAgc3RhdGVtZW50ID0gZGVkdWNlZFN0YXRlbWVudCwgLy8vXG4gICAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBkZWR1Y3Rpb25Db250ZXh0LCAvLy9cbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50VW5pZmllcyA9IGF3YWl0IHRoaXMuZGVkdWN0aW9uLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChkZWR1Y2VkU3RhdGVtZW50VW5pZmllcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7ZGVkdWNlZFN0YXRlbWVudFN0cmluZ30nIGRlZHVjZWQgc3RhdGVtZW50IHdpdGggdGhlICcke2RlZHVjdGlvblN0cmluZ30nIGRlZHVjdGlvbmApO1xuICAgIH1cblxuICAgIHJldHVybiBkZWR1Y2VkU3RhdGVtZW50VW5pZmllcztcbiAgfVxuXG4gIHVuaWZ5U3VicHJvb2ZBc3NlcnRpb24oc3VicHJvb2ZBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgc3VicHJvb2ZBc3NlcnRpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgc3VicHJvb2ZBc3NlcnRpb25TdHJpbmcgPSBzdWJwcm9vZkFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdWJwcm9vZkFzc2VydGlvblN0cmluZ30nIHN1YnByb29mIGFzc2VydGlvbiB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIGNvbnN0IGRlZHVjZWRTdGF0ZW1lbnQgPSBzdWJwcm9vZkFzc2VydGlvbi5nZXREZWR1Y2VkU3RhdGVtZW50KCksXG4gICAgICAgICAgZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMgPSB0aGlzLnVuaWZ5RGVkdWNlZFN0YXRlbWVudChkZWR1Y2VkU3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgIGlmIChkZWR1Y2VkU3RhdGVtZW50VW5pZmllcykge1xuICAgICAgY29uc3Qgc3VwcG9zZWRTdGF0ZW1lbnRzID0gc3VicHJvb2ZBc3NlcnRpb24uZ2V0U3VwcG9zZWRTdGF0ZW1lbnRzKCksXG4gICAgICAgICAgICBzdXBwb3NlZFN0YXRlbWVudHNVbmlmeSA9IHRoaXMudW5pZnlTdXBwb3NlZFN0YXRlbWVudHMoc3VwcG9zZWRTdGF0ZW1lbnRzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHN1cHBvc2VkU3RhdGVtZW50c1VuaWZ5KSB7XG4gICAgICAgIHN1YnByb29mQXNzZXJ0aW9uVW5pZmllcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN1YnByb29mQXNzZXJ0aW9uVW5pZmllcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3VicHJvb2ZBc3NlcnRpb25TdHJpbmd9JyBzdWJwcm9vZiBhc3NlcnRpb24gd2l0aCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJwcm9vZkFzc2VydGlvblVuaWZpZXM7XG4gIH1cblxuICBhc3luYyB1bmlmeVN1cHBvc2VkU3RhdGVtZW50KHN1cHBvc2VkU3RhdGVtZW50LCBpbmRleCwgY29udGV4dCkge1xuICAgIGxldCBzdXBwb3NlZFN0YXRlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN1cHBvc2l0aW9uID0gdGhpcy5nZXRTdXBwb3NpdGlvbihpbmRleCksXG4gICAgICAgICAgc3VwcG9zaXRpb25TdHJpbmcgPSBzdXBwb3NpdGlvbi5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBzdXBwb3NlZFN0YXRlbWVudFN0cmluZyA9IHN1cHBvc2VkU3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N1cHBvc2VkU3RhdGVtZW50U3RyaW5nfScgc3VwcG9zZWQgc3RhdGVtZW50IHdpdGggdGhlICcke3N1cHBvc2l0aW9uU3RyaW5nfScgc3VwcG9zaXRpb24uLi5gKTtcblxuICAgIGNvbnN0IHN1cHBvc2l0aW9uQ29udGV4dCA9IHN1cHBvc2l0aW9uLmdldENvbnRleHQoKSwgLy8vXG4gICAgICAgICAgc3RhdGVtZW50ID0gc3VwcG9zZWRTdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgIGdlbmVyYWxDb250ZXh0ID0gc3VwcG9zaXRpb25Db250ZXh0LCAvLy9cbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50VW5pZmllcyA9IGF3YWl0IHN1cHBvc2l0aW9uLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgc3VwcG9zZWRTdGF0ZW1lbnRVbmlmaWVzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3VwcG9zZWRTdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdXBwb3NlZFN0YXRlbWVudFN0cmluZ30nIHN1cHBvc2VkIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtzdXBwb3NpdGlvblN0cmluZ30nIHN1cHBvc2l0aW9uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cHBvc2VkU3RhdGVtZW50VW5pZmllcztcbiAgfVxuXG4gIHVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnRzKHN1cHBvc2VkU3RhdGVtZW50cywgY29udGV4dCkge1xuICAgIGxldCBzdXBwb3NlZFN0YXRlbWVudHNVbmlmeSA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3VwcG9zaXRpb25zTGVuZ3RoID0gdGhpcy5zdXBwb3NpdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIHN1cHBvc2VkU3RhdGVtZW50c0xlbmd0aCA9IHN1cHBvc2VkU3RhdGVtZW50cy5sZW5ndGg7XG5cbiAgICBpZiAoc3VwcG9zaXRpb25zTGVuZ3RoID09PSBzdXBwb3NlZFN0YXRlbWVudHNMZW5ndGgpIHtcbiAgICAgIHN1cHBvc2VkU3RhdGVtZW50c1VuaWZ5ID0gc3VwcG9zZWRTdGF0ZW1lbnRzLmV2ZXJ5KChzdXBwb3NlZFN0YXRlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc3VwcG9zZWRTdGF0ZW1lbnRVbmlmaWVzID0gdGhpcy51bmlmeVN1cHBvc2VkU3RhdGVtZW50KHN1cHBvc2VkU3RhdGVtZW50LCBpbmRleCwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN1cHBvc2VkU3RhdGVtZW50VW5pZmllcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwcG9zZWRTdGF0ZW1lbnRzVW5pZnk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgbGFiZWxKU09OID0gbGFiZWxUb0xhYmVsSlNPTih0aGlzLmxhYmVsKSxcbiAgICAgICAgICBkZWR1Y3Rpb25KU09OID0gZGVkdWN0aW9uVG9EZWR1Y3Rpb25KU09OKHRoaXMuZGVkdWN0aW9uKSxcbiAgICAgICAgICBzdXBwb3NpdGlvbnNKU09OID0gc3VwcG9zaXRpb25zVG9TdXBwb3NpdGlvbnNKU09OKHRoaXMuc3VwcG9zaXRpb25zKSxcbiAgICAgICAgICBjb25zdHJhaW50c0pTT04gPSBjb25zdHJhaW50c1RvQ29uc3RyYWludHNKU09OKHRoaXMuY29uc3RyYWludHMpLFxuICAgICAgICAgIHN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICBsZXQgYnJlYWtQb2ludDtcblxuICAgIGJyZWFrUG9pbnQgPSB0aGlzLmdldEJyZWFrUG9pbnQoKTtcblxuICAgIGNvbnN0IGJyZWFrUG9pbnRKU09OID0gYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04oYnJlYWtQb2ludCk7XG5cbiAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEpTT047ICAvLy9cblxuICAgIGNvbnN0IGxhYmVsID0gbGFiZWxKU09OLCAgLy8vXG4gICAgICAgICAgZGVkdWN0aW9uID0gZGVkdWN0aW9uSlNPTiwgIC8vL1xuICAgICAgICAgIHN1cHBvc2l0aW9ucyA9IHN1cHBvc2l0aW9uc0pTT04sICAvLy9cbiAgICAgICAgICBjb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzSlNPTiwgIC8vL1xuICAgICAgICAgIGpzb24gPSB7XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICBicmVha1BvaW50LFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBkZWR1Y3Rpb24sXG4gICAgICAgICAgICBzdXBwb3NpdGlvbnMsXG4gICAgICAgICAgICBjb25zdHJhaW50c1xuICAgICAgICAgIH07XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJTY2hlbWFcIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIGNvbnN0IGxhYmVsID0gbGFiZWxGcm9tSlNPTihqc29uLCBjb250ZXh0KSxcbiAgICAgICAgICBkZWR1Y3Rpb24gPSBkZWR1Y3Rpb25Gcm9tSlNPTihqc29uLCBjb250ZXh0KSxcbiAgICAgICAgICBzdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnNGcm9tSlNPTihqc29uLCBjb250ZXh0KSxcbiAgICAgICAgICBjb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgc3RyaW5nID0gc2NoZW1hU3RyaW5nRnJvbUxhYmVsU3VwcG9zaXRpb25zQW5kRGVkdWN0aW9uKGxhYmVsLCBzdXBwb3NpdGlvbnMsIGRlZHVjdGlvbiksXG4gICAgICAgICAgbm9kZSA9IG51bGwsXG4gICAgICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRGcm9tSlNPTihqc29uKSxcbiAgICAgICAgICBwcm9vZiA9IG51bGwsXG4gICAgICAgICAgc2NoZW1hID0gbmV3IFNjaGVtYShjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIGxhYmVsLCBzdXBwb3NpdGlvbnMsIGRlZHVjdGlvbiwgcHJvb2YsIGNvbnN0cmFpbnRzKTtcblxuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBzdWJwcm9vZkFzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gIGxldCBzdWJwcm9vZkFzc2VydGlvbjtcblxuICBjb25zdCB7IFN1YnByb29mQXNzZXJ0aW9uIH0gPSBlbGVtZW50cztcblxuICBzdWJwcm9vZkFzc2VydGlvbiA9IFN1YnByb29mQXNzZXJ0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAoc3VicHJvb2ZBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBzdWJwcm9vZkFzc2VydGlvbiA9IHN1YnByb29mQXNzZXJ0aW9uLnZhbGlkYXRlKGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHN1YnByb29mQXNzZXJ0aW9uO1xuXG59XG4iXSwibmFtZXMiOlsiZm9yd2FyZHNFdmVyeSIsImNvbnRpbnVhdGlvblV0aWxpdGllcyIsImJyZWFrUG9pbnRGcm9tSlNPTiIsImJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OIiwiYnJlYWtQb2ludFV0aWxpdGllcyIsImRlZmluZSIsIlNjaGVtYSIsIkVsZW1lbnQiLCJjb250ZXh0Iiwic3RyaW5nIiwibm9kZSIsImJyZWFrUG9pbnQiLCJsYWJlbCIsInN1cHBvc2l0aW9ucyIsImRlZHVjdGlvbiIsInByb29mIiwiY29uc3RyYWludHMiLCJnZXRMYWJlbCIsImdldFN1cHBvc2l0aW9ucyIsImdldERlZHVjdGlvbiIsImdldFByb29mIiwiZ2V0TUNvbnN0cmFpbnQiLCJnZXRTdXBwb3NpdGlvbiIsImluZGV4Iiwic3VwcG9zaXRpb24iLCJpc0NvbmRpdGlvbmFsIiwic3VwcG9zaXRpb25zTGVuZ3RoIiwibGVuZ3RoIiwiY29uZGl0aW9uYWwiLCJjb21wYXJlUmVmZXJlbmNlIiwicmVmZXJlbmNlIiwibGFiZWxDb21wYXJlc1RvUmVmZmVyZW5jZSIsImNvbXBhcmVzVG9SZWZlcmVuY2UiLCJ2ZXJpZnkiLCJ2ZXJpZmllcyIsImJyZWFrIiwic2NoZW1hU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJlbmNhcHN1bGF0ZSIsImxhYmVsVmVyaWZpZXMiLCJ2ZXJpZnlMYWJlbCIsInN1cHBvc2l0aW9uc1ZlcmlmeSIsInZlcmlmeVN1cHBvc2l0aW9ucyIsImRlZHVjdGlvblZlcmlmaWVzIiwidmVyaWZ5RGVkdWN0aW9uIiwicHJvb2ZWZXJpZmllcyIsInZlcmlmeVByb29mIiwic2NoZW1hIiwiYWRkU2NoZW1hIiwiZGVidWciLCJsYWJlbFN0cmluZyIsInN0YXRlbWVudCIsImdldFN0YXRlbWVudCIsImRlZHVjdGlvblN0cmluZyIsInZlcmlmeVN1cHBvc2l0aW9uIiwic3VwcG9zaXRpb25WZXJpZmllcyIsInN1cHBvc2l0aW9uU3RyaW5nIiwic3VicHJvb2ZPclByb29mQXNzZXJ0aW9uIiwiYXNzaWduQXNzaWdubWVudHMiLCJhZGRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24iLCJ1bmlmeUp1ZGdlbWVudCIsImp1ZGdlbWVudCIsImp1ZGdlbWVudFVuaWZpZXMiLCJqdWRnZW1lbnRTdHJpbmciLCJyZWNvbmNpbGUiLCJnZXRSZWZlcmVuY2UiLCJyZWZlcmVuY2VVbmlmaWVzIiwidW5pZnlSZWZlcmVuY2UiLCJzdGF0ZW1lbnRVbmlmaWVzIiwic3VicHJvb2ZBc3NlcnRpb24iLCJzdWJwcm9vZkFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJzdWJwcm9vZmFzc2VydGlvblVuaWZpZXMiLCJ1bmlmeVN1YnByb29mQXNzZXJ0aW9uIiwiZGVkdWNlZFN0YXRtZW50IiwiZGVkdWNlZFN0YXRtZW50VW5maWZpZXMiLCJ1bmlmeURlZHVjZWRTdGF0ZW1lbnQiLCJhc3N1bXB0aW9ucyIsImdldEFzc3VtcHRpb25zIiwiYXNzdW1wdGlvbnNVbmlmeSIsInVuaWZ5QXNzdW1wdGlvbnMiLCJyZWZlcmVuY2VTdHJpbmciLCJldmVyeSIsImNvbnN0cmFpbnQiLCJkZWR1Y2VkU3RhdGVtZW50IiwiZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMiLCJkZWR1Y2VkU3RhdGVtZW50U3RyaW5nIiwiZGVkdWN0aW9uQ29udGV4dCIsImdldENvbnRleHQiLCJnZW5lcmFsQ29udGV4dCIsInNwZWNpZmljQ29udGV4dCIsInVuaWZ5U3RhdGVtZW50Iiwic3VicHJvb2ZBc3NlcnRpb25VbmlmaWVzIiwic3VicHJvb2ZBc3NlcnRpb25TdHJpbmciLCJnZXREZWR1Y2VkU3RhdGVtZW50Iiwic3VwcG9zZWRTdGF0ZW1lbnRzIiwiZ2V0U3VwcG9zZWRTdGF0ZW1lbnRzIiwic3VwcG9zZWRTdGF0ZW1lbnRzVW5pZnkiLCJ1bmlmeVN1cHBvc2VkU3RhdGVtZW50cyIsInVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnQiLCJzdXBwb3NlZFN0YXRlbWVudCIsInN1cHBvc2VkU3RhdGVtZW50VW5pZmllcyIsInN1cHBvc2VkU3RhdGVtZW50U3RyaW5nIiwic3VwcG9zaXRpb25Db250ZXh0Iiwic3VwcG9zZWRTdGF0ZW1lbnRzTGVuZ3RoIiwidG9KU09OIiwibGFiZWxKU09OIiwibGFiZWxUb0xhYmVsSlNPTiIsImRlZHVjdGlvbkpTT04iLCJkZWR1Y3Rpb25Ub0RlZHVjdGlvbkpTT04iLCJzdXBwb3NpdGlvbnNKU09OIiwic3VwcG9zaXRpb25zVG9TdXBwb3NpdGlvbnNKU09OIiwiY29uc3RyYWludHNKU09OIiwiY29uc3RyYWludHNUb0NvbnN0cmFpbnRzSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImpzb24iLCJuYW1lIiwiZnJvbUpTT04iLCJsYWJlbEZyb21KU09OIiwiZGVkdWN0aW9uRnJvbUpTT04iLCJzdXBwb3NpdGlvbnNGcm9tSlNPTiIsImNvbnN0cmFpbnRzRnJvbUpTT04iLCJzY2hlbWFTdHJpbmdGcm9tTGFiZWxTdXBwb3NpdGlvbnNBbmREZWR1Y3Rpb24iLCJTdWJwcm9vZkFzc2VydGlvbiIsImVsZW1lbnRzIiwiZnJvbVN0YXRlbWVudCIsInZhbGlkYXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFxQkE7OztlQUFBOzs7Z0NBbkJvRTtrRUFFL0M7eUJBR2tCO3dCQUN1QjtzQkFRZjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9DLE1BQU0sRUFBRUEsYUFBYSxFQUFFLEdBQUdDLHFDQUFxQixFQUN6QyxFQUFFQyxrQkFBa0IsRUFBRUMsMEJBQTBCLEVBQUUsR0FBR0MsbUNBQW1CO01BRTlFLFdBQWVDLElBQUFBLGdCQUFNLEVBQUMsTUFBTUMsZUFBZUMsdUJBQU87SUFDaEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxLQUFLLEVBQUVDLFlBQVksRUFBRUMsU0FBUyxFQUFFQyxLQUFLLEVBQUVDLFdBQVcsQ0FBRTtRQUNqRyxLQUFLLENBQUNSLFNBQVNDLFFBQVFDLE1BQU1DO1FBRTdCLElBQUksQ0FBQ0MsS0FBSyxHQUFHQTtRQUNiLElBQUksQ0FBQ0MsWUFBWSxHQUFHQTtRQUNwQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7UUFDakIsSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxXQUFXLEdBQUdBO0lBQ3JCO0lBRUFDLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQ0wsS0FBSztJQUNuQjtJQUVBTSxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUNMLFlBQVk7SUFDMUI7SUFFQU0sZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDTCxTQUFTO0lBQ3ZCO0lBRUFNLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQ0wsS0FBSztJQUNuQjtJQUVBTSxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQ0wsV0FBVztJQUN6QjtJQUVBTSxlQUFlQyxLQUFLLEVBQUU7UUFDcEIs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
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L3NjaGVtYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcywgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGFsbCB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGludWF0aW9uXCI7XG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IHJlY29uY2lsZSwgZW5jYXBzdWxhdGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IHNjaGVtYVN0cmluZ0Zyb21MYWJlbFN1cHBvc2l0aW9uc0FuZERlZHVjdGlvbiB9IGZyb20gXCIuLi91dGlsaXRpZXMvc3RyaW5nXCI7XG5pbXBvcnQgeyBsYWJlbEZyb21KU09OLFxuICAgICAgICAgbGFiZWxUb0xhYmVsSlNPTixcbiAgICAgICAgIGRlZHVjdGlvbkZyb21KU09OLFxuICAgICAgICAgY29uc3RyYWludHNGcm9tSlNPTixcbiAgICAgICAgIHN1cHBvc2l0aW9uc0Zyb21KU09OLFxuICAgICAgICAgZGVkdWN0aW9uVG9EZWR1Y3Rpb25KU09OLFxuICAgICAgICAgY29uc3RyYWludHNUb0NvbnN0cmFpbnRzSlNPTixcbiAgICAgICAgIHN1cHBvc2l0aW9uc1RvU3VwcG9zaXRpb25zSlNPTiB9IGZyb20gXCIuLi91dGlsaXRpZXMvanNvblwiO1xuXG5jb25zdCB7IGV2ZXJ5LCBmb3J3YXJkc0V2ZXJ5IH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrYWJsZSwgYnJlYWtQb2ludEZyb21KU09OLCBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIFNjaGVtYSBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIGxhYmVsLCBzdXBwb3NpdGlvbnMsIGRlZHVjdGlvbiwgcHJvb2YsIGNvbnN0cmFpbnRzKSB7XG4gICAgc3VwZXIoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50KTtcblxuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICB0aGlzLnN1cHBvc2l0aW9ucyA9IHN1cHBvc2l0aW9ucztcbiAgICB0aGlzLmRlZHVjdGlvbiA9IGRlZHVjdGlvbjtcbiAgICB0aGlzLnByb29mID0gcHJvb2Y7XG4gICAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB9XG5cbiAgZ2V0TGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWw7XG4gIH1cblxuICBnZXRTdXBwb3NpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcG9zaXRpb25zO1xuICB9XG5cbiAgZ2V0RGVkdWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmRlZHVjdGlvbjtcbiAgfVxuXG4gIGdldFByb29mKCkge1xuICAgIHJldHVybiB0aGlzLnByb29mO1xuICB9XG5cbiAgZ2V0TUNvbnN0cmFpbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RyYWludHM7XG4gIH1cblxuICBnZXRTdXBwb3NpdGlvbihpbmRleCkge1xuICAgIGNvbnN0IHN1cHBvc2l0aW9uID0gdGhpcy5zdXBwb3NpdGlvbnNbaW5kZXhdIHx8IG51bGw7XG5cbiAgICByZXR1cm4gc3VwcG9zaXRpb247XG4gIH1cblxuICBpc0NvbmRpdGlvbmFsKCkge1xuICAgIGNvbnN0IHN1cHBvc2l0aW9uc0xlbmd0aCA9IHRoaXMuc3VwcG9zaXRpb25zLmxlbmd0aCxcbiAgICAgICAgICBjb25kaXRpb25hbCA9IChzdXBwb3NpdGlvbnNMZW5ndGggPiAwKTtcblxuICAgIHJldHVybiBjb25kaXRpb25hbDtcbiAgfVxuXG4gIGNvbXBhcmVSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExhYmVsKCksXG4gICAgICAgICAgbGFiZWxDb21wYXJlc1RvUmVmZmVyZW5jZSA9IGxhYmVsLmNvbXBhcmVSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICBjb21wYXJlc1RvUmVmZXJlbmNlID0gbGFiZWxDb21wYXJlc1RvUmVmZmVyZW5jZTsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9SZWZlcmVuY2U7XG4gIH1cblxuICB2ZXJpZnkgPSBicmVha2FibGUoZnVuY3Rpb24gKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIGVuY2Fwc3VsYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCB2ZXJpZnlMYWJlbCA9IHRoaXMudmVyaWZ5TGFiZWwuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZlcmlmeVByb29mID0gdGhpcy52ZXJpZnlQcm9vZi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdmVyaWZ5RGVkdWN0aW9uID0gdGhpcy52ZXJpZnlEZWR1Y3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZlcmlmeVN1cHBvc2l0aW9ucyA9IHRoaXMudmVyaWZ5U3VwcG9zaXRpb25zLmJpbmQodGhpcyk7XG5cbiAgICAgIHJldHVybiBhbGwoW1xuICAgICAgICB2ZXJpZnlMYWJlbCxcbiAgICAgICAgdmVyaWZ5U3VwcG9zaXRpb25zLFxuICAgICAgICB2ZXJpZnlEZWR1Y3Rpb24sXG4gICAgICAgIHZlcmlmeVByb29mXG4gICAgICBdLCBjb250ZXh0LCAodmVyaWZpZXMpID0+IHtcbiAgICAgICAgaWYgKHZlcmlmaWVzKSB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpczsgLy8vXG5cbiAgICAgICAgICBjb250ZXh0LmFkZFNjaGVtYShzY2hlbWEpO1xuXG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24odmVyaWZpZXMpO1xuICAgICAgfSk7XG4gICAgfSwgdGhpcy5jb25zdHJhaW50cywgY29udGV4dCk7XG4gIH0pO1xuXG4gIHZlcmlmeUxhYmVsKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksICAvLy9cbiAgICAgICAgICBsYWJlbFN0cmluZyA9IHRoaXMubGFiZWwuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzICcke2xhYmVsU3RyaW5nfScgbGFiZWwuLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmxhYmVsLnZlcmlmeSgobGFiZWxWZXJpZmllcykgPT4ge1xuICAgICAgaWYgKGxhYmVsVmVyaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzICcke2xhYmVsU3RyaW5nfScgbGFiZWwuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24obGFiZWxWZXJpZmllcyk7XG4gICAgfSk7XG4gIH1cblxuICB2ZXJpZnlQcm9vZihjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzIHByb29mLi4uYCk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLmRlZHVjdGlvbi5nZXRTdGF0ZW1lbnQoKTtcblxuICAgIHJldHVybiB0aGlzLnByb29mLnZlcmlmeShzdGF0ZW1lbnQsIGNvbnRleHQsIChwcm9vZlZlcmlmaWVzKSA9PiB7XG4gICAgICBpZiAocHJvb2ZWZXJpZmllcykge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgcHJvb2YuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24ocHJvb2ZWZXJpZmllcyk7XG4gICAgfSk7XG4gIH1cblxuICB2ZXJpZnlEZWR1Y3Rpb24oY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3Qgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vXG4gICAgICAgICAgZGVkdWN0aW9uU3RyaW5nID0gdGhpcy5kZWR1Y3Rpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHRvcCBsZXZlbCBtZXRhIGFzc2VydGlvbidzICcke2RlZHVjdGlvblN0cmluZ30nIGRlZHVjdGlvbi4uLmApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVkdWN0aW9uLnZlcmlmeShjb250ZXh0LCAoZGVkdWN0aW9uVmVyaWZpZXMpID0+IHtcbiAgICAgIGlmIChkZWR1Y3Rpb25WZXJpZmllcykge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgdG9wIGxldmVsIG1ldGEgYXNzZXJ0aW9uJ3MgJyR7ZGVkdWN0aW9uU3RyaW5nfScgZGVkdWN0aW9uLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGRlZHVjdGlvblZlcmlmaWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZlcmlmeVN1cHBvc2l0aW9ucyhjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzIHN1cHBvc2l0aW9ucy4uLmApO1xuXG4gICAgcmV0dXJuIGZvcndhcmRzRXZlcnkodGhpcy5zdXBwb3NpdGlvbnMsIChzdXBwb3NpdGlvbiwgY29udGludWF0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJpZnlTdXBwb3NpdGlvbihzdXBwb3NpdGlvbiwgY29udGV4dCwgY29udGludWF0aW9uKTtcbiAgICB9LCAoc3VwcG9zaXRpb25zVmVyaWZ5KSA9PiB7XG4gICAgICBpZiAoc3VwcG9zaXRpb25zVmVyaWZ5KSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBzdXBwb3NpdGlvbnMuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oc3VwcG9zaXRpb25zVmVyaWZ5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHZlcmlmeVN1cHBvc2l0aW9uKHN1cHBvc2l0aW9uLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgc3VwcG9zaXRpb25TdHJpbmcgPSBzdXBwb3NpdGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBzdXBwb3NpdGlvbi4uLmApO1xuXG4gICAgcmV0dXJuIHN1cHBvc2l0aW9uLnZlcmlmeShjb250ZXh0LCAoc3VwcG9zaXRpb25WZXJpZmllcykgPT4ge1xuICAgICAgaWYgKHN1cHBvc2l0aW9uVmVyaWZpZXMpIHtcbiAgICAgICAgY29uc3Qgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uID0gc3VwcG9zaXRpb247ICAvLy8vXG5cbiAgICAgICAgY29udGV4dC5hc3NpZ25Bc3NpZ25tZW50cygpO1xuXG4gICAgICAgIGNvbnRleHQuYWRkU3VicHJvb2ZPclByb29mQXNzZXJ0aW9uKHN1YnByb29mT3JQcm9vZkFzc2VydGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdXBwb3NpdGlvblZlcmlmaWVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtzdXBwb3NpdGlvblN0cmluZ30nIHN1cHBvc2l0aW9uLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN1cHBvc2l0aW9uVmVyaWZpZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5pZnlKdWRnZW1lbnQoanVkZ2VtZW50LCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAganVkZ2VtZW50U3RyaW5nID0ganVkZ2VtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlID0ganVkZ2VtZW50LmdldFJlZmVyZW5jZSgpO1xuXG4gICAgICByZXR1cm4gdGhpcy51bmlmeVJlZmVyZW5jZShyZWZlcmVuY2UsIGNvbnRleHQsIChyZWZlcmVuY2VVbmlmaWVzKSA9PiB7XG4gICAgICAgIGlmICghcmVmZXJlbmNlVW5pZmllcykge1xuICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oanVkZ2VtZW50VW5pZmllcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3N1bXB0aW9ucyA9IGp1ZGdlbWVudC5nZXRBc3N1bXB0aW9ucyhjb250ZXh0KTtcblxuICAgICAgICByZXR1cm4gdGhpcy51bmlmeUFzc3VtcHRpb25zKGFzc3VtcHRpb25zLCBjb250ZXh0LCAoYXNzdW1wdGlvbnNVbmlmeSkgPT4ge1xuICAgICAgICAgIGlmICghYXNzdW1wdGlvbnNVbmlmeSkge1xuICAgICAgICAgICAgY29uc3QganVkZ2VtZW50VW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGp1ZGdlbWVudFVuaWZpZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGp1ZGdlbWVudC5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb25hbCA9IHRoaXMuaXNDb25kaXRpb25hbCgpLFxuICAgICAgICAgICAgICAgIHN1YnByb29mQXNzZXJ0aW9uID0gc3VicHJvb2ZBc3NlcnRpb25Gcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgICAgIGlmIChzdWJwcm9vZkFzc2VydGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCBqdWRnZW1lbnRVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihqdWRnZW1lbnRVbmlmaWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5pZnlTdWJwcm9vZkFzc2VydGlvbihzdWJwcm9vZkFzc2VydGlvbiwgY29udGV4dCwgKHN1YnByb29mYXNzZXJ0aW9uVW5pZmllcykgPT4ge1xuICAgICAgICAgICAgICBsZXQganVkZ2VtZW50VW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgIGlmIChzdWJwcm9vZmFzc2VydGlvblVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgICBqdWRnZW1lbnRVbmlmaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChqdWRnZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7anVkZ2VtZW50U3RyaW5nfScganVkZ2VtZW50IHdpdGggdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYS5gKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oanVkZ2VtZW50VW5pZmllcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3VicHJvb2ZBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihqdWRnZW1lbnRVbmlmaWVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkZWR1Y2VkU3RhdG1lbnQgPSBzdGF0ZW1lbnQ7ICAvLy9cblxuICAgICAgICAgIHJldHVybiB0aGlzLnVuaWZ5RGVkdWNlZFN0YXRlbWVudChkZWR1Y2VkU3RhdG1lbnQsIGNvbnRleHQsIChkZWR1Y2VkU3RhdG1lbnRVbmZpZmllcykgPT4ge1xuICAgICAgICAgICAgbGV0IGp1ZGdlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGRlZHVjZWRTdGF0bWVudFVuZmlmaWVzKSB7XG4gICAgICAgICAgICAgIGp1ZGdlbWVudFVuaWZpZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoanVkZ2VtZW50VW5pZmllcykge1xuICAgICAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQgd2l0aCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGp1ZGdlbWVudFVuaWZpZXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgdW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgcmVmZXJlbmNlU3RyaW5nID0gcmVmZXJlbmNlLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmxhYmVsLnVuaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgY29udGV4dCwgKHJlZmVyZW5jZVVuaWZpZXMpID0+IHtcbiAgICAgIGlmIChyZWZlcmVuY2VVbmlmaWVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24ocmVmZXJlbmNlVW5pZmllcyk7XG4gICAgfSk7XG4gIH1cblxuICB1bmlmeUFzc3VtcHRpb25zKGFzc3VtcHRpb25zLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBldmVyeSh0aGlzLmNvbnN0cmFpbnRzLCAoY29uc3RyYWludCwgY29udGludWF0aW9uKSA9PiB7XG4gICAgICBjb25zdHJhaW50LnVuaWZ5QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMsIGNvbnRleHQsIGNvbnRpbnVhdGlvbik7XG4gICAgfSwgY29udGludWF0aW9uKTtcbiAgfVxuXG4gIHVuaWZ5RGVkdWNlZFN0YXRlbWVudChkZWR1Y2VkU3RhdGVtZW50LCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBkZWR1Y3Rpb25TdHJpbmcgPSB0aGlzLmRlZHVjdGlvbi5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBkZWR1Y2VkU3RhdGVtZW50U3RyaW5nID0gZGVkdWNlZFN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtkZWR1Y2VkU3RhdGVtZW50U3RyaW5nfScgZGVkdWNlZCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7ZGVkdWN0aW9uU3RyaW5nfScgZGVkdWN0aW5vLi4uYCk7XG5cbiAgICBjb25zdCBkZWR1Y3Rpb25Db250ZXh0ID0gdGhpcy5kZWR1Y3Rpb24uZ2V0Q29udGV4dCgpLCAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnQgPSBkZWR1Y2VkU3RhdGVtZW50LCAvLy9cbiAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGRlZHVjdGlvbkNvbnRleHQsIC8vL1xuICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICAgIHJldHVybiB0aGlzLmRlZHVjdGlvbi51bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChzdGF0ZW1lbnRVbmlmaWVzKSA9PiB7XG4gICAgICBsZXQgZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7ZGVkdWNlZFN0YXRlbWVudFN0cmluZ30nIGRlZHVjZWQgc3RhdGVtZW50IHdpdGggdGhlICcke2RlZHVjdGlvblN0cmluZ30nIGRlZHVjdGlvbmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGRlZHVjZWRTdGF0ZW1lbnRVbmlmaWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuaWZ5U3VicHJvb2ZBc3NlcnRpb24oc3VicHJvb2ZBc3NlcnRpb24sIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksICAvLy9cbiAgICAgICAgICBzdWJwcm9vZkFzc2VydGlvblN0cmluZyA9IHN1YnByb29mQXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N1YnByb29mQXNzZXJ0aW9uU3RyaW5nfScgc3VicHJvb2YgYXNzZXJ0aW9uIHdpdGggdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYS4uLmApO1xuXG4gICAgY29uc3QgZGVkdWNlZFN0YXRlbWVudCA9IHN1YnByb29mQXNzZXJ0aW9uLmdldERlZHVjZWRTdGF0ZW1lbnQoKTtcblxuICAgIHJldHVybiB0aGlzLnVuaWZ5RGVkdWNlZFN0YXRlbWVudChkZWR1Y2VkU3RhdGVtZW50LCBjb250ZXh0LCAoZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMpID0+IHtcbiAgICAgIGlmICghZGVkdWNlZFN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgY29uc3Qgc3VicHJvb2ZBc3NlcnRpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWJwcm9vZkFzc2VydGlvblVuaWZpZXMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdXBwb3NlZFN0YXRlbWVudHMgPSBzdWJwcm9vZkFzc2VydGlvbi5nZXRTdXBwb3NlZFN0YXRlbWVudHMoKTtcblxuICAgICAgcmV0dXJuIHRoaXMudW5pZnlTdXBwb3NlZFN0YXRlbWVudHMoc3VwcG9zZWRTdGF0ZW1lbnRzLCBjb250ZXh0LCAoc3VwcG9zZWRTdGF0ZW1lbnRzVW5pZnkpID0+IHtcbiAgICAgICAgbGV0IHN1YnByb29mQXNzZXJ0aW9uVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzdXBwb3NlZFN0YXRlbWVudHNVbmlmeSkge1xuICAgICAgICAgIHN1YnByb29mQXNzZXJ0aW9uVW5pZmllcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VicHJvb2ZBc3NlcnRpb25VbmlmaWVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3VicHJvb2ZBc3NlcnRpb25TdHJpbmd9JyBzdWJwcm9vZiBhc3NlcnRpb24gd2l0aCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWJwcm9vZkFzc2VydGlvblVuaWZpZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB1bmlmeVN1cHBvc2VkU3RhdGVtZW50KHN1cHBvc2VkU3RhdGVtZW50LCBpbmRleCwgY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3Qgc3VwcG9zaXRpb24gPSB0aGlzLmdldFN1cHBvc2l0aW9uKGluZGV4KSxcbiAgICAgICAgICBzdXBwb3NpdGlvblN0cmluZyA9IHN1cHBvc2l0aW9uLmdldFN0cmluZygpLFxuICAgICAgICAgIHN1cHBvc2VkU3RhdGVtZW50U3RyaW5nID0gc3VwcG9zZWRTdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3VwcG9zZWRTdGF0ZW1lbnRTdHJpbmd9JyBzdXBwb3NlZCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBzdXBwb3NpdGlvbi4uLmApO1xuXG4gICAgY29uc3Qgc3VwcG9zaXRpb25Db250ZXh0ID0gc3VwcG9zaXRpb24uZ2V0Q29udGV4dCgpLCAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnQgPSBzdXBwb3NlZFN0YXRlbWVudCwgLy8vXG4gICAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBzdXBwb3NpdGlvbkNvbnRleHQsIC8vL1xuICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICAgIHJldHVybiBzdXBwb3NpdGlvbi51bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChzdGF0ZW1lbnRVbmlmaWVzKSA9PiB7XG4gICAgICBsZXQgc3VwcG9zZWRTdGF0ZW1lbnRVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgIHN1cHBvc2VkU3RhdGVtZW50VW5pZmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdXBwb3NlZFN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3VwcG9zZWRTdGF0ZW1lbnRTdHJpbmd9JyBzdXBwb3NlZCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBzdXBwb3NpdGlvbmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN1cHBvc2VkU3RhdGVtZW50VW5pZmllcyk7XG4gICAgfSk7XG4gIH1cblxuICB1bmlmeVN1cHBvc2VkU3RhdGVtZW50cyhzdXBwb3NlZFN0YXRlbWVudHMsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHN1cHBvc2l0aW9uc0xlbmd0aCA9IHRoaXMuc3VwcG9zaXRpb25zLmxlbmd0aCxcbiAgICAgICAgICBzdXBwb3NlZFN0YXRlbWVudHNMZW5ndGggPSBzdXBwb3NlZFN0YXRlbWVudHMubGVuZ3RoO1xuXG4gICAgaWYgKHN1cHBvc2l0aW9uc0xlbmd0aCAhPT0gc3VwcG9zZWRTdGF0ZW1lbnRzTGVuZ3RoKSB7XG4gICAgICBjb25zdCBzdXBwb3NlZFN0YXRlbWVudHNVbmlmeSA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN1cHBvc2VkU3RhdGVtZW50c1VuaWZ5KTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgIGV2ZXJ5KHN1cHBvc2VkU3RhdGVtZW50cywgKHN1cHBvc2VkU3RhdGVtZW50LCBjb250aW51YXRpb24pID0+IHtcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIHJldHVybiB0aGlzLnVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnQoc3VwcG9zZWRTdGF0ZW1lbnQsIGluZGV4LCBjb250ZXh0LCBjb250aW51YXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IGxhYmVsSlNPTiA9IGxhYmVsVG9MYWJlbEpTT04odGhpcy5sYWJlbCksXG4gICAgICAgICAgZGVkdWN0aW9uSlNPTiA9IGRlZHVjdGlvblRvRGVkdWN0aW9uSlNPTih0aGlzLmRlZHVjdGlvbiksXG4gICAgICAgICAgc3VwcG9zaXRpb25zSlNPTiA9IHN1cHBvc2l0aW9uc1RvU3VwcG9zaXRpb25zSlNPTih0aGlzLnN1cHBvc2l0aW9ucyksXG4gICAgICAgICAgY29uc3RyYWludHNKU09OID0gY29uc3RyYWludHNUb0NvbnN0cmFpbnRzSlNPTih0aGlzLmNvbnN0cmFpbnRzKSxcbiAgICAgICAgICBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICBjb25zdCBsYWJlbCA9IGxhYmVsSlNPTiwgIC8vL1xuICAgICAgICAgIGRlZHVjdGlvbiA9IGRlZHVjdGlvbkpTT04sICAvLy9cbiAgICAgICAgICBzdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnNKU09OLCAgLy8vXG4gICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50c0pTT04sICAvLy9cbiAgICAgICAgICBqc29uID0ge1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgYnJlYWtQb2ludCxcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgZGVkdWN0aW9uLFxuICAgICAgICAgICAgc3VwcG9zaXRpb25zLFxuICAgICAgICAgICAgY29uc3RyYWludHNcbiAgICAgICAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiU2NoZW1hXCI7XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCBsYWJlbCA9IGxhYmVsRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgZGVkdWN0aW9uID0gZGVkdWN0aW9uRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgc3VwcG9zaXRpb25zID0gc3VwcG9zaXRpb25zRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50c0Zyb21KU09OKGpzb24sIGNvbnRleHQpLFxuICAgICAgICAgIHN0cmluZyA9IHNjaGVtYVN0cmluZ0Zyb21MYWJlbFN1cHBvc2l0aW9uc0FuZERlZHVjdGlvbihsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24pLFxuICAgICAgICAgIG5vZGUgPSBudWxsLFxuICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgcHJvb2YgPSBudWxsLFxuICAgICAgICAgIHNjaGVtYSA9IG5ldyBTY2hlbWEoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24sIHByb29mLCBjb25zdHJhaW50cyk7XG5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG59KTtcblxuZnVuY3Rpb24gc3VicHJvb2ZBc3NlcnRpb25Gcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgc3VicHJvb2ZBc3NlcnRpb247XG5cbiAgY29uc3QgeyBTdWJwcm9vZkFzc2VydGlvbiB9ID0gZWxlbWVudHM7XG5cbiAgc3VicHJvb2ZBc3NlcnRpb24gPSBTdWJwcm9vZkFzc2VydGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKHN1YnByb29mQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgc3VicHJvb2ZBc3NlcnRpb24gPSBzdWJwcm9vZkFzc2VydGlvbi52YWxpZGF0ZShjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBzdWJwcm9vZkFzc2VydGlvbjtcblxufVxuIl0sIm5hbWVzIjpbImV2ZXJ5IiwiZm9yd2FyZHNFdmVyeSIsImNvbnRpbnVhdGlvblV0aWxpdGllcyIsImJyZWFrYWJsZSIsImJyZWFrUG9pbnRGcm9tSlNPTiIsImJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OIiwiYnJlYWtQb2ludFV0aWxpdGllcyIsImRlZmluZSIsIlNjaGVtYSIsIkVsZW1lbnQiLCJjb250ZXh0Iiwic3RyaW5nIiwibm9kZSIsImJyZWFrUG9pbnQiLCJsYWJlbCIsInN1cHBvc2l0aW9ucyIsImRlZHVjdGlvbiIsInByb29mIiwiY29uc3RyYWludHMiLCJnZXRMYWJlbCIsImdldFN1cHBvc2l0aW9ucyIsImdldERlZHVjdGlvbiIsImdldFByb29mIiwiZ2V0TUNvbnN0cmFpbnQiLCJnZXRTdXBwb3NpdGlvbiIsImluZGV4Iiwic3VwcG9zaXRpb24iLCJpc0NvbmRpdGlvbmFsIiwic3VwcG9zaXRpb25zTGVuZ3RoIiwibGVuZ3RoIiwiY29uZGl0aW9uYWwiLCJjb21wYXJlUmVmZXJlbmNlIiwicmVmZXJlbmNlIiwibGFiZWxDb21wYXJlc1RvUmVmZmVyZW5jZSIsImNvbXBhcmVzVG9SZWZlcmVuY2UiLCJ2ZXJpZnkiLCJjb250aW51YXRpb24iLCJzY2hlbWFTdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsImVuY2Fwc3VsYXRlIiwidmVyaWZ5TGFiZWwiLCJiaW5kIiwidmVyaWZ5UHJvb2YiLCJ2ZXJpZnlEZWR1Y3Rpb24iLCJ2ZXJpZnlTdXBwb3NpdGlvbnMiLCJhbGwiLCJ2ZXJpZmllcyIsInNjaGVtYSIsImFkZFNjaGVtYSIsImRlYnVnIiwibGFiZWxTdHJpbmciLCJsYWJlbFZlcmlmaWVzIiwic3RhdGVtZW50IiwiZ2V0U3RhdGVtZW50IiwicHJvb2ZWZXJpZmllcyIsImRlZHVjdGlvblN0cmluZyIsImRlZHVjdGlvblZlcmlmaWVzIiwidmVyaWZ5U3VwcG9zaXRpb24iLCJzdXBwb3NpdGlvbnNWZXJpZnkiLCJzdXBwb3NpdGlvblN0cmluZyIsInN1cHBvc2l0aW9uVmVyaWZpZXMiLCJzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24iLCJhc3NpZ25Bc3NpZ25tZW50cyIsImFkZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbiIsInVuaWZ5SnVkZ2VtZW50IiwianVkZ2VtZW50IiwianVkZ2VtZW50U3RyaW5nIiwicmVjb25jaWxlIiwiZ2V0UmVmZXJlbmNlIiwidW5pZnlSZWZlcmVuY2UiLCJyZWZlcmVuY2VVbmlmaWVzIiwianVkZ2VtZW50VW5pZmllcyIsImFzc3VtcHRpb25zIiwiZ2V0QXNzdW1wdGlvbnMiLCJ1bmlmeUFzc3VtcHRpb25zIiwiYXNzdW1wdGlvbnNVbmlmeSIsInN1YnByb29mQXNzZXJ0aW9uIiwic3VicHJvb2ZBc3NlcnRpb25Gcm9tU3RhdGVtZW50IiwidW5pZnlTdWJwcm9vZkFzc2VydGlvbiIsInN1YnByb29mYXNzZXJ0aW9uVW5pZmllcyIsImRlZHVjZWRTdGF0bWVudCIsInVuaWZ5RGVkdWNlZFN0YXRlbWVudCIsImRlZHVjZWRTdGF0bWVudFVuZmlmaWVzIiwicmVmZXJlbmNlU3RyaW5nIiwiY29uc3RyYWludCIsImRlZHVjZWRTdGF0ZW1lbnQiLCJkZWR1Y2VkU3RhdGVtZW50U3RyaW5nIiwiZGVkdWN0aW9uQ29udGV4dCIsImdldENvbnRleHQiLCJnZW5lcmFsQ29udGV4dCIsInNwZWNpZmljQ29udGV4dCIsInVuaWZ5U3RhdGVtZW50Iiwic3RhdGVtZW50VW5pZmllcyIsImRlZHVjZWRTdGF0ZW1lbnRVbmlmaWVzIiwic3VicHJvb2ZBc3NlcnRpb25TdHJpbmciLCJnZXREZWR1Y2VkU3RhdGVtZW50Iiwic3VicHJvb2ZBc3NlcnRpb25VbmlmaWVzIiwic3VwcG9zZWRTdGF0ZW1lbnRzIiwiZ2V0U3VwcG9zZWRTdGF0ZW1lbnRzIiwidW5pZnlTdXBwb3NlZFN0YXRlbWVudHMiLCJzdXBwb3NlZFN0YXRlbWVudHNVbmlmeSIsInVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnQiLCJzdXBwb3NlZFN0YXRlbWVudCIsInN1cHBvc2VkU3RhdGVtZW50U3RyaW5nIiwic3VwcG9zaXRpb25Db250ZXh0Iiwic3VwcG9zZWRTdGF0ZW1lbnRVbmlmaWVzIiwic3VwcG9zZWRTdGF0ZW1lbnRzTGVuZ3RoIiwidG9KU09OIiwibGFiZWxKU09OIiwibGFiZWxUb0xhYmVsSlNPTiIsImRlZHVjdGlvbkpTT04iLCJkZWR1Y3Rpb25Ub0RlZHVjdGlvbkpTT04iLCJzdXBwb3NpdGlvbnNKU09OIiwic3VwcG9zaXRpb25zVG9TdXBwb3NpdGlvbnNKU09OIiwiY29uc3RyYWludHNKU09OIiwiY29uc3RyYWludHNUb0NvbnN0cmFpbnRzSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImpzb24iLCJuYW1lIiwiZnJvbUpTT04iLCJsYWJlbEZyb21KU09OIiwiZGVkdWN0aW9uRnJvbUpTT04iLCJzdXBwb3NpdGlvbnNGcm9tSlNPTiIsImNvbnN0cmFpbnRzRnJvbUpTT04iLCJzY2hlbWFTdHJpbmdGcm9tTGFiZWxTdXBwb3NpdGlvbnNBbmREZWR1Y3Rpb24iLCJTdWJwcm9vZkFzc2VydGlvbiIsImVsZW1lbnRzIiwiZnJvbVN0YXRlbWVudCIsInZhbGlkYXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFzQkE7OztlQUFBOzs7Z0NBcEJvRTtrRUFFL0M7OEJBRUQ7eUJBRW1CO3dCQUN1QjtzQkFRZjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9DLE1BQU0sRUFBRUEsS0FBSyxFQUFFQyxhQUFhLEVBQUUsR0FBR0MscUNBQXFCLEVBQ2hELEVBQUVDLFNBQVMsRUFBRUMsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUV6RixXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLGVBQWVDLHVCQUFPO0lBQ2hELFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsS0FBSyxFQUFFQyxZQUFZLEVBQUVDLFNBQVMsRUFBRUMsS0FBSyxFQUFFQyxXQUFXLENBQUU7UUFDakcsS0FBSyxDQUFDUixTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLEtBQUssR0FBR0E7UUFDYixJQUFJLENBQUNDLFlBQVksR0FBR0E7UUFDcEIsSUFBSSxDQUFDQyxTQUFTLEdBQUdBO1FBQ2pCLElBQUksQ0FBQ0MsS0FBSyxHQUFHQTtRQUNiLElBQUksQ0FBQ0MsV0FBVyxHQUFHQTtJQUNyQjtJQUVBQyxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUNMLEtBQUs7SUFDbkI7SUFFQU0sa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDTCxZQUFZO0lBQzFCO0lBRUFNLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQ0wsU0FBUztJQUN2QjtJQUVBTSxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUNMLEtBQUs7SUFDbkI7SUFFQU0saUJBQWlCO1FBQ2YsT0FBTyxJ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