@codeperfect/eslint-plugin 2.0.0 → 2.1.0

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 (118) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  3. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
  4. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +8 -3
  5. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
  6. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +8 -3
  7. package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
  8. package/dist/domain/architecture/consistent-barrel-files/rule.js +12 -4
  9. package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
  10. package/dist/domain/core/no-multiple-declarators/rule.js +6 -3
  11. package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
  12. package/dist/domain/core/prefer-interface-types/rule.js +6 -3
  13. package/dist/domain/core/prefer-interface-types/test-helpers.d.ts.map +1 -1
  14. package/dist/domain/core/prefer-interface-types/test-helpers.js +1 -1
  15. package/dist/domain/custom-rule-documentation.d.ts +2 -0
  16. package/dist/domain/custom-rule-documentation.d.ts.map +1 -1
  17. package/dist/domain/custom-rule-documentation.js +2 -1
  18. package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -1
  19. package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.js +1 -1
  20. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +1 -1
  21. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  22. package/dist/domain/docs/no-interface-member-docs/rule.js +6 -3
  23. package/dist/domain/docs/no-interface-member-docs/test-helpers.js +1 -1
  24. package/dist/domain/docs/require-example-language/create-fixer.js +1 -1
  25. package/dist/domain/docs/require-example-language/fixes.d.ts.map +1 -1
  26. package/dist/domain/docs/require-example-language/fixes.js +1 -1
  27. package/dist/domain/docs/require-example-language/reporting.js +1 -1
  28. package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
  29. package/dist/domain/docs/require-example-language/rule.js +6 -3
  30. package/dist/domain/docs/single-line-jsdoc/rule.d.ts +1 -2
  31. package/dist/domain/docs/single-line-jsdoc/rule.d.ts.map +1 -1
  32. package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.js +1 -1
  33. package/dist/domain/docs/single-line-jsdoc/rule.js +11 -6
  34. package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.js +1 -1
  35. package/dist/domain/testing/aaa/analyzer.analysis.d.ts +14 -72
  36. package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
  37. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts +144 -3
  38. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
  39. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +202 -3
  40. package/dist/domain/testing/aaa/analyzer.analysis.js +36 -201
  41. package/dist/domain/testing/aaa/analyzer.analysis.unsupported.d.ts +4 -0
  42. package/dist/domain/testing/aaa/analyzer.analysis.unsupported.d.ts.map +1 -0
  43. package/dist/domain/testing/aaa/analyzer.analysis.unsupported.js +4 -0
  44. package/dist/domain/testing/aaa/analyzer.assertions.d.ts +16 -91
  45. package/dist/domain/testing/aaa/analyzer.assertions.d.ts.map +1 -1
  46. package/dist/domain/testing/aaa/analyzer.assertions.destructured.d.ts +4 -0
  47. package/dist/domain/testing/aaa/analyzer.assertions.destructured.d.ts.map +1 -0
  48. package/dist/domain/testing/aaa/analyzer.assertions.destructured.js +4 -0
  49. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts +95 -0
  50. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -0
  51. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +185 -0
  52. package/dist/domain/testing/aaa/analyzer.assertions.js +32 -282
  53. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts +64 -0
  54. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -0
  55. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +105 -0
  56. package/dist/domain/testing/aaa/analyzer.classification.d.ts +14 -73
  57. package/dist/domain/testing/aaa/analyzer.classification.d.ts.map +1 -1
  58. package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts +77 -0
  59. package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -0
  60. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +203 -0
  61. package/dist/domain/testing/aaa/analyzer.classification.js +30 -200
  62. package/dist/domain/testing/aaa/analyzer.classification.mutations.d.ts +4 -0
  63. package/dist/domain/testing/aaa/analyzer.classification.mutations.d.ts.map +1 -0
  64. package/dist/domain/testing/aaa/analyzer.classification.mutations.js +4 -0
  65. package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts +15 -0
  66. package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts.map +1 -0
  67. package/dist/domain/testing/aaa/analyzer.classification.traversal.js +34 -0
  68. package/dist/domain/testing/aaa/analyzer.d.ts +2 -2
  69. package/dist/domain/testing/aaa/analyzer.d.ts.map +1 -1
  70. package/dist/domain/testing/aaa/analyzer.super.d.ts +8 -9
  71. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  72. package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts +27 -0
  73. package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts.map +1 -0
  74. package/dist/domain/testing/aaa/analyzer.super.helpers.js +66 -0
  75. package/dist/domain/testing/aaa/analyzer.super.js +43 -60
  76. package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -1
  77. package/dist/domain/testing/assert-actual-expected-names/rule.js +6 -3
  78. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.d.ts +4 -0
  79. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.d.ts.map +1 -0
  80. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.js +4 -0
  81. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.d.ts +4 -0
  82. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.d.ts.map +1 -0
  83. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.js +4 -0
  84. package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.js +1 -1
  85. package/dist/domain/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -1
  86. package/dist/domain/testing/enforce-aaa-phase-purity/rule.js +6 -3
  87. package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
  88. package/dist/domain/testing/enforce-aaa-structure/rule.js +6 -3
  89. package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
  90. package/dist/domain/testing/prefer-vi-mocked-import/rule.js +6 -3
  91. package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts +12 -1
  92. package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts.map +1 -1
  93. package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.js +26 -2
  94. package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.d.ts.map +1 -1
  95. package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.js +13 -10
  96. package/dist/domain/testing/prefer-vitest-incremental-casts/match.d.ts.map +1 -1
  97. package/dist/domain/testing/prefer-vitest-incremental-casts/match.js +8 -2
  98. package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.d.ts.map +1 -1
  99. package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.js +9 -5
  100. package/dist/domain/testing/prefer-vitest-incremental-casts/rule.d.ts.map +1 -1
  101. package/dist/domain/testing/prefer-vitest-incremental-casts/rule.js +28 -2
  102. package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.d.ts.map +1 -1
  103. package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.js +1 -1
  104. package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts +9 -25
  105. package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts.map +1 -1
  106. package/dist/domain/testing/prefer-vitest-incremental-casts/types.js +1 -1
  107. package/dist/domain/testing/require-aaa-sections/rule.d.ts.map +1 -1
  108. package/dist/domain/testing/require-aaa-sections/rule.js +9 -4
  109. package/dist/domain/testing/require-aaa-sections/rule.reporting.d.ts.map +1 -1
  110. package/dist/domain/testing/require-aaa-sections/rule.reporting.js +3 -4
  111. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  112. package/dist/domain/testing/require-act-result-capture/rule.js +6 -3
  113. package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
  114. package/dist/domain/testing/require-test-companion/rule.js +31 -6
  115. package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -1
  116. package/dist/domain/testing/single-act-statement/rule.js +6 -3
  117. package/dist/infrastructure/presets.js +1 -1
  118. package/package.json +37 -29
@@ -1,13 +1,39 @@
1
- /* eslint max-lines: ["error", 350] -- Mandatory multiline JSDoc for internal helpers pushes this split file over the default limit. */
1
+ import { aaaPhaseOrder as aaaPhaseOrderImplementation, countActStatements as countActStatementsImplementation, getFlattenedSections as getFlattenedSectionsImplementation, getIndentationAtOffset as getIndentationAtOffsetImplementation, getLineStartRange as getLineStartRangeImplementation, getNewline as getNewlineImplementation, getPhaseBoundaryComments as getPhaseBoundaryCommentsImplementation, getSectionPhases as getSectionPhasesImplementation, getStatementPhases as getStatementPhasesImplementation, getSupportedTestCall as getSupportedTestCallImplementation, } from "./analyzer.analysis.helpers.js";
2
2
  import { isLocatedComment, isRangeWithin } from "./analyzer.super.js";
3
- /** Canonical ordering used when comparing AAA phases. */
4
- const aaaPhaseOrder = {
5
- Act: 1,
6
- Arrange: 0,
7
- Assert: 2,
8
- };
9
- /** Recognized AAA phase names. */
10
- const phaseNames = ["Arrange", "Act", "Assert"];
3
+ /**
4
+ * Creates a local forwarding function for an imported analyzer helper.
5
+ * @template TParameters Forwarded parameter tuple.
6
+ * @template TResult Forwarded return type.
7
+ * @param implementation Imported helper implementation.
8
+ * @returns Local function that forwards all arguments to the implementation.
9
+ * @example
10
+ * ```typescript
11
+ * const localHelper = forward(implementation);
12
+ * ```
13
+ */
14
+ function forward(implementation) {
15
+ return (...parameters) => implementation(...parameters);
16
+ }
17
+ /** Ordered list of AAA phase names. */
18
+ const aaaPhaseOrder = aaaPhaseOrderImplementation;
19
+ /** Counts Act-phase statements in a test block analysis. */
20
+ const countActStatements = forward(countActStatementsImplementation);
21
+ /** Flattens multi-phase section comments into one entry per phase. */
22
+ const getFlattenedSections = forward(getFlattenedSectionsImplementation);
23
+ /** Resolves the leading whitespace for the line containing a source offset. */
24
+ const getIndentationAtOffset = forward(getIndentationAtOffsetImplementation);
25
+ /** Returns the start-of-line range for a given source offset. */
26
+ const getLineStartRange = forward(getLineStartRangeImplementation);
27
+ /** Detects the line-ending style used in a source text. */
28
+ const getNewline = forward(getNewlineImplementation);
29
+ /** Extracts the phase-boundary section comments from a test block analysis. */
30
+ const getPhaseBoundaryComments = forward(getPhaseBoundaryCommentsImplementation);
31
+ /** Parses AAA phase names from a section comment value. */
32
+ const getSectionPhases = forward(getSectionPhasesImplementation);
33
+ /** Resolves the AAA phases applicable to a statement. */
34
+ const getStatementPhases = forward(getStatementPhasesImplementation);
35
+ /** Extracts the test call and callback from a supported `it` or `test` call expression. */
36
+ const getSupportedTestCall = forward(getSupportedTestCallImplementation);
11
37
  /**
12
38
  * Analyzes supported AAA test blocks.
13
39
  * @param context Input context value.
@@ -52,196 +78,5 @@ function analyzeTestBlock(context, node) {
52
78
  }),
53
79
  };
54
80
  }
55
- /**
56
- * Counts Act statements.
57
- * @param analysis Input analysis value.
58
- * @returns Return value output.
59
- * @example
60
- * ```typescript
61
- * countActStatements(analysis);
62
- * ```
63
- */
64
- function countActStatements(analysis) {
65
- return analysis.statements.filter((statement) => statement.phases.includes("Act") &&
66
- (statement.node.type === "ExpressionStatement" ||
67
- statement.node.type === "VariableDeclaration")).length;
68
- }
69
- /**
70
- * Flattens section comments.
71
- * @param analysis Input analysis value.
72
- * @returns Return value output.
73
- * @example
74
- * ```typescript
75
- * getFlattenedSections(analysis);
76
- * ```
77
- */
78
- function getFlattenedSections(analysis) {
79
- return analysis.sectionComments.flatMap((sectionComment) => sectionComment.phases.map((phase) => ({
80
- comment: sectionComment.comment,
81
- phase,
82
- })));
83
- }
84
- /**
85
- * Gets indentation at an offset.
86
- * @param sourceText Input sourceText value.
87
- * @param offset Input offset value.
88
- * @returns Return value output.
89
- * @example
90
- * ```typescript
91
- * getIndentationAtOffset(sourceText, 4);
92
- * ```
93
- */
94
- function getIndentationAtOffset(sourceText, offset) {
95
- const lineStart = sourceText.lastIndexOf("\n", Math.max(0, offset - 1)) + 1;
96
- const linePrefix = sourceText.slice(lineStart, offset);
97
- const trimmedPrefix = linePrefix.trimStart();
98
- return linePrefix.slice(0, linePrefix.length - trimmedPrefix.length);
99
- }
100
- /**
101
- * Gets the start range for a line.
102
- * @param sourceText Input sourceText value.
103
- * @param line Input line value.
104
- * @returns Return value output.
105
- * @example
106
- * ```typescript
107
- * getLineStartRange(sourceText, 2);
108
- * ```
109
- */
110
- function getLineStartRange(sourceText, line) {
111
- let currentLine = 1;
112
- let currentOffset = 0;
113
- for (const character of sourceText) {
114
- if (currentLine === line) {
115
- return [currentOffset, currentOffset];
116
- }
117
- if (character === "\n") {
118
- currentLine += 1;
119
- }
120
- currentOffset += 1;
121
- }
122
- return [sourceText.length, sourceText.length];
123
- }
124
- /**
125
- * Gets the newline sequence.
126
- * @param text Input text value.
127
- * @returns Return value output.
128
- * @example
129
- * ```typescript
130
- * getNewline(sourceText);
131
- * ```
132
- */
133
- function getNewline(text) {
134
- return text.includes("\r\n") ? "\r\n" : "\n";
135
- }
136
- /**
137
- * Gets phase-boundary comments.
138
- * @param analysis Input analysis value.
139
- * @returns Return value output.
140
- * @example
141
- * ```typescript
142
- * getPhaseBoundaryComments(analysis);
143
- * ```
144
- */
145
- function getPhaseBoundaryComments(analysis) {
146
- return analysis.sectionComments.filter((sectionComment) => sectionComment.phases.some((phase) => phase === "Act" || phase === "Assert"));
147
- }
148
- /**
149
- * Parses AAA phases from a comment.
150
- * @param commentValue Input commentValue value.
151
- * @returns Return value output.
152
- * @example
153
- * ```typescript
154
- * getSectionPhases("Arrange & Act");
155
- * ```
156
- */
157
- function getSectionPhases(commentValue) {
158
- const trimmedComment = commentValue.trim();
159
- if (trimmedComment.length === 0) {
160
- return [];
161
- }
162
- const parts = trimmedComment.split(/\s*&\s*/u);
163
- return parts.every((part) => isAaaPhase(part)) ? parts : [];
164
- }
165
- /**
166
- * Gets the active phases for a statement.
167
- * @param statement Input statement value.
168
- * @param sectionComments Input sectionComments value.
169
- * @returns Return value output.
170
- * @example
171
- * ```typescript
172
- * getStatementPhases(statement, sectionComments);
173
- * ```
174
- */
175
- function getStatementPhases(statement, sectionComments) {
176
- const statementLine = statement.loc?.start.line;
177
- if (statementLine === void 0) {
178
- return [];
179
- }
180
- let currentPhases = [];
181
- for (const sectionComment of sectionComments) {
182
- if (sectionComment.comment.loc.start.line > statementLine) {
183
- break;
184
- }
185
- currentPhases = sectionComment.phases;
186
- }
187
- return currentPhases;
188
- }
189
- /**
190
- * Gets supported test call metadata.
191
- * @param node Input node value.
192
- * @returns Return value output.
193
- * @example
194
- * ```typescript
195
- * getSupportedTestCall(node);
196
- * ```
197
- */
198
- function getSupportedTestCall(node) {
199
- const rootName = getTestRootName(node.callee);
200
- if (rootName !== "it" && rootName !== "test") {
201
- return void 0;
202
- }
203
- const callbackArgument = node.arguments.at(-1);
204
- if (callbackArgument === void 0 ||
205
- callbackArgument.type === "SpreadElement" ||
206
- (callbackArgument.type !== "ArrowFunctionExpression" &&
207
- callbackArgument.type !== "FunctionExpression") ||
208
- callbackArgument.body.type !== "BlockStatement") {
209
- return void 0;
210
- }
211
- return {
212
- callback: callbackArgument,
213
- callExpression: node,
214
- };
215
- }
216
- /**
217
- * Gets the root test callee name.
218
- * @param callee Input callee value.
219
- * @returns Return value output.
220
- * @example
221
- * ```typescript
222
- * getTestRootName(callExpression.callee);
223
- * ```
224
- */
225
- function getTestRootName(callee) {
226
- if (callee.type === "Identifier") {
227
- return callee.name;
228
- }
229
- if (callee.type === "MemberExpression" && callee.object.type !== "Super") {
230
- return getTestRootName(callee.object);
231
- }
232
- return void 0;
233
- }
234
- /**
235
- * Checks whether a value is an AAA phase.
236
- * @param value Input value value.
237
- * @returns Return value output.
238
- * @example
239
- * ```typescript
240
- * isAaaPhase("Arrange");
241
- * ```
242
- */
243
- function isAaaPhase(value) {
244
- return phaseNames.includes(value);
245
- }
246
81
  export { aaaPhaseOrder, analyzeTestBlock, countActStatements, getFlattenedSections, getIndentationAtOffset, getLineStartRange, getPhaseBoundaryComments, getSectionPhases, };
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYW5hbHlzaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvYWFhL2FuYWx5emVyLmFuYWx5c2lzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVJQUF1STtBQWF2SSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUseURBQXlEO0FBQ3pELE1BQU0sYUFBYSxHQUFHO0lBQ3BCLEdBQUcsRUFBRSxDQUFDO0lBQ04sT0FBTyxFQUFFLENBQUM7SUFDVixNQUFNLEVBQUUsQ0FBQztDQUNrQyxDQUFDO0FBRTlDLGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUk3QyxDQUFDO0FBMEJGOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsZ0JBQWdCLENBQ3ZCLE9BQXlCLEVBQ3pCLElBQTJCO0lBRTNCLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLElBQUksUUFBUSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxRQUFRLENBQUM7SUFDOUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUMvQixNQUFNLGVBQWUsR0FBeUMsVUFBVTtTQUNyRSxjQUFjLEVBQUU7U0FDaEIsTUFBTSxDQUNMLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDVixnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNO1FBQ3ZCLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2pELGdCQUFnQixDQUFDLE9B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Z0JBQWdCLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFDO1FBQ2pELGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLEVBQy9DLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPO1FBQ0wsUUFBUSxFQUFFLGdCQUF5QztRQUNuRCxjQUFjLEVBQUUsSUFBMEM7S0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUN0QixNQUF1QztJQUV2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0JBQWtCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDekUsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQWlCLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUN4QixnQkFBZ0IsR0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBtYXgtbGluZXM6IFtcImVycm9yXCIsIDM1MF0gLS0gTWFuZGF0b3J5IG11bHRpbGluZSBKU0RvYyBmb3IgaW50ZXJuYWwgaGVscGVycyBwdXNoZXMgdGhpcyBzcGxpdCBmaWxlIG92ZXIgdGhlIGRlZmF1bHQgbGltaXQuICovXHJcblxyXG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XHJcbmltcG9ydCB0eXBlICogYXMgRVNUcmVlIGZyb20gXCJlc3RyZWVcIjtcclxuXHJcbmltcG9ydCB0eXBlIHtcclxuICBBYWFQaGFzZSxcclxuICBMb2NhdGVkQ29tbWVudCxcclxuICBMb2NhdGVkTm9kZSxcclxuICBTb3VyY2VDb21tZW50LFxyXG4gIFRlc3RCbG9ja0FuYWx5c2lzLFxyXG59IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBpc0xvY2F0ZWRDb21tZW50LCBpc1JhbmdlV2l0aGluIH0gZnJvbSBcIi4vYW5hbHl6ZXIuc3VwZXJcIjtcclxuXHJcbi8qKiBDYW5vbmljYWwgb3JkZXJpbmcgdXNlZCB3aGVuIGNvbXBhcmluZyBBQUEgcGhhc2VzLiAqL1xyXG5jb25zdCBhYWFQaGFzZU9yZGVyID0ge1xyXG4gIEFjdDogMSxcclxuICBBcnJhbmdlOiAwLFxyXG4gIEFzc2VydDogMixcclxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPEFhYVBoYXNlLCBudW1iZXI+O1xyXG5cclxuLyoqIFJlY29nbml6ZWQgQUFBIHBoYXNlIG5hbWVzLiAqL1xyXG5jb25zdCBwaGFzZU5hbWVzID0gW1wiQXJyYW5nZVwiLCBcIkFjdFwiLCBcIkFzc2VydFwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgW1xyXG4gIEFhYVBoYXNlLFxyXG4gIEFhYVBoYXNlLFxyXG4gIEFhYVBoYXNlLFxyXG5dO1xyXG5cclxuLyoqIEhlbHBlciBzdGF0ZSBmb3IgZmxhdHRlbmVkIHNlY3Rpb24gY29tbWVudHMuICovXHJcbmludGVyZmFjZSBGbGF0dGVuZWRTZWN0aW9uIHtcclxuICAvKiogT3JpZ2luYWwgc291cmNlIGNvbW1lbnQgZm9yIHRoZSBzZWN0aW9uIG1hcmtlci4gKi9cclxuICBjb21tZW50OiBTb3VyY2VDb21tZW50O1xyXG4gIC8qKiBQaGFzZSByZXByZXNlbnRlZCBieSB0aGUgZmxhdHRlbmVkIHNlY3Rpb24gZW50cnkuICovXHJcbiAgcGhhc2U6IEFhYVBoYXNlO1xyXG59XHJcblxyXG4vKiogU3VwcG9ydGVkIGNhbGwtZXhwcmVzc2lvbiB3cmFwcGVyIGZvciBhbmFseXplZCB0ZXN0IGJsb2Nrcy4gKi9cclxuaW50ZXJmYWNlIFN1cHBvcnRlZFRlc3RDYWxsIHtcclxuICAvKiogQ2FsbGJhY2sgYXJndW1lbnQgdGhhdCBvd25zIHRoZSB0ZXN0IGJvZHkuICovXHJcbiAgY2FsbGJhY2s6IFN1cHBvcnRlZFRlc3RDYWxsYmFjaztcclxuICAvKiogT3JpZ2luYWwgYGl0YCBvciBgdGVzdGAgaW52b2NhdGlvbi4gKi9cclxuICBjYWxsRXhwcmVzc2lvbjogTG9jYXRlZE5vZGU8RVNUcmVlLkNhbGxFeHByZXNzaW9uPjtcclxufVxyXG5cclxuLyoqIFN1cHBvcnRlZCB0ZXN0IGNhbGxiYWNrIHNoYXBlIGZvciBgaXRgIGFuZCBgdGVzdGAgY2FsbHMuICovXHJcbnR5cGUgU3VwcG9ydGVkVGVzdENhbGxiYWNrID0gTG9jYXRlZE5vZGU8XHJcbiAgRVNUcmVlLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgRVNUcmVlLkZ1bmN0aW9uRXhwcmVzc2lvblxyXG4+ICYge1xyXG4gIC8qKiBDYWxsYmFjayBib2R5IGJsb2NrIHVzZWQgZm9yIHNlY3Rpb24gYW5hbHlzaXMuICovXHJcbiAgYm9keTogTG9jYXRlZE5vZGU8RVNUcmVlLkJsb2NrU3RhdGVtZW50PjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBbmFseXplcyBzdXBwb3J0ZWQgQUFBIHRlc3QgYmxvY2tzLlxyXG4gKiBAcGFyYW0gY29udGV4dCBJbnB1dCBjb250ZXh0IHZhbHVlLlxyXG4gKiBAcGFyYW0gbm9kZSBJbnB1dCBub2RlIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGFuYWx5emVUZXN0QmxvY2soY29udGV4dCwgbm9kZSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gYW5hbHl6ZVRlc3RCbG9jayhcclxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0LFxyXG4gIG5vZGU6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbixcclxuKTogVGVzdEJsb2NrQW5hbHlzaXMgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IHRlc3RDYWxsID0gZ2V0U3VwcG9ydGVkVGVzdENhbGwobm9kZSk7XHJcbiAgaWYgKHRlc3RDYWxsID09PSB2b2lkIDApIHtcclxuICAgIHJldHVybiB2b2lkIDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCB7IGNhbGxiYWNrLCBjYWxsRXhwcmVzc2lvbiB9ID0gdGVzdENhbGw7XHJcbiAgY29uc3QgeyBzb3VyY2VDb2RlIH0gPSBjb250ZXh0O1xyXG4gIGNvbnN0IHNlY3Rpb25Db21tZW50czogVGVzdEJsb2NrQW5hbHlzaXNbXCJzZWN0aW9uQ29tbWVudHNcIl0gPSBzb3VyY2VDb2RlXHJcbiAgICAuZ2V0QWxsQ29tbWVudHMoKVxyXG4gICAgLmZpbHRlcihcclxuICAgICAgKGNvbW1lbnQpID0+XHJcbiAgICAgICAgaXNMb2NhdGVkQ29tbWVudChjb21tZW50KSAmJlxyXG4gICAgICAgIGNvbW1lbnQudHlwZSA9PT0gXCJMaW5lXCIgJiZcclxuICAgICAgICBpc1JhbmdlV2l0aGluKGNvbW1lbnQucmFuZ2UsIGNhbGxiYWNrLmJvZHkucmFuZ2UpICYmXHJcbiAgICAgICAgZ2V0U2VjdGlvblBoYXNlcyhjb21tZW50LnZhbHVlKS5sZW5ndGggPiAwLFxyXG4gICAgKVxyXG4gICAgLm1hcCgoY29tbWVudCkgPT4gKHtcclxuICAgICAgY29tbWVudDogY29tbWVudCBhcyBMb2NhdGVkQ29tbWVudCxcclxuICAgICAgcGhhc2VzOiBnZXRTZWN0aW9uUGhhc2VzKGNvbW1lbnQudmFsdWUpLFxyXG4gICAgfSkpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgYm9keTogY2FsbGJhY2suYm9keSxcclxuICAgIGJvZHlMaW5lQ291bnQ6XHJcbiAgICAgIGNhbGxiYWNrLmJvZHkubG9jLmVuZC5saW5lIC0gY2FsbGJhY2suYm9keS5sb2Muc3RhcnQubGluZSAtIDEsXHJcbiAgICBjYWxsRXhwcmVzc2lvbixcclxuICAgIG5ld2xpbmU6IGdldE5ld2xpbmUoc291cmNlQ29kZS50ZXh0KSxcclxuICAgIHNlY3Rpb25Db21tZW50cyxcclxuICAgIHNvdXJjZVRleHQ6IHNvdXJjZUNvZGUudGV4dCxcclxuICAgIHN0YXRlbWVudHM6IGNhbGxiYWNrLmJvZHkuYm9keS5tYXAoKHN0YXRlbWVudCkgPT4ge1xyXG4gICAgICBjb25zdCBwaGFzZXMgPSBnZXRTdGF0ZW1lbnRQaGFzZXMoc3RhdGVtZW50LCBzZWN0aW9uQ29tbWVudHMpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG5vZGU6IHN0YXRlbWVudCBhcyBMb2NhdGVkTm9kZTxFU1RyZWUuU3RhdGVtZW50PixcclxuICAgICAgICBwaGFzZTogcGhhc2VzLmF0KC0xKSxcclxuICAgICAgICBwaGFzZXMsXHJcbiAgICAgIH07XHJcbiAgICB9KSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQ291bnRzIEFjdCBzdGF0ZW1lbnRzLlxyXG4gKiBAcGFyYW0gYW5hbHlzaXMgSW5wdXQgYW5hbHlzaXMgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY291bnRBY3RTdGF0ZW1lbnRzKGFuYWx5c2lzKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjb3VudEFjdFN0YXRlbWVudHMoYW5hbHlzaXM6IFRlc3RCbG9ja0FuYWx5c2lzKTogbnVtYmVyIHtcclxuICByZXR1cm4gYW5hbHlzaXMuc3RhdGVtZW50cy5maWx0ZXIoXHJcbiAgICAoc3RhdGVtZW50KSA9PlxyXG4gICAgICBzdGF0ZW1lbnQucGhhc2VzLmluY2x1ZGVzKFwiQWN0XCIpICYmXHJcbiAgICAgIChzdGF0ZW1lbnQubm9kZS50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB8fFxyXG4gICAgICAgIHN0YXRlbWVudC5ub2RlLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSxcclxuICApLmxlbmd0aDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZsYXR0ZW5zIHNlY3Rpb24gY29tbWVudHMuXHJcbiAqIEBwYXJhbSBhbmFseXNpcyBJbnB1dCBhbmFseXNpcyB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBnZXRGbGF0dGVuZWRTZWN0aW9ucyhhbmFseXNpcyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0RmxhdHRlbmVkU2VjdGlvbnMoXHJcbiAgYW5hbHlzaXM6IFBpY2s8VGVzdEJsb2NrQW5hbHlzaXMsIFwic2VjdGlvbkNvbW1lbnRzXCI+LFxyXG4pOiBGbGF0dGVuZWRTZWN0aW9uW10ge1xyXG4gIHJldHVybiBhbmFseXNpcy5zZWN0aW9uQ29tbWVudHMuZmxhdE1hcCgoc2VjdGlvbkNvbW1lbnQpID0+XHJcbiAgICBzZWN0aW9uQ29tbWVudC5waGFzZXMubWFwKChwaGFzZSkgPT4gKHtcclxuICAgICAgY29tbWVudDogc2VjdGlvbkNvbW1lbnQuY29tbWVudCxcclxuICAgICAgcGhhc2UsXHJcbiAgICB9KSksXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgaW5kZW50YXRpb24gYXQgYW4gb2Zmc2V0LlxyXG4gKiBAcGFyYW0gc291cmNlVGV4dCBJbnB1dCBzb3VyY2VUZXh0IHZhbHVlLlxyXG4gKiBAcGFyYW0gb2Zmc2V0IElucHV0IG9mZnNldCB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBnZXRJbmRlbnRhdGlvbkF0T2Zmc2V0KHNvdXJjZVRleHQsIDQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldEluZGVudGF0aW9uQXRPZmZzZXQoc291cmNlVGV4dDogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3QgbGluZVN0YXJ0ID0gc291cmNlVGV4dC5sYXN0SW5kZXhPZihcIlxcblwiLCBNYXRoLm1heCgwLCBvZmZzZXQgLSAxKSkgKyAxO1xyXG4gIGNvbnN0IGxpbmVQcmVmaXggPSBzb3VyY2VUZXh0LnNsaWNlKGxpbmVTdGFydCwgb2Zmc2V0KTtcclxuICBjb25zdCB0cmltbWVkUHJlZml4ID0gbGluZVByZWZpeC50cmltU3RhcnQoKTtcclxuXHJcbiAgcmV0dXJuIGxpbmVQcmVmaXguc2xpY2UoMCwgbGluZVByZWZpeC5sZW5ndGggLSB0cmltbWVkUHJlZml4Lmxlbmd0aCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBzdGFydCByYW5nZSBmb3IgYSBsaW5lLlxyXG4gKiBAcGFyYW0gc291cmNlVGV4dCBJbnB1dCBzb3VyY2VUZXh0IHZhbHVlLlxyXG4gKiBAcGFyYW0gbGluZSBJbnB1dCBsaW5lIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldExpbmVTdGFydFJhbmdlKHNvdXJjZVRleHQsIDIpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldExpbmVTdGFydFJhbmdlKHNvdXJjZVRleHQ6IHN0cmluZywgbGluZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgbGV0IGN1cnJlbnRMaW5lID0gMTtcclxuICBsZXQgY3VycmVudE9mZnNldCA9IDA7XHJcbiAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2Ygc291cmNlVGV4dCkge1xyXG4gICAgaWYgKGN1cnJlbnRMaW5lID09PSBsaW5lKSB7XHJcbiAgICAgIHJldHVybiBbY3VycmVudE9mZnNldCwgY3VycmVudE9mZnNldF07XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIlxcblwiKSB7XHJcbiAgICAgIGN1cnJlbnRMaW5lICs9IDE7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50T2Zmc2V0ICs9IDE7XHJcbiAgfVxyXG4gIHJldHVybiBbc291cmNlVGV4dC5sZW5ndGgsIHNvdXJjZVRleHQubGVuZ3RoXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG5ld2xpbmUgc2VxdWVuY2UuXHJcbiAqIEBwYXJhbSB0ZXh0IElucHV0IHRleHQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0TmV3bGluZShzb3VyY2VUZXh0KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXROZXdsaW5lKHRleHQ6IHN0cmluZyk6IFwiXFxuXCIgfCBcIlxcclxcblwiIHtcclxuICByZXR1cm4gdGV4dC5pbmNsdWRlcyhcIlxcclxcblwiKSA/IFwiXFxyXFxuXCIgOiBcIlxcblwiO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyBwaGFzZS1ib3VuZGFyeSBjb21tZW50cy5cclxuICogQHBhcmFtIGFuYWx5c2lzIElucHV0IGFuYWx5c2lzIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldFBoYXNlQm91bmRhcnlDb21tZW50cyhhbmFseXNpcyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UGhhc2VCb3VuZGFyeUNvbW1lbnRzKFxyXG4gIGFuYWx5c2lzOiBQaWNrPFRlc3RCbG9ja0FuYWx5c2lzLCBcInNlY3Rpb25Db21tZW50c1wiPixcclxuKTogVGVzdEJsb2NrQW5hbHlzaXNbXCJzZWN0aW9uQ29tbWVudHNcIl0ge1xyXG4gIHJldHVybiBhbmFseXNpcy5zZWN0aW9uQ29tbWVudHMuZmlsdGVyKChzZWN0aW9uQ29tbWVudCkgPT5cclxuICAgIHNlY3Rpb25Db21tZW50LnBoYXNlcy5zb21lKFxyXG4gICAgICAocGhhc2UpID0+IHBoYXNlID09PSBcIkFjdFwiIHx8IHBoYXNlID09PSBcIkFzc2VydFwiLFxyXG4gICAgKSxcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogUGFyc2VzIEFBQSBwaGFzZXMgZnJvbSBhIGNvbW1lbnQuXHJcbiAqIEBwYXJhbSBjb21tZW50VmFsdWUgSW5wdXQgY29tbWVudFZhbHVlIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldFNlY3Rpb25QaGFzZXMoXCJBcnJhbmdlICYgQWN0XCIpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldFNlY3Rpb25QaGFzZXMoY29tbWVudFZhbHVlOiBzdHJpbmcpOiBBYWFQaGFzZVtdIHtcclxuICBjb25zdCB0cmltbWVkQ29tbWVudCA9IGNvbW1lbnRWYWx1ZS50cmltKCk7XHJcbiAgaWYgKHRyaW1tZWRDb21tZW50Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuICBjb25zdCBwYXJ0cyA9IHRyaW1tZWRDb21tZW50LnNwbGl0KC9cXHMqJlxccyovdSk7XHJcbiAgcmV0dXJuIHBhcnRzLmV2ZXJ5KChwYXJ0KSA9PiBpc0FhYVBoYXNlKHBhcnQpKSA/IHBhcnRzIDogW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBhY3RpdmUgcGhhc2VzIGZvciBhIHN0YXRlbWVudC5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEBwYXJhbSBzZWN0aW9uQ29tbWVudHMgSW5wdXQgc2VjdGlvbkNvbW1lbnRzIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldFN0YXRlbWVudFBoYXNlcyhzdGF0ZW1lbnQsIHNlY3Rpb25Db21tZW50cyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U3RhdGVtZW50UGhhc2VzKFxyXG4gIHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCxcclxuICBzZWN0aW9uQ29tbWVudHM6IFRlc3RCbG9ja0FuYWx5c2lzW1wic2VjdGlvbkNvbW1lbnRzXCJdLFxyXG4pOiBBYWFQaGFzZVtdIHtcclxuICBjb25zdCBzdGF0ZW1lbnRMaW5lID0gc3RhdGVtZW50LmxvYz8uc3RhcnQubGluZTtcclxuICBpZiAoc3RhdGVtZW50TGluZSA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG4gIGxldCBjdXJyZW50UGhhc2VzOiBBYWFQaGFzZVtdID0gW107XHJcbiAgZm9yIChjb25zdCBzZWN0aW9uQ29tbWVudCBvZiBzZWN0aW9uQ29tbWVudHMpIHtcclxuICAgIGlmIChzZWN0aW9uQ29tbWVudC5jb21tZW50LmxvYy5zdGFydC5saW5lID4gc3RhdGVtZW50TGluZSkge1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGN1cnJlbnRQaGFzZXMgPSBzZWN0aW9uQ29tbWVudC5waGFzZXM7XHJcbiAgfVxyXG4gIHJldHVybiBjdXJyZW50UGhhc2VzO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyBzdXBwb3J0ZWQgdGVzdCBjYWxsIG1ldGFkYXRhLlxyXG4gKiBAcGFyYW0gbm9kZSBJbnB1dCBub2RlIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldFN1cHBvcnRlZFRlc3RDYWxsKG5vZGUpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldFN1cHBvcnRlZFRlc3RDYWxsKFxyXG4gIG5vZGU6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbixcclxuKTogU3VwcG9ydGVkVGVzdENhbGwgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IHJvb3ROYW1lID0gZ2V0VGVzdFJvb3ROYW1lKG5vZGUuY2FsbGVlKTtcclxuICBpZiAocm9vdE5hbWUgIT09IFwiaXRcIiAmJiByb290TmFtZSAhPT0gXCJ0ZXN0XCIpIHtcclxuICAgIHJldHVybiB2b2lkIDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBjYWxsYmFja0FyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHMuYXQoLTEpO1xyXG4gIGlmIChcclxuICAgIGNhbGxiYWNrQXJndW1lbnQgPT09IHZvaWQgMCB8fFxyXG4gICAgY2FsbGJhY2tBcmd1bWVudC50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIiB8fFxyXG4gICAgKGNhbGxiYWNrQXJndW1lbnQudHlwZSAhPT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiICYmXHJcbiAgICAgIGNhbGxiYWNrQXJndW1lbnQudHlwZSAhPT0gXCJGdW5jdGlvbkV4cHJlc3Npb25cIikgfHxcclxuICAgIGNhbGxiYWNrQXJndW1lbnQuYm9keS50eXBlICE9PSBcIkJsb2NrU3RhdGVtZW50XCJcclxuICApIHtcclxuICAgIHJldHVybiB2b2lkIDA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgY2FsbGJhY2s6IGNhbGxiYWNrQXJndW1lbnQgYXMgU3VwcG9ydGVkVGVzdENhbGxiYWNrLFxyXG4gICAgY2FsbEV4cHJlc3Npb246IG5vZGUgYXMgTG9jYXRlZE5vZGU8RVNUcmVlLkNhbGxFeHByZXNzaW9uPixcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgcm9vdCB0ZXN0IGNhbGxlZSBuYW1lLlxyXG4gKiBAcGFyYW0gY2FsbGVlIElucHV0IGNhbGxlZSB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBnZXRUZXN0Um9vdE5hbWUoY2FsbEV4cHJlc3Npb24uY2FsbGVlKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRUZXN0Um9vdE5hbWUoXHJcbiAgY2FsbGVlOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb25bXCJjYWxsZWVcIl0sXHJcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKGNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xyXG4gICAgcmV0dXJuIGNhbGxlZS5uYW1lO1xyXG4gIH1cclxuICBpZiAoY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmIGNhbGxlZS5vYmplY3QudHlwZSAhPT0gXCJTdXBlclwiKSB7XHJcbiAgICByZXR1cm4gZ2V0VGVzdFJvb3ROYW1lKGNhbGxlZS5vYmplY3QpO1xyXG4gIH1cclxuICByZXR1cm4gdm9pZCAwO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBhbiBBQUEgcGhhc2UuXHJcbiAqIEBwYXJhbSB2YWx1ZSBJbnB1dCB2YWx1ZSB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpc0FhYVBoYXNlKFwiQXJyYW5nZVwiKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FhYVBoYXNlKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBBYWFQaGFzZSB7XHJcbiAgcmV0dXJuIHBoYXNlTmFtZXMuaW5jbHVkZXModmFsdWUgYXMgQWFhUGhhc2UpO1xyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGFhYVBoYXNlT3JkZXIsXHJcbiAgYW5hbHl6ZVRlc3RCbG9jayxcclxuICBjb3VudEFjdFN0YXRlbWVudHMsXHJcbiAgZ2V0RmxhdHRlbmVkU2VjdGlvbnMsXHJcbiAgZ2V0SW5kZW50YXRpb25BdE9mZnNldCxcclxuICBnZXRMaW5lU3RhcnRSYW5nZSxcclxuICBnZXRQaGFzZUJvdW5kYXJ5Q29tbWVudHMsXHJcbiAgZ2V0U2VjdGlvblBoYXNlcyxcclxufTtcclxuZXhwb3J0IHR5cGUgeyBGbGF0dGVuZWRTZWN0aW9uIH07XHJcbiJdfQ==
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYW5hbHlzaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvYWFhL2FuYWx5emVyLmFuYWx5c2lzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCxhQUFhLElBQUksMkJBQTJCLEVBQzVDLGtCQUFrQixJQUFJLGdDQUFnQyxFQUN0RCxvQkFBb0IsSUFBSSxrQ0FBa0MsRUFDMUQsc0JBQXNCLElBQUksb0NBQW9DLEVBQzlELGlCQUFpQixJQUFJLCtCQUErQixFQUNwRCxVQUFVLElBQUksd0JBQXdCLEVBQ3RDLHdCQUF3QixJQUFJLHNDQUFzQyxFQUNsRSxnQkFBZ0IsSUFBSSw4QkFBOEIsRUFDbEQsa0JBQWtCLElBQUksZ0NBQWdDLEVBQ3RELG9CQUFvQixJQUFJLGtDQUFrQyxHQUMzRCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRTs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxPQUFPLENBQ2QsY0FBdUQ7SUFFdkQsT0FBTyxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLDJCQUEyQixDQUFDO0FBRWxELDREQUE0RDtBQUM1RCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBRXJFLHNFQUFzRTtBQUN0RSxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBRXpFLCtFQUErRTtBQUMvRSxNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0FBRTdFLGlFQUFpRTtBQUNqRSxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0FBRW5FLDJEQUEyRDtBQUMzRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUVyRCwrRUFBK0U7QUFDL0UsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQ3RDLHNDQUFzQyxDQUN2QyxDQUFDO0FBRUYsMkRBQTJEO0FBQzNELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7QUFFakUseURBQXlEO0FBQ3pELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFFckUsMkZBQTJGO0FBQzNGLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFFekU7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsT0FBeUIsRUFDekIsSUFBMkI7SUFFM0IsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxHQUFHLFFBQVEsQ0FBQztJQUM5QyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQy9CLE1BQU0sZUFBZSxHQUF5QyxVQUFVO1NBQ3JFLGNBQWMsRUFBRTtTQUNoQixNQUFNLENBQ0wsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUN6QixPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU07UUFDdkIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQzdDO1NBQ0EsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sRUFBRSxPQUF5QjtRQUNsQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUN4QyxDQUFDLENBQUMsQ0FBQztJQUVOLE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsYUFBYSxFQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQy9ELGNBQWM7UUFDZCxPQUFPLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDcEMsZUFBZTtRQUNmLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSTtRQUMzQixVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQzlELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFNBQTBDO2dCQUNoRCxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsTUFBTTthQUNQLENBQUM7UUFDSixDQUFDLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELE9BQU8sRUFDTCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEdBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XHJcbmltcG9ydCB0eXBlICogYXMgRVNUcmVlIGZyb20gXCJlc3RyZWVcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgTG9jYXRlZENvbW1lbnQsIExvY2F0ZWROb2RlLCBUZXN0QmxvY2tBbmFseXNpcyB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIGFhYVBoYXNlT3JkZXIgYXMgYWFhUGhhc2VPcmRlckltcGxlbWVudGF0aW9uLFxyXG4gIGNvdW50QWN0U3RhdGVtZW50cyBhcyBjb3VudEFjdFN0YXRlbWVudHNJbXBsZW1lbnRhdGlvbixcclxuICBnZXRGbGF0dGVuZWRTZWN0aW9ucyBhcyBnZXRGbGF0dGVuZWRTZWN0aW9uc0ltcGxlbWVudGF0aW9uLFxyXG4gIGdldEluZGVudGF0aW9uQXRPZmZzZXQgYXMgZ2V0SW5kZW50YXRpb25BdE9mZnNldEltcGxlbWVudGF0aW9uLFxyXG4gIGdldExpbmVTdGFydFJhbmdlIGFzIGdldExpbmVTdGFydFJhbmdlSW1wbGVtZW50YXRpb24sXHJcbiAgZ2V0TmV3bGluZSBhcyBnZXROZXdsaW5lSW1wbGVtZW50YXRpb24sXHJcbiAgZ2V0UGhhc2VCb3VuZGFyeUNvbW1lbnRzIGFzIGdldFBoYXNlQm91bmRhcnlDb21tZW50c0ltcGxlbWVudGF0aW9uLFxyXG4gIGdldFNlY3Rpb25QaGFzZXMgYXMgZ2V0U2VjdGlvblBoYXNlc0ltcGxlbWVudGF0aW9uLFxyXG4gIGdldFN0YXRlbWVudFBoYXNlcyBhcyBnZXRTdGF0ZW1lbnRQaGFzZXNJbXBsZW1lbnRhdGlvbixcclxuICBnZXRTdXBwb3J0ZWRUZXN0Q2FsbCBhcyBnZXRTdXBwb3J0ZWRUZXN0Q2FsbEltcGxlbWVudGF0aW9uLFxyXG59IGZyb20gXCIuL2FuYWx5emVyLmFuYWx5c2lzLmhlbHBlcnNcIjtcclxuaW1wb3J0IHsgaXNMb2NhdGVkQ29tbWVudCwgaXNSYW5nZVdpdGhpbiB9IGZyb20gXCIuL2FuYWx5emVyLnN1cGVyXCI7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGxvY2FsIGZvcndhcmRpbmcgZnVuY3Rpb24gZm9yIGFuIGltcG9ydGVkIGFuYWx5emVyIGhlbHBlci5cclxuICogQHRlbXBsYXRlIFRQYXJhbWV0ZXJzIEZvcndhcmRlZCBwYXJhbWV0ZXIgdHVwbGUuXHJcbiAqIEB0ZW1wbGF0ZSBUUmVzdWx0IEZvcndhcmRlZCByZXR1cm4gdHlwZS5cclxuICogQHBhcmFtIGltcGxlbWVudGF0aW9uIEltcG9ydGVkIGhlbHBlciBpbXBsZW1lbnRhdGlvbi5cclxuICogQHJldHVybnMgTG9jYWwgZnVuY3Rpb24gdGhhdCBmb3J3YXJkcyBhbGwgYXJndW1lbnRzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBsb2NhbEhlbHBlciA9IGZvcndhcmQoaW1wbGVtZW50YXRpb24pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGZvcndhcmQ8VFBhcmFtZXRlcnMgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxyXG4gIGltcGxlbWVudGF0aW9uOiAoLi4ucGFyYW1ldGVyczogVFBhcmFtZXRlcnMpID0+IFRSZXN1bHQsXHJcbik6ICguLi5wYXJhbWV0ZXJzOiBUUGFyYW1ldGVycykgPT4gVFJlc3VsdCB7XHJcbiAgcmV0dXJuICguLi5wYXJhbWV0ZXJzKSA9PiBpbXBsZW1lbnRhdGlvbiguLi5wYXJhbWV0ZXJzKTtcclxufVxyXG5cclxuLyoqIE9yZGVyZWQgbGlzdCBvZiBBQUEgcGhhc2UgbmFtZXMuICovXHJcbmNvbnN0IGFhYVBoYXNlT3JkZXIgPSBhYWFQaGFzZU9yZGVySW1wbGVtZW50YXRpb247XHJcblxyXG4vKiogQ291bnRzIEFjdC1waGFzZSBzdGF0ZW1lbnRzIGluIGEgdGVzdCBibG9jayBhbmFseXNpcy4gKi9cclxuY29uc3QgY291bnRBY3RTdGF0ZW1lbnRzID0gZm9yd2FyZChjb3VudEFjdFN0YXRlbWVudHNJbXBsZW1lbnRhdGlvbik7XHJcblxyXG4vKiogRmxhdHRlbnMgbXVsdGktcGhhc2Ugc2VjdGlvbiBjb21tZW50cyBpbnRvIG9uZSBlbnRyeSBwZXIgcGhhc2UuICovXHJcbmNvbnN0IGdldEZsYXR0ZW5lZFNlY3Rpb25zID0gZm9yd2FyZChnZXRGbGF0dGVuZWRTZWN0aW9uc0ltcGxlbWVudGF0aW9uKTtcclxuXHJcbi8qKiBSZXNvbHZlcyB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIGZvciB0aGUgbGluZSBjb250YWluaW5nIGEgc291cmNlIG9mZnNldC4gKi9cclxuY29uc3QgZ2V0SW5kZW50YXRpb25BdE9mZnNldCA9IGZvcndhcmQoZ2V0SW5kZW50YXRpb25BdE9mZnNldEltcGxlbWVudGF0aW9uKTtcclxuXHJcbi8qKiBSZXR1cm5zIHRoZSBzdGFydC1vZi1saW5lIHJhbmdlIGZvciBhIGdpdmVuIHNvdXJjZSBvZmZzZXQuICovXHJcbmNvbnN0IGdldExpbmVTdGFydFJhbmdlID0gZm9yd2FyZChnZXRMaW5lU3RhcnRSYW5nZUltcGxlbWVudGF0aW9uKTtcclxuXHJcbi8qKiBEZXRlY3RzIHRoZSBsaW5lLWVuZGluZyBzdHlsZSB1c2VkIGluIGEgc291cmNlIHRleHQuICovXHJcbmNvbnN0IGdldE5ld2xpbmUgPSBmb3J3YXJkKGdldE5ld2xpbmVJbXBsZW1lbnRhdGlvbik7XHJcblxyXG4vKiogRXh0cmFjdHMgdGhlIHBoYXNlLWJvdW5kYXJ5IHNlY3Rpb24gY29tbWVudHMgZnJvbSBhIHRlc3QgYmxvY2sgYW5hbHlzaXMuICovXHJcbmNvbnN0IGdldFBoYXNlQm91bmRhcnlDb21tZW50cyA9IGZvcndhcmQoXHJcbiAgZ2V0UGhhc2VCb3VuZGFyeUNvbW1lbnRzSW1wbGVtZW50YXRpb24sXHJcbik7XHJcblxyXG4vKiogUGFyc2VzIEFBQSBwaGFzZSBuYW1lcyBmcm9tIGEgc2VjdGlvbiBjb21tZW50IHZhbHVlLiAqL1xyXG5jb25zdCBnZXRTZWN0aW9uUGhhc2VzID0gZm9yd2FyZChnZXRTZWN0aW9uUGhhc2VzSW1wbGVtZW50YXRpb24pO1xyXG5cclxuLyoqIFJlc29sdmVzIHRoZSBBQUEgcGhhc2VzIGFwcGxpY2FibGUgdG8gYSBzdGF0ZW1lbnQuICovXHJcbmNvbnN0IGdldFN0YXRlbWVudFBoYXNlcyA9IGZvcndhcmQoZ2V0U3RhdGVtZW50UGhhc2VzSW1wbGVtZW50YXRpb24pO1xyXG5cclxuLyoqIEV4dHJhY3RzIHRoZSB0ZXN0IGNhbGwgYW5kIGNhbGxiYWNrIGZyb20gYSBzdXBwb3J0ZWQgYGl0YCBvciBgdGVzdGAgY2FsbCBleHByZXNzaW9uLiAqL1xyXG5jb25zdCBnZXRTdXBwb3J0ZWRUZXN0Q2FsbCA9IGZvcndhcmQoZ2V0U3VwcG9ydGVkVGVzdENhbGxJbXBsZW1lbnRhdGlvbik7XHJcblxyXG4vKipcclxuICogQW5hbHl6ZXMgc3VwcG9ydGVkIEFBQSB0ZXN0IGJsb2Nrcy5cclxuICogQHBhcmFtIGNvbnRleHQgSW5wdXQgY29udGV4dCB2YWx1ZS5cclxuICogQHBhcmFtIG5vZGUgSW5wdXQgbm9kZSB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBhbmFseXplVGVzdEJsb2NrKGNvbnRleHQsIG5vZGUpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGFuYWx5emVUZXN0QmxvY2soXHJcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcclxuICBub2RlOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb24sXHJcbik6IFRlc3RCbG9ja0FuYWx5c2lzIHwgdW5kZWZpbmVkIHtcclxuICBjb25zdCB0ZXN0Q2FsbCA9IGdldFN1cHBvcnRlZFRlc3RDYWxsKG5vZGUpO1xyXG4gIGlmICh0ZXN0Q2FsbCA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gdm9pZCAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgeyBjYWxsYmFjaywgY2FsbEV4cHJlc3Npb24gfSA9IHRlc3RDYWxsO1xyXG4gIGNvbnN0IHsgc291cmNlQ29kZSB9ID0gY29udGV4dDtcclxuICBjb25zdCBzZWN0aW9uQ29tbWVudHM6IFRlc3RCbG9ja0FuYWx5c2lzW1wic2VjdGlvbkNvbW1lbnRzXCJdID0gc291cmNlQ29kZVxyXG4gICAgLmdldEFsbENvbW1lbnRzKClcclxuICAgIC5maWx0ZXIoXHJcbiAgICAgIChjb21tZW50KSA9PlxyXG4gICAgICAgIGlzTG9jYXRlZENvbW1lbnQoY29tbWVudCkgJiZcclxuICAgICAgICBjb21tZW50LnR5cGUgPT09IFwiTGluZVwiICYmXHJcbiAgICAgICAgaXNSYW5nZVdpdGhpbihjb21tZW50LnJhbmdlLCBjYWxsYmFjay5ib2R5LnJhbmdlKSAmJlxyXG4gICAgICAgIGdldFNlY3Rpb25QaGFzZXMoY29tbWVudC52YWx1ZSkubGVuZ3RoID4gMCxcclxuICAgIClcclxuICAgIC5tYXAoKGNvbW1lbnQpID0+ICh7XHJcbiAgICAgIGNvbW1lbnQ6IGNvbW1lbnQgYXMgTG9jYXRlZENvbW1lbnQsXHJcbiAgICAgIHBoYXNlczogZ2V0U2VjdGlvblBoYXNlcyhjb21tZW50LnZhbHVlKSxcclxuICAgIH0pKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGJvZHk6IGNhbGxiYWNrLmJvZHksXHJcbiAgICBib2R5TGluZUNvdW50OlxyXG4gICAgICBjYWxsYmFjay5ib2R5LmxvYy5lbmQubGluZSAtIGNhbGxiYWNrLmJvZHkubG9jLnN0YXJ0LmxpbmUgLSAxLFxyXG4gICAgY2FsbEV4cHJlc3Npb24sXHJcbiAgICBuZXdsaW5lOiBnZXROZXdsaW5lKHNvdXJjZUNvZGUudGV4dCksXHJcbiAgICBzZWN0aW9uQ29tbWVudHMsXHJcbiAgICBzb3VyY2VUZXh0OiBzb3VyY2VDb2RlLnRleHQsXHJcbiAgICBzdGF0ZW1lbnRzOiBjYWxsYmFjay5ib2R5LmJvZHkubWFwKChzdGF0ZW1lbnQpID0+IHtcclxuICAgICAgY29uc3QgcGhhc2VzID0gZ2V0U3RhdGVtZW50UGhhc2VzKHN0YXRlbWVudCwgc2VjdGlvbkNvbW1lbnRzKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBub2RlOiBzdGF0ZW1lbnQgYXMgTG9jYXRlZE5vZGU8RVNUcmVlLlN0YXRlbWVudD4sXHJcbiAgICAgICAgcGhhc2U6IHBoYXNlcy5hdCgtMSksXHJcbiAgICAgICAgcGhhc2VzLFxyXG4gICAgICB9O1xyXG4gICAgfSksXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICBhYWFQaGFzZU9yZGVyLFxyXG4gIGFuYWx5emVUZXN0QmxvY2ssXHJcbiAgY291bnRBY3RTdGF0ZW1lbnRzLFxyXG4gIGdldEZsYXR0ZW5lZFNlY3Rpb25zLFxyXG4gIGdldEluZGVudGF0aW9uQXRPZmZzZXQsXHJcbiAgZ2V0TGluZVN0YXJ0UmFuZ2UsXHJcbiAgZ2V0UGhhc2VCb3VuZGFyeUNvbW1lbnRzLFxyXG4gIGdldFNlY3Rpb25QaGFzZXMsXHJcbn07XHJcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ /** Companion module for unsupported analysis spec coverage. */
2
+ declare const analyzerAnalysisUnsupportedCompanion: true;
3
+ export { analyzerAnalysisUnsupportedCompanion };
4
+ //# sourceMappingURL=analyzer.analysis.unsupported.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.analysis.unsupported.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/aaa/analyzer.analysis.unsupported.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,QAAA,MAAM,oCAAoC,EAAG,IAAa,CAAC;AAE3D,OAAO,EAAE,oCAAoC,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Companion module for unsupported analysis spec coverage. */
2
+ const analyzerAnalysisUnsupportedCompanion = true;
3
+ export { analyzerAnalysisUnsupportedCompanion };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYW5hbHlzaXMudW5zdXBwb3J0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvYWFhL2FuYWx5emVyLmFuYWx5c2lzLnVuc3VwcG9ydGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxNQUFNLG9DQUFvQyxHQUFHLElBQWEsQ0FBQztBQUUzRCxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb21wYW5pb24gbW9kdWxlIGZvciB1bnN1cHBvcnRlZCBhbmFseXNpcyBzcGVjIGNvdmVyYWdlLiAqL1xyXG5jb25zdCBhbmFseXplckFuYWx5c2lzVW5zdXBwb3J0ZWRDb21wYW5pb24gPSB0cnVlIGFzIGNvbnN0O1xyXG5cclxuZXhwb3J0IHsgYW5hbHl6ZXJBbmFseXNpc1Vuc3VwcG9ydGVkQ29tcGFuaW9uIH07XHJcbiJdfQ==
@@ -1,93 +1,18 @@
1
- import type * as ESTree from "estree";
2
- import type { LocatedNode, TestBlockAnalysis } from "./types.js";
3
- /** Identifier names extracted from an assertion statement. */
4
- interface AssertionIdentifiers {
5
- /** Identifier used as the actual value. */
6
- actual: string | undefined;
7
- /** Identifier used as the expected value. */
8
- expected: string | undefined;
9
- }
10
- /**
11
- * Collects Assert declarations.
12
- * @param analysis Input analysis value.
13
- * @returns Return value output.
14
- * @example
15
- * ```typescript
16
- * getAssertDeclaredIdentifiers(analysis);
17
- * ```
18
- */
19
- declare function getAssertDeclaredIdentifiers(analysis: TestBlockAnalysis): Map<string, LocatedNode<ESTree.Identifier>>;
20
- /**
21
- * Extracts assertion identifiers.
22
- * @param statement Input statement value.
23
- * @returns Return value output.
24
- * @example
25
- * ```typescript
26
- * getAssertionIdentifiers(statement);
27
- * ```
28
- */
29
- declare function getAssertionIdentifiers(statement: ESTree.Statement): AssertionIdentifiers;
30
- /**
31
- * Gets a statement expression.
32
- * @param statement Input statement value.
33
- * @returns Return value output.
34
- * @example
35
- * ```typescript
36
- * getStatementExpression(statement);
37
- * ```
38
- */
39
- declare function getStatementExpression(statement: ESTree.Statement): ESTree.Expression | undefined;
40
- /**
41
- * Checks for assertions.
42
- * @param statement Input statement value.
43
- * @returns Return value output.
44
- * @example
45
- * ```typescript
46
- * hasAssertion(statement);
47
- * ```
48
- */
49
- declare function hasAssertion(statement: ESTree.Statement): boolean;
50
- /**
51
- * Checks for action expressions.
52
- * @param expression Input expression value.
53
- * @returns Return value output.
54
- * @example
55
- * ```typescript
56
- * isActionExpression(expression);
57
- * ```
58
- */
59
- declare function isActionExpression(expression: ESTree.Expression | undefined): boolean;
60
- /**
61
- * Checks Assert statement validity.
62
- * @param statement Input statement value.
63
- * @returns Return value output.
64
- * @example
65
- * ```typescript
66
- * isValidAssertStatement(statement);
67
- * ```
68
- */
69
- declare function isValidAssertStatement(statement: ESTree.Statement): boolean;
70
- /**
71
- * Unwraps nested expressions.
72
- * @param expression Input expression value.
73
- * @returns Return value output.
74
- * @example
75
- * ```typescript
76
- * unwrapExpression(expression);
77
- * ```
78
- */
79
- declare function unwrapExpression(expression: ESTree.Expression | undefined): ESTree.Expression | undefined;
80
- /**
81
- * Checks AAA naming prefixes.
82
- * @param name Input name value.
83
- * @param prefix Input prefix value.
84
- * @returns Return value output.
85
- * @example
86
- * ```typescript
87
- * usesPrefix("actualResult", "actual");
88
- * ```
89
- */
90
- declare function usesPrefix(name: string, prefix: "actual" | "expected"): boolean;
1
+ /** Collects all declared identifiers from an assert statement. */
2
+ declare const getAssertDeclaredIdentifiers: (analysis: import("./types.js").TestBlockAnalysis) => Map<string, import("./types.js").LocatedNode<import("estree").Identifier>>;
3
+ /** Resolves the identifier names used in an assertion call. */
4
+ declare const getAssertionIdentifiers: (statement: import("estree").Statement) => import("./analyzer.assertions.helpers.js").AssertionIdentifiers;
5
+ /** Extracts the expression from an expression statement node. */
6
+ declare const getStatementExpression: (statement: import("estree").Statement) => import("estree").Expression | undefined;
7
+ /** Checks whether a statement contains an assertion call. */
8
+ declare const hasAssertion: (statement: import("estree").Statement) => boolean;
9
+ /** Checks whether an expression is an Act-phase action expression. */
10
+ declare const isActionExpression: (expression: import("estree").Expression | undefined) => boolean;
11
+ /** Checks whether a statement is a valid Assert-phase assertion. */
12
+ declare const isValidAssertStatement: (statement: import("estree").Statement) => boolean;
13
+ /** Unwraps a nested or chained expression to its root call. */
14
+ declare const unwrapExpression: (expression: import("estree").Expression | undefined) => import("estree").Expression | undefined;
15
+ /** Checks whether an assertion call uses a known assertion prefix. */
16
+ declare const usesPrefix: (name: string, prefix: "actual" | "expected") => boolean;
91
17
  export { getAssertDeclaredIdentifiers, getAssertionIdentifiers, getStatementExpression, hasAssertion, isActionExpression, isValidAssertStatement, unwrapExpression, usesPrefix, };
92
- export type { AssertionIdentifiers };
93
18
  //# sourceMappingURL=analyzer.assertions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.assertions.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/aaa/analyzer.assertions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAI9D,8DAA8D;AAC9D,UAAU,oBAAoB;IAC5B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAUD;;;;;;;;GAQG;AACH,iBAAS,4BAA4B,CACnC,QAAQ,EAAE,iBAAiB,GAC1B,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAkB7C;AAwBD;;;;;;;;GAQG;AACH,iBAAS,uBAAuB,CAC9B,SAAS,EAAE,MAAM,CAAC,SAAS,GAC1B,oBAAoB,CAqBtB;AAmFD;;;;;;;;GAQG;AACH,iBAAS,sBAAsB,CAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,GAC1B,MAAM,CAAC,UAAU,GAAG,SAAS,CAY/B;AAED;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAQ1D;AAqBD;;;;;;;;GAQG;AACH,iBAAS,kBAAkB,CACzB,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GACxC,OAAO,CAOT;AA8BD;;;;;;;;GAQG;AACH,iBAAS,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAmBpE;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CACvB,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GACxC,MAAM,CAAC,UAAU,GAAG,SAAS,CAQ/B;AAED;;;;;;;;;GASG;AACH,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAExE;AAED,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,GACX,CAAC;AACF,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"analyzer.assertions.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/aaa/analyzer.assertions.ts"],"names":[],"mappings":"AA4BA,kEAAkE;AAClE,QAAA,MAAM,4BAA4B,4HAEjC,CAAC;AAEF,+DAA+D;AAC/D,QAAA,MAAM,uBAAuB,yGAAiD,CAAC;AAE/E,iEAAiE;AACjE,QAAA,MAAM,sBAAsB,oFAAgD,CAAC;AAE7E,6DAA6D;AAC7D,QAAA,MAAM,YAAY,oDAAsC,CAAC;AAEzD,sEAAsE;AACtE,QAAA,MAAM,kBAAkB,kEAA4C,CAAC;AAErE,oEAAoE;AACpE,QAAA,MAAM,sBAAsB,oDAAgD,CAAC;AAE7E,+DAA+D;AAC/D,QAAA,MAAM,gBAAgB,kGAA0C,CAAC;AAEjE,sEAAsE;AACtE,QAAA,MAAM,UAAU,0DAAoC,CAAC;AAErD,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,GACX,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Companion module for destructured assertion declaration spec coverage. */
2
+ declare const analyzerAssertionsDestructuredCompanion: true;
3
+ export { analyzerAssertionsDestructuredCompanion };
4
+ //# sourceMappingURL=analyzer.assertions.destructured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.assertions.destructured.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/aaa/analyzer.assertions.destructured.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,QAAA,MAAM,uCAAuC,EAAG,IAAa,CAAC;AAE9D,OAAO,EAAE,uCAAuC,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Companion module for destructured assertion declaration spec coverage. */
2
+ const analyzerAssertionsDestructuredCompanion = true;
3
+ export { analyzerAssertionsDestructuredCompanion };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYXNzZXJ0aW9ucy5kZXN0cnVjdHVyZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvYWFhL2FuYWx5emVyLmFzc2VydGlvbnMuZGVzdHJ1Y3R1cmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZFQUE2RTtBQUM3RSxNQUFNLHVDQUF1QyxHQUFHLElBQWEsQ0FBQztBQUU5RCxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb21wYW5pb24gbW9kdWxlIGZvciBkZXN0cnVjdHVyZWQgYXNzZXJ0aW9uIGRlY2xhcmF0aW9uIHNwZWMgY292ZXJhZ2UuICovXHJcbmNvbnN0IGFuYWx5emVyQXNzZXJ0aW9uc0Rlc3RydWN0dXJlZENvbXBhbmlvbiA9IHRydWUgYXMgY29uc3Q7XHJcblxyXG5leHBvcnQgeyBhbmFseXplckFzc2VydGlvbnNEZXN0cnVjdHVyZWRDb21wYW5pb24gfTtcclxuIl19
@@ -0,0 +1,95 @@
1
+ import type * as ESTree from "estree";
2
+ import type { LocatedNode, TestBlockAnalysis } from "./types.js";
3
+ /** Identifier names extracted from an assertion statement. */
4
+ interface AssertionIdentifiers {
5
+ /** Identifier used as the actual value. */
6
+ actual: string | undefined;
7
+ /** Identifier used as the expected value. */
8
+ expected: string | undefined;
9
+ }
10
+ /**
11
+ * Collects Assert declarations.
12
+ * @param analysis Input analysis value.
13
+ * @returns Return value output.
14
+ * @example
15
+ * ```typescript
16
+ * getAssertDeclaredIdentifiers(analysis);
17
+ * ```
18
+ */
19
+ declare function getAssertDeclaredIdentifiers(analysis: TestBlockAnalysis): Map<string, LocatedNode<ESTree.Identifier>>;
20
+ /**
21
+ * Extracts assertion identifiers.
22
+ * @param statement Input statement value.
23
+ * @returns Return value output.
24
+ * @example
25
+ * ```typescript
26
+ * getAssertionIdentifiers(statement);
27
+ * ```
28
+ */
29
+ declare function getAssertionIdentifiers(statement: ESTree.Statement): AssertionIdentifiers;
30
+ /**
31
+ * Gets a statement expression.
32
+ * @param statement Input statement value.
33
+ * @returns Return value output.
34
+ * @example
35
+ * ```typescript
36
+ * getStatementExpression(statement);
37
+ * ```
38
+ */
39
+ declare function getStatementExpression(statement: ESTree.Statement): ESTree.Expression | undefined;
40
+ /**
41
+ * Checks for assertions.
42
+ * @param statement Input statement value.
43
+ * @returns Return value output.
44
+ * @example
45
+ * ```typescript
46
+ * hasAssertion(statement);
47
+ * ```
48
+ */
49
+ declare function hasAssertion(statement: ESTree.Statement): boolean;
50
+ /**
51
+ * Checks for action expressions.
52
+ * @param expression Input expression value.
53
+ * @returns Return value output.
54
+ * @example
55
+ * ```typescript
56
+ * isActionExpression(expression);
57
+ * ```
58
+ */
59
+ declare function isActionExpression(expression: ESTree.Expression | undefined): boolean;
60
+ /**
61
+ * Checks Assert statement validity.
62
+ * @param statement Input statement value.
63
+ * @returns Return value output.
64
+ * @example
65
+ * ```typescript
66
+ * isValidAssertStatement(statement);
67
+ * ```
68
+ */
69
+ declare function isValidAssertStatement(statement: ESTree.Statement): boolean;
70
+ /**
71
+ * Unwraps nested expressions.
72
+ * @param expression Input expression value.
73
+ * @returns Return value output.
74
+ * @example
75
+ * ```typescript
76
+ * unwrapExpression(expression);
77
+ * ```
78
+ */
79
+ declare function unwrapExpression(expression: ESTree.Expression | undefined): ESTree.Expression | undefined;
80
+ /**
81
+ * Checks AAA naming prefixes.
82
+ * @param name Input name value.
83
+ * @param prefix Input prefix value.
84
+ * @returns Return value output.
85
+ * @example
86
+ * ```typescript
87
+ * usesPrefix("actualResult", "actual");
88
+ * ```
89
+ */
90
+ declare function usesPrefix(name: string, prefix: "actual" | "expected"): boolean;
91
+ /** Companion marker for test isolation. */
92
+ declare const analyzerAssertionsHelpersCompanion: true;
93
+ export { analyzerAssertionsHelpersCompanion, getAssertDeclaredIdentifiers, getAssertionIdentifiers, getStatementExpression, hasAssertion, isActionExpression, isValidAssertStatement, unwrapExpression, usesPrefix, };
94
+ export type { AssertionIdentifiers };
95
+ //# sourceMappingURL=analyzer.assertions.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.assertions.helpers.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/aaa/analyzer.assertions.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAW9D,8DAA8D;AAC9D,UAAU,oBAAoB;IAC5B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,iBAAS,4BAA4B,CACnC,QAAQ,EAAE,iBAAiB,GAC1B,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAkB7C;AAwBD;;;;;;;;GAQG;AACH,iBAAS,uBAAuB,CAC9B,SAAS,EAAE,MAAM,CAAC,SAAS,GAC1B,oBAAoB,CAqBtB;AAED;;;;;;;;GAQG;AACH,iBAAS,sBAAsB,CAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,GAC1B,MAAM,CAAC,UAAU,GAAG,SAAS,CAY/B;AAED;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAQ1D;AAED;;;;;;;;GAQG;AACH,iBAAS,kBAAkB,CACzB,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GACxC,OAAO,CAOT;AAED;;;;;;;;GAQG;AACH,iBAAS,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAmBpE;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CACvB,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GACxC,MAAM,CAAC,UAAU,GAAG,SAAS,CAQ/B;AAED;;;;;;;;;GASG;AACH,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAExE;AAED,2CAA2C;AAC3C,QAAA,MAAM,kCAAkC,EAAG,IAAa,CAAC;AAEzD,OAAO,EACL,kCAAkC,EAClC,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,GACX,CAAC;AACF,YAAY,EAAE,oBAAoB,EAAE,CAAC"}