xypriss 2.2.5 → 2.3.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 (83) hide show
  1. package/README.md +1 -3
  2. package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +9 -5
  3. package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
  4. package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +9 -5
  5. package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
  6. package/dist/cjs/mods/security/src/components/cache/index.js +9 -5
  7. package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
  8. package/dist/cjs/mods/security/src/components/fortified-function/index.js +8 -4
  9. package/dist/cjs/mods/security/src/components/fortified-function/index.js.map +1 -1
  10. package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +9 -5
  11. package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
  12. package/dist/cjs/mods/security/src/index.js +9 -5
  13. package/dist/cjs/mods/security/src/index.js.map +1 -1
  14. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +31 -2
  15. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  16. package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js +87 -30
  17. package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js.map +1 -1
  18. package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js +320 -0
  19. package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js.map +1 -0
  20. package/dist/cjs/src/middleware/built-in/security/CommandInjectionDetector.js +215 -0
  21. package/dist/cjs/src/middleware/built-in/security/CommandInjectionDetector.js.map +1 -0
  22. package/dist/cjs/src/middleware/built-in/security/LDAPInjectionDetector.js +96 -0
  23. package/dist/cjs/src/middleware/built-in/security/LDAPInjectionDetector.js.map +1 -0
  24. package/dist/cjs/src/middleware/built-in/security/PathTraversalDetector.js +212 -0
  25. package/dist/cjs/src/middleware/built-in/security/PathTraversalDetector.js.map +1 -0
  26. package/dist/cjs/src/middleware/built-in/security/SQLInjectionDetector.js +335 -0
  27. package/dist/cjs/src/middleware/built-in/security/SQLInjectionDetector.js.map +1 -0
  28. package/dist/cjs/src/middleware/built-in/security/XXEProtector.js +175 -0
  29. package/dist/cjs/src/middleware/built-in/security/XXEProtector.js.map +1 -0
  30. package/dist/cjs/src/middleware/security-middleware.js +249 -132
  31. package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
  32. package/dist/cjs/src/plugins/modules/index.js +8 -4
  33. package/dist/cjs/src/plugins/modules/index.js.map +1 -1
  34. package/dist/cjs/src/server/FastServer.js +49 -32
  35. package/dist/cjs/src/server/FastServer.js.map +1 -1
  36. package/dist/cjs/src/server/ServerFactory.js +34 -1
  37. package/dist/cjs/src/server/ServerFactory.js.map +1 -1
  38. package/dist/cjs/src/server/components/multi-server/MultiServerManager.js +11 -2
  39. package/dist/cjs/src/server/components/multi-server/MultiServerManager.js.map +1 -1
  40. package/dist/cjs/src/server/const/default.js +15 -1
  41. package/dist/cjs/src/server/const/default.js.map +1 -1
  42. package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +9 -5
  43. package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
  44. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +9 -5
  45. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
  46. package/dist/esm/mods/security/src/components/cache/index.js +9 -5
  47. package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
  48. package/dist/esm/mods/security/src/components/fortified-function/index.js +8 -4
  49. package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -1
  50. package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +9 -5
  51. package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
  52. package/dist/esm/mods/security/src/index.js +9 -5
  53. package/dist/esm/mods/security/src/index.js.map +1 -1
  54. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +31 -2
  55. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  56. package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js +75 -18
  57. package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js.map +1 -1
  58. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js +318 -0
  59. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js.map +1 -0
  60. package/dist/esm/src/middleware/built-in/security/CommandInjectionDetector.js +213 -0
  61. package/dist/esm/src/middleware/built-in/security/CommandInjectionDetector.js.map +1 -0
  62. package/dist/esm/src/middleware/built-in/security/LDAPInjectionDetector.js +94 -0
  63. package/dist/esm/src/middleware/built-in/security/LDAPInjectionDetector.js.map +1 -0
  64. package/dist/esm/src/middleware/built-in/security/PathTraversalDetector.js +210 -0
  65. package/dist/esm/src/middleware/built-in/security/PathTraversalDetector.js.map +1 -0
  66. package/dist/esm/src/middleware/built-in/security/SQLInjectionDetector.js +333 -0
  67. package/dist/esm/src/middleware/built-in/security/SQLInjectionDetector.js.map +1 -0
  68. package/dist/esm/src/middleware/built-in/security/XXEProtector.js +173 -0
  69. package/dist/esm/src/middleware/built-in/security/XXEProtector.js.map +1 -0
  70. package/dist/esm/src/middleware/security-middleware.js +248 -131
  71. package/dist/esm/src/middleware/security-middleware.js.map +1 -1
  72. package/dist/esm/src/plugins/modules/index.js +8 -4
  73. package/dist/esm/src/plugins/modules/index.js.map +1 -1
  74. package/dist/esm/src/server/FastServer.js +50 -33
  75. package/dist/esm/src/server/FastServer.js.map +1 -1
  76. package/dist/esm/src/server/ServerFactory.js +34 -1
  77. package/dist/esm/src/server/ServerFactory.js.map +1 -1
  78. package/dist/esm/src/server/components/multi-server/MultiServerManager.js +11 -2
  79. package/dist/esm/src/server/components/multi-server/MultiServerManager.js.map +1 -1
  80. package/dist/esm/src/server/const/default.js +15 -1
  81. package/dist/esm/src/server/const/default.js.map +1 -1
  82. package/dist/index.d.ts +895 -39
  83. package/package.json +2 -2
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Path Traversal Detection Module
3
+ *
4
+ * Detects and prevents directory traversal attacks with intelligent
5
+ * false positive avoidance for legitimate file paths
6
+ */
7
+ class PathTraversalDetector {
8
+ constructor(config = {}) {
9
+ // High-risk path traversal patterns
10
+ this.highRiskPatterns = [
11
+ // Classic traversal with multiple levels
12
+ /(\.\.[\/\\]){2,}/g,
13
+ // URL encoded traversal
14
+ /(%2e%2e[\/\\]|%2e%2e%2f|%2e%2e%5c)/gi,
15
+ // Double URL encoded
16
+ /(%252e%252e[\/\\]|%252e%252e%252f)/gi,
17
+ // Unicode/UTF-8 encoded
18
+ /(\.\.%c0%af|\.\.%c1%9c)/gi,
19
+ // Null byte injection
20
+ /\.\.[\/\\].*%00/g,
21
+ // Absolute paths (Unix/Windows)
22
+ /^(\/|\\\\|[a-zA-Z]:\\)/,
23
+ // System directories
24
+ /(\/etc\/|\/proc\/|\/sys\/|\/dev\/|C:\\Windows\\|C:\\Program Files\\)/gi,
25
+ // Traversal with encoded slashes
26
+ /\.\.(%2f|%5c)/gi,
27
+ ];
28
+ // Medium-risk patterns (context-dependent)
29
+ this.mediumRiskPatterns = [
30
+ // Single parent directory reference
31
+ /\.\.[\/\\]/g,
32
+ // Hidden files (Unix)
33
+ /\/\.[^\/]+/g,
34
+ // Backup files
35
+ /\.(bak|backup|old|tmp|swp)$/gi,
36
+ // Config files
37
+ /\.(conf|config|ini|env)$/gi,
38
+ ];
39
+ this.config = {
40
+ enabled: config.enabled ?? true,
41
+ strictMode: config.strictMode ?? false,
42
+ logAttempts: config.logAttempts ?? true,
43
+ blockOnDetection: config.blockOnDetection ?? true,
44
+ falsePositiveThreshold: config.falsePositiveThreshold ?? 0.6,
45
+ customPatterns: config.customPatterns ?? [],
46
+ allowedPaths: config.allowedPaths ?? [],
47
+ allowedExtensions: config.allowedExtensions ?? ['.jpg', '.png', '.pdf', '.txt'],
48
+ maxDepth: config.maxDepth ?? 3,
49
+ };
50
+ }
51
+ /**
52
+ * Detect path traversal attempts
53
+ */
54
+ detect(path, context) {
55
+ if (!path || typeof path !== 'string') {
56
+ return {
57
+ isMalicious: false,
58
+ confidence: 0,
59
+ detectedPatterns: [],
60
+ riskLevel: 'LOW',
61
+ };
62
+ }
63
+ const result = {
64
+ isMalicious: false,
65
+ confidence: 0,
66
+ detectedPatterns: [],
67
+ sanitizedInput: path,
68
+ riskLevel: 'LOW',
69
+ };
70
+ // Check if path is in allowed paths
71
+ if (this.isAllowedPath(path)) {
72
+ return result;
73
+ }
74
+ // High-risk pattern detection
75
+ let highRiskScore = 0;
76
+ this.highRiskPatterns.forEach((pattern, index) => {
77
+ const matches = path.match(pattern);
78
+ if (matches) {
79
+ const patternName = this.getHighRiskPatternName(index);
80
+ result.detectedPatterns.push(`${patternName}: ${matches.join(', ')}`);
81
+ highRiskScore += 0.8;
82
+ }
83
+ });
84
+ // Medium-risk pattern detection
85
+ let mediumRiskScore = 0;
86
+ this.mediumRiskPatterns.forEach((pattern) => {
87
+ const matches = path.match(pattern);
88
+ if (matches) {
89
+ mediumRiskScore += 0.2 * matches.length;
90
+ }
91
+ });
92
+ // Calculate depth
93
+ const depth = this.calculatePathDepth(path);
94
+ if (depth > this.config.maxDepth) {
95
+ result.detectedPatterns.push(`Excessive depth: ${depth}`);
96
+ mediumRiskScore += 0.3;
97
+ }
98
+ // Legitimacy checks
99
+ const legitimacyScore = this.calculateLegitimacyScore(path);
100
+ // Calculate final confidence
101
+ result.confidence = Math.max(0, highRiskScore + mediumRiskScore * 0.4 - legitimacyScore);
102
+ result.confidence = Math.min(result.confidence, 1.0);
103
+ // Determine risk level
104
+ if (result.confidence >= 0.8) {
105
+ result.riskLevel = 'CRITICAL';
106
+ result.isMalicious = true;
107
+ }
108
+ else if (result.confidence >= this.config.falsePositiveThreshold) {
109
+ result.riskLevel = 'HIGH';
110
+ result.isMalicious = true;
111
+ }
112
+ else if (result.confidence >= 0.3) {
113
+ result.riskLevel = 'MEDIUM';
114
+ result.isMalicious = false;
115
+ }
116
+ // Sanitize path
117
+ if (result.confidence >= 0.3) {
118
+ result.sanitizedInput = this.sanitizePath(path);
119
+ }
120
+ // Log attempts
121
+ if (this.config.logAttempts && result.confidence >= 0.7) {
122
+ this.logAttempt(path, result);
123
+ }
124
+ return result;
125
+ }
126
+ /**
127
+ * Sanitize path by removing traversal sequences
128
+ */
129
+ sanitizePath(path) {
130
+ let sanitized = path;
131
+ // Remove all traversal sequences
132
+ sanitized = sanitized.replace(/\.\.[\/\\]/g, '');
133
+ // Remove URL encoded traversal
134
+ sanitized = sanitized.replace(/%2e%2e[\/\\%]/gi, '');
135
+ // Remove null bytes
136
+ sanitized = sanitized.replace(/%00/g, '');
137
+ // Normalize slashes
138
+ sanitized = sanitized.replace(/[\\]/g, '/');
139
+ // Remove duplicate slashes
140
+ sanitized = sanitized.replace(/\/+/g, '/');
141
+ // Remove leading slash if present
142
+ sanitized = sanitized.replace(/^\//, '');
143
+ return sanitized;
144
+ }
145
+ /**
146
+ * Check if path is in allowed paths
147
+ */
148
+ isAllowedPath(path) {
149
+ return this.config.allowedPaths.some(allowed => path.startsWith(allowed));
150
+ }
151
+ /**
152
+ * Calculate path depth
153
+ */
154
+ calculatePathDepth(path) {
155
+ const normalized = path.replace(/[\\]/g, '/');
156
+ const parts = normalized.split('/').filter(p => p && p !== '.');
157
+ return parts.length;
158
+ }
159
+ /**
160
+ * Calculate legitimacy score
161
+ */
162
+ calculateLegitimacyScore(path) {
163
+ let score = 0;
164
+ // Check for allowed extensions
165
+ const hasAllowedExt = this.config.allowedExtensions.some(ext => path.toLowerCase().endsWith(ext));
166
+ if (hasAllowedExt) {
167
+ score += 0.3;
168
+ }
169
+ // Simple filename pattern (no traversal)
170
+ if (/^[a-zA-Z0-9_\-\.]+$/.test(path)) {
171
+ score += 0.3;
172
+ }
173
+ // Reasonable path depth
174
+ const depth = this.calculatePathDepth(path);
175
+ if (depth <= 2) {
176
+ score += 0.2;
177
+ }
178
+ return Math.min(score, 0.5);
179
+ }
180
+ getHighRiskPatternName(index) {
181
+ const names = [
182
+ 'Multiple traversal sequences',
183
+ 'URL encoded traversal',
184
+ 'Double URL encoded traversal',
185
+ 'Unicode encoded traversal',
186
+ 'Null byte injection',
187
+ 'Absolute path',
188
+ 'System directory access',
189
+ 'Encoded slash traversal',
190
+ ];
191
+ return names[index] || `High-risk pattern ${index}`;
192
+ }
193
+ logAttempt(path, result) {
194
+ console.warn('[PathTraversal] Attack detected:', {
195
+ timestamp: new Date().toISOString(),
196
+ path: path.substring(0, 100),
197
+ confidence: result.confidence,
198
+ patterns: result.detectedPatterns,
199
+ });
200
+ }
201
+ updateConfig(newConfig) {
202
+ this.config = { ...this.config, ...newConfig };
203
+ }
204
+ getConfig() {
205
+ return { ...this.config };
206
+ }
207
+ }
208
+
209
+ export { PathTraversalDetector as default };
210
+ //# sourceMappingURL=PathTraversalDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathTraversalDetector.js","sources":["../../../../../../src/middleware/built-in/security/PathTraversalDetector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,333 @@
1
+ class SQLInjectionDetector {
2
+ constructor(config = {}) {
3
+ // High-confidence SQL injection patterns (more specific to reduce false positives)
4
+ this.highRiskPatterns = [
5
+ // Union attacks with SELECT
6
+ /(\s|^)(union|UNION)(\s)+(all\s+)?(select|SELECT)/gi,
7
+ // SQL comments at end of input or before SQL keywords
8
+ /(--|#|\/\*).*?(select|union|drop|delete|insert|update|create|alter)/gi,
9
+ /;(\s)*--.*/gi,
10
+ // Enhanced boolean injections (more comprehensive)
11
+ /(\s|^)(or|OR)(\s)+('?\d+'?\s*=\s*'?\d+'?|'[^']*'\s*=\s*'[^']*'|true|false)/gi,
12
+ /(\s|^)(and|AND)(\s)+('?\d+'?\s*=\s*'?\d+'?|'[^']*'\s*=\s*'[^']*'|true|false)/gi,
13
+ // Quote-based boolean injections
14
+ /'(\s)+(or|OR|and|AND)(\s)+'/gi,
15
+ // Comment-obfuscated patterns
16
+ /\/\*.*?\*\/(or|OR|and|AND)\/\*.*?\*\//gi,
17
+ // Time-based with specific syntax (enhanced)
18
+ /(sleep|SLEEP|waitfor|WAITFOR|delay|DELAY)\s*\(.*?\)/gi,
19
+ /(waitfor|WAITFOR)\s+(delay|DELAY)\s+'/gi,
20
+ // System stored procedures
21
+ /(exec|EXEC|execute|EXECUTE)\s+(sp_|xp_)\w+/gi,
22
+ // Information schema with specific queries
23
+ /(information_schema|INFORMATION_SCHEMA)\.(tables|columns|schemata)/gi,
24
+ // Dangerous DDL operations with semicolons
25
+ /;(\s)*(drop|DROP|delete|DELETE|truncate|TRUNCATE)\s+(table|database)/gi,
26
+ // Hex encoding of common injection strings
27
+ /0x(27|22|5C|2D|2D)/gi, // ', ", \, --
28
+ // Multiple quotes for quote breaking
29
+ /('{3,}|"{3,})/g,
30
+ // Stacked queries with dangerous operations
31
+ /;(\s)*(drop|delete|insert|update|create|alter)(\s)+/gi,
32
+ ];
33
+ // Medium risk patterns (require context analysis)
34
+ this.mediumRiskPatterns = [
35
+ // Single SQL keywords (common in legitimate text)
36
+ /\b(select|union|drop|delete|insert|update|create|alter)\b/gi,
37
+ // Simple OR/AND conditions
38
+ /\b(or|and)\s+\w+\s*=\s*\w+/gi,
39
+ // Single quotes or double quotes
40
+ /'/g,
41
+ /"/g,
42
+ // Basic SQL comments
43
+ /(--|#)/g,
44
+ // Wildcards
45
+ /[%_]/g,
46
+ ];
47
+ // Characters that are suspicious in certain contexts
48
+ this.contextSensitiveChars = /[';\"\\%_]/g;
49
+ this.config = {
50
+ strictMode: config.strictMode ?? false,
51
+ allowedChars: config.allowedChars ?? /^[a-zA-Z0-9\s\-@.!?,()]+$/,
52
+ maxLength: config.maxLength ?? 1000,
53
+ logAttempts: config.logAttempts ?? true,
54
+ contextualAnalysis: config.contextualAnalysis ?? true,
55
+ falsePositiveThreshold: config.falsePositiveThreshold ?? 0.6,
56
+ };
57
+ }
58
+ /**
59
+ * Main detection method with improved false positive handling
60
+ */
61
+ detect(input, context) {
62
+ if (!input || typeof input !== "string") {
63
+ return {
64
+ isMalicious: false,
65
+ confidence: 0,
66
+ detectedPatterns: [],
67
+ riskLevel: "LOW",
68
+ };
69
+ }
70
+ const result = {
71
+ isMalicious: false,
72
+ confidence: 0,
73
+ detectedPatterns: [],
74
+ sanitizedInput: input,
75
+ riskLevel: "LOW",
76
+ };
77
+ // Check input length (very long inputs are suspicious)
78
+ if (input.length > this.config.maxLength) {
79
+ result.confidence += 0.2; // Reduced penalty for length
80
+ result.detectedPatterns.push("Excessive length");
81
+ }
82
+ // High-risk pattern analysis (strong indicators)
83
+ let highRiskScore = 0;
84
+ this.highRiskPatterns.forEach((pattern, index) => {
85
+ const matches = input.match(pattern);
86
+ if (matches) {
87
+ const patternName = this.getHighRiskPatternName(index);
88
+ result.detectedPatterns.push(`${patternName}: ${matches.join(", ")}`);
89
+ highRiskScore += this.getHighRiskPatternWeight(index);
90
+ }
91
+ });
92
+ // Medium-risk pattern analysis (context-dependent)
93
+ let mediumRiskScore = 0;
94
+ if (this.config.contextualAnalysis) {
95
+ mediumRiskScore = this.analyzeContext(input, context || "");
96
+ }
97
+ else {
98
+ // Basic medium risk analysis without context
99
+ this.mediumRiskPatterns.forEach((pattern, index) => {
100
+ const matches = input.match(pattern);
101
+ if (matches) {
102
+ mediumRiskScore += 0.1 * matches.length; // Lower weight for medium risk
103
+ }
104
+ });
105
+ }
106
+ // Contextual analysis for legitimate use cases
107
+ const legitimacyScore = this.calculateLegitimacyScore(input);
108
+ // Calculate confidence with false positive mitigation
109
+ const rawScore = highRiskScore + mediumRiskScore * 0.3;
110
+ result.confidence = Math.max(0, rawScore - legitimacyScore);
111
+ result.confidence = Math.min(result.confidence, 1.0);
112
+ // Determine risk level and malicious status
113
+ if (result.confidence >= 0.8) {
114
+ result.riskLevel = "CRITICAL";
115
+ result.isMalicious = true;
116
+ }
117
+ else if (result.confidence >= this.config.falsePositiveThreshold) {
118
+ result.riskLevel = "HIGH";
119
+ result.isMalicious = true;
120
+ }
121
+ else if (result.confidence >= 0.3) {
122
+ result.riskLevel = "MEDIUM";
123
+ result.isMalicious = false; // Don't block medium risk by default
124
+ }
125
+ else {
126
+ result.riskLevel = "LOW";
127
+ result.isMalicious = false;
128
+ }
129
+ // Log only high confidence attempts
130
+ if (this.config.logAttempts && result.confidence >= 0.7) {
131
+ this.logAttempt(input, result);
132
+ }
133
+ // Provide sanitized version only for high-risk inputs
134
+ if (result.confidence >= 0.4) {
135
+ result.sanitizedInput = this.smartSanitize(input);
136
+ }
137
+ return result;
138
+ }
139
+ /**
140
+ * Analyze context to reduce false positives
141
+ */
142
+ analyzeContext(input, context) {
143
+ let score = 0;
144
+ // Check for legitimate business contexts
145
+ const businessContexts = [
146
+ "search",
147
+ "filter",
148
+ "name",
149
+ "description",
150
+ "comment",
151
+ "review",
152
+ "address",
153
+ "title",
154
+ "content",
155
+ "message",
156
+ "email",
157
+ ];
158
+ const isBusinessContext = businessContexts.some((ctx) => context.toLowerCase().includes(ctx));
159
+ this.mediumRiskPatterns.forEach((pattern, index) => {
160
+ const matches = input.match(pattern);
161
+ if (matches) {
162
+ let patternScore = 0.1 * matches.length;
163
+ // Reduce score for legitimate contexts
164
+ if (isBusinessContext) {
165
+ patternScore *= 0.3; // Reduce by 70%
166
+ }
167
+ // Special handling for common false positives
168
+ if (index === 0 && isBusinessContext) {
169
+ // SQL keywords in business text
170
+ patternScore *= 0.1; // Very low weight for SQL keywords in business context
171
+ }
172
+ if (index === 2 || index === 3) {
173
+ // Single quotes in names, descriptions
174
+ if (context.includes("name") ||
175
+ context.includes("description")) {
176
+ patternScore *= 0.2;
177
+ }
178
+ }
179
+ score += patternScore;
180
+ }
181
+ });
182
+ return score;
183
+ }
184
+ /**
185
+ * Calculate legitimacy score to offset false positives
186
+ */
187
+ calculateLegitimacyScore(input) {
188
+ let legitimacyScore = 0;
189
+ // Natural language indicators
190
+ const naturalWords = input.match(/\b[a-zA-Z]{3,}\b/g);
191
+ if (naturalWords && naturalWords.length > 2) {
192
+ legitimacyScore += 0.2; // Looks like natural text
193
+ }
194
+ // Check for common legitimate patterns
195
+ const legitimatePatterns = [
196
+ /^[A-Z][a-z]+\s[A-Z][a-z]+$/, // First Last name
197
+ /^[\w\.-]+@[\w\.-]+\.\w+$/, // Email
198
+ /^\d{1,5}\s\w+(\s\w+)*$/, // Address format
199
+ /^[A-Za-z0-9\s\-.,!?()]+$/, // Normal text with punctuation
200
+ ];
201
+ legitimatePatterns.forEach((pattern) => {
202
+ if (pattern.test(input)) {
203
+ legitimacyScore += 0.15;
204
+ }
205
+ });
206
+ // Length-based legitimacy (very short or very specific lengths are more suspicious)
207
+ if (input.length > 10 && input.length < 200) {
208
+ legitimacyScore += 0.1;
209
+ }
210
+ // Check for balanced quotes (legitimate text often has balanced quotes)
211
+ const singleQuotes = (input.match(/'/g) || []).length;
212
+ const doubleQuotes = (input.match(/"/g) || []).length;
213
+ if (singleQuotes % 2 === 0 && doubleQuotes % 2 === 0) {
214
+ legitimacyScore += 0.1;
215
+ }
216
+ return Math.min(legitimacyScore, 0.5); // Cap legitimacy score
217
+ }
218
+ /**
219
+ * Smart sanitization that preserves legitimate content
220
+ */
221
+ smartSanitize(input) {
222
+ if (!input)
223
+ return input;
224
+ let sanitized = input;
225
+ // Only remove obvious SQL injection patterns, not all SQL keywords
226
+ sanitized = sanitized.replace(/(--|#).*$/gm, ""); // Remove comment tails
227
+ sanitized = sanitized.replace(/\/\*.*?\*\//g, ""); // Remove /* */ comments
228
+ // Only escape quotes if they appear to be part of injection attempts
229
+ const suspiciousQuotes = /'(\s*(or|and|union|select)\s|;|\s*--)/gi;
230
+ sanitized = sanitized.replace(suspiciousQuotes, "''$1");
231
+ // Remove only dangerous control characters
232
+ sanitized = sanitized.replace(/[\x00\x1a]/g, "");
233
+ // Only remove semicolons if followed by SQL keywords
234
+ sanitized = sanitized.replace(/;(\s)*(drop|delete|insert|update|create|alter|union|select)/gi, " $2");
235
+ return sanitized.trim();
236
+ }
237
+ /**
238
+ * Validate and sanitize input, throwing error if malicious
239
+ */
240
+ validateAndSanitize(input, throwOnDetection = false) {
241
+ const result = this.detect(input);
242
+ if (result.isMalicious && throwOnDetection) {
243
+ throw new Error(`SQL injection attempt detected. Confidence: ${(result.confidence * 100).toFixed(1)}%. ` +
244
+ `Patterns: ${result.detectedPatterns.join(", ")}`);
245
+ }
246
+ return result.sanitizedInput || "";
247
+ }
248
+ /**
249
+ * Create parameterized query helper
250
+ */
251
+ createParameterizedQuery(query, params) {
252
+ // Simple parameterization helper
253
+ let parameterizedQuery = query;
254
+ const safeParams = [];
255
+ params.forEach((param, index) => {
256
+ if (typeof param === "string") {
257
+ const result = this.detect(param);
258
+ if (result.isMalicious) {
259
+ throw new Error(`Parameter ${index} contains potential SQL injection`);
260
+ }
261
+ safeParams.push(result.sanitizedInput);
262
+ }
263
+ else {
264
+ safeParams.push(param);
265
+ }
266
+ });
267
+ return { query: parameterizedQuery, params: safeParams };
268
+ }
269
+ getHighRiskPatternName(index) {
270
+ const names = [
271
+ "Union-Select attack",
272
+ "Commented injection",
273
+ "Comment with semicolon",
274
+ "Enhanced boolean OR",
275
+ "Enhanced boolean AND",
276
+ "Quote-based boolean",
277
+ "Comment-obfuscated injection",
278
+ "Time-based delay",
279
+ "WAITFOR delay attack",
280
+ "System procedure call",
281
+ "Information schema query",
282
+ "DDL with semicolon",
283
+ "Hex-encoded injection",
284
+ "Quote sequence attack",
285
+ "Stacked query attack",
286
+ ];
287
+ return names[index] || `High-risk pattern ${index}`;
288
+ }
289
+ getHighRiskPatternWeight(index) {
290
+ // Higher weights for more definitive attack patterns
291
+ const weights = [
292
+ 0.9, // Union-Select attack
293
+ 0.8, // Commented injection
294
+ 0.7, // Comment with semicolon
295
+ 0.8, // Enhanced boolean OR
296
+ 0.8, // Enhanced boolean AND
297
+ 0.7, // Quote-based boolean
298
+ 0.8, // Comment-obfuscated injection
299
+ 0.9, // Time-based delay
300
+ 0.8, // WAITFOR delay attack
301
+ 0.8, // System procedure call
302
+ 0.7, // Information schema query
303
+ 0.9, // DDL with semicolon
304
+ 0.6, // Hex-encoded injection
305
+ 0.5, // Quote sequence attack
306
+ 0.8, // Stacked query attack
307
+ ];
308
+ return weights[index] || 0.7;
309
+ }
310
+ logAttempt(input, result) {
311
+ console.warn(`SQL Injection Attempt Detected:`, {
312
+ timestamp: new Date().toISOString(),
313
+ input: input.substring(0, 100) + (input.length > 100 ? "..." : ""),
314
+ confidence: result.confidence,
315
+ patterns: result.detectedPatterns,
316
+ });
317
+ }
318
+ /**
319
+ * Update configuration
320
+ */
321
+ updateConfig(newConfig) {
322
+ this.config = { ...this.config, ...newConfig };
323
+ }
324
+ /**
325
+ * Get current configuration
326
+ */
327
+ getConfig() {
328
+ return { ...this.config };
329
+ }
330
+ }
331
+
332
+ export { SQLInjectionDetector as default };
333
+ //# sourceMappingURL=SQLInjectionDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLInjectionDetector.js","sources":["../../../../../../src/middleware/built-in/security/SQLInjectionDetector.ts"],"sourcesContent":[null],"names":[],"mappings":"AAiBA,MAAM,oBAAoB,CAAA;AAmEtB,IAAA,WAAA,CAAY,SAA6B,EAAE,EAAA;;AA/D1B,QAAA,IAAA,CAAA,gBAAgB,GAAG;;YAEhC,oDAAoD;;YAGpD,uEAAuE;YACvE,cAAc;;YAGd,8EAA8E;YAC9E,gFAAgF;;YAGhF,+BAA+B;;YAG/B,yCAAyC;;YAGzC,uDAAuD;YACvD,yCAAyC;;YAGzC,8CAA8C;;YAG9C,sEAAsE;;YAGtE,wEAAwE;;AAGxE,YAAA,sBAAsB;;YAGtB,gBAAgB;;YAGhB,uDAAuD;SAC1D,CAAC;;AAGe,QAAA,IAAA,CAAA,kBAAkB,GAAG;;YAElC,6DAA6D;;YAG7D,8BAA8B;;YAG9B,IAAI;YACJ,IAAI;;YAGJ,SAAS;;YAGT,OAAO;SACV,CAAC;;QAGe,IAAqB,CAAA,qBAAA,GAAG,aAAa,CAAC;QAGnD,IAAI,CAAC,MAAM,GAAG;AACV,YAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;AACtC,YAAA,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,2BAA2B;AAChE,YAAA,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;AACnC,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;AACvC,YAAA,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,IAAI;AACrD,YAAA,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,IAAI,GAAG;SAC/D,CAAC;KACL;AAED;;AAEG;IACH,MAAM,CACF,KAAgC,EAChC,OAAgB,EAAA;QAEhB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACrC,OAAO;AACH,gBAAA,WAAW,EAAE,KAAK;AAClB,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,gBAAgB,EAAE,EAAE;AACpB,gBAAA,SAAS,EAAE,KAAK;aACnB,CAAC;SACL;AAED,QAAA,MAAM,MAAM,GAAoB;AAC5B,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,gBAAgB,EAAE,EAAE;AACpB,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,SAAS,EAAE,KAAK;SACnB,CAAC;;QAGF,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACtC,YAAA,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;AACzB,YAAA,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SACpD;;QAGD,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE;gBACT,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACvD,gBAAA,MAAM,CAAC,gBAAgB,CAAC,IAAI,CACxB,GAAG,WAAW,CAAA,EAAA,EAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAC1C,CAAC;AACF,gBAAA,aAAa,IAAI,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;aACzD;AACL,SAAC,CAAC,CAAC;;QAGH,IAAI,eAAe,GAAG,CAAC,CAAC;AACxB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;YAChC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;SAC/D;aAAM;;YAEH,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;gBAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,OAAO,EAAE;oBACT,eAAe,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;iBAC3C;AACL,aAAC,CAAC,CAAC;SACN;;QAGD,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;;AAG7D,QAAA,MAAM,QAAQ,GAAG,aAAa,GAAG,eAAe,GAAG,GAAG,CAAC;AACvD,QAAA,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,eAAe,CAAC,CAAC;AAC5D,QAAA,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;;AAGrD,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE;AAC1B,YAAA,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC;AAC9B,YAAA,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;SAC7B;aAAM,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;AAChE,YAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;AAC1B,YAAA,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;SAC7B;AAAM,aAAA,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE;AACjC,YAAA,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;AAC5B,YAAA,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;SAC9B;aAAM;AACH,YAAA,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;AACzB,YAAA,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;SAC9B;;AAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE;AACrD,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SAClC;;AAGD,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE;YAC1B,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACrD;AAED,QAAA,OAAO,MAAM,CAAC;KACjB;AAED;;AAEG;IACK,cAAc,CAAC,KAAa,EAAE,OAAe,EAAA;QACjD,IAAI,KAAK,GAAG,CAAC,CAAC;;AAGd,QAAA,MAAM,gBAAgB,GAAG;YACrB,QAAQ;YACR,QAAQ;YACR,MAAM;YACN,aAAa;YACb,SAAS;YACT,QAAQ;YACR,SAAS;YACT,OAAO;YACP,SAAS;YACT,SAAS;YACT,OAAO;SACV,CAAC;QAEF,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,KAChD,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CACtC,CAAC;QAEF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE;AACT,gBAAA,IAAI,YAAY,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;;gBAGxC,IAAI,iBAAiB,EAAE;AACnB,oBAAA,YAAY,IAAI,GAAG,CAAC;iBACvB;;AAGD,gBAAA,IAAI,KAAK,KAAK,CAAC,IAAI,iBAAiB,EAAE;;AAElC,oBAAA,YAAY,IAAI,GAAG,CAAC;iBACvB;gBAED,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE;;AAE5B,oBAAA,IACI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AACxB,wBAAA,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EACjC;wBACE,YAAY,IAAI,GAAG,CAAC;qBACvB;iBACJ;gBAED,KAAK,IAAI,YAAY,CAAC;aACzB;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;AAEG;AACK,IAAA,wBAAwB,CAAC,KAAa,EAAA;QAC1C,IAAI,eAAe,GAAG,CAAC,CAAC;;QAGxB,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACtD,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,YAAA,eAAe,IAAI,GAAG,CAAC;SAC1B;;AAGD,QAAA,MAAM,kBAAkB,GAAG;AACvB,YAAA,4BAA4B;AAC5B,YAAA,0BAA0B;AAC1B,YAAA,wBAAwB;AACxB,YAAA,0BAA0B;SAC7B,CAAC;AAEF,QAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACnC,YAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACrB,eAAe,IAAI,IAAI,CAAC;aAC3B;AACL,SAAC,CAAC,CAAC;;AAGH,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;YACzC,eAAe,IAAI,GAAG,CAAC;SAC1B;;AAGD,QAAA,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC;AACtD,QAAA,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC;AACtD,QAAA,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,EAAE;YAClD,eAAe,IAAI,GAAG,CAAC;SAC1B;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;KACzC;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK,CAAC;QAEzB,IAAI,SAAS,GAAG,KAAK,CAAC;;QAGtB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACjD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;;QAGlD,MAAM,gBAAgB,GAAG,yCAAyC,CAAC;QACnE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;;QAGxD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;;QAGjD,SAAS,GAAG,SAAS,CAAC,OAAO,CACzB,+DAA+D,EAC/D,KAAK,CACR,CAAC;AAEF,QAAA,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;KAC3B;AAED;;AAEG;AACH,IAAA,mBAAmB,CACf,KAAa,EACb,gBAAA,GAA4B,KAAK,EAAA;QAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAElC,QAAA,IAAI,MAAM,CAAC,WAAW,IAAI,gBAAgB,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CACX,CAA+C,4CAAA,EAAA,CAC3C,MAAM,CAAC,UAAU,GAAG,GAAG,EACzB,OAAO,CAAC,CAAC,CAAC,CAAK,GAAA,CAAA;gBACb,CAAa,UAAA,EAAA,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAAA,CACxD,CAAC;SACL;AAED,QAAA,OAAO,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;KACtC;AAED;;AAEG;IACH,wBAAwB,CACpB,KAAa,EACb,MAAa,EAAA;;QAGb,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,MAAM,UAAU,GAAU,EAAE,CAAC;QAE7B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC5B,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClC,gBAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACpB,oBAAA,MAAM,IAAI,KAAK,CACX,aAAa,KAAK,CAAA,iCAAA,CAAmC,CACxD,CAAC;iBACL;AACD,gBAAA,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;aAC1C;iBAAM;AACH,gBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1B;AACL,SAAC,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;KAC5D;AAEO,IAAA,sBAAsB,CAAC,KAAa,EAAA;AACxC,QAAA,MAAM,KAAK,GAAG;YACV,qBAAqB;YACrB,qBAAqB;YACrB,wBAAwB;YACxB,qBAAqB;YACrB,sBAAsB;YACtB,qBAAqB;YACrB,8BAA8B;YAC9B,kBAAkB;YAClB,sBAAsB;YACtB,uBAAuB;YACvB,0BAA0B;YAC1B,oBAAoB;YACpB,uBAAuB;YACvB,uBAAuB;YACvB,sBAAsB;SACzB,CAAC;QACF,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAqB,kBAAA,EAAA,KAAK,EAAE,CAAC;KACvD;AAEO,IAAA,wBAAwB,CAAC,KAAa,EAAA;;AAE1C,QAAA,MAAM,OAAO,GAAG;AACZ,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;AACH,YAAA,GAAG;SACN,CAAC;AACF,QAAA,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;KAChC;IAEO,UAAU,CAAC,KAAa,EAAE,MAAuB,EAAA;AACrD,QAAA,OAAO,CAAC,IAAI,CAAC,CAAA,+BAAA,CAAiC,EAAE;AAC5C,YAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;YAClE,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,gBAAgB;AACpC,SAAA,CAAC,CAAC;KACN;AAED;;AAEG;AACH,IAAA,YAAY,CAAC,SAAsC,EAAA;AAC/C,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;KAClD;AAED;;AAEG;IACH,SAAS,GAAA;AACL,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;KAC7B;AACJ;;;;"}