From eb8dac762743218e38cb9060fdf9c48b3d7fed7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BE=D0=B7=D0=BE=D1=80=D0=BE=D0=B2=D0=B0=20=D0=90?= =?UTF-8?q?=D0=BB=D1=91=D0=BD=D0=B0?= Date: Fri, 24 Jul 2026 13:47:21 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D0=B8=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CodeBase/CodeBase.csproj | 9 +- CodeBase/Controllers/CodeController.cs | 10 +- CodeBase/Models/CodeChunk.cs | 13 +- CodeBase/Models/RetrievedContext.cs | 16 + CodeBase/Orchestrators/ScipOrchestrator.cs | 85 ++ CodeBase/Program.cs | 16 + CodeBase/Repositories/DatabaseInitializer.cs | 45 + CodeBase/Repositories/GraphRepository.cs | 6 +- CodeBase/Repositories/ScipRepository.cs | 96 ++ CodeBase/Services/ChunkService.cs | 12 +- CodeBase/Services/CodeService.cs | 9 +- CodeBase/Services/LlmPromptBuilder.cs | 14 +- CodeBase/Services/LlmService.cs | 3 +- CodeBase/Services/ScipParser.cs | 75 ++ CodeBase/Services/ScipProcessingService.cs | 49 + CodeBase/Services/UniversalFileFilter.cs | 52 + CodeBase/Services/VectorizationService.cs | 30 +- CodeBase/appsettings.json | 18 +- CodeBase/index.scip | Bin 0 -> 813316 bytes CodeBase/scip.proto | 962 +++++++++++++++++++ PythonProject/index.scip | 3 + PythonProject/pyproject.toml | 0 22 files changed, 1486 insertions(+), 37 deletions(-) create mode 100644 CodeBase/Models/RetrievedContext.cs create mode 100644 CodeBase/Orchestrators/ScipOrchestrator.cs create mode 100644 CodeBase/Repositories/DatabaseInitializer.cs create mode 100644 CodeBase/Repositories/ScipRepository.cs create mode 100644 CodeBase/Services/ScipParser.cs create mode 100644 CodeBase/Services/ScipProcessingService.cs create mode 100644 CodeBase/Services/UniversalFileFilter.cs create mode 100644 CodeBase/index.scip create mode 100644 CodeBase/scip.proto create mode 100644 PythonProject/index.scip create mode 100644 PythonProject/pyproject.toml diff --git a/CodeBase/CodeBase.csproj b/CodeBase/CodeBase.csproj index 6bb0181..dba28e0 100644 --- a/CodeBase/CodeBase.csproj +++ b/CodeBase/CodeBase.csproj @@ -1,4 +1,4 @@ - + net10.0 @@ -7,6 +7,13 @@ + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + diff --git a/CodeBase/Controllers/CodeController.cs b/CodeBase/Controllers/CodeController.cs index 73b3e71..deaf857 100644 --- a/CodeBase/Controllers/CodeController.cs +++ b/CodeBase/Controllers/CodeController.cs @@ -8,7 +8,8 @@ namespace CodeBase.Controllers { [Route("api/[controller]")] [ApiController] - public class CodeController(CodeService service) : ControllerBase + public class CodeController(CodeService service, + ScipProcessingService scipProcessingService) : ControllerBase { [HttpPost("analyze")] public async Task AnalyzeRepository(string path, string name) @@ -22,5 +23,12 @@ namespace CodeBase.Controllers var answer = await service.GetAnswerAsync(name, question); return answer; } + + [HttpPost("parser")] + public async Task ParserProject(string path, string name, string lang) + { + await scipProcessingService.ProcessAndSaveProjectAsync(path, lang, name); + return "Проект добавлен в базу"; + } } } diff --git a/CodeBase/Models/CodeChunk.cs b/CodeBase/Models/CodeChunk.cs index ad3e3e5..10d006d 100644 --- a/CodeBase/Models/CodeChunk.cs +++ b/CodeBase/Models/CodeChunk.cs @@ -2,12 +2,13 @@ { public class CodeChunk { + public string Id { get; set; } // Уникальный идентификатор из SCIP + public string ProjectName { get; set; } + public string EntityName { get; set; } // Человекочитаемое имя (например, ProcessData) public string FilePath { get; set; } - public string ClassName { get; set; } - public string MethodName { get; set; } - public string Documentation { get; set; } - public string Content { get; set; } - public float[] Vector { get; set; } - public List OutgoingCalls { get; set; } = new List(); + public string Content { get; set; } // Вырезанный сырой исходный код + public string Language { get; set; } + public float[] Embedding { get; set; } // Вектор из GraphCodeBERT + public List OutgoingCalls { get; set; } = new(); } } diff --git a/CodeBase/Models/RetrievedContext.cs b/CodeBase/Models/RetrievedContext.cs new file mode 100644 index 0000000..0662006 --- /dev/null +++ b/CodeBase/Models/RetrievedContext.cs @@ -0,0 +1,16 @@ +namespace CodeBase.Models +{ + public class RetrievedContext + { + public string EntityName { get; set; } + public string FilePath { get; set; } + public string Content { get; set; } + public string ProjectName { get; set; } + + // Оценка релевантности (полезно для отладки качества поиска) + public double SimilarityScore { get; set; } + public List OutgoingDependencies { get; set; } = new(); + public List IncomingDependencies { get; set; } = new(); + + } +} diff --git a/CodeBase/Orchestrators/ScipOrchestrator.cs b/CodeBase/Orchestrators/ScipOrchestrator.cs new file mode 100644 index 0000000..d64bff3 --- /dev/null +++ b/CodeBase/Orchestrators/ScipOrchestrator.cs @@ -0,0 +1,85 @@ +using System.Diagnostics; + +namespace CodeBase.Orchestrators +{ + public class ScipOrchestrator + { + private readonly Dictionary _indexerCommands; + + // Внедряем IConfiguration через конструктор + public ScipOrchestrator(IConfiguration configuration) + { + // Считываем секцию из appsettings.json в словарь при старте приложения + _indexerCommands = configuration.GetSection("ScipIndexers").Get>() + ?? new Dictionary(); + } + + public async Task GenerateScipAsync(string localRepoPath, string language) + { + var absolutePath = Path.GetFullPath(localRepoPath); + var scipFilePath = Path.Combine(absolutePath, "index.scip"); + + if (File.Exists(scipFilePath)) + { + Console.WriteLine($"[SCIP] Файл графа уже существует: {scipFilePath}"); + return true; + } + + var langKey = language.Trim().ToLowerInvariant(); + + // 1. Ищем команду по ключу из файла + if (!_indexerCommands.TryGetValue(langKey, out var commandTemplate)) + { + Console.WriteLine($"[SCIP ERROR] Язык '{langKey}' не найден в конфигурации appsettings.json."); + return false; + } + + // Обманываем scip-python, подкидывая ему маркер корня проекта, чтобы он не требовал Git + if (langKey == "python") + { + var dummyFilePath = Path.Combine(absolutePath, "pyproject.toml"); + var setupFilePath = Path.Combine(absolutePath, "setup.py"); + + // Если ни одного из файлов конфигурации нет, создаем пустышку + if (!File.Exists(dummyFilePath) && !File.Exists(setupFilePath)) + { + File.WriteAllText(dummyFilePath, ""); // Создаем физический файл нулевого размера + Console.WriteLine("[SCIP] Создан пустой файл pyproject.toml для обхода ограничений парсера."); + } + } + + + // 2. Подставляем путь к репозиторию в шаблон команды (заменяем {0}) + string dockerArguments = string.Format(commandTemplate, absolutePath); + + Console.WriteLine($"[SCIP] Запускаем индексацию для проекта: {absolutePath} (Язык: {langKey})"); + + var processStartInfo = new ProcessStartInfo + { + FileName = "docker", + Arguments = dockerArguments, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using var process = new Process { StartInfo = processStartInfo }; + process.Start(); + + var outputTask = process.StandardOutput.ReadToEndAsync(); + var errorTask = process.StandardError.ReadToEndAsync(); + + await process.WaitForExitAsync(); + + if (process.ExitCode != 0) + { + var error = await errorTask; + Console.WriteLine($"[SCIP ERROR] Ошибка генерации графа:\n{error}"); + return false; + } + + return true; + } + } +} diff --git a/CodeBase/Program.cs b/CodeBase/Program.cs index bebe296..f4a37c4 100644 --- a/CodeBase/Program.cs +++ b/CodeBase/Program.cs @@ -1,3 +1,6 @@ +using CodeBase.Orchestrators; +using CodeBase.Parsers; +using CodeBase.Repositories; using CodeBase.Services; using Microsoft.Build.Locator; using Neo4j.Driver; @@ -9,6 +12,8 @@ if (!MSBuildLocator.IsRegistered) var builder = WebApplication.CreateBuilder(args); +builder.Services.AddSingleton(); + // Add services to the container. builder.Services.AddSingleton(sp => GraphDatabase.Driver( @@ -17,18 +22,29 @@ builder.Services.AddSingleton(sp => ) ); +builder.Services.AddSingleton(); +builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddScoped(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddControllers(); builder.Services.AddSwaggerGen(); var app = builder.Build(); + +using (var scope = app.Services.CreateScope()) +{ + var dbInit = scope.ServiceProvider.GetRequiredService(); + await dbInit.InitializeAsync(); +} + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { diff --git a/CodeBase/Repositories/DatabaseInitializer.cs b/CodeBase/Repositories/DatabaseInitializer.cs new file mode 100644 index 0000000..c4afa5e --- /dev/null +++ b/CodeBase/Repositories/DatabaseInitializer.cs @@ -0,0 +1,45 @@ +using Neo4j.Driver; + +namespace CodeBase.Repositories +{ + public class DatabaseInitializer + { + private readonly IDriver _neo4jDriver; + + public DatabaseInitializer(IDriver neo4jDriver) + { + _neo4jDriver = neo4jDriver; + } + + public async Task InitializeAsync() + { + try + { + await using var session = _neo4jDriver.AsyncSession(); + + // IF NOT EXISTS гарантирует, что запрос не упадет с ошибкой, + // если индекс уже был создан при предыдущем запуске + var query = @" + CREATE VECTOR INDEX code_embeddings IF NOT EXISTS + FOR (m:CodeEntity) ON (m.embedding) + OPTIONS { + indexConfig: { + `vector.dimensions`: 768, // <-- УКАЖИ ТУТ РАЗМЕРНОСТЬ ТВОЕЙ МОДЕЛИ + `vector.similarity_function`: 'cosine' + } + }"; + + await session.ExecuteWriteAsync(async tx => + { + await tx.RunAsync(query); + }); + + Console.WriteLine("[БД] Векторный индекс успешно инициализирован."); + } + catch (Exception ex) + { + Console.WriteLine($"[БД ОШИБКА] Ошибка при создании индекса: {ex.Message}"); + } + } + } +} diff --git a/CodeBase/Repositories/GraphRepository.cs b/CodeBase/Repositories/GraphRepository.cs index 85f87fa..b736855 100644 --- a/CodeBase/Repositories/GraphRepository.cs +++ b/CodeBase/Repositories/GraphRepository.cs @@ -44,14 +44,14 @@ public class GraphRepository await using var session = _driver.AsyncSession(); // 1. Делаем данные "безопасными" для базы - var parameters = chunks.Where(c => c.Vector != null).Select(chunk => new + var parameters = chunks.Where(c => c.Embedding != null).Select(chunk => new { id = Guid.NewGuid().ToString(), projectName = projectName, filePath = chunk.FilePath, - methodName = chunk.MethodName, + methodName = chunk.EntityName, content = chunk.Content, - vector = chunk.Vector, + vector = chunk.Embedding, // Защита от null и пустых строк (база их не переварит в цикле FOREACH) outgoingCalls = chunk.OutgoingCalls != null ? chunk.OutgoingCalls.Where(x => !string.IsNullOrWhiteSpace(x)).ToList() diff --git a/CodeBase/Repositories/ScipRepository.cs b/CodeBase/Repositories/ScipRepository.cs new file mode 100644 index 0000000..eb89d98 --- /dev/null +++ b/CodeBase/Repositories/ScipRepository.cs @@ -0,0 +1,96 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using CodeBase.Models; +using Neo4j.Driver; + +namespace CodeBase.Repositories +{ + public class ScipRepository + { + private readonly IDriver _neo4jDriver; + + public ScipRepository(IDriver neo4jDriver) + { + _neo4jDriver = neo4jDriver; + } + public async Task SaveChunksAsync(List chunks) + { + if (chunks == null || chunks.Count == 0) return; + + await using var session = _neo4jDriver.AsyncSession(); + + await session.ExecuteWriteAsync(async tx => + { + foreach (var chunk in chunks) + { + var uniqueId = $"{chunk.ProjectName}::{chunk.Id}"; + + var query = @" + MERGE (p:Project {name: $projectName}) + + MERGE (m:CodeEntity {id: $id}) + SET m.projectName = $projectName, + m.name = $name, + m.filePath = $filePath, + m.code = $code, + m.language = $language, + m.embedding = $embedding + + MERGE (p)-[:CONTAINS]->(m)"; + + await tx.RunAsync(query, new + { + id = uniqueId, + projectName = chunk.ProjectName, + name = chunk.EntityName, + filePath = chunk.FilePath, + code = chunk.Content, + language = chunk.Language, + embedding = chunk.Embedding + }); + } + }); + } + + /// + /// Ищет в графе узлы, наиболее близкие к переданному вектору. + /// + /// Вектор вопроса пользователя + /// Имя проекта для фильтрации (опционально) + /// Сколько кусков кода вернуть + public async Task> FindSimilarNodesAsync(float[] queryVector, string projectName = null, int topK = 5) + { + await using var session = _neo4jDriver.AsyncSession(); + + var result = await session.ExecuteReadAsync(async tx => + { + // Базовый запрос к векторному индексу + string cypherQuery = @" + CALL db.index.vector.queryNodes('code_embeddings', $topK, $queryVector) + YIELD node AS method, score + WHERE $projectName IS NULL OR method.projectName = $projectName + RETURN method.projectName AS Project, method.name AS Name, method.filePath AS Path, method.code AS Code, score + ORDER BY score DESC"; + + var cursor = await tx.RunAsync(cypherQuery, new { topK, queryVector, projectName }); + var contexts = new List(); + + while (await cursor.FetchAsync()) + { + contexts.Add(new RetrievedContext + { + ProjectName = cursor.Current["Project"].As(), // Читаем имя проекта + EntityName = cursor.Current["Name"].As(), + FilePath = cursor.Current["Path"].As(), + Content = cursor.Current["Code"].As(), + SimilarityScore = cursor.Current["score"].As() + }); + } + + return contexts; + }); + + return result; + } + } +} \ No newline at end of file diff --git a/CodeBase/Services/ChunkService.cs b/CodeBase/Services/ChunkService.cs index dcddcd3..52f0845 100644 --- a/CodeBase/Services/ChunkService.cs +++ b/CodeBase/Services/ChunkService.cs @@ -29,7 +29,7 @@ namespace CodeBase.Services var chunk = new CodeChunk { FilePath = filePath, - MethodName = method.Identifier.Text, + EntityName = method.Identifier.Text, Content = method.ToFullString().Trim() }; @@ -68,7 +68,7 @@ namespace CodeBase.Services chunks.Add(new CodeChunk { FilePath = filePath, - MethodName = enumSyntax.Identifier.Text, // Сохраняем имя енама + EntityName = enumSyntax.Identifier.Text, // Сохраняем имя енама Content = enumSyntax.ToFullString().Trim() }); } @@ -84,7 +84,7 @@ namespace CodeBase.Services chunks.Add(new CodeChunk { FilePath = filePath, - MethodName = classSyntax.Identifier.Text, + EntityName = classSyntax.Identifier.Text, // Сохраняем объявление класса и его свойства Content = $"class {classSyntax.Identifier.Text} {{\n" + string.Join("\n", properties.Select(p => p.ToFullString().Trim())) + @@ -119,7 +119,7 @@ namespace CodeBase.Services { var chunk = new CodeChunk { - MethodName = method.Identifier.Text, + EntityName = method.Identifier.Text, Content = method.ToFullString(), FilePath = document.FilePath }; @@ -140,7 +140,7 @@ namespace CodeBase.Services if (!namespaceName.StartsWith("System") && !namespaceName.StartsWith("Microsoft")) { chunk.OutgoingCalls.Add(methodSymbol.Name); - Console.WriteLine($"[ПАРСЕР] Успех: {chunk.MethodName} -> {methodSymbol.Name} ({namespaceName})"); + Console.WriteLine($"[ПАРСЕР] Успех: {chunk.EntityName} -> {methodSymbol.Name} ({namespaceName})"); } } } @@ -184,5 +184,7 @@ namespace CodeBase.Services return chunksList; } + + } } diff --git a/CodeBase/Services/CodeService.cs b/CodeBase/Services/CodeService.cs index 3fee434..51173f7 100644 --- a/CodeBase/Services/CodeService.cs +++ b/CodeBase/Services/CodeService.cs @@ -1,9 +1,10 @@ using CodeBase.Models; +using CodeBase.Repositories; namespace CodeBase.Services { public class CodeService(ChunkService service, - GraphRepository repository, + ScipRepository repository, VectorizationService vectorizationService, LlmService llmService) { @@ -18,7 +19,7 @@ namespace CodeBase.Services var chunks = await vectorizationService.EnrichChunksWithVectorsAsync(allChunks); - await repository.SaveChunksAsync(name, chunks); + //await repository.SaveChunksAsync(name, chunks); return chunks; } @@ -35,12 +36,12 @@ namespace CodeBase.Services } // Главный метод поиска - public async Task> SearchAsync( + public async Task> SearchAsync( float[] queryVector, string name, int topK = 3) // Возвращаем топ-3 результата { - var results = await repository.SearchAsync(name, queryVector, topK); + var results = await repository.FindSimilarNodesAsync(queryVector, name, topK); return results; } diff --git a/CodeBase/Services/LlmPromptBuilder.cs b/CodeBase/Services/LlmPromptBuilder.cs index ff32ee2..a738096 100644 --- a/CodeBase/Services/LlmPromptBuilder.cs +++ b/CodeBase/Services/LlmPromptBuilder.cs @@ -4,22 +4,24 @@ using System.Text; public class LlmPromptBuilder { - public string BuildPrompt(string userQuestion, List graphContexts) + public string BuildPrompt(string userQuestion, List graphContexts) { var promptBuilder = new StringBuilder(); - promptBuilder.AppendLine("Ты — опытный C#-архитектор. Твоя задача — ответить на вопрос пользователя, опираясь ИСКЛЮЧИТЕЛЬНО на предоставленный граф вызовов и зависимостей кода. Не придумывай методы или классы, которых нет в контексте."); + // Универсальная роль архитектора без привязки к конкретному языку + promptBuilder.AppendLine("Ты — опытный ИТ-архитектор и разработчик. Твоя задача — ответить на вопрос пользователя, опираясь ИСКЛЮЧИТЕЛЬНО на предоставленный граф вызовов и зависимостей кода. Не придумывай методы или классы, которых нет в контексте."); promptBuilder.AppendLine("\nКонтекст из кодовой базы (Граф зависимостей):"); foreach (var node in graphContexts) { promptBuilder.AppendLine("--------------------------------------------------"); - promptBuilder.AppendLine($"[ГЛАВНЫЙ УЗЕЛ]"); - promptBuilder.AppendLine($"Имя: {node.MethodName}"); + promptBuilder.AppendLine($"[УЗЕЛ ГРАФА]"); + promptBuilder.AppendLine($"Проект: {node.ProjectName}"); + promptBuilder.AppendLine($"Имя сущности: {node.EntityName}"); promptBuilder.AppendLine($"Файл: {node.FilePath}"); // Добавляем зависимости ВНИЗ (что использует метод) - if (node.OutgoingDependencies.Any()) + if (node.OutgoingDependencies != null && node.OutgoingDependencies.Any()) { promptBuilder.AppendLine("\n[ИСПОЛЬЗУЕТ ВНУТРИ СЕБЯ]:"); foreach (var dep in node.OutgoingDependencies.Distinct()) @@ -29,7 +31,7 @@ public class LlmPromptBuilder } // Добавляем зависимости ВВЕРХ (кто зависит от метода) - if (node.IncomingDependencies.Any()) + if (node.IncomingDependencies != null && node.IncomingDependencies.Any()) { promptBuilder.AppendLine("\n[ВЫЗЫВАЕТСЯ ИЗ]:"); foreach (var caller in node.IncomingDependencies.Distinct()) diff --git a/CodeBase/Services/LlmService.cs b/CodeBase/Services/LlmService.cs index 4cf4540..0b37732 100644 --- a/CodeBase/Services/LlmService.cs +++ b/CodeBase/Services/LlmService.cs @@ -4,6 +4,7 @@ using OpenAI.Chat; using System; using System.ClientModel; using System.Threading.Tasks; +using System.Xml.Linq; public class LlmService { @@ -30,7 +31,7 @@ public class LlmService _builder = llmPromptBuilder; } - public async Task AskQuestionAsync(string userQuestion, List grafContext) + public async Task AskQuestionAsync(string userQuestion, List grafContext) { try { diff --git a/CodeBase/Services/ScipParser.cs b/CodeBase/Services/ScipParser.cs new file mode 100644 index 0000000..27be748 --- /dev/null +++ b/CodeBase/Services/ScipParser.cs @@ -0,0 +1,75 @@ +using CodeBase.Models; +using CodeBase.Orchestrators; +using CodeBase.Services; +using Google.Protobuf; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace CodeBase.Parsers +{ + public class ScipParser(ScipOrchestrator scipOrchestrator) + { + public async Task> ParseProjectAsync(string projectRootPath, string language, string name) + { + var scipFilePath = Path.Combine(projectRootPath, "index.scip"); + if (!File.Exists(scipFilePath)) + { + await scipOrchestrator.GenerateScipAsync(projectRootPath, language); + } + + var filter = new UniversalFileFilter(); + + using var stream = File.OpenRead(scipFilePath); + var scipIndex = Scip.Index.Parser.ParseFrom(stream); + + var extractedChunks = new List(); + + foreach (var document in scipIndex.Documents) + { + if (!filter.IsValidCodeFile(document.RelativePath)) continue; + + var absoluteFilePath = Path.Combine(projectRootPath, document.RelativePath); + if (!File.Exists(absoluteFilePath)) continue; + + var fileLines = await File.ReadAllLinesAsync(absoluteFilePath); + var declarations = document.Occurrences.Where(o => (o.SymbolRoles & 1) == 1); + + foreach (var occ in declarations) + { + int startLine = occ.Range[0]; + int endLine = occ.Range.Count == 3 ? occ.Range[0] : occ.Range[2]; + + if (startLine < 0 || endLine >= fileLines.Length) continue; + + var codeSnippet = string.Join( + Environment.NewLine, + fileLines.Skip(startLine).Take(endLine - startLine + 1) + ); + + // Возвращаем чанки пока БЕЗ векторов + extractedChunks.Add(new CodeChunk + { + Id = occ.Symbol, + EntityName = ExtractSimpleName(occ.Symbol), + FilePath = document.RelativePath, + Content = codeSnippet, + Language = document.Language, + ProjectName = name + }); + } + } + + return extractedChunks; + } + + private string ExtractSimpleName(string scipSymbol) + { + if (string.IsNullOrEmpty(scipSymbol)) return "Unknown"; + var parts = scipSymbol.Split(new[] { '#', '.', '(', ')' }, StringSplitOptions.RemoveEmptyEntries); + return parts.LastOrDefault() ?? scipSymbol; + } + } +} \ No newline at end of file diff --git a/CodeBase/Services/ScipProcessingService.cs b/CodeBase/Services/ScipProcessingService.cs new file mode 100644 index 0000000..a3fbffc --- /dev/null +++ b/CodeBase/Services/ScipProcessingService.cs @@ -0,0 +1,49 @@ +using System; +using System.Threading.Tasks; +using CodeBase.Parsers; +using CodeBase.Repositories; + +namespace CodeBase.Services +{ + public class ScipProcessingService + { + private readonly ScipParser _parser; + private readonly VectorizationService _vectorizationService; + private readonly ScipRepository _repository; + + // Внедрение зависимостей + public ScipProcessingService( + ScipParser parser, + VectorizationService vectorizationService, + ScipRepository repository) + { + _parser = parser; + _vectorizationService = vectorizationService; + _repository = repository; + } + + public async Task ProcessAndSaveProjectAsync(string projectRootPath, string lang, string name) + { + try + { + Console.WriteLine($"[СЕРВИС] Запуск парсинга проекта: {projectRootPath}"); + + // 1. Получаем "сырые" чанки из парсера + var chunks = await _parser.ParseProjectAsync(projectRootPath, lang, name); + Console.WriteLine($"[СЕРВИС] Найдено {chunks.Count} сущностей. Начинаем векторизацию..."); + + // 2. Обогащаем каждый чанк векторным представлением GraphCodeBERT + chunks = await _vectorizationService.EnrichChunksWithVectorsAsync(chunks); + + // 3. Сохраняем готовую сборку в графовую базу + await _repository.SaveChunksAsync(chunks); + + Console.WriteLine("[СЕРВИС] Проект успешно обработан и сохранен в БД."); + } + catch (Exception ex) + { + Console.WriteLine($"[СЕРВИС ОШИБКА] Сбой при обработке проекта: {ex.Message}"); + } + } + } +} \ No newline at end of file diff --git a/CodeBase/Services/UniversalFileFilter.cs b/CodeBase/Services/UniversalFileFilter.cs new file mode 100644 index 0000000..bebb246 --- /dev/null +++ b/CodeBase/Services/UniversalFileFilter.cs @@ -0,0 +1,52 @@ +namespace CodeBase.Services +{ + public class UniversalFileFilter + { + // 1. Оставляем только те языки, которые нам реально интересны + private readonly HashSet _allowedExtensions = new(StringComparer.OrdinalIgnoreCase) + { + ".cs", ".py", ".go", ".ts", ".js", ".java", ".cpp", ".c", ".h", ".json" + }; + + // 2. Глобальные папки с мусором и зависимостями (универсально для разных стеков) + private readonly string[] _ignoredDirectories = + { + "/obj/", "\\obj\\", + "/bin/", "\\bin\\", + "/node_modules/", "\\node_modules\\", + "/venv/", "\\venv\\", + "/.env/", "\\.env\\", + "/dist/", "\\dist\\", + "/build/", "\\build\\", + "/.git/", "\\.git\\" + }; + + // 3. Паттерны автосгенерированных файлов + private readonly string[] _ignoredFileSuffixes = + { + ".g.cs", + ".designer.cs", + ".generated.cs", + "AssemblyInfo.cs" + }; + + public bool IsValidCodeFile(string relativePath) + { + if (string.IsNullOrWhiteSpace(relativePath)) return false; + + // Проверка 1: Расширение файла + var ext = Path.GetExtension(relativePath); + if (!_allowedExtensions.Contains(ext)) return false; + + // Проверка 2: Находится ли файл в мусорной папке + if (_ignoredDirectories.Any(dir => relativePath.Contains(dir, StringComparison.OrdinalIgnoreCase))) + return false; + + // Проверка 3: Является ли файл автосгенерированным + if (_ignoredFileSuffixes.Any(suffix => relativePath.EndsWith(suffix, StringComparison.OrdinalIgnoreCase))) + return false; + + return true; + } + } +} diff --git a/CodeBase/Services/VectorizationService.cs b/CodeBase/Services/VectorizationService.cs index 3bb40a2..cd5f7bd 100644 --- a/CodeBase/Services/VectorizationService.cs +++ b/CodeBase/Services/VectorizationService.cs @@ -22,6 +22,28 @@ namespace CodeBase.Services // Адрес нашего локального Python-сервиса _httpClient.BaseAddress = new Uri("http://localhost:8000/"); } + private const int MaxCodeLength = 1500; + + private string BuildSafeContext(CodeChunk chunk) + { + // Метаданные (оставляем всегда целиком) + string metadata = $"File: {chunk.FilePath}\nEntity: {chunk.EntityName}\nCode:\n"; + + // Вычисляем, сколько символов у нас осталось для самого кода + int remainingLength = MaxCodeLength - metadata.Length; + + string code = chunk.Content; + + // Если код слишком длинный — аккуратно отрезаем хвост + if (code.Length > remainingLength && remainingLength > 0) + { + code = code.Substring(0, remainingLength) + "\n...[TRUNCATED]"; + Console.WriteLine($"[ВЕКТОРИЗАЦИЯ] Метод {chunk.EntityName} слишком длинный. Обрезан до {MaxCodeLength} символов."); + } + + return metadata + code; + } + public async Task GetVectorAsync(string text) @@ -55,7 +77,7 @@ namespace CodeBase.Services { // 1. Склеиваем контекст // Мы даем нейросети подсказку о том, где именно лежит этот код - string contextText = $"File: {chunk.FilePath}\nClass: {chunk.ClassName}\nMethod: {chunk.MethodName}\nCode:\n{chunk.Content}"; + string contextText = BuildSafeContext(chunk); var requestBody = new VectorizeRequest { text = contextText }; @@ -71,13 +93,13 @@ namespace CodeBase.Services if (result != null && result.vector != null) { // 4. Сохраняем вектор прямо в наш объект в памяти - chunk.Vector = result.vector; - Console.WriteLine($"[+] Векторизован метод: {chunk.MethodName}"); + chunk.Embedding = result.vector; + Console.WriteLine($"[+] Векторизована сущность: {chunk.EntityName}"); } } else { - Console.WriteLine($"[-] Ошибка API для {chunk.MethodName}: {response.StatusCode}"); + Console.WriteLine($"[-] Ошибка API для {chunk.EntityName}: {response.StatusCode}"); } } diff --git a/CodeBase/appsettings.json b/CodeBase/appsettings.json index 10f68b8..105660b 100644 --- a/CodeBase/appsettings.json +++ b/CodeBase/appsettings.json @@ -1,9 +1,15 @@ { - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "ScipIndexers": { + "go": "run --rm -v \"{0}:/workspace\" -w /workspace sourcegraph/scip-go", + "python": "run --rm -v \"{0}:/workspace\" -w /workspace sourcegraph/scip-python scip-python index .", + "csharp": "run --rm -v \"{0}:/workspace\" -w /workspace sourcegraph/scip-dotnet scip-dotnet index", + "typescript": "run --rm -v \"{0}:/workspace\" sourcegraph/scip-typescript index ." } - }, - "AllowedHosts": "*" } diff --git a/CodeBase/index.scip b/CodeBase/index.scip new file mode 100644 index 0000000000000000000000000000000000000000..6c9e262e9643ec1d8f60ac22a6bbd9f6b9bad17c GIT binary patch literal 813316 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

etqBCy?&&%d;K!6-RoC+ z?XU)~FJF00)++%>_l9yT6ytIVSA9b{b125G)awzKj^B_$unfK=B(=S9Xzp()Piz}0 zo0c^9H;$mWgH&%axeNf`R31K})Lj%jaF> zTX^|Ut$nh#uiaYE>h{~xHPW|vXryqFy)A>f{kGLnx9?3y?p_b%pl;vmsczrvt8U-B za_TlV*6)@dcbR`3pok}o{FmP?=O62x|FSE0?(dZm5r26<u`(^)9 zISLq;yZ-$$QcXu#FCP1%OS2Oj3;nJU7a9ubyUOQ1BAY@A#qwR{^B*;O6edRh13ES` zT}XiSACw>Zh*2ocZQXp{(*9F%kr4U;}oWg!w1S+cMof`$KrmVy!X0MggMXP z`kRNH0kX|LN}B(ctO^%-X@sf$!|CerhdtC|=>8whp!d|B;o`{ZXRoqviG9?yzV}aMpOe8HKfew4A@###{sagZdgfeuyUVm~eb=KWnD< zW{czjng~pg9My{Z%*RQpU(pZFeYJ?;MCDsQUdCg*H}(S=Vot|um02^awT|NAWrXsc z=!b8cWR|d2y+~1D>$lUH``aGOjh*}L3_JJRtFv>zlaAbXJdnfA{f_6({f_U>{m#nm zTzG@NTOK8_^}FTe3T$1ZsqDUXd~St#d2L+Ye7C%5%aHO0k*(h?Z@Xr=$X0$9Sx2_Q zRr$R#sz=HEx~&^-!fZU3eJ?lHiho zGeGO_4O9uye=h&(c@grYCH;V;=8(_AfTw>@e)J_nE-Ny9e^9=3gDulH9qXhml@g48 zP~P~&;S!9J(1b{)*F@Nu%7HITtE&$WODpiy56Z`HUNxSA_2!4=hdd&?_2yFQh)ccu z>4qPcgU6r@Btxp*4rKY|ury`eO!1-zUA?IZ?-~jcX zlBsUBP`{DJyQnaJcv+-P6yXL-%Fih1%=3{bZNvfoKP%%Fyo&h$tbFm~mmPl?HJ%eb zWIU@;1L!{|L{*+uME^PAqaL^H=);(Cd-#xtWi)0WEamoaJjfK5;xx|eZFbxBS|^g* zpzrM=+$F0;UtDKy4@+13UT3Tki}^2)IG)2#`R9*a zxlp5Lv4Uo0q4tD{<2$KQXttcVDi`2?uI%&{7AozftFCP|X3=A=)ehSFIrgC5#0O;c z;?<1cWUX0iBfxJqn1jzTAbAolwp-oSmFpFd+?DIa$XDg^KN`!q6b*AWh3EnCFn>Vc zx7eF$)T=?Ki{Yz*`IdPC?J(*dJQEY`UJ*Q-NpYJ=iK8}3#5yO5LW2ggNC|7#7rUSg zQ6~-WXJkP;f*s~}NwnMb)1a~+-cf&nZkDm}Mr##F(LFT3!#cLPMhOO5yN-vvEceTe zR<+UyHsmi6KxUS@wOekDk!??(<^ z?j?-;^Tu-f`X{4}76~fG>-!{r(mav;9xDly_$hcouz}b4zpu%ybxh)T?QC~%v)Y=i zH%}Jwj}lzNiyZ&uffZirbZZOi4{Fjh^0mO~WCdYCv;uxTe{cMJP3~I9=18uYA^s9;ALe%oW=nPoV;d#;o8Bxx zPB6_rp?Dp zN5NRLwX--^nV&i>uwSJcR06z-2Hg#MU$xQ<7Tc{V9`|O}j5-Bp>RrG_>xG&6$sXQU zcQ9rCdFSR1W?BIV1acDG(5!cl%+2AE64K=l)|<7dZl&D~^H&X81$Rd+WPY&5Q~?LB zgd3h*jYwZ+LSg}|ySNi=bnN>|CjfO@j2-Q8?Dqw+5cn9}aC~2R2Nq%$s|F%;g0=Oq z76zn6b=C<|i?Q~ett>1yYC8iQ2)sre+GY*MoA8cL;^4rG=SR<5&yV zviwD2x3f+bedk5{>vK$Tu525+xAoYJfZ$pRyGgs&3C_?7IMK#{6F3Mv3?P_?tcDOJ zab2zU+FZgt40Z+73_FpfAj-N!SPQWp%s^s8n>#a)a_<4}SA2m51v*}*)`T>#1haK2 zZ-jp^l#s=DO~~>R1B6~UTcbk(r(RH>W9d76U}3SX!UBgQ0Lal-w z09KdU=@kL-Y_qWx)XvsB*eLj^a=KN=zG?=wcDvPPR%TNp-IdtZFw>h8(ootWTWtqV z<$pSs+vq28pjOwRd%@@w<_mpPi+%;E#MSk8Qb`qcveM^(P_sKi?8q$|kQ8}haA1xo z#>Y35McSqKKP{qQofS_@xKRJ}nDe$CEnY!xQ*~R9evum(D2tnQ!jvlY=)U$I*h1Jq zv_aA^y1dL*p^*R5SZz zEsyTwfeVgwDKWrxboxEf!F3-Ub6Tk*jxQX?aU3cub@V-?@4#fU*f`BJOsKgZ5`6xr z&Hsbv9?jxVNV)pS zW~JMMHbpm2E%n%5fd)!a)*77}D_vqGc{zh!i;E3-1L-J1XF^S?d+fmKFvJGzYP||f zYeA!asut`n1-pwy(Y?}~4aECB_0zR7et|N0rq*cCf2X14Oqn^#zn*Zio4@ z5-@tswst_-Ej*pQt>{l*F&#{Y`2W(h1HFG5%ej*1?C4zsBmSuxmQYJi+w^2BpeF1O zNjJULKpdT|n5|t`3ZD7wQUIqbL}F7Ie>=osRd~)TjmDA#;Xn6g)az?YXIkx98>7mf zfSNcMo;l#i)0oK)R&=K8bJL|@nj}2^7tWGiyGeiJfCv1g)~&j9-?^0IPfen5U>5tX zK3A``HENgjac5s6jpWz8StWvTWRXHBaBZ=$N`EU1wUsx1D~+E0eeI+z5*;r~r{T}i zv{VZbV~U;nHH_v3T!dox=2RgTb+RJSY&FZB#ab0BSB3qeTb(b1$A!AkTng%XRi!h8 zO48%xrXY?PsDD~>aBPY@)@0|QYkKuYw~h;>i-%+*5Mw(p>>Dx=L-w`OBqCWSm=O~p zEr>48N*93<2L>iu|3$bBU|E9xa&!rc{|vBLxL!3eV(pxi{X(ai{1q0il(f%A2DE2jEaaY15J7Hf0bS|n`Oc00>U*W_Fe z{92d#AO(Ge`E`yZ<|c%#Q04B;fGu~mVj2-t+~=^wb>g`g;zEy&FlUQ4_I4!@k!qc4 zYf;?T?BsaS8ebhSn#|OEWwvz&R`z_!K@ru8h$580*JmJ#>YYj#zASfmMnQ{x1$BKW zYX1i6xlu5qn-s4*C;NUljNQ;##HHA#>_-&S&4?I6ZG7h-dxF|^F?~XJm(=L9C}@l$ zZw#FW751`|w}k8{L1hMBbkdU%;EF5yde|H&XqM)W*5WK+c@Z2wa(wSj5phv%!86oZ zY&BJp8>9EVO2O-b`>TTT*>PL!Z7WVRv zar1@B=n{#~Uz4*ugX%v0)R1v|+BSzY=x)|?bOkV7v22y z?FNlpi}}hl@2MI%rpd`0mOyR21GQK~V7N)Bu5Zk6l*a&AF*UGcH!0$>dWZ%hQ#4Mj zX}<2t69Z?~w7SvlZ#lN}PlnKLcXbhEHUnkBeVXfLL=U0ezBmItbayK?B%TP}XtDJK zlDsNzbSF+!)cj7IaA5x7G*6=DhGVspwX>*oP$BkyTptg_ekM$XX8W|XOG~Vm6~XDJ z&bY2(_l@OTg+XG1i3d{k+--MoqXA(c)X-Tk3>08H4rErEF1qmeL^eEbsyAkP!Vd(wAXr2A3GM$qPdq{bN{9{Pl?>sgXD&wn`^&) z%4k412=(MyX*d}Dta!*lk<&#HyRbk_Tub(s5@P4tjoC{l9FprFyk)jA4JE<)-7S`8 zgsV_QQmsyw-d2q1sBV)e4PbbMEG3+u+MOuj&!!9Ad)D~6myDTAkv*7JHSCkvwswTD zP)pvMdPv#&TTz}x)?T-cyQ8uoEN6j z!t80Kgc5|v=tO=p^tc(=r-Hdgt3si&2$7(Oijyi&#crO1$I|l%zNUrv)JoHVtl5H) z75Y#kP3D^&t+-Bi+dcMR&Q-{j>0swSO3D9@?q8_(66PP>C*$y$<}P%g`LwyCwROTb zP?8!&-8}iwL7`rED<@rS2M_3GKLZqo)GB_Mf4mI={X1bI6rpE$V4}NOQPRJ%RgX5F zFK!6n@W(Bt=2>ymzY}gkGdkmeo9<@CP5&wk;l7A{c}?!Iu0^XMwHZlXh5Q9#l|&T2 z{7SB=2f~Z`!;4a44irt}F+=iObRw${mPTM3aUx&mE)=20*-P=$Vg6#d&lF_-3|QiD zJM7GqRmG(XH&xnAGKK3nM+Hs(0C?hnxX~R7s^)eeDk%}>ClWJ^{YYDdJ)zg;*7@-3 zwKzILl})Z@AJSJq5|Z&7Yn-5>m&G8i3W|En|He-bYyx{``ZH{G5VXnMAYnYr&iEnB zZxJkEevR!3;|DCQ*cj7JoxtdWv70rD6i3+;eGN2PAkRU!zzAZyJk4o?G5VvL3G#nn za3+7CJP?cqVblQd#rFB<2RY^PK^eDd%4PMHH_B_zHO~~88>QM<4-xevl^bc!!q`&p z-~z)gFySLxSb%2?nZYOFP!vETBqT_!!ON~ zaH!el2ynP?^%nWg#nW3r_H-S&PV$x&`38k|z|78KL=YaVai-gfNZcR_F~Eu4N00L5 zh7&b-`lQDSx2vF|GTcs77Z;IhhR|k2U{Vzlt{@^jeEVuOT!PxQ8inm3a|~%PpiQHJ zOZ06$3MZ%ZnAzE2q23{Ut=K+LEr8`xc&vx8zJ(e>N<#i$WTjavX}Aw6ljaOQ?PU$Q^=S-XJ@uz16_U5{QE=22%V2kXwbd&6jd#PFW~-<`e*J%e0o) zR3Z&YPYWLjkeJaSXX=aUQ@Ex+bG-IstrDv5q4-WT6KCdbXEuZCR@fb?lwb8J+zlY| zK6|}W=T$urN00nreK}U25fP8i0Jc@|80`11(nP9TVfP~TVv_Cgk)|bB>_v8ah=LHJ zvGv5I^JFcZkaRc%;`lfNw_bG~=U|iX-;`{NoJb@ZFY(D09Gp73&S5|B zQR8smMXxo=Y%(>+{#CCM!G6`;hu%u`mtOtCm$?_XW<9niLB z!f_9>>HDQWeFdl;f>CbpTTKXlWW7+*mcEE8{KM!s0xJ$*Uxb$`$eOnx%-;#&OyKr5 z>Syb?%*(2edWPaVz{w~Y&)My5H=vJO!0~qim+2(fCq+SWcH%q0Z4tK{PY&K!@67kF zE`0^4Z9?$+f@-wRSU}+`KuLG;5vK`6k(%-(5hMtorz{qxexUS5`T+p93IRIh%=%LO z3j6C_5*KyIr=%FsKLP0FLO5js+MKInajih$FHzJ*wq32p$ zTj`vFOS^w9BBxt^Npb^V&^ zbpWzeY*bIlbX|w)Oe8Nb^p)l#gq-IweH{XY`!S=h03}G|$rsc|h8*|tMf4k>%9y7U zPIH)IsY28h#Rsa8cQWikH3$<8Fu>(Pz3^l_B3qMkFOxz*{y-!Zgz#j%>w1kkXqsd^ z{tRGS#rhocyI@||>vV;Jkrc`57l7QjL5O5eDRq6T+n@lPPe=mD_Ski0?#2nFn^tG-b=k69p#}?XCCg`EGZy zvvd9WCJ$9^kha@upIkrs{rPYmMz!QAf{(ONf+0Oc%#kY9f#}=7{29Quh||PVaO;W{ zu%aXn^yoK$m5yi6TXfWwEFsBTbo^HWEztkNF~5Cu1jPp|=;JG3p%Nu~GfuiWfM7V+ zpUO*nt-j}0I9fp<8&)lO(-Ge>@yjz^`j5_A3{3b)6cB(sndxYwbDM>k_%ncQ&!lJ` zt+fFwDRt>9%}bmGo_u)}>2U2S$}{cf%jh?N-6ojFcNtJ~&UU*-eK33{ga!L}9?+_+ zSpW4#{X&Ru5JdEyqR6W5=M?@<@PrQGsdFCd*Ex>?$kt4P{Ftmzk>pT zSf$GWD&XD3a|d*;P#qyQ*iv04^2$-wWXCzH5Qde8V2JuwLrYaUgG(OUDXJW&ts!d6xuK*<@e0}FcCvx&|pW?gv z79sb10g*KB19Te+&}~AndlDQ3v1q{bm5>w4raK-;?}{m$To#`he+DqYQl8RnsydHK zq5WG-drY*NpA z=hUes#PY%_le~AzA28kR%J}4Z+()5Wm}*$*uaJUbUz#_{g)$BvOvI zY*st^3Rv4SNdmrDCnW(s0?-bDohRjw&$pRWNy>}wjAJI%j1nBxj!Rw{qTc{lW`}v& zdZMlaY(0qv7~pcTqmTO8;qfp~ot3}j{Z{_Kln@X-Z}d0L&w_E1x(9t_SYm(NV>E{s4emGtKPD zwnGyi0Z3+0cpjQh?pO{@d?Y|(t9TxoH}lOpsqoNOfZ8s2<6Y1)oS$-P$7ZAQ0zO;io(3NFXJ1C;z%J40g8` zm&%J3#0GF|+C&1-;R%$IKoRlEOzX4=PuoOgzpHJo?HyQ}Bdo0NYjLB<(ApdZP=p(( z8=E(R>`0fcz-?TaK}HpH z7i7=iaXKc#)-YJxTBKC|N@HEHi%B(uHvp-ghbU$^Q$uME%pw*&_ACnpT2?5f>=YMU0lq*C{|6ry)mEnGU6^1pJaV>e;#dwn`@+lh{+MEh0pxSsNA5H9dMDA%>InT|bW*MIiFG zIW3XQ{)H2Z@PblJ(mi75g2m%6FJhr*nH3~h)YwAnE4lAgf}cYPf;alpooa#{ve!J- zgo%D1F%E8bvOJ6$Iq@>J8pPO*8m>5gUH_Trnu`{02bl@cVneS+JoC=y4Z;y<* zB5TfW$Cyz&iC^r4@p$K*V>!zk={li6j5@tIvvX&HH$t^R5NF?!Z+A|I`F-XxOA@N&LZ~$+>s_1`D^#Ms1m){DHFRD=kUu3 z0(P=3Gt5(*{z@?j9t7q0K-F1e?RnTf>dv2L0B=`U9qnQ-hv2cHvn5AKYoE zVw#8KQN;Tl`LRfP)emdRDbu-zmsODDz+FO17g7?$H0C`^@3*+h}>IYx5QC6 zp^nQ5nV(@js`58GjRXQ)1?hy2k5}xekdip+hKyCp^T#G7Bbh1WSpu^Dr<5dkHb=b$ zoXF{wZvmUcOHz!_e+?6AHQvD!iWVtQj-x&QFYeM=0x6Xv(=qttazl6~`NP%+3?gnx z_QJ~oM_b1vzIG0om8m=(H;X`CyGnx#l%p50HPjPSi4S+?8%_BP9gQA-*2gf(7F# z-9st#JLb8RNGUcLTz5&XICHrE70e9{d8P)n?xeV((WN4d*MGxZYfIp|_pI=oh}R)Z zj(?();|KSon>bT@KrlX!91iZEB!->+aam`d&xsDd)|0Xe-aeM2r)b`!|Jk3`sW+?}dqZd_8)gv<8f z9$jxTG~9C)xpbM)wMcrb;qpSYLZ+E8)9Nn2E({QE#r78L+&R9V)^KYU<_$b9x76yP zh#cR_=|0;B`%E3BxliIryE^T9%tMWYlqPza3Y~af{T*A)$*$3pEEJsg$5sJ3UbBA*?rNTnVqI&F(*pRMs_}y;Dv1BXU zhZ`MIC(W~$X3?hk%%GBp)LrQAjJB) zqS-3!rR^;?H%9)wW6n$v0d9Y-iy-BB(kzGrWYKbozvh5QK{wjdFcSxJ`!Z8NuDk(E zEdQf(zbxuhZ_JO2MWwOl$!m#!=Dim5cuQ1fav%h&7n#+V24U2m5jtQq38gHlL@0tJ zut|vw6idKQtsQUCY@Z-dmgJ9JYgHRsr`aRD?qaVC9AS(Lpp@eud>5TKl-u9G6do5n zWja!$$gOy@2RlYx*28~SJLL0n_VLSnv{E=#@J$8yvC(3giEdSPS~_5dt- zUEb$@`b047?nwEw!SobX z{9vwn;+Viociid7JPO7)pQJm8L+>CLS-4@h#cErUDi8BQf! zEkfjxy3X7wNmH2Vy;0q-3e?{Wzto~rhf!S$Ck!uBbQ6*)MA9{-`h{jcX2mm3)0gU5 z5RRrWf2~B;;h<7|VknB<=G}eCsqQNvD9@z4LXlI*Hh9!7qHOG&;jDVySnjYxO6ale zf>VU}vvQ5+^npCRG>PBZ?ax}TfYi0UXR158$kiM(Bv+S1YRYyce-!k zst47=Xj=41^?S79E9~6DlP|8PWz>8M2)yec6o>7m%DuJI*v^srLUjuJJ81`(z2c{% zXVL;^x8TBzL(_D-FJ_%CQZzm=kVa<98HDC}G~T zjSn0|joR<`dUc{ujWlQ~gw%2*DanSpo963ybV4Gai?qQ?*KGmQfa=yzH zcEV2-6Ewmbe3o$as|iL7rrR=yfwHcvoP=pKnj}k35xD>^Hj93$3LDRnXD{lBCLu~_dUL7CNVICh|ndRk;Vq&MGM4ZLUre@b^=csb#t z03iY$B&kJRotZA!)o3sn<&of5^dhb_LJTSR50CZC^aGRde+#Vl| z@;Jp1 zsRcJ2-&fut5J4qg$5#7e&m&X&s`6JFdrEtW*j=VpJe18_E9WXa>ZUTt zTZp7RS0TJ4KsJzWHArElfa({!XH6`t+whpvD5{26bclNn2jAH~;C?eq12tWEs(!W2 zf2g{IMi&wyE9FAmqD+NkDby~+6t}3FCNxBN*dTn#9U#kcC(%lt;!zhyYZ)Dhu-%6~ z$6@4-%U^A9rfFkP&Da{gTJFTB`mw2+8~L||Z_~@8`06#eTYM;FH$fTJaH~`CCP~h? zQ&I6sXqruv{qIM=;)}*|)fJ?QULglk`6w70~AUE?Pb+AOtj@)x3Uh# zt#O&69gH7!r+cgU7PRw&gvt)b28|l3zVXvz+1+ZMX1{1wQSiy&BjmH5M@R&fPgIxO zikh$9FM=fCU@&{Z&E!M_B}p%2;rq6+@J18$gkNICCv~X$Zbjl zWbr^MQ&7SKsXnvh8r{|QKti0p7_C=sAviJfZV#kdgdshUs{2*Q+!SWZ3?4|;C94Ng z^~>&oR6VnJAXT3jirGDo3dk@XNYyvyBUCnkXVc!vr+6S$|AJlp8_ol%fZ8(d%-Oj; zkP41=t3f$1J&>w}w$FQcAXP6<52R{7j0aNn)hO^$Zh9b9n+OT@C8pb?cpy~|V;ps_ zm#T;UttgA|90!jYCeU-m4%vN?c8qYl#%;U^#~I^wC~Yg6Kqho zq~XkN%%p+?Zqwxr&etu}=mi1J6d$#kNG2b(>ZF{aG0xKdL%WaK z(KAT}JF7@1tD9SHak}=@9AZA|%iIhj2R*?&^N;Qz1r1%gnvDr+~4!a)Bv=DgIX=@fRgPx4DE13CbeZ%Q~YEKBoZ9ssA8ZKgnBnR+@ zpob*j`oM#|RQN~DOh{BzV6Eu@je7HR>y${klF41|5qu(QcFLv>h0WX%rcXpQzu$c# zY9i6RmF_g8Pb3MD)jo?)M72{CQ2&l;eyiydQNt@bu)RhWW*DqRrualOP{YA7(0M?H zOx0!ed?MSG@gj>)L`^e;PegTrvOgu=C?sVjR?jD*W>AP63O1jJY8I+yzd$|_HMbZF z+Tt!t7Y>>&i}Vzqhz4)J6c6VUQ9%Dc>l0B33@{a>Qbn)O=spoWm4u%oii(STBC75E z;1k&qmnptJ5jEdbpNMLRz-5)7r9Q<^k5%@Gs3{oJSBL4~BP7KqVu8vh>ecchBbJ+e zxvFW5EWbcL5jDFQdH9Sq^L^|SX3>@66VdRqh%U`Q1AQV2>>%N#A^ZaSL=+C00TOFC=Zpe6s&huc(H@6B=ZtDW&!)2V$;&yT8hbitRP$k+Gpesf zfprSgIiuP{NT@F{B`d`_qk0(QBy=Lx#@{)kdJJ;TsNbUvzQWF#AGwov)O-r6#&yh$ z9_9xn@2Fm(rI!vtf0pTVkakm7*W~$VH=C-m)NZTktxo%(nnghYgTtn1wZE&Dp>D}1 z{okD9H1Dfknyg{oban}YW5flDkjmT`bKd-`Jyu)|q1PZuJvKQW=L*WAe9RtQND@gR zCsAFVi#02}MCJ~~j8kdqGwpg8ubRX9DAWvsGp!~$jX>?*0+o60R_aZmv5-Ft!RB+p zLJKuAsm3${&u!y$6hMqJ$3?I3moA<;K(+_Pic88+g(*>2n#wcV0F^MgYNJOv6pSj; zF=;APn;NE6t{c8stJX2bY=B2}I9lDrz@b6q?{F8&Q`E;RMj~GRD8l89y<;W=MotIS zGaS%UJ2`JpD3i$zG@yTy4eXnU!}wL0zk4UuoOS0EIt2xh2!Y+CYE#Jw)Fi(ft$9cN z)-O4;q4YR$w38AlIZC{(WoNxPQSV*)Mb%Ko3Q4jCSE3%$l;hhj^wEiw$C9S=k&#;ab%? z710#Xf*_byk(Vj~jMLAi#h3w}7BGjS-7!-;33zAfNUW*^4OGy^MhYg^Ps%=cQo!u9 z*di+|_GJZC;!dKZ4i!~z)JnY7uy47*8>)c9yKzdwz>5MV3@RmuA!w&}NivDjc&&D9 zFVpqrCin_lXQZSE@Q#291^FVVOV`4)k(I_30ZPx~Uxbm62Pis6RrI(LKV(9)+X>cA zu3ta7uB54jYIl?2B#OS{KcPa{p4#<1cc!A^mBNu~wbyP_PK)V#9F(c3I)?U++J*hR z6e(cu?k5CV(VX2P;LT&Xs~s*#g-gr@83V1Hkhdn!*MT)-Bb;Klgvb%u2b<-`fAtd| z@y=oXI&)3~oRQY~!~yXH{=*$st%(#tLsfaRpoZy`j2gzs5PeLPluhJHCuLczUy?a^ zTf}~shp2dkfkh4<)p!7xTiW+YN{ENXUe?((j!HAz)N)kzchcT@dx(b`F6{4_#NK{B z3Tc*7KlV*ywig|A4JI{-*tU>h)s_JFO;Cm_ zW0*f=PHDi7a7{CXoP$4RO63Ul@c854)IBT*q-|FGb5p^ncLVp#8- zhz40FPiyk;)8~#$#Fw1h`#8S%A}|uhMX4kpS-Vbm*$;UO0V# z3j-*Vx~U-ZE{c+vl@4xXKhM!ERZI-kkfD4+i=FE=#BEwWCks{b4Ao4gN1kY2tX7|{ zx4Wo7ydJMx%jcOCL8WSI-*K;53%LA`l+Lh9?-^vb}*=@Q%<26Kjm(qR}>pd z^qv=l1(zdVsB}?5cxZiic<=G(DLXX3u5!8}p440)y>hAVhIB(k zF@lZT$lZ%8efP-R9Aqt(T0Mxcy(xN)OrDo%qaWo*#FLOWZyFu){#GeCMo*;yo!!M^ za)=$*EOl#x=WUldDTNi(`l}$clpsRYT!qlxZ-o`qM51{s8~>0&gh_zxp0ETFs&fbRB#cBo-s^JwKIKaUSB2-Oc-j0+YLe-<-A4I6StauRNV{#9cwb?f)cYl^BLN(6} zQG}|?{TD^3W)KU(vqcfAX1|D0glcXv6m*Q*GDHz-@L57}WUwU%;v_=pIl4&!9TbS8 zf;9)!G8fgSSF~b#N@WFwzyP22YDN+2sdz*YsaTsaJcE#U7QnLIvI3r4feiqrK8E9Y_p#nQddT9v1z+r?6hfD%YBbF_UFp>fK{RShB@W&VC zCLGQZVO1>TrTQsqyNi#^1m8U0jGK@#grdcuD;=8_$#37OFVx91$8I`QQiNj-ez95H zrpOV_4^%hcJ}lu8s_uLXRodwO6tJQsu2iQh?K;_L!eCkq8M8T0M=t+16`NHi6&a=2 zkp|9A55HA90v_G@W?NNp?TcR?1$3%(#ZG_ZMOE6fcmo5^Sc&Iu+BH~=I_e&%>dDcA zRKf%!ou5$ZYVGPg-BvO0C1H7ybLaYXxN|PyGI^HmHF8u?iY7MKYBXABV6PFcwg-?n zV%CLV?c*EWE6!fEu88SiZirO?rQl8^g5jlYdMRrWFP@W;mct%I^JMQQ#(O`b)^1UE zhN4|>6f+U;On(=Yyb6BZ`2XzO`2=p+sm|kmd{r=s|E1Q8mFg+H4K6}!6pAn0j64k zrGQ^XCnEyf(X%aB|K%sVNlzDD;josT-6n{LRl&31++1KcDQHjV=m{GG6FOPOy@8)S zgOk2dsn+IO4LoblUSn)6m>b}GMp;rYqi{BJg~VtEa!DkG)HG-Y9ZIPto}WS1UDQDl zPc;?)b##a=ajcJ8GLFWS<`vMyW~Ok~S!<%A}uB@?J7@fij96$dkkJMw@av@Sp}8zOVa(1();5iez0 zL+gAaboxMdh%t#A{nBp+M+aW+J!J}B^;OzAX-s`+#8yoJrCQ*LHY zq#x8E#+R^8c!rYg<~4B2@nCI5ywQtERwzEGi#8PbwGN6*_e>35Bbq-~wQkJ`VDy1Q zF{x56{exjvTZk~~EVgj^kn5`@4C<_P#WkygElgX|qZ1su0aIu-p&3cFi77@~vr7u0 zsM1S*WT7Ll;;7VVX;`L7$Pg>Qs8oRiy(GY%HdMXrfRH>D)lKq^)z17tYRb$?yG!Q4=o~sn`HHc=E*}HH^`V zZ%4N|z3Fl^G3lt(goq`PRWF=~iJr>GE`msU&JY?o+%RcyAxX(r!s*8r0oTY5V=uGwAz_`?$*m&~Bsn#;c~m>bsp@mgN&sQr z^b9B9s(<#!di=~?@Jh}<65eLexmn()Z^7){uxOhZ!ROecek6a{JNvENtUe`EB5M(F z?y7ku(T@UOV}Mm`?Fn;5<>{~ES((Af7GJ$`3NMC6SVc+>S@c!2K4936Av%^Tm38fWyRH{41tZEN_g6 z`w^1<2`4BJpB+;GFK};2XM#j@h?&c)If0@xBr%K*G|)0Xx)Hf>^aH&{Y{4c!`3w8b#tX-Cu4l3(xrd~Pj@I$0D215AP3cS17YU*= zwZ)wwCN~l-d6%uo3mcIDF`n(waUkz^zknkttR2w(ulB_GC~7A9#ZQN2j{xzy!$vcT zp4J$2hyAqI5fMS;b8@hFiW=GjDOM=*;}+*5yM60PNchKn{FeJQpdt37rV>Ye+?ZKL z>Hha;%m>8OOuBT)BBnH2!$y4Q2X%~yk1wB_D>x=9Z+V6M1!5gU$cOyOYSjA^H!d0T zA)5>c`k>%+a-}Ttjh#FKWT%H)5#bX^7(-w}+$nJQ$nm{9;T%EaL*zz)$Ai+j7w~o~ zm3?Ri`|(czLEO9!nO9lZ4_NbC-4<;3!RB!D)^KCEAyyyCP!sTk$1*rM@@JgaE5%bt zRBFS$6(tgTne%1us{;8K!=T@Ep2>P(!!{oUF%Gck>w%1J%=~V*g&I%U^p)GfVbhmg zBJ6Bd{WH$Xvl=zJ{f7CyQi|F}j@oIG#y%N#eU$S)F^soArh zp{kUKHC52%f7iF7SXRb!FUe;#jKxXY zOZ|Pcb>F?0`aAk95dvR2&^XhDJXs`D` zP21(j5N;}-#?Fk|$>oV37t3x6_q*#wbBb)?1J8{6{LYLBCZC=TSrxThRde`Lb2~CE zYc_lMU2Aer^#Gq`Yic^Nz`9AQBk~4d@Yn!>r2*WZ7IDa|>PiwO;j*B7b+(=Drh-hU z>BJ9Wu)ZBR!1Q}6hDrS1bKFr*s(D+MJT(HJkMA733 zmr^piO4=ZW;k7@&$^dE@pP%J?=W)vD*!R$Zl9K~$&}MJja|bVWi)Ryne)ZtEak;UF znHv*Fh?(*4&}N{%JtbVzfM7g?prXuD4AqG_46;`v2KjgggOz7n-DVA$n7xzuQx~~3 zp$y2swwkSvm_oSUY;A&0e;Q%lX=pZ~>8k%wI5rsTXSPECay&RtnzVblD>~jJN!qF- z4JUs5nB&+VPWW}F?bU>!5o8TwPX-iCI57{8clNXIH8E4S zaj)Wz1T>e9z`?**HbsCm7bND(ZJ9k9&dY?^O+J@x8cOX05H&5vzSpnG?e2K*@;&i% zUSmy7kLAEM9Rxrd)?bOcr24%xRVEmRD(F0LZvU|NdSx#yLE*4(xSknY=u3%_( zVh;Fq=e@)1Uoc3KeE-+Z3Pu+TPyF0n@i{SpsovaN{j9+ZN<~T8;C(%{`QH8-wK;Iu z*WGXRJ3L?avb$e{Fy~Pa0I}Z6&nnkj%rB`0$=1BkpIqZKt|rD2@RF}V*hi6H`%^Cd zTVj973hL%ilC(*Ba@MX0u{kgoEVX(;Wp*}b*3O70PC5ZnnekG>LItlncX~*+Mchqq zah6I*P$zUDN+CQ{>J|yVojMi7pcG@Y>rkvuM-*ETAwJgF zocyQUb|n)rRTmKY&^3m#piR^wTHTa3EAP8Fp5;9Cc42%rlX5M=vL?05AdZ73CV69O z)bjc@p5`n;Z%#t3F@)87qY?ucu8S}~Am@W4c1=byI+6rfF`tKi{L%1v zd@K_~M2?JsINHybs3YUJj2@6bOG&^q$Q>)Lm^alEHiemsdjC|3oXNu1L%K!YxW*j^ zZ_+G_xlvAtjg5(SPizz(U~^Px-G6l>UpAJjcR+?wF8`_iqb$CXKgo2zO87yNeoBiR zO7!4ey0V^=O-6ZI?K$~#cc7KIMPsECaekYZeH*_;#%vQ#{FGXDcS$^>i^9by!tbOEvdI{~Z|3k{RKX;Z)lg!x(?Rh; zZXDXLIsa>oJ2%IeUqRp~E`b_Ve$G;SV~KBdH%;;LBjK?gN+-c!v~feo|BIYedX{AU zf!(bIT+XO=CS?FzV@qI92hl`STbC|-1Y=+BntpCegE6&OY3@VOtV*{#(p*d!`A+UY z|6B%n0SqGF(CnypI0cDy1g89FUjrCBHZaTGwk?>T`D_A*Lh^utj8_BDQAb9yl;}uqA1KUOqNdm zZ^p75BF5^eIG+5)LMliqs`v|4jV1B=oCgUdgrulo>j#zI)FcMR*kF}em#O3CEVl&% zKl(?QzsNw2zG<`T2%u4@vJW)AX^4nO|w5or0J(G~{k2 zxft{fu(va{230*Vjt_CXDJekxt^B(?DpJfwJAT5r*IsOOoNp-JlEuGfV8Ei@mil! zFjONesi)MhRFGNJixzbpJNgIYNb2&EC<0lh$H?GYKwaM@p?B;$dVs|a>Qwilhle1h z=gIg9TWzb+tuJ=y9W#2-hznNtW{_h+>6fbLA%M=&Lt&znCc`7sF4z0zAK*D(n4u@s z$c%diZw4a~6B+|f`+B2}_iDM8u_!Yvo--mmP|K2EXp&F;YNR@t2p56G5NZadvcxm6 zYD~+Joj7r|P2i@fCS*s|O38kkcWr;GbrQA5kG2QrTJEXU7CFgDX*a_HGVUwOl(hM5 zX9At()hLce#cF6rn6nC_Vrc}BsJ|M~Gi`SSgzD25IHT;eau$8%7*$7G%*->KDG_>} zI$GvBA){oJ>O8Ov;_r;*j(EvD z`#sPa6QhVD7s3(~qo6vyPYTC+Cb@+7Q|ztoSW~_<%BKc8ijd;{ZN5A5liRpJ;@Kid?lwb`kwXyPOrsmHR_O9a!j->1bb*d_gu@8-%Mj%1<^ z=h4qMi{md5lBDofFRjKCmPI+R{kDCQa$7wz^K?9Lu0m$kh3Ac3IF?r7Tg@curIf=* z3Ra3wjTsZPa2C)^LS*H3yTO+t21zwkM9@@>skh4;d343cuzMcJZsJtlpcmoAlFgGy%MEHqWb_RxVXd)Od7u0A?z{NcCC4S7%Ye z&y~d)t%(X)!Bx_XlS|z5R6BO0uU3uGTRr(zO)g`O^_}jd#fV6DbAVxuvSwL7S?+rK z)p>y1Tp@G+g%Ba9YSv3n9g;3tqK7`>d+$hu0Yy(uhy%!!Dv8Fl(X8tYd~g zk&?cqM1>hHq>O(8wZu-rcMwDp~_h$qUq!}Iq7#t9(sh>rfY0QQV z{?SE!9DAN%V?BHX-2rKG3t|AY3!e&+~ul&xG zqc+JekxT5Urf^8wBcxA6xP#=wWHFAyZ9ECuaFIPPC4?Z^xzAUovSXwg*5@lr0E8pM;^EXHSu|QD$KF77jrXn=|btDdDqylZrCN!@Nr7woNQ*XIY!rk4Bl)caG(5 zatYeL+1LfH)ysCwhuEeSn6`TREb?IHKn4( z8+W-$2%-BW``Nv6zmeh}N+P(MUHSUPOzU31$G_2@K5(>VJB{nBJ%jJx9 zh9OHOeXfwl%qZnWTb>qr#!uYQ~r~=?HLf`XCr!c=5Q}%M;5mkl_bGN-m6@@1Y$> zp=@sU|HHA|^_l1tIed&!ls{?KJXDhU8_!qxlf=?nH8uqE$+y?yh{RrBdu3KV&YWwQ zf08-P0sf`IQ#9f6-oE#j+;w4+TdlAsj$BfSGW|`1Ct?6m8((;x?mX9YdJo+528<+! znf|9zfX5|h*S4A`@u+mWhA2h^P0rS4*Wr1I8gks*r)FDcn&oIG8>C`r6av|$w1I%BM0)X^dnE@H#N)wA9NtnpTUl5{i2yVdoFbp? zSSHbUtkz&$JM)Nxy=WAc>qbwic!2-Z>r732+VUJ5;j z>|x2pcCk7sBI_LXtNe4;xKjrDPMqr@bBz6awLwgmYLn=SZ7Tw+21M&6hYl0{lZ3Nx zR)i$Xy7#Eh+u^Yzr9cp&yNBjhq{&&V6Wo}Y_Sdlc_;Y_jnt%0W zNa~*?C-Whl$EOH0j@(Nex3Tj|W>}#acasNkWSWr)FLdm}VvC%h1sH9i^5eioNOq@1 zCoct()WN=Vw9C_|6jT_VuqWd?o|+PgOZ?e>Hoaj@Zciq;g_=#2%0c;J24|ar-Y(9z zLjZ$|tfN7Nw~|XvwYMxYNv@2Y(Pcu)3Cav~GknkO|4GiOAR!Zd!1pS4B<;=`@5LM7 zd%xr^_|-RVj2dBnw;^VPielMsu|7(Zja^~C?XAv63n8hWOwf!;Xxb!1^~5F#I8`W+ zsu^ykk|LD3++uwbsX%QZoP&LFrpKm`@;#VAX96Trqe#5UFEg7$i%znv*IIiGdNhB-a!DARIb^asn_-ywYft8?7_7HucaTX-Q-oQouz9lz<`9q&TA(ldsMrN3aTk zBy*+YY7seRM35S4X}K28E`z?X#+};H$LrcTz9)X8GsKZHI(t~l)TL(-Fi0kmvv^P9 zgcxW{NS&XbkkU6G^E&31S16j`%tP%XrXIz>AF@lmz$RsvM#>^c2EbrR_O@Tjc*5v` zj0r_11ZlWe%VwF59fC!~z1Ua8*&!yEk@s^#)@jmM1)g_qB&=}B^hiSrR)Xu079bCN zNDVk>5#=p>x7{->oeg=W)x(XMrN*>ID%3d#Pmt*a)08^T=)_uafH_(Wh#{Yr;!*)) z7=Z{=Wl(b>VG{wZke#>nkdrw}hD=D%=~fhkJq>ZjX3f?jDdZ4Y+9p6}0YmEa78hG> zg!;upX=7$kB}$XAx-RAZU2AgJX3~WA!cftow9qNuQ-=7t-Z+3=+R$JqkUJum__uuJ z&R|$cPPJ=Ako*Fp6M}$lN%QQC4lxZ~&w1a-o^sj?0n zJ<-o1M*i+sJPm&dP=4By#$FxLbxI7vX-)@v00S3JX0cvjz^W11vG_CZ75N)ob#c!3 z0gE)QMN0XUE(B^iEr7}pa{((#gPxA=E7O7W6^QL6T9Q(+*sjAIw?tXoWzslgY8d9t zqJR*9a)%w>I%D8LU*jsEfQZek0#$Fb$*FKBBPv4aghn0a>pTBk6cfX8a1Ko zsbK}Q+QK5Tz)3X|6g*vNvo;4KDeQqzv6!yW*IuW`qDW|GGqnZ`vM?zIDw{nyfoq{= zLFFUkCKDc-8Pc(-C z8~hRRPZ;cLw-$H=WMz<|%L+6oqb67B;r7rbT7lk@4q`7MNvBTF@F^;on~?~8veBB+ zyHl>~JfFa|v#@e^psV9_BUV?}d^!=uJ)iK3)0MY-wTcQ&RIo?@YxTOFI?UYERv}p8 z>j`Y)^s!o5tjK}~AQ*zbaD?Ks<`_9AKEULCz^4@qBjSjsqr1VIkx9MB~ zkw}qLM^!>aJauE4vr2BtdTuC8(y~kbB5O!bywa_C7`cfvm84oMI%9dWPG&R4EyOTV z)bfb*_`+C56SYylHXM|%#Bt+EQmtZEihjP{$Vy2o@td5mk)2|`SfKaPK;32KD&V60 zm>h)vwr~lMLnDc+p=fBWQ}8t<{4$dc${uu&w9E=<8bt*m$Z!fu)I9bTEAGNa zNtm*XE;*hH`G*Vs<922Uu(tYLzCtwuR9| znUdp%rI>j_c+rA#u*C9#9SQ>QH{CoYDaVoMsc5sYsOEg1d{{(&W|8HkFZdMWXs5BVzuM@avsB5OdP z*!Hrd{J0&sBqO>@VA7IN4s5_?>vMB>9ted3#K`0*#Q+*2`$nQhG^C8~3#_}@p4FC8 z?&AOF<*S<+T`5AC6R8Wa^3?QiT@IK3k@yiF5>dGtPmAo&bmGMZ+$HNp3jtw{XZ}VZ zDk4VZ4-&`AKu<7_!{RnHVI>_hykT}J{~Zja$ipOOJVXWkhg|H;m=$c&*(F#l@dNGj zQgD5%i()cCty>jrZ)MW_|4u1hp+X2?qm`6xt_{qX6?~OBB|zfz2?&bpnXisz)OO>* zI|yH)Q!hb8^%;W*B6iG!+>5gmkby+p1s97j+}o+v7-9QhL8^5q0<(l|sFIom`HbIy zqDad4>rvP2GVhNvB(?MPDPk8uNqnkovpV}zT99w z`UHGL+-GwLd?dux4J6AAye$p(AWmR$WY5@h89* zfjTh6XUkBGO@4O^-oHhZ@RP;fdGhij2G}8H-^#uk62`#waP!u*t)`aaqHSV?(D!CP zO8k{@;w!{l#xR}a2&9G586m66E4m5Q6@pw9FNZJ1!0aS}$~f!;=;?wrof zeG!;}2wq$1oT@b%4w(Q;*3e70r`D*Q#4%wmo%#ygwu{4I7~CZ2ftc+sP&iYtui(J# z=8RU|82j%35Y+@eLudp9U?3`KO5zACz~N>l3-BjGMyNLSa{MZPA&n@@Zr_~LAS#Sr&R z0b}55PoAuGCn>yW>P&sETM8!mhDB*-wKjjJiv>KNJxuUP8PH8 zR|#Vv(#I;NdJdevHNyFJ0M8~>DCOR`m#DA6YLhs-2R(d~WRbXTqM!`K>nI+35vD~x z=u%Ys>hRat15NPiT!qk#OI!V!@DzvMO&RkcW9RAhHRwPW#DqCM5MXi4;g&VDNIi&> zx~8b0F9cg0L_?_c1YqF09K$POHP`v@#SyNI2WzO$U)hlT)?E zT=Y%Ug@7+D$_3+ttx-Q!Bi|OHNTpu{B_kL;1c=r;lvyV2$ki5Jzr^F3lw!fjUM}`B49M-fYu%8mIQo?1(y82`vsf`A-;|0B6JA~?E8PS92rh$G^Vt1cGOj{n{_OqTJMJ_37N|AXvE^YK@V7o;~ zn<4zG8p=R)(@bY0>|~tQ*vnm9jN&_4eI>kvsC#M3`ff4Z|t)xG11lX_wG?5mpA96q)KLNe-}6PwHW8rQ)B2Jb=Pp-tEv}etU##fg*=c zBNN+Hq9c9-X|{=NItpn7EDr)%HB>8QTuST9*W|7nR+lG3(~b2uQW+bHI**HK@_j!O zfrON~dl=qHjy5cf;9GT3C|uQwb+Imzaz(fpdBQR^fTG*7cn?i^hu>p zcirI;#BAj`V+XNu^E4wojGqWip;ioIuQotgF`ew-3e2|Yqx|S$3Bf@fn6AYRNC|)% z#Y8`4G0}@}gtAa{hC`W-Vk@q+s=(J`qCeBFqmz$`{s$u*s8MYQ<3QD)32~uxy<~`u zt-%b$oljI$v@*;hBGh%#wUxg;HoSU=SNl$-sraa!hY9_U5l%8O)?VSQ zkDp|*ABX@#;Tgi49)n{=on+o_SB%E!*hxopKX%F;yu^5j07{raja}9p!JyI1dlYt@gnokP78tDjj~*c4RQ4wAucX%OWD;UUdVw_Y!Xww8R3&RZ4&x3jUo<{ zA#4&F%D|Ojt=O?J|80brmE(vbs#i_YiElt^s}M0m_|gT4ff%KDpGS#EIX+)Qb`qla z;+8V`kx&xyV~B_p31e8C?#cS9LhMX1oQUSN&G?D%6Jp|hL&!%1lod^R_Gmxk9F7T< z*eC3PlU?{b`9?#>hY+DGS4twUFXd|Y+%>~TJ{~8Vlj*JEPec@PWq->sL?NhFVwmck zvNR1addcf83Vc=4P87T_GqjtZ5f-aty7^;2fF9e$zJBAd^l)enCRMCvt_-yJaMm*2 z@lC@?Eb%l9`jNOnST_E480-PT$_#X|NERR$CCLy})T^AtOMUFmKeD^B(4fp!B!zLs zuPz`?vuuZ#hl)aTCS|9#h?oHs-8xlUI)letWbbJaf-lQ4)(}zbe8^=4Ckl~DMvKI) z@cJ{6QCyo}xn_7jhvA$!-#bPkl6*C!?_lMlOdMk^#0cnvd1+mb) z6fyQYBi!gUP1H7y-{=!R(pDDd*+}#mZ95M^pHZ?ahy=Fmis(D>rqITQ$Uum|Shkr7_ zr^1C}6Ia_Jkkj(=sem0JUL_ePw(xuQHa_cpLVtvw&P2NZ+flPY?z! zRn{!|Dr~&3?LpY*kLA|;l0e`T=8wuDMJ1~aTZR1b7En~_VDVhobKNCx;z$%?bwcuH zO)YaKQ9G0FvG2yauWuR49rLAxy|$WM`Y;+{I?SsFMyJx1^o}Qt*$K%16O9*m}zh zK*S{>M0vR$&$(o=7nc=PD3sm(I#f{aN-_(?S5KyRU^VrXT~gdR z{ctYJsUN>Ixq}ufyN0K|z!)&`@M6@Y9a@lNI_Yfgo%+irxz`}=53y;#|Ds=dcSbW*C5R0uDV;>;^cgvlLB@9qDEykcfBdbJ7ZbJsrHHZ zWv&K^dW$=lphBo(KE1?)WaV9#q1M0(1nYdlUuRBE>^9Hc=DgHDXw=`^9QozVJG=!i zj^s3stogsj6Y+bzIut?y^X2%-b=-&XoNjaYENSz?1IR*zpOu6s3zRKNr;;~GwOv;$YO!R689GuX#=`=)&9Vh0{<>u z!7sTqdGnsibI>0%au|L;UfjwZI1g7e6hEup(g0~`PzfFtB--w6qs_Ic3C@#4a^R`g zWIZGnL&iOD!@0~>FnZD#&>M1*)7Vq z=$wzbR5Ox|K8vk!a|Ip>F8zn&nm^e#9z-I)+(8n93&zF%FgFYMy5{K zC{7v__~>>Bw<+8u^xk3Ushfb_y@;^0gDud0g{p*4qSzq0U3QSwDU)B);;5sEW`loE zwue&|IFBl_3l^ws_*Agn*Jj#rXd%v;Tf$y;oKgzdaRie4Y^@!qluoGfr8~|Pb6K`m zo_*YMeBSD9IYA%Zau6+WTYZzqr%-3h@q0wJoUaB;p^7>OTaHgAlz(B%v4^I2BB*wr_>uX!`Q)27mscE_CCcj;SS>v+qrIWH0)oC6NJ~8>cR9cY9ig&a1c^{W0*oKxR=;{sC$D`Ap_4LIbsc(t80thR;#LPoGRzyF4F-Vgg*H24A zi8(B1OTpvzL5?DOB!nv z542IgO2r+hvagsKdJjf0R*}-1s-n@`tPvHG>Z6LJo&QlGs9I7HIVtr>CCbKqH#4?A z;BZKh%!ufO@?ooK_hI?r=n`_&fC-_T+X!jJAs1vB*LBp`%yA@xbCyIl>i2v7o}6Gp z=A7IK#5PC9X=ISbWc5@baWcav@wrm5ZCaiUA%&IQpttNu8BGP;XnHg`TpAok_#}o2 zs?t((NG)$t%8W-s-)WZ%c*~j-H%1O@`BF-1lC*mxk^^3o6?RmA+5jP{2w7oPgb~kP z-Tafe#tn7P3{~9;zV*Ak>#37H93lGO$uvJJ$X^clK zXYu@0<4UQncjK+iL&6jB09#<4Rp5_iPyt(It8{)b*R}1&^IMFe&GqJIDaquJcJRi! zAGIxE)jaF1O%cV?O)qOnu6BJr*8I&_jq8i^jpe%1ii4mYPM1IQtqgAUY5w zpc!sHx4D~-DY}L4_om{gCKZA=Nn3KLa4r|M%r8&5Q zi1tuD>*NW&UwGBCe)yWk+Y{`{lir6>v*|nxynajP@)MXX_$%LjzI%lq!Kv#>v6W;9 zm6*o?L0EvQ3KTge*E_@2V;pn%6hfEAc)s5s^^Rm?VvJ2OHbj* zmn|w#q5KctA_1hyU^k*7H2Z{499u!P@m`)i(m^)739?9#^#l+GPkboxG^{0M(5>`g z+`&K|OtyxdU9#la7|W1N23F}Yj=q0<(KvAB*ArOXHg_JZZPSbV1>EIVk?8LMKQ!8EI*OH9RxJJAWI#=7-PwaV+=@? zMlk;NT;uT>Ht6`N8x6J8ajB)DmLZFk(UupJ&e?#Ri4er)(~sf{8s@>zD(rG67Nl*i zJ3*gF~aOzbZ=T27;n%0wW?iGSiQkwQx;1ji4it8VSvO z-oFj$oWK6CdC_43o>0g7$(w=&E+tfNsd3Pc zr_1Ixm|pd1GDtg+b&E+GDHRdq*!l;3SQ9=x(*?qpM~EQD#`JqcwBy(2V_wkG1L6Kr z&&=A>jR$J#MhO9EhJ-VHGLF#(^3O}i)YA(XKy|fZD+%xiT(v;hNC!G`vU*SOday=3 zpM+P!5nVat&AYrsi0OmdKB5hOnf8MfMh6r!oDj<3Iw(&d9|o#Q#1j14xxFmxD_qr1`n>`!Gz7?gF9vpxXrD&VQut*} z{`TBVACHe2HE;KH*=STuslA>w^g%&aCvVW+AY#KnR~6`7Afc869+k~fp;tlA-1g*I z?jwK&zwW6SRNDeSP5*8lwFh+T%L-$4XVP!Y;*3bvSLYkZIW*Wh*4vzp`Ur;DUc-Nv zo}O_tvl`5L#y?1+LVnreS@7Dt@8D%L3#9ek*{quoQEKYfhvirCpbLMk2McVSywTm7 z46yaR*{p7h1>j8guXItRv+aYe%00IB9pReIinlykkgL*)N1>5aWM?qjmK`JFuc(mR zWktJs$ym(vv;z1f&NrX@U!QOE4(O9Nl4i_ndG8yeA@owhUf3HiUJgM8ONR(w)CoZD zfcsG2mr_*>Mq3E?hcKHaOy}fDy`gx>*LSXLye+};BNPHj4hsc*smi(neEEOm;lA{0 z-_xUTFTZ68?BzF_0rf(el+g&ThHOIzY?5on3)Q44XjJJH;41*W1TjNakluEekiew} z&prO|S;>?YY$0s~n&NpUQeu%ShQyrRc_$%|{O>lwgcp&#Lnz|mXa6~%b$Gn81&~on zZjqa5dxM5~OF*A)3ocW8UxQjjvsL z>K@{^bbM8Rng-JSek}vqX?eyLFx+fZC$CI%hvzAkf7a)?#gq&*;jOvvzq6p8PeIl^M!{fupRT{~ zF*>uXepkbjX%!eJ!8Lz^MMO_~dDNL6Ss&H|GZ%S<{=zKR2!C0^S3Z#u{SFbe_;@-M zZ!l+|L4`fwZl(URrIqSKv8#dbK3Yo=iUjIufVLgdOW#WdVFY3TN%idq36>%&pxg47 zznP4_3Pw>A4s$F;#!xLI%Zp@~sgixg5sh|w-~9cx*ErT63oQ@9ODYlhTwFG&c9aB8 zeWpUBR!35mf9qIxBMbS`ca!N9gYmGWrhDG>!(-waV46qNpd!X79NVC@{`qb&HHIVo zPL~0sy)et}TpOeP&P>LO3(-b0fW&3u|JJ#t?k_<5Ofpi>XCj8rR$Y04_1{{&gc|HB z7{J3=^X6%92QiuyQDv_qUw#khUE#@_w8N6PFyJiS+oq7sV44Sq+hHn5C0L9-iz!&QS~%>@dKd9<*w0+mcxz%^&vm=o z<1wHyJU(p7(g+4?|G?_;?^j0gSKF!td$kRaHF2`p9U%P*y*5Nb$uZK_P+0?dOeeWs z@M}rRf)|9x@u+Tnu(m$L|4)IzY2=S`zHpXA_xa)CDp8sYkky}Z$PhXR98l$WoQ`)1 zK3qZOQzXqnE=<&;r&K&+N=J$}euI&rDT8#nV-U+WjcAZ7ZUhPj477idmnY3CGqlc6Zj=^+)xHtdPs@f zp?GiDqvxAlnuCyQb91~$n(~~#0!DII#W^9nqiv*F<^TieXVW%@z zgcw(y4ps)k!F2Zsa`PdpkzxSDQckZPUUYIUg(>R2lX#e+Hvef^*btu3Z*w)z9!1>> zRI%`JVC00(ye62-_L@)aY=SS3FG-sF2XJ4FNC!qz#g7!ZTbw#n^36(+usbi~@`5j;Hb z`?5u4JH)Z@QPSyedz;Cy72-edw5{Cf*xx$lTJy;yqGbDc<7wPm-TiDU2lM{D+S`Q& znwxpaqPW|^0pr~NmX2t)Gi{xx+k}UE_+CqkZP`wF*va79&-oW+^&~aXvmTtqSDrMM z_1U?k$IP;a!`^NeCCG-uR^2U^CkR+Q z2$3?`7tSk|nTrAg(wj&8o!2&w*4yTI4a3}}>2bJ=Mp~p?)HeguNaZfI;uc*gF_6xh zOZ@5Vak>IZz#)e{>RT)B-|YTBAnD3B>fRu2H&Tmsr!at~ z>r`nD#8+W$Wc?xMV3~-4k{v^e6#BFIb=H==Fob{}Mg0i(^)Kg&F+kMQ?d-73f&(vA zt$}0N1Ku!|^kg6xPkUMl56I2)0%u(5abzahMkv@y3?EYrtHd>w=X-=3>=-5s?xeWu zc7}X2@ zgK8B_Ca4c9)ab@6maW9Kno6%dWxK%01Tku5(#o`tB9rNOj4=^+{P5Ca>WX|X?)~c< zo$TE4wHg{ucV5ZCcX8gW?~w6=%!o>KEJWT@0vr;6u|Mhrnt_1;0fMk=}vABHI5?iQ<$45Z|mvU8eWNEfcO z`$%hvW0C2*U~Th`EZ^lDJ+jKXNuae59&%~j_}?^QYuRe~ zQwxi#_vu8Ww=dQ8n zLT3=CWkhlRsixxcNTE*$VYM{g@^0avt51INf=30?MD;)2&x zX%`tE;!{OwG8vJ47v4d=1iJTv-YTIasdM*t=Ns>+XGfmHm3NGafI97Cv5MC_t981H z2((+GDStJPe$m5FMJim9xSkV6L9<%+#G2Ol-=AwdTu)}!W1z?Jq^DgHeI+>M?oGHP zWN#|*N+ibMZ|HM#$%iBM%V@9nx&+*!2RzP`_h|;*QUW;>x-N%K<9)X2>OwJvGW_`w)))x6~1R<3`Izk z@z~$kn(m72srHcEqoAQtkU(ZwLVm@AlAWXHq0e=w3Kwrr1aMJqTC-2UCI<{n&J%Q8 z-5!$7$PZS@&XwI8cDX_Zaa3k&{Sj)jbcNdL_DC$m!(7s&vjW+}W)#bR3yE@3SC9c~ zuB0-_+7H7G@z&w=_6uj)M|j^-N4b!*J0Z#tW*0|vT9Y$`+&Vgu?P00P;?P>+vl|3u z&l6G?>rz1>k~L*az@ac$h`!GS`)BeuLvtrk^hMvBEqO*u3| zOYlZ?sQIxjYP`UavPO{rgS8Q5{1sl}PimWZqi{#P&17j8hsSdd!RGdE655p*K2dPA zHQEzftrUX#Smjn5?O$(yoiNkO7r}LUQytVj--RNH0k?=CshDNdHE^6ByyN`Jd|imj z(z7mGk+c1aJCgI;q8U|Eo-Ddfp>SD|osHy4@`}m4ya19+;#zFoU)};(Iq4(dt>i8y z7Pq#3uJ*Ae34B!0%bU(+c^UbII2wcG(=D z!6B~C_8=)o;%v9GDmmW^)LC2~OQ%?M_;mYQ)K^_PO3v~Urd(3Y1tRNGxtAR-EX7IQ ze5ZG1^v`bF(36M#^~685tG_R&Yp5*Y2j(;tdy{LLt@OD%_txf^4sP>V1xIz_`}%xs zH`o26?htWfqqU+J)K4!MwH-@)<14#`7p&yDl3ge~RVv{ilwJHogS%cPAOKJLWBb}% zGA*m+%K6yL04yQ>y#=Li65m@nyceU)LPOf-RJ5|gWIjGQ=N9r5kYOf%Fkd&U za!Pnou%VPD{kV0F@;HBw*Qb!j5BHmACG84hyX>Lk|o4K zfw2Oa@f03AJN)sD`Nm>BK^b4W8MJsn_~iql2Sha)(lp6G{^iOGSv9p#Zt*jNVSzp9 z84A&#xg_z0UIa6tf|i-T`10SAl9kX3WtG-3mKoJqC5SEQweHuwqVYb=Glz*4WPnhK zitSOCJFR(R`sk~YZ8$L9T>-6xzum4S0y~@}d%@S<-o= zXDHVDX#~L8I;frtxx-~jmOMNS3p_7_ap1ndKALWn{O38h&0Hl0k$VO z2R~f*l#Wm;;_0fMbfj$<6aWS!oZyAJTX%$L0kl;~kRnY3*crnMUj2c(SJJ8Z+UP^W zmwmS~zSNa8GNyaH2Hp8PM2vOnIkEj7oll(x55eh*q3xfkv)*dOSDQ|B;Bau?5O|@b zM0whEz^hy>!g$w02cGgyGUt>t9?Q!=Bp`Dg`Kn}IvYQ6oc;K(UDp{Mr8JQ>PlW_J| z1r*!;wWK8v`laCLFWG2INbGIL?Q5&$mAzLoXjkpw!QT6P$xp#kluI?#1rLEon z2-O}RL_4P#Ds1)p2so1>wcTUf*$v*G zDIE>^1y0q`5cXsNp?df6dfH_&xdd5oG+v4~Zkt1QVN{0$EEn=v-TQ>$T|cjQqb#b+ z8;j$Q)9E}NeNiO&jmT}Dij>H~_H`bK>~H3oCz6R_ECaEuGpPqB-$-XNaR_@!WAdh- zX3=O09C)sxc%5h&4y+8wE&53|abPmd{6XzSceBit%uQf?cY3xH&ut%zfBe;4-S=5G z9ZS>CB^BNzbwheq(mTgVO#oE)J1{?;3@4AoB5`VDI8m?BoMbng)8v`DdaJpcF{{ik z&o`c~x5>pH+Ieq2!(1?&ML{1D>aHA0^<|q)=I7@c{R5TEESY4G@u?h=tu6@i{%6$H&w=~77nV|MGE}w8fSz?y!THlsGnoN*sB+fG5RZszNdH=s% z!wv6i?@_8Z+rDOKyp)+?u(hoouy}&Cs+ASyHoY@=Sz%5zt{iUCE4Q0YG~X;Tx0aze z_9xpb_ihh{z5bY2|G4RKL$f74jFlGcV28MI<{?hj8{!{cmCS8p0~LbYHueuZwLgq| za%`*6S;MFUFye84f*3Xm_v@L^89a?tQG6Y)PcaxGeFg$);X23vA;$`ZI3Gpu;Gny% zGt{g|)FA>0ZS(|adPU@C@UPEsF@jI~?pTmrm0yLd5#tqqN6ha%5QLuoWjXjIB1WFup=vMpfDfOW;gq|2;#F4BKhe92vIf>^U-QUsGJ7Mve^I z%bV=%IWjDvz2wNSz4w|U!%`?o2B{X=q2JD%l{qpj+58f7WLQcj%|jtahHaDEf7Z&8 zVVl>?kzqURB}azsZ6*`Rkzrf8)3LvGE~gbaGHf4jJnh6$cS+l-evS;=$JT`Kb7a^S z?sjm%IWqn`olDd5)LNov-N**!#qHeb845O-!uHD}{m6^U=kAB1uL#qf!=pGJEHP2s zrbBSLNpFVbqov6eA%8tRcg;*|p5&+JlMYX36iqAiuC+W2r-2N(J!Pfy|nO zvgB*c(mJIHkf#qlbE~080p@yw$T7SX;5!X2GWteCY4kW%+&awRR3P=gq|I*2Xp4*y zPvLyWXH?;WK2SD!vifY5vIQMO;lvfK3l7st_U>dd5@)hR3JP|_w}6y;&$i3C9jn$S z<{NKMSRA$w3o>t>@;=uhWs-nKke!IIuLRfQqC!!}P+qJ|PFOw@*QqmlMzQowSl-vj z%T>I~;V=^f=#TMlJdIiHbdyiy|07+6(~*QapFOSe{T)%QDt3cn$z#(GRw-7oZz!v{ zZf!^^k+ga(*WFzdHE7t;Dh<<3S;_t}o&2dNS_|ZhbF8RmN+1zcd%rKsqNb^?p#WLg zG})q(rCxbfJfe5zx5PO)JmI9cTOzy&W(wbPcB+*Bi+lnpT_iBYMk2 zONc>h;*aQU%Urc&rNPtLRH8lGt0i+Rc|>p9DOp5R=G&FKlME5cF5I6U+(t^wWAxO6 zvso&w?ZI0;Mj})^TH}{~l9sioVMu_KuZfynPlz-1+L~TZCja%5ZDf+65X9;ADMhS* zEMDlW`45X~9E(98D51P?t2`Eij-eRiDmVp)X$Aa3y0o@kdFNFFQJwuQgC&Kjc;=^l zf@~?X`o6{Zx=uBJTy{&3O7Wyrp5spVjQ{?a{RE;F)kneZl| z58jkFwgTCYQs(nFg6!MIj(~WRczGcEmOn>Kd>%`*K{J!@CC)N`E)~eWGr}ypnnC4D zk$p?JY+o}pUdG72oyAOBo0%GkXAj8!sS`0|e_{T<)}hb7uJJa6njSyfU)f$eKI%_z zIFX+?P6}`@y)e0Fg8C0D!(B@MmUkzI-rTt2wXeDA&~+ug#9buG**H$E8r7{1qt)ww z^w68)w9fZehkZ_k!}P9t-L+Mtg5Fh!ezFd|WwgBR)S-73M=k@i9d5Kp`03eb_ns+| z<*aN^`vwO(l9K>lUyI?_*JHR3de_~4=$T7oc(giL+a7buu`;&bP>bz1)MLBbxZ(}h z-F7JQlwk%rKY*}^Cy??884SyqzPc9ESJz{D*tp{A>+U@ii9MWwX(wG`XIR1gHMO|E zrXKfD?Q1SswWUhTv`pOB)?)bDdJI3^xZ>LDP9A#Vl2rS`U^?uVv3sZ%yNBwr3;7

)+ stands for one or more repetitions of +// # ()? stands for zero or one occurrence of +// ::= ' ' ' ' ()+ | 'local ' +// ::= ' ' ' ' +// ::= any UTF-8, escape spaces with double space. Must not be empty nor start with 'local' +// ::= any UTF-8, escape spaces with double space. Use the placeholder '.' to indicate an empty value +// ::= same as above +// ::= same as above +// ::= | | | | | | | +// ::= '/' +// ::= '#' +// ::= '.' +// ::= ':' +// ::= '!' +// ::= '(' ()? ').' +// ::= '[' ']' +// ::= '(' ')' +// ::= +// ::= +// ::= | +// ::= ()+ +// ::= '_' | '+' | '-' | '$' | ASCII letter or digit +// ::= '`' ()+ '`', must contain at least one non- +// ::= any UTF-8, escape backticks with double backtick. +// ::= +// ``` +// +// The list of descriptors for a symbol should together form a fully +// qualified name for the symbol. That is, it should serve as a unique +// identifier across the package. Typically, it will include one descriptor +// for every node in the AST (along the ancestry path) between the root of +// the file and the node corresponding to the symbol. +// +// Local symbols MUST only be used for entities which are local to a Document, +// and cannot be accessed from outside the Document. +message Symbol { + string scheme = 1; + Package package = 2; + repeated ScipDescriptor descriptors = 3; +} + +// Unit of packaging and distribution. +// +// NOTE: This corresponds to a module in Go and JVM languages. +message Package { + string manager = 1; + string name = 2; + string version = 3; +} + +message ScipDescriptor { + enum Suffix { + option allow_alias = true; + UnspecifiedSuffix = 0; + // Unit of code abstraction and/or namespacing. + // + // NOTE: This corresponds to a package in Go and JVM languages. + Namespace = 1; + // Use Namespace instead. + Package = 1 [deprecated = true]; + Type = 2; + Term = 3; + Method = 4; + TypeParameter = 5; + Parameter = 6; + // Can be used for any purpose. + Meta = 7; + Local = 8; + Macro = 9; + } + string name = 1; + string disambiguator = 2; + Suffix suffix = 3; + // NOTE: If you add new fields here, make sure to update the prepareSlot() + // function responsible for parsing symbols. +} + +// Signature represents the signature of a symbol as it's displayed in API +// documentation or hover tooltips. It uses a subset of Document's fields with +// the same field numbers for wire compatibility with older indexes that encoded +// signatures using the Document message type. +message Signature { + // The language of the signature, e.g. "java", "go", "python". + string language = 4; + // The text content of the signature, e.g. "void add(int a, int b)". + string text = 5; + // (optional) Occurrences within the signature text that reference other + // symbols, enabling hyperlinking of types in the signature. Ranges are + // relative to the `text` field. + repeated Occurrence occurrences = 2; + + // Reserved field numbers from the Document message to prevent accidental + // reuse, which would break wire compatibility with older indexes. + reserved 1, 3, 6; +} + +// SymbolInformation defines metadata about a symbol, such as the symbol's +// docstring or what package it's defined it. +message SymbolInformation { + // Identifier of this symbol, which can be referenced from `Occurence.symbol`. + // The string must be formatted according to the grammar in `Symbol`. + string symbol = 1; + // (optional, but strongly recommended) The markdown-formatted documentation + // for this symbol. Use `SymbolInformation.signature_documentation` to + // document the method/class/type signature of this symbol. + // Due to historical reasons, indexers may include signature documentation in + // this field by rendering markdown code blocks. New indexers should only + // include non-code documentation in this field, for example docstrings. + repeated string documentation = 3; + // (optional) Relationships to other symbols (e.g., implements, type definition). + repeated Relationship relationships = 4; + // The kind of this symbol. Use this field instead of + // `SymbolDescriptor.Suffix` to determine whether something is, for example, a + // class or a method. + Kind kind = 5; + // (optional) Kind represents the fine-grained category of a symbol, suitable for presenting + // information about the symbol's meaning in the language. + // + // For example: + // - A Java method would have the kind `Method` while a Go function would + // have the kind `Function`, even if the symbols for these use the same + // syntax for the descriptor `SymbolDescriptor.Suffix.Method`. + // - A Go struct has the symbol kind `Struct` while a Java class has + // the symbol kind `Class` even if they both have the same descriptor: + // `SymbolDescriptor.Suffix.Type`. + // + // Since Kind is more fine-grained than Suffix: + // - If two symbols have the same Kind, they should share the same Suffix. + // - If two symbols have different Suffixes, they should have different Kinds. + enum Kind { + UnspecifiedKind = 0; + // A method which may or may not have a body. For Java, Kotlin etc. + AbstractMethod = 66; + // For Ruby's attr_accessor + Accessor = 72; + Array = 1; + // For Alloy + Assertion = 2; + AssociatedType = 3; + // For C++ + Attribute = 4; + // For Lean + Axiom = 5; + Boolean = 6; + Class = 7; + // For C++ + Concept = 86; + Constant = 8; + Constructor = 9; + // For Solidity + Contract = 62; + // For Haskell + DataFamily = 10; + // For C# and F# + Delegate = 73; + Enum = 11; + EnumMember = 12; + Error = 63; + Event = 13; + // For Dart + Extension = 84; + // For Alloy + Fact = 14; + Field = 15; + File = 16; + Function = 17; + // For 'get' in Swift, 'attr_reader' in Ruby + Getter = 18; + // For Raku + Grammar = 19; + // For Purescript and Lean + Instance = 20; + Interface = 21; + Key = 22; + // For Racket + Lang = 23; + // For Lean + Lemma = 24; + // For solidity + Library = 64; + Macro = 25; + Method = 26; + // For Ruby + MethodAlias = 74; + // Analogous to 'ThisParameter' and 'SelfParameter', but for languages + // like Go where the receiver doesn't have a conventional name. + MethodReceiver = 27; + // Analogous to 'AbstractMethod', for Go. + MethodSpecification = 67; + // For Protobuf + Message = 28; + // For Dart + Mixin = 85; + // For Solidity + Modifier = 65; + Module = 29; + Namespace = 30; + Null = 31; + Number = 32; + Object = 33; + Operator = 34; + Package = 35; + PackageObject = 36; + Parameter = 37; + ParameterLabel = 38; + // For Haskell's PatternSynonyms + Pattern = 39; + // For Alloy + Predicate = 40; + Property = 41; + // Analogous to 'Trait' and 'TypeClass', for Swift and Objective-C + Protocol = 42; + // Analogous to 'AbstractMethod', for Swift and Objective-C. + ProtocolMethod = 68; + // Analogous to 'AbstractMethod', for C++. + PureVirtualMethod = 69; + // For Haskell + Quasiquoter = 43; + // 'self' in Python, Rust, Swift etc. + SelfParameter = 44; + // For 'set' in Swift, 'attr_writer' in Ruby + Setter = 45; + // For Alloy, analogous to 'Struct'. + Signature = 46; + // For Ruby + SingletonClass = 75; + // Analogous to 'StaticMethod', for Ruby. + SingletonMethod = 76; + // Analogous to 'StaticField', for C++ + StaticDataMember = 77; + // For C# + StaticEvent = 78; + // For C# + StaticField = 79; + // For Java, C#, C++ etc. + StaticMethod = 80; + // For C#, TypeScript etc. + StaticProperty = 81; + // For C, C++ + StaticVariable = 82; + String = 48; + Struct = 49; + // For Swift + Subscript = 47; + // For Lean + Tactic = 50; + // For Lean + Theorem = 51; + // Method receiver for languages + // 'this' in JavaScript, C++, Java etc. + ThisParameter = 52; + // Analogous to 'Protocol' and 'TypeClass', for Rust, Scala etc. + Trait = 53; + // Analogous to 'AbstractMethod', for Rust, Scala etc. + TraitMethod = 70; + // Data type definition for languages like OCaml which use `type` + // rather than separate keywords like `struct` and `enum`. + Type = 54; + TypeAlias = 55; + // Analogous to 'Trait' and 'Protocol', for Haskell, Purescript etc. + TypeClass = 56; + // Analogous to 'AbstractMethod', for Haskell, Purescript etc. + TypeClassMethod = 71; + // For Haskell + TypeFamily = 57; + TypeParameter = 58; + // For C, C++, Capn Proto + Union = 59; + Value = 60; + Variable = 61; + // Next = 87; + // Feel free to open a PR proposing new language-specific kinds. + } + // (optional) The name of this symbol as it should be displayed to the user. + // For example, the symbol "com/example/MyClass#myMethod(+1)." should have the + // display name "myMethod". The `symbol` field is not a reliable source of + // the display name for several reasons: + // + // - Local symbols don't encode the name. + // - Some languages have case-insensitive names, so the symbol is all-lowercase. + // - The symbol may encode names with special characters that should not be + // displayed to the user. + string display_name = 6; + // (optional) The signature of this symbol as it's displayed in API + // documentation or in hover tooltips. For example, a Java method that adds + // two numbers would have `Signature.language = "java"` and + // `Signature.text = "void add(int a, int b)"`. The `language` and `text` + // fields are required while `occurrences` can be optionally included to + // support hyperlinking referenced symbols in the signature. + Signature signature_documentation = 7; + // (optional) The enclosing symbol if this is a local symbol. For non-local + // symbols, the enclosing symbol should be parsed from the `symbol` field + // using the `Descriptor` grammar. + // + // The primary use-case for this field is to allow local symbol to be displayed + // in a symbol hierarchy for API documentation. It's OK to leave this field + // empty for local variables since local variables usually don't belong in API + // documentation. However, in the situation that you wish to include a local + // symbol in the hierarchy, then you can use `enclosing_symbol` to locate the + // "parent" or "owner" of this local symbol. For example, a Java indexer may + // choose to use local symbols for private class fields while providing an + // `enclosing_symbol` to reference the enclosing class to allow the field to + // be part of the class documentation hierarchy. From the perspective of an + // author of an indexer, the decision to use a local symbol or global symbol + // should exclusively be determined whether the local symbol is accessible + // outside the document, not by the capability to find the enclosing + // symbol. + string enclosing_symbol = 8; +} + +message Relationship { + string symbol = 1; + // When resolving "Find references", this field documents what other symbols + // should be included together with this symbol. For example, consider the + // following TypeScript code that defines two symbols `Animal#sound()` and + // `Dog#sound()`: + // ```ts + // interface Animal { + // ^^^^^^ definition Animal# + // sound(): string + // ^^^^^ definition Animal#sound() + // } + // class Dog implements Animal { + // ^^^ definition Dog#, relationships = [{symbol: "Animal#", is_implementation: true}] + // public sound(): string { return "woof" } + // ^^^^^ definition Dog#sound(), references_symbols = Animal#sound(), relationships = [{symbol: "Animal#sound()", is_implementation:true, is_reference: true}] + // } + // const animal: Animal = new Dog() + // ^^^^^^ reference Animal# + // console.log(animal.sound()) + // ^^^^^ reference Animal#sound() + // ``` + // Doing "Find references" on the symbol `Animal#sound()` should return + // references to the `Dog#sound()` method as well. Vice-versa, doing "Find + // references" on the `Dog#sound()` method should include references to the + // `Animal#sound()` method as well. + bool is_reference = 2; + // Similar to `is_reference` but for "Find implementations". + // It's common for `is_implementation` and `is_reference` to both be true but + // it's not always the case. + // In the TypeScript example above, observe that `Dog#` has an + // `is_implementation` relationship with `"Animal#"` but not `is_reference`. + // This is because "Find references" on the "Animal#" symbol should not return + // "Dog#". We only want "Dog#" to return as a result for "Find + // implementations" on the "Animal#" symbol. + bool is_implementation = 3; + // Similar to `references_symbols` but for "Go to type definition". + bool is_type_definition = 4; + // Allows overriding the behavior of "Go to definition" and "Find references" + // for symbols which do not have a definition of their own or could + // potentially have multiple definitions. + // + // For example, in a language with single inheritance and no field overriding, + // inherited fields can reuse the same symbol as the ancestor which declares + // the field. In such a situation, is_definition is not needed. + // + // On the other hand, in languages with single inheritance and some form + // of mixins, you can use is_definition to relate the symbol to the + // matching symbol in ancestor classes, and is_reference to relate the + // symbol to the matching symbol in mixins. + bool is_definition = 5; + // Update registerInverseRelationships on adding a new field here. +} + +// SymbolRole declares what "role" a symbol has in an occurrence. A role is +// encoded as a bitset where each bit represents a different role. For example, +// to determine if the `Import` role is set, test whether the second bit of the +// enum value is defined. In pseudocode, this can be implemented with the +// logic: `const isImportRole = (role.value & SymbolRole.Import.value) > 0`. +enum SymbolRole { + // This case is not meant to be used; it only exists to avoid an error + // from the Protobuf code generator. + UnspecifiedSymbolRole = 0; + // Is the symbol defined here? If not, then this is a symbol reference. + Definition = 0x1; + // Is the symbol imported here? + Import = 0x2; + // Is the symbol written here? + WriteAccess = 0x4; + // Is the symbol read here? + ReadAccess = 0x8; + // Is the symbol in generated code? + Generated = 0x10; + // Is the symbol in test code? + Test = 0x20; + // Is this a signature for a symbol that is defined elsewhere? + // + // Applies to forward declarations for languages like C, C++ + // and Objective-C, as well as `val` declarations in interface + // files in languages like SML and OCaml. + ForwardDefinition = 0x40; +} + +enum SyntaxKind { + option allow_alias = true; + + UnspecifiedSyntaxKind = 0; + + // Comment, including comment markers and text + Comment = 1; + + // `;` `.` `,` + PunctuationDelimiter = 2; + // (), {}, [] when used syntactically + PunctuationBracket = 3; + + // `if`, `else`, `return`, `class`, etc. + Keyword = 4; + IdentifierKeyword = 4 [deprecated = true]; + + // `+`, `*`, etc. + IdentifierOperator = 5; + + // non-specific catch-all for any identifier not better described elsewhere + Identifier = 6; + // Identifiers builtin to the language: `min`, `print` in Python. + IdentifierBuiltin = 7; + // Identifiers representing `null`-like values: `None` in Python, `nil` in Go. + IdentifierNull = 8; + // `xyz` in `const xyz = "hello"` + IdentifierConstant = 9; + // `var X = "hello"` in Go + IdentifierMutableGlobal = 10; + // Parameter definition and references + IdentifierParameter = 11; + // Identifiers for variable definitions and references within a local scope + IdentifierLocal = 12; + // Identifiers that shadow other identifiers in an outer scope + IdentifierShadowed = 13; + // Identifier representing a unit of code abstraction and/or namespacing. + // + // NOTE: This corresponds to a package in Go and JVM languages, + // and a module in languages like Python and JavaScript. + IdentifierNamespace = 14; + IdentifierModule = 14 [deprecated = true]; + + // Function references, including calls + IdentifierFunction = 15; + // Function definition only + IdentifierFunctionDefinition = 16; + + // Macro references, including invocations + IdentifierMacro = 17; + // Macro definition only + IdentifierMacroDefinition = 18; + + // non-builtin types + IdentifierType = 19; + // builtin types only, such as `str` for Python or `int` in Go + IdentifierBuiltinType = 20; + + // Python decorators, c-like __attribute__ + IdentifierAttribute = 21; + + // `\b` + RegexEscape = 22; + // `*`, `+` + RegexRepeated = 23; + // `.` + RegexWildcard = 24; + // `(`, `)`, `[`, `]` + RegexDelimiter = 25; + // `|`, `-` + RegexJoin = 26; + + // Literal strings: "Hello, world!" + StringLiteral = 27; + // non-regex escapes: "\t", "\n" + StringLiteralEscape = 28; + // datetimes within strings, special words within a string, `{}` in format strings + StringLiteralSpecial = 29; + // "key" in { "key": "value" }, useful for example in JSON + StringLiteralKey = 30; + // 'c' or similar, in languages that differentiate strings and characters + CharacterLiteral = 31; + // Literal numbers, both floats and integers + NumericLiteral = 32; + // `true`, `false` + BooleanLiteral = 33; + + // Used for XML-like tags + Tag = 34; + // Attribute name in XML-like tags + TagAttribute = 35; + // Delimiters for XML-like tags + TagDelimiter = 36; +} + +// SingleLineRange represents a half-open [start, end) range within a single line. +// +// Line numbers and characters are always 0-based. Make sure to increment them +// before displaying in an editor-like UI because editors conventionally use +// 1-based numbers. The `character` values are interpreted based on the +// `PositionEncoding` for the enclosing Document. +message SingleLineRange { + int32 line = 1; + int32 start_character = 2; + int32 end_character = 3; +} + +// MultiLineRange represents a half-open [start, end) range spanning multiple lines. +// +// Line numbers and characters are always 0-based. Make sure to increment them +// before displaying in an editor-like UI because editors conventionally use +// 1-based numbers. The `character` values are interpreted based on the +// `PositionEncoding` for the enclosing Document. +// +// Producers SHOULD use `SingleLineRange` when `start_line == end_line` to keep +// indexes compact, but consumers MUST accept multi-line encoding even when the +// range happens to fit on a single line. +message MultiLineRange { + int32 start_line = 1; + int32 start_character = 2; + int32 end_line = 3; + int32 end_character = 4; +} + +// Occurrence associates a source position with a symbol and/or highlighting +// information. +// +// If possible, indexers should try to bundle logically related information +// across occurrences into a single occurrence to reduce payload sizes. +// +// Range encoding: +// +// An Occurrence carries its source range in one of two ways: the deprecated +// `range` field (a `repeated int32` packed encoding kept for backward +// compatibility), or one of the typed alternatives in the `typed_range` +// oneof. New producers SHOULD set `typed_range` and SHOULD NOT set the +// deprecated `range` field. The same rule applies to `enclosing_range` and +// `typed_enclosing_range`. +// +// When both encodings are present on the same Occurrence, `typed_range` takes +// precedence over `range` (likewise `typed_enclosing_range` over +// `enclosing_range`). Producers that set both forms MUST keep them +// semantically equivalent. Consumers SHOULD prefer the typed form when +// available and fall back to the `repeated int32` form otherwise. +message Occurrence { + // Deprecated: Use `single_line_range` or `multi_line_range` instead. + // + // Half-open [start, end) range. Must be exactly three or four elements: + // - Three elements: `[startLine, startCharacter, endCharacter]` (single-line) + // - Four elements: `[startLine, startCharacter, endLine, endCharacter]` + // + // The end line of a three-element range is inferred to equal the start line. + // + // Historical note: the original draft of this schema had a `Range` message + // type with `start` and `end` fields of type `Position`, mirroring LSP. + // Benchmarks revealed that this encoding was inefficient and that we could + // reduce the total payload size of an index by 50% by using `repeated int32` + // instead. However, the lack of type safety led to the introduction of + // `single_line_range` and `multi_line_range` as typed alternatives; the + // typed encoding's per-index size overhead is small (single-digit percent) + // because ranges are only a fraction of a typical index payload. + repeated int32 range = 1 [deprecated = true]; + + // Half-open [start, end) source range of this occurrence. + // + // It is allowed for the range to be empty (i.e. start==end). + // + // When both `typed_range` and the deprecated `range` field are set, + // `typed_range` takes precedence. + oneof typed_range { + // Range spanning a single line. + SingleLineRange single_line_range = 8; + // Range spanning multiple lines. + MultiLineRange multi_line_range = 9; + } + // (optional) The symbol that appears at this position. See + // `SymbolInformation.symbol` for how to format symbols as strings. + string symbol = 2; + // (optional) Bitset containing `SymbolRole`s in this occurrence. + // See `SymbolRole`'s documentation for how to read and write this field. + int32 symbol_roles = 3; + // (optional) CommonMark-formatted documentation for this specific range. If + // empty, the `Symbol.documentation` field is used instead. One example + // where this field might be useful is when the symbol represents a generic + // function (with abstract type parameters such as `List`) and at this + // occurrence we know the exact values (such as `List`). + // + // This field can also be used for dynamically or gradually typed languages, + // which commonly allow for type-changing assignment. + repeated string override_documentation = 4; + // (optional) What syntax highlighting class should be used for this range? + SyntaxKind syntax_kind = 5; + // (optional) Diagnostics that have been reported for this specific range. + repeated Diagnostic diagnostics = 6; + // Deprecated: Use `typed_enclosing_range` instead. + // + // Uses the same `repeated int32` encoding as the deprecated `range` field. + repeated int32 enclosing_range = 7 [deprecated = true]; + + // (optional) Half-open source range of the nearest non-trivial enclosing AST + // node. This range must enclose the occurrence range. Example applications: + // + // - Call hierarchies: to determine what symbols are referenced from the body + // of a function + // - Symbol outline: to display breadcrumbs from the cursor position to the + // root of the file + // - Expand selection: to select the nearest enclosing AST node. + // - Highlight range: to indicate the AST expression that is associated with a + // hover popover + // + // For definition occurrences, the enclosing range should indicate the + // start/end bounds of the entire definition AST node, including + // documentation. + // ``` + // const n = 3 + // ^ range + // ^^^^^^^^^^^ enclosing_range + // + // /** Parses the string into something */ + // ^ enclosing_range start --------------------------------------| + // function parse(input string): string { | + // ^^^^^ range | + // return input.slice(n) | + // } | + // ^ enclosing_range end <---------------------------------------| + // ``` + // + // Any attributes/decorators/attached macros should also be part of the + // enclosing range. + // + // ```python + // @cache + // ^ enclosing_range start---------------------| + // def factorial(n): | + // return n * factorial(n-1) if n else 1 | + // < enclosing_range end-----------------------| + // + // ``` + // + // For reference occurrences, the enclosing range should indicate the start/end + // bounds of the parent expression. + // ``` + // const a = a.b + // ^ range + // ^^^ enclosing_range + // const b = a.b(41).f(42).g(43) + // ^ range + // ^^^^^^^^^^^^^ enclosing_range + // ``` + // + // When both `typed_enclosing_range` and the deprecated `enclosing_range` + // field are set, `typed_enclosing_range` takes precedence. + oneof typed_enclosing_range { + // Enclosing range spanning a single line. + SingleLineRange single_line_enclosing_range = 10; + // Enclosing range spanning multiple lines. + MultiLineRange multi_line_enclosing_range = 11; + } +} + +// Represents a diagnostic, such as a compiler error or warning, which should be +// reported for a document. +message Diagnostic { + // Should this diagnostic be reported as an error, warning, info, or hint? + Severity severity = 1; + // (optional) Code of this diagnostic, which might appear in the user interface. + string code = 2; + // Message of this diagnostic. + string message = 3; + // (optional) Human-readable string describing the source of this diagnostic, e.g. + // 'typescript' or 'super lint'. + string source = 4; + repeated DiagnosticTag tags = 5; +} + +enum Severity { + UnspecifiedSeverity = 0; + Error = 1; + Warning = 2; + Information = 3; + Hint = 4; +} + +enum DiagnosticTag { + UnspecifiedDiagnosticTag = 0; + Unnecessary = 1; + Deprecated = 2; +} + +// Language standardises names of common programming languages that can be used +// for the `Document.language` field. The primary purpose of this enum is to +// prevent a situation where we have a single programming language ends up with +// multiple string representations. For example, the C++ language uses the name +// "CPP" in this enum and other names such as "cpp" are incompatible. +// Feel free to send a pull-request to add missing programming languages. +enum Language { + UnspecifiedLanguage = 0; + ABAP = 60; + Apex = 96; + APL = 49; + Ada = 39; + Agda = 45; + AsciiDoc = 86; + Assembly = 58; + Awk = 66; + Bat = 68; + BibTeX = 81; + C = 34; + COBOL = 59; + CPP = 35; // C++ (the name "CPP" was chosen for consistency with LSP) + CSS = 26; + CSharp = 1; + Clojure = 8; + Coffeescript = 21; + CommonLisp = 9; + Coq = 47; + CUDA = 97; + Dart = 3; + Delphi = 57; + Diff = 88; + Dockerfile = 80; + Dyalog = 50; + Elixir = 17; + Erlang = 18; + FSharp = 42; + Fish = 65; + Flow = 24; + Fortran = 56; + Git_Commit = 91; + Git_Config = 89; + Git_Rebase = 92; + Go = 33; + GraphQL = 98; + Groovy = 7; + HTML = 30; + Hack = 20; + Handlebars = 90; + Haskell = 44; + Idris = 46; + Ini = 72; + J = 51; + JSON = 75; + Java = 6; + JavaScript = 22; + JavaScriptReact = 93; + Jsonnet = 76; + Julia = 55; + Justfile = 109; + Kotlin = 4; + LaTeX = 83; + Lean = 48; + Less = 27; + Lua = 12; + Luau = 108; + Makefile = 79; + Markdown = 84; + Matlab = 52; + Nickel = 110; // https://nickel-lang.org/ + Nix = 77; + OCaml = 41; + Objective_C = 36; + Objective_CPP = 37; + Odin = 111; // https://odin-lang.org/ + Pascal = 99; + PHP = 19; + PLSQL = 70; + Perl = 13; + PowerShell = 67; + Prolog = 71; + Protobuf = 100; + Python = 15; + R = 54; + Racket = 11; + Raku = 14; + Razor = 62; + Repro = 102; // Internal language for testing SCIP + ReST = 85; + Ruby = 16; + Rust = 40; + SAS = 61; + SCSS = 29; + SML = 43; + SQL = 69; + Sass = 28; + Scala = 5; + Scheme = 10; + ShellScript = 64; // Bash + Skylark = 78; + Slang = 107; + Solidity = 95; + Svelte = 106; + Swift = 2; + Tcl = 101; + TOML = 73; + TeX = 82; + Thrift = 103; + TypeScript = 23; + TypeScriptReact = 94; + Verilog = 104; + VHDL = 105; + VisualBasic = 63; + Vue = 25; + Wolfram = 53; + XML = 31; + XSL = 32; + YAML = 74; + Zig = 38; + // NextLanguage = 112; + // Steps add a new language: + // 1. Copy-paste the "NextLanguage = N" line above + // 2. Increment "NextLanguage = N" to "NextLanguage = N+1" + // 3. Replace "NextLanguage = N" with the name of the new language. + // 4. Move the new language to the correct line above using alphabetical order + // 5. (optional) Add a brief comment behind the language if the name is not self-explanatory +} diff --git a/PythonProject/index.scip b/PythonProject/index.scip new file mode 100644 index 0000000..451ed07 --- /dev/null +++ b/PythonProject/index.scip @@ -0,0 +1,3 @@ + ++ + scip-python0.6.6file:///workspace  \ No newline at end of file diff --git a/PythonProject/pyproject.toml b/PythonProject/pyproject.toml new file mode 100644 index 0000000..e69de29