legal-markdown-js 0.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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +168 -0
  3. package/dist/browser.d.ts +87 -0
  4. package/dist/browser.d.ts.map +1 -0
  5. package/dist/browser.js +157 -0
  6. package/dist/browser.js.map +1 -0
  7. package/dist/cli/index.d.ts +34 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +221 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/service.d.ts +128 -0
  12. package/dist/cli/service.d.ts.map +1 -0
  13. package/dist/cli/service.js +284 -0
  14. package/dist/cli/service.js.map +1 -0
  15. package/dist/constants/index.d.ts +229 -0
  16. package/dist/constants/index.d.ts.map +1 -0
  17. package/dist/constants/index.js +232 -0
  18. package/dist/constants/index.js.map +1 -0
  19. package/dist/core/exporters/metadata-exporter.d.ts +104 -0
  20. package/dist/core/exporters/metadata-exporter.d.ts.map +1 -0
  21. package/dist/core/exporters/metadata-exporter.js +201 -0
  22. package/dist/core/exporters/metadata-exporter.js.map +1 -0
  23. package/dist/core/index.d.ts +40 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +56 -0
  26. package/dist/core/index.js.map +1 -0
  27. package/dist/core/parsers/yaml-parser.d.ts +149 -0
  28. package/dist/core/parsers/yaml-parser.d.ts.map +1 -0
  29. package/dist/core/parsers/yaml-parser.js +321 -0
  30. package/dist/core/parsers/yaml-parser.js.map +1 -0
  31. package/dist/core/processors/clause-processor.d.ts +74 -0
  32. package/dist/core/processors/clause-processor.d.ts.map +1 -0
  33. package/dist/core/processors/clause-processor.js +213 -0
  34. package/dist/core/processors/clause-processor.js.map +1 -0
  35. package/dist/core/processors/date-processor.d.ts +90 -0
  36. package/dist/core/processors/date-processor.d.ts.map +1 -0
  37. package/dist/core/processors/date-processor.js +336 -0
  38. package/dist/core/processors/date-processor.js.map +1 -0
  39. package/dist/core/processors/header-processor.d.ts +104 -0
  40. package/dist/core/processors/header-processor.d.ts.map +1 -0
  41. package/dist/core/processors/header-processor.js +585 -0
  42. package/dist/core/processors/header-processor.js.map +1 -0
  43. package/dist/core/processors/import-processor.d.ts +116 -0
  44. package/dist/core/processors/import-processor.d.ts.map +1 -0
  45. package/dist/core/processors/import-processor.js +236 -0
  46. package/dist/core/processors/import-processor.js.map +1 -0
  47. package/dist/core/processors/mixin-processor.d.ts +93 -0
  48. package/dist/core/processors/mixin-processor.d.ts.map +1 -0
  49. package/dist/core/processors/mixin-processor.js +378 -0
  50. package/dist/core/processors/mixin-processor.js.map +1 -0
  51. package/dist/core/processors/reference-processor.d.ts +115 -0
  52. package/dist/core/processors/reference-processor.d.ts.map +1 -0
  53. package/dist/core/processors/reference-processor.js +273 -0
  54. package/dist/core/processors/reference-processor.js.map +1 -0
  55. package/dist/errors/index.d.ts +234 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +267 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/extensions/batch-processor.d.ts +197 -0
  60. package/dist/extensions/batch-processor.d.ts.map +1 -0
  61. package/dist/extensions/batch-processor.js +392 -0
  62. package/dist/extensions/batch-processor.js.map +1 -0
  63. package/dist/extensions/formatters/index.d.ts +99 -0
  64. package/dist/extensions/formatters/index.d.ts.map +1 -0
  65. package/dist/extensions/formatters/index.js +128 -0
  66. package/dist/extensions/formatters/index.js.map +1 -0
  67. package/dist/extensions/index.d.ts +53 -0
  68. package/dist/extensions/index.d.ts.map +1 -0
  69. package/dist/extensions/index.js +71 -0
  70. package/dist/extensions/index.js.map +1 -0
  71. package/dist/extensions/latex-parser.d.ts +111 -0
  72. package/dist/extensions/latex-parser.d.ts.map +1 -0
  73. package/dist/extensions/latex-parser.js +563 -0
  74. package/dist/extensions/latex-parser.js.map +1 -0
  75. package/dist/extensions/rst-parser.d.ts +112 -0
  76. package/dist/extensions/rst-parser.d.ts.map +1 -0
  77. package/dist/extensions/rst-parser.js +268 -0
  78. package/dist/extensions/rst-parser.js.map +1 -0
  79. package/dist/extensions/template-loops.d.ts +61 -0
  80. package/dist/extensions/template-loops.d.ts.map +1 -0
  81. package/dist/extensions/template-loops.js +418 -0
  82. package/dist/extensions/template-loops.js.map +1 -0
  83. package/dist/extensions/utilities/index.d.ts +114 -0
  84. package/dist/extensions/utilities/index.d.ts.map +1 -0
  85. package/dist/extensions/utilities/index.js +137 -0
  86. package/dist/extensions/utilities/index.js.map +1 -0
  87. package/dist/extensions/validators/index.d.ts +65 -0
  88. package/dist/extensions/validators/index.d.ts.map +1 -0
  89. package/dist/extensions/validators/index.js +88 -0
  90. package/dist/extensions/validators/index.js.map +1 -0
  91. package/dist/generators/html-generator.d.ts +184 -0
  92. package/dist/generators/html-generator.d.ts.map +1 -0
  93. package/dist/generators/html-generator.js +361 -0
  94. package/dist/generators/html-generator.js.map +1 -0
  95. package/dist/generators/pdf-generator.d.ts +165 -0
  96. package/dist/generators/pdf-generator.d.ts.map +1 -0
  97. package/dist/generators/pdf-generator.js +275 -0
  98. package/dist/generators/pdf-generator.js.map +1 -0
  99. package/dist/helpers/date-helpers.d.ts +216 -0
  100. package/dist/helpers/date-helpers.d.ts.map +1 -0
  101. package/dist/helpers/date-helpers.js +402 -0
  102. package/dist/helpers/date-helpers.js.map +1 -0
  103. package/dist/helpers/index.d.ts +87 -0
  104. package/dist/helpers/index.d.ts.map +1 -0
  105. package/dist/helpers/index.js +149 -0
  106. package/dist/helpers/index.js.map +1 -0
  107. package/dist/helpers/number-helpers.d.ts +269 -0
  108. package/dist/helpers/number-helpers.d.ts.map +1 -0
  109. package/dist/helpers/number-helpers.js +406 -0
  110. package/dist/helpers/number-helpers.js.map +1 -0
  111. package/dist/helpers/string-helpers.d.ts +391 -0
  112. package/dist/helpers/string-helpers.d.ts.map +1 -0
  113. package/dist/helpers/string-helpers.js +549 -0
  114. package/dist/helpers/string-helpers.js.map +1 -0
  115. package/dist/index.d.ts +229 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +384 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/legal-markdown.umd.min.js +2 -0
  120. package/dist/legal-markdown.umd.min.js.LICENSE.txt +14 -0
  121. package/dist/legal-markdown.umd.min.js.map +1 -0
  122. package/dist/lib/index.d.ts +150 -0
  123. package/dist/lib/index.d.ts.map +1 -0
  124. package/dist/lib/index.js +265 -0
  125. package/dist/lib/index.js.map +1 -0
  126. package/dist/parsers/content-detector.d.ts +131 -0
  127. package/dist/parsers/content-detector.d.ts.map +1 -0
  128. package/dist/parsers/content-detector.js +220 -0
  129. package/dist/parsers/content-detector.js.map +1 -0
  130. package/dist/parsers/fallback-parsers.d.ts +14 -0
  131. package/dist/parsers/fallback-parsers.d.ts.map +1 -0
  132. package/dist/parsers/fallback-parsers.js +188 -0
  133. package/dist/parsers/fallback-parsers.js.map +1 -0
  134. package/dist/parsers/implementations/pandoc-native.d.ts +13 -0
  135. package/dist/parsers/implementations/pandoc-native.d.ts.map +1 -0
  136. package/dist/parsers/implementations/pandoc-native.js +63 -0
  137. package/dist/parsers/implementations/pandoc-native.js.map +1 -0
  138. package/dist/parsers/implementations/pandoc-wasm.d.ts +14 -0
  139. package/dist/parsers/implementations/pandoc-wasm.d.ts.map +1 -0
  140. package/dist/parsers/implementations/pandoc-wasm.js +64 -0
  141. package/dist/parsers/implementations/pandoc-wasm.js.map +1 -0
  142. package/dist/parsers/pandoc-factory.d.ts +97 -0
  143. package/dist/parsers/pandoc-factory.d.ts.map +1 -0
  144. package/dist/parsers/pandoc-factory.js +146 -0
  145. package/dist/parsers/pandoc-factory.js.map +1 -0
  146. package/dist/parsers/pandoc-loader.d.ts +24 -0
  147. package/dist/parsers/pandoc-loader.d.ts.map +1 -0
  148. package/dist/parsers/pandoc-loader.js +124 -0
  149. package/dist/parsers/pandoc-loader.js.map +1 -0
  150. package/dist/parsers/pandoc-parser.d.ts +27 -0
  151. package/dist/parsers/pandoc-parser.d.ts.map +1 -0
  152. package/dist/parsers/pandoc-parser.js +3 -0
  153. package/dist/parsers/pandoc-parser.js.map +1 -0
  154. package/dist/styles/default.css +125 -0
  155. package/dist/styles/headers.css +146 -0
  156. package/dist/styles/highlight.css +171 -0
  157. package/dist/tracking/field-tracker.d.ts +206 -0
  158. package/dist/tracking/field-tracker.d.ts.map +1 -0
  159. package/dist/tracking/field-tracker.js +247 -0
  160. package/dist/tracking/field-tracker.js.map +1 -0
  161. package/dist/types.d.ts +186 -0
  162. package/dist/types.d.ts.map +1 -0
  163. package/dist/types.js +33 -0
  164. package/dist/types.js.map +1 -0
  165. package/dist/utils/logger.d.ts +107 -0
  166. package/dist/utils/logger.d.ts.map +1 -0
  167. package/dist/utils/logger.js +122 -0
  168. package/dist/utils/logger.js.map +1 -0
  169. package/dist/web/bundle-standalone.js +28 -0
  170. package/dist/web/bundle.js +17 -0
  171. package/dist/web/index.html +1465 -0
  172. package/dist/web/legal-markdown.umd.min.js +2 -0
  173. package/dist/web/standalone.html +390 -0
  174. package/dist/web/styles.css +874 -0
  175. package/package.json +118 -0
@@ -0,0 +1,585 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Header Processing Module for Legal Markdown Documents
4
+ *
5
+ * This module provides comprehensive header processing functionality for Legal Markdown
6
+ * documents, supporting both traditional (l., ll., lll.) and alternative (lfunction extractHeaderOptions(
7
+ metadata: Record<string, any>,
8
+ processingOptions: {
9
+ noReset?: boolean;
10
+ noIndent?: boolean;
11
+ enableFieldTracking?: boolean;
12
+ }
13
+ ): HeaderOptions {l2., l3.)
14
+ * header syntax. It handles complex numbering schemes, hierarchical structures, and
15
+ * various formatting options including Roman numerals, alphabetic labels, and custom
16
+ * indentation patterns.
17
+ *
18
+ * Features:
19
+ * - Dual header syntax support (traditional and alternative)
20
+ * - Complex hierarchical numbering with automatic level management
21
+ * - Roman numeral and alphabetic label generation
22
+ * - Customizable header formatting templates
23
+ * - Academic and legal document formatting patterns
24
+ * - Automatic indentation and spacing control
25
+ * - Continuous numbering and reset control options
26
+ * - Level-specific formatting with placeholder substitution
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * import { processHeaders } from './header-processor';
31
+ *
32
+ * const content = `l. Introduction
33
+ * ll. Terms and Conditions
34
+ * lll. Payment Terms
35
+ * l2. Liability`;
36
+ *
37
+ * const metadata = {
38
+ * 'level-one': 'Article %n.',
39
+ * 'level-two': 'Section %n.',
40
+ * 'level-three': '(%n)'
41
+ * };
42
+ *
43
+ * const processed = processHeaders(content, metadata);
44
+ * console.log(processed);
45
+ * // Output:
46
+ * // Article 1. Introduction
47
+ * // Section 1. Terms and Conditions
48
+ * // (1) Payment Terms
49
+ * // Section 2. Liability
50
+ * ```
51
+ */
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.processHeaders = processHeaders;
54
+ /**
55
+ * Processes structured headers in a LegalMarkdown document
56
+ *
57
+ * This is the main function that processes both traditional (l., ll., lll.) and
58
+ * alternative (l1., l2., l3.) header syntax. It maintains proper hierarchical
59
+ * numbering, applies custom formatting templates, and handles complex academic
60
+ * and legal document structures.
61
+ *
62
+ * @param {string} content - The document content containing headers to process
63
+ * @param {Record<string, any>} metadata - Document metadata with potential header formatting options
64
+ * @param {Object} [processingOptions={}] - Additional processing options
65
+ * @param {boolean} [processingOptions.noReset] - Disable header numbering reset (continuous numbering)
66
+ * @param {boolean} [processingOptions.noIndent] - Disable header indentation (flat formatting)
67
+ * @returns {string} Processed content with formatted headers
68
+ * @example
69
+ * ```typescript
70
+ * // Basic header processing
71
+ * const content = `l. First Article
72
+ * ll. First Section
73
+ * lll. Subsection A
74
+ * ll. Second Section
75
+ * l. Second Article`;
76
+ *
77
+ * const metadata = {
78
+ * 'level-one': 'Article %n.',
79
+ * 'level-two': 'Section %n.',
80
+ * 'level-three': '(%c)'
81
+ * };
82
+ *
83
+ * const result = processHeaders(content, metadata);
84
+ * // Output:
85
+ * // Article 1. First Article
86
+ * // Section 1. First Section
87
+ * // (a) Subsection A
88
+ * // Section 2. Second Section
89
+ * // Article 2. Second Article
90
+ *
91
+ * // Alternative syntax
92
+ * const altContent = `l1. Introduction
93
+ * l2. Background
94
+ * l3. Technical Details
95
+ * l2. Implementation
96
+ * l1. Conclusion`;
97
+ *
98
+ * const altResult = processHeaders(altContent, metadata);
99
+ * // Produces similar hierarchical numbering
100
+ * ```
101
+ */
102
+ function processHeaders(content, metadata, processingOptions = {}) {
103
+ // Extract header options from metadata
104
+ const options = extractHeaderOptions(metadata, processingOptions);
105
+ // Define regex patterns for both header styles
106
+ const traditionalHeaderPattern = /^(l+)\.\s+(.*?)$/gm;
107
+ const alternativeHeaderPattern = /^l(\d+)\.\s+(.*?)$/gm;
108
+ // Track header numbering state
109
+ const headerNumbers = [0, 0, 0, 0, 0];
110
+ // Process all headers in a single pass to maintain correct numbering
111
+ const matches = [];
112
+ // Collect all traditional header matches
113
+ let match;
114
+ const contentCopy = content.slice();
115
+ traditionalHeaderPattern.lastIndex = 0;
116
+ while ((match = traditionalHeaderPattern.exec(contentCopy)) !== null) {
117
+ matches.push({
118
+ match: match[0],
119
+ level: match[1].length,
120
+ text: match[2],
121
+ index: match.index,
122
+ });
123
+ }
124
+ // Collect all alternative header matches
125
+ alternativeHeaderPattern.lastIndex = 0;
126
+ while ((match = alternativeHeaderPattern.exec(contentCopy)) !== null) {
127
+ matches.push({
128
+ match: match[0],
129
+ level: parseInt(match[1], 10),
130
+ text: match[2],
131
+ index: match.index,
132
+ });
133
+ }
134
+ // Sort matches by their position in the document
135
+ matches.sort((a, b) => a.index - b.index);
136
+ // Process headers in order (document order)
137
+ let result = content;
138
+ let offset = 0;
139
+ let previousLevel = 0;
140
+ for (const m of matches) {
141
+ // Update header numbers based on level
142
+ const level = m.level;
143
+ // Special logic for level 5
144
+ if (level === 5) {
145
+ if (previousLevel === 5) {
146
+ // Consecutive level 5s: just increment level 5
147
+ headerNumbers[4]++;
148
+ }
149
+ else {
150
+ // Level 5 after something else: reset level 5 to 1
151
+ headerNumbers[4] = 1;
152
+ }
153
+ }
154
+ else {
155
+ // Standard logic for other levels
156
+ // If we're skipping levels, increment all intermediate levels to 1
157
+ for (let i = previousLevel; i < level - 1; i++) {
158
+ if (headerNumbers[i] === 0) {
159
+ headerNumbers[i] = 1;
160
+ }
161
+ }
162
+ headerNumbers[level - 1]++;
163
+ // Reset all deeper level numbers (unless noReset is enabled)
164
+ if (!options.noReset) {
165
+ for (let i = level; i < headerNumbers.length; i++) {
166
+ headerNumbers[i] = 0;
167
+ }
168
+ }
169
+ }
170
+ // Format the header
171
+ const formattedHeader = formatHeader(level, m.text, [...headerNumbers], options, previousLevel);
172
+ // Calculate adjusted position based on previous replacements
173
+ const startPos = m.index + offset;
174
+ const endPos = startPos + m.match.length;
175
+ // Replace the header in the result string
176
+ result = result.substring(0, startPos) + formattedHeader + result.substring(endPos);
177
+ // Update offset for subsequent replacements
178
+ offset += formattedHeader.length - m.match.length;
179
+ previousLevel = level;
180
+ }
181
+ return result;
182
+ }
183
+ /**
184
+ * Extracts header formatting options from metadata
185
+ *
186
+ * Parses document metadata to extract header formatting configuration,
187
+ * including level-specific formatting templates, indentation settings,
188
+ * and numbering behavior options. Provides default values for all options.
189
+ *
190
+ * @private
191
+ * @param {Record<string, any>} metadata - Document metadata containing header configuration
192
+ * @param {Object} [processingOptions={}] - Additional processing options that override metadata
193
+ * @param {boolean} [processingOptions.noReset] - Disable header numbering reset
194
+ * @param {boolean} [processingOptions.noIndent] - Disable header indentation
195
+ * @returns {HeaderOptions} Complete header options object with defaults applied
196
+ * @example
197
+ * ```typescript
198
+ * const metadata = {
199
+ * 'level-one': 'Chapter %n.',
200
+ * 'level-two': 'Section %n.%s',
201
+ * 'level-indent': 2.0,
202
+ * 'no-reset': true
203
+ * };
204
+ *
205
+ * const options = extractHeaderOptions(metadata);
206
+ * console.log(options);
207
+ * // Output:
208
+ * // {
209
+ * // levelOne: 'Chapter %n.',
210
+ * // levelTwo: 'Section %n.%s',
211
+ * // levelThree: '(%n)',
212
+ * // levelFour: '(%n%c)',
213
+ * // levelFive: '(%n%c%r)',
214
+ * // levelIndent: 2.0,
215
+ * // noReset: true,
216
+ * // noIndent: false
217
+ * // }
218
+ * ```
219
+ */
220
+ function extractHeaderOptions(metadata, processingOptions = {}) {
221
+ return {
222
+ levelOne: metadata['level-one'] || 'Article %n.',
223
+ levelTwo: metadata['level-two'] || 'Section %n.',
224
+ levelThree: metadata['level-three'] || '(%n)',
225
+ levelFour: metadata['level-four'] || '(%n%c)',
226
+ levelFive: metadata['level-five'] || '(%n%c%r)',
227
+ levelIndent: parseFloat(metadata['level-indent'] || '1.5'),
228
+ noReset: processingOptions.noReset || metadata['no-reset'] || false,
229
+ noIndent: processingOptions.noIndent || metadata['no-indent'] || false,
230
+ enableFieldTracking: processingOptions.enableFieldTracking || false,
231
+ };
232
+ }
233
+ /**
234
+ * Formats a header according to level and options
235
+ *
236
+ * Applies formatting templates and numbering schemes to create properly formatted
237
+ * headers. Handles placeholder substitution for various numbering systems including
238
+ * numeric, alphabetic, and Roman numeral formats. Supports both simple and complex
239
+ * hierarchical numbering patterns.
240
+ *
241
+ * @private
242
+ * @param {number} level - Header level (1-5)
243
+ * @param {string} text - Header text content
244
+ * @param {number[]} headerNumbers - Array tracking header numbering state for all levels
245
+ * @param {HeaderOptions} options - Header formatting options and templates
246
+ * @param {number} [previousLevel=0] - Previous header level for context-aware formatting
247
+ * @returns {string} Formatted header string with proper numbering and indentation
248
+ * @example
249
+ * ```typescript
250
+ * const headerNumbers = [1, 2, 3, 0, 0];
251
+ * const options = {
252
+ * levelOne: 'Article %n.',
253
+ * levelTwo: 'Section %n.',
254
+ * levelThree: '(%c)',
255
+ * levelIndent: 1.5,
256
+ * noIndent: false
257
+ * };
258
+ *
259
+ * const formatted = formatHeader(3, 'Payment Terms', headerNumbers, options);
260
+ * // Output: ' (c) Payment Terms'
261
+ * ```
262
+ */
263
+ function formatHeader(level, text, headerNumbers, options, previousLevel = 0) {
264
+ // Validate level
265
+ if (level < 1 || level > 5) {
266
+ return `l${level}. ${text}`;
267
+ }
268
+ // Get format template for this level
269
+ const formatTemplate = getFormatTemplate(level, options);
270
+ // Ensure formatTemplate is a string
271
+ if (typeof formatTemplate !== 'string') {
272
+ return `l${level}. ${text}`;
273
+ }
274
+ // Create formatted header with the right value based on level
275
+ let formattedHeader = formatTemplate;
276
+ // Detect hierarchical patterns BEFORE any variable replacement
277
+ const isHierarchicalRoman = formatTemplate.includes('%r.%n');
278
+ const isHierarchicalAlpha = formatTemplate.includes('%c.%n');
279
+ // Detect broader hierarchical alphabetic context
280
+ // If level 1 uses %c and level 2 uses %c.%n, then level 3+ %c should also refer to level 1
281
+ const isAlphabeticHierarchicalContext = options.levelOne?.includes('%c') && options.levelTwo?.includes('%c.%n');
282
+ // Handle special %02n format (leading zero numbers)
283
+ const leadingZeroPattern = /%0(\d+)n/g;
284
+ formattedHeader = formattedHeader.replace(leadingZeroPattern, (match, digits) => {
285
+ const num = headerNumbers[level - 1];
286
+ return num.toString().padStart(parseInt(digits), '0');
287
+ });
288
+ // Handle special %02s format (leading zero section references)
289
+ const leadingZeroSectionPattern = /%0(\d+)s/g;
290
+ formattedHeader = formattedHeader.replace(leadingZeroSectionPattern, (match, digits) => {
291
+ const num = headerNumbers[0];
292
+ return num.toString().padStart(parseInt(digits), '0');
293
+ });
294
+ // Handle other leading zero patterns for reference variables
295
+ const leadingZeroTitlePattern = /%0(\d+)t/g;
296
+ formattedHeader = formattedHeader.replace(leadingZeroTitlePattern, (match, digits) => {
297
+ const num = headerNumbers[1];
298
+ return num.toString().padStart(parseInt(digits), '0');
299
+ });
300
+ const leadingZeroFourthPattern = /%0(\d+)f/g;
301
+ formattedHeader = formattedHeader.replace(leadingZeroFourthPattern, (match, digits) => {
302
+ const num = headerNumbers[2];
303
+ return num.toString().padStart(parseInt(digits), '0');
304
+ });
305
+ const leadingZeroFifthPattern = /%0(\d+)i/g;
306
+ formattedHeader = formattedHeader.replace(leadingZeroFifthPattern, (match, digits) => {
307
+ const num = headerNumbers[3];
308
+ return num.toString().padStart(parseInt(digits), '0');
309
+ });
310
+ // Replace placeholders based on level-specific logic
311
+ if (level === 4) {
312
+ // Level 4 format: (%n%c) where %n is level 3 number, %c is level 4 letter
313
+ // Only apply special level 4 logic for default hierarchical formats like (%n%c)
314
+ if (formattedHeader.includes('%n%c') &&
315
+ !formattedHeader.includes('.%s') &&
316
+ !formattedHeader.includes('.%t') &&
317
+ !formattedHeader.includes('.%f')) {
318
+ formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[2].toString());
319
+ formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[3]));
320
+ }
321
+ }
322
+ else if (level === 5) {
323
+ // Level 5 format: (%n%c%r) where %n is level 3 number, %c is level 4 letter, %r is level 5 roman
324
+ // Only apply special level 5 logic for default hierarchical formats like (%n%c%r)
325
+ if (formattedHeader.includes('%c%r') || formattedHeader.includes('%n%c%r')) {
326
+ formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[2].toString());
327
+ formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[3]));
328
+ // Always use lowercase roman numerals for level 5
329
+ const useLowercase = true;
330
+ formattedHeader = formattedHeader.replace(/%r/g, getRomanNumeral(headerNumbers[4], useLowercase));
331
+ }
332
+ }
333
+ // Handle academic/hierarchical formats first (where %n might refer to level 1 instead of current level)
334
+ // Check if format uses academic hierarchical pattern like %n.%s, %n.%s.%t, etc.
335
+ // But NOT formats like %r.%n or %c.%n where %n should be current level
336
+ // Academic context: if any level uses deeper hierarchical patterns, then %n.%s is also academic
337
+ const hasAcademicContext = (typeof options.levelThree === 'string' && options.levelThree.includes('%n.%s.%t')) ||
338
+ (typeof options.levelFour === 'string' && options.levelFour.includes('%n.%s.%t.%f')) ||
339
+ (typeof options.levelFive === 'string' && options.levelFive.includes('%n.%s.%t.%f.%i'));
340
+ const isAcademicHierarchical = (formattedHeader.includes('.%s.%t') ||
341
+ formattedHeader.includes('.%t.%f') ||
342
+ formattedHeader.includes('.%f.%i') ||
343
+ (formattedHeader.includes('.%s') && hasAcademicContext)) &&
344
+ !formattedHeader.includes('%r.') &&
345
+ !formattedHeader.includes('%c.');
346
+ if (isAcademicHierarchical) {
347
+ // In academic hierarchical formats, %n typically refers to level 1 number
348
+ formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[0].toString());
349
+ }
350
+ else {
351
+ // In standard formats, %n refers to current level number
352
+ formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[level - 1].toString());
353
+ }
354
+ // Replace reference variables for all levels
355
+ // Reference variables represent hierarchical level numbers for academic/structured numbering
356
+ // For academic formats: %s = level 2 current number (for formats like %n.%s.%t where %n=level1, %s=level2)
357
+ // For simple formats: %s = level 1 reference (for formats like %n.%s where %n=level2, %s=level1)
358
+ if (isAcademicHierarchical) {
359
+ // In academic hierarchical formats, %s refers to level 2
360
+ formattedHeader = formattedHeader.replace(/%s/g, headerNumbers[1].toString());
361
+ }
362
+ else {
363
+ // In simple formats like %n.%s, %s refers to level 1
364
+ formattedHeader = formattedHeader.replace(/%s/g, headerNumbers[0].toString());
365
+ }
366
+ // %t = level 3 current number (for formats like %n.%s.%t)
367
+ formattedHeader = formattedHeader.replace(/%t/g, headerNumbers[2].toString());
368
+ // %f = level 4 current number (for formats like %n.%s.%t.%f)
369
+ formattedHeader = formattedHeader.replace(/%f/g, headerNumbers[3].toString());
370
+ // %i = level 5 current number (for formats like %n.%s.%t.%f.%i)
371
+ formattedHeader = formattedHeader.replace(/%i/g, headerNumbers[4].toString());
372
+ // Replace %c (alphabetic) for levels 1-5 (when not handled by special logic above)
373
+ // Special handling for hierarchical formats like %c.%n where %c refers to level 1
374
+ if (isHierarchicalAlpha && level > 1) {
375
+ // In hierarchical formats with %c.%n pattern, %c before dot refers to level 1
376
+ formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[0]));
377
+ }
378
+ else if (isAlphabeticHierarchicalContext && level > 1) {
379
+ // In broader alphabetic hierarchical context, %c in levels 3+ refers to level 1
380
+ formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[0]));
381
+ }
382
+ else if (level <= 3 || (level >= 4 && formattedHeader.includes('%c'))) {
383
+ formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[level - 1]));
384
+ }
385
+ // Replace %r (roman) for levels 1-5 (when not handled by special logic above)
386
+ // Special handling for hierarchical formats like %r.%n where %r refers to level 1
387
+ if (isHierarchicalRoman && level > 1) {
388
+ // In hierarchical formats with %r.%n pattern, %r before dot refers to level 1
389
+ formattedHeader = formattedHeader.replace(/%r/g, getRomanNumeral(headerNumbers[0], true));
390
+ }
391
+ else if (level <= 3 || (level >= 4 && formattedHeader.includes('%r'))) {
392
+ formattedHeader = formattedHeader.replace(/%r/g, getRomanNumeral(headerNumbers[level - 1], true));
393
+ }
394
+ // Apply indentation (unless noIndent is enabled)
395
+ const indentation = options.noIndent
396
+ ? ''
397
+ : ' '.repeat(Math.floor((level - 1) * (options.levelIndent || 1.5) * 2));
398
+ // Check if field tracking is enabled for header styling
399
+ if (options.enableFieldTracking) {
400
+ // Wrap header in span with CSS classes and data attributes for styling
401
+ const headerClasses = [
402
+ 'legal-header',
403
+ `legal-header-level-${level}`,
404
+ getLevelCssClass(level),
405
+ ].join(' ');
406
+ const spanElement = `<span class="${headerClasses}" ` +
407
+ `data-level="${level}" data-number="${headerNumbers[level - 1]}">` +
408
+ `${formattedHeader} ${text}</span>`;
409
+ return `${indentation}${spanElement}`;
410
+ }
411
+ return `${indentation}${formattedHeader} ${text}`;
412
+ }
413
+ /**
414
+ * Gets the format template for a specific header level
415
+ *
416
+ * Retrieves the appropriate formatting template for a given header level,
417
+ * with fallback to default templates if custom options are not provided
418
+ * or are invalid.
419
+ *
420
+ * @private
421
+ * @param {number} level - Header level (1-5)
422
+ * @param {HeaderOptions} options - Header formatting options containing level templates
423
+ * @returns {string} Format template string with placeholders
424
+ * @example
425
+ * ```typescript
426
+ * const options = {
427
+ * levelOne: 'Chapter %n.',
428
+ * levelTwo: 'Section %n.%s',
429
+ * levelThree: '(%n)'
430
+ * };
431
+ *
432
+ * const template = getFormatTemplate(2, options);
433
+ * // Output: 'Section %n.%s'
434
+ *
435
+ * const fallbackTemplate = getFormatTemplate(4, {});
436
+ * // Output: '(%n%c)' (default for level 4)
437
+ * ```
438
+ */
439
+ function getFormatTemplate(level, options) {
440
+ let template;
441
+ switch (level) {
442
+ case 1:
443
+ template = options.levelOne;
444
+ break;
445
+ case 2:
446
+ template = options.levelTwo;
447
+ break;
448
+ case 3:
449
+ template = options.levelThree;
450
+ break;
451
+ case 4:
452
+ template = options.levelFour;
453
+ break;
454
+ case 5:
455
+ template = options.levelFive;
456
+ break;
457
+ default:
458
+ template = '%n.';
459
+ }
460
+ // Ensure we always return a string, even if template is null/undefined
461
+ if (typeof template !== 'string') {
462
+ switch (level) {
463
+ case 1:
464
+ return 'Article %n.';
465
+ case 2:
466
+ return 'Section %n.';
467
+ case 3:
468
+ return '(%n)';
469
+ case 4:
470
+ return '(%n%c)';
471
+ case 5:
472
+ return '(%n%c%r)';
473
+ default:
474
+ return '%n.';
475
+ }
476
+ }
477
+ return template;
478
+ }
479
+ /**
480
+ * Converts a number to alphabetic label (a, b, c, ... z, aa, ab, ...)
481
+ *
482
+ * Generates alphabetic labels for header numbering using a base-26 system.
483
+ * Supports extended sequences beyond 'z' using double letters (aa, ab, etc.).
484
+ *
485
+ * @private
486
+ * @param {number} num - Number to convert (1-based)
487
+ * @returns {string} Alphabetic label in lowercase
488
+ * @example
489
+ * ```typescript
490
+ * console.log(getAlphaLabel(1)); // 'a'
491
+ * console.log(getAlphaLabel(26)); // 'z'
492
+ * console.log(getAlphaLabel(27)); // 'aa'
493
+ * console.log(getAlphaLabel(28)); // 'ab'
494
+ * console.log(getAlphaLabel(52)); // 'az'
495
+ * console.log(getAlphaLabel(53)); // 'ba'
496
+ * ```
497
+ */
498
+ function getAlphaLabel(num) {
499
+ if (num <= 0)
500
+ return '';
501
+ let label = '';
502
+ let n = num;
503
+ while (n > 0) {
504
+ const remainder = (n - 1) % 26;
505
+ label = String.fromCharCode(97 + remainder) + label;
506
+ n = Math.floor((n - 1) / 26);
507
+ }
508
+ return label;
509
+ }
510
+ /**
511
+ * Converts a number to Roman numeral
512
+ *
513
+ * Generates Roman numerals for header numbering using standard Roman numeral
514
+ * conversion rules. Supports both uppercase and lowercase output formats.
515
+ *
516
+ * @private
517
+ * @param {number} num - Number to convert (positive integer)
518
+ * @param {boolean} [lowercase=false] - Whether to return lowercase roman numerals
519
+ * @returns {string} Roman numeral string
520
+ * @example
521
+ * ```typescript
522
+ * console.log(getRomanNumeral(1)); // 'I'
523
+ * console.log(getRomanNumeral(4)); // 'IV'
524
+ * console.log(getRomanNumeral(9)); // 'IX'
525
+ * console.log(getRomanNumeral(10)); // 'X'
526
+ * console.log(getRomanNumeral(49)); // 'XLIX'
527
+ * console.log(getRomanNumeral(1994)); // 'MCMXCIV'
528
+ * console.log(getRomanNumeral(5, true)); // 'v'
529
+ * ```
530
+ */
531
+ function getRomanNumeral(num, lowercase = false) {
532
+ if (num <= 0)
533
+ return '';
534
+ const romanNumerals = [
535
+ { value: 1000, numeral: 'M' },
536
+ { value: 900, numeral: 'CM' },
537
+ { value: 500, numeral: 'D' },
538
+ { value: 400, numeral: 'CD' },
539
+ { value: 100, numeral: 'C' },
540
+ { value: 90, numeral: 'XC' },
541
+ { value: 50, numeral: 'L' },
542
+ { value: 40, numeral: 'XL' },
543
+ { value: 10, numeral: 'X' },
544
+ { value: 9, numeral: 'IX' },
545
+ { value: 5, numeral: 'V' },
546
+ { value: 4, numeral: 'IV' },
547
+ { value: 1, numeral: 'I' },
548
+ ];
549
+ let roman = '';
550
+ let n = num;
551
+ for (const { value, numeral } of romanNumerals) {
552
+ while (n >= value) {
553
+ roman += numeral;
554
+ n -= value;
555
+ }
556
+ }
557
+ return lowercase ? roman.toLowerCase() : roman;
558
+ }
559
+ /**
560
+ * Gets CSS class name for a specific header level
561
+ *
562
+ * Maps header levels to semantic CSS class names for styling purposes.
563
+ * Used when field tracking is enabled to provide consistent styling hooks.
564
+ *
565
+ * @private
566
+ * @param {number} level - Header level (1-5)
567
+ * @returns {string} CSS class name for the level
568
+ */
569
+ function getLevelCssClass(level) {
570
+ switch (level) {
571
+ case 1:
572
+ return 'legal-article';
573
+ case 2:
574
+ return 'legal-section';
575
+ case 3:
576
+ return 'legal-subsection';
577
+ case 4:
578
+ return 'legal-sub-subsection';
579
+ case 5:
580
+ return 'legal-paragraph';
581
+ default:
582
+ return 'legal-header-unknown';
583
+ }
584
+ }
585
+ //# sourceMappingURL=header-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-processor.js","sourceRoot":"","sources":["../../../src/core/processors/header-processor.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;;AAoDH,wCA8GC;AA9JD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,SAAgB,cAAc,CAC5B,OAAe,EACf,QAA6B,EAC7B,oBAII,EAAE;IAEN,uCAAuC;IACvC,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAElE,+CAA+C;IAC/C,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;IACtD,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;IAExD,+BAA+B;IAC/B,MAAM,aAAa,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhD,qEAAqE;IACrE,MAAM,OAAO,GAKR,EAAE,CAAC;IAER,yCAAyC;IACzC,IAAI,KAAK,CAAC;IACV,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IACpC,wBAAwB,CAAC,SAAS,GAAG,CAAC,CAAC;IAEvC,OAAO,CAAC,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC;YACX,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACf,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;YACtB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IACzC,wBAAwB,CAAC,SAAS,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC;YACX,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACf,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,iDAAiD;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE1C,4CAA4C;IAC5C,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,uCAAuC;QACvC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAEtB,4BAA4B;QAC5B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;gBACxB,+CAA+C;gBAC/C,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,mDAAmD;gBACnD,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kCAAkC;YAElC,mEAAmE;YACnE,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3B,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAED,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YAE3B,6DAA6D;YAC7D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAClD,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAEhG,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC;QAClC,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAEzC,0CAA0C;QAC1C,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEpF,4CAA4C;QAC5C,MAAM,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAElD,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,SAAS,oBAAoB,CAC3B,QAA6B,EAC7B,oBAA8F,EAAE;IAEhG,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,aAAa;QAChD,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,aAAa;QAChD,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM;QAC7C,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,QAAQ;QAC7C,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,UAAU;QAC/C,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;QAC1D,OAAO,EAAE,iBAAiB,CAAC,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK;QACnE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK;QACtE,mBAAmB,EAAE,iBAAiB,CAAC,mBAAmB,IAAI,KAAK;KACpE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,SAAS,YAAY,CACnB,KAAa,EACb,IAAY,EACZ,aAAuB,EACvB,OAAsB,EACtB,gBAAwB,CAAC;IAEzB,iBAAiB;IACjB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,qCAAqC;IACrC,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEzD,oCAAoC;IACpC,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,8DAA8D;IAC9D,IAAI,eAAe,GAAG,cAAc,CAAC;IAErC,+DAA+D;IAC/D,MAAM,mBAAmB,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7D,MAAM,mBAAmB,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE7D,iDAAiD;IACjD,2FAA2F;IAC3F,MAAM,+BAA+B,GACnC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE1E,oDAAoD;IACpD,MAAM,kBAAkB,GAAG,WAAW,CAAC;IACvC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC9E,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACrC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,MAAM,yBAAyB,GAAG,WAAW,CAAC;IAC9C,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACrF,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAC7D,MAAM,uBAAuB,GAAG,WAAW,CAAC;IAC5C,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACnF,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,wBAAwB,GAAG,WAAW,CAAC;IAC7C,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACpF,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,WAAW,CAAC;IAC5C,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACnF,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,qDAAqD;IACrD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,0EAA0E;QAC1E,gFAAgF;QAChF,IACE,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChC,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;YAChC,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;YAChC,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAChC,CAAC;YACD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9E,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QACvB,iGAAiG;QACjG,kFAAkF;QAClF,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3E,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9E,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAElF,kDAAkD;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC;YAC1B,eAAe,GAAG,eAAe,CAAC,OAAO,CACvC,KAAK,EACL,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wGAAwG;IACxG,gFAAgF;IAChF,uEAAuE;IACvE,gGAAgG;IAChG,MAAM,kBAAkB,GACtB,CAAC,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACnF,CAAC,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACpF,CAAC,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE1F,MAAM,sBAAsB,GAC1B,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClC,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,CAAC;QAC1D,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChC,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,sBAAsB,EAAE,CAAC;QAC3B,0EAA0E;QAC1E,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,yDAAyD;QACzD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,6CAA6C;IAC7C,6FAA6F;IAC7F,2GAA2G;IAC3G,iGAAiG;IACjG,IAAI,sBAAsB,EAAE,CAAC;QAC3B,yDAAyD;QACzD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,0DAA0D;IAC1D,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE9E,6DAA6D;IAC7D,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE9E,gEAAgE;IAChE,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE9E,mFAAmF;IACnF,kFAAkF;IAClF,IAAI,mBAAmB,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrC,8EAA8E;QAC9E,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;SAAM,IAAI,+BAA+B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACxD,gFAAgF;QAChF,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;SAAM,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACxE,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,8EAA8E;IAC9E,kFAAkF;IAClF,IAAI,mBAAmB,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrC,8EAA8E;QAC9E,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC;SAAM,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACxE,eAAe,GAAG,eAAe,CAAC,OAAO,CACvC,KAAK,EACL,eAAe,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAChD,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ;QAClC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE3E,wDAAwD;IACxD,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,uEAAuE;QACvE,MAAM,aAAa,GAAG;YACpB,cAAc;YACd,sBAAsB,KAAK,EAAE;YAC7B,gBAAgB,CAAC,KAAK,CAAC;SACxB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEZ,MAAM,WAAW,GACf,gBAAgB,aAAa,IAAI;YACjC,eAAe,KAAK,kBAAkB,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI;YAClE,GAAG,eAAe,IAAI,IAAI,SAAS,CAAC;QAEtC,OAAO,GAAG,WAAW,GAAG,WAAW,EAAE,CAAC;IACxC,CAAC;IAED,OAAO,GAAG,WAAW,GAAG,eAAe,IAAI,IAAI,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAS,iBAAiB,CAAC,KAAa,EAAE,OAAsB;IAC9D,IAAI,QAA4B,CAAC;IAEjC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,CAAC;YACJ,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC5B,MAAM;QACR,KAAK,CAAC;YACJ,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC5B,MAAM;QACR,KAAK,CAAC;YACJ,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;YAC9B,MAAM;QACR,KAAK,CAAC;YACJ,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;YAC7B,MAAM;QACR,KAAK,CAAC;YACJ,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;YAC7B,MAAM;QACR;YACE,QAAQ,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,uEAAuE;IACvE,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,CAAC;gBACJ,OAAO,aAAa,CAAC;YACvB,KAAK,CAAC;gBACJ,OAAO,aAAa,CAAC;YACvB,KAAK,CAAC;gBACJ,OAAO,MAAM,CAAC;YAChB,KAAK,CAAC;gBACJ,OAAO,QAAQ,CAAC;YAClB,KAAK,CAAC;gBACJ,OAAO,UAAU,CAAC;YACpB;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,GAAG,GAAG,CAAC;IAEZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/B,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC;QACpD,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAS,eAAe,CAAC,GAAW,EAAE,YAAqB,KAAK;IAC9D,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,aAAa,GAAG;QACpB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;QAC7B,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7B,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;QAC5B,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7B,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;QAC5B,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5B,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QAC3B,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5B,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;QAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;QAC1B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;QAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;KAC3B,CAAC;IAEF,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,GAAG,GAAG,CAAC;IAEZ,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;YAClB,KAAK,IAAI,OAAO,CAAC;YACjB,CAAC,IAAI,KAAK,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,eAAe,CAAC;QACzB,KAAK,CAAC;YACJ,OAAO,eAAe,CAAC;QACzB,KAAK,CAAC;YACJ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,CAAC;YACJ,OAAO,sBAAsB,CAAC;QAChC,KAAK,CAAC;YACJ,OAAO,iBAAiB,CAAC;QAC3B;YACE,OAAO,sBAAsB,CAAC;IAClC,CAAC;AACH,CAAC"}