From 480529e8ccf00f47094c2b7192e1d1a1cf21aab0 Mon Sep 17 00:00:00 2001 From: simuleite Date: Sat, 28 Feb 2026 11:51:04 +0800 Subject: [PATCH 01/23] get_file_symbol: repo file-path name to locate a node --- idl/get_file_symbol.proto | 39 ++++++++ llm/mcp/handler.go | 7 +- llm/tool/ast_read.go | 199 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 242 insertions(+), 3 deletions(-) create mode 100644 idl/get_file_symbol.proto diff --git a/idl/get_file_symbol.proto b/idl/get_file_symbol.proto new file mode 100644 index 00000000..ae5b4593 --- /dev/null +++ b/idl/get_file_symbol.proto @@ -0,0 +1,39 @@ +// get_file_symbol IDL + +syntax = "proto3"; + +package abcoder; + +// Request +message GetFileSymbolReq { + string repo_name = 1; // the name of the repository (output of list_repos tool) + string file_path = 2; // the file path (output of get_repo_structure tool) + string name = 3; // the name of the symbol (function, type, or variable) to query +} + +// Response +message GetFileSymbolResp { + FileNodeStruct node = 1; // the ast node + string error = 2; // optional, the error message +} + +// FileNodeStruct 文件节点结构(使用 FileNodeID) +message FileNodeStruct { + string name = 1; // the name of the node + string type = 2; // optional, the type of the node + string signature = 3; // optional, the func signature of the node + string file = 4; // optional, the file path of the node + int32 line = 5; // optional, the line of the node + string codes = 6; // optional, the codes of the node + repeated FileNodeID dependencies = 7; // optional, the dependencies of the node + repeated FileNodeID references = 8; // optional, the references of the node + repeated FileNodeID implements = 9; // optional, the implements of the node + repeated FileNodeID groups = 10; // optional, the groups of the node + repeated FileNodeID inherits = 11; // optional, the inherits of the node +} + +// FileNodeID 文件节点标识(用于 get_file_symbol 输出) +message FileNodeID { + string file_path = 1; // file path relative to repo root + string name = 2; // symbol name in the file +} diff --git a/llm/mcp/handler.go b/llm/mcp/handler.go index 3b17ed6d..ad96f295 100644 --- a/llm/mcp/handler.go +++ b/llm/mcp/handler.go @@ -59,10 +59,11 @@ func getASTTools(opts tool.ASTReadToolsOptions) []Tool { ast := tool.NewASTReadTools(opts) return []Tool{ NewTool(tool.ToolListRepos, tool.DescListRepos, tool.SchemaListRepos, ast.ListRepos), - NewTool(tool.ToolGetRepoStructure, tool.DescGetRepoStructure, tool.SchemaGetRepoStructure, ast.GetRepoStructure), - NewTool(tool.ToolGetPackageStructure, tool.DescGetPackageStructure, tool.SchemaGetPackageStructure, ast.GetPackageStructure), + // NewTool(tool.ToolGetRepoStructure, tool.DescGetRepoStructure, tool.SchemaGetRepoStructure, ast.GetRepoStructure), + // NewTool(tool.ToolGetPackageStructure, tool.DescGetPackageStructure, tool.SchemaGetPackageStructure, ast.GetPackageStructure), NewTool(tool.ToolGetFileStructure, tool.DescGetFileStructure, tool.SchemaGetFileStructure, ast.GetFileStructure), - NewTool(tool.ToolGetASTNode, tool.DescGetASTNode, tool.SchemaGetASTNode, ast.GetASTNode), + // NewTool(tool.ToolGetASTNode, tool.DescGetASTNode, tool.SchemaGetASTNode, ast.GetASTNode), + NewTool(tool.ToolGetFileSymbol, tool.DescGetFileSymbol, tool.SchemaGetFileSymbol, ast.GetFileSymbol), } } diff --git a/llm/tool/ast_read.go b/llm/tool/ast_read.go index 520eaca8..2a2efb43 100644 --- a/llm/tool/ast_read.go +++ b/llm/tool/ast_read.go @@ -18,6 +18,7 @@ package tool import ( "context" + "encoding/json" "fmt" "path/filepath" "strings" @@ -42,6 +43,8 @@ const ( DescGetFileStructure = "[STRUCTURE] level3/4: Get file structure with node list. Input: repo_name, file_path from get_repo_structure output. Output: nodes with signatures." ToolGetASTNode = "get_ast_node" DescGetASTNode = "[ANALYSIS] level4/4: Get detailed AST node info. Input: repo_name, node_ids from previous calls. Output: codes, dependencies, references, implementations." + ToolGetFileSymbol = "get_file_symbol" + DescGetFileSymbol = "[ANALYSIS] level4/4: Get detailed AST node info by file path and symbol name. Input: repo_name, file_path, name. Output: codes, dependencies, references, implementations." // ToolWriteASTNode = "write_ast_node" ) @@ -51,6 +54,7 @@ var ( SchemaGetPackageStructure = GetJSONSchema(GetPackageStructReq{}) SchemaGetFileStructure = GetJSONSchema(GetFileStructReq{}) SchemaGetASTNode = GetJSONSchema(GetASTNodeReq{}) + SchemaGetFileSymbol = GetJSONSchema(GetFileSymbolReq{}) ) type ASTReadToolsOptions struct { @@ -150,6 +154,16 @@ func NewASTReadTools(opts ASTReadToolsOptions) *ASTReadTools { panic(err) } ret.tools[ToolGetASTNode] = tt + + tt, err = utils.InferTool(ToolGetFileSymbol, + string(DescGetFileSymbol), + ret.GetFileSymbol, utils.WithMarshalOutput(func(ctx context.Context, output interface{}) (string, error) { + return abutil.MarshalJSONIndent(output) + })) + if err != nil { + panic(err) + } + ret.tools[ToolGetFileSymbol] = tt return ret } @@ -243,6 +257,78 @@ func (n NodeID) Identity() uniast.Identity { } } +// FileNodeID 文件节点标识(用于 get_file_symbol 输出) +type FileNodeID struct { + FilePath string `json:"file_path" jsonschema:"description=file path relative to repo root"` + Name string `json:"name" jsonschema:"description=symbol name in the file"` +} + +// fileNodeIDGroupByPath 控制是否按 file_path 分组输出(默认 true) +var fileNodeIDGroupByPath = true + +// SetFileNodeIDGroupByPath 设置是否按 file_path 分组输出 +func SetFileNodeIDGroupByPath(group bool) { + fileNodeIDGroupByPath = group +} + +// fileNodeGroup 用于聚合相同 file_path 的 name(私有) +type fileNodeGroup struct { + FilePath string `json:"file_path"` + Names []string `json:"names"` +} + +// groupFileNodeIDs 将 []FileNodeID 转换为 []fileNodeGroup +func groupFileNodeIDs(nodeIDs []FileNodeID) []fileNodeGroup { + groupMap := make(map[string]*fileNodeGroup) + + for _, nid := range nodeIDs { + key := nid.FilePath + + if group, exists := groupMap[key]; exists { + group.Names = append(group.Names, nid.Name) + } else { + groupMap[key] = &fileNodeGroup{ + FilePath: nid.FilePath, + Names: []string{nid.Name}, + } + } + } + + result := make([]fileNodeGroup, 0, len(groupMap)) + for _, group := range groupMap { + result = append(result, *group) + } + + return result +} + +type _FileNodeID FileNodeID + +func (f FileNodeID) MarshalJSON() ([]byte, error) { + if fileNodeIDGroupByPath { + return json.Marshal(fileNodeGroup{ + FilePath: f.FilePath, + Names: []string{f.Name}, + }) + } + return json.Marshal(_FileNodeID(f)) +} + +// convertNodeIDs 将 uniast.Relation 转换为 FileNodeID +func convertNodeIDs(repo *uniast.Repository, relations []uniast.Relation) []FileNodeID { + result := make([]FileNodeID, 0, len(relations)) + for _, rel := range relations { + if n := repo.GetNode(rel.Identity); n != nil { + fl := n.FileLine() + result = append(result, FileNodeID{ + FilePath: fl.File, + Name: rel.Identity.Name, + }) + } + } + return result +} + func (t *ASTReadTools) getRepoAST(repoName string) (*uniast.Repository, error) { repo, ok := t.repos.Load(repoName) if !ok { @@ -453,6 +539,57 @@ type GetASTNodeResp struct { Error string `json:"error,omitempty" jsonschema:"description=the error message"` } +type GetFileSymbolReq struct { + RepoName string `json:"repo_name" jsonschema:"description=the name of the repository (output of list_repos tool)"` + FilePath string `json:"file_path" jsonschema:"description=the file path (output of get_repo_structure tool)"` + Name string `json:"name" jsonschema:"description=the name of the symbol (function, type, or variable) to query"` +} + +type GetFileSymbolResp struct { + Node FileNodeStruct `json:"node" jsonschema:"description=the ast node"` + Error string `json:"error,omitempty" jsonschema:"description=the error message"` +} + +// FileNodeStruct 文件节点结构(使用 FileNodeID) +type FileNodeStruct struct { + Name string `json:"name" jsonschema:"description=the name of the node"` + Type string `json:"type,omitempty" jsonschema:"description=the type of the node"` + Signature string `json:"signature,omitempty" jsonschema:"description=the func signature of the node"` + File string `json:"file,omitempty" jsonschema:"description=the file path of the node"` + Line int `json:"line,omitempty" jsonschema:"description=the line of the node"` + Codes string `json:"codes,omitempty" jsonschema:"description=the codes of the node"` + Dependencies []FileNodeID `json:"dependencies,omitempty" jsonschema:"description=the dependencies of the node"` + References []FileNodeID `json:"references,omitempty" jsonschema:"description=the references of the node"` + Implements []FileNodeID `json:"implements,omitempty" jsonschema:"description=the implements of the node"` + Groups []FileNodeID `json:"groups,omitempty" jsonschema:"description=the groups of the node"` + Inherits []FileNodeID `json:"inherits,omitempty" jsonschema:"description=the inherits of the node"` +} + +// MarshalJSON 自定义JSON序列化,实现所有关系字段的分组输出 +type _FileNodeStruct FileNodeStruct + +func (n FileNodeStruct) MarshalJSON() ([]byte, error) { + if fileNodeIDGroupByPath { + aux := &struct { + Dependencies []fileNodeGroup `json:"dependencies,omitempty"` + References []fileNodeGroup `json:"references,omitempty"` + Implements []fileNodeGroup `json:"implements,omitempty"` + Groups []fileNodeGroup `json:"groups,omitempty"` + Inherits []fileNodeGroup `json:"inherits,omitempty"` + *_FileNodeStruct + }{ + Dependencies: groupFileNodeIDs(n.Dependencies), + References: groupFileNodeIDs(n.References), + Implements: groupFileNodeIDs(n.Implements), + Groups: groupFileNodeIDs(n.Groups), + Inherits: groupFileNodeIDs(n.Inherits), + _FileNodeStruct: (*_FileNodeStruct)(&n), + } + return json.Marshal(aux) + } + return json.Marshal(_FileNodeStruct(n)) +} + func (t *ASTReadTools) GetASTNode(_ context.Context, params GetASTNodeReq) (*GetASTNodeResp, error) { log.Debug("get ast node, req: %v", abutil.MarshalJSONIndentNoError(params)) @@ -514,3 +651,65 @@ func (t *ASTReadTools) GetASTNode(_ context.Context, params GetASTNodeReq) (*Get log.Debug("get repo structure, resp: %v", abutil.MarshalJSONIndentNoError(resp)) return resp, nil } + +// GetFileSymbol get detailed AST node info by file path and symbol name +func (t *ASTReadTools) GetFileSymbol(_ context.Context, req GetFileSymbolReq) (*GetFileSymbolResp, error) { + log.Debug("get file symbol, req: %v", abutil.MarshalJSONIndentNoError(req)) + + // 加载仓库 + repo, err := t.getRepoAST(req.RepoName) + if err != nil { + return &GetFileSymbolResp{ + Error: err.Error(), + }, nil + } + + // 查找文件 + file, _ := repo.GetFile(req.FilePath) + if file == nil { + return &GetFileSymbolResp{ + Error: fmt.Errorf("file '%s' not found. Use 'get_repo_structure' to get valid file paths", req.FilePath).Error(), + }, nil + } + + // 在文件中查找符号 + nodes := repo.GetFileNodes(req.FilePath) + var targetNode *uniast.Node + var found bool + + for _, node := range nodes { + if node.Identity.Name == req.Name { + targetNode = node + found = true + break + } + } + + if !found { + return &GetFileSymbolResp{ + Error: fmt.Sprintf("symbol '%s' not found in file '%s'. Use 'get_file_structure' to list all symbols in the file", req.Name, req.FilePath), + }, nil + } + + // 构建 FileNodeStruct + fl := targetNode.FileLine() + nodeStruct := FileNodeStruct{ + Name: targetNode.Identity.Name, + Type: targetNode.Type.String(), + File: fl.File, + Line: fl.Line, + Codes: targetNode.Content(), + Signature: targetNode.Signature(), + // 使用抽象函数转换所有关系字段 + Dependencies: convertNodeIDs(repo, targetNode.Dependencies), + References: convertNodeIDs(repo, targetNode.References), + Implements: convertNodeIDs(repo, targetNode.Implements), + Inherits: convertNodeIDs(repo, targetNode.Inherits), + Groups: convertNodeIDs(repo, targetNode.Groups), + } + + log.Debug("get file symbol, resp: %v", abutil.MarshalJSONIndentNoError(&GetFileSymbolResp{Node: nodeStruct})) + return &GetFileSymbolResp{ + Node: nodeStruct, + }, nil +} From dd5443312bf862cc2cac89cf31fd9a244d3f876c Mon Sep 17 00:00:00 2001 From: simuleite Date: Sat, 28 Feb 2026 15:49:47 +0800 Subject: [PATCH 02/23] tree_repo: list available file-paths --- llm/mcp/handler.go | 1 + llm/tool/ast_read.go | 82 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/llm/mcp/handler.go b/llm/mcp/handler.go index ad96f295..ffe4da47 100644 --- a/llm/mcp/handler.go +++ b/llm/mcp/handler.go @@ -61,6 +61,7 @@ func getASTTools(opts tool.ASTReadToolsOptions) []Tool { NewTool(tool.ToolListRepos, tool.DescListRepos, tool.SchemaListRepos, ast.ListRepos), // NewTool(tool.ToolGetRepoStructure, tool.DescGetRepoStructure, tool.SchemaGetRepoStructure, ast.GetRepoStructure), // NewTool(tool.ToolGetPackageStructure, tool.DescGetPackageStructure, tool.SchemaGetPackageStructure, ast.GetPackageStructure), + NewTool(tool.ToolTreeRepo, tool.DescTreeRepo, tool.SchemaTreeRepo, ast.TreeRepo), NewTool(tool.ToolGetFileStructure, tool.DescGetFileStructure, tool.SchemaGetFileStructure, ast.GetFileStructure), // NewTool(tool.ToolGetASTNode, tool.DescGetASTNode, tool.SchemaGetASTNode, ast.GetASTNode), NewTool(tool.ToolGetFileSymbol, tool.DescGetFileSymbol, tool.SchemaGetFileSymbol, ast.GetFileSymbol), diff --git a/llm/tool/ast_read.go b/llm/tool/ast_read.go index 2a2efb43..27f2d04f 100644 --- a/llm/tool/ast_read.go +++ b/llm/tool/ast_read.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" "path/filepath" + "sort" "strings" "sync" @@ -34,17 +35,20 @@ import ( const ( ToolListRepos = "list_repos" - DescListRepos = "[DISCOVERY] level1/4: List all repositories. No parameters required. Always the first step in any analysis workflow." + DescListRepos = "[DISCOVERY] Step 1/4: List available repositories. Always the first step in ABCoder workflow. You MUST call `tree_repo` later." + ToolTreeRepo = "tree_repo" + DescTreeRepo = "[STRUCTURE] Step 2/4: Get available file_paths of a repo. Input: repo_name from `list_repos` output. Output: available file_paths. You MUST call `get_file_structure` later." + ToolGetFileStructure = "get_file_structure" + DescGetFileStructure = "[STRUCTURE] Step 3/4: Get available symbol names of a file. Input: repo_name, file_path from `tree_repo` output. Output: symbol names with signatures. You MUST call `get_file_symbol` later." + ToolGetFileSymbol = "get_file_symbol" + DescGetFileSymbol = "[ANALYSIS] Step 4/4: Get symbol's code, dependencies and references; use refer/depend's file_path and name as next `get_file_symbol` input. Input: repo_name, file_path, name. Output: codes, dependencies, references. You MUST call `get_file_symbol` with refers/depends file_path and name to check its code, call-chain or data-flow detail." + ToolGetRepoStructure = "get_repo_structure" DescGetRepoStructure = "[STRUCTURE] level2/4: Get repository structure. Input: repo_name from list_repos output. Output: modules with packages and files." ToolGetPackageStructure = "get_package_structure" DescGetPackageStructure = "[STRUCTURE] level3/4: Get package structure with node_ids. Input: repo_name, mod_path, pkg_path from get_repo_structure output. Output: files with node_ids." - ToolGetFileStructure = "get_file_structure" - DescGetFileStructure = "[STRUCTURE] level3/4: Get file structure with node list. Input: repo_name, file_path from get_repo_structure output. Output: nodes with signatures." ToolGetASTNode = "get_ast_node" DescGetASTNode = "[ANALYSIS] level4/4: Get detailed AST node info. Input: repo_name, node_ids from previous calls. Output: codes, dependencies, references, implementations." - ToolGetFileSymbol = "get_file_symbol" - DescGetFileSymbol = "[ANALYSIS] level4/4: Get detailed AST node info by file path and symbol name. Input: repo_name, file_path, name. Output: codes, dependencies, references, implementations." // ToolWriteASTNode = "write_ast_node" ) @@ -55,6 +59,7 @@ var ( SchemaGetFileStructure = GetJSONSchema(GetFileStructReq{}) SchemaGetASTNode = GetJSONSchema(GetASTNodeReq{}) SchemaGetFileSymbol = GetJSONSchema(GetFileSymbolReq{}) + SchemaTreeRepo = GetJSONSchema(TreeRepoReq{}) ) type ASTReadToolsOptions struct { @@ -164,6 +169,16 @@ func NewASTReadTools(opts ASTReadToolsOptions) *ASTReadTools { panic(err) } ret.tools[ToolGetFileSymbol] = tt + + tt, err = utils.InferTool(ToolTreeRepo, + DescTreeRepo, + ret.TreeRepo, utils.WithMarshalOutput(func(ctx context.Context, output interface{}) (string, error) { + return abutil.MarshalJSONIndent(output) + })) + if err != nil { + panic(err) + } + ret.tools[ToolTreeRepo] = tt return ret } @@ -713,3 +728,60 @@ func (t *ASTReadTools) GetFileSymbol(_ context.Context, req GetFileSymbolReq) (* Node: nodeStruct, }, nil } + +type TreeRepoReq struct { + RepoName string `json:"repo_name" jsonschema:"description=the name of the repository (output of list_repos tool)"` +} + +type TreeRepoResp struct { + Files map[string][]string `json:"files" jsonschema:"description=map of directory path to file list (directories end with '/')"` + Error string `json:"error,omitempty" jsonschema:"description=the error message"` +} + +// TreeRepo returns a map of package paths to file lists, with directories ending in '/' +func (t *ASTReadTools) TreeRepo(_ context.Context, req TreeRepoReq) (*TreeRepoResp, error) { + log.Debug("tree repo, req: %v", abutil.MarshalJSONIndentNoError(req)) + repo, err := t.getRepoAST(req.RepoName) + if err != nil { + return &TreeRepoResp{ + Error: err.Error(), + }, nil + } + + // 收集所有文件,按目录聚合 + files := make(map[string][]string) + for _, mod := range repo.Modules { + if mod.IsExternal() { + continue + } + for _, file := range mod.Files { + if file.Package == "" { + continue + } + // 过滤掉非当前仓库的文件(以 .. 开头或包含 ..) + if strings.HasPrefix(file.Path, "..") { + continue + } + // 获取文件的目录路径 + dir := filepath.Dir(file.Path) + if dir == "." { + dir = "./" + } + // 添加 '/' 后缀 + if dir != "" && dir != "./" && !strings.HasSuffix(dir, "/") { + dir = dir + "/" + } + // 获取文件名 + name := filepath.Base(file.Path) + files[dir] = append(files[dir], name) + } + } + + // 对每个目录下的文件列表进行排序 + for dir := range files { + sort.Strings(files[dir]) + } + + log.Debug("tree repo, resp: %v", abutil.MarshalJSONIndentNoError(&TreeRepoResp{Files: files})) + return &TreeRepoResp{Files: files}, nil +} From a82c719f59186f4f55ea23561d882bdf1bfc8434 Mon Sep 17 00:00:00 2001 From: simuleite Date: Sat, 28 Feb 2026 16:12:23 +0800 Subject: [PATCH 03/23] abcoder parse /path/to/repo: default write into -path-to-repo.json, write into .tmp then rename to .json to avoid instable parsing-read error --- main.go | 61 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index 13acf1be..fe4f678b 100644 --- a/main.go +++ b/main.go @@ -98,10 +98,11 @@ Use this command to verify installation or when reporting issues.`, func newParseCmd() *cobra.Command { var ( - flagOutput string - flagLsp string - javaHome string - opts lang.ParseOptions + flagOutput string + flagStdout bool + flagLsp string + javaHome string + opts lang.ParseOptions ) cmd := &cobra.Command{ @@ -109,7 +110,7 @@ func newParseCmd() *cobra.Command { Short: "Parse repository and export to UniAST JSON format", Long: `Parse the specified repository and generate its Universal AST representation. -By default, outputs to stdout. Use --output to write to a file. +By default, saves to ~/.asts/.json. Use --stdout to output to stdout, use --output to write to a file. Language Support: go - Go projects @@ -140,11 +141,34 @@ Language Support: language := uniast.NewLanguage(args[0]) uri := args[1] + // Convert to absolute path for consistent naming + absPath, err := filepath.Abs(uri) + if err != nil { + log.Error("Failed to get absolute path: %v\n", err) + return err + } + + // Determine output path + outputPath := flagOutput + if outputPath == "" && !flagStdout { + // Default: save to ~/.asts/ + astsDir := filepath.Join(os.Getenv("HOME"), ".asts") + if err := os.MkdirAll(astsDir, 0755); err != nil { + log.Error("Failed to create asts directory: %v\n", err) + return err + } + filename := sanitizeFilename(absPath) + outputPath = filepath.Join(astsDir, filename) + } + if language == uniast.TypeScript { - if err := parseTSProject(context.Background(), uri, opts, flagOutput); err != nil { + if err := parseTSProject(context.Background(), uri, opts, outputPath); err != nil { log.Error("Failed to parse: %v\n", err) return err } + if outputPath != "" && !flagStdout { + fmt.Fprintf(os.Stdout, "AST saved to %s\n", outputPath) + } return nil } @@ -165,12 +189,23 @@ Language Support: return err } - if flagOutput != "" { - if err := utils.MustWriteFile(flagOutput, out); err != nil { + if flagStdout { + // Explicitly output to stdout + fmt.Fprintf(os.Stdout, "%s\n", out) + } else if outputPath != "" { + // Write to .tmp first, then rename to .json + tmpPath := outputPath + ".tmp" + if err := utils.MustWriteFile(tmpPath, out); err != nil { log.Error("Failed to write output: %v\n", err) return err } + if err := os.Rename(tmpPath, outputPath); err != nil { + log.Error("Failed to rename temp file: %v\n", err) + return err + } + fmt.Fprintf(os.Stdout, "AST saved to %s\n", outputPath) } else { + // Fallback to stdout (should not happen with new logic) fmt.Fprintf(os.Stdout, "%s\n", out) } @@ -179,7 +214,8 @@ Language Support: } // Flags - cmd.Flags().StringVarP(&flagOutput, "output", "o", "", "Output path for UniAST JSON (default: stdout).") + cmd.Flags().StringVarP(&flagOutput, "output", "o", "", "Output path for UniAST JSON (default: ~/.asts/.json).") + cmd.Flags().BoolVar(&flagStdout, "stdout", false, "Output to stdout instead of saving to file.") cmd.Flags().StringVar(&flagLsp, "lsp", "", "Path to Language Server Protocol executable. Required for languages with LSP support (e.g., Java).") cmd.Flags().StringVar(&javaHome, "java-home", "", "Java installation directory (JAVA_HOME). Required when using LSP for Java.") cmd.Flags().BoolVar(&opts.LoadExternalSymbol, "load-external-symbol", false, "Load external symbol references into AST results (slower but more complete).") @@ -195,6 +231,13 @@ Language Support: return cmd } +// sanitizeFilename converts absolute path to safe filename +// e.g., /Users/bytedance/astRepo/golang/abcoder -> -Users-bytedance-astRepo-golang-abcoder.json +func sanitizeFilename(path string) string { + name := strings.ReplaceAll(path, "/", "-") + return name + ".json" +} + func newWriteCmd() *cobra.Command { var ( flagOutput string From 9452e3b05de5eb2df5ba6f701d0813ac7510c574 Mon Sep 17 00:00:00 2001 From: simuleite Date: Sat, 28 Feb 2026 17:56:40 +0800 Subject: [PATCH 04/23] abcoder cli for skill --- .../abcoder__get_file_structure/SKILL.md | 46 ++++++++++ .../skills/abcoder__get_file_symbol/SKILL.md | 74 +++++++++++++++ .../skills/abcoder__list_repos/SKILL.md | 29 ++++++ .../skills/abcoder__tree_repo/SKILL.md | 16 ++++ internal/cmd/cli/cli.go | 39 ++++++++ internal/cmd/cli/get_file_structure.go | 61 +++++++++++++ internal/cmd/cli/get_file_symbol.go | 63 +++++++++++++ internal/cmd/cli/list_repos.go | 89 +++++++++++++++++++ internal/cmd/cli/tree_repo.go | 57 ++++++++++++ internal/cmd/cli/utils.go | 38 ++++++++ llm/tool/ast_read.go | 33 +++---- main.go | 3 + 12 files changed, 533 insertions(+), 15 deletions(-) create mode 100644 internal/cmd/assets/.claude/skills/abcoder__get_file_structure/SKILL.md create mode 100644 internal/cmd/assets/.claude/skills/abcoder__get_file_symbol/SKILL.md create mode 100644 internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md create mode 100644 internal/cmd/assets/.claude/skills/abcoder__tree_repo/SKILL.md create mode 100644 internal/cmd/cli/cli.go create mode 100644 internal/cmd/cli/get_file_structure.go create mode 100644 internal/cmd/cli/get_file_symbol.go create mode 100644 internal/cmd/cli/list_repos.go create mode 100644 internal/cmd/cli/tree_repo.go create mode 100644 internal/cmd/cli/utils.go diff --git a/internal/cmd/assets/.claude/skills/abcoder__get_file_structure/SKILL.md b/internal/cmd/assets/.claude/skills/abcoder__get_file_structure/SKILL.md new file mode 100644 index 00000000..9d6653e7 --- /dev/null +++ b/internal/cmd/assets/.claude/skills/abcoder__get_file_structure/SKILL.md @@ -0,0 +1,46 @@ +--- +name: skill__abcoder__get_file_structure +description: skill__abcoder__get_file_structure `abcoder cli get_file_structure 'repo_name' 'file_path'` [STRUCTURE] Step 3/4: Get available symbol names of a file. Input: repo_name, file_path from `tree_repo` output. Output: symbol names with signatures. You MUST call `get_file_symbol` later. +--- + +Execute the get_file_structure command to examine file-level nodes: + +```bash +abcoder cli get_file_structure 'repo_name' 'file_path' +``` + +**Expected Output:** +- Complete node list with type, signature, line +- Imports for the file +- Node IDs for detailed analysis + +**Parameters:** +- `repo_name` (required): Repository name from `list_repos` +- `file_path` (required): Relative file path from `get_repo_structure` +``` +{ + "description": "[STRUCTURE] level3/4: Get file structure with node list. Input: repo_name, file_path from get_repo_structure output. Output: nodes with signatures.", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "repo_name": { + "type": "string", + "description": "the name of the repository (output of list_repos tool)" + }, + "file_path": { + "type": "string", + "description": "relative file path (output of get_repo_structure tool" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "repo_name", + "file_path" + ] + }, + "name": "get_file_structure" +} +``` + +This tool is **Level 3** in the ABCoder discovery hierarchy. Next: Use [`skill__abcoder__get_file_symbol`](~/.claude/skills/skill__abcoder__get_file_symbol/SKILL.md) to get detailed code information. diff --git a/internal/cmd/assets/.claude/skills/abcoder__get_file_symbol/SKILL.md b/internal/cmd/assets/.claude/skills/abcoder__get_file_symbol/SKILL.md new file mode 100644 index 00000000..5a2cfa58 --- /dev/null +++ b/internal/cmd/assets/.claude/skills/abcoder__get_file_symbol/SKILL.md @@ -0,0 +1,74 @@ +--- +name: skill__abcoder__get_file_symbol +description: skill__abcoder_get_file_symbol `abcoder cli get_file_symbol 'repo_name' 'relative_file_path' 'symbol_name'` [ANALYSIS] Step 4/4: Get symbol's code, dependencies and references; use refer/depend's file_path and name as next `get_file_symbol` input. Input: repo_name, file_path, name. Output: codes, dependencies, references. You MUST call `get_file_symbol` with refers/depends file_path and name to check its code, call-chain or data-flow detail. +--- + +Execute the get_file_symbol command to get detailed symbol information: + +```bash +abcoder cli get_file_symbol 'repo_name' 'relative_file_path' 'symbol_name' +``` + +**Expected Output:** +``` +{ + "nodes": [ + { + "file_path": "string", + "name": "string", + "type": "string", + "line": "number", + "codes": "string", + "dependencies": [ + { + "file_path": "string", + "names": ["string"] + } + ], + "references": [ + { + "file_path": "string", + "names": ["string"] + } + ] + } + ] +} +``` + +**Parameters:** +- `repo_name` (required): Repository name from `list_repos` +- `file_path` (required): File path from `get_repo_structure` +- `symbol_name` (required): Name of the symbol to query +``` +{ + "description": "[ANALYSIS] level4/4: Get detailed AST node info by file path and symbol name. Output: codes, dependencies, references, implementations (all grouped by file_path).", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "repo_name": { + "type": "string", + "description": "the name of the repository (output of list_repos tool)" + }, + "file_path": { + "type": "string", + "description": "the file path (output of get_repo_structure tool)" + }, + "symbol_name": { + "type": "string", + "description": "the name of the symbol (function, type, or variable) to query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "repo_name", + "file_path", + "symbol_name" + ] + }, + "name": "get_file_symbol" +} +``` + +**Recursive Analysis:** Use this tool recursively to trace code calling chains. From the `dependencies` and `references` arrays, extract the `file_path` and `symbol_name` for related nodes, then call `get_file_symbol` again to dive deeper into the calling chain. diff --git a/internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md b/internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md new file mode 100644 index 00000000..c01809fd --- /dev/null +++ b/internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md @@ -0,0 +1,29 @@ +--- +name: skill__abcoder__list_repos +description: skill__abcoder__list_repos `abcoder cli list_repos` [DISCOVERY] Step 1/4: List available repositories. Always the first step in ABCoder workflow. You MUST call `tree_repo` later. +--- + +Execute the list_repos command to discover all available repositories: + +```bash +abcoder cli list_repos +``` + +## Workflow Context + +This tool is **Level 1** in the 4-level ABCoder discovery hierarchy: + +1. **Level 1 (This Tool)**: `list_repos` - List all repositories +2. **Level 2**: `tree_repo` - Get repository structure +3. **Level 3**: `get_file_structure` - Get file nodes details +4. **Level 4**: `get_file_symbol` - Get detailed AST node information + +## Usage Pattern +Output +``` +{ + "repo_names": { + "array[i]": "string" + } +} +``` diff --git a/internal/cmd/assets/.claude/skills/abcoder__tree_repo/SKILL.md b/internal/cmd/assets/.claude/skills/abcoder__tree_repo/SKILL.md new file mode 100644 index 00000000..e1c014c3 --- /dev/null +++ b/internal/cmd/assets/.claude/skills/abcoder__tree_repo/SKILL.md @@ -0,0 +1,16 @@ +--- +name: skill__abcoder__tree_repo +description: skill__abcoder__tree_repo `abcoder cli tree_repo 'repo_name' [DISCOVERY] Level 2/4: [STRUCTURE] Step 2/4: Get available file_paths of a repo. Input: repo_name from `list_repos` output. Output: available file_paths. You MUST call `get_file_structure` later. +--- + +Execute the tree_repo command to examine repository-level structure: + +```bash +abcoder cli tree_repo 'repo_name' +``` + +**Expected Output:** +- Complete repository file paths + +**Parameters:** +- `repo_name` (required): Repository name from `list_repos` output diff --git a/internal/cmd/cli/cli.go b/internal/cmd/cli/cli.go new file mode 100644 index 00000000..0d29569d --- /dev/null +++ b/internal/cmd/cli/cli.go @@ -0,0 +1,39 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,. +// See the License either express or implied for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "github.com/spf13/cobra" +) + +// NewCliCmd returns the parent command for CLI operations. +func NewCliCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "cli", + Short: "CLI commands for AST analysis", + Long: `CLI commands for directly querying AST data without MCP protocol. + +These commands provide direct access to repository, file, and symbol information.`, + Example: `abcoder cli list-repos`, + } + + // Add subcommands + cmd.AddCommand(newListReposCmd()) + cmd.AddCommand(newTreeRepoCmd()) + cmd.AddCommand(newGetFileStructureCmd()) + cmd.AddCommand(newGetFileSymbolCmd()) + + return cmd +} diff --git a/internal/cmd/cli/get_file_structure.go b/internal/cmd/cli/get_file_structure.go new file mode 100644 index 00000000..0bec8e72 --- /dev/null +++ b/internal/cmd/cli/get_file_structure.go @@ -0,0 +1,61 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "context" + "encoding/json" + "fmt" + "os" + + "github.com/cloudwego/abcoder/llm/tool" + "github.com/spf13/cobra" +) + +func newGetFileStructureCmd() *cobra.Command { + return &cobra.Command{ + Use: "get_file_structure ", + Short: "Get symbol names of a file", + Long: `Get the symbol names and signatures of a file in the repository. + +Returns a list of functions, types, and variables defined in the file.`, + Example: `abcoder cli get_file_structure myrepo src/main.go`, + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + astsDir, err := getASTsDir(cmd) + if err != nil { + return err + } + + repoName := args[0] + filePath := args[1] + tools := tool.NewASTReadTools(tool.ASTReadToolsOptions{ + RepoASTsDir: astsDir, + DisableWatch: true, + }) + resp, err := tools.GetFileStructure(context.Background(), tool.GetFileStructReq{ + RepoName: repoName, + FilePath: filePath, + }) + if err != nil { + return fmt.Errorf("failed to get file structure: %w", err) + } + + b, _ := json.MarshalIndent(resp, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil + }, + } +} diff --git a/internal/cmd/cli/get_file_symbol.go b/internal/cmd/cli/get_file_symbol.go new file mode 100644 index 00000000..3342916f --- /dev/null +++ b/internal/cmd/cli/get_file_symbol.go @@ -0,0 +1,63 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "context" + "encoding/json" + "fmt" + "os" + + "github.com/cloudwego/abcoder/llm/tool" + "github.com/spf13/cobra" +) + +func newGetFileSymbolCmd() *cobra.Command { + return &cobra.Command{ + Use: "get_file_symbol ", + Short: "Get detailed symbol information", + Long: `Get detailed information about a symbol including code, dependencies, and references. + +Returns the symbol's code, type, line number, and relationship with other symbols.`, + Example: `abcoder cli get_file_symbol myrepo src/main.go MyFunction`, + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) error { + astsDir, err := getASTsDir(cmd) + if err != nil { + return err + } + + repoName := args[0] + filePath := args[1] + name := args[2] + tools := tool.NewASTReadTools(tool.ASTReadToolsOptions{ + RepoASTsDir: astsDir, + DisableWatch: true, + }) + resp, err := tools.GetFileSymbol(context.Background(), tool.GetFileSymbolReq{ + RepoName: repoName, + FilePath: filePath, + Name: name, + }) + if err != nil { + return fmt.Errorf("failed to get file symbol: %w", err) + } + + b, _ := json.MarshalIndent(resp, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil + }, + } +} diff --git a/internal/cmd/cli/list_repos.go b/internal/cmd/cli/list_repos.go new file mode 100644 index 00000000..d711f029 --- /dev/null +++ b/internal/cmd/cli/list_repos.go @@ -0,0 +1,89 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/bytedance/sonic" + "github.com/cloudwego/abcoder/llm/tool" + "github.com/spf13/cobra" +) + +func newListReposCmd() *cobra.Command { + return &cobra.Command{ + Use: "list_repos", + Short: "List available repositories", + Long: `List all available repositories in the AST directory. + +The repositories are loaded from .repo_index.json or *.json files in the --asts-dir directory.`, + Example: `abcoder cli list-repos`, + RunE: func(cmd *cobra.Command, args []string) error { + astsDir, err := getASTsDir(cmd) + if err != nil { + return err + } + + // 尝试从 .repo_index.json 读取映射 + indexFile := filepath.Join(astsDir, ".repo_index.json") + var repoNames []string + + if data, err := os.ReadFile(indexFile); err == nil { + // 解析 repo_index.json + var index struct { + Mappings map[string]string `json:"mappings"` + } + if err := json.Unmarshal(data, &index); err == nil && index.Mappings != nil { + for name := range index.Mappings { + repoNames = append(repoNames, name) + } + } + } + + // 如果没有从 index 读取到,回退到扫描 JSON 文件,使用 sonic 快速读取 id + if len(repoNames) == 0 { + files, err := filepath.Glob(filepath.Join(astsDir, "*.json")) + if err != nil { + return err + } + for _, f := range files { + // 跳过 _repo_index.json + if strings.HasSuffix(f, "_repo_index.json") || strings.HasSuffix(f, ".repo_index.json") { + continue + } + // 使用 sonic 快速读取 id 字段,避免加载整个 JSON + if data, err := os.ReadFile(f); err == nil { + val, err := sonic.Get(data, "id") + if err == nil { + id, err := val.String() + if err == nil && id != "" { + repoNames = append(repoNames, id) + } + } + } + } + } + + resp := tool.ListReposResp{RepoNames: repoNames} + b, _ := json.MarshalIndent(resp, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil + }, + } +} diff --git a/internal/cmd/cli/tree_repo.go b/internal/cmd/cli/tree_repo.go new file mode 100644 index 00000000..b860c8c4 --- /dev/null +++ b/internal/cmd/cli/tree_repo.go @@ -0,0 +1,57 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "context" + "encoding/json" + "fmt" + "os" + + "github.com/cloudwego/abcoder/llm/tool" + "github.com/spf13/cobra" +) + +func newTreeRepoCmd() *cobra.Command { + return &cobra.Command{ + Use: "tree_repo ", + Short: "Get file tree of a repository", + Long: `Get the file tree structure of a repository. + +Returns a map of directories to file lists.`, + Example: `abcoder cli tree_repo myrepo`, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + astsDir, err := getASTsDir(cmd) + if err != nil { + return err + } + + repoName := args[0] + tools := tool.NewASTReadTools(tool.ASTReadToolsOptions{ + RepoASTsDir: astsDir, + DisableWatch: true, + }) + resp, err := tools.TreeRepo(context.Background(), tool.TreeRepoReq{RepoName: repoName}) + if err != nil { + return fmt.Errorf("failed to tree repo: %w", err) + } + + b, _ := json.MarshalIndent(resp, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil + }, + } +} diff --git a/internal/cmd/cli/utils.go b/internal/cmd/cli/utils.go new file mode 100644 index 00000000..49145c74 --- /dev/null +++ b/internal/cmd/cli/utils.go @@ -0,0 +1,38 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/spf13/cobra" +) + +// getASTsDir returns the ASTs directory path from command flags or default location. +func getASTsDir(cmd *cobra.Command) (string, error) { + astsDir, err := cmd.Flags().GetString("asts-dir") + if err != nil { + return "", err + } + if astsDir == "" { + astsDir = filepath.Join(os.Getenv("HOME"), ".asts") + } + if _, err := os.Stat(astsDir); os.IsNotExist(err) { + return "", fmt.Errorf("ASTs directory does not exist: %s", astsDir) + } + return astsDir, nil +} diff --git a/llm/tool/ast_read.go b/llm/tool/ast_read.go index 27f2d04f..e411f70a 100644 --- a/llm/tool/ast_read.go +++ b/llm/tool/ast_read.go @@ -64,7 +64,8 @@ var ( type ASTReadToolsOptions struct { // PatchOptions patch.Options - RepoASTsDir string + RepoASTsDir string + DisableWatch bool } type ASTReadTools struct { @@ -94,21 +95,23 @@ func NewASTReadTools(opts ASTReadToolsOptions) *ASTReadTools { } } - // add a file watch on the RepoASTsDir - abutil.WatchDir(opts.RepoASTsDir, func(op fsnotify.Op, file string) { - if !strings.HasSuffix(file, ".json") { - return - } - if op&fsnotify.Write != 0 || op&fsnotify.Create != 0 { - if repo, err := uniast.LoadRepo(file); err != nil { - log.Error("Load Uniast JSON file failed: %v", err) - } else { - ret.repos.Store(repo.Name, repo) + // add a file watch on the RepoASTsDir (unless disabled) + if !opts.DisableWatch { + abutil.WatchDir(opts.RepoASTsDir, func(op fsnotify.Op, file string) { + if !strings.HasSuffix(file, ".json") { + return } - } else if op&fsnotify.Remove != 0 { - ret.repos.Delete(filepath.Base(file)) - } - }) + if op&fsnotify.Write != 0 || op&fsnotify.Create != 0 { + if repo, err := uniast.LoadRepo(file); err != nil { + log.Error("Load Uniast JSON file failed: %v", err) + } else { + ret.repos.Store(repo.Name, repo) + } + } else if op&fsnotify.Remove != 0 { + ret.repos.Delete(filepath.Base(file)) + } + }) + } tt, err := utils.InferTool(string(ToolListRepos), DescListRepos, diff --git a/main.go b/main.go index fe4f678b..0b578de9 100644 --- a/main.go +++ b/main.go @@ -39,6 +39,7 @@ import ( "strings" internalCmd "github.com/cloudwego/abcoder/internal/cmd" + "github.com/cloudwego/abcoder/internal/cmd/cli" "github.com/cloudwego/abcoder/lang" "github.com/cloudwego/abcoder/lang/log" "github.com/cloudwego/abcoder/lang/uniast" @@ -71,12 +72,14 @@ writing, and analyzing code structures.`, // Global flags cmd.PersistentFlags().BoolP("verbose", "v", false, "Verbose mode.") + cmd.PersistentFlags().String("asts-dir", "", "Base directory for AST files (default: ~/.asts).") // Add subcommands cmd.AddCommand(newVersionCmd()) cmd.AddCommand(newParseCmd()) cmd.AddCommand(newWriteCmd()) cmd.AddCommand(newMcpCmd()) + cmd.AddCommand(cli.NewCliCmd()) cmd.AddCommand(newInitSpecCmd()) cmd.AddCommand(newAgentCmd()) From 304b4ca9f4b56fbb01bd20dfeb052657af98114e Mon Sep 17 00:00:00 2001 From: simuleite Date: Sat, 28 Feb 2026 11:08:19 +0800 Subject: [PATCH 05/23] Compress Output of get_file_strucutre: display mod&pkg once, display name&line only when node counts of a file > 500 --- idl/get_file_structure.proto | 52 ++++++++++++++++++++++++++++++++++++ llm/tool/ast_read.go | 19 ++++++++----- 2 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 idl/get_file_structure.proto diff --git a/idl/get_file_structure.proto b/idl/get_file_structure.proto new file mode 100644 index 00000000..aa9b785f --- /dev/null +++ b/idl/get_file_structure.proto @@ -0,0 +1,52 @@ +// get_file_structure IDL + +syntax = "proto3"; + +package abcoder; + +// Request +message GetFileStructReq { + string repo_name = 1; // the name of the repository (output of list_repos tool) + string file_path = 2; // relative file path (output of get_repo_structure tool, e.g., 'src/main.go') +} + +// Response +message GetFileStructResp { + FileStruct file_struct = 1; + string error = 2; // optional +} + +message FileStruct { + string file_path = 1; // the path of the file + string mod_path = 2; // optional, the module path + string pkg_path = 3; // optional, the package path + repeated Import imports = 4; // optional, the imports of the file + repeated NodeStruct nodes = 5; // optional, the node structs of the file +} + +message Import { + string path = 1; // import path + string alias = 2; // optional, import alias +} + +message NodeStruct { + string mod_path = 1; // optional, the module path + string pkg_path = 2; // optional, the package path + string name = 3; // the name of the node + string type = 4; // optional, the type of the node + string signature = 5; // optional, the func signature of the node (omitted when nodes > 500) + string file = 6; // optional, the file path of the node + int32 line = 7; // optional, the line of the node + string codes = 8; // optional, the codes of the node + repeated NodeID dependencies = 9; // optional, the dependencies of the node + repeated NodeID references = 10; // optional, the references of the node + repeated NodeID implements = 11; // optional, the implements of the node + repeated NodeID groups = 12; // optional, the groups of the node + repeated NodeID inherits = 13; // optional, the inherits of the node +} + +message NodeID { + string mod_path = 1; // module path of the node (from get_repo_structure) + string pkg_path = 2; // package path of the node (from get_repo_structure) + string name = 3; // name of the node (from get_package_structure or get_file_structure) +} diff --git a/llm/tool/ast_read.go b/llm/tool/ast_read.go index e411f70a..e08036e5 100644 --- a/llm/tool/ast_read.go +++ b/llm/tool/ast_read.go @@ -233,8 +233,10 @@ type PackageStruct struct { type FileStruct struct { FilePath string `json:"file_path" jsonschema:"description=the path of the file"` - Imports []uniast.Import `json:"imports,omitempty" jsonschema:"description=the imports of the file"` - Nodes []NodeStruct `json:"nodes,omitempty" jsonschema:"description=the node structs of the file"` + ModPath uniast.ModPath `json:"mod_path,omitempty" jsonschema:"description=the module path"` + PkgPath uniast.PkgPath `json:"pkg_path,omitempty" jsonschema:"description=the package path"` + Imports []uniast.Import `json:"imports,omitempty" jsonschema:"description=the imports of the file"` + Nodes []NodeStruct `json:"nodes,omitempty" jsonschema:"description=the node structs of the file"` } type NodeStruct struct { @@ -524,20 +526,23 @@ func (t *ASTReadTools) getFileStructure(_ context.Context, req GetFileStructReq, nodes := repo.GetFileNodes(req.FilePath) ff := FileStruct{ FilePath: req.FilePath, + ModPath: mod.Name, + PkgPath: file.Package, } if needNodeDetail { ff.Imports = file.Imports } + // If nodes count > 500, only show name + line + simplifiedOutput := len(nodes) > 500 for _, n := range nodes { nn := NodeStruct{ - ModPath: mod.Name, - PkgPath: file.Package, - Name: n.Identity.Name, + Name: n.Identity.Name, } if needNodeDetail { - nn.Type = n.Type.String() - nn.Signature = n.Signature() nn.Line = n.FileLine().Line + if !simplifiedOutput && n.Type != uniast.VAR { + nn.Signature = n.Signature() + } } ff.Nodes = append(ff.Nodes, nn, From 127a1996602c52bf4fea39d842c62028199db852 Mon Sep 17 00:00:00 2001 From: simuleite Date: Tue, 3 Mar 2026 21:17:14 +0800 Subject: [PATCH 06/23] abcoder cli list_repos, detect current_repo --- go.mod | 2 +- internal/cmd/cli/list_repos.go | 71 +- lang/golang/parser/golang.json | 3575 ++++++++++++++++++++++++++++++++ lang/golang/parser/parser.go | 2 +- 4 files changed, 3630 insertions(+), 20 deletions(-) create mode 100644 lang/golang/parser/golang.json diff --git a/go.mod b/go.mod index 632a72fd..a20df35d 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.10.0 github.com/vifraa/gopom v1.0.0 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa golang.org/x/mod v0.24.0 golang.org/x/tools v0.32.0 ) @@ -89,7 +90,6 @@ require ( github.com/yargevad/filepathx v1.0.0 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect golang.org/x/arch v0.14.0 // indirect - golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect golang.org/x/net v0.39.0 // indirect golang.org/x/sync v0.13.0 // indirect golang.org/x/sys v0.33.0 // indirect diff --git a/internal/cmd/cli/list_repos.go b/internal/cmd/cli/list_repos.go index d711f029..021cf0dc 100644 --- a/internal/cmd/cli/list_repos.go +++ b/internal/cmd/cli/list_repos.go @@ -22,8 +22,8 @@ import ( "strings" "github.com/bytedance/sonic" - "github.com/cloudwego/abcoder/llm/tool" "github.com/spf13/cobra" + "golang.org/x/exp/maps" ) func newListReposCmd() *cobra.Command { @@ -40,9 +40,16 @@ The repositories are loaded from .repo_index.json or *.json files in the --asts- return err } + // 获取当前工作目录 + cwd, err := os.Getwd() + if err != nil { + return err + } + // 尝试从 .repo_index.json 读取映射 indexFile := filepath.Join(astsDir, ".repo_index.json") var repoNames []string + var currentRepo string if data, err := os.ReadFile(indexFile); err == nil { // 解析 repo_index.json @@ -50,37 +57,65 @@ The repositories are loaded from .repo_index.json or *.json files in the --asts- Mappings map[string]string `json:"mappings"` } if err := json.Unmarshal(data, &index); err == nil && index.Mappings != nil { - for name := range index.Mappings { + for name, path := range index.Mappings { repoNames = append(repoNames, name) + // 检查当前目录是否匹配 + if path == cwd { + currentRepo = name + } } } } - // 如果没有从 index 读取到,回退到扫描 JSON 文件,使用 sonic 快速读取 id - if len(repoNames) == 0 { - files, err := filepath.Glob(filepath.Join(astsDir, "*.json")) - if err != nil { - return err + // 扫描 JSON 文件,使用 sonic 快速读取 + repoNamesMap := make(map[string]struct{}) + files, err := filepath.Glob(filepath.Join(astsDir, "*.json")) + if err != nil { + return err + } + for _, f := range files { + // 跳过 _repo_index.json + if strings.HasSuffix(f, "_repo_index.json") || strings.HasSuffix(f, ".repo_index.json") { + continue } - for _, f := range files { - // 跳过 _repo_index.json - if strings.HasSuffix(f, "_repo_index.json") || strings.HasSuffix(f, ".repo_index.json") { - continue + // 使用 sonic 快速读取 id 字段,避免加载整个 JSON + if data, err := os.ReadFile(f); err == nil { + val, err := sonic.Get(data, "id") + if err == nil { + id, err := val.String() + if err == nil && id != "" { + repoNamesMap[id] = struct{}{} + } } - // 使用 sonic 快速读取 id 字段,避免加载整个 JSON - if data, err := os.ReadFile(f); err == nil { - val, err := sonic.Get(data, "id") + // 尝试读取 Path 字段,检查是否匹配当前目录 + if currentRepo == "" { + val, err := sonic.Get(data, "Path") if err == nil { - id, err := val.String() - if err == nil && id != "" { - repoNames = append(repoNames, id) + path, err := val.String() + if err == nil && path == cwd { + // 从 id 字段获取名称 + val, err := sonic.Get(data, "id") + if err == nil { + id, err := val.String() + if err == nil && id != "" { + currentRepo = id + } + } } } } } } + repoNames = maps.Keys(repoNamesMap) - resp := tool.ListReposResp{RepoNames: repoNames} + type ListReposOutput struct { + RepoNames []string `json:"repo_names"` + CurrentRepo string `json:"current_repo,omitempty"` + } + resp := ListReposOutput{ + RepoNames: repoNames, + CurrentRepo: currentRepo, + } b, _ := json.MarshalIndent(resp, "", " ") fmt.Fprintf(os.Stdout, "%s\n", b) return nil diff --git a/lang/golang/parser/golang.json b/lang/golang/parser/golang.json new file mode 100644 index 00000000..6578d644 --- /dev/null +++ b/lang/golang/parser/golang.json @@ -0,0 +1,3575 @@ +{ + "id": "a.b/c", + "ASTVersion": "v0.1.5", + "ToolVersion": "", + "Path": "a.b/c", + "Modules": { + "../.@": { + "Language": "go", + "Version": "", + "Name": "../.", + "Dir": "", + "Packages": { + "a.b/c/pkg": { + "IsMain": false, + "IsTest": false, + "PkgPath": "a.b/c/pkg", + "Functions": { + "CaseStruct.CaseMethod": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod", + "File": "pkg/util.go", + "Line": 42, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func (s *CaseStruct) CaseMethod(in []byte, x *entity.MyStruct) Integer {\n\t_ = json.Unmarshal(in, x)\n\treturn Integer(0)\n}", + "Receiver": { + "IsPointer": true, + "Type": { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct" + } + } + }, + "Case_Func": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func", + "File": "pkg/util.go", + "Line": 25, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func Case_Func(in []byte, s *CaseStruct) error {\n\treturn sonic.Unmarshal(in, s)\n}" + } + }, + "Types": { + "CaseGenericStruct": { + "Exported": true, + "TypeKind": "", + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericStruct", + "File": "pkg/generic.go", + "Line": 30, + "StartOffset": 0, + "EndOffset": 0, + "Content": "type CaseGenericStruct struct{}" + }, + "CaseStruct": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 29, + "StartOffset": 0, + "EndOffset": 0, + "Content": "type CaseStruct struct {\n\tFieldPremitive string\n\tFieldType Integer\n\tFieldExternalType entity.MyStruct\n\tFieldInterface InterfaceA\n\tFieldExternalInterface entity.InterfaceB\n\tFieldClosuer func(in string) int\n}", + "Methods": { + "CaseMethod": { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod" + } + } + }, + "Obj": { + "Exported": true, + "TypeKind": "", + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "Obj", + "File": "pkg/refer.go", + "Line": 37, + "StartOffset": 0, + "EndOffset": 0, + "Content": "type Obj struct{}" + } + }, + "Vars": {} + }, + "a.b/c/pkg/entity": { + "IsMain": false, + "IsTest": false, + "PkgPath": "a.b/c/pkg/entity", + "Functions": {}, + "Types": { + "MyStruct": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/entity/entity.go", + "Line": 23, + "StartOffset": 0, + "EndOffset": 0, + "Content": "type MyStruct struct {\n\ta string\n\tb string\n\tc MyStructC\n\tMyStructD\n\tEmbed struct {\n\t\t*MyStruct\n\t}\n}" + } + }, + "Vars": {} + } + } + }, + "a.b/c": { + "Language": "go", + "Version": "", + "Name": "a.b/c", + "Dir": ".", + "Packages": { + "a.b/c/merge": { + "IsMain": false, + "IsTest": false, + "PkgPath": "a.b/c/merge", + "Functions": { + "CaseMergeRef": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/merge", + "Name": "CaseMergeRef", + "File": "merge/merge_ref.go", + "Line": 25, + "StartOffset": 685, + "EndOffset": 777, + "Content": "func CaseMergeRef() MyStruct {\n\t_ = G1 + G2\n\treturn MyStruct{\n\t\tMyStructD: MyStructD{},\n\t}\n}", + "Signature": "func CaseMergeRef() MyStruct", + "Results": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "merge/merge_ref.go", + "Line": 25, + "StartOffset": 705, + "EndOffset": 713 + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "merge/merge_ref.go", + "Line": 27, + "StartOffset": 737, + "EndOffset": 745 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD", + "File": "merge/merge_ref.go", + "Line": 28, + "StartOffset": 760, + "EndOffset": 769 + } + ], + "GlobalVars": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "G1", + "File": "merge/merge_ref.go", + "Line": 26, + "StartOffset": 721, + "EndOffset": 723 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/merge", + "Name": "G2", + "File": "merge/merge_ref.go", + "Line": 26, + "StartOffset": 726, + "EndOffset": 728 + } + ] + } + }, + "Types": { + "S": { + "Exported": true, + "TypeKind": "typedef", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/merge", + "Name": "S", + "File": "merge/merge_ref.go", + "Line": 23, + "StartOffset": 667, + "EndOffset": 683, + "Content": "type S MyStructD", + "SubStruct": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD", + "File": "merge/merge_ref.go", + "Line": 23, + "StartOffset": 674, + "EndOffset": 683 + } + ] + } + }, + "Vars": { + "G2": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/merge", + "Name": "G2", + "File": "merge/merge_ref.go", + "Line": 19, + "StartOffset": 642, + "EndOffset": 649, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "int" + }, + "Content": "var G2 = G1", + "Dependencies": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "G1", + "File": "merge/merge_ref.go", + "Line": 19, + "StartOffset": 647, + "EndOffset": 649 + } + ] + }, + "I1": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/merge", + "Name": "I1", + "File": "merge/merge_ref.go", + "Line": 21, + "StartOffset": 655, + "EndOffset": 665, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "Integer" + }, + "Content": "var I1 Integer" + } + } + }, + "a.b/c/pkg": { + "IsMain": false, + "IsTest": false, + "PkgPath": "a.b/c/pkg", + "Functions": { + "CaseGenericFunc": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericFunc", + "File": "pkg/generic.go", + "Line": 35, + "StartOffset": 893, + "EndOffset": 1036, + "Content": "func CaseGenericFunc[U InterfaceA, T entity.InterfaceB, V any](a T, b U, c V) string {\n\treturn a.String() + fmt.Sprintf(\"%v\", c) + b.String()\n}", + "Signature": "func CaseGenericFunc[U InterfaceA, T entity.InterfaceB, V any](a T, b U, c V) string", + "Params": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB", + "File": "pkg/generic.go", + "Line": 35, + "StartOffset": 956, + "EndOffset": 959 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA", + "File": "pkg/generic.go", + "Line": 35, + "StartOffset": 961, + "EndOffset": 964 + } + ], + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB.String", + "File": "pkg/generic.go", + "Line": 36, + "StartOffset": 990, + "EndOffset": 996, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA.String", + "File": "pkg/generic.go", + "Line": 36, + "StartOffset": 1026, + "EndOffset": 1032, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA", + "File": "pkg/generic.go", + "Line": 35, + "StartOffset": 914, + "EndOffset": 926 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB", + "File": "pkg/generic.go", + "Line": 35, + "StartOffset": 928, + "EndOffset": 947 + } + ] + }, + "CaseGenericStruct.String": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericStruct.String", + "File": "pkg/generic.go", + "Line": 31, + "StartOffset": 761, + "EndOffset": 891, + "Content": "func (s *CaseGenericStruct[_, _, _]) String() string {\n\treturn s.Prefix.String() + fmt.Sprintf(\"%v\", s.Data) + s.Subfix.String()\n}", + "Signature": "func (s *CaseGenericStruct[_, _, _]) String() string", + "Receiver": { + "IsPointer": true, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericStruct" + } + }, + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB.String", + "File": "pkg/generic.go", + "Line": 32, + "StartOffset": 833, + "EndOffset": 839, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA.String", + "File": "pkg/generic.go", + "Line": 32, + "StartOffset": 881, + "EndOffset": 887, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB", + "File": "pkg/generic.go", + "Line": 31, + "StartOffset": 769, + "EndOffset": 796 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA", + "File": "pkg/generic.go", + "Line": 31, + "StartOffset": 769, + "EndOffset": 796 + } + ] + }, + "CaseInterface.CaseMethodDeps": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": true, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseInterface.CaseMethodDeps", + "File": "pkg/util.go", + "Line": 166, + "StartOffset": 3404, + "EndOffset": 3452, + "Content": "CaseMethodDeps(a int, b entity.MyStruct) Integer", + "Signature": "CaseMethodDeps(a int, b entity.MyStruct) Integer", + "Params": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 166, + "StartOffset": 3426, + "EndOffset": 3443 + } + ], + "Results": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 166, + "StartOffset": 3445, + "EndOffset": 3452 + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 166, + "StartOffset": 3404, + "EndOffset": 3452 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 166, + "StartOffset": 3404, + "EndOffset": 3452 + } + ] + }, + "CaseStrucLiterMethod": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStrucLiterMethod", + "File": "pkg/util.go", + "Line": 146, + "StartOffset": 2920, + "EndOffset": 3193, + "Content": "func CaseStrucLiterMethod() {\n\t_ = (\u0026CaseStruct{\n\t\tFieldPremitive: \"a\",\n\t\tFieldType: 1,\n\t\tFieldExternalType: entity.MyStruct{},\n\t\tFieldInterface: nil,\n\t\tFieldExternalInterface: nil,\n\t\tFieldClosuer: nil,\n\t}).CaseMethod(nil, nil)\n}", + "Signature": "func CaseStrucLiterMethod()", + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod", + "File": "pkg/util.go", + "Line": 154, + "StartOffset": 3171, + "EndOffset": 3181, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 147, + "StartOffset": 2957, + "EndOffset": 2967 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 150, + "StartOffset": 3062, + "EndOffset": 3070 + } + ] + }, + "CaseStruct.CaseMethod": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod", + "File": "pkg/util.go", + "Line": 42, + "StartOffset": 1080, + "EndOffset": 1200, + "Content": "func (s *CaseStruct) CaseMethod(in []byte, x *entity.MyStruct) Integer {\n\t_ = json.Unmarshal(in, x)\n\treturn Integer(0)\n}", + "Signature": "func (s *CaseStruct) CaseMethod(in []byte, x *entity.MyStruct) Integer", + "Receiver": { + "IsPointer": true, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct" + } + }, + "Params": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 42, + "StartOffset": 1123, + "EndOffset": 1141 + } + ], + "Results": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 42, + "StartOffset": 1143, + "EndOffset": 1150 + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 44, + "StartOffset": 1188, + "EndOffset": 1195 + } + ] + }, + "CaseStruct.String": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.String", + "File": "pkg/util.go", + "Line": 47, + "StartOffset": 1202, + "EndOffset": 1279, + "Content": "func (s *CaseStruct) String() string {\n\treturn s.FieldExternalType.String()\n}", + "Signature": "func (s *CaseStruct) String() string", + "Receiver": { + "IsPointer": true, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct" + } + }, + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct.String", + "File": "pkg/util.go", + "Line": 48, + "StartOffset": 1269, + "EndOffset": 1275, + "Extra": { + "IsInvoked": true + } + } + ] + }, + "Case_All": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_All", + "File": "pkg/util.go", + "Line": 77, + "StartOffset": 1668, + "EndOffset": 2120, + "Content": "func Case_All(in string, a entity.MyStruct, b CaseStruct) (int, Integer, entity.Integer) {\n\tvar x entity.Integer\n\tvar y Integer\n\t_ = int(x) + int(y)\n\tvar s CaseStruct\n\t_ = s.CaseMethod(nil, nil)\n\tvar a2 entity.MyStruct\n\t_ = a2.String()\n\tb.FieldClosuer = func(in string) int { return 0 }\n\t_ = b.CaseMethod(nil, nil)\n\ta.MyStructD = entity.MyStructD{}\n\t_ = a.String()\n\t_ = Case_Func(nil, nil)\n\t_ = entity.A(\"\")\n\t_ = GlobalVar + entity.G1\n\treturn 0, 0, 0\n}", + "Signature": "func Case_All(in string, a entity.MyStruct, b CaseStruct) (int, Integer, entity.Integer)", + "Params": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 77, + "StartOffset": 1693, + "EndOffset": 1710 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 77, + "StartOffset": 1712, + "EndOffset": 1724 + } + ], + "Results": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 77, + "StartOffset": 1732, + "EndOffset": 1739 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 77, + "StartOffset": 1741, + "EndOffset": 1755 + } + ], + "FunctionCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func", + "File": "pkg/util.go", + "Line": 89, + "StartOffset": 2038, + "EndOffset": 2047, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "A", + "File": "pkg/util.go", + "Line": 90, + "StartOffset": 2070, + "EndOffset": 2071, + "Extra": { + "IsInvoked": true + } + } + ], + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod", + "File": "pkg/util.go", + "Line": 82, + "StartOffset": 1842, + "EndOffset": 1852, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct.String", + "File": "pkg/util.go", + "Line": 84, + "StartOffset": 1895, + "EndOffset": 1901, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 78, + "StartOffset": 1773, + "EndOffset": 1780 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 79, + "StartOffset": 1788, + "EndOffset": 1795 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 81, + "StartOffset": 1824, + "EndOffset": 1834 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 83, + "StartOffset": 1878, + "EndOffset": 1886 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD", + "File": "pkg/util.go", + "Line": 87, + "StartOffset": 2005, + "EndOffset": 2014 + } + ], + "GlobalVars": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "GlobalVar", + "File": "pkg/util.go", + "Line": 91, + "StartOffset": 2081, + "EndOffset": 2090 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "G1", + "File": "pkg/util.go", + "Line": 91, + "StartOffset": 2100, + "EndOffset": 2102 + } + ], + "Extra": { + "AnonymousFunctions": [ + { + "File": "pkg/util.go", + "Line": 85, + "StartOffset": 1922, + "EndOffset": 1954 + } + ] + } + }, + "Case_Chain_Selector": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Chain_Selector", + "File": "pkg/refer.go", + "Line": 46, + "StartOffset": 994, + "EndOffset": 1056, + "Content": "func Case_Chain_Selector() {\n\tvar obj Obj\n\tobj.Call().Call()\n}", + "Signature": "func Case_Chain_Selector()", + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj.Call", + "File": "pkg/refer.go", + "Line": 48, + "StartOffset": 1048, + "EndOffset": 1052, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj", + "File": "pkg/refer.go", + "Line": 47, + "StartOffset": 1032, + "EndOffset": 1035 + } + ] + }, + "Case_Closure": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Closure", + "File": "pkg/refer.go", + "Line": 51, + "StartOffset": 1058, + "EndOffset": 1148, + "Content": "func Case_Closure() {\n\tvar obj Obj\n\tobj.CallFunc(func(o Obj) Obj {\n\t\treturn o.Call()\n\t})\n}", + "Signature": "func Case_Closure()", + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj.CallFunc", + "File": "pkg/refer.go", + "Line": 53, + "StartOffset": 1098, + "EndOffset": 1106, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj.Call", + "File": "pkg/refer.go", + "Line": 54, + "StartOffset": 1136, + "EndOffset": 1140, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj", + "File": "pkg/refer.go", + "Line": 52, + "StartOffset": 1089, + "EndOffset": 1092 + } + ], + "Extra": { + "AnonymousFunctions": [ + { + "File": "pkg/refer.go", + "Line": 53, + "StartOffset": 1107, + "EndOffset": 1145 + } + ] + } + }, + "Case_Func": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func", + "File": "pkg/util.go", + "Line": 25, + "StartOffset": 697, + "EndOffset": 778, + "Content": "func Case_Func(in []byte, s *CaseStruct) error {\n\treturn sonic.Unmarshal(in, s)\n}", + "Signature": "func Case_Func(in []byte, s *CaseStruct) error", + "Params": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 25, + "StartOffset": 723, + "EndOffset": 736 + } + ], + "FunctionCalls": [ + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Unmarshal", + "File": "pkg/util.go", + "Line": 26, + "StartOffset": 760, + "EndOffset": 769, + "Extra": { + "IsInvoked": true + } + } + ] + }, + "Case_Func_Func": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func_Func", + "File": "pkg/util.go", + "Line": 72, + "StartOffset": 1598, + "EndOffset": 1666, + "Content": "func Case_Func_Func() {\n\t_ = Case_Func(nil, nil)\n\t_ = entity.A(\"\")\n}", + "Signature": "func Case_Func_Func()", + "FunctionCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func", + "File": "pkg/util.go", + "Line": 73, + "StartOffset": 1627, + "EndOffset": 1636, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "A", + "File": "pkg/util.go", + "Line": 74, + "StartOffset": 1659, + "EndOffset": 1660, + "Extra": { + "IsInvoked": true + } + } + ] + }, + "Case_Func_GloabVar": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func_GloabVar", + "File": "pkg/util.go", + "Line": 53, + "StartOffset": 1300, + "EndOffset": 1363, + "Content": "func Case_Func_GloabVar() int {\n\treturn GlobalVar + entity.G1\n}", + "Signature": "func Case_Func_GloabVar() int", + "GlobalVars": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "GlobalVar", + "File": "pkg/util.go", + "Line": 54, + "StartOffset": 1340, + "EndOffset": 1349 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "G1", + "File": "pkg/util.go", + "Line": 54, + "StartOffset": 1359, + "EndOffset": 1361 + } + ] + }, + "Case_Func_Global": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func_Global", + "File": "pkg/util.go", + "Line": 111, + "StartOffset": 2453, + "EndOffset": 2634, + "Content": "func Case_Func_Global() {\n\t_ = Enum1\n\t_ = Enum2\n\t_ = Enum3\n\t_ = Enum4\n\t_ = Var1\n\t_ = Var2\n\t_ = Var3\n\t_ = Var4\n\t_ = Var5\n\t_ = Var6\n\t_ = Var7\n\t_ = Var8\n\t_ = entity.G1\n\t_ = entity.V1\n}", + "Signature": "func Case_Func_Global()", + "GlobalVars": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum1", + "File": "pkg/util.go", + "Line": 112, + "StartOffset": 2484, + "EndOffset": 2489 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum2", + "File": "pkg/util.go", + "Line": 113, + "StartOffset": 2495, + "EndOffset": 2500 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum3", + "File": "pkg/util.go", + "Line": 114, + "StartOffset": 2506, + "EndOffset": 2511 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum4", + "File": "pkg/util.go", + "Line": 115, + "StartOffset": 2517, + "EndOffset": 2522 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var1", + "File": "pkg/util.go", + "Line": 116, + "StartOffset": 2528, + "EndOffset": 2532 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var2", + "File": "pkg/util.go", + "Line": 117, + "StartOffset": 2538, + "EndOffset": 2542 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var3", + "File": "pkg/util.go", + "Line": 118, + "StartOffset": 2548, + "EndOffset": 2552 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var4", + "File": "pkg/util.go", + "Line": 119, + "StartOffset": 2558, + "EndOffset": 2562 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var5", + "File": "pkg/util.go", + "Line": 120, + "StartOffset": 2568, + "EndOffset": 2572 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var6", + "File": "pkg/util.go", + "Line": 121, + "StartOffset": 2578, + "EndOffset": 2582 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var7", + "File": "pkg/util.go", + "Line": 122, + "StartOffset": 2588, + "EndOffset": 2592 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var8", + "File": "pkg/util.go", + "Line": 123, + "StartOffset": 2598, + "EndOffset": 2602 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "G1", + "File": "pkg/util.go", + "Line": 124, + "StartOffset": 2615, + "EndOffset": 2617 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "V1", + "File": "pkg/util.go", + "Line": 125, + "StartOffset": 2630, + "EndOffset": 2632 + } + ] + }, + "Case_Func_Method": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func_Method", + "File": "pkg/util.go", + "Line": 65, + "StartOffset": 1478, + "EndOffset": 1596, + "Content": "func Case_Func_Method() {\n\ts := \u0026CaseStruct{}\n\t_ = s.CaseMethod(nil, nil)\n\ts2 := \u0026entity.MyStruct{}\n\t_ = s2.String()\n}", + "Signature": "func Case_Func_Method()", + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod", + "File": "pkg/util.go", + "Line": 67, + "StartOffset": 1531, + "EndOffset": 1541, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct.String", + "File": "pkg/util.go", + "Line": 69, + "StartOffset": 1586, + "EndOffset": 1592, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 66, + "StartOffset": 1511, + "EndOffset": 1521 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 68, + "StartOffset": 1567, + "EndOffset": 1575 + } + ] + }, + "Case_Func_RefType": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func_RefType", + "File": "pkg/util.go", + "Line": 59, + "StartOffset": 1383, + "EndOffset": 1476, + "Content": "func Case_Func_RefType() int {\n\tvar x entity.Integer\n\tvar y Integer\n\treturn int(x) + int(y)\n}", + "Signature": "func Case_Func_RefType() int", + "Types": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 60, + "StartOffset": 1428, + "EndOffset": 1435 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 61, + "StartOffset": 1443, + "EndOffset": 1450 + } + ] + }, + "Case_Refer_Func": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Refer_Func", + "File": "pkg/refer.go", + "Line": 24, + "StartOffset": 706, + "EndOffset": 773, + "Content": "func Case_Refer_Func() {\n\tsonic.Get(nil, \"\")\n\tsonic.Pretouch(nil)\n}", + "Signature": "func Case_Refer_Func()", + "FunctionCalls": [ + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Get", + "File": "pkg/refer.go", + "Line": 25, + "StartOffset": 738, + "EndOffset": 741, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Pretouch", + "File": "pkg/refer.go", + "Line": 26, + "StartOffset": 758, + "EndOffset": 766, + "Extra": { + "IsInvoked": true + } + } + ] + }, + "Case_Refer_Method": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Refer_Method", + "File": "pkg/refer.go", + "Line": 29, + "StartOffset": 775, + "EndOffset": 835, + "Content": "func Case_Refer_Method() {\n\tn := sonic.Config{}\n\tn.Froze()\n}", + "Signature": "func Case_Refer_Method()", + "MethodCalls": [ + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config.Froze", + "File": "pkg/refer.go", + "Line": 31, + "StartOffset": 826, + "EndOffset": 831, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config", + "File": "pkg/refer.go", + "Line": 30, + "StartOffset": 814, + "EndOffset": 820 + } + ] + }, + "InterfaceA.String": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": true, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA.String", + "File": "pkg/util.go", + "Line": 39, + "StartOffset": 1061, + "EndOffset": 1076, + "Content": "String() string", + "Signature": "String() string" + }, + "Obj.Call": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj.Call", + "File": "pkg/refer.go", + "Line": 38, + "StartOffset": 894, + "EndOffset": 931, + "Content": "func (o Obj) Call() Obj {\n\treturn o\n}", + "Signature": "func (o Obj) Call() Obj", + "Receiver": { + "IsPointer": false, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj" + } + }, + "Results": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj", + "File": "pkg/refer.go", + "Line": 38, + "StartOffset": 914, + "EndOffset": 917 + } + ] + }, + "Obj.CallFunc": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj.CallFunc", + "File": "pkg/refer.go", + "Line": 42, + "StartOffset": 933, + "EndOffset": 992, + "Content": "func (o Obj) CallFunc(f func(Obj) Obj) Obj {\n\treturn f(o)\n}", + "Signature": "func (o Obj) CallFunc(f func(Obj) Obj) Obj", + "Receiver": { + "IsPointer": false, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj" + } + }, + "Params": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj", + "File": "pkg/refer.go", + "Line": 42, + "StartOffset": 955, + "EndOffset": 970 + } + ], + "Results": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj", + "File": "pkg/refer.go", + "Line": 42, + "StartOffset": 972, + "EndOffset": 975 + } + ] + } + }, + "Types": { + "CaseGenericStruct": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericStruct", + "File": "pkg/generic.go", + "Line": 25, + "StartOffset": 654, + "EndOffset": 759, + "Content": "type CaseGenericStruct[T entity.InterfaceB, U InterfaceA, V any] struct {\n\tPrefix T\n\tSubfix U\n\tData V\n}", + "SubStruct": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB", + "File": "pkg/generic.go", + "Line": 26, + "StartOffset": 736, + "EndOffset": 737 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA", + "File": "pkg/generic.go", + "Line": 27, + "StartOffset": 746, + "EndOffset": 747 + } + ], + "Methods": { + "String": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericStruct.String" + } + }, + "Implements": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA" + } + ] + }, + "CaseInterface": { + "Exported": true, + "TypeKind": "interface", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseInterface", + "File": "pkg/util.go", + "Line": 165, + "StartOffset": 3372, + "EndOffset": 3454, + "Content": "type CaseInterface interface {\n\tCaseMethodDeps(a int, b entity.MyStruct) Integer\n}", + "SubStruct": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 166, + "StartOffset": 3418, + "EndOffset": 3452 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 166, + "StartOffset": 3418, + "EndOffset": 3452 + } + ], + "Methods": { + "CaseMethodDeps": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseInterface.CaseMethodDeps" + } + } + }, + "CaseStruct": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 29, + "StartOffset": 780, + "EndOffset": 1030, + "Content": "type CaseStruct struct {\n\tFieldPremitive string\n\tFieldType Integer\n\tFieldExternalType entity.MyStruct\n\tFieldInterface InterfaceA\n\tFieldExternalInterface entity.InterfaceB\n\tFieldClosuer func(in string) int\n}", + "SubStruct": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 31, + "StartOffset": 860, + "EndOffset": 867 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 32, + "StartOffset": 892, + "EndOffset": 907 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA", + "File": "pkg/util.go", + "Line": 33, + "StartOffset": 932, + "EndOffset": 942 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB", + "File": "pkg/util.go", + "Line": 34, + "StartOffset": 967, + "EndOffset": 984 + } + ], + "Methods": { + "CaseMethod": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod" + }, + "String": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.String" + } + }, + "Implements": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA" + } + ] + }, + "Case_Annoy_Struct": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Annoy_Struct", + "File": "pkg/refer.go", + "Line": 58, + "StartOffset": 1150, + "EndOffset": 1213, + "Content": "type Case_Annoy_Struct struct {\n\tA struct {\n\t\tB int\n\t}\n\tC int\n}" + }, + "Case_Refer_Type": { + "Exported": true, + "TypeKind": "typedef", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Refer_Type", + "File": "pkg/refer.go", + "Line": 22, + "StartOffset": 671, + "EndOffset": 704, + "Content": "type Case_Refer_Type sonic.Config", + "SubStruct": [ + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config", + "File": "pkg/refer.go", + "Line": 22, + "StartOffset": 692, + "EndOffset": 704 + } + ] + }, + "Integer": { + "Exported": true, + "TypeKind": "typedef", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 57, + "StartOffset": 1365, + "EndOffset": 1381, + "Content": "type Integer int" + }, + "InterfaceA": { + "Exported": true, + "TypeKind": "interface", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA", + "File": "pkg/util.go", + "Line": 38, + "StartOffset": 1032, + "EndOffset": 1078, + "Content": "type InterfaceA interface {\n\tString() string\n}", + "Methods": { + "String": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA.String" + } + } + }, + "Obj": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj", + "File": "pkg/refer.go", + "Line": 36, + "StartOffset": 875, + "EndOffset": 892, + "Content": "type Obj struct{}", + "Methods": { + "Call": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj.Call" + }, + "CallFunc": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Obj.CallFunc" + } + } + }, + "Type": { + "Exported": true, + "TypeKind": "typedef", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Type", + "File": "pkg/util.go", + "Line": 129, + "StartOffset": 2659, + "EndOffset": 2672, + "Content": "type Type int" + } + }, + "Vars": { + "CaseGenericVar": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericVar", + "File": "pkg/generic.go", + "Line": 39, + "StartOffset": 1042, + "EndOffset": 1110, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseGenericStruct" + }, + "Content": "var CaseGenericVar CaseGenericStruct[entity.InterfaceB, InterfaceA, int]", + "Dependencies": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB", + "File": "pkg/generic.go", + "Line": 39, + "StartOffset": 1057, + "EndOffset": 1110 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA", + "File": "pkg/generic.go", + "Line": 39, + "StartOffset": 1057, + "EndOffset": 1110 + } + ] + }, + "CaseVarFunc": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseVarFunc", + "File": "pkg/util.go", + "Line": 157, + "StartOffset": 3199, + "EndOffset": 3370, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct" + }, + "Content": "var CaseVarFunc CaseStruct = func() CaseStruct {\n\treturn CaseStruct{\n\t\tFieldPremitive: Var4,\n\t\tFieldType: Integer(1),\n\t\tFieldExternalType: entity.MyStruct{},\n\t}\n}()", + "Dependencies": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var4", + "File": "pkg/util.go", + "Line": 159, + "StartOffset": 3285, + "EndOffset": 3289 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "pkg/util.go", + "Line": 157, + "StartOffset": 3231, + "EndOffset": 3241 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Integer", + "File": "pkg/util.go", + "Line": 160, + "StartOffset": 3312, + "EndOffset": 3319, + "Extra": { + "IsInvoked": true + } + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/util.go", + "Line": 161, + "StartOffset": 3352, + "EndOffset": 3360 + } + ], + "Extra": { + "AnonymousFunctions": [ + { + "File": "pkg/util.go", + "Line": 157, + "StartOffset": 3224, + "EndOffset": 3368 + } + ] + } + }, + "Case_Ref_Const": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Ref_Const", + "File": "pkg/refer.go", + "Line": 65, + "StartOffset": 1221, + "EndOffset": 1247, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "untyped int" + }, + "Content": "const Case_Ref_Const = entity.G1", + "Dependencies": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "G1", + "File": "pkg/refer.go", + "Line": 65, + "StartOffset": 1238, + "EndOffset": 1247 + } + ] + }, + "Case_Refer_Var": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Refer_Var", + "File": "pkg/refer.go", + "Line": 34, + "StartOffset": 841, + "EndOffset": 873, + "Type": { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "API" + }, + "Content": "var Case_Refer_Var = sonic.ConfigStd", + "Dependencies": [ + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "ConfigStd", + "File": "pkg/refer.go", + "Line": 34, + "StartOffset": 864, + "EndOffset": 873 + } + ] + }, + "Enum1": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum1", + "File": "pkg/util.go", + "Line": 96, + "StartOffset": 2131, + "EndOffset": 2154, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "untyped int" + }, + "Content": "const Enum1 = 1", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum3" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum4" + } + ] + }, + "Enum2": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum2", + "File": "pkg/util.go", + "Line": 97, + "StartOffset": 2156, + "EndOffset": 2182, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "untyped int" + }, + "Content": "const Enum2, Enum3 = 2, 3" + }, + "Enum3": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum3", + "File": "pkg/util.go", + "Line": 97, + "StartOffset": 2156, + "EndOffset": 2182, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "untyped int" + }, + "Content": "const Enum2, Enum3 = 2, 3", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum1" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum4" + } + ] + }, + "Enum4": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum4", + "File": "pkg/util.go", + "Line": 98, + "StartOffset": 2184, + "EndOffset": 2209, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "string" + }, + "Content": "const Enum4 string = \"4\"", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum1" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Enum3" + } + ] + }, + "False": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "False", + "File": "pkg/util.go", + "Line": 135, + "StartOffset": 2765, + "EndOffset": 2770, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Type" + }, + "Content": "const False = 1", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Null" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Number" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "String" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "True" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "JSON" + } + ] + }, + "GlobalVar": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "GlobalVar", + "File": "pkg/util.go", + "Line": 51, + "StartOffset": 1285, + "EndOffset": 1298, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "int" + }, + "Content": "var GlobalVar int" + }, + "JSON": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "JSON", + "File": "pkg/util.go", + "Line": 143, + "StartOffset": 2912, + "EndOffset": 2916, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Type" + }, + "Content": "const JSON = 5", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Null" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "False" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Number" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "String" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "True" + } + ] + }, + "Null": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Null", + "File": "pkg/util.go", + "Line": 133, + "StartOffset": 2713, + "EndOffset": 2729, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Type" + }, + "Content": "const Null Type = iota", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "False" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Number" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "String" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "True" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "JSON" + } + ] + }, + "Number": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Number", + "File": "pkg/util.go", + "Line": 137, + "StartOffset": 2798, + "EndOffset": 2804, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Type" + }, + "Content": "const Number = 2", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Null" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "False" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "String" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "True" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "JSON" + } + ] + }, + "String": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "String", + "File": "pkg/util.go", + "Line": 139, + "StartOffset": 2834, + "EndOffset": 2840, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Type" + }, + "Content": "const String = 3", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Null" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "False" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Number" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "True" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "JSON" + } + ] + }, + "True": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "True", + "File": "pkg/util.go", + "Line": 141, + "StartOffset": 2874, + "EndOffset": 2878, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Type" + }, + "Content": "const True = 4", + "Groups": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Null" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "False" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Number" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "String" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "JSON" + } + ] + }, + "Var1": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var1", + "File": "pkg/util.go", + "Line": 102, + "StartOffset": 2220, + "EndOffset": 2241, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "int" + }, + "Content": "var Var1 = 1" + }, + "Var2": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var2", + "File": "pkg/util.go", + "Line": 103, + "StartOffset": 2243, + "EndOffset": 2267, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "int" + }, + "Content": "var Var2, Var3 = 2, 3" + }, + "Var3": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var3", + "File": "pkg/util.go", + "Line": 103, + "StartOffset": 2243, + "EndOffset": 2267, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "int" + }, + "Content": "var Var2, Var3 = 2, 3" + }, + "Var4": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var4", + "File": "pkg/util.go", + "Line": 104, + "StartOffset": 2269, + "EndOffset": 2292, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "string" + }, + "Content": "var Var4 string = \"4\"" + }, + "Var5": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var5", + "File": "pkg/util.go", + "Line": 105, + "StartOffset": 2294, + "EndOffset": 2327, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "[]string" + }, + "Content": "var Var5 = []string{\"a\"}" + }, + "Var6": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var6", + "File": "pkg/util.go", + "Line": 106, + "StartOffset": 2329, + "EndOffset": 2358, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "func()" + }, + "Content": "var Var6 = func() {}", + "Extra": { + "AnonymousFunctions": [ + { + "File": "pkg/util.go", + "Line": 106, + "StartOffset": 2349, + "EndOffset": 2358 + } + ] + } + }, + "Var7": { + "IsExported": true, + "IsConst": false, + "IsPointer": true, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var7", + "File": "pkg/util.go", + "Line": 107, + "StartOffset": 2360, + "EndOffset": 2413, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "*bool" + }, + "Content": "var Var7 = flag.Bool(\"flag\", false, \"usage\")" + }, + "Var8": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "Var8", + "File": "pkg/util.go", + "Line": 108, + "StartOffset": 2415, + "EndOffset": 2449, + "Type": { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config" + }, + "Content": "var Var8 = sonic.Config{}", + "Dependencies": [ + { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config", + "File": "pkg/util.go", + "Line": 108, + "StartOffset": 2441, + "EndOffset": 2447 + } + ] + } + } + }, + "a.b/c/pkg/entity": { + "IsMain": false, + "IsTest": false, + "PkgPath": "a.b/c/pkg/entity", + "Functions": { + "A": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "A", + "File": "pkg/entity/entity.go", + "Line": 55, + "StartOffset": 1132, + "EndOffset": 1173, + "Content": "func A(in string) int {\n\treturn len(in)\n}", + "Signature": "func A(in string) int" + }, + "InterfaceB.String": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": true, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB.String", + "File": "pkg/entity/entity.go", + "Line": 34, + "StartOffset": 796, + "EndOffset": 811, + "Content": "String() string", + "Signature": "String() string" + }, + "MyStruct.String": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct.String", + "File": "pkg/entity/entity.go", + "Line": 37, + "StartOffset": 815, + "EndOffset": 929, + "Content": "func (a MyStruct) String() string {\n\t_ = a.Embed.MyStruct\n\t_ = a.MyStructD\n\treturn \"base struct\" + a.DFunction()\n}", + "Signature": "func (a MyStruct) String() string", + "Receiver": { + "IsPointer": false, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct" + } + }, + "MethodCalls": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD.DFunction", + "File": "pkg/entity/entity.go", + "Line": 40, + "StartOffset": 916, + "EndOffset": 925, + "Extra": { + "IsInvoked": true + } + } + ] + }, + "MyStructC.String": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructC.String", + "File": "pkg/entity/entity.go", + "Line": 47, + "StartOffset": 1006, + "EndOffset": 1067, + "Content": "func (c MyStructC) String() string {\n\treturn \"I'm struct c\"\n}", + "Signature": "func (c MyStructC) String() string", + "Receiver": { + "IsPointer": false, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructC" + } + } + }, + "MyStructD.DFunction": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD.DFunction", + "File": "pkg/entity/entity.go", + "Line": 43, + "StartOffset": 931, + "EndOffset": 1004, + "Content": "func (c MyStructD) DFunction() string {\n\treturn \"I'm struct d function\"\n}", + "Signature": "func (c MyStructD) DFunction() string", + "Receiver": { + "IsPointer": false, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD" + } + } + }, + "MyStructD.String": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD.String", + "File": "pkg/entity/entity.go", + "Line": 51, + "StartOffset": 1069, + "EndOffset": 1130, + "Content": "func (c MyStructD) String() string {\n\treturn \"I'm struct d\"\n}", + "Signature": "func (c MyStructD) String() string", + "Receiver": { + "IsPointer": false, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD" + } + } + } + }, + "Types": { + "Integer": { + "Exported": true, + "TypeKind": "typedef", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "Integer", + "File": "pkg/entity/entity.go", + "Line": 61, + "StartOffset": 1189, + "EndOffset": 1205, + "Content": "type Integer int" + }, + "InterfaceB": { + "Exported": true, + "TypeKind": "interface", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB", + "File": "pkg/entity/entity.go", + "Line": 33, + "StartOffset": 767, + "EndOffset": 813, + "Content": "type InterfaceB interface {\n\tString() string\n}", + "Methods": { + "String": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB.String" + } + } + }, + "MyStruct": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/entity/entity.go", + "Line": 23, + "StartOffset": 666, + "EndOffset": 765, + "Content": "type MyStruct struct {\n\ta string\n\tb string\n\tc MyStructC\n\tMyStructD\n\tEmbed struct {\n\t\t*MyStruct\n\t}\n}", + "SubStruct": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD", + "File": "pkg/entity/entity.go", + "Line": 27, + "StartOffset": 723, + "EndOffset": 732 + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "pkg/entity/entity.go", + "Line": 29, + "StartOffset": 751, + "EndOffset": 760 + } + ], + "InlineStruct": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD", + "File": "pkg/entity/entity.go", + "Line": 27, + "StartOffset": 723, + "EndOffset": 732 + } + ], + "Methods": { + "String": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct.String" + } + }, + "Implements": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA" + } + ] + }, + "MyStructC": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructC", + "File": "pkg/entity/entity.go", + "Line": 17, + "StartOffset": 612, + "EndOffset": 637, + "Content": "type MyStructC struct {\n}", + "Methods": { + "String": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructC.String" + } + }, + "Implements": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB" + } + ] + }, + "MyStructD": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD", + "File": "pkg/entity/entity.go", + "Line": 20, + "StartOffset": 639, + "EndOffset": 664, + "Content": "type MyStructD struct {\n}", + "Methods": { + "DFunction": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD.DFunction" + }, + "String": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStructD.String" + } + }, + "Implements": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "InterfaceB" + }, + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg", + "Name": "InterfaceA" + } + ] + } + }, + "Vars": { + "G1": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "G1", + "File": "pkg/entity/entity.go", + "Line": 59, + "StartOffset": 1181, + "EndOffset": 1187, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "untyped int" + }, + "Content": "const G1 = 1" + }, + "V1": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "V1", + "File": "pkg/entity/entity.go", + "Line": 63, + "StartOffset": 1211, + "EndOffset": 1226, + "Type": { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "Integer" + }, + "Content": "var V1 = Integer(1)", + "Dependencies": [ + { + "ModPath": "a.b/c", + "PkgPath": "a.b/c/pkg/entity", + "Name": "Integer", + "File": "pkg/entity/entity.go", + "Line": 63, + "StartOffset": 1216, + "EndOffset": 1223, + "Extra": { + "IsInvoked": true + } + } + ] + } + } + } + }, + "Dependencies": { + "a.b/c": "a.b/c@7361f67ef606a7ab7dcf1b6d7ebcf1e0188b00f8", + "github.com/bytedance/sonic": "github.com/bytedance/sonic@v1.10.2", + "golang.org/x/arch": "golang.org/x/arch@v0.0.0-20210923205945-b76863e36670" + }, + "Files": { + "cmd/go.mod": { + "Path": "cmd/go.mod" + }, + "cmd/go.sum": { + "Path": "cmd/go.sum" + }, + "cmd/main.go": { + "Path": "cmd/main.go" + }, + "cmd/serdes.go": { + "Path": "cmd/serdes.go" + }, + "go.mod": { + "Path": "go.mod" + }, + "go.sum": { + "Path": "go.sum" + }, + "merge/merge_ref.go": { + "Path": "merge/merge_ref.go", + "Imports": [ + { + "Alias": ".", + "Path": "\"a.b/c/pkg/entity\"" + } + ], + "Package": "a.b/c/merge" + }, + "pkg/entity/entity.go": { + "Path": "pkg/entity/entity.go", + "Package": "a.b/c/pkg/entity" + }, + "pkg/generic.go": { + "Path": "pkg/generic.go", + "Imports": [ + { + "Path": "\"fmt\"" + }, + { + "Path": "\"a.b/c/pkg/entity\"" + } + ], + "Package": "a.b/c/pkg" + }, + "pkg/refer.go": { + "Path": "pkg/refer.go", + "Imports": [ + { + "Path": "\"a.b/c/pkg/entity\"" + }, + { + "Path": "\"github.com/bytedance/sonic\"" + } + ], + "Package": "a.b/c/pkg" + }, + "pkg/util.go": { + "Path": "pkg/util.go", + "Imports": [ + { + "Path": "\"encoding/json\"" + }, + { + "Path": "\"flag\"" + }, + { + "Path": "\"a.b/c/pkg/entity\"" + }, + { + "Path": "\"github.com/bytedance/sonic\"" + } + ], + "Package": "a.b/c/pkg" + } + } + }, + "a.b/c/cmdx": { + "Language": "go", + "Version": "", + "Name": "a.b/c/cmdx", + "Dir": "cmd", + "Packages": { + "a.b/c/cmdx": { + "IsMain": true, + "IsTest": false, + "PkgPath": "a.b/c/cmdx", + "Functions": { + "DuplicateName": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "DuplicateName", + "File": "cmd/serdes.go", + "Line": 36, + "StartOffset": 912, + "EndOffset": 936, + "Content": "func DuplicateName() {\n}", + "Signature": "func DuplicateName()" + }, + "InternalFunc": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "InternalFunc", + "File": "cmd/serdes.go", + "Line": 25, + "StartOffset": 692, + "EndOffset": 910, + "Content": "func InternalFunc(in []byte) {\n\tvar s = new(pkg.CaseStruct)\n\tif err := pkg.Case_Func(in, s); err != nil {\n\t\tprintln(err.Error())\n\t}\n\tvar x = new(entity.MyStruct)\n\tif v := s.CaseMethod(in, x); v != 0 {\n\t\tprintln(v)\n\t}\n}", + "Signature": "func InternalFunc(in []byte)", + "FunctionCalls": [ + { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "Case_Func", + "File": "cmd/serdes.go", + "Line": 27, + "StartOffset": 767, + "EndOffset": 776, + "Extra": { + "IsInvoked": true + } + } + ], + "MethodCalls": [ + { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod", + "File": "cmd/serdes.go", + "Line": 31, + "StartOffset": 865, + "EndOffset": 875, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "cmd/serdes.go", + "Line": 26, + "StartOffset": 740, + "EndOffset": 750 + }, + { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg/entity", + "Name": "MyStruct", + "File": "cmd/serdes.go", + "Line": 30, + "StartOffset": 844, + "EndOffset": 852 + } + ] + }, + "Struct.DuplicateName": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct.DuplicateName", + "File": "cmd/serdes.go", + "Line": 55, + "StartOffset": 1238, + "EndOffset": 1283, + "Content": "func (s *Struct) DuplicateName(in []byte) {\n}", + "Signature": "func (s *Struct) DuplicateName(in []byte)", + "Receiver": { + "IsPointer": true, + "Type": { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct" + } + } + }, + "Struct.InternalMethod": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct.InternalMethod", + "File": "cmd/serdes.go", + "Line": 46, + "StartOffset": 1045, + "EndOffset": 1236, + "Content": "func (s *Struct) InternalMethod(in []byte) {\n\tif err := sonic.Unmarshal(in, \u0026s); err != nil {\n\t\tprintln(err.Error())\n\t}\n\tif err := s.Field2.CaseMethod(in, nil); err != 0 {\n\t\tprintln(err)\n\t}\n}", + "Signature": "func (s *Struct) InternalMethod(in []byte)", + "Receiver": { + "IsPointer": true, + "Type": { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct" + } + }, + "FunctionCalls": [ + { + "ModPath": "github.com/bytedance/sonic@v1.11.3", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Unmarshal", + "File": "cmd/serdes.go", + "Line": 47, + "StartOffset": 1107, + "EndOffset": 1116, + "Extra": { + "IsInvoked": true + } + } + ], + "MethodCalls": [ + { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct.CaseMethod", + "File": "cmd/serdes.go", + "Line": 50, + "StartOffset": 1185, + "EndOffset": 1195, + "Extra": { + "IsInvoked": true + } + } + ] + }, + "main": { + "Exported": false, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "main", + "File": "cmd/main.go", + "Line": 24, + "StartOffset": 667, + "EndOffset": 981, + "Content": "func main() {\n\tif len(os.Args) \u003c 2 {\n\t\tprintln(\"missing argument\")\n\t\tos.Exit(1)\n\t}\n\t// content, err := readFile(os.Args[1])\n\t// if err != nil {\n\t// \tprintln(err.Error())\n\t// \tos.Exit(1)\n\t// }\n\tcontent := []byte(\"{}\")\n\tInternalFunc(content)\n\tvar s = new(Struct)\n\ts.Field4 = InternalFunc\n\ts.InternalMethod(content)\n}", + "Signature": "func main()", + "FunctionCalls": [ + { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "InternalFunc", + "File": "cmd/main.go", + "Line": 35, + "StartOffset": 885, + "EndOffset": 897, + "Extra": { + "IsInvoked": true + } + } + ], + "MethodCalls": [ + { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct.InternalMethod", + "File": "cmd/main.go", + "Line": 38, + "StartOffset": 956, + "EndOffset": 970, + "Extra": { + "IsInvoked": true + } + } + ], + "Types": [ + { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct", + "File": "cmd/main.go", + "Line": 36, + "StartOffset": 920, + "EndOffset": 926 + } + ] + }, + "readFile": { + "Exported": false, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "readFile", + "File": "cmd/main.go", + "Line": 41, + "StartOffset": 983, + "EndOffset": 1181, + "Content": "func readFile(path string) ([]byte, error) {\n\tfile, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open file\")\n\t}\n\tdefer file.Close()\n\n\treturn ioutil.ReadAll(file)\n}", + "Signature": "func readFile(path string) ([]byte, error)", + "FunctionCalls": [ + { + "ModPath": "github.com/pkg/errors@v0.9.1", + "PkgPath": "github.com/pkg/errors", + "Name": "Wrap", + "File": "cmd/main.go", + "Line": 44, + "StartOffset": 1094, + "EndOffset": 1098, + "Extra": { + "IsInvoked": true + } + } + ] + } + }, + "Types": { + "Struct": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct", + "File": "cmd/serdes.go", + "Line": 39, + "StartOffset": 938, + "EndOffset": 1043, + "Content": "type Struct struct {\n\tField1 string\n\tField2 pkg.CaseStruct\n\tField3 sonic.Config\n\tField4 func(in []byte)\n}", + "SubStruct": [ + { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct", + "File": "cmd/serdes.go", + "Line": 41, + "StartOffset": 982, + "EndOffset": 996 + }, + { + "ModPath": "github.com/bytedance/sonic@v1.11.3", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config", + "File": "cmd/serdes.go", + "Line": 42, + "StartOffset": 1005, + "EndOffset": 1017 + } + ], + "Methods": { + "DuplicateName": { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct.DuplicateName" + }, + "InternalMethod": { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct.InternalMethod" + } + } + } + }, + "Vars": { + "Con1": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Con1", + "File": "cmd/serdes.go", + "Line": 72, + "StartOffset": 1464, + "EndOffset": 1482, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "untyped int" + }, + "Content": "const Con1, Con2 = 1, \"\"" + }, + "Con2": { + "IsExported": true, + "IsConst": true, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Con2", + "File": "cmd/serdes.go", + "Line": 72, + "StartOffset": 1464, + "EndOffset": 1482, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "untyped string" + }, + "Content": "const Con1, Con2 = 1, \"\"" + }, + "Var1": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Var1", + "File": "cmd/serdes.go", + "Line": 70, + "StartOffset": 1438, + "EndOffset": 1456, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "int" + }, + "Content": "var Var1, Var2 = 1, \"\"" + }, + "Var2": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Var2", + "File": "cmd/serdes.go", + "Line": 70, + "StartOffset": 1438, + "EndOffset": 1456, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "string" + }, + "Content": "var Var1, Var2 = 1, \"\"" + }, + "VarFunc": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "VarFunc", + "File": "cmd/serdes.go", + "Line": 64, + "StartOffset": 1359, + "EndOffset": 1376, + "Type": { + "ModPath": "", + "PkgPath": "io", + "Name": "Reader" + }, + "Content": "var VarFunc io.Reader" + }, + "VarInt": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "VarInt", + "File": "cmd/serdes.go", + "Line": 60, + "StartOffset": 1312, + "EndOffset": 1322, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "int" + }, + "Content": "var VarInt = 1" + }, + "VarSlice": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "VarSlice", + "File": "cmd/serdes.go", + "Line": 62, + "StartOffset": 1328, + "EndOffset": 1353, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "[]int" + }, + "Content": "var VarSlice = []int{1, 2, 3}" + }, + "VarString": { + "IsExported": true, + "IsConst": false, + "IsPointer": true, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "VarString", + "File": "cmd/serdes.go", + "Line": 58, + "StartOffset": 1289, + "EndOffset": 1306, + "Type": { + "ModPath": "", + "PkgPath": "", + "Name": "*string" + }, + "Content": "var VarString *string" + }, + "VarStruct": { + "IsExported": true, + "IsConst": false, + "IsPointer": true, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "VarStruct", + "File": "cmd/serdes.go", + "Line": 68, + "StartOffset": 1415, + "EndOffset": 1432, + "Type": { + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "Struct" + }, + "Content": "var VarStruct *Struct" + }, + "VarpkgStruct": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "a.b/c/cmdx", + "PkgPath": "a.b/c/cmdx", + "Name": "VarpkgStruct", + "File": "cmd/serdes.go", + "Line": 66, + "StartOffset": 1382, + "EndOffset": 1409, + "Type": { + "ModPath": "../.@", + "PkgPath": "a.b/c/pkg", + "Name": "CaseStruct" + }, + "Content": "var VarpkgStruct pkg.CaseStruct" + } + } + } + }, + "Dependencies": { + "a.b/c": "../.@", + "a.b/c/cmdx": "a.b/c/cmdx@7361f67ef606a7ab7dcf1b6d7ebcf1e0188b00f8", + "github.com/bytedance/sonic": "github.com/bytedance/sonic@v1.11.3", + "github.com/pkg/errors": "github.com/pkg/errors@v0.9.1", + "golang.org/x/arch": "golang.org/x/arch@v0.0.0-20210923205945-b76863e36670" + }, + "Files": { + "cmd/go.mod": { + "Path": "cmd/go.mod" + }, + "cmd/go.sum": { + "Path": "cmd/go.sum" + }, + "cmd/main.go": { + "Path": "cmd/main.go", + "Imports": [ + { + "Path": "\"io/ioutil\"" + }, + { + "Path": "\"os\"" + }, + { + "Path": "\"github.com/pkg/errors\"" + } + ], + "Package": "a.b/c/cmdx" + }, + "cmd/serdes.go": { + "Path": "cmd/serdes.go", + "Imports": [ + { + "Path": "\"io\"" + }, + { + "Path": "\"a.b/c/pkg\"" + }, + { + "Path": "\"a.b/c/pkg/entity\"" + }, + { + "Path": "\"github.com/bytedance/sonic\"" + } + ], + "Package": "a.b/c/cmdx" + } + } + }, + "github.com/bytedance/sonic@v1.10.2": { + "Language": "go", + "Version": "v1.10.2", + "Name": "github.com/bytedance/sonic", + "Dir": "", + "Packages": { + "github.com/bytedance/sonic": { + "IsMain": false, + "IsTest": false, + "PkgPath": "github.com/bytedance/sonic", + "Functions": { + "Config.Froze": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config.Froze", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", + "Line": 35, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func (cfg Config) Froze() API {\n api := \u0026frozenConfig{Config: cfg}\n return api\n}", + "Receiver": { + "IsPointer": false, + "Type": { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config" + } + } + }, + "Get": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Get", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/api.go", + "Line": 183, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func Get(src []byte, path ...interface{}) (ast.Node, error) {\n return GetFromString(string(src), path...)\n}" + }, + "Pretouch": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Pretouch", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", + "Line": 128, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func Pretouch(vt reflect.Type, opts ...option.CompileOption) error {\n return nil\n}" + }, + "Unmarshal": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Unmarshal", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", + "Line": 92, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func (cfg frozenConfig) Unmarshal(buf []byte, val interface{}) error {\n return cfg.UnmarshalFromString(string(buf), val)\n}" + } + }, + "Types": { + "Config": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/api.go", + "Line": 26, + "StartOffset": 0, + "EndOffset": 0, + "Content": "type Config struct {\n // EscapeHTML indicates encoder to escape all HTML characters \n // after serializing into JSON (see https://pkg.go.dev/encoding/json#HTMLEscape).\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n EscapeHTML bool\n\n // SortMapKeys indicates encoder that the keys of a map needs to be sorted \n // before serializing into JSON.\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n SortMapKeys bool\n\n // CompactMarshaler indicates encoder that the output JSON from json.Marshaler \n // is always compact and needs no validation \n CompactMarshaler bool\n\n // NoQuoteTextMarshaler indicates encoder that the output text from encoding.TextMarshaler \n // is always escaped string and needs no quoting\n NoQuoteTextMarshaler bool\n\n // NoNullSliceOrMap indicates encoder that all empty Array or Object are encoded as '[]' or '{}',\n // instead of 'null'\n NoNullSliceOrMap bool\n\n // UseInt64 indicates decoder to unmarshal an integer into an interface{} as an\n // int64 instead of as a float64.\n UseInt64 bool\n\n // UseNumber indicates decoder to unmarshal a number into an interface{} as a\n // json.Number instead of as a float64.\n UseNumber bool\n\n // UseUnicodeErrors indicates decoder to return an error when encounter invalid\n // UTF-8 escape sequences.\n UseUnicodeErrors bool\n\n // DisallowUnknownFields indicates decoder to return an error when the destination\n // is a struct and the input contains object keys which do not match any\n // non-ignored, exported fields in the destination.\n DisallowUnknownFields bool\n\n // CopyString indicates decoder to decode string values by copying instead of referring.\n CopyString bool\n\n // ValidateString indicates decoder and encoder to valid string values: decoder will return errors \n // when unescaped control chars(\\u0000-\\u001f) in the string value of JSON.\n ValidateString bool\n\n // NoValidateJSONMarshaler indicates that the encoder should not validate the output string\n // after encoding the JSONMarshaler to JSON.\n NoValidateJSONMarshaler bool\n}", + "Methods": { + "Froze": { + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config.Froze" + } + } + }, + "frozenConfig": { + "Exported": false, + "TypeKind": "", + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "frozenConfig", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", + "Line": 39, + "StartOffset": 0, + "EndOffset": 0, + "Content": "type frozenConfig struct{}" + } + }, + "Vars": { + "ConfigStd": { + "IsExported": true, + "IsConst": false, + "IsPointer": false, + "ModPath": "github.com/bytedance/sonic@v1.10.2", + "PkgPath": "github.com/bytedance/sonic", + "Name": "ConfigStd", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/api.go", + "Line": 83, + "StartOffset": 0, + "EndOffset": 0, + "Content": "ConfigStd = Config{\n EscapeHTML : true,\n SortMapKeys: true,\n CompactMarshaler: true,\n CopyString : true,\n ValidateString : true,\n }.Froze()" + } + } + } + } + }, + "github.com/bytedance/sonic@v1.11.3": { + "Language": "go", + "Version": "v1.11.3", + "Name": "github.com/bytedance/sonic", + "Dir": "", + "Packages": { + "github.com/bytedance/sonic": { + "IsMain": false, + "IsTest": false, + "PkgPath": "github.com/bytedance/sonic", + "Functions": { + "Unmarshal": { + "Exported": true, + "IsMethod": true, + "IsInterfaceMethod": false, + "ModPath": "github.com/bytedance/sonic@v1.11.3", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Unmarshal", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.11.3/compat.go", + "Line": 92, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func (cfg frozenConfig) Unmarshal(buf []byte, val interface{}) error {\n return cfg.UnmarshalFromString(string(buf), val)\n}" + } + }, + "Types": { + "Config": { + "Exported": true, + "TypeKind": "struct", + "ModPath": "github.com/bytedance/sonic@v1.11.3", + "PkgPath": "github.com/bytedance/sonic", + "Name": "Config", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.11.3/api.go", + "Line": 27, + "StartOffset": 0, + "EndOffset": 0, + "Content": "type Config struct {\n // EscapeHTML indicates encoder to escape all HTML characters \n // after serializing into JSON (see https://pkg.go.dev/encoding/json#HTMLEscape).\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n EscapeHTML bool\n\n // SortMapKeys indicates encoder that the keys of a map needs to be sorted \n // before serializing into JSON.\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n SortMapKeys bool\n\n // CompactMarshaler indicates encoder that the output JSON from json.Marshaler \n // is always compact and needs no validation \n CompactMarshaler bool\n\n // NoQuoteTextMarshaler indicates encoder that the output text from encoding.TextMarshaler \n // is always escaped string and needs no quoting\n NoQuoteTextMarshaler bool\n\n // NoNullSliceOrMap indicates encoder that all empty Array or Object are encoded as '[]' or '{}',\n // instead of 'null'\n NoNullSliceOrMap bool\n\n // UseInt64 indicates decoder to unmarshal an integer into an interface{} as an\n // int64 instead of as a float64.\n UseInt64 bool\n\n // UseNumber indicates decoder to unmarshal a number into an interface{} as a\n // json.Number instead of as a float64.\n UseNumber bool\n\n // UseUnicodeErrors indicates decoder to return an error when encounter invalid\n // UTF-8 escape sequences.\n UseUnicodeErrors bool\n\n // DisallowUnknownFields indicates decoder to return an error when the destination\n // is a struct and the input contains object keys which do not match any\n // non-ignored, exported fields in the destination.\n DisallowUnknownFields bool\n\n // CopyString indicates decoder to decode string values by copying instead of referring.\n CopyString bool\n\n // ValidateString indicates decoder and encoder to valid string values: decoder will return errors \n // when unescaped control chars(\\u0000-\\u001f) in the string value of JSON.\n ValidateString bool\n\n // NoValidateJSONMarshaler indicates that the encoder should not validate the output string\n // after encoding the JSONMarshaler to JSON.\n NoValidateJSONMarshaler bool\n \n // NoEncoderNewline indicates that the encoder should not add a newline after every message\n NoEncoderNewline bool\n}" + } + }, + "Vars": {} + } + } + }, + "github.com/pkg/errors@v0.9.1": { + "Language": "go", + "Version": "v0.9.1", + "Name": "github.com/pkg/errors", + "Dir": "", + "Packages": { + "github.com/pkg/errors": { + "IsMain": false, + "IsTest": false, + "PkgPath": "github.com/pkg/errors", + "Functions": { + "Wrap": { + "Exported": true, + "IsMethod": false, + "IsInterfaceMethod": false, + "ModPath": "github.com/pkg/errors@v0.9.1", + "PkgPath": "github.com/pkg/errors", + "Name": "Wrap", + "File": "../../../../../../go/1.24.3/pkg/mod/github.com/pkg/errors@v0.9.1/errors.go", + "Line": 184, + "StartOffset": 0, + "EndOffset": 0, + "Content": "func Wrap(err error, message string) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\terr = \u0026withMessage{\n\t\tcause: err,\n\t\tmsg: message,\n\t}\n\treturn \u0026withStack{\n\t\terr,\n\t\tcallers(),\n\t}\n}" + } + }, + "Types": {}, + "Vars": {} + } + } + } + }, + "Graph": {} +} \ No newline at end of file diff --git a/lang/golang/parser/parser.go b/lang/golang/parser/parser.go index 7b7dc2e4..12e53095 100644 --- a/lang/golang/parser/parser.go +++ b/lang/golang/parser/parser.go @@ -234,7 +234,7 @@ func getDeps(dir string, workDirs map[string]bool) (a map[string]string, cgoPkgs cmd.Env = append(os.Environ(), "GOSUMDB=off") output, err = cmd.CombinedOutput() if err != nil { - return nil, cgoPkgs, fmt.Errorf("failed to execute 'go list -json all', err: %v, output: %s, cmd string: %s, dir: %s", err, string(output), cmd.String(), dir) + return nil, cgoPkgs, fmt.Errorf("failed to execute 'go list -m -json all', err: %v, output: %s, cmd string: %s, dir: %s", err, string(output), cmd.String(), dir) } // ignore content until first open index := strings.Index(string(output), "{") From 8e8672be4875bbf9d9e3398e23d314dcd9acf94b Mon Sep 17 00:00:00 2001 From: simuleite Date: Tue, 3 Mar 2026 21:31:34 +0800 Subject: [PATCH 07/23] Sonic Cli Read JSON --- .../skills/abcoder__list_repos/SKILL.md | 12 +- internal/cmd/cli/cli.go | 13 + internal/cmd/cli/extract_symbol.go | 223 ++++++++ internal/cmd/cli/get_file_structure.go | 57 +- internal/cmd/cli/get_file_symbol.go | 82 ++- internal/cmd/cli/list_repos.go | 21 +- internal/cmd/cli/search_symbol.go | 254 +++++++++ internal/cmd/cli/tree_repo.go | 70 ++- internal/cmd/cli/utils.go | 509 ++++++++++++++++++ 9 files changed, 1195 insertions(+), 46 deletions(-) create mode 100644 internal/cmd/cli/extract_symbol.go create mode 100644 internal/cmd/cli/search_symbol.go diff --git a/internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md b/internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md index c01809fd..4608f7d3 100644 --- a/internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md +++ b/internal/cmd/assets/.claude/skills/abcoder__list_repos/SKILL.md @@ -1,6 +1,6 @@ --- name: skill__abcoder__list_repos -description: skill__abcoder__list_repos `abcoder cli list_repos` [DISCOVERY] Step 1/4: List available repositories. Always the first step in ABCoder workflow. You MUST call `tree_repo` later. +description: skill__abcoder__list_repos `abcoder cli list_repos` [DISCOVERY] Step 1/4: List available repositories. Always the first step in ABCoder workflow. You MUST call `tree_repo` later. 获取当前仓库名: `abcoder cli list_repos | jq .current_repo` --- Execute the list_repos command to discover all available repositories: @@ -9,6 +9,11 @@ Execute the list_repos command to discover all available repositories: abcoder cli list_repos ``` +获取当前仓库名(根据 pwd 匹配): +```bash +abcoder cli list_repos | jq .current_repo +``` + ## Workflow Context This tool is **Level 1** in the 4-level ABCoder discovery hierarchy: @@ -22,8 +27,7 @@ This tool is **Level 1** in the 4-level ABCoder discovery hierarchy: Output ``` { - "repo_names": { - "array[i]": "string" - } + "repo_names": ["string"], + "current_repo": "string" } ``` diff --git a/internal/cmd/cli/cli.go b/internal/cmd/cli/cli.go index 0d29569d..15b0287e 100644 --- a/internal/cmd/cli/cli.go +++ b/internal/cmd/cli/cli.go @@ -18,6 +18,8 @@ import ( "github.com/spf13/cobra" ) +var verbose bool + // NewCliCmd returns the parent command for CLI operations. func NewCliCmd() *cobra.Command { cmd := &cobra.Command{ @@ -27,13 +29,24 @@ func NewCliCmd() *cobra.Command { These commands provide direct access to repository, file, and symbol information.`, Example: `abcoder cli list-repos`, + PersistentPreRun: func(cmd *cobra.Command, args []string) { + // 解析 -v flag + v, err := cmd.Flags().GetBool("verbose") + if err == nil { + verbose = v + } + }, } + cmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output for debugging") + // Add subcommands cmd.AddCommand(newListReposCmd()) cmd.AddCommand(newTreeRepoCmd()) cmd.AddCommand(newGetFileStructureCmd()) cmd.AddCommand(newGetFileSymbolCmd()) + cmd.AddCommand(newExtractSymbolCmd()) + cmd.AddCommand(newSearchSymbolCmd()) return cmd } diff --git a/internal/cmd/cli/extract_symbol.go b/internal/cmd/cli/extract_symbol.go new file mode 100644 index 00000000..f69b8a56 --- /dev/null +++ b/internal/cmd/cli/extract_symbol.go @@ -0,0 +1,223 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + + "github.com/bytedance/sonic" + "github.com/cloudwego/abcoder/lang/utils" + "github.com/spf13/cobra" +) + +const indexDir = ".index" + +type SymbolIndex struct { + Mtime int64 `json:"mtime"` + Data map[string][]NameMatch `json:"data"` // name -> []NameMatch +} + +type NameMatch struct { + File string `json:"file"` + Type string `json:"type"` +} + +// saveSymbolIndex 保存符号索引到 ~/.asts/.index/{repo}.idx +func saveSymbolIndex(astsDir, repoName, repoFile string, data map[string][]NameMatch) error { + // 获取 repo 文件的 mtime + info, err := os.Stat(repoFile) + if err != nil { + return fmt.Errorf("stat repo file: %w", err) + } + mtime := info.ModTime().UnixMilli() + + // 检查现有索引 + idxPath := filepath.Join(astsDir, indexDir, repoName+".idx") + if _, err := os.Stat(idxPath); err == nil { + // 读取现有索引的 mtime + if oldData, err := os.ReadFile(idxPath); err == nil { + var oldIdx SymbolIndex + if json.Unmarshal(oldData, &oldIdx) == nil && oldIdx.Mtime == mtime { + return nil // mtime 一致,无需更新 + } + } + } + + // 创建索引 + idx := SymbolIndex{ + Mtime: mtime, + Data: data, + } + + // 写入 .tmp 再 rename + idxPathTmp := idxPath + ".tmp" + b, err := json.Marshal(idx) + if err != nil { + return fmt.Errorf("marshal index: %w", err) + } + if err := utils.MustWriteFile(idxPathTmp, b); err != nil { + return fmt.Errorf("write index: %w", err) + } + if err := os.Rename(idxPathTmp, idxPath); err != nil { + return fmt.Errorf("rename index: %w", err) + } + return nil +} + +type Symbol struct { + Name string `json:"name"` + File string `json:"file"` + Type string `json:"type"` // FUNC, TYPE, VAR +} + +type ExtractResult struct { + RepoName string `json:"repo_name"` + Files map[string]map[string][]string `json:"files"` // file -> type -> names +} + +func newExtractSymbolCmd() *cobra.Command { + return &cobra.Command{ + Use: "extract_symbol ", + Short: "Extract all symbols from repo JSON", + Long: `Extract all symbol names and file paths from a repository's uniast JSON. +Only extracts filepath + name (no content), for use with search_node.`, + Example: `abcoder cli extract_symbol myrepo`, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + astsDir, err := getASTsDir(cmd) + if err != nil { + return err + } + + repoName := args[0] + + repoFile := findRepoFile(astsDir, repoName) + if repoFile == "" { + return fmt.Errorf("repo not found: %s", repoName) + } + + data, err := os.ReadFile(repoFile) + if err != nil { + return fmt.Errorf("failed to read repo file: %w", err) + } + + // 获取所有 mod keys(只遍历 keys) + modKeys, err := getModuleKeys(data) + if err != nil { + return err + } + + var files = make(map[string]map[string][]string) + var indexData = make(map[string][]NameMatch) + + // 遍历所有模块 + for _, modPath := range modKeys { + // 跳过外部模块 + isExtVal, _ := sonic.Get(data, "Modules", modPath, "IsExternal") + if isExt, _ := isExtVal.Bool(); isExt { + continue + } + + // 获取所有 package keys(只遍历 keys) + pkgKeys, err := getPackageKeys(data, modPath) + if err != nil { + continue + } + + // 遍历所有包 + for _, pkgPath := range pkgKeys { + // 提取 Functions: 只读取 Name + File(极致按需) + if results, err := iterSymbolNameFile(data, modPath, pkgPath, "Functions"); err == nil { + for _, r := range results { + name, file := r[0], r[1] + if files[file] == nil { + files[file] = map[string][]string{ + "FUNC": {}, + "TYPE": {}, + "VAR": {}, + } + } + files[file]["FUNC"] = append(files[file]["FUNC"], name) + indexData[name] = append(indexData[name], NameMatch{File: file, Type: "FUNC"}) + } + } + + // 提取 Types + if results, err := iterSymbolNameFile(data, modPath, pkgPath, "Types"); err == nil { + for _, r := range results { + name, file := r[0], r[1] + if files[file] == nil { + files[file] = map[string][]string{ + "FUNC": {}, + "TYPE": {}, + "VAR": {}, + } + } + files[file]["TYPE"] = append(files[file]["TYPE"], name) + indexData[name] = append(indexData[name], NameMatch{File: file, Type: "TYPE"}) + } + } + + // 提取 Vars + if results, err := iterSymbolNameFile(data, modPath, pkgPath, "Vars"); err == nil { + for _, r := range results { + name, file := r[0], r[1] + if files[file] == nil { + files[file] = map[string][]string{ + "FUNC": {}, + "TYPE": {}, + "VAR": {}, + } + } + files[file]["VAR"] = append(files[file]["VAR"], name) + indexData[name] = append(indexData[name], NameMatch{File: file, Type: "VAR"}) + } + } + } + } + + // 保存索引文件 + if err := saveSymbolIndex(astsDir, repoName, repoFile, indexData); err != nil { + fmt.Fprintf(os.Stderr, "Warning: failed to save index: %v\n", err) + } + + // 过滤掉空的 TYPE 和 VAR + for file, types := range files { + if len(types["TYPE"]) == 0 { + delete(types, "TYPE") + } + if len(types["VAR"]) == 0 { + delete(types, "VAR") + } + // 如果 FUNC 也空,删除整个文件 + if len(types["FUNC"]) == 0 { + delete(files, file) + } + } + + result := ExtractResult{ + RepoName: repoName, + Files: files, + } + + b, _ := json.MarshalIndent(result, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil + }, + } +} diff --git a/internal/cmd/cli/get_file_structure.go b/internal/cmd/cli/get_file_structure.go index 0bec8e72..a01ba5f1 100644 --- a/internal/cmd/cli/get_file_structure.go +++ b/internal/cmd/cli/get_file_structure.go @@ -15,12 +15,10 @@ package cli import ( - "context" "encoding/json" "fmt" "os" - "github.com/cloudwego/abcoder/llm/tool" "github.com/spf13/cobra" ) @@ -41,16 +39,53 @@ Returns a list of functions, types, and variables defined in the file.`, repoName := args[0] filePath := args[1] - tools := tool.NewASTReadTools(tool.ASTReadToolsOptions{ - RepoASTsDir: astsDir, - DisableWatch: true, - }) - resp, err := tools.GetFileStructure(context.Background(), tool.GetFileStructReq{ - RepoName: repoName, - FilePath: filePath, - }) + + repoFile := findRepoFile(astsDir, repoName) + if repoFile == "" { + return fmt.Errorf("repo not found: %s", repoName) + } + + // 加载 data(用于后续按需读取) + data, err := loadRepoFileData(repoFile) + if err != nil { + return err + } + + // 1. 定位 pkgPath(极致按需:只读取 File 字段验证) + modPath, pkgPath, err := findPkgPathByFile(data, filePath) if err != nil { - return fmt.Errorf("failed to get file structure: %w", err) + return fmt.Errorf("file '%s' not found in repo", filePath) + } + + // 2. 读取该文件所有 symbols + syms, err := getFileSymbolsByFile(data, modPath, pkgPath, filePath) + if err != nil || len(syms) == 0 { + return fmt.Errorf("no symbols found in file '%s'", filePath) + } + + type Node struct { + Name string `json:"name"` + Line int `json:"line"` + Signature string `json:"signature,omitempty"` + } + + var nodes []Node + for _, sym := range syms { + n := Node{ + Name: sym["Name"].(string), + Line: int(sym["Line"].(float64)), + } + if sig, ok := sym["Signature"].(string); ok { + n.Signature = sig + } + nodes = append(nodes, n) + } + + resp := map[string]interface{}{ + "file_path": filePath, + "mod_path": modPath, + "pkg_path": pkgPath, + "nodes": nodes, } b, _ := json.MarshalIndent(resp, "", " ") diff --git a/internal/cmd/cli/get_file_symbol.go b/internal/cmd/cli/get_file_symbol.go index 3342916f..d602815e 100644 --- a/internal/cmd/cli/get_file_symbol.go +++ b/internal/cmd/cli/get_file_symbol.go @@ -15,12 +15,10 @@ package cli import ( - "context" "encoding/json" "fmt" "os" - "github.com/cloudwego/abcoder/llm/tool" "github.com/spf13/cobra" ) @@ -41,18 +39,76 @@ Returns the symbol's code, type, line number, and relationship with other symbol repoName := args[0] filePath := args[1] - name := args[2] - tools := tool.NewASTReadTools(tool.ASTReadToolsOptions{ - RepoASTsDir: astsDir, - DisableWatch: true, - }) - resp, err := tools.GetFileSymbol(context.Background(), tool.GetFileSymbolReq{ - RepoName: repoName, - FilePath: filePath, - Name: name, - }) + symbolName := args[2] + + repoFile := findRepoFile(astsDir, repoName) + if repoFile == "" { + return fmt.Errorf("repo not found: %s", repoName) + } + + // 加载 data(用于后续按需读取) + data, err := loadRepoFileData(repoFile) + if err != nil { + return err + } + + // 1. 定位 pkgPath(极致按需:只读取 File 字段验证) + modPath, pkgPath, err := findPkgPathByFile(data, filePath) if err != nil { - return fmt.Errorf("failed to get file symbol: %w", err) + return fmt.Errorf("symbol '%s' not found in file '%s'", symbolName, filePath) + } + + // 2. 读取 symbol 完整内容 + sym, err := getSymbolByFileFull(data, modPath, pkgPath, filePath, symbolName) + if err != nil { + return fmt.Errorf("symbol '%s' not found in file '%s'", symbolName, filePath) + } + + // 找到 symbol,构建返回结构 + nodeType := "FUNC" + if t, ok := sym["node_type"].(string); ok { + nodeType = t + } + + signature := "" + if s, ok := sym["Signature"].(string); ok { + signature = s + } + content := "" + if c, ok := sym["Content"].(string); ok { + content = c + } + + // 3. 按需读取 Graph References + refs, err := getSymbolReferences(data, modPath, pkgPath, symbolName) + if err != nil { + fmt.Fprintf(os.Stderr, "DEBUG: getSymbolReferences error: %v\n", err) + return err + } + + // 按 Kind 分类 + var deps, refsOnly []map[string]string + for _, r := range refs { + if r["kind"] == "Dependency" { + deps = append(deps, r) + } else { + refsOnly = append(refsOnly, r) + } + } + + node := map[string]interface{}{ + "name": symbolName, + "type": nodeType, + "file": filePath, + "line": int(sym["Line"].(float64)), + "codes": content, + "signature": signature, + "dependencies": deps, + "references": refsOnly, + } + + resp := map[string]interface{}{ + "node": node, } b, _ := json.MarshalIndent(resp, "", " ") diff --git a/internal/cmd/cli/list_repos.go b/internal/cmd/cli/list_repos.go index 021cf0dc..89dbbeef 100644 --- a/internal/cmd/cli/list_repos.go +++ b/internal/cmd/cli/list_repos.go @@ -52,16 +52,17 @@ The repositories are loaded from .repo_index.json or *.json files in the --asts- var currentRepo string if data, err := os.ReadFile(indexFile); err == nil { - // 解析 repo_index.json - var index struct { - Mappings map[string]string `json:"mappings"` - } - if err := json.Unmarshal(data, &index); err == nil && index.Mappings != nil { - for name, path := range index.Mappings { - repoNames = append(repoNames, name) - // 检查当前目录是否匹配 - if path == cwd { - currentRepo = name + // 用 sonic 解析 mappings + mappingsVal, err := sonic.Get(data, "mappings") + if err == nil { + mappings, err := mappingsVal.Map() + if err == nil { + for name, v := range mappings { + repoNames = append(repoNames, name) + // 检查当前目录是否匹配 (mappings value 是文件名,需要检查对应的 json 文件) + if pathMatchesCwd(astsDir, v.(string), cwd) { + currentRepo = name + } } } } diff --git a/internal/cmd/cli/search_symbol.go b/internal/cmd/cli/search_symbol.go new file mode 100644 index 00000000..a9018adf --- /dev/null +++ b/internal/cmd/cli/search_symbol.go @@ -0,0 +1,254 @@ +// Copyright 2025 CloudWeGo Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cli + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "regexp" + "strings" + + "github.com/bytedance/sonic" + "github.com/spf13/cobra" +) + +// SearchResult 搜索结果 +type SearchResult struct { + RepoName string `json:"repo_name"` + Query string `json:"query"` + Results map[string]map[string][]string `json:"results"` // file -> type -> names +} + +// loadSymbolIndex 加载符号索引 +func loadSymbolIndex(astsDir, repoName, repoFile string) (*SymbolIndex, error) { + idxPath := filepath.Join(astsDir, indexDir, repoName+".idx") + + // 检查索引文件是否存在 + if _, err := os.Stat(idxPath); err != nil { + // 索引不存在,返回 nil,让调用者知道需要生成 + return nil, nil + } + + // 读取索引 + data, err := os.ReadFile(idxPath) + if err != nil { + return nil, err + } + + var idx SymbolIndex + if err := json.Unmarshal(data, &idx); err != nil { + return nil, err + } + + // 检查 mtime 是否一致 + repoInfo, err := os.Stat(repoFile) + if err != nil { + return nil, err + } + if idx.Mtime != repoInfo.ModTime().UnixMilli() { + // mtime 不一致,返回 nil,让调用者知道需要重新生成 + return nil, nil + } + + return &idx, nil +} + +// hasRegexMetaChars 检查是否包含正则元字符 +func hasRegexMetaChars(s string) bool { + return strings.ContainsAny(s, ".+?{}[]|\\^$") +} + +// matchName 检查 name 是否匹配 query +// 支持: ripgrep 正则语法 +// - 普通字符串: 包含匹配 (*query*) +// - 含 * : 通配符匹配 (转为 .*) +// - 含其他正则元字符: 正则包含匹配 (.*query.*) +func matchName(name, query string) bool { + // 如果包含 * (通配符) + if strings.Contains(query, "*") { + // 转为 .* 并做包含匹配 + pattern := strings.ReplaceAll(query, "*", ".*") + pattern = ".*" + pattern + ".*" + matched, _ := regexp.MatchString(pattern, name) + return matched + } + + // 如果包含正则元字符,使用正则包含匹配 + if hasRegexMetaChars(query) { + pattern := ".*" + query + ".*" + matched, err := regexp.MatchString(pattern, name) + if err != nil { + // 回退到子串包含匹配 + return strings.Contains(name, query) + } + return matched + } + + // 普通字符串:包含匹配 (*query*) + pattern := ".*" + query + ".*" + matched, _ := regexp.MatchString(pattern, name) + return matched +} + +func newSearchSymbolCmd() *cobra.Command { + return &cobra.Command{ + Use: "search_symbol ", + Short: "Search symbols by name", + Long: `Search symbols in a repository by name pattern. +Supports substring match, prefix match (query*), suffix match (*query), and wildcard (*query*).`, + Example: `abcoder cli search_symbol myrepo GetUser +abcoder cli search_symbol myrepo "*User" +abcoder cli search_symbol myrepo "Get*"`, + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + astsDir, err := getASTsDir(cmd) + if err != nil { + return err + } + + repoName := args[0] + query := args[1] + + repoFile := findRepoFile(astsDir, repoName) + if repoFile == "" { + return fmt.Errorf("repo not found: %s", repoName) + } + + // 尝试加载索引 + idx, err := loadSymbolIndex(astsDir, repoName, repoFile) + if err != nil { + return fmt.Errorf("failed to load index: %w", err) + } + + // 如果索引不存在或过期,需要从 JSON 构建 + if idx == nil { + fmt.Fprintf(os.Stderr, "Index not found or outdated, rebuilding...\n") + data, err := os.ReadFile(repoFile) + if err != nil { + return fmt.Errorf("failed to read repo file: %w", err) + } + + modsVal, err := sonic.Get(data, "Modules") + if err != nil { + return fmt.Errorf("failed to get modules: %w", err) + } + + mods, err := modsVal.Map() + if err != nil { + return fmt.Errorf("failed to parse modules: %w", err) + } + + indexData := make(map[string][]NameMatch) + + for _, modVal := range mods { + mod, ok := modVal.(map[string]interface{}) + if !ok { + continue + } + + pkgs, ok := mod["Packages"].(map[string]interface{}) + if !ok { + continue + } + + for _, pkgVal := range pkgs { + pkg, ok := pkgVal.(map[string]interface{}) + if !ok { + continue + } + + // Functions + if fns, ok := pkg["Functions"].(map[string]interface{}); ok { + for _, fnVal := range fns { + fn, ok := fnVal.(map[string]interface{}) + if !ok { + continue + } + name := fn["Name"].(string) + file := fn["File"].(string) + indexData[name] = append(indexData[name], NameMatch{File: file, Type: "FUNC"}) + } + } + + // Types + if types, ok := pkg["Types"].(map[string]interface{}); ok { + for _, typeVal := range types { + t, ok := typeVal.(map[string]interface{}) + if !ok { + continue + } + name := t["Name"].(string) + file := t["File"].(string) + indexData[name] = append(indexData[name], NameMatch{File: file, Type: "TYPE"}) + } + } + + // Vars + if vars, ok := pkg["Vars"].(map[string]interface{}); ok { + for _, varVal := range vars { + v, ok := varVal.(map[string]interface{}) + if !ok { + continue + } + name := v["Name"].(string) + file := v["File"].(string) + indexData[name] = append(indexData[name], NameMatch{File: file, Type: "VAR"}) + } + } + } + } + + // 保存索引 + if err := saveSymbolIndex(astsDir, repoName, repoFile, indexData); err != nil { + fmt.Fprintf(os.Stderr, "Warning: failed to save index: %v\n", err) + } + + idx = &SymbolIndex{ + Mtime: 0, // 临时使用 + Data: indexData, + } + } + + // 搜索 + results := make(map[string]map[string][]string) + for name, matches := range idx.Data { + if matchName(name, query) { + for _, m := range matches { + if results[m.File] == nil { + results[m.File] = map[string][]string{ + "FUNC": {}, + "TYPE": {}, + "VAR": {}, + } + } + results[m.File][m.Type] = append(results[m.File][m.Type], name) + } + } + } + + output := SearchResult{ + RepoName: repoName, + Query: query, + Results: results, + } + + b, _ := json.MarshalIndent(output, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil + }, + } +} diff --git a/internal/cmd/cli/tree_repo.go b/internal/cmd/cli/tree_repo.go index b860c8c4..6b1be04d 100644 --- a/internal/cmd/cli/tree_repo.go +++ b/internal/cmd/cli/tree_repo.go @@ -15,12 +15,14 @@ package cli import ( - "context" "encoding/json" "fmt" "os" + "path/filepath" + "sort" + "strings" - "github.com/cloudwego/abcoder/llm/tool" + "github.com/bytedance/sonic" "github.com/spf13/cobra" ) @@ -40,15 +42,67 @@ Returns a map of directories to file lists.`, } repoName := args[0] - tools := tool.NewASTReadTools(tool.ASTReadToolsOptions{ - RepoASTsDir: astsDir, - DisableWatch: true, - }) - resp, err := tools.TreeRepo(context.Background(), tool.TreeRepoReq{RepoName: repoName}) + repoFile := findRepoFile(astsDir, repoName) + if repoFile == "" { + return fmt.Errorf("repo not found: %s", repoName) + } + + data, err := loadRepoFileData(repoFile) + if err != nil { + return err + } + + // 获取所有 mod keys + modKeys, err := getModuleKeys(data) if err != nil { - return fmt.Errorf("failed to tree repo: %w", err) + return err + } + + // 收集所有文件,按目录聚合 + files := make(map[string][]string) + for _, modPath := range modKeys { + // 跳过外部模块(通过 IsExternal 字段判断) + isExtVal, _ := sonic.Get(data, "Modules", modPath, "IsExternal") + if isExt, _ := isExtVal.Bool(); isExt { + continue + } + + // 只遍历 Files 的 keys(极致按需:不加载 value) + filePaths, err := iterModFiles(data, modPath) + if err != nil { + continue + } + + for _, path := range filePaths { + // 过滤掉非当前仓库的文件 + if strings.HasPrefix(path, "..") { + continue + } + + // 获取目录路径 + dir := filepath.Dir(path) + if dir == "." { + dir = "./" + } + // 添加 '/' 后缀 + if dir != "" && dir != "./" && !strings.HasSuffix(dir, "/") { + dir = dir + "/" + } + + // 获取文件名 + name := filepath.Base(path) + files[dir] = append(files[dir], name) + } + } + + // 排序 + for dir := range files { + sort.Strings(files[dir]) } + resp := map[string]interface{}{ + "files": files, + } b, _ := json.MarshalIndent(resp, "", " ") fmt.Fprintf(os.Stdout, "%s\n", b) return nil diff --git a/internal/cmd/cli/utils.go b/internal/cmd/cli/utils.go index 49145c74..2553272e 100644 --- a/internal/cmd/cli/utils.go +++ b/internal/cmd/cli/utils.go @@ -18,7 +18,10 @@ import ( "fmt" "os" "path/filepath" + "strings" + "github.com/bytedance/sonic" + "github.com/bytedance/sonic/ast" "github.com/spf13/cobra" ) @@ -36,3 +39,509 @@ func getASTsDir(cmd *cobra.Command) (string, error) { } return astsDir, nil } + +// findRepoFile 查找 repo 对应的 JSON 文件 +func findRepoFile(astsDir, repoName string) string { + // 先尝试直接匹配文件名 + patterns := []string{ + repoName + ".json", + repoName, + } + + // 处理特殊字符 + encoded := strings.ReplaceAll(repoName, "/", "-") + encoded = strings.ReplaceAll(encoded, ":", "-") + patterns = append(patterns, encoded+".json") + + // glob 模式 + patterns = append(patterns, "*-"+encoded+".json") + + for _, pattern := range patterns { + if match, err := filepath.Glob(filepath.Join(astsDir, pattern)); err == nil { + for _, f := range match { + return f + } + } + } + + // 遍历所有文件匹配 + files, _ := filepath.Glob(filepath.Join(astsDir, "*.json")) + for _, f := range files { + if strings.HasSuffix(f, "_repo_index.json") || strings.HasSuffix(f, ".repo_index.json") { + continue + } + // 读取 id 字段匹配 + if data, err := os.ReadFile(f); err == nil { + if val, err := sonic.Get(data, "id"); err == nil { + if id, err := val.String(); err == nil && id == repoName { + return f + } + } + } + } + + return "" +} + +// loadRepoModules 用 sonic 读取 repo 的 Modules 结构 +func loadRepoModules(repoFile string) (map[string]interface{}, error) { + data, err := os.ReadFile(repoFile) + if err != nil { + return nil, fmt.Errorf("failed to read repo file: %w", err) + } + + modsVal, err := sonic.Get(data, "Modules") + if err != nil { + return nil, fmt.Errorf("failed to get modules: %w", err) + } + mods, err := modsVal.Map() + if err != nil { + return nil, fmt.Errorf("failed to parse modules: %w", err) + } + return mods, nil +} + +// pathMatchesCwd 检查 mappings 中的文件名对应的 json 文件的 Path 字段是否匹配 cwd +func pathMatchesCwd(astsDir, filename, cwd string) bool { + repoFile := filepath.Join(astsDir, filename) + data, err := os.ReadFile(repoFile) + if err != nil { + return false + } + val, err := sonic.Get(data, "Path") + if err != nil { + return false + } + path, err := val.String() + if err != nil { + return false + } + return path == cwd +} + +// loadRepoFileData 读取整个 repo JSON 文件,返回 raw data 供后续 sonic.Get 按需读取 +func loadRepoFileData(repoFile string) ([]byte, error) { + return os.ReadFile(repoFile) +} + +// getModuleKeys 获取 Modules 的所有 key(不加载 value) +func getModuleKeys(data []byte) ([]string, error) { + val, err := sonic.Get(data, "Modules") + if err != nil { + return nil, err + } + var keys []string + iter, err := val.Properties() + if err != nil { + return nil, err + } + var p ast.Pair + for iter.Next(&p) { + keys = append(keys, p.Key) + } + return keys, nil +} + +// getPackageKeys 获取指定 module 下 Packages 的所有 key(不加载 value) +func getPackageKeys(data []byte, modPath string) ([]string, error) { + val, err := sonic.Get(data, "Modules", modPath, "Packages") + if err != nil { + return nil, err + } + var keys []string + iter, err := val.Properties() + if err != nil { + return nil, err + } + var p ast.Pair + for iter.Next(&p) { + keys = append(keys, p.Key) + } + return keys, nil +} + +// iterModFiles 遍历指定 mod 的 Files,只返回 file path(不加载 value) +func iterModFiles(data []byte, modPath string) ([]string, error) { + val, err := sonic.Get(data, "Modules", modPath, "Files") + if err != nil { + return nil, err + } + iter, err := val.Properties() + if err != nil { + return nil, err + } + var keys []string + var p ast.Pair + for iter.Next(&p) { + keys = append(keys, p.Key) + } + return keys, nil +} + +// iterSymbolNameFile 遍历指定 category (Functions/Types/Vars) 的所有 symbol +// 只读取 Name 和 File 字段,不读取完整内容 +// 返回: [][]string{{name, file}, ...} +func iterSymbolNameFile(data []byte, modPath, pkgPath, category string) ([][]string, error) { + val, err := sonic.Get(data, "Modules", modPath, "Packages", pkgPath, category) + if err != nil { + return nil, err + } + if !val.Exists() { + return nil, nil + } + iter, err := val.Properties() + if err != nil { + return nil, err + } + var results [][]string + var p ast.Pair + for iter.Next(&p) { + symName := p.Key + // 只读取 File 字段 + fileVal, err := sonic.Get(data, "Modules", modPath, "Packages", pkgPath, category, symName, "File") + if err != nil || !fileVal.Exists() { + continue + } + filePath, err := fileVal.String() + if err != nil { + continue + } + results = append(results, []string{symName, filePath}) + } + return results, nil +} + +// findPkgPathByFile 通过 filePath 推导 pkgPath,验证该 pkg 包含该文件 +// 返回: modPath, pkgPath +// 特点:只读取 package 的 file 列表验证,不读取完整内容(极致按需) +func findPkgPathByFile(data []byte, filePath string) (string, string, error) { + derivedPkg := filepath.Dir(filePath) + if derivedPkg == "." { + derivedPkg = "" + } + + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] findPkgPathByFile: filePath=%s, derivedPkg=%s\n", filePath, derivedPkg) + } + + // 1. 遍历 mods,尝试直接定位 + modsVal, err := sonic.Get(data, "Modules") + if err != nil { + return "", "", err + } + modsIter, err := modsVal.Properties() + if err != nil { + return "", "", err + } + var modPair ast.Pair + + for modsIter.Next(&modPair) { + modPath := modPair.Key + + // 拼接完整 pkgPath + var fullPkgPath string + if derivedPkg == "" { + fullPkgPath = modPath + } else { + fullPkgPath = modPath + "/" + derivedPkg + } + + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] trying direct: modPath=%s, fullPkgPath=%s\n", modPath, fullPkgPath) + } + + // 检查该 package 是否存在且包含该文件(只读 File 字段验证) + if matched, _ := pkgHasFile(data, modPath, fullPkgPath, filePath, "", "Functions"); matched { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] HIT via direct: modPath=%s, fullPkgPath=%s\n", modPath, fullPkgPath) + } + return modPath, fullPkgPath, nil + } + if matched, _ := pkgHasFile(data, modPath, fullPkgPath, filePath, "", "Types"); matched { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] HIT via direct: modPath=%s, fullPkgPath=%s\n", modPath, fullPkgPath) + } + return modPath, fullPkgPath, nil + } + if matched, _ := pkgHasFile(data, modPath, fullPkgPath, filePath, "", "Vars"); matched { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] HIT via direct: modPath=%s, fullPkgPath=%s\n", modPath, fullPkgPath) + } + return modPath, fullPkgPath, nil + } + } + + // 2. 兜底:遍历搜索 + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] fallback to findPkgPathByFileField\n") + } + return findPkgPathByFileField(data, filePath) +} + +// findPkgPathByFileField 兜底方案:遍历所有 mod/pkg,通过 File 字段定位 +func findPkgPathByFileField(data []byte, filePath string) (string, string, error) { + modsVal, err := sonic.Get(data, "Modules") + if err != nil { + return "", "", err + } + modsIter, err := modsVal.Properties() + if err != nil { + return "", "", err + } + var modPair ast.Pair + + for modsIter.Next(&modPair) { + modPath := modPair.Key + + pkgsVal, err := sonic.Get(data, "Modules", modPath, "Packages") + if err != nil { + continue + } + pkgsIter, err := pkgsVal.Properties() + if err != nil { + continue + } + var pkgPair ast.Pair + + for pkgsIter.Next(&pkgPair) { + pkgPath := pkgPair.Key + + // 检查 Functions/Types/Vars 是否有该文件 + if matched, _ := pkgHasFile(data, modPath, pkgPath, filePath, "", "Functions"); matched { + return modPath, pkgPath, nil + } + if matched, _ := pkgHasFile(data, modPath, pkgPath, filePath, "", "Types"); matched { + return modPath, pkgPath, nil + } + if matched, _ := pkgHasFile(data, modPath, pkgPath, filePath, "", "Vars"); matched { + return modPath, pkgPath, nil + } + } + } + + return "", "", fmt.Errorf("file not found: %s", filePath) +} + +// pkgHasFile 检查指定 category (Functions/Types/Vars) 中是否有匹配的 file +// 如果 symbolName 不为空,则同时匹配 symbolName +func pkgHasFile(data []byte, modPath, pkgPath, filePath, symbolName, category string) (bool, error) { + categoryVal, err := sonic.Get(data, "Modules", modPath, "Packages", pkgPath, category) + if err != nil { + return false, err + } + if !categoryVal.Exists() { + return false, nil + } + + iter, err := categoryVal.Properties() + if err != nil { + return false, err + } + var pair ast.Pair + + for iter.Next(&pair) { + symName := pair.Key + + // 如果指定了 symbolName,则只检查该 symbol + if symbolName != "" && symName != symbolName { + continue + } + + // 只读取 File 字段进行比对 + fileVal, err := sonic.Get(data, "Modules", modPath, "Packages", pkgPath, category, symName, "File") + if err != nil { + continue + } + if !fileVal.Exists() { + continue + } + fnFile, err := fileVal.String() + if err != nil { + continue + } + + if fnFile == filePath { + return true, nil + } + } + + return false, nil +} + +// getSymbolByFileFull 完整读取 package 内容后匹配 symbol +// 在找到目标 pkg 后调用此函数读取完整内容 +func getSymbolByFileFull(data []byte, modPath, pkgPath, filePath, symbolName string) (map[string]interface{}, error) { + // 读取目标 package 的内容 + pkgVal, err := sonic.Get(data, "Modules", modPath, "Packages", pkgPath) + if err != nil { + return nil, fmt.Errorf("sonic.Get(Packages) failed for %s/%s: %w", modPath, pkgPath, err) + } + if !pkgVal.Exists() { + return nil, fmt.Errorf("Packages does not exist for %s/%s", modPath, pkgPath) + } + pkg, err := pkgVal.Map() + if err != nil { + return nil, fmt.Errorf("pkgVal.Map() failed: %w", err) + } + + // 检查 Functions + if fns, ok := pkg["Functions"].(map[string]interface{}); ok { + for fnName, fnVal := range fns { + if fnName == symbolName { + fn, ok := fnVal.(map[string]interface{}) + if !ok { + continue + } + if fn["File"] == filePath { + return fn, nil + } + } + } + } + // 检查 Types + if types, ok := pkg["Types"].(map[string]interface{}); ok { + for typeName, typeVal := range types { + if typeName == symbolName { + t, ok := typeVal.(map[string]interface{}) + if !ok { + continue + } + if t["File"] == filePath { + return t, nil + } + } + } + } + // 检查 Vars + if vars, ok := pkg["Vars"].(map[string]interface{}); ok { + for varName, varVal := range vars { + if varName == symbolName { + v, ok := varVal.(map[string]interface{}) + if !ok { + continue + } + if v["File"] == filePath { + return v, nil + } + } + } + } + return nil, fmt.Errorf("symbol not found") +} + +// getFileSymbolsByFile 按需读取: modPath → pkgPath → 获取该文件所有 symbols +func getFileSymbolsByFile(data []byte, modPath, pkgPath, filePath string) ([]map[string]interface{}, error) { + // 读取目标 package 的内容 + pkgVal, err := sonic.Get(data, "Modules", modPath, "Packages", pkgPath) + if err != nil { + return nil, err + } + pkg, err := pkgVal.Map() + if err != nil { + return nil, err + } + + var nodes []map[string]interface{} + + // 检查 Functions + if fns, ok := pkg["Functions"].(map[string]interface{}); ok { + for _, fnVal := range fns { + fn, ok := fnVal.(map[string]interface{}) + if !ok { + continue + } + if fn["File"] == filePath { + fn["node_type"] = "FUNC" + nodes = append(nodes, fn) + } + } + } + // 检查 Types + if types, ok := pkg["Types"].(map[string]interface{}); ok { + for _, typeVal := range types { + t, ok := typeVal.(map[string]interface{}) + if !ok { + continue + } + if t["File"] == filePath { + t["node_type"] = "TYPE" + nodes = append(nodes, t) + } + } + } + // 检查 Vars + if vars, ok := pkg["Vars"].(map[string]interface{}); ok { + for _, varVal := range vars { + v, ok := varVal.(map[string]interface{}) + if !ok { + continue + } + if v["File"] == filePath { + v["node_type"] = "VAR" + nodes = append(nodes, v) + } + } + } + return nodes, nil +} + +// getSymbolReferences 用 sonic 按需读取 Graph 节点的 Dependencies +// Identity 格式: {ModPath}?{PkgPath}#{Name} +func getSymbolReferences(data []byte, modPath, pkgPath, symbolName string) ([]map[string]string, error) { + // Graph key 格式: {ModPath}?{PkgPath}#{Name} + // Python 根目录文件的 PkgPath 是 ".",需要映射为 "." + graphKey := modPath + "?" + pkgPath + "#" + symbolName + + // 使用嵌套 Get 避免特殊字符 (?#) 处理问题 + graphVal, err := sonic.Get(data, "Graph") + if err != nil { + return nil, err + } + nodeVal := graphVal.Get(graphKey) + if !nodeVal.Exists() { + return nil, nil // 没有 Graph 节点,返回空 + } + + // 尝试 Dependencies 或 References + depsVal := nodeVal.Get("Dependencies") + if !depsVal.Exists() { + depsVal = nodeVal.Get("References") + } + if !depsVal.Exists() { + return nil, nil // 没有依赖 + } + + arr, err := depsVal.Array() + if err != nil { + return nil, err + } + + var refs []map[string]string + for _, item := range arr { + m, ok := item.(map[string]interface{}) + if !ok { + continue + } + ref := make(map[string]string) + if v, ok := m["Kind"].(string); ok { + ref["kind"] = v + } + if v, ok := m["Name"].(string); ok { + ref["name"] = v + } + if v, ok := m["ModPath"].(string); ok { + ref["mod_path"] = v + } + if v, ok := m["PkgPath"].(string); ok { + ref["pkg_path"] = v + } + if f, ok := m["File"].(string); ok { + ref["file"] = f + } + if n, ok := m["Line"].(float64); ok { + ref["line"] = fmt.Sprintf("%d", int(n)) + } + refs = append(refs, ref) + } + return refs, nil +} From be75f87ab3fd826cee23f3bd4f1d854df9110456 Mon Sep 17 00:00:00 2001 From: simuleite Date: Wed, 4 Mar 2026 14:21:32 +0800 Subject: [PATCH 08/23] Update Asset, Replace MCP with Skill --- .gitignore | 3 +- internal/cmd/assets/.claude/CLAUDE.md | 80 +++++++------------ .../.claude/commands/abcoder/schedule.md | 71 ++++++++++++---- .../skills/abcoder__search_symbol/SKILL.md | 51 ++++++++++++ internal/cmd/init_spec.go | 8 +- 5 files changed, 140 insertions(+), 73 deletions(-) create mode 100644 internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md diff --git a/.gitignore b/.gitignore index 61573efe..5963f29c 100644 --- a/.gitignore +++ b/.gitignore @@ -79,4 +79,5 @@ tools !testdata/asts/*.json -.claude/ \ No newline at end of file +.claude/ +!internal/cmd/assets/.claude/ diff --git a/internal/cmd/assets/.claude/CLAUDE.md b/internal/cmd/assets/.claude/CLAUDE.md index 96679ce3..b383d799 100644 --- a/internal/cmd/assets/.claude/CLAUDE.md +++ b/internal/cmd/assets/.claude/CLAUDE.md @@ -1,76 +1,54 @@ # AST-Driven Coding -你是 AST-Driven Coder,通过整合 `mcp__abcoder` 和 `mcp__sequential_thinking`,为用户提供无幻觉上下文、模糊需求质询、诚实推理和精确执行。 +你是 AST-Driven Coder,通过整合 `skill__abcoder` 和 `mcp__sequential_thinking`,为用户提供无幻觉上下文、模糊需求质询、诚实推理和精确执行。 -## MCP 工具使用体系 +## Tone Style +- 保持诚实:不为"友善"而含糊技术缺陷判断。 +- 面向用户,隐藏实现细节,仅透出必要API出入参数 +- 保持简洁;保持风格一致 -### 工具优先级决策 -**代码分析优先级**: `mcp__abcoder` > Read/Search +## Never break userspace +- 任何导致现有程序崩溃的改动都是bug,无论多么"理论正确" +- 内核的职责是服务用户,而不是教育用户 +- 向后兼容性是不可侵犯的 + +## 工具优先级决策 +**代码分析优先级**: `skill__abcoder` > Read/Search | 工具 | 适用场景 | 核心价值 | |------|----------|----------| -| `mcp__abcoder` | 本地代码深度分析 | UniAST + LSP无幻觉理解代码结构、类型信息、调用链。优于Read/Search | +| `skill__abcoder` | 本地代码深度分析 | UniAST + LSP无幻觉理解代码结构、类型信息、调用链。优于Read/Search | | `mcp__sequential_thinking` | 复杂问题分解 | 多步骤问题的系统化思考 | + ## ABCoder SOP 1. 问题分析: - 基于用户问题分析相关关键词 - - MUST 使用 `list_repos` 确认`repo_name` + - MUST 使用 `list_repos` 确认 `repo_name` -2. 代码定位 (repo→package→node→ast node relationship): - - 2.1 定位package: 基于 `get_repo_structure` 返回的package list选择目标package - - 2.2 定位node: 通过 `get_package_structure` 返回的file信息,确认目标node;无法确认时,调用 `get_files_structure` - - 2.3 确认ast node relationship: 递归调用 `get_ast_node` 获取node详细(dependencies, references, inheritance, implementation, grouping) +2. 代码定位 (repo→file→node→ast symbol relationship): + - 2.1 定位file: 基于 `tree_repo` 返回的file list选择目标file + - 2.2 定位symbol: 通过 `get_file_structure` 返回的file信息,确认目标symbol name + - 2.3 确认ast symbol relationship: 调用 `get_file_symbol` 获取symbol详细(dependencies, references);根据depends/refers的 递归调用`get_file_symbol` ### 开发中的 abcoder 使用 -- 编写前:使用 `get_package_structure` 分析相似代码模式,`get_ast_node` 学习项目最佳实践 +- 编写前:使用 `search_symbol`, `get_file_symbol` 分析相似代码模式、学习项目最佳实践; IMPORTANT: MUST 输出 数据流转API, 对齐所有 Input/Output IDL和类型 ## 分阶段开发理念 - -IMPORTANT: 开发前,MUST 与用户对齐CODE_TASK需求;对于CODE_TASK中不明确的任务(例如任务需要的SDK Method定义、返回值的JSON/IDL),质询用户 -IMPORTANT: 开始开发前,阐述此次CODE_TASK的调用链路、相关SDK Method定义、cURL JSON定义 -### 开发阶段 -1. MVP阶段:核心功能可工作,基本类型安全 -2. 完善阶段:错误处理、边界情况、测试覆盖 -3. 优化阶段:性能优化、代码重构、文档完善 - -## 代码质量标准 - -### 实现要求(按优先级) -MUST: -- Never 使用简化/Mock实现,使用真实SDK/cURL -- 类型安全:核心逻辑必须有明确类型定义 -- 基本错误处理:处理可预见的异常情况 - -SHOULD: -- 完整的边界条件处理 -- 性能敏感场景的优化 -- 复杂逻辑的注释说明 - -COULD: -- 100%遵循SOLID编码规范 -- 极致的性能优化 - -### 验证标准 -- 关键路径和边界条件 MUST 有测试 -- 通过 linter 和类型检查 -- 手动验证主要用户场景 +IMPORTANT: 开发前,MUST 与用户对齐CODE_TASK需求;对于CODE_TASK中不明确的任务(例如任务需要的相关API SDK Method cURL的IDL和类型),质询用户 +IMPORTANT: 开始开发前,阐述此次CODE_TASK的数据流转、调用链路、相关API SDK Method cURL的IDL和类型 ## 用户协作模式 | 用户行为 | 响应策略 | |----------|----------| -| 模糊需求 | 使用 `mcp__sequential_thinking` 澄清,提供具体选项 | -| BUG修复 | 使用 `mcp__abcoder__get_ast_node` 详细分析,根本解决 | -| 重构替换 | 使用 `semgrep` 和 `comby` 结构化搜索替换 | -| 代码分析请求 | MUST 使用 `mcp__abcoder` SOP | +| 模糊需求 | 使用 `AskUserQuestion` 澄清,提供具体选项 | +| BUG修复 | 使用 `skill__abcoder__get_file_symbol` 详细分析,根本解决 | +| 代码分析请求 | MUST 使用 `skill__abcoder` SOP | ## 执行要求 -1. 绝不假设 - 任何不确定代码,MUST 通过`mcp__abcoder__get_ast_node`工具验证 -2. 工具链整合 - 充分利用ABCoder等工具提升效率 -3. 质量内建 - 代码质量要求融入每个环节 -4. 渐进交付 - 复杂任务分解为可验证的小步骤 - -- **使用SubAgent时提醒使用ABCoder** - 当需要使用subAgent(如@agent-Explore、@agent-coding-executor)进行代码分析时,应该提醒SubAgent使用`mcp__abcoder__get_ast_node`以获得更准确的分析结果 -- **Never 说英语**:MUST 使用中文 +1. 绝不假设 - 任何不确定代码,MUST 通过`skill__abcoder__get_file_symbol`工具验证 +2. Demo-First - 任何新引入的外部库API,优先编写Demo代码, 验证数据流转,调试通过后根据项目上下文编写TDD;最后更新项目代码 +3. 工具链整合 - 充分利用ABCoder等工具提升效率 +4. 数据流转 - 使用一切方法(ABCoder, `go doc`, ...)明确数据流转API的Input/Output IDL和类型; 明确后, 才能更新项目代码 diff --git a/internal/cmd/assets/.claude/commands/abcoder/schedule.md b/internal/cmd/assets/.claude/commands/abcoder/schedule.md index be81cd09..30ae3ce9 100644 --- a/internal/cmd/assets/.claude/commands/abcoder/schedule.md +++ b/internal/cmd/assets/.claude/commands/abcoder/schedule.md @@ -1,34 +1,71 @@ --- name: ABCoder: Schedule -description: Design implementation plan using mcp__abcoder analysis and code exploration. +description: Design implementation plan using skill__abcoder analysis and code exploration. category: ABCoder tags: [abcoder, schedule, planning] --- -使用mcp__abcoder分析相关仓库(下钻到mcp__abcoder__get_ast_node查看细节),帮助用户设计实现方案。 -**Guardrails** -- 最大化复用项目已有功能,避免重复造轮子。 +使用`skill__abcoder`分析相关仓库(下钻到`skill__abcoder__get_file_symbol`查看细节),帮助用户设计实现方案。 + +## Guardrails +IMPORTANT: 默认保持向后兼容;但是如果新需求和旧代码存在冲突,请你清晰具体告知,质询用户 +IMPORTANT: 制定系统、根本性的解决方案 +- 最大化复用项目已有功能、优先使用外部成熟库;不重复造轮子。 +- 学习项目/外部库已有最佳实践;保持风格一致。 - 优先采用直接、最小改动的实现方式,只有在用户明确要求时才增加复杂度。 -- 严格限制修改影响面在所请求的结果范围内。 -- 找出任何模糊或含糊不清的细节,并在修改文件前提出必要的后续问题。 -- 在 Schedule 阶段禁止编写代码,禁止使用 agent。 +- 严格限制修改影响面在必要但**全面**范围。 +- 找出任何模糊或含糊不清的细节,并在`abcoder:spec`前提出必要的后续问题。 +- 在Schedule阶段禁止编写代码,禁止使用agent。 +IMPORTANT: MUST 从`skill__abcoder__list_repos`开始, 下钻到`skill__abcoder__get_file_symbol` + +在开始任何分析前,先问自己: +1. "这是个真问题还是臆想出来的?" - 拒绝过度设计 +2. "有更简单的方法吗?" - 永远寻找最简方案 +3. "会破坏什么吗?" - 向后兼容是铁律 + +结构化问题分解思考 + 第一层:数据结构分析. "Bad programmers worry about the code. Good programmers worry about data structures." + - 核心数据IDL是什么?它们的关系如何?类型是否兼容 + - 数据流向哪里?谁拥有它?谁修改它? + - 有没有不必要的数据复制或转换? + 第二层:特殊情况识别. "好代码没有特殊情况" + - 找出所有 if/else 分支 + - 哪些是真正的业务逻辑?哪些是糟糕设计的补丁? + - 能否重新设计数据结构来消除这些分支? + 第三层:复杂度审查. "如果实现需要超过3层缩进,重新设计它" + - 这个功能的本质是什么?(一句话说清) + - 当前方案用了多少概念来解决? + - 能否减少到一半?再少一半? + 第四层:破坏性分析. "Never break userspace" - 向后兼容是铁律 + - 列出所有可能受影响的现有功能 + - 哪些依赖会被破坏? + - 如何在不破坏任何东西的前提下改进? + 第五层:实用性验证. "Theory and practice sometimes clash. Theory loses. Every single time." + - 这个问题在生产环境真实存在吗? + - 有多少用户真正遇到这个问题? + - 解决方案的复杂度是否与问题的严重性匹配? + +## Style +- 面向E2E用户,隐藏实现细节(一句话总结) +- 仅暴露必要的SDK/API/Method出入参数 +- 保持简洁, 回复保持在500字以内;除非用户明确要求,不要包含代码函数体,仅透出signature、IDL数据流向 **Steps** Track these steps as TODOs and complete them one by one. -1. 从 `mcp__abcoder__get_repo_structure` 开始,获取目标仓库结构。 -2. 根据任务描述,定位相关的 package。 -3. 使用 `mcp__abcoder__get_package_structure` 获取 package 内的文件和节点列表。 -4. 使用 `mcp__abcoder__get_ast_node` 深入分析相关代码节点,理解现有实现模式。 -5. 分析依赖关系、调用链、类型信息等。 +1. 从 `skill__abcoder__tree_repo` 开始,获取目标仓库结构。 +2. 根据任务描述,生成pattern, `skill__abcoder__search_symbol` 定位相关的 symbol。 +3. 使用 `skill__abcoder__get_file_structure` 获取 file 所有 symbol。 +4. 使用 `skill__abcoder__get_file_symbol` 获取 symbol 源代码/dependence/reference, 使用depend/refer的file-path和name, 继续调用 `get_file_symbol`, 追溯数据流向。 +5. 分析依赖关系、数据流向调用链、类型信息等。 6. 设计实现方案,确保最大化复用已有功能、最小化改动。 7. 找出任何模糊或缺失的技术细节,并向用户提出后续问题。 8. 输出清晰的技术方案,包括修改范围、涉及的文件、关键实现步骤。 **Reference** -- `mcp__abcoder__list_repos` - 列出所有可用仓库 -- `mcp__abcoder__get_repo_structure` - 获取仓库结构(必须作为第一步) -- `mcp__abcoder__get_package_structure` - 获取 package 结构 -- `mcp__abcoder__get_file_structure` - 获取文件结构 -- `mcp__abcoder__get_ast_node` - 获取 AST 节点详情(下钻分析) +- `skill__abcoder__list_repos` - 列出所有可用仓库 +- `skill__abcoder__tree_repo` - 获取仓库结构(必须作为第一步) +- `skill__abcoder__search_symbol` - 搜索仓库的相关symbol(支持regex pattern) +- `skill__abcoder__get_file_structure` - 获取 file 的所有 symbol +- `skill__abcoder__get_file_symbol` - 获取 symbol 的 源代码/dependence/reference diff --git a/internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md b/internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md new file mode 100644 index 00000000..f0f054bf --- /dev/null +++ b/internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md @@ -0,0 +1,51 @@ +--- +name: skill__abcoder__search_symbol +description: skill__abcoder__search_symbol `abcoder cli search_symbol ` Search symbols in a repository by name pattern. Supports substring match, prefix match (pattern*), suffix match (*pattern), and wildcard (*pattern*). You MUST call `get_file_symbol` later. +--- + +Execute the search_symbol command to search symbols by name: + +```bash +abcoder cli search_symbol +``` + +## Examples + +```bash +# Substring match - search for "Get" in all symbol names +abcoder cli search_symbol myrepo Get + +# Prefix match - search for symbols starting with "Get" +abcoder cli search_symbol myrepo "Get*" + +# Suffix match - search for symbols ending with "User" +abcoder cli search_symbol myrepo "*User" + +# Wildcard match - search for symbols containing "GetUser" +abcoder cli search_symbol myrepo "*GetUser*" +``` + +## Output Format + +```json +{ + "repo_name": "string", + "pattern": "string", + "results": { + "file_path": { + "FUNC": ["function_name1", "function_name2"], + "TYPE": ["type_name"], + "VAR": ["var_name"] + } + } +} +``` + +## Notes + +A powerful search tool based on ABCoder + + Usage: - ALWAYS use `abcoder__search_symbol` for search tasks. NEVER invoke `grep` or `rg` as a Bash command. The `abcoder__search_symbol` tool has been optimized for correct permissions and access. + - Supports full regex syntax (e.g., "Get*", "Domain*Controller") + - Dynamic patterns for open-ended searches requiring multiple rounds + - Pattern syntax: Uses ripgrep (not grep) - literal braces need escaping (use `interface\{\}` to find `interface{}` in Go code) diff --git a/internal/cmd/init_spec.go b/internal/cmd/init_spec.go index 8649c75e..98685a3d 100644 --- a/internal/cmd/init_spec.go +++ b/internal/cmd/init_spec.go @@ -81,10 +81,10 @@ func RunInitSpec(targetDir string) error { } claudeConfigPath := filepath.Join(homeDir, ".claude.json") - if err := configureMCPServers(claudeConfigPath, astsDir); err != nil { - return fmt.Errorf("failed to configure MCP servers: %w", err) - } - log.Info("Configured MCP servers in %s", claudeConfigPath) + // if err := configureMCPServers(claudeConfigPath, astsDir); err != nil { + // return fmt.Errorf("failed to configure MCP servers: %w", err) + // } + // log.Info("Configured MCP servers in %s", claudeConfigPath) // 4. Print success message printSuccessMessage(targetDirAbs, claudeConfigPath, astsDir) From acae902b370493b257910c5ee0c5f40312b794e8 Mon Sep 17 00:00:00 2001 From: simuleite Date: Wed, 4 Mar 2026 14:49:46 +0800 Subject: [PATCH 09/23] Compress get_file_symbol Output, Sonic --- internal/cmd/cli/get_file_symbol.go | 27 +++++++++++++++++++---- internal/cmd/cli/utils.go | 34 +++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/internal/cmd/cli/get_file_symbol.go b/internal/cmd/cli/get_file_symbol.go index d602815e..f0d32f77 100644 --- a/internal/cmd/cli/get_file_symbol.go +++ b/internal/cmd/cli/get_file_symbol.go @@ -86,16 +86,35 @@ Returns the symbol's code, type, line number, and relationship with other symbol return err } - // 按 Kind 分类 - var deps, refsOnly []map[string]string + // 按 Kind 分类,并按 file_path 分组聚合 + depMap := make(map[string][]string) + refMap := make(map[string][]string) for _, r := range refs { + // 通过 ModPath + PkgPath + Name 反向查找 FilePath + filePath := findSymbolFile(data, r["mod_path"], r["pkg_path"], r["name"]) + if r["kind"] == "Dependency" { - deps = append(deps, r) + depMap[filePath] = append(depMap[filePath], r["name"]) } else { - refsOnly = append(refsOnly, r) + refMap[filePath] = append(refMap[filePath], r["name"]) } } + // 转换为 FileNodeID 格式(按 file_path 分组,names 为数组) + var deps, refsOnly []map[string]interface{} + for fp, names := range depMap { + deps = append(deps, map[string]interface{}{ + "file_path": fp, + "names": names, + }) + } + for fp, names := range refMap { + refsOnly = append(refsOnly, map[string]interface{}{ + "file_path": fp, + "names": names, + }) + } + node := map[string]interface{}{ "name": symbolName, "type": nodeType, diff --git a/internal/cmd/cli/utils.go b/internal/cmd/cli/utils.go index 2553272e..705b5787 100644 --- a/internal/cmd/cli/utils.go +++ b/internal/cmd/cli/utils.go @@ -545,3 +545,37 @@ func getSymbolReferences(data []byte, modPath, pkgPath, symbolName string) ([]ma } return refs, nil } + +// findSymbolFile 通过 ModPath + PkgPath + Name 反向查找 FilePath +// 路径格式: .Modules[ModPath].Packages[PkgPath].Functions[Name].File +func findSymbolFile(data []byte, modPath, pkgPath, name string) string { + if modPath == "" || pkgPath == "" || name == "" { + return "" + } + + // 尝试 Functions + fileVal, _ := sonic.Get(data, "Modules", modPath, "Packages", pkgPath, "Functions", name, "File") + if fileVal.Exists() { + if f, err := fileVal.String(); err == nil { + return f + } + } + + // 尝试 Types + fileVal, _ = sonic.Get(data, "Modules", modPath, "Packages", pkgPath, "Types", name, "File") + if fileVal.Exists() { + if f, err := fileVal.String(); err == nil { + return f + } + } + + // 尝试 Vars + fileVal, _ = sonic.Get(data, "Modules", modPath, "Packages", pkgPath, "Vars", name, "File") + if fileVal.Exists() { + if f, err := fileVal.String(); err == nil { + return f + } + } + + return "" +} From 8eed8f90d5300864ae5d7afc9fd14b91b8a524b1 Mon Sep 17 00:00:00 2001 From: simuleite Date: Wed, 4 Mar 2026 15:43:51 +0800 Subject: [PATCH 10/23] When Sonic find null, roll back to non Sonic Loaded --- internal/cmd/cli/utils.go | 87 ++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/internal/cmd/cli/utils.go b/internal/cmd/cli/utils.go index 705b5787..41bbe70f 100644 --- a/internal/cmd/cli/utils.go +++ b/internal/cmd/cli/utils.go @@ -271,54 +271,62 @@ func findPkgPathByFile(data []byte, filePath string) (string, string, error) { } } - // 2. 兜底:遍历搜索 + // 2. 全量加载:一次性加载 Modules.Packages,建立索引查找 if verbose { - fmt.Fprintf(os.Stderr, "[VERBOSE] fallback to findPkgPathByFileField\n") + fmt.Fprintf(os.Stderr, "[VERBOSE] fallback to findPkgPathByFileFullLoad\n") } - return findPkgPathByFileField(data, filePath) + return findPkgPathByFileFullLoad(data, filePath) } -// findPkgPathByFileField 兜底方案:遍历所有 mod/pkg,通过 File 字段定位 -func findPkgPathByFileField(data []byte, filePath string) (string, string, error) { - modsVal, err := sonic.Get(data, "Modules") - if err != nil { - return "", "", err - } - modsIter, err := modsVal.Properties() - if err != nil { - return "", "", err - } - var modPair ast.Pair - - for modsIter.Next(&modPair) { - modPath := modPair.Key - - pkgsVal, err := sonic.Get(data, "Modules", modPath, "Packages") - if err != nil { - continue - } - pkgsIter, err := pkgsVal.Properties() - if err != nil { - continue - } - var pkgPair ast.Pair - - for pkgsIter.Next(&pkgPair) { - pkgPath := pkgPair.Key - - // 检查 Functions/Types/Vars 是否有该文件 - if matched, _ := pkgHasFile(data, modPath, pkgPath, filePath, "", "Functions"); matched { - return modPath, pkgPath, nil +// findPkgPathByFileFullLoad 全量加载方案:一次性加载 Modules.Packages,建立 file→{modPath,pkgPath} 索引 +func findPkgPathByFileFullLoad(data []byte, filePath string) (string, string, error) { + // 一次性反序列化 Modules.Packages(只加载 File 字段) + var result struct { + Modules map[string]struct { + Packages map[string]struct { + Functions map[string]struct { + File string `json:"File"` + } `json:"Functions"` + Types map[string]struct { + File string `json:"File"` + } `json:"Types"` + Vars map[string]struct { + File string `json:"File"` + } `json:"Vars"` + } `json:"Packages"` + } `json:"Modules"` + } + if err := sonic.Unmarshal(data, &result); err != nil { + return "", "", fmt.Errorf("unmarshal failed: %w", err) + } + + // 遍历建立 file → {modPath, pkgPath} 索引 + fileIndex := make(map[string][2]string) + for modPath, mod := range result.Modules { + for pkgPath, pkg := range mod.Packages { + for _, fn := range pkg.Functions { + if fn.File != "" { + fileIndex[fn.File] = [2]string{modPath, pkgPath} + } } - if matched, _ := pkgHasFile(data, modPath, pkgPath, filePath, "", "Types"); matched { - return modPath, pkgPath, nil + for _, t := range pkg.Types { + if t.File != "" { + fileIndex[t.File] = [2]string{modPath, pkgPath} + } } - if matched, _ := pkgHasFile(data, modPath, pkgPath, filePath, "", "Vars"); matched { - return modPath, pkgPath, nil + for _, v := range pkg.Vars { + if v.File != "" { + fileIndex[v.File] = [2]string{modPath, pkgPath} + } } } } + // 直接查找 + if info, ok := fileIndex[filePath]; ok { + return info[0], info[1], nil + } + return "", "", fmt.Errorf("file not found: %s", filePath) } @@ -393,6 +401,7 @@ func getSymbolByFileFull(data []byte, modPath, pkgPath, filePath, symbolName str continue } if fn["File"] == filePath { + fn["node_type"] = "FUNC" return fn, nil } } @@ -407,6 +416,7 @@ func getSymbolByFileFull(data []byte, modPath, pkgPath, filePath, symbolName str continue } if t["File"] == filePath { + t["node_type"] = "TYPE" return t, nil } } @@ -421,6 +431,7 @@ func getSymbolByFileFull(data []byte, modPath, pkgPath, filePath, symbolName str continue } if v["File"] == filePath { + v["node_type"] = "VAR" return v, nil } } From c1a0f124a433307cc7e30feed5f6c18c1cdc5cc0 Mon Sep 17 00:00:00 2001 From: simuleite Date: Wed, 4 Mar 2026 18:20:20 +0800 Subject: [PATCH 11/23] Add UniAST Index for search_symbol & get_file_structure --- lang/golang/parser/parser.go | 69 ++++++++++++++++++++++++++++++++++++ lang/golang/parser/pkg.go | 3 ++ lang/uniast/ast.go | 22 +++++++++++- 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/lang/golang/parser/parser.go b/lang/golang/parser/parser.go index 12e53095..13270498 100644 --- a/lang/golang/parser/parser.go +++ b/lang/golang/parser/parser.go @@ -295,6 +295,7 @@ func (p *GoParser) ParseRepo() (Repository, error) { } p.associateStructWithMethods() p.associateImplements() + p.buildNameToLocations() fmt.Fprintf(os.Stderr, "total call packages.Load %d times\n", loadCount) return p.getRepo(), nil } @@ -362,6 +363,74 @@ func (p *GoParser) getRepo() Repository { return p.repo } +// buildNameToLocations 构建 name → files 反向索引 +// 解析完成后调用,一次遍历 Package 填充 +func (p *GoParser) buildNameToLocations() { + if p.repo.NameToLocations == nil { + p.repo.NameToLocations = make(map[string]NameLocations) + } + + for _, mod := range p.repo.Modules { + for _, pkg := range mod.Packages { + // Functions + for name, fn := range pkg.Functions { + if fn.File == "" { + continue + } + loc := p.repo.NameToLocations[name] + // 去重 + exists := false + for _, f := range loc.Files { + if f == fn.File { + exists = true + break + } + } + if !exists { + loc.Files = append(loc.Files, fn.File) + } + p.repo.NameToLocations[name] = loc + } + // Types + for name, t := range pkg.Types { + if t.FileLine.File == "" { + continue + } + loc := p.repo.NameToLocations[name] + exists := false + for _, f := range loc.Files { + if f == t.FileLine.File { + exists = true + break + } + } + if !exists { + loc.Files = append(loc.Files, t.FileLine.File) + } + p.repo.NameToLocations[name] = loc + } + // Vars + for name, v := range pkg.Vars { + if v.FileLine.File == "" { + continue + } + loc := p.repo.NameToLocations[name] + exists := false + for _, f := range loc.Files { + if f == v.FileLine.File { + exists = true + break + } + } + if !exists { + loc.Files = append(loc.Files, v.FileLine.File) + } + p.repo.NameToLocations[name] = loc + } + } + } +} + // ToABS converts a local package path to absolute path // If the path is not a local package, return empty string // func (p *goParser) pkgPathToABS(path PkgPath) string { diff --git a/lang/golang/parser/pkg.go b/lang/golang/parser/pkg.go index 32ae1303..e91c21e0 100644 --- a/lang/golang/parser/pkg.go +++ b/lang/golang/parser/pkg.go @@ -277,6 +277,9 @@ func (p *GoParser) loadPackages(mod *Module, dir string, pkgPath PkgPath) (err e if f.Package == "" { f.Package = pkg.ID f.Imports = imports.Origins + // [新增] 填充 ModPath 和 PkgPath + f.ModPath = mod.Name + f.PkgPath = pkg.ID } if err := p.parseFile(ctx, file); err != nil { return err diff --git a/lang/uniast/ast.go b/lang/uniast/ast.go index d62f5d1f..a3e00ef7 100644 --- a/lang/uniast/ast.go +++ b/lang/uniast/ast.go @@ -95,6 +95,16 @@ type Repository struct { Path string // repo absolute path Modules map[string]*Module // module name => module Graph NodeGraph // node id => node + + // [新增] name → files 反向索引 + // 加速 search_symbol API,无需独立 .idx 文件 + NameToLocations map[string]NameLocations `json:"NameToLocations,omitempty"` +} + +// NameLocations represents all locations of a symbol name +// [新增] 用于反向索引 name → files +type NameLocations struct { + Files []string `json:"Files,omitempty"` } func (r Repository) ID() string { @@ -126,7 +136,14 @@ func NewRepository(name string) Repository { type File struct { Path string Imports []Import `json:",omitempty"` - Package PkgPath `json:",omitempty"` + + // Package 兼容旧字段 + Package PkgPath `json:",omitempty"` + + // [新增] Identity fields for O(1) lookup + // 解析时直接赋值,无需查询 + ModPath ModPath `json:"ModPath,omitempty"` + PkgPath PkgPath `json:"PkgPath,omitempty"` } type Import struct { @@ -569,6 +586,9 @@ type FileLine struct { // NOTICE: start line. line number start from 1 Line int + // [新增] end line number (1-based) + EndLine int `json:"EndLine,omitempty"` + // start offset in file StartOffset int From ab28b689388c859664070434583238145c5b41bd Mon Sep 17 00:00:00 2001 From: simuleite Date: Wed, 4 Mar 2026 19:23:23 +0800 Subject: [PATCH 12/23] Write Index to UniAST --- internal/cmd/cli/search_symbol.go | 129 +++++++++++------------------- internal/cmd/cli/utils.go | 55 +++++++++++-- 2 files changed, 96 insertions(+), 88 deletions(-) diff --git a/internal/cmd/cli/search_symbol.go b/internal/cmd/cli/search_symbol.go index a9018adf..778487b3 100644 --- a/internal/cmd/cli/search_symbol.go +++ b/internal/cmd/cli/search_symbol.go @@ -128,103 +128,70 @@ abcoder cli search_symbol myrepo "Get*"`, return fmt.Errorf("repo not found: %s", repoName) } - // 尝试加载索引 - idx, err := loadSymbolIndex(astsDir, repoName, repoFile) + // 读取 JSON 文件 + data, err := os.ReadFile(repoFile) if err != nil { - return fmt.Errorf("failed to load index: %w", err) + return fmt.Errorf("failed to read repo file: %w", err) } - // 如果索引不存在或过期,需要从 JSON 构建 - if idx == nil { - fmt.Fprintf(os.Stderr, "Index not found or outdated, rebuilding...\n") - data, err := os.ReadFile(repoFile) - if err != nil { - return fmt.Errorf("failed to read repo file: %w", err) - } - - modsVal, err := sonic.Get(data, "Modules") - if err != nil { - return fmt.Errorf("failed to get modules: %w", err) - } - - mods, err := modsVal.Map() - if err != nil { - return fmt.Errorf("failed to parse modules: %w", err) - } - - indexData := make(map[string][]NameMatch) - - for _, modVal := range mods { - mod, ok := modVal.(map[string]interface{}) - if !ok { - continue - } + var results = make(map[string]map[string][]string) - pkgs, ok := mod["Packages"].(map[string]interface{}) - if !ok { - continue + // 方式1: 使用 NameToLocations(新增字段,O(1)) + nameToLocsVal, err := sonic.Get(data, "NameToLocations") + if err == nil && nameToLocsVal.Exists() { + nameToLocs, err := nameToLocsVal.Map() + if err == nil { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] using NameToLocations (new)\n") } - - for _, pkgVal := range pkgs { - pkg, ok := pkgVal.(map[string]interface{}) - if !ok { - continue - } - - // Functions - if fns, ok := pkg["Functions"].(map[string]interface{}); ok { - for _, fnVal := range fns { - fn, ok := fnVal.(map[string]interface{}) - if !ok { - continue + for name := range nameToLocs { + if matchName(name, query) { + locVal := nameToLocsVal.Get(name) + filesVal := locVal.Get("Files") + if filesVal.Exists() { + files, _ := filesVal.Array() + for _, f := range files { + fileStr, _ := f.(string) + if results[fileStr] == nil { + results[fileStr] = map[string][]string{ + "FUNC": {}, + "TYPE": {}, + "VAR": {}, + } + } + results[fileStr]["FUNC"] = append(results[fileStr]["FUNC"], name) } - name := fn["Name"].(string) - file := fn["File"].(string) - indexData[name] = append(indexData[name], NameMatch{File: file, Type: "FUNC"}) - } - } - - // Types - if types, ok := pkg["Types"].(map[string]interface{}); ok { - for _, typeVal := range types { - t, ok := typeVal.(map[string]interface{}) - if !ok { - continue - } - name := t["Name"].(string) - file := t["File"].(string) - indexData[name] = append(indexData[name], NameMatch{File: file, Type: "TYPE"}) } } + } - // Vars - if vars, ok := pkg["Vars"].(map[string]interface{}); ok { - for _, varVal := range vars { - v, ok := varVal.(map[string]interface{}) - if !ok { - continue - } - name := v["Name"].(string) - file := v["File"].(string) - indexData[name] = append(indexData[name], NameMatch{File: file, Type: "VAR"}) - } + // 如果有结果,直接返回 + if len(results) > 0 { + output := SearchResult{ + RepoName: repoName, + Query: query, + Results: results, } + b, _ := json.MarshalIndent(output, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil } } + } - // 保存索引 - if err := saveSymbolIndex(astsDir, repoName, repoFile, indexData); err != nil { - fmt.Fprintf(os.Stderr, "Warning: failed to save index: %v\n", err) - } - - idx = &SymbolIndex{ - Mtime: 0, // 临时使用 - Data: indexData, - } + // 方式2: 回退到 .idx 文件(旧逻辑) + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] fallback to .idx file\n") + } + idx, err := loadSymbolIndex(astsDir, repoName, repoFile) + if err != nil { + return fmt.Errorf("failed to load index: %w", err) + } + if idx == nil { + return fmt.Errorf("no symbol index found for repo: %s", repoName) } // 搜索 - results := make(map[string]map[string][]string) for name, matches := range idx.Data { if matchName(name, query) { for _, m := range matches { diff --git a/internal/cmd/cli/utils.go b/internal/cmd/cli/utils.go index 41bbe70f..0be00013 100644 --- a/internal/cmd/cli/utils.go +++ b/internal/cmd/cli/utils.go @@ -211,20 +211,64 @@ func iterSymbolNameFile(data []byte, modPath, pkgPath, category string) ([][]str return results, nil } -// findPkgPathByFile 通过 filePath 推导 pkgPath,验证该 pkg 包含该文件 +// findPkgPathByFile 通过 filePath 查找 pkgPath // 返回: modPath, pkgPath -// 特点:只读取 package 的 file 列表验证,不读取完整内容(极致按需) +// 使用 File.ModPath + File.PkgPath 实现 O(1) 查找 func findPkgPathByFile(data []byte, filePath string) (string, string, error) { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] findPkgPathByFile: filePath=%s\n", filePath) + } + + // 1. 遍历 Modules,尝试直接通过 Files[filePath] 找到 File + modsVal, err := sonic.Get(data, "Modules") + if err != nil { + return "", "", err + } + modsIter, err := modsVal.Properties() + if err != nil { + return "", "", err + } + var modPair ast.Pair + + for modsIter.Next(&modPair) { + modPath := modPair.Key + + // 直接查找 Module.Files[filePath] + fileVal, err := sonic.Get(data, "Modules", modPath, "Files", filePath) + if err != nil || !fileVal.Exists() { + continue + } + + // 读取 File.ModPath 和 File.PkgPath(JSON 字段名是大写) + modPathVal, _ := fileVal.Get("ModPath").String() + pkgPathVal, _ := fileVal.Get("PkgPath").String() + + if modPathVal != "" && pkgPathVal != "" { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] HIT via Files: modPath=%s, pkgPath=%s\n", modPathVal, pkgPathVal) + } + return modPathVal, pkgPathVal, nil + } + } + + // 2. 回退:使用旧的推导方式(兼容旧数据) + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] fallback to derived path\n") + } + return findPkgPathByFileDerived(data, filePath) +} + +// findPkgPathByFileDerived 通过推导查找 pkgPath(旧逻辑,兼容) +func findPkgPathByFileDerived(data []byte, filePath string) (string, string, error) { derivedPkg := filepath.Dir(filePath) if derivedPkg == "." { derivedPkg = "" } if verbose { - fmt.Fprintf(os.Stderr, "[VERBOSE] findPkgPathByFile: filePath=%s, derivedPkg=%s\n", filePath, derivedPkg) + fmt.Fprintf(os.Stderr, "[VERBOSE] findPkgPathByFileDerived: filePath=%s, derivedPkg=%s\n", filePath, derivedPkg) } - // 1. 遍历 mods,尝试直接定位 modsVal, err := sonic.Get(data, "Modules") if err != nil { return "", "", err @@ -238,7 +282,6 @@ func findPkgPathByFile(data []byte, filePath string) (string, string, error) { for modsIter.Next(&modPair) { modPath := modPair.Key - // 拼接完整 pkgPath var fullPkgPath string if derivedPkg == "" { fullPkgPath = modPath @@ -250,7 +293,6 @@ func findPkgPathByFile(data []byte, filePath string) (string, string, error) { fmt.Fprintf(os.Stderr, "[VERBOSE] trying direct: modPath=%s, fullPkgPath=%s\n", modPath, fullPkgPath) } - // 检查该 package 是否存在且包含该文件(只读 File 字段验证) if matched, _ := pkgHasFile(data, modPath, fullPkgPath, filePath, "", "Functions"); matched { if verbose { fmt.Fprintf(os.Stderr, "[VERBOSE] HIT via direct: modPath=%s, fullPkgPath=%s\n", modPath, fullPkgPath) @@ -271,7 +313,6 @@ func findPkgPathByFile(data []byte, filePath string) (string, string, error) { } } - // 2. 全量加载:一次性加载 Modules.Packages,建立索引查找 if verbose { fmt.Fprintf(os.Stderr, "[VERBOSE] fallback to findPkgPathByFileFullLoad\n") } From 431d7fe8c7b84a39ed95789fa49707078662cfc8 Mon Sep 17 00:00:00 2001 From: simuleite Date: Thu, 5 Mar 2026 12:29:11 +0800 Subject: [PATCH 13/23] Keep Sonic Same With LLM Tool --- internal/cmd/cli/extract_symbol.go | 273 ++++++++++++++++++----------- internal/cmd/cli/search_symbol.go | 79 +++++++-- internal/cmd/cli/utils.go | 37 ++-- 3 files changed, 258 insertions(+), 131 deletions(-) diff --git a/internal/cmd/cli/extract_symbol.go b/internal/cmd/cli/extract_symbol.go index f69b8a56..d2c33067 100644 --- a/internal/cmd/cli/extract_symbol.go +++ b/internal/cmd/cli/extract_symbol.go @@ -18,65 +18,113 @@ import ( "encoding/json" "fmt" "os" - "path/filepath" + "strings" "github.com/bytedance/sonic" "github.com/cloudwego/abcoder/lang/utils" + "github.com/cloudwego/abcoder/lang/uniast" "github.com/spf13/cobra" ) -const indexDir = ".index" +// buildNameToLocations 从 JSON 数据构建 NameToLocations +// 如果 pathFilter 不为空,则只收集匹配前缀的 file +// 返回: name -> type -> fileSet (去重) +func buildNameToLocations(data []byte, pathFilter string) (map[string]map[string]map[string]bool, error) { + // 一次性反序列化整个 Modules + var result struct { + Modules map[string]*uniast.Module `json:"modules"` + } + if err := sonic.Unmarshal(data, &result); err != nil { + return nil, err + } -type SymbolIndex struct { - Mtime int64 `json:"mtime"` - Data map[string][]NameMatch `json:"data"` // name -> []NameMatch -} + // name -> type -> files (去重) + nameToTypeFiles := make(map[string]map[string]map[string]bool) -type NameMatch struct { - File string `json:"file"` - Type string `json:"type"` -} + // 遍历所有模块 + for _, mod := range result.Modules { + // 跳过外部模块 + if mod.IsExternal() { + continue + } -// saveSymbolIndex 保存符号索引到 ~/.asts/.index/{repo}.idx -func saveSymbolIndex(astsDir, repoName, repoFile string, data map[string][]NameMatch) error { - // 获取 repo 文件的 mtime - info, err := os.Stat(repoFile) - if err != nil { - return fmt.Errorf("stat repo file: %w", err) - } - mtime := info.ModTime().UnixMilli() - - // 检查现有索引 - idxPath := filepath.Join(astsDir, indexDir, repoName+".idx") - if _, err := os.Stat(idxPath); err == nil { - // 读取现有索引的 mtime - if oldData, err := os.ReadFile(idxPath); err == nil { - var oldIdx SymbolIndex - if json.Unmarshal(oldData, &oldIdx) == nil && oldIdx.Mtime == mtime { - return nil // mtime 一致,无需更新 + // 遍历所有包 + for _, pkg := range mod.Packages { + // 提取 Functions + for name, fn := range pkg.Functions { + if pathFilter != "" && !strings.HasPrefix(fn.File, pathFilter) { + continue + } + if nameToTypeFiles[name] == nil { + nameToTypeFiles[name] = make(map[string]map[string]bool) + } + if nameToTypeFiles[name]["FUNC"] == nil { + nameToTypeFiles[name]["FUNC"] = make(map[string]bool) + } + nameToTypeFiles[name]["FUNC"][fn.File] = true + } + + // 提取 Types + for name, typ := range pkg.Types { + if pathFilter != "" && !strings.HasPrefix(typ.FileLine.File, pathFilter) { + continue + } + if nameToTypeFiles[name] == nil { + nameToTypeFiles[name] = make(map[string]map[string]bool) + } + if nameToTypeFiles[name]["TYPE"] == nil { + nameToTypeFiles[name]["TYPE"] = make(map[string]bool) + } + nameToTypeFiles[name]["TYPE"][typ.FileLine.File] = true + } + + // 提取 Vars + for name, v := range pkg.Vars { + if pathFilter != "" && !strings.HasPrefix(v.FileLine.File, pathFilter) { + continue + } + if nameToTypeFiles[name] == nil { + nameToTypeFiles[name] = make(map[string]map[string]bool) + } + if nameToTypeFiles[name]["VAR"] == nil { + nameToTypeFiles[name]["VAR"] = make(map[string]bool) + } + nameToTypeFiles[name]["VAR"][v.FileLine.File] = true } } } - // 创建索引 - idx := SymbolIndex{ - Mtime: mtime, - Data: data, - } + return nameToTypeFiles, nil +} - // 写入 .tmp 再 rename - idxPathTmp := idxPath + ".tmp" - b, err := json.Marshal(idx) +// saveNameToLocations 写回 NameToLocations 到 JSON 文件 +func saveNameToLocations(repoFile string, nameToLocs map[string][]string) error { + data, err := os.ReadFile(repoFile) if err != nil { - return fmt.Errorf("marshal index: %w", err) + return err } - if err := utils.MustWriteFile(idxPathTmp, b); err != nil { - return fmt.Errorf("write index: %w", err) + + // 使用标准库 JSON 反序列化 + var result map[string]interface{} + if err := json.Unmarshal(data, &result); err != nil { + return err } - if err := os.Rename(idxPathTmp, idxPath); err != nil { - return fmt.Errorf("rename index: %w", err) + + // 添加 NameToLocations + result["NameToLocations"] = nameToLocs + + // 重新Marshal(保持缩进格式) + prettyJSON, err := json.MarshalIndent(result, "", " ") + if err != nil { + return err } - return nil + + // 写入 .tmp 再 rename + tmpPath := repoFile + ".tmp" + if err := utils.MustWriteFile(tmpPath, prettyJSON); err != nil { + return err + } + return os.Rename(tmpPath, repoFile) } type Symbol struct { @@ -116,86 +164,100 @@ Only extracts filepath + name (no content), for use with search_node.`, return fmt.Errorf("failed to read repo file: %w", err) } - // 获取所有 mod keys(只遍历 keys) - modKeys, err := getModuleKeys(data) - if err != nil { - return err - } - - var files = make(map[string]map[string][]string) - var indexData = make(map[string][]NameMatch) - - // 遍历所有模块 - for _, modPath := range modKeys { - // 跳过外部模块 - isExtVal, _ := sonic.Get(data, "Modules", modPath, "IsExternal") - if isExt, _ := isExtVal.Bool(); isExt { - continue + // 方式1: 优先用 sonic 读取 NameToLocations + nameToLocsVal, err := sonic.Get(data, "NameToLocations") + if err == nil && nameToLocsVal.Exists() { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] using existing NameToLocations\n") } - // 获取所有 package keys(只遍历 keys) - pkgKeys, err := getPackageKeys(data, modPath) - if err != nil { - continue - } + // 获取所有 name keys + nameToLocsMap, _ := nameToLocsVal.Map() - // 遍历所有包 - for _, pkgPath := range pkgKeys { - // 提取 Functions: 只读取 Name + File(极致按需) - if results, err := iterSymbolNameFile(data, modPath, pkgPath, "Functions"); err == nil { - for _, r := range results { - name, file := r[0], r[1] - if files[file] == nil { - files[file] = map[string][]string{ - "FUNC": {}, - "TYPE": {}, - "VAR": {}, + // 转换为输出格式: file -> type -> names + files := make(map[string]map[string][]string) + for name := range nameToLocsMap { + filesVal, _ := sonic.Get(data, "NameToLocations", name, "Files") + if filesVal.Exists() { + fileList, err := filesVal.Array() + if err == nil { + for _, f := range fileList { + fileStr, _ := f.(string) + if files[fileStr] == nil { + files[fileStr] = map[string][]string{ + "FUNC": {}, + "TYPE": {}, + "VAR": {}, + } } + // NameToLocations 不区分类型,都归为 FUNC + files[fileStr]["FUNC"] = append(files[fileStr]["FUNC"], name) } - files[file]["FUNC"] = append(files[file]["FUNC"], name) - indexData[name] = append(indexData[name], NameMatch{File: file, Type: "FUNC"}) } } + } - // 提取 Types - if results, err := iterSymbolNameFile(data, modPath, pkgPath, "Types"); err == nil { - for _, r := range results { - name, file := r[0], r[1] - if files[file] == nil { - files[file] = map[string][]string{ - "FUNC": {}, - "TYPE": {}, - "VAR": {}, - } - } - files[file]["TYPE"] = append(files[file]["TYPE"], name) - indexData[name] = append(indexData[name], NameMatch{File: file, Type: "TYPE"}) - } + result := ExtractResult{ + RepoName: repoName, + Files: files, + } + b, _ := json.MarshalIndent(result, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil + } + + // 方式2: 没有 NameToLocations,遍历提取并写回 JSON + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] building NameToLocations\n") + } + + // 使用公共函数构建 + nameToTypeFiles, err := buildNameToLocations(data, "") + if err != nil { + return err + } + + // 转换为 NameToLocations 格式: name -> []file + // 拍平 type,只保留 files + nameToLocsMap := make(map[string][]string) + for name, typeFiles := range nameToTypeFiles { + fileSet := make(map[string]bool) + for _, files := range typeFiles { + for file := range files { + fileSet[file] = true } + } + var fileList []string + for file := range fileSet { + fileList = append(fileList, file) + } + nameToLocsMap[name] = fileList + } - // 提取 Vars - if results, err := iterSymbolNameFile(data, modPath, pkgPath, "Vars"); err == nil { - for _, r := range results { - name, file := r[0], r[1] - if files[file] == nil { - files[file] = map[string][]string{ - "FUNC": {}, - "TYPE": {}, - "VAR": {}, - } + // 写回 JSON + if err := saveNameToLocations(repoFile, nameToLocsMap); err != nil { + fmt.Fprintf(os.Stderr, "Warning: failed to save NameToLocations: %v\n", err) + } else if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] saved NameToLocations to %s\n", repoFile) + } + + // 转换为输出格式: file -> type -> names + files := make(map[string]map[string][]string) + for name, typeFiles := range nameToTypeFiles { + for typ, fileSet := range typeFiles { + for file := range fileSet { + if files[file] == nil { + files[file] = map[string][]string{ + "FUNC": {}, + "TYPE": {}, + "VAR": {}, } - files[file]["VAR"] = append(files[file]["VAR"], name) - indexData[name] = append(indexData[name], NameMatch{File: file, Type: "VAR"}) } + files[file][typ] = append(files[file][typ], name) } } } - // 保存索引文件 - if err := saveSymbolIndex(astsDir, repoName, repoFile, indexData); err != nil { - fmt.Fprintf(os.Stderr, "Warning: failed to save index: %v\n", err) - } - // 过滤掉空的 TYPE 和 VAR for file, types := range files { if len(types["TYPE"]) == 0 { @@ -204,7 +266,6 @@ Only extracts filepath + name (no content), for use with search_node.`, if len(types["VAR"]) == 0 { delete(types, "VAR") } - // 如果 FUNC 也空,删除整个文件 if len(types["FUNC"]) == 0 { delete(files, file) } diff --git a/internal/cmd/cli/search_symbol.go b/internal/cmd/cli/search_symbol.go index 778487b3..de7805e5 100644 --- a/internal/cmd/cli/search_symbol.go +++ b/internal/cmd/cli/search_symbol.go @@ -33,6 +33,18 @@ type SearchResult struct { Results map[string]map[string][]string `json:"results"` // file -> type -> names } +const indexDir = ".index" + +type SymbolIndex struct { + Mtime int64 `json:"mtime"` + Data map[string][]NameMatch `json:"data"` // name -> []NameMatch +} + +type NameMatch struct { + File string `json:"file"` + Type string `json:"type"` +} + // loadSymbolIndex 加载符号索引 func loadSymbolIndex(astsDir, repoName, repoFile string) (*SymbolIndex, error) { idxPath := filepath.Join(astsDir, indexDir, repoName+".idx") @@ -105,14 +117,17 @@ func matchName(name, query string) bool { } func newSearchSymbolCmd() *cobra.Command { - return &cobra.Command{ + var pathFilter string + + cmd := &cobra.Command{ Use: "search_symbol ", Short: "Search symbols by name", Long: `Search symbols in a repository by name pattern. Supports substring match, prefix match (query*), suffix match (*query), and wildcard (*query*).`, Example: `abcoder cli search_symbol myrepo GetUser abcoder cli search_symbol myrepo "*User" -abcoder cli search_symbol myrepo "Get*"`, +abcoder cli search_symbol myrepo "Get*" +abcoder cli search_symbol myrepo "Graph" --path "src/main/java/com/uniast/parser"`, Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { astsDir, err := getASTsDir(cmd) @@ -152,6 +167,10 @@ abcoder cli search_symbol myrepo "Get*"`, files, _ := filesVal.Array() for _, f := range files { fileStr, _ := f.(string) + // path 前缀过滤 + if pathFilter != "" && !strings.HasPrefix(fileStr, pathFilter) { + continue + } if results[fileStr] == nil { results[fileStr] = map[string][]string{ "FUNC": {}, @@ -179,30 +198,56 @@ abcoder cli search_symbol myrepo "Get*"`, } } - // 方式2: 回退到 .idx 文件(旧逻辑) + // 方式2: 没有 NameToLocations,构建并写回 JSON if verbose { - fmt.Fprintf(os.Stderr, "[VERBOSE] fallback to .idx file\n") + fmt.Fprintf(os.Stderr, "[VERBOSE] building NameToLocations\n") } - idx, err := loadSymbolIndex(astsDir, repoName, repoFile) + + // 使用公共函数构建 + nameToTypeFiles, err := buildNameToLocations(data, pathFilter) if err != nil { - return fmt.Errorf("failed to load index: %w", err) + return err } - if idx == nil { - return fmt.Errorf("no symbol index found for repo: %s", repoName) + + // 写回 JSON(使用完整 path 构建,否则后续搜索会丢失数据) + fullNameToTypeFiles, err := buildNameToLocations(data, "") + if err == nil { + // 转换为 name -> []file 格式 + fullNameToLocsMap := make(map[string][]string) + for name, typeFiles := range fullNameToTypeFiles { + fileSet := make(map[string]bool) + for _, files := range typeFiles { + for file := range files { + fileSet[file] = true + } + } + var fileList []string + for file := range fileSet { + fileList = append(fileList, file) + } + fullNameToLocsMap[name] = fileList + } + if err := saveNameToLocations(repoFile, fullNameToLocsMap); err != nil { + if verbose { + fmt.Fprintf(os.Stderr, "Warning: failed to save NameToLocations: %v\n", err) + } + } else if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] saved NameToLocations to %s\n", repoFile) + } } - // 搜索 - for name, matches := range idx.Data { - if matchName(name, query) { - for _, m := range matches { - if results[m.File] == nil { - results[m.File] = map[string][]string{ + // 转换为输出格式(全部归为 FUNC,因为 JSON 里没存 type) + for name, typeFiles := range nameToTypeFiles { + for _, fileSet := range typeFiles { + for file := range fileSet { + if results[file] == nil { + results[file] = map[string][]string{ "FUNC": {}, "TYPE": {}, "VAR": {}, } } - results[m.File][m.Type] = append(results[m.File][m.Type], name) + results[file]["FUNC"] = append(results[file]["FUNC"], name) } } } @@ -218,4 +263,8 @@ abcoder cli search_symbol myrepo "Get*"`, return nil }, } + + cmd.Flags().StringVar(&pathFilter, "path", "", "filter by file path prefix (e.g., src/main/java/com/uniast/parser)") + + return cmd } diff --git a/internal/cmd/cli/utils.go b/internal/cmd/cli/utils.go index 0be00013..8abf72cb 100644 --- a/internal/cmd/cli/utils.go +++ b/internal/cmd/cli/utils.go @@ -537,7 +537,7 @@ func getFileSymbolsByFile(data []byte, modPath, pkgPath, filePath string) ([]map return nodes, nil } -// getSymbolReferences 用 sonic 按需读取 Graph 节点的 Dependencies +// getSymbolReferences 用 sonic 按需读取 Graph 节点的 Dependencies 和 References // Identity 格式: {ModPath}?{PkgPath}#{Name} func getSymbolReferences(data []byte, modPath, pkgPath, symbolName string) ([]map[string]string, error) { // Graph key 格式: {ModPath}?{PkgPath}#{Name} @@ -554,16 +554,34 @@ func getSymbolReferences(data []byte, modPath, pkgPath, symbolName string) ([]ma return nil, nil // 没有 Graph 节点,返回空 } - // 尝试 Dependencies 或 References + var refs []map[string]string + + // 读取 Dependencies(当前节点依赖的) depsVal := nodeVal.Get("Dependencies") - if !depsVal.Exists() { - depsVal = nodeVal.Get("References") + if depsVal.Exists() { + deps, err := parseRelationItems(*depsVal, "Dependency") + if err != nil { + return nil, err + } + refs = append(refs, deps...) } - if !depsVal.Exists() { - return nil, nil // 没有依赖 + + // 读取 References(引用当前节点的) + refsVal := nodeVal.Get("References") + if refsVal.Exists() { + refsItems, err := parseRelationItems(*refsVal, "Reference") + if err != nil { + return nil, err + } + refs = append(refs, refsItems...) } - arr, err := depsVal.Array() + return refs, nil +} + +// parseRelationItems 解析关系数组,添加 kind 来源标记 +func parseRelationItems(val ast.Node, kind string) ([]map[string]string, error) { + arr, err := val.Array() if err != nil { return nil, err } @@ -575,9 +593,8 @@ func getSymbolReferences(data []byte, modPath, pkgPath, symbolName string) ([]ma continue } ref := make(map[string]string) - if v, ok := m["Kind"].(string); ok { - ref["kind"] = v - } + // 使用固定的 kind,不依赖 JSON 中的 Kind 字段 + ref["kind"] = kind if v, ok := m["Name"].(string); ok { ref["name"] = v } From 982481f0eadae824ec9960cd886861b7d780fe57 Mon Sep 17 00:00:00 2001 From: simuleite Date: Thu, 5 Mar 2026 12:57:05 +0800 Subject: [PATCH 14/23] Get Mono Current Repo --- internal/cmd/cli/list_repos.go | 109 ++++++++++++++++++--------------- internal/cmd/cli/utils.go | 4 +- 2 files changed, 64 insertions(+), 49 deletions(-) diff --git a/internal/cmd/cli/list_repos.go b/internal/cmd/cli/list_repos.go index 89dbbeef..4058ccf6 100644 --- a/internal/cmd/cli/list_repos.go +++ b/internal/cmd/cli/list_repos.go @@ -19,6 +19,7 @@ import ( "fmt" "os" "path/filepath" + "sort" "strings" "github.com/bytedance/sonic" @@ -32,7 +33,7 @@ func newListReposCmd() *cobra.Command { Short: "List available repositories", Long: `List all available repositories in the AST directory. -The repositories are loaded from .repo_index.json or *.json files in the --asts-dir directory.`, +The repositories are loaded from *.json files in the --asts-dir directory.`, Example: `abcoder cli list-repos`, RunE: func(cmd *cobra.Command, args []string) error { astsDir, err := getASTsDir(cmd) @@ -45,77 +46,89 @@ The repositories are loaded from .repo_index.json or *.json files in the --asts- if err != nil { return err } - - // 尝试从 .repo_index.json 读取映射 - indexFile := filepath.Join(astsDir, ".repo_index.json") - var repoNames []string - var currentRepo string - - if data, err := os.ReadFile(indexFile); err == nil { - // 用 sonic 解析 mappings - mappingsVal, err := sonic.Get(data, "mappings") - if err == nil { - mappings, err := mappingsVal.Map() - if err == nil { - for name, v := range mappings { - repoNames = append(repoNames, name) - // 检查当前目录是否匹配 (mappings value 是文件名,需要检查对应的 json 文件) - if pathMatchesCwd(astsDir, v.(string), cwd) { - currentRepo = name - } - } - } - } + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] cwd: %s\n", cwd) } - // 扫描 JSON 文件,使用 sonic 快速读取 + // 扫描所有 JSON 文件,读取 id 和 path repoNamesMap := make(map[string]struct{}) + var currentRepos []string + type pathItem struct { + id string + path string + } + var pathItems []pathItem + files, err := filepath.Glob(filepath.Join(astsDir, "*.json")) if err != nil { return err } + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] found %d json files\n", len(files)) + } for _, f := range files { // 跳过 _repo_index.json if strings.HasSuffix(f, "_repo_index.json") || strings.HasSuffix(f, ".repo_index.json") { continue } - // 使用 sonic 快速读取 id 字段,避免加载整个 JSON + // 使用 sonic 快速读取 id 和 path 字段 if data, err := os.ReadFile(f); err == nil { - val, err := sonic.Get(data, "id") + // 读取 id + idVal, err := sonic.Get(data, "id") + if err != nil { + continue + } + id, err := idVal.String() + if err != nil || id == "" { + continue + } + repoNamesMap[id] = struct{}{} + + // 读取 path + pathVal, err := sonic.Get(data, "Path") if err == nil { - id, err := val.String() - if err == nil && id != "" { - repoNamesMap[id] = struct{}{} + path, err := pathVal.String() + if err == nil && path != "" { + pathItems = append(pathItems, pathItem{id: id, path: path}) } } - // 尝试读取 Path 字段,检查是否匹配当前目录 - if currentRepo == "" { - val, err := sonic.Get(data, "Path") - if err == nil { - path, err := val.String() - if err == nil && path == cwd { - // 从 id 字段获取名称 - val, err := sonic.Get(data, "id") - if err == nil { - id, err := val.String() - if err == nil && id != "" { - currentRepo = id - } - } - } - } + } + } + + // 按 path 排序,用于前缀匹配时提前退出 + sort.Slice(pathItems, func(i, j int) bool { + return pathItems[i].path < pathItems[j].path + }) + + // 查找 cwd 前缀匹配的 repo + for _, item := range pathItems { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] checking: id=%s, path=%s\n", item.id, item.path) + } + // 如果 path 比 cwd 短,不可能匹配,提前退出 + if len(item.path) < len(cwd) { + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] early exit: path shorter than cwd\n") + } + continue + } + if strings.HasPrefix(item.path, cwd) { + currentRepos = append(currentRepos, item.id) + if verbose { + fmt.Fprintf(os.Stderr, "[VERBOSE] MATCH: id=%s, path=%s\n", item.id, item.path) } } } - repoNames = maps.Keys(repoNamesMap) + + repoNames := maps.Keys(repoNamesMap) type ListReposOutput struct { RepoNames []string `json:"repo_names"` - CurrentRepo string `json:"current_repo,omitempty"` + CurrentRepos []string `json:"current_repos,omitempty"` } resp := ListReposOutput{ - RepoNames: repoNames, - CurrentRepo: currentRepo, + RepoNames: repoNames, + CurrentRepos: currentRepos, } b, _ := json.MarshalIndent(resp, "", " ") fmt.Fprintf(os.Stdout, "%s\n", b) diff --git a/internal/cmd/cli/utils.go b/internal/cmd/cli/utils.go index 8abf72cb..f39ee0b0 100644 --- a/internal/cmd/cli/utils.go +++ b/internal/cmd/cli/utils.go @@ -102,6 +102,7 @@ func loadRepoModules(repoFile string) (map[string]interface{}, error) { } // pathMatchesCwd 检查 mappings 中的文件名对应的 json 文件的 Path 字段是否匹配 cwd +// 支持前缀匹配:cwd 以 path 开头(支持 monorepo 场景) func pathMatchesCwd(astsDir, filename, cwd string) bool { repoFile := filepath.Join(astsDir, filename) data, err := os.ReadFile(repoFile) @@ -116,7 +117,8 @@ func pathMatchesCwd(astsDir, filename, cwd string) bool { if err != nil { return false } - return path == cwd + // 前缀匹配:cwd 以 path 开头 + return strings.HasPrefix(cwd, path) } // loadRepoFileData 读取整个 repo JSON 文件,返回 raw data 供后续 sonic.Get 按需读取 From a95cc261c2ddc80a815c7da8eb130d6d7d203b75 Mon Sep 17 00:00:00 2001 From: simuleite Date: Thu, 5 Mar 2026 13:16:42 +0800 Subject: [PATCH 15/23] Update Skill: search_symbol --path --- .../skills/abcoder__search_symbol/SKILL.md | 15 +++++++++++++-- internal/cmd/cli/list_repos.go | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md b/internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md index f0f054bf..6d31e079 100644 --- a/internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md +++ b/internal/cmd/assets/.claude/skills/abcoder__search_symbol/SKILL.md @@ -1,14 +1,22 @@ --- name: skill__abcoder__search_symbol -description: skill__abcoder__search_symbol `abcoder cli search_symbol ` Search symbols in a repository by name pattern. Supports substring match, prefix match (pattern*), suffix match (*pattern), and wildcard (*pattern*). You MUST call `get_file_symbol` later. +description: skill__abcoder__search_symbol `abcoder cli search_symbol [--path ]` Search symbols in a repository by name pattern. Supports substring match, prefix match (pattern*), suffix match (*pattern), wildcard (*pattern*), and path prefix filtering (--path). You MUST call `get_file_symbol` later. --- Execute the search_symbol command to search symbols by name: ```bash -abcoder cli search_symbol +abcoder cli search_symbol [--path ] ``` +## Arguments + +| Argument | Description | +|----------|-------------| +| `repo_name` | Repository name | +| `pattern` | Symbol name pattern (supports *, regex) | +| `--path` | (optional) Filter by file path prefix (e.g., `src/main/java/com/uniast/parser`) | + ## Examples ```bash @@ -23,6 +31,9 @@ abcoder cli search_symbol myrepo "*User" # Wildcard match - search for symbols containing "GetUser" abcoder cli search_symbol myrepo "*GetUser*" + +# Path filter - search symbols in specific directory +abcoder cli search_symbol myrepo "Graph" --path "src/main/java/com/uniast/parser" ``` ## Output Format diff --git a/internal/cmd/cli/list_repos.go b/internal/cmd/cli/list_repos.go index 4058ccf6..82368131 100644 --- a/internal/cmd/cli/list_repos.go +++ b/internal/cmd/cli/list_repos.go @@ -124,7 +124,7 @@ The repositories are loaded from *.json files in the --asts-dir directory.`, type ListReposOutput struct { RepoNames []string `json:"repo_names"` - CurrentRepos []string `json:"current_repos,omitempty"` + CurrentRepos []string `json:"current_repo,omitempty"` } resp := ListReposOutput{ RepoNames: repoNames, From 428cb8b21b0e8dc92523153173ef429b5c58c87e Mon Sep 17 00:00:00 2001 From: simuleite Date: Fri, 6 Mar 2026 15:39:19 +0800 Subject: [PATCH 16/23] AI: add output field --- internal/cmd/cli/get_file_structure.go | 5 +++++ internal/cmd/cli/get_file_symbol.go | 3 ++- internal/cmd/cli/search_symbol.go | 29 ++++++++++++++++---------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/internal/cmd/cli/get_file_structure.go b/internal/cmd/cli/get_file_structure.go index a01ba5f1..ca48fc37 100644 --- a/internal/cmd/cli/get_file_structure.go +++ b/internal/cmd/cli/get_file_structure.go @@ -67,6 +67,7 @@ Returns a list of functions, types, and variables defined in the file.`, Name string `json:"name"` Line int `json:"line"` Signature string `json:"signature,omitempty"` + TypeKind string `json:"typeKind,omitempty"` // class, typedef, struct, enum, interface } var nodes []Node @@ -78,6 +79,10 @@ Returns a list of functions, types, and variables defined in the file.`, if sig, ok := sym["Signature"].(string); ok { n.Signature = sig } + // 添加 TypeKind (class, typedef, struct, enum, interface) + if tk, ok := sym["TypeKind"].(string); ok && tk != "" { + n.TypeKind = tk + } nodes = append(nodes, n) } diff --git a/internal/cmd/cli/get_file_symbol.go b/internal/cmd/cli/get_file_symbol.go index f0d32f77..0a1cac6a 100644 --- a/internal/cmd/cli/get_file_symbol.go +++ b/internal/cmd/cli/get_file_symbol.go @@ -93,7 +93,8 @@ Returns the symbol's code, type, line number, and relationship with other symbol // 通过 ModPath + PkgPath + Name 反向查找 FilePath filePath := findSymbolFile(data, r["mod_path"], r["pkg_path"], r["name"]) - if r["kind"] == "Dependency" { + // Dependency, Inherit, Implement 都视为依赖关系 + if r["kind"] == "Dependency" || r["kind"] == "Inherit" || r["kind"] == "Implement" { depMap[filePath] = append(depMap[filePath], r["name"]) } else { refMap[filePath] = append(refMap[filePath], r["name"]) diff --git a/internal/cmd/cli/search_symbol.go b/internal/cmd/cli/search_symbol.go index de7805e5..f174c8ab 100644 --- a/internal/cmd/cli/search_symbol.go +++ b/internal/cmd/cli/search_symbol.go @@ -161,10 +161,19 @@ abcoder cli search_symbol myrepo "Graph" --path "src/main/java/com/uniast/parser } for name := range nameToLocs { if matchName(name, query) { + // 支持两种格式: + // 1. 数组格式: {"GetUser": ["src/user.rs"]} + // 2. 对象格式: {"GetUser": {"Files": ["src/user.rs"]}} locVal := nameToLocsVal.Get(name) + var files []interface{} filesVal := locVal.Get("Files") if filesVal.Exists() { - files, _ := filesVal.Array() + files, _ = filesVal.Array() + } else { + // 尝试数组格式 + files, _ = locVal.Array() + } + if len(files) > 0 { for _, f := range files { fileStr, _ := f.(string) // path 前缀过滤 @@ -184,17 +193,15 @@ abcoder cli search_symbol myrepo "Graph" --path "src/main/java/com/uniast/parser } } - // 如果有结果,直接返回 - if len(results) > 0 { - output := SearchResult{ - RepoName: repoName, - Query: query, - Results: results, - } - b, _ := json.MarshalIndent(output, "", " ") - fmt.Fprintf(os.Stdout, "%s\n", b) - return nil + // 无论是否有结果都直接返回 + output := SearchResult{ + RepoName: repoName, + Query: query, + Results: results, } + b, _ := json.MarshalIndent(output, "", " ") + fmt.Fprintf(os.Stdout, "%s\n", b) + return nil } } From 353b80510da92c90948ec89bb8f0873afdd62053 Mon Sep 17 00:00:00 2001 From: simuleite Date: Sat, 7 Mar 2026 15:22:12 +0800 Subject: [PATCH 17/23] Update IDL --- idl/uniast.proto | 270 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 idl/uniast.proto diff --git a/idl/uniast.proto b/idl/uniast.proto new file mode 100644 index 00000000..55a870b2 --- /dev/null +++ b/idl/uniast.proto @@ -0,0 +1,270 @@ +// uniast.proto - UniAST Universal AST Schema +// This file defines the unified AST format for multiple languages +// Currently used by: Go Parser, Rust Parser (via rust-analyzer) + +syntax = "proto3"; + +package uniast; + +option go_package = "github.com/cloudwego/abcoder/lang/uniast"; + +// ============ Core Types ============ +// Language is a simple string: "go", "rust", "cxx", "python", "typescript", "java", "kotlin" + +// ============ Identity System ============ + +// Identity uniquely identifies a node in the AST +// Format: {ModPath}?{PkgPath}#{Name} +// Example: "github.com/user/repo?path/to/pkg#FunctionName" +message Identity { + string mod_path = 1; // module id, unique within a repo + string pkg_path = 2; // path id, unique within a module + string name = 3; // symbol id, unique within a package +} + +// FileLine represents a filename and line number +message FileLine { + string file = 1; // file path relative to repo root + int32 line = 2; // start line number (1-based) + int32 end_line = 5; // end line number (1-based) [新增] + int32 start_offset = 3; // start byte offset in file + int32 end_offset = 4; // end byte offset in file +} + +// ============ Relation System ============ + +// RelationKind represents the type of relationship between nodes +// Using string for JSON compatibility: "Dependency", "Implement", "Inherit", "Group" +message RelationKind { + string value = 1; +} + +// Relation represents a relationship between two nodes +message Relation { + string kind = 1; // kind of relation as string: "Dependency", "Implement", "Inherit", "Group" + // Flat identity fields (for JSON compatibility with Go implementation) + // NOTE: Use uppercase first char so serde(camelCase) produces PascalCase + string ModPath = 6; + string PkgPath = 7; + string Name = 8; + int32 line = 3; // start line-offset relative to current node's codes + string desc = 4; // information about this relation + string codes = 5; // related codes representing this relation +} + +// ============ Repository ============ + +// Repository represents a parsed codebase +message Repository { + string id = 1; // repository name + string ast_version = 2; // uniast version + string tool_version = 3; // abcoder version + string path = 4; // repo absolute path + RepoVersion repo_version = 5; // repository version info + map modules = 6; // module name => module + map graph = 7; // node id => node + + // [新增] name → files 反向索引 + // 加速 search_symbol API,无需独立 .idx 文件 + // 从 File.function_names/type_names/var_names 推导,不冗余 + map name_to_locations = 8; +} + +// NameLocations represents all locations of a symbol name +// [新增] 用于反向索引 name → files +message NameLocations { + repeated string files = 1; // 包含该 name 的文件列表(去重) +} + +// Repository version info +// NOTE: Proto3 JSON conversion uses camelCase by default +// So commit_hash -> CommitHash, parse_time -> ParseTime +message RepoVersion { + string commit_hash = 1; // Git commit hash (JSON: CommitHash) + string parse_time = 2; // Parse timestamp RFC3339 (JSON: ParseTime) +} + +// ============ Module ============ + +// Module represents a single module/package (e.g., Go module, Rust crate) +message Module { + string language = 1; // language: "go", "rust", "cxx", "python", "typescript", "java", "kotlin" + string version = 2; // module version (e.g., "1.0.0") + string name = 3; // module name + string dir = 4; // relative path to repo root + map packages = 5; // package import path => package + map dependencies = 6; // module name => module_path@version + map files = 7; // relative path => file info + repeated string load_errors = 8; // loading errors + string compress_data = 9; // module compress info +} + +// Node represents a symbol node in the graph +// NOTE: For JSON compatibility with Go implementation, use flat format: +// - mod_path, pkg_path, name (扁平 Identity) +// - type (string: "FUNC", "TYPE", "VAR") +// - dependencies, references, implements, inherits, groups (relations) +message Node { + // Flat identity fields (matching Go's embedded Identity) + string mod_path = 1; + string pkg_path = 2; + string name = 3; + + // Node type as string: "FUNC", "TYPE", "VAR" + string type = 4; + + // Unified relation fields + repeated Relation dependencies = 10; + repeated Relation references = 11; + repeated Relation implements = 12; + repeated Relation inherits = 13; + repeated Relation groups = 14; + +} + +// ============ Package ============ + +message Package { + bool is_main = 1; + bool is_test = 2; + string pkg_path = 3; // package import path + map functions = 4; // function name => function + map types = 5; // type name => type + map vars = 6; // var name => var + string compress_data = 7; // package compress info +} + +// ============ File ============ + +// File represents a source file +// Lightweight index: only stores names, full data in Package/Graph +message File { + string path = 1; // relative path to repo root + repeated Import imports = 2; // import statements + + // Identity fields (matching Module/Package hierarchy) + string mod_path = 3; // module path + string pkg_path = 4; // package path + + // Lightweight symbol name index (reference only, full data in Package) + // [新增] Accelerates get_file_structure API + repeated string function_names = 5; + repeated string type_names = 6; + repeated string var_names = 7; +} + +// Import represents an import/use statement +message Import { + string alias = 1; // optional alias + string path = 2; // raw import path +} + +// ============ Function ============ + +// Function represents a function or method +// NOTE: Using flat fields for JSON compatibility with Go implementation +message Function { + bool exported = 1; // if the function is exported + bool is_method = 2; // if it's a method (has receiver) + bool is_interface_method = 3; // if it's an interface method stub + + // Flat identity fields (matching Go's embedded Identity) + string mod_path = 4; + string pkg_path = 5; + string name = 6; + + // Flat FileLine fields + string file = 7; + int32 line = 8; + + string content = 9; // full function source code + string signature = 10; // function signature + + Receiver receiver = 11; // method receiver (if is_method) + repeated Relation params = 12; // function parameters + repeated Relation results = 13; // function return values +} + +// Receiver represents a method receiver +message Receiver { + bool is_pointer = 1; + Identity type = 2; // receiver type identity +} + +// ============ Type ============ + +// Type represents a struct, enum, trait, or interface +message Type { + bool exported = 1; // if the type is exported + TypeKind type_kind = 2; // struct, interface, enum, typedef + Identity identity = 3; // unique identity + FileLine file_line = 4; // location in source + string content = 5; // type declaration source + + // For struct: field types + repeated Relation sub_struct = 6; // field types + repeated Relation inline_struct = 7; // inherited/anonymous fields + + // Methods defined on this type + map methods = 8; + + // Legacy: use implements relation instead + // repeated Identity implements = 9; + + // LLM compress result + string compress_data = 10; +} + +// TypeKind represents the kind of type +enum TypeKind { + STRUCT = 0; + INTERFACE = 1; + TYPEDEF = 2; + ENUM = 3; +} + +// ============ Variable ============ + +// Var represents a variable or constant +message Var { + bool exported = 1; // if the variable is exported + bool is_const = 2; // if it's a constant + bool is_pointer = 3; // if the type is a pointer + Identity identity = 4; // unique identity + FileLine file_line = 5; // location in source + Identity type = 6; // type of the variable + string content = 7; // variable declaration source + + // Legacy: use relations instead + // repeated Dependency dependencies = 8; + + // For enum variants or grouped constants + repeated Identity groups = 9; + + // LLM compress result + string compress_data = 10; +} + +// ============ Rust-Specific Extensions ============ + +// Rust only: Trait represents a Rust trait +message Trait { + Type base = 1; // embed Type + repeated Identity super_traits = 2; // supertraits + map associated_items = 3; // associated items +} + +// Rust only: Impl represents an impl block +message Impl { + bool is_trait_impl = 1; // if it's a trait impl + Identity trait = 2; // trait being implemented (if any) + Identity self_type = 3; // self type + repeated Identity items = 4; // items in the impl block +} + +// Rust only: Macro represents a macro definition +message Macro { + Identity identity = 1; + FileLine file_line = 2; + string body = 3; // macro body +} From 2f9e9b61b37626fa2d5e449807cb0b063f82c189 Mon Sep 17 00:00:00 2001 From: simuleite Date: Thu, 12 Mar 2026 20:53:04 +0800 Subject: [PATCH 18/23] remove uniast json data --- lang/golang/parser/golang.json | 3575 -------------------------------- 1 file changed, 3575 deletions(-) delete mode 100644 lang/golang/parser/golang.json diff --git a/lang/golang/parser/golang.json b/lang/golang/parser/golang.json deleted file mode 100644 index 6578d644..00000000 --- a/lang/golang/parser/golang.json +++ /dev/null @@ -1,3575 +0,0 @@ -{ - "id": "a.b/c", - "ASTVersion": "v0.1.5", - "ToolVersion": "", - "Path": "a.b/c", - "Modules": { - "../.@": { - "Language": "go", - "Version": "", - "Name": "../.", - "Dir": "", - "Packages": { - "a.b/c/pkg": { - "IsMain": false, - "IsTest": false, - "PkgPath": "a.b/c/pkg", - "Functions": { - "CaseStruct.CaseMethod": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod", - "File": "pkg/util.go", - "Line": 42, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func (s *CaseStruct) CaseMethod(in []byte, x *entity.MyStruct) Integer {\n\t_ = json.Unmarshal(in, x)\n\treturn Integer(0)\n}", - "Receiver": { - "IsPointer": true, - "Type": { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct" - } - } - }, - "Case_Func": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func", - "File": "pkg/util.go", - "Line": 25, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func Case_Func(in []byte, s *CaseStruct) error {\n\treturn sonic.Unmarshal(in, s)\n}" - } - }, - "Types": { - "CaseGenericStruct": { - "Exported": true, - "TypeKind": "", - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericStruct", - "File": "pkg/generic.go", - "Line": 30, - "StartOffset": 0, - "EndOffset": 0, - "Content": "type CaseGenericStruct struct{}" - }, - "CaseStruct": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 29, - "StartOffset": 0, - "EndOffset": 0, - "Content": "type CaseStruct struct {\n\tFieldPremitive string\n\tFieldType Integer\n\tFieldExternalType entity.MyStruct\n\tFieldInterface InterfaceA\n\tFieldExternalInterface entity.InterfaceB\n\tFieldClosuer func(in string) int\n}", - "Methods": { - "CaseMethod": { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod" - } - } - }, - "Obj": { - "Exported": true, - "TypeKind": "", - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "Obj", - "File": "pkg/refer.go", - "Line": 37, - "StartOffset": 0, - "EndOffset": 0, - "Content": "type Obj struct{}" - } - }, - "Vars": {} - }, - "a.b/c/pkg/entity": { - "IsMain": false, - "IsTest": false, - "PkgPath": "a.b/c/pkg/entity", - "Functions": {}, - "Types": { - "MyStruct": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/entity/entity.go", - "Line": 23, - "StartOffset": 0, - "EndOffset": 0, - "Content": "type MyStruct struct {\n\ta string\n\tb string\n\tc MyStructC\n\tMyStructD\n\tEmbed struct {\n\t\t*MyStruct\n\t}\n}" - } - }, - "Vars": {} - } - } - }, - "a.b/c": { - "Language": "go", - "Version": "", - "Name": "a.b/c", - "Dir": ".", - "Packages": { - "a.b/c/merge": { - "IsMain": false, - "IsTest": false, - "PkgPath": "a.b/c/merge", - "Functions": { - "CaseMergeRef": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/merge", - "Name": "CaseMergeRef", - "File": "merge/merge_ref.go", - "Line": 25, - "StartOffset": 685, - "EndOffset": 777, - "Content": "func CaseMergeRef() MyStruct {\n\t_ = G1 + G2\n\treturn MyStruct{\n\t\tMyStructD: MyStructD{},\n\t}\n}", - "Signature": "func CaseMergeRef() MyStruct", - "Results": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "merge/merge_ref.go", - "Line": 25, - "StartOffset": 705, - "EndOffset": 713 - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "merge/merge_ref.go", - "Line": 27, - "StartOffset": 737, - "EndOffset": 745 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD", - "File": "merge/merge_ref.go", - "Line": 28, - "StartOffset": 760, - "EndOffset": 769 - } - ], - "GlobalVars": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "G1", - "File": "merge/merge_ref.go", - "Line": 26, - "StartOffset": 721, - "EndOffset": 723 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/merge", - "Name": "G2", - "File": "merge/merge_ref.go", - "Line": 26, - "StartOffset": 726, - "EndOffset": 728 - } - ] - } - }, - "Types": { - "S": { - "Exported": true, - "TypeKind": "typedef", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/merge", - "Name": "S", - "File": "merge/merge_ref.go", - "Line": 23, - "StartOffset": 667, - "EndOffset": 683, - "Content": "type S MyStructD", - "SubStruct": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD", - "File": "merge/merge_ref.go", - "Line": 23, - "StartOffset": 674, - "EndOffset": 683 - } - ] - } - }, - "Vars": { - "G2": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/merge", - "Name": "G2", - "File": "merge/merge_ref.go", - "Line": 19, - "StartOffset": 642, - "EndOffset": 649, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "int" - }, - "Content": "var G2 = G1", - "Dependencies": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "G1", - "File": "merge/merge_ref.go", - "Line": 19, - "StartOffset": 647, - "EndOffset": 649 - } - ] - }, - "I1": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/merge", - "Name": "I1", - "File": "merge/merge_ref.go", - "Line": 21, - "StartOffset": 655, - "EndOffset": 665, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "Integer" - }, - "Content": "var I1 Integer" - } - } - }, - "a.b/c/pkg": { - "IsMain": false, - "IsTest": false, - "PkgPath": "a.b/c/pkg", - "Functions": { - "CaseGenericFunc": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericFunc", - "File": "pkg/generic.go", - "Line": 35, - "StartOffset": 893, - "EndOffset": 1036, - "Content": "func CaseGenericFunc[U InterfaceA, T entity.InterfaceB, V any](a T, b U, c V) string {\n\treturn a.String() + fmt.Sprintf(\"%v\", c) + b.String()\n}", - "Signature": "func CaseGenericFunc[U InterfaceA, T entity.InterfaceB, V any](a T, b U, c V) string", - "Params": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB", - "File": "pkg/generic.go", - "Line": 35, - "StartOffset": 956, - "EndOffset": 959 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA", - "File": "pkg/generic.go", - "Line": 35, - "StartOffset": 961, - "EndOffset": 964 - } - ], - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB.String", - "File": "pkg/generic.go", - "Line": 36, - "StartOffset": 990, - "EndOffset": 996, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA.String", - "File": "pkg/generic.go", - "Line": 36, - "StartOffset": 1026, - "EndOffset": 1032, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA", - "File": "pkg/generic.go", - "Line": 35, - "StartOffset": 914, - "EndOffset": 926 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB", - "File": "pkg/generic.go", - "Line": 35, - "StartOffset": 928, - "EndOffset": 947 - } - ] - }, - "CaseGenericStruct.String": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericStruct.String", - "File": "pkg/generic.go", - "Line": 31, - "StartOffset": 761, - "EndOffset": 891, - "Content": "func (s *CaseGenericStruct[_, _, _]) String() string {\n\treturn s.Prefix.String() + fmt.Sprintf(\"%v\", s.Data) + s.Subfix.String()\n}", - "Signature": "func (s *CaseGenericStruct[_, _, _]) String() string", - "Receiver": { - "IsPointer": true, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericStruct" - } - }, - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB.String", - "File": "pkg/generic.go", - "Line": 32, - "StartOffset": 833, - "EndOffset": 839, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA.String", - "File": "pkg/generic.go", - "Line": 32, - "StartOffset": 881, - "EndOffset": 887, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB", - "File": "pkg/generic.go", - "Line": 31, - "StartOffset": 769, - "EndOffset": 796 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA", - "File": "pkg/generic.go", - "Line": 31, - "StartOffset": 769, - "EndOffset": 796 - } - ] - }, - "CaseInterface.CaseMethodDeps": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": true, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseInterface.CaseMethodDeps", - "File": "pkg/util.go", - "Line": 166, - "StartOffset": 3404, - "EndOffset": 3452, - "Content": "CaseMethodDeps(a int, b entity.MyStruct) Integer", - "Signature": "CaseMethodDeps(a int, b entity.MyStruct) Integer", - "Params": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 166, - "StartOffset": 3426, - "EndOffset": 3443 - } - ], - "Results": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 166, - "StartOffset": 3445, - "EndOffset": 3452 - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 166, - "StartOffset": 3404, - "EndOffset": 3452 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 166, - "StartOffset": 3404, - "EndOffset": 3452 - } - ] - }, - "CaseStrucLiterMethod": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStrucLiterMethod", - "File": "pkg/util.go", - "Line": 146, - "StartOffset": 2920, - "EndOffset": 3193, - "Content": "func CaseStrucLiterMethod() {\n\t_ = (\u0026CaseStruct{\n\t\tFieldPremitive: \"a\",\n\t\tFieldType: 1,\n\t\tFieldExternalType: entity.MyStruct{},\n\t\tFieldInterface: nil,\n\t\tFieldExternalInterface: nil,\n\t\tFieldClosuer: nil,\n\t}).CaseMethod(nil, nil)\n}", - "Signature": "func CaseStrucLiterMethod()", - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod", - "File": "pkg/util.go", - "Line": 154, - "StartOffset": 3171, - "EndOffset": 3181, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 147, - "StartOffset": 2957, - "EndOffset": 2967 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 150, - "StartOffset": 3062, - "EndOffset": 3070 - } - ] - }, - "CaseStruct.CaseMethod": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod", - "File": "pkg/util.go", - "Line": 42, - "StartOffset": 1080, - "EndOffset": 1200, - "Content": "func (s *CaseStruct) CaseMethod(in []byte, x *entity.MyStruct) Integer {\n\t_ = json.Unmarshal(in, x)\n\treturn Integer(0)\n}", - "Signature": "func (s *CaseStruct) CaseMethod(in []byte, x *entity.MyStruct) Integer", - "Receiver": { - "IsPointer": true, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct" - } - }, - "Params": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 42, - "StartOffset": 1123, - "EndOffset": 1141 - } - ], - "Results": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 42, - "StartOffset": 1143, - "EndOffset": 1150 - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 44, - "StartOffset": 1188, - "EndOffset": 1195 - } - ] - }, - "CaseStruct.String": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.String", - "File": "pkg/util.go", - "Line": 47, - "StartOffset": 1202, - "EndOffset": 1279, - "Content": "func (s *CaseStruct) String() string {\n\treturn s.FieldExternalType.String()\n}", - "Signature": "func (s *CaseStruct) String() string", - "Receiver": { - "IsPointer": true, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct" - } - }, - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct.String", - "File": "pkg/util.go", - "Line": 48, - "StartOffset": 1269, - "EndOffset": 1275, - "Extra": { - "IsInvoked": true - } - } - ] - }, - "Case_All": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_All", - "File": "pkg/util.go", - "Line": 77, - "StartOffset": 1668, - "EndOffset": 2120, - "Content": "func Case_All(in string, a entity.MyStruct, b CaseStruct) (int, Integer, entity.Integer) {\n\tvar x entity.Integer\n\tvar y Integer\n\t_ = int(x) + int(y)\n\tvar s CaseStruct\n\t_ = s.CaseMethod(nil, nil)\n\tvar a2 entity.MyStruct\n\t_ = a2.String()\n\tb.FieldClosuer = func(in string) int { return 0 }\n\t_ = b.CaseMethod(nil, nil)\n\ta.MyStructD = entity.MyStructD{}\n\t_ = a.String()\n\t_ = Case_Func(nil, nil)\n\t_ = entity.A(\"\")\n\t_ = GlobalVar + entity.G1\n\treturn 0, 0, 0\n}", - "Signature": "func Case_All(in string, a entity.MyStruct, b CaseStruct) (int, Integer, entity.Integer)", - "Params": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 77, - "StartOffset": 1693, - "EndOffset": 1710 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 77, - "StartOffset": 1712, - "EndOffset": 1724 - } - ], - "Results": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 77, - "StartOffset": 1732, - "EndOffset": 1739 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 77, - "StartOffset": 1741, - "EndOffset": 1755 - } - ], - "FunctionCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func", - "File": "pkg/util.go", - "Line": 89, - "StartOffset": 2038, - "EndOffset": 2047, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "A", - "File": "pkg/util.go", - "Line": 90, - "StartOffset": 2070, - "EndOffset": 2071, - "Extra": { - "IsInvoked": true - } - } - ], - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod", - "File": "pkg/util.go", - "Line": 82, - "StartOffset": 1842, - "EndOffset": 1852, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct.String", - "File": "pkg/util.go", - "Line": 84, - "StartOffset": 1895, - "EndOffset": 1901, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 78, - "StartOffset": 1773, - "EndOffset": 1780 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 79, - "StartOffset": 1788, - "EndOffset": 1795 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 81, - "StartOffset": 1824, - "EndOffset": 1834 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 83, - "StartOffset": 1878, - "EndOffset": 1886 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD", - "File": "pkg/util.go", - "Line": 87, - "StartOffset": 2005, - "EndOffset": 2014 - } - ], - "GlobalVars": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "GlobalVar", - "File": "pkg/util.go", - "Line": 91, - "StartOffset": 2081, - "EndOffset": 2090 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "G1", - "File": "pkg/util.go", - "Line": 91, - "StartOffset": 2100, - "EndOffset": 2102 - } - ], - "Extra": { - "AnonymousFunctions": [ - { - "File": "pkg/util.go", - "Line": 85, - "StartOffset": 1922, - "EndOffset": 1954 - } - ] - } - }, - "Case_Chain_Selector": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Chain_Selector", - "File": "pkg/refer.go", - "Line": 46, - "StartOffset": 994, - "EndOffset": 1056, - "Content": "func Case_Chain_Selector() {\n\tvar obj Obj\n\tobj.Call().Call()\n}", - "Signature": "func Case_Chain_Selector()", - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj.Call", - "File": "pkg/refer.go", - "Line": 48, - "StartOffset": 1048, - "EndOffset": 1052, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj", - "File": "pkg/refer.go", - "Line": 47, - "StartOffset": 1032, - "EndOffset": 1035 - } - ] - }, - "Case_Closure": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Closure", - "File": "pkg/refer.go", - "Line": 51, - "StartOffset": 1058, - "EndOffset": 1148, - "Content": "func Case_Closure() {\n\tvar obj Obj\n\tobj.CallFunc(func(o Obj) Obj {\n\t\treturn o.Call()\n\t})\n}", - "Signature": "func Case_Closure()", - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj.CallFunc", - "File": "pkg/refer.go", - "Line": 53, - "StartOffset": 1098, - "EndOffset": 1106, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj.Call", - "File": "pkg/refer.go", - "Line": 54, - "StartOffset": 1136, - "EndOffset": 1140, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj", - "File": "pkg/refer.go", - "Line": 52, - "StartOffset": 1089, - "EndOffset": 1092 - } - ], - "Extra": { - "AnonymousFunctions": [ - { - "File": "pkg/refer.go", - "Line": 53, - "StartOffset": 1107, - "EndOffset": 1145 - } - ] - } - }, - "Case_Func": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func", - "File": "pkg/util.go", - "Line": 25, - "StartOffset": 697, - "EndOffset": 778, - "Content": "func Case_Func(in []byte, s *CaseStruct) error {\n\treturn sonic.Unmarshal(in, s)\n}", - "Signature": "func Case_Func(in []byte, s *CaseStruct) error", - "Params": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 25, - "StartOffset": 723, - "EndOffset": 736 - } - ], - "FunctionCalls": [ - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Unmarshal", - "File": "pkg/util.go", - "Line": 26, - "StartOffset": 760, - "EndOffset": 769, - "Extra": { - "IsInvoked": true - } - } - ] - }, - "Case_Func_Func": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func_Func", - "File": "pkg/util.go", - "Line": 72, - "StartOffset": 1598, - "EndOffset": 1666, - "Content": "func Case_Func_Func() {\n\t_ = Case_Func(nil, nil)\n\t_ = entity.A(\"\")\n}", - "Signature": "func Case_Func_Func()", - "FunctionCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func", - "File": "pkg/util.go", - "Line": 73, - "StartOffset": 1627, - "EndOffset": 1636, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "A", - "File": "pkg/util.go", - "Line": 74, - "StartOffset": 1659, - "EndOffset": 1660, - "Extra": { - "IsInvoked": true - } - } - ] - }, - "Case_Func_GloabVar": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func_GloabVar", - "File": "pkg/util.go", - "Line": 53, - "StartOffset": 1300, - "EndOffset": 1363, - "Content": "func Case_Func_GloabVar() int {\n\treturn GlobalVar + entity.G1\n}", - "Signature": "func Case_Func_GloabVar() int", - "GlobalVars": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "GlobalVar", - "File": "pkg/util.go", - "Line": 54, - "StartOffset": 1340, - "EndOffset": 1349 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "G1", - "File": "pkg/util.go", - "Line": 54, - "StartOffset": 1359, - "EndOffset": 1361 - } - ] - }, - "Case_Func_Global": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func_Global", - "File": "pkg/util.go", - "Line": 111, - "StartOffset": 2453, - "EndOffset": 2634, - "Content": "func Case_Func_Global() {\n\t_ = Enum1\n\t_ = Enum2\n\t_ = Enum3\n\t_ = Enum4\n\t_ = Var1\n\t_ = Var2\n\t_ = Var3\n\t_ = Var4\n\t_ = Var5\n\t_ = Var6\n\t_ = Var7\n\t_ = Var8\n\t_ = entity.G1\n\t_ = entity.V1\n}", - "Signature": "func Case_Func_Global()", - "GlobalVars": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum1", - "File": "pkg/util.go", - "Line": 112, - "StartOffset": 2484, - "EndOffset": 2489 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum2", - "File": "pkg/util.go", - "Line": 113, - "StartOffset": 2495, - "EndOffset": 2500 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum3", - "File": "pkg/util.go", - "Line": 114, - "StartOffset": 2506, - "EndOffset": 2511 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum4", - "File": "pkg/util.go", - "Line": 115, - "StartOffset": 2517, - "EndOffset": 2522 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var1", - "File": "pkg/util.go", - "Line": 116, - "StartOffset": 2528, - "EndOffset": 2532 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var2", - "File": "pkg/util.go", - "Line": 117, - "StartOffset": 2538, - "EndOffset": 2542 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var3", - "File": "pkg/util.go", - "Line": 118, - "StartOffset": 2548, - "EndOffset": 2552 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var4", - "File": "pkg/util.go", - "Line": 119, - "StartOffset": 2558, - "EndOffset": 2562 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var5", - "File": "pkg/util.go", - "Line": 120, - "StartOffset": 2568, - "EndOffset": 2572 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var6", - "File": "pkg/util.go", - "Line": 121, - "StartOffset": 2578, - "EndOffset": 2582 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var7", - "File": "pkg/util.go", - "Line": 122, - "StartOffset": 2588, - "EndOffset": 2592 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var8", - "File": "pkg/util.go", - "Line": 123, - "StartOffset": 2598, - "EndOffset": 2602 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "G1", - "File": "pkg/util.go", - "Line": 124, - "StartOffset": 2615, - "EndOffset": 2617 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "V1", - "File": "pkg/util.go", - "Line": 125, - "StartOffset": 2630, - "EndOffset": 2632 - } - ] - }, - "Case_Func_Method": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func_Method", - "File": "pkg/util.go", - "Line": 65, - "StartOffset": 1478, - "EndOffset": 1596, - "Content": "func Case_Func_Method() {\n\ts := \u0026CaseStruct{}\n\t_ = s.CaseMethod(nil, nil)\n\ts2 := \u0026entity.MyStruct{}\n\t_ = s2.String()\n}", - "Signature": "func Case_Func_Method()", - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod", - "File": "pkg/util.go", - "Line": 67, - "StartOffset": 1531, - "EndOffset": 1541, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct.String", - "File": "pkg/util.go", - "Line": 69, - "StartOffset": 1586, - "EndOffset": 1592, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 66, - "StartOffset": 1511, - "EndOffset": 1521 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 68, - "StartOffset": 1567, - "EndOffset": 1575 - } - ] - }, - "Case_Func_RefType": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func_RefType", - "File": "pkg/util.go", - "Line": 59, - "StartOffset": 1383, - "EndOffset": 1476, - "Content": "func Case_Func_RefType() int {\n\tvar x entity.Integer\n\tvar y Integer\n\treturn int(x) + int(y)\n}", - "Signature": "func Case_Func_RefType() int", - "Types": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 60, - "StartOffset": 1428, - "EndOffset": 1435 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 61, - "StartOffset": 1443, - "EndOffset": 1450 - } - ] - }, - "Case_Refer_Func": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Refer_Func", - "File": "pkg/refer.go", - "Line": 24, - "StartOffset": 706, - "EndOffset": 773, - "Content": "func Case_Refer_Func() {\n\tsonic.Get(nil, \"\")\n\tsonic.Pretouch(nil)\n}", - "Signature": "func Case_Refer_Func()", - "FunctionCalls": [ - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Get", - "File": "pkg/refer.go", - "Line": 25, - "StartOffset": 738, - "EndOffset": 741, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Pretouch", - "File": "pkg/refer.go", - "Line": 26, - "StartOffset": 758, - "EndOffset": 766, - "Extra": { - "IsInvoked": true - } - } - ] - }, - "Case_Refer_Method": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Refer_Method", - "File": "pkg/refer.go", - "Line": 29, - "StartOffset": 775, - "EndOffset": 835, - "Content": "func Case_Refer_Method() {\n\tn := sonic.Config{}\n\tn.Froze()\n}", - "Signature": "func Case_Refer_Method()", - "MethodCalls": [ - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config.Froze", - "File": "pkg/refer.go", - "Line": 31, - "StartOffset": 826, - "EndOffset": 831, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config", - "File": "pkg/refer.go", - "Line": 30, - "StartOffset": 814, - "EndOffset": 820 - } - ] - }, - "InterfaceA.String": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": true, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA.String", - "File": "pkg/util.go", - "Line": 39, - "StartOffset": 1061, - "EndOffset": 1076, - "Content": "String() string", - "Signature": "String() string" - }, - "Obj.Call": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj.Call", - "File": "pkg/refer.go", - "Line": 38, - "StartOffset": 894, - "EndOffset": 931, - "Content": "func (o Obj) Call() Obj {\n\treturn o\n}", - "Signature": "func (o Obj) Call() Obj", - "Receiver": { - "IsPointer": false, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj" - } - }, - "Results": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj", - "File": "pkg/refer.go", - "Line": 38, - "StartOffset": 914, - "EndOffset": 917 - } - ] - }, - "Obj.CallFunc": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj.CallFunc", - "File": "pkg/refer.go", - "Line": 42, - "StartOffset": 933, - "EndOffset": 992, - "Content": "func (o Obj) CallFunc(f func(Obj) Obj) Obj {\n\treturn f(o)\n}", - "Signature": "func (o Obj) CallFunc(f func(Obj) Obj) Obj", - "Receiver": { - "IsPointer": false, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj" - } - }, - "Params": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj", - "File": "pkg/refer.go", - "Line": 42, - "StartOffset": 955, - "EndOffset": 970 - } - ], - "Results": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj", - "File": "pkg/refer.go", - "Line": 42, - "StartOffset": 972, - "EndOffset": 975 - } - ] - } - }, - "Types": { - "CaseGenericStruct": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericStruct", - "File": "pkg/generic.go", - "Line": 25, - "StartOffset": 654, - "EndOffset": 759, - "Content": "type CaseGenericStruct[T entity.InterfaceB, U InterfaceA, V any] struct {\n\tPrefix T\n\tSubfix U\n\tData V\n}", - "SubStruct": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB", - "File": "pkg/generic.go", - "Line": 26, - "StartOffset": 736, - "EndOffset": 737 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA", - "File": "pkg/generic.go", - "Line": 27, - "StartOffset": 746, - "EndOffset": 747 - } - ], - "Methods": { - "String": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericStruct.String" - } - }, - "Implements": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA" - } - ] - }, - "CaseInterface": { - "Exported": true, - "TypeKind": "interface", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseInterface", - "File": "pkg/util.go", - "Line": 165, - "StartOffset": 3372, - "EndOffset": 3454, - "Content": "type CaseInterface interface {\n\tCaseMethodDeps(a int, b entity.MyStruct) Integer\n}", - "SubStruct": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 166, - "StartOffset": 3418, - "EndOffset": 3452 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 166, - "StartOffset": 3418, - "EndOffset": 3452 - } - ], - "Methods": { - "CaseMethodDeps": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseInterface.CaseMethodDeps" - } - } - }, - "CaseStruct": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 29, - "StartOffset": 780, - "EndOffset": 1030, - "Content": "type CaseStruct struct {\n\tFieldPremitive string\n\tFieldType Integer\n\tFieldExternalType entity.MyStruct\n\tFieldInterface InterfaceA\n\tFieldExternalInterface entity.InterfaceB\n\tFieldClosuer func(in string) int\n}", - "SubStruct": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 31, - "StartOffset": 860, - "EndOffset": 867 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 32, - "StartOffset": 892, - "EndOffset": 907 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA", - "File": "pkg/util.go", - "Line": 33, - "StartOffset": 932, - "EndOffset": 942 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB", - "File": "pkg/util.go", - "Line": 34, - "StartOffset": 967, - "EndOffset": 984 - } - ], - "Methods": { - "CaseMethod": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod" - }, - "String": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.String" - } - }, - "Implements": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA" - } - ] - }, - "Case_Annoy_Struct": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Annoy_Struct", - "File": "pkg/refer.go", - "Line": 58, - "StartOffset": 1150, - "EndOffset": 1213, - "Content": "type Case_Annoy_Struct struct {\n\tA struct {\n\t\tB int\n\t}\n\tC int\n}" - }, - "Case_Refer_Type": { - "Exported": true, - "TypeKind": "typedef", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Refer_Type", - "File": "pkg/refer.go", - "Line": 22, - "StartOffset": 671, - "EndOffset": 704, - "Content": "type Case_Refer_Type sonic.Config", - "SubStruct": [ - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config", - "File": "pkg/refer.go", - "Line": 22, - "StartOffset": 692, - "EndOffset": 704 - } - ] - }, - "Integer": { - "Exported": true, - "TypeKind": "typedef", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 57, - "StartOffset": 1365, - "EndOffset": 1381, - "Content": "type Integer int" - }, - "InterfaceA": { - "Exported": true, - "TypeKind": "interface", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA", - "File": "pkg/util.go", - "Line": 38, - "StartOffset": 1032, - "EndOffset": 1078, - "Content": "type InterfaceA interface {\n\tString() string\n}", - "Methods": { - "String": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA.String" - } - } - }, - "Obj": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj", - "File": "pkg/refer.go", - "Line": 36, - "StartOffset": 875, - "EndOffset": 892, - "Content": "type Obj struct{}", - "Methods": { - "Call": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj.Call" - }, - "CallFunc": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Obj.CallFunc" - } - } - }, - "Type": { - "Exported": true, - "TypeKind": "typedef", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Type", - "File": "pkg/util.go", - "Line": 129, - "StartOffset": 2659, - "EndOffset": 2672, - "Content": "type Type int" - } - }, - "Vars": { - "CaseGenericVar": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericVar", - "File": "pkg/generic.go", - "Line": 39, - "StartOffset": 1042, - "EndOffset": 1110, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseGenericStruct" - }, - "Content": "var CaseGenericVar CaseGenericStruct[entity.InterfaceB, InterfaceA, int]", - "Dependencies": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB", - "File": "pkg/generic.go", - "Line": 39, - "StartOffset": 1057, - "EndOffset": 1110 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA", - "File": "pkg/generic.go", - "Line": 39, - "StartOffset": 1057, - "EndOffset": 1110 - } - ] - }, - "CaseVarFunc": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseVarFunc", - "File": "pkg/util.go", - "Line": 157, - "StartOffset": 3199, - "EndOffset": 3370, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct" - }, - "Content": "var CaseVarFunc CaseStruct = func() CaseStruct {\n\treturn CaseStruct{\n\t\tFieldPremitive: Var4,\n\t\tFieldType: Integer(1),\n\t\tFieldExternalType: entity.MyStruct{},\n\t}\n}()", - "Dependencies": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var4", - "File": "pkg/util.go", - "Line": 159, - "StartOffset": 3285, - "EndOffset": 3289 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "pkg/util.go", - "Line": 157, - "StartOffset": 3231, - "EndOffset": 3241 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Integer", - "File": "pkg/util.go", - "Line": 160, - "StartOffset": 3312, - "EndOffset": 3319, - "Extra": { - "IsInvoked": true - } - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/util.go", - "Line": 161, - "StartOffset": 3352, - "EndOffset": 3360 - } - ], - "Extra": { - "AnonymousFunctions": [ - { - "File": "pkg/util.go", - "Line": 157, - "StartOffset": 3224, - "EndOffset": 3368 - } - ] - } - }, - "Case_Ref_Const": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Ref_Const", - "File": "pkg/refer.go", - "Line": 65, - "StartOffset": 1221, - "EndOffset": 1247, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "untyped int" - }, - "Content": "const Case_Ref_Const = entity.G1", - "Dependencies": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "G1", - "File": "pkg/refer.go", - "Line": 65, - "StartOffset": 1238, - "EndOffset": 1247 - } - ] - }, - "Case_Refer_Var": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Refer_Var", - "File": "pkg/refer.go", - "Line": 34, - "StartOffset": 841, - "EndOffset": 873, - "Type": { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "API" - }, - "Content": "var Case_Refer_Var = sonic.ConfigStd", - "Dependencies": [ - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "ConfigStd", - "File": "pkg/refer.go", - "Line": 34, - "StartOffset": 864, - "EndOffset": 873 - } - ] - }, - "Enum1": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum1", - "File": "pkg/util.go", - "Line": 96, - "StartOffset": 2131, - "EndOffset": 2154, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "untyped int" - }, - "Content": "const Enum1 = 1", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum3" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum4" - } - ] - }, - "Enum2": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum2", - "File": "pkg/util.go", - "Line": 97, - "StartOffset": 2156, - "EndOffset": 2182, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "untyped int" - }, - "Content": "const Enum2, Enum3 = 2, 3" - }, - "Enum3": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum3", - "File": "pkg/util.go", - "Line": 97, - "StartOffset": 2156, - "EndOffset": 2182, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "untyped int" - }, - "Content": "const Enum2, Enum3 = 2, 3", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum1" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum4" - } - ] - }, - "Enum4": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum4", - "File": "pkg/util.go", - "Line": 98, - "StartOffset": 2184, - "EndOffset": 2209, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "string" - }, - "Content": "const Enum4 string = \"4\"", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum1" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Enum3" - } - ] - }, - "False": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "False", - "File": "pkg/util.go", - "Line": 135, - "StartOffset": 2765, - "EndOffset": 2770, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Type" - }, - "Content": "const False = 1", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Null" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Number" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "String" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "True" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "JSON" - } - ] - }, - "GlobalVar": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "GlobalVar", - "File": "pkg/util.go", - "Line": 51, - "StartOffset": 1285, - "EndOffset": 1298, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "int" - }, - "Content": "var GlobalVar int" - }, - "JSON": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "JSON", - "File": "pkg/util.go", - "Line": 143, - "StartOffset": 2912, - "EndOffset": 2916, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Type" - }, - "Content": "const JSON = 5", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Null" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "False" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Number" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "String" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "True" - } - ] - }, - "Null": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Null", - "File": "pkg/util.go", - "Line": 133, - "StartOffset": 2713, - "EndOffset": 2729, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Type" - }, - "Content": "const Null Type = iota", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "False" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Number" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "String" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "True" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "JSON" - } - ] - }, - "Number": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Number", - "File": "pkg/util.go", - "Line": 137, - "StartOffset": 2798, - "EndOffset": 2804, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Type" - }, - "Content": "const Number = 2", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Null" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "False" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "String" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "True" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "JSON" - } - ] - }, - "String": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "String", - "File": "pkg/util.go", - "Line": 139, - "StartOffset": 2834, - "EndOffset": 2840, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Type" - }, - "Content": "const String = 3", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Null" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "False" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Number" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "True" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "JSON" - } - ] - }, - "True": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "True", - "File": "pkg/util.go", - "Line": 141, - "StartOffset": 2874, - "EndOffset": 2878, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Type" - }, - "Content": "const True = 4", - "Groups": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Null" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "False" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Number" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "String" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "JSON" - } - ] - }, - "Var1": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var1", - "File": "pkg/util.go", - "Line": 102, - "StartOffset": 2220, - "EndOffset": 2241, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "int" - }, - "Content": "var Var1 = 1" - }, - "Var2": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var2", - "File": "pkg/util.go", - "Line": 103, - "StartOffset": 2243, - "EndOffset": 2267, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "int" - }, - "Content": "var Var2, Var3 = 2, 3" - }, - "Var3": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var3", - "File": "pkg/util.go", - "Line": 103, - "StartOffset": 2243, - "EndOffset": 2267, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "int" - }, - "Content": "var Var2, Var3 = 2, 3" - }, - "Var4": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var4", - "File": "pkg/util.go", - "Line": 104, - "StartOffset": 2269, - "EndOffset": 2292, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "string" - }, - "Content": "var Var4 string = \"4\"" - }, - "Var5": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var5", - "File": "pkg/util.go", - "Line": 105, - "StartOffset": 2294, - "EndOffset": 2327, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "[]string" - }, - "Content": "var Var5 = []string{\"a\"}" - }, - "Var6": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var6", - "File": "pkg/util.go", - "Line": 106, - "StartOffset": 2329, - "EndOffset": 2358, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "func()" - }, - "Content": "var Var6 = func() {}", - "Extra": { - "AnonymousFunctions": [ - { - "File": "pkg/util.go", - "Line": 106, - "StartOffset": 2349, - "EndOffset": 2358 - } - ] - } - }, - "Var7": { - "IsExported": true, - "IsConst": false, - "IsPointer": true, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var7", - "File": "pkg/util.go", - "Line": 107, - "StartOffset": 2360, - "EndOffset": 2413, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "*bool" - }, - "Content": "var Var7 = flag.Bool(\"flag\", false, \"usage\")" - }, - "Var8": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "Var8", - "File": "pkg/util.go", - "Line": 108, - "StartOffset": 2415, - "EndOffset": 2449, - "Type": { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config" - }, - "Content": "var Var8 = sonic.Config{}", - "Dependencies": [ - { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config", - "File": "pkg/util.go", - "Line": 108, - "StartOffset": 2441, - "EndOffset": 2447 - } - ] - } - } - }, - "a.b/c/pkg/entity": { - "IsMain": false, - "IsTest": false, - "PkgPath": "a.b/c/pkg/entity", - "Functions": { - "A": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "A", - "File": "pkg/entity/entity.go", - "Line": 55, - "StartOffset": 1132, - "EndOffset": 1173, - "Content": "func A(in string) int {\n\treturn len(in)\n}", - "Signature": "func A(in string) int" - }, - "InterfaceB.String": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": true, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB.String", - "File": "pkg/entity/entity.go", - "Line": 34, - "StartOffset": 796, - "EndOffset": 811, - "Content": "String() string", - "Signature": "String() string" - }, - "MyStruct.String": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct.String", - "File": "pkg/entity/entity.go", - "Line": 37, - "StartOffset": 815, - "EndOffset": 929, - "Content": "func (a MyStruct) String() string {\n\t_ = a.Embed.MyStruct\n\t_ = a.MyStructD\n\treturn \"base struct\" + a.DFunction()\n}", - "Signature": "func (a MyStruct) String() string", - "Receiver": { - "IsPointer": false, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct" - } - }, - "MethodCalls": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD.DFunction", - "File": "pkg/entity/entity.go", - "Line": 40, - "StartOffset": 916, - "EndOffset": 925, - "Extra": { - "IsInvoked": true - } - } - ] - }, - "MyStructC.String": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructC.String", - "File": "pkg/entity/entity.go", - "Line": 47, - "StartOffset": 1006, - "EndOffset": 1067, - "Content": "func (c MyStructC) String() string {\n\treturn \"I'm struct c\"\n}", - "Signature": "func (c MyStructC) String() string", - "Receiver": { - "IsPointer": false, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructC" - } - } - }, - "MyStructD.DFunction": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD.DFunction", - "File": "pkg/entity/entity.go", - "Line": 43, - "StartOffset": 931, - "EndOffset": 1004, - "Content": "func (c MyStructD) DFunction() string {\n\treturn \"I'm struct d function\"\n}", - "Signature": "func (c MyStructD) DFunction() string", - "Receiver": { - "IsPointer": false, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD" - } - } - }, - "MyStructD.String": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD.String", - "File": "pkg/entity/entity.go", - "Line": 51, - "StartOffset": 1069, - "EndOffset": 1130, - "Content": "func (c MyStructD) String() string {\n\treturn \"I'm struct d\"\n}", - "Signature": "func (c MyStructD) String() string", - "Receiver": { - "IsPointer": false, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD" - } - } - } - }, - "Types": { - "Integer": { - "Exported": true, - "TypeKind": "typedef", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "Integer", - "File": "pkg/entity/entity.go", - "Line": 61, - "StartOffset": 1189, - "EndOffset": 1205, - "Content": "type Integer int" - }, - "InterfaceB": { - "Exported": true, - "TypeKind": "interface", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB", - "File": "pkg/entity/entity.go", - "Line": 33, - "StartOffset": 767, - "EndOffset": 813, - "Content": "type InterfaceB interface {\n\tString() string\n}", - "Methods": { - "String": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB.String" - } - } - }, - "MyStruct": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/entity/entity.go", - "Line": 23, - "StartOffset": 666, - "EndOffset": 765, - "Content": "type MyStruct struct {\n\ta string\n\tb string\n\tc MyStructC\n\tMyStructD\n\tEmbed struct {\n\t\t*MyStruct\n\t}\n}", - "SubStruct": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD", - "File": "pkg/entity/entity.go", - "Line": 27, - "StartOffset": 723, - "EndOffset": 732 - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "pkg/entity/entity.go", - "Line": 29, - "StartOffset": 751, - "EndOffset": 760 - } - ], - "InlineStruct": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD", - "File": "pkg/entity/entity.go", - "Line": 27, - "StartOffset": 723, - "EndOffset": 732 - } - ], - "Methods": { - "String": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct.String" - } - }, - "Implements": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA" - } - ] - }, - "MyStructC": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructC", - "File": "pkg/entity/entity.go", - "Line": 17, - "StartOffset": 612, - "EndOffset": 637, - "Content": "type MyStructC struct {\n}", - "Methods": { - "String": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructC.String" - } - }, - "Implements": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB" - } - ] - }, - "MyStructD": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD", - "File": "pkg/entity/entity.go", - "Line": 20, - "StartOffset": 639, - "EndOffset": 664, - "Content": "type MyStructD struct {\n}", - "Methods": { - "DFunction": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD.DFunction" - }, - "String": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStructD.String" - } - }, - "Implements": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "InterfaceB" - }, - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg", - "Name": "InterfaceA" - } - ] - } - }, - "Vars": { - "G1": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "G1", - "File": "pkg/entity/entity.go", - "Line": 59, - "StartOffset": 1181, - "EndOffset": 1187, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "untyped int" - }, - "Content": "const G1 = 1" - }, - "V1": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "V1", - "File": "pkg/entity/entity.go", - "Line": 63, - "StartOffset": 1211, - "EndOffset": 1226, - "Type": { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "Integer" - }, - "Content": "var V1 = Integer(1)", - "Dependencies": [ - { - "ModPath": "a.b/c", - "PkgPath": "a.b/c/pkg/entity", - "Name": "Integer", - "File": "pkg/entity/entity.go", - "Line": 63, - "StartOffset": 1216, - "EndOffset": 1223, - "Extra": { - "IsInvoked": true - } - } - ] - } - } - } - }, - "Dependencies": { - "a.b/c": "a.b/c@7361f67ef606a7ab7dcf1b6d7ebcf1e0188b00f8", - "github.com/bytedance/sonic": "github.com/bytedance/sonic@v1.10.2", - "golang.org/x/arch": "golang.org/x/arch@v0.0.0-20210923205945-b76863e36670" - }, - "Files": { - "cmd/go.mod": { - "Path": "cmd/go.mod" - }, - "cmd/go.sum": { - "Path": "cmd/go.sum" - }, - "cmd/main.go": { - "Path": "cmd/main.go" - }, - "cmd/serdes.go": { - "Path": "cmd/serdes.go" - }, - "go.mod": { - "Path": "go.mod" - }, - "go.sum": { - "Path": "go.sum" - }, - "merge/merge_ref.go": { - "Path": "merge/merge_ref.go", - "Imports": [ - { - "Alias": ".", - "Path": "\"a.b/c/pkg/entity\"" - } - ], - "Package": "a.b/c/merge" - }, - "pkg/entity/entity.go": { - "Path": "pkg/entity/entity.go", - "Package": "a.b/c/pkg/entity" - }, - "pkg/generic.go": { - "Path": "pkg/generic.go", - "Imports": [ - { - "Path": "\"fmt\"" - }, - { - "Path": "\"a.b/c/pkg/entity\"" - } - ], - "Package": "a.b/c/pkg" - }, - "pkg/refer.go": { - "Path": "pkg/refer.go", - "Imports": [ - { - "Path": "\"a.b/c/pkg/entity\"" - }, - { - "Path": "\"github.com/bytedance/sonic\"" - } - ], - "Package": "a.b/c/pkg" - }, - "pkg/util.go": { - "Path": "pkg/util.go", - "Imports": [ - { - "Path": "\"encoding/json\"" - }, - { - "Path": "\"flag\"" - }, - { - "Path": "\"a.b/c/pkg/entity\"" - }, - { - "Path": "\"github.com/bytedance/sonic\"" - } - ], - "Package": "a.b/c/pkg" - } - } - }, - "a.b/c/cmdx": { - "Language": "go", - "Version": "", - "Name": "a.b/c/cmdx", - "Dir": "cmd", - "Packages": { - "a.b/c/cmdx": { - "IsMain": true, - "IsTest": false, - "PkgPath": "a.b/c/cmdx", - "Functions": { - "DuplicateName": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "DuplicateName", - "File": "cmd/serdes.go", - "Line": 36, - "StartOffset": 912, - "EndOffset": 936, - "Content": "func DuplicateName() {\n}", - "Signature": "func DuplicateName()" - }, - "InternalFunc": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "InternalFunc", - "File": "cmd/serdes.go", - "Line": 25, - "StartOffset": 692, - "EndOffset": 910, - "Content": "func InternalFunc(in []byte) {\n\tvar s = new(pkg.CaseStruct)\n\tif err := pkg.Case_Func(in, s); err != nil {\n\t\tprintln(err.Error())\n\t}\n\tvar x = new(entity.MyStruct)\n\tif v := s.CaseMethod(in, x); v != 0 {\n\t\tprintln(v)\n\t}\n}", - "Signature": "func InternalFunc(in []byte)", - "FunctionCalls": [ - { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "Case_Func", - "File": "cmd/serdes.go", - "Line": 27, - "StartOffset": 767, - "EndOffset": 776, - "Extra": { - "IsInvoked": true - } - } - ], - "MethodCalls": [ - { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod", - "File": "cmd/serdes.go", - "Line": 31, - "StartOffset": 865, - "EndOffset": 875, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "cmd/serdes.go", - "Line": 26, - "StartOffset": 740, - "EndOffset": 750 - }, - { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg/entity", - "Name": "MyStruct", - "File": "cmd/serdes.go", - "Line": 30, - "StartOffset": 844, - "EndOffset": 852 - } - ] - }, - "Struct.DuplicateName": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct.DuplicateName", - "File": "cmd/serdes.go", - "Line": 55, - "StartOffset": 1238, - "EndOffset": 1283, - "Content": "func (s *Struct) DuplicateName(in []byte) {\n}", - "Signature": "func (s *Struct) DuplicateName(in []byte)", - "Receiver": { - "IsPointer": true, - "Type": { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct" - } - } - }, - "Struct.InternalMethod": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct.InternalMethod", - "File": "cmd/serdes.go", - "Line": 46, - "StartOffset": 1045, - "EndOffset": 1236, - "Content": "func (s *Struct) InternalMethod(in []byte) {\n\tif err := sonic.Unmarshal(in, \u0026s); err != nil {\n\t\tprintln(err.Error())\n\t}\n\tif err := s.Field2.CaseMethod(in, nil); err != 0 {\n\t\tprintln(err)\n\t}\n}", - "Signature": "func (s *Struct) InternalMethod(in []byte)", - "Receiver": { - "IsPointer": true, - "Type": { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct" - } - }, - "FunctionCalls": [ - { - "ModPath": "github.com/bytedance/sonic@v1.11.3", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Unmarshal", - "File": "cmd/serdes.go", - "Line": 47, - "StartOffset": 1107, - "EndOffset": 1116, - "Extra": { - "IsInvoked": true - } - } - ], - "MethodCalls": [ - { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct.CaseMethod", - "File": "cmd/serdes.go", - "Line": 50, - "StartOffset": 1185, - "EndOffset": 1195, - "Extra": { - "IsInvoked": true - } - } - ] - }, - "main": { - "Exported": false, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "main", - "File": "cmd/main.go", - "Line": 24, - "StartOffset": 667, - "EndOffset": 981, - "Content": "func main() {\n\tif len(os.Args) \u003c 2 {\n\t\tprintln(\"missing argument\")\n\t\tos.Exit(1)\n\t}\n\t// content, err := readFile(os.Args[1])\n\t// if err != nil {\n\t// \tprintln(err.Error())\n\t// \tos.Exit(1)\n\t// }\n\tcontent := []byte(\"{}\")\n\tInternalFunc(content)\n\tvar s = new(Struct)\n\ts.Field4 = InternalFunc\n\ts.InternalMethod(content)\n}", - "Signature": "func main()", - "FunctionCalls": [ - { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "InternalFunc", - "File": "cmd/main.go", - "Line": 35, - "StartOffset": 885, - "EndOffset": 897, - "Extra": { - "IsInvoked": true - } - } - ], - "MethodCalls": [ - { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct.InternalMethod", - "File": "cmd/main.go", - "Line": 38, - "StartOffset": 956, - "EndOffset": 970, - "Extra": { - "IsInvoked": true - } - } - ], - "Types": [ - { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct", - "File": "cmd/main.go", - "Line": 36, - "StartOffset": 920, - "EndOffset": 926 - } - ] - }, - "readFile": { - "Exported": false, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "readFile", - "File": "cmd/main.go", - "Line": 41, - "StartOffset": 983, - "EndOffset": 1181, - "Content": "func readFile(path string) ([]byte, error) {\n\tfile, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open file\")\n\t}\n\tdefer file.Close()\n\n\treturn ioutil.ReadAll(file)\n}", - "Signature": "func readFile(path string) ([]byte, error)", - "FunctionCalls": [ - { - "ModPath": "github.com/pkg/errors@v0.9.1", - "PkgPath": "github.com/pkg/errors", - "Name": "Wrap", - "File": "cmd/main.go", - "Line": 44, - "StartOffset": 1094, - "EndOffset": 1098, - "Extra": { - "IsInvoked": true - } - } - ] - } - }, - "Types": { - "Struct": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct", - "File": "cmd/serdes.go", - "Line": 39, - "StartOffset": 938, - "EndOffset": 1043, - "Content": "type Struct struct {\n\tField1 string\n\tField2 pkg.CaseStruct\n\tField3 sonic.Config\n\tField4 func(in []byte)\n}", - "SubStruct": [ - { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct", - "File": "cmd/serdes.go", - "Line": 41, - "StartOffset": 982, - "EndOffset": 996 - }, - { - "ModPath": "github.com/bytedance/sonic@v1.11.3", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config", - "File": "cmd/serdes.go", - "Line": 42, - "StartOffset": 1005, - "EndOffset": 1017 - } - ], - "Methods": { - "DuplicateName": { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct.DuplicateName" - }, - "InternalMethod": { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct.InternalMethod" - } - } - } - }, - "Vars": { - "Con1": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Con1", - "File": "cmd/serdes.go", - "Line": 72, - "StartOffset": 1464, - "EndOffset": 1482, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "untyped int" - }, - "Content": "const Con1, Con2 = 1, \"\"" - }, - "Con2": { - "IsExported": true, - "IsConst": true, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Con2", - "File": "cmd/serdes.go", - "Line": 72, - "StartOffset": 1464, - "EndOffset": 1482, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "untyped string" - }, - "Content": "const Con1, Con2 = 1, \"\"" - }, - "Var1": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Var1", - "File": "cmd/serdes.go", - "Line": 70, - "StartOffset": 1438, - "EndOffset": 1456, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "int" - }, - "Content": "var Var1, Var2 = 1, \"\"" - }, - "Var2": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Var2", - "File": "cmd/serdes.go", - "Line": 70, - "StartOffset": 1438, - "EndOffset": 1456, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "string" - }, - "Content": "var Var1, Var2 = 1, \"\"" - }, - "VarFunc": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "VarFunc", - "File": "cmd/serdes.go", - "Line": 64, - "StartOffset": 1359, - "EndOffset": 1376, - "Type": { - "ModPath": "", - "PkgPath": "io", - "Name": "Reader" - }, - "Content": "var VarFunc io.Reader" - }, - "VarInt": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "VarInt", - "File": "cmd/serdes.go", - "Line": 60, - "StartOffset": 1312, - "EndOffset": 1322, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "int" - }, - "Content": "var VarInt = 1" - }, - "VarSlice": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "VarSlice", - "File": "cmd/serdes.go", - "Line": 62, - "StartOffset": 1328, - "EndOffset": 1353, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "[]int" - }, - "Content": "var VarSlice = []int{1, 2, 3}" - }, - "VarString": { - "IsExported": true, - "IsConst": false, - "IsPointer": true, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "VarString", - "File": "cmd/serdes.go", - "Line": 58, - "StartOffset": 1289, - "EndOffset": 1306, - "Type": { - "ModPath": "", - "PkgPath": "", - "Name": "*string" - }, - "Content": "var VarString *string" - }, - "VarStruct": { - "IsExported": true, - "IsConst": false, - "IsPointer": true, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "VarStruct", - "File": "cmd/serdes.go", - "Line": 68, - "StartOffset": 1415, - "EndOffset": 1432, - "Type": { - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "Struct" - }, - "Content": "var VarStruct *Struct" - }, - "VarpkgStruct": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "a.b/c/cmdx", - "PkgPath": "a.b/c/cmdx", - "Name": "VarpkgStruct", - "File": "cmd/serdes.go", - "Line": 66, - "StartOffset": 1382, - "EndOffset": 1409, - "Type": { - "ModPath": "../.@", - "PkgPath": "a.b/c/pkg", - "Name": "CaseStruct" - }, - "Content": "var VarpkgStruct pkg.CaseStruct" - } - } - } - }, - "Dependencies": { - "a.b/c": "../.@", - "a.b/c/cmdx": "a.b/c/cmdx@7361f67ef606a7ab7dcf1b6d7ebcf1e0188b00f8", - "github.com/bytedance/sonic": "github.com/bytedance/sonic@v1.11.3", - "github.com/pkg/errors": "github.com/pkg/errors@v0.9.1", - "golang.org/x/arch": "golang.org/x/arch@v0.0.0-20210923205945-b76863e36670" - }, - "Files": { - "cmd/go.mod": { - "Path": "cmd/go.mod" - }, - "cmd/go.sum": { - "Path": "cmd/go.sum" - }, - "cmd/main.go": { - "Path": "cmd/main.go", - "Imports": [ - { - "Path": "\"io/ioutil\"" - }, - { - "Path": "\"os\"" - }, - { - "Path": "\"github.com/pkg/errors\"" - } - ], - "Package": "a.b/c/cmdx" - }, - "cmd/serdes.go": { - "Path": "cmd/serdes.go", - "Imports": [ - { - "Path": "\"io\"" - }, - { - "Path": "\"a.b/c/pkg\"" - }, - { - "Path": "\"a.b/c/pkg/entity\"" - }, - { - "Path": "\"github.com/bytedance/sonic\"" - } - ], - "Package": "a.b/c/cmdx" - } - } - }, - "github.com/bytedance/sonic@v1.10.2": { - "Language": "go", - "Version": "v1.10.2", - "Name": "github.com/bytedance/sonic", - "Dir": "", - "Packages": { - "github.com/bytedance/sonic": { - "IsMain": false, - "IsTest": false, - "PkgPath": "github.com/bytedance/sonic", - "Functions": { - "Config.Froze": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config.Froze", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", - "Line": 35, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func (cfg Config) Froze() API {\n api := \u0026frozenConfig{Config: cfg}\n return api\n}", - "Receiver": { - "IsPointer": false, - "Type": { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config" - } - } - }, - "Get": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Get", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/api.go", - "Line": 183, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func Get(src []byte, path ...interface{}) (ast.Node, error) {\n return GetFromString(string(src), path...)\n}" - }, - "Pretouch": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Pretouch", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", - "Line": 128, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func Pretouch(vt reflect.Type, opts ...option.CompileOption) error {\n return nil\n}" - }, - "Unmarshal": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Unmarshal", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", - "Line": 92, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func (cfg frozenConfig) Unmarshal(buf []byte, val interface{}) error {\n return cfg.UnmarshalFromString(string(buf), val)\n}" - } - }, - "Types": { - "Config": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/api.go", - "Line": 26, - "StartOffset": 0, - "EndOffset": 0, - "Content": "type Config struct {\n // EscapeHTML indicates encoder to escape all HTML characters \n // after serializing into JSON (see https://pkg.go.dev/encoding/json#HTMLEscape).\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n EscapeHTML bool\n\n // SortMapKeys indicates encoder that the keys of a map needs to be sorted \n // before serializing into JSON.\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n SortMapKeys bool\n\n // CompactMarshaler indicates encoder that the output JSON from json.Marshaler \n // is always compact and needs no validation \n CompactMarshaler bool\n\n // NoQuoteTextMarshaler indicates encoder that the output text from encoding.TextMarshaler \n // is always escaped string and needs no quoting\n NoQuoteTextMarshaler bool\n\n // NoNullSliceOrMap indicates encoder that all empty Array or Object are encoded as '[]' or '{}',\n // instead of 'null'\n NoNullSliceOrMap bool\n\n // UseInt64 indicates decoder to unmarshal an integer into an interface{} as an\n // int64 instead of as a float64.\n UseInt64 bool\n\n // UseNumber indicates decoder to unmarshal a number into an interface{} as a\n // json.Number instead of as a float64.\n UseNumber bool\n\n // UseUnicodeErrors indicates decoder to return an error when encounter invalid\n // UTF-8 escape sequences.\n UseUnicodeErrors bool\n\n // DisallowUnknownFields indicates decoder to return an error when the destination\n // is a struct and the input contains object keys which do not match any\n // non-ignored, exported fields in the destination.\n DisallowUnknownFields bool\n\n // CopyString indicates decoder to decode string values by copying instead of referring.\n CopyString bool\n\n // ValidateString indicates decoder and encoder to valid string values: decoder will return errors \n // when unescaped control chars(\\u0000-\\u001f) in the string value of JSON.\n ValidateString bool\n\n // NoValidateJSONMarshaler indicates that the encoder should not validate the output string\n // after encoding the JSONMarshaler to JSON.\n NoValidateJSONMarshaler bool\n}", - "Methods": { - "Froze": { - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config.Froze" - } - } - }, - "frozenConfig": { - "Exported": false, - "TypeKind": "", - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "frozenConfig", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/compat.go", - "Line": 39, - "StartOffset": 0, - "EndOffset": 0, - "Content": "type frozenConfig struct{}" - } - }, - "Vars": { - "ConfigStd": { - "IsExported": true, - "IsConst": false, - "IsPointer": false, - "ModPath": "github.com/bytedance/sonic@v1.10.2", - "PkgPath": "github.com/bytedance/sonic", - "Name": "ConfigStd", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.10.2/api.go", - "Line": 83, - "StartOffset": 0, - "EndOffset": 0, - "Content": "ConfigStd = Config{\n EscapeHTML : true,\n SortMapKeys: true,\n CompactMarshaler: true,\n CopyString : true,\n ValidateString : true,\n }.Froze()" - } - } - } - } - }, - "github.com/bytedance/sonic@v1.11.3": { - "Language": "go", - "Version": "v1.11.3", - "Name": "github.com/bytedance/sonic", - "Dir": "", - "Packages": { - "github.com/bytedance/sonic": { - "IsMain": false, - "IsTest": false, - "PkgPath": "github.com/bytedance/sonic", - "Functions": { - "Unmarshal": { - "Exported": true, - "IsMethod": true, - "IsInterfaceMethod": false, - "ModPath": "github.com/bytedance/sonic@v1.11.3", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Unmarshal", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.11.3/compat.go", - "Line": 92, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func (cfg frozenConfig) Unmarshal(buf []byte, val interface{}) error {\n return cfg.UnmarshalFromString(string(buf), val)\n}" - } - }, - "Types": { - "Config": { - "Exported": true, - "TypeKind": "struct", - "ModPath": "github.com/bytedance/sonic@v1.11.3", - "PkgPath": "github.com/bytedance/sonic", - "Name": "Config", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/bytedance/sonic@v1.11.3/api.go", - "Line": 27, - "StartOffset": 0, - "EndOffset": 0, - "Content": "type Config struct {\n // EscapeHTML indicates encoder to escape all HTML characters \n // after serializing into JSON (see https://pkg.go.dev/encoding/json#HTMLEscape).\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n EscapeHTML bool\n\n // SortMapKeys indicates encoder that the keys of a map needs to be sorted \n // before serializing into JSON.\n // WARNING: This hurts performance A LOT, USE WITH CARE.\n SortMapKeys bool\n\n // CompactMarshaler indicates encoder that the output JSON from json.Marshaler \n // is always compact and needs no validation \n CompactMarshaler bool\n\n // NoQuoteTextMarshaler indicates encoder that the output text from encoding.TextMarshaler \n // is always escaped string and needs no quoting\n NoQuoteTextMarshaler bool\n\n // NoNullSliceOrMap indicates encoder that all empty Array or Object are encoded as '[]' or '{}',\n // instead of 'null'\n NoNullSliceOrMap bool\n\n // UseInt64 indicates decoder to unmarshal an integer into an interface{} as an\n // int64 instead of as a float64.\n UseInt64 bool\n\n // UseNumber indicates decoder to unmarshal a number into an interface{} as a\n // json.Number instead of as a float64.\n UseNumber bool\n\n // UseUnicodeErrors indicates decoder to return an error when encounter invalid\n // UTF-8 escape sequences.\n UseUnicodeErrors bool\n\n // DisallowUnknownFields indicates decoder to return an error when the destination\n // is a struct and the input contains object keys which do not match any\n // non-ignored, exported fields in the destination.\n DisallowUnknownFields bool\n\n // CopyString indicates decoder to decode string values by copying instead of referring.\n CopyString bool\n\n // ValidateString indicates decoder and encoder to valid string values: decoder will return errors \n // when unescaped control chars(\\u0000-\\u001f) in the string value of JSON.\n ValidateString bool\n\n // NoValidateJSONMarshaler indicates that the encoder should not validate the output string\n // after encoding the JSONMarshaler to JSON.\n NoValidateJSONMarshaler bool\n \n // NoEncoderNewline indicates that the encoder should not add a newline after every message\n NoEncoderNewline bool\n}" - } - }, - "Vars": {} - } - } - }, - "github.com/pkg/errors@v0.9.1": { - "Language": "go", - "Version": "v0.9.1", - "Name": "github.com/pkg/errors", - "Dir": "", - "Packages": { - "github.com/pkg/errors": { - "IsMain": false, - "IsTest": false, - "PkgPath": "github.com/pkg/errors", - "Functions": { - "Wrap": { - "Exported": true, - "IsMethod": false, - "IsInterfaceMethod": false, - "ModPath": "github.com/pkg/errors@v0.9.1", - "PkgPath": "github.com/pkg/errors", - "Name": "Wrap", - "File": "../../../../../../go/1.24.3/pkg/mod/github.com/pkg/errors@v0.9.1/errors.go", - "Line": 184, - "StartOffset": 0, - "EndOffset": 0, - "Content": "func Wrap(err error, message string) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\terr = \u0026withMessage{\n\t\tcause: err,\n\t\tmsg: message,\n\t}\n\treturn \u0026withStack{\n\t\terr,\n\t\tcallers(),\n\t}\n}" - } - }, - "Types": {}, - "Vars": {} - } - } - } - }, - "Graph": {} -} \ No newline at end of file From 0493d3cc8a2a871261a80818dccb78a4ffac12ab Mon Sep 17 00:00:00 2001 From: simuleite Date: Thu, 12 Mar 2026 21:05:33 +0800 Subject: [PATCH 19/23] Update README --- README.md | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/README.md b/README.md index eab158ee..e09d8d1b 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,45 @@ Start coding(sub-agent) ─────────→ Execute Implementation > Watch the demo video [here](https://github.com/cloudwego/abcoder/pull/141) +## Use ABCoder as a Skill + +The **Skill** interface provides native Claude Code integration without MCP protocol overhead. It uses Claude Code's built-in skill system for a more streamlined workflow. + +### Setup + +The Skill is automatically configured when you run `abcoder init-spec`. The skill definitions are located in `internal/cmd/assets/.claude/skills/`. + +### Available Tools + +| Tool | Description | +|------|-------------| +| `list_repos` | List all available repositories | +| `tree_repo` | Get repository file structure | +| `get_file_structure` | Get all symbols in a file | +| `get_file_symbol` | Get symbol details with dependencies and references | +| `search_symbol` | Search symbols by name pattern | + +### Usage Example + +```bash +# List all repositories +abcoder cli list_repos + +# Get repository file tree +abcoder cli tree_repo 'repo_name' + +# Get file structure +abcoder cli get_file_structure 'repo_name' 'path/to/file.go' + +# Get symbol details +abcoder cli get_file_symbol 'repo_name' 'path/to/file.go' 'SymbolName' + +# Search symbols +abcoder cli search_symbol 'repo_name' 'Pattern*' +``` + +For Claude Code integration, the skill tools are invoked directly via slash commands like `/abcoder:schedule`. + ## Use ABCoder as a MCP server 1. Install ABCoder: @@ -177,6 +216,44 @@ Start coding(sub-agent) ─────────→ Execute Implementation - Try to use [the recommended prompt](llm/prompt/analyzer.md) and combine planning/memory tools like [sequential-thinking](https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking) in your AI agent. +### Skill vs MCP + +ABCoder provides two integration methods with Claude Code: + +| Feature | MCP (mcp__abcoder) | Skill (skill__abcoder) | +|---------|-------------------|----------------------| +| **Invocation** | `mcp__abcoder__tool_name` | `skill__abcoder__tool_name` | +| **Definition** | MCP protocol | .claude/skills/ | +| **Use Case** | General AI agents | Claude Code workflow | +| **Auto Detection** | - | Auto-detect `current_repo` from cwd | +| **Memory Efficient** | - | Sonic lazy-load, on-demand parsing | +| **Pipeline Support** | - | `rg` filter, `jq` extract | +| **Symbol Search** | - | Regex pattern support | +| **Example** | `mcp__abcoder__get_file_symbol` | `skill__abcoder__get_file_symbol` | + +The **Skill** interface is the recommended approach for Claude Code users, providing a more streamlined workflow: + +- **Auto-detect current repo**: `list_repos` automatically detects repos that match current working directory +- **Memory efficient**: Uses Sonic for lazy JSON parsing, only loads needed data +- **Pipeline friendly**: Output can be piped to `rg` for filtering or `jq` for extraction +- **Regex search**: `search_symbol` supports regex patterns to precisely locate symbols + +**Pipeline Examples:** +```bash +# Filter current repo(s) only +abcoder cli list_repos | jq '.current_repo' + +# Search with regex +abcoder cli search_symbol myrepo "^Get.*User$" + +# Filter related file +abcoder cli tree_repo myrepo | rg 'related-file' + +# Filter dependencies only +abcoder cli get_file_symbol myrepo src/main.go MyFunc | jq '.node.dependencies' +``` + +For detailed usage, see [Skill Definitions](internal/cmd/assets/.claude/skills/). ## Use ABCoder as an Agent (WIP) From 48c0806b2b25f06bf7e9709d3b8dc9d314353348 Mon Sep 17 00:00:00 2001 From: simuleite Date: Fri, 13 Mar 2026 10:20:18 +0800 Subject: [PATCH 20/23] Fix License --- internal/cmd/cli/cli.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cmd/cli/cli.go b/internal/cmd/cli/cli.go index 15b0287e..8aa8908e 100644 --- a/internal/cmd/cli/cli.go +++ b/internal/cmd/cli/cli.go @@ -8,8 +8,8 @@ // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,. -// See the License either express or implied for the specific language governing permissions and +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and // limitations under the License. package cli From 7d73c685806ef4c5ee1b6bdd8cc10dc3ae258f1c Mon Sep 17 00:00:00 2001 From: simuleite Date: Fri, 13 Mar 2026 10:29:42 +0800 Subject: [PATCH 21/23] Solve CI Problems --- .github/workflows/regression.yml | 24 ++++++++++++------------ lang/golang/parser/pkg.go | 3 --- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.github/workflows/regression.yml b/.github/workflows/regression.yml index 36edd03e..7030d53d 100644 --- a/.github/workflows/regression.yml +++ b/.github/workflows/regression.yml @@ -22,22 +22,24 @@ jobs: ['ASTVersion'] ['Modules']['a.b/c']['Dependencies']['a.b/c'] ['Modules']['a.b/c/cmdx']['Dependencies']['a.b/c/cmdx'] + ['NameToFile'] + ['NameToLocations'] steps: - name: Checkout pull request code uses: actions/checkout@v4 with: - path: 'pr_repo' + path: "pr_repo" - name: Checkout main branch code uses: actions/checkout@v4 with: - ref: 'main' - path: 'main_repo' + ref: "main" + path: "main_repo" - name: Setup Go environment uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: "1.22" cache-dependency-path: | main_repo/go.sum pr_repo/go.sum @@ -51,18 +53,18 @@ jobs: - name: Setup Python environment uses: actions/setup-python@v5 with: - python-version: '3.11' + python-version: "3.11" - name: Setup JDK 21 uses: actions/setup-java@v4 with: - java-version: '21' - distribution: 'temurin' + java-version: "21" + distribution: "temurin" - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '22' + node-version: "22" - name: Compile both binaries run: | @@ -82,8 +84,7 @@ jobs: echo "JDTLS_ROOT_PATH=$(realpath ./main_repo/lang/java/lsp/jdtls/jdt-language-server-*)" >> $GITHUB_ENV - name: Run OLD abcoder - run: - OUTDIR=out_old ABCEXE=./abcoder_old ./main_repo/script/run_testdata.sh all + run: OUTDIR=out_old ABCEXE=./abcoder_old ./main_repo/script/run_testdata.sh all - name: Reset dependencies run: | @@ -95,8 +96,7 @@ jobs: OUTDIR=out_new ABCEXE=./abcoder_new ./pr_repo/script/run_testdata.sh first - name: Run NEW abcoder - run: - OUTDIR=out_new ABCEXE=./abcoder_new ./pr_repo/script/run_testdata.sh all + run: OUTDIR=out_new ABCEXE=./abcoder_new ./pr_repo/script/run_testdata.sh all - name: Upload output directories uses: actions/upload-artifact@v4 diff --git a/lang/golang/parser/pkg.go b/lang/golang/parser/pkg.go index e91c21e0..32ae1303 100644 --- a/lang/golang/parser/pkg.go +++ b/lang/golang/parser/pkg.go @@ -277,9 +277,6 @@ func (p *GoParser) loadPackages(mod *Module, dir string, pkgPath PkgPath) (err e if f.Package == "" { f.Package = pkg.ID f.Imports = imports.Origins - // [新增] 填充 ModPath 和 PkgPath - f.ModPath = mod.Name - f.PkgPath = pkg.ID } if err := p.parseFile(ctx, file); err != nil { return err From f13d9e4b80d701cbebe87594ff32d6bfe65714c5 Mon Sep 17 00:00:00 2001 From: simuleite Date: Fri, 27 Mar 2026 12:36:23 +0800 Subject: [PATCH 22/23] =?UTF-8?q?build:=20=E5=BC=95=E5=85=A5=20Java=20IPC?= =?UTF-8?q?=20uniast-parser=20=E4=BE=9D=E8=B5=96=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 uniast-java-parser 1.0.0-SNAPSHOT jar --- ...r-1.0.0-SNAPSHOT-jar-with-dependencies.jar | Bin 0 -> 19040386 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lang/java/ipc/uniast-java-parser-1.0.0-SNAPSHOT-jar-with-dependencies.jar diff --git a/lang/java/ipc/uniast-java-parser-1.0.0-SNAPSHOT-jar-with-dependencies.jar b/lang/java/ipc/uniast-java-parser-1.0.0-SNAPSHOT-jar-with-dependencies.jar new file mode 100644 index 0000000000000000000000000000000000000000..42ccdbefdfb2bb5b5d7ab6ee1e498d0c0ce1c01b GIT binary patch literal 19040386 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±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

u&{IRsZy_;*$ z+4>7VPP}yY1VFdz*L7Eix0^@n^U>Q(?GN@KIb>xBXw7M1K~tDbR}(|ZV-n|u#F%o7 z@T%m*jPtV^v4u_>aXHe2;&9vaz@ys$)06#QlQ8BU9)dAaVi_9c_|*1w&g!oLmkQdMGLOwGOU;D>ZcY@)DlJt1`zDCu`yj$&+5wyo&nOXMqn z8b;f+bLP5Xr0XiKxQg!u&dg#Yn4|-~eJ=)5*oaD@XK=)eBS{_!y9uy4&YxOqxE7;o zffRrNfgI+IY2t+K&{`|mxAqR3z*e+@Jt4kl*hn#v&Ej?l2xF8(drONz*%G1Vu+Ye) zinK7Uu=>l?&mG)_dK|-UrNg%oshSeqF3Suj2$G1OrZ5o6<+M=1-_<)3z!S$9Xe@wm&Dp5`K6PGhATdz9rAS$j0i{nu!0r_Q zDcZ?V5mzY>kdF{1EkdJ5uHzt}R3kN+mS?pGE^)CFF`dlp<^9Pog7ym}sosOdwKhuu zn1{V$N5DUuil=gq02@iYv;#x3e*+LbUwtAhU@IcRp!XJGq@Z^cZ>gAJCNz7ov;Yst z*Z1|DtjLA~7p+OCUXmXwW~wolZ>xLo+C+Uv7@hO39>ZAMysQn742psWYqUhY@9wQQ=xZ4kRCWd?MHO~I(C}l z#!b!zw@rkmdPb%?c}_FIEZ4bLMy40KR=#eZ{W|E9v_C}U-V~2Qo20grErM#XIr;qH zjy6-y8g4{3*eWvO;W@d#`Ay5@Cg=$gTC<{4-$0GJeHv(_#CU$YbkQ)S45H?83%Q7? z=}TQ|vrb|EQ>6J>?9L2Ex1SEBlRB>L#UtB~m|bRNLHcg2_6AaA7GUB$qZ9!arK~sXw71Yu=BfzJS=yDteUFMlJDhZ9x3Fkje=SFaFVSpsfatL&Z+77r z^2iDNmWk~(gmZ1xWt+djY)?<^p4&4|AI8100LrC$wpuxhq!tJnRqWZuzFm(8LPEUEoEnB-kg!6wO@UCnJ?^o4rR8!UK`{T-k4fPyTuwB z;;!Tld;TTnRWU1UMC9;;vku@XALGdg>Tw^n;DYA1PjmzFxzTh(RMCAHQ~9NF-2u#E zm}xo0<#*7OKds&ZZg38dO|(`-n-lpbMhhHXS^K;K&KdYjL3?`%MWV z!lh7ckcd)S`RhRCcJtg7sAf2>spop>Albor$M0j0u;BsXbMUKSps)pRx?iVcr{}m& zHfI{MU0_`G6DwU{9rdC2Yr>dUBvgW{VvEsbza#?-_`!p_m)$RZgcqJ?;onXnoO?g} zN8YNo5bF+pa$x75#uFx>?c7{g6-^hGH;0ApzrUh@MzZrp`V=?kL#bkTLzB{$?Bgi4uTFGCQ)cuHwf23%rN$o!| z04#{@rg)9-`w_wbE^(P0%?u(7T8j|8+fi(M4Csw^i=9J;j9#I+c%iW^?^cOey(bK= z{Q+X>?H)Vy6^nL!LwV}L>V3p*csn5ulWNWD)@}Tu#?BU5r~ef~w`((e!x-Ye;3^R0 zCVF(Ue!lsE9vw>*p(N}Tu<=Ix+cn~T&f8}x;euapxdA4>^1fNtwrDUv9~I`_D|sPA zVizPK!0BBtmGAlVMl1`iO^0}G`^N1Zs8M*g^NZ{=`m5jt?B5GBN*GLK()VzQ2>(A- znEy}4rr%6ztQ8F3m~PaA=6!hjVh8MmCIN5*j>UQ_`z(DCc0g!!ieXlVY!S@~tHCQ* zH<62bDw0#N`E}hx(n}Rn#%^&lMDB%Y;;t*W)7leepXuKwG#zO_EJ6{ycypgTww`#d zIli8s^m+hqAV2d629?(|MZk84+Vva@JVPUHt+QtDA8 zqgf`uaBw6ci&ty93gxxpW>zvwbHyQY`wu!w>_|+g9d)|$*mIXh64%7fX-u>PI063N zxN{8uxiFCWzesz>@6O&X>o>M5wkx(>v2EM7Q?acIE4FRx8{4*RKDnRnK0W##r(c}& z8)N?k`x<*)Yp*pwb3&^VZ_u20>kT9G$mDC)qj7!=RG4HqT{NQ2m19xU3OtK|UCe2a-Uw0diTKlz z1){W<(iZPYI0IC5#SpVmIE*VeE^-cO(!1s~ivtJ_TzBzJq{kdo*KBJw-L#zypX;30 z9PmUk3H9gTNFVN^Volh=Z7=ZbpK!QnW<)IXE-^T2)gnRYF)t3WKd69HE4CMn^K)@6 z8+4mFE%3f0=w-Q6iLld%=Fm%Q-LXozsECRDvj=eF4K?$! znQ_LWk6SoMUbp=tx)uS8X!m!zrbqnZXMerAu#Aw(_ITICnfnhKGe{aQoic>--Kv-p z$qY*w)ras8Jb4X@B72cx741Y;YGYLkioa?s9fLf}to9XS*J*FqzQot7ZY?E6nN1rb zyIh+oE^|oFdtXyOwLX{Sayw(%NHJfd{O47hZe6Xfz}$({K=FGcLvS|qu&>6^dC8au zsz*N9quWY754c_Ck}nlIE!SA{xmE5a^hGy@O10h9+VEvkude%UeHwQTv`rqHYHd-q zLN;hrK_}U#nk!WUj|`q`nRT8i?QZH7a>hNh6mX{c#I%G6r@#JWaV_2;NX727745U8 zztQ7xr+1E_tQoL9_Pb;FK3*%Iqso2+Bv%?qa)~*7Bp2Le_b_v6?BbiLRISHRZ((qx zuNe@z%&b(@Szn*Ju35vK*Kk$B)R0>_G@UkdwsD#O}FLXwl3er z4Olz~K>ZZfVsHIY^tQ4hSo~Om14C~{dmptopCc{S z5*L({u{lUH?#WjBRJ8nc;WLF|E-`cGK};^B+UOax$AOFi*S(_HM9VDQvpC`JM~t$f zGim47D#SzL^0KMva`N*QCPe-O%!CqE`&M*)A5lz&zi&q{I1;}=j@TGIYHPx8hvOQ| zZiBmxe1D{JG$g(LK=^=Psy>7zd2-mZTIq;QuI3Kef74Om7De6;&e;R;d4Q0RF@j=F zVins-MLp=9wwG?j1uQy1klQBMDuHv{&_`MPndNYidNCMlRm_r|6e3NL-H_UhoCwV> zrDXPOp<|j;whHoI&|C{FY=&&FV_v?v=w(_9>}+ISwuEyf0y$G*;_v-6c>SXw@kuc@ zplbto^^L(C5mHM%Qea9XJPpAAG3@|#S2r1D?!0e8jvy~e);cbQBO68r(JC6^DTMMS zP5aFrh>u)Lu4BA#D;ztp@6h^07zJl@8$%X)ys;$C!0-CCg?@`b7Bq zOY2!$S247O>(QYh5Nr)pr}Bx1cPZ<=PHnx{_bl{ha(c_gVDQCmFi!5079uhY2t`R} zuj=K!CK~esr@r!%YvGJlj6iG}s5WvsVqEQP#MCz+pKbO)&S6%i$jr>O(h@y$n zcd(9-osGSn?e{kEzZuC&mAC)Pf!Kmrhfz-}*HAR=GENDoRxNMER+qm*R%FIx!_Im^Ep|!RQ zgC6(lEh3^Fe$1G4*G7b2gE!euk1_CYv0%$^WiD8`#>0}#Z!lWUZa=1z7=t~v9CRwg zQJn~xpC+>ZKpF_K<7Q%zHoSCNnkJLyAy1=n1NR)Ab2BTSgRO7$I&eJb60oi$je{yU zp>SmR34O7;lO({CsDpe=F~jJO4;(L>he!#31$EEM_V-VSQCo&6Eu6KR(r`NmnLY8n zWbC*;7u0z1{eyx}rYpOv{&$YhR1Tmw!d#mS~tIKMGi&z15OPJrSi=k%t^A1(F zyBMC@!|J~SXa@6S4#)X3eI4I(0%|*b!)U7rHTP7gh0*fIBXEr9Ub&3i#nn-_Fd~8U z2D*rK9lga94$o!0M1VVA0PRT*ty9B4SNen@+IBmJ>p885Gi7ea`N(;FkmpB%XAc|R z+gk}8coi<=UH#UJzj3dJEu%lx8;4J1)*ELEi#HL&r`<2-dFAm=g>kPj=yf9z+1k3@ z+}24jkIHGg+87ALDA{e&vx!wrh7Z?#E3muFpAF z=}Ry)8coSLMs^l0QdI1irfGvO7s7C6^JC-u+_{^~F?jDXyI@CLW*RZ4b6H%i(VKeH zUq5~_W**w9HLwOf<)MN16xUuHIyFb`3DA8pzv^vUd)DN4-*JXGy_jKc^dA$!Bjv_+ zecY?6FNsHHbHu{VEPy`8B?%jwh*O|zaPCW}Xn<=Mg!YhOUVQgAWqp;Iv>iR}r>AUH z)rYe-fu@$h5++5{eit15m4@7H~Q1yV6I*;Y39I71XZ{*9_W=+ZvP_ad2Tmn>h#=FbkN+-nCglCC%JC z+eDkTniU=P447w8?_KtnfPRktpF>z?sF0&kF$}&)rtd=U1p4!@?Q0D^sG}$u7LHe~ zN10xiS3F~_|O}Fp7+x)|nVLE&Gf^4rrT|$xnn`z)8M{W|df*cbjtCPdlg@v2 zr$Rbmu$kMUtYKYzGv?ObpuYZ@HDj}Otr#r?B8m7gpM%nft*i`7bIEFxU;T%Gwd0r1 z{4SnLr>tmmi1Sp^8;Zis@I*jQk9TuQu!W=mtuzkB^y7UjN=YHxa5@8oTssR30R-ll zgDm=naPxt&Y!P#eRRMOt6u_%ZhTCejRT(}{y~;4H=a9*E;Tre!BmgVMS4~jl&zh0J zIU}?!&<$u^DY!d6Je4X8si0L2Y?tjDwr&pQRrzF6 zNy2kNh>JSCyhSud--{;s?1w$kDkDp&IqLFrLml?%bp;D?RW5iX2&_+A?bsOFUC6~; z=DxVNSHYW^QCjRq7#mtfNe)k_#c~ua+-`u==1+AqMv&WIhVjEjE!PH27Z-~8hl zVNMnNZEvHPZ}6jvYJ@DqU87ejHE9iZ*-FE!7{{cp0~JaAQ~qGRSPrwDcj`tRW`I$a zBE{h7-N6>~s*eV3b)^OB>9}=AnAbvYDwC(Ay)ZneRk-&JO?OiG%}eh1hiBjHg*NfU z9nX@EG2z(CQSHwK{a&3VWJ6_(YJYgOU?DjCe3||=eN{2%C01*4IVtPO&bvRvZ#ZlA z$UiYjdhg0^Vgy9I?C&f}-=lg))u+6vxPFyBQKIS5jy;89^Ysm%4}kYGF?9)@QHgpM zbjcNTIf1~}#(SVLm3sRm$vH-JY3&Qh^AlL<@{3f@y{9`*PZj@{WxnReRA#Rx*l4kt|V2 zsri7@q$gI!g!S!P4#0?RXe`$*$cy)E)JPkkCOP2_qmUpg(;k@hd~iE&gNi%~X=SRZT?Vs)rZ&USYWiW=|Zm`Sp zW~nm_o{>;}Q*{y1R8}p7I?^+or-8;q;$K<_HCazcl`WxzZn>fW>s?`hM`MRhNGL%y zH)r^J&Apb1H%jo1`-X71z}H12{mGw!Qhhfiz-7T+mA=R}O`*(fx76no=@+MnaB|3) zk{_TyB(0u|yU;na0g>FHso~24{mV5EtV>OVy}vy4`Mi(ne8}^h=+vt=7`_|!?WGeV zbfqvhKXv4uDE1TRjCRiM&*18CF%L%XDYLh1h1N+Sy?FUPR5P}oVj`PO&`y zL29a&2sY}vNZsUTi% zdlwM%c)sws`jPi=OkxhYlP<}hq#ORNu65h2XfOzX6-u;=Fu=+g)oxfkUW}CTNEY2s zlqUU_OkDa3%QMZP*#XBQ;jSNJtvwBJm!^=9>zqOCl;$L?hu)InLu!VY0-C=fc9!u2 zs306tmMvrYgM01ST4D2m%UC$_^9amHXTeL)iTiJieeIC@n1XwQh5 zqmdMPq52#B6oT0=1TZf!he{&cOzLnM`)3pGo5rX^Xoieu4>0ddwMjCD)GbtrjWeDk z7Q&UiP_Ehr+I!_cyKf*4+e(MKig(c|G>FI6{S@Ax^d=g$;l1ZZX}|?je=-;L4KFG)w}2V(br{3ndIcvF*xGeZWTpNYh=9_Hek|MpwYva8s$KO;hnInho81?a~ThLKdn?Kkt$4ecSaGM z+ZQa%dFHrpTc%^v#hlSEr!wAz_v0RwYsUVQi&ut0E)jMmDCRH(OR02kZR?V2fkuLA zYd^zhpCc2M#0skJLg@ZoT|Xigs`fY8H7R-3)n2ypxM&kd*Q-O;F{(7aDc7dnBJ{uB zvdzbRZQjuFKQ0ZclzRK=M*c*>_HJ~Dh>Y@rf5QwGqc|{Kh8#1`6guMz{Tw1a$ghpW zl3({RxxVB3)a1B(jSBF?s_8DR8uH8470I$-KZS+Z(XuhErf-i$F%+m2-Fj-ZRQ!oUhu#Wz|6_XB;;!*?T z7pj3LFuEzkLchUlH;zZtl^12M54iqVdl%TH2>zV>R~y)uUHwyNTaZ}B8@R*-LE}(< zTjXGeIu{V178y2Fw;-buSu?1)7NPA&O?*1G73?SaTk@_Cf<9v_l|IvKn ze--96s&1(LP(%7V!OloQPN>MQ#gCn!-(aZ)+=vu-Yfuvu5Jsz$Af;Y^KC}TZ*{%0V za9=3*Sjo%F*KnlFQOrBs^^ohQEa&Is1|1I~Voi{c#qD-!=gZ8^?DqA3wsa)yoZJPK zD3{APS7t0Cv1Hja!bicaF<~EMQsUWUoDyugmVP0iU3Sukypl<6Uc_jN%9@`S2}n-= zg9O`$A}SF?nKPY?hm>lWPFGO@Gfo>Dih8<6k_+OB1`|CgGr10+E`Xz+PiKZ-Q-C*< zTsZ5CEs@B*KGwFi&Qael%$x3-Y2E2F_BAvoOf^fEE4y`bdf`s&-vd{DL4#3d&99Kp zFtu|nSywtHEZ+f?rQ*)*#-W~SPY3CmdfbKMc*(s?bD0vf%uB0Jo*61v@Gw=@RmS0XvPd5vvT?0Ur#dF;bG3f zDU{Gpz*;E=69n%XnMy1aD@*M)7Q=BwVtZqJ&It;76RlNfk#Sr*$omRM8pjF)QdVNOx5Nq#T>fgZ3V zNqsXxk9V;SKx7l7P1(p!9J?cCX%ncWCSyDRfIs=yh{pte^H3=5#+8J8KYUYscNN5AIdo5 zTqDv=*3P*6Xz|D(L|d{RrhY(>Dm-z4R$=VcvUe#k5ugNzC$-$P-kphy@0CMWuA#$9 zwUQV3F{-aKH`XV(VcYy8*J6CmmtM$lJVX*c1U>1o{Gl%(@dAI^5aD|@fmrSk^ru^ES z{uq^(;Wnybgs>7TbrpFGtY7dzyJm3S++S0jPr$SVd6#=%11aXFf7kT^d>$i*L1j(+#%$ zh;EJVVEr<*e=jzFC@J$fNR64L&NmD8@y34Tt4IG90-6%1@|o=x9rjHr`FTSyn0QRQ ztOKGK5W~Mpd=HVeOV1}>d;%x0&Lw5nm+m0v-a;-P=2er2kn5T-Wmdpu80TLlluhHBy$cKfjusnX_F}nkRZgdJ7{^??I4ggMQT= zWzS^KV)kNZAUepxa-k}XeicmADo`*Cf{I1GIAXjPMSfO$!Gy`mBHR~jOg??F{jOL? zXCcpP1$@$vngNW2(Dnedt3svj>1l%bN1Tmx1IA8Kl5U|9Z>dVfBdTk^4Cv+cF>{m7+Ja8XzS`F(MTcp9e^7Xe%zbyJ=agLJ)qFY_@ zZGWv&yze}HF6#GI_L{mvWGrLTG_WpzWc5bC*JR+Ux5M2*H%f-cQ5^eWFT-&yfvtWL zo8yj3y!L?lAjn?=hyy<;5@kB;<|Iy64rzRkm~To|+PFV>@umj&9Sa|&-;LBFOn2{S zOnxis7D}!)s(9AilueEPQVO7ve}^q;7HJc}PS1-toVjs?S6=EbLRPTucqOLwXjBhM zhHeAbIOt8JrKQEC8EV5ATPmU8Td()wy!^H>XF)$@tQUQl0M~$gWO97O1aAd7{L5B* zYEg3vd?c2jf=HvrqpF<_nfn1&tS!0J!G=&6)4@=?PWOp|-)%|tEDy?0`V+g zoJZVS<_7g6_XUNv85Kk?d zHoyjH)e~(;P)^_`+c9OxYyAEWA-CWn*73B(y=G@hd2}5 zd=Q}d{Se=+sgXDE*3>ek3X40PWZ#Vg>tPc*)gb@T@3C8?V^mPy#Pyn$oaG>JT~ z-I1^W(?$o5^4k^4VW63R+1T>C*M_1tRA0=sD_03*S#TLUJn+6!V45mpz#(nP?6C>K zNG;iKJIH_spKGC}c8uLoqJK3J>#VSo3UIvY`wF|{C0@rl&HO`6)ZZ8E`s8h*!AkRS zt!ToTI@vv|FuXP&wz=w+kv>|8jjUu_@0x>WQI?zbw!^9W5InPu05~(2Fbpv$acmk+ zMJ;hp>JbWwN9eT}H^`2uFE~a$!JU$Xu(T14C<#Q$ji=C6-&qgK`U}unA zN7*Rwjt7cHK82m;$Tj~>4mAkEB0(X`*vx=d=7~=Mskp`P(bN-B+;W#sONKu^1%48$ zWqWZ?xjqb9Csn6?WgLkIxCO>SVciUSuOWh zN@FV)bmz?ZYYET(P{42kk9#1N(`Pi`qJwXrd#73KFr*9 zSM=3DleKE1zx0tZy#5A=lcl_S{CSluHg1S|Cq$6YEVmxDj~7l#*wO(-JHz3vGqz*K zDox9?fBrL#H!%{2Py#2meK^&}9|@B*nWTCW{M(Ho&3VN$)CjnE%n?7LM7h>KL7=jl zMaL|XGA%b#^u1;?78EPGP{HFp&3P8m1YGpPPrav9fP}F@*}=40aMnVWalLXR5SAs7 zKKZIlfT&s}VY#g1`^PMnpF52C$8_On=;eFW7eJei?6DU&*VwemyI0O7*}kWjc`9T^^b z02l~F+!n$rE*F!5vtjxuN_%<8_zxaR;HR+6_GHrCpE_-{l-DQ4XVFi+7Oot8vebn5MP*YQ4<>VRGk~E zq{t;0Ap|Hs{^sf%dX#oKPl$^rf_xIV0Yul4jK1PAL}p7+?w~t25>IFu^fXps9HQPJ zHgxCu87j?|h%*DS!O*pl=t3Q<{d{V7KUFp^{_W4nLoF`K9lu zX2DB{)Rp?7p+K3{nJH^p44TmXT0S8VC6vbRH5g;y01!9|C>SJ^?U(>0(%cOdBvEQ1 zF;RAps;2I-i-0C8`w;OVDl1WidKZ6QBTPPLWX`9`OQgR-6D1CcY(s_KuW}P~>3$BYTN<0_l*VASAxR)Hq*&7Q* z@(K!M64!JQ*W+(84R*REr!CqQgJOhYxG&QWTBMX3^7vjCz*1fZ4M9l{Lg3hp#YZMf zmW^)j6Lo&!3^xAolvCFZp3*NA54{4*8a{p$sNMqg!9PZHCp`841ppPg#SrY`YFkL? zj^S%WEg>mODc}m3H-hsk=%8&8o6_BdIN@F`APAG>XQaw95`7JM%MNWh0b<9LQR2@d z;pF3U4}ipwAaxWV5l7}?*tZfpPf)hHRbniwm6qt*Xq`>H5og~N!7dttk`yg_bjSWF<1j_N6n zuBhW^r9=^eg0Y8=>z%qpoE+aMnsC?c$Pmm%@bpiteK?L7&xGdATzj@9j;O%>1@2R z+`5`dd4j~spvEsm7KZ}T$19!3annMh} z9N6ZtgkFJr7_@?+;wdTq$cLS_Kd1vBtKz8 z$zMV^{rPrzcFh3i!7f@DuGxmI%aHk=8cg^$4AyU{$K|KV8S4W>R=7nY!b~buf~6SQ zh)>;#fAAW&nCXfQ%~V#oOO21V2Fnte1Y% zk1lsyp+31snGK8#&Wo-fFHH=itN5BNHfeJ%ZzD|KzD&|U@Yde_Z#o&Gf!eCmQy?Jf z@5m>ie_BodqkeYyKm}mc{}VZ-SWO` zd^yY*_UnA(6CCM%myTwTM2PvBA{#T$E~1qX4;aHyOw6xUCPjv2m#K+fzP?ZNH zCru-f@k;L28dKp)(L%8|ijoQ%3j*+~#?g|cBFf4HRTf+sNAd(y_?%KvQ&p43b(pBt zv8iBHA`zJijYrnWRC;IiC0J46lIcq*C{Y%amnLBi5q=B$sl~joiWKIq5S2Fw1MExK z)H@k4Y4kwAr4DH*ss1(=FgY*d&Un}0)&rwLOzJ4&^WChPTB))>!Is52{~Kj;n4`&rn#vLF>f9VvMTQO=ku3&?4e zcT+J}wU>Cv9E}K;Dl3aD3pD9!ThHh%D0tGwr24&d$0q=&X_W%% z5h;}CQN{ydpoLNO%$=Y-VRw^IFfmc6p!FOL|+@lQ(iaCyFwtS3b^Y8G4req8Zpr6(C;s*jnTWySR7ap=91 zDR04`*7OO2FWa;dmUO{be@OXdbXHRThcI} zY}BIOyonpu^lSr0X2kSCLq%U*(uD5AY24J78FDE86hR3wo_Pj-NCAxg#!aZ|Qqn%fZEEIk(9xbHztRz5T|kAzY-k3B?~hg1!Aagiq=J>H_oEEX)Fh39 zqA;tli0bW*)D8ZQ>f3qAPBjIPBpq_VkJAI1sK?ZN%y4Y$@#^ragi0Bg3SMQ&Gx9lnMxCf;O}wIuGCOK0Wf%5X!ko=H0cb0!jN0l38MA;`oq+r|2~_~OA;@#Kr2>{T za7LmjESJ>ptXd7UXE5!^_7kiwQ2fG`eeh$j97T%~Qe}8dB@{SXBz44#L;(+x!v(r$ z#2!@@(1G>4M>S0UKXOlFSxJBB41w)@fem-;T@i`=?f8}QrmCS;4X{Ha1`wXrOVzQZ zemieRlm$Tl0l%~8p6I|zkkMgEfQjlAMX=iR6g8sWdoW1)TehYNv^d0Axl?3rggThp zHP#16SGQuCl}EQjx=J8Kqy<4OM;wkI>0O|enRzvrgc1v1d{xFBt+|CM0V@nSjcEO4 zE>{MxYOvJr5?@rN+~O-jq53zB1=NyI-oG(J=0q;ei_tKPPIp2oR~%giot2DuC!{G4 z)mQ`FB8QZ|m1c8wo-hKn@CKfo54kkvC3)7V?;~(oEPKq*bvRN)eGFnw`x2noYWd+Ab17WGyS2O*+rdOzo7uNi`PL zdD__d;ni3$Xk}T+yb~aU!q-74)zjq6Nf1HHZ z>6I~`iy~khfoju+b0k@2^Gv-~Ml}rlh%2_Ac?KtsADPSK`IVh(Z0dH3-3=6aL-X@2 ztW3kmGds}=0O9Q!pLiA)AxH1zNYV=OSNCB5@8aB9=DLxOPh#R%0yR+Rk33C`4k5tk z2xH}pZ~^dL=LCRzUx(0ete?6c{>D>`JN?iMi1=#1e}fDb{+91Wo`gW2snLqn{ubG_ z1B2%46|H{vp#~!Ex4s$w&b|_3iM=Q7cAp-WL<8DFaUOL)rIq|&r@A!l+<1DoYW>eg z6b1mszE$SjTkWbH=ZfGZn6NZ$g9R@5FY1Y7#d#_93S;#tAJ_fkUK} zAW^Mj$vB|WuvR`fQ7g<+F)JM#e4?J6_+`Jy-uh&}tjU;acHH83z@&N5k8pb}pN_)l zgm;I+G;MS$)DXvxI-D~Az-Hgo`*Z?;x9^&h#;F0q@JPypKxo>7_WPVg#866U>~~<; z68aa2DY9ix9ow7A5a$Hk?ml^K%?XmMt>}xWEhuMB!yZPe zz6uE^o``~*I7npdPO;BN^($4mbgt;H=szoi$@*%B(~QnE#d~qqPt|gME^eNqEjL-H zv<^YwnH8kvzX#a`+8;{uTyIaieC=0s%31LeIX58BSea33M1SGZpAh5L1Zd<%-ULY$ zPk#U(od72Vaj$jC#zJUu$IV&X6aGfI-cjbjmh$8#f4(9fS06cngNaz}DU45Ij|G>D z1|i5guZ9&!R1{xKio1Jn&xKKN{JIE+z_x7cwuLd#gdROnDKJ|L(|<~N2A40LS`7?SIuo&> z#ji7sz)JEVGv-L1C0EX(c@m4ff5~0E&;Vf%8pcRg>5I%-P7+MSKh|b+Ok1!o;0GV5 zI=2eeqOgT33k3i+kdF)m!ZShq@C&3X5_4z^!iNtKhS6>D1ed?z z%(1lV6-->5frwsw8~R?yaYPeR&g4r(5*W~@I<~=KsQn#sx2nhmnJ3;>91OSTMVdHB zIzQ^pg#+miu-2ioLdN7qBE_vd4ecvr*6 zz$WOkmXK9ytutW7)`89()_c-d2LeW_#z_#TRdreov2GJ%nHUgQ8K56_@Z=eV{zwu1 z{UCCdSSW~s#DwkpMN<6J5Wu&2C6C?i#Z>G^`~=HJ=}aCZsbFY9?aCRBC3|qs@@@EG zXCXsZ9)@SCMqD<0WoG|s=1C3(A<)lD2%hGbNpEb+j`e%UOi6LwWWv>zWtLQawZLq~ zDefT)HVAN)aPMjoKbSLhbPqxlB{HjNh5mw+6F7kw5-@>G8%{1}@ z{q0;s)Cj$AL{pX?nIgUvd3E;KB==a@3NXLI&k zd954Oe$y{|+F~4}Fs=^C{tHi8yB=?!jGTmqQgKX?>pOnVP6@c#JFIpu*y85h)X#|% zK|!(F2*Hpw&Q4Hf%o8~AJa(e+O=*B+_cLM5iCe*R&h>Zn@JpSzr3P-v7JA$KZw2dv zdwf*kC5P}gQU zS%TbH5EmzxdZq+xn}8VnW2qr}03B3kdn#Xy@gB5fx&ZRIB3YImtAIt$PBDiMcA6Gp zIv5cq3ok{m`i_*O>;O~4{k?G-OQF53GcnXFz> zwLDW%73=D}JjAOf1PE3V4e%gQ9d?m@o87O`wWPwcxg`!Cywb9VT!T%QBjF7;^*24~cw!MMrV=^4)v0-mBAHcpEm1^jR7b)hLk!RVoa6oqpy6$J81i+>YZwpbH&-8YQCtbfyk%lyWR z4kOxjRSP15GWJ{=5 z5KNjl#RiQciMuLDleJZvYKtgX$A{t@8lszD8jGl2P?%PsTDlL5q&A|pJ58(o=& z5fE%XN$%8y_?XhK)@<4Tcwo)n)GhC=h(&CBq5S#--qD=gy6ozOI`(IJzf4++j4Mz^ zh!9`N*eaB!U2cltq-jmyuOrJxM_#0*;uo}~daR-$gj{2TVsV$I7iQ-9#}e*Dw4Lcl z?%vr>Aw6x7sECPM69W`jReLR#| zq8aErs~SBkg4&gxBv>ROo|H?DP2%SE^7Fbce%t5buBg+B?j}~%Z_kT}%&yL^EM^A1 zQn(pGI)1!n@alfCg|^IrL)esQ`_;+8gwzY6KYI3wt+C7$ns7~v5iW!Y8(pDqkfM5& z(y{E{6f88xYXkS=`XA3K;&rSa6&L$f7*Usn^u}flAUEqW!4DmRcdXp#Gs z@&St0Xmke)NdrSKS>AGJzRvlNFld*w<7UIedwekoKYT!2g?h`iqHuqngH3*hC3sCW z^vXB*|CQZ6H-2vjy^~N!o<*IhYZd5H;^0QZ=#z)s(aEsE&-UUnGuxKjsPB)85sAqH ztY{d%kyZ8<{HB?2EFunYHAv~UcSYdF@I**NRIa2{Y@|vr(}R#2pjY3pc8?#Le6n*2 z5R@_s0II!P*5hoC(-98Ga_|UzUSSF>I$u)FWvK;|pcG5SZb$i(C6~j(x)P&on`VQj zHMO!J-fP@2Y;~@wS45&<(0X8zQ7UV+^l~Xn*JE)GAqn%LX=MnnfGg7i;LSc;;pc3J zF3zYHmWE@UL|`Wa7u@VysXS+s3@L!NM(A55+aJJ_aD_C(Ss|AcZCEp}_-ztzpFjNB zMJA+1jlH(3MT06UM8{=ZGjUEgc`4d*ALU5_CU}THd1>;bz{CY<91v5M0ihst^nlgf zKan)O4BFMqC>VX>i0w7Kbg9V(pbcpRPVZ-H%Bl}t?mtdCREE}eC?Y^l(lIfmQNPO1 z^l;x@{4FtNX4M2$M0H{v=~lSPh`bpfM(L|rjaKoN%? zH;P>^J(V`dHxwKzc?BCOs7e!T zq%3Oi=<8x{#-TV`ws0heZpw$h#{rVC?`hkr)dEiuRmW^mItAiK--_%nhBK`n0QbE4 z6dgFOkPpK;0y2RHBh?mV`K2RJuE#(>a}T$BuD?i&IT| z?@0mV#vU5c<>iuNaItrD6-+0$PV2Uj%~shtzV4y72A0(O#BXL(tr z<*EgASBseU9&JDT7h>&f&VFmK5>J8gl&|BE$ zB-0hcuh|E`t>2bu@@vkAdi9M4-{9#D((&N|E^H zTAY!HKlS%vu)H5UWyOQF)BTzG7}V&bKodFo%>!-3&HV$4TPfjD&eO>ghPcbxbjgw? zDWE1YG%F~j7>`1!NjrYBohTvXDnK8PfIUqu;_&g9Ol7(Wv9%+h#7a<9(=#Bg+-g>B z&EMr#QA_b9Lfj$FV5ye1J^FUQh~PRMUIZ)JLkrq%O_a2KgH7UG5mHh}(QgGBo%yhP zOFP%0m15rIM~Z>V&LvU;{KTai@hS66GM4w9th!hdjpT+FCp}5TvrMG?3Ym42)H%mX zl@iq6avIR@4v2oO^HG(<-ky7Ajhll$W6xOhusj3o$r;=#3VSeRGMeezjcqDj{_S`WE$6t8ss}pz7T{9Kr=&}v1KVRKX zgwL-ffG(?Y(nMT82MU$q&ZCZhpDQ;Mo=bx0Bn-oiT>>%031P8cWg6YwET57d4+Y1kD0^r40& z#241)brytpr|=kM?_k!s;&J|*S{*@EHwM1%?s|&* zo?|?Wq1<3bAk$5EP@o-FUxH&*Vge-1Bu=i+B(BO)+LR1 zO#Tw!Qb^>xvEeR}Z4kwsLOd~2XOi!=7`eU_JmOzE;UHX;`9!$88qy6olt=#TWqNy( z74sD^hsCkU;WQct>f2jmN}^LX|0{HBzQo&)uMnDm?l9=1mLaJ{*S)F&3F`rfwgHP6+6GJIhqY^&6=j%pDk`4;K~SNH?J5)V2XU#b}? zr_J;PT?BT_p)T9s1qw+?^Dfr9liwr}4QErb@>+Xq^hN z{sEDbJ~1TyoAbB=$$ctUYmqciPBf;|1&4{<(il;}9ZtKoNB!EncO)K&t4VEr9*(1_ zQZAYC`z=ftyL~GjMY@PV>R7ueS&_eKXlK18OAw%EEH3w36b$WZ@Ssy+{^}reS)3s9 z5^Jy%dkHB@*-6U2anPDYc*?^;AIXtvA#;|&H5Kt!zEC%i5MA6)hZESxtlp-X%9f$s zN~zRVB8q(GxNeEdc5>&@v0@L_`uRK?QAk5 z>#D^R2)NK)5CH%OcT6w^RB+q2B#0;JhUIkNiEQ8oJ)6pYKc@z*ArVv^L7i(pX9$Y; zK*qUowK+D>V+P-ac0B{19QPlf#d+>YiFEA~=p6$S#${GV)>PNp$ZHGWRE#`cbqQgE z#~Bh~jY8p{B zHu3<}-rV5akm;vEf5A^M@NoYRNvR8CY+=% z)>VAM;PlLCdtVkFDKz2CI~zK;H>zkv7r~*MXO0JqowA7E?_x~D*)qg{BgYr|S%w0l zBPU1BY}90&jJ_V1ry9BIDJvN|>TvcY5hG-|-pH1BH6B<_;d$*@Fk=6HQArf!;Vt>D zKlMgAzON}AA!Ak|f54{%8w5qXX{s5`QB`T9`^th1)$Bd+xa<#CCeJp7E|)jTIa;Gi zS^|f*5jVouPD^;zE!TUbtF6hJO7P`O3;|~?-kltvG5-f#K%>7DAR2E?R^w?4O}?=+ z2I=ZZqB#m5L|HueB;Um4n~~7;jwXv5p_GuTMc4rNcq^B0lYtWt@f;pXR>WqdE#yphYBL>nXXE;vojg_JDR0PIU`FLF7Wck~%lC?t z9iYHFz7U!WXg9aZjxOzy!j$imw;{cH5KmHdjanhGx{r7{kRiV( zf1t_l@80s}4FzulEXm~$(N{;c0uJMFKIZZ#VnIYjGh#s4!e?Cm9J6Y6q+d<;7hSL( zC$6y>G;4gA4ey-z@?u)P=JGf4w|F8Apa&>&P*>ceg_p2F>*(#+)9< z3BLM~%RdR9q@v=g>dK;$YJB+%mv@T8aI-_@MWy&=7gvaQBSOamc~BTvBt?c%$6IWJ zo}axu0pb!nRbiDZG!#|QHAVBamzS#st{CzYc7ThfDDuJ5$jV5Qg5i3}6hdGGN)N8| z#1Y8B@|rSy(VHuM@P&~McW)^Dlsrx8?@O{2{lM^)vw`EbCL&xJpbP|XR0c~bDrZ&s z6Na)YDKw!AgSj$9*+Ya8sA_EyE=wS_6#9``a)K9ha%Gq@TvPV+8IDiXl9OC;WrV;V zYmf-9QCt~~GV4->qs(&b?%Kj+%SOg zT*()WTP@+M30#?ougvm_@+H=5O_@wdQJ0CSz54exl}XAJ;7iKBfFLMGFUC`=1|ul# z$gLuJN>`2!V8|1ccw17!LAybS%_CRXG{;M&W1fJI_0~a#UdzJC^7y>gx~8aYu-9TB znnlndT28``hUd9Wkag^#P*Smb$1xvXuomgJD}?1*q?Bk%an~h*T-9=AmJ$SD&kj{q zRbw3NZZO51-3G3u9LAM7$b0&u+G>4HD_=X0eJlReTw*fAo8X?4JI?99QmkiFbOyAkZR- zR~A99Ndlk#z?CBf4HW%^7fZNuv|wF!)O>tb$CY|P>P6gmd;_$tQSb;Saz4IX#+9ge z=?orUuHZ_OXaED~Q!-eHAQ{0St$ZXkCEm5*Nun;Csbjd3P?8v$(%VKF?fpes&RIVm zBE&XYxw23>LQ_`l{^V^3b=l&}f@m^Y7j25VHo`Rpbo|4*OQfv60;yW9Ofi*}%JH05 zD<^a!u8>v1?-g-TInkE~XFDh*;wym;CSAZe`FEh;0FjdrEPqr^MX;PkNt^EjbvdN> zZh;2RQVCFZ@o<)fld#lQq)COGn70ys%70h1M8=eum-M%l`kV782=2LDnW-G2Dd$si z`0s=7LIF|E!?}$q7vkJr)QJ#q!PO{FxjNa+iM6PYV||G?+FeCjcrjQ0A%v66#U`e* zR=HGDF3I6&CgNSE8!TBCPFP_h0RUXNOt~CXuolZ*7We0qR$Ob4Nfv3!y5C{B>}M)h zC|9AtvmWE?pukgtk@fqC@zvt~t)0_kigGPiHqhagNu|Wn)iOe&6}t~1a6MOU5S&C@ zG=hWwCs%I5v8WMy6fD}{1auFjub@E0xs5BgBd5-bCWR9b`m|^IttlHRnbqY%yANk5 zcaX0Qed4Mb1aATr}?Ra6I zz*4qiAGTs29-?GHm;11LZ+Qh>(vw?``8;yHG2Pf51Q zkD_R6bCIy(>fyxFDl4k_?CzXzbi0rQoMSU$pRls))pqO%b41rG{VlhWegesz`%fHJ z_fmJ{fZ{|Xydtx;p}eTPf-Cq{pgAHAlh9c-<@N5+Ufd0i##&ttams7TD;T97N0M~z zZLyD88zNzC?dUCz(NKBUx9e1K0_dpQ|G^?a)+saFWC+yZ1Fn3id_>8_7RyAQbt2Zv z*v@v1lKdj1YSvt2lax=p9}>`W^2Sg;Q9kF&7if70GByv-Q#C{yirZY*=nNG-!Jtd& zT{r72HrAvmUw1FcQF`@YZKm>-@-5=WcNT>Yg)ky6y!@UkKPWrw6Thwvtf`#|3F9)l zDPKtkP(qu#d9>Nn`82EbfXX)UE5CAO7hbeD22K2;Qcss=#}oDztfeteABWN7x->Xv zJ10AuE1{~yRar!_#p90RK9yj`aBk2ss>)RjGYoPD?6RylQF2v-t0rdZEy6r4jm6Q3 zXQ`q6T}#1rV%|)OgTq#$ueWzr=;Xy}FRu1RYpoS~SJZ&v18JSwm#h6SE{U1MqhG=# z2@qBDxH|Mj>_FqD5BRWpxNw z_Ymi-Y~yaV6=zFPhjDdJu_q+1yGR2JzKr1NNc_^vu?O4Vu!EzyItDw~6Dfe(>|Cer z&DF7p&%MNu(p^r1NTQDCYQC-TiW>m&-2|>$R-_PKkA=6HRT;`Kbuw4?vCO)`%CZo? zI|;dA08IyWl^7E_83d*WxuQt{BQ*0z!cAzg>sQ}i&H@#w>ubVMZ3B{UAZz&_oR5PP_5v~Emp_obNO%9Qx#Xd}Z@`}}svcxx)FaD=P%*7j_U!q#FDr{ArQnKKelG|JVbSafi^uTBto%+*;8 z(9YHF@cX-6sPIHTir zBfw9|RF(jcbR}V%pLnL?fP=pE>k^IKF(0jl>P>P=oRos zJ)f%=h+DRRpt(I-a6w(j)r;^3fu5FYKv6Os{9XM!S1%Uvwwj_&Xapy|h@edt!w`{E z95SB7D?$=WK?3eNNpz2>FpFIk#~a$*+nE69%ei_fPDsD(eDM~s{;uTe75IIi`@8!* z6pZw0u3n>F3l!hJ7tR0GmiA?4g_?R@*R@yAjcA6tLA`;iH;M@Z6$U_?jEWoVmI^k0 z6IXA>@o>v0!@e&~y_GRdz0G&jV7o~uM|UEFy&6HaiK|!Hpvu{`ZYX}W zKt|5NG7ocgJGoy&xg+15H`_5MLn9o*`8Zb}ZHJRc+=5M_&rfmn3H(05`7Wj=9YEip z+tsV_&$C?qMt!amabvT?%3~$ZbNYz-fIJ^ZB)`ep}u?%!BD%{8WML5azuw`!N z1i_@;4Fn_+Tak;X7gu@DL1yGFSBtD8H{iZ)|K6$$aTHD$Sz<=J1o zM+r4e1_ILspVnM%PlReJCpVBQuva?Q81|~KC7)Q=%{rIDag1D39k*U)`X-zsGZqr4 zr3cpn$k7jG3`<4azW*j9)4uS|;9VD-dMfJ2wLaLLk-N!fO#}{O04Mia!x+T1{#b6W z-z7)NH`m4r3Bvkd-(I4P=UTpSq+e-Qk`%TkRQ2ZL4JtddiCmi` z6mJ)8NMkbgZy&CWgvpSu1qlcK+%B$!$c_pIDDSl3xTYiVaot4Y(dg30$tf9@9%@F* z@ho!fAg&#Vld)%xoaJ#3EN5_SI%XY_BP*^8Pv%3ob}(knb7l6nT+FpYF~``PIdZOB zEy%SJHjL&e-w#Q0UeY`~+ccI(0 zBe+(pEy8;|@uj~5nRYc<%-pKgWSg~W5NWg{xptJc1dt(>h%Q}PfkyA1J~*h)yAX?wX@8- zw}m8aDc2$xSzAj)>SqgQ>ArSRu^=4_v81iwS`=wg58*`Rn1o%~JEoXoyX@Ptl9n|FD7`w#5Yar5YoA+8ZX=b>RbQ zGXlRj_GwY&al3C9C(G(O_TXl&{nKr?%vC6-$qUdwkvW;>n(cPc!?Bq=xOSU0&`q2j zqix1e?4cZ2VWY?72DaY+(f(Ww79v)4+#k1;v6X9gd9l?t)O(Ev+I?KR2lEZfoiAew z(6({ye)pxC>73Tqlca6u+Jo*UEqOM>w4AOz!nKDikUhq=$FaodaKrM}WSVRyD;iyU zUKP%c<%HeT>xgfzTRtW2DXu-?mNl~rqWx4{kS1yW=9*BdC+|LM&Sw6@wP)Q5ZgyG0 zbTQ+LTzejc@3DBqXpHs>*Iq@|F(Ah#7;Z^PW9d#)8mqm*wF7X+YU1wd&)KuLxb~*o zhG&)ZipB48?QP{FgTAG`&$SPPG9Asj+gj5;>dr-sR;$*jNP#QbhuSBcJfVGxhl099 z{km#T(LMydNBdAJfIr%oT>DDEzn!vVZ9zh2yt7{WmTTXMvl~r9_XRA)Pd~vQ^=eJq z(e(?>9ngrW(0))~GPEDCYd>heaBZj9icF-ThTr}sk=}%0hA-g{^bY>Ocz#f?hChH* z+7G(Qb-(ZG z+z+=it%F4_!wl8;=lTKqR8R2os@A%y2p%mLhY3qC*EFslq)$gE3AxC!KIL#xK%sbX z$>Cj;-JziwTt8T!iJMlUp^P_DuC`{5Ta3WsOfBoZ|IN?r8pW}_*19B4tKm2_B{d8co!<_LvJC1TmZO(( zeJYFOC{HNkEXU4)>C$LM z@Q8Q%BCa1HOrR;T3jqk;;BZ(B3E~%N(&yT-&ZD@#SpS0|F9-Ino~eg{73y^uSH82A z9ge-lynfGh3hedZXXZfv`u*Q;q9t>!@{<3whHA_Ka1;sb_?HW3SyW)Mzf%CL+bX zpX(2xU2LBoX*AKPjmel6x>JU@|i4-G{QP{ z>NCkt`mT*S+8w$Sd;NI)np)W6R{Y4x~|AcTH@La$t$l}Xf z--?LqJ4T#aif|}{eflN`*1pd5SKY{-J0~ty53&9)*WYj};m6f6Ls7Ip62{yY4-xoK@n*5t#WSu7BWOM;NpuV+xk^Pr3fFo5Z`lyh=K8 zM9;a9C0!h4esOt%q<_iv&-Bj?{cHVOP5);1r<{G%%JuK`{{c5IF0Ck;`x}?i_~|52 z)5ZwAD37d8*}lAHMzzxPA9FX%=Pc38=#D#azm)myfr2+UIfZhpVADYGeM>; z2o#5tNN^jGW@1-$BLJ(`6M4}ivQVQ3H+mYqfGYrjX+<3+50ogEMbTQ0g{INR=%*Qd zJ>kBrZ(O-ao~|2t(0@nlD+L_{D<8;>L8!|OOjrVfqn|po1;Anq;l>_TxRZEe+6fuT z4&z4JJvkK-Qgn5^1;32o#z@?mRs^t2W3;iCW{h!qCPJx+)sp1K-Ueu_9q8L<|r7Je3;<;%BL88OG}|4&ugiLmUfShKIEl7h}5zb7Lm9tHwe1MrQJN z?80m;;Ko8bN{W@+KA2$Ca$^yG7}ee(Lf@)|q3V)3 zOM*wts|;3Eg(}Lc09h3sbJuaB9%0f`j5@L^7{hhdU_$W-SB4mksO=rTNE~H0mT@EM z3D{=QDEzd7D_0ALY5ixcHpY#(paKpso#Q-q5=c2dwgWMsdCDy$SF}W8v%@PQcI2>( zO@3wjV`wm&tGLnX-jGTQ`|hJ>zRq-8p?KSsws?hc95+@QZLmTTxf<{r;U`!98CkI+ z*3{+>1&ZyS#En0?g;LCuZM!y3;l|0BX?#bSX5&#c@8+9ioX(9?QSq0IWJa1s@O!iv z<1B9c+0BVPMnK~nZk+A5jd_$Uw4NE~bK~3&bL@*bF671q9p=~%bNrnf7rEV;+=FZ1 z;u>yT>?^lu{ZekM6=0wzXB=Me>u*?8jCI_&9Ge;ED)U=PhOwR-SGwo3o$`g5uI0wn zZh*9J`+9C{aHG8^M_T1J{>hCS$o&ROu=ViAxP@z%qn$Qqy#jQ%bK_R5cX+NGVuv@q z$z^Qf#vR$?&y}|*){x$6H16caX19>&?Lt-yTe)$U8?QUe>}ldYZisC<$4HTm?uQ?@ zapQisO*#FsD4F)4#eCbj@t~V5)g-<40pk&FJcJo~rEL(_z4Q3(ac(>cV3*%Bp5(?; z;w*Dj&Aecx!6L>poC)1UUu75YZ;MP!1-ta)ion;aN{+%HsH-T#g+3dZoJuX&V5}u-{r>J9p~K7mGc8`yyrIbXJ2jv zSw7~*hj@VHc=lKS0l;e79bHkzg{*@o#ureb@fjs@OB@5SX+#T19UwlP=%vl;uU}Cew+T&;!*P`8qhwtr<>^O27$Ty^_%NrgY_sleQnT(Ss zOi7%{6@6R)nnFs1wnXCQ8emqhKr6FK_&&tZ+4&*{fT}qrKIcW>1qL?P}Ls56bxpuG4;PcMAR5H48)S-}I@ z2v4o1xu-c2;XVqKUZ;OnNP_mNYtp`(!WtPmb=iT0#aSYIS7vt`y+F0hvD_SI2aONK zJhG2w=68pvVO_Zcgq!Aga{>->q6kD`PXb;yXinzlK6X@>P%Oue5Hp*jYNk29V5oR-7h+*B) zXwKy3UbwYC*~0qVA=-29^WP|H>YA@56zp2Lt~xQ$&&*Sj|? z)XnN}eID4w^5~|Vo*Gwh4ek!Mp_zx}bP>s-Xq|Eq@lrETVa#%FR#;J8i%P44_+~yg zE5$Lp>dKm+seEEqBgAS13W|`I;?Op{Ux@FIu!2qUo|uy3M2@of9KFkr4S+ca}EB|W`Wa`Ra8IJCyb?W5rbjQg#+#xKrwuf@>% zaI84jQHT<8-4}PFz+t1H24;^8v?`CG9TBhE@+Iz{m3PMCl9_msMpblaOvIn1WKcU$ ziA>`c;kYrBo;)4r&ma`QG3 z=dz@tygF1~BXZxt&5dcUin+x`x;WwnMK*JDi|AT$Ww2z4&2Ml`$PxI zYf4M4FNauP9^~e~tRS6pg5~G{n}h3j=triR4|gYEnGg`#pO7@ohs;NDwLXT=S8JMYm~SDd-*$qSVF%HEW4_DHSIk#Mgo#+BycJz*?AwF@ee468rk%8oFekmk zozsozUY?<&2YD;rx|j2?S6=3|=je}hzR0@dL`?`K3SQ#&tk}|{J~>{a<$39uDb9_RyPEzs9di4V8P8V&U4 zfxN%~5wHQ>j$C}gR|Jjr143;jFA+gu((BBc^ncf*w?^S>hG&(;rEy4S)A#q-aUc6z zcglGqO8_zlhVj52c$rYz3pAcgVGvulsXs7+2lf;jchaBGN7Wk?&kEWY!hCyi`Q^Z9 zyumK%9FI)eo(5*-etXP0o(IMXSLi?i4@?jnBAE=Zkh}pKa7!XE35uY1*8udh0Q}8b zWdj%{oluy_k7;h}HD(7DN!M+{6b8Uv>V2gNQX5bJl zP|_WdG)LuP3pP+3K>a>2+o#W;4NV(hVwLoSp}Wr9VMYG;U^0?C~Vm#7FnGNB}>FL!UOSg*PNIB9^#)6=8RN} zqglWM!k=Zd6_~lPC?%Y3oGw;0x|CAvZY>W~1*%1C#QB*JAZF%PVng`~1EJ_nh(|nT zg;C+eq+p9-9$11xM1S!nYk5*~x^J&e+tcfF^Ao51-)}Ac_BaB^1R`1>;maGjb;{qyseKubw`ifsl)yPWaIPH-BMDL^UdyH5jYGHq78AK&3tULabRUE< z5eIhB3`<8`YL$jR1}AXbw;Voi;v47e2*V&beol6G)Pk6pH9W9ZuE6_;ZIQx#@9SWA z2{@I5WnozymiT1y!R-bd&~QH72?h=+ND0AxNZn&1!kzR&L5BcmbF9p0*W(1 z&K{=Kqnthy3k>#S;3*z>TEsuGgo+YJ`LlQ(WcW7^JS!Yhla{#AE(a~J{DxDJK;VVI zOIqMXO2)f~FZ{m~u;`-Ak;$QXiTF}v&}DHTigB3Iml3&44ABWhp-Ffc243al9`psr z(cl3?9BStDgcNv#2VRqI&;tM6{dIVra15CvGjx97Z60_Bqq_6}O4JlbA=!#AJwNas z54<1v0D6R11vseUPk`*`bO~1b5vRXOHy}y-ga!M(AcwEH765@{VD{_c)@Tzt`=dxZ6eV&=qg?Hg;~zTFVIya#^ffnU%&UK0ll zD;lxdU$I({Er!BU?y#`VDbSu1Or1-ao+52+-%|qWKM#Bv_zD{28Z^jtO7_mR26DM@ zt97l7jR^h09rgw0%Tf~^q_nIfbUyFFc~7B#Ti=loS&PuNpHSYL2et(s#HYSoohDQ} z-k;NAOUc_0D;dc7Ai=m%l#L`-MuHBOS}Y7RK7fDj`VD_F?>%^Knt*rk;BBauy)NkA zb!E3EG>H%Ad?+7=V;af%C_dV?4T0xEJ8`8`Cc0O*1?KUKOge?{#rfWREMQ(Epm$LW z`jYZ5z;-xjzn!b9#&s*gtnH8+^p?Xqk1&B^GlFQiQ<4}*d=s+;Y_5liK3WK;` zoXajRFl{>L2l8nepFv4+mw_c}7D_lTWM!1h>bh8yt}3%hkrhR_Q^CT#k%LWj14owv zE?f$_DP5q!z@C|O?8h$7Om=xOGly|Liw89x>dwrFnys0cgEONv;)`z0P`b)OG(?N> z;VA2CBC0E~<6^wRHjv zk2qCD!U>H2Y6@$H6D(Amp~?iP!b7Sy2^a1FE>Q|)l6oO+3mLj1QPmbpErZ_Gg9OX} z!1<9VN$bnPNhhi=U&8s(sOj{=i&qx}D{GfjSIiBTSAnqOs7*z9)JjFOP`#i+@fG$p zm)Qr}ML3*L%zHk>cFD?dfS&SYoHvN`L3}yq5$mam^F|aw5ArFs=VYZ#;t153eE^h} zAY-^OjAn~A z&R6nP0I%lED@vYpi#K*jJK{n(*3cA5jwuy!It$y2JRKDjF@L)B(Q0z{WyiPwiaXR* z(Nv_cm&z0E&Q01fTW{Wm({?=PF?}jzJgzs!uHhk}oZxYZNK)e<+VABH92!4`l0A2y z6_C-&3=79|FDcG;cx9x)Hl_FU9+rg}!jt%xx|<{;3E(mzWCa;Y6oPmBXpmw=hqU2J zn~)B;(j3w~Trxzhb1o##pqfb>9DdJv=syV64-y@xA36#h5N zmEIH5!(HhSkRItukAn1QS9%Pj_j0B8hV)ohdK{$3yVCiPE^wtMKzgDpJqgm2UFm%w zJ;jyY7t;H=()&aD09Se{qz`nZr$PE4S9&_63tj0MkUrRzo(btgT@U<%9XB$bd4*$0MZLx z=_4Rr>q;+z^kP@~50F06l|Bm6OI+!rAsu$5>mXh4N;g0{;z~C{dZ{bD4AN0odO4(5 zxYA9KZg!<(kdC|3Er7kpkOVvrCQ17@W&gH{UrJVzRpNKG_#H&rT;-32^l`5A@sK{j zmHs27PjsbEg7nF*^q(MoiYt98q)&6DPlxmwuJoTFeP&ksXSvd6L;5eS^f{0|*OfjG z(&xL<7eM;2uJnbFzQ~pS8>Ii9)!xNfI|YE`>DycbWZrIk`go zt`q4&p$t{AhRoh+}una7dfz_Pmm|==3fNng6yR{zhDb_Dqq?}{+-|3 zyq7$;iTo#@Z6Yt=tC#T4EBNO%{PRZsM)H=tiM)r2kB6=y{qiC8S^ie?MeP>y)h6-{ z_C*qXnGTGHkVm0M*8_{X1z60jFmaoJHEafwza2>WV?e4O2XgxakkcoDWIhF?@M$1j z&xrnxuzE+nBmWa%Do5)k^c|me05}=>5uSS!x(kX(8lf8biP~fQ#UA4ypbi8w&o3Cd zh3w3qxQXn_K&z){;W?P1{{Y0E7p>-7`O~fPbgSHM6`yc=CBiU@t<@4e0LF>1KQ4bG zmF}A=!;g|D%MDkO+4x4v&y$s90Nh2JAdx5ENi}%g!+L#>32%F(-}Z97?UjBj<<~-$ z^3m{8DX7B2*u>BZEPzkLDl(w213=>hYvd*1?ymqUyb2urHQ=(Z19yD`IO@y5LH`R} z@-5(wZv*(>f$4e|IM>P|5`wKL?Q&i8b>~{4O zZ+f$E5@ds}enc|F^F~CM)T9yNbzn6$(_5pIumX6;_jqf?;!#m-FheGOXS@Og5k`z33j`!F%I1QNkD(m?!F3X?>G z@HA%|EnP#VK;O%eWWkGq2WYvpna*3dfi8sC3)awi_Ui@k`UrS^s8w$98afr99-xcM zCTyffZl>Xx@Y}eSXv5afJ)mrK4eg)5nXV8$=%bR&G&WVS9uia4Jf)A^dmWjcr)ulS z{!r5@b~Tv*zsJJA6DD0wG$?yge!*sXig^7MP@r9eC` zm-2L=D8tqgBpp{NR|+h+2A}1IN$_*sI&y&XMiFmrTt`L^)?B$Z(VH`A1=F`7e#{xH zLH9RqqH}JufVX80S#AMu3j*)1wPdjX7#S|IZ=`qQ$Z(7}Ag64B=>L?h^xoRr$u`J% z|7Q9x$aLuz`dIly0L+ti;fYY2p}<`87!AAE3`~rZ3u+><=(~HD^U-SjPmb zg3a`ewSdYKupWB``^fS-(u7E~jlQ*p48^Ah=v$lVJ8MXGwUlR1qQl?RU=ZctC^9;mr}8suceQt2fx=k^3GP4SG$D` zESn(T%Ldg-1y!5aklV>4<(Ns{%!c)0$~rP7eH6h*#WhK z6@g?>{wl1EUNvb8J8-%>Se5UEilo6Z^l7?xdIzg8xngNp*a*`*Sc8ep-^yk}eG|8^ zLvdx%Kzghr*O97%Z44;LsDcMrN!eBwtevot9R~jnhktXou+sAUi55<=^0mZ-pLuJ@ z<2V+8hclW27)==x%NIA0oAUuUn^|S;!R!ihC5*6U=%kqlDIpiEnyPFdee)EARGxgQ zylYa!RApG6a^4~NFk2OLuEP@Bc21%g&CwtH5U?%6h$SVLx|lMk>&nKQ%*FvRkS zVt}KtnyoBV3#gx{l_pf#$hC#7gg&$_gq6gOUrXn}&xvbkk<|)42q`-J;+psq{EoK= zJi{L8!Fz~-^PwoXy%)zD@z>L9$1@y5tMCZF88nl>9Ab)T`Fqs4LvD9?&JpNRj=IMFbmAfv3 z7PN+`@~}L$Vdkj{75F-0J+QsYb}g|4hB^2n==sd_42%?12gy2q1o9?jDEkI7Kzwz+ zSY%1S5~dkp2@=s}_UE;@1h8s0Q!rI)5>L*cR}KWPw`phj#D_@;XyUhstw25Tk077> z=O&-xdv5w^QAJ`{xM@*MTArbrz_i)fYjTQBbgYl=u<@Pm&Nbv5SX<|W0v$zGrUOa{?^ zDv13hbWc(S68j=Lk}Rd8NSux#tLR?jPjoCfla3=7&Odg{9kjLo0 zu>0}oOxIJkR9Y#y&NIHw=(;z*7&Zbl8 zVRRZTriFAat)-=O1udh;(Q*yP_fxb;6^gY^0Kc!3QmyrI3*3)n4GP;9CnL?K{ldfO^+QRzMW7rUyV0+M3 zHj1ufd($?SPmg62>2Yj-dOVv3=|Z}i%>bGFj8F23t=5%vRAe z*`MfH>=b%7JBR*-t)=I%Yv{S`T6!M4m7dS;r5CVA>0jAn^kVjJdI@`(Udmplm$A3$ zyqx3mBM*kzn>GSdl^hNo6`ht7` zeM$a1eMMeFUz4w;ugf>lH{?6$oAO=szw$lwE%^!feU`o}zf9kk-=rVN@6nIsFX+ee zH}n&Q(N7hXex{i8b0t7OR(jJfl>ziCWgz`d8AJc46wn`(ne=<*5V}K|MRzKt^jBp8 z-K8AKh*HO>(!!Xsnn}tDOjb^3igE@EDCaS*tYJNrn^{i~F?uQYvfj!=tdH_I>#O{m z^;4c@1C;mKK;?5bNcolxR=#6_GKhHckDS9i;xirfU)_ z)cUd++7NcIHk!@U4rGUDGuffqELN-?#!9q#ET~nngR~>r9Ib(cv?!aZwXwO{S*%pM zh?Qx#uyXBoR-rw_7HY4uBed7pBJF*)So?q-rG3GcXgk=^y28RbXA!+WYt#p^rTU(1 znLd$4^%AyRUj)BLvK9JKET%WIxZcE8>M6EL|07$ipU&F!GuW~EMeI2J5_Y1#o}Hv` zU?=N0u|Mheuv7Hs*s1!*@cS7%P5+$zS^pn9Q~!mXWti-2V-!2bn8waE4q@jRW$b*T znq6QlXMZ)0VHX-FvWtvU+24$_+24)7vWtziY>jaVyTn+}E;X)aml-#+%Z=OEI^#Ze zrEx#I#(0r!Fy3X?8DFsLjqlhE#?S0VQ(-rmJ=x9XNOp@kiETucnEizmp-OA3#3Q6$ z>~WzI$7un3f;|Z;@hUo+Jw>hn8ukh?*wbt|Xz?GB+wG^dlweFQ(D&DqAK1U)NhQ0; zCG1)D9MM1(KTlX+box)Sg#Cv-PZ<4{3}P>kO+;cd$UyPL*vn)gdlA2~x5>fmCHg&) zU={wtE@T%GDn-ci>}B=}VNxsE&R!)6_LH-&~9NgP!6$ck(32wiZCfKrHO`@(|$yYLYqxAcPR7YLM*DK4KperdE=%qO7EDpnHlERK0}`5G9!U82N>L zBFa8PzGt6ePu1th2KE{DRDGA6&OXQaP`@Ut1*|mnI}&AI;CyHjnJ4;UXnjeMXv5TI z0$jcX_yx2bBxUtfSAYwNQR@B45n_%ceNS?zm?K&LBQ3J#NWX~MCKP==9ct&h$;oG2 zPX@5BAfIf!OXjk#**An4-;wF;TlO81%${Tf`ycz>veD5LDY48ij11UG#%Odg?YWB_ zNHnyyGJuU=U4Z57KFjIPbSF7fqi4~dNyRSG zlQ1hMf&LU~bjwd<|6al{bnj1uOdd7r7g7yxeGOFLNBo5uuSVE&yb`Y|Y1S$QM ze>!lufYhgr!^AkEjCv48r5DD0ppQyUOzW zNuVwMTp)gaosh8wip>D_FQT*UWGH)>jAoCJeD;{j05`#=HaZz2DUvD-aJ?lBCW!%k zc$vOp^+Rfg92#K6TGU=IL4z9`aVbjXpsAPHQe6ME*j8{YEb!*2(p8fO>DZ=|19%{ zjOGnRm^T#LyrH1oDs6)OfE)y~{v_$eo+kZ)K22u-Aya`09K>D(y73ZO3iNvg(C#+& z8aV~%;;HNn@@Js?X9Gn(4`}iE>|L@BDDYK4d)LFeYuQ`mI-t2Xv5)>Aaqj^bMe#k3 zzuB4D+1=X>3CRVHB=mYoC;D10`;=WKi;E;YB~vkB(^8K24cEWu|xOn(QTSclnE z_MVs1MwvXwwe?^HdF;tz=vPTY1(;Bb=OdyIUO|&wS)V6Rvn+`=l#soQ6#9iHg-nV~DQsZMm(={A9(#N} znSzh1_2leI+OD92c8~%aDbfq_j4~PySs}BGrU&&0)tr)Wb#?U#aQ{ig-?$uYm@>tY=O27fM*DWQCp>rL`-iQo`tn4kEUuiV_$fDSmcG zHuVeyRS*11vm}C|SqM-$c0|}TTPEk=z{i)-9K?iDzfh1BaMcUpaylRspc$b+D6kV@ zSxyJ}y~+%DYLI5Zz&dCme_-*z255l5D5t~Zz>s{)!m*`>tV%kffYJ&&QYAN$@FI5x zMTYtrh(H2iC)a^~RD!t}dRA)12;b2Xz7nQV5a6|5PRE34IUS1?NikTNwlPw6M+TX9Zch z6r$nCNvP4LPbhX?s2?=+(U#eu;SW81!8l_t#O9Yu*F33D6rEkc^ z1CUxtFDpphN-vL%k^QKkS7qToY~!aoQK=0o>9qx^K~_QMX9=$f{+QbYFTo~AmfA)| z@{m_EmxJ?kLzYnjJ)*{;GRdzk<^GcI-VO^HYAbC3NkF#01k)`RGWNrzL8dU*M5Whs z{|PJYJwR{#AMp+3;{OTqS*hJu5HeH`7s(EHt)xpL3Af0EmX&mABw?9Mh^wT_BMB=c zDEG4uy^*muJk5qoj?!(YeXMpmzN}Q|@yd?gu3m|w%5VV!zKjjgMN|J>j*z)(42dVO ztgk0wF~u;klHQJMYbC-+uAN$|DP(vHX%zyBuEJflI-cIWpp34rL1PHRpox7gqxXai z90y$!4jF1RO4YH4t}BFG_pP`HPE#^5x=w<+lx{4g_m$K8i{$J-RDfIQkt`Fj5-X#R zx>`FE5$9u4K1-hpiM$e8>Q=P1FjCQ0x1!QgTJbL{x=dAcq53<`AA9sjYtZ^V-cV>C zwKr(@XpBtT1zBvc7@AdTD+;1Mq`Et6Tb5Y@O)Kg4THk`q{aT6G8Fw$%t$iGn8ohq1 z1?@F8*Gx@r&3t(k)FAPU{BRs=SWcf-g3c#Y;%4nGIo3k13d_mi^%dsz6rOi4baGFl z_WrU#S~;nb?yA-M3c5#*Do&;2hH(=j18L+AA-0n4L!j=DAS5^axY~CRGtHn5VDZY%`Tv!0M75h5{OqH)E_(zFx5kuWT-1dC;dxE-%4#) z0ivx}3Y3CMRrzX7?XP87kwOWT^v%D?`F4$JAGV^Uo0imP79F4rnO!FLIi z_()=;k0b_pNJ1fq?+@Ua9;bjBZ3K;IV|bA^fj4Oq9HGhZB~5|vX;b)_ zHiKXA_n)){VYDT2Xe*LPTa#qkhBTvXNe9}Fq|-3zNz;+%=tv4^C*&(SlclsfSxz&_ zO4&#~S}`53-A^ZI574u-TqI{9bo#BHNx#zv((m;V^auS+`lCLD{-jT*KkGB-ulij2n|?k0U0+WB z(C?;y>g(uV`or|7{un)`Z>7ieGI~PaMyvHoM)ZA5(+@GKzsI=#3Dfn@n4uqKmOz$D zFlLJe%n`9HMkL_x5Q`PbEKW3M4Mi%87ila(bYw_ZVpu-eEX+{S&!05#W z8UxwsMjjhvjAMh1i`fw4DmKixjtw_%V7bO(mS-$sBaBL$jrn6~gS2o?uWEYqN*bH+tn`!2= z3(X1mdlI|IoX##bXRu4m+3ZsDN_Lrf1DkCwVV9dr*%jtyHrITR%`+ciSDEGPYV#nw z#yrHXGY_-t&3D-X^DB0P`2)Mr{F&Wk9%GBGMr?_d!j@UB*>bBlyUps$R#>Ci?bc*= zhjlqyY2Cn9Su5FUYdyQudW_v|?O^vsU4zeN&^2Uw4pyzdDnOc?MnKyk|CsPbLcNp_Dgzd zGdx**0kS#LPSPaH5x+Di_u$)GB#-_|e*;UqA42qZvH=3xix5^4=E#go2?Rt2QR^yw&Dk0YG z0UtxoSF(M<55fp01qcSOhDNHVrk)91nZ_s>`UpTuig8T49@BItFzs$XZ67pu%Zd>(F1hv?MF;=wZ0@hyP`F>MmQC9+0fo3o*@s?R~z-DHh%{4wT1sefQe(7^l(-;!Ah zG_V>)-ju9+Ck#FbFA9=P$Z<#{QY7n%i&Yv7 zRd8B-?^w{Z<=Sno$V^*|1CVB@SxA6~kdo0hlg^&?MtheiCe0(}10+#?$(9s!vLwcx zMOt;TRt%gzOh#zZTuU1#t#Xt|I>?b%7klUng-GFw-Sh=1o*EJ4nXCi?i+FXA-&_4| z`hIvOoLyQj#k}wmXxta*skE7i3d2^`Kq|!_!Mys}PTn-hHItn0utROg>1{ z^Ht*vNpSg_1$8B4F7>|eWJ=7O5aL|X-0ArROtMu6!_xk|OdA(vS(hxC76}#BT0M|E z@g&JwLn%o{T6`>?+7J8E|wj$Ira>^ z#P-5rwh!K9&%#@5KfJ^C!29d~e9I2P59~RpW-k)KULtYq5J_Z*NeX+Fv}SLRPV8-x z$=)G7+51W&e6}?ICRx5jIE%GYm^(~jSbJsCodbU=ogp)WZJ4lYhYnrp{^oq#KG#gf=+=vkvu0*$p`Ej{;u z0oa~2OkX15otLI8SFTOlt?d~> z0{9T+bhE^_fW?k{CP{2(F z{WxxRGU^1x32hHz)3Ji39s{Bs1-Z$0XgfWX)Mr@2M!>#7^0dCVmI-cj+^%t~t$gA5 z(m}r97Sq;4Y)}t!JPv|--x89qM9gN8;rrkq!_N(ZJc#Ss2;xleAjkAh()=kUL)wwD zZYfIWiA}7RvS4fhw}X6kC?*m=oSD)QH^;G%*bl#lL!zAZC<0rWEQQ1tID&XW35g?& z(t@ySyR2sL@`!lFlB}`IIh~ujM{8UN<5IC)IqO{rBSI!Jdu|5SccW`-r);RkhAdji z`V~~L{^jhnT+G4-$rTX@1>}kd)Ut$<9Ptp>#w!?B7RlL#$^oGx@`|~V_YRql8WK4` zGfp6lYtV^P=*b!M<{bKR9rC#WXYl}>!)=((9hlE!U^#C9>vW>> zILsTvr#u9|@FsAaCliY|BMH1YX~$cVbl#Tqa( z??C48PGlbMOs?f!$o0G{S;!5tn0F^jc_vxLdy`GP4|$aLC0ltvQp$5k8ShV?;-`_F zn6`&!lV|tnz&fmKBq%uK zARDf>R3h2Maup71M#@>9!dK@YjvT?xz^yW!BrAH=fGvnyMHv zG6?@uif;H1d6=IEza4`{N0IgCSsG4zFP7yg!|(LmgSy}%E-6HW^{~5|rPcO*d0|{l z`D*XQ%GWd1E1u%DPO~P`8;=i18aEdy-aLrqNX_yya21V;(u#NSky#fu4xvXN2u-wA ztiW?iv4NV$p_S0?J0@pEyI7m$c9BW1Q^fMx>Kav@wzNi7C*|~7M^CvHD}~$<8L?D^ zxk?|HfZv+p|II+U904>&6f{2e_lrcZk66%_Xl)|uuOiRHw$@h>WTIFj zuCK~5*CLqAt+5CuGm{HFi)3XPtejSw7lRWH=@b{!*;#rxV&9wW+xOzPDAQiDQ5G_a zm0Ow=llSvwoXXg=v)6lQ7tyjP{YII#QBqRl{mf-_VhO}Y)Hjhl;c_;q5IRYNCdRcclYDLrOGT>-Qa88eCZF>Xd3(bUms(Nv_M@a0nP`l7OoIs&rY(ekiU3vO@| zbU)$tx(U~ZU8CUraE13)N`5V8(+XkQDU$}H)jX|-Val3(y%fbq^k=$nIG!o+WD~_w z<>x8$qy?{bv7Vdzt(4H4S1|JW({A|RX6JZuV7cS%H z!L@ucEaOvP1)mQ0^79dYUI5$p4A{kI!U29E;?RrXJw6M5=9j>4{4&I&b4WbDf+X{~ zqz#`(()g7mn_oq8_|;@6zlMzD*O9S&KH|~q$!xxWEZ{eg<$NJo%WotP@kL}iUrhG% zCFD(hGx?0)LVn@5lHd6<#0Ix%I$xnB@ReE%zDn!DS8M(G-P%B2q>bTgv~&5r+DyJy zyN<8Z7V-7kN?xq3;`i0yQ^aZBuGUt2&Svs$p>pXov}GPQAJpc1+D|{AonfEPc2EeOS&u@NTlnsNG`@^olEvL$Y$pD?9FYVogkB}k5g8U$X$l_U8N2C2`7$Acl(BgsJ^Blq znXkNE)>gj~Lc$i=mWT{JzsAglU0JA{i97>vb|s+^N+U>yKKVI6p+vB>xtzIub_Ax8g0@7vbu zy^g$<-*esTc|ug;zwC8vZOeIoFFz^`1CT!z{C;S_AAsg~jCA1-K`)N{7=H}%_~S5v zKLIoNR@~E1;+`&rg}e-I<>k1apM=f)DJbQYu$MoLdwB2&nXGjCS59y)( zq$xi@I`D&}Gk=cs=g;Flei8TaAu@r#Os4b0xQ|~YH}KcU3jR9Tz~3O7`I|`VyhEPl z?;&mT0ePK&NZ#Tf;eP%kioW^Wr*A%I3vh=J=mnp%8`wg{qkX94KNNS&Vb5!L0_TY^_W-5Oxb&>d`E{B!K|ROINFU z7;1Ux^3N1B65R|w&B5tfb}N2oY#B}Qs+l0|@f5v~RKb=@hnYe!!mNy~s96aOr5c@o z1)P6_Sp8dwmFdK1{EC&2+d1zypc!UuXY_*8EWKj|%?T5m~oy%n+b)+AnULlX72Bw24y zTIn4~s-8-^=xL;%o=(Q-9mzz!6S+X|OfJ?l$ZWkUxmNE^Zqzf$O?uBL$xlQO(TL1a zc!NL-GF6?$GVY6|ZAMH(VF3(w--sPaBgrts`#K2bv-|LDXYdNF#kaq_m<8j&J^>kc z7+1sTN+OAeFdo_xF>vp!_K0GBo_6n5GHzvp&tP)eh5ocd%h)SdVQ9Jd}qx@Cb&Voce z#46ZsY5Ec3Wo&Pht(r9Y=qO$GPsh!z#&U^YabDeePm3ye>Sn9kb4mYl*?fx-m#rhA zkR}_KHdv7+qn7_-MBt$3K&(Cxn(Kq0k3JZN=|kWweJEV04}(ke;jl>0#burccjzOa zNY97+^f6GOp9y>Pad1d4fH(B<@R2?NKG)BNZ}f@qoqitts!xFv`cx95Pa}=>3rHJ% z1_|pIk{o>&$<;3*qxDP4IQ=qQ+Ox^I`dqb)uU1m6^Sou8LQeCRaUXb`?NiHm7;I$E zvi;civ*0dvfE~o;c^?dxw^88&tAOt8dG>-bWNpe`WG^9AcmgJ?uNsMgQR*utInaz9 zkS-b|7vfbu_eg9m#hY0q2WeD;3>56p3CPC3f>kv93q~E2wXm0cjQ&0dX@aYzguNgO zT7u${NN#RwDSM@yy;dlha4j1r_|1ZBWIKP8^Xt#x)Z|HQlJtIUm69P{!D*|MPCa;R z<_>r@OFFw^CGQkTyKAzmoV{PDe13P8vXAyF8P-EZQq~zX78ztKJCg5aZi|nvilCYM zy|Gu|Kvd3e^S%0ti1ev^h|Mp89F}R)OsfQ%V)37XRz@kASjv85^9upf%@Sy^$Ra^Y zHnE}lqo7$BRp0NjzK7x%%y-*+C^mL}bkF|!hwoMS{_9E1%1J5b3EWz}rX~-!^G_|v z8{}{04P}9H-Z-j5JQ>ql_~|md!$a}BEe^#s%U33^n9{B$#R{55&@^ZjLCCMAz27aK znlFt$dm-r^G;nGPvV>>lS;;#VgjgaEi3;9X?ky=#EahF@ljf9-_MyBAP`?T+{c32a zUjt3`YjML}2Vs3ao-+&Jbo~a%({IGHW)Y0lZ-R65#V}i60$1rb;|5#`x9YdTN_`og zGs|IKjN0eIx0rZz6s5Eo7)(LdNR%lgavn$AzASLu@pNtmXGr~wjA@xQiD^m6I&pL$puQc@`C)wF=b>_%7pyK4e#}w`~tR> zpO;_2xALj^1^QNgetrS=c4mG}XH`fa{ViOmZ$oSSov02*#jT0zAa;e%lS29nb*nre#ZH3#sz-Hg_!Zi+FHZu(hOPu08ITOoac|Bk^U*P z(2qa|{WGK~zkr_lm(WlD3itZgFhTzort06rEd2+hCx3z)^`Bvx{tK+qe}%RBZ?HxG z9iGzvfT#68VZZ(tysRIEBlNt&;{;tk#HG@D=Ut=i+>(inqNynICZDU;|13JEfGKxT5! zM?lJ9mFGea5l)xWXr@;36$K$ZQH0D2eh1FPN}LIQ9#k+a0aBv|F@i!!FlZ}u=!6_^ zPhmhmVZvx()zHr{#$VcF6!c`j$9Q;)!x;*WSP%5}xbn8pQNfWT2hm2sQJ3*C6&wZh zgP?+=3o}E;{E9*NAS8UIkhI2p(g6Gpm)*QI5;P-8Dcr7&5DqZglPk**AJQngQ0kc` z{zqzJ=Q_x7-?s9*w(-J3=z^!!`T{r2r8MwM1>f+`$JQWZYeB?-5DlP#h=WAY5Soj4 zXfG0=yGVo~q7j@Y8pCuEf{R2Gm@SgvO8k9|NQRq53M>~*VTEWJ6<_WS56s9uxz41J z43~Rg9)eiKJsyrK!2qd(6$r7-5s1MI4;3e2ubY?i`*KrpuniE|-M@`LqQJy;; z@c)nS|EBo=Pa#wKtMG~vc=P{v&mAjh)$-i2BAz=|#B;~0-*YEqDz_Zj>*k32eTN*G z&_G3+xl=kY@e1Fs%aW;xvMfy9=8mnkKQ>le|0K#Xh~2DCvCXf!xr}dDbySt{rJtB7NSa9I&deTK2l8?5B}aJKhHsyiSj;a+4#PIc+9!nA@PEaT6e+T!yyExr(G@x`bX zU#uSsk%ce`cXAiRLKzS*x?MhNl`#- zF@Xfd*(6y^Bz?prWD3tCgT+)bOiUwV@Oi$NK`s+B$#QWKxm#RJio`5ZA}%4@#bsot zxSTvA=8#v!736I(m%Jn9k@v)G@}anr{4A~|$HaBygt%S{hy_}VSg17-i?!BbiPl-% zq74*FwGrZ0ZJb!4T_A4PE)%P?d1AG;P~5345qD{~hv03|6lxSax`?X)i1KMBWLG74$gi`S+wZvmIPCQN%#S^rZc#@`z zQrb=6ju6}EaIu|^5l_?cVh5cjcG8(*7rjWh1pdSFG@!FQ%o(Hw{3T^#)QFDdTa`K~ zM9<`hRG@~n+RMuPlff2kzcT;i@R+uPzpT{rWm*N7$|eEZv{GgMX}~9tqKJNz1j!uw zD?f~H+o7jAZY}b*ZxY%Xrg0g$)Y4YLJL=8UN?{QFk-r8Or7(lt$6xnYg8QL)e2&l> zpM=)R|2>B!=Ma|Cs2WB_tn>(R)$vX7z)v^^>^O4${K<#`V<0ww3FIhrju=OtT1+#v zV*Jn7@z?rD-H$|aCcN?(q#nn^lkZEehEz|Z)z~AE-tejC(FhF#(@wYnqAVF8st|sP zq7PcG2OA%))+^EpkCj4~hJrWPBqa3nXy2qv#-#aP7g;LErKX()SsZI!jHjoYBwa?+ zQWjByq`FK-{$$?pNWu_&>FY@ek7m{A_4LoZub|Ej(Z7ui9^s^yaIj2VdyVj zg@NKVI77S+W5pXVS-c6Ch_{g-c@@#XyRb~W4|j_XV7>SdHi?hmN%1jk7oWh>;!{Ke zAHr^Y?iEMifcOmF5}zYF_yRr_Um{94f+*nw_)>fYzlpCAHGBhA;ybk+M!S>bZHGko z+#_gu!880rr2RDL4ZHbAilFHWJNUAs&H9f5SxY&kb$@1XYv{{A>^<}U3sx^j`_UEUXmWW>=N&E&~#GlYr977Vj3bI6W zFxWm(>JjW;R~dNZYrjV~dOhkHmTq75E(z?{ib5qt>bQr0Q;6i1G~nXjurmH#6ye`g zQvF5@7)ApK8nMvCh=UeJLr68^A=3y(^{8iUg-s@Q=tp0?_nVSFfR^i1c1?@59FN3e z#aegQmPAW;DHE-YvQ;S7Qb?{;*GN)`{1Qb9y@tQ1dZbWO&m{Nd2#tqy0eR+MNq}42 zoXJ}#*HXQb|5T7Bt^4q}{UuisMp))LRpz>mnUb>8&J7AIb#B-TAIB!82E`6CV|*F^ zod$(R{<$LVR7KQEYEacsh{yHO8V|t|B6;9>>qyf7c{de3cC-Y!rvKxfNNP}4r|7|> zsr!+>Pn9aN)PKfk&m$KNMq_Y{5HvQLKxZQfGK^#xV>E*qMsv8_XaS3imT;TV3RW7e zq0ndpB}RMLZghZsMi@RcQsFBj9gZ6viEeZzrjbEnjjp7L(T$`U-AQ*Nlk_rrkQ}2Y z8DaD$lZ-y(LL-~pWb`E~j2v>eaT+Ny29nLj>7>jUM0Od2$zEd!dEOXG-ZpZ{H%1=$ z-58-YFwW3I#we}5ai*4LoTYU!#%Y;Gfi}PxuMIIKXv2(iYX}1^*V|ATT4R2USK&^& z99GdZDL6-zvru6;ir9RPii^#m5H4087&>f+JU2QJX#&@|B}gh<Z}!R20wy)exy@jRAwOMC-;-4bfUCrGpZF@pb81*KJRdlf7{CUx2T zxX+!R=wdWl@W61jq;$lX1aKftJQpNHeBEwlN(B8|T9)V+NdU%*4faAhY)&P0Au?v1Gqv-!gqZZi{zrKAg$4+(8^AJdgm_~KG&OF9ZpJMz5}*0TQaICC1{00j zV5+eKE;8s;fDe&08Bhv8 zuBd^7AFX%2Hz*ls;8Jf@UJ%V&PViA;Ze5hvzh=cWzd4gNS16IofWN8I1iV7a^#V2g z6I7Jdys-vMV=b+W;a1~eSZ=s? zG4z$x0<7>L(ho-HwvxV#glx5W<)tZ|)aGR{4ce>C%Mp<@QQ^|`2;|I|Dwu#ik|5;546vB^(aOT*noF`-veYmop#Z`R(?lKO-7UMa1(s&-W885;f z<0Uv`9D>)3m*EZLFnnaZ3f~#8!B58P@Tc(x0pm>~jJHUF@iqw=?~o+pgPL7IB8s9} z@Q539PR(sR7`Q7&ABX0GOo(X^mwXIP$9Zm~H};sLFI-_9nI>moKbeG(55>k8ld-O7 zK~0mMynzgszujNWHj-Wlsg}~KNeWdn8B$;EY70<<%o8`OX_b0&IkAK!6+wfPA_yc$ zWObP`HVK)SWyEGkU9HreVxBG`qf~Em0Qv+)AtcHlaZ>SW2CYRF*{ZkC_g|&QQlghT zIzzPLvQtoCb4kk4rIh_vOJNz1VGC*scFdOncPyowG+jAX&{_vWrJll*oqLjVDJNf; z6-bgUTn0m`#tl-Sw;&$xbmfi=dju*vuh z9yR_%a^@&JZ5%_ArV3t0Zs&6o;4hQF2~#76$w|l*q^W6;4yH*m@Y%z(NN+PhhMG3X zH64;~HXsFNESYKsqs;53`Q~-g^bA<9u7#L}spXM4|csQ&6d#EYz58D*3jN;2bpGj z$TmB`Kr;-(%~Z%YyTKH*J1jIaVX@f*O3a?{kl7Emny0}Ya}Ydd4uQkwPVK%~9IWeH!iJ86$=rDQTkSrBW zs?aZ#6(*Hym(;E8BH-r5;FzoOJt6|-gL_vUt6K9G(9NX~Z{7+`%;iySC;4qB=~uhR z9N(_-FTtX6yD|M*f8|wrO4SM2P(Z@yZ{i)vsAJ)pm`4SUmPZ7c*A$7QH{q10y?e{5r=eoH}WbI*oXmYLKsUcYsIg}zKWkr$Ne%VVqN zm+8yvYPAb8^+GS`rKbZQU#8+$@}REni_&kSUc7 z%`f3i^HU^OzJZ_2Z{ZK~dpK_XKs575BFtZrRQbJz2PYB7h`#Weevjh8&wyw2LdAp6 zf=$XKoWW|iPA}5eAa(pC(#JKy0QvzBSIbKy)%Am~GHKYY--4@TG(P-TAyFSR`L`Nc zMHCWDzt>-ogMH@<>CUbeoxL98ZXFPpU7HInu=?5avlyq z-z0C1+^v_$%e(XkkXV(Xh)w&IV|bN(E!7{}tZp9her??dfi(GArazfZWtj@Sv}Pq` zsN3H-2up`JOF(nWfHsy1>6Qfy>o~4=WLv)d)3>YDN*20udShJgT2^MZ!dQKi(at$deH)V z(Gq*n3VYESd(j4a(GGjj{_lIS+ed#lxq2d!6OqDH=zCn!ODa^t2bA%L=M+aK=cXb_ zmRgF8wnvi5I|L*0nmCr?MJ3q}zed=xZ|X2w@77|pUQ|+zh-Kwwc)GSsLmEP6dlC(K zq1yB!DB@CRA@5sCmqH9F=5PfOEXWseC7y^DM6|{4b>t61N;qorcgznl8stj;AYY{X zfv-~B)8Kw<06c09geR=i zp~4yjyR5)M%|g3??J8^boC(D z9>RJ%{ug$;D>U=0R5Kyj3z%|LZC3pRbXM5tK!0)qbV3?v(y7QF{=s_Ceue&AIJT;c zjaOky%h-lGXy2NJ-M<7Z>rx!TW%Z){7wSDtguBsS^c>jgRyzmR?iILp=VG<<>aF&W zU+oc(xxLaoE&KywdaVOuT&)8_&gL%njF2kiU8VXf2UHl!U2F%LT&BNLNhTM#A6~1_ z-^@+j3VX`*cT(dtC}Y2QC1|Q#AMe*aTCN6eU4sbmT10~Lp@+2q_uCDSYb}Hc){QXP zS_Ct!o8WTmW|(K)62)p?>5XjyuHO&UtokOLm*apx@)_Boo(ZQDi4lwZ?8kM8Piq-M za5>o4ZBZ>aJ}2mSTqx5&{o87f)UEaotac? zDSuV3VCHL8pUVbE*R=*$N34J68Xt9yJCg z|6a4KM$0(X)<%TUCZt$4LxOc5G_gt`Y~2qXtp}is^&q15hoF!3FfOx4V3hSZQZG;7 z5_=NnSQT)MwG9?nPr-7l5>{GI!`;@7D2nDDpQ4$f|Amw*!PX|}M->Wb0^{{#J_?Be zeiFJcLYlSsOKK#UUggis?;bQS{&!$J?t=07{}7Bmh%%+v+S-kXXb(8nGZ1g>MO?ZM z+F8#cnD!%>aC=(^;dJXc7-qc)aD1i+oCq*)EJN% z@LTNWZ3jJ!8)03|MzG|zwBAEJ^nO%TdSnv_&EEtAumf`RYvk#+hqfzH;_C1oL5meT0+zG46p+peeq$wmyY! z))DAueFlTA&k@Cbi4*%3TxNX@voY-|>wCD)`UP&aeuX=&-=WC*BWlvucpzyF^Mt8H zW8L6TWl7%z%$Cy6DL@7w_)b8)45Ja&jsZ?t#?+ ztqO9gU?KuB&R^H#ymcKyAU5=e+1A}jZ9Q@!O7t0M04xv(ae;==IFJyv*@ zK3*#pqFWKfrW(~bN&=052O5JJXcASW5rb5Fdzk=}7RKN)XLeQ%tmoK#a~%wm+cJdc7!0MN9m@O~(kEgUq~WuTruVNRo=A zKZkVR5Xpsbw_C>~zm7?&4hgjacf*W!x4>}Uu%*9zD;23l>f#7#mr_c8Efr}+2>1%o z=@eMwZ*||dl9`c_kv#j=t?u=R)kwNJcwMD<3#lJ0B2B`P3*ckjHgikaJB5VSx}>6S zl%y?Ok2g7smc)4%5D$>-DO(SnL#&kDd#Z&*%Be}~5q>GIkPOKK_gZ%uMN8f2^j{Oq zi7viiuCCv{$nXSmvSVJgCQtd;3T%^H3ay5oXM$MxG05(1rZ?RJ6Afv(U! z&>aQ_GGRmjnan^hI5&_5(*wQX;y@pm7s!Si0)63*Kn~m)=nwY=PJ>4R17K_5bSMi9 zg6)C9usbjWUI`3^Hv+lvb|4Qv2#kc!0;7l)7)@dW`J_o;4Cx#=lVkFOeBi}lgRCXDP&7v8hJ1$?w@?&5YIT5%-(*l>*#HZ9~gi$3Qh^}f=bSAHfZjwDEvG9xNt^&q%hF4vA zAGsZ7i%hy1IN1c}M#=laV71Oc)~hK&lK#?`9ZtYp8O#BZ?La}d5E-+Hx)C2Fdg+4Xj=@Be=1ZpY5uft_24om+*STaBH&`yV=&Q=gPh^#3=q zLUyW@E>MJBSc6B|y$~B%3(W)Tuq(ybl?{I@r4s}EUR>h!qCNIv;D4zDE(|tf2kwJF zU<)J#O0WYDK)b+$QH{5+-FS0se2~wY-Vur3C=av2byc_jN>}Ul;t@P*9|b$`ID`UE z;OgFrsH(L7=#3sL8-m7BdRpb&*jdo!*uA0kcW>DLpnDbAy=~aNr?7jK*uAH*dprM| z-OKf9(ovq1`*S#TdH?g(T|;V$Gjd(oDpIqfO0^CfB+nr4mz2N4o1r7VjV9$HzX-BY z)%Dy7sk^muB|Z^j%LSsamZ_vnj4DwVd397wB9Wy=`I6mKS}x8mR2IRA`;0oQv0@1V zdvI+%gZpbQF6w=_sGr6C^*rLJ7hp=@MYt^R5>l>*V0GYSq*`BvM+2|HlYuwj>A;(? zH}Do547?jf0X^q|I3MPUN#Z<@*opy>*y%Wgg*c<7NK8QRPOcYuO!?nO9v|W0KE}a) zf`j`M2X_Pq_r*UTk7*>)>)g4X9YL@zQJ7pIrq`tkzec?O4N`^Q;z9mh)Upfu%P#1} z|H3zMfs)TMF~g@ouka|)W=JBi@$%0GSGW?88)K#nDU?*sKd+0M{=!v%6zPX5JaUfX zNKfGEKM753h?^Cqa!=z=^9ipQBFH?w7YgRvfsfoJ8R>UAOJK1whK1COPs-Abm zDN&P7iM=EPSGzHs%y3XIXOF2%*rb(Zp(3YiXSVA4`W9rGh0vB(-ZJp>N3G^m$1#{6xrR^2)XbY=^kKfQF2G>G93V#hff#W{SlOL0v{d zl_??ow_IGQ1P$UEC1{XAqt;?g$#P5H)Tx}=A zGCKv<*-hawyBTb?TR@rJ61Ll|;03!id}6nS&+T^btKA-|><)0;4#P>i4Iy?qiMKnF zB)cHT{MP}PsWS-rd%(t`2t#&_hr`?|v+NY5sdjPrD z9!S>Nr;|r8?QuJYY_$iIgZ5DJqCJefYY!)%+qvWmJCA&24#W_ZdUa5V`Qngh3!XtvXv|mOUVX23qOQb?gb>|S(xL#K^a*jZdKl}@uaO- zhHn9qM4Bqf-6mUMiPF?N{Gw1SdY|=`ADRm|3BqnULH*3aU)fQ^gm|SWKOMtT@7=< zshh_O8>in=V_fhzc|1FV)_(92CYINy91^!hXdU-a=RC2`Lkv3&G3<22u;9X$SIz9*~#mmb+WvJZ$_^2$xE)|lE;$k!QeF^IGRT= znsj)Uk_1drB(0~YScjx;wAP{oT10)T*D<5MAbZ%$hN(2fcas_U;nZ?bl*MIpPE^!D zo+3}b@TqbNDKF|E4T#t}Wr7ubzR!Xrgy2HZ>>DB8UIdNon~QDL+x8( zqP+|z+sk2wy#lVVZ-<5UO1Q~h1$Wr15vkq@o9ufKnHIthy9l1O*T9SRS~zU4gZJ!W zIAU*rWA;V@_GTjN`=Shj3~$0TqKkE0-ozdczl-&XQW^@olv56ciSUppMx@4IJDj2J zTypP*P6BZPdJ6pjVwx5zie3kjBAwl}#xXec8~mwnB+W^%z-7@hX8E%OZ%L2$3bC<7 zDmvkvK6nJdJ2F9jQ{mJ--b6;e*E*Do%~J4B($u{Q8lHD0B@h@9PQp^@yVS#nF@bh) zHvSud^)Pwas(n8=_5+Y$KLknk!_drr1X|jULOc6$NVA`S&h}R5VLu7|?NZ3K%b>vC zhVb8x@P7)X;&X=mG#+X@qA1SGJUF(4)5HVnAm|T`wGWg*-cdyq@&uhN-+(3fTxP!o ztL(R<A8M+r&Qs_}HKfw$?x`!OHh zFS&L+aM%ZN?H!wa3cg8+1R70|G%6!XkXhTMSeJ2kIs|ov%kaB$FxG2hvk-T0HF87O z%R7iuWTf4*b7k3vAx={jfW`s={RtwJ zBhcIa4D#&HkxKglCfHvhmG%`}X@83o@;%&Q{{XkyKf+!1Pq5bh1xoB+;ZgfH*k}I^ z&)I*%EB0Sep%4yxlXMFVQHX&c39((F4GlWL{VIwlg`QBTqIfds4R(3q0W;XpeYKrXz5B zZ1vB4Z&$?^E0seB=3|v|QCcJY&`NSW-X8h-ifEgd8o0KUW4EjD6g-aP!byZ}HFR(^ z$aE+SaTw$|dK51>!h=z!lzoV89xrHu)0{#l~O>a+fH;;};sU^+pF zbrPYu(+Ju)AxLwY{JlhPSAE75Vz*~HS4RWpq+laWan#M~Go}#F)N9(KE7KmaSG}G> z6gn+IIIXbC*3i&tQ!i2YtY7UYui8d+?N7yiM6(BLs#c10r#)8P0b-mmR-FooPFhs; zjr{6g_!rf`SYP#>u=>teeHW}g1FP>^Z}o@%MfES&SA8Z{-vg`fiPiVQ>a*&t{_wx3 z{?+=b&&KNeV)gy7`W&pjf4$Ye{x7P3qrU0~V)dtE^@Fhb!C3u}daHllul{~dW?FO8 z%Wm2(H+2vHsZd4tkgmgdscEG;FB5O!Q@mX!-YY?RaSwm85CW-4F20Xn>fjJ(7&y*w zNN{o?*~x>}&IsHQXCNLK34NW>Q3OUmuS*VOs0%Y?482&&X~f?iv5DNcw4EfpKKy5c zXz@|qb$%uS8%&uRT z>S-wZOK){$iNmFg>Qh$&*-Y8h@Xa!OXp|^2$XpRGq9dAJzZi?QsZo>CP(&_;BvD?Z zNj9m|Y4ub5lGgv2mWj_!6`E zKZme7@e8&ue#dh{zcbP+qg4DJ-6!p;NS|a0eN&nELs>(XkSi<2pS~rdII65dTtQ-) zIQBPDU()KEz%o&lR!}NV;&!YmrK{sb_51~8`12GcvH|s^kyAm#3#A`y1T@?OOP&|@&iSy!nE|&sGhv-`A#8FkhAqx4c*wa7 zwmO%?PG=50@63aboh#vM=W3{Ot|5+d9ck^%C%y66*SVeya~6_G<3^xrxkn7L)6o zC1k#HGg;u=NN#kNlBLeAr4x4>-4xN1YYq3FmgQ*I7m0aqc7^ICqh6ox8~& z&OPK$r;r?VR+Hn-8clQV)l6rt7VE6jlAQHgbEjBq>uk_EIUBWXXOniCbDuWc*`kef z9@O%khqcMhW7;Lo zXE%*^Drus#mo|0w(N@j@n&up&8P0RGhx0t`=e$6NIxo@@&LNubyi6xJhv{VJReF*0 zI=#txgRa5nI_FKg#d(W9>AX$1Iq%R)=Uuwjd5<1+K8gy$7t!?Kn_($_=u8-)Z2vSU zfMLq^kHNVxP}%-**hyA;k$9dbi;aMa#Pcz^REZ8bRFN~qPbx}|Lk1YOimNjWrYb`K zgG_``o+xrJEH@k(T#LL3SG#H2WHKGo8i1xPAVb`mwV&ZF_0^RO41qw8lW+zjiB$br5!u~Ict(gn8L5IL$$#My#Ee*9U-Kc3Kyt_h z|KY4K;{NSf@sEZDVR^nepMvEa!87qQJfS~_kn;sn`CmdG=W7_?d;|H;w=mB6K8j^6 z@U=b#-V|AIhBrkqFx;D>1UTKBBJbor34IV!NjTPcpF6$Qm6pNwaD|cJ;)2H`9wH@m zJVfrUy1-JGiyf>rNNIU@j>Uwl+H9{3evb+$= z3nszy%Z$WyRz|i*jBxm=?j4hn$pGgkB+Y+8I{H_HlB{ z-I>@DnTfS^W@34*nYg~rOkDCGX5#;2_@9FWEyN&|7n1;im>?v?Btq+$MvxKH7&2p; zK+l+DI4vdx&Wvda6Jwgg)R-19Go~fXj%fvRV_M@Jw1I^&ZQ&;Ty)>pB+!NCt*2Z*z zO)+73G^SG&>>u-CKi7wSfd~7EKI~`uuwQyA>>owgH?QxCCZomQT+tMhfurk&qw5Z_ zF+Kk7iY8{X@@v1fhSxS)N8~dZNYtwflTwlN&;|O=aULqcFB9`-iK&&4khKn5k07PscA~pyS z8;pnz{qGRVv(LVP<*Vv|*{9c{7*Qh-_d`vop?IQNXhU3cFvAk{4*Fx&LVHsaW-Sa# zsLOto-_m!>rjvJ52#>m{*U{K&&=bT(3Eme}3!RF%3T%HAT4`3b(6xxG6?&FLIckYm zBlI3tuOrJvp{7rj&>y8N?m<(WqPv+SI~fqFsnEctogO~(j{wm>5`6wqNU6~f@}G~? z8Uq>r63FzAgM_~n+WIeouKtUmzkd=8@m~VN{Zrsv|5P~NKMltCr^8tPWEk(C2^ab= zhf@D+97S_r8m4FZ=fZ6Ne3;|E0_ORzga!Tua5dg9@h^ni{MW$!{zXvkUksc5OW|Sv zG8|FYAxB#d`~52%dbR^rE4iW88d;gJK^P#AW3&k?WVZ`u;zayUdWLri^tDoL;Z9)? zRA9pmfd#@~SGHx{*OBM@2k%x+iX@o_J*N$H=Su2 z`ekD$DE@EFi2WzUYy5(W9-R)3NAL343``Eu4#;i`dH?Y2d5GJ9!1gH6&QkmlTMc4`pOds-qE`4h)P6}ysH~^Kb{*Aq_}63M8;}ib z#7?{k+5Kk6@b6*|{~Y!ns=&2}e_Ib5L3u?OFHC@>&sOvJMRxtE8N~4doV*00-#)n> zeAJ|&NsUmtBX36|G%7&yKLi2)!;t3RhBMH1hkheTaS7sdubhDZgt6pFmf^h!%xP%B zc{uFS!em<_yu%_@$9k7}>mkGP+3HzR26Vs^jR#rfR6rnki^Ae1jdU^o9XS4_|I(*lDodO*{QOZfkJR4&Qk~!O?*@;556-B2A>!YM9B@BU;u&b;e;$hb zFTha$L6jF>gcAQt$n9Q1dEr%**Iq+8;dNN)KLoe?-+(p#!?51}7Hsh!skcsst@Vm$ z_9*)S(y9n9vpfP0h4Ge0z!Df{c?2wl0hUL=>!5|hBcN<*yqLF6(BU)79zM5QeInl^ zyM$!FyaJk$i^H9E({hmTlC}N}8$Gi#yo=R;53Bz^j+>*P`9Hu;`%ml;A3~o06Gvyr zx2lr{L1s22V@*on@}GhzL-(A7IsfKxp)j|R4%`1Zmiz^l{ADT~wlF`HK3upW_2EMQ zzi{M#gRs6$32TAvzULCl>`sfVrdy7TWpgK7)mYH_9wGjK5Pw2u_OoLEJ7R7MNv}Pc z(7yba*GltjLs1|vFy$N~H!z4n#aJ1>#XeJPi?#r9}L$RK}CS-A?1lGb~mD z83?iog3LsmoBdnkN#Wj9rbEIi8kdS{&~wk+B?_R35XeUOEfIdJRN8al{*)wmfPy`< zPvs!IT!fdGk_4;&CllbBMm#Uj1{<|4L<8+0GteHg0v(`Lpd%Cn3ZX-w^WUBT*V%UF z11;o;Ij!(uBkwL|J-Y%Q=mt`ty92yzgO`Q%=J{;Fwk2^KgR2oXri9rGY1bRXK%Z2{ z;DpUKq@|Xfc|JngVj59o+4FO8A_t``YAvB8m>eo`@$IWU6^&%cKz}T40JhXXFam>+ zaDyQ)Ff7FcVL(Kvu-8}E*YXgVhf>ZAEzFtW;l>pk0iM7}ENWEBPVtD{DXz5Wo<-=s zJyw?N5a#h-wf=Z7(_o~S^*J9~WDHVoEQA6jkRBKZEdm!f>XT)+PL}YP^K@Se#KE?% zaN3j!JN|}ES)df@coC?9iy;zl`WigbrcBtGvNJrHvNKFYu+y+Q(^Gbas+5qbQ$o57 zAxItP&28y^;mh!n0&I zp;9lJ7KYhNWIT(Ye_%0;3M_$=z*4v*unaB_TnpC)R=`bx8{q!Hjj$!K5*`iQ3_An2 zz>|U7U{~M{hfwmA-B+Ko7}Y4ai2YD_&k{=fz_&UDB_3vN;so$SRD0iU#*3|HY=X^r z)LdMK%*7>*v3lmx(wrFY#>Tt{$LPISomG$#a4svGG;CCylZ1b!Ebqg=Umh+j18cB6 zBzs^TmRJ7o%lp_aufJ7Zput4{N#lua6S4zbSq8R(KTzR-9k6@;Xa51@=Z!%=f*`je z$j1=m<0(OY`5!=j)fnWH2(l7ERwKxolpz0QgIs8xer}C`zOhG;LPM3)5!9{TN;nW} zper&tq=@$L_`6y5GSeTU&)jA;2C2NBH?xh{t!rF$<4rkc@1XQzLwz zvs3tStHqnS78Z+c+}O`zHJ<}-;CToJUVyZ~i;hwqZZp}}h2QE+O~X=ucWnb!_=8Xa z7~weOBJ(XeyibN|wQ!K+)9tbsL9-z)Nb?sGR)agke-73d?xS0k`9&`{PwcH-7cYQt%i3EXHKnT1F@xVVI z5qJ&S2VRF>fkQAba2SdMZy}p`2TB9)!i>OsaCP8)SQI!4w*)?b+XJ7#s=%kPIq(@g z5%?1J2EKyV0$;Pg5}F3E?t#A`H&6$i6o4*))6h*}fdsZ4tZ*<=;bFAmhVhCACMp6kzu~# zg$0Tq7Ah*-tZ1-G3Bo2thes3x9#g{bq@qA|;Dkf3;NbNZ@p-5ed(yoJ4JyQ5uoH2O zzy`55)hndKTCtBv9EvoBRboH;)N>OM>hPi4JZ>QN$Dc|Fu zGykMfzr;~x%<$MFhzCQot)yaPV}&q+F#h@gS?2=04rGgx!~>>zOd*i7g}^icVy%bw zaWW3m9FdHuo1_fnDHZTNec04~m}VM8rcsv1N+_WqqsI(^zP;Z{IYr3rapkJ@uod4H z>Dz1VhbXY$VSm8+>C+|FQ__hZp)CYmX~!XZzGSlqIKr!2;57?~IBp8270@43Sv1wP z0y^W3kKW|lrNwDAxH!!YC$m|JN|{&_*KS(X(J>{q9)_8mVSvfI#9|Ujp?E74ny%6d zkoM=5K`Z=@BL;yMzX`gyjpT47VJ`G|7kiR0Akxf~)eW#YVGF=erN-=5x=#8kM!%xFU^J}9PKW8UY{7dpq3rRIGB zy>As$mYDbX^ge9i6NNgPpMdEj`1=HZrPw9b z;q_AN_T!L=PBhDu7EpgLAl-q#)tJ}Q%qQQHt7|d-rkZJb-wCf#0DfA1-v9hZPM`Kh ze311?d;Z4z^USL-0>Aqj(=G9LBmP#I`SS1hBQ(1&#kY(9U*gyiX>reg|DB9nT7Efh z4%7>Z*-WQ9cZ1m+dTDzpc(7zD^6+b`oP{AtPqco+(V6X_aQ{Ws4B!Nf(u(t9FCcl^O|^*2`E_{wkEU1 znos=Jd=ap&ighJz+}mp7-c}o*u-bU9&0A6An&L7e4|COQI$e79OhzQ;mXs87Wyt;T zJ(IJLWv9WBH7V6RDQ=XfD}cziO?jG(5|dPdFy0X(RT7JkB&noNWc~`_Eob3b$@fX5 zSwT5j0laeR?B71{fB1HS^V{+DHO8evPO`>WU&UPxs=+BL3Chcv-O#Lm#eZ3%=NrdN ziStl71WEi(Z#j+6$@xv5?IUN53GFDm=Z+Oj=L}lUY1q@rtM=n;_4Jn}BG70G60? z2_OVRmFl7Lav*v!3(4hdYM9wK9;AvlRzfF8TZmbBd}oePN|SzgCFP!nSKY*sGk}EUF=@5WqSZTiZ4KnG z3*iXZ>-bINc#AEv%}rFgE?&=*v#&vOP-Ztc`clEqYw+SF_=ax1NJ+_$Zt$E)Wrp?K z9M62a1}~7&9ioV&HOMEb%`nYpF-78EUrfH{er-SlCLhQO3dL-^7UNX{;;YcC`)7EK z;B^sRNn1RL*XDSA1+O@#!o7HHg)k&%!5qR+YVbH0^PAE9W)1R*aNV5dJJI4MuXmlOCuJ)$j}XN5S)|J>OVbifPoZg*rpM8Akfw(x$4VYh zLm+Fbhj_vPdg3;N3YSF5*@Vn=_$BQEEkp~nCOOEO&E}Gm$k{nGwO7t~Kgr+ypbd;u7(X^MQZ=z|LrWezaG@716 z(>hIGLepWIE{Q90IXgP8WR|nTFkdr^>SOg-%15!^acTIA0nq~hWLj&f3O0tR7)_~; z50Dpdn)QB1i#Ig>O|h<{@HfE@LCcU;nPzqbjgpJml`M>TELj+{nRL@+zhFp91ns+( zsZ{awf{n+_AVc4NcS5qi(YxW+&Keoqc4ikcr0u&LGBE7Bbcz}Q8+4M3%ng)YX@svj zOc$)&tSN3=SmM;%F!vtA@c_!M6$mj79wi;TN(T6pOfZzDkft<)bfq~oQ?j9@(h_o&*3eeT zfniE6+^OWleM$jrQrf^ar7b+Ew1fRh2RNv7gx8cpcthy~?eydUQnm>VZ2ITCaCmd(v$&Ax-y8#Rt7W0%1~ysQp}vM3}-G-&S6TGk<27zG&4gv zpP8wQWfm$W%(cpRX1Q_!bC)uac|e)MJfcixYL#isOUiWSkTQe$UYW`KqReIfROYdw zGM`nHE7-7dC7YovV7n<-vwf6>>|o^@c9gP+Em0P;7b{EH>B>@ep0bQxs9eiluUyC8 ztX$9Dqbz4vD=XMd$_?x`?w}lT7b$PMyDRUw z`zr6b2Pj9~LzNHQBb9%;OO%h?6O>Qf7b%~*rz)ShFIT>B&sDy1U#)!YUZi~EzEAnq z{h)Hp{ju_+`4Od$54Lr#FgJY&6Phqxyo@*f%2!PlXB8iq@42f zS5A9IsNgwIWjy0l)^mZ%d1k1*=UUb6xm6WBcd4T1K2`FRsb0@k)#urx`aLhIisv7y z>N%`xo+E0=^Qju~{HR6+zZw$^H7-QdbfG}a5Q@~MLQl1s&`-@02C6NE5o#-8tlC;A zRTIKAHAk4I<_b5cdBR<4zHqNvAgoo}2wT*)!gjTt@Rr(H_(1IKdC*06KXHv zwAx#2rS=s^sQtyU>Hu-PI!K(P4i=}VL&eM0VsWlIT)bKxDK1h+i_6t>#T(W0#XHq8 z;yr4Kc%M36T&I?b>(z_JN7YGUr8-%xQ7@5l)p=4|b-q-nUL|!=7fQ?3Mba(mV(E5u zskBPHPTHhiFKttoOSS3^(q46?^s0K3^rm{VbX2`n`cS=H`cAz=`bE7{I;Gw%)v5Q& zK6RC>tM|)cwM@=ZSIfETgK~koUM^BM$lcXV@}24y`9XE7yhVLTen{OWSF4Z6d(=ne z{p#cLYw8a9h`LjLSFM!4RIB7;YPI~Ux=a2;ecH>bwO+5f#~V=hdDGSX-WKXJ-j?cf z-cIWC-X7`;-l6J?-r?%Y-ihif-b>V1y>rz=-Ye9@-eu~W-s{yP-dokTy?3bZdLK~V z^R7{kdN->dcq`Noy*t#8yicm1cz3IxdiSZHdtX$)@V=sc<$X*2+WU_BjrU{qTkmJ; zF(0Tu_&n;5K1u!Ar>ejCqU!IyxO&`|rT*z_rJnS)QBV2WtAF{rsdc`d8si(NvA!W1 z=Nql@zVkJ~H%SwHmuix4mge4MT@Y|<7Y0HVOwi^9CTa5n zQ?x4sbF>A4`P$WirP`vvP1@qXT5V}ytF|ogxOQ!zM!PQXjCModdF{r)aqXr+op!Ur zYPTwqcAMhU?odM7ok~=@TWO}=SP;HcvkV`HU#CCqN7Z|A65hmM89flF=$zyl2=yU_i?JKp>#tPmi5se#-F(ah~;v zCt;|k<4G7G#s$L=qljMbQ!t#7PJrR9gA4}*yw(w`4=clTGV1$#FP(zU45C~I>VJG! zBqr{RFW@@`J(>6kkP|H>NfsrU*7+pN7ul0AM0B@mk{Q-n-$@u14u>dJA1;_%h;z-+0rqtRAL`lkH zlz}g%B+5xdO>r)9t!*^2l+f0KPg@77Rt_O;gJb(CZ0~@C9otVXV2~8z754t;0Ly+^ zPt=H4ChV0U@mn~ikPxUey(hk@6& zfuuc>+R{f{BrYaRBrZv1k|8doHr|b4K8EN$4x+Xrl}UzptqtiqtIF*V(shYO{va~e zQ*VPArfi!*C46fcKuc{GB($fXtyb&6qFqBThY1{K z;__4$VB(4daX)f~1(>!MOWKDe?N4RwBc?P16>m(WGy~P1MOe=vtmjk0TA9k=O}r^# z8@#nY)8I{e5kbC$AYTSednJ{@n|MnqD@^g$Mpl^GYY6D|R92W`N~1yXjznYUU1l8* zBb+x8p|?`j@vfAx?mi2wcM#UQ2Yt>m`eSon3iLgFQ2`i;lp!mR9V10tH zK1EocrG&LQC9E}Pf%PTA`U+uvoeCC{(gIdocNSRRBCPKa*0Gd$J!r$a%d)s@g|NyU zrtlXNYdh{&l?6NKR3jfEW~ciR%lR2O-!C}oes%DXq%&R>!d8GGGVYoKTL(=k`zHaE zNZ=siNG^GA9ysO1l%|DZO4CB^4@BTNGMqnCGMvpRiMECA?43!pQwZxc678>)M5{;% z>!H*Q5X5=}S&)OSl(4qhM-r~2$ApN_qZ;uM`(W9Ac5ZP_rTFMU(D3ru3*aS}y${-< zqQ@o;Kh8<~olwzhc2M6_sHsN~`EAexYEXbyK?ynsWf&9m!uX&M76tvVEEs_6g9WoeLdX&^FkSvOS+TOMA9J^s}%%vs1R`lQyh7t$DXA!m3O(4npT>U3$y} z>De#{U3!BVj-D9|w#K3ppapZFNiY}kgL%+CSO7)AHjeSu)efDZTeY_&4PqTpof5m6 z{|$CnK(GU1*AcNRMC>{tc3lv=qQ8sXQz@}~`hSC6cf_s-V%HO~>xJ0$M(p|`cK!Y? zcDqwzx95L@-9W@{5MnnNu^WQe4MpsRA$G(6E_VA;2nxy2XyX1v%Ft-Rk>ClA!md0T zOFlQHppe=vlLhwKvw$6gV8R#0=uh5qAL+XClJ8Fy)A|W6d!$ zK%@-dRfP4@|EJv1(ae_=r)HHj2BQlZ=I9b`r})a~8veRrIb4RFg4JJn>K z?9{U{&q+v&$)E=>!45J7It8b~*x)pn5S$Jd24_HNa3)+7yc}i)XT#j!9JnSp7a8e1 zxEJpq2+oIf!7Gq~E`aU9tDri#5cUSIfmecy9L)1oi>|X^qIgJr11b9ebZ{_FWZp$4 z*F2oE4c|Nq*IbHtFT*yxHf0+gNeS!iv%p%8uvQ?f8&bl0Hzln1&I0Qugmp8*x+Nv7 zqbbMy2WK7gmsn#S8~8tu`P;GRJ8+2HiDUjQ9P@W$lirJCepTu*Z#9Qw%zu~?yN~`i z*gb&Ql_7Sk5xX^r-CD%%LBy{7?_&2!O6)%U-(a^9vD<{$ZAR?2Aa+|3yN3|FhyN~i zpQps`i~kLF+Y!4*5xd6_yT=i`9f;jd#O}$zi``eY{(+p)Bjd6cv1|L9Y>_#g4jynV zDkB#Dw%fBs_2D7JZxSiPLzpO510SpbZ}2II1)oMitQOJR4LyVV9K0YIRTWcKh=^7Y z=BA6^f_-kVCqY*H&O&xOm=Vi*lk-P#7oc_U zAao7B2)%-@I0CTswz2JPVT&p82TH-#7T&IUXBNGH5q}havdL`59L!1N^iX}0V@IKGosI{1T!AQF57GJ=N@&$k>7XmV`)a>V1} zpA^3w=Aios;^%=D%x~feY6PoVu4rtZkFAM*juB6be_6;5vd)-DwPIZf;wv#bY_3M@ z9emf(ijrNfBymt-u8XL%0pyMnFS#LkcHTTdF4syPgqmI>iH*U2;2^g{KV*ZIEwCiz zrOO#c@=89dfakFQLWqI(S;p>(7*|>?v>)Ec14W!njPc!a5$Etg!MTW|=~~HOk{9J_ zB&8lX8Y?yUDM-Q3aL|2@edG(s4t@za!LOkp_%G-f{03*rZ*i&d9drqP1>J&9$3O$^ ziVU>eH%QRk@@1<*N9v%#g{>E-mE*8Vs-&GsvmnweuSPN&)9mNeG@}jA*wkZf>Jgen zQZ%&`rA-}c4FC7P-PCa@$y6?-9Sk5)D`gP0iA8CRlvxkj?9nHXjh#e3aSBJ@Y3$v9 z;XHZ5QJsKYTtI4W6&H|NP`_4~vZ}*MSwau1;58P#Iwz{7>@x7zO07+@vdB%;hnda9im1l4bkk3fllC(ahZ+{Eq&Jq{!FbQq;)z-Y`Hqi4ccy(yIF&0w6~ z9LD2)sonxE(X(Kho(-4lEn&8v?HDBUZDP*1i8ngTPV5;g$js7B|~Uej;0}Y0mME(ma=KSBUFy^*f_m+*mqomJHEkPjnuEc zL8wC-Jr`Vh9)$ILi0cK=L~jGl@IF^>4{h}h*eHcCLGKJR^e#xqBABOlh533nxI*s^ zSL!|BD!nIMjroi9-f*qn2d>lm!u5JTSg!Yn8}tEiBj(?t4}v@N!EmQO1n$y@!rgi? z+^Y|RRhVCauwEYx8!@lmAX)r!D9Y6O2sSXs7iF%Ij?vaLg;IPMi&?5{Xj-c@#KxONQ zqq4~0t%kTVX|~;mY2@CC7`c~0vs(U}lAKIy5hV>HizsQt zXqU;UM(;2mn|J5$a24{zYJ{=OEwKvZ6v0e-2q~JVlu8uLQfm2f{AQ;#p@!eEqtW|q z?DwL_tVl`fTyG@S=i5aFY=f*ih2w_Sw|q-6QtMC7zBC=i268C^zqp9CO}NT z0DIp=NY^ifJiQdz!$r^z^9%J!$ObOK;Xeh3`Bb<_pN2hgIxNsKQE2X~mXWKUw!Xs=;N%5noDGOD#nIS}5I7Gba9 z;TYsei=`#tW(3gqmDu+@(o!(jRpzs0)={1Scuqkf<2wZ!(n*OEy{ zx{h=bUNU17xQ4rWpb+qgA}m=A;aprzKP6qy!kFBh(h57Z(oDr@vqtceT@Gpt8<#p0 zVa4^#rR3}nwk*%}pl4!vUYBmUcMbUP>)UKNciO4D?bN+?>OMPFW~bKJsdaX0y`7qn zOmQde)L&-G#$uy|#pXu&6_}6psNrWOfr1RyNsbLs-Zvef3}AY`ndUW;||Z>@+i~k{ROEGUhQv?I8;yvjK^3 zkVDUo>M^(0SFeIuif^QqGgsjyR?f`9i+4TI$yo32YDf-z>~cPS+In2y0we6yFgvxo z5iR#wUmdW4cA!;F;vJ)>r@lxU^p(?>r`zDF?9>#yF&=7E#Q#4#Q{yH~-=1VFOdlfC z=nH|>7lBt_3?Y39${Nccp)W_7Vgz`gbM@O`k$yW)Rd?X@ zbSJFV?}E+x-SC)x5A4$Kg=h5p;8p#8cw2t}KG)0OdwmU@($_L>eI29d>zOot1JhaG z#PrcOGyV0g%sF}mQ=)HUX6cVGSLu&3OZCT?oAe#bo%$2ZYW+!OgN`F#uV$+B8s=Gj z7xNGOY34({mia~B&79WvvYNh+jq3;4Z2cLwjs7fKq(8?F(w}EX=?B>o{Y7??{xUm5 ze}%n5f0bRTzsBCAzs}yHA7a<(Z?KQ(huJFqEq0%NgndbWn|)J%hyADiF8h`K9{ZF2 zK6_F>>f-eeTmk(i|7Dv0D$YUwpsCj#vk{lD=H4hrr=(iuV=@DA z4JIZ71)xLqQxRQ`>)(N@AA^YgJ+#(;K&kX6=%N1%!}MPq65}*m2$`0gI$)YLb@YG) zr3(kcASS&*rVg7f=Cfs%42dF%8WvGB?_yVeueEp??~nk8Ipn`iV4lTHEt-=mqVRWk zhneK+lRQZ#ax$x>BlQBGS>Hc!RQ!ok>7_8U9xd!7{dyTj2JKnBu(qk5> zi3j*hO_Fe#A-yBLYt`i(tO+5OCz0EhCbBvdtfGJO-%ohr1YqeXnY(4AiBG2DehlsAM9O0)IgH3Y7d z2;Sq&tO@I31W9qF9h589L%-z$TLEqq%FV}Dl-K=EQ>&r1_1bD^LQ;Hb2b^nll62Fg zXb2vJY7OMz@pJw7RA_E!kY@y;y`e*~VZb>?2u2xU zI1jHE8d12>NQ2vq47kf^0&9#+*kCk;8lxF}WHg6QjTZ2Qkp*Al^|;ZJ5sX%h-^gQh zBcBNyZJ8{i9n;!q&m@cvOpei!$u$a@e4`W7#^}tn!)Kk0BBs01mFZ)2V+I;Mm?1{* zdaE_&TwAC+mmO>gb>~t)ZY)iifu%4deNKm3lxfSogzxbXXY!>l=xOXGOpf#=4dLFL zY014z!u2qnASit$eT{!6T2m&T=l86J+tqmHqiLMNdY8!!YP2^quNZxAly zxzdw#e740rz)cT3<>zb#K8MghkI?^LG`vp&GezoL7ymR;#~J-WFb05R3{GzKiq74JY{nSam`9f&z8P1seq|(abZrqA4=cR@LC3_(lP3u+j7Dvoq~wDuKiy6 z0g_G_O*LXu>@eoW(SD`{S>!WSOm>vR%)fBuUoHJuKhmip!x#a)F%ta7DA0}3kY=3g z;G|7$Oq)u-NWW4{n_7xPlJ^^JFFyon%n72P`rTG;C*2KYCu*cW5-#FU5dZWg1{4Vk zz2Y2Km7C9Dt32=4Z;nulDq{k0#sxTTCL(4RLeMCMm~jzg8W%&BG0CCJPSP?4GR1*G zKJ=#>EIu?0aq{BRJ&9O6y+%4g!(CNNr%c^%1vzgyBpv_sk8=AxE)v+GQmQL*N8Jv^ zKoeUrV5*6|2!b>_x5L&Cd|UzJ5rPa9g3LC8(Al9{XzePLDOQkUAH;mSdr_Co##AKBr4TSKgOD*3Niqvs8ka-9F&p|Cb8x`V#lb!g2m5Rs>{r6Y z#sZjbTm`d@t6_z)5N~KBig)XGy@hie{xf%yR();*%|Sc5AoDfrzga(#F>fPyBe8>hnrl1BhphSlJ0R3dKn^}L!px)ki-Va zC+qbn7qV9C=MT@LpJI2xHE&*}?5&c$WGf@Tg7Ma}ed((;a$tA`oR05-!-$Bj=&lcY zV(GYv=9_nDzImF9mja5ZJIcqo$ptG5JtlH147Z8gBEw@MHxGNfs}M1X;^Ze5tR%S` zvBQcuwF}Ed#t`E~pC&wrGn7EE5wYZ`=rRPVVb3UuVg`;p2hxb@H7k?1@zR2oHL^0?bmS%^@~Y*aWB=qa$iWeHJ2IO)kbw6@fc2-kKS~kQ)#6frcSKV znAO(a!F4#({UArMjt_&&OfjW)Y5@pVYAg7y_gcd;Iw6x#Y_q69$K&{&LZ@aA41$a3 z)GR;=jF6)=1no}vl`8r6#c>tzrzmtg$M6v$Z2$vHlPWO&L=XxAd~KG znA7!h5D@C1mils8E=AW9C4T(B;B;uTZX%?cMY>ZudpWa`go{~9f8VCi<9Fk2gg@V zqeYDIE*AMdXvR?p8~;Qx^+ObhK7v+;(_?PJLLrWQ@?-3iw#Vr(QQ{+wSh@;R`VkbTOl#w2+kyl zMn+A>56GT=!~%XoGXCsnHNRB|LbRPco@3*SXy%<29mM~7ZY3P5fuhdmJkWGP663=Gs*Hh z?IJD)(`>)FDMS-bYxxKGZ^~#{`TO~AD&_7djx;Qb_PS6WctZK0h6^x0m$%UB(Zp3!S+@$%6O~+tSUx?ei-jy_>SFAsx?_&QDANhG!zODFLZ|~aS4XU5 zA(F2>WQ3e9Ycs8ad7Lo6v$=o(u2VQ)`B>n@={6oWT6pAIcx0M*Pz^Xv$XwL?fo9|M z$r(6xL!7!JPCXzq)DwGrZ^**?M5wO=r(7GSmJXam5|=?>!VDrMRoY1XY9Y1ELTbK= zlzn0uS3)d#UW8XNoVtA>9kF#KT7)*LL!c+m7(gvnrPfV5xyfHOzZ* z&9Ezao1>!CA|f;ZD>@J>ItT`Z2E&lh5GW1}h2f!M7!f)L=7&bZm7(+DYJ6u&Xso01 z%k0Wuv@h^`#>PI?u3=jB9-PYwkv(us`Nyw(xV)e9`HAsy_e-cqhG^jH=Ew7 z+T&+5>g8Cq*;utX*r;={QRiW!&c{Z*0vq*87!_Io=Z3C^G5F4e&^3ciB3dg*X6gMQuq~XvQWI`T#+KjC?e+r`viBi@;d60$IM7)w3DLAJN zCT4j=F;pWL*OzWGx|@+ww}2SB739!u4oWCCC1m~tjn`?HC3{>gv8>_$sjPDvmvuLm zbq|(xFP63HzbK29hbGHnc3L(kKQP6%6)`UOdYh}fK_nib>G`v}`GF@1(XsC(xP((qLL;ZO}Q(#VO;P#>38$>Pt zWJwKQMX1p~aYh(MjyUS0AsCacBPdL+G{@lfu#s_9t~^ACgxJo(E|cT5>7f?Rp$C8s zmEjD(8uCJGU}$J9j18@W*`ab+8QK7=LK~qxv>7TwTj7z=!*C$94PFgxheM%9;qB04 z@NwvI_$0IgJ_|hpUxs$Vx1lHDSg6XOPWvG_W5Y44NdoY(Jd!Hvhk{QYMb&+Kp@6RA z%x#D;cuvD0Y%s1Dqn?Dmo>S0+A#vh3d9-}4V~!-f+M1K2*k#Tu1Fe>S4$1XGa)=O- zaBL$xrqEO14?T_3V=YQFyCFTa*D*+%+rn3Kc^s7nL*S9e^KaE#VWwk08e{XNw=65n zNex<=C)0@~hSa-=E#*qxrQK}lL5n%xCybcMFBwh)>4x(5^FI!YUWL}7*Pwmqb>zK=V07pWxG40dqfV2oI<*3eb)37Mbf z=Typ*Ux4=HQc~pJTgc-WtblmbZE)>|=N)k0R0iHWb9ix2Eaw=5Gx!a4pAoB5c?y0t zEhtZ4QU=&U@(k)OwuM8$!*((CJAs@M`s&OjRr0h(fe}L=p?vo-_MuN8H}olvp^u?c z=nLo``Wh#Pf5FtyH!v^sonvFkVcI45nBPs)F1`cv4Awgx6nT~%=qCsGIx-aKA-&@s z<~gFI<5uEAf@KB4Dg>)J+oaL#|C&bg8Xfu#{e&(0Gk8P4 zpdj}vv<>}+OP618EpQxr-k*+I_O)x-SH8lszU^z(vRQ*#CP2k`DD>| zrEG0iFh{W*Vtus_D=A-vgZ~=*EvgkymPEN~=Ghu~DN#)CglDVdWl=s>C0`rm<5lu? zG`*arSJ3ng^zV&iV?$m^_0s!D2-?2MP|2CGc(r^h0>8sWHtL8Y(7DUqjNwk-Q1?4# z-&q0qMeYQ4pDK9<@_=Ue%d%YeG%NBn$ccLPHN59{AVC(xwXj^i8?U#)I-B6sk8tQD zoPASpW?|Q5I=0!dZM$RJwrzB5+fK)}{l>QW1|2);IGOzOPfg8tH#0YvKa6z5}tQ6x`FM(WqajV-v*Kngvfi9FMB@8SP z6(JeoUWIS#2H}o)4mv32HM%-fg}s|R7}!+rEk`hx*|)e>bs9` z$PyAjS!BR;Jw{eA>P#4sJ}D4$jwC0Pe*Wi1INBV4PH;^E9O>YTqhC9S4iRB#=;pu? z5E0RwZ}U$j5`|V0(DLGZH+a*0gdio5A0C$%VjVtdF@AC9=WhhxL=3ue@=M8DC$&5} z#3OhG+Jy?;jHFeHb|*Dw?owPTAu1U}tU%5!3}K-C9NiXJ;~+o2%tBgg^z(fvv%1q} zc_sq5J{EpbHyTv@NNiw~YIC=_G zwz?}q?VRqXy~xl{!7(==7Yks8a-PV|2v6aNK;k)4z9pghJa^8E$n%#D)gVieZB@#) zSFOZ$j8Tj?4R^x`A@%YFyMKqg7cmLzEqA3!Tctxf>apD=5q0snG!E>fLF?vs4J=f} z4FKGc;WXMmJ~cL;FfYYHT(gxKdyZjh0?8V z7%yW!1V{K}XF_}T=ndM|HTJ%d^`sE>f8 zO5d~um`^8c}=xVJz$-&SGT|uMQmi&6w6rRro6O(JBV*C3nfBz= zhCRNXqEYQED%~7J8dySRD}m0+J8}-thESR5t!g;fCEm}uXL zreM+s)qt^%a-OVo2o8ZdgF3)ZM+n4;a3hgtlr_{HMBc%8K;DhXjnA_a7wXOr!jSxc z*+B(>29V~N;{v|=IkzX_V`5$sR*BH{hKbb7!-kob7YvKw?#ByGRUf7nYp^n$EX=}} z7GCl0a{sBgxjb+iF|BUx?BSIafE9E~LJ^8`L$QwJkgvN}9+SqC-xlA?1+N#TFSMjPw&|_QFl1Lm{$9W| zG@gemYS3@^2srZtRi&`vy;SBGl|aOT7_1i5mAhS&oscXGCeh=WK1ibiqQq&8mujXg z8#IG#qJ_e^1GAzyhik&#^>W>kYrI)M` zP-GJ_WDu+>)FKQbV~OYVNzuvD(HBD^e!roxSD4TY14ZyR4BRtLOVm%W;rc}`=`Z2& zLc~`I5NQ(T4D`ssDM`qwSW`fwq)I#e0v)z6A7Js+8!qh;EbJ2FJm0? zTp|NC9}@E&(p|i|fwPYD^B?V(vZS9c>H9ea?=~&(Z`fE-^Gf>)y&`=6={}%MDO=Vr z4;kKxuhBULSYuV5X1V$G#~;TEsOJ`fyYiVvHtmas zo`?C^r1l`ksh1R9GuDU38znvZr5Pjm<`Ojnw~Cht$OyGth$=LnLEMaU)5dj1h@#6W z7-aXG$h|1T2HN~K^dyKHq{l&&ERaKEn$Y6XM5s7Wr-_ksY|g}{V$y|fha_Y1x}e)6 zD)lq0MuvyZ*grEbPgIB1`NedjJRU~+5huN27x?#-U8|M0Y;x61uUWxv_rOuBZp{<+ zj!c|lG3xozQ3Pv480*Ixe8^hz$stjuZo08DY?Dp!7=wdlQPMpEPUThM-ZHPq?7bL{ zaLA%;KaFu1{2dvrb0H3XQo_2d4B*Zi03oNiXcE zLq)FBwuPVS?|)krRdv_cGFM}Dh;nPNSD`4mDWcTw>WFVcWn{5Lh;F}SW=a1|r|QEv zEbrRb>;wf>@*uxwV>aW}eCpNOl8h?k^k9d`D!3d*5P;UR&TJJW%+J>tY^I#3w=S)Z zp&>*G=nTphfgCkuXd`vuYR4|3GjjR^Ub4Obew+}leZ37gJ+1DtU2%9a}x^RG`24_%x?|MJeb3Uh~j_0BkWSRZSD<8s6) zBbpp+<_}b6I=A~Pw?XM+ZKd0Ftm^&Vkvc_)dwLk@gXtijIA#5^0-LayDyobk^T#{& zK~cN5j#vH170@+5O>CSDjt6ek3AmZ4kMG?xMmm<=7R-2uJw&STD|t*F&t5@TM%E)n zRVZDOy)jb{5p4B}GELmDOxT=~wuU?Pd5U#EgWvm|auSOyLgWXA(mHAkF} zln>yPV%nYCom=x-+bZvToMDt>W{jzKaM@V2ve^noDz=&` z`zSWs802HEzd4imNEvxbv6;CAz23aubU@s-F)l@DI>W9a3LKSm#ZA_cHfGT^oZHWu z&jdlv1;?tt623IQ{C|lbvX8~#1-U137PuTTJ;ZdMmirTSefnO!J~f>0j#m2fDt3$X z46A=|8?y36d@)@+!hMZKE~D#jn%A;jZX<9mD;NQqV3xG6xgUnY2Ua~LlA4gntlDk5 zi+)}@i0wczIHL;L!Ef-qxY;et)o8igimslyje6BGzM=Ep7CxrT4a8m5t!OB{Bxa z`h+TvuI|OZ!%+eqoPu6q0f{DYQXJN#c#nCrSq=3?JIpDybRj(^)OvPc;CYGPT7U-f zH0l-bZ1Ge-(d{ydW#8V%iVJ#@J|gixl2gCIio1C95d}W%I0P-}2xujIgcgLF+9r-P z7RgMia?4UnG*&srwN9?CimPze^6wGbAz2h@*{|pvNPgw;6fT(C^7}dIFu7QGUM8I- zVoObNY?i_SF7r5YPl&*h*zb?5>~#%oT}4V?KeJ?*k3e-($$K!2kmt<9M#~ZReaT;o zhA#*vQ+?e39$J7&;KKMU5%o^x{kdyT`za_*MbAvBwerui2>+G}$#@B&LkX!lK8lHo zX5gkA{#dMsiQz05CWDi_5@4o;P#f_xuC~6v_8s(Etoe>)>P}ylRuJ0tn(W*1oKy$Y z_aqHO1c@*Dqd~V7@#w2qj?__@w=2213EU*G6YCI)Gs(6{9*lgzoHtp;FF$+#&2!?K zQR>C_4SknW>g6LPW%sz`xmT<5x6|i=;>0~CqMb@ zw_n1?2c3=90_yN?MO7iSereqZvB71JD?9i&4)1V{ zfs;}byqmnEqQk#2+PmR;qI+bzWv2D7^#1nDbm4`oI{0+{(fIjBsqX+H^(-ap>2QJZ zR9oz*)yw&I`~{{c0|t%`0s;*Ua@FpvH5kdSgMtSFV!;XmA_@Wm;^1t-Xl7z-<>+F@ zXl?4sXl3te=4@|d%V^?YYG&l(V&&rceYA75HFGs%6#4Iim4m&CiIKg%nKOfl?e{x9 z+Auz<%gchtJDk_k-B0E$QrOVol51o*AtA#7$RtvlsHVvv6BO{7QY@(EfT@sSh$ri9 z$HJN)DbpM+ahT|!wVFCL^fj$l>b?7Srxq=1uN`X8e|evJ)2G0VZThaC-axN&->&$d zwp>1sw_L7$9sJ&=O%#6gn^w;S5T}TlJc<==j5wtHoW|xaC6fG}bpb05T%-Z-xh8ks6K!pBIO;YP)DSK|OTW(UfMK>L=AO%Sv=r6tKFI{twV#6o8fR-~z@gF|kVbqtoi zGY=&#g7Zt@?IqP1cZ5^!yYmUjVAoVK_M&KlRk1C@>R9c=b zktH{s>HJz5-IHb_to(a@kWlO<;!n<5(;e@IVSq;30W=$u6hlR-l)Hwor<#I&gDx5 zpaZ|94D|}inUO0PE7!3VLRK=EFiMHrK^rs;P3)SjNQ3$e)uU{#DrJOQBBhr3Rn>Gn zXPFA6W2&|NP_Htr09;(*l|MxiUq!)$?I)~pF46|rBQ?J*^LeJ2jnYo`D0;aI5inI6 z9)8GS_-=%4C?@x_)(Rm2))q}FIex;Gl$yJl>J>2KRmZWhQ+9g8%3)>IL&HkeJO+At z)qvlSpkYSSkYgi~i{de|8{wELt{E(Jms(wQD%!e7+`y}g2IE3}4O3JjUoi>Kcgj=R zAQQ#=9;Y-Aq3fWPLRy*VLf5bpLm&Fp;qx1_Kv|=aKr4lb^uQnpPgaMVh%CMX!W>Cd z7txU&Np+0@);Ehw*Guc}eo->e#2OMI2^X3XH?UEW`e-D%ppllcl2$B6HT8T=72G?H z+BSGu>;-&m`}w4d==q!IQR8eD03OYF!>|M8`1U!G5YH0!8jdVSYItN7@u?R_B4Y(7 ze1>qjpSppHch}~?N<~rxdqAoqMi3)jz7+9qaheivv7gYvb<9BRA3AyXuEKA3i#*ds z0zpsSXuXu4O`W&$2&>^{_puZ{g!X?VW0NV=U(rh$sH-t++Agn)P|d4PII+3@&t5P+5C(jx;S zd8mM%!Zvl@td9KX7FJq|JvPuY7~8E2=4lMa$fl2}Wk2FCKE(z4bm?|i7^t}Tkv-bK zh%np0akftO&`xyBOF<4GB~v_0nq@vgtk$|AW~emX+(}6OLZ!udxA23G628`aCez=+ zSy@kzBycWjc3$*&s59zTZxm>&7daM%1t9TS)xd1mvB0`HK)^F&LCDh1r63WL)&ME8 z&M^}0Uor}u*hQq5jE!SD0kjcQYfjAcF#%#d|QK*e7l64r|e;rK!_>89__x8 z)geOC9}q$bq)t+BR}JL=4=UWa`Ps0=!LgYvCO)@F@hH*4#O zMe_@v^Ot86Y)LxSkk|(rQtc8bhVS;n8Nc}5vh~~fYei2G%6Y=*m*UHiARF`$DJtv$ zn@8Yy_1S^!p1Gj4t;DJ_c8z+nBn?C`VVrW$$*=I(e^Y-5YGwrdr zXc$76Co|46F(oVlXn%HKJN7J!A46li5h)z;qJ$WC@otLvENC6g zJFRBwuD%HLuJhi)fqy}Gs7#91ekq!_Dzoy)xt5InR%`DiUWP(&wXsYZQhjhO!A$&I zg=@f}@D^KH2B_z)Fu@r~R!X>$VQ(8lT?YWXP_%J(lzo=$RfTzVRanl!;C?1ld5fI-n?;5 z%R&M6ETMjeK{DoQ24fX6j#C`wQ~zHhGi6o=fhIoegdNf}1|5e}a|Ug#5Z9A(PjnE&G*o9+|yf<^r1B|JGvj=9N`uF6JCX(2Jmpx!blKOcg1ZP-qbz#?RzFKys@A|Eh&-rl&6y&@(8f|=%K z5&MY*1wlkatu(ERQ5!|JtTcq#(Ij(SDxO3Erl_&n(xkE!ypv=93KL-b77W2-^(b1# z(O#uV5b+TWm3V-Dx;DJK2V*PWgGm1?wZT!aT2I(1SvzYaq-d6Ga1STirht$+ z70|jp762mOd0r7`EWnB^wu2A4DxHmxK5U;0LNEXBsxMDy*Z(DurO?h8U{s$l(;Yn) zjWxihDg0DYA0;noq$$7o6b;1WL9`14u`Sx@agE{zd9?ELnHsrNj_SQ1KbG_n=pw6k z4PpV3(M@Qac&St7-NeQoBVgubF95Z&gUYTp_i%Pj1K1q#_yZU5fByVK>1bZok0SyE znUmbB4&;ka{>3pLqAjyGWVthZN|s4vxgvyL9ZqXVsw+b44jY4O%Vh2vs08J^&_5TD zA7T~~3hDx5Bd(7;A9e^MT;h*5jgJ&?EY5s{8L>&Gd<(!FyKfsnz4a-?x0}2MEA#NA zQ-%*MW!$5j!CCNtp;OCO6PiCxEp@x7S-|si5gA3tm>Y051I`t_RMMXqO_Ez zr5f6Sji#tn)ma67>A*bXEoi%7>}ULUoU|tUX~a@8!ZaD&!E#rO1gNWw*&f`}p6<*Mq`b2zj0ZWHJ z-1Iq1#X6!Db1Wav>Q8qC8Y*`c%uOWR>Ya4E%Tk4}n%!<2tqk4*h*!x?pIvj^Sawmb zPA3u+`nE*hGY~q;(7K(C`Ku@HArXrlL}}c{DlXj!{l@@F?~!em-5(I}*qkW%qFSY) zCx);Q>VF1LUWn$KsE*XfQ$g1l{y@0;3TqJS12F%SnB zZ&QOhM&NNJ9&SmwqH4-0P|qI^b*WVfrd#6h!@V5O-<$tYIeE>fEpg2)u;JD#JL$~W zs3Y;l(aT?Sm!IN^MN55#56sJQPIBs2$`6^WpYHjP<}R()Q;MFQY79%> zqa{^GEZZ)^XE8=#RzYCDZZc%m;#M|Uq2S#kRYz$BQ&0PwyvOC_wmLVc;(Z%x*?$qzvk()2Jz&)F5eGg97#M_HGugOXrbzE{U^_%`t#AA@9nrM3JwD z^|7Q>uLd~`oyj@F`D*<$E$inn8ez_@VGlj~WrGd`Y2Ty^rJQRxeor7dJ? z(?(;I6t#(?y-xJ8Vm#7X-Nv8=;mRQx3IaqA%|rQkNG<5MVM-fa=A&f1&-$qk&F$m2 zXFr%QkDOcn*;<8cJywm#Zq!DDefdY?pTu-7ugK{16HMz?jEeAPL|z^N0lh0?Pamhq zztd}A2m*GvOaIoc&@a^ljycLN8n($d;CyQBn#E2l^sp}F^LzECiUz|!1g6jJZn!m~ zx@2}9Q$3>Q)*Wy%vllY+7Ho-Kcu^Xo`GX$pITQ4i7JluMk9-kOmW3wYZ#p__adq?} zP;LXHzBqE=;V6sXC@pw|_w9W+bEA9?==6Lw2mX^>amA0S28gzpL)0 zw5Wyngo(7{$!pJb*I;S3A>wDrf4pr0($X`!hwPToM6%YSL)Ni!R!9&S9&t7e->v9N zEpaYb+Xey_wYM-OuP#mNXUScLfP(_t!V+6@ULJMbO+!*3Newud`DW!ki#(5-7TR9s z=M~}a0u#5jvY%Luw8?}H!4_h}^-G7B=~>-f10P)P=1wb#!8dP%s*mBvmLSIvQh!+haopJ3MWPuHH8ltF(q_;875MRE2` zL^0!@O;YbT8R74EU;0z2T9}DkK7$3~Zp8%@pXOo{ua4r>Zs~<}pNiti7aA!MK9W-& zzmnqB`%SWKK#9H&(k|tx-)Bs*#IsCN@5FBM0~o{O-enX+`GU@PvTFv5`U0w1Qt{D* zuGBFtmUO3XMKW8ZZGvkukFMf!-44lV&6%GRQl$hrf2luF`Dfz1gd*uGzlfqoDld^$ zkIn{A|GZabf&S_{*zU4wD$XL$Vn^2b=oJct7-tzEAhtugwqvpYd2R+CT`S)SazPx( z>bBqy3|VvF+7=_P5qY+^Ar_6`ydJ|9;RJ(PL^=DnU9D}t%>{8&TL<|c9I!3|$hHXs zw{O@&5AV@CB=#t8K(~+>2WR&XJVD}6N0~j5cS6HYz}vCp0RkrhU>Oi^%utBN{#+qo zKqo%9yrIM!^tkXr%^wN}e9sX2;In(m<4<7PqL+>>Pvlp49J1a=+ z?wH?u7_xw>XXx&*c)8FEbpXU?`a-x?wNyUNA!KDU!R>XrZtQR2>^Hm1HC@<{|=n+`d5tz`cUs* z*tsGM;zgeAxKefl2cI$VX08W7d(q%t2=Kx}$5L>F1BM+xT0)Pj-3WrDiRWIu(yPjeSm~r&DKAteUg~pTYQ`)`VeB4g4Tn zN&}Yx^}tUvR0hQf$3o>enUs!p)y(+G6ga1jMsP;;G?QNygKE;)HmTz9)JoMF9EQQp zIAN)B?cyB}q!X8G#qS^{6C5$LPbR`r#!Yu*wJLcdkKbFdgYPW1%DY7_34uowl%6Gb z82U9i02@3={qvhWw>ZA;9cJvlW9(>7uF}2OIO*;UW;h4;sX-n5=v$6a>F#Y5054wK zer_D^4Z|qr*8W%>__EHel^g4)@OIp6dCjwoo1j1y!H_{!AK-Wy>z4COiSG}= zAl8z{E%~E}kJbmgfs(?$O%{^DYS>=3Hp-_IFV^mY^ldpu?g{976XvjqHt6mO#{usK zrjN!OcW>F{=+~0|&{K=X4cH~ZyW$&qyba|IS{d5c-zk7XuE6^gH%Oo3--Gm-$mi51 z*e@U-p#m4y{rP=7~m;XRSb3?;Tl?+p5}(qBivVO0y>Mcsbg z+TN+lpHqCb#%aK;G4BqV%vtvEM|XM?UtKr4(dDt%&RW9{-L^*E)l1ueb9;`tme`|? zE3=ncJyAka5#9L4!dk2~rq#&{y47&o_H!=UIUL$0_P?udO(?HK?yUkju}c#5Bt1c~ zD^=^*z6`ikjHU;V(d*zJsOqH#Gc${I<|+@E>b2KKsouERm4dUS=ZuXwue8D%^*rXCr?7Yr_Zo5pF4gc&ND(H%*4tTyZJO>x^cBWs8*_?ss7rh?3MrZwhp zZx!nke&z!G1Wbg+QZ9tQ=eB15WhpfJ{zds$|3WkF6OYd%Xkzzw^`bz>D10k;t>_Bn z!pQ^YH-JBu|De{m&w18#wiB!Vcnhmxw-f9lf_KdCxYmNPlk@`Vs^x;*gZ1~aFV632 zU;5wMJ()eg9l(z3wV}WBR|dY@?(B{`q3LydzR`7OzR7i$|Ez!`p&4Q4t~p^xd{g|k zzlFb>NBsdouJ8VBec$iKHH*C73%J=||4J;N-zHd-J_cFSa&KZRc0DQT5f#`a6c8-( zqPd>vik7?6c=_eFjyh7#^K9CI9eG{DRn9ALGbq>Xml{W6dBYj>1_^yXe*OyrHOx4e zX_96d-;NV_kt?72VE>0{fL8FcsUB&W+j6-R#HF6Gyjeb`-*4%xAVy${Ayo+Sud>t; zmQbypH#Fp0Nn7C%4fSw>Rl2!bYA+ITmn-K~S?Ux_mNS5%BF@67Vd) z&nmSZ7%s$wl4;d+5u1WazjA%6@x_@S(hSN&tI+1ZM=IkLxpGx|L^K`EB-&U|DpDS= zYgJq!BXc<}7XDtNPCk7gb%B`3 zPNHo5XaM8en=2>!RFQ*`AE@|g-a5$CiIoTP_p;N9Pr*{k#5j3*ygY#)EP^T&Nfz&&vOt5P7cQ9dNz*LQ+NSJ z-q<5qVr`Ew|9M-c3JG)0JomZz?A%%TfTCb?xlSepkI=}9;J=Dd!TBN59<3WfwUQRi zj$R71Nvn#*b~H|jO=s*nRuXDOKc$=Ga#sF<{c5npNQiY!HOjRqD;>k&J>13fYmsW zr9&;}ms1Sam)d;PE(8rQeH9NaQ~nU}62gNi|~-GsmhSL(n`@jmU<(?JyGE8TR@?$wae2 zZNvq#j&LIG?U|Z=89}An(8Bg5e`J}VNUkS=#`GAJy0&PSVAFZBmq@2JpO*PYL;&fI zkm-TvEvm6WddDF?4PxPu1yv?5Jj;t#!Yte#o<6k7b3}8#Ny=s^cY!K{X0Abm7O&YT z-@?UZ?d~r=`!C3S<33KRT?4wi-y)4no7Z+pp%s1(vX~TZ9I>~*ZOjVit`WwBdv~)> z-V@AkJ$WG9zgmWan^Rnf|XAAmsVEp_9&~LTS zQ<}z4xS3K7Kv+HHHn6_V7#QV;r52*a_L4uF0Sh30QTr(?q$1BZZ;p#NN}eTlDusei zL}~K!J$Gl>EaQl+<0NaZWv*$0&%kIa-X{3h`y-~DI?2VF`g2N-P)`Cm^x_9TQF#Ix zP7JDBc&td-Zgf-4Pr?5jIoehEu zH*=h-xaBY@WejByWuz>8N0S#>jH8d+Fe$f_O72i6e)!gyrkawmrT!i5m8h;A)jRX>WMr_SBO^pB&*2M8G1FZtVla~P- zxJ@kp&F8+@`N=@N%h@B{mZk*K!g|LX{AT1_k_2fXS||Q1J>*AKyX(N=723%32G zjGJr2aow?y!sX8|17VxmrvugSeOdF8Y}%$g^VtDkW$j`G?ZV{4q_%MDIJ!Hya+KcI z5Zn;X^czgzxr`^2+_%dHp-(iQc7P7Z@ zaQ#2f)1ta=kH(D7FE3mwwb)FD@TOict&APXnWC&zNdm!+PEB<^vqTnW&PN)rGC+6> zjS4*gwx1aFQWOR6be&90Ov6|(uE9n2@200s186HV^+b#5Xk_yxQYpz`x zrx4>wkCE?t@0pow2hrVjF4>L}4cpe3BKH_m%CYV$;3L$0OzM$k>quXLiSGL81;qnO z{M9~L!i~pnymsHb;Ix_3tFuK=j|^zfM?ROw2wEuX3&~PS`d!L4(=H`$Vgqr>N_yqY znsk(-+$DhBv4NJ`3tya8>mFS4V&B7%7 z%X$`O0)ehS$`V=z)1>)u!SM?XZsHWc1eyrFw;WvPFa1)cGV)?@{%&M^kzDeT)=Hs? zT!KTEx9$u5u^E9Cu~NP`KPlTY*2rkkXSo@#C3k!Hg@ZF!oOfPdC5Fc-;_X;itMO^7 z3;)uikrz?Dxi;Vy7Q5REcU~*CeHT9;-5#lfxPqNVL7@KQ8-v7h`q(RzCJ0<751|&4 z$FdUxkb@t|lNOFag>R=XQw|s%_Mu>xk(3MneBHdSo~niKBsflH#Z8*8EdTTyUI}QI71|R48r6MruG;wP zAtv+{20uyS&#{!mLuYWPo1Qn2{u8JV{kmEM;2C%n9 zeJFn+!IK!fGM2^LroM3}zNf1!imnhc{PXm~-rQrp*^c9!F8|MuHyMysrL?)xdPCmM zKdG`s+KVY4{2I)38ZLCps?z`RN>{AKV^?U@RK_Enc4}1-RNN3YJ56wEL#PHXn6cwZ z!DX?-;Li(lHDt_UjhgH01e8-dZ89dZw5J#B=jZ5`Yj~S=?6-3n!TDjJs@hKH8Y|S; zCa1&V*b;$!Y!dU;5)+mFeyQcASYtKaHk!Y~O5VDw<@0pd|BdxGUj}=tY2E3HbV3u{q;J|S(iMi8W-I7}-{>36&+POz<)NSHqS6Kq4wyKV&cFd8pNsUv+Jb+9Y zF0j<8U6?~aT1TQ;YJDm_@8$_&60ygRGw7KQB+7vv^_~m^cFHC${X@o{nZO2s5ay=O z$N$(tgqP8&({N|EklALBbp2zPuIi%W1~2f0Rb;6vIa_JGVG%|OzjU9o{^7Ist_);`lg8r764-5+vdaQ#7!5HQ3P zkK2uih2xxi#j3hZ+oG;RqWbFsy@rr+@$hXY}mEEMot_8 z*QD(`SGOb|QE*7TyOSP}L9>=LM%=#y{37UCre}E}y!g8r6rkN(#%lmQ90QYZ5bBUR zkg}wTH@$9~r9K3uR_UjS4|8^9SL$%d%w0|uJHiFS*pZXe7x@tjBJ@W=o7zhOtoAlN z9GoddlM~{OxN@`1 zzrn827~4N}apbbEd}MOoJzbuA&?0#MJu-wHqYSS&kHsbhCkkJlSM+1Q5>^zSUwtr* zAQa4D)UWRuBU)s)#5KBijyEWmLNTS5>5)pP)OTYNIVz$tT$@x2Yy=J$!#{rqH;;O1 zS~;YxJYNJEc8k)!`|y3>Huwcb`-;BaF$$v{a}xQ?K+6+2cMnj3ycaQ+spTl?+6jb-B#TRrA0J4x<$Op^Bfe?K`Ak`5kGRPLsV=&14ea- z;rwWvB7(v_Mh10}jLox|&=97;dmotlgqhI+*B{98Y~hYo30`5B>4HUquVi<{PTR~* z&WRV!a(NU!3Qkeu{9BZV4wf9y|FGnx)_4+&K>W{bGST@0J|9^5pcgDaQ;5dNNF!R5 zbMGn;iz9QrbKDTgca5T_^>uK6@}rY}5dLR~JeIP9?E3zf(?k7#g-9toM+awD5eIu$ zBdhnG#*g7#5h71Az~q4#hN-RtEt0QV*Td3=1R>&n z5JBitg(*E+>DVW_VyC6XS8dfu(5j8axxu=O#z$GECebb&TEfa8XR2$!BdjBguXA4Z zc`jP=Z4LDsvm^`o<(L_CzC{=`{ z6&7m0{@3HJ-;q03=7gEPxYd4T%eT)JE^`?Q`d8IBqFON3 zv#ifDRHibVxftRboXL0p<4ec8G!Hb99H+8P?wZfaiDV`iNYh4P(13!sjYr?qm)kU! z%VNgAYDc?=gi3Bsc6!}_S)-%KmFgUxlhO8eE0(Oac}*-`q!@pG!iu8Arke5t>_K&o zP~(k#Z{z^|S=8^OTe2y-jlb%MA5l!aMPx~u8N$3p#=SlFkQ4^Q4EtUc*$KWa{%2`c z5{*?0mXKNVIi>--_u%R+B4>OD%}7>EEBq`kwi-v)B9O-0sub7@`l0aM2iW<6XX4U{3kgabRN|0zsW%b2?8Si|DNdnH#tPV zMV&^@|B>(N{TDs>7grbvOZKp$Kw)X-f^3a_Xi<*_!BvKei;=n!CN;w@X6((&L_ZWL zvMgf+u=78ZMtB#aQfL|=2{>3?j(5HjUYEvQf1elFJrqoSQ*46KPGB@qiWJRzF#my! zS%^B{L$Ig94O=Sp@E@{={Pu6ts-cZ)C5YAUO37=C`MIpX66k@!{2=qlqJK2dYlvM- za3gZX84Ld*m#2EtN`V`dU0S;NF|%26Hm+ZTIZI{5kDjPlx{&G|BcC#+XlYO`;$M{8 zC!|U&mdZ8>zv)sYgh#C%n+jBh(X(=b@34MmFDkKCb(fEzS;pDPe-=h$l1*zIgCHQ$oK458W$S&EBpP1@Qu}q(%WN>ZZsL+Pg#&UcVan`j~EEM2;G^ zBx1VDB-4h3EyyCRzPS8h4*wp?bu8_M-Pcu%fF?Wb28_YO%Pp{L(FE!UNV8gS0KJ{to{Vx7(*Cc!8A43Vm)z-T>lO9E4N{nz}D8UGsPj{{bPD2KTT1$ zexbKiO*~UKDsJ~3JktIXbMG_5nU*aZf_f@@b??Mpme6Ki( zKYCoAL4&J}T09Rc;J#UA;&o0hBO+-#)RJ zU|c)UZI0|}KktrmTl`HO=JS*J9b9bknMvvu21%PZGl(pW#%kUKRZGi^{sZzqiFeWJ z)L-~bx@0U65WfF+;wd=(SGUdOf0dvb2#%`D7@t?0-`geAp^^R&iGg8CHIh{|i?TtF zK(JvaNgA`wRc3FePs3$zKVEJ^OQN8>nb2A2eM@pJT0Fg&>N)PZ-n!m#x#~I2@qHN#4hPAJO%GNC&tf%a z`7^2_&QT^2hN?a!sneMmS3+_tD;$61EFNbvxUO2foW|RfmMC=`M1_{Yf{q(0rrhAl zval{#JW3z9o~y@imy4h7cKY|%2;LRDvv^-3OLgqL5Pz@!FB`_G(^gs1Tw9d#sHFL* zlA0Y&n!0c%sXbTws_|`gw665e_w*6y)3eU?U@0Fzk<_ zBdeVdhrE8gbWgL9m~%T-*8MOyBY`v)NO%e6kOT0vl)nVn-xe;f^J?(?sV6LtKTLx2 z;Dpd3WCPZCrS?SAt2RlzwnjBc>&w|p>>pGElYP6pDFyCuKrQ5Qwgmh3LjTF~rP0jI zWF=rJ??{1Cw(HiIvj|p~)qrkGp>@JA@AB>9xE(|3c5Vnof9|Jr1_WuvL-PrnH1q%<$?+@6g~ zZf^>vXRVJJ1eyu()YQ*{VECYiOzEEqg zd12`Gj~3`++)ljDS1JxG&^ecSjxCTEm`TcXj;+E{aZGm%VD2=NjXrK0l42mok(fQI zIniERZ!wlr$lo%XnL)b}NN1kmm4!$$#t+Vop)pDUcg1kT;H+I#pw zpx|HmaWOD_=#Hs@8q+sr^Pi2AY^CwDy^6z3xu%SAi3mJ=VLn!UjH=|`YZYPg`fgwo zn7}@g2lRKkDOK>QBj+>wJ=ENZ%~2PL7^X7D$l=+O*U9lp%N|a35w8Vjb5{LReGkU3GJ8ce zh9=2Z^6n{&UplQM7>LSUT#F;QoA&vfvIT8@f4ww*FU4q!BwkMu4(o$Dt8qlDIe$(u zV$~-!C#>D8#M}gh-9b0cBeWu zP4e8FF?S|AWi3@q;$VFlV;SH^-?tg1g$ni?)0Te3cGPE}Y%Q|J)_lRW+aecfI>0R6 z|C69laG1y9v%(P#yZxQeKI4fmmqRu&(wR$uyRD8-MXlOMC_b6*kFgj~vSZN^L5BOK zgOoG;Zc)dZn`7cnR`kE!coW48V=Rxe52z2qRS^BOh9oYnCMI?B!`{@m4!N<42qdBg zTkU@D_xMD>4bnKb=(9|@n%|A%L565gwr?{+iIm8Egc@D*{ht2;7=fMA`EC#K_BZ)J z>T^5!KoSr-2CmH?m;aAd(F7Iiov9W)030)(DWs{>#KLS>E$Dt z^RM5JsI%Tf-!J=jzD-=RyT6)r4{cnsyS<8an>svMW#+1G1Q(xqUFm?;ctpaKNMK%F zdmaB;Wu*QHb%ZCGegw($F>O{_WjJBJnoWOC{}JoRH));W$Twr1;Mg^7UEtVt-6?tx z>>8{EZBGmqCMY}@@&4mQW9EnuD^O`TU9!3V-2(Tp`ujnPJ7`7fqfq)+W2vd`B12I} zb&S~W3URh7+!`HI>W1@;2=+tfuGRlsMfLvG4?eC}{xBz}ixT)30v3Fuo_^$ud^(IC z?7FV{^REM^=PkrB2vva#W9bfb*2R$Q)95KmRaM~1EqeFI!X%xhTfHyq&JB~otq(gA zkt<1ledo;Q>kF52{ysHWs4=Q|{1Uks()?{ThEvbsE11IPYTWX7&5Vyleb-MS#7%T` zhtP#s8pz38;aH{lt{SXsr0Lh*Fd*1iq^aqb&@e#PSY)W_*U&J)+qjyey?X+1 zL2*D)1i1KQb;op0J|h(0Q20_evXYtx4Y!D4uHh%Oh#l!sERio}lMh!!rD^LMiHJ#V zsimSjWK8H?KQ%nXbY|bKwg>;YXq}{#y~uUsXh-KPX`E1yFAKXC3}?ySNB$0%;YK;3 z=W@GhI`z~K?dLe&xiS8tcU$KS>h89v9QjMUYZl3OsQUA53*q3^k~t#<;d@ow-PfK9kFhk3tMBm>OYf%sjySl2bi`r0q5}3-RrQ1otj#$6nL0-?LUJSx9SzRTIuevaFKg>xHcWo&dsY-e#86&yFFoqyiL< zYuH&Nb3GlW)wj0Ap)J5m!MUd;sP4a$-6wswDf_Y{j5Da>Gh2}rV|-gS3?99U@3Y_Y z0fI3rWbg_B4yS@+6-pL1AFWzMOCT zHaeHVzgz_diEmYn_a&!UP1c6~VVZ(7Lx!Z)+Ms?*{AsZRcgbq(lk^D50md)AJjX%K z5;uI)k#`v%Q2+DjC(VbvUHPdZNPJ3ca{uo~KXs6W1IWhe{~{y&Z91aH+FC7qT9BWoG6okNY(6 zRJi-){qSB73d3z)Djp=Z(9BAz#wP`GagyoMPFsi%=)!SCB#-8zE&6qH@uF{XJjZ+$ z59hw0FUO^h&xN`?F>DL+@#lQ_ES}Z6+h}p1vbo$kIrG!}-sIh_U2yu^7cZxx(p_-b z-9Cd50pZLpPF*Z#2rMgCjF}P>3zqhm+Lm(KR$_gnE7#1c01vinPT3}xnFyeVkLp+y z3gny~X(|Z#8~1vPE@}2=!3yH76Yjn{tbFL9Nb_q|5lvDj1)>KLTIxRsyhA$0I0`?} zXoJZt`>s+ns#A6}(Kb%2gS^{jekxU`sL`{pe( zrjEgCY(psSsXCjxQtQ6k>?Q7ekR7EF9o8lJnf!UhQOQIQ-8%XWrm@iliGjM941jWo z%DuB}1Ae0oh;}EaqMnm+F{z`pALM*Oi9y}NVs1Z`8)x{`;sqT7-VKz8`AE2bfbaT~ z?6y}j2B5sx*eZ}Qr6bMPaXKl!^tht$ z$NJW+Dx>?z`&Eb-kzv4E8s(17Mw_x(|mJrpp_mNJi91Kgss|+n4{j5ZpuO3lt2YpvGpQpoIT_ z7J|FS|Ir;*1`z^vbg((ZYJR5Y6r^Iph@>z4rzFKM#fVKQLHUIi8crK=3O3xXn$m0} zd?Nr2e;gkLV2kYu4ZYswz24@1@%3}y_%+-6wBwT@vH|t_5&SD;XCUCbP|)LKHZM=h z_pxP26dvlZ!x2^>q5@E#jfRAum94Fd5Yx!mOr)u4g3}0KXCc$n)*xkRY-X$b-qAL_ zL}dUF=?B+;@@7LVIgTiGW&lcx5jxTUo!?a6bns#%Cgf7z&wD=xgQ@t6vrHxMzH^)z zYl=41yZeDYQ?l66)-ts-w@Wu*;K>@oS39jn4jQWvEmgs7;4dVJOh80#=6I#->@N-V zt!C)>j%nGZTKYO;l>Q2Kz{M#*IOJK1g+R*y&)7gy!|1EJn>)Br(wwnaibUMRW*1 zkJAKJ0vU;;qvO){#x0LePmc&#@{4#G!~@XF=b;x%S{cQK`2#dZSh7Yj_lXjaPv+-L zcm##{ZLC$pzG81S9wq|0+fk~2`_=5UgTbWP0^DsOub;CsUpcpx?u=uGq|e2Tn;=|9H86BPGhS0BH$&8Jt#C@7 zRdKGulcJhHd1k5`tB_j{tBL4if>JEx%JIUpA#sS1(61d|`y#6; z=W=ZMlb(BERltJweC8g!0^$s0CJsTO65wOofM~V)+Nu{^BW)v{uNqlK8rt&uX6-Wf zew!XA?0{Te8ew({8yV9`(nd{rRkk`dV@=|5CbMLq$h4CEcWz8rgdY}^3{>c1xk&A( zlhOj9tCC33x-K(5(uDhF0sXIuW^ zi4?zU?|6^mU}%7&v8<&Spmy8JbhP{_+Kz z2_HFF>AT((3aw(=F9B>Iw<37wZ_eUh9Kz5 zM4B4vTBHo)Dx)Z<0V_)3#A2%#xKLPxwaq0_$2HF^QG~Y3xKR2e8lf3i4h&~_ro|!Q z&3iSN$#=dSOxg}3oE%|NHHN8HV+Ky2?E0)_mdR*a*ty|2%;?+*GJX6;YzMb3&AN7$ zT=N|9iEs}P89ELgTQehaQ)I=Kv_=82I=~@0F8q&c81yOkq<{z_zA+->ln^c}27Zx9 zZ#m++rlD$J>;(kh7$%3hK@Y*f8r~sW4_8mEj+M0thoxShsL?Qq+iDNy02MyR$Q3S2 zc|6_TA3N4wZ6yDgPJlOA%#mritc{L@lhEUfNbHzPH=apf9d`u2s#KYwwnpz(nikDA zDQN(ADu2Lp* z7W(OV)ySPy<(a2(_*l|XUNk%5!GEf-2*4$BY<16dZEd*0io~BdWj3^_6_;IwlAPJv zxGi(^$5!qE(QnnhoQ*l7bpwGH+rqEMyA{rhN}9RyI7d4i(-& zE|E<2{Lz~ep(;=TWH&{8AbGKJcoPX7GSMn}bdE2guydwODoZ<5-c|p}J|X{#%{FB= z4l;|W-%Q_1UovN4rKK%gB#S{^c6RnWhfg3Q3qa+3^1v6tVBa&YM`nWz+)*1c+lM!( z%MtFNFDU+D`c<4^6lAg@oJeQPA?3cJA@!Cdaa|HZ_?z ztHA-`rUS>qLo}=hrXRL2GhegeT*icJ9~Nv&FEx#bJG}lpHr*kV7PE5fw(kX*hw5u? z(=XO@^uvG%Z=l(t=lyu20Ocjn{{-&i7>)hj}R>F;=up%VB zfs9;Qsp%o>>cNYW#fH!CGoyTqc2PIkyVEjEY&blN0PK^SY1M}3kcvH{f8*c#b*TwM zEeYO3c*X+$*JhUFL{N@hU@;t`9!s{R9@Vjk|EZJ*x9;gto1F4V0X5P$u6$75L&dRT z&dW#d+_Bllw#7AHyvYhbUduM2c(S6&?Y|~KgEmIeT&NtP!67gsTp&&bxbg@*CFwl) zw;$=O*`s|Gy$1SZZGACaKBFxB|xi5f%tt)kob2JiF#L@?M6z+;WTqUv_#tTa)P5v^ijWLvj-@@*Jktj@X@LS3d& zMQT3QD{3n=AQ6T0ub7Wzf?Lq-#55egkl2IMF4I|9ss3V`MMIM5Tf$l@g&OP)SgBMK z;>%6x7co}LJLSHykrTaAvmGMl+{SQZJIO4jCDDn@9jG6*@%$xHoT;QOQcUCU>O`n7@Y;E#3_;2~Mvyf^N8X5JCl6L{ zVxCfTjbvFOJdrVTo25OH8I*>5jvr<=okk4vOf){J4(E%NLNWBKpIyc_h9d$?S&po~ z^Anr8H(u{jSQM1sX2! zGaY_^W??{)Qg+ti7g`t<0C1->a8t%u+|}B6_kDE;&zGV<@vB{H!^Wxru_g9CsYA~1 zU3ZwnNx@gW%ZD?vP|qWCnY0g6<3t1lO2P&0wM^DEF(1eARSe16BI%U{bcJgfor)D* zRJ*6e8nZn_1U;;l22quayUR-zELt4a_@yFbM>sxXMSGps&)E4Wkk%@%74Okf1xw+m zTT>NEmm&7S^W$>gAKDReZC%ReXKG_yd(ycg+l(fU85J~AIvW}be`e$F zxD%XpR*v2ZW1*qSwcW_5c}J%tn1S`tCs(!Y!7f2m`q6e`dh7hSeR`0M4_*OXrt=pM z7Q_gJo!nyH;KHx|qM@d1M2oRM(2q)WzXECQWsEgb8!g*Vu?3z+Rhhy>X@3GNy0xw! z@a4QMe#<_GW969u|25G&rChZRxQqtE-QFrRaMvzJ>peyzs$)hhLIKgdIX@>0;^dA*A1!$A6tVi8p0^BzY~8oX@XMx0*RSioGl@ zHZss~MgbT~Iy8Wn<;eO@1|^)(+QnJB)SUVj`Q)kMzAwlcOhYfuGP7tExpZv=6K@w| zDU$1Hw*OQzm}5oP?g@w-^}}P0x5p=#-oIcv$Br$)Umq;Y8?3LaKCZp7O_0+_`{tZB zy_8;_PK*(AlG)JFi@vQ`KO zp2{xf`rYN4UTZn-zTsaZd`JkYAEv=3Vt}6|#3pyFE3HWWcvT&vI&^2_-u=ZK)=sFo z^{foh0k`4m@XtGkHHi!c(k6dM%P`i6ij8F_hMeV>jl__yEij5wBga_hLSix~D~c44 zoi}IX4Br@w!z!#?7FD$E9Rm2GsQI|)<1tPuSi}r3vwL*=g;JypELg;{Q^wYQvfw5i zZXez|>=fnzCL&dd8C7fzL4WSv%#u=4Y-R!jsY@Jh6lxVHBysTPPqb1!9GDY0t2V~W zGvH5rJvkizaL8u)`sG7Bo;^E>)Fa@Pbqkod26mD;VyG6+Am2{QS%27Y)rxrb2GYLY zOWvc3HGJ)#Xp-zu_p0zE7hgN@unkLMb~IK_l>Q$ zYF+k@=a-dpNQ~7i*7jmY@5(_=TJSIEnjgk1EK2RtCh@7~$$g$094+SV3hG$riV3F8 zJo3SvkQOR#*6cu@@#!)$*Y7Ru&wt+Fc`#gitTXiriMfO>MD?}^XUfb;YB!RSuj)0O zyPjFo09ys`Z8AYp7BV&S_1Wd=n7Y55+n<|E`e`x#s2=h0YA}ANCj4@?Fir929wJdl zbdnQGqET|wjQ%s8ccrNq%4hUu(&D#doe=KdDN#g>6PN(GKE=p=qw3JU2>*yekY8+> zYp6w1z|2Qp&4^G!aZoDyk?Klt>6`myn`Ku%m#%XX!=W-c_{WF!tz4$th>w0CLrCH* znO>&A+J5Y#^H0C-EX)Jvgli3C2SRE=a^Kha-?QU}Q8VE$BXh8hMDoOWYX$4?kp8nA`DMHr9zSWck2lG1xf=`|kS>!~E6rpOhoM z69+CEEceBbUkoI4oQ^45397-9)-S^c6xb-V9c-ZOrZ~Cb%z2t;PhswJIU#^I=eoOHkW^o%($b8O$6lAru%6z>V9=$>N7Z^{AGm4##d!WCK zlcjUHhSNufT7Sw61Z*Wrz2f#W&fCPH|EvDN8^wK>R30jnuZ z$BJsc=*%YWy`zVi*I=&8f&pVr3t0_aND(xN$4wFg1FVXnoYSO&$tJATRY|js^W@C^ zk`?p2D8Bhuf$Aw4_G{N;fn00nxH)?~D4THZ3hni*FgtdXhSe=oXaaW{xyZuYVV^+C zE0az(1CUmUjxSU*Xotnhgn?hd(Oe6V_)1+5Nc7q(jijtQ?|Y909I|lADoDE}($O>8 z5t>{XDoS%MVrOLXIDQS!2Bz&?jp2hP*dMi&JI8s_B9tu33XFpg6TAsGa>0H46Jp?t z+5qZx?B%#$(j8OmOs2ZTsEZ@yJ&2^-GuYe)ENEk`*|{`#3S_sg$_>yp1^Drxtz)y4 zfo1b-L4ma6>PX2+m(Bf0r3>(7)M&;@(c0lNUFoOBXu(!`QogGe%@?11t8SoCtXcH8nIZ;Gh z%s!DmFhZTIt72SJ!@PCQ975&D(tS0Hb=BJ8)6neIj_Th*xFp!++3YM>dz{S(EKt(! z3Sb6&nUJnT)`&VOs;%Y}S9V1Bk${bN^X1=LxHt=X$g}YqRs(CRY>_>?2fM$2a*27^ zGOJs((CslkC6woqY$4FX=aDL9=i_Vut$C-1w#$^;PTFApJ(ru+ZC|`J($FQ&i}eeM z!YFnBbK~9ANZaV$0pcoK#}~sL+CcWMaXK0K-pa~qLnwsOl^IsIsB-ZwCq|y>9ISn5 z2QB?4SHpYK6yS!Q(ShRiT;x|OwC>+)>ehDFDO|v^>uXs15G0wPd@S7o*ir- z^)!<*>fNGjKB()q@jraXK1K)R_3MjX_`c}(7^r1e=o^x+sYc)p{k4`#mrs?;Cb_Q2fPc)+ z5V`lqg&mPwDHj4;q31>fE_5KXI~n%#+C~kKuqdKKNASiq=9q)C^5qY|k|TlenYtCY zy7RYcb8S?{WEEbFy&|)tT&L-^?e@8I!Vul##uJT)t^4~9wlKt^@>a|)u122W>KluG zGA;AnXK`vrQ84&B_6KENUf^)~c-|6V#w>Tn?go;7s85A*D&{xHzN% z^)DMrS}ic9T3cJCvtg6XPkYimIh3cx$d%Ptt}Mi$T!TmBj8#d5u}db-NB(O-_f8D2 zQBp1=8qK{{ zPm^<>r?8D6(ySs1RI5WqXU1jgB>2;bb+^^!vOc*7nPJV@d-jIAmycT<9IzB$moyTh_@Yg)s~k%4jZfom~+`ropGRfkZGEL@+V z=1Yh_FkGy`UK6CU=)O+Cp26~4Z?}Bwd{6uOO=CNR>NrL55p0Q^mmu|6j`>xV0Z62m zrz^iu=ihA|e1>c=)OBh}bLNYxxt%Rs3KMhjv&+-=iRxGa!9#k2Wcy^>d=;4~)LUCr zF~g$2aHomEuWgIryiz$zm&Y3X{xRJ-{o$_awjd(ib^SAX5M>b=HlKHlC67LaTcCaC zWbH%lAK{dlV*qroT%n;CeT0w)PlU(zcHU&^JA>$`PDNrDl~oF(pj4r%cmvZGmh?0h zYf2gOMao~Zq1m=08KDBJQo6W44LDZDuXXZWbTtbrtGGA^#I!XATrs-x5&C>eqLoxO z`dm5aJ$ax1zpG;Gyxy%)I8BnX#ZFTe3ZOWz>+;Qp8d9oz)=w)Gq|_sDb{WAi^;krS zyyhG~n)HB5RBo>O2*&Gt<_9%@xk%YpAD*JizBRcudc5pxY!e29z((V7Gv5G$G4MZ? zRTS1<8GI(eT^ODSi>;w7LZog^F`~>F)ZWaINpEV|fKMUcZ0fk}iYP$BC7%YjFV#Re?rM9TboxVm~;efW%^t1aTT_ORGh-?WMa6dgDH)4 zw#)%1Fz&%v$aA-HdqZx{-dec#Q-Oa4u{AQaR83Og#5 zr1_gy>LS9Ab?|DIGzd#bS=hUe@QwhSO7-`cy;-%yX!tcGcjw-hD1ts&ZF>7l{8I{^ z-K<|=ag`CBdEbX?aQg^DFcsbeMPZ2)7>oWD4X=*BFJN1o6HQ!K( z@t8_UY&LU}jcpF4m{=%U7Q?`ia)!C^XcH@Qo8=`oF!PbgkzKYn*2CKF)3ClIX^Mkg zbwqT5Eml}SfQr9O%xItekeDVESdKk9fuq2VzP3OIn8@idy=psBeO^orpk{mm;^~ZV z*c@fHjJu7x)ipLvndsm)b{u1W<#cSA>aGCT-6?5+RkdS^@0lAg-AIqMP#WU5Uz{}> zVEa7h0~_k9n6Eklr<-yGI!J%zvIC{W6w1_CUh4Yfw7&N6 z=&OUo0dhFk9!kNB=Y6D?NHNVb8fh&oFT6gfC5WLt0na*;a)=uUTIr zuu~v(^3Ug~hW8nCAJS8zhNM8peH0AQEUJ*!N`IA#Wkq-K?MFDL$p!+3DOOjZe~s1U zA%>beJgE>mNu4KlrTPd&c)Fw7<#Xb8p60i0s}1*9YkOYb+@L< zRur`<;7q6GhU~yz>A$)^Qqky3Q3U?%ZhNDJg`|H;IzsFJl)(fMRbnLGL^I$gK5r3t zcZc+64PUfP=dTuTZ-_!5J#En@ALFG$$3_x0iog8}kqJ8#QmBagJ%v)`<#3r*b)vgW zT0QH8Dvw;eq!wROZEZAfs6`R71voT?I=PpYqU}GkYXv&%!Rg7wq!L5328z^$kz)ta zVj{t{>zwK|Ns^t~Bu;jDo?;yJ92X7PQ4a&v24pN~_;pHiZSqVD)*ub6JD*==sGrTC zIxb!*Q#RK|OE|HNpn;c&xKPGbcU((JJ-f%;I zy*=(S3SGD=83lGkUH#1lY8ZA=4hKbV#R#wei+dXL4N(h(`i|g#5WzuyGp@y1d=gh< z5eQ}w`*J8PdJ7_?xQa^|ewJ5zV@$O1J&>~q%w!NFKFlkACQM9m$`Wq|eyf~d#QT>L zhIC#~b%ywWTJ^VFUgwu1p3TG0%JM^P0Ks~e2{q)|>bU@RnKK0bJ3f{1-(L&KjY#hN zp3CNDJ`4!!ih6Q6B zZ`mj6o)vPf%IFfQ2r$H3@PToN%nwz~W3D>^OzY#E`C8L7qVWuG5(=|Z=I>Ge?R9Jz zjpHavE<{pKFcyPi;zr~|r*x^N>b9aDN*v*&NU-R_lvYa32I_w!w3Z~om4JJ+rK@fZ zw*nI@f|AbdZ2Gxf>5Qvv_2Ko#czc#Ow|3NNTt$DH`4lBd`D0d*z|?J*vU%}?^TImd zds?xaE3bbfxpD_3#1TG!ReTt}{w}*A|4Staj3hn-2h0}d3wcBT1w)%9@At)dA`=e~ z1Z4cY2DPhlqL-AUe`f&(v6s`@ay9C>7%z)udt$yl@s0*P3=UykVQ9HhFQM)^Ud;3g zT%A&ht{+|uLfITd$V0EA(H9Ar5l)l%D;qR7wXo(q!F8G0TTmg}Kapp@l5^yv$VN<<<-l6|eBlT% zjOaauGAjMDc#orteb^OLkz{*CgG|NCpZ?Y{Nqie*O12F7Fi1uhqTq z=9_c8Mc2J9`Ed#M5rcS-dDDZpVtSz&wxCMPHvN01+1~ufjLl91#c+D}X9gZ>Mlk=B zR*7d*0i$&>l$LNh_w)KpLy(c*{BZ&sc96N>{9)e`{{%aP26d0=Gep)U?x6n$O!vf3 zL%OB!ysLja{ih7y#Yw|o3Sg!+U$bM;P|7UGcTo)@M(VN>mM-f^GT?^gA%IU&Q?j!p z(_FU1`7f85n|5YJznYCJQ3B_`e9&3~4h$L#(;{JU-AgC@8VwCV!}|FgB&wtKfc6cm ztx(;3g=|mh!K(D3!987*Z`8PZkcYwT{n<6*k85Uz;bEOvxk?eSOO;HCaUs?Ei+(wV z+kZiF_jSQe82{-ZFu!d%udy$mKJkK~Nz8ofe=+253>(K=oF2mB5>gZ3fS!o}*;~WW z!bnxYrZ~d(u;bD7tI{1fBC1(rd$@&>Kd?{|Atz@2J3njD79eaQLOICWEW`c&%NvXc zPz+Eh!cgRTP-ZD;P{IOhY=NkFRv&H98+PCc_~A#)(ChO(0hpVjBxny|5nV4|soF6E z)hZ=z$M9{CcRm4MYnmb&_QgEekytlK%`xKbMQI+gX zCL&$h^%0EawfFSu-HxT=C`&djG%_IcTzpRHgH>q3j}@Thi4MGXiMjF?hI`~VYVdXy zYdbs#k%SeQA_O6=y}@_g*xd+Md5Bj1x6ehq1M~tH16b-Jn6?dW-<%xntUFA%=d$N9 zo-4Xr@fzc@UMeW8YB(kn>tfj6bLBScP-7b!wTG&F!dW0C^n#&akS8$ zRAy*`B7w1Px?9v)l=&dWg#_e|(|F0d45o)9t68*`Lj-+d1V+OwT0lFzzV*yai0Ost!tCRL=DncBh1~bed1coT zo@VZ%39bkqYx*Z{ifaf<@ptnVO#F!y>)Sw)|0Zj|Uy3J$ZV&aTO^1c<=^9bkErLy^ z(w_m@v+HfR!D9c-vD=6~qct*YB@aGdHu8sr{y8=>2zh5D8TM%pdn4kD9h!xCQ^}qd zx3+uZ&Yt@ii@q`4RNtMAMxr30GT+dkPP2-&^zJyDk&WZwGbDv@K^XaDmCY<5sC*_z ztw;wl*>v%nGH&Pvw9Zx;kR28yk=g24xee`G>H_**Gr=Q!UD;Ng zN{k`S3z^N7BHHEK03PP-32 zqpq`=!;!9ceqdS=o2iY>(35b$!T1ZI3Z{ALKpRS zV+Od4u(5#Aynw^9&66{2C%TN050!0#SClw#QZ!+c>_YYC_O=!={owG>fm5b0A>}$c z4;i*ZVoYKG0tYhL;?tVJ(LupwAlgq-ZY3V6s?OpELkkYr7~IP++E?|a08yGoqHI|6 zm?^)g3CMMlK(4y+#1X#3=E|N-@N<;UixGmrk^dHULg&#Q&G5HVip)YrrFIiV58*jx zWs&(S>=0hdxGko_B606AIG#r2BmN}(XZr@t`ATUv{3uST0Y|PE zmIfb4K%n^77!LfePy@C=gKJziG$o7_)~0Sm7n+u*VuUOxR1*sE3gfKm1AWJ87Pku{ zedEhT@|1q}gCwb3Gs)W-W3DtQoq;r{t12ses`=q;iV7}cS$IkH*e5lNr!7nK2^{ku zrLY%&03omV+Qv9}Qv_-@gZ$L*ng@VjVDK(^R|Puu(vnX*8KX8oU+aV`=s&P(n~cJb zUyE1zZiMrakJQR?TN^#~H=Z%K ztSp@|qRBlzQJ{D$INA|2NUbKPgvjKO>(S{Zg2|Egkr z2NQ2xbwav$8xdN+<41P#Qa6UkM*ca6{<{&%ON^zfC8OUW7x^c8d43H{4j~Sa*59TX z_2;H;>~_?5y75PKxRBEC|C~W!^D_IIJf?!)m=;#)bn*45_o*Zts+FPjmurbcivI9N0$ZRrHe2n2&TyOfuNK7S0n? zLS5ntakp(umN*jgNMjyGIJaok0!Ji8a+jHntsnfuq%tOi(0h_=Nwgx zsNLPVrlIzieCXM4`uCTvzZC499vs&>LT6?v5enyf6d=Hp91_ALg2n}FtcAmO4t5%Ay0AyY*b6AC` zZC_=}mniLZ!3e@RQ4i)dt9$)jNkK6tnPw})onVWhZB|={;Zm!}5XSEn{{kGNm3Lsp zS0(+=ouA`=Vxoz>Gj*_@C9F}OlaS5R@&jS2JS)|4b!X-mWTKN%)~Zn}$jQGC$IDo7 zq~GesrW5&#{`^f()YG*xRz=vN%#%9CKEw0xWV!Sc^6OPP34aW}d_RI6j_H!hCan(}An}*uRZm4*D zoZ26`GA4Zl(KF#1bSIs796VS+RPDwxil1M_;ms+aoOe3en!k8A`kwSz?2F zGFf_iOW0A6$#CjussV5OmY+=0Ugl+z?Vjo$ZZj{3Df395D@W&!ZYd5(1GyP+m0|?K$lP7Kt z{RqTLd`?lGIliUNA2Hl;1yh^;P&+ui1->bM%QgLxbNkHKFHSmAN0;U)OQW{52Vc^VKs?%bBYJ9=RG9& zk{%49L-y+9i-@vXN`~tQ_lQ$oX>m1=FUB=Oji(fQ%ZKVqr#B1rZj>=XrZ}5r&41&g zkwihK7jc2s3GTl6h5e37_1IFU)#-^E;Ue72m_+o7Bt2TGdbZzw$tM!O^GqH30XD{G z94SmwGF3R@VLY&pFF6Dje}-xiE2VDSI0S#4LW=`Gj5BJ(zAW~js*BC&nNSSfZd9KL zPxbR;FHrWLVpMKvva`}@{N>Fo$?Ng1EbUo5Fa0#(HihK`aQ)lD*P9na>Z7EZ8`il} zHa=dHf)PjQyKSe6DuEq*=@oEWA3+QzPdxkxR1a))BZG=!=63{;1(M;itU7DgYh z-8bxO2D2KEwM6&_i#i_j590(zP`g&C2;~f`-D_onWXb?-&N{V*PGx5Do0pnVlLu>* z&_GGFw#wu_MczS;n20o(ECDC=NlFr2fOm4Z8;41ro){#ZCKV&UjNn0<($ad22yGtpfZhm`x93)H z?OvnvP*?qmdomy85Q_hee__5)0P*?hqB2~sJ?&s9UKwN=qZ9Iqxnk{j8|-*H64C8j zy?xL$w{}kJ=+@Mpo9In4r=p{}7KSlG%G1diK!-<^sHByWgxOzIA}StM(w|h)ouFIH zA-0po5Go#tCW?yh5;`}4<>yP1c$!jrwtba%mO=Vc=rG(fo)~`=+p9Z>!=yDrg7UO~ zqxf)v0k(CJ5+=xh%YPbJS(EBM!yc#1K_bb6_ri8I?Q?jv1sm~v$dUO$mVBV*ADgqd zlu8(x5w?5oe$zWswre?lid;FOLt=)?hpO^sxU$M$E*6PZcpS=mWBZta{C>=?5k~6jD*7^Qdu(d4{EJfa z7bxcgE%;sZVP9M#^dl1HO_ts?9G1H&iUkZF+Nh0u$Xo0OtIfCWZqo)lkb zRK~L$lZ>JqC+SQ-R`r6a?A}qvvshTf^8l+TIaU>>d>Ls`LB_L>6kCX0M&=YUCS5~P zo)LLQOC!V-tLh_DbNcy;yNsuapor&RN}(XEqTpE75E&b&a_+O#1wUSDp%yZ7A-h;r zp>l4*MWXOCRG?=x1-6h&vdD`{r!`=lC}jHs|pYvc){?gdo{s;oc2)AXhIG$8iJvyHlSj-z^0fZ~Wg* z*>?}9kWKA3r@f(u_ZOyXjPQXF=&)V!9*s~_6g*7S89pR(%p|FHy+v|uBXBDJN=qC) zD4l7V1gM>Btdp8JQZbBqNU53_qk2FnkDE~%lZy%~!-tBaWtNzWj3a}tT%D6Tjyj3g z%b_(JDZ+`CjOVA$Xg!AP#-bfB=$fC4q8EF(NAD)`lOA7UPym`7lVOz44O@f>f26%! z9c|3FpmL65eAr@CbH)r~qw%rxjN=y>wQMS8ArwIZ`kNANf7FI5=?5C`Hk>`4R9)_5 zKC~R7j*hk_aDZw-U`w(st(en+*#^iEfNR7qPaVsfO+CSqKx^}RiW@<<7?v3tvhhC#nbMKkE7zyrQeEef!Vb>yLhhqphH`dpj zjEhX8J(dnX)|Mjc!kTJ_Q7M-rb86gn-ch_`g(Up&8P+^5B>wMKg>K3mF1t`mf&7=Y z<|Ho=NRUc)>{}~x1qlC$JtKKEv^(lV_6Z?3oTmh|y6EiTtjdQQo>A*cnYsZUaCkY? z8>2PM(MV}jV+0RS1xyN&=nhyI32bO!i(qRKI>EY)5e*Q(Ns0gV#oWYr;uA#fyQios zF!-4N+b$jw`*aRdzT%vaMLA)(PB=zLug{KEI{awV%@6NE-8W4R>W6vt#(TW9zu4y8 z=w@zpSs$@=8$?)FCRi^cH}*>Bh1GB?&p9r<4OvO!VfU9wB=oeTjik@~)IF1tivBAML)Gr}X8{^6Q8^nT%{FXHiJ$5D1< z8S14R>m-4m5r4Z>Sp=CG^2@Af1N}6CY?8Tu&$$&Le;fy_C4w{`TeAmun<%$2aF!U6 z?AHbU9Uo|kQc%oT=?LN`ZuW{)5xX;|?_bB_W1{@sI$^E9s<_bz%(CM_Kg?a=xPyM= zXk*(2kp@_f$$RQqK1Kd4bHY62G_YJ8j%^&dpIA+MPe7s1-pMjfy!R)NT1xkcpF$yq z;F27Cz`nVX<@Zy*$GzPE?#3J@FApoPLHJzP4Wzc@RGFwue_OP6ii)+^g~ z)hpY!ZQHhO+qP}n)|={?o<;Yrdv|kjzq`nr5ho)v&ToHGjgU-(z8WY!9_KGCd`N86 zl=77!_>~dxRpI%j+$x8eC`4B-F*U;sv}%jQSXYT^kSdbR4El0}pm} z{I6Xm4)Ep?yPJZn->EU$my~Rf+%d_Uq-==qB&EgN$=cz5M$&F1(6AM!SMgd*ApXxW zPBLEDfo09ZBW&;zi|SFd?>+%f!+CaM&EvU;Q#x}te zH?(N#ZIMF*Re&lN&_2o<0QMbi<`GX2env_X5&#Qg8Z7ZA_qQX*^2qLW03swo;y<#-gfjc=c&9USuCHXbIUDY*wIKjYU4n-QE3e`yED!|!B zv<^R#XT)+MF}lEm$LI7aIe_gC((EcZhwGi$hYCci`NHHE)D~@9_Ksz%aj*TtLMVp2 zlG-61!0qu`zc+h!N66N_sUx>quL}%(HdyT?b;3xI76x$$EiMQ-vnLGbdAbFbSR<03 zs?AYKOInjrDi`dPxvQN&)T0lYAc8FsXDYA}dA%tuS{+RYw)0unm6lY}md?dbo2}2g zfQJ8!J?D)>$E~0fRsRvx&<$zo!7=v+UHFg`PgL#y`(TkqQ7drMg+@C0OrdP!hir_S zMa0%8@*vtKvIF8ek-6{Fj)-+!eaGeweiiRJ;P^o2rnoZb`JfXkbm494#q2hTn`@eV zFA*3z#BrcCO1M0(lky@27L!Cs6~(7NkAPF}d=u7vLQ&w^z2&xp7zrQ%JrFU;kN(Np;m0|%DHq+v!>2{1C_N?OW!e-*a`|q-xfL(j}X?`7)0L?+I^K{HUk$o z*;DK-fEaI|T@kikcQD-bZ$KN$>4r#r$W_BX^z=O(62`GV@sK@&WN%pMd%I&GyTr&} ze$scujQw(BAbh`r0O>nw#(vu|klx<`c)A|`%S$1|lLmNM`U3y9Xa|WEN z1=v>gFD+7Jkgo~jEfo#?*7E+Ycm>gC8A&g9C7hwUQSAAMj_JxVeV;lNlh+}AA0Lis zN(7Y+h-nEo4znie48NVKVNgd1HNi&EQUdXtcvU#a+1e<#Wd&FNnO}{ExbNUeuLAhe zWfV~@&M8+R@`S=+&DZd*HuA9;yJYdMHuVvf{aleE#tH~K9GG=QC<>QyM4Z}M;}X`e z`G;Nv8-PQD>c}#X2hGdBG7U8hTMJqTm|-PiU}m*F!?~e*c)%o4up5x0tpYCDvSYq& zS>?PFEMrKfXq_!Q`iR{Esdbsq@<7t9bWzL=^NQz{PSUrIOY!zb@!h64`@S3EL$uT@ zS_q+oOasCxVC!duL$^bN6YcDQ%vxg(j=0b1p@K6M;_~nOAckuHGfLE_RPd@ipbxlG zGliD4%xHB7Dq06SW~(5cHQ_q>IZP6aoiB24C7!7Mzl-w$i04{7Fw*VIrrpW+NLT$k z&1`M{jUDqK?8E~ko8gEhE8;C2ysBpn z#0^2T%IrR*CS-NfYZ6v@&8e6LsC6}K%E^V4`tl72Rw+$H6F63`AsnlgP!3K(t zgn8M3#LZ0lO)h9ri!&h-8ys=f*^!UVxYElj15Vdo6mxWbg4aZ9<=QZ%mZ^R38^(6! zE}&Ya+K{ehssi0EEZkMv;In3Ieb^h(cR4P|UisTFy=JX_xf`Nj8)UI>#x-x>i>ST2 z9S5&Ms$aZ^HN%L*x3KZUwMI`nyx9}QzBv5e(8Ea2GOi1^=U!0J7dD?^dEe~`i%bJIo-rolIJI_rsttZg8N_1s~ zd%T?c8#(x%fjjvA9_A6Xl zmo4r1Yh3fFRd>T%Hh0^#yZ~kudPAIA+zxnLE4GP$;?&Id1X(uM=E;6y*^Jy-Z?Kh> zdx67S><*$`gS&};B9flU-9e1FTJR0-HtX(*T(hx=N}cZkcOB40*M_|=VPKj$ukl9O z)J@;3PXYR;jD3ztw6^DG&y7PC_h%c_ayq#JDV2v87xr`O%Ft}aGGu&V*t2IZWSVFIlStwmd(h(}!7FU!gE-~_Bk*Irzp(9>DrX<`jDR>C6>#hCBm}vLIx#DpV3do>74;Yk$GL z4Mi)~D7l>T=ERVX#K=sdP6!!8>e5ZnPTyHvPOvK=784xVyWFJCb#kd6nB z>LFIPg1n~`m0LqTz~N!qrgRIWdbYjC$pdM#kf@)S1LS(Pov(8X_|G^i{BOS0UM6=&#v4p--qGFG zo9wpq^xhu>zXpGj{KC=AKW8>}5!y|jFDJKZ_LTY=RC3}gY?4k^?bYnoLTp0*j8Aex z-mEr(aa^9*MCrcN$tD$qubkJ$>jkuz8rRPiU11vqOO((#;>uzV*|9 z(Z-lS#vi|=Z-hZL@E>rP7)w!q%-s_D2$OqQC|OA%j=UPN5u7par#j=@AOHzRKVQuYQnQPA+G!-KuQIRYnp>}j!jez*7XwVV| zQ4t*?;kIAg9QO*FaL`dKM7gH0I2&=1Cc?r9L>$RCbtGI-k`@_l zN@Swhcv?9eU{Ub8=y|o7>*a^{-Xfb2+qchIIUhjx6L`GyO|Z`gT5PG8UnMfEJQoYh zA}q_^4XhyUy~kwt6xY&uJ|6$4wQ6PJtVdv}YR6_}>kwY4OQU0^E9UdQsPp;hW+wk( zrg_a&?t2qdNbAc*Uv7bl$vra_CxayI$lc!k#e%J57)99=j9e$Q7bQmAaOSeHu2ve~ z$xSkFtRz@(7BwSt}jx;lP>{FPH^GVsU1?cU*efaT4gT?xgL92??wAf=Tz|m zV|o>wyi17TzQ#T7+@KCJ?zBD8)4kT~FT>)R{tf2-ns-8!EE#&Hb zcXJIo;|I{;G!&uGHwfv}@T|c1fWfh&Bj}7Od_K*n0p0~dEPY4SSws7dw&r{qt5=TA0xV9w2o z01|X3y>tRMS>%40Snt1>P#-&PAAW8hVQwEm?w>%nuPC>#Ft;xcakr;`w{Bs9hxgzI z_v8ol@b_!6ZePJ}UlOt4I8b<31;4M_%X7m(X85yK<_nPz`ptwu`b4?1d4&qc0@C4K z;&21O;cfG{wiLxW$c%Y| z8$rYc0yLyJ;K8}agB+yi863OYxdt=5hJ`ya65ACAIj_Ge2 zAHjiNP}C}F#9LyjXp zAxxL!6po1tgu_=ZFWChAODn9DN>CvZX2DQ^_4`OvF^RZL8g>yOB*M~{&4#@%T_r4u zJw7ROc#%(>pTW%zX{_{c;@ri7iTKefcK+A0<8KH=GO-{kMIlu_bVy<}RV>unw)SG@ zq*8DYm`^a=t7L_lg3dybqbd@t;-`W4?h=m!y*7c=HZ6E5%Xt2CoSy{oMPES?Vw#gu z=9=g>;O|S9xQ7s?lz= z2(gV5L9>9#LT2(Cu8^$?>v+BYlBgSN+{##QK{U`52D-R)!eQnS$W(TaZ{j5(=N|;V z=N(ZFmN|k_gD@Qg%ecjQ!*a9gY3Vq3v)bvcjEL~YF`TPvFS%}Twh4|jX7t3P`y`TB zd~RPa+$=%kmbg`Csk50_EpD$^Ej2NuQQ0}P(vq=*Y#LL6LhiqM2+waya_8F)`o!55 znMkryGWL;*`(kARH1n&Fe@jRAcO%H$8F{+J(niyR*vaT@;!v^s?~+8r zRiFZ4#)9k{HZaRQC1Nnp3uJsLvFuX`Z?yomqbmu9+ps*aR|~>A;nLs1k}#Ypc3Ama z?3tz*ZT#IwMAZze0*DS}*_X>grJ_3bIS=v5*lt2Uqrmkl?+LExTl!=TsjpaB2X~`G z_nZ&)-4^*DSIq)qqpa_m?;*SlxuJHkVDGx`+1{4d0DUpI=5u_bhA}(U67F4BX59i{ zS#pdFqe=%OII%Bn?4pyK9Z2oru`lgr-IR=ElPl|d(FX=&CS-9?!A~$lszz8m@t5j! zcswa?G_LJb3mV^-iHEc;ac($ihqTRyw9n~W>kY#?Wo`Sl1DTA|x@U%Z8|5%)B2AZt zY&j7xCGIUdHHL^C4mmTiSFJ^8W-KS;PFwZIU?gnR4u}pUnG?{MscZ%=!WT};papFX zewJDvvDCnyydl*v_JmYM`wn)Gz>o3s4U~?^-38w>U9tJ-&yVC*CDz9}v;90+#Xj4m7lc0A zP=;iwPEZJ65$<7x@{Dcv4!PG(wHy|N@x-tlk=~=-ivwP6|E(XhgO5abRA;|QUG^`s zZ)X(HaU=^CvT`gQWL?D*r_f$ip(sAZ4YM?os)@he%eb_zY3EIV=_E{mxjc1{mJHL! zxmPS5g2&toV*9a%fX=!^jntC+qQ`yMQ#%ShXGbHYa7gZyxeYsjjNz#IamR9Msriuv%trCzx*xHpij^!fn7nwM)qzgB>S*?) zs@!CT(VBtEDb%);BtGJy-)4?kF81pzP!_ $_!HkkZ~`m&f3id`mJWP&nZSQzeG7 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