{"version":3,"sources":["../src/index.ts","../src/connectors/remote.ts","../src/connectors/file.ts","../src/connectors/local.ts","../src/connectors/index.ts","../src/utils/helpers.ts","../src/detectors/memory/recursive-instructions.ts","../src/detectors/memory/persistent-overrides.ts","../src/detectors/memory/encoded-injections.ts","../src/detectors/memory/malicious-signatures.ts","../src/detectors/memory/entropy-anomaly.ts","../src/detectors/memory/goal-drift.ts","../src/detectors/memory/index.ts","../src/detectors/tools/broad-permissions.ts","../src/detectors/tools/runtime-additions.ts","../src/detectors/tools/suspicious-parameters.ts","../src/detectors/tools/index.ts","../src/detectors/index.ts","../src/compliance/nist-ai-rmf.ts","../src/compliance/iso-42001.ts","../src/compliance/soc2.ts","../src/compliance/eu-ai-act.ts","../src/compliance/index.ts","../src/auditor.ts","../src/reporters/json.ts","../src/reporters/console.ts","../src/reporters/html.ts","../src/reporters/pdf.ts"],"sourcesContent":["export { Auditor } from './auditor.js';\nexport * from './types/index.js';\nexport * from './connectors/index.js';\nexport * from './detectors/index.js';\nexport * from './compliance/index.js';\nexport * from './reporters/index.js';\n","import axios, { AxiosInstance } from 'axios';\nimport WebSocket from 'ws';\nimport type { MCPConnection, MCPSession, MCPServerConfig } from '../types/index.js';\n\nexport class RemoteMCPConnector implements MCPConnection {\n  private config: MCPServerConfig;\n  private httpClient?: AxiosInstance;\n  private wsClient?: WebSocket;\n  private session: MCPSession;\n\n  constructor(config: MCPServerConfig) {\n    this.config = config;\n    this.session = {\n      messages: [],\n      memory: [],\n      tools: [],\n      metadata: {},\n    };\n  }\n\n  async connect(): Promise<void> {\n    if (!this.config.url) {\n      throw new Error('Remote MCP connector requires a URL');\n    }\n\n    const url = this.config.url;\n\n    // Determine if WebSocket or HTTP\n    if (url.startsWith('ws://') || url.startsWith('wss://')) {\n      await this.connectWebSocket(url);\n    } else {\n      this.connectHTTP(url);\n    }\n  }\n\n  private async connectWebSocket(url: string): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const headers: Record<string, string> = {};\n\n      if (this.config.apiKey) {\n        headers['X-API-Key'] = this.config.apiKey;\n      } else if (this.config.bearerToken) {\n        headers['Authorization'] = `Bearer ${this.config.bearerToken}`;\n      }\n\n      this.wsClient = new WebSocket(url, { headers });\n\n      this.wsClient.on('open', () => {\n        // Request session data\n        this.wsClient?.send(JSON.stringify({\n          jsonrpc: '2.0',\n          method: 'mcp/getSession',\n          params: {},\n          id: 1\n        }));\n        resolve();\n      });\n\n      this.wsClient.on('message', (data: WebSocket.Data) => {\n        try {\n          const message = JSON.parse(data.toString());\n          if (message.result) {\n            this.parseSessionData(message.result);\n          }\n        } catch (e) {\n          // Ignore parse errors\n        }\n      });\n\n      this.wsClient.on('error', (error) => {\n        reject(new Error(`WebSocket connection failed: ${error.message}`));\n      });\n\n      // Timeout after 10 seconds\n      setTimeout(() => {\n        if (this.wsClient?.readyState !== WebSocket.OPEN) {\n          reject(new Error('WebSocket connection timeout'));\n        }\n      }, 10000);\n    });\n  }\n\n  private connectHTTP(url: string): void {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n    };\n\n    if (this.config.apiKey) {\n      headers['X-API-Key'] = this.config.apiKey;\n    } else if (this.config.bearerToken) {\n      headers['Authorization'] = `Bearer ${this.config.bearerToken}`;\n    }\n\n    this.httpClient = axios.create({\n      baseURL: url,\n      headers,\n      timeout: 10000,\n    });\n  }\n\n  async getSession(): Promise<MCPSession> {\n    if (this.wsClient) {\n      return this.session;\n    }\n\n    if (this.httpClient) {\n      try {\n        // Try common MCP endpoints\n        const endpoints = ['/session', '/mcp/session', '/api/session', '/v1/session'];\n\n        for (const endpoint of endpoints) {\n          try {\n            const response = await this.httpClient.get(endpoint);\n            if (response.data) {\n              this.parseSessionData(response.data);\n              return this.session;\n            }\n          } catch (e) {\n            // Try next endpoint\n          }\n        }\n\n        // If no session endpoint works, try to construct from other endpoints\n        await this.fetchSessionComponents();\n        return this.session;\n      } catch (error: any) {\n        throw new Error(`Failed to fetch MCP session: ${error.message}`);\n      }\n    }\n\n    throw new Error('No active connection');\n  }\n\n  private async fetchSessionComponents(): Promise<void> {\n    if (!this.httpClient) return;\n\n    // Try to get messages\n    try {\n      const messagesResp = await this.httpClient.get('/messages');\n      this.session.messages = messagesResp.data.messages || messagesResp.data || [];\n    } catch (e) {\n      // Ignore\n    }\n\n    // Try to get memory/context\n    try {\n      const memoryResp = await this.httpClient.get('/memory');\n      this.session.memory = memoryResp.data.memory || memoryResp.data || [];\n    } catch (e) {\n      try {\n        const contextResp = await this.httpClient.get('/context');\n        this.session.memory = contextResp.data.context || contextResp.data || [];\n      } catch (e2) {\n        // Ignore\n      }\n    }\n\n    // Try to get tools\n    try {\n      const toolsResp = await this.httpClient.get('/tools');\n      this.session.tools = toolsResp.data.tools || toolsResp.data || [];\n    } catch (e) {\n      // Ignore\n    }\n  }\n\n  private parseSessionData(data: any): void {\n    if (data.messages) {\n      this.session.messages = Array.isArray(data.messages) ? data.messages : [];\n    }\n    if (data.memory) {\n      this.session.memory = Array.isArray(data.memory) ? data.memory : [];\n    } else if (data.context) {\n      this.session.memory = Array.isArray(data.context) ? data.context : [];\n    }\n    if (data.tools) {\n      this.session.tools = Array.isArray(data.tools) ? data.tools : [];\n    }\n    if (data.metadata) {\n      this.session.metadata = data.metadata;\n    }\n  }\n\n  async disconnect(): Promise<void> {\n    if (this.wsClient) {\n      this.wsClient.close();\n      this.wsClient = undefined;\n    }\n    this.httpClient = undefined;\n  }\n}\n","import { readFile } from 'fs/promises';\nimport type { MCPConnection, MCPSession, MCPServerConfig } from '../types/index.js';\n\nexport class FileMCPConnector implements MCPConnection {\n  private config: MCPServerConfig;\n  private session?: MCPSession;\n\n  constructor(config: MCPServerConfig) {\n    this.config = config;\n  }\n\n  async connect(): Promise<void> {\n    if (!this.config.file) {\n      throw new Error('File MCP connector requires a file path');\n    }\n\n    try {\n      const content = await readFile(this.config.file, 'utf-8');\n      const data = JSON.parse(content);\n\n      this.session = {\n        messages: data.messages || [],\n        memory: data.memory || data.context || [],\n        tools: data.tools || [],\n        metadata: data.metadata || {},\n      };\n    } catch (error: any) {\n      throw new Error(`Failed to load session file: ${error.message}`);\n    }\n  }\n\n  async getSession(): Promise<MCPSession> {\n    if (!this.session) {\n      throw new Error('Not connected. Call connect() first.');\n    }\n    return this.session;\n  }\n\n  async disconnect(): Promise<void> {\n    this.session = undefined;\n  }\n}\n","import axios from 'axios';\nimport type { MCPConnection, MCPSession, MCPServerConfig } from '../types/index.js';\nimport { RemoteMCPConnector } from './remote.js';\n\nexport class LocalMCPConnector implements MCPConnection {\n  private config: MCPServerConfig;\n  private remoteConnector?: RemoteMCPConnector;\n  private detectedPort?: number;\n\n  constructor(config: MCPServerConfig) {\n    this.config = config;\n  }\n\n  async connect(): Promise<void> {\n    // Auto-detect local MCP server\n    const commonPorts = [8000, 8080, 3000, 5000, 8888];\n\n    for (const port of commonPorts) {\n      try {\n        const url = `http://localhost:${port}`;\n        await axios.get(url, { timeout: 1000 });\n        this.detectedPort = port;\n\n        // Create a remote connector for the detected port\n        this.remoteConnector = new RemoteMCPConnector({\n          url,\n          ...this.config,\n        });\n\n        await this.remoteConnector.connect();\n        return;\n      } catch (e) {\n        // Try next port\n      }\n    }\n\n    throw new Error('No MCP server detected on common local ports (8000, 8080, 3000, 5000, 8888)');\n  }\n\n  async getSession(): Promise<MCPSession> {\n    if (!this.remoteConnector) {\n      throw new Error('Not connected. Call connect() first.');\n    }\n    return this.remoteConnector.getSession();\n  }\n\n  async disconnect(): Promise<void> {\n    if (this.remoteConnector) {\n      await this.remoteConnector.disconnect();\n      this.remoteConnector = undefined;\n    }\n  }\n\n  getDetectedPort(): number | undefined {\n    return this.detectedPort;\n  }\n}\n","export { RemoteMCPConnector } from './remote.js';\nexport { FileMCPConnector } from './file.js';\nexport { LocalMCPConnector } from './local.js';\n\nimport type { MCPConnection, MCPServerConfig } from '../types/index.js';\nimport { RemoteMCPConnector } from './remote.js';\nimport { FileMCPConnector } from './file.js';\nimport { LocalMCPConnector } from './local.js';\n\nexport function createConnector(config: MCPServerConfig): MCPConnection {\n  if (config.file) {\n    return new FileMCPConnector(config);\n  } else if (config.url) {\n    return new RemoteMCPConnector(config);\n  } else if (config.docker) {\n    // For MVP, docker mode just tries local ports\n    return new LocalMCPConnector(config);\n  } else {\n    // Default to local detection\n    return new LocalMCPConnector(config);\n  }\n}\n","import { randomBytes } from 'crypto';\n\nexport function generateFindingId(): string {\n  return `finding_${Date.now()}_${randomBytes(4).toString('hex')}`;\n}\n\nexport function generateAuditId(): string {\n  return `audit_${Date.now()}_${randomBytes(8).toString('hex')}`;\n}\n\nexport function truncate(text: string, maxLength: number): string {\n  if (text.length <= maxLength) {\n    return text;\n  }\n  return text.slice(0, maxLength) + '...';\n}\n\nexport function calculateRiskScore(\n  criticalCount: number,\n  highCount: number,\n  mediumCount: number,\n  lowCount: number\n): number {\n  // Weight: Critical = 40, High = 20, Medium = 10, Low = 5\n  const weighted = criticalCount * 40 + highCount * 20 + mediumCount * 10 + lowCount * 5;\n\n  // Use asymptotic scaling to prevent early saturation\n  // Formula: score = 100 * (1 - e^(-weighted/threshold))\n  // This creates a curve that approaches 100 but provides better differentiation:\n  // - 1 critical (40) ≈ 20 points\n  // - 3 critical (120) ≈ 49 points\n  // - 5 critical (200) ≈ 67 points\n  // - 10 critical (400) ≈ 89 points\n  const threshold = 180;\n  const score = 100 * (1 - Math.exp(-weighted / threshold));\n\n  // Round to nearest integer and cap at 100\n  return Math.min(100, Math.round(score));\n}\n\nexport function getRiskLevel(score: number): 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL' {\n  if (score >= 80) return 'CRITICAL';\n  if (score >= 50) return 'HIGH';\n  if (score >= 20) return 'MEDIUM';\n  return 'LOW';\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\nexport class RecursiveInstructionsDetector implements Detector {\n  name = 'Recursive Instructions Detector';\n  category = 'memory_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    const recursivePatterns = [\n      /repeat\\s+this\\s+(instruction|prompt|message)/i,\n      /ignore\\s+(all\\s+)?previous\\s+(instructions?|prompts?|commands?)/i,\n      /forget\\s+(everything|all|previous)/i,\n      /new\\s+(instruction|prompt|command):/i,\n      /override\\s+(system|previous)/i,\n      /\\brecursive\\s+call\\b/i,\n      /\\bself\\s+reference\\b/i,\n      /execute\\s+this\\s+instead/i,\n    ];\n\n    // Check memory for recursive patterns\n    for (const memoryItem of session.memory) {\n      const content = this.extractContent(memoryItem);\n\n      for (const pattern of recursivePatterns) {\n        if (pattern.test(content)) {\n          findings.push({\n            id: generateFindingId(),\n            category: 'memory_poisoning',\n            severity: 'CRITICAL',\n            title: 'Recursive/Self-Referencing Instructions Detected',\n            description: 'Memory contains instructions that attempt to override or replace system behavior',\n            details: `Pattern matched: ${pattern.toString()}\\nContent: ${this.truncate(content, 200)}`,\n            recommendation: 'Implement strict input validation and sanitize all user-provided content before storing in memory',\n            evidence: { pattern: pattern.toString(), content: this.truncate(content, 500) },\n          });\n        }\n      }\n    }\n\n    // Check for self-referencing loops\n    const selfRefLoops = this.detectSelfReferencingLoops(session.memory);\n    if (selfRefLoops.length > 0) {\n      findings.push({\n        id: generateFindingId(),\n        category: 'memory_poisoning',\n        severity: 'HIGH',\n        title: 'Self-Referencing Memory Loop Detected',\n        description: 'Memory contains circular references that could cause infinite loops',\n        details: `Found ${selfRefLoops.length} self-referencing loops in memory`,\n        recommendation: 'Implement cycle detection in memory management',\n        evidence: { loops: selfRefLoops },\n      });\n    }\n\n    return findings;\n  }\n\n  private extractContent(memoryItem: any): string {\n    if (typeof memoryItem === 'string') {\n      return memoryItem;\n    }\n    if (memoryItem.content) {\n      return typeof memoryItem.content === 'string'\n        ? memoryItem.content\n        : JSON.stringify(memoryItem.content);\n    }\n    if (memoryItem.text) {\n      return memoryItem.text;\n    }\n    if (memoryItem.message) {\n      return typeof memoryItem.message === 'string'\n        ? memoryItem.message\n        : JSON.stringify(memoryItem.message);\n    }\n    return JSON.stringify(memoryItem);\n  }\n\n  private detectSelfReferencingLoops(memory: any[]): number[] {\n    const loops: number[] = [];\n\n    for (let i = 0; i < memory.length; i++) {\n      const item = memory[i];\n      const content = this.extractContent(item);\n\n      // Check if this memory item references itself or previous items in a loop\n      for (let j = 0; j < i; j++) {\n        const prevContent = this.extractContent(memory[j]);\n\n        // Simple loop detection: if content A contains reference to B and B contains reference to A\n        if (content.includes(prevContent.slice(0, 50)) && prevContent.includes(content.slice(0, 50))) {\n          loops.push(i);\n          break;\n        }\n      }\n    }\n\n    return loops;\n  }\n\n  private truncate(text: string, maxLength: number): string {\n    if (text.length <= maxLength) {\n      return text;\n    }\n    return text.slice(0, maxLength) + '...';\n  }\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\nexport class PersistentOverridesDetector implements Detector {\n  name = 'Persistent Overrides Detector';\n  category = 'memory_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    const overridePatterns = [\n      /always\\s+(respond|reply|answer)\\s+with/i,\n      /from\\s+now\\s+on/i,\n      /permanently\\s+(change|modify|set)/i,\n      /never\\s+(forget|remove|delete)/i,\n      /persist\\s+this/i,\n      /make\\s+this\\s+permanent/i,\n      /override\\s+default/i,\n      /replace\\s+system\\s+prompt/i,\n    ];\n\n    // Check memory for persistent override patterns\n    for (const memoryItem of session.memory) {\n      const content = this.extractContent(memoryItem);\n\n      for (const pattern of overridePatterns) {\n        if (pattern.test(content)) {\n          findings.push({\n            id: generateFindingId(),\n            category: 'memory_poisoning',\n            severity: 'CRITICAL',\n            title: 'Persistent Override Pattern Detected',\n            description: 'Memory contains instructions designed to persist across sessions',\n            details: `Pattern matched: ${pattern.toString()}\\nContent: ${this.truncate(content, 200)}`,\n            recommendation: 'Implement session isolation and memory expiration policies',\n            evidence: { pattern: pattern.toString(), content: this.truncate(content, 500) },\n          });\n        }\n      }\n    }\n\n    // Check for duplicate persistent instructions\n    const duplicates = this.findDuplicatePersistentInstructions(session.memory);\n    if (duplicates.length > 0) {\n      findings.push({\n        id: generateFindingId(),\n        category: 'memory_poisoning',\n        severity: 'HIGH',\n        title: 'Duplicate Persistent Instructions',\n        description: 'Multiple copies of the same instruction found in memory, indicating poisoning attempt',\n        details: `Found ${duplicates.length} duplicate persistent instructions`,\n        recommendation: 'Implement deduplication and integrity checking for memory storage',\n        evidence: { duplicates },\n      });\n    }\n\n    return findings;\n  }\n\n  private extractContent(memoryItem: any): string {\n    if (typeof memoryItem === 'string') {\n      return memoryItem;\n    }\n    if (memoryItem.content) {\n      return typeof memoryItem.content === 'string'\n        ? memoryItem.content\n        : JSON.stringify(memoryItem.content);\n    }\n    if (memoryItem.text) {\n      return memoryItem.text;\n    }\n    if (memoryItem.message) {\n      return typeof memoryItem.message === 'string'\n        ? memoryItem.message\n        : JSON.stringify(memoryItem.message);\n    }\n    return JSON.stringify(memoryItem);\n  }\n\n  private findDuplicatePersistentInstructions(memory: any[]): string[] {\n    const seen = new Map<string, number>();\n    const duplicates: string[] = [];\n\n    for (const item of memory) {\n      const content = this.extractContent(item);\n\n      // Normalize content for comparison\n      const normalized = content.toLowerCase().replace(/\\s+/g, ' ').trim();\n\n      if (normalized.length > 50) {\n        // Only check substantial content\n        const count = seen.get(normalized) || 0;\n        seen.set(normalized, count + 1);\n\n        if (count === 1) {\n          // Second occurrence\n          duplicates.push(this.truncate(content, 100));\n        }\n      }\n    }\n\n    return duplicates;\n  }\n\n  private truncate(text: string, maxLength: number): string {\n    if (text.length <= maxLength) {\n      return text;\n    }\n    return text.slice(0, maxLength) + '...';\n  }\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\nexport class EncodedInjectionsDetector implements Detector {\n  name = 'Encoded Injections Detector';\n  category = 'memory_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    // Check memory for encoded content\n    for (const memoryItem of session.memory) {\n      const content = this.extractContent(memoryItem);\n\n      // Detect Base64 encoded strings\n      const base64Matches = this.findBase64Strings(content);\n      for (const match of base64Matches) {\n        try {\n          const decoded = Buffer.from(match, 'base64').toString('utf-8');\n\n          // Check if decoded content contains suspicious patterns\n          if (this.isSuspicious(decoded)) {\n            findings.push({\n              id: generateFindingId(),\n              category: 'memory_poisoning',\n              severity: 'CRITICAL',\n              title: 'Base64 Encoded Injection Detected',\n              description: 'Memory contains Base64 encoded content with suspicious patterns',\n              details: `Encoded: ${this.truncate(match, 100)}\\nDecoded: ${this.truncate(decoded, 200)}`,\n              recommendation: 'Decode and validate all Base64 content before storing in memory',\n              evidence: { encoded: match, decoded: this.truncate(decoded, 500) },\n            });\n          }\n        } catch (e) {\n          // Not valid Base64, continue\n        }\n      }\n\n      // Detect URL encoded strings\n      const urlEncodedMatches = this.findURLEncodedStrings(content);\n      for (const match of urlEncodedMatches) {\n        try {\n          const decoded = decodeURIComponent(match);\n\n          if (this.isSuspicious(decoded)) {\n            findings.push({\n              id: generateFindingId(),\n              category: 'memory_poisoning',\n              severity: 'HIGH',\n              title: 'URL Encoded Injection Detected',\n              description: 'Memory contains URL encoded content with suspicious patterns',\n              details: `Encoded: ${this.truncate(match, 100)}\\nDecoded: ${this.truncate(decoded, 200)}`,\n              recommendation: 'Decode and validate all URL encoded content before storing in memory',\n              evidence: { encoded: match, decoded: this.truncate(decoded, 500) },\n            });\n          }\n        } catch (e) {\n          // Not valid URL encoding, continue\n        }\n      }\n\n      // Detect hex encoded strings\n      const hexMatches = this.findHexStrings(content);\n      for (const match of hexMatches) {\n        try {\n          const decoded = Buffer.from(match, 'hex').toString('utf-8');\n\n          if (this.isSuspicious(decoded)) {\n            findings.push({\n              id: generateFindingId(),\n              category: 'memory_poisoning',\n              severity: 'HIGH',\n              title: 'Hex Encoded Injection Detected',\n              description: 'Memory contains hex encoded content with suspicious patterns',\n              details: `Encoded: ${this.truncate(match, 100)}\\nDecoded: ${this.truncate(decoded, 200)}`,\n              recommendation: 'Decode and validate all hex encoded content before storing in memory',\n              evidence: { encoded: match, decoded: this.truncate(decoded, 500) },\n            });\n          }\n        } catch (e) {\n          // Not valid hex, continue\n        }\n      }\n    }\n\n    return findings;\n  }\n\n  private extractContent(memoryItem: any): string {\n    if (typeof memoryItem === 'string') {\n      return memoryItem;\n    }\n    if (memoryItem.content) {\n      return typeof memoryItem.content === 'string'\n        ? memoryItem.content\n        : JSON.stringify(memoryItem.content);\n    }\n    if (memoryItem.text) {\n      return memoryItem.text;\n    }\n    if (memoryItem.message) {\n      return typeof memoryItem.message === 'string'\n        ? memoryItem.message\n        : JSON.stringify(memoryItem.message);\n    }\n    return JSON.stringify(memoryItem);\n  }\n\n  private findBase64Strings(content: string): string[] {\n    // Match Base64 strings (at least 20 chars to avoid false positives)\n    const regex = /[A-Za-z0-9+/]{20,}={0,2}/g;\n    return content.match(regex) || [];\n  }\n\n  private findURLEncodedStrings(content: string): string[] {\n    // Match URL encoded strings with multiple % signs\n    const regex = /(?:%[0-9A-Fa-f]{2}){3,}/g;\n    return content.match(regex) || [];\n  }\n\n  private findHexStrings(content: string): string[] {\n    // Match hex strings (at least 10 pairs)\n    const regex = /\\b[0-9A-Fa-f]{20,}\\b/g;\n    return content.match(regex) || [];\n  }\n\n  private isSuspicious(text: string): boolean {\n    const suspiciousPatterns = [\n      /ignore\\s+previous/i,\n      /system\\s+prompt/i,\n      /override/i,\n      /execute/i,\n      /<script>/i,\n      /eval\\(/i,\n      /document\\./i,\n      /window\\./i,\n      /\\$\\{.*\\}/,\n      /`.*`/,\n    ];\n\n    return suspiciousPatterns.some((pattern) => pattern.test(text));\n  }\n\n  private truncate(text: string, maxLength: number): string {\n    if (text.length <= maxLength) {\n      return text;\n    }\n    return text.slice(0, maxLength) + '...';\n  }\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\n// Known malicious payload signatures\nconst MALICIOUS_SIGNATURES = [\n  // Prompt injection templates\n  { pattern: /DAN\\s+mode/i, name: 'DAN (Do Anything Now) Jailbreak', severity: 'CRITICAL' as const },\n  { pattern: /ignore\\s+all\\s+previous\\s+instructions/i, name: 'Direct Override Injection', severity: 'CRITICAL' as const },\n  { pattern: /you\\s+are\\s+now\\s+in\\s+developer\\s+mode/i, name: 'Developer Mode Jailbreak', severity: 'CRITICAL' as const },\n  { pattern: /sudo\\s+mode/i, name: 'Sudo Mode Injection', severity: 'HIGH' as const },\n  { pattern: /system\\s+prompt:\\s*/i, name: 'System Prompt Replacement', severity: 'CRITICAL' as const },\n\n  // Code injection\n  { pattern: /<script[^>]*>[\\s\\S]*?<\\/script>/i, name: 'JavaScript Injection', severity: 'CRITICAL' as const },\n  { pattern: /eval\\s*\\(/i, name: 'eval() Code Execution', severity: 'CRITICAL' as const },\n  { pattern: /exec\\s*\\(/i, name: 'exec() Code Execution', severity: 'CRITICAL' as const },\n  { pattern: /__import__\\s*\\(/i, name: 'Python Import Injection', severity: 'HIGH' as const },\n\n  // Data exfiltration\n  { pattern: /fetch\\s*\\([^)]*http/i, name: 'Data Exfiltration via Fetch', severity: 'HIGH' as const },\n  { pattern: /XMLHttpRequest/i, name: 'Data Exfiltration via XHR', severity: 'HIGH' as const },\n  { pattern: /window\\.location\\s*=/i, name: 'Redirect to Malicious Site', severity: 'HIGH' as const },\n\n  // Credential harvesting\n  { pattern: /password\\s*:\\s*['\"]/i, name: 'Credential Harvesting Pattern', severity: 'MEDIUM' as const },\n  { pattern: /api[_-]?key\\s*:\\s*['\"]/i, name: 'API Key Harvesting Pattern', severity: 'MEDIUM' as const },\n  { pattern: /token\\s*:\\s*['\"]/i, name: 'Token Harvesting Pattern', severity: 'MEDIUM' as const },\n\n  // Memory manipulation\n  { pattern: /delete\\s+memory/i, name: 'Memory Deletion Command', severity: 'HIGH' as const },\n  { pattern: /clear\\s+history/i, name: 'History Clearing Command', severity: 'MEDIUM' as const },\n  { pattern: /reset\\s+context/i, name: 'Context Reset Command', severity: 'MEDIUM' as const },\n\n  // Privilege escalation\n  { pattern: /admin\\s+mode/i, name: 'Admin Mode Escalation', severity: 'HIGH' as const },\n  { pattern: /root\\s+access/i, name: 'Root Access Request', severity: 'HIGH' as const },\n  { pattern: /elevated\\s+privileges/i, name: 'Privilege Escalation Attempt', severity: 'HIGH' as const },\n];\n\nexport class MaliciousSignaturesDetector implements Detector {\n  name = 'Malicious Signatures Detector';\n  category = 'memory_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    // Check memory for known malicious signatures\n    for (const memoryItem of session.memory) {\n      const content = this.extractContent(memoryItem);\n\n      for (const signature of MALICIOUS_SIGNATURES) {\n        if (signature.pattern.test(content)) {\n          findings.push({\n            id: generateFindingId(),\n            category: 'memory_poisoning',\n            severity: signature.severity,\n            title: `Known Malicious Signature: ${signature.name}`,\n            description: `Memory contains a known malicious pattern used in attacks`,\n            details: `Signature: ${signature.name}\\nPattern: ${signature.pattern.toString()}\\nContent: ${this.truncate(content, 200)}`,\n            recommendation: 'Immediately remove this content from memory and implement signature-based filtering',\n            evidence: {\n              signature: signature.name,\n              pattern: signature.pattern.toString(),\n              content: this.truncate(content, 500),\n            },\n          });\n        }\n      }\n    }\n\n    // Check messages too\n    for (const message of session.messages) {\n      const content = this.extractContent(message);\n\n      for (const signature of MALICIOUS_SIGNATURES) {\n        if (signature.pattern.test(content)) {\n          findings.push({\n            id: generateFindingId(),\n            category: 'memory_poisoning',\n            severity: signature.severity,\n            title: `Known Malicious Signature in Messages: ${signature.name}`,\n            description: `Message history contains a known malicious pattern`,\n            details: `Signature: ${signature.name}\\nPattern: ${signature.pattern.toString()}\\nContent: ${this.truncate(content, 200)}`,\n            recommendation: 'Implement input validation and signature-based filtering on all user messages',\n            evidence: {\n              signature: signature.name,\n              pattern: signature.pattern.toString(),\n              content: this.truncate(content, 500),\n            },\n          });\n        }\n      }\n    }\n\n    return findings;\n  }\n\n  private extractContent(item: any): string {\n    if (typeof item === 'string') {\n      return item;\n    }\n    if (item.content) {\n      return typeof item.content === 'string' ? item.content : JSON.stringify(item.content);\n    }\n    if (item.text) {\n      return item.text;\n    }\n    if (item.message) {\n      return typeof item.message === 'string' ? item.message : JSON.stringify(item.message);\n    }\n    return JSON.stringify(item);\n  }\n\n  private truncate(text: string, maxLength: number): string {\n    if (text.length <= maxLength) {\n      return text;\n    }\n    return text.slice(0, maxLength) + '...';\n  }\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\nexport class EntropyAnomalyDetector implements Detector {\n  name = 'Entropy Anomaly Detector';\n  category = 'memory_poisoning' as const;\n\n  // High entropy often indicates encrypted, encoded, or obfuscated content\n  private readonly HIGH_ENTROPY_THRESHOLD = 4.5;\n  private readonly VERY_HIGH_ENTROPY_THRESHOLD = 5.5;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    // Check memory for high entropy content\n    for (const memoryItem of session.memory) {\n      const content = this.extractContent(memoryItem);\n\n      // Skip very short content\n      if (content.length < 50) {\n        continue;\n      }\n\n      const entropy = this.calculateEntropy(content);\n\n      if (entropy >= this.VERY_HIGH_ENTROPY_THRESHOLD) {\n        findings.push({\n          id: generateFindingId(),\n          category: 'memory_poisoning',\n          severity: 'HIGH',\n          title: 'Very High Entropy Content Detected',\n          description: 'Memory contains content with abnormally high entropy, possibly encrypted or obfuscated',\n          details: `Entropy: ${entropy.toFixed(2)} (threshold: ${this.VERY_HIGH_ENTROPY_THRESHOLD})\\nContent: ${this.truncate(content, 200)}`,\n          recommendation: 'Investigate this content for encryption, encoding, or obfuscation. Consider blocking high-entropy content.',\n          evidence: { entropy, content: this.truncate(content, 500), length: content.length },\n        });\n      } else if (entropy >= this.HIGH_ENTROPY_THRESHOLD) {\n        findings.push({\n          id: generateFindingId(),\n          category: 'memory_poisoning',\n          severity: 'MEDIUM',\n          title: 'High Entropy Content Detected',\n          description: 'Memory contains content with elevated entropy, possibly encoded or compressed',\n          details: `Entropy: ${entropy.toFixed(2)} (threshold: ${this.HIGH_ENTROPY_THRESHOLD})\\nContent: ${this.truncate(content, 200)}`,\n          recommendation: 'Review this content for encoding or compression. May be legitimate but warrants inspection.',\n          evidence: { entropy, content: this.truncate(content, 500), length: content.length },\n        });\n      }\n    }\n\n    // Check for entropy anomalies (significant deviation from mean)\n    const anomalies = this.detectEntropyAnomalies(session.memory);\n    for (const anomaly of anomalies) {\n      findings.push({\n        id: generateFindingId(),\n        category: 'memory_poisoning',\n        severity: 'MEDIUM',\n        title: 'Entropy Anomaly Detected',\n        description: 'Memory item has significantly different entropy from the rest of the memory',\n        details: `Item entropy: ${anomaly.entropy.toFixed(2)}, Mean entropy: ${anomaly.mean.toFixed(2)}, Deviation: ${anomaly.deviation.toFixed(2)}σ`,\n        recommendation: 'Investigate why this memory item differs significantly from others',\n        evidence: anomaly,\n      });\n    }\n\n    return findings;\n  }\n\n  private calculateEntropy(text: string): number {\n    if (text.length === 0) return 0;\n\n    // Count character frequencies\n    const freq = new Map<string, number>();\n    for (const char of text) {\n      freq.set(char, (freq.get(char) || 0) + 1);\n    }\n\n    // Calculate Shannon entropy\n    let entropy = 0;\n    const len = text.length;\n\n    for (const count of freq.values()) {\n      const p = count / len;\n      entropy -= p * Math.log2(p);\n    }\n\n    return entropy;\n  }\n\n  private detectEntropyAnomalies(memory: any[]): Array<{\n    index: number;\n    entropy: number;\n    mean: number;\n    deviation: number;\n    content: string;\n  }> {\n    if (memory.length < 3) return [];\n\n    // Calculate entropy for all memory items\n    const entropies = memory.map((item) => {\n      const content = this.extractContent(item);\n      return {\n        content,\n        entropy: this.calculateEntropy(content),\n      };\n    });\n\n    // Calculate mean and standard deviation\n    const mean = entropies.reduce((sum, e) => sum + e.entropy, 0) / entropies.length;\n    const variance =\n      entropies.reduce((sum, e) => sum + Math.pow(e.entropy - mean, 2), 0) / entropies.length;\n    const stdDev = Math.sqrt(variance);\n\n    // Find anomalies (more than 2 standard deviations from mean)\n    const anomalies = [];\n    for (let i = 0; i < entropies.length; i++) {\n      const deviation = Math.abs(entropies[i].entropy - mean) / stdDev;\n      if (deviation > 2 && entropies[i].entropy > mean) {\n        anomalies.push({\n          index: i,\n          entropy: entropies[i].entropy,\n          mean,\n          deviation,\n          content: this.truncate(entropies[i].content, 200),\n        });\n      }\n    }\n\n    return anomalies;\n  }\n\n  private extractContent(memoryItem: any): string {\n    if (typeof memoryItem === 'string') {\n      return memoryItem;\n    }\n    if (memoryItem.content) {\n      return typeof memoryItem.content === 'string'\n        ? memoryItem.content\n        : JSON.stringify(memoryItem.content);\n    }\n    if (memoryItem.text) {\n      return memoryItem.text;\n    }\n    if (memoryItem.message) {\n      return typeof memoryItem.message === 'string'\n        ? memoryItem.message\n        : JSON.stringify(memoryItem.message);\n    }\n    return JSON.stringify(memoryItem);\n  }\n\n  private truncate(text: string, maxLength: number): string {\n    if (text.length <= maxLength) {\n      return text;\n    }\n    return text.slice(0, maxLength) + '...';\n  }\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\nexport class GoalDriftDetector implements Detector {\n  name = 'Goal Drift Detector';\n  category = 'memory_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    // Extract potential system prompt or initial goal from metadata or first message\n    const systemPrompt = this.extractSystemPrompt(session);\n\n    if (!systemPrompt) {\n      // Can't detect goal drift without a baseline\n      return findings;\n    }\n\n    // Check if later memory/messages significantly deviate from initial goal\n    const laterContent = this.extractLaterContent(session);\n\n    for (const content of laterContent) {\n      const similarity = this.calculateSemanticSimilarity(systemPrompt, content.text);\n\n      if (similarity < 0.2) {\n        // Very low similarity indicates significant drift\n        findings.push({\n          id: generateFindingId(),\n          category: 'memory_poisoning',\n          severity: 'HIGH',\n          title: 'Severe Goal Drift Detected',\n          description: 'Memory content has drifted significantly from the original system instructions',\n          details: `Similarity to system prompt: ${(similarity * 100).toFixed(1)}%\\nContent: ${this.truncate(content.text, 200)}`,\n          recommendation: 'Implement goal consistency checks and reject content that deviates too far from system objectives',\n          evidence: {\n            similarity,\n            systemPrompt: this.truncate(systemPrompt, 200),\n            driftedContent: this.truncate(content.text, 500),\n            source: content.source,\n          },\n        });\n      } else if (similarity < 0.4) {\n        findings.push({\n          id: generateFindingId(),\n          category: 'memory_poisoning',\n          severity: 'MEDIUM',\n          title: 'Goal Drift Detected',\n          description: 'Memory content shows moderate deviation from original system instructions',\n          details: `Similarity to system prompt: ${(similarity * 100).toFixed(1)}%\\nContent: ${this.truncate(content.text, 200)}`,\n          recommendation: 'Review memory content to ensure alignment with system objectives',\n          evidence: {\n            similarity,\n            systemPrompt: this.truncate(systemPrompt, 200),\n            driftedContent: this.truncate(content.text, 500),\n            source: content.source,\n          },\n        });\n      }\n    }\n\n    // Check for explicit goal manipulation\n    const goalManipulation = this.detectGoalManipulation(session);\n    if (goalManipulation.length > 0) {\n      findings.push({\n        id: generateFindingId(),\n        category: 'memory_poisoning',\n        severity: 'CRITICAL',\n        title: 'Explicit Goal Manipulation Detected',\n        description: 'Content attempting to explicitly change or override system goals',\n        details: `Found ${goalManipulation.length} instances of goal manipulation`,\n        recommendation: 'Immediately reject and block content that attempts to modify system goals',\n        evidence: { manipulations: goalManipulation },\n      });\n    }\n\n    return findings;\n  }\n\n  private extractSystemPrompt(session: MCPSession): string | null {\n    // Try metadata first\n    if (session.metadata?.systemPrompt) {\n      return String(session.metadata.systemPrompt);\n    }\n    if (session.metadata?.system_prompt) {\n      return String(session.metadata.system_prompt);\n    }\n\n    // Try first message with role=system\n    const firstSystemMessage = session.messages.find(\n      (msg: any) => msg.role === 'system' || msg.type === 'system'\n    );\n    if (firstSystemMessage) {\n      return this.extractContent(firstSystemMessage);\n    }\n\n    // Try first message\n    if (session.messages.length > 0) {\n      return this.extractContent(session.messages[0]);\n    }\n\n    return null;\n  }\n\n  private extractLaterContent(session: MCPSession): Array<{ text: string; source: string }> {\n    const content: Array<{ text: string; source: string }> = [];\n\n    // Get memory items (skip first few as they might be initialization)\n    const memoryToCheck = session.memory.slice(Math.min(2, session.memory.length));\n    for (const item of memoryToCheck) {\n      const text = this.extractContent(item);\n      if (text.length > 50) {\n        content.push({ text, source: 'memory' });\n      }\n    }\n\n    // Get later messages (skip first few)\n    const messagesToCheck = session.messages.slice(Math.min(3, session.messages.length));\n    for (const item of messagesToCheck) {\n      const text = this.extractContent(item);\n      if (text.length > 50) {\n        content.push({ text, source: 'messages' });\n      }\n    }\n\n    return content;\n  }\n\n  private calculateSemanticSimilarity(text1: string, text2: string): number {\n    // Simple keyword-based similarity (for MVP)\n    // In production, use proper embedding-based similarity\n\n    const tokens1 = this.tokenize(text1);\n    const tokens2 = this.tokenize(text2);\n\n    // Jaccard similarity\n    const set1 = new Set(tokens1);\n    const set2 = new Set(tokens2);\n\n    const intersection = new Set([...set1].filter((x) => set2.has(x)));\n    const union = new Set([...set1, ...set2]);\n\n    return intersection.size / union.size;\n  }\n\n  private tokenize(text: string): string[] {\n    return text\n      .toLowerCase()\n      .replace(/[^\\w\\s]/g, ' ')\n      .split(/\\s+/)\n      .filter((token) => token.length > 2);\n  }\n\n  private detectGoalManipulation(session: MCPSession): string[] {\n    const manipulations: string[] = [];\n\n    const manipulationPatterns = [\n      /change\\s+your\\s+goal/i,\n      /new\\s+objective/i,\n      /forget\\s+your\\s+purpose/i,\n      /your\\s+mission\\s+is\\s+now/i,\n      /redefine\\s+your\\s+role/i,\n    ];\n\n    const allContent = [\n      ...session.memory.map((item) => this.extractContent(item)),\n      ...session.messages.map((item) => this.extractContent(item)),\n    ];\n\n    for (const content of allContent) {\n      for (const pattern of manipulationPatterns) {\n        if (pattern.test(content)) {\n          manipulations.push(this.truncate(content, 200));\n          break;\n        }\n      }\n    }\n\n    return manipulations;\n  }\n\n  private extractContent(item: any): string {\n    if (typeof item === 'string') {\n      return item;\n    }\n    if (item.content) {\n      return typeof item.content === 'string' ? item.content : JSON.stringify(item.content);\n    }\n    if (item.text) {\n      return item.text;\n    }\n    if (item.message) {\n      return typeof item.message === 'string' ? item.message : JSON.stringify(item.message);\n    }\n    return JSON.stringify(item);\n  }\n\n  private truncate(text: string, maxLength: number): string {\n    if (text.length <= maxLength) {\n      return text;\n    }\n    return text.slice(0, maxLength) + '...';\n  }\n}\n","export { RecursiveInstructionsDetector } from './recursive-instructions.js';\nexport { PersistentOverridesDetector } from './persistent-overrides.js';\nexport { EncodedInjectionsDetector } from './encoded-injections.js';\nexport { MaliciousSignaturesDetector } from './malicious-signatures.js';\nexport { EntropyAnomalyDetector } from './entropy-anomaly.js';\nexport { GoalDriftDetector } from './goal-drift.js';\n\nimport { RecursiveInstructionsDetector } from './recursive-instructions.js';\nimport { PersistentOverridesDetector } from './persistent-overrides.js';\nimport { EncodedInjectionsDetector } from './encoded-injections.js';\nimport { MaliciousSignaturesDetector } from './malicious-signatures.js';\nimport { EntropyAnomalyDetector } from './entropy-anomaly.js';\nimport { GoalDriftDetector } from './goal-drift.js';\nimport type { Detector } from '../../types/index.js';\n\nexport function getAllMemoryDetectors(): Detector[] {\n  return [\n    new RecursiveInstructionsDetector(),\n    new PersistentOverridesDetector(),\n    new EncodedInjectionsDetector(),\n    new MaliciousSignaturesDetector(),\n    new EntropyAnomalyDetector(),\n    new GoalDriftDetector(),\n  ];\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\n// Dangerous permissions that should be restricted\nconst DANGEROUS_PERMISSIONS = [\n  { permission: /file.*write/i, severity: 'HIGH' as const, name: 'File Write Access' },\n  { permission: /file.*delete/i, severity: 'HIGH' as const, name: 'File Delete Access' },\n  { permission: /execute|exec|run|spawn/i, severity: 'CRITICAL' as const, name: 'Code Execution' },\n  { permission: /shell|bash|cmd|powershell/i, severity: 'CRITICAL' as const, name: 'Shell Access' },\n  { permission: /network|http|fetch|request/i, severity: 'MEDIUM' as const, name: 'Network Access' },\n  { permission: /database|db|sql/i, severity: 'HIGH' as const, name: 'Database Access' },\n  { permission: /admin|root|sudo/i, severity: 'CRITICAL' as const, name: 'Admin Privileges' },\n  { permission: /\\*|all|everything/i, severity: 'CRITICAL' as const, name: 'Wildcard Permissions' },\n];\n\nexport class BroadPermissionsDetector implements Detector {\n  name = 'Broad Permissions Detector';\n  category = 'tool_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    for (const tool of session.tools) {\n      const toolName = this.getToolName(tool);\n      const permissions = this.extractPermissions(tool);\n\n      // Check for dangerous permissions\n      for (const dangerousPerm of DANGEROUS_PERMISSIONS) {\n        const matchedPerms = permissions.filter((p) => dangerousPerm.permission.test(p));\n\n        if (matchedPerms.length > 0) {\n          findings.push({\n            id: generateFindingId(),\n            category: 'tool_poisoning',\n            severity: dangerousPerm.severity,\n            title: `Tool with Dangerous Permission: ${dangerousPerm.name}`,\n            description: `Tool \"${toolName}\" has overly broad permissions that could be exploited`,\n            details: `Permission: ${dangerousPerm.name}\\nMatched: ${matchedPerms.join(', ')}\\nTool: ${toolName}`,\n            recommendation: 'Implement principle of least privilege and restrict tool permissions to minimum required',\n            evidence: {\n              tool: toolName,\n              permission: dangerousPerm.name,\n              matched: matchedPerms,\n              toolConfig: this.sanitizeTool(tool),\n            },\n          });\n        }\n      }\n\n      // Check for tools with too many permissions\n      if (permissions.length > 5) {\n        findings.push({\n          id: generateFindingId(),\n          category: 'tool_poisoning',\n          severity: 'MEDIUM',\n          title: 'Tool with Excessive Permissions',\n          description: `Tool \"${toolName}\" has an unusually high number of permissions`,\n          details: `Tool has ${permissions.length} permissions. This may indicate overly broad access.`,\n          recommendation: 'Review and reduce tool permissions to minimum required',\n          evidence: {\n            tool: toolName,\n            permissionCount: permissions.length,\n            permissions: permissions.slice(0, 10),\n            toolConfig: this.sanitizeTool(tool),\n          },\n        });\n      }\n    }\n\n    return findings;\n  }\n\n  private getToolName(tool: any): string {\n    return tool.name || tool.id || tool.function?.name || 'unknown';\n  }\n\n  private extractPermissions(tool: any): string[] {\n    const permissions: string[] = [];\n\n    // Check various common permission fields\n    if (tool.permissions) {\n      if (Array.isArray(tool.permissions)) {\n        permissions.push(...tool.permissions.map(String));\n      } else if (typeof tool.permissions === 'string') {\n        permissions.push(tool.permissions);\n      } else if (typeof tool.permissions === 'object') {\n        permissions.push(...Object.keys(tool.permissions));\n        permissions.push(...Object.values(tool.permissions).filter((v) => typeof v === 'string'));\n      }\n    }\n\n    if (tool.capabilities) {\n      if (Array.isArray(tool.capabilities)) {\n        permissions.push(...tool.capabilities.map(String));\n      }\n    }\n\n    if (tool.access) {\n      if (Array.isArray(tool.access)) {\n        permissions.push(...tool.access.map(String));\n      } else if (typeof tool.access === 'string') {\n        permissions.push(tool.access);\n      }\n    }\n\n    // Check tool description for permission keywords\n    const description = tool.description || tool.desc || '';\n    if (typeof description === 'string') {\n      for (const dangerousPerm of DANGEROUS_PERMISSIONS) {\n        if (dangerousPerm.permission.test(description)) {\n          permissions.push(`description:${dangerousPerm.name}`);\n        }\n      }\n    }\n\n    // Check parameters for permissions\n    const params = tool.parameters || tool.params || tool.args || tool.function?.parameters;\n    if (params) {\n      const paramStr = JSON.stringify(params);\n      for (const dangerousPerm of DANGEROUS_PERMISSIONS) {\n        if (dangerousPerm.permission.test(paramStr)) {\n          permissions.push(`params:${dangerousPerm.name}`);\n        }\n      }\n    }\n\n    return permissions;\n  }\n\n  private sanitizeTool(tool: any): any {\n    // Return a sanitized version of the tool for evidence\n    return {\n      name: this.getToolName(tool),\n      description: tool.description || tool.desc || '',\n      permissions: tool.permissions,\n      capabilities: tool.capabilities,\n      access: tool.access,\n    };\n  }\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\nexport class RuntimeAdditionsDetector implements Detector {\n  name = 'Runtime Tool Additions Detector';\n  category = 'tool_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    // Check if tools have timestamps or creation metadata\n    const toolsWithTimestamps = session.tools.filter(\n      (tool: any) => tool.timestamp || tool.created || tool.addedAt || tool.created_at\n    );\n\n    if (toolsWithTimestamps.length > 0) {\n      // Analyze timing of tool additions\n      const initialTools = this.getInitialTools(session);\n      const laterTools = this.getLaterTools(session, initialTools);\n\n      for (const tool of laterTools) {\n        const toolName = this.getToolName(tool);\n\n        findings.push({\n          id: generateFindingId(),\n          category: 'tool_poisoning',\n          severity: 'HIGH',\n          title: 'Tool Added During Runtime',\n          description: `Tool \"${toolName}\" was added after session initialization without explicit approval`,\n          details: `This tool was not present at session start, which may indicate injection or manipulation`,\n          recommendation: 'Implement explicit approval workflow for runtime tool additions',\n          evidence: {\n            tool: toolName,\n            timestamp: tool.timestamp || tool.created || tool.addedAt || tool.created_at,\n            toolConfig: this.sanitizeTool(tool),\n          },\n        });\n      }\n    }\n\n    // Check for tools with dynamic or eval-based implementations\n    for (const tool of session.tools) {\n      const toolName = this.getToolName(tool);\n      const isDynamic = this.isDynamicTool(tool);\n\n      if (isDynamic) {\n        findings.push({\n          id: generateFindingId(),\n          category: 'tool_poisoning',\n          severity: 'CRITICAL',\n          title: 'Dynamically Generated Tool Detected',\n          description: `Tool \"${toolName}\" appears to be dynamically generated or uses eval/exec`,\n          details: `Dynamic tools can be manipulated to execute arbitrary code`,\n          recommendation: 'Only allow pre-approved, static tool definitions',\n          evidence: {\n            tool: toolName,\n            toolConfig: this.sanitizeTool(tool),\n          },\n        });\n      }\n    }\n\n    // Check for tools without proper validation/authorization metadata\n    for (const tool of session.tools) {\n      const toolName = this.getToolName(tool);\n\n      if (!this.hasAuthorizationMetadata(tool)) {\n        findings.push({\n          id: generateFindingId(),\n          category: 'tool_poisoning',\n          severity: 'MEDIUM',\n          title: 'Tool Without Authorization Metadata',\n          description: `Tool \"${toolName}\" lacks authorization or validation metadata`,\n          details: `Tools should have explicit approval/validation metadata to prevent unauthorized additions`,\n          recommendation: 'Add authorization metadata to all tools indicating approval status',\n          evidence: {\n            tool: toolName,\n            toolConfig: this.sanitizeTool(tool),\n          },\n        });\n      }\n    }\n\n    return findings;\n  }\n\n  private getToolName(tool: any): string {\n    return tool.name || tool.id || tool.function?.name || 'unknown';\n  }\n\n  private getInitialTools(session: MCPSession): Set<string> {\n    // Try to determine which tools were present at initialization\n    const initialTools = new Set<string>();\n\n    // If metadata indicates initial tools\n    if (session.metadata?.initialTools) {\n      const initial = session.metadata.initialTools;\n      if (Array.isArray(initial)) {\n        initial.forEach((t) => initialTools.add(this.getToolName(t)));\n      }\n    }\n\n    // Otherwise, assume tools without timestamps or with earliest timestamps are initial\n    if (initialTools.size === 0) {\n      const toolsWithTime = session.tools\n        .map((tool: any) => ({\n          name: this.getToolName(tool),\n          time: this.getTimestamp(tool),\n        }))\n        .filter((t) => t.time !== null)\n        .sort((a, b) => a.time! - b.time!);\n\n      if (toolsWithTime.length > 0) {\n        const earliestTime = toolsWithTime[0].time;\n        // Tools within first minute are considered initial\n        toolsWithTime\n          .filter((t) => t.time! - earliestTime! < 60000)\n          .forEach((t) => initialTools.add(t.name));\n      }\n    }\n\n    return initialTools;\n  }\n\n  private getLaterTools(session: MCPSession, initialTools: Set<string>): any[] {\n    return session.tools.filter((tool: any) => {\n      const name = this.getToolName(tool);\n      return !initialTools.has(name);\n    });\n  }\n\n  private getTimestamp(tool: any): number | null {\n    const ts = tool.timestamp || tool.created || tool.addedAt || tool.created_at;\n    if (!ts) return null;\n\n    if (typeof ts === 'number') return ts;\n    if (typeof ts === 'string') {\n      const parsed = new Date(ts).getTime();\n      return isNaN(parsed) ? null : parsed;\n    }\n\n    return null;\n  }\n\n  private isDynamicTool(tool: any): boolean {\n    const indicators = [\n      /eval\\(/i,\n      /Function\\(/i,\n      /exec\\(/i,\n      /new Function/i,\n      /code.*execute/i,\n      /dynamic.*generate/i,\n    ];\n\n    const toolStr = JSON.stringify(tool);\n\n    return indicators.some((pattern) => pattern.test(toolStr));\n  }\n\n  private hasAuthorizationMetadata(tool: any): boolean {\n    return !!(\n      tool.approved ||\n      tool.authorized ||\n      tool.validated ||\n      tool.verified ||\n      tool.authorization ||\n      tool.metadata?.approved\n    );\n  }\n\n  private sanitizeTool(tool: any): any {\n    return {\n      name: this.getToolName(tool),\n      description: tool.description || tool.desc || '',\n      timestamp: tool.timestamp || tool.created || tool.addedAt || tool.created_at,\n      authorized: this.hasAuthorizationMetadata(tool),\n    };\n  }\n}\n","import type { Detector, MCPSession, Finding } from '../../types/index.js';\nimport { generateFindingId } from '../../utils/helpers.js';\n\n// Suspicious parameter patterns\nconst SUSPICIOUS_PATTERNS = [\n  { pattern: /sh|bash|cmd|powershell|zsh/i, name: 'Shell Command', severity: 'CRITICAL' as const },\n  { pattern: /rm\\s+-rf|del\\s+\\/|format\\s+/i, name: 'Destructive Command', severity: 'CRITICAL' as const },\n  { pattern: /\\|\\||&&|;|\\|/g, name: 'Command Chaining', severity: 'HIGH' as const },\n  { pattern: /\\$\\(|\\`|eval|exec/i, name: 'Command Injection', severity: 'CRITICAL' as const },\n  { pattern: /\\.\\.\\/|\\.\\.\\\\|\\.\\.\\//g, name: 'Path Traversal', severity: 'HIGH' as const },\n  { pattern: /\\/etc\\/passwd|\\/etc\\/shadow|SAM|SYSTEM/i, name: 'Sensitive File Access', severity: 'CRITICAL' as const },\n  { pattern: /curl|wget|fetch.*http/i, name: 'Remote Fetch', severity: 'MEDIUM' as const },\n  { pattern: /base64|hex|encode|decode/i, name: 'Encoding/Obfuscation', severity: 'MEDIUM' as const },\n  { pattern: /<script|javascript:|onerror=/i, name: 'XSS Pattern', severity: 'HIGH' as const },\n  { pattern: /union.*select|drop.*table|insert.*into/i, name: 'SQL Injection', severity: 'CRITICAL' as const },\n];\n\nexport class SuspiciousParametersDetector implements Detector {\n  name = 'Suspicious Parameters Detector';\n  category = 'tool_poisoning' as const;\n\n  async detect(session: MCPSession): Promise<Finding[]> {\n    const findings: Finding[] = [];\n\n    for (const tool of session.tools) {\n      const toolName = this.getToolName(tool);\n      const parameters = this.extractParameters(tool);\n\n      for (const param of parameters) {\n        // Check parameter name and description\n        const paramInfo = `${param.name} ${param.description || ''} ${param.type || ''}`;\n\n        for (const suspicious of SUSPICIOUS_PATTERNS) {\n          if (suspicious.pattern.test(paramInfo)) {\n            findings.push({\n              id: generateFindingId(),\n              category: 'tool_poisoning',\n              severity: suspicious.severity,\n              title: `Suspicious Tool Parameter: ${suspicious.name}`,\n              description: `Tool \"${toolName}\" has a parameter with suspicious pattern: ${suspicious.name}`,\n              details: `Parameter: ${param.name}\\nType: ${param.type || 'unknown'}\\nDescription: ${param.description || 'none'}`,\n              recommendation: 'Review and sanitize tool parameters to prevent injection attacks',\n              evidence: {\n                tool: toolName,\n                parameter: param.name,\n                pattern: suspicious.name,\n                parameterDetails: param,\n              },\n            });\n          }\n        }\n\n        // Check default values\n        if (param.default) {\n          const defaultStr = String(param.default);\n\n          for (const suspicious of SUSPICIOUS_PATTERNS) {\n            if (suspicious.pattern.test(defaultStr)) {\n              findings.push({\n                id: generateFindingId(),\n                category: 'tool_poisoning',\n                severity: suspicious.severity,\n                title: `Suspicious Default Value: ${suspicious.name}`,\n                description: `Tool \"${toolName}\" parameter \"${param.name}\" has suspicious default value`,\n                details: `Default value: ${this.truncate(defaultStr, 200)}`,\n                recommendation: 'Remove or sanitize suspicious default values from tool parameters',\n                evidence: {\n                  tool: toolName,\n                  parameter: param.name,\n                  pattern: suspicious.name,\n                  defaultValue: this.truncate(defaultStr, 500),\n                },\n              });\n            }\n          }\n        }\n\n        // Check for unbounded string parameters (potential for injection)\n        if (this.isUnboundedString(param)) {\n          findings.push({\n            id: generateFindingId(),\n            category: 'tool_poisoning',\n            severity: 'MEDIUM',\n            title: 'Unbounded String Parameter',\n            description: `Tool \"${toolName}\" parameter \"${param.name}\" accepts unbounded string input`,\n            details: `This parameter has no length limit or validation, increasing injection risk`,\n            recommendation: 'Add length limits and input validation to all string parameters',\n            evidence: {\n              tool: toolName,\n              parameter: param.name,\n              parameterDetails: param,\n            },\n          });\n        }\n      }\n\n      // Check for tools that accept arbitrary code/scripts\n      if (this.acceptsArbitraryCode(tool)) {\n        findings.push({\n          id: generateFindingId(),\n          category: 'tool_poisoning',\n          severity: 'CRITICAL',\n          title: 'Tool Accepts Arbitrary Code',\n          description: `Tool \"${toolName}\" accepts arbitrary code or script parameters`,\n          details: `This tool can execute user-provided code, creating severe security risk`,\n          recommendation: 'Disable or heavily restrict tools that execute arbitrary code',\n          evidence: {\n            tool: toolName,\n            toolConfig: this.sanitizeTool(tool),\n          },\n        });\n      }\n    }\n\n    return findings;\n  }\n\n  private getToolName(tool: any): string {\n    return tool.name || tool.id || tool.function?.name || 'unknown';\n  }\n\n  private extractParameters(tool: any): Array<{\n    name: string;\n    type?: string;\n    description?: string;\n    default?: any;\n    required?: boolean;\n  }> {\n    const params: Array<{\n      name: string;\n      type?: string;\n      description?: string;\n      default?: any;\n      required?: boolean;\n    }> = [];\n\n    const paramsObj = tool.parameters || tool.params || tool.args || tool.function?.parameters;\n\n    if (!paramsObj) return params;\n\n    // Handle OpenAPI-style schema\n    if (paramsObj.properties) {\n      for (const [name, schema] of Object.entries(paramsObj.properties)) {\n        const s: any = schema;\n        params.push({\n          name,\n          type: s.type,\n          description: s.description,\n          default: s.default,\n          required: paramsObj.required?.includes(name),\n        });\n      }\n    }\n\n    // Handle array of parameters\n    if (Array.isArray(paramsObj)) {\n      for (const param of paramsObj) {\n        params.push({\n          name: param.name || 'unknown',\n          type: param.type,\n          description: param.description,\n          default: param.default,\n          required: param.required,\n        });\n      }\n    }\n\n    return params;\n  }\n\n  private isUnboundedString(param: { type?: string; description?: string }): boolean {\n    if (param.type !== 'string') return false;\n\n    const desc = param.description?.toLowerCase() || '';\n\n    // If description explicitly mentions validation, it's probably bounded\n    if (desc.includes('validated') || desc.includes('limited') || desc.includes('max')) {\n      return false;\n    }\n\n    // Check if it's a known unbounded pattern\n    return (\n      desc.includes('any') ||\n      desc.includes('arbitrary') ||\n      desc.includes('free form') ||\n      desc.includes('freeform')\n    );\n  }\n\n  private acceptsArbitraryCode(tool: any): boolean {\n    const toolStr = JSON.stringify(tool).toLowerCase();\n\n    const codeExecutionIndicators = [\n      'execute code',\n      'run code',\n      'eval code',\n      'execute script',\n      'run script',\n      'arbitrary code',\n      'code execution',\n      'execute command',\n    ];\n\n    return codeExecutionIndicators.some((indicator) => toolStr.includes(indicator));\n  }\n\n  private sanitizeTool(tool: any): any {\n    return {\n      name: this.getToolName(tool),\n      description: tool.description || tool.desc || '',\n      parameters: this.extractParameters(tool),\n    };\n  }\n\n  private truncate(text: string, maxLength: number): string {\n    if (text.length <= maxLength) {\n      return text;\n    }\n    return text.slice(0, maxLength) + '...';\n  }\n}\n","export { BroadPermissionsDetector } from './broad-permissions.js';\nexport { RuntimeAdditionsDetector } from './runtime-additions.js';\nexport { SuspiciousParametersDetector } from './suspicious-parameters.js';\n\nimport { BroadPermissionsDetector } from './broad-permissions.js';\nimport { RuntimeAdditionsDetector } from './runtime-additions.js';\nimport { SuspiciousParametersDetector } from './suspicious-parameters.js';\nimport type { Detector } from '../../types/index.js';\n\nexport function getAllToolDetectors(): Detector[] {\n  return [\n    new BroadPermissionsDetector(),\n    new RuntimeAdditionsDetector(),\n    new SuspiciousParametersDetector(),\n  ];\n}\n","export * from './memory/index.js';\nexport * from './tools/index.js';\n\nimport { getAllMemoryDetectors } from './memory/index.js';\nimport { getAllToolDetectors } from './tools/index.js';\nimport type { Detector } from '../types/index.js';\n\nexport function getAllDetectors(): Detector[] {\n  return [...getAllMemoryDetectors(), ...getAllToolDetectors()];\n}\n","import type { ComplianceChecker, MCPSession, Finding, ComplianceStatus } from '../types/index.js';\n\n// NIST AI RMF 1.0 framework maps to 4 functions: Govern, Map, Measure, Manage\nexport class NISTAIRMFChecker implements ComplianceChecker {\n  name = 'NIST AI RMF 1.0';\n\n  async check(session: MCPSession, findings: Finding[]): Promise<ComplianceStatus> {\n    // Check critical requirements\n    const hasCriticalFindings = findings.some((f) => f.severity === 'CRITICAL');\n    const hasHighFindings = findings.some((f) => f.severity === 'HIGH');\n\n    // NIST AI RMF requires:\n    // - Govern: Documented policies and risk management\n    // - Map: Identified risks and context\n    // - Measure: Testing and validation\n    // - Manage: Ongoing monitoring and response\n\n    const hasGovernance = this.checkGovernance(session);\n    const hasMapping = this.checkMapping(session, findings);\n    const hasMeasurement = this.checkMeasurement(session);\n    const hasManagement = this.checkManagement(session);\n\n    if (hasCriticalFindings) {\n      return 'FAIL'; // Critical vulnerabilities = automatic fail\n    }\n\n    if (!hasGovernance || !hasMapping) {\n      return 'FAIL'; // Missing core requirements\n    }\n\n    if (hasHighFindings || !hasMeasurement || !hasManagement) {\n      return 'PARTIAL'; // Some issues or missing components\n    }\n\n    return 'PASS';\n  }\n\n  private checkGovernance(session: MCPSession): boolean {\n    // Check if session has governance metadata\n    return !!(\n      session.metadata?.governance ||\n      session.metadata?.policies ||\n      session.metadata?.risk_management\n    );\n  }\n\n  private checkMapping(_session: MCPSession, findings: Finding[]): boolean {\n    // Risk mapping is done - we identified risks through scanning\n    return findings.length >= 0; // Always true after scan\n  }\n\n  private checkMeasurement(session: MCPSession): boolean {\n    // Check if there's evidence of testing/validation\n    return !!(\n      session.metadata?.testing ||\n      session.metadata?.validation ||\n      session.metadata?.audit_history\n    );\n  }\n\n  private checkManagement(session: MCPSession): boolean {\n    // Check if there's evidence of ongoing monitoring\n    return !!(\n      session.metadata?.monitoring ||\n      session.metadata?.alerts ||\n      session.metadata?.incident_response\n    );\n  }\n}\n","import type { ComplianceChecker, MCPSession, Finding, ComplianceStatus } from '../types/index.js';\n\n// ISO/IEC 42001 - AI Management System\nexport class ISO42001Checker implements ComplianceChecker {\n  name = 'ISO/IEC 42001';\n\n  async check(session: MCPSession, findings: Finding[]): Promise<ComplianceStatus> {\n    // ISO 42001 key requirements:\n    // - Risk assessment and management\n    // - Data governance\n    // - AI system transparency\n    // - Continuous monitoring\n    // - Incident management\n\n    const hasCriticalFindings = findings.some((f) => f.severity === 'CRITICAL');\n    const hasHighFindings = findings.some((f) => f.severity === 'HIGH');\n    const hasMediumFindings = findings.some((f) => f.severity === 'MEDIUM');\n\n    const hasRiskManagement = this.checkRiskManagement(session);\n    const hasDataGovernance = this.checkDataGovernance(session);\n    const hasTransparency = this.checkTransparency(session);\n    const hasMonitoring = this.checkMonitoring(session);\n    const hasIncidentManagement = this.checkIncidentManagement(session);\n\n    if (hasCriticalFindings) {\n      return 'FAIL';\n    }\n\n    const passedChecks = [\n      hasRiskManagement,\n      hasDataGovernance,\n      hasTransparency,\n      hasMonitoring,\n      hasIncidentManagement,\n    ].filter(Boolean).length;\n\n    if (hasHighFindings || passedChecks < 3) {\n      return 'FAIL';\n    }\n\n    if (hasMediumFindings || passedChecks < 5) {\n      return 'PARTIAL';\n    }\n\n    return 'PASS';\n  }\n\n  private checkRiskManagement(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.risk_assessment ||\n      session.metadata?.risk_management ||\n      session.metadata?.threat_model\n    );\n  }\n\n  private checkDataGovernance(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.data_governance ||\n      session.metadata?.data_policy ||\n      session.metadata?.data_classification\n    );\n  }\n\n  private checkTransparency(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.documentation ||\n      session.metadata?.explainability ||\n      session.metadata?.transparency\n    );\n  }\n\n  private checkMonitoring(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.monitoring ||\n      session.metadata?.logging ||\n      session.metadata?.audit_trail\n    );\n  }\n\n  private checkIncidentManagement(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.incident_response ||\n      session.metadata?.incident_management ||\n      session.metadata?.incident_plan\n    );\n  }\n}\n","import type { ComplianceChecker, MCPSession, Finding, ComplianceStatus } from '../types/index.js';\n\n// SOC 2 Trust Service Criteria for AI systems\nexport class SOC2Checker implements ComplianceChecker {\n  name = 'SOC 2 AI';\n\n  async check(session: MCPSession, findings: Finding[]): Promise<ComplianceStatus> {\n    // SOC 2 Trust Service Criteria:\n    // - Security (CC6): System protected against unauthorized access\n    // - Availability (A1): System available for operation and use\n    // - Processing Integrity (PI1): System processing is complete, valid, accurate, timely\n    // - Confidentiality (C1): Confidential information protected\n    // - Privacy (P1): Personal information collected, used, retained, disclosed, and disposed\n\n    const hasCriticalFindings = findings.some((f) => f.severity === 'CRITICAL');\n    const hasHighFindings = findings.some((f) => f.severity === 'HIGH');\n\n    // Check for specific SOC 2 violations\n    const hasSecurityViolations = this.checkSecurityViolations(findings);\n    const hasIntegrityViolations = this.checkIntegrityViolations(findings);\n    const hasConfidentialityViolations = this.checkConfidentialityViolations(findings);\n\n    const hasSecurityControls = this.checkSecurityControls(session);\n    const hasAccessControls = this.checkAccessControls(session);\n    const hasAuditLogging = this.checkAuditLogging(session);\n\n    if (hasCriticalFindings || hasSecurityViolations) {\n      return 'FAIL';\n    }\n\n    if (\n      hasHighFindings ||\n      hasIntegrityViolations ||\n      hasConfidentialityViolations ||\n      !hasSecurityControls ||\n      !hasAccessControls\n    ) {\n      return 'PARTIAL';\n    }\n\n    if (!hasAuditLogging) {\n      return 'PARTIAL';\n    }\n\n    return 'PASS';\n  }\n\n  private checkSecurityViolations(findings: Finding[]): boolean {\n    // Check for security-related findings\n    const securityKeywords = [\n      'injection',\n      'execution',\n      'unauthorized',\n      'malicious',\n      'exploit',\n      'shell',\n      'command',\n    ];\n\n    return findings.some((f) => {\n      const text = `${f.title} ${f.description}`.toLowerCase();\n      return securityKeywords.some((kw) => text.includes(kw)) && f.severity === 'CRITICAL';\n    });\n  }\n\n  private checkIntegrityViolations(findings: Finding[]): boolean {\n    // Check for data integrity issues\n    const integrityKeywords = ['poisoning', 'manipulation', 'tampering', 'corruption', 'drift'];\n\n    return findings.some((f) => {\n      const text = `${f.title} ${f.description}`.toLowerCase();\n      return integrityKeywords.some((kw) => text.includes(kw));\n    });\n  }\n\n  private checkConfidentialityViolations(findings: Finding[]): boolean {\n    // Check for confidentiality issues\n    const confidentialityKeywords = ['exfiltration', 'leak', 'exposure', 'disclosure'];\n\n    return findings.some((f) => {\n      const text = `${f.title} ${f.description}`.toLowerCase();\n      return confidentialityKeywords.some((kw) => text.includes(kw));\n    });\n  }\n\n  private checkSecurityControls(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.security_controls ||\n      session.metadata?.security_policy ||\n      session.metadata?.encryption\n    );\n  }\n\n  private checkAccessControls(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.access_control ||\n      session.metadata?.authentication ||\n      session.metadata?.authorization\n    );\n  }\n\n  private checkAuditLogging(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.audit_log ||\n      session.metadata?.logging ||\n      session.metadata?.audit_trail\n    );\n  }\n}\n","import type { ComplianceChecker, MCPSession, Finding, ComplianceStatus } from '../types/index.js';\n\n// EU AI Act - High-Risk AI Systems Requirements\nexport class EUAIActChecker implements ComplianceChecker {\n  name = 'EU AI Act High-Risk';\n\n  async check(session: MCPSession, findings: Finding[]): Promise<ComplianceStatus> {\n    // EU AI Act requirements for high-risk systems:\n    // - Risk management system\n    // - Data governance and management\n    // - Technical documentation\n    // - Record-keeping\n    // - Transparency and information to users\n    // - Human oversight\n    // - Accuracy, robustness, and cybersecurity\n\n    const hasCriticalFindings = findings.some((f) => f.severity === 'CRITICAL');\n    const hasHighFindings = findings.some((f) => f.severity === 'HIGH');\n\n    // Check critical requirements\n    const hasRiskManagement = this.checkRiskManagement(session);\n    const hasDataGovernance = this.checkDataGovernance(session);\n    const hasDocumentation = this.checkDocumentation(session);\n    const hasRecordKeeping = this.checkRecordKeeping(session);\n    const hasTransparency = this.checkTransparency(session);\n    const hasHumanOversight = this.checkHumanOversight(session);\n    const hasCybersecurity = this.checkCybersecurity(session, findings);\n\n    if (hasCriticalFindings || !hasCybersecurity) {\n      return 'FAIL'; // Critical vulnerabilities = not secure\n    }\n\n    const passedChecks = [\n      hasRiskManagement,\n      hasDataGovernance,\n      hasDocumentation,\n      hasRecordKeeping,\n      hasTransparency,\n      hasHumanOversight,\n    ].filter(Boolean).length;\n\n    if (hasHighFindings || passedChecks < 4) {\n      return 'FAIL';\n    }\n\n    if (passedChecks < 6) {\n      return 'PARTIAL';\n    }\n\n    return 'PASS';\n  }\n\n  private checkRiskManagement(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.risk_management ||\n      session.metadata?.risk_assessment ||\n      session.metadata?.risk_mitigation\n    );\n  }\n\n  private checkDataGovernance(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.data_governance ||\n      session.metadata?.data_quality ||\n      session.metadata?.training_data\n    );\n  }\n\n  private checkDocumentation(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.documentation ||\n      session.metadata?.technical_documentation ||\n      session.metadata?.system_description\n    );\n  }\n\n  private checkRecordKeeping(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.logging ||\n      session.metadata?.audit_trail ||\n      session.metadata?.record_keeping\n    );\n  }\n\n  private checkTransparency(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.transparency ||\n      session.metadata?.explainability ||\n      session.metadata?.user_information\n    );\n  }\n\n  private checkHumanOversight(session: MCPSession): boolean {\n    return !!(\n      session.metadata?.human_oversight ||\n      session.metadata?.human_in_the_loop ||\n      session.metadata?.review_process\n    );\n  }\n\n  private checkCybersecurity(session: MCPSession, findings: Finding[]): boolean {\n    // If there are critical security findings, cybersecurity is not adequate\n    const hasCriticalSecurity = findings.some(\n      (f) =>\n        f.severity === 'CRITICAL' &&\n        (f.category === 'memory_poisoning' || f.category === 'tool_poisoning')\n    );\n\n    if (hasCriticalSecurity) {\n      return false;\n    }\n\n    // Check for security controls\n    return !!(\n      session.metadata?.cybersecurity ||\n      session.metadata?.security_measures ||\n      session.metadata?.security_controls\n    );\n  }\n}\n","export { NISTAIRMFChecker } from './nist-ai-rmf.js';\nexport { ISO42001Checker } from './iso-42001.js';\nexport { SOC2Checker } from './soc2.js';\nexport { EUAIActChecker } from './eu-ai-act.js';\n\nimport { NISTAIRMFChecker } from './nist-ai-rmf.js';\nimport { ISO42001Checker } from './iso-42001.js';\nimport { SOC2Checker } from './soc2.js';\nimport { EUAIActChecker } from './eu-ai-act.js';\nimport type { MCPSession, Finding, ComplianceResults } from '../types/index.js';\n\nexport async function runComplianceChecks(\n  session: MCPSession,\n  findings: Finding[]\n): Promise<ComplianceResults> {\n  const nist = new NISTAIRMFChecker();\n  const iso = new ISO42001Checker();\n  const soc2 = new SOC2Checker();\n  const euAiAct = new EUAIActChecker();\n\n  const [nistResult, isoResult, soc2Result, euResult] = await Promise.all([\n    nist.check(session, findings),\n    iso.check(session, findings),\n    soc2.check(session, findings),\n    euAiAct.check(session, findings),\n  ]);\n\n  return {\n    nist_ai_rmf: nistResult,\n    iso_42001: isoResult,\n    soc2_ai: soc2Result,\n    eu_ai_act_high_risk: euResult,\n  };\n}\n","import type {\n  MCPConnection,\n  MCPSession,\n  Finding,\n  AuditReport,\n  MCPServerConfig,\n} from './types/index.js';\nimport { createConnector } from './connectors/index.js';\nimport { getAllDetectors } from './detectors/index.js';\nimport { runComplianceChecks } from './compliance/index.js';\nimport { generateAuditId, calculateRiskScore, getRiskLevel } from './utils/helpers.js';\n\nexport class Auditor {\n  private config: MCPServerConfig;\n  private connector?: MCPConnection;\n\n  constructor(config: MCPServerConfig) {\n    this.config = config;\n  }\n\n  async audit(): Promise<AuditReport> {\n    // 1. Connect to MCP server\n    this.connector = createConnector(this.config);\n    await this.connector.connect();\n\n    // 2. Get session data\n    const session: MCPSession = await this.connector.getSession();\n\n    // 3. Run all detectors\n    const detectors = getAllDetectors();\n    const allFindings: Finding[] = [];\n\n    for (const detector of detectors) {\n      try {\n        const findings = await detector.detect(session);\n        allFindings.push(...findings);\n      } catch (error) {\n        console.error(`Detector ${detector.name} failed:`, error);\n        // Continue with other detectors\n      }\n    }\n\n    // 4. Run compliance checks\n    const compliance = await runComplianceChecks(session, allFindings);\n\n    // 5. Calculate risk score\n    const criticalCount = allFindings.filter((f) => f.severity === 'CRITICAL').length;\n    const highCount = allFindings.filter((f) => f.severity === 'HIGH').length;\n    const mediumCount = allFindings.filter((f) => f.severity === 'MEDIUM').length;\n    const lowCount = allFindings.filter((f) => f.severity === 'LOW').length;\n\n    const riskScore = calculateRiskScore(criticalCount, highCount, mediumCount, lowCount);\n    const overallRisk = getRiskLevel(riskScore);\n\n    // 6. Generate recommendations\n    const recommendations = this.generateRecommendations(allFindings, compliance);\n\n    // 7. Disconnect\n    await this.connector.disconnect();\n\n    // 8. Build report\n    const report: AuditReport = {\n      audit_id: generateAuditId(),\n      version: '0.2.0',\n      timestamp: new Date().toISOString(),\n      mcp_server_url: this.config.url || this.config.file || 'local',\n      overall_risk: overallRisk,\n      risk_score_0_100: riskScore,\n      findings_count: allFindings.length,\n      critical_findings: criticalCount,\n      memory_poisoning_detected: allFindings.some((f) => f.category === 'memory_poisoning'),\n      tool_poisoning_detected: allFindings.some((f) => f.category === 'tool_poisoning'),\n      compliance,\n      findings: allFindings,\n      recommendations,\n      deepsweep_promo: `Prevent these attacks automatically → https://platform.deepsweep.ai?ref=cli&risk=${overallRisk.toLowerCase()}`,\n    };\n\n    return report;\n  }\n\n  private generateRecommendations(\n    findings: Finding[],\n    compliance: any\n  ): string[] {\n    const recommendations: string[] = [];\n\n    // Critical findings recommendations\n    const criticalFindings = findings.filter((f) => f.severity === 'CRITICAL');\n    if (criticalFindings.length > 0) {\n      recommendations.push(\n        `Immediate: Address ${criticalFindings.length} critical security vulnerabilities before deploying to production`\n      );\n\n      // Memory poisoning specific\n      if (criticalFindings.some((f) => f.category === 'memory_poisoning')) {\n        recommendations.push('Immediate: Implement input validation and sanitization for all memory writes');\n        recommendations.push('Immediate: Deploy memory integrity checking to prevent poisoning attacks');\n      }\n\n      // Tool poisoning specific\n      if (criticalFindings.some((f) => f.category === 'tool_poisoning')) {\n        recommendations.push('Immediate: Restrict tool permissions to principle of least privilege');\n        recommendations.push('Immediate: Implement runtime tool validation and approval workflows');\n      }\n    }\n\n    // Compliance recommendations\n    if (compliance.nist_ai_rmf === 'FAIL') {\n      recommendations.push('Implement NIST AI RMF governance and risk management framework');\n    }\n    if (compliance.iso_42001 === 'FAIL') {\n      recommendations.push('Establish ISO 42001 AI management system controls');\n    }\n    if (compliance.eu_ai_act_high_risk === 'FAIL') {\n      recommendations.push(\n        'Address EU AI Act high-risk requirements including human oversight and documentation'\n      );\n    }\n\n    // General recommendations with risk-based CTAs\n    if (findings.length > 0) {\n      recommendations.push('Deploy continuous monitoring and alerting for MCP server security');\n\n      const riskLevel = this.calculateRiskLevel(criticalFindings.length, findings.length);\n      const criticalCount = criticalFindings.length;\n\n      if (riskLevel === 'critical' || riskLevel === 'high') {\n        recommendations.push(\n          `Deploy DeepSweep Platform for real-time protection across any AI framework → https://platform.deepsweep.ai?ref=cli&risk=${riskLevel}&findings=${criticalCount}`\n        );\n      } else {\n        recommendations.push(\n          `Consider DeepSweep Platform for enterprise-grade protection → https://platform.deepsweep.ai?ref=cli&risk=${riskLevel}`\n        );\n      }\n    }\n\n    // If no findings\n    if (findings.length === 0) {\n      recommendations.push('Continue regular security audits to maintain security posture');\n      recommendations.push(\n        'Consider DeepSweep Platform for continuous monitoring and team collaboration → https://platform.deepsweep.ai?ref=cli&risk=low'\n      );\n    }\n\n    return recommendations;\n  }\n\n  private calculateRiskLevel(criticalCount: number, totalFindings: number): string {\n    if (criticalCount > 0) {\n      return 'critical';\n    }\n    const highCount = totalFindings - criticalCount;\n    if (highCount >= 5) {\n      return 'high';\n    }\n    if (totalFindings > 0) {\n      return 'medium';\n    }\n    return 'low';\n  }\n}\n","import { writeFile } from 'fs/promises';\nimport type { AuditReport } from '../types/index.js';\n\nexport async function generateJSONReport(\n  report: AuditReport,\n  outputPath: string\n): Promise<void> {\n  await writeFile(outputPath, JSON.stringify(report, null, 2), 'utf-8');\n}\n","import chalk from 'chalk';\nimport type { AuditReport, RiskLevel } from '../types/index.js';\n\nexport function generateConsoleReport(report: AuditReport): string {\n  const lines: string[] = [];\n\n  // Header\n  lines.push('');\n  lines.push(chalk.bold.cyan('═══════════════════════════════════════════════════════'));\n  lines.push(chalk.bold.cyan('    DeepSweep.ai Auditor v0.2.0 - MCP Security Audit'));\n  lines.push(chalk.bold.cyan('═══════════════════════════════════════════════════════'));\n  lines.push('');\n\n  // Server info\n  lines.push(chalk.gray(`Server: ${report.mcp_server_url}`));\n  lines.push(chalk.gray(`Audit ID: ${report.audit_id}`));\n  lines.push(chalk.gray(`Timestamp: ${new Date(report.timestamp).toLocaleString()}`));\n  lines.push('');\n\n  // Risk score\n  const riskColor = getRiskColor(report.overall_risk);\n  lines.push(chalk.bold('Overall Risk: ') + riskColor(report.overall_risk));\n  lines.push(chalk.bold('Risk Score: ') + riskColor(`${report.risk_score_0_100}/100`));\n  lines.push('');\n\n  // Findings summary\n  lines.push(chalk.bold('Findings Summary:'));\n  lines.push(`  Total Findings: ${report.findings_count}`);\n  lines.push(`  ${chalk.red('Critical')}: ${report.critical_findings}`);\n  lines.push(\n    `  ${chalk.yellow('High')}: ${report.findings.filter((f) => f.severity === 'HIGH').length}`\n  );\n  lines.push(\n    `  ${chalk.blue('Medium')}: ${report.findings.filter((f) => f.severity === 'MEDIUM').length}`\n  );\n  lines.push(\n    `  ${chalk.gray('Low')}: ${report.findings.filter((f) => f.severity === 'LOW').length}`\n  );\n  lines.push('');\n\n  // Threat detection\n  lines.push(chalk.bold('Threat Detection:'));\n  lines.push(\n    `  Memory Poisoning: ${report.memory_poisoning_detected ? chalk.red('DETECTED') : chalk.green('NONE')}`\n  );\n  lines.push(\n    `  Tool Poisoning: ${report.tool_poisoning_detected ? chalk.red('DETECTED') : chalk.green('NONE')}`\n  );\n  lines.push('');\n\n  // Compliance\n  lines.push(chalk.bold('Compliance Status:'));\n  lines.push(`  NIST AI RMF: ${getComplianceIcon(report.compliance.nist_ai_rmf)}`);\n  lines.push(`  ISO 42001: ${getComplianceIcon(report.compliance.iso_42001)}`);\n  lines.push(`  SOC2 AI: ${getComplianceIcon(report.compliance.soc2_ai)}`);\n  lines.push(`  EU AI Act: ${getComplianceIcon(report.compliance.eu_ai_act_high_risk)}`);\n  lines.push('');\n\n  // Critical findings details\n  const criticalFindings = report.findings.filter((f) => f.severity === 'CRITICAL');\n  if (criticalFindings.length > 0) {\n    lines.push(chalk.bold.red('Critical Findings:'));\n    criticalFindings.slice(0, 5).forEach((finding, index) => {\n      lines.push(chalk.red(`  ${index + 1}. ${finding.title}`));\n      lines.push(chalk.gray(`     ${finding.description}`));\n    });\n    if (criticalFindings.length > 5) {\n      lines.push(chalk.gray(`  ... and ${criticalFindings.length - 5} more`));\n    }\n    lines.push('');\n  }\n\n  // Recommendations\n  if (report.recommendations.length > 0) {\n    lines.push(chalk.bold('Recommendations:'));\n    report.recommendations.slice(0, 5).forEach((rec, index) => {\n      lines.push(chalk.yellow(`  ${index + 1}. ${rec}`));\n    });\n    lines.push('');\n  }\n\n  // Footer - Risk-based CTA\n  lines.push(chalk.bold.cyan('───────────────────────────────────────────────────────'));\n\n  // Risk-based messaging with UTM tracking\n  const riskLevel = report.overall_risk.toLowerCase();\n  const criticalCount = report.critical_findings;\n\n  if (report.overall_risk === 'CRITICAL' || report.overall_risk === 'HIGH') {\n    lines.push('');\n    lines.push(chalk.bold.red('⚠️  CRITICAL VULNERABILITIES DETECTED'));\n    lines.push('');\n    lines.push(chalk.bold('🛡️  Stop attacks before they happen with DeepSweep Memory Firewall'));\n    lines.push(chalk.gray('   Real-time protection • Universal AI framework support • Deploy in minutes'));\n    lines.push('');\n    lines.push(chalk.cyan(`   Get started now → https://platform.deepsweep.ai?ref=cli&risk=${riskLevel}&findings=${criticalCount}`));\n    lines.push('');\n    lines.push(chalk.gray('   Trusted by US security teams protecting production AI agents • Built in America'));\n  } else {\n    lines.push('');\n    lines.push(chalk.bold('🛡️  Prevent these attacks with DeepSweep Memory Firewall'));\n    lines.push(chalk.gray('   US-based AI security • Universal framework support • Enterprise-grade protection'));\n    lines.push('');\n    lines.push(chalk.cyan(`   Learn more → https://platform.deepsweep.ai?ref=cli&risk=${riskLevel}`));\n  }\n\n  lines.push(chalk.bold.cyan('───────────────────────────────────────────────────────'));\n  lines.push('');\n\n  return lines.join('\\n');\n}\n\nfunction getRiskColor(risk: RiskLevel): (text: string) => string {\n  switch (risk) {\n    case 'CRITICAL':\n      return chalk.bold.red;\n    case 'HIGH':\n      return chalk.red;\n    case 'MEDIUM':\n      return chalk.yellow;\n    case 'LOW':\n      return chalk.green;\n  }\n}\n\nfunction getComplianceIcon(status: string): string {\n  switch (status) {\n    case 'PASS':\n      return chalk.green('✓ PASS');\n    case 'PARTIAL':\n      return chalk.yellow('⚠ PARTIAL');\n    case 'FAIL':\n      return chalk.red('✗ FAIL');\n    default:\n      return chalk.gray('- UNKNOWN');\n  }\n}\n","import { writeFile } from 'fs/promises';\nimport Handlebars from 'handlebars';\nimport type { AuditReport } from '../types/index.js';\n\nconst HTML_TEMPLATE = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>DeepSweep.ai Audit Report - {{audit_id}}</title>\n    <style>\n        * { margin: 0; padding: 0; box-sizing: border-box; }\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            background: #f5f7fa;\n            padding: 20px;\n        }\n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            background: white;\n            border-radius: 12px;\n            box-shadow: 0 2px 24px rgba(0,0,0,0.1);\n            overflow: hidden;\n        }\n        .header {\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            padding: 40px;\n            text-align: center;\n        }\n        .header h1 { font-size: 32px; margin-bottom: 10px; }\n        .header p { opacity: 0.9; font-size: 14px; }\n        .content { padding: 40px; }\n        .summary {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 20px;\n            margin-bottom: 40px;\n        }\n        .summary-card {\n            background: #f8f9fa;\n            padding: 20px;\n            border-radius: 8px;\n            border-left: 4px solid #667eea;\n        }\n        .summary-card h3 {\n            font-size: 14px;\n            color: #666;\n            text-transform: uppercase;\n            margin-bottom: 8px;\n        }\n        .summary-card .value {\n            font-size: 28px;\n            font-weight: bold;\n            color: #333;\n        }\n        .risk-critical { color: #dc3545; border-left-color: #dc3545; }\n        .risk-high { color: #fd7e14; border-left-color: #fd7e14; }\n        .risk-medium { color: #ffc107; border-left-color: #ffc107; }\n        .risk-low { color: #28a745; border-left-color: #28a745; }\n        .section {\n            margin-bottom: 40px;\n        }\n        .section h2 {\n            font-size: 24px;\n            margin-bottom: 20px;\n            color: #333;\n            border-bottom: 2px solid #667eea;\n            padding-bottom: 10px;\n        }\n        .compliance-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 15px;\n        }\n        .compliance-item {\n            padding: 15px;\n            border-radius: 8px;\n            background: #f8f9fa;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        .badge {\n            display: inline-block;\n            padding: 4px 12px;\n            border-radius: 12px;\n            font-size: 12px;\n            font-weight: 600;\n            text-transform: uppercase;\n        }\n        .badge-pass { background: #d4edda; color: #155724; }\n        .badge-partial { background: #fff3cd; color: #856404; }\n        .badge-fail { background: #f8d7da; color: #721c24; }\n        .finding {\n            background: #f8f9fa;\n            border-left: 4px solid #ccc;\n            padding: 20px;\n            margin-bottom: 15px;\n            border-radius: 4px;\n        }\n        .finding-critical { border-left-color: #dc3545; }\n        .finding-high { border-left-color: #fd7e14; }\n        .finding-medium { border-left-color: #ffc107; }\n        .finding-low { border-left-color: #28a745; }\n        .finding h3 {\n            font-size: 18px;\n            margin-bottom: 8px;\n            color: #333;\n        }\n        .finding .meta {\n            font-size: 12px;\n            color: #666;\n            margin-bottom: 10px;\n        }\n        .finding .description {\n            margin-bottom: 10px;\n            color: #555;\n        }\n        .finding .recommendation {\n            background: #e3f2fd;\n            padding: 10px;\n            border-radius: 4px;\n            margin-top: 10px;\n            font-size: 14px;\n        }\n        .recommendations {\n            background: #fff9e6;\n            border: 1px solid #ffe082;\n            border-radius: 8px;\n            padding: 20px;\n        }\n        .recommendations ul {\n            list-style: none;\n            padding-left: 0;\n        }\n        .recommendations li {\n            padding: 8px 0;\n            padding-left: 24px;\n            position: relative;\n        }\n        .recommendations li:before {\n            content: \"→\";\n            position: absolute;\n            left: 0;\n            color: #ffa000;\n            font-weight: bold;\n        }\n        .footer {\n            background: #f8f9fa;\n            padding: 30px;\n            text-align: center;\n            border-top: 1px solid #dee2e6;\n        }\n        .footer .cta {\n            display: inline-block;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            padding: 12px 30px;\n            border-radius: 6px;\n            text-decoration: none;\n            font-weight: 600;\n            margin-top: 15px;\n        }\n        .footer .cta:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n        }\n    </style>\n\n    <!-- Google Analytics GA4 -->\n    <script async src=\"https://www.googletagmanager.com/gtag/js?id=G-JLEYLBCSB9\"></script>\n    <script>\n        window.dataLayer = window.dataLayer || [];\n        function gtag(){dataLayer.push(arguments);}\n        gtag('js', new Date());\n\n        // Configure GA4 with custom dimensions\n        gtag('config', 'G-JLEYLBCSB9', {\n            'custom_map': {\n                'dimension1': 'risk_level',\n                'dimension2': 'findings_count',\n                'dimension3': 'report_source'\n            }\n        });\n\n        // Track report viewed event\n        gtag('event', 'report_viewed', {\n            'risk_level': '{{overall_risk}}',\n            'findings_count': {{findings_count}},\n            'critical_findings': {{critical_findings}},\n            'report_source': 'html_export'\n        });\n    </script>\n</head>\n<body>\n    <!-- CTA Click Tracking -->\n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            // Track CTA button clicks\n            const ctaButton = document.querySelector('.footer .cta');\n            if (ctaButton) {\n                ctaButton.addEventListener('click', function(e) {\n                    gtag('event', 'cta_click', {\n                        'risk_level': '{{overall_risk}}',\n                        'button_text': e.target.innerText,\n                        'destination_url': e.target.href,\n                        'event_category': 'conversion',\n                        'event_label': 'firewall_cta'\n                    });\n                });\n            }\n        });\n    </script>\n    <div class=\"container\">\n        <div class=\"header\">\n            <h1>DeepSweep.ai Auditor Report</h1>\n            <p>MCP Server Security Audit</p>\n        </div>\n\n        <div class=\"content\">\n            <div class=\"summary\">\n                <div class=\"summary-card risk-{{overall_risk_class}}\">\n                    <h3>Overall Risk</h3>\n                    <div class=\"value\">{{overall_risk}}</div>\n                </div>\n                <div class=\"summary-card\">\n                    <h3>Risk Score</h3>\n                    <div class=\"value\">{{risk_score_0_100}}/100</div>\n                </div>\n                <div class=\"summary-card\">\n                    <h3>Total Findings</h3>\n                    <div class=\"value\">{{findings_count}}</div>\n                </div>\n                <div class=\"summary-card risk-critical\">\n                    <h3>Critical</h3>\n                    <div class=\"value\">{{critical_findings}}</div>\n                </div>\n            </div>\n\n            <div class=\"section\">\n                <h2>Audit Information</h2>\n                <p><strong>Server:</strong> {{mcp_server_url}}</p>\n                <p><strong>Audit ID:</strong> {{audit_id}}</p>\n                <p><strong>Timestamp:</strong> {{timestamp}}</p>\n                <p><strong>Memory Poisoning:</strong> {{#if memory_poisoning_detected}}<span style=\"color: #dc3545;\">DETECTED</span>{{else}}<span style=\"color: #28a745;\">None</span>{{/if}}</p>\n                <p><strong>Tool Poisoning:</strong> {{#if tool_poisoning_detected}}<span style=\"color: #dc3545;\">DETECTED</span>{{else}}<span style=\"color: #28a745;\">None</span>{{/if}}</p>\n            </div>\n\n            <div class=\"section\">\n                <h2>Compliance Status</h2>\n                <div class=\"compliance-grid\">\n                    <div class=\"compliance-item\">\n                        <span>NIST AI RMF</span>\n                        <span class=\"badge badge-{{compliance.nist_ai_rmf_class}}\">{{compliance.nist_ai_rmf}}</span>\n                    </div>\n                    <div class=\"compliance-item\">\n                        <span>ISO 42001</span>\n                        <span class=\"badge badge-{{compliance.iso_42001_class}}\">{{compliance.iso_42001}}</span>\n                    </div>\n                    <div class=\"compliance-item\">\n                        <span>SOC2 AI</span>\n                        <span class=\"badge badge-{{compliance.soc2_ai_class}}\">{{compliance.soc2_ai}}</span>\n                    </div>\n                    <div class=\"compliance-item\">\n                        <span>EU AI Act</span>\n                        <span class=\"badge badge-{{compliance.eu_ai_act_high_risk_class}}\">{{compliance.eu_ai_act_high_risk}}</span>\n                    </div>\n                </div>\n            </div>\n\n            {{#if critical_findings_list}}\n            <div class=\"section\">\n                <h2>Critical Findings</h2>\n                {{#each critical_findings_list}}\n                <div class=\"finding finding-critical\">\n                    <h3>{{title}}</h3>\n                    <div class=\"meta\">Severity: CRITICAL | Category: {{category}}</div>\n                    <div class=\"description\">{{description}}</div>\n                    <div class=\"recommendation\"><strong>Recommendation:</strong> {{recommendation}}</div>\n                </div>\n                {{/each}}\n            </div>\n            {{/if}}\n\n            {{#if recommendations}}\n            <div class=\"section\">\n                <h2>Recommendations</h2>\n                <div class=\"recommendations\">\n                    <ul>\n                        {{#each recommendations}}\n                        <li>{{this}}</li>\n                        {{/each}}\n                    </ul>\n                </div>\n            </div>\n            {{/if}}\n        </div>\n\n        <div class=\"footer\">\n            <p><strong>{{deepsweep_promo}}</strong></p>\n            <a href=\"https://platform.deepsweep.ai?ref=cli&risk={{overall_risk}}&source=html-report\" class=\"cta\">Get Started Now → DeepSweep Platform</a>\n            <p style=\"margin-top: 20px; font-size: 12px; color: #666;\">🇺🇸 US-based security platform • Built in America • Enterprise-grade protection</p>\n        </div>\n    </div>\n</body>\n</html>\n`;\n\nexport async function generateHTMLReport(\n  report: AuditReport,\n  outputPath: string\n): Promise<void> {\n  const template = Handlebars.compile(HTML_TEMPLATE);\n\n  const data = {\n    ...report,\n    overall_risk_class: report.overall_risk.toLowerCase(),\n    critical_findings_list: report.findings.filter((f) => f.severity === 'CRITICAL'),\n    compliance: {\n      nist_ai_rmf: report.compliance.nist_ai_rmf,\n      nist_ai_rmf_class: report.compliance.nist_ai_rmf.toLowerCase(),\n      iso_42001: report.compliance.iso_42001,\n      iso_42001_class: report.compliance.iso_42001.toLowerCase(),\n      soc2_ai: report.compliance.soc2_ai,\n      soc2_ai_class: report.compliance.soc2_ai.toLowerCase(),\n      eu_ai_act_high_risk: report.compliance.eu_ai_act_high_risk,\n      eu_ai_act_high_risk_class: report.compliance.eu_ai_act_high_risk.toLowerCase(),\n    },\n  };\n\n  const html = template(data);\n  await writeFile(outputPath, html, 'utf-8');\n}\n","import { writeFile } from 'fs/promises';\nimport { PDFDocument, rgb, StandardFonts } from 'pdf-lib';\nimport type { AuditReport } from '../types/index.js';\n\nexport async function generatePDFReport(\n  report: AuditReport,\n  outputPath: string\n): Promise<void> {\n  const pdfDoc = await PDFDocument.create();\n  const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman);\n  const timesRomanBold = await pdfDoc.embedFont(StandardFonts.TimesRomanBold);\n\n  let page = pdfDoc.addPage([595, 842]); // A4 size\n  const { width, height } = page.getSize();\n  let yPosition = height - 50;\n\n  const drawText = (text: string, options: any = {}) => {\n    const {\n      font = timesRomanFont,\n      size = 12,\n      color = rgb(0, 0, 0),\n      x = 50,\n      maxWidth = width - 100,\n    } = options;\n\n    if (yPosition < 50) {\n      page = pdfDoc.addPage([595, 842]);\n      yPosition = height - 50;\n    }\n\n    page.drawText(text, { x, y: yPosition, size, font, color, maxWidth });\n    yPosition -= size + 5;\n  };\n\n  // Title\n  drawText('DeepSweep.ai Auditor Report', { font: timesRomanBold, size: 24, color: rgb(0.4, 0.4, 0.7) });\n  drawText('MCP Server Security Audit', { size: 14, color: rgb(0.5, 0.5, 0.5) });\n  yPosition -= 10;\n\n  // Audit info\n  drawText(`Server: ${report.mcp_server_url}`, { size: 10 });\n  drawText(`Audit ID: ${report.audit_id}`, { size: 10 });\n  drawText(`Timestamp: ${new Date(report.timestamp).toLocaleString()}`, { size: 10 });\n  yPosition -= 10;\n\n  // Risk summary\n  drawText('Risk Summary', { font: timesRomanBold, size: 16 });\n  yPosition -= 5;\n\n  const riskColor = getRiskColor(report.overall_risk);\n  drawText(`Overall Risk: ${report.overall_risk}`, { font: timesRomanBold, color: riskColor });\n  drawText(`Risk Score: ${report.risk_score_0_100}/100`, { color: riskColor });\n  drawText(`Total Findings: ${report.findings_count}`);\n  drawText(`Critical Findings: ${report.critical_findings}`, {\n    color: report.critical_findings > 0 ? rgb(0.8, 0, 0) : rgb(0, 0, 0),\n  });\n  yPosition -= 10;\n\n  // Threat detection\n  drawText('Threat Detection', { font: timesRomanBold, size: 16 });\n  yPosition -= 5;\n  drawText(`Memory Poisoning: ${report.memory_poisoning_detected ? 'DETECTED' : 'None'}`, {\n    color: report.memory_poisoning_detected ? rgb(0.8, 0, 0) : rgb(0, 0.5, 0),\n  });\n  drawText(`Tool Poisoning: ${report.tool_poisoning_detected ? 'DETECTED' : 'None'}`, {\n    color: report.tool_poisoning_detected ? rgb(0.8, 0, 0) : rgb(0, 0.5, 0),\n  });\n  yPosition -= 10;\n\n  // Compliance\n  drawText('Compliance Status', { font: timesRomanBold, size: 16 });\n  yPosition -= 5;\n  drawText(`NIST AI RMF: ${report.compliance.nist_ai_rmf}`, {\n    color: getComplianceColor(report.compliance.nist_ai_rmf),\n  });\n  drawText(`ISO 42001: ${report.compliance.iso_42001}`, {\n    color: getComplianceColor(report.compliance.iso_42001),\n  });\n  drawText(`SOC2 AI: ${report.compliance.soc2_ai}`, {\n    color: getComplianceColor(report.compliance.soc2_ai),\n  });\n  drawText(`EU AI Act: ${report.compliance.eu_ai_act_high_risk}`, {\n    color: getComplianceColor(report.compliance.eu_ai_act_high_risk),\n  });\n  yPosition -= 10;\n\n  // Critical findings\n  const criticalFindings = report.findings.filter((f) => f.severity === 'CRITICAL');\n  if (criticalFindings.length > 0) {\n    drawText('Critical Findings', { font: timesRomanBold, size: 16 });\n    yPosition -= 5;\n\n    for (const finding of criticalFindings.slice(0, 10)) {\n      drawText(`• ${finding.title}`, { font: timesRomanBold, color: rgb(0.8, 0, 0) });\n      drawText(`  ${finding.description}`, { size: 10, x: 60 });\n      yPosition -= 5;\n    }\n\n    if (criticalFindings.length > 10) {\n      drawText(`... and ${criticalFindings.length - 10} more critical findings`, {\n        size: 10,\n        color: rgb(0.5, 0.5, 0.5),\n      });\n    }\n    yPosition -= 10;\n  }\n\n  // Recommendations\n  if (report.recommendations.length > 0) {\n    drawText('Recommendations', { font: timesRomanBold, size: 16 });\n    yPosition -= 5;\n\n    for (const rec of report.recommendations.slice(0, 10)) {\n      drawText(`• ${rec}`, { size: 10, x: 60, maxWidth: width - 110 });\n      yPosition -= 5;\n    }\n  }\n\n  // Footer\n  yPosition -= 20;\n  drawText(report.deepsweep_promo, {\n    font: timesRomanBold,\n    color: rgb(0.4, 0.4, 0.7),\n    x: 50,\n  });\n  drawText('https://deepsweep.ai', { color: rgb(0.4, 0.4, 0.7), x: 50 });\n\n  const pdfBytes = await pdfDoc.save();\n  await writeFile(outputPath, pdfBytes);\n}\n\nfunction getRiskColor(risk: string) {\n  switch (risk) {\n    case 'CRITICAL':\n      return rgb(0.8, 0, 0);\n    case 'HIGH':\n      return rgb(0.8, 0.3, 0);\n    case 'MEDIUM':\n      return rgb(0.8, 0.6, 0);\n    case 'LOW':\n      return rgb(0, 0.5, 0);\n    default:\n      return rgb(0, 0, 0);\n  }\n}\n\nfunction getComplianceColor(status: string) {\n  switch (status) {\n    case 'PASS':\n      return rgb(0, 0.5, 0);\n    case 'PARTIAL':\n      return rgb(0.8, 0.6, 0);\n    case 'FAIL':\n      return rgb(0.8, 0, 0);\n    default:\n      return rgb(0, 0, 0);\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAqC;AACrC,gBAAsB;AAGf,IAAM,qBAAN,MAAkD;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAyB;AACnC,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,MACb,UAAU,CAAC;AAAA,MACX,QAAQ,CAAC;AAAA,MACT,OAAO,CAAC;AAAA,MACR,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,CAAC,KAAK,OAAO,KAAK;AACpB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,UAAM,MAAM,KAAK,OAAO;AAGxB,QAAI,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,QAAQ,GAAG;AACvD,YAAM,KAAK,iBAAiB,GAAG;AAAA,IACjC,OAAO;AACL,WAAK,YAAY,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,KAA4B;AACzD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAkC,CAAC;AAEzC,UAAI,KAAK,OAAO,QAAQ;AACtB,gBAAQ,WAAW,IAAI,KAAK,OAAO;AAAA,MACrC,WAAW,KAAK,OAAO,aAAa;AAClC,gBAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,WAAW;AAAA,MAC9D;AAEA,WAAK,WAAW,IAAI,UAAAA,QAAU,KAAK,EAAE,QAAQ,CAAC;AAE9C,WAAK,SAAS,GAAG,QAAQ,MAAM;AAE7B,aAAK,UAAU,KAAK,KAAK,UAAU;AAAA,UACjC,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,CAAC;AAAA,UACT,IAAI;AAAA,QACN,CAAC,CAAC;AACF,gBAAQ;AAAA,MACV,CAAC;AAED,WAAK,SAAS,GAAG,WAAW,CAAC,SAAyB;AACpD,YAAI;AACF,gBAAM,UAAU,KAAK,MAAM,KAAK,SAAS,CAAC;AAC1C,cAAI,QAAQ,QAAQ;AAClB,iBAAK,iBAAiB,QAAQ,MAAM;AAAA,UACtC;AAAA,QACF,SAAS,GAAG;AAAA,QAEZ;AAAA,MACF,CAAC;AAED,WAAK,SAAS,GAAG,SAAS,CAAC,UAAU;AACnC,eAAO,IAAI,MAAM,gCAAgC,MAAM,OAAO,EAAE,CAAC;AAAA,MACnE,CAAC;AAGD,iBAAW,MAAM;AACf,YAAI,KAAK,UAAU,eAAe,UAAAA,QAAU,MAAM;AAChD,iBAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,QAClD;AAAA,MACF,GAAG,GAAK;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,KAAmB;AACrC,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAEA,QAAI,KAAK,OAAO,QAAQ;AACtB,cAAQ,WAAW,IAAI,KAAK,OAAO;AAAA,IACrC,WAAW,KAAK,OAAO,aAAa;AAClC,cAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,WAAW;AAAA,IAC9D;AAEA,SAAK,aAAa,aAAAC,QAAM,OAAO;AAAA,MAC7B,SAAS;AAAA,MACT;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAkC;AACtC,QAAI,KAAK,UAAU;AACjB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,YAAY;AACnB,UAAI;AAEF,cAAM,YAAY,CAAC,YAAY,gBAAgB,gBAAgB,aAAa;AAE5E,mBAAW,YAAY,WAAW;AAChC,cAAI;AACF,kBAAM,WAAW,MAAM,KAAK,WAAW,IAAI,QAAQ;AACnD,gBAAI,SAAS,MAAM;AACjB,mBAAK,iBAAiB,SAAS,IAAI;AACnC,qBAAO,KAAK;AAAA,YACd;AAAA,UACF,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAGA,cAAM,KAAK,uBAAuB;AAClC,eAAO,KAAK;AAAA,MACd,SAAS,OAAY;AACnB,cAAM,IAAI,MAAM,gCAAgC,MAAM,OAAO,EAAE;AAAA,MACjE;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAAA,EAEA,MAAc,yBAAwC;AACpD,QAAI,CAAC,KAAK,WAAY;AAGtB,QAAI;AACF,YAAM,eAAe,MAAM,KAAK,WAAW,IAAI,WAAW;AAC1D,WAAK,QAAQ,WAAW,aAAa,KAAK,YAAY,aAAa,QAAQ,CAAC;AAAA,IAC9E,SAAS,GAAG;AAAA,IAEZ;AAGA,QAAI;AACF,YAAM,aAAa,MAAM,KAAK,WAAW,IAAI,SAAS;AACtD,WAAK,QAAQ,SAAS,WAAW,KAAK,UAAU,WAAW,QAAQ,CAAC;AAAA,IACtE,SAAS,GAAG;AACV,UAAI;AACF,cAAM,cAAc,MAAM,KAAK,WAAW,IAAI,UAAU;AACxD,aAAK,QAAQ,SAAS,YAAY,KAAK,WAAW,YAAY,QAAQ,CAAC;AAAA,MACzE,SAAS,IAAI;AAAA,MAEb;AAAA,IACF;AAGA,QAAI;AACF,YAAM,YAAY,MAAM,KAAK,WAAW,IAAI,QAAQ;AACpD,WAAK,QAAQ,QAAQ,UAAU,KAAK,SAAS,UAAU,QAAQ,CAAC;AAAA,IAClE,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAiB;AACxC,QAAI,KAAK,UAAU;AACjB,WAAK,QAAQ,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AAAA,IAC1E;AACA,QAAI,KAAK,QAAQ;AACf,WAAK,QAAQ,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,SAAS,CAAC;AAAA,IACpE,WAAW,KAAK,SAAS;AACvB,WAAK,QAAQ,SAAS,MAAM,QAAQ,KAAK,OAAO,IAAI,KAAK,UAAU,CAAC;AAAA,IACtE;AACA,QAAI,KAAK,OAAO;AACd,WAAK,QAAQ,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AAAA,IACjE;AACA,QAAI,KAAK,UAAU;AACjB,WAAK,QAAQ,WAAW,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,MAAM;AACpB,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,aAAa;AAAA,EACpB;AACF;;;AC9LA,sBAAyB;AAGlB,IAAM,mBAAN,MAAgD;AAAA,EAC7C;AAAA,EACA;AAAA,EAER,YAAY,QAAyB;AACnC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,CAAC,KAAK,OAAO,MAAM;AACrB,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAEA,QAAI;AACF,YAAM,UAAU,UAAM,0BAAS,KAAK,OAAO,MAAM,OAAO;AACxD,YAAM,OAAO,KAAK,MAAM,OAAO;AAE/B,WAAK,UAAU;AAAA,QACb,UAAU,KAAK,YAAY,CAAC;AAAA,QAC5B,QAAQ,KAAK,UAAU,KAAK,WAAW,CAAC;AAAA,QACxC,OAAO,KAAK,SAAS,CAAC;AAAA,QACtB,UAAU,KAAK,YAAY,CAAC;AAAA,MAC9B;AAAA,IACF,SAAS,OAAY;AACnB,YAAM,IAAI,MAAM,gCAAgC,MAAM,OAAO,EAAE;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,aAAkC;AACtC,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,UAAU;AAAA,EACjB;AACF;;;ACzCA,IAAAC,gBAAkB;AAIX,IAAM,oBAAN,MAAiD;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAyB;AACnC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,UAAyB;AAE7B,UAAM,cAAc,CAAC,KAAM,MAAM,KAAM,KAAM,IAAI;AAEjD,eAAW,QAAQ,aAAa;AAC9B,UAAI;AACF,cAAM,MAAM,oBAAoB,IAAI;AACpC,cAAM,cAAAC,QAAM,IAAI,KAAK,EAAE,SAAS,IAAK,CAAC;AACtC,aAAK,eAAe;AAGpB,aAAK,kBAAkB,IAAI,mBAAmB;AAAA,UAC5C;AAAA,UACA,GAAG,KAAK;AAAA,QACV,CAAC;AAED,cAAM,KAAK,gBAAgB,QAAQ;AACnC;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,6EAA6E;AAAA,EAC/F;AAAA,EAEA,MAAM,aAAkC;AACtC,QAAI,CAAC,KAAK,iBAAiB;AACzB,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,WAAO,KAAK,gBAAgB,WAAW;AAAA,EACzC;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,KAAK,iBAAiB;AACxB,YAAM,KAAK,gBAAgB,WAAW;AACtC,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,kBAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AACF;;;AC/CO,SAAS,gBAAgB,QAAwC;AACtE,MAAI,OAAO,MAAM;AACf,WAAO,IAAI,iBAAiB,MAAM;AAAA,EACpC,WAAW,OAAO,KAAK;AACrB,WAAO,IAAI,mBAAmB,MAAM;AAAA,EACtC,WAAW,OAAO,QAAQ;AAExB,WAAO,IAAI,kBAAkB,MAAM;AAAA,EACrC,OAAO;AAEL,WAAO,IAAI,kBAAkB,MAAM;AAAA,EACrC;AACF;;;ACrBA,oBAA4B;AAErB,SAAS,oBAA4B;AAC1C,SAAO,WAAW,KAAK,IAAI,CAAC,QAAI,2BAAY,CAAC,EAAE,SAAS,KAAK,CAAC;AAChE;AAEO,SAAS,kBAA0B;AACxC,SAAO,SAAS,KAAK,IAAI,CAAC,QAAI,2BAAY,CAAC,EAAE,SAAS,KAAK,CAAC;AAC9D;AASO,SAAS,mBACd,eACA,WACA,aACA,UACQ;AAER,QAAM,WAAW,gBAAgB,KAAK,YAAY,KAAK,cAAc,KAAK,WAAW;AASrF,QAAM,YAAY;AAClB,QAAM,QAAQ,OAAO,IAAI,KAAK,IAAI,CAAC,WAAW,SAAS;AAGvD,SAAO,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC;AACxC;AAEO,SAAS,aAAa,OAAuD;AAClF,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO;AACT;;;AC1CO,IAAM,gCAAN,MAAwD;AAAA,EAC7D,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAE7B,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,eAAW,cAAc,QAAQ,QAAQ;AACvC,YAAM,UAAU,KAAK,eAAe,UAAU;AAE9C,iBAAW,WAAW,mBAAmB;AACvC,YAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,mBAAS,KAAK;AAAA,YACZ,IAAI,kBAAkB;AAAA,YACtB,UAAU;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA,YACP,aAAa;AAAA,YACb,SAAS,oBAAoB,QAAQ,SAAS,CAAC;AAAA,WAAc,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,YACxF,gBAAgB;AAAA,YAChB,UAAU,EAAE,SAAS,QAAQ,SAAS,GAAG,SAAS,KAAK,SAAS,SAAS,GAAG,EAAE;AAAA,UAChF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,2BAA2B,QAAQ,MAAM;AACnE,QAAI,aAAa,SAAS,GAAG;AAC3B,eAAS,KAAK;AAAA,QACZ,IAAI,kBAAkB;AAAA,QACtB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS,SAAS,aAAa,MAAM;AAAA,QACrC,gBAAgB;AAAA,QAChB,UAAU,EAAE,OAAO,aAAa;AAAA,MAClC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,YAAyB;AAC9C,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,QAAI,WAAW,MAAM;AACnB,aAAO,WAAW;AAAA,IACpB;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,WAAO,KAAK,UAAU,UAAU;AAAA,EAClC;AAAA,EAEQ,2BAA2B,QAAyB;AAC1D,UAAM,QAAkB,CAAC;AAEzB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,OAAO,OAAO,CAAC;AACrB,YAAM,UAAU,KAAK,eAAe,IAAI;AAGxC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,cAAc,KAAK,eAAe,OAAO,CAAC,CAAC;AAGjD,YAAI,QAAQ,SAAS,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,YAAY,SAAS,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAG;AAC5F,gBAAM,KAAK,CAAC;AACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAc,WAA2B;AACxD,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,EACpC;AACF;;;ACxGO,IAAM,8BAAN,MAAsD;AAAA,EAC3D,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAE7B,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,eAAW,cAAc,QAAQ,QAAQ;AACvC,YAAM,UAAU,KAAK,eAAe,UAAU;AAE9C,iBAAW,WAAW,kBAAkB;AACtC,YAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,mBAAS,KAAK;AAAA,YACZ,IAAI,kBAAkB;AAAA,YACtB,UAAU;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA,YACP,aAAa;AAAA,YACb,SAAS,oBAAoB,QAAQ,SAAS,CAAC;AAAA,WAAc,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,YACxF,gBAAgB;AAAA,YAChB,UAAU,EAAE,SAAS,QAAQ,SAAS,GAAG,SAAS,KAAK,SAAS,SAAS,GAAG,EAAE;AAAA,UAChF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa,KAAK,oCAAoC,QAAQ,MAAM;AAC1E,QAAI,WAAW,SAAS,GAAG;AACzB,eAAS,KAAK;AAAA,QACZ,IAAI,kBAAkB;AAAA,QACtB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS,SAAS,WAAW,MAAM;AAAA,QACnC,gBAAgB;AAAA,QAChB,UAAU,EAAE,WAAW;AAAA,MACzB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,YAAyB;AAC9C,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,QAAI,WAAW,MAAM;AACnB,aAAO,WAAW;AAAA,IACpB;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,WAAO,KAAK,UAAU,UAAU;AAAA,EAClC;AAAA,EAEQ,oCAAoC,QAAyB;AACnE,UAAM,OAAO,oBAAI,IAAoB;AACrC,UAAM,aAAuB,CAAC;AAE9B,eAAW,QAAQ,QAAQ;AACzB,YAAM,UAAU,KAAK,eAAe,IAAI;AAGxC,YAAM,aAAa,QAAQ,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAEnE,UAAI,WAAW,SAAS,IAAI;AAE1B,cAAM,QAAQ,KAAK,IAAI,UAAU,KAAK;AACtC,aAAK,IAAI,YAAY,QAAQ,CAAC;AAE9B,YAAI,UAAU,GAAG;AAEf,qBAAW,KAAK,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAc,WAA2B;AACxD,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,EACpC;AACF;;;AC3GO,IAAM,4BAAN,MAAoD;AAAA,EACzD,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAG7B,eAAW,cAAc,QAAQ,QAAQ;AACvC,YAAM,UAAU,KAAK,eAAe,UAAU;AAG9C,YAAM,gBAAgB,KAAK,kBAAkB,OAAO;AACpD,iBAAW,SAAS,eAAe;AACjC,YAAI;AACF,gBAAM,UAAU,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,OAAO;AAG7D,cAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,qBAAS,KAAK;AAAA,cACZ,IAAI,kBAAkB;AAAA,cACtB,UAAU;AAAA,cACV,UAAU;AAAA,cACV,OAAO;AAAA,cACP,aAAa;AAAA,cACb,SAAS,YAAY,KAAK,SAAS,OAAO,GAAG,CAAC;AAAA,WAAc,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,cACvF,gBAAgB;AAAA,cAChB,UAAU,EAAE,SAAS,OAAO,SAAS,KAAK,SAAS,SAAS,GAAG,EAAE;AAAA,YACnE,CAAC;AAAA,UACH;AAAA,QACF,SAAS,GAAG;AAAA,QAEZ;AAAA,MACF;AAGA,YAAM,oBAAoB,KAAK,sBAAsB,OAAO;AAC5D,iBAAW,SAAS,mBAAmB;AACrC,YAAI;AACF,gBAAM,UAAU,mBAAmB,KAAK;AAExC,cAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,qBAAS,KAAK;AAAA,cACZ,IAAI,kBAAkB;AAAA,cACtB,UAAU;AAAA,cACV,UAAU;AAAA,cACV,OAAO;AAAA,cACP,aAAa;AAAA,cACb,SAAS,YAAY,KAAK,SAAS,OAAO,GAAG,CAAC;AAAA,WAAc,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,cACvF,gBAAgB;AAAA,cAChB,UAAU,EAAE,SAAS,OAAO,SAAS,KAAK,SAAS,SAAS,GAAG,EAAE;AAAA,YACnE,CAAC;AAAA,UACH;AAAA,QACF,SAAS,GAAG;AAAA,QAEZ;AAAA,MACF;AAGA,YAAM,aAAa,KAAK,eAAe,OAAO;AAC9C,iBAAW,SAAS,YAAY;AAC9B,YAAI;AACF,gBAAM,UAAU,OAAO,KAAK,OAAO,KAAK,EAAE,SAAS,OAAO;AAE1D,cAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,qBAAS,KAAK;AAAA,cACZ,IAAI,kBAAkB;AAAA,cACtB,UAAU;AAAA,cACV,UAAU;AAAA,cACV,OAAO;AAAA,cACP,aAAa;AAAA,cACb,SAAS,YAAY,KAAK,SAAS,OAAO,GAAG,CAAC;AAAA,WAAc,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,cACvF,gBAAgB;AAAA,cAChB,UAAU,EAAE,SAAS,OAAO,SAAS,KAAK,SAAS,SAAS,GAAG,EAAE;AAAA,YACnE,CAAC;AAAA,UACH;AAAA,QACF,SAAS,GAAG;AAAA,QAEZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,YAAyB;AAC9C,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,QAAI,WAAW,MAAM;AACnB,aAAO,WAAW;AAAA,IACpB;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,WAAO,KAAK,UAAU,UAAU;AAAA,EAClC;AAAA,EAEQ,kBAAkB,SAA2B;AAEnD,UAAM,QAAQ;AACd,WAAO,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,EAClC;AAAA,EAEQ,sBAAsB,SAA2B;AAEvD,UAAM,QAAQ;AACd,WAAO,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,EAClC;AAAA,EAEQ,eAAe,SAA2B;AAEhD,UAAM,QAAQ;AACd,WAAO,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,EAClC;AAAA,EAEQ,aAAa,MAAuB;AAC1C,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,mBAAmB,KAAK,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,EAChE;AAAA,EAEQ,SAAS,MAAc,WAA2B;AACxD,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,EACpC;AACF;;;ACjJA,IAAM,uBAAuB;AAAA;AAAA,EAE3B,EAAE,SAAS,eAAe,MAAM,mCAAmC,UAAU,WAAoB;AAAA,EACjG,EAAE,SAAS,2CAA2C,MAAM,6BAA6B,UAAU,WAAoB;AAAA,EACvH,EAAE,SAAS,4CAA4C,MAAM,4BAA4B,UAAU,WAAoB;AAAA,EACvH,EAAE,SAAS,gBAAgB,MAAM,uBAAuB,UAAU,OAAgB;AAAA,EAClF,EAAE,SAAS,wBAAwB,MAAM,6BAA6B,UAAU,WAAoB;AAAA;AAAA,EAGpG,EAAE,SAAS,oCAAoC,MAAM,wBAAwB,UAAU,WAAoB;AAAA,EAC3G,EAAE,SAAS,cAAc,MAAM,yBAAyB,UAAU,WAAoB;AAAA,EACtF,EAAE,SAAS,cAAc,MAAM,yBAAyB,UAAU,WAAoB;AAAA,EACtF,EAAE,SAAS,oBAAoB,MAAM,2BAA2B,UAAU,OAAgB;AAAA;AAAA,EAG1F,EAAE,SAAS,wBAAwB,MAAM,+BAA+B,UAAU,OAAgB;AAAA,EAClG,EAAE,SAAS,mBAAmB,MAAM,6BAA6B,UAAU,OAAgB;AAAA,EAC3F,EAAE,SAAS,yBAAyB,MAAM,8BAA8B,UAAU,OAAgB;AAAA;AAAA,EAGlG,EAAE,SAAS,wBAAwB,MAAM,iCAAiC,UAAU,SAAkB;AAAA,EACtG,EAAE,SAAS,2BAA2B,MAAM,8BAA8B,UAAU,SAAkB;AAAA,EACtG,EAAE,SAAS,qBAAqB,MAAM,4BAA4B,UAAU,SAAkB;AAAA;AAAA,EAG9F,EAAE,SAAS,oBAAoB,MAAM,2BAA2B,UAAU,OAAgB;AAAA,EAC1F,EAAE,SAAS,oBAAoB,MAAM,4BAA4B,UAAU,SAAkB;AAAA,EAC7F,EAAE,SAAS,oBAAoB,MAAM,yBAAyB,UAAU,SAAkB;AAAA;AAAA,EAG1F,EAAE,SAAS,iBAAiB,MAAM,yBAAyB,UAAU,OAAgB;AAAA,EACrF,EAAE,SAAS,kBAAkB,MAAM,uBAAuB,UAAU,OAAgB;AAAA,EACpF,EAAE,SAAS,0BAA0B,MAAM,gCAAgC,UAAU,OAAgB;AACvG;AAEO,IAAM,8BAAN,MAAsD;AAAA,EAC3D,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAG7B,eAAW,cAAc,QAAQ,QAAQ;AACvC,YAAM,UAAU,KAAK,eAAe,UAAU;AAE9C,iBAAW,aAAa,sBAAsB;AAC5C,YAAI,UAAU,QAAQ,KAAK,OAAO,GAAG;AACnC,mBAAS,KAAK;AAAA,YACZ,IAAI,kBAAkB;AAAA,YACtB,UAAU;AAAA,YACV,UAAU,UAAU;AAAA,YACpB,OAAO,8BAA8B,UAAU,IAAI;AAAA,YACnD,aAAa;AAAA,YACb,SAAS,cAAc,UAAU,IAAI;AAAA,WAAc,UAAU,QAAQ,SAAS,CAAC;AAAA,WAAc,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,YACxH,gBAAgB;AAAA,YAChB,UAAU;AAAA,cACR,WAAW,UAAU;AAAA,cACrB,SAAS,UAAU,QAAQ,SAAS;AAAA,cACpC,SAAS,KAAK,SAAS,SAAS,GAAG;AAAA,YACrC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,eAAW,WAAW,QAAQ,UAAU;AACtC,YAAM,UAAU,KAAK,eAAe,OAAO;AAE3C,iBAAW,aAAa,sBAAsB;AAC5C,YAAI,UAAU,QAAQ,KAAK,OAAO,GAAG;AACnC,mBAAS,KAAK;AAAA,YACZ,IAAI,kBAAkB;AAAA,YACtB,UAAU;AAAA,YACV,UAAU,UAAU;AAAA,YACpB,OAAO,0CAA0C,UAAU,IAAI;AAAA,YAC/D,aAAa;AAAA,YACb,SAAS,cAAc,UAAU,IAAI;AAAA,WAAc,UAAU,QAAQ,SAAS,CAAC;AAAA,WAAc,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,YACxH,gBAAgB;AAAA,YAChB,UAAU;AAAA,cACR,WAAW,UAAU;AAAA,cACrB,SAAS,UAAU,QAAQ,SAAS;AAAA,cACpC,SAAS,KAAK,SAAS,SAAS,GAAG;AAAA,YACrC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,MAAmB;AACxC,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS;AAChB,aAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,OAAO;AAAA,IACtF;AACA,QAAI,KAAK,MAAM;AACb,aAAO,KAAK;AAAA,IACd;AACA,QAAI,KAAK,SAAS;AAChB,aAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,OAAO;AAAA,IACtF;AACA,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA,EAEQ,SAAS,MAAc,WAA2B;AACxD,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,EACpC;AACF;;;ACpHO,IAAM,yBAAN,MAAiD;AAAA,EACtD,OAAO;AAAA,EACP,WAAW;AAAA;AAAA,EAGM,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAE/C,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAG7B,eAAW,cAAc,QAAQ,QAAQ;AACvC,YAAM,UAAU,KAAK,eAAe,UAAU;AAG9C,UAAI,QAAQ,SAAS,IAAI;AACvB;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,iBAAiB,OAAO;AAE7C,UAAI,WAAW,KAAK,6BAA6B;AAC/C,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS,YAAY,QAAQ,QAAQ,CAAC,CAAC,gBAAgB,KAAK,2BAA2B;AAAA,WAAe,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,UACjI,gBAAgB;AAAA,UAChB,UAAU,EAAE,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG,GAAG,QAAQ,QAAQ,OAAO;AAAA,QACpF,CAAC;AAAA,MACH,WAAW,WAAW,KAAK,wBAAwB;AACjD,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS,YAAY,QAAQ,QAAQ,CAAC,CAAC,gBAAgB,KAAK,sBAAsB;AAAA,WAAe,KAAK,SAAS,SAAS,GAAG,CAAC;AAAA,UAC5H,gBAAgB;AAAA,UAChB,UAAU,EAAE,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG,GAAG,QAAQ,QAAQ,OAAO;AAAA,QACpF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,uBAAuB,QAAQ,MAAM;AAC5D,eAAW,WAAW,WAAW;AAC/B,eAAS,KAAK;AAAA,QACZ,IAAI,kBAAkB;AAAA,QACtB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS,iBAAiB,QAAQ,QAAQ,QAAQ,CAAC,CAAC,mBAAmB,QAAQ,KAAK,QAAQ,CAAC,CAAC,gBAAgB,QAAQ,UAAU,QAAQ,CAAC,CAAC;AAAA,QAC1I,gBAAgB;AAAA,QAChB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAsB;AAC7C,QAAI,KAAK,WAAW,EAAG,QAAO;AAG9B,UAAM,OAAO,oBAAI,IAAoB;AACrC,eAAW,QAAQ,MAAM;AACvB,WAAK,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,IAC1C;AAGA,QAAI,UAAU;AACd,UAAM,MAAM,KAAK;AAEjB,eAAW,SAAS,KAAK,OAAO,GAAG;AACjC,YAAM,IAAI,QAAQ;AAClB,iBAAW,IAAI,KAAK,KAAK,CAAC;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,QAM5B;AACD,QAAI,OAAO,SAAS,EAAG,QAAO,CAAC;AAG/B,UAAM,YAAY,OAAO,IAAI,CAAC,SAAS;AACrC,YAAM,UAAU,KAAK,eAAe,IAAI;AACxC,aAAO;AAAA,QACL;AAAA,QACA,SAAS,KAAK,iBAAiB,OAAO;AAAA,MACxC;AAAA,IACF,CAAC;AAGD,UAAM,OAAO,UAAU,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC,IAAI,UAAU;AAC1E,UAAM,WACJ,UAAU,OAAO,CAAC,KAAK,MAAM,MAAM,KAAK,IAAI,EAAE,UAAU,MAAM,CAAC,GAAG,CAAC,IAAI,UAAU;AACnF,UAAM,SAAS,KAAK,KAAK,QAAQ;AAGjC,UAAM,YAAY,CAAC;AACnB,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,YAAY,KAAK,IAAI,UAAU,CAAC,EAAE,UAAU,IAAI,IAAI;AAC1D,UAAI,YAAY,KAAK,UAAU,CAAC,EAAE,UAAU,MAAM;AAChD,kBAAU,KAAK;AAAA,UACb,OAAO;AAAA,UACP,SAAS,UAAU,CAAC,EAAE;AAAA,UACtB;AAAA,UACA;AAAA,UACA,SAAS,KAAK,SAAS,UAAU,CAAC,EAAE,SAAS,GAAG;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,YAAyB;AAC9C,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,QAAI,WAAW,MAAM;AACnB,aAAO,WAAW;AAAA,IACpB;AACA,QAAI,WAAW,SAAS;AACtB,aAAO,OAAO,WAAW,YAAY,WACjC,WAAW,UACX,KAAK,UAAU,WAAW,OAAO;AAAA,IACvC;AACA,WAAO,KAAK,UAAU,UAAU;AAAA,EAClC;AAAA,EAEQ,SAAS,MAAc,WAA2B;AACxD,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,EACpC;AACF;;;AC1JO,IAAM,oBAAN,MAA4C;AAAA,EACjD,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAG7B,UAAM,eAAe,KAAK,oBAAoB,OAAO;AAErD,QAAI,CAAC,cAAc;AAEjB,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,KAAK,oBAAoB,OAAO;AAErD,eAAW,WAAW,cAAc;AAClC,YAAM,aAAa,KAAK,4BAA4B,cAAc,QAAQ,IAAI;AAE9E,UAAI,aAAa,KAAK;AAEpB,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS,iCAAiC,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,WAAe,KAAK,SAAS,QAAQ,MAAM,GAAG,CAAC;AAAA,UACrH,gBAAgB;AAAA,UAChB,UAAU;AAAA,YACR;AAAA,YACA,cAAc,KAAK,SAAS,cAAc,GAAG;AAAA,YAC7C,gBAAgB,KAAK,SAAS,QAAQ,MAAM,GAAG;AAAA,YAC/C,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH,WAAW,aAAa,KAAK;AAC3B,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS,iCAAiC,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,WAAe,KAAK,SAAS,QAAQ,MAAM,GAAG,CAAC;AAAA,UACrH,gBAAgB;AAAA,UAChB,UAAU;AAAA,YACR;AAAA,YACA,cAAc,KAAK,SAAS,cAAc,GAAG;AAAA,YAC7C,gBAAgB,KAAK,SAAS,QAAQ,MAAM,GAAG;AAAA,YAC/C,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,mBAAmB,KAAK,uBAAuB,OAAO;AAC5D,QAAI,iBAAiB,SAAS,GAAG;AAC/B,eAAS,KAAK;AAAA,QACZ,IAAI,kBAAkB;AAAA,QACtB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS,SAAS,iBAAiB,MAAM;AAAA,QACzC,gBAAgB;AAAA,QAChB,UAAU,EAAE,eAAe,iBAAiB;AAAA,MAC9C,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAAoC;AAE9D,QAAI,QAAQ,UAAU,cAAc;AAClC,aAAO,OAAO,QAAQ,SAAS,YAAY;AAAA,IAC7C;AACA,QAAI,QAAQ,UAAU,eAAe;AACnC,aAAO,OAAO,QAAQ,SAAS,aAAa;AAAA,IAC9C;AAGA,UAAM,qBAAqB,QAAQ,SAAS;AAAA,MAC1C,CAAC,QAAa,IAAI,SAAS,YAAY,IAAI,SAAS;AAAA,IACtD;AACA,QAAI,oBAAoB;AACtB,aAAO,KAAK,eAAe,kBAAkB;AAAA,IAC/C;AAGA,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,aAAO,KAAK,eAAe,QAAQ,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAA8D;AACxF,UAAM,UAAmD,CAAC;AAG1D,UAAM,gBAAgB,QAAQ,OAAO,MAAM,KAAK,IAAI,GAAG,QAAQ,OAAO,MAAM,CAAC;AAC7E,eAAW,QAAQ,eAAe;AAChC,YAAM,OAAO,KAAK,eAAe,IAAI;AACrC,UAAI,KAAK,SAAS,IAAI;AACpB,gBAAQ,KAAK,EAAE,MAAM,QAAQ,SAAS,CAAC;AAAA,MACzC;AAAA,IACF;AAGA,UAAM,kBAAkB,QAAQ,SAAS,MAAM,KAAK,IAAI,GAAG,QAAQ,SAAS,MAAM,CAAC;AACnF,eAAW,QAAQ,iBAAiB;AAClC,YAAM,OAAO,KAAK,eAAe,IAAI;AACrC,UAAI,KAAK,SAAS,IAAI;AACpB,gBAAQ,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AAAA,MAC3C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,4BAA4B,OAAe,OAAuB;AAIxE,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,UAAM,UAAU,KAAK,SAAS,KAAK;AAGnC,UAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,UAAM,OAAO,IAAI,IAAI,OAAO;AAE5B,UAAM,eAAe,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;AACjE,UAAM,QAAQ,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAExC,WAAO,aAAa,OAAO,MAAM;AAAA,EACnC;AAAA,EAEQ,SAAS,MAAwB;AACvC,WAAO,KACJ,YAAY,EACZ,QAAQ,YAAY,GAAG,EACvB,MAAM,KAAK,EACX,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AAAA,EACvC;AAAA,EAEQ,uBAAuB,SAA+B;AAC5D,UAAM,gBAA0B,CAAC;AAEjC,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,aAAa;AAAA,MACjB,GAAG,QAAQ,OAAO,IAAI,CAAC,SAAS,KAAK,eAAe,IAAI,CAAC;AAAA,MACzD,GAAG,QAAQ,SAAS,IAAI,CAAC,SAAS,KAAK,eAAe,IAAI,CAAC;AAAA,IAC7D;AAEA,eAAW,WAAW,YAAY;AAChC,iBAAW,WAAW,sBAAsB;AAC1C,YAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,wBAAc,KAAK,KAAK,SAAS,SAAS,GAAG,CAAC;AAC9C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,MAAmB;AACxC,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS;AAChB,aAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,OAAO;AAAA,IACtF;AACA,QAAI,KAAK,MAAM;AACb,aAAO,KAAK;AAAA,IACd;AACA,QAAI,KAAK,SAAS;AAChB,aAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,OAAO;AAAA,IACtF;AACA,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA,EAEQ,SAAS,MAAc,WAA2B;AACxD,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,EACpC;AACF;;;AC3LO,SAAS,wBAAoC;AAClD,SAAO;AAAA,IACL,IAAI,8BAA8B;AAAA,IAClC,IAAI,4BAA4B;AAAA,IAChC,IAAI,0BAA0B;AAAA,IAC9B,IAAI,4BAA4B;AAAA,IAChC,IAAI,uBAAuB;AAAA,IAC3B,IAAI,kBAAkB;AAAA,EACxB;AACF;;;ACpBA,IAAM,wBAAwB;AAAA,EAC5B,EAAE,YAAY,gBAAgB,UAAU,QAAiB,MAAM,oBAAoB;AAAA,EACnF,EAAE,YAAY,iBAAiB,UAAU,QAAiB,MAAM,qBAAqB;AAAA,EACrF,EAAE,YAAY,2BAA2B,UAAU,YAAqB,MAAM,iBAAiB;AAAA,EAC/F,EAAE,YAAY,8BAA8B,UAAU,YAAqB,MAAM,eAAe;AAAA,EAChG,EAAE,YAAY,+BAA+B,UAAU,UAAmB,MAAM,iBAAiB;AAAA,EACjG,EAAE,YAAY,oBAAoB,UAAU,QAAiB,MAAM,kBAAkB;AAAA,EACrF,EAAE,YAAY,oBAAoB,UAAU,YAAqB,MAAM,mBAAmB;AAAA,EAC1F,EAAE,YAAY,sBAAsB,UAAU,YAAqB,MAAM,uBAAuB;AAClG;AAEO,IAAM,2BAAN,MAAmD;AAAA,EACxD,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAE7B,eAAW,QAAQ,QAAQ,OAAO;AAChC,YAAM,WAAW,KAAK,YAAY,IAAI;AACtC,YAAM,cAAc,KAAK,mBAAmB,IAAI;AAGhD,iBAAW,iBAAiB,uBAAuB;AACjD,cAAM,eAAe,YAAY,OAAO,CAAC,MAAM,cAAc,WAAW,KAAK,CAAC,CAAC;AAE/E,YAAI,aAAa,SAAS,GAAG;AAC3B,mBAAS,KAAK;AAAA,YACZ,IAAI,kBAAkB;AAAA,YACtB,UAAU;AAAA,YACV,UAAU,cAAc;AAAA,YACxB,OAAO,mCAAmC,cAAc,IAAI;AAAA,YAC5D,aAAa,SAAS,QAAQ;AAAA,YAC9B,SAAS,eAAe,cAAc,IAAI;AAAA,WAAc,aAAa,KAAK,IAAI,CAAC;AAAA,QAAW,QAAQ;AAAA,YAClG,gBAAgB;AAAA,YAChB,UAAU;AAAA,cACR,MAAM;AAAA,cACN,YAAY,cAAc;AAAA,cAC1B,SAAS;AAAA,cACT,YAAY,KAAK,aAAa,IAAI;AAAA,YACpC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,YAAY,SAAS,GAAG;AAC1B,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa,SAAS,QAAQ;AAAA,UAC9B,SAAS,YAAY,YAAY,MAAM;AAAA,UACvC,gBAAgB;AAAA,UAChB,UAAU;AAAA,YACR,MAAM;AAAA,YACN,iBAAiB,YAAY;AAAA,YAC7B,aAAa,YAAY,MAAM,GAAG,EAAE;AAAA,YACpC,YAAY,KAAK,aAAa,IAAI;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,MAAmB;AACrC,WAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,UAAU,QAAQ;AAAA,EACxD;AAAA,EAEQ,mBAAmB,MAAqB;AAC9C,UAAM,cAAwB,CAAC;AAG/B,QAAI,KAAK,aAAa;AACpB,UAAI,MAAM,QAAQ,KAAK,WAAW,GAAG;AACnC,oBAAY,KAAK,GAAG,KAAK,YAAY,IAAI,MAAM,CAAC;AAAA,MAClD,WAAW,OAAO,KAAK,gBAAgB,UAAU;AAC/C,oBAAY,KAAK,KAAK,WAAW;AAAA,MACnC,WAAW,OAAO,KAAK,gBAAgB,UAAU;AAC/C,oBAAY,KAAK,GAAG,OAAO,KAAK,KAAK,WAAW,CAAC;AACjD,oBAAY,KAAK,GAAG,OAAO,OAAO,KAAK,WAAW,EAAE,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC1F;AAAA,IACF;AAEA,QAAI,KAAK,cAAc;AACrB,UAAI,MAAM,QAAQ,KAAK,YAAY,GAAG;AACpC,oBAAY,KAAK,GAAG,KAAK,aAAa,IAAI,MAAM,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ;AACf,UAAI,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC9B,oBAAY,KAAK,GAAG,KAAK,OAAO,IAAI,MAAM,CAAC;AAAA,MAC7C,WAAW,OAAO,KAAK,WAAW,UAAU;AAC1C,oBAAY,KAAK,KAAK,MAAM;AAAA,MAC9B;AAAA,IACF;AAGA,UAAM,cAAc,KAAK,eAAe,KAAK,QAAQ;AACrD,QAAI,OAAO,gBAAgB,UAAU;AACnC,iBAAW,iBAAiB,uBAAuB;AACjD,YAAI,cAAc,WAAW,KAAK,WAAW,GAAG;AAC9C,sBAAY,KAAK,eAAe,cAAc,IAAI,EAAE;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAGA,UAAM,SAAS,KAAK,cAAc,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU;AAC7E,QAAI,QAAQ;AACV,YAAM,WAAW,KAAK,UAAU,MAAM;AACtC,iBAAW,iBAAiB,uBAAuB;AACjD,YAAI,cAAc,WAAW,KAAK,QAAQ,GAAG;AAC3C,sBAAY,KAAK,UAAU,cAAc,IAAI,EAAE;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,MAAgB;AAEnC,WAAO;AAAA,MACL,MAAM,KAAK,YAAY,IAAI;AAAA,MAC3B,aAAa,KAAK,eAAe,KAAK,QAAQ;AAAA,MAC9C,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AACF;;;ACxIO,IAAM,2BAAN,MAAmD;AAAA,EACxD,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAG7B,UAAM,sBAAsB,QAAQ,MAAM;AAAA,MACxC,CAAC,SAAc,KAAK,aAAa,KAAK,WAAW,KAAK,WAAW,KAAK;AAAA,IACxE;AAEA,QAAI,oBAAoB,SAAS,GAAG;AAElC,YAAM,eAAe,KAAK,gBAAgB,OAAO;AACjD,YAAM,aAAa,KAAK,cAAc,SAAS,YAAY;AAE3D,iBAAW,QAAQ,YAAY;AAC7B,cAAM,WAAW,KAAK,YAAY,IAAI;AAEtC,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa,SAAS,QAAQ;AAAA,UAC9B,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,UAAU;AAAA,YACR,MAAM;AAAA,YACN,WAAW,KAAK,aAAa,KAAK,WAAW,KAAK,WAAW,KAAK;AAAA,YAClE,YAAY,KAAK,aAAa,IAAI;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,QAAQ,QAAQ,OAAO;AAChC,YAAM,WAAW,KAAK,YAAY,IAAI;AACtC,YAAM,YAAY,KAAK,cAAc,IAAI;AAEzC,UAAI,WAAW;AACb,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa,SAAS,QAAQ;AAAA,UAC9B,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,UAAU;AAAA,YACR,MAAM;AAAA,YACN,YAAY,KAAK,aAAa,IAAI;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,QAAQ,QAAQ,OAAO;AAChC,YAAM,WAAW,KAAK,YAAY,IAAI;AAEtC,UAAI,CAAC,KAAK,yBAAyB,IAAI,GAAG;AACxC,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa,SAAS,QAAQ;AAAA,UAC9B,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,UAAU;AAAA,YACR,MAAM;AAAA,YACN,YAAY,KAAK,aAAa,IAAI;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,MAAmB;AACrC,WAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,UAAU,QAAQ;AAAA,EACxD;AAAA,EAEQ,gBAAgB,SAAkC;AAExD,UAAM,eAAe,oBAAI,IAAY;AAGrC,QAAI,QAAQ,UAAU,cAAc;AAClC,YAAM,UAAU,QAAQ,SAAS;AACjC,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,gBAAQ,QAAQ,CAAC,MAAM,aAAa,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC;AAAA,MAC9D;AAAA,IACF;AAGA,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,gBAAgB,QAAQ,MAC3B,IAAI,CAAC,UAAe;AAAA,QACnB,MAAM,KAAK,YAAY,IAAI;AAAA,QAC3B,MAAM,KAAK,aAAa,IAAI;AAAA,MAC9B,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,OAAQ,EAAE,IAAK;AAEnC,UAAI,cAAc,SAAS,GAAG;AAC5B,cAAM,eAAe,cAAc,CAAC,EAAE;AAEtC,sBACG,OAAO,CAAC,MAAM,EAAE,OAAQ,eAAgB,GAAK,EAC7C,QAAQ,CAAC,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC;AAAA,MAC5C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,SAAqB,cAAkC;AAC3E,WAAO,QAAQ,MAAM,OAAO,CAAC,SAAc;AACzC,YAAM,OAAO,KAAK,YAAY,IAAI;AAClC,aAAO,CAAC,aAAa,IAAI,IAAI;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,MAA0B;AAC7C,UAAM,KAAK,KAAK,aAAa,KAAK,WAAW,KAAK,WAAW,KAAK;AAClE,QAAI,CAAC,GAAI,QAAO;AAEhB,QAAI,OAAO,OAAO,SAAU,QAAO;AACnC,QAAI,OAAO,OAAO,UAAU;AAC1B,YAAM,SAAS,IAAI,KAAK,EAAE,EAAE,QAAQ;AACpC,aAAO,MAAM,MAAM,IAAI,OAAO;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,MAAoB;AACxC,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU,IAAI;AAEnC,WAAO,WAAW,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC;AAAA,EAC3D;AAAA,EAEQ,yBAAyB,MAAoB;AACnD,WAAO,CAAC,EACN,KAAK,YACL,KAAK,cACL,KAAK,aACL,KAAK,YACL,KAAK,iBACL,KAAK,UAAU;AAAA,EAEnB;AAAA,EAEQ,aAAa,MAAgB;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,YAAY,IAAI;AAAA,MAC3B,aAAa,KAAK,eAAe,KAAK,QAAQ;AAAA,MAC9C,WAAW,KAAK,aAAa,KAAK,WAAW,KAAK,WAAW,KAAK;AAAA,MAClE,YAAY,KAAK,yBAAyB,IAAI;AAAA,IAChD;AAAA,EACF;AACF;;;AC9KA,IAAM,sBAAsB;AAAA,EAC1B,EAAE,SAAS,+BAA+B,MAAM,iBAAiB,UAAU,WAAoB;AAAA,EAC/F,EAAE,SAAS,gCAAgC,MAAM,uBAAuB,UAAU,WAAoB;AAAA,EACtG,EAAE,SAAS,iBAAiB,MAAM,oBAAoB,UAAU,OAAgB;AAAA,EAChF,EAAE,SAAS,sBAAsB,MAAM,qBAAqB,UAAU,WAAoB;AAAA,EAC1F,EAAE,SAAS,yBAAyB,MAAM,kBAAkB,UAAU,OAAgB;AAAA,EACtF,EAAE,SAAS,2CAA2C,MAAM,yBAAyB,UAAU,WAAoB;AAAA,EACnH,EAAE,SAAS,0BAA0B,MAAM,gBAAgB,UAAU,SAAkB;AAAA,EACvF,EAAE,SAAS,6BAA6B,MAAM,wBAAwB,UAAU,SAAkB;AAAA,EAClG,EAAE,SAAS,iCAAiC,MAAM,eAAe,UAAU,OAAgB;AAAA,EAC3F,EAAE,SAAS,2CAA2C,MAAM,iBAAiB,UAAU,WAAoB;AAC7G;AAEO,IAAM,+BAAN,MAAuD;AAAA,EAC5D,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,MAAM,OAAO,SAAyC;AACpD,UAAM,WAAsB,CAAC;AAE7B,eAAW,QAAQ,QAAQ,OAAO;AAChC,YAAM,WAAW,KAAK,YAAY,IAAI;AACtC,YAAM,aAAa,KAAK,kBAAkB,IAAI;AAE9C,iBAAW,SAAS,YAAY;AAE9B,cAAM,YAAY,GAAG,MAAM,IAAI,IAAI,MAAM,eAAe,EAAE,IAAI,MAAM,QAAQ,EAAE;AAE9E,mBAAW,cAAc,qBAAqB;AAC5C,cAAI,WAAW,QAAQ,KAAK,SAAS,GAAG;AACtC,qBAAS,KAAK;AAAA,cACZ,IAAI,kBAAkB;AAAA,cACtB,UAAU;AAAA,cACV,UAAU,WAAW;AAAA,cACrB,OAAO,8BAA8B,WAAW,IAAI;AAAA,cACpD,aAAa,SAAS,QAAQ,8CAA8C,WAAW,IAAI;AAAA,cAC3F,SAAS,cAAc,MAAM,IAAI;AAAA,QAAW,MAAM,QAAQ,SAAS;AAAA,eAAkB,MAAM,eAAe,MAAM;AAAA,cAChH,gBAAgB;AAAA,cAChB,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,WAAW,MAAM;AAAA,gBACjB,SAAS,WAAW;AAAA,gBACpB,kBAAkB;AAAA,cACpB;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAGA,YAAI,MAAM,SAAS;AACjB,gBAAM,aAAa,OAAO,MAAM,OAAO;AAEvC,qBAAW,cAAc,qBAAqB;AAC5C,gBAAI,WAAW,QAAQ,KAAK,UAAU,GAAG;AACvC,uBAAS,KAAK;AAAA,gBACZ,IAAI,kBAAkB;AAAA,gBACtB,UAAU;AAAA,gBACV,UAAU,WAAW;AAAA,gBACrB,OAAO,6BAA6B,WAAW,IAAI;AAAA,gBACnD,aAAa,SAAS,QAAQ,gBAAgB,MAAM,IAAI;AAAA,gBACxD,SAAS,kBAAkB,KAAK,SAAS,YAAY,GAAG,CAAC;AAAA,gBACzD,gBAAgB;AAAA,gBAChB,UAAU;AAAA,kBACR,MAAM;AAAA,kBACN,WAAW,MAAM;AAAA,kBACjB,SAAS,WAAW;AAAA,kBACpB,cAAc,KAAK,SAAS,YAAY,GAAG;AAAA,gBAC7C;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAGA,YAAI,KAAK,kBAAkB,KAAK,GAAG;AACjC,mBAAS,KAAK;AAAA,YACZ,IAAI,kBAAkB;AAAA,YACtB,UAAU;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA,YACP,aAAa,SAAS,QAAQ,gBAAgB,MAAM,IAAI;AAAA,YACxD,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,UAAU;AAAA,cACR,MAAM;AAAA,cACN,WAAW,MAAM;AAAA,cACjB,kBAAkB;AAAA,YACpB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,KAAK,qBAAqB,IAAI,GAAG;AACnC,iBAAS,KAAK;AAAA,UACZ,IAAI,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa,SAAS,QAAQ;AAAA,UAC9B,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,UAAU;AAAA,YACR,MAAM;AAAA,YACN,YAAY,KAAK,aAAa,IAAI;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,MAAmB;AACrC,WAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,UAAU,QAAQ;AAAA,EACxD;AAAA,EAEQ,kBAAkB,MAMvB;AACD,UAAM,SAMD,CAAC;AAEN,UAAM,YAAY,KAAK,cAAc,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU;AAEhF,QAAI,CAAC,UAAW,QAAO;AAGvB,QAAI,UAAU,YAAY;AACxB,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AACjE,cAAM,IAAS;AACf,eAAO,KAAK;AAAA,UACV;AAAA,UACA,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,SAAS,EAAE;AAAA,UACX,UAAU,UAAU,UAAU,SAAS,IAAI;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,iBAAW,SAAS,WAAW;AAC7B,eAAO,KAAK;AAAA,UACV,MAAM,MAAM,QAAQ;AAAA,UACpB,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM;AAAA,UACnB,SAAS,MAAM;AAAA,UACf,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,OAAyD;AACjF,QAAI,MAAM,SAAS,SAAU,QAAO;AAEpC,UAAM,OAAO,MAAM,aAAa,YAAY,KAAK;AAGjD,QAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,KAAK,GAAG;AAClF,aAAO;AAAA,IACT;AAGA,WACE,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,UAAU;AAAA,EAE5B;AAAA,EAEQ,qBAAqB,MAAoB;AAC/C,UAAM,UAAU,KAAK,UAAU,IAAI,EAAE,YAAY;AAEjD,UAAM,0BAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,wBAAwB,KAAK,CAAC,cAAc,QAAQ,SAAS,SAAS,CAAC;AAAA,EAChF;AAAA,EAEQ,aAAa,MAAgB;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,YAAY,IAAI;AAAA,MAC3B,aAAa,KAAK,eAAe,KAAK,QAAQ;AAAA,MAC9C,YAAY,KAAK,kBAAkB,IAAI;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,SAAS,MAAc,WAA2B;AACxD,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,EACpC;AACF;;;ACnNO,SAAS,sBAAkC;AAChD,SAAO;AAAA,IACL,IAAI,yBAAyB;AAAA,IAC7B,IAAI,yBAAyB;AAAA,IAC7B,IAAI,6BAA6B;AAAA,EACnC;AACF;;;ACRO,SAAS,kBAA8B;AAC5C,SAAO,CAAC,GAAG,sBAAsB,GAAG,GAAG,oBAAoB,CAAC;AAC9D;;;ACNO,IAAM,mBAAN,MAAoD;AAAA,EACzD,OAAO;AAAA,EAEP,MAAM,MAAM,SAAqB,UAAgD;AAE/E,UAAM,sBAAsB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU;AAC1E,UAAM,kBAAkB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,MAAM;AAQlE,UAAM,gBAAgB,KAAK,gBAAgB,OAAO;AAClD,UAAM,aAAa,KAAK,aAAa,SAAS,QAAQ;AACtD,UAAM,iBAAiB,KAAK,iBAAiB,OAAO;AACpD,UAAM,gBAAgB,KAAK,gBAAgB,OAAO;AAElD,QAAI,qBAAqB;AACvB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,iBAAiB,CAAC,YAAY;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,mBAAmB,CAAC,kBAAkB,CAAC,eAAe;AACxD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,SAA8B;AAEpD,WAAO,CAAC,EACN,QAAQ,UAAU,cAClB,QAAQ,UAAU,YAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,aAAa,UAAsB,UAA8B;AAEvE,WAAO,SAAS,UAAU;AAAA,EAC5B;AAAA,EAEQ,iBAAiB,SAA8B;AAErD,WAAO,CAAC,EACN,QAAQ,UAAU,WAClB,QAAQ,UAAU,cAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,gBAAgB,SAA8B;AAEpD,WAAO,CAAC,EACN,QAAQ,UAAU,cAClB,QAAQ,UAAU,UAClB,QAAQ,UAAU;AAAA,EAEtB;AACF;;;ACjEO,IAAM,kBAAN,MAAmD;AAAA,EACxD,OAAO;AAAA,EAEP,MAAM,MAAM,SAAqB,UAAgD;AAQ/E,UAAM,sBAAsB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU;AAC1E,UAAM,kBAAkB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,MAAM;AAClE,UAAM,oBAAoB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ;AAEtE,UAAM,oBAAoB,KAAK,oBAAoB,OAAO;AAC1D,UAAM,oBAAoB,KAAK,oBAAoB,OAAO;AAC1D,UAAM,kBAAkB,KAAK,kBAAkB,OAAO;AACtD,UAAM,gBAAgB,KAAK,gBAAgB,OAAO;AAClD,UAAM,wBAAwB,KAAK,wBAAwB,OAAO;AAElE,QAAI,qBAAqB;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,OAAO,OAAO,EAAE;AAElB,QAAI,mBAAmB,eAAe,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,QAAI,qBAAqB,eAAe,GAAG;AACzC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAA8B;AACxD,WAAO,CAAC,EACN,QAAQ,UAAU,mBAClB,QAAQ,UAAU,mBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,oBAAoB,SAA8B;AACxD,WAAO,CAAC,EACN,QAAQ,UAAU,mBAClB,QAAQ,UAAU,eAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,kBAAkB,SAA8B;AACtD,WAAO,CAAC,EACN,QAAQ,UAAU,iBAClB,QAAQ,UAAU,kBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,gBAAgB,SAA8B;AACpD,WAAO,CAAC,EACN,QAAQ,UAAU,cAClB,QAAQ,UAAU,WAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,wBAAwB,SAA8B;AAC5D,WAAO,CAAC,EACN,QAAQ,UAAU,qBAClB,QAAQ,UAAU,uBAClB,QAAQ,UAAU;AAAA,EAEtB;AACF;;;ACnFO,IAAM,cAAN,MAA+C;AAAA,EACpD,OAAO;AAAA,EAEP,MAAM,MAAM,SAAqB,UAAgD;AAQ/E,UAAM,sBAAsB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU;AAC1E,UAAM,kBAAkB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,MAAM;AAGlE,UAAM,wBAAwB,KAAK,wBAAwB,QAAQ;AACnE,UAAM,yBAAyB,KAAK,yBAAyB,QAAQ;AACrE,UAAM,+BAA+B,KAAK,+BAA+B,QAAQ;AAEjF,UAAM,sBAAsB,KAAK,sBAAsB,OAAO;AAC9D,UAAM,oBAAoB,KAAK,oBAAoB,OAAO;AAC1D,UAAM,kBAAkB,KAAK,kBAAkB,OAAO;AAEtD,QAAI,uBAAuB,uBAAuB;AAChD,aAAO;AAAA,IACT;AAEA,QACE,mBACA,0BACA,gCACA,CAAC,uBACD,CAAC,mBACD;AACA,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,UAA8B;AAE5D,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,SAAS,KAAK,CAAC,MAAM;AAC1B,YAAM,OAAO,GAAG,EAAE,KAAK,IAAI,EAAE,WAAW,GAAG,YAAY;AACvD,aAAO,iBAAiB,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEQ,yBAAyB,UAA8B;AAE7D,UAAM,oBAAoB,CAAC,aAAa,gBAAgB,aAAa,cAAc,OAAO;AAE1F,WAAO,SAAS,KAAK,CAAC,MAAM;AAC1B,YAAM,OAAO,GAAG,EAAE,KAAK,IAAI,EAAE,WAAW,GAAG,YAAY;AACvD,aAAO,kBAAkB,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEQ,+BAA+B,UAA8B;AAEnE,UAAM,0BAA0B,CAAC,gBAAgB,QAAQ,YAAY,YAAY;AAEjF,WAAO,SAAS,KAAK,CAAC,MAAM;AAC1B,YAAM,OAAO,GAAG,EAAE,KAAK,IAAI,EAAE,WAAW,GAAG,YAAY;AACvD,aAAO,wBAAwB,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;AAAA,IAC/D,CAAC;AAAA,EACH;AAAA,EAEQ,sBAAsB,SAA8B;AAC1D,WAAO,CAAC,EACN,QAAQ,UAAU,qBAClB,QAAQ,UAAU,mBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,oBAAoB,SAA8B;AACxD,WAAO,CAAC,EACN,QAAQ,UAAU,kBAClB,QAAQ,UAAU,kBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,kBAAkB,SAA8B;AACtD,WAAO,CAAC,EACN,QAAQ,UAAU,aAClB,QAAQ,UAAU,WAClB,QAAQ,UAAU;AAAA,EAEtB;AACF;;;ACzGO,IAAM,iBAAN,MAAkD;AAAA,EACvD,OAAO;AAAA,EAEP,MAAM,MAAM,SAAqB,UAAgD;AAU/E,UAAM,sBAAsB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU;AAC1E,UAAM,kBAAkB,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,MAAM;AAGlE,UAAM,oBAAoB,KAAK,oBAAoB,OAAO;AAC1D,UAAM,oBAAoB,KAAK,oBAAoB,OAAO;AAC1D,UAAM,mBAAmB,KAAK,mBAAmB,OAAO;AACxD,UAAM,mBAAmB,KAAK,mBAAmB,OAAO;AACxD,UAAM,kBAAkB,KAAK,kBAAkB,OAAO;AACtD,UAAM,oBAAoB,KAAK,oBAAoB,OAAO;AAC1D,UAAM,mBAAmB,KAAK,mBAAmB,SAAS,QAAQ;AAElE,QAAI,uBAAuB,CAAC,kBAAkB;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,OAAO,OAAO,EAAE;AAElB,QAAI,mBAAmB,eAAe,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAA8B;AACxD,WAAO,CAAC,EACN,QAAQ,UAAU,mBAClB,QAAQ,UAAU,mBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,oBAAoB,SAA8B;AACxD,WAAO,CAAC,EACN,QAAQ,UAAU,mBAClB,QAAQ,UAAU,gBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,mBAAmB,SAA8B;AACvD,WAAO,CAAC,EACN,QAAQ,UAAU,iBAClB,QAAQ,UAAU,2BAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,mBAAmB,SAA8B;AACvD,WAAO,CAAC,EACN,QAAQ,UAAU,WAClB,QAAQ,UAAU,eAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,kBAAkB,SAA8B;AACtD,WAAO,CAAC,EACN,QAAQ,UAAU,gBAClB,QAAQ,UAAU,kBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,oBAAoB,SAA8B;AACxD,WAAO,CAAC,EACN,QAAQ,UAAU,mBAClB,QAAQ,UAAU,qBAClB,QAAQ,UAAU;AAAA,EAEtB;AAAA,EAEQ,mBAAmB,SAAqB,UAA8B;AAE5E,UAAM,sBAAsB,SAAS;AAAA,MACnC,CAAC,MACC,EAAE,aAAa,eACd,EAAE,aAAa,sBAAsB,EAAE,aAAa;AAAA,IACzD;AAEA,QAAI,qBAAqB;AACvB,aAAO;AAAA,IACT;AAGA,WAAO,CAAC,EACN,QAAQ,UAAU,iBAClB,QAAQ,UAAU,qBAClB,QAAQ,UAAU;AAAA,EAEtB;AACF;;;AC5GA,eAAsB,oBACpB,SACA,UAC4B;AAC5B,QAAM,OAAO,IAAI,iBAAiB;AAClC,QAAM,MAAM,IAAI,gBAAgB;AAChC,QAAM,OAAO,IAAI,YAAY;AAC7B,QAAM,UAAU,IAAI,eAAe;AAEnC,QAAM,CAAC,YAAY,WAAW,YAAY,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtE,KAAK,MAAM,SAAS,QAAQ;AAAA,IAC5B,IAAI,MAAM,SAAS,QAAQ;AAAA,IAC3B,KAAK,MAAM,SAAS,QAAQ;AAAA,IAC5B,QAAQ,MAAM,SAAS,QAAQ;AAAA,EACjC,CAAC;AAED,SAAO;AAAA,IACL,aAAa;AAAA,IACb,WAAW;AAAA,IACX,SAAS;AAAA,IACT,qBAAqB;AAAA,EACvB;AACF;;;ACrBO,IAAM,UAAN,MAAc;AAAA,EACX;AAAA,EACA;AAAA,EAER,YAAY,QAAyB;AACnC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,QAA8B;AAElC,SAAK,YAAY,gBAAgB,KAAK,MAAM;AAC5C,UAAM,KAAK,UAAU,QAAQ;AAG7B,UAAM,UAAsB,MAAM,KAAK,UAAU,WAAW;AAG5D,UAAM,YAAY,gBAAgB;AAClC,UAAM,cAAyB,CAAC;AAEhC,eAAW,YAAY,WAAW;AAChC,UAAI;AACF,cAAM,WAAW,MAAM,SAAS,OAAO,OAAO;AAC9C,oBAAY,KAAK,GAAG,QAAQ;AAAA,MAC9B,SAAS,OAAO;AACd,gBAAQ,MAAM,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,MAE1D;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,oBAAoB,SAAS,WAAW;AAGjE,UAAM,gBAAgB,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU,EAAE;AAC3E,UAAM,YAAY,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE;AACnE,UAAM,cAAc,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,EAAE;AACvE,UAAM,WAAW,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,EAAE;AAEjE,UAAM,YAAY,mBAAmB,eAAe,WAAW,aAAa,QAAQ;AACpF,UAAM,cAAc,aAAa,SAAS;AAG1C,UAAM,kBAAkB,KAAK,wBAAwB,aAAa,UAAU;AAG5E,UAAM,KAAK,UAAU,WAAW;AAGhC,UAAM,SAAsB;AAAA,MAC1B,UAAU,gBAAgB;AAAA,MAC1B,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,gBAAgB,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ;AAAA,MACvD,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,gBAAgB,YAAY;AAAA,MAC5B,mBAAmB;AAAA,MACnB,2BAA2B,YAAY,KAAK,CAAC,MAAM,EAAE,aAAa,kBAAkB;AAAA,MACpF,yBAAyB,YAAY,KAAK,CAAC,MAAM,EAAE,aAAa,gBAAgB;AAAA,MAChF;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,iBAAiB,yFAAoF,YAAY,YAAY,CAAC;AAAA,IAChI;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBACN,UACA,YACU;AACV,UAAM,kBAA4B,CAAC;AAGnC,UAAM,mBAAmB,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU;AACzE,QAAI,iBAAiB,SAAS,GAAG;AAC/B,sBAAgB;AAAA,QACd,sBAAsB,iBAAiB,MAAM;AAAA,MAC/C;AAGA,UAAI,iBAAiB,KAAK,CAAC,MAAM,EAAE,aAAa,kBAAkB,GAAG;AACnE,wBAAgB,KAAK,8EAA8E;AACnG,wBAAgB,KAAK,0EAA0E;AAAA,MACjG;AAGA,UAAI,iBAAiB,KAAK,CAAC,MAAM,EAAE,aAAa,gBAAgB,GAAG;AACjE,wBAAgB,KAAK,sEAAsE;AAC3F,wBAAgB,KAAK,qEAAqE;AAAA,MAC5F;AAAA,IACF;AAGA,QAAI,WAAW,gBAAgB,QAAQ;AACrC,sBAAgB,KAAK,gEAAgE;AAAA,IACvF;AACA,QAAI,WAAW,cAAc,QAAQ;AACnC,sBAAgB,KAAK,mDAAmD;AAAA,IAC1E;AACA,QAAI,WAAW,wBAAwB,QAAQ;AAC7C,sBAAgB;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,GAAG;AACvB,sBAAgB,KAAK,mEAAmE;AAExF,YAAM,YAAY,KAAK,mBAAmB,iBAAiB,QAAQ,SAAS,MAAM;AAClF,YAAM,gBAAgB,iBAAiB;AAEvC,UAAI,cAAc,cAAc,cAAc,QAAQ;AACpD,wBAAgB;AAAA,UACd,gIAA2H,SAAS,aAAa,aAAa;AAAA,QAChK;AAAA,MACF,OAAO;AACL,wBAAgB;AAAA,UACd,iHAA4G,SAAS;AAAA,QACvH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,WAAW,GAAG;AACzB,sBAAgB,KAAK,+DAA+D;AACpF,sBAAgB;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,eAAuB,eAA+B;AAC/E,QAAI,gBAAgB,GAAG;AACrB,aAAO;AAAA,IACT;AACA,UAAM,YAAY,gBAAgB;AAClC,QAAI,aAAa,GAAG;AAClB,aAAO;AAAA,IACT;AACA,QAAI,gBAAgB,GAAG;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;;;AClKA,IAAAC,mBAA0B;AAG1B,eAAsB,mBACpB,QACA,YACe;AACf,YAAM,4BAAU,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACtE;;;ACRA,mBAAkB;AAGX,SAAS,sBAAsB,QAA6B;AACjE,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,aAAAC,QAAM,KAAK,KAAK,4UAAyD,CAAC;AACrF,QAAM,KAAK,aAAAA,QAAM,KAAK,KAAK,sDAAsD,CAAC;AAClF,QAAM,KAAK,aAAAA,QAAM,KAAK,KAAK,4UAAyD,CAAC;AACrF,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,aAAAA,QAAM,KAAK,WAAW,OAAO,cAAc,EAAE,CAAC;AACzD,QAAM,KAAK,aAAAA,QAAM,KAAK,aAAa,OAAO,QAAQ,EAAE,CAAC;AACrD,QAAM,KAAK,aAAAA,QAAM,KAAK,cAAc,IAAI,KAAK,OAAO,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;AAClF,QAAM,KAAK,EAAE;AAGb,QAAM,YAAY,aAAa,OAAO,YAAY;AAClD,QAAM,KAAK,aAAAA,QAAM,KAAK,gBAAgB,IAAI,UAAU,OAAO,YAAY,CAAC;AACxE,QAAM,KAAK,aAAAA,QAAM,KAAK,cAAc,IAAI,UAAU,GAAG,OAAO,gBAAgB,MAAM,CAAC;AACnF,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,aAAAA,QAAM,KAAK,mBAAmB,CAAC;AAC1C,QAAM,KAAK,qBAAqB,OAAO,cAAc,EAAE;AACvD,QAAM,KAAK,KAAK,aAAAA,QAAM,IAAI,UAAU,CAAC,KAAK,OAAO,iBAAiB,EAAE;AACpE,QAAM;AAAA,IACJ,KAAK,aAAAA,QAAM,OAAO,MAAM,CAAC,KAAK,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE,MAAM;AAAA,EAC3F;AACA,QAAM;AAAA,IACJ,KAAK,aAAAA,QAAM,KAAK,QAAQ,CAAC,KAAK,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,EAAE,MAAM;AAAA,EAC7F;AACA,QAAM;AAAA,IACJ,KAAK,aAAAA,QAAM,KAAK,KAAK,CAAC,KAAK,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,EAAE,MAAM;AAAA,EACvF;AACA,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,aAAAA,QAAM,KAAK,mBAAmB,CAAC;AAC1C,QAAM;AAAA,IACJ,uBAAuB,OAAO,4BAA4B,aAAAA,QAAM,IAAI,UAAU,IAAI,aAAAA,QAAM,MAAM,MAAM,CAAC;AAAA,EACvG;AACA,QAAM;AAAA,IACJ,qBAAqB,OAAO,0BAA0B,aAAAA,QAAM,IAAI,UAAU,IAAI,aAAAA,QAAM,MAAM,MAAM,CAAC;AAAA,EACnG;AACA,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,aAAAA,QAAM,KAAK,oBAAoB,CAAC;AAC3C,QAAM,KAAK,kBAAkB,kBAAkB,OAAO,WAAW,WAAW,CAAC,EAAE;AAC/E,QAAM,KAAK,gBAAgB,kBAAkB,OAAO,WAAW,SAAS,CAAC,EAAE;AAC3E,QAAM,KAAK,cAAc,kBAAkB,OAAO,WAAW,OAAO,CAAC,EAAE;AACvE,QAAM,KAAK,gBAAgB,kBAAkB,OAAO,WAAW,mBAAmB,CAAC,EAAE;AACrF,QAAM,KAAK,EAAE;AAGb,QAAM,mBAAmB,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU;AAChF,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,KAAK,aAAAA,QAAM,KAAK,IAAI,oBAAoB,CAAC;AAC/C,qBAAiB,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,SAAS,UAAU;AACvD,YAAM,KAAK,aAAAA,QAAM,IAAI,KAAK,QAAQ,CAAC,KAAK,QAAQ,KAAK,EAAE,CAAC;AACxD,YAAM,KAAK,aAAAA,QAAM,KAAK,QAAQ,QAAQ,WAAW,EAAE,CAAC;AAAA,IACtD,CAAC;AACD,QAAI,iBAAiB,SAAS,GAAG;AAC/B,YAAM,KAAK,aAAAA,QAAM,KAAK,aAAa,iBAAiB,SAAS,CAAC,OAAO,CAAC;AAAA,IACxE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,UAAM,KAAK,aAAAA,QAAM,KAAK,kBAAkB,CAAC;AACzC,WAAO,gBAAgB,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,KAAK,UAAU;AACzD,YAAM,KAAK,aAAAA,QAAM,OAAO,KAAK,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;AAAA,IACnD,CAAC;AACD,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,KAAK,aAAAA,QAAM,KAAK,KAAK,4UAAyD,CAAC;AAGrF,QAAM,YAAY,OAAO,aAAa,YAAY;AAClD,QAAM,gBAAgB,OAAO;AAE7B,MAAI,OAAO,iBAAiB,cAAc,OAAO,iBAAiB,QAAQ;AACxE,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAAA,QAAM,KAAK,IAAI,iDAAuC,CAAC;AAClE,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAAA,QAAM,KAAK,iFAAqE,CAAC;AAC5F,UAAM,KAAK,aAAAA,QAAM,KAAK,wFAA8E,CAAC;AACrG,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAAA,QAAM,KAAK,wEAAmE,SAAS,aAAa,aAAa,EAAE,CAAC;AAC/H,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAAA,QAAM,KAAK,yFAAoF,CAAC;AAAA,EAC7G,OAAO;AACL,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAAA,QAAM,KAAK,uEAA2D,CAAC;AAClF,UAAM,KAAK,aAAAA,QAAM,KAAK,+FAAqF,CAAC;AAC5G,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAAA,QAAM,KAAK,mEAA8D,SAAS,EAAE,CAAC;AAAA,EAClG;AAEA,QAAM,KAAK,aAAAA,QAAM,KAAK,KAAK,4UAAyD,CAAC;AACrF,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,aAAa,MAA2C;AAC/D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,aAAAA,QAAM,KAAK;AAAA,IACpB,KAAK;AACH,aAAO,aAAAA,QAAM;AAAA,IACf,KAAK;AACH,aAAO,aAAAA,QAAM;AAAA,IACf,KAAK;AACH,aAAO,aAAAA,QAAM;AAAA,EACjB;AACF;AAEA,SAAS,kBAAkB,QAAwB;AACjD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,aAAAA,QAAM,MAAM,aAAQ;AAAA,IAC7B,KAAK;AACH,aAAO,aAAAA,QAAM,OAAO,gBAAW;AAAA,IACjC,KAAK;AACH,aAAO,aAAAA,QAAM,IAAI,aAAQ;AAAA,IAC3B;AACE,aAAO,aAAAA,QAAM,KAAK,WAAW;AAAA,EACjC;AACF;;;ACxIA,IAAAC,mBAA0B;AAC1B,wBAAuB;AAGvB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["WebSocket","axios","import_axios","axios","import_promises","chalk","import_promises","Handlebars","import_promises","getRiskColor"]}