occam-verify-cli 1.0.852 → 1.0.857

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 (78) hide show
  1. package/lib/context/file/nominal.js +18 -3
  2. package/lib/context/liminal.js +101 -102
  3. package/lib/context/mnemic.js +511 -0
  4. package/lib/context.js +23 -11
  5. package/lib/element/assertion/contained.js +8 -8
  6. package/lib/element/assertion/defined.js +6 -6
  7. package/lib/element/assertion/satisfies.js +4 -4
  8. package/lib/element/assertion/type.js +5 -4
  9. package/lib/element/assumption/metaLevel.js +7 -7
  10. package/lib/element/assumption.js +23 -15
  11. package/lib/element/combinator.js +4 -4
  12. package/lib/element/conclusion.js +4 -4
  13. package/lib/element/constructor.js +4 -4
  14. package/lib/element/declaration/combinator.js +4 -4
  15. package/lib/element/declaration/complexType.js +3 -3
  16. package/lib/element/declaration/constructor.js +6 -4
  17. package/lib/element/declaration/metavariable.js +7 -7
  18. package/lib/element/declaration/variable.js +6 -4
  19. package/lib/element/deduction.js +4 -4
  20. package/lib/element/frame.js +60 -48
  21. package/lib/element/judgement.js +16 -29
  22. package/lib/element/label.js +4 -4
  23. package/lib/element/metavariable.js +59 -58
  24. package/lib/element/proofAssertion/premise.js +4 -4
  25. package/lib/element/reference.js +20 -20
  26. package/lib/element/rule.js +4 -4
  27. package/lib/element/substitution/frame.js +9 -8
  28. package/lib/element/substitution/reference.js +7 -7
  29. package/lib/element/substitution/statement.js +12 -11
  30. package/lib/element/substitution/term.js +9 -8
  31. package/lib/element/topLevelAssertion.js +4 -4
  32. package/lib/element/topLevelMetaAssertion.js +2 -2
  33. package/lib/element/variable.js +8 -8
  34. package/lib/utilities/context.js +6 -6
  35. package/lib/utilities/element.js +3 -3
  36. package/lib/utilities/json.js +16 -16
  37. package/lib/utilities/string.js +7 -29
  38. package/lib/utilities/substitutions.js +6 -6
  39. package/package.json +1 -1
  40. package/src/context/file/nominal.js +24 -2
  41. package/src/context/liminal.js +116 -117
  42. package/src/context/{ephemeral.js → mnemic.js} +38 -40
  43. package/src/context.js +32 -12
  44. package/src/element/assertion/contained.js +7 -7
  45. package/src/element/assertion/defined.js +5 -5
  46. package/src/element/assertion/satisfies.js +3 -4
  47. package/src/element/assertion/type.js +5 -4
  48. package/src/element/assumption/metaLevel.js +6 -8
  49. package/src/element/assumption.js +28 -17
  50. package/src/element/combinator.js +3 -4
  51. package/src/element/conclusion.js +3 -4
  52. package/src/element/constructor.js +3 -4
  53. package/src/element/declaration/combinator.js +3 -4
  54. package/src/element/declaration/complexType.js +2 -2
  55. package/src/element/declaration/constructor.js +7 -4
  56. package/src/element/declaration/metavariable.js +6 -8
  57. package/src/element/declaration/variable.js +7 -4
  58. package/src/element/deduction.js +3 -4
  59. package/src/element/frame.js +81 -64
  60. package/src/element/judgement.js +21 -43
  61. package/src/element/label.js +3 -4
  62. package/src/element/metavariable.js +66 -73
  63. package/src/element/proofAssertion/premise.js +3 -4
  64. package/src/element/reference.js +21 -25
  65. package/src/element/rule.js +3 -3
  66. package/src/element/substitution/frame.js +7 -7
  67. package/src/element/substitution/reference.js +4 -6
  68. package/src/element/substitution/statement.js +9 -10
  69. package/src/element/substitution/term.js +7 -7
  70. package/src/element/topLevelAssertion.js +3 -3
  71. package/src/element/topLevelMetaAssertion.js +2 -2
  72. package/src/element/variable.js +7 -8
  73. package/src/utilities/context.js +9 -9
  74. package/src/utilities/element.js +3 -3
  75. package/src/utilities/json.js +9 -9
  76. package/src/utilities/string.js +11 -40
  77. package/src/utilities/substitutions.js +3 -3
  78. package/lib/context/ephemeral.js +0 -513
@@ -1,513 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return EphemeralContext;
9
- }
10
- });
11
- const _necessary = require("necessary");
12
- const _context = /*#__PURE__*/ _interop_require_default(require("../context"));
13
- const _synoptic = require("../utilities/synoptic");
14
- const _json = require("../utilities/json");
15
- function _interop_require_default(obj) {
16
- return obj && obj.__esModule ? obj : {
17
- default: obj
18
- };
19
- }
20
- const { push } = _necessary.arrayUtilities;
21
- class EphemeralContext extends _context.default {
22
- constructor(context, terms, frames, equalities, judgements, assertions, statements, references, assumptions, metavariables, substitutions){
23
- super(context);
24
- this.terms = terms;
25
- this.frames = frames;
26
- this.equalities = equalities;
27
- this.judgements = judgements;
28
- this.assertions = assertions;
29
- this.statements = statements;
30
- this.references = references;
31
- this.assumptions = assumptions;
32
- this.metavariables = metavariables;
33
- this.substitutions = substitutions;
34
- }
35
- getTerms(terms = []) {
36
- const context = this.getContext();
37
- push(terms, this.terms);
38
- context.getTerms(terms);
39
- (0, _synoptic.compressTerms)(context);
40
- return terms;
41
- }
42
- getFrames(frames = []) {
43
- const context = this.getContext();
44
- push(frames, this.frames);
45
- context.getFrames(frames);
46
- (0, _synoptic.compressFrames)(context);
47
- return frames;
48
- }
49
- getEqualities(equalities = []) {
50
- const context = this.getContext();
51
- push(equalities, this.equalities);
52
- context.getEqualities(equalities);
53
- (0, _synoptic.compressEqualities)(context);
54
- return equalities;
55
- }
56
- getJudgements(judgements = []) {
57
- const context = this.getContext();
58
- push(judgements, this.judgements);
59
- context.getJudgements(judgements);
60
- (0, _synoptic.compressJudgements)(context);
61
- return judgements;
62
- }
63
- getStatements(statements = []) {
64
- const context = this.getContext();
65
- push(statements, this.statements);
66
- context.getStatements(statements);
67
- (0, _synoptic.compressStatements)(context);
68
- return statements;
69
- }
70
- getAssertions(assertions = []) {
71
- const context = this.getContext();
72
- push(assertions, this.assertions);
73
- context.getAssertions(assertions);
74
- (0, _synoptic.compressAssertions)(context);
75
- return assertions;
76
- }
77
- getReferences(references = []) {
78
- const context = this.getContext();
79
- push(references, this.references);
80
- context.getReferences(references);
81
- (0, _synoptic.compressReferences)(context);
82
- return references;
83
- }
84
- getAssumptions(assumptions = []) {
85
- const context = this.getContext();
86
- push(assumptions, this.assumptions);
87
- context.getAssumptions(assumptions);
88
- (0, _synoptic.compressAssumptions)(context);
89
- return assumptions;
90
- }
91
- getMetavariables(metavariables = []) {
92
- const context = this.getContext();
93
- push(metavariables, this.metavariables);
94
- context.getMetavariables(metavariables);
95
- (0, _synoptic.compressMetavariables)(context);
96
- return metavariables;
97
- }
98
- getSubstitutions(substitutions = []) {
99
- const context = this.getContext();
100
- push(substitutions, this.substitutions);
101
- context.getSubstitutions(substitutions);
102
- (0, _synoptic.compressSubstitutions)(context);
103
- return substitutions;
104
- }
105
- addTerm(term) {
106
- const context = this, termA = term, termString = term.getString();
107
- context.trace(`Adding the '${termString}' term to the ephemeral context...`);
108
- const terms = this.getTerms(), termB = terms.find((term)=>{
109
- const termB = term, termAComparesToTermB = termA.compareTerm(termB);
110
- if (termAComparesToTermB) {
111
- return true;
112
- }
113
- }) || null;
114
- if (termB !== null) {
115
- context.trace(`The '${termString}' term has already been added to the ephemeral context.`);
116
- } else {
117
- this.terms.push(term);
118
- }
119
- context.debug(`...added the '${termString}' term to the ephemeral context.`);
120
- }
121
- addFrame(frame) {
122
- const context = this, frameA = frame, frameString = frame.getString();
123
- context.trace(`Adding the '${frameString}' frame to the ephemeral context...`);
124
- const frames = this.getFrames(), frameB = frames.find((frame)=>{
125
- const frameB = frame, frameAEqualToFrameB = frameA.isEqualTo(frameB);
126
- if (frameAEqualToFrameB) {
127
- return true;
128
- }
129
- }) || null;
130
- if (frameB !== null) {
131
- context.trace(`The '${frameString}' frame has already been added to the ephemeral context.`);
132
- } else {
133
- this.frames.push(frame);
134
- }
135
- context.debug(`...added the '${frameString}' frame to the ephemeral context.`);
136
- }
137
- addEquality(equality) {
138
- const context = this, equalityA = equality, equalityString = equality.getString();
139
- context.trace(`Adding the '${equalityString}' equality to the ephemeral context...`);
140
- const equalities = this.getEqualities(), equalityB = equalities.find((equality)=>{
141
- const equalityB = equality, equalityAEqualToEqualityB = equalityA.isEqualTo(equalityB);
142
- if (equalityAEqualToEqualityB) {
143
- return true;
144
- }
145
- }) || null;
146
- if (equalityB !== null) {
147
- context.trace(`The '${equalityString}' equality has already been added to the ephemeral context.`);
148
- } else {
149
- this.equalities.push(equality);
150
- }
151
- context.debug(`...added the '${equalityString}' equality to the ephemeral context.`);
152
- }
153
- addJudgement(judgement) {
154
- const context = this, judgementA = judgement, judgementString = judgement.getString();
155
- context.trace(`Adding the '${judgementString}' judgement to the ephemeral context...`);
156
- const judgements = this.getJudgements(), judgementB = judgements.find((judgement)=>{
157
- const judgementB = judgement, judgementAEqualToEqualityB = judgementA.isEqualTo(judgementB);
158
- if (judgementAEqualToEqualityB) {
159
- return true;
160
- }
161
- }) || null;
162
- if (judgementB !== null) {
163
- context.trace(`The '${judgementString}' judgement has already been added to the ephemeral context.`);
164
- } else {
165
- this.judgements.push(judgement);
166
- }
167
- context.debug(`...added the '${judgementString}' judgement to the ephemeral context.`);
168
- }
169
- addStatement(statement) {
170
- const context = this, statementA = statement, statementString = statement.getString();
171
- context.trace(`Adding the '${statementString}' statement to the ephemeral context...`);
172
- const statements = this.getStatements(), statementB = statements.find((statement)=>{
173
- const statementB = statement, statementAEqualToStatementB = statementA.isEqualTo(statementB);
174
- if (statementAEqualToStatementB) {
175
- return true;
176
- }
177
- }) || null;
178
- if (statementB !== null) {
179
- context.trace(`The '${statementString}' statement has already been added to the ephemeral context.`);
180
- } else {
181
- this.statements.push(statement);
182
- }
183
- context.debug(`...added the '${statementString}' statement to the ephemeral context.`);
184
- }
185
- addAssertion(assertion) {
186
- const context = this, assertionA = assertion, assertionString = assertion.getString();
187
- context.trace(`Adding the '${assertionString}' assertion to the ephemeral context...`);
188
- const assertions = this.getAssumptions(), assertionB = assertions.find((assertion)=>{
189
- const assertionB = assertion, assertionAEqualToAssertionB = assertionA.isEqualTo(assertionB);
190
- if (assertionAEqualToAssertionB) {
191
- return true;
192
- }
193
- }) || null;
194
- if (assertionB !== null) {
195
- context.trace(`The '${assertionString}' assertion has already been added to the ephemeral context.`);
196
- } else {
197
- this.assertions.push(assertion);
198
- }
199
- context.debug(`...added the '${assertionString}' assertion to the ephemeral context.`);
200
- }
201
- addReference(reference) {
202
- const context = this, referenceA = reference, referenceString = reference.getString();
203
- context.trace(`Adding the '${referenceString}' reference to the ephemeral context...`);
204
- const references = this.getReferences(), referenceB = references.find((reference)=>{
205
- const referenceB = reference, referenceAEqualToReferenceB = referenceA.isEqualTo(referenceB);
206
- if (referenceAEqualToReferenceB) {
207
- return true;
208
- }
209
- }) || null;
210
- if (referenceB !== null) {
211
- context.trace(`The '${referenceString}' reference has already been added to the ephemeral context.`);
212
- } else {
213
- this.references.push(reference);
214
- }
215
- context.debug(`...added the '${referenceString}' reference to the ephemeral context.`);
216
- }
217
- addAssumption(assumption) {
218
- const context = this, assumptionA = assumption, assumptionString = assumption.getString();
219
- context.trace(`Adding the '${assumptionString}' assumption to the ephemeral context...`);
220
- const assumptions = this.getAssumptions(), assumptionB = assumptions.find((assumption)=>{
221
- const assumptionB = assumption, assumptionAEqualToAssumptionB = assumptionA.isEqualTo(assumptionB);
222
- if (assumptionAEqualToAssumptionB) {
223
- return true;
224
- }
225
- }) || null;
226
- if (assumptionB !== null) {
227
- context.trace(`The '${assumptionString}' assumption has already been added to the ephemeral context.`);
228
- } else {
229
- this.assumptions.push(assumption);
230
- }
231
- context.debug(`...added the '${assumptionString}' assumption to the ephemeral context.`);
232
- }
233
- addMetavariable(metavariable) {
234
- const context = this, metavariableA = metavariable, metavariableString = metavariable.getString();
235
- context.trace(`Adding the '${metavariableString}' metavariable to the ephemeral context...`);
236
- const metavariables = this.getMetavariables(), metavariableB = metavariables.find((metavariable)=>{
237
- const metavariableB = metavariable, metavariableAEqualToSubstitutionB = metavariableA.isEqualTo(metavariableB);
238
- if (metavariableAEqualToSubstitutionB) {
239
- return true;
240
- }
241
- }) || null;
242
- if (metavariableB !== null) {
243
- context.trace(`The '${metavariableString}' metavariable has already been added to the ephemeral context.`);
244
- } else {
245
- this.metavariables.push(metavariable);
246
- }
247
- context.debug(`...added the '${metavariableString}' metavariable to the ephemeral context.`);
248
- }
249
- addSubstitution(substitution) {
250
- const context = this, substitutionA = substitution, substitutionString = substitution.getString();
251
- context.trace(`Adding the '${substitutionString}' substitution to the ephemeral context...`);
252
- const substitutions = this.getSubstitutions(), substitutionB = substitutions.find((substitution)=>{
253
- const substitutionB = substitution, substitutionAEqualToSubstitutionB = substitutionA.isEqualTo(substitutionB);
254
- if (substitutionAEqualToSubstitutionB) {
255
- return true;
256
- }
257
- }) || null;
258
- if (substitutionB !== null) {
259
- context.trace(`The '${substitutionString}' substitution has already been added to the ephemeral context.`);
260
- } else {
261
- this.substitutions.push(substitution);
262
- }
263
- context.debug(`...added the '${substitutionString}' substitution to the ephemeral context.`);
264
- }
265
- addTerms(terms) {
266
- terms.forEach((term)=>{
267
- this.addTerm(term);
268
- });
269
- }
270
- addFrames(frames) {
271
- frames.forEach((frame)=>{
272
- this.addFrame(frame);
273
- });
274
- }
275
- addEqualities(equalities) {
276
- equalities.forEach((equality)=>{
277
- this.addEquality(equality);
278
- });
279
- }
280
- addJudgements(judgements) {
281
- judgements.forEach((judgement)=>{
282
- this.addJudgement(judgement);
283
- });
284
- }
285
- addAssertions(assertions) {
286
- assertions.forEach((assertion)=>{
287
- this.addAssertion(assertion);
288
- });
289
- }
290
- addStatements(statements) {
291
- statements.forEach((statement)=>{
292
- this.addStatement(statement);
293
- });
294
- }
295
- addReferences(references) {
296
- references.forEach((reference)=>{
297
- this.addReference(reference);
298
- });
299
- }
300
- addAssumptions(assumptions) {
301
- assumptions.forEach((assumption)=>{
302
- this.addAssumption(assumption);
303
- });
304
- }
305
- addMetavariables(metavariables) {
306
- metavariables.forEach((metavariable)=>{
307
- this.addMetavariable(metavariable);
308
- });
309
- }
310
- addSubstitutions(substitutions) {
311
- substitutions.forEach((substitution)=>{
312
- this.addSubstitution(substitution);
313
- });
314
- }
315
- findVariableByVariableNode(variableNode) {
316
- const variableIdentifier = variableNode.getVariableIdentifier(), declaredVariable = this.findDeclaredVariableByVariableIdentifier(variableIdentifier), variable = declaredVariable; ///
317
- return variable;
318
- }
319
- findTermByTermNode(termNode) {
320
- const terms = this.getTerms(), term = terms.find((term)=>{
321
- const termNodeMatches = term.matchTermNode(termNode);
322
- if (termNodeMatches) {
323
- return true;
324
- }
325
- }) || null;
326
- return term;
327
- }
328
- findFrameByFrameNode(frameNode) {
329
- const frames = this.getFrames(), frame = frames.find((frame)=>{
330
- const frameNodeMatches = frame.matchFrameNode(frameNode);
331
- if (frameNodeMatches) {
332
- return true;
333
- }
334
- }) || null;
335
- return frame;
336
- }
337
- findEqualityByEqualityNode(equalityNode) {
338
- const equalities = this.getEqualities(), equality = equalities.find((equality)=>{
339
- const equalityNodeMatches = equality.matchEqualityNode(equalityNode);
340
- if (equalityNodeMatches) {
341
- return true;
342
- }
343
- }) || null;
344
- return equality;
345
- }
346
- findJudgementByJudgementNode(judgementNode) {
347
- const judgements = this.getJudgements(), judgement = judgements.find((judgement)=>{
348
- const judgementNodeMatches = judgement.matchJudgementNode(judgementNode);
349
- if (judgementNodeMatches) {
350
- return true;
351
- }
352
- }) || null;
353
- return judgement;
354
- }
355
- findStatementByStatementNode(statementNode) {
356
- const statements = this.getStatements(), statement = statements.find((statement)=>{
357
- const statementNodeMatches = statement.matchStatementNode(statementNode);
358
- if (statementNodeMatches) {
359
- return true;
360
- }
361
- }) || null;
362
- return statement;
363
- }
364
- findReferenceByReferenceNode(referenceNode) {
365
- const references = this.getReferences(), reference = references.find((reference)=>{
366
- const referenceMatcheReferenceNode = reference.matchReferenceNode(referenceNode);
367
- if (referenceMatcheReferenceNode) {
368
- return true;
369
- }
370
- }) || null;
371
- return reference;
372
- }
373
- findAssertionByAssertionNode(assertionNode) {
374
- const assertions = this.getAssertions(), assertion = assertions.find((assertion)=>{
375
- const assertionNodeMatches = assertion.matchAssertionNode(assertionNode);
376
- if (assertionNodeMatches) {
377
- return true;
378
- }
379
- }) || null;
380
- return assertion;
381
- }
382
- findAssumptionByAssumptionNode(assumptionNode) {
383
- const assumptions = this.getAssumptions(), assumption = assumptions.find((assumption)=>{
384
- const assumptionNodeMatches = assumption.matchAssumptionNode(assumptionNode);
385
- if (assumptionNodeMatches) {
386
- return true;
387
- }
388
- }) || null;
389
- return assumption;
390
- }
391
- findReferenceByMetavariableNode(metavariableNode) {
392
- const references = this.getReferences(), reference = references.find((reference)=>{
393
- const referenceMatcheMetavariableNode = reference.matchMetavariableNode(metavariableNode);
394
- if (referenceMatcheMetavariableNode) {
395
- return true;
396
- }
397
- }) || null;
398
- return reference;
399
- }
400
- findMetavariableByMetavariableNode(metavariableNode) {
401
- const metavariables = this.getMetavariables(), metavariable = metavariables.find((metavariable)=>{
402
- const metavariableNodeMatches = metavariable.matchMetavariableNode(metavariableNode);
403
- if (metavariableNodeMatches) {
404
- return true;
405
- }
406
- }) || null;
407
- return metavariable;
408
- }
409
- findSubstitutionBySubstitutionNode(substitutionNode) {
410
- const substitutions = this.getSubstitutions(), substitution = substitutions.find((substitution)=>{
411
- const substitutionNodeMatches = substitution.matchSubstitutionNode(substitutionNode);
412
- if (substitutionNodeMatches) {
413
- return true;
414
- }
415
- }) || null;
416
- return substitution;
417
- }
418
- isTermPresentByTermNode(termNode) {
419
- const term = this.findTermByTermNode(termNode), termPresent = term !== null;
420
- return termPresent;
421
- }
422
- isFramePresentByFrameNode(frameNode) {
423
- const frame = this.findFrameByFrameNode(frameNode), framePresent = frame !== null;
424
- return framePresent;
425
- }
426
- isEqualityPresentByEqualityNode(equalityNode) {
427
- const equality = this.findEqualityByEqualityNode(equalityNode), equalityPresent = equality !== null;
428
- return equalityPresent;
429
- }
430
- isJudgementPresentByJudgementNode(judgementNode) {
431
- const judgement = this.findJudgementByJudgementNode(judgementNode), judgementPresent = judgement !== null;
432
- return judgementPresent;
433
- }
434
- isStatementPresentByStatementNode(statementNode) {
435
- const statement = this.findStatementByStatementNode(statementNode), statementPresent = statement !== null;
436
- return statementPresent;
437
- }
438
- isAssertionPresentByAssertionNode(assertionNode) {
439
- const assertion = this.findAssertionByAssertionNode(assertionNode), assertionPresent = assertion !== null;
440
- return assertionPresent;
441
- }
442
- isAssumptionPresentByAssumptionNode(assumptionNode) {
443
- const assumption = this.findAssumptionByAssumptionNode(assumptionNode), assumptionPresent = assumption !== null;
444
- return assumptionPresent;
445
- }
446
- isReferencePresentByMetavariableNode(metavariableNode) {
447
- const reference = this.findReferenceByMetavariableNode(metavariableNode), referencePresent = reference !== null;
448
- return referencePresent;
449
- }
450
- isMetavariablePresentByMetavariableNode(metavariablenNode) {
451
- const metavariablen = this.findMetavariableByMetavariableNode(metavariablenNode), metavariablenPresent = metavariablen !== null;
452
- return metavariablenPresent;
453
- }
454
- isSubstitutionPresentBySubstitutionNode(substitutionNode) {
455
- const substitution = this.findSubstitutionBySubstitutionNode(substitutionNode), substitutionPresent = substitution !== null;
456
- return substitutionPresent;
457
- }
458
- commit(element) {
459
- const context = this; ///
460
- element.setContext(context);
461
- }
462
- initialise(json) {
463
- const context = this; ///
464
- this.terms = (0, _json.termsFromJSON)(json, context);
465
- this.metavariables = (0, _json.metavariablesFromJSON)(json, context);
466
- this.statements = (0, _json.statementsFromJSON)(json, context);
467
- this.references = (0, _json.referencesFromJSON)(json, context);
468
- this.equalities = (0, _json.equalitiesFromJSON)(json, context);
469
- this.assumptions = (0, _json.assumptionsFromJSON)(json, context);
470
- this.frames = (0, _json.framesFromJSON)(json, context);
471
- this.judgements = (0, _json.judgementsFromJSON)(json, context);
472
- this.assertions = (0, _json.assertionsFromJSON)(json, context);
473
- this.substitutions = (0, _json.substitutionsFromJSON)(json, context);
474
- }
475
- toJSON() {
476
- let terms = this.getTerms(), frames = this.getFrames(), judgements = this.getJudgements(), equalities = this.getEqualities(), statements = this.getStatements(), assertions = this.getAssertions(), references = this.getReferences(), assumptions = this.getAssumptions(), metavariables = this.getMetavariables(), substitutions = this.getSubstitutions();
477
- const termsJSON = (0, _json.termsToTermsJSON)(terms), framesJSON = (0, _json.framesToFramesJSON)(frames), judgementsJSON = (0, _json.judgementsToJudgementsJSON)(judgements), equalitiesJSON = (0, _json.equalitiesToEqualitiesJSON)(equalities), statementsJSON = (0, _json.statementsToStatementsJSON)(statements), assertionsJSON = (0, _json.assertionsToAssertionsJSON)(assertions), referencesJSON = (0, _json.referencesToReferencesJSON)(references), assumptionsJSON = (0, _json.assumptionsToAssumptionsJSON)(assumptions), metavariablesJSON = (0, _json.metavariablesToMetavariablesJSON)(metavariables), substitutionsJSON = (0, _json.substitutionsToSubstitutionsJSON)(substitutions);
478
- terms = termsJSON; ///
479
- frames = framesJSON; ///
480
- judgements = judgementsJSON; ///
481
- equalities = equalitiesJSON; ///
482
- statements = statementsJSON; ///
483
- assertions = assertionsJSON; ///
484
- references = referencesJSON; ///
485
- assumptions = assumptionsJSON; ///
486
- metavariables = metavariablesJSON; //
487
- substitutions = substitutionsJSON; ///
488
- const json = {
489
- terms,
490
- frames,
491
- judgements,
492
- equalities,
493
- statements,
494
- assertions,
495
- references,
496
- assumptions,
497
- metavariables,
498
- substitutions
499
- };
500
- return json;
501
- }
502
- static fromJSON(json, context) {
503
- const terms = null, frames = null, equalities = null, judgements = null, statements = null, assertions = null, references = null, assumptions = null, metavariables = null, substitutions = null, emphemeralContext = new EphemeralContext(context, terms, frames, equalities, judgements, assertions, statements, references, assumptions, metavariables, substitutions);
504
- emphemeralContext.initialise(json);
505
- return emphemeralContext;
506
- }
507
- static fromNothing(context) {
508
- const terms = [], frames = [], equalities = [], judgements = [], statements = [], assertions = [], references = [], assumptions = [], metavariables = [], substitutions = [], emphemeralContext = new EphemeralContext(context, terms, frames, equalities, judgements, assertions, statements, references, assumptions, metavariables, substitutions);
509
- return emphemeralContext;
510
- }
511
- }
512
-
513
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2VwaGVtZXJhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmltcG9ydCB7IGNvbXByZXNzVGVybXMsXG4gICAgICAgICBjb21wcmVzc0ZyYW1lcyxcbiAgICAgICAgIGNvbXByZXNzRXF1YWxpdGllcyxcbiAgICAgICAgIGNvbXByZXNzSnVkZ2VtZW50cyxcbiAgICAgICAgIGNvbXByZXNzQXNzZXJ0aW9ucyxcbiAgICAgICAgIGNvbXByZXNzU3RhdGVtZW50cyxcbiAgICAgICAgIGNvbXByZXNzUmVmZXJlbmNlcyxcbiAgICAgICAgIGNvbXByZXNzQXNzdW1wdGlvbnMsXG4gICAgICAgICBjb21wcmVzc01ldGF2YXJpYWJsZXMsXG4gICAgICAgICBjb21wcmVzc1N1YnN0aXR1dGlvbnMsfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N5bm9wdGljXCI7XG5pbXBvcnQgeyB0ZXJtc0Zyb21KU09OLFxuICAgICAgICAgZnJhbWVzRnJvbUpTT04sXG4gICAgICAgICB0ZXJtc1RvVGVybXNKU09OLFxuICAgICAgICAgZnJhbWVzVG9GcmFtZXNKU09OLFxuICAgICAgICAganVkZ2VtZW50c0Zyb21KU09OLFxuICAgICAgICAgZXF1YWxpdGllc0Zyb21KU09OLFxuICAgICAgICAgc3RhdGVtZW50c0Zyb21KU09OLFxuICAgICAgICAgYXNzZXJ0aW9uc0Zyb21KU09OLFxuICAgICAgICAgcmVmZXJlbmNlc0Zyb21KU09OLFxuICAgICAgICAgYXNzdW1wdGlvbnNGcm9tSlNPTixcbiAgICAgICAgIG1ldGF2YXJpYWJsZXNGcm9tSlNPTixcbiAgICAgICAgIHN1YnN0aXR1dGlvbnNGcm9tSlNPTixcbiAgICAgICAgIGp1ZGdlbWVudHNUb0p1ZGdlbWVudHNKU09OLFxuICAgICAgICAgZXF1YWxpdGllc1RvRXF1YWxpdGllc0pTT04sXG4gICAgICAgICBzdGF0ZW1lbnRzVG9TdGF0ZW1lbnRzSlNPTixcbiAgICAgICAgIGFzc2VydGlvbnNUb0Fzc2VydGlvbnNKU09OLFxuICAgICAgICAgcmVmZXJlbmNlc1RvUmVmZXJlbmNlc0pTT04sXG4gICAgICAgICBhc3N1bXB0aW9uc1RvQXNzdW1wdGlvbnNKU09OLFxuICAgICAgICAgbWV0YXZhcmlhYmxlc1RvTWV0YXZhcmlhYmxlc0pTT04sXG4gICAgICAgICBzdWJzdGl0dXRpb25zVG9TdWJzdGl0dXRpb25zSlNPTiB9IGZyb20gXCIuLi91dGlsaXRpZXMvanNvblwiO1xuXG5jb25zdCB7IHB1c2ggfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFcGhlbWVyYWxDb250ZXh0IGV4dGVuZHMgQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHRlcm1zLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGp1ZGdlbWVudHMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIHJlZmVyZW5jZXMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzLCBzdWJzdGl0dXRpb25zKSB7XG4gICAgc3VwZXIoY29udGV4dCk7XG5cbiAgICB0aGlzLnRlcm1zID0gdGVybXM7XG4gICAgdGhpcy5mcmFtZXMgPSBmcmFtZXM7XG4gICAgdGhpcy5lcXVhbGl0aWVzID0gZXF1YWxpdGllcztcbiAgICB0aGlzLmp1ZGdlbWVudHMgPSBqdWRnZW1lbnRzO1xuICAgIHRoaXMuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnM7XG4gICAgdGhpcy5zdGF0ZW1lbnRzID0gc3RhdGVtZW50cztcbiAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgIHRoaXMuYXNzdW1wdGlvbnMgPSBhc3N1bXB0aW9ucztcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzO1xuICAgIHRoaXMuc3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBnZXRUZXJtcyh0ZXJtcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaCh0ZXJtcywgdGhpcy50ZXJtcyk7XG5cbiAgICBjb250ZXh0LmdldFRlcm1zKHRlcm1zKTtcblxuICAgIGNvbXByZXNzVGVybXMoY29udGV4dCk7XG5cbiAgICByZXR1cm4gdGVybXM7XG4gIH1cblxuICBnZXRGcmFtZXMoZnJhbWVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGZyYW1lcywgdGhpcy5mcmFtZXMpO1xuXG4gICAgY29udGV4dC5nZXRGcmFtZXMoZnJhbWVzKTtcblxuICAgIGNvbXByZXNzRnJhbWVzKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZyYW1lcztcbiAgfVxuXG4gIGdldEVxdWFsaXRpZXMoZXF1YWxpdGllcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChlcXVhbGl0aWVzLCB0aGlzLmVxdWFsaXRpZXMpO1xuXG4gICAgY29udGV4dC5nZXRFcXVhbGl0aWVzKGVxdWFsaXRpZXMpO1xuXG4gICAgY29tcHJlc3NFcXVhbGl0aWVzKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXRpZXM7XG4gIH1cblxuICBnZXRKdWRnZW1lbnRzKGp1ZGdlbWVudHMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goanVkZ2VtZW50cywgdGhpcy5qdWRnZW1lbnRzKTtcblxuICAgIGNvbnRleHQuZ2V0SnVkZ2VtZW50cyhqdWRnZW1lbnRzKTtcblxuICAgIGNvbXByZXNzSnVkZ2VtZW50cyhjb250ZXh0KTtcblxuICAgIHJldHVybiBqdWRnZW1lbnRzO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50cyhzdGF0ZW1lbnRzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHN0YXRlbWVudHMsIHRoaXMuc3RhdGVtZW50cyk7XG5cbiAgICBjb250ZXh0LmdldFN0YXRlbWVudHMoc3RhdGVtZW50cyk7XG5cbiAgICBjb21wcmVzc1N0YXRlbWVudHMoY29udGV4dCk7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgfVxuXG4gIGdldEFzc2VydGlvbnMoYXNzZXJ0aW9ucyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChhc3NlcnRpb25zLCB0aGlzLmFzc2VydGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRBc3NlcnRpb25zKGFzc2VydGlvbnMpO1xuXG4gICAgY29tcHJlc3NBc3NlcnRpb25zKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbnM7XG4gIH1cblxuICBnZXRSZWZlcmVuY2VzKHJlZmVyZW5jZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gocmVmZXJlbmNlcywgdGhpcy5yZWZlcmVuY2VzKTtcblxuICAgIGNvbnRleHQuZ2V0UmVmZXJlbmNlcyhyZWZlcmVuY2VzKTtcblxuICAgIGNvbXByZXNzUmVmZXJlbmNlcyhjb250ZXh0KTtcblxuICAgIHJldHVybiByZWZlcmVuY2VzO1xuICB9XG5cbiAgZ2V0QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goYXNzdW1wdGlvbnMsIHRoaXMuYXNzdW1wdGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucyk7XG5cbiAgICBjb21wcmVzc0Fzc3VtcHRpb25zKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25zO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKG1ldGF2YXJpYWJsZXMsIHRoaXMubWV0YXZhcmlhYmxlcyk7XG5cbiAgICBjb250ZXh0LmdldE1ldGF2YXJpYWJsZXMobWV0YXZhcmlhYmxlcyk7XG5cbiAgICBjb21wcmVzc01ldGF2YXJpYWJsZXMoY29udGV4dCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGdldFN1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChzdWJzdGl0dXRpb25zLCB0aGlzLnN1YnN0aXR1dGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRTdWJzdGl0dXRpb25zKHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgY29tcHJlc3NTdWJzdGl0dXRpb25zKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBhZGRUZXJtKHRlcm0pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgdGVybUEgPSB0ZXJtLCAvLy9cbiAgICAgICAgICB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCB0ZXJtcyA9IHRoaXMuZ2V0VGVybXMoKSxcbiAgICAgICAgICB0ZXJtQiA9IHRlcm1zLmZpbmQoKHRlcm0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1CID0gdGVybSwgLy8vXG4gICAgICAgICAgICAgICAgICB0ZXJtQUNvbXBhcmVzVG9UZXJtQiA9IHRlcm1BLmNvbXBhcmVUZXJtKHRlcm1CKTtcbiAgICAgIFxuICAgICAgICAgICAgaWYgKHRlcm1BQ29tcGFyZXNUb1Rlcm1CKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAodGVybUIgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXJtcy5wdXNoKHRlcm0pO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRGcmFtZShmcmFtZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBmcmFtZUEgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7ZnJhbWVTdHJpbmd9JyBmcmFtZSB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGZyYW1lcyA9IHRoaXMuZ2V0RnJhbWVzKCksXG4gICAgICAgICAgZnJhbWVCID0gZnJhbWVzLmZpbmQoKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmFtZUIgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgICAgICAgICBmcmFtZUFFcXVhbFRvRnJhbWVCID0gZnJhbWVBLmlzRXF1YWxUbyhmcmFtZUIpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAoZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKGZyYW1lQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZnJhbWVzLnB1c2goZnJhbWUpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEVxdWFsaXR5KGVxdWFsaXR5KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGVxdWFsaXR5QSA9IGVxdWFsaXR5LCAvLy9cbiAgICAgICAgICBlcXVhbGl0eVN0cmluZyA9IGVxdWFsaXR5LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtlcXVhbGl0eVN0cmluZ30nIGVxdWFsaXR5IHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgZXF1YWxpdGllcyA9IHRoaXMuZ2V0RXF1YWxpdGllcygpLFxuICAgICAgICAgIGVxdWFsaXR5QiA9IGVxdWFsaXRpZXMuZmluZCgoZXF1YWxpdHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsaXR5QiA9IGVxdWFsaXR5LCAvLy9cbiAgICAgICAgICAgICAgICAgIGVxdWFsaXR5QUVxdWFsVG9FcXVhbGl0eUIgPSBlcXVhbGl0eUEuaXNFcXVhbFRvKGVxdWFsaXR5Qik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChlcXVhbGl0eUFFcXVhbFRvRXF1YWxpdHlCKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAoZXF1YWxpdHlCICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcXVhbGl0aWVzLnB1c2goZXF1YWxpdHkpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtlcXVhbGl0eVN0cmluZ30nIGVxdWFsaXR5IHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEp1ZGdlbWVudChqdWRnZW1lbnQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAganVkZ2VtZW50QSA9IGp1ZGdlbWVudCwgLy8vXG4gICAgICAgICAganVkZ2VtZW50U3RyaW5nID0ganVkZ2VtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQgdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50QiA9IGp1ZGdlbWVudHMuZmluZCgoanVkZ2VtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBqdWRnZW1lbnRCID0ganVkZ2VtZW50LCAvLy9cbiAgICAgICAgICAgICAgICAgIGp1ZGdlbWVudEFFcXVhbFRvRXF1YWxpdHlCID0ganVkZ2VtZW50QS5pc0VxdWFsVG8oanVkZ2VtZW50Qik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChqdWRnZW1lbnRBRXF1YWxUb0VxdWFsaXR5Qikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKGp1ZGdlbWVudEIgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuanVkZ2VtZW50cy5wdXNoKGp1ZGdlbWVudCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnQoc3RhdGVtZW50KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIHN0YXRlbWVudEEgPSBzdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IHRoaXMuZ2V0U3RhdGVtZW50cygpLFxuICAgICAgICAgIHN0YXRlbWVudEIgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50QiA9IHN0YXRlbWVudCwgLy8vXG4gICAgICAgICAgICAgICAgICBzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIgPSBzdGF0ZW1lbnRBLmlzRXF1YWxUbyhzdGF0ZW1lbnRCKTtcbiAgICAgIFxuICAgICAgICAgICAgaWYgKHN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50Qikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKHN0YXRlbWVudEIgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRBc3NlcnRpb24oYXNzZXJ0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGFzc2VydGlvbkEgPSBhc3NlcnRpb24sIC8vL1xuICAgICAgICAgIGFzc2VydGlvblN0cmluZyA9IGFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7YXNzZXJ0aW9uU3RyaW5nfScgYXNzZXJ0aW9uIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzdW1wdGlvbnMoKSxcbiAgICAgICAgICBhc3NlcnRpb25CID0gYXNzZXJ0aW9ucy5maW5kKChhc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2VydGlvbkIgPSBhc3NlcnRpb24sIC8vL1xuICAgICAgICAgICAgICAgICAgYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CID0gYXNzZXJ0aW9uQS5pc0VxdWFsVG8oYXNzZXJ0aW9uQik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIGlmIChhc3NlcnRpb25CICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7YXNzZXJ0aW9uU3RyaW5nfScgYXNzZXJ0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydGlvbnMucHVzaChhc3NlcnRpb24pO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICByZWZlcmVuY2VBID0gcmVmZXJlbmNlLCAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB0byB0aGUgZXBoZW1lcmFsIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2VCID0gcmVmZXJlbmNlcy5maW5kKChyZWZlcmVuY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZUIgPSByZWZlcmVuY2UsIC8vL1xuICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlQUVxdWFsVG9SZWZlcmVuY2VCID0gcmVmZXJlbmNlQS5pc0VxdWFsVG8ocmVmZXJlbmNlQik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VBRXF1YWxUb1JlZmVyZW5jZUIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIGlmIChyZWZlcmVuY2VCICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2UgdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbihhc3N1bXB0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGFzc3VtcHRpb25BID0gYXNzdW1wdGlvbiwgLy8vXG4gICAgICAgICAgYXNzdW1wdGlvblN0cmluZyA9IGFzc3VtcHRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgYXNzdW1wdGlvbnMgPSB0aGlzLmdldEFzc3VtcHRpb25zKCksXG4gICAgICAgICAgYXNzdW1wdGlvbkIgPSBhc3N1bXB0aW9ucy5maW5kKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uQiA9IGFzc3VtcHRpb24sIC8vL1xuICAgICAgICAgICAgICAgICAgYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIgPSBhc3N1bXB0aW9uQS5pc0VxdWFsVG8oYXNzdW1wdGlvbkIpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAoYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIGlmIChhc3N1bXB0aW9uQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc3VtcHRpb25zLnB1c2goYXNzdW1wdGlvbik7XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlQSA9IG1ldGF2YXJpYWJsZSwgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbWV0YXZhcmlhYmxlLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlQiA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVCID0gbWV0YXZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgICAgICAgIG1ldGF2YXJpYWJsZUFFcXVhbFRvU3Vic3RpdHV0aW9uQiA9IG1ldGF2YXJpYWJsZUEuaXNFcXVhbFRvKG1ldGF2YXJpYWJsZUIpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlQUVxdWFsVG9TdWJzdGl0dXRpb25CKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhdmFyaWFibGVzLnB1c2gobWV0YXZhcmlhYmxlKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgc3Vic3RpdHV0aW9uQSA9IHN1YnN0aXR1dGlvbiwgLy8vXG4gICAgICAgICAgc3Vic3RpdHV0aW9uU3RyaW5nID0gc3Vic3RpdHV0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtzdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24gdG8gdGhlIGVwaGVtZXJhbCBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gdGhpcy5nZXRTdWJzdGl0dXRpb25zKCksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uQiA9IHN1YnN0aXR1dGlvbnMuZmluZCgoc3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25CID0gc3Vic3RpdHV0aW9uLCAvLy9cbiAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkFFcXVhbFRvU3Vic3RpdHV0aW9uQiA9IHN1YnN0aXR1dGlvbkEuaXNFcXVhbFRvKHN1YnN0aXR1dGlvbkIpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9uQUVxdWFsVG9TdWJzdGl0dXRpb25CKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAoc3Vic3RpdHV0aW9uQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke3N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbiBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdWJzdGl0dXRpb25zLnB1c2goc3Vic3RpdHV0aW9uKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7c3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uIHRvIHRoZSBlcGhlbWVyYWwgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFRlcm1zKHRlcm1zKSB7XG4gICAgdGVybXMuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgdGhpcy5hZGRUZXJtKHRlcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkRnJhbWVzKGZyYW1lcykge1xuICAgIGZyYW1lcy5mb3JFYWNoKChmcmFtZSkgPT4ge1xuICAgICAgdGhpcy5hZGRGcmFtZShmcmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRFcXVhbGl0aWVzKGVxdWFsaXRpZXMpIHtcbiAgICBlcXVhbGl0aWVzLmZvckVhY2goKGVxdWFsaXR5KSA9PiB7XG4gICAgICB0aGlzLmFkZEVxdWFsaXR5KGVxdWFsaXR5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEp1ZGdlbWVudHMoanVkZ2VtZW50cykge1xuICAgIGp1ZGdlbWVudHMuZm9yRWFjaCgoanVkZ2VtZW50KSA9PiB7XG4gICAgICB0aGlzLmFkZEp1ZGdlbWVudChqdWRnZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9ucyhhc3NlcnRpb25zKSB7XG4gICAgYXNzZXJ0aW9ucy5mb3JFYWNoKChhc3NlcnRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnRzKHN0YXRlbWVudHMpIHtcbiAgICBzdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4ge1xuICAgICAgdGhpcy5hZGRTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFJlZmVyZW5jZXMocmVmZXJlbmNlcykge1xuICAgIHJlZmVyZW5jZXMuZm9yRWFjaCgocmVmZXJlbmNlKSA9PiB7XG4gICAgICB0aGlzLmFkZFJlZmVyZW5jZShyZWZlcmVuY2UpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMpIHtcbiAgICBhc3N1bXB0aW9ucy5mb3JFYWNoKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICB0aGlzLmFkZEFzc3VtcHRpb24oYXNzdW1wdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGVzKG1ldGF2YXJpYWJsZXMpIHtcbiAgICBtZXRhdmFyaWFibGVzLmZvckVhY2goKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgdGhpcy5hZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFN1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucykge1xuICAgIHN1YnN0aXR1dGlvbnMuZm9yRWFjaCgoc3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICB0aGlzLmFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgZmluZFZhcmlhYmxlQnlWYXJpYWJsZU5vZGUodmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgdmFyaWFibGVJZGVudGlmaWVyID0gdmFyaWFibGVOb2RlLmdldFZhcmlhYmxlSWRlbnRpZmllcigpLFxuICAgICAgICAgIGRlY2xhcmVkVmFyaWFibGUgPSB0aGlzLmZpbmREZWNsYXJlZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgICAgICB2YXJpYWJsZSA9IGRlY2xhcmVkVmFyaWFibGU7ICAvLy9cblxuICAgIHJldHVybiB2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm1zID0gdGhpcy5nZXRUZXJtcygpLFxuICAgICAgICAgIHRlcm0gPSB0ZXJtcy5maW5kKCh0ZXJtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXJtTm9kZU1hdGNoZXMgPSB0ZXJtLm1hdGNoVGVybU5vZGUodGVybU5vZGUpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAodGVybU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGZpbmRGcmFtZUJ5RnJhbWVOb2RlKGZyYW1lTm9kZSkge1xuICAgIGNvbnN0IGZyYW1lcyA9IHRoaXMuZ2V0RnJhbWVzKCksXG4gICAgICAgICAgZnJhbWUgPSBmcmFtZXMuZmluZCgoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lTm9kZU1hdGNoZXMgPSBmcmFtZS5tYXRjaEZyYW1lTm9kZShmcmFtZU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoZnJhbWVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGZyYW1lO1xuICB9XG5cbiAgZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSB7XG4gICAgY29uc3QgZXF1YWxpdGllcyA9IHRoaXMuZ2V0RXF1YWxpdGllcygpLFxuICAgICAgICAgIGVxdWFsaXR5ID0gZXF1YWxpdGllcy5maW5kKChlcXVhbGl0eSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXF1YWxpdHlOb2RlTWF0Y2hlcyA9IGVxdWFsaXR5Lm1hdGNoRXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChlcXVhbGl0eU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZXF1YWxpdHk7XG4gIH1cblxuICBmaW5kSnVkZ2VtZW50QnlKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50cy5maW5kKChqdWRnZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudE5vZGVNYXRjaGVzID0ganVkZ2VtZW50Lm1hdGNoSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKTtcblxuICAgICAgICAgICAgaWYgKGp1ZGdlbWVudE5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IHRoaXMuZ2V0U3RhdGVtZW50cygpLFxuICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudHMuZmluZCgoc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZW1lbnROb2RlTWF0Y2hlcyA9IHN0YXRlbWVudC5tYXRjaFN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZW1lbnROb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgfVxuXG4gIGZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmZpbmQoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlTWF0Y2hlUmVmZXJlbmNlTm9kZSA9IHJlZmVyZW5jZS5tYXRjaFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VNYXRjaGVSZWZlcmVuY2VOb2RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlO1xuICB9XG5cbiAgZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IGFzc2VydGlvbnMuZmluZCgoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbi5tYXRjaEFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRBc3N1bXB0aW9uQnlBc3N1bXB0aW9uTm9kZShhc3N1bXB0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc3VtcHRpb25zID0gdGhpcy5nZXRBc3N1bXB0aW9ucygpLFxuICAgICAgICAgIGFzc3VtcHRpb24gPSBhc3N1bXB0aW9ucy5maW5kKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uTm9kZU1hdGNoZXMgPSBhc3N1bXB0aW9uLm1hdGNoQXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoYXNzdW1wdGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbjtcbiAgfVxuXG4gIGZpbmRSZWZlcmVuY2VCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmZpbmQoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSA9IHJlZmVyZW5jZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VNYXRjaGVNZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlO1xuICB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IG1ldGF2YXJpYWJsZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUoc3Vic3RpdHV0aW9uTm9kZSkge1xuICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25zLmZpbmQoKHN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMgPSBzdWJzdGl0dXRpb24ubWF0Y2hTdWJzdGl0dXRpb25Ob2RlKHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gIH1cblxuICBpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLmZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSksXG4gICAgICAgICAgdGVybVByZXNlbnQgPSAodGVybSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdGVybVByZXNlbnQ7XG4gIH1cblxuICBpc0ZyYW1lUHJlc2VudEJ5RnJhbWVOb2RlKGZyYW1lTm9kZSkge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpLFxuICAgICAgICAgIGZyYW1lUHJlc2VudCA9IChmcmFtZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZnJhbWVQcmVzZW50O1xuICB9XG5cbiAgaXNFcXVhbGl0eVByZXNlbnRCeUVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpIHtcbiAgICBjb25zdCBlcXVhbGl0eSA9IHRoaXMuZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSxcbiAgICAgICAgICBlcXVhbGl0eVByZXNlbnQgPSAoZXF1YWxpdHkgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXR5UHJlc2VudDtcbiAgfVxuXG4gIGlzSnVkZ2VtZW50UHJlc2VudEJ5SnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKSB7XG4gICAgY29uc3QganVkZ2VtZW50ID0gdGhpcy5maW5kSnVkZ2VtZW50QnlKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpLFxuICAgICAgICAgIGp1ZGdlbWVudFByZXNlbnQgPSAoanVkZ2VtZW50ICE9PSBudWxsKTtcblxuICAgIHJldHVybiBqdWRnZW1lbnRQcmVzZW50O1xuICB9XG5cbiAgaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgc3RhdGVtZW50UHJlc2VudCA9IChzdGF0ZW1lbnQgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFByZXNlbnQ7XG4gIH1cblxuICBpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IHRoaXMuZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSxcbiAgICAgICAgICBhc3NlcnRpb25QcmVzZW50ID0gKGFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzQXNzdW1wdGlvblByZXNlbnRCeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbiA9IHRoaXMuZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSxcbiAgICAgICAgICBhc3N1bXB0aW9uUHJlc2VudCA9IChhc3N1bXB0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBhc3N1bXB0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzUmVmZXJlbmNlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gdGhpcy5maW5kUmVmZXJlbmNlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIHJlZmVyZW5jZVByZXNlbnQgPSAocmVmZXJlbmNlICE9PSBudWxsKTtcblxuICAgIHJldHVybiByZWZlcmVuY2VQcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZW5Ob2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlbiA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVuTm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlblByZXNlbnQgPSAobWV0YXZhcmlhYmxlbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlblByZXNlbnQ7XG4gIH1cblxuICBpc1N1YnN0aXR1dGlvblByZXNlbnRCeVN1YnN0aXR1dGlvbk5vZGUoc3Vic3RpdHV0aW9uTm9kZSkge1xuICAgIGNvbnN0IHN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25QcmVzZW50ID0gKHN1YnN0aXR1dGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGNvbW1pdChlbGVtZW50KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXM7IC8vL1xuXG4gICAgZWxlbWVudC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgaW5pdGlhbGlzZShqc29uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXM7IC8vL1xuXG4gICAgdGhpcy50ZXJtcyA9IHRlcm1zRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG5cbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG5cbiAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG4gICAgdGhpcy5yZWZlcmVuY2VzID0gcmVmZXJlbmNlc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuXG4gICAgdGhpcy5lcXVhbGl0aWVzID0gZXF1YWxpdGllc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuICAgIHRoaXMuYXNzdW1wdGlvbnMgPSBhc3N1bXB0aW9uc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuXG4gICAgdGhpcy5mcmFtZXMgPSBmcmFtZXNGcm9tSlNPTihqc29uLCBjb250ZXh0KTtcblxuICAgIHRoaXMuanVkZ2VtZW50cyA9IGp1ZGdlbWVudHNGcm9tSlNPTihqc29uLCBjb250ZXh0KTtcbiAgICB0aGlzLmFzc2VydGlvbnMgPSBhc3NlcnRpb25zRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG4gICAgdGhpcy5zdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9uc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGxldCB0ZXJtcyA9IHRoaXMuZ2V0VGVybXMoKSxcbiAgICAgICAgZnJhbWVzID0gdGhpcy5nZXRGcmFtZXMoKSxcbiAgICAgICAganVkZ2VtZW50cyA9IHRoaXMuZ2V0SnVkZ2VtZW50cygpLFxuICAgICAgICBlcXVhbGl0aWVzID0gdGhpcy5nZXRFcXVhbGl0aWVzKCksXG4gICAgICAgIHN0YXRlbWVudHMgPSB0aGlzLmdldFN0YXRlbWVudHMoKSxcbiAgICAgICAgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICByZWZlcmVuY2VzID0gdGhpcy5nZXRSZWZlcmVuY2VzKCksXG4gICAgICAgIGFzc3VtcHRpb25zID0gdGhpcy5nZXRBc3N1bXB0aW9ucygpLFxuICAgICAgICBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgIHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoKTtcblxuICAgIGNvbnN0IHRlcm1zSlNPTiA9IHRlcm1zVG9UZXJtc0pTT04odGVybXMpLFxuICAgICAgICAgIGZyYW1lc0pTT04gPSBmcmFtZXNUb0ZyYW1lc0pTT04oZnJhbWVzKSxcbiAgICAgICAgICBqdWRnZW1lbnRzSlNPTiA9IGp1ZGdlbWVudHNUb0p1ZGdlbWVudHNKU09OKGp1ZGdlbWVudHMpLFxuICAgICAgICAgIGVxdWFsaXRpZXNKU09OID0gZXF1YWxpdGllc1RvRXF1YWxpdGllc0pTT04oZXF1YWxpdGllcyksXG4gICAgICAgICAgc3RhdGVtZW50c0pTT04gPSBzdGF0ZW1lbnRzVG9TdGF0ZW1lbnRzSlNPTihzdGF0ZW1lbnRzKSxcbiAgICAgICAgICBhc3NlcnRpb25zSlNPTiA9IGFzc2VydGlvbnNUb0Fzc2VydGlvbnNKU09OKGFzc2VydGlvbnMpLFxuICAgICAgICAgIHJlZmVyZW5jZXNKU09OID0gcmVmZXJlbmNlc1RvUmVmZXJlbmNlc0pTT04ocmVmZXJlbmNlcyksXG4gICAgICAgICAgYXNzdW1wdGlvbnNKU09OID0gYXNzdW1wdGlvbnNUb0Fzc3VtcHRpb25zSlNPTihhc3N1bXB0aW9ucyksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlc0pTT04gPSBtZXRhdmFyaWFibGVzVG9NZXRhdmFyaWFibGVzSlNPTihtZXRhdmFyaWFibGVzKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25zSlNPTiA9IHN1YnN0aXR1dGlvbnNUb1N1YnN0aXR1dGlvbnNKU09OKHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgdGVybXMgPSB0ZXJtc0pTT047IC8vL1xuICAgIGZyYW1lcyA9IGZyYW1lc0pTT047IC8vL1xuICAgIGp1ZGdlbWVudHMgPSBqdWRnZW1lbnRzSlNPTjsgLy8vXG4gICAgZXF1YWxpdGllcyA9IGVxdWFsaXRpZXNKU09OOyAvLy9cbiAgICBzdGF0ZW1lbnRzID0gc3RhdGVtZW50c0pTT047IC8vL1xuICAgIGFzc2VydGlvbnMgPSBhc3NlcnRpb25zSlNPTjsgLy8vXG4gICAgcmVmZXJlbmNlcyA9IHJlZmVyZW5jZXNKU09OOyAvLy9cbiAgICBhc3N1bXB0aW9ucyA9IGFzc3VtcHRpb25zSlNPTjsgLy8vXG4gICAgbWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNKU09OOyAgLy9cbiAgICBzdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9uc0pTT047IC8vL1xuXG4gICAgY29uc3QganNvbiA9IHtcbiAgICAgIHRlcm1zLFxuICAgICAgZnJhbWVzLFxuICAgICAganVkZ2VtZW50cyxcbiAgICAgIGVxdWFsaXRpZXMsXG4gICAgICBzdGF0ZW1lbnRzLFxuICAgICAgYXNzZXJ0aW9ucyxcbiAgICAgIHJlZmVyZW5jZXMsXG4gICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIG1ldGF2YXJpYWJsZXMsXG4gICAgICBzdWJzdGl0dXRpb25zXG4gICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCB0ZXJtcyA9IG51bGwsXG4gICAgICAgICAgZnJhbWVzID0gbnVsbCxcbiAgICAgICAgICBlcXVhbGl0aWVzID0gbnVsbCxcbiAgICAgICAgICBqdWRnZW1lbnRzID0gbnVsbCxcbiAgICAgICAgICBzdGF0ZW1lbnRzID0gbnVsbCxcbiAgICAgICAgICBhc3NlcnRpb25zID0gbnVsbCxcbiAgICAgICAgICByZWZlcmVuY2VzID0gbnVsbCxcbiAgICAgICAgICBhc3N1bXB0aW9ucyA9IG51bGwsXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IG51bGwsXG4gICAgICAgICAgc3Vic3RpdHV0aW9ucyA9IG51bGwsXG4gICAgICAgICAgZW1waGVtZXJhbENvbnRleHQgPSBuZXcgRXBoZW1lcmFsQ29udGV4dChjb250ZXh0LCB0ZXJtcywgZnJhbWVzLCBlcXVhbGl0aWVzLCBqdWRnZW1lbnRzLCBhc3NlcnRpb25zLCBzdGF0ZW1lbnRzLCByZWZlcmVuY2VzLCBhc3N1bXB0aW9ucywgbWV0YXZhcmlhYmxlcywgc3Vic3RpdHV0aW9ucyk7XG5cbiAgICBlbXBoZW1lcmFsQ29udGV4dC5pbml0aWFsaXNlKGpzb24pO1xuXG4gICAgcmV0dXJuIGVtcGhlbWVyYWxDb250ZXh0O1xuICB9XG5cbiAgc3RhdGljIGZyb21Ob3RoaW5nKGNvbnRleHQpIHtcbiAgICBjb25zdCB0ZXJtcyA9IFtdLFxuICAgICAgICAgIGZyYW1lcyA9IFtdLFxuICAgICAgICAgIGVxdWFsaXRpZXMgPSBbXSxcbiAgICAgICAgICBqdWRnZW1lbnRzID0gW10sXG4gICAgICAgICAgc3RhdGVtZW50cyA9IFtdLFxuICAgICAgICAgIGFzc2VydGlvbnMgPSBbXSxcbiAgICAgICAgICByZWZlcmVuY2VzID0gW10sXG4gICAgICAgICAgYXNzdW1wdGlvbnMgPSBbXSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVzID0gW10sXG4gICAgICAgICAgc3Vic3RpdHV0aW9ucyA9IFtdLFxuICAgICAgICAgIGVtcGhlbWVyYWxDb250ZXh0ID0gbmV3IEVwaGVtZXJhbENvbnRleHQoY29udGV4dCwgdGVybXMsIGZyYW1lcywgZXF1YWxpdGllcywganVkZ2VtZW50cywgYXNzZXJ0aW9ucywgc3RhdGVtZW50cywgcmVmZXJlbmNlcywgYXNzdW1wdGlvbnMsIG1ldGF2YXJpYWJsZXMsIHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgcmV0dXJuIGVtcGhlbWVyYWxDb250ZXh0O1xuICB9XG59XG4iXSwibmFtZXMiOlsiRXBoZW1lcmFsQ29udGV4dCIsInB1c2giLCJhcnJheVV0aWxpdGllcyIsIkNvbnRleHQiLCJjb250ZXh0IiwidGVybXMiLCJmcmFtZXMiLCJlcXVhbGl0aWVzIiwianVkZ2VtZW50cyIsImFzc2VydGlvbnMiLCJzdGF0ZW1lbnRzIiwicmVmZXJlbmNlcyIsImFzc3VtcHRpb25zIiwibWV0YXZhcmlhYmxlcyIsInN1YnN0aXR1dGlvbnMiLCJnZXRUZXJtcyIsImdldENvbnRleHQiLCJjb21wcmVzc1Rlcm1zIiwiZ2V0RnJhbWVzIiwiY29tcHJlc3NGcmFtZXMiLCJnZXRFcXVhbGl0aWVzIiwiY29tcHJlc3NFcXVhbGl0aWVzIiwiZ2V0SnVkZ2VtZW50cyIsImNvbXByZXNzSnVkZ2VtZW50cyIsImdldFN0YXRlbWVudHMiLCJjb21wcmVzc1N0YXRlbWVudHMiLCJnZXRBc3NlcnRpb25zIiwiY29tcHJlc3NBc3NlcnRpb25zIiwiZ2V0UmVmZXJlbmNlcyIsImNvbXByZXNzUmVmZXJlbmNlcyIsImdldEFzc3VtcHRpb25zIiwiY29tcHJlc3NBc3N1bXB0aW9ucyIsImdldE1ldGF2YXJpYWJsZXMiLCJjb21wcmVzc01ldGF2YXJpYWJsZXMiLCJnZXRTdWJzdGl0dXRpb25zIiwiY29tcHJlc3NTdWJzdGl0dXRpb25zIiwiYWRkVGVybSIsInRlcm0iLCJ0ZXJtQSIsInRlcm1TdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsInRlcm1CIiwiZmluZCIsInRlcm1BQ29tcGFyZXNUb1Rlcm1CIiwiY29tcGFyZVRlcm0iLCJkZWJ1ZyIsImFkZEZyYW1lIiwiZnJhbWUiLCJmcmFtZUEiLCJmcmFtZVN0cmluZyIsImZyYW1lQiIsImZyYW1lQUVxdWFsVG9GcmFtZUIiLCJpc0VxdWFsVG8iLCJhZGRFcXVhbGl0eSIsImVxdWFsaXR5IiwiZXF1YWxpdHlBIiwiZXF1YWxpdHlTdHJpbmciLCJlcXVhbGl0eUIiLCJlcXVhbGl0eUFFcXVhbFRvRXF1YWxpdHlCIiwiYWRkSnVkZ2VtZW50IiwianVkZ2VtZW50IiwianVkZ2VtZW50QSIsImp1ZGdlbWVudFN0cmluZyIsImp1ZGdlbWVudEIiLCJqdWRnZW1lbnRBRXF1YWxUb0VxdWFsaXR5QiIsImFkZFN0YXRlbWVudCIsInN0YXRlbWVudCIsInN0YXRlbWVudEEiLCJzdGF0ZW1lbnRTdHJpbmciLCJzdGF0ZW1lbnRCIiwic3RhdGVtZW50QUVxdWFsVG9TdGF0ZW1lbnRCIiwiYWRkQXNzZXJ0aW9uIiwiYXNzZXJ0aW9uIiwiYXNzZXJ0aW9uQSIsImFzc2VydGlvblN0cmluZyIsImFzc2VydGlvbkIiLCJhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIiLCJhZGRSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJyZWZlcmVuY2VBIiwicmVmZXJlbmNlU3RyaW5nIiwicmVmZXJlbmNlQiIsInJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQiIsImFkZEFzc3VtcHRpb24iLCJhc3N1bXB0aW9uIiwiYXNzdW1wdGlvbkEiLCJhc3N1bXB0aW9uU3RyaW5nIiwiYXNzdW1wdGlvbkIiLCJhc3N1bXB0aW9uQUVxdWFsVG9Bc3N1bXB0aW9uQiIsImFkZE1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZUEiLCJtZXRhdmFyaWFibGVTdHJpbmciLCJtZXRhdmFyaWFibGVCIiwibWV0YXZhcmlhYmxlQUVxdWFsVG9TdWJzdGl0dXRpb25CIiwiYWRkU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uQSIsInN1YnN0aXR1dGlvblN0cmluZyIsInN1YnN0aXR1dGlvbkIiLCJzdWJzdGl0dXRpb25BRXF1YWxUb1N1YnN0aXR1dGlvbkIiLCJhZGRUZXJtcyIsImZvckVhY2giLCJhZGRGcmFtZXMiLCJhZGRFcXVhbGl0aWVzIiwiYWRkSnVkZ2VtZW50cyIsImFkZEFzc2VydGlvbnMiLCJhZGRTdGF0ZW1lbnRzIiwiYWRkUmVmZXJlbmNlcyIsImFkZEFzc3VtcHRpb25zIiwiYWRkTWV0YXZhcmlhYmxlcyIsImFkZFN1YnN0aXR1dGlvbnMiLCJmaW5kVmFyaWFibGVCeVZhcmlhYmxlTm9kZSIsInZhcmlhYmxlTm9kZSIsInZhcmlhYmxlSWRlbnRpZmllciIsImdldFZhcmlhYmxlSWRlbnRpZmllciIsImRlY2xhcmVkVmFyaWFibGUiLCJmaW5kRGVjbGFyZWRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyIiwidmFyaWFibGUiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsInRlcm1Ob2RlTWF0Y2hlcyIsIm1hdGNoVGVybU5vZGUiLCJmaW5kRnJhbWVCeUZyYW1lTm9kZSIsImZyYW1lTm9kZSIsImZyYW1lTm9kZU1hdGNoZXMiLCJtYXRjaEZyYW1lTm9kZSIsImZpbmRFcXVhbGl0eUJ5RXF1YWxpdHlOb2RlIiwiZXF1YWxpdHlOb2RlIiwiZXF1YWxpdHlOb2RlTWF0Y2hlcyIsIm1hdGNoRXF1YWxpdHlOb2RlIiwiZmluZEp1ZGdlbWVudEJ5SnVkZ2VtZW50Tm9kZSIsImp1ZGdlbWVudE5vZGUiLCJqdWRnZW1lbnROb2RlTWF0Y2hlcyIsIm1hdGNoSnVkZ2VtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZU1hdGNoZXMiLCJtYXRjaFN0YXRlbWVudE5vZGUiLCJmaW5kUmVmZXJlbmNlQnlSZWZlcmVuY2VOb2RlIiwicmVmZXJlbmNlTm9kZSIsInJlZmVyZW5jZU1hdGNoZVJlZmVyZW5jZU5vZGUiLCJtYXRjaFJlZmVyZW5jZU5vZGUiLCJmaW5kQXNzZXJ0aW9uQnlBc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3NlcnRpb25Ob2RlIiwiZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvbk5vZGUiLCJhc3N1bXB0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaEFzc3VtcHRpb25Ob2RlIiwiZmluZFJlZmVyZW5jZUJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJyZWZlcmVuY2VNYXRjaGVNZXRhdmFyaWFibGVOb2RlIiwibWF0Y2hNZXRhdmFyaWFibGVOb2RlIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzIiwiZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZSIsInN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlTWF0Y2hlcyIsIm1hdGNoU3Vic3RpdHV0aW9uTm9kZSIsImlzVGVybVByZXNlbnRCeVRlcm1Ob2RlIiwidGVybVByZXNlbnQiLCJpc0ZyYW1lUHJlc2VudEJ5RnJhbWVOb2RlIiwiZnJhbWVQcmVzZW50IiwiaXNFcXVhbGl0eVByZXNlbnRCeUVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5UHJlc2VudCIsImlzSnVkZ2VtZW50UHJlc2VudEJ5SnVkZ2VtZW50Tm9kZSIsImp1ZGdlbWVudFByZXNlbnQiLCJpc1N0YXRlbWVudFByZXNlbnRCeVN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnRQcmVzZW50IiwiaXNBc3NlcnRpb25QcmVzZW50QnlBc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uUHJlc2VudCIsImlzQXNzdW1wdGlvblByZXNlbnRCeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvblByZXNlbnQiLCJpc1JlZmVyZW5jZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGUiLCJyZWZlcmVuY2VQcmVzZW50IiwiaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlbk5vZGUiLCJtZXRhdmFyaWFibGVuIiwibWV0YXZhcmlhYmxlblByZXNlbnQiLCJpc1N1YnN0aXR1dGlvblByZXNlbnRCeVN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25QcmVzZW50IiwiY29tbWl0IiwiZWxlbWVudCIsInNldENvbnRleHQiLCJpbml0aWFsaXNlIiwianNvbiIsInRlcm1zRnJvbUpTT04iLCJtZXRhdmFyaWFibGVzRnJvbUpTT04iLCJzdGF0ZW1lbnRzRnJvbUpTT04iLCJyZWZlcmVuY2VzRnJvbUpTT04iLCJlcXVhbGl0aWVzRnJvbUpTT04iLCJhc3N1bXB0aW9uc0Zyb21KU09OIiwiZnJhbWVzRnJvbUpTT04iLCJqdWRnZW1lbnRzRnJvbUpTT04iLCJhc3NlcnRpb25zRnJvbUpTT04iLCJzdWJzdGl0dXRpb25zRnJvbUpTT04iLCJ0b0pTT04iLCJ0ZXJtc0pTT04iLCJ0ZXJtc1RvVGVybXNKU09OIiwiZnJhbWVzSlNPTiIsImZyYW1lc1RvRnJhbWVzSlNPTiIsImp1ZGdlbWVudHNKU09OIiwianVkZ2VtZW50c1RvSnVkZ2VtZW50c0pTT04iLCJlcXVhbGl0aWVzSlNPTiIsImVxdWFsaXRpZXNUb0VxdWFsaXRpZXNKU09OIiwic3RhdGVtZW50c0pTT04iLCJzdGF0ZW1lbnRzVG9TdGF0ZW1lbnRzSlNPTiIsImFzc2VydGlvbnNKU09OIiwiYXNzZXJ0aW9uc1RvQXNzZXJ0aW9uc0pTT04iLCJyZWZlcmVuY2VzSlNPTiIsInJlZmVyZW5jZXNUb1JlZmVyZW5jZXNKU09OIiwiYXNzdW1wdGlvbnNKU09OIiwiYXNzdW1wdGlvbnNUb0Fzc3VtcHRpb25zSlNPTiIsIm1ldGF2YXJpYWJsZXNKU09OIiwibWV0YXZhcmlhYmxlc1RvTWV0YXZhcmlhYmxlc0pTT04iLCJzdWJzdGl0dXRpb25zSlNPTiIsInN1YnN0aXR1dGlvbnNUb1N1YnN0aXR1dGlvbnNKU09OIiwiZnJvbUpTT04iLCJlbXBoZW1lcmFsQ29udGV4dCIsImZyb21Ob3RoaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkF1Q0E7OztlQUFxQkE7OzsyQkFyQ1U7Z0VBRVg7MEJBV2tCO3NCQW9CVzs7Ozs7O0FBRWpELE1BQU0sRUFBRUMsSUFBSSxFQUFFLEdBQUdDLHlCQUFjO0FBRWhCLE1BQU1GLHlCQUF5QkcsZ0JBQU87SUFDbkQsWUFBWUMsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxVQUFVLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsYUFBYSxFQUFFQyxhQUFhLENBQUU7UUFDekksS0FBSyxDQUFDVjtRQUVOLElBQUksQ0FBQ0MsS0FBSyxHQUFHQTtRQUNiLElBQUksQ0FBQ0MsTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTtRQUNsQixJQUFJLENBQUNDLFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO1FBQ2xCLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTtRQUNsQixJQUFJLENBQUNDLFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxXQUFXLEdBQUdBO1FBQ25CLElBQUksQ0FBQ0MsYUFBYSxHQUFHQTtRQUNyQixJQUFJLENBQUNDLGFBQWEsR0FBR0E7SUFDdkI7SUFFQUMsU0FBU1YsUUFBUSxFQUFFLEVBQUU7UUFDbkIsTUFBTUQsVUFBVSxJQUFJLENBQUNZLFVBQVU7UUFFL0JmLEtBQUtJLE9BQU8sSUFBSSxDQUFDQSxLQUFLO1FBRXRCRCxRQUFRVyxRQUFRLENBQUNWO1FBRWpCWSxJQUFBQSx1QkFBYSxFQUFDYjtRQUVkLE9BQU9DO0lBQ1Q7SUFFQWEsVUFBVVosU0FBUyxFQUFFLEVBQUU7UUFDckIsTUFBTUYsVUFBVSxJQUFJLENBQUNZLFVBQVU7UUFFL0JmLEtB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