Full Code of boyter/scc for AI

master cc8311ea9fee cached
1050 files
11.9 MB
3.2M tokens
90412 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (12,668K chars total). Download the full file to get everything.
Repository: boyter/scc
Branch: master
Commit: cc8311ea9fee
Files: 1050
Total size: 11.9 MB

Directory structure:
gitextract_j2nq6hjf/

├── .devcontainer/
│   └── devcontainer.json
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── docker-publish.yml
│       └── go.yml
├── .gitignore
├── .goreleaser.yml
├── .ignore
├── .sccignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LANGUAGES.md
├── LICENSE
├── README.md
├── SCC-OUTPUT-REPORT.html
├── benchmark.sh
├── benchmark_to_chart.py
├── examples/
│   ├── complexity/
│   │   ├── complexity.cpp
│   │   └── complexity.java
│   ├── countas/
│   │   ├── test.jsp
│   │   └── test.new
│   ├── duplicates/
│   │   ├── 1.java
│   │   ├── 10.java
│   │   ├── 11.java
│   │   ├── 12.java
│   │   ├── 13.java
│   │   ├── 14.java
│   │   ├── 15.java
│   │   ├── 16.java
│   │   ├── 17.java
│   │   ├── 18.java
│   │   ├── 19.java
│   │   ├── 2.java
│   │   ├── 20.java
│   │   ├── 3.java
│   │   ├── 4.java
│   │   ├── 5.java
│   │   ├── 6.java
│   │   ├── 7.java
│   │   ├── 8.java
│   │   └── 9.java
│   ├── generated/
│   │   ├── test.cs
│   │   └── test.h
│   ├── issue114/
│   │   ├── .gitignore
│   │   ├── .ignore
│   │   ├── .travis.yml
│   │   ├── java
│   │   ├── license
│   │   └── makefile
│   ├── issue120/
│   │   ├── test
│   │   └── test.java
│   ├── issue152/
│   │   └── example.black.css
│   ├── issue214/
│   │   ├── ббббббббббббббббббббббббббббббббб.md
│   │   ├── ѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬ.md
│   │   └── 中文中文中文中文中文中文中文中文中文中文中文中文中文中文中文中文.md
│   ├── issue246.py
│   ├── issue260/
│   │   └── test.c
│   ├── issue323/
│   │   ├── a.php
│   │   └── b.php
│   ├── issue339/
│   │   ├── matlab.m
│   │   └── objectivec.m
│   ├── issue345/
│   │   └── filename.cc
│   ├── issue379/
│   │   └── filename.py
│   ├── issue552/
│   │   └── test.txt
│   ├── issue564/
│   │   ├── a/
│   │   │   └── level1/
│   │   │       └── level2/
│   │   │           └── test.py
│   │   ├── b/
│   │   │   └── c/
│   │   │       └── level2/
│   │   │           └── test.py
│   │   ├── level1/
│   │   │   ├── level2/
│   │   │   │   └── test.py
│   │   │   └── test.go
│   │   └── test.go
│   ├── issue610/
│   │   └── issue610.ts
│   ├── language/
│   │   ├── .bash_login
│   │   ├── .cshrc
│   │   ├── .dockerignore
│   │   ├── .ignore
│   │   ├── .kshrc
│   │   ├── .tcshrc
│   │   ├── .zshrc
│   │   ├── Amber.ab
│   │   ├── ArkTs.ets
│   │   ├── Blueprint.blp
│   │   ├── Build.csx
│   │   ├── CMakeLists.txt
│   │   ├── Dockerfile
│   │   ├── FSharp.fs
│   │   ├── GNUMakefile
│   │   ├── Gemfile
│   │   ├── HassIQApp.mc
│   │   ├── MLIR.mlir
│   │   ├── POML.poml
│   │   ├── PostScript.ps
│   │   ├── Rakefile
│   │   ├── Sally.yarn
│   │   ├── TOML.toml
│   │   ├── TOON.toon
│   │   ├── abnf.abnf
│   │   ├── alchemist.crn
│   │   ├── algol68.a68
│   │   ├── apex.apex
│   │   ├── arturo.art
│   │   ├── astro.astro
│   │   ├── barber_solutions.als
│   │   ├── bean.beancount
│   │   ├── bicep.bicep
│   │   ├── bitbucket-pipelines.yml
│   │   ├── boo.boo
│   │   ├── bosque.bsq
│   │   ├── bru.bru
│   │   ├── c3.c3
│   │   ├── cairo.cairo
│   │   ├── capnproto.capnp
│   │   ├── chapel.chpl
│   │   ├── circom.circom
│   │   ├── clojure.cljc
│   │   ├── cloudformation.json
│   │   ├── cloudformation.yml
│   │   ├── component.templ
│   │   ├── cuda.cu
│   │   ├── cypher.cypher
│   │   ├── d2.d2
│   │   ├── daml.daml
│   │   ├── docker.nu
│   │   ├── dot.gv
│   │   ├── elixirtemplate.eex
│   │   ├── elm.elm
│   │   ├── emit.emit
│   │   ├── factor.factor
│   │   ├── flow9.flow
│   │   ├── fsl.fsl
│   │   ├── fxml.fxml
│   │   ├── gleam.gleam
│   │   ├── go.go
│   │   ├── godot.tscn
│   │   ├── goplus.gop
│   │   ├── graphql.graphql
│   │   ├── gremlin.gremlin
│   │   ├── gwion.gw
│   │   ├── haml.haml
│   │   ├── hare.ha
│   │   ├── haskell.hs
│   │   ├── hcl.hcl
│   │   ├── ini.ini
│   │   ├── javascript.js
│   │   ├── jcl.jcl
│   │   ├── jq.jq
│   │   ├── jsonc.jsonc
│   │   ├── jsonnet.jsonnet
│   │   ├── kitchen-sink.json5
│   │   ├── koto.koto
│   │   ├── lalrpop.lalrpop
│   │   ├── license
│   │   ├── linear_solve.fut
│   │   ├── livescript.ls
│   │   ├── llvmir.ll
│   │   ├── lua.lua
│   │   ├── luau.luau
│   │   ├── luna.luna
│   │   ├── main.cj
│   │   ├── makefile
│   │   ├── metal.metal
│   │   ├── mojo.mojo
│   │   ├── moonbit.mbt
│   │   ├── nature.n
│   │   ├── nawk.awk
│   │   ├── perl.pl
│   │   ├── pkl.pkl
│   │   ├── plain.txt
│   │   ├── python.py
│   │   ├── qasm.qasm
│   │   ├── qsharp.qs
│   │   ├── racket.rkt
│   │   ├── raml.raml
│   │   ├── rebol.reb
│   │   ├── redscript.reds
│   │   ├── rscript.r
│   │   ├── rtf.rtf
│   │   ├── scallop.scl
│   │   ├── seed7.sd7
│   │   ├── slang.slang
│   │   ├── slint.slint
│   │   ├── smalltalk.cs.st
│   │   ├── snakefile.smk
│   │   ├── stan.stan
│   │   ├── syntax.wren
│   │   ├── systemd.service
│   │   ├── tact.tact
│   │   ├── teal.teal
│   │   ├── tera.tera
│   │   ├── test.ch
│   │   ├── test.dm
│   │   ├── test.java
│   │   ├── test.prg
│   │   ├── test.sieve
│   │   ├── test.tf
│   │   ├── test.tofu
│   │   ├── textile.textile
│   │   ├── ttcn.ttcn
│   │   ├── typescript.ts
│   │   ├── typespec.tsp
│   │   ├── typst.typ
│   │   ├── up.up
│   │   ├── vala.vala
│   │   ├── version.rc
│   │   ├── vim.vim
│   │   ├── wenyan.wy
│   │   ├── wsdl.wsdl
│   │   ├── xhtml.xhtml
│   │   ├── xmake.lua
│   │   ├── xmlschema.xsd
│   │   ├── yaml.yml
│   │   ├── zig.zig
│   │   └── zokrates.zok
│   ├── long/
│   │   ├── test.feature
│   │   ├── test.ftl
│   │   ├── test.jsp
│   │   ├── test.mxml
│   │   ├── test.rdl
│   │   ├── test.vcl
│   │   └── test.xslt
│   ├── minified/
│   │   ├── 0-941d61979b9396d94f06.js
│   │   ├── 1-fa6e7d2ffea9ee90c8d8.js
│   │   ├── app-5cddf2000f4491a89a40.js
│   │   ├── component---src-pages-index-tsx-65151e9f2f564e3fe49c.js
│   │   └── webpack-runtime-c6e0a1eee0c3fa087a21.js
│   ├── nolines.py
│   ├── oneline.py
│   ├── onenewline.py
│   ├── performance_tests/
│   │   ├── create_folders_with_files.py
│   │   └── create_performance_test.py
│   ├── remap/
│   │   ├── java.java
│   │   └── unknown
│   ├── shared_extension/
│   │   ├── coq/
│   │   │   └── Qabs.v
│   │   ├── verilog/
│   │   │   └── button_debounce.v
│   │   └── vlang/
│   │       └── users.v
│   ├── symlink/
│   │   └── test.py
│   ├── threenewline.py
│   ├── twolines.py
│   └── twonewline.py
├── go.mod
├── go.sum
├── languages.json
├── main.go
├── main_test.go
├── mcp.go
├── packages/
│   ├── aur/
│   │   └── PKGBUILD
│   └── chocolatey/
│       ├── ReadMe.md
│       ├── scc.nuspec
│       └── tools/
│           ├── LICENSE.txt
│           ├── VERIFICATION.txt
│           ├── chocolateyinstall.ps1
│           └── chocolateyuninstall.ps1
├── processor/
│   ├── bloom.go
│   ├── cocomo.go
│   ├── cocomo_test.go
│   ├── constants.go
│   ├── detector.go
│   ├── detector_test.go
│   ├── file.go
│   ├── file_test.go
│   ├── filereader.go
│   ├── formatters.go
│   ├── formatters_test.go
│   ├── helpers.go
│   ├── helpers_test.go
│   ├── locomo.go
│   ├── locomo_test.go
│   ├── processor.go
│   ├── processor_test.go
│   ├── result.go
│   ├── similar_flags.go
│   ├── similar_flags_test.go
│   ├── structs.go
│   ├── structs_test.go
│   ├── trace.go
│   ├── trace_test.go
│   ├── workers.go
│   ├── workers_regression_test.go
│   ├── workers_test.go
│   └── workers_tokei_test.go
├── scripts/
│   ├── include.go
│   └── languages.tmpl
├── test-all.sh
└── vendor/
    ├── github.com/
    │   ├── agnivade/
    │   │   └── levenshtein/
    │   │       ├── .gitignore
    │   │       ├── License.txt
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       └── levenshtein.go
    │   ├── bahlo/
    │   │   └── generic-list-go/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── list.go
    │   ├── boyter/
    │   │   ├── gocodewalker/
    │   │   │   ├── .gitignore
    │   │   │   ├── .goreleaser.yml
    │   │   │   ├── .ignore
    │   │   │   ├── LICENSE
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── dir_suffix.go
    │   │   │   ├── file.go
    │   │   │   ├── gitmodule.go
    │   │   │   ├── go-gitignore/
    │   │   │   │   ├── LICENSE
    │   │   │   │   ├── README.md
    │   │   │   │   ├── cache.go
    │   │   │   │   ├── doc.go
    │   │   │   │   ├── error.go
    │   │   │   │   ├── errors.go
    │   │   │   │   ├── exclude.go
    │   │   │   │   ├── gitignore.go
    │   │   │   │   ├── lexer.go
    │   │   │   │   ├── match.go
    │   │   │   │   ├── parser.go
    │   │   │   │   ├── pattern.go
    │   │   │   │   ├── position.go
    │   │   │   │   ├── repository.go
    │   │   │   │   ├── rune.go
    │   │   │   │   ├── token.go
    │   │   │   │   ├── tokenset.go
    │   │   │   │   └── tokentype.go
    │   │   │   ├── hidden.go
    │   │   │   └── hidden_windows.go
    │   │   └── simplecache/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── simplecache.go
    │   ├── buger/
    │   │   └── jsonparser/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── Dockerfile
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── bytes.go
    │   │       ├── bytes_safe.go
    │   │       ├── bytes_unsafe.go
    │   │       ├── escape.go
    │   │       ├── fuzz.go
    │   │       ├── oss-fuzz-build.sh
    │   │       └── parser.go
    │   ├── clipperhouse/
    │   │   └── uax29/
    │   │       └── v2/
    │   │           ├── LICENSE
    │   │           ├── graphemes/
    │   │           │   ├── README.md
    │   │           │   ├── iterator.go
    │   │           │   ├── reader.go
    │   │           │   ├── splitfunc.go
    │   │           │   └── trie.go
    │   │           └── internal/
    │   │               └── iterators/
    │   │                   └── iterator.go
    │   ├── danwakefield/
    │   │   └── fnmatch/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── fnmatch.go
    │   ├── google/
    │   │   └── uuid/
    │   │       ├── CHANGELOG.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── CONTRIBUTORS
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── dce.go
    │   │       ├── doc.go
    │   │       ├── hash.go
    │   │       ├── marshal.go
    │   │       ├── node.go
    │   │       ├── node_js.go
    │   │       ├── node_net.go
    │   │       ├── null.go
    │   │       ├── sql.go
    │   │       ├── time.go
    │   │       ├── util.go
    │   │       ├── uuid.go
    │   │       ├── version1.go
    │   │       ├── version4.go
    │   │       ├── version6.go
    │   │       └── version7.go
    │   ├── inconshreveable/
    │   │   └── mousetrap/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── trap_others.go
    │   │       └── trap_windows.go
    │   ├── mailru/
    │   │   └── easyjson/
    │   │       ├── LICENSE
    │   │       ├── buffer/
    │   │       │   └── pool.go
    │   │       └── jwriter/
    │   │           └── writer.go
    │   ├── mark3labs/
    │   │   └── mcp-go/
    │   │       ├── LICENSE
    │   │       ├── mcp/
    │   │       │   ├── consts.go
    │   │       │   ├── errors.go
    │   │       │   ├── prompts.go
    │   │       │   ├── resources.go
    │   │       │   ├── tasks.go
    │   │       │   ├── tools.go
    │   │       │   ├── typed_tools.go
    │   │       │   ├── types.go
    │   │       │   └── utils.go
    │   │       ├── server/
    │   │       │   ├── completion.go
    │   │       │   ├── constants.go
    │   │       │   ├── ctx.go
    │   │       │   ├── elicitation.go
    │   │       │   ├── errors.go
    │   │       │   ├── hooks.go
    │   │       │   ├── http_transport_options.go
    │   │       │   ├── inprocess_session.go
    │   │       │   ├── request_handler.go
    │   │       │   ├── roots.go
    │   │       │   ├── sampling.go
    │   │       │   ├── server.go
    │   │       │   ├── session.go
    │   │       │   ├── sse.go
    │   │       │   ├── stdio.go
    │   │       │   ├── streamable_http.go
    │   │       │   └── task_hooks.go
    │   │       └── util/
    │   │           └── logger.go
    │   ├── mattn/
    │   │   ├── go-colorable/
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── colorable_appengine.go
    │   │   │   ├── colorable_others.go
    │   │   │   ├── colorable_windows.go
    │   │   │   ├── go.test.sh
    │   │   │   └── noncolorable.go
    │   │   ├── go-isatty/
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── doc.go
    │   │   │   ├── go.test.sh
    │   │   │   ├── isatty_bsd.go
    │   │   │   ├── isatty_others.go
    │   │   │   ├── isatty_plan9.go
    │   │   │   ├── isatty_solaris.go
    │   │   │   ├── isatty_tcgets.go
    │   │   │   └── isatty_windows.go
    │   │   └── go-runewidth/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── benchstat.txt
    │   │       ├── new.txt
    │   │       ├── old.txt
    │   │       ├── runewidth.go
    │   │       ├── runewidth_appengine.go
    │   │       ├── runewidth_js.go
    │   │       ├── runewidth_posix.go
    │   │       ├── runewidth_table.go
    │   │       └── runewidth_windows.go
    │   ├── modern-go/
    │   │   └── concurrent/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── executor.go
    │   │       ├── go_above_19.go
    │   │       ├── go_below_19.go
    │   │       ├── log.go
    │   │       ├── test.sh
    │   │       └── unbounded_executor.go
    │   ├── rs/
    │   │   └── zerolog/
    │   │       ├── .gitignore
    │   │       ├── CNAME
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── _config.yml
    │   │       ├── array.go
    │   │       ├── console.go
    │   │       ├── context.go
    │   │       ├── ctx.go
    │   │       ├── encoder.go
    │   │       ├── encoder_cbor.go
    │   │       ├── encoder_json.go
    │   │       ├── event.go
    │   │       ├── fields.go
    │   │       ├── globals.go
    │   │       ├── go112.go
    │   │       ├── hook.go
    │   │       ├── internal/
    │   │       │   ├── cbor/
    │   │       │   │   ├── README.md
    │   │       │   │   ├── base.go
    │   │       │   │   ├── cbor.go
    │   │       │   │   ├── decode_stream.go
    │   │       │   │   ├── string.go
    │   │       │   │   ├── time.go
    │   │       │   │   └── types.go
    │   │       │   └── json/
    │   │       │       ├── base.go
    │   │       │       ├── bytes.go
    │   │       │       ├── string.go
    │   │       │       ├── time.go
    │   │       │       └── types.go
    │   │       ├── log/
    │   │       │   └── log.go
    │   │       ├── log.go
    │   │       ├── not_go112.go
    │   │       ├── sampler.go
    │   │       ├── syslog.go
    │   │       └── writer.go
    │   ├── spf13/
    │   │   ├── cast/
    │   │   │   ├── .gitignore
    │   │   │   ├── LICENSE
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── cast.go
    │   │   │   ├── caste.go
    │   │   │   └── timeformattype_string.go
    │   │   ├── cobra/
    │   │   │   ├── .gitignore
    │   │   │   ├── .golangci.yml
    │   │   │   ├── .mailmap
    │   │   │   ├── CONDUCT.md
    │   │   │   ├── CONTRIBUTING.md
    │   │   │   ├── LICENSE.txt
    │   │   │   ├── MAINTAINERS
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── SECURITY.md
    │   │   │   ├── active_help.go
    │   │   │   ├── args.go
    │   │   │   ├── bash_completions.go
    │   │   │   ├── bash_completionsV2.go
    │   │   │   ├── cobra.go
    │   │   │   ├── command.go
    │   │   │   ├── command_notwin.go
    │   │   │   ├── command_win.go
    │   │   │   ├── completions.go
    │   │   │   ├── fish_completions.go
    │   │   │   ├── flag_groups.go
    │   │   │   ├── powershell_completions.go
    │   │   │   ├── shell_completions.go
    │   │   │   └── zsh_completions.go
    │   │   └── pflag/
    │   │       ├── .editorconfig
    │   │       ├── .gitignore
    │   │       ├── .golangci.yaml
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── bool.go
    │   │       ├── bool_func.go
    │   │       ├── bool_slice.go
    │   │       ├── bytes.go
    │   │       ├── count.go
    │   │       ├── duration.go
    │   │       ├── duration_slice.go
    │   │       ├── errors.go
    │   │       ├── flag.go
    │   │       ├── float32.go
    │   │       ├── float32_slice.go
    │   │       ├── float64.go
    │   │       ├── float64_slice.go
    │   │       ├── func.go
    │   │       ├── golangflag.go
    │   │       ├── int.go
    │   │       ├── int16.go
    │   │       ├── int32.go
    │   │       ├── int32_slice.go
    │   │       ├── int64.go
    │   │       ├── int64_slice.go
    │   │       ├── int8.go
    │   │       ├── int_slice.go
    │   │       ├── ip.go
    │   │       ├── ip_slice.go
    │   │       ├── ipmask.go
    │   │       ├── ipnet.go
    │   │       ├── ipnet_slice.go
    │   │       ├── string.go
    │   │       ├── string_array.go
    │   │       ├── string_slice.go
    │   │       ├── string_to_int.go
    │   │       ├── string_to_int64.go
    │   │       ├── string_to_string.go
    │   │       ├── text.go
    │   │       ├── time.go
    │   │       ├── uint.go
    │   │       ├── uint16.go
    │   │       ├── uint32.go
    │   │       ├── uint64.go
    │   │       ├── uint8.go
    │   │       └── uint_slice.go
    │   └── yosida95/
    │       └── uritemplate/
    │           └── v3/
    │               ├── LICENSE
    │               ├── README.rst
    │               ├── compile.go
    │               ├── equals.go
    │               ├── error.go
    │               ├── escape.go
    │               ├── expression.go
    │               ├── machine.go
    │               ├── match.go
    │               ├── parse.go
    │               ├── prog.go
    │               ├── uritemplate.go
    │               └── value.go
    ├── go.yaml.in/
    │   └── yaml/
    │       └── v2/
    │           ├── .travis.yml
    │           ├── LICENSE
    │           ├── LICENSE.libyaml
    │           ├── NOTICE
    │           ├── README.md
    │           ├── apic.go
    │           ├── decode.go
    │           ├── emitterc.go
    │           ├── encode.go
    │           ├── parserc.go
    │           ├── readerc.go
    │           ├── resolve.go
    │           ├── scannerc.go
    │           ├── sorter.go
    │           ├── writerc.go
    │           ├── yaml.go
    │           ├── yamlh.go
    │           └── yamlprivateh.go
    ├── golang.org/
    │   └── x/
    │       ├── crypto/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── blake2b/
    │       │       ├── blake2b.go
    │       │       ├── blake2bAVX2_amd64.go
    │       │       ├── blake2bAVX2_amd64.s
    │       │       ├── blake2b_amd64.s
    │       │       ├── blake2b_generic.go
    │       │       ├── blake2b_ref.go
    │       │       ├── blake2x.go
    │       │       ├── go125.go
    │       │       └── register.go
    │       ├── sync/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── errgroup/
    │       │       └── errgroup.go
    │       ├── sys/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── cpu/
    │       │   │   ├── asm_aix_ppc64.s
    │       │   │   ├── asm_darwin_x86_gc.s
    │       │   │   ├── byteorder.go
    │       │   │   ├── cpu.go
    │       │   │   ├── cpu_aix.go
    │       │   │   ├── cpu_arm.go
    │       │   │   ├── cpu_arm64.go
    │       │   │   ├── cpu_arm64.s
    │       │   │   ├── cpu_darwin_x86.go
    │       │   │   ├── cpu_gc_arm64.go
    │       │   │   ├── cpu_gc_s390x.go
    │       │   │   ├── cpu_gc_x86.go
    │       │   │   ├── cpu_gc_x86.s
    │       │   │   ├── cpu_gccgo_arm64.go
    │       │   │   ├── cpu_gccgo_s390x.go
    │       │   │   ├── cpu_gccgo_x86.c
    │       │   │   ├── cpu_gccgo_x86.go
    │       │   │   ├── cpu_linux.go
    │       │   │   ├── cpu_linux_arm.go
    │       │   │   ├── cpu_linux_arm64.go
    │       │   │   ├── cpu_linux_loong64.go
    │       │   │   ├── cpu_linux_mips64x.go
    │       │   │   ├── cpu_linux_noinit.go
    │       │   │   ├── cpu_linux_ppc64x.go
    │       │   │   ├── cpu_linux_riscv64.go
    │       │   │   ├── cpu_linux_s390x.go
    │       │   │   ├── cpu_loong64.go
    │       │   │   ├── cpu_loong64.s
    │       │   │   ├── cpu_mips64x.go
    │       │   │   ├── cpu_mipsx.go
    │       │   │   ├── cpu_netbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.s
    │       │   │   ├── cpu_other_arm.go
    │       │   │   ├── cpu_other_arm64.go
    │       │   │   ├── cpu_other_mips64x.go
    │       │   │   ├── cpu_other_ppc64x.go
    │       │   │   ├── cpu_other_riscv64.go
    │       │   │   ├── cpu_other_x86.go
    │       │   │   ├── cpu_ppc64x.go
    │       │   │   ├── cpu_riscv64.go
    │       │   │   ├── cpu_s390x.go
    │       │   │   ├── cpu_s390x.s
    │       │   │   ├── cpu_wasm.go
    │       │   │   ├── cpu_x86.go
    │       │   │   ├── cpu_zos.go
    │       │   │   ├── cpu_zos_s390x.go
    │       │   │   ├── endian_big.go
    │       │   │   ├── endian_little.go
    │       │   │   ├── hwcap_linux.go
    │       │   │   ├── parse.go
    │       │   │   ├── proc_cpuinfo_linux.go
    │       │   │   ├── runtime_auxv.go
    │       │   │   ├── runtime_auxv_go121.go
    │       │   │   ├── syscall_aix_gccgo.go
    │       │   │   ├── syscall_aix_ppc64_gc.go
    │       │   │   └── syscall_darwin_x86_gc.go
    │       │   └── unix/
    │       │       ├── .gitignore
    │       │       ├── README.md
    │       │       ├── affinity_linux.go
    │       │       ├── aliases.go
    │       │       ├── asm_aix_ppc64.s
    │       │       ├── asm_bsd_386.s
    │       │       ├── asm_bsd_amd64.s
    │       │       ├── asm_bsd_arm.s
    │       │       ├── asm_bsd_arm64.s
    │       │       ├── asm_bsd_ppc64.s
    │       │       ├── asm_bsd_riscv64.s
    │       │       ├── asm_linux_386.s
    │       │       ├── asm_linux_amd64.s
    │       │       ├── asm_linux_arm.s
    │       │       ├── asm_linux_arm64.s
    │       │       ├── asm_linux_loong64.s
    │       │       ├── asm_linux_mips64x.s
    │       │       ├── asm_linux_mipsx.s
    │       │       ├── asm_linux_ppc64x.s
    │       │       ├── asm_linux_riscv64.s
    │       │       ├── asm_linux_s390x.s
    │       │       ├── asm_openbsd_mips64.s
    │       │       ├── asm_solaris_amd64.s
    │       │       ├── asm_zos_s390x.s
    │       │       ├── auxv.go
    │       │       ├── auxv_unsupported.go
    │       │       ├── bluetooth_linux.go
    │       │       ├── bpxsvc_zos.go
    │       │       ├── bpxsvc_zos.s
    │       │       ├── cap_freebsd.go
    │       │       ├── constants.go
    │       │       ├── dev_aix_ppc.go
    │       │       ├── dev_aix_ppc64.go
    │       │       ├── dev_darwin.go
    │       │       ├── dev_dragonfly.go
    │       │       ├── dev_freebsd.go
    │       │       ├── dev_linux.go
    │       │       ├── dev_netbsd.go
    │       │       ├── dev_openbsd.go
    │       │       ├── dev_zos.go
    │       │       ├── dirent.go
    │       │       ├── endian_big.go
    │       │       ├── endian_little.go
    │       │       ├── env_unix.go
    │       │       ├── fcntl.go
    │       │       ├── fcntl_darwin.go
    │       │       ├── fcntl_linux_32bit.go
    │       │       ├── fdset.go
    │       │       ├── gccgo.go
    │       │       ├── gccgo_c.c
    │       │       ├── gccgo_linux_amd64.go
    │       │       ├── ifreq_linux.go
    │       │       ├── ioctl_linux.go
    │       │       ├── ioctl_signed.go
    │       │       ├── ioctl_unsigned.go
    │       │       ├── ioctl_zos.go
    │       │       ├── mkall.sh
    │       │       ├── mkerrors.sh
    │       │       ├── mmap_nomremap.go
    │       │       ├── mremap.go
    │       │       ├── pagesize_unix.go
    │       │       ├── pledge_openbsd.go
    │       │       ├── ptrace_darwin.go
    │       │       ├── ptrace_ios.go
    │       │       ├── race.go
    │       │       ├── race0.go
    │       │       ├── readdirent_getdents.go
    │       │       ├── readdirent_getdirentries.go
    │       │       ├── sockcmsg_dragonfly.go
    │       │       ├── sockcmsg_linux.go
    │       │       ├── sockcmsg_unix.go
    │       │       ├── sockcmsg_unix_other.go
    │       │       ├── sockcmsg_zos.go
    │       │       ├── symaddr_zos_s390x.s
    │       │       ├── syscall.go
    │       │       ├── syscall_aix.go
    │       │       ├── syscall_aix_ppc.go
    │       │       ├── syscall_aix_ppc64.go
    │       │       ├── syscall_bsd.go
    │       │       ├── syscall_darwin.go
    │       │       ├── syscall_darwin_amd64.go
    │       │       ├── syscall_darwin_arm64.go
    │       │       ├── syscall_darwin_libSystem.go
    │       │       ├── syscall_dragonfly.go
    │       │       ├── syscall_dragonfly_amd64.go
    │       │       ├── syscall_freebsd.go
    │       │       ├── syscall_freebsd_386.go
    │       │       ├── syscall_freebsd_amd64.go
    │       │       ├── syscall_freebsd_arm.go
    │       │       ├── syscall_freebsd_arm64.go
    │       │       ├── syscall_freebsd_riscv64.go
    │       │       ├── syscall_hurd.go
    │       │       ├── syscall_hurd_386.go
    │       │       ├── syscall_illumos.go
    │       │       ├── syscall_linux.go
    │       │       ├── syscall_linux_386.go
    │       │       ├── syscall_linux_alarm.go
    │       │       ├── syscall_linux_amd64.go
    │       │       ├── syscall_linux_amd64_gc.go
    │       │       ├── syscall_linux_arm.go
    │       │       ├── syscall_linux_arm64.go
    │       │       ├── syscall_linux_gc.go
    │       │       ├── syscall_linux_gc_386.go
    │       │       ├── syscall_linux_gc_arm.go
    │       │       ├── syscall_linux_gccgo_386.go
    │       │       ├── syscall_linux_gccgo_arm.go
    │       │       ├── syscall_linux_loong64.go
    │       │       ├── syscall_linux_mips64x.go
    │       │       ├── syscall_linux_mipsx.go
    │       │       ├── syscall_linux_ppc.go
    │       │       ├── syscall_linux_ppc64x.go
    │       │       ├── syscall_linux_riscv64.go
    │       │       ├── syscall_linux_s390x.go
    │       │       ├── syscall_linux_sparc64.go
    │       │       ├── syscall_netbsd.go
    │       │       ├── syscall_netbsd_386.go
    │       │       ├── syscall_netbsd_amd64.go
    │       │       ├── syscall_netbsd_arm.go
    │       │       ├── syscall_netbsd_arm64.go
    │       │       ├── syscall_openbsd.go
    │       │       ├── syscall_openbsd_386.go
    │       │       ├── syscall_openbsd_amd64.go
    │       │       ├── syscall_openbsd_arm.go
    │       │       ├── syscall_openbsd_arm64.go
    │       │       ├── syscall_openbsd_libc.go
    │       │       ├── syscall_openbsd_mips64.go
    │       │       ├── syscall_openbsd_ppc64.go
    │       │       ├── syscall_openbsd_riscv64.go
    │       │       ├── syscall_solaris.go
    │       │       ├── syscall_solaris_amd64.go
    │       │       ├── syscall_unix.go
    │       │       ├── syscall_unix_gc.go
    │       │       ├── syscall_unix_gc_ppc64x.go
    │       │       ├── syscall_zos_s390x.go
    │       │       ├── sysvshm_linux.go
    │       │       ├── sysvshm_unix.go
    │       │       ├── sysvshm_unix_other.go
    │       │       ├── timestruct.go
    │       │       ├── unveil_openbsd.go
    │       │       ├── vgetrandom_linux.go
    │       │       ├── vgetrandom_unsupported.go
    │       │       ├── xattr_bsd.go
    │       │       ├── zerrors_aix_ppc.go
    │       │       ├── zerrors_aix_ppc64.go
    │       │       ├── zerrors_darwin_amd64.go
    │       │       ├── zerrors_darwin_arm64.go
    │       │       ├── zerrors_dragonfly_amd64.go
    │       │       ├── zerrors_freebsd_386.go
    │       │       ├── zerrors_freebsd_amd64.go
    │       │       ├── zerrors_freebsd_arm.go
    │       │       ├── zerrors_freebsd_arm64.go
    │       │       ├── zerrors_freebsd_riscv64.go
    │       │       ├── zerrors_linux.go
    │       │       ├── zerrors_linux_386.go
    │       │       ├── zerrors_linux_amd64.go
    │       │       ├── zerrors_linux_arm.go
    │       │       ├── zerrors_linux_arm64.go
    │       │       ├── zerrors_linux_loong64.go
    │       │       ├── zerrors_linux_mips.go
    │       │       ├── zerrors_linux_mips64.go
    │       │       ├── zerrors_linux_mips64le.go
    │       │       ├── zerrors_linux_mipsle.go
    │       │       ├── zerrors_linux_ppc.go
    │       │       ├── zerrors_linux_ppc64.go
    │       │       ├── zerrors_linux_ppc64le.go
    │       │       ├── zerrors_linux_riscv64.go
    │       │       ├── zerrors_linux_s390x.go
    │       │       ├── zerrors_linux_sparc64.go
    │       │       ├── zerrors_netbsd_386.go
    │       │       ├── zerrors_netbsd_amd64.go
    │       │       ├── zerrors_netbsd_arm.go
    │       │       ├── zerrors_netbsd_arm64.go
    │       │       ├── zerrors_openbsd_386.go
    │       │       ├── zerrors_openbsd_amd64.go
    │       │       ├── zerrors_openbsd_arm.go
    │       │       ├── zerrors_openbsd_arm64.go
    │       │       ├── zerrors_openbsd_mips64.go
    │       │       ├── zerrors_openbsd_ppc64.go
    │       │       ├── zerrors_openbsd_riscv64.go
    │       │       ├── zerrors_solaris_amd64.go
    │       │       ├── zerrors_zos_s390x.go
    │       │       ├── zptrace_armnn_linux.go
    │       │       ├── zptrace_linux_arm64.go
    │       │       ├── zptrace_mipsnn_linux.go
    │       │       ├── zptrace_mipsnnle_linux.go
    │       │       ├── zptrace_x86_linux.go
    │       │       ├── zsymaddr_zos_s390x.s
    │       │       ├── zsyscall_aix_ppc.go
    │       │       ├── zsyscall_aix_ppc64.go
    │       │       ├── zsyscall_aix_ppc64_gc.go
    │       │       ├── zsyscall_aix_ppc64_gccgo.go
    │       │       ├── zsyscall_darwin_amd64.go
    │       │       ├── zsyscall_darwin_amd64.s
    │       │       ├── zsyscall_darwin_arm64.go
    │       │       ├── zsyscall_darwin_arm64.s
    │       │       ├── zsyscall_dragonfly_amd64.go
    │       │       ├── zsyscall_freebsd_386.go
    │       │       ├── zsyscall_freebsd_amd64.go
    │       │       ├── zsyscall_freebsd_arm.go
    │       │       ├── zsyscall_freebsd_arm64.go
    │       │       ├── zsyscall_freebsd_riscv64.go
    │       │       ├── zsyscall_illumos_amd64.go
    │       │       ├── zsyscall_linux.go
    │       │       ├── zsyscall_linux_386.go
    │       │       ├── zsyscall_linux_amd64.go
    │       │       ├── zsyscall_linux_arm.go
    │       │       ├── zsyscall_linux_arm64.go
    │       │       ├── zsyscall_linux_loong64.go
    │       │       ├── zsyscall_linux_mips.go
    │       │       ├── zsyscall_linux_mips64.go
    │       │       ├── zsyscall_linux_mips64le.go
    │       │       ├── zsyscall_linux_mipsle.go
    │       │       ├── zsyscall_linux_ppc.go
    │       │       ├── zsyscall_linux_ppc64.go
    │       │       ├── zsyscall_linux_ppc64le.go
    │       │       ├── zsyscall_linux_riscv64.go
    │       │       ├── zsyscall_linux_s390x.go
    │       │       ├── zsyscall_linux_sparc64.go
    │       │       ├── zsyscall_netbsd_386.go
    │       │       ├── zsyscall_netbsd_amd64.go
    │       │       ├── zsyscall_netbsd_arm.go
    │       │       ├── zsyscall_netbsd_arm64.go
    │       │       ├── zsyscall_openbsd_386.go
    │       │       ├── zsyscall_openbsd_386.s
    │       │       ├── zsyscall_openbsd_amd64.go
    │       │       ├── zsyscall_openbsd_amd64.s
    │       │       ├── zsyscall_openbsd_arm.go
    │       │       ├── zsyscall_openbsd_arm.s
    │       │       ├── zsyscall_openbsd_arm64.go
    │       │       ├── zsyscall_openbsd_arm64.s
    │       │       ├── zsyscall_openbsd_mips64.go
    │       │       ├── zsyscall_openbsd_mips64.s
    │       │       ├── zsyscall_openbsd_ppc64.go
    │       │       ├── zsyscall_openbsd_ppc64.s
    │       │       ├── zsyscall_openbsd_riscv64.go
    │       │       ├── zsyscall_openbsd_riscv64.s
    │       │       ├── zsyscall_solaris_amd64.go
    │       │       ├── zsyscall_zos_s390x.go
    │       │       ├── zsysctl_openbsd_386.go
    │       │       ├── zsysctl_openbsd_amd64.go
    │       │       ├── zsysctl_openbsd_arm.go
    │       │       ├── zsysctl_openbsd_arm64.go
    │       │       ├── zsysctl_openbsd_mips64.go
    │       │       ├── zsysctl_openbsd_ppc64.go
    │       │       ├── zsysctl_openbsd_riscv64.go
    │       │       ├── zsysnum_darwin_amd64.go
    │       │       ├── zsysnum_darwin_arm64.go
    │       │       ├── zsysnum_dragonfly_amd64.go
    │       │       ├── zsysnum_freebsd_386.go
    │       │       ├── zsysnum_freebsd_amd64.go
    │       │       ├── zsysnum_freebsd_arm.go
    │       │       ├── zsysnum_freebsd_arm64.go
    │       │       ├── zsysnum_freebsd_riscv64.go
    │       │       ├── zsysnum_linux_386.go
    │       │       ├── zsysnum_linux_amd64.go
    │       │       ├── zsysnum_linux_arm.go
    │       │       ├── zsysnum_linux_arm64.go
    │       │       ├── zsysnum_linux_loong64.go
    │       │       ├── zsysnum_linux_mips.go
    │       │       ├── zsysnum_linux_mips64.go
    │       │       ├── zsysnum_linux_mips64le.go
    │       │       ├── zsysnum_linux_mipsle.go
    │       │       ├── zsysnum_linux_ppc.go
    │       │       ├── zsysnum_linux_ppc64.go
    │       │       ├── zsysnum_linux_ppc64le.go
    │       │       ├── zsysnum_linux_riscv64.go
    │       │       ├── zsysnum_linux_s390x.go
    │       │       ├── zsysnum_linux_sparc64.go
    │       │       ├── zsysnum_netbsd_386.go
    │       │       ├── zsysnum_netbsd_amd64.go
    │       │       ├── zsysnum_netbsd_arm.go
    │       │       ├── zsysnum_netbsd_arm64.go
    │       │       ├── zsysnum_openbsd_386.go
    │       │       ├── zsysnum_openbsd_amd64.go
    │       │       ├── zsysnum_openbsd_arm.go
    │       │       ├── zsysnum_openbsd_arm64.go
    │       │       ├── zsysnum_openbsd_mips64.go
    │       │       ├── zsysnum_openbsd_ppc64.go
    │       │       ├── zsysnum_openbsd_riscv64.go
    │       │       ├── zsysnum_zos_s390x.go
    │       │       ├── ztypes_aix_ppc.go
    │       │       ├── ztypes_aix_ppc64.go
    │       │       ├── ztypes_darwin_amd64.go
    │       │       ├── ztypes_darwin_arm64.go
    │       │       ├── ztypes_dragonfly_amd64.go
    │       │       ├── ztypes_freebsd_386.go
    │       │       ├── ztypes_freebsd_amd64.go
    │       │       ├── ztypes_freebsd_arm.go
    │       │       ├── ztypes_freebsd_arm64.go
    │       │       ├── ztypes_freebsd_riscv64.go
    │       │       ├── ztypes_linux.go
    │       │       ├── ztypes_linux_386.go
    │       │       ├── ztypes_linux_amd64.go
    │       │       ├── ztypes_linux_arm.go
    │       │       ├── ztypes_linux_arm64.go
    │       │       ├── ztypes_linux_loong64.go
    │       │       ├── ztypes_linux_mips.go
    │       │       ├── ztypes_linux_mips64.go
    │       │       ├── ztypes_linux_mips64le.go
    │       │       ├── ztypes_linux_mipsle.go
    │       │       ├── ztypes_linux_ppc.go
    │       │       ├── ztypes_linux_ppc64.go
    │       │       ├── ztypes_linux_ppc64le.go
    │       │       ├── ztypes_linux_riscv64.go
    │       │       ├── ztypes_linux_s390x.go
    │       │       ├── ztypes_linux_sparc64.go
    │       │       ├── ztypes_netbsd_386.go
    │       │       ├── ztypes_netbsd_amd64.go
    │       │       ├── ztypes_netbsd_arm.go
    │       │       ├── ztypes_netbsd_arm64.go
    │       │       ├── ztypes_openbsd_386.go
    │       │       ├── ztypes_openbsd_amd64.go
    │       │       ├── ztypes_openbsd_arm.go
    │       │       ├── ztypes_openbsd_arm64.go
    │       │       ├── ztypes_openbsd_mips64.go
    │       │       ├── ztypes_openbsd_ppc64.go
    │       │       ├── ztypes_openbsd_riscv64.go
    │       │       ├── ztypes_solaris_amd64.go
    │       │       └── ztypes_zos_s390x.go
    │       └── text/
    │           ├── LICENSE
    │           ├── PATENTS
    │           ├── feature/
    │           │   └── plural/
    │           │       ├── common.go
    │           │       ├── message.go
    │           │       ├── plural.go
    │           │       └── tables.go
    │           ├── internal/
    │           │   ├── catmsg/
    │           │   │   ├── catmsg.go
    │           │   │   ├── codec.go
    │           │   │   └── varint.go
    │           │   ├── format/
    │           │   │   ├── format.go
    │           │   │   └── parser.go
    │           │   ├── internal.go
    │           │   ├── language/
    │           │   │   ├── common.go
    │           │   │   ├── compact/
    │           │   │   │   ├── compact.go
    │           │   │   │   ├── language.go
    │           │   │   │   ├── parents.go
    │           │   │   │   ├── tables.go
    │           │   │   │   └── tags.go
    │           │   │   ├── compact.go
    │           │   │   ├── compose.go
    │           │   │   ├── coverage.go
    │           │   │   ├── language.go
    │           │   │   ├── lookup.go
    │           │   │   ├── match.go
    │           │   │   ├── parse.go
    │           │   │   ├── tables.go
    │           │   │   └── tags.go
    │           │   ├── match.go
    │           │   ├── number/
    │           │   │   ├── common.go
    │           │   │   ├── decimal.go
    │           │   │   ├── format.go
    │           │   │   ├── number.go
    │           │   │   ├── pattern.go
    │           │   │   ├── roundingmode_string.go
    │           │   │   └── tables.go
    │           │   ├── stringset/
    │           │   │   └── set.go
    │           │   └── tag/
    │           │       └── tag.go
    │           ├── language/
    │           │   ├── coverage.go
    │           │   ├── doc.go
    │           │   ├── language.go
    │           │   ├── match.go
    │           │   ├── parse.go
    │           │   ├── tables.go
    │           │   └── tags.go
    │           └── message/
    │               ├── catalog/
    │               │   ├── catalog.go
    │               │   ├── dict.go
    │               │   ├── go19.go
    │               │   └── gopre19.go
    │               ├── catalog.go
    │               ├── doc.go
    │               ├── format.go
    │               ├── message.go
    │               └── print.go
    ├── gopkg.in/
    │   └── yaml.v3/
    │       ├── LICENSE
    │       ├── NOTICE
    │       ├── README.md
    │       ├── apic.go
    │       ├── decode.go
    │       ├── emitterc.go
    │       ├── encode.go
    │       ├── parserc.go
    │       ├── readerc.go
    │       ├── resolve.go
    │       ├── scannerc.go
    │       ├── sorter.go
    │       ├── writerc.go
    │       ├── yaml.go
    │       ├── yamlh.go
    │       └── yamlprivateh.go
    └── modules.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .devcontainer/devcontainer.json
================================================
{
    "name": "Go",
    "image": "mcr.microsoft.com/devcontainers/go:1.25",
    "customizations": {
        "codespaces": {
            "openFiles": [
                "CODE_OF_CONDUCT.md",
                "CONTRIBUTING.md",
                "README.md",
                "languages.json"
            ]
        },
        "vscode": {
            "extensions": ["golang.go"],
            "settings": {
                "go.gopath": "/go"
            }
        }
    },
    "remoteUser": "vscode"
}


================================================
FILE: .gitattributes
================================================
.sccignore linguist-language=Ignore-List


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: boyter


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**

1. Tell us how you were using `scc` either as command line or library.
2. If command line please list the arguments. If library please supply code to demonstrate the issue.
3. If the issue is a miscount or some such please link or supply a file which demonstrates the issue.

**Expected behavior**
A clear and concise description of what you expected to happen.

**Desktop (please complete the following information):**
 - OS: [e.g. macOS, Windows, Linux]
 - Version [e.g. 22]


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "Code scanning - action"

on:
  push:
    branches: [master, ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [master]
  schedule:
    - cron: '0 22 * * 0'

jobs:
  CodeQL-Build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v5
      with:
        # We must fetch at least the immediate parents so that if this is
        # a pull request then we can checkout the head.
        fetch-depth: 2

    # If this run was triggered by a pull request event, then checkout
    # the head of the pull request instead of the merge commit.
    - run: git checkout HEAD
      if: ${{ github.event_name == 'pull_request' }}

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      # Override language selection by uncommenting this and choosing your languages
      # with:
      #   languages: go, javascript, csharp, python, cpp, java

    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v4

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 https://git.io/JvXDl

    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
    #    and modify them (or add more) to build your code if your project
    #    uses a compiled language

    #- run: |
    #   make bootstrap
    #   make release

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v4


================================================
FILE: .github/workflows/docker-publish.yml
================================================
name: Docker

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

on:
  #schedule:
  #  - cron: '36 1 * * *'
  push:
    branches: [ "master" ]
    # Publish semver tags as releases.
    tags: [ 'v*.*.*' ]
  pull_request:
    branches: [ "master" ]

env:
  # Use docker.io for Docker Hub if empty
  REGISTRY: ghcr.io
  # github.repository as <account>/<repo>
  IMAGE_NAME: ${{ github.repository }}


jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      # This is used to complete the identity challenge
      # with sigstore/fulcio when running outside of PRs.
      id-token: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      # Install the cosign tool except on PR
      # https://github.com/sigstore/cosign-installer
      - name: Install cosign
        if: github.event_name != 'pull_request'
        uses: sigstore/cosign-installer@v3.10.0
        with:
          cosign-release: 'v2.6.0'

      # Set up BuildKit Docker container builder to be able to build
      # multi-platform images and export cache
      # https://github.com/docker/setup-buildx-action
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3.11.1

      # Login against a Docker registry except on PR
      # https://github.com/docker/login-action
      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3.6.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      # Extract metadata (tags, labels) for Docker
      # https://github.com/docker/metadata-action
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v5.8.0
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

      # Build and push Docker image with Buildx (don't push on PR)
      # https://github.com/docker/build-push-action
      - name: Build and push Docker image
        id: build-and-push
        uses: docker/build-push-action@v6.18.0
        env:
          DOCKER_BUILD_RECORD_UPLOAD: false
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      # Sign the resulting Docker image digest except on PRs.
      # This will only write to the public Rekor transparency log when the Docker
      # repository is public to avoid leaking data.  If you would like to publish
      # transparency data even for private images, pass --force to cosign below.
      # https://github.com/sigstore/cosign
      - name: Sign the published Docker image
        if: ${{ github.event_name != 'pull_request' }}
        env:
          # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
          TAGS: ${{ steps.meta.outputs.tags }}
          DIGEST: ${{ steps.build-and-push.outputs.digest }}
        # This step uses the identity token to provision an ephemeral certificate
        # against the sigstore community Fulcio instance.
        run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}

================================================
FILE: .github/workflows/go.yml
================================================
name: Go

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5

    - name: Set up Go
      uses: actions/setup-go@v6
      with:
        go-version-file: './go.mod'

    - name: Build
      run: go build -v ./...
    
    - name: Windows Build Test
      run: |
        GOOS=windows GOARCH=amd64 go build -ldflags="-s -w"
        GOOS=windows GOARCH=386 go build -ldflags="-s -w"
        GOOS=windows GOARCH=arm64 go build -ldflags="-s -w"
    
    - name: Darwin Build Test
      run: |
        GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w"
        GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w"
    
    - name: Linux Build Test
      run: |
        GOOS=linux GOARCH=amd64 go build -ldflags="-s -w"
        GOOS=linux GOARCH=386 go build -ldflags="-s -w"
        GOOS=linux GOARCH=arm64 go build -ldflags="-s -w"
        GOOS=linux GOARCH=riscv64 go build -ldflags="-s -w"
        GOOS=linux GOARCH=loong64 go build -ldflags="-s -w"

    - name: Test
      run: go test -v ./...

    - name: Test Race
      run: go test -race -v ./...


================================================
FILE: .gitignore
================================================
# Binaries for programs and plugins
*.exe
*.dll
*.so
*.dylib

# Test binary, build with `go test -c`
*.test

scc

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
.glide/

# IDE
.idea/
*.code-workspace
.vscode/

# Performance tests
examples/performance_tests/0
examples/performance_tests/1
examples/performance_tests/2
examples/performance_tests/3
examples/performance_tests/4
examples/performance_tests/5
examples/performance_tests/6
examples/performance_tests/7
examples/performance_tests/8

# Ignore test
ignored.xml
gitignorefile.txt

# macOS

.DS_Store

dist/


================================================
FILE: .goreleaser.yml
================================================
# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
before:
  hooks:
    # You may remove this if you don't use go modules.
    - go mod tidy
    # you may remove this if you don't need go generate
    - go generate ./...
builds:
  - env:
      - CGO_ENABLED=0
    goos:
      - linux
      - windows
      - darwin

archives:
  - format: tar.gz
    # this name template makes the OS and Arch compatible with the results of uname.
    name_template: >-
      {{ .ProjectName }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else }}{{ .Arch }}{{ end }}
      {{- if .Arm }}v{{ .Arm }}{{ end }}
    # use zip for windows archives
    format_overrides:
      - goos: windows
        format: zip
checksum:
  name_template: 'checksums.txt'
snapshot:
  name_template: "{{ incpatch .Version }}-next"
changelog:
  sort: asc
  filters:
    exclude:
      - '^docs:'
      - '^test:'

# The lines beneath this are called `modelines`. See `:help modeline`
# Feel free to remove those if you don't want/use them.
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj


================================================
FILE: .ignore
================================================
vendor/
ignorefile.txt

================================================
FILE: .sccignore
================================================
examples
.github
dist

================================================
FILE: CODE_OF_CONDUCT.md
================================================
Do as Bill and Ted and be excellent to each other.


================================================
FILE: CONTRIBUTING.md
================================================
## How to contribute to sloc cloc and code (scc)

#### **Did you find a bug?**

* **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/boyter/scc/issues).

* If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/boyter/scc/issues/new). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring.

#### **Did you write a patch that fixes a bug?**

* Open a new GitHub pull request with the patch.

* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable.

* Before submitting, please specify that you explicitly licence your contribution under MIT licence.


#### **Always remember**

* Do as Bill and Ted and be excellent to each other.

Thanks!


================================================
FILE: Dockerfile
================================================
FROM golang:1.25.2-alpine3.22 AS scc-get

ENV GOOS=linux \
GOARCH=amd64 \
CGO_ENABLED=0

ARG VERSION=v3.4.0
COPY . /scc
WORKDIR /scc
RUN go build -ldflags="-s -w" -o /bin/scc

FROM alpine:3.22
COPY --from=scc-get /bin/scc /bin/scc
CMD ["/bin/scc"]


================================================
FILE: LANGUAGES.md
================================================
```
ABAP (abap)
ABNF (abnf)
ActionScript (as)
Ada (ada,adb,ads,pad)
Agda (agda)
Alchemist (crn)
Alex (x)
Algol 68 (a68)
Alloy (als)
Amber (ab)
Android Interface Definition Language (aidl)
Apex (apex,trigger)
APL (apl,aplf,apln,aplc,dyalog)
AppleScript (applescript)
ArkTs (ets)
Arturo (art)
AsciiDoc (adoc)
ASP (asa,asp)
ASP.NET (asax,ascx,asmx,aspx,master,sitemap,webinfo)
Assembly (s,asm)
Astro (astro)
ATS (dats,sats,ats,hats)
Autoconf (in)
AutoHotKey (ahk)
Avro (avdl,avpr,avsc)
AWK (awk)
bait (bt)
BASH (bash,bash_login,bash_logout,bash_profile,bashrc,.bash_login,.bash_logout,.bash_profile,.bashrc)
Basic (bas)
Batch (bat,btm,cmd)
Bazel (bzl,build.bazel,build,workspace)
Bean (bean,beancount)
Bicep (bicep)
Bitbake (bb,bbappend,bbclass)
Bitbucket Pipeline (bitbucket-pipelines.yml)
Blade template (blade.php)
Blueprint (blp)
Boo (boo)
Bosque (bsq)
Brainfuck (bf)
Bru (bru)
BuildStream (bst)
C (c,ec,pgc)
C Header (h)
C Shell (csh,.cshrc)
C# (cs,csx)
C++ (cc,cpp,cxx,c++,pcc,ino,ccm,cppm,cxxm,c++m,mxx)
C++ Header (hh,hpp,hxx,inl,ipp,ixx)
C3 (c3)
Cabal (cabal)
Cairo (cairo)
Cangjie (cj)
Cap'n Proto (capnp)
Cassius (cassius)
Ceylon (ceylon)
Chapel (chpl)
Circom (circom)
Clipper (prg,ch)
Clojure (clj,cljc)
ClojureScript (cljs)
Closure Template (soy)
CloudFormation (JSON) (json)
CloudFormation (YAML) (yaml,yml)
CMake (cmake,cmakelists.txt)
COBOL (cob,cbl,ccp,cobol,cpy)
CodeQL (ql,qll)
CoffeeScript (coffee)
Cogent (cogent)
ColdFusion (cfm)
ColdFusion CFScript (cfc)
Coq (v)
Creole (creole)
Crystal (cr)
CSS (css)
CSV (csv)
Cuda (cu)
Cypher (cypher,cql)
Cython (pyx,pxi,pxd)
D (d)
D2 (d2)
DAML (daml)
Dart (dart)
Device Tree (dts,dtsi)
Dhall (dhall)
DM (dm)
Docker ignore (.dockerignore)
Dockerfile (dockerfile,dockerfile)
Document Type Definition (dtd)
DOT (dot,gv)
Elixir (ex,exs)
Elixir Template (eex)
Elm (elm)
Emacs Dev Env (ede)
Emacs Lisp (el)
EmiT (emit)
Erlang (erl,hrl)
Expect (exp)
Extensible Stylesheet Language Transformations (xslt,xsl)
F# (fs,fsi,fsx,fsscript)
F* (fst)
Factor (factor)
Fennel (fnl)
FIDL (fidl)
Fish (fish)
Flow9 (flow)
Forth (4th,forth,fr,frt,fth,f83,fb,fpm,e4,rx,ft)
FORTRAN Legacy (f,for,ftn,f77,pfo)
Fortran Modern (f03,f08,f90,f95)
Fragment Shader File (fsh)
Freemarker Template (ftl)
FSL (fsl)
Futhark (fut)
FXML (fxml)
Game Maker Language (gml)
Game Maker Project (yyp)
GDScript (gd)
Gemfile (gemfile)
Gherkin Specification (feature)
gitignore (.gitignore)
Gleam (gleam)
GLSL (vert,tesc,tese,geom,frag,comp,glsl)
GN (gn,gni)
Go (go)
Go Template (tmpl,gohtml,gotxt)
Go+ (gop)
Godot Scene (tscn)
Gradle (gradle)
GraphQL (graphql)
Gremlin (gremlin)
Groovy (groovy,grt,gtpl,gvy)
Gwion (gw)
HAML (haml)
Hamlet (hamlet)
Handlebars (hbs,handlebars)
Happy (y,ly)
Hare (ha)
Haskell (hs)
Haxe (hx)
HCL (hcl)
HEEx (heex)
HEX (hex)
hoon (hoon)
HTML (html,htm)
IDL (idl,webidl,widl)
Idris (idr,lidr)
ignore (.ignore)
INI (ini)
Intel HEX (ihex)
Isabelle (thy)
Jade (jade)
JAI (jai)
Janet (janet)
Java (java)
JavaScript (js,cjs,mjs)
JavaServer Pages (jsp)
JCL (jcl,jcls)
Jenkins Buildfile (jenkinsfile)
Jinja (jinja,j2,jinja2)
jq (jq)
JSON (json)
JSON5 (json5)
JSONC (jsonc)
JSONL (jsonl)
Jsonnet (jsonnet,libsonnet)
JSX (jsx)
Julia (jl)
Julius (julius)
Jupyter (ipynb,jpynb)
Just (justfile)
K (k)
Korn Shell (ksh,.kshrc)
Kotlin (kt,kts)
Koto (koto)
LALRPOP (lalrpop)
LaTeX (tex)
LD Script (lds)
Lean (lean,hlean)
LESS (less)
LEX (l)
License (license,licence,copying,copying3,unlicense,unlicence,license-apache,licence-apache,license-mit,licence-mit,copyright)
Lisp (lisp,lsp)
LiveScript (ls)
LLVM IR (ll)
LOLCODE (lol,lols)
Lua (lua)
Luau (luau)
Lucius (lucius)
Luna (luna)
m4 (m4)
Macromedia eXtensible Markup Language (mxml)
Madlang (mad)
Makefile (makefile,mak,mk,bp,makefile,gnumakefile)
Mako (mako,mao)
Markdown (md,markdown)
MATLAB (m)
Max (maxpat)
MDX (mdx)
Meson (meson.build,meson_options.txt)
Metal (metal)
MLIR (mlir)
Modula3 (m3,mg,ig,i3)
Module-Definition (def)
Mog (mog)
Mojo (mojo)
Monkey C (mc)
Moonbit (mbt)
MQL Header (mqh)
MQL4 (mq4)
MQL5 (mq5)
MSBuild (csproj,vbproj,fsproj,vcproj,vcxproj,vcxproj.filters,ilproj,myapp,props,rdlc,resx,settings,sln,targets)
MUMPS (mps)
Mustache (mustache)
Nature (n)
Nial (ndf)
Nim (nim)
Nix (nix)
Nushell (nu)
nuspec (nuspec)
Objective C (m)
Objective C++ (mm)
OCaml (ml,mli)
Odin (odin)
Opalang (opa)
OpenQASM (qasm)
OpenTofu (tofu)
Org (org)
Oz (oz)
Pascal (pas)
Patch (patch)
Perl (pl,plx,pm)
Phoenix LiveView (heex,leex)
PHP (php)
Picat (pi)
PKGBUILD (pkgbuild)
Pkl (pkl)
PL/SQL (fnc,pkb,pks,prc,trg,vw)
Plain Text (text,txt)
Polly (polly)
POML (poml)
Pony (pony)
PostScript (ps)
Powershell (ps1,psm1)
Processing (pde)
Prolog (p,pro)
Properties File (properties)
Protocol Buffers (proto)
PRQL (prql)
PSL Assertion (psl)
Puppet (pp)
PureScript (purs)
Python (py,pyw,pyi)
Q# (qs)
QCL (qcl)
QML (qml)
R (r)
Racket (rkt)
Rakefile (rake,rakefile)
Raku (raku,rakumod,rakutest,rakudoc,t)
RAML (raml,rml)
Razor (cshtml,razor)
ReasonML (re,rei)
Rebol (reb)
Redscript (reds)
Report Definition Language (rdl)
ReScript (res,resi)
ReStructuredText (rst)
Rich Text Format (rtf)
Robot Framework (robot)
Ruby (rb)
Ruby HTML (rhtml,erb)
Rust (rs)
SAS (sas)
Sass (sass,scss)
Scala (sc,scala)
Scallop (scl)
Scheme (scm,ss)
Scons (csig,sconstruct,sconscript)
sed (sed)
Seed7 (sd7,s7i)
Shell (sh,.tcshrc)
Sieve (sieve)
SKILL (il)
Slang (slang)
Slint (slint)
Smalltalk (cs.st,pck.st)
Smarty Template (tpl)
Snakemake (smk,rules,snakefile)
SNOBOL (sno)
Softbridge Basic (sbl)
Solidity (sol)
SPDX (spdx)
Specman e (e)
Spice Netlist (ckt)
SPL (spl)
SQL (sql,dml,ddl,dql)
SRecode Template (srt)
Stan (stan)
Standard ML (SML) (sml)
Stata (do,ado)
Stylus (styl)
Svelte (svelte)
SVG (svg)
Swift (swift)
Swig (i)
Systemd (automount,device,link,mount,path,scope,service,slice,socket,swap,target,timer)
SystemVerilog (sv,svh)
Tact (tact)
TaskPaper (taskpaper)
TCL (tcl)
Teal (teal)
Templ (templ)
TemplateToolkit (tt,tt2)
Tera (tera)
Terraform (tf,tfvars,tf.json)
TeX (tex,sty)
Textile (textile)
Thrift (thrift)
TL (tl)
TOML (toml)
TOON (toon)
Treetop (treetop,tt)
TTCN-3 (ttcn,ttcn3,ttcnpp)
Twig Template (twig)
TypeScript (ts,tsx,cts,mts)
TypeScript Typings (d.ts)
TypeSpec (tsp)
Typst (typ)
Unreal Script (uc,uci,upkg)
Up (up)
Ur/Web (ur,urs)
Ur/Web Project (urp)
V (v)
Vala (vala)
Varnish Configuration (vcl)
Verilog (vg,vh,v)
Verilog Args File (irunargs,xrunargs)
Vertex Shader File (vsh)
VHDL (vhd,vhdl)
Vim Script (vim,vimrc,gvimrc,_vimrc,.vimrc,_gvimrc,.gvimrc,vimrc,gvimrc)
Visual Basic (vb)
Visual Basic for Applications (cls)
Vue (vue)
W.I.S.E. Jobfile (fgmj)
Web Services Description Language (wsdl)
WebGPU Shading Language (wgsl)
wenyan (wy)
Windows Resource-Definition Script (rc)
Wolfram (nb,wl)
Wren (wren)
XAML (xaml)
Xcode Config (xcconfig)
XHTML (xhtml,xhtm,xht)
XMake (xmake.lua,xpack.lua)
XML (xml)
XML Schema (xsd)
Xtend (xtend)
YAML (yaml,yml)
Yarn (yarn)
Zig (zig)
ZoKrates (zok)
Zsh (zsh,zshenv,zlogin,zlogout,zprofile,zshrc,.zshenv,.zlogin,.zlogout,.zprofile,.zshrc)
```


================================================
FILE: LICENSE
================================================
MIT License 

Copyright (c) 2021 Ben Boyter

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: README.md
================================================
# Sloc Cloc and Code (scc)

![SCC illustration](./scc.jpg)

A tool similar to cloc, sloccount and tokei. For counting the lines of code, blank lines, comment lines, and physical lines of source code in many programming languages.

Goal is to be the fastest code counter possible, but also perform COCOMO calculation like sloccount, LOCOMO estimation for LLM-based development costs, estimate code complexity similar to cyclomatic complexity calculators and produce unique lines of code or DRYness metrics. In short one tool to rule them all.

Also it has a very short name which is easy to type `scc`.

If you don't like sloc cloc and code feel free to use the name `Succinct Code Counter`.

[![Go](https://github.com/boyter/scc/actions/workflows/go.yml/badge.svg)](https://github.com/boyter/scc/actions/workflows/go.yml)
[![Go Report Card](https://goreportcard.com/badge/github.com/boyter/scc)](https://goreportcard.com/report/github.com/boyter/scc)
[![Coverage Status](https://coveralls.io/repos/github/boyter/scc/badge.svg?branch=master)](https://coveralls.io/github/boyter/scc?branch=master)
[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/)](https://github.com/boyter/scc/)
![Scc count downloads](https://img.shields.io/github/downloads/boyter/scc/total?label=downloads%20%28GH%29)
[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go)

Licensed under MIT licence.

## Table of Contents

- [Install](#install)
- [Background](#background)
- [Pitch](#pitch)
- [Usage](#usage)
- [Complexity Estimates](#complexity-estimates)
- [Unique Lines of Code (ULOC)](#unique-lines-of-code-uloc)
- [COCOMO](#cocomo)
- [LOCOMO](#locomo)
- [Output Formats](#output-formats)
- [Performance](#performance)
- [Development](#development)
- [MCP Server Mode](#mcp-server-mode)
- [Adding/Modifying Languages](#addingmodifying-languages)
- [Issues](#issues)
- [Badges](#badges)
- [Language Support](LANGUAGES.md)
- [Citation](#citation)

### scc for Teams & Enterprise

While scc will always be a free and tool for individual developers, companies and businesses, we are exploring an enhanced version designed for teams and businesses. scc Enterprise will build on the core scc engine to provide historical analysis, team-level dashboards, and policy enforcement to help engineering leaders track code health, manage technical debt, and forecast project costs.

We are currently gathering interest for a private beta. If you want to visualize your codebase's evolution, integrate quality gates into your CI/CD pipeline, and get a big-picture view across all your projects,
sign up for the early access list [here](https://docs.google.com/forms/d/e/1FAIpQLScIBKy3y2m0rKu89L67qwe26Xyn9Scu0gW-HQX9lC0qEAx9nQ/viewform)

### Install

#### Go Install

You can install `scc` by using the standard go toolchain.

To install the latest stable version of scc:

`go install github.com/boyter/scc/v3@latest`

To install a development version:

`go install github.com/boyter/scc/v3@master`

Note that `scc` needs go version >= 1.25.

#### Snap

A [snap install](https://snapcraft.io/scc) exists thanks to [Ricardo](https://feliciano.tech/).

`$ sudo snap install scc`

*NB* Snap installed applications cannot run outside of `/home` <https://askubuntu.com/questions/930437/permission-denied-error-when-running-apps-installed-as-snap-packages-ubuntu-17> so you may encounter issues if you use snap and attempt to run outside this directory.

#### Homebrew

Or if you have [Homebrew](https://brew.sh/) installed

`$ brew install scc`

#### Fedora

Fedora Linux users can use a [COPR repository](https://copr.fedorainfracloud.org/coprs/lihaohong/scc/):

`$ sudo dnf copr enable lihaohong/scc && sudo dnf install scc`

#### MacPorts

On macOS, you can also install via [MacPorts](https://www.macports.org)

`$ sudo port install scc`

#### Scoop

Or if you are using [Scoop](https://scoop.sh/) on Windows

`$ scoop install scc`

#### Chocolatey

Or if you are using [Chocolatey](https://chocolatey.org/) on Windows

`$ choco install scc`

#### WinGet

Or if you are using [WinGet](https://github.com/microsoft/winget-cli) on Windows

`winget install --id benboyter.scc --source winget`

#### FreeBSD

On FreeBSD, scc is available as a package

`$ pkg install scc`

Or, if you prefer to build from source, you can use the ports tree

`$ cd /usr/ports/devel/scc && make install clean`

### Run in Docker

Go to the directory you want to run scc from.

Run the command below to run the latest release of scc on your current working directory:

```bash
docker run --rm -it -v "$PWD:/pwd"  ghcr.io/boyter/scc:master scc /pwd
```

#### Manual

Binaries for Windows, GNU/Linux and macOS for both i386 and x86_64 machines are available from the [releases](https://github.com/boyter/scc/releases) page.

#### GitLab

<https://about.gitlab.com/blog/2023/02/15/code-counting-in-gitlab/>

#### Other

If you would like to assist with getting `scc` added into apt/chocolatey/etc... please submit a PR or at least raise an issue with instructions.

### Background

Read all about how it came to be along with performance benchmarks,

- <https://boyter.org/posts/sloc-cloc-code/>
- <https://boyter.org/posts/why-count-lines-of-code/>
- <https://boyter.org/posts/sloc-cloc-code-revisited/>
- <https://boyter.org/posts/sloc-cloc-code-performance/>
- <https://boyter.org/posts/sloc-cloc-code-performance-update/>

Some reviews of `scc`

- <https://nickmchardy.com/2018/10/counting-lines-of-code-in-koi-cms.html>
- <https://www.feliciano.tech/blog/determine-source-code-size-and-complexity-with-scc/>
- <https://metaredux.com/posts/2019/12/13/counting-lines.html>

Setting up `scc` in GitLab

- <https://about.gitlab.com/blog/2023/02/15/code-counting-in-gitlab/>

A talk given at the first GopherCon AU about `scc` (press S to see speaker notes)

- <https://boyter.org/static/gophercon-syd-presentation/>
- <https://www.youtube.com/watch?v=jd-sjoy3GZo>

For performance see the [Performance](https://github.com/boyter/scc#performance) section

Other similar projects,

- [SLOCCount](https://www.dwheeler.com/sloccount/) the original sloc counter
- [cloc](https://github.com/AlDanial/cloc), inspired by SLOCCount; implemented in Perl for portability
- [gocloc](https://github.com/hhatto/gocloc) a sloc counter in Go inspired by tokei
- [loc](https://github.com/cgag/loc) rust implementation similar to tokei but often faster
- [loccount](https://gitlab.com/esr/loccount) Go implementation written and maintained by ESR
- [polyglot](https://github.com/vmchale/polyglot) ATS sloc counter
- [tokei](https://github.com/XAMPPRocky/tokei) fast, accurate and written in rust
- [sloc](https://github.com/flosse/sloc) coffeescript code counter
- [stto](https://github.com/mainak55512/stto) new Go code counter with a focus on performance

Interesting reading about other code counting projects tokei, loc, polyglot and loccount

- <https://www.reddit.com/r/rust/comments/59bm3t/a_fast_cloc_replacement_in_rust/>
- <https://www.reddit.com/r/rust/comments/82k9iy/loc_count_lines_of_code_quickly/>
- <http://blog.vmchale.com/article/polyglot-comparisons>
- <http://esr.ibiblio.org/?p=8270>

Further reading about processing files on the disk performance

- <https://blog.burntsushi.net/ripgrep/>

Using `scc` to process 40 TB of files from GitHub/Bitbucket/GitLab

- <https://boyter.org/posts/an-informal-survey-of-10-million-github-bitbucket-gitlab-projects/>

### Pitch

Why use `scc`?

- It is very fast and gets faster the more CPU you throw at it
- Accurate
- Works very well across multiple platforms without slowdown (Windows, Linux, macOS)
- Large language support
- Can ignore duplicate files
- Has complexity estimations
- You need to tell the difference between Coq and Verilog in the same directory
- cloc yaml output support so potentially a drop in replacement for some users
- Can identify or ignore minified files
- Able to identify many #! files ADVANCED! <https://github.com/boyter/scc/issues/115>
- Can ignore large files by lines or bytes
- Can calculate the ULOC or unique lines of code by file, language or project
- Supports multiple output formats for integration, CSV, SQL, JSON, HTML and more

Why not use `scc`?

- You don't like Go for some reason
- It cannot count D source with different nested multi-line comments correctly <https://github.com/boyter/scc/issues/27>

### Differences

There are some important differences between `scc` and other tools that are out there. Here are a few important ones for you to consider.

Blank lines inside comments are counted as comments. While the line is technically blank the decision was made that once in a comment everything there should be considered a comment until that comment is ended. As such the following,

```c
/* blank lines follow


*/
```

Would be counted as 4 lines of comments. This is noticeable when comparing scc's output to other tools on large
repositories.

`scc` is able to count verbatim strings correctly. For example in C# the following,

```C#
private const string BasePath = @"a:\";
// The below is returned to the user as a version
private const string Version = "1.0.0";
```

Because of the prefixed @ this string ends at the trailing " by ignoring the escape character \ and as such should be
counted as 2 code lines and 1 comment. Some tools are unable to
deal with this and instead count up to the "1.0.0" as a string which can cause the middle comment to be counted as
code rather than a comment.

`scc` will also tell you the number of bytes it has processed (for most output formats) allowing you to estimate the
cost of running some static analysis tools.

### Usage

Command line usage of `scc` is designed to be as simple as possible.
Full details can be found in `scc --help` or `scc -h`. Note that the below reflects the state of master not a release, as such
features listed below may be missing from your installation.

```text
Sloc, Cloc and Code. Count lines of code in a directory with complexity estimation.
Version 3.5.0 (beta)
Ben Boyter <ben@boyter.org> + Contributors

Usage:
  scc [flags] [files or directories]

Flags:
      --avg-wage int                       average wage value used for basic COCOMO calculation (default 56286)
      --binary                             disable binary file detection
      --by-file                            display output for every file
  -m, --character                          calculate max and mean characters per line
      --ci                                 enable CI output settings where stdout is ASCII
      --cocomo-project-type string         change COCOMO model type [organic, semi-detached, embedded, "custom,1,1,1,1"] (default "organic")
      --count-as string                    count extension as language [e.g. jsp:htm,chead:"C Header" maps extension jsp to html and chead to C Header]
      --count-ignore                       set to allow .gitignore and .ignore files to be counted
      --currency-symbol string             set currency symbol (default "$")
      --debug                              enable debug output
      --directory-walker-job-workers int   controls the maximum number of workers which will walk the directory tree (default 8)
  -a, --dryness                            calculate the DRYness of the project (implies --uloc)
      --eaf float                          the effort adjustment factor derived from the cost drivers (1.0 if rated nominal) (default 1)
      --exclude-dir strings                directories to exclude (default [.git,.hg,.svn])
  -x, --exclude-ext strings                ignore file extensions (overrides include-ext) [comma separated list: e.g. go,java,js]
  -n, --exclude-file strings               ignore files with matching names (default [package-lock.json,Cargo.lock,yarn.lock,pubspec.lock,Podfile.lock,pnpm-lock.yaml])
      --file-gc-count int                  number of files to parse before turning the GC on (default 10000)
      --file-list-queue-size int           the size of the queue of files found and ready to be read into memory (default 8)
      --file-process-job-workers int       number of goroutine workers that process files collecting stats (default 8)
      --file-summary-job-queue-size int    the size of the queue used to hold processed file statistics before formatting (default 8)
  -f, --format string                      set output format [tabular, wide, json, json2, csv, csv-stream, cloc-yaml, html, html-table, sql, sql-insert, openmetrics] (default "tabular")
      --format-multi string                have multiple format output overriding --format [e.g. tabular:stdout,csv:file.csv,json:file.json]
      --gen                                identify generated files
      --generated-markers strings          string markers in head of generated files (default [do not edit,<auto-generated />])
  -h, --help                               help for scc
  -i, --include-ext strings                limit to file extensions [comma separated list: e.g. go,java,js]
      --include-symlinks                   if set will count symlink files
  -l, --languages                          print supported languages and extensions
      --large-byte-count int               number of bytes a file can contain before being removed from output (default 1000000)
      --large-line-count int               number of lines a file can contain before being removed from output (default 40000)
      --locomo                             enable LOCOMO (LLM Output COst MOdel) cost estimation
      --locomo-config string               LOCOMO power-user config "tokensPerLine,inputPerLine,complexityWeight,iterations,iterationWeight"
      --locomo-cycles float               override estimated LLM iteration cycles (default: calculated from complexity)
      --locomo-input-price float           LOCOMO cost per 1M input tokens in dollars (overrides preset)
      --locomo-output-price float          LOCOMO cost per 1M output tokens in dollars (overrides preset)
      --locomo-preset string               LOCOMO model preset [large, medium, small, local] (default "medium")
      --locomo-review float                human review minutes per line of code for LOCOMO estimate (default 0.01)
      --locomo-tps float                   LOCOMO output tokens per second (overrides preset)
      --cost-comparison                    show both COCOMO and LOCOMO estimates side by side
      --min                                identify minified files
  -z, --min-gen                            identify minified or generated files
      --min-gen-line-length int            number of bytes per average line for file to be considered minified or generated (default 255)
      --mcp                                start as an MCP (Model Context Protocol) server over stdio
      --no-cocomo                          remove COCOMO calculation output
  -c, --no-complexity                      skip calculation of code complexity
  -d, --no-duplicates                      remove duplicate files from stats and output
      --no-gen                             ignore generated files in output (implies --gen)
      --no-gitignore                       disables .gitignore file logic
      --no-gitmodule                       disables .gitmodules file logic
      --no-hborder                         remove horizontal borders between sections
      --no-ignore                          disables .ignore file logic
      --no-large                           ignore files over certain byte and line size set by large-line-count and large-byte-count
      --no-min                             ignore minified files in output (implies --min)
      --no-min-gen                         ignore minified or generated files in output (implies --min-gen)
      --no-scc-ignore                      disables .sccignore file logic
      --no-size                            remove size calculation output
  -M, --not-match stringArray              ignore files and directories matching regular expression
  -o, --output string                      output filename (default stdout)
      --overhead float                     set the overhead multiplier for corporate overhead (facilities, equipment, accounting, etc.) (default 2.4)
  -p, --percent                            include percentage values in output
      --remap-all string                   inspect every file and remap by checking for a string and remapping the language [e.g. "-*- C++ -*-":"C Header"]
      --remap-unknown string               inspect files of unknown type and remap by checking for a string and remapping the language [e.g. "-*- C++ -*-":"C Header"]
      --size-unit string                   set size unit [si, binary, mixed, xkcd-kb, xkcd-kelly, xkcd-imaginary, xkcd-intel, xkcd-drive, xkcd-bakers] (default "si")
      --sloccount-format                   print a more SLOCCount like COCOMO calculation
  -s, --sort string                        column to sort by [files, name, lines, blanks, code, comments, complexity] (default "files")
      --sql-project string                 use supplied name as the project identifier for the current run. Only valid with the --format sql or sql-insert option
  -t, --trace                              enable trace output (not recommended when processing multiple files)
  -u, --uloc                               calculate the number of unique lines of code (ULOC) for the project
  -v, --verbose                            verbose output
      --version                            version for scc
  -w, --wide                               wider output with additional statistics (implies --complexity)
```

Output should look something like the below for the redis project

```text
$ scc redis 
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C                          437   267,353   31,103    45,998  190,252     48,269
JSON                       406    25,392        4         0   25,388          0
C Header                   288    48,831    5,648    11,302   31,881      3,097
TCL                        215    66,943    7,330     4,651   54,962      3,816
Shell                       75     1,626      239       343    1,044        185
Python                      34     4,802      694       498    3,610        621
Markdown                    26     4,647    1,226         0    3,421          0
Autoconf                    22    11,732    1,124     1,420    9,188      1,016
Lua                         20       525       69        71      385         89
Makefile                    20     1,956      368       170    1,418         85
YAML                        20     2,696      147        53    2,496          0
MSBuild                     11     1,995        2         0    1,993        160
Plain Text                  10     1,773      313         0    1,460          0
Ruby                         9       817       73       105      639        123
C++                          8       546       85        43      418         43
HTML                         5     9,658    2,928        12    6,718          0
License                      3        90       17         0       73          0
CMake                        2       298       49         5      244         12
CSS                          2       107       16         0       91          0
Systemd                      2        80        6         0       74          0
BASH                         1       143       16         5      122         38
Batch                        1        28        2         0       26          3
C++ Header                   1         9        1         3        5          0
Extensible Styleshe…         1        10        0         0       10          0
JavaScript                   1        31        1         0       30          5
Module-Definition            1    11,375    2,116         0    9,259        167
SVG                          1         1        0         0        1          0
Smarty Template              1        44        1         0       43          5
m4                           1       951      218        64      669          0
───────────────────────────────────────────────────────────────────────────────
Total                    1,624   464,459   53,796    64,743  345,920     57,734
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $12,517,562
Estimated Schedule Effort (organic) 35.93 months
Estimated People Required (organic) 30.95
───────────────────────────────────────────────────────────────────────────────
Processed 16601962 bytes, 16.602 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
```

Note that you don't have to specify the directory you want to run against. Running `scc` will assume you want to run against the current directory.

You can also run against multiple files or directories `scc directory1 directory2 file1 file2` with the results aggregated in the output.

Since `scc` writes to standard output, there are many ways to easily share the results. For example, using [netcat](https://manpages.org/nc)
and [one of many pastebins](https://paste.c-net.org/) gives a public URL:

```bash
$ scc | nc paste.c-net.org 9999
https://paste.c-net.org/Example
```

### Ignore Files

`scc` mostly supports .ignore files inside directories that it scans. This is similar to how ripgrep, ag and tokei work. .ignore files are 100% the same as .gitignore files with the same syntax, and as such `scc` will ignore files and directories listed in them. You can add .ignore files to ignore things like vendored dependency checked in files and such. The idea is allowing you to add a file or folder to git and have ignored in the count.

It also supports its own ignore file `.sccignore` if you want `scc` to ignore things while having ripgrep, ag, tokei and others support them.

### Interesting Use Cases

Used inside Intel Nemu Hypervisor to track code changes between revisions <https://github.com/intel/nemu/blob/topic/virt-x86/tools/cloc-change.sh#L9>
Appears to also be used inside both <http://codescoop.com/> <https://pinpoint.com/> <https://github.com/chaoss/grimoirelab-graal>

It also is used to count code and guess language types in <https://searchcode.com/> which makes it one of the most frequently run code counters in the world.

You can also hook scc into your gitlab pipeline <https://gitlab.com/guided-explorations/ci-cd-plugin-extensions/ci-cd-plugin-extension-scc>

Used by the following products and services,

- [GitHub CodeQL](https://github.com/boyter/scc/pull/317) - The CodeQL engine uses `scc` for line counting
- [JetBrains Qodana](https://github.com/JetBrains/qodana-cli) - The Qodana CLI leverages `scc` as a command-line helper for code analysis
- [Scaleway](https://twitter.com/Scaleway/status/1488087029476995074?s=20&t=N2-z6O-ISDdDzULg4o4uVQ) - Cloud provider using `scc`
- [Linux Foundation LFX Insights](https://docs.linuxfoundation.org/lfx/insights/v3-beta-version-current/getting-started/landing-page/cocomo-cost-estimation-simplified) - COCOMO cost estimation
- [OpenEMS](https://openems.io/)

### Features

`scc` uses a small state machine in order to determine what state the code is when it reaches a newline `\n`. As such it is aware of and able to count

- Single Line Comments
- Multi Line Comments
- Strings
- Multi Line Strings
- Blank lines

Because of this it is able to accurately determine if a comment is in a string or is actually a comment.

It also attempts to count the complexity of code. This is done by checking for branching operations in the code. For example, each of the following `for if switch while else || && != ==` if encountered in Java would increment that files complexity by one.

### Complexity Estimates

Let's take a minute to discuss the complexity estimate itself.

The complexity estimate is really just a number that is only comparable to files in the same language. It should not be used to compare languages directly without weighting them. The reason for this is that its calculated by looking for branch and loop statements in the code and incrementing a counter for that file.

Because some languages don't have loops and instead use recursion they can have a lower complexity count. Does this mean they are less complex? Probably not, but the tool cannot see this because it does not build an AST of the code as it only scans through it.

Generally though the complexity there is to help estimate between projects written in the same language, or for finding the most complex file in a project `scc --by-file -s complexity` which can be useful when you are estimating on how hard something is to maintain, or when looking for those files that should probably be refactored.

As for how it works.

It's my own definition, but tries to be an approximation of cyclomatic complexity <https://en.wikipedia.org/wiki/Cyclomatic_complexity> although done only on a file level.

The reason it's an approximation is that it's calculated almost for free from a CPU point of view (since its a cheap lookup when counting), whereas a real cyclomatic complexity count would need to parse the code. It gives a reasonable guess in practice though even if it fails to identify recursive methods. The goal was never for it to be exact.

In short when scc is looking through what it has identified as code if it notices what are usually branch conditions it will increment a counter.

The conditions it looks for are compiled into the code and you can get an idea for them by looking at the JSON inside the repository. See <https://github.com/boyter/scc/blob/master/languages.json#L3869> for an example of what it's looking at for a file that's Java.

The increment happens for each of the matching conditions and produces the number you see.

### Unique Lines of Code (ULOC)

ULOC stands for Unique Lines of Code and represents the unique lines across languages, files and the project itself. This idea was taken from
<https://cmcenroe.me/2018/12/14/uloc.html> where the calculation is presented using standard Unix tools `sort -u *.h *.c | wc -l`. This metric is
there to assist with the estimation of complexity within the project. Quoting the source

> In my opinion, the number this produces should be a better estimate of the complexity of a project. Compared to SLOC, not only are blank lines discounted, but so are close-brace lines and other repetitive code such as common includes. On the other hand, ULOC counts comments, which require just as much maintenance as the code around them does, while avoiding inflating the result with license headers which appear in every file, for example.

You can obtain the ULOC by supplying the `-u` or `--uloc` argument to `scc`.

It has a corresponding metric `DRYness %` which is the percentage of ULOC to CLOC or `DRYness = ULOC / SLOC`. The
higher the number the more DRY (don't repeat yourself) the project can be considered. In general a higher value
here is a better as it indicates less duplicated code. The DRYness metric was taken from a comment by minimax <https://lobste.rs/s/has9r7/uloc_unique_lines_code>

To obtain the DRYness metric you can use the `-a` or `--dryness` argument to `scc`, which will implicitly set `--uloc`.

Note that there is a performance penalty when calculating the ULOC metrics which can double the runtime.

Running the uloc and DRYness calculations against C code a clone of redis produces an output as follows.

```bash
$ scc -a -i c redis 
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C                          437   267,353   31,103    45,998  190,252     48,269
(ULOC)                            149892
───────────────────────────────────────────────────────────────────────────────
Total                      437   267,353   31,103    45,998  190,252     48,269
───────────────────────────────────────────────────────────────────────────────
Unique Lines of Code (ULOC)       149892
DRYness %                           0.56
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $6,681,762
Estimated Schedule Effort (organic) 28.31 months
Estimated People Required (organic) 20.97
───────────────────────────────────────────────────────────────────────────────
Processed 9390815 bytes, 9.391 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
```

Further reading about the ULOC calculation can be found at <https://boyter.org/posts/sloc-cloc-code-new-metic-uloc/>

Interpreting Dryness,

- 75% (High Density): Very terse, expressive code. Every line counts. (Example: Clojure, Haskell)
- 60% - 70% (Standard): A healthy balance of logic and structural ceremony. (Example: Java, Python)
- < 55% (High Boilerplate): High repetition. Likely due to mandatory error handling, auto-generated code, or verbose configuration. (Example: C#, CSS)

See <https://boyter.org/posts/boilerplate-tax-ranking-popular-languages-by-density/> for more details.

### COCOMO

The COCOMO statistics displayed at the bottom of any command line run can be configured as needed.

```text
Estimated Cost to Develop (organic) $664,081
Estimated Schedule Effort (organic) 11.772217 months
Estimated People Required (organic) 5.011633
```

To change the COCOMO parameters, you can either use one of the default COCOMO models.

```text
scc --cocomo-project-type organic
scc --cocomo-project-type semi-detached
scc --cocomo-project-type embedded
```

You can also supply your own parameters if you are familiar with COCOMO as follows,

```text
scc --cocomo-project-type "custom,1,1,1,1"
```

See below for details about how the model choices, and the parameters they use.

Organic – A software project is said to be an organic type if the team size required is adequately small, the
problem is well understood and has been solved in the past and also the team members have a nominal experience
regarding the problem.

`scc --cocomo-project-type "organic,2.4,1.05,2.5,0.38"`

Semi-detached – A software project is said to be a Semi-detached type if the vital characteristics such as team-size,
experience, knowledge of the various programming environment lie in between that of organic and Embedded.
The projects classified as Semi-Detached are comparatively less familiar and difficult to develop compared to
the organic ones and require more experience and better guidance and creativity. Eg: Compilers or
different Embedded Systems can be considered of Semi-Detached type.

`scc --cocomo-project-type "semi-detached,3.0,1.12,2.5,0.35"`

Embedded – A software project with requiring the highest level of complexity, creativity, and experience
requirement fall under this category. Such software requires a larger team size than the other two models
and also the developers need to be sufficiently experienced and creative to develop such complex models.

`scc --cocomo-project-type "embedded,3.6,1.20,2.5,0.32"`

### LOCOMO

LOCOMO (LLM Output COst MOdel) estimates the cost to regenerate a codebase using a large language model. It is the LLM-era counterpart to COCOMO — a rough ballpark estimator, not a project planning tool.

Note: LOCOMO was developed as part of `scc` and is not an industry-standard model. Unlike COCOMO, which is based on decades of empirical research by Barry Boehm, LOCOMO is an experimental heuristic designed to give a useful order-of-magnitude estimate for LLM-assisted development costs. Treat its output as a conversation starter, not a definitive answer.

**Important distinction:** LOCOMO estimates the cost to **regenerate** known code — essentially "given this exact codebase, how much would it cost to have an LLM produce it?" This is fundamentally different from the cost to **create** something from scratch, which involves exploration, architectural decisions, dead ends, debugging, and iteration that can cost orders of magnitude more. COCOMO estimates the human *creation* cost; LOCOMO estimates the LLM *regeneration* cost. They answer different questions.

LOCOMO is opt-in. Enable it with `--locomo` or use `--cost-comparison` to display both COCOMO and LOCOMO side by side.

```
$ scc --locomo .
...
LOCOMO LLM Cost Estimate (medium)
  Tokens Required (in/out) 3.0M / 0.7M
  Cost to Generate $20
  Estimated Cycles 2.1
  Generation Time (serial) 3.9 hours
  Human Review Time 5.9 hours
  Disclaimer: rough ballpark for regenerating code using a LLM.
  Does not account for context reuse, test generation, or heavy debugging.
```

#### How it works

LOCOMO uses SLOC and complexity data that `scc` already computes. The model works per-file and aggregates:

1. **Output tokens** — each line of code maps to ~10 LLM output tokens (configurable).
2. **Input tokens** — estimated prompting cost, scaled by code complexity. More complex code (higher branch density) requires more detailed prompts. Scales to prevent runaway estimates.
3. **Iteration factor** — LLMs rarely produce correct code on the first try. A retry multiplier scales with complexity, also scales.
4. **Dollar cost** — input and output tokens multiplied by per-token pricing.
5. **Generation time** — total serial output tokens divided by tokens-per-second throughput.
6. **Human review time** — estimated per-line overhead for planning, review, testing, and integration.

#### Model presets

Presets are tier-based rather than tied to specific models, so they don't go stale as models are retired or renamed. Use `--locomo-preset` to select a tier:

| Preset | Represents | Input $/1M | Output $/1M | TPS |
|--------|-----------|-----------|-------------|-----|
| `large` | Frontier models (Opus, GPT-5.3, Gemini 3.1 Pro, etc.) | 10.00 | 30.00 | 30 |
| `medium` (default) | Balanced models (Sonnet, Gemini Flash, etc.) | 3.00 | 15.00 | 50 |
| `small` | Fast/cheap models (Haiku, GPT-4o-mini, etc.) | 0.50 | 2.00 | 100 |
| `local` | Self-hosted models (Llama, Mistral, Qwen etc.) | 0.00 | 0.00 | 15 |

For `local`, cost is $0 but generation time is still reported to capture the compute/time investment. Preset pricing reflects approximate tier rates as of early 2026 and can be overridden with explicit flags.

```
scc --locomo --locomo-preset large .
scc --locomo --locomo-preset local .
```

#### Overriding preset values

You can override individual preset values for pricing or throughput:

```
scc --locomo --locomo-input-price 1.0 --locomo-output-price 5.0 .
scc --locomo --locomo-tps 100 .
```

#### Human review time

The `--locomo-review` flag controls estimated human review minutes per line of code (default: 0.01, i.e. 0.6 seconds per line). This is intentionally optimistic and assumes light oversight.

For mission-critical, security-sensitive, or complex algorithmic code you should increase this:

```
scc --locomo --locomo-review 0.05 .
scc --locomo --locomo-review 0.1 .
```

#### Power-user configuration

The five internal model parameters can be overridden with a single comma-separated config string:

```
scc --locomo --locomo-config "tokensPerLine,inputPerLine,complexityWeight,iterations,iterationWeight"
```

The defaults are `"10,20,5,1.5,2"`. Here is what each parameter controls:

| Position | Name | Default | Description |
|----------|------|---------|-------------|
| 1 | tokensPerLine | 10 | Average LLM output tokens per line of code |
| 2 | inputPerLine | 20 | Base LLM input (prompt) tokens per output line |
| 3 | complexityWeight | 5 | How much complexity density scales input tokens: `inputFactor = 1 + sqrt(density) * weight` |
| 4 | iterations | 1.5 | Base iteration/retry cycles before complexity adjustment |
| 5 | iterationWeight | 2 | How much complexity density adds extra cycles: `cycles = iterations + sqrt(density) * weight` |

The iteration factor (cycles) scales both input and output tokens — it represents how many generation attempts the LLM needs. Simple code (~0.05 complexity density) produces ~1.9 cycles; complex code (~0.3 density) produces ~2.6 cycles. Use `--locomo-cycles` to override this with a fixed value.

For example, to model a cheaper/faster LLM that needs fewer tokens but more retries:

```
scc --locomo --locomo-config "8,15,3,2.0,1.5"
```

#### Comparing COCOMO and LOCOMO

Use `--cost-comparison` to show both estimates side by side. This enables COCOMO (if it was disabled) and LOCOMO together:

```
scc --cost-comparison .
```

#### What LOCOMO does not account for

LOCOMO is a rough estimator with known limitations:

- **No context reuse.** Real LLM-assisted development shares context across files. The per-file model overestimates input tokens for large projects with shared patterns.
- **Boilerplate vs algorithmic code.** A 500-line CRUD controller and a 500-line compression algorithm have very different real costs, but the model only differentiates them via complexity density.
- **Code that LLMs can't write well.** Complex concurrency, platform-specific edge cases, and security-critical crypto need human authoring, not just review.
- **No test generation cost.** The model estimates source code generation only, not test suites.
- **Pricing changes.** LLM pricing drops rapidly. Preset defaults will become stale — use explicit price flags for current estimates.

#### All LOCOMO flags

| Flag | Default | Description |
|------|---------|-------------|
| `--locomo` | false | Enable LOCOMO output |
| `--cost-comparison` | false | Show COCOMO + LOCOMO side by side |
| `--locomo-preset` | medium | Model tier preset for pricing and throughput |
| `--locomo-input-price` | (preset) | Override: cost per 1M input tokens ($) |
| `--locomo-output-price` | (preset) | Override: cost per 1M output tokens ($) |
| `--locomo-tps` | (preset) | Override: output tokens per second |
| `--locomo-review` | 0.01 | Human review minutes per line of code |
| `--locomo-cycles` | (calculated) | Override estimated LLM iteration cycles |
| `--locomo-config` | 10,20,5,1.5,2 | Power-user config: tokensPerLine, inputPerLine, complexityWeight, iterations, iterationWeight |

### Large File Detection

You can have `scc` exclude large files from the output.

The option to do so is `--no-large` which by default will exclude files over 1,000,000 bytes or 40,000 lines.

You can control the size of either value using `--large-byte-count` or `--large-line-count`.

For example to exclude files over 1,000 lines and 50kb you could use the following,

`scc --no-large --large-byte-count 50000 --large-line-count 1000`

### Minified/Generated File Detection

You can have `scc` identify and optionally remove files identified as being minified or generated from the output.

You can do so by enabling the `-z` flag like so `scc -z` which will identify any file with an average line byte size >= 255 (by default) as being minified.

Minified files appear like so in the output.

```text
$ scc --no-cocomo -z ./examples/minified/jquery-3.1.1.min.js
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
JavaScript (min)             1         4        0         1        3         17
───────────────────────────────────────────────────────────────────────────────
Total                        1         4        0         1        3         17
───────────────────────────────────────────────────────────────────────────────
Processed 86709 bytes, 0.087 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
```

Minified files are indicated with the text `(min)` after the language name.

Generated files are indicated with the text `(gen)` after the language name.

You can control the average line byte size using `--min-gen-line-length` such as `scc -z --min-gen-line-length 1`. Please note you need `-z` as modifying this value does not imply minified detection.

You can exclude minified files from the count totally using the flag `--no-min-gen`. Files which match the minified check will be excluded from the output.

### Remapping

Some files may not have an extension. They will be checked to see if they are a #! file. If they are then the language will be remapped to the
correct language. Otherwise, it will not process.

However, you may have the situation where you want to remap such files based on a string inside it. To do so you can use `--remap-unknown`

```bash
 scc --remap-unknown "-*- C++ -*-":"C Header"
```

The above will inspect any file with no extension looking for the string `-*- C++ -*-` and if found remap the file to be counted using the C Header rules.
You can have multiple remap rules if required,

```bash
 scc --remap-unknown "-*- C++ -*-":"C Header","other":"Java"
```

There is also the `--remap-all` parameter which will remap all files.

Note that in all cases if the remap rule does not apply normal #! rules will apply.

### Output Formats

By default `scc` will output to the console. However, you can produce output in other formats if you require.

The different options are `tabular, wide, json, csv, csv-stream, cloc-yaml, html, html-table, sql, sql-insert, openmetrics`.

Note that you can write `scc` output to disk using the `-o, --output` option. This allows you to specify a file to
write your output to. For example `scc -f html -o output.html` will run `scc` against the current directory, and output
the results in html to the file `output.html`.

You can also write to multiple output files, or multiple types to stdout if you want using the `--format-multi` option. This is
most useful when working in CI/CD systems where you want HTML reports as an artifact while also displaying the counts in stdout.

```bash
scc --format-multi "tabular:stdout,html:output.html,csv:output.csv"
```

The above will run against the current directory, outputting to standard output the default output, as well as writing
to output.html and output.csv with the appropriate formats.

#### Tabular

This is the default output format when scc is run.

#### Wide

Wide produces some additional information which is the complexity/lines metric. This can be useful when trying to
identify the most complex file inside a project based on the complexity estimate.

#### JSON

JSON produces JSON output. Mostly designed to allow `scc` to feed into other programs.

Note that this format will give you the byte size of every file `scc` reads allowing you to get a breakdown of the
number of bytes processed.

#### CSV

CSV as an option is good for importing into a spreadsheet for analysis.

Note that this format will give you the byte size of every file `scc` reads allowing you to get a breakdown of the
number of bytes processed. Also note that CSV respects `--by-file` and as such will return a summary by default.

#### CSV-Stream

csv-stream is an option useful for processing very large repositories where you are likely to run into memory issues. It's output format is 100% the same as CSV.

Note that you should not use this with the `format-multi` option as it will always print to standard output, and because of how it works will negate the memory saving it normally gains.
savings that this option provides. Note that there is no sort applied with this option.

#### cloc-yaml

Is a drop in replacement for cloc using its yaml output option. This is quite often used for passing into other
build systems and can help with replacing cloc if required.

```text
$ scc -f cloc-yml processor
# https://github.com/boyter/scc/
header:
  url: https://github.com/boyter/scc/
  version: 2.11.0
  elapsed_seconds: 0.008
  n_files: 21
  n_lines: 6562
  files_per_second: 2625
  lines_per_second: 820250
Go:
  name: Go
  code: 5186
  comment: 273
  blank: 1103
  nFiles: 21
SUM:
  code: 5186
  comment: 273
  blank: 1103
  nFiles: 21

$ cloc --yaml processor
      21 text files.
      21 unique files.
       0 files ignored.

---
# http://cloc.sourceforge.net
header :
  cloc_url           : http://cloc.sourceforge.net
  cloc_version       : 1.60
  elapsed_seconds    : 0.196972846984863
  n_files            : 21
  n_lines            : 6562
  files_per_second   : 106.613679608407
  lines_per_second   : 33314.2364566841
Go:
  nFiles: 21
  blank: 1137
  comment: 606
  code: 4819
SUM:
  blank: 1137
  code: 4819
  comment: 606
  nFiles: 21
```

#### HTML and HTML-TABLE

The HTML output options produce a minimal html report using a table that is either standalone `html` or as just a table `html-table`
which can be injected into your own HTML pages. The only difference between the two is that the `html` option includes
html head and body tags with minimal styling.

The markup is designed to allow your own custom styles to be applied. An example report
[is here to view](SCC-OUTPUT-REPORT.html).

Note that the HTML options follow the command line options, so you can use `scc --by-file -f html` to produce a report with every
file and not just the summary.

Note that this format if it has the `--by-file` option will give you the byte size of every file `scc` reads allowing you to get a breakdown of the
number of bytes processed.

#### SQL and SQL-Insert

The SQL output format "mostly" compatible with cloc's SQL output format <https://github.com/AlDanial/cloc#sql->

While all queries on the cloc documentation should work as expected, you will not be able to append output from `scc` and `cloc` into the same database. This is because the table format is slightly different
to account for scc including complexity counts and bytes.

The difference between `sql` and `sql-insert` is that `sql` will include table creation while the latter will only have the insert commands.

Usage is 100% the same as any other `scc` command but sql output will always contain per file details. You can compute totals yourself using SQL, however COCOMO calculations will appear against the metadata table as the columns `estimated_cost` `estimated_schedule_months` and `estimated_people`.

The below will run scc against the current directory, name the output as the project scc and then pipe the output to sqlite to put into the database code.db

```bash
scc --format sql --sql-project scc . | sqlite3 code.db
```

Assuming you then wanted to append another project

```bash
scc --format sql-insert --sql-project redis . | sqlite3 code.db
```

You could then run SQL against the database,

```bash
sqlite3 code.db 'select project,file,max(nCode) as nL from t
                         group by project order by nL desc;'
```

See the cloc documentation for more examples.

#### OpenMetrics

[OpenMetrics](https://openmetrics.io/) is a metric reporting format specification extending the Prometheus exposition text format.

The produced output is natively supported by [Prometheus](https://prometheus.io/) and [GitLab CI](https://docs.gitlab.com/ee/ci/testing/metrics_reports.html)

Note that OpenMetrics respects `--by-file` and as such will return a summary by default.

The output includes a metadata header containing definitions of the returned metrics:

```text
# TYPE scc_files count
# HELP scc_files Number of sourcecode files.
# TYPE scc_lines count
# UNIT scc_lines lines
# HELP scc_lines Number of lines.
# TYPE scc_code count
# HELP scc_code Number of lines of actual code.
# TYPE scc_comments count
# HELP scc_comments Number of comments.
# TYPE scc_blanks count
# HELP scc_blanks Number of blank lines.
# TYPE scc_complexity count
# HELP scc_complexity Code complexity.
# TYPE scc_bytes count
# UNIT scc_bytes bytes
# HELP scc_bytes Size in bytes.
```

The header is followed by the metric data in either language summary form:

```text
scc_files{language="Go"} 1
scc_lines{language="Go"} 1000
scc_code{language="Go"} 1000
scc_comments{language="Go"} 1000
scc_blanks{language="Go"} 1000
scc_complexity{language="Go"} 1000
scc_bytes{language="Go"} 1000
```

or, if `--by-file` is present, in per file form:

```text
scc_lines{language="Go",file="./bbbb.go"} 1000
scc_code{language="Go",file="./bbbb.go"} 1000
scc_comments{language="Go",file="./bbbb.go"} 1000
scc_blanks{language="Go",file="./bbbb.go"} 1000
scc_complexity{language="Go",file="./bbbb.go"} 1000
scc_bytes{language="Go",file="./bbbb.go"} 1000
```

### Performance

Generally `scc` will the fastest code counter compared to any I am aware of and have compared against. The below comparisons are taken from the fastest alternative counters. See `Other similar projects` above to see all of the other code counters compared against. It is designed to scale to as many CPU's cores as you can provide.

However, if you want greater performance and you have RAM to spare you can disable the garbage collector like the following on Linux `GOGC=-1 scc .` which should speed things up considerably. For some repositories turning off the code complexity calculation via `-c` can reduce runtime as well.

Benchmarks are run on fresh 32 Core CPU Optimised Vultr Ocean Virtual Machine 2026/03/05 all done using [hyperfine](https://github.com/sharkdp/hyperfine).

See <https://github.com/boyter/scc/blob/master/benchmark.sh> to see how the benchmarks are run.

#### Valkey <https://github.com/valkey-io/valkey>

```shell
Benchmark 1: scc valkey
  Time (mean ± σ):      27.7 ms ±   2.1 ms    [User: 175.7 ms, System: 87.0 ms]
  Range (min … max):    23.1 ms …  32.1 ms    96 runs
 
Benchmark 2: scc -c valkey
  Time (mean ± σ):      23.0 ms ±   1.5 ms    [User: 131.7 ms, System: 84.0 ms]
  Range (min … max):    19.5 ms …  31.4 ms    130 runs
 
Benchmark 3: tokei valkey
  Time (mean ± σ):      74.0 ms ±  13.0 ms    [User: 394.2 ms, System: 245.1 ms]
  Range (min … max):    49.1 ms …  92.5 ms    37 runs
 
Benchmark 4: polyglot valkey
  Time (mean ± σ):      41.1 ms ±   1.2 ms    [User: 54.2 ms, System: 103.3 ms]
  Range (min … max):    37.5 ms …  47.0 ms    69 runs
 
Summary
  scc -c valkey ran
    1.20 ± 0.12 times faster than scc valkey
    1.78 ± 0.13 times faster than polyglot valkey
    3.21 ± 0.61 times faster than tokei valkey
```

#### CPython <https://github.com/python/cpython>

```shell
Benchmark 1: scc cpython
  Time (mean ± σ):      80.8 ms ±   2.6 ms    [User: 751.1 ms, System: 265.6 ms]
  Range (min … max):    75.7 ms …  87.4 ms    36 runs
 
Benchmark 2: scc -c cpython
  Time (mean ± σ):      70.5 ms ±   2.4 ms    [User: 592.6 ms, System: 254.7 ms]
  Range (min … max):    66.2 ms …  77.6 ms    40 runs
 
Benchmark 3: tokei cpython
  Time (mean ± σ):     450.2 ms ±  36.1 ms    [User: 1822.0 ms, System: 1246.9 ms]
  Range (min … max):   378.6 ms … 491.2 ms    10 runs
 
Benchmark 4: polyglot cpython
  Time (mean ± σ):     149.9 ms ±   5.8 ms    [User: 199.2 ms, System: 326.2 ms]
  Range (min … max):   138.3 ms … 164.1 ms    19 runs
 
Summary
  scc -c cpython ran
    1.15 ± 0.05 times faster than scc cpython
    2.13 ± 0.11 times faster than polyglot cpython
    6.39 ± 0.56 times faster than tokei cpython
```

#### Linux Kernel <https://github.com/torvalds/linux>

```shell
Benchmark 1: scc linux
  Time (mean ± σ):     907.2 ms ±  17.1 ms    [User: 13764.7 ms, System: 2957.0 ms]
  Range (min … max):   878.2 ms … 925.0 ms    10 runs
 
Benchmark 2: scc -c linux
  Time (mean ± σ):     842.5 ms ±  17.2 ms    [User: 9363.3 ms, System: 2977.0 ms]
  Range (min … max):   819.4 ms … 874.0 ms    10 runs
 
Benchmark 3: tokei linux
  Time (mean ± σ):      1.422 s ±  0.089 s    [User: 13.292 s, System: 9.582 s]
  Range (min … max):    1.176 s …  1.471 s    10 runs
 
Benchmark 4: polyglot linux
  Time (mean ± σ):      1.862 s ±  0.046 s    [User: 3.802 s, System: 3.543 s]
  Range (min … max):    1.800 s …  1.935 s    10 runs
 
Summary
  scc -c linux ran
    1.08 ± 0.03 times faster than scc linux
    1.69 ± 0.11 times faster than tokei linux
    2.21 ± 0.07 times faster than polyglot linux
```

#### Sourcegraph <https://github.com/SINTEF/sourcegraph.git>

Sourcegraph has gone dark since I last ran these benchmarks hence using a clone taken before this occured.
The reason for this is to track what appears to be a performance regression in tokei.

```shell
Benchmark 1: scc sourcegraph
  Time (mean ± σ):     108.2 ms ±   3.5 ms    [User: 559.4 ms, System: 323.6 ms]
  Range (min … max):   100.5 ms … 115.9 ms    26 runs
 
Benchmark 2: scc -c sourcegraph
  Time (mean ± σ):      99.7 ms ±   4.2 ms    [User: 503.1 ms, System: 316.8 ms]
  Range (min … max):    91.4 ms … 109.4 ms    29 runs
 
Benchmark 3: tokei sourcegraph
  Time (mean ± σ):     21.359 s ±  1.025 s    [User: 57.252 s, System: 411.480 s]
  Range (min … max):   19.371 s … 22.741 s    10 runs
 
Benchmark 4: polyglot sourcegraph
  Time (mean ± σ):     135.1 ms ±   5.0 ms    [User: 198.6 ms, System: 543.7 ms]
  Range (min … max):   126.0 ms … 144.8 ms    21 runs
 
Summary
  scc -c sourcegraph ran
    1.08 ± 0.06 times faster than scc sourcegraph
    1.36 ± 0.08 times faster than polyglot sourcegraph
  214.26 ± 13.64 times faster than tokei sourcegraph
```

If you enable duplicate detection expect performance to fall by about 20% in `scc`.

Performance is tracked for some releases and presented below.

[![scc perfromance on Linux kernel](./performance-over-time.png)]
The decrease in performance from the 3.3.0 release was due to accurate .gitignore, .ignore and .gitmodule support.
Current work is focussed on resolving this.

### CI/CD Support

Some CI/CD systems which will remain nameless do not work very well with the box-lines used by `scc`. To support those systems better there is an option `--ci` which will change the default output to ASCII only.

```text
$ scc --ci main.go
-------------------------------------------------------------------------------
Language                 Files     Lines   Blanks  Comments     Code Complexity
-------------------------------------------------------------------------------
Go                           1       272        7         6      259          4
-------------------------------------------------------------------------------
Total                        1       272        7         6      259          4
-------------------------------------------------------------------------------
Estimated Cost to Develop $6,539
Estimated Schedule Effort 2.268839 months
Estimated People Required 0.341437
-------------------------------------------------------------------------------
Processed 5674 bytes, 0.006 megabytes (SI)
-------------------------------------------------------------------------------
```

The `--format-multi` option is especially useful in CI/CD where you want to get multiple output formats useful for storage or reporting.

### Development

If you want to hack away feel free! PR's are accepted. Some things to keep in mind. If you want to change a language definition you need to update `languages.json` and then run `go generate` which will convert it into the `processor/constants.go` file.

For all other changes ensure you run all tests before submitting. You can do so using `go test ./...`. However, for maximum coverage please run `test-all.sh` which will run `gofmt`, unit tests, race detector and then all of the integration tests. All of those must pass to ensure a stable release.

### API Support

The core part of `scc` which is the counting engine is exposed publicly to be integrated into other Go applications. See <https://github.com/pinpt/ripsrc> for an example of how to do this.

It also powers all of the code calculations displayed in <https://searchcode.com/> such as <https://searchcode.com/file/169350674/main.go/> making it one of the more used code counters in the world.

However as a quick start consider the following,

Note that you must pass in the number of bytes in the content in order to ensure it is counted!

```go
package main

import (
  "fmt"
  "io/ioutil"

  "github.com/boyter/scc/v3/processor"
)

type statsProcessor struct{}

func (p *statsProcessor) ProcessLine(job *processor.FileJob, currentLine int64, lineType processor.LineType) bool {
  switch lineType {
  case processor.LINE_BLANK:
    fmt.Println(currentLine, "lineType", "BLANK")
  case processor.LINE_CODE:
    fmt.Println(currentLine, "lineType", "CODE")
  case processor.LINE_COMMENT:
    fmt.Println(currentLine, "lineType", "COMMENT")
  }
  return true
}

func main() {
  bts, _ := ioutil.ReadFile("somefile.go")  
  t := &statsProcessor{}
  filejob := &processor.FileJob{
    Filename: "test.go",
    Language: "Go",
    Content:  bts,
    Callback: t,
    Bytes:    int64(len(bts)),
  }  
  processor.ProcessConstants() // Required to load the language information and need only be done once
  processor.CountStats(filejob)
}
```

#### Per-Byte Content Classification

For library consumers who need finer granularity than per-line classification, `scc` supports opt-in per-byte content classification. When enabled, `CountStats` populates a byte slice classifying every byte in the file as code, comment, string, or blank. This is useful for stripping comments from source files, extracting only comments, or building syntax-aware tools without reimplementing language parsing.

To enable it, set `ClassifyContent: true` on the `FileJob` before calling `CountStats`. When disabled (the default), there is zero performance impact.

```go
package main

import (
  "fmt"
  "os"

  "github.com/boyter/scc/v3/processor"
)

func main() {
  processor.ProcessConstants()

  bts, _ := os.ReadFile("main.go")
  filejob := &processor.FileJob{
    Filename:        "main.go",
    Language:        "Go",
    Content:         bts,
    Bytes:           int64(len(bts)),
    ClassifyContent: true, // Enable per-byte classification
  }
  processor.CountStats(filejob)

  // ContentByteType has one entry per byte with values:
  //   processor.ByteTypeBlank   (0) - blank lines / leading whitespace
  //   processor.ByteTypeCode    (1) - code
  //   processor.ByteTypeComment (2) - comments (including docstrings)
  //   processor.ByteTypeString  (3) - string literals

  // Example: extract only code, replacing everything else with spaces
  codeOnly := filejob.FilterContentByType(processor.ByteTypeCode)
  fmt.Println(string(codeOnly))

  // Example: extract only comments
  commentsOnly := filejob.FilterContentByType(processor.ByteTypeComment)
  fmt.Println(string(commentsOnly))

  // Example: keep both code and strings, strip comments
  noComments := filejob.FilterContentByType(processor.ByteTypeCode, processor.ByteTypeString)
  fmt.Println(string(noComments))
}
```

`FilterContentByType` returns a copy of the content with non-matching bytes replaced by spaces. Newlines are always preserved regardless of type, so the output maintains the same line structure as the original file. It returns `nil` if classification was not enabled.

Note that at syntax marker boundaries (e.g., `//`, `/*`, `"`), the first byte of the marker may be classified as the preceding state. This is a 1-byte approximation that is acceptable for content filtering use cases.

### MCP Server Mode

`scc` can run as an [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server over stdio, allowing LLM tools like Claude Desktop, Claude Code, Cursor, and others to use it as a code analysis tool.

```shell
scc --mcp
```

#### Claude Code Configuration

Run in your terminal for the current project:

```shell
claude mcp add scc -- scc --mcp
```

Or globally for all projects:

```shell
claude mcp add scc --scope user -- scc --mcp
```

Alternatively, add to your `.mcp.json`:

```json
{
  "mcpServers": {
    "scc": {
      "command": "scc",
      "args": ["--mcp"]
    }
  }
}
```

#### Claude Desktop Configuration

Add to your `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "scc": {
      "command": "/path/to/scc",
      "args": ["--mcp"]
    }
  }
}
```

#### Exposed Tools

The MCP server exposes one tool:

**`analyze`** — Count lines of code, comments, blanks and estimate complexity for a project directory or file.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `path` | string | no | Directory or file path to analyze. Defaults to current directory. |
| `sort` | string | no | Column to sort by: `files`, `name`, `lines`, `blanks`, `code`, `comments`, `complexity`, `bytes`. Default: `files`. |
| `by_file` | boolean | no | If true, return per-file results instead of per-language summary. |
| `include_ext` | string | no | Comma-separated file extensions to include (e.g. `go,java,js`). |
| `exclude_ext` | string | no | Comma-separated file extensions to exclude (e.g. `json,xml`). |
| `no_duplicates` | boolean | no | Remove duplicate files from stats. |
| `no_min_gen` | boolean | no | Ignore minified or generated files. |
| `locomo` | boolean | no | Include LOCOMO (LLM cost) estimation in results. |
| `locomo_preset` | string | no | LOCOMO model preset: `large`, `medium`, `small`, `local`. Default: `medium`. |

Results are returned as JSON with per-language breakdown (files, lines, code, comments, blanks, complexity, bytes), totals, and COCOMO cost/schedule estimates. When `locomo` is enabled, LOCOMO estimates (token counts, cost, generation time, review hours) are also included.

### Adding/Modifying Languages

To add or modify a language you will need to edit the `languages.json` file in the root of the project, and then run `go generate` to build it into the application. You can then `go install` or `go build` as normal to produce the binary with your modifications.

### Issues

Its possible that you may see the counts vary between runs. This usually means one of two things. Either something is changing or locking the files under scc, or that you are hitting ulimit restrictions. To change the ulimit see the following links.

- <https://superuser.com/questions/261023/how-to-change-default-ulimit-values-in-mac-os-x-10-6#306555>
- <https://unix.stackexchange.com/questions/108174/how-to-persistently-control-maximum-system-resource-consumption-on-mac/221988#221988>
- <https://access.redhat.com/solutions/61334>
- <https://serverfault.com/questions/356962/where-are-the-default-ulimit-values-set-linux-centos>
- <https://www.tecmint.com/increase-set-open-file-limits-in-linux/>

To help identify this issue run scc like so `scc -v .` and look for the message `too many open files` in the output. If it is there you can rectify it by setting your ulimit to a higher value.

### Low Memory

If you are running `scc` in a low memory environment < 512 MB of RAM you may need to set `--file-gc-count` to a lower value such as `0` to force the garbage collector to be on at all times.

A sign that this is required will be `scc` crashing with panic errors.

### Tests

scc is pretty well tested with many unit, integration and benchmarks to ensure that it is fast and complete.

### Package

Packaging as of version v3.1.0 is done through <https://goreleaser.com/>

### Containers

Note if you plan to run `scc` in Alpine containers you will need to build with CGO_ENABLED=0.

See the below Dockerfile as an example on how to achieve this based on this issue <https://github.com/boyter/scc/issues/208>

```Dockerfile
FROM golang as scc-get

ENV GOOS=linux \
GOARCH=amd64 \
CGO_ENABLED=0

ARG VERSION
RUN git clone --branch $VERSION --depth 1 https://github.com/boyter/scc
WORKDIR /go/scc
RUN go build -ldflags="-s -w"

FROM alpine
COPY --from=scc-get /go/scc/scc /bin/
ENTRYPOINT ["scc"]
```

### Badges

You can use `scc` to provide badges on your github/bitbucket/gitlab/sr.ht open repositories. For example, [![Scc Count Badge](https://sloc.xyz/github/boyter/scc/)](https://github.com/boyter/scc/)
 The format to do so is,

<https://sloc.xyz/PROVIDER/USER/REPO>

An example of the badge for `scc` is included below, and is used on this page.

```Markdown
[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/)](https://github.com/boyter/scc/)
```

By default the badge will show the repo's lines count. You can also specify for it to show a different category, by using the `?category=` query string.

Valid values include `code, blanks, lines, comments, cocomo, effort` and examples of the appearance are included below.

[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/?category=code)](https://github.com/boyter/scc/)
[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/?category=blanks)](https://github.com/boyter/scc/)
[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/?category=lines)](https://github.com/boyter/scc/)
[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/?category=comments)](https://github.com/boyter/scc/)
[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/?category=cocomo)](https://github.com/boyter/scc/)
[![Scc Count Badge](https://sloc.xyz/github/boyter/scc/?category=effort)](https://github.com/boyter/scc/)

For `cocomo` you can also set the `avg-wage` value similar to `scc` itself. For example,

<https://sloc.xyz/github/boyter/scc/?category=cocomo&avg-wage=1>
<https://sloc.xyz/github/boyter/scc/?category=cocomo&avg-wage=100000>

Note that the avg-wage value must be a positive integer otherwise it will revert back to the default value of 56286.

You can also configure the look and feel of the badge using the following parameters,

- ?lower=true will lower the title text, so "Total lines" would be "total lines"

The below can control the colours of shadows, fonts and badges. Colors can be specified as either hex codes or named colors (similar to shields.io):

- ?font-color=fff
- ?font-shadow-color=010101
- ?top-shadow-accent-color=bbb
- ?title-bg-color=555
- ?badge-bg-color=4c1

##### Named Colors

For convenience, you can use named colors instead of hex codes. The following named colors are supported:

**Shields.io colors:** `brightgreen`, `green`, `yellowgreen`, `yellow`, `orange`, `red`, `blue`, `lightgrey`, `blueviolet`

**Semantic aliases:** `success`, `important`, `critical`, `informational`, `inactive`

**CSS colors:** `white`, `black`, `silver`, `gray`, `maroon`, `purple`, `fuchsia`, `lime`, `olive`, `navy`, `teal`, `aqua`, `cyan`, `magenta`, `pink`, `coral`, `salmon`, `gold`, `khaki`, `violet`, `indigo`, `crimson`, `turquoise`, `tan`, `brown`, and many more standard CSS color names.

For example, instead of `?badge-bg-color=007ec6` you can use `?badge-bg-color=blue`.

An example of using some of these parameters to produce an admittedly ugly result

[![Scc Count Badge](https://sloc.xyz/github/boyter/scc?font-color=ff0000&badge-bg-color=0000ff&lower=true)](https://github.com/boyter/scc/)

An example using named colors for as a slightly nicer result

[![Scc Count Badge](https://sloc.xyz/github/boyter/scc?title-bg-color=navy&badge-bg-color=blue&font-color=white)](https://github.com/boyter/scc/)

*NB* it may not work for VERY large repositories (has been tested on Apache hadoop/spark without issue).

You can find the source code for badges in the repository at <https://github.com/boyter/scc/blob/master/cmd/badges/main.go>

#### A example for each supported provider

- Github - <https://sloc.xyz/github/boyter/scc/>
- sr.ht - <https://sloc.xyz/sr.ht/~nektro/magnolia-desktop/>
- Bitbucket - <https://sloc.xyz/bitbucket/boyter/decodingcaptchas>
- Gitlab - <https://sloc.xyz/gitlab/esr/loccount>

### Languages

List of supported languages. The master version of `scc` supports 322 languages at last count. Note that this is always assumed that you built from master, and it might trail behind what is actually supported. To see what your version of `scc` supports run `scc --languages`

[Click here to view all languages supported by master](LANGUAGES.md)

### Citation

Please use the following bibtex entry to cite scc in a publication:

<pre>
@software{scc,
  author       = {Ben Boyter},
  title        = {scc: v3.5.0},
  month        = ...,
  year         = ...,
  publisher    = {...},
  version      = {v3.5.0},
  doi          = {...},
  url          = {...}
}
</pre>

You may need to check the release page <https://github.com/boyter/scc/releases> to find the correct year and month for the release you are using.

### Release Checklist

- Update version
- Push code with release number
- Tag off
- Release via goreleaser
- Update dockerfile


================================================
FILE: SCC-OUTPUT-REPORT.html
================================================
<html lang="en"><head><meta charset="utf-8" /><title>scc html output</title><style>table { border-collapse: collapse; }td, th { border: 1px solid #999; padding: 0.5rem; text-align: left;}</style></head><body><table id="scc-table">
	<thead><tr>
		<th>Language</th>
		<th>Files</th>
		<th>Lines</th>
		<th>Blank</th>
		<th>Comment</th>
		<th>Code</th>
		<th>Complexity</th>
		<th>Bytes</th>
		<th>Uloc</th>
	</tr></thead>
	<tbody><tr>
		<th>Go</th>
		<th>32</th>
		<th>26344</th>
		<th>1679</th>
		<th>584</th>
		<th>24081</th>
		<th>1856</th>
		<th>530745</th>
		<th>7733</th>
	</tr><tr>
		<td>processor/constants.go</td>
		<td></td>
		<td>14075</td>
		<td>1</td>
		<td>2</td>
		<td>14072</td>
		<td>0</td>
		<td>220906</td>
		<td>2160</td>
	</tr><tr>
		<td>processor/workers_test.go</td>
		<td></td>
		<td>1914</td>
		<td>338</td>
		<td>64</td>
		<td>1512</td>
		<td>369</td>
		<td>41856</td>
		<td>672</td>
	</tr><tr>
		<td>processor/formatters_test.go</td>
		<td></td>
		<td>1835</td>
		<td>166</td>
		<td>4</td>
		<td>1665</td>
		<td>181</td>
		<td>43740</td>
		<td>501</td>
	</tr><tr>
		<td>processor/formatters.go</td>
		<td></td>
		<td>1559</td>
		<td>207</td>
		<td>32</td>
		<td>1320</td>
		<td>167</td>
		<td>47400</td>
		<td>833</td>
	</tr><tr>
		<td>processor/workers.go</td>
		<td></td>
		<td>872</td>
		<td>128</td>
		<td>92</td>
		<td>652</td>
		<td>217</td>
		<td>26349</td>
		<td>507</td>
	</tr><tr>
		<td>processor/processor.go</td>
		<td></td>
		<td>704</td>
		<td>151</td>
		<td>123</td>
		<td>430</td>
		<td>85</td>
		<td>20885</td>
		<td>469</td>
	</tr><tr>
		<td>main_test.go</td>
		<td></td>
		<td>694</td>
		<td>54</td>
		<td>15</td>
		<td>625</td>
		<td>179</td>
		<td>16612</td>
		<td>390</td>
	</tr><tr>
		<td>cmd/badges/main.go</td>
		<td></td>
		<td>615</td>
		<td>82</td>
		<td>30</td>
		<td>503</td>
		<td>73</td>
		<td>17363</td>
		<td>437</td>
	</tr><tr>
		<td>main.go</td>
		<td></td>
		<td>542</td>
		<td>17</td>
		<td>10</td>
		<td>515</td>
		<td>24</td>
		<td>13082</td>
		<td>339</td>
	</tr><tr>
		<td>processor/detector_test.go</td>
		<td></td>
		<td>420</td>
		<td>94</td>
		<td>3</td>
		<td>323</td>
		<td>109</td>
		<td>7784</td>
		<td>162</td>
	</tr><tr>
		<td>cmd/badges/main_test.go</td>
		<td></td>
		<td>304</td>
		<td>8</td>
		<td>9</td>
		<td>287</td>
		<td>13</td>
		<td>7909</td>
		<td>177</td>
	</tr><tr>
		<td>processor/locomo_test.go</td>
		<td></td>
		<td>272</td>
		<td>37</td>
		<td>18</td>
		<td>217</td>
		<td>68</td>
		<td>7503</td>
		<td>131</td>
	</tr><tr>
		<td>processor/workers_tokei_test.go</td>
		<td></td>
		<td>249</td>
		<td>37</td>
		<td>2</td>
		<td>210</td>
		<td>40</td>
		<td>4027</td>
		<td>125</td>
	</tr><tr>
		<td>processor/structs.go</td>
		<td></td>
		<td>238</td>
		<td>25</td>
		<td>24</td>
		<td>189</td>
		<td>25</td>
		<td>7196</td>
		<td>167</td>
	</tr><tr>
		<td>processor/detector.go</td>
		<td></td>
		<td>232</td>
		<td>42</td>
		<td>33</td>
		<td>157</td>
		<td>54</td>
		<td>6304</td>
		<td>152</td>
	</tr><tr>
		<td>processor/file_test.go</td>
		<td></td>
		<td>213</td>
		<td>50</td>
		<td>1</td>
		<td>162</td>
		<td>37</td>
		<td>4585</td>
		<td>97</td>
	</tr><tr>
		<td>processor/workers_regression_test.go</td>
		<td></td>
		<td>212</td>
		<td>42</td>
		<td>5</td>
		<td>165</td>
		<td>42</td>
		<td>4015</td>
		<td>105</td>
	</tr><tr>
		<td>processor/similar_flags_test.go</td>
		<td></td>
		<td>176</td>
		<td>5</td>
		<td>1</td>
		<td>170</td>
		<td>5</td>
		<td>3105</td>
		<td>78</td>
	</tr><tr>
		<td>processor/locomo.go</td>
		<td></td>
		<td>160</td>
		<td>25</td>
		<td>22</td>
		<td>113</td>
		<td>17</td>
		<td>5311</td>
		<td>117</td>
	</tr><tr>
		<td>processor/file.go</td>
		<td></td>
		<td>153</td>
		<td>23</td>
		<td>16</td>
		<td>114</td>
		<td>43</td>
		<td>3527</td>
		<td>94</td>
	</tr><tr>
		<td>processor/processor_test.go</td>
		<td></td>
		<td>151</td>
		<td>36</td>
		<td>1</td>
		<td>114</td>
		<td>21</td>
		<td>2573</td>
		<td>66</td>
	</tr><tr>
		<td>processor/structs_test.go</td>
		<td></td>
		<td>145</td>
		<td>14</td>
		<td>1</td>
		<td>130</td>
		<td>16</td>
		<td>3323</td>
		<td>96</td>
	</tr><tr>
		<td>processor/trace_test.go</td>
		<td></td>
		<td>117</td>
		<td>13</td>
		<td>0</td>
		<td>104</td>
		<td>15</td>
		<td>2771</td>
		<td>80</td>
	</tr><tr>
		<td>processor/trace.go</td>
		<td></td>
		<td>96</td>
		<td>15</td>
		<td>8</td>
		<td>73</td>
		<td>9</td>
		<td>1957</td>
		<td>58</td>
	</tr><tr>
		<td>scripts/include.go</td>
		<td></td>
		<td>92</td>
		<td>19</td>
		<td>5</td>
		<td>68</td>
		<td>19</td>
		<td>2140</td>
		<td>64</td>
	</tr><tr>
		<td>processor/similar_flags.go</td>
		<td></td>
		<td>89</td>
		<td>9</td>
		<td>14</td>
		<td>66</td>
		<td>11</td>
		<td>2400</td>
		<td>67</td>
	</tr><tr>
		<td>processor/filereader.go</td>
		<td></td>
		<td>54</td>
		<td>10</td>
		<td>10</td>
		<td>34</td>
		<td>5</td>
		<td>1353</td>
		<td>39</td>
	</tr><tr>
		<td>processor/cocomo.go</td>
		<td></td>
		<td>43</td>
		<td>6</td>
		<td>18</td>
		<td>19</td>
		<td>0</td>
		<td>2209</td>
		<td>35</td>
	</tr><tr>
		<td>processor/bloom.go</td>
		<td></td>
		<td>37</td>
		<td>7</td>
		<td>12</td>
		<td>18</td>
		<td>2</td>
		<td>1062</td>
		<td>29</td>
	</tr><tr>
		<td>processor/cocomo_test.go</td>
		<td></td>
		<td>37</td>
		<td>8</td>
		<td>4</td>
		<td>25</td>
		<td>6</td>
		<td>686</td>
		<td>23</td>
	</tr><tr>
		<td>processor/helpers_test.go</td>
		<td></td>
		<td>26</td>
		<td>6</td>
		<td>1</td>
		<td>19</td>
		<td>4</td>
		<td>434</td>
		<td>18</td>
	</tr><tr>
		<td>processor/helpers.go</td>
		<td></td>
		<td>18</td>
		<td>4</td>
		<td>4</td>
		<td>10</td>
		<td>0</td>
		<td>378</td>
		<td>14</td>
	</tr></tbody>
	<tfoot><tr>
		<th>Total</th>
		<th>32</th>
		<th>26344</th>
		<th>1679</th>
		<th>584</th>
		<th>24081</th>
		<th>1856</th>
		<th>530745</th>
		<th>7733</th>
	</tr>
	<tr>
		<th colspan="9">Estimated Cost to Develop (organic) $762,699<br>Estimated Schedule Effort (organic) 12.41 months<br>Estimated People Required (organic) 5.46<br></th>
	</tr></tfoot>
	</table></body></html>


================================================
FILE: benchmark.sh
================================================
#!/bin/bash

# Assumes we need to install everything from scratch on a box for benchmarking
# Also assumes we have copied the ./examples/performance_tests/create_performance_test.py file to where this is run

apt update
apt install --assume-yes build-essential unzip tmux htop

rm ./*.zip
rm ./*.gz

install_scc_zip() {
    local version=$1
    local url=$2
    wget "$url"
    local file=$(basename "$url")
    unzip "$file"
    mv scc /usr/local/bin/scc${version}
    rm "$file"
}

install_scc_tar() {
    local version=$1
    local url=$2
    wget "$url"
    local file=$(basename "$url")
    tar zxvf "$file"
    mv scc /usr/local/bin/scc${version}
    rm "$file"
}

# v1.x zip releases
ZIP_VERSIONS=(
    "1.0.0 https://github.com/boyter/scc/releases/download/v1.0.0/scc-1.0.0-x86_64-unknown-linux.zip"
    "1.1.0 https://github.com/boyter/scc/releases/download/v1.1.0/scc-1.1.0-x86_64-unknown-linux.zip"
    "1.2.0 https://github.com/boyter/scc/releases/download/v1.2.0/scc-1.2.0-x86_64-unknown-linux.zip"
    "1.3.0 https://github.com/boyter/scc/releases/download/untagged-928286b8064e2cf6dd35/scc-1.3.0-x86_64-unknown-linux.zip"
    "1.4.0 https://github.com/boyter/scc/releases/download/v1.4.0/scc-1.4.0-x86_64-unknown-linux.zip"
    "1.5.0 https://github.com/boyter/scc/releases/download/v1.5.0/scc-1.5.0-x86_64-unknown-linux.zip"
    "1.6.0 https://github.com/boyter/scc/releases/download/v1.6.0/scc-1.6.0-x86_64-unknown-linux.zip"
    "1.7.0 https://github.com/boyter/scc/releases/download/v1.7.0/scc-1.7.0-x86_64-unknown-linux.zip"
    "1.8.0 https://github.com/boyter/scc/releases/download/v1.8.0/scc-1.8.0-x86_64-unknown-linux.zip"
    "1.9.0 https://github.com/boyter/scc/releases/download/v1.9.0/scc-1.9.0-x86_64-unknown-linux.zip"
    "1.10.0 https://github.com/boyter/scc/releases/download/v1.10.0/scc-1.0.0-x86_64-unknown-linux.zip"
    "1.11.0 https://github.com/boyter/scc/releases/download/v1.11.0/scc-1.11.0-x86_64-unknown-linux.zip"
    "1.12.0 https://github.com/boyter/scc/releases/download/v1.12.0/scc-1.12.0-x86_64-unknown-linux.zip"
    "1.12.1 https://github.com/boyter/scc/releases/download/v1.12.1/scc-1.12.1-x86_64-unknown-linux.zip"
)

# v2.x zip releases
ZIP_VERSIONS+=(
    "2.0.0 https://github.com/boyter/scc/releases/download/v2.0.0/scc-2.0.0-x86_64-unknown-linux.zip"
    "2.1.0 https://github.com/boyter/scc/releases/download/v2.1.0/scc-2.1.0-x86_64-unknown-linux.zip"
    "2.2.0 https://github.com/boyter/scc/releases/download/v2.2.0/scc-2.2.0-x86_64-unknown-linux.zip"
    "2.3.0 https://github.com/boyter/scc/releases/download/v2.3.0/scc-2.3.0-x86_64-unknown-linux.zip"
    "2.4.0 https://github.com/boyter/scc/releases/download/v2.4.0/scc-2.4.0-x86_64-unknown-linux.zip"
    "2.5.0 https://github.com/boyter/scc/releases/download/v2.5.0/scc-2.5.0-x86_64-unknown-linux.zip"
    "2.6.0 https://github.com/boyter/scc/releases/download/v2.6.0/scc-2.6.0-x86_64-unknown-linux.zip"
    "2.7.0 https://github.com/boyter/scc/releases/download/v2.7.0/scc-2.7.0-x86_64-unknown-linux.zip"
    "2.8.0 https://github.com/boyter/scc/releases/download/v2.8.0/scc-2.8.0-x86_64-unknown-linux.zip"
    "2.9.0 https://github.com/boyter/scc/releases/download/v2.9.0/scc-2.9.0-x86_64-unknown-linux.zip"
    "2.9.1 https://github.com/boyter/scc/releases/download/v2.9.1/scc-2.9.1-x86_64-unknown-linux.zip"
    "2.10.0 https://github.com/boyter/scc/releases/download/v2.10.0/scc-2.10.0-x86_64-unknown-linux.zip"
    "2.11.0 https://github.com/boyter/scc/releases/download/v2.11.0/scc-2.11.0-x86_64-unknown-linux.zip"
    "2.12.0 https://github.com/boyter/scc/releases/download/v2.12.0/scc-2.12.0-x86_64-unknown-linux.zip"
    "2.13.0 https://github.com/boyter/scc/releases/download/v2.13.0/scc-2.13.0-x86_64-unknown-linux.zip"
)

# v3.0.0 is a zip
ZIP_VERSIONS+=(
    "3.0.0 https://github.com/boyter/scc/releases/download/v3.0.0/scc-3.0.0-x86_64-unknown-linux.zip"
)

# v3.1.0 has a versioned tar name
TAR_VERSIONS=(
    "3.1.0 https://github.com/boyter/scc/releases/download/v3.1.0/scc_3.1.0_Linux_x86_64.tar.gz"
)

# v3.2.0+ use the generic tar name
GENERIC_TAR_VERSIONS=(3.2.0 3.3.0 3.3.2 3.3.3 3.3.4 3.4.0 3.5.0 3.6.0 3.7.0)

# Install all zip versions
for entry in "${ZIP_VERSIONS[@]}"; do
    version=${entry%% *}
    url=${entry#* }
    install_scc_zip "$version" "$url"
done

# Install versioned tar
for entry in "${TAR_VERSIONS[@]}"; do
    version=${entry%% *}
    url=${entry#* }
    install_scc_tar "$version" "$url"
done

# Install generic-named tar versions
for version in "${GENERIC_TAR_VERSIONS[@]}"; do
    install_scc_tar "$version" "https://github.com/boyter/scc/releases/download/v${version}/scc_Linux_x86_64.tar.gz"
done

# Make the latest version available as just 'scc'
cp /usr/local/bin/scc${GENERIC_TAR_VERSIONS[-1]} /usr/local/bin/scc

# Collect all scc version names for hyperfine
ALL_VERSIONS=()
for entry in "${ZIP_VERSIONS[@]}"; do
    ALL_VERSIONS+=("${entry%% *}")
done
for entry in "${TAR_VERSIONS[@]}"; do
    ALL_VERSIONS+=("${entry%% *}")
done
for v in "${GENERIC_TAR_VERSIONS[@]}"; do
    ALL_VERSIONS+=("$v")
done

build_hyperfine_args() {
    local target=$1
    local args=()
    for v in "${ALL_VERSIONS[@]}"; do
        args+=("scc${v} ${target}")
    done
    printf "'%s' " "${args[@]}"
}

# Now setup comparison applications starting with hyperfine which we compare against

wget https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-x86_64-unknown-linux-musl.tar.gz
tar zxvf hyperfine-v1.18.0-x86_64-unknown-linux-musl.tar.gz
mv hyperfine-v1.18.0-x86_64-unknown-linux-musl/hyperfine /usr/local/bin/hyperfine
chmod +x /usr/local/bin/hyperfine

# Now the comparison applications

wget https://github.com/XAMPPRocky/tokei/releases/download/v12.1.2/tokei-x86_64-unknown-linux-musl.tar.gz
tar zxvf tokei-x86_64-unknown-linux-musl.tar.gz
chmod +x ./tokei
mv ./tokei /usr/local/bin/

wget https://github.com/vmchale/polyglot/releases/download/0.5.29/poly-x86_64-unknown-linux-gcc-9
mv poly-x86_64-unknown-linux-gcc-9 /usr/local/bin/polyglot
chmod +x /usr/local/bin/polyglot

# Now setup all of the benchmarks

# Clone the stuff we want to test
rm -rf valkey
rm -rf cpython
rm -rf linux
rm -rf sourcegraph

git clone --depth=1 https://github.com/valkey-io/valkey.git
git clone --depth=1 https://github.com/python/cpython.git
git clone --depth=1 https://github.com/torvalds/linux.git
git clone --depth=1 https://github.com/SINTEF/sourcegraph.git

echo "Running regression benchmark"
eval hyperfine --export-json benchmark_regression.json $(build_hyperfine_args linux) > benchmark_regression.txt

echo "Generating chart"
python3 benchmark_to_chart.py benchmark_regression.json "scc performance linux kernel" > benchmark_chart.html

# Benchmark against everything
echo "Running valkey benchmark"
hyperfine 'scc valkey' 'scc -c valkey' 'tokei valkey' 'polyglot valkey' > benchmark_valkey.txt

echo "Running cpython benchmark"
hyperfine 'scc cpython' 'scc -c cpython' 'tokei cpython' 'polyglot cpython' > benchmark_cpython.txt

echo "Running sourcegraph benchmark"
hyperfine 'scc sourcegraph' 'scc -c sourcegraph' 'tokei sourcegraph' 'polyglot sourcegraph' > benchmark_sourcegraph.txt

echo "Running linux benchmark"
hyperfine 'scc linux' 'scc -c linux' 'tokei linux' 'polyglot linux' > benchmark_linux.txt

echo "All done!"


================================================
FILE: benchmark_to_chart.py
================================================
#!/usr/bin/env python3
"""Convert hyperfine JSON output from benchmark.sh into a Google Charts HTML page."""

import json
import re
import sys


def extract_version(command):
    """Extract version from a command like 'scc3.4.0 linux'."""
    m = re.match(r'scc(\d+\.\d+\.\d+)', command)
    return m.group(1) if m else command


def main():
    if len(sys.argv) < 2:
        print(f"Usage: {sys.argv[0]} benchmark_regression.json [title]")
        sys.exit(1)

    json_file = sys.argv[1]
    title = sys.argv[2] if len(sys.argv) > 2 else "scc performance linux kernel"

    with open(json_file) as f:
        data = json.load(f)

    rows = []
    for result in data["results"]:
        version = extract_version(result["command"])
        mean = result["mean"]
        rows.append(f"          ['{version}', {mean:.3f}]")

    chart_data = ",\n".join(rows)

    html = f"""<!DOCTYPE html>
<html>
<head>
  <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
  <script type="text/javascript">
    google.charts.load('current', {{'packages':['corechart']}});
    google.charts.setOnLoadCallback(drawChart);

    function drawChart() {{
      var data = google.visualization.arrayToDataTable([
        ['Version', 'Runtime (seconds)'],
{chart_data}
      ]);

      var options = {{
        title: '{title}',
        curveType: 'function',
        legend: {{ position: 'bottom' }}
      }};

      var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
      chart.draw(data, options);
    }}
  </script>
</head>
<body>
  <div id="curve_chart" style="width: 900px; height: 500px"></div>
</body>
</html>
"""

    print(html)


if __name__ == "__main__":
    main()


================================================
FILE: examples/complexity/complexity.cpp
================================================
// 4 Complexity
#include <iostream>

int main()
{
    int i = 0;
    while(1) {
        std::cin >> i;
        if(i == 0) {
            return 0;
        }
        switch(i) {
        case 1:
            std::cout << "one\n";
            break;
        case 2:
            std::cout << "two\n";
            break;
        case 3:
            std::cout << "three\n";
        default:
            std::cout << "try again\n";
        }
    }
}


================================================
FILE: examples/complexity/complexity.java
================================================
printf(" /* ");
for (i = 0; i < 100; i++) {
    a += i;
}
printf(" */ ");

================================================
FILE: examples/countas/test.jsp
================================================
this should be counted as HTML using countas rules

================================================
FILE: examples/countas/test.new
================================================
this should be counted as java using the countas rules

================================================
FILE: examples/duplicates/1.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/10.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/11.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/12.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/13.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/14.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/15.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/16.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/17.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/18.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/19.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/2.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/20.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/3.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntries;
        }

        @Override
        protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
            return super.size() > maxEntries;
        }
    }

}


================================================
FILE: examples/duplicates/4.java
================================================
package com.boyter.SpellingCorrector;

import java.util.*;
import java.util.stream.Stream;

/**
 * A simple spell checker based on a few implementations such as the infamous Peter Noving spell checker and
 * the like. Attempts to be highly performing by never changing the first character since we can assume that the
 * user got that correct.
 */
public class SpellingCorrector implements ISpellingCorrector {

    // word to count map - how may times a word is present - or a weight attached to a word
    private Map<String, Integer> dictionary = null;

    public SpellingCorrector(int lruCount) {
        this.dictionary = Collections.synchronizedMap(new LruCache<>(lruCount));
    }

    @Override
    public void putWord(String word) {
        word = word.toLowerCase();
        if (dictionary.containsKey(word)) {
            dictionary.put(word, (dictionary.get(word) + 1));
        }
        else {
            dictionary.put(word, 1);
        }
    }

    @Override
    public String correct(String word) {
        if (word == null || word.trim().isEmpty()) {
            return word;
        }

        word = word.toLowerCase();

        // If the word exists in our dictionary then return
        if (dictionary.containsKey(word)) {
            return word;
        }

        Map<String, Integer> possibleMatches = new HashMap<>();

        List<String> closeEdits = wordEdits(word);
        for (String closeEdit: closeEdits) {
            if (dictionary.containsKey(closeEdit)) {
                possibleMatches.put(closeEdit, this.dictionary.get(closeEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }

        // Ok we did't find anything, so lets run the edits function on the previous results and use those
        // this gives us results which are 2 characters away from whatever was entered
        List<String> furtherEdits = new ArrayList<>();
        for(String closeEdit: closeEdits) {
            furtherEdits.addAll(this.wordEdits(closeEdit));
        }

        for (String futherEdit: furtherEdits) {
            if (dictionary.containsKey(futherEdit)) {
                possibleMatches.put(futherEdit, this.dictionary.get(futherEdit));
            }
        }

        if (!possibleMatches.isEmpty()) {
            // Sorted least likely first
            Object[] matches = this.sortByValue(possibleMatches).keySet().toArray();

            // Try to match anything of the same length first
            String bestMatch = "";
            for(Object o: matches) {
                if (o.toString().length() == word.length()) {
                    bestMatch = o.toString();
                }
            }

            if (!bestMatch.trim().isEmpty()) {
                return bestMatch;
            }

            // Just return whatever is the best match
            return matches[matches.length - 1].toString();
        }


        // If unable to find something better return the same string
        return word;
    }

    @Override
    public boolean containsWord(String word) {
        if (dictionary.containsKey(word)) {
            return true;
        }

        return false;
    }


    /**
     * Return a list of strings which are words similar to our one which could potentially be misspellings
     * Abuse the fact that a char can be used as an integer
     * Assume that they got the first letter correct for all edits to cut on CPU burn time
     */
    private List<String> wordEdits(String word) {
        List<String> closeWords = new ArrayList<String>();

        for (int i = 1; i < word.length() + 1; i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they forgot to type a letter? Try adding one
                StringBuilder sb = new StringBuilder(word);
                sb.insert(i, character);
                closeWords.add(sb.toString());
            }
        }

        for (int i = 1; i < word.length(); i++) {
            for (char character = 'a'; character <= 'z'; character++) {
                // Maybe they mistyped a single letter? Try replacing them all
                StringBuilder sb = new StringBuilder(word);
                sb.setCharAt(i, character);
                closeWords.add(sb.toString());

                // Maybe they added an extra letter? Try deleting one
                sb = new StringBuilder(word);
                sb.deleteCharAt(i);
                closeWords.add(sb.toString());
            }
        }

        return closeWords;
    }


    /**
     * Sorts a map by value taken from
     * http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
     */
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

    /**
     * A very simple LRU cache implementation that can be used for random data types.
     */
    public class LruCache<A, B> extends LinkedHashMap<A, B> {
        private final int maxEntries;

        public LruCache(final int maxEntries) {
            super(maxEntries + 1, 1.0f, true);
            this.maxEntries = maxEntr
Download .txt
gitextract_j2nq6hjf/

├── .devcontainer/
│   └── devcontainer.json
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── docker-publish.yml
│       └── go.yml
├── .gitignore
├── .goreleaser.yml
├── .ignore
├── .sccignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LANGUAGES.md
├── LICENSE
├── README.md
├── SCC-OUTPUT-REPORT.html
├── benchmark.sh
├── benchmark_to_chart.py
├── examples/
│   ├── complexity/
│   │   ├── complexity.cpp
│   │   └── complexity.java
│   ├── countas/
│   │   ├── test.jsp
│   │   └── test.new
│   ├── duplicates/
│   │   ├── 1.java
│   │   ├── 10.java
│   │   ├── 11.java
│   │   ├── 12.java
│   │   ├── 13.java
│   │   ├── 14.java
│   │   ├── 15.java
│   │   ├── 16.java
│   │   ├── 17.java
│   │   ├── 18.java
│   │   ├── 19.java
│   │   ├── 2.java
│   │   ├── 20.java
│   │   ├── 3.java
│   │   ├── 4.java
│   │   ├── 5.java
│   │   ├── 6.java
│   │   ├── 7.java
│   │   ├── 8.java
│   │   └── 9.java
│   ├── generated/
│   │   ├── test.cs
│   │   └── test.h
│   ├── issue114/
│   │   ├── .gitignore
│   │   ├── .ignore
│   │   ├── .travis.yml
│   │   ├── java
│   │   ├── license
│   │   └── makefile
│   ├── issue120/
│   │   ├── test
│   │   └── test.java
│   ├── issue152/
│   │   └── example.black.css
│   ├── issue214/
│   │   ├── ббббббббббббббббббббббббббббббббб.md
│   │   ├── ѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬ.md
│   │   └── 中文中文中文中文中文中文中文中文中文中文中文中文中文中文中文中文.md
│   ├── issue246.py
│   ├── issue260/
│   │   └── test.c
│   ├── issue323/
│   │   ├── a.php
│   │   └── b.php
│   ├── issue339/
│   │   ├── matlab.m
│   │   └── objectivec.m
│   ├── issue345/
│   │   └── filename.cc
│   ├── issue379/
│   │   └── filename.py
│   ├── issue552/
│   │   └── test.txt
│   ├── issue564/
│   │   ├── a/
│   │   │   └── level1/
│   │   │       └── level2/
│   │   │           └── test.py
│   │   ├── b/
│   │   │   └── c/
│   │   │       └── level2/
│   │   │           └── test.py
│   │   ├── level1/
│   │   │   ├── level2/
│   │   │   │   └── test.py
│   │   │   └── test.go
│   │   └── test.go
│   ├── issue610/
│   │   └── issue610.ts
│   ├── language/
│   │   ├── .bash_login
│   │   ├── .cshrc
│   │   ├── .dockerignore
│   │   ├── .ignore
│   │   ├── .kshrc
│   │   ├── .tcshrc
│   │   ├── .zshrc
│   │   ├── Amber.ab
│   │   ├── ArkTs.ets
│   │   ├── Blueprint.blp
│   │   ├── Build.csx
│   │   ├── CMakeLists.txt
│   │   ├── Dockerfile
│   │   ├── FSharp.fs
│   │   ├── GNUMakefile
│   │   ├── Gemfile
│   │   ├── HassIQApp.mc
│   │   ├── MLIR.mlir
│   │   ├── POML.poml
│   │   ├── PostScript.ps
│   │   ├── Rakefile
│   │   ├── Sally.yarn
│   │   ├── TOML.toml
│   │   ├── TOON.toon
│   │   ├── abnf.abnf
│   │   ├── alchemist.crn
│   │   ├── algol68.a68
│   │   ├── apex.apex
│   │   ├── arturo.art
│   │   ├── astro.astro
│   │   ├── barber_solutions.als
│   │   ├── bean.beancount
│   │   ├── bicep.bicep
│   │   ├── bitbucket-pipelines.yml
│   │   ├── boo.boo
│   │   ├── bosque.bsq
│   │   ├── bru.bru
│   │   ├── c3.c3
│   │   ├── cairo.cairo
│   │   ├── capnproto.capnp
│   │   ├── chapel.chpl
│   │   ├── circom.circom
│   │   ├── clojure.cljc
│   │   ├── cloudformation.json
│   │   ├── cloudformation.yml
│   │   ├── component.templ
│   │   ├── cuda.cu
│   │   ├── cypher.cypher
│   │   ├── d2.d2
│   │   ├── daml.daml
│   │   ├── docker.nu
│   │   ├── dot.gv
│   │   ├── elixirtemplate.eex
│   │   ├── elm.elm
│   │   ├── emit.emit
│   │   ├── factor.factor
│   │   ├── flow9.flow
│   │   ├── fsl.fsl
│   │   ├── fxml.fxml
│   │   ├── gleam.gleam
│   │   ├── go.go
│   │   ├── godot.tscn
│   │   ├── goplus.gop
│   │   ├── graphql.graphql
│   │   ├── gremlin.gremlin
│   │   ├── gwion.gw
│   │   ├── haml.haml
│   │   ├── hare.ha
│   │   ├── haskell.hs
│   │   ├── hcl.hcl
│   │   ├── ini.ini
│   │   ├── javascript.js
│   │   ├── jcl.jcl
│   │   ├── jq.jq
│   │   ├── jsonc.jsonc
│   │   ├── jsonnet.jsonnet
│   │   ├── kitchen-sink.json5
│   │   ├── koto.koto
│   │   ├── lalrpop.lalrpop
│   │   ├── license
│   │   ├── linear_solve.fut
│   │   ├── livescript.ls
│   │   ├── llvmir.ll
│   │   ├── lua.lua
│   │   ├── luau.luau
│   │   ├── luna.luna
│   │   ├── main.cj
│   │   ├── makefile
│   │   ├── metal.metal
│   │   ├── mojo.mojo
│   │   ├── moonbit.mbt
│   │   ├── nature.n
│   │   ├── nawk.awk
│   │   ├── perl.pl
│   │   ├── pkl.pkl
│   │   ├── plain.txt
│   │   ├── python.py
│   │   ├── qasm.qasm
│   │   ├── qsharp.qs
│   │   ├── racket.rkt
│   │   ├── raml.raml
│   │   ├── rebol.reb
│   │   ├── redscript.reds
│   │   ├── rscript.r
│   │   ├── rtf.rtf
│   │   ├── scallop.scl
│   │   ├── seed7.sd7
│   │   ├── slang.slang
│   │   ├── slint.slint
│   │   ├── smalltalk.cs.st
│   │   ├── snakefile.smk
│   │   ├── stan.stan
│   │   ├── syntax.wren
│   │   ├── systemd.service
│   │   ├── tact.tact
│   │   ├── teal.teal
│   │   ├── tera.tera
│   │   ├── test.ch
│   │   ├── test.dm
│   │   ├── test.java
│   │   ├── test.prg
│   │   ├── test.sieve
│   │   ├── test.tf
│   │   ├── test.tofu
│   │   ├── textile.textile
│   │   ├── ttcn.ttcn
│   │   ├── typescript.ts
│   │   ├── typespec.tsp
│   │   ├── typst.typ
│   │   ├── up.up
│   │   ├── vala.vala
│   │   ├── version.rc
│   │   ├── vim.vim
│   │   ├── wenyan.wy
│   │   ├── wsdl.wsdl
│   │   ├── xhtml.xhtml
│   │   ├── xmake.lua
│   │   ├── xmlschema.xsd
│   │   ├── yaml.yml
│   │   ├── zig.zig
│   │   └── zokrates.zok
│   ├── long/
│   │   ├── test.feature
│   │   ├── test.ftl
│   │   ├── test.jsp
│   │   ├── test.mxml
│   │   ├── test.rdl
│   │   ├── test.vcl
│   │   └── test.xslt
│   ├── minified/
│   │   ├── 0-941d61979b9396d94f06.js
│   │   ├── 1-fa6e7d2ffea9ee90c8d8.js
│   │   ├── app-5cddf2000f4491a89a40.js
│   │   ├── component---src-pages-index-tsx-65151e9f2f564e3fe49c.js
│   │   └── webpack-runtime-c6e0a1eee0c3fa087a21.js
│   ├── nolines.py
│   ├── oneline.py
│   ├── onenewline.py
│   ├── performance_tests/
│   │   ├── create_folders_with_files.py
│   │   └── create_performance_test.py
│   ├── remap/
│   │   ├── java.java
│   │   └── unknown
│   ├── shared_extension/
│   │   ├── coq/
│   │   │   └── Qabs.v
│   │   ├── verilog/
│   │   │   └── button_debounce.v
│   │   └── vlang/
│   │       └── users.v
│   ├── symlink/
│   │   └── test.py
│   ├── threenewline.py
│   ├── twolines.py
│   └── twonewline.py
├── go.mod
├── go.sum
├── languages.json
├── main.go
├── main_test.go
├── mcp.go
├── packages/
│   ├── aur/
│   │   └── PKGBUILD
│   └── chocolatey/
│       ├── ReadMe.md
│       ├── scc.nuspec
│       └── tools/
│           ├── LICENSE.txt
│           ├── VERIFICATION.txt
│           ├── chocolateyinstall.ps1
│           └── chocolateyuninstall.ps1
├── processor/
│   ├── bloom.go
│   ├── cocomo.go
│   ├── cocomo_test.go
│   ├── constants.go
│   ├── detector.go
│   ├── detector_test.go
│   ├── file.go
│   ├── file_test.go
│   ├── filereader.go
│   ├── formatters.go
│   ├── formatters_test.go
│   ├── helpers.go
│   ├── helpers_test.go
│   ├── locomo.go
│   ├── locomo_test.go
│   ├── processor.go
│   ├── processor_test.go
│   ├── result.go
│   ├── similar_flags.go
│   ├── similar_flags_test.go
│   ├── structs.go
│   ├── structs_test.go
│   ├── trace.go
│   ├── trace_test.go
│   ├── workers.go
│   ├── workers_regression_test.go
│   ├── workers_test.go
│   └── workers_tokei_test.go
├── scripts/
│   ├── include.go
│   └── languages.tmpl
├── test-all.sh
└── vendor/
    ├── github.com/
    │   ├── agnivade/
    │   │   └── levenshtein/
    │   │       ├── .gitignore
    │   │       ├── License.txt
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       └── levenshtein.go
    │   ├── bahlo/
    │   │   └── generic-list-go/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── list.go
    │   ├── boyter/
    │   │   ├── gocodewalker/
    │   │   │   ├── .gitignore
    │   │   │   ├── .goreleaser.yml
    │   │   │   ├── .ignore
    │   │   │   ├── LICENSE
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── dir_suffix.go
    │   │   │   ├── file.go
    │   │   │   ├── gitmodule.go
    │   │   │   ├── go-gitignore/
    │   │   │   │   ├── LICENSE
    │   │   │   │   ├── README.md
    │   │   │   │   ├── cache.go
    │   │   │   │   ├── doc.go
    │   │   │   │   ├── error.go
    │   │   │   │   ├── errors.go
    │   │   │   │   ├── exclude.go
    │   │   │   │   ├── gitignore.go
    │   │   │   │   ├── lexer.go
    │   │   │   │   ├── match.go
    │   │   │   │   ├── parser.go
    │   │   │   │   ├── pattern.go
    │   │   │   │   ├── position.go
    │   │   │   │   ├── repository.go
    │   │   │   │   ├── rune.go
    │   │   │   │   ├── token.go
    │   │   │   │   ├── tokenset.go
    │   │   │   │   └── tokentype.go
    │   │   │   ├── hidden.go
    │   │   │   └── hidden_windows.go
    │   │   └── simplecache/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── simplecache.go
    │   ├── buger/
    │   │   └── jsonparser/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── Dockerfile
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── bytes.go
    │   │       ├── bytes_safe.go
    │   │       ├── bytes_unsafe.go
    │   │       ├── escape.go
    │   │       ├── fuzz.go
    │   │       ├── oss-fuzz-build.sh
    │   │       └── parser.go
    │   ├── clipperhouse/
    │   │   └── uax29/
    │   │       └── v2/
    │   │           ├── LICENSE
    │   │           ├── graphemes/
    │   │           │   ├── README.md
    │   │           │   ├── iterator.go
    │   │           │   ├── reader.go
    │   │           │   ├── splitfunc.go
    │   │           │   └── trie.go
    │   │           └── internal/
    │   │               └── iterators/
    │   │                   └── iterator.go
    │   ├── danwakefield/
    │   │   └── fnmatch/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── fnmatch.go
    │   ├── google/
    │   │   └── uuid/
    │   │       ├── CHANGELOG.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── CONTRIBUTORS
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── dce.go
    │   │       ├── doc.go
    │   │       ├── hash.go
    │   │       ├── marshal.go
    │   │       ├── node.go
    │   │       ├── node_js.go
    │   │       ├── node_net.go
    │   │       ├── null.go
    │   │       ├── sql.go
    │   │       ├── time.go
    │   │       ├── util.go
    │   │       ├── uuid.go
    │   │       ├── version1.go
    │   │       ├── version4.go
    │   │       ├── version6.go
    │   │       └── version7.go
    │   ├── inconshreveable/
    │   │   └── mousetrap/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── trap_others.go
    │   │       └── trap_windows.go
    │   ├── mailru/
    │   │   └── easyjson/
    │   │       ├── LICENSE
    │   │       ├── buffer/
    │   │       │   └── pool.go
    │   │       └── jwriter/
    │   │           └── writer.go
    │   ├── mark3labs/
    │   │   └── mcp-go/
    │   │       ├── LICENSE
    │   │       ├── mcp/
    │   │       │   ├── consts.go
    │   │       │   ├── errors.go
    │   │       │   ├── prompts.go
    │   │       │   ├── resources.go
    │   │       │   ├── tasks.go
    │   │       │   ├── tools.go
    │   │       │   ├── typed_tools.go
    │   │       │   ├── types.go
    │   │       │   └── utils.go
    │   │       ├── server/
    │   │       │   ├── completion.go
    │   │       │   ├── constants.go
    │   │       │   ├── ctx.go
    │   │       │   ├── elicitation.go
    │   │       │   ├── errors.go
    │   │       │   ├── hooks.go
    │   │       │   ├── http_transport_options.go
    │   │       │   ├── inprocess_session.go
    │   │       │   ├── request_handler.go
    │   │       │   ├── roots.go
    │   │       │   ├── sampling.go
    │   │       │   ├── server.go
    │   │       │   ├── session.go
    │   │       │   ├── sse.go
    │   │       │   ├── stdio.go
    │   │       │   ├── streamable_http.go
    │   │       │   └── task_hooks.go
    │   │       └── util/
    │   │           └── logger.go
    │   ├── mattn/
    │   │   ├── go-colorable/
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── colorable_appengine.go
    │   │   │   ├── colorable_others.go
    │   │   │   ├── colorable_windows.go
    │   │   │   ├── go.test.sh
    │   │   │   └── noncolorable.go
    │   │   ├── go-isatty/
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── doc.go
    │   │   │   ├── go.test.sh
    │   │   │   ├── isatty_bsd.go
    │   │   │   ├── isatty_others.go
    │   │   │   ├── isatty_plan9.go
    │   │   │   ├── isatty_solaris.go
    │   │   │   ├── isatty_tcgets.go
    │   │   │   └── isatty_windows.go
    │   │   └── go-runewidth/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── benchstat.txt
    │   │       ├── new.txt
    │   │       ├── old.txt
    │   │       ├── runewidth.go
    │   │       ├── runewidth_appengine.go
    │   │       ├── runewidth_js.go
    │   │       ├── runewidth_posix.go
    │   │       ├── runewidth_table.go
    │   │       └── runewidth_windows.go
    │   ├── modern-go/
    │   │   └── concurrent/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── executor.go
    │   │       ├── go_above_19.go
    │   │       ├── go_below_19.go
    │   │       ├── log.go
    │   │       ├── test.sh
    │   │       └── unbounded_executor.go
    │   ├── rs/
    │   │   └── zerolog/
    │   │       ├── .gitignore
    │   │       ├── CNAME
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── _config.yml
    │   │       ├── array.go
    │   │       ├── console.go
    │   │       ├── context.go
    │   │       ├── ctx.go
    │   │       ├── encoder.go
    │   │       ├── encoder_cbor.go
    │   │       ├── encoder_json.go
    │   │       ├── event.go
    │   │       ├── fields.go
    │   │       ├── globals.go
    │   │       ├── go112.go
    │   │       ├── hook.go
    │   │       ├── internal/
    │   │       │   ├── cbor/
    │   │       │   │   ├── README.md
    │   │       │   │   ├── base.go
    │   │       │   │   ├── cbor.go
    │   │       │   │   ├── decode_stream.go
    │   │       │   │   ├── string.go
    │   │       │   │   ├── time.go
    │   │       │   │   └── types.go
    │   │       │   └── json/
    │   │       │       ├── base.go
    │   │       │       ├── bytes.go
    │   │       │       ├── string.go
    │   │       │       ├── time.go
    │   │       │       └── types.go
    │   │       ├── log/
    │   │       │   └── log.go
    │   │       ├── log.go
    │   │       ├── not_go112.go
    │   │       ├── sampler.go
    │   │       ├── syslog.go
    │   │       └── writer.go
    │   ├── spf13/
    │   │   ├── cast/
    │   │   │   ├── .gitignore
    │   │   │   ├── LICENSE
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── cast.go
    │   │   │   ├── caste.go
    │   │   │   └── timeformattype_string.go
    │   │   ├── cobra/
    │   │   │   ├── .gitignore
    │   │   │   ├── .golangci.yml
    │   │   │   ├── .mailmap
    │   │   │   ├── CONDUCT.md
    │   │   │   ├── CONTRIBUTING.md
    │   │   │   ├── LICENSE.txt
    │   │   │   ├── MAINTAINERS
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── SECURITY.md
    │   │   │   ├── active_help.go
    │   │   │   ├── args.go
    │   │   │   ├── bash_completions.go
    │   │   │   ├── bash_completionsV2.go
    │   │   │   ├── cobra.go
    │   │   │   ├── command.go
    │   │   │   ├── command_notwin.go
    │   │   │   ├── command_win.go
    │   │   │   ├── completions.go
    │   │   │   ├── fish_completions.go
    │   │   │   ├── flag_groups.go
    │   │   │   ├── powershell_completions.go
    │   │   │   ├── shell_completions.go
    │   │   │   └── zsh_completions.go
    │   │   └── pflag/
    │   │       ├── .editorconfig
    │   │       ├── .gitignore
    │   │       ├── .golangci.yaml
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── bool.go
    │   │       ├── bool_func.go
    │   │       ├── bool_slice.go
    │   │       ├── bytes.go
    │   │       ├── count.go
    │   │       ├── duration.go
    │   │       ├── duration_slice.go
    │   │       ├── errors.go
    │   │       ├── flag.go
    │   │       ├── float32.go
    │   │       ├── float32_slice.go
    │   │       ├── float64.go
    │   │       ├── float64_slice.go
    │   │       ├── func.go
    │   │       ├── golangflag.go
    │   │       ├── int.go
    │   │       ├── int16.go
    │   │       ├── int32.go
    │   │       ├── int32_slice.go
    │   │       ├── int64.go
    │   │       ├── int64_slice.go
    │   │       ├── int8.go
    │   │       ├── int_slice.go
    │   │       ├── ip.go
    │   │       ├── ip_slice.go
    │   │       ├── ipmask.go
    │   │       ├── ipnet.go
    │   │       ├── ipnet_slice.go
    │   │       ├── string.go
    │   │       ├── string_array.go
    │   │       ├── string_slice.go
    │   │       ├── string_to_int.go
    │   │       ├── string_to_int64.go
    │   │       ├── string_to_string.go
    │   │       ├── text.go
    │   │       ├── time.go
    │   │       ├── uint.go
    │   │       ├── uint16.go
    │   │       ├── uint32.go
    │   │       ├── uint64.go
    │   │       ├── uint8.go
    │   │       └── uint_slice.go
    │   └── yosida95/
    │       └── uritemplate/
    │           └── v3/
    │               ├── LICENSE
    │               ├── README.rst
    │               ├── compile.go
    │               ├── equals.go
    │               ├── error.go
    │               ├── escape.go
    │               ├── expression.go
    │               ├── machine.go
    │               ├── match.go
    │               ├── parse.go
    │               ├── prog.go
    │               ├── uritemplate.go
    │               └── value.go
    ├── go.yaml.in/
    │   └── yaml/
    │       └── v2/
    │           ├── .travis.yml
    │           ├── LICENSE
    │           ├── LICENSE.libyaml
    │           ├── NOTICE
    │           ├── README.md
    │           ├── apic.go
    │           ├── decode.go
    │           ├── emitterc.go
    │           ├── encode.go
    │           ├── parserc.go
    │           ├── readerc.go
    │           ├── resolve.go
    │           ├── scannerc.go
    │           ├── sorter.go
    │           ├── writerc.go
    │           ├── yaml.go
    │           ├── yamlh.go
    │           └── yamlprivateh.go
    ├── golang.org/
    │   └── x/
    │       ├── crypto/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── blake2b/
    │       │       ├── blake2b.go
    │       │       ├── blake2bAVX2_amd64.go
    │       │       ├── blake2bAVX2_amd64.s
    │       │       ├── blake2b_amd64.s
    │       │       ├── blake2b_generic.go
    │       │       ├── blake2b_ref.go
    │       │       ├── blake2x.go
    │       │       ├── go125.go
    │       │       └── register.go
    │       ├── sync/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── errgroup/
    │       │       └── errgroup.go
    │       ├── sys/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── cpu/
    │       │   │   ├── asm_aix_ppc64.s
    │       │   │   ├── asm_darwin_x86_gc.s
    │       │   │   ├── byteorder.go
    │       │   │   ├── cpu.go
    │       │   │   ├── cpu_aix.go
    │       │   │   ├── cpu_arm.go
    │       │   │   ├── cpu_arm64.go
    │       │   │   ├── cpu_arm64.s
    │       │   │   ├── cpu_darwin_x86.go
    │       │   │   ├── cpu_gc_arm64.go
    │       │   │   ├── cpu_gc_s390x.go
    │       │   │   ├── cpu_gc_x86.go
    │       │   │   ├── cpu_gc_x86.s
    │       │   │   ├── cpu_gccgo_arm64.go
    │       │   │   ├── cpu_gccgo_s390x.go
    │       │   │   ├── cpu_gccgo_x86.c
    │       │   │   ├── cpu_gccgo_x86.go
    │       │   │   ├── cpu_linux.go
    │       │   │   ├── cpu_linux_arm.go
    │       │   │   ├── cpu_linux_arm64.go
    │       │   │   ├── cpu_linux_loong64.go
    │       │   │   ├── cpu_linux_mips64x.go
    │       │   │   ├── cpu_linux_noinit.go
    │       │   │   ├── cpu_linux_ppc64x.go
    │       │   │   ├── cpu_linux_riscv64.go
    │       │   │   ├── cpu_linux_s390x.go
    │       │   │   ├── cpu_loong64.go
    │       │   │   ├── cpu_loong64.s
    │       │   │   ├── cpu_mips64x.go
    │       │   │   ├── cpu_mipsx.go
    │       │   │   ├── cpu_netbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.s
    │       │   │   ├── cpu_other_arm.go
    │       │   │   ├── cpu_other_arm64.go
    │       │   │   ├── cpu_other_mips64x.go
    │       │   │   ├── cpu_other_ppc64x.go
    │       │   │   ├── cpu_other_riscv64.go
    │       │   │   ├── cpu_other_x86.go
    │       │   │   ├── cpu_ppc64x.go
    │       │   │   ├── cpu_riscv64.go
    │       │   │   ├── cpu_s390x.go
    │       │   │   ├── cpu_s390x.s
    │       │   │   ├── cpu_wasm.go
    │       │   │   ├── cpu_x86.go
    │       │   │   ├── cpu_zos.go
    │       │   │   ├── cpu_zos_s390x.go
    │       │   │   ├── endian_big.go
    │       │   │   ├── endian_little.go
    │       │   │   ├── hwcap_linux.go
    │       │   │   ├── parse.go
    │       │   │   ├── proc_cpuinfo_linux.go
    │       │   │   ├── runtime_auxv.go
    │       │   │   ├── runtime_auxv_go121.go
    │       │   │   ├── syscall_aix_gccgo.go
    │       │   │   ├── syscall_aix_ppc64_gc.go
    │       │   │   └── syscall_darwin_x86_gc.go
    │       │   └── unix/
    │       │       ├── .gitignore
    │       │       ├── README.md
    │       │       ├── affinity_linux.go
    │       │       ├── aliases.go
    │       │       ├── asm_aix_ppc64.s
    │       │       ├── asm_bsd_386.s
    │       │       ├── asm_bsd_amd64.s
    │       │       ├── asm_bsd_arm.s
    │       │       ├── asm_bsd_arm64.s
    │       │       ├── asm_bsd_ppc64.s
    │       │       ├── asm_bsd_riscv64.s
    │       │       ├── asm_linux_386.s
    │       │       ├── asm_linux_amd64.s
    │       │       ├── asm_linux_arm.s
    │       │       ├── asm_linux_arm64.s
    │       │       ├── asm_linux_loong64.s
    │       │       ├── asm_linux_mips64x.s
    │       │       ├── asm_linux_mipsx.s
    │       │       ├── asm_linux_ppc64x.s
    │       │       ├── asm_linux_riscv64.s
    │       │       ├── asm_linux_s390x.s
    │       │       ├── asm_openbsd_mips64.s
    │       │       ├── asm_solaris_amd64.s
    │       │       ├── asm_zos_s390x.s
    │       │       ├── auxv.go
    │       │       ├── auxv_unsupported.go
    │       │       ├── bluetooth_linux.go
    │       │       ├── bpxsvc_zos.go
    │       │       ├── bpxsvc_zos.s
    │       │       ├── cap_freebsd.go
    │       │       ├── constants.go
    │       │       ├── dev_aix_ppc.go
    │       │       ├── dev_aix_ppc64.go
    │       │       ├── dev_darwin.go
    │       │       ├── dev_dragonfly.go
    │       │       ├── dev_freebsd.go
    │       │       ├── dev_linux.go
    │       │       ├── dev_netbsd.go
    │       │       ├── dev_openbsd.go
    │       │       ├── dev_zos.go
    │       │       ├── dirent.go
    │       │       ├── endian_big.go
    │       │       ├── endian_little.go
    │       │       ├── env_unix.go
    │       │       ├── fcntl.go
    │       │       ├── fcntl_darwin.go
    │       │       ├── fcntl_linux_32bit.go
    │       │       ├── fdset.go
    │       │       ├── gccgo.go
    │       │       ├── gccgo_c.c
    │       │       ├── gccgo_linux_amd64.go
    │       │       ├── ifreq_linux.go
    │       │       ├── ioctl_linux.go
    │       │       ├── ioctl_signed.go
    │       │       ├── ioctl_unsigned.go
    │       │       ├── ioctl_zos.go
    │       │       ├── mkall.sh
    │       │       ├── mkerrors.sh
    │       │       ├── mmap_nomremap.go
    │       │       ├── mremap.go
    │       │       ├── pagesize_unix.go
    │       │       ├── pledge_openbsd.go
    │       │       ├── ptrace_darwin.go
    │       │       ├── ptrace_ios.go
    │       │       ├── race.go
    │       │       ├── race0.go
    │       │       ├── readdirent_getdents.go
    │       │       ├── readdirent_getdirentries.go
    │       │       ├── sockcmsg_dragonfly.go
    │       │       ├── sockcmsg_linux.go
    │       │       ├── sockcmsg_unix.go
    │       │       ├── sockcmsg_unix_other.go
    │       │       ├── sockcmsg_zos.go
    │       │       ├── symaddr_zos_s390x.s
    │       │       ├── syscall.go
    │       │       ├── syscall_aix.go
    │       │       ├── syscall_aix_ppc.go
    │       │       ├── syscall_aix_ppc64.go
    │       │       ├── syscall_bsd.go
    │       │       ├── syscall_darwin.go
    │       │       ├── syscall_darwin_amd64.go
    │       │       ├── syscall_darwin_arm64.go
    │       │       ├── syscall_darwin_libSystem.go
    │       │       ├── syscall_dragonfly.go
    │       │       ├── syscall_dragonfly_amd64.go
    │       │       ├── syscall_freebsd.go
    │       │       ├── syscall_freebsd_386.go
    │       │       ├── syscall_freebsd_amd64.go
    │       │       ├── syscall_freebsd_arm.go
    │       │       ├── syscall_freebsd_arm64.go
    │       │       ├── syscall_freebsd_riscv64.go
    │       │       ├── syscall_hurd.go
    │       │       ├── syscall_hurd_386.go
    │       │       ├── syscall_illumos.go
    │       │       ├── syscall_linux.go
    │       │       ├── syscall_linux_386.go
    │       │       ├── syscall_linux_alarm.go
    │       │       ├── syscall_linux_amd64.go
    │       │       ├── syscall_linux_amd64_gc.go
    │       │       ├── syscall_linux_arm.go
    │       │       ├── syscall_linux_arm64.go
    │       │       ├── syscall_linux_gc.go
    │       │       ├── syscall_linux_gc_386.go
    │       │       ├── syscall_linux_gc_arm.go
    │       │       ├── syscall_linux_gccgo_386.go
    │       │       ├── syscall_linux_gccgo_arm.go
    │       │       ├── syscall_linux_loong64.go
    │       │       ├── syscall_linux_mips64x.go
    │       │       ├── syscall_linux_mipsx.go
    │       │       ├── syscall_linux_ppc.go
    │       │       ├── syscall_linux_ppc64x.go
    │       │       ├── syscall_linux_riscv64.go
    │       │       ├── syscall_linux_s390x.go
    │       │       ├── syscall_linux_sparc64.go
    │       │       ├── syscall_netbsd.go
    │       │       ├── syscall_netbsd_386.go
    │       │       ├── syscall_netbsd_amd64.go
    │       │       ├── syscall_netbsd_arm.go
    │       │       ├── syscall_netbsd_arm64.go
    │       │       ├── syscall_openbsd.go
    │       │       ├── syscall_openbsd_386.go
    │       │       ├── syscall_openbsd_amd64.go
    │       │       ├── syscall_openbsd_arm.go
    │       │       ├── syscall_openbsd_arm64.go
    │       │       ├── syscall_openbsd_libc.go
    │       │       ├── syscall_openbsd_mips64.go
    │       │       ├── syscall_openbsd_ppc64.go
    │       │       ├── syscall_openbsd_riscv64.go
    │       │       ├── syscall_solaris.go
    │       │       ├── syscall_solaris_amd64.go
    │       │       ├── syscall_unix.go
    │       │       ├── syscall_unix_gc.go
    │       │       ├── syscall_unix_gc_ppc64x.go
    │       │       ├── syscall_zos_s390x.go
    │       │       ├── sysvshm_linux.go
    │       │       ├── sysvshm_unix.go
    │       │       ├── sysvshm_unix_other.go
    │       │       ├── timestruct.go
    │       │       ├── unveil_openbsd.go
    │       │       ├── vgetrandom_linux.go
    │       │       ├── vgetrandom_unsupported.go
    │       │       ├── xattr_bsd.go
    │       │       ├── zerrors_aix_ppc.go
    │       │       ├── zerrors_aix_ppc64.go
    │       │       ├── zerrors_darwin_amd64.go
    │       │       ├── zerrors_darwin_arm64.go
    │       │       ├── zerrors_dragonfly_amd64.go
    │       │       ├── zerrors_freebsd_386.go
    │       │       ├── zerrors_freebsd_amd64.go
    │       │       ├── zerrors_freebsd_arm.go
    │       │       ├── zerrors_freebsd_arm64.go
    │       │       ├── zerrors_freebsd_riscv64.go
    │       │       ├── zerrors_linux.go
    │       │       ├── zerrors_linux_386.go
    │       │       ├── zerrors_linux_amd64.go
    │       │       ├── zerrors_linux_arm.go
    │       │       ├── zerrors_linux_arm64.go
    │       │       ├── zerrors_linux_loong64.go
    │       │       ├── zerrors_linux_mips.go
    │       │       ├── zerrors_linux_mips64.go
    │       │       ├── zerrors_linux_mips64le.go
    │       │       ├── zerrors_linux_mipsle.go
    │       │       ├── zerrors_linux_ppc.go
    │       │       ├── zerrors_linux_ppc64.go
    │       │       ├── zerrors_linux_ppc64le.go
    │       │       ├── zerrors_linux_riscv64.go
    │       │       ├── zerrors_linux_s390x.go
    │       │       ├── zerrors_linux_sparc64.go
    │       │       ├── zerrors_netbsd_386.go
    │       │       ├── zerrors_netbsd_amd64.go
    │       │       ├── zerrors_netbsd_arm.go
    │       │       ├── zerrors_netbsd_arm64.go
    │       │       ├── zerrors_openbsd_386.go
    │       │       ├── zerrors_openbsd_amd64.go
    │       │       ├── zerrors_openbsd_arm.go
    │       │       ├── zerrors_openbsd_arm64.go
    │       │       ├── zerrors_openbsd_mips64.go
    │       │       ├── zerrors_openbsd_ppc64.go
    │       │       ├── zerrors_openbsd_riscv64.go
    │       │       ├── zerrors_solaris_amd64.go
    │       │       ├── zerrors_zos_s390x.go
    │       │       ├── zptrace_armnn_linux.go
    │       │       ├── zptrace_linux_arm64.go
    │       │       ├── zptrace_mipsnn_linux.go
    │       │       ├── zptrace_mipsnnle_linux.go
    │       │       ├── zptrace_x86_linux.go
    │       │       ├── zsymaddr_zos_s390x.s
    │       │       ├── zsyscall_aix_ppc.go
    │       │       ├── zsyscall_aix_ppc64.go
    │       │       ├── zsyscall_aix_ppc64_gc.go
    │       │       ├── zsyscall_aix_ppc64_gccgo.go
    │       │       ├── zsyscall_darwin_amd64.go
    │       │       ├── zsyscall_darwin_amd64.s
    │       │       ├── zsyscall_darwin_arm64.go
    │       │       ├── zsyscall_darwin_arm64.s
    │       │       ├── zsyscall_dragonfly_amd64.go
    │       │       ├── zsyscall_freebsd_386.go
    │       │       ├── zsyscall_freebsd_amd64.go
    │       │       ├── zsyscall_freebsd_arm.go
    │       │       ├── zsyscall_freebsd_arm64.go
    │       │       ├── zsyscall_freebsd_riscv64.go
    │       │       ├── zsyscall_illumos_amd64.go
    │       │       ├── zsyscall_linux.go
    │       │       ├── zsyscall_linux_386.go
    │       │       ├── zsyscall_linux_amd64.go
    │       │       ├── zsyscall_linux_arm.go
    │       │       ├── zsyscall_linux_arm64.go
    │       │       ├── zsyscall_linux_loong64.go
    │       │       ├── zsyscall_linux_mips.go
    │       │       ├── zsyscall_linux_mips64.go
    │       │       ├── zsyscall_linux_mips64le.go
    │       │       ├── zsyscall_linux_mipsle.go
    │       │       ├── zsyscall_linux_ppc.go
    │       │       ├── zsyscall_linux_ppc64.go
    │       │       ├── zsyscall_linux_ppc64le.go
    │       │       ├── zsyscall_linux_riscv64.go
    │       │       ├── zsyscall_linux_s390x.go
    │       │       ├── zsyscall_linux_sparc64.go
    │       │       ├── zsyscall_netbsd_386.go
    │       │       ├── zsyscall_netbsd_amd64.go
    │       │       ├── zsyscall_netbsd_arm.go
    │       │       ├── zsyscall_netbsd_arm64.go
    │       │       ├── zsyscall_openbsd_386.go
    │       │       ├── zsyscall_openbsd_386.s
    │       │       ├── zsyscall_openbsd_amd64.go
    │       │       ├── zsyscall_openbsd_amd64.s
    │       │       ├── zsyscall_openbsd_arm.go
    │       │       ├── zsyscall_openbsd_arm.s
    │       │       ├── zsyscall_openbsd_arm64.go
    │       │       ├── zsyscall_openbsd_arm64.s
    │       │       ├── zsyscall_openbsd_mips64.go
    │       │       ├── zsyscall_openbsd_mips64.s
    │       │       ├── zsyscall_openbsd_ppc64.go
    │       │       ├── zsyscall_openbsd_ppc64.s
    │       │       ├── zsyscall_openbsd_riscv64.go
    │       │       ├── zsyscall_openbsd_riscv64.s
    │       │       ├── zsyscall_solaris_amd64.go
    │       │       ├── zsyscall_zos_s390x.go
    │       │       ├── zsysctl_openbsd_386.go
    │       │       ├── zsysctl_openbsd_amd64.go
    │       │       ├── zsysctl_openbsd_arm.go
    │       │       ├── zsysctl_openbsd_arm64.go
    │       │       ├── zsysctl_openbsd_mips64.go
    │       │       ├── zsysctl_openbsd_ppc64.go
    │       │       ├── zsysctl_openbsd_riscv64.go
    │       │       ├── zsysnum_darwin_amd64.go
    │       │       ├── zsysnum_darwin_arm64.go
    │       │       ├── zsysnum_dragonfly_amd64.go
    │       │       ├── zsysnum_freebsd_386.go
    │       │       ├── zsysnum_freebsd_amd64.go
    │       │       ├── zsysnum_freebsd_arm.go
    │       │       ├── zsysnum_freebsd_arm64.go
    │       │       ├── zsysnum_freebsd_riscv64.go
    │       │       ├── zsysnum_linux_386.go
    │       │       ├── zsysnum_linux_amd64.go
    │       │       ├── zsysnum_linux_arm.go
    │       │       ├── zsysnum_linux_arm64.go
    │       │       ├── zsysnum_linux_loong64.go
    │       │       ├── zsysnum_linux_mips.go
    │       │       ├── zsysnum_linux_mips64.go
    │       │       ├── zsysnum_linux_mips64le.go
    │       │       ├── zsysnum_linux_mipsle.go
    │       │       ├── zsysnum_linux_ppc.go
    │       │       ├── zsysnum_linux_ppc64.go
    │       │       ├── zsysnum_linux_ppc64le.go
    │       │       ├── zsysnum_linux_riscv64.go
    │       │       ├── zsysnum_linux_s390x.go
    │       │       ├── zsysnum_linux_sparc64.go
    │       │       ├── zsysnum_netbsd_386.go
    │       │       ├── zsysnum_netbsd_amd64.go
    │       │       ├── zsysnum_netbsd_arm.go
    │       │       ├── zsysnum_netbsd_arm64.go
    │       │       ├── zsysnum_openbsd_386.go
    │       │       ├── zsysnum_openbsd_amd64.go
    │       │       ├── zsysnum_openbsd_arm.go
    │       │       ├── zsysnum_openbsd_arm64.go
    │       │       ├── zsysnum_openbsd_mips64.go
    │       │       ├── zsysnum_openbsd_ppc64.go
    │       │       ├── zsysnum_openbsd_riscv64.go
    │       │       ├── zsysnum_zos_s390x.go
    │       │       ├── ztypes_aix_ppc.go
    │       │       ├── ztypes_aix_ppc64.go
    │       │       ├── ztypes_darwin_amd64.go
    │       │       ├── ztypes_darwin_arm64.go
    │       │       ├── ztypes_dragonfly_amd64.go
    │       │       ├── ztypes_freebsd_386.go
    │       │       ├── ztypes_freebsd_amd64.go
    │       │       ├── ztypes_freebsd_arm.go
    │       │       ├── ztypes_freebsd_arm64.go
    │       │       ├── ztypes_freebsd_riscv64.go
    │       │       ├── ztypes_linux.go
    │       │       ├── ztypes_linux_386.go
    │       │       ├── ztypes_linux_amd64.go
    │       │       ├── ztypes_linux_arm.go
    │       │       ├── ztypes_linux_arm64.go
    │       │       ├── ztypes_linux_loong64.go
    │       │       ├── ztypes_linux_mips.go
    │       │       ├── ztypes_linux_mips64.go
    │       │       ├── ztypes_linux_mips64le.go
    │       │       ├── ztypes_linux_mipsle.go
    │       │       ├── ztypes_linux_ppc.go
    │       │       ├── ztypes_linux_ppc64.go
    │       │       ├── ztypes_linux_ppc64le.go
    │       │       ├── ztypes_linux_riscv64.go
    │       │       ├── ztypes_linux_s390x.go
    │       │       ├── ztypes_linux_sparc64.go
    │       │       ├── ztypes_netbsd_386.go
    │       │       ├── ztypes_netbsd_amd64.go
    │       │       ├── ztypes_netbsd_arm.go
    │       │       ├── ztypes_netbsd_arm64.go
    │       │       ├── ztypes_openbsd_386.go
    │       │       ├── ztypes_openbsd_amd64.go
    │       │       ├── ztypes_openbsd_arm.go
    │       │       ├── ztypes_openbsd_arm64.go
    │       │       ├── ztypes_openbsd_mips64.go
    │       │       ├── ztypes_openbsd_ppc64.go
    │       │       ├── ztypes_openbsd_riscv64.go
    │       │       ├── ztypes_solaris_amd64.go
    │       │       └── ztypes_zos_s390x.go
    │       └── text/
    │           ├── LICENSE
    │           ├── PATENTS
    │           ├── feature/
    │           │   └── plural/
    │           │       ├── common.go
    │           │       ├── message.go
    │           │       ├── plural.go
    │           │       └── tables.go
    │           ├── internal/
    │           │   ├── catmsg/
    │           │   │   ├── catmsg.go
    │           │   │   ├── codec.go
    │           │   │   └── varint.go
    │           │   ├── format/
    │           │   │   ├── format.go
    │           │   │   └── parser.go
    │           │   ├── internal.go
    │           │   ├── language/
    │           │   │   ├── common.go
    │           │   │   ├── compact/
    │           │   │   │   ├── compact.go
    │           │   │   │   ├── language.go
    │           │   │   │   ├── parents.go
    │           │   │   │   ├── tables.go
    │           │   │   │   └── tags.go
    │           │   │   ├── compact.go
    │           │   │   ├── compose.go
    │           │   │   ├── coverage.go
    │           │   │   ├── language.go
    │           │   │   ├── lookup.go
    │           │   │   ├── match.go
    │           │   │   ├── parse.go
    │           │   │   ├── tables.go
    │           │   │   └── tags.go
    │           │   ├── match.go
    │           │   ├── number/
    │           │   │   ├── common.go
    │           │   │   ├── decimal.go
    │           │   │   ├── format.go
    │           │   │   ├── number.go
    │           │   │   ├── pattern.go
    │           │   │   ├── roundingmode_string.go
    │           │   │   └── tables.go
    │           │   ├── stringset/
    │           │   │   └── set.go
    │           │   └── tag/
    │           │       └── tag.go
    │           ├── language/
    │           │   ├── coverage.go
    │           │   ├── doc.go
    │           │   ├── language.go
    │           │   ├── match.go
    │           │   ├── parse.go
    │           │   ├── tables.go
    │           │   └── tags.go
    │           └── message/
    │               ├── catalog/
    │               │   ├── catalog.go
    │               │   ├── dict.go
    │               │   ├── go19.go
    │               │   └── gopre19.go
    │               ├── catalog.go
    │               ├── doc.go
    │               ├── format.go
    │               ├── message.go
    │               └── print.go
    ├── gopkg.in/
    │   └── yaml.v3/
    │       ├── LICENSE
    │       ├── NOTICE
    │       ├── README.md
    │       ├── apic.go
    │       ├── decode.go
    │       ├── emitterc.go
    │       ├── encode.go
    │       ├── parserc.go
    │       ├── readerc.go
    │       ├── resolve.go
    │       ├── scannerc.go
    │       ├── sorter.go
    │       ├── writerc.go
    │       ├── yaml.go
    │       ├── yamlh.go
    │       └── yamlprivateh.go
    └── modules.txt
Download .txt
Showing preview only (7,165K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (90412 symbols across 676 files)

FILE: benchmark_to_chart.py
  function extract_version (line 9) | def extract_version(command):
  function main (line 15) | def main():

FILE: examples/complexity/complexity.cpp
  function main (line 4) | int main()

FILE: examples/duplicates/1.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/10.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/11.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/12.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/13.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/14.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/15.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/16.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/17.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/18.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/19.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/2.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/20.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/3.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/4.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/5.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/6.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/7.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/8.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/duplicates/9.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/generated/test.cs
  class Project (line 16) | [IO.Class((int)IO.TagGroups.Enumerated.CheApeProject, 1)]
    type Interface (line 23) | public interface Interface
      method Create (line 30) | Project Create(string file);
      method Open (line 36) | Project Open(string file);
      method Save (line 42) | void Save(string save_as, Project project);
      method Close (line 48) | void Close(bool save, Project project);
    method GetInterface (line 51) | public static Interface GetInterface(BlamVersion v)
    method Project (line 64) | internal Project(BlamVersion v, string file_name)
    method Dispose (line 74) | public void Dispose()
    method AddEmbedded (line 127) | public void AddEmbedded(string path, string name)
    method RemoveEmbedded (line 137) | public void RemoveEmbedded(string path, string name)
    method ValidFile (line 149) | public bool ValidFile(string path, out string reason)
    method Add (line 173) | public string Add(string path, bool create)
    method Remove (line 198) | public void Remove(string path, bool delete)
    method Remove (line 216) | public void Remove(int path_index, bool delete)
    method ShowMessageInForm (line 227) | static void ShowMessageInForm(System.Windows.Forms.Form owner_form, st...
    method ShowMessageInForm (line 237) | static void ShowMessageInForm(System.Windows.Forms.Form owner_form, st...
    method Import (line 254) | public void Import(System.Windows.Forms.Form owner_form)
    method Build (line 295) | public void Build(System.Windows.Forms.Form owner_form, bool reimport)
    method Build (line 321) | public void Build(object param) { Build(param as System.Windows.Forms....
    method Read (line 325) | public override void Read(IO.EndianReader s)
    method Write (line 339) | public override void Write(IO.EndianWriter s)
  class ProjectState (line 354) | internal abstract class ProjectState : IDisposable
    method ProjectState (line 406) | protected ProjectState(BlamVersion engine, Project proj)
    method Dispose (line 429) | public void Dispose()
    method InitializeTypeIndicies (line 448) | protected void InitializeTypeIndicies()
    method GetFieldSize (line 463) | public int GetFieldSize(int type_index)

FILE: examples/generated/test.h
  type machine_type (line 36) | enum machine_type {
  type nlist (line 156) | struct nlist {
  type relocation_info (line 214) | struct relocation_info

FILE: examples/issue345/filename.cc
  function MyFunction (line 1) | bool MyFunction() {

FILE: examples/issue564/level1/test.go
  function main (line 3) | func main() {}

FILE: examples/issue564/test.go
  function main (line 3) | func main() {}

FILE: examples/issue610/issue610.ts
  function getUrl (line 3) | function getUrl(path?: string): string {
  function getUrl2 (line 7) | function getUrl2() {

FILE: examples/language/go.go
  function Msg (line 11) | func Msg() {
  function main (line 15) | func main() {

FILE: examples/language/javascript.js
  class Person (line 1) | class Person {
    method constructor (line 2) | constructor(name) {
  class Student (line 7) | class Student extends Person {
    method constructor (line 8) | constructor(name, id) {
  function PrintName (line 14) | function PrintName(student) {
  function PrintID (line 18) | function PrintID(student) {

FILE: examples/language/test.java
  class SpellingCorrector (line 11) | public class SpellingCorrector implements ISpellingCorrector {
    method SpellingCorrector (line 16) | public SpellingCorrector(int lruCount) {
    method putWord (line 20) | @Override
    method correct (line 31) | @Override
    method containsWord (line 111) | @Override
    method wordEdits (line 126) | private List<String> wordEdits(String word) {
    method sortByValue (line 160) | public static <K, V extends Comparable<? super V>> Map<K, V> sortByVal...
    class LruCache (line 172) | public class LruCache<A, B> extends LinkedHashMap<A, B> {
      method LruCache (line 175) | public LruCache(final int maxEntries) {
      method removeEldestEntry (line 180) | @Override

FILE: examples/language/typescript.ts
  function getUrl (line 3) | function getUrl(path?: string): string {
  function getUrl2 (line 7) | function getUrl2() {

FILE: examples/minified/0-941d61979b9396d94f06.js
  function e (line 1) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function f (line 1) | function f(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1) | function l(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototyp...
  function t (line 1) | function t(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function r (line 1) | function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}
  function s (line 1) | function s(){T=e(c.map(function(e){return e.props})),f.canUseDOM?t(T):n&...
  function t (line 1) | function t(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function c (line 1) | function c(e){return e&&e.__esModule?e:{default:e}}

FILE: examples/minified/1-fa6e7d2ffea9ee90c8d8.js
  function y (line 1) | function y(e){return e.map(function(e){var t=e.src,r=e.srcSet,a=e.srcSet...
  function x (line 1) | function x(e){var t=[],r=[];return e.forEach(function(e){return(e.media?...
  function S (line 1) | function S(e){return e.map(function(e){var t=e.src,r=e.media,a=e.tracedS...
  function E (line 1) | function E(e){return e.map(function(e){var t=e.src,r=e.media,a=e.base64;...
  function L (line 1) | function L(e,t){var r=e.srcSet,a=e.srcSetWebp,i=e.media,n=e.sizes;return...
  function t (line 1) | function t(t){var r;(r=e.call(this,t)||this).seenBefore=m&&g(t),r.addNoS...

FILE: examples/minified/app-5cddf2000f4491a89a40.js
  function e (line 1) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function _ (line 1) | function _(e){return"function"==typeof e}
  function T (line 1) | function T(e){return e.displayName||e.name||"Component"}
  function C (line 1) | function C(e){return e&&"string"==typeof e.styledComponentId}
  function t (line 1) | function t(n){g(this,t);for(var r=arguments.length,o=Array(r>1?r-1:0),a=...
  function q (line 1) | function q(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?argume...
  function e (line 1) | function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?argu...
  function e (line 1) | function e(t,n){var r=this;g(this,e),this.inject=function(e){e.hasNameFo...
  function me (line 1) | function me(e){return e.replace(pe,"-$1").toLowerCase().replace(he,"-ms-")}
  function ye (line 1) | function ye(e,t,n){if(Array.isArray(e)){for(var r,o=[],a=0,i=e.length;a<...
  function be (line 1) | function be(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++...
  function we (line 1) | function we(e){for(var t,n=0|e.length,r=0|n,o=0;n>=4;)t=1540483477*(6553...
  function Ee (line 1) | function Ee(e){var t="",n=void 0;for(n=e;n>ke;n=Math.floor(n/ke))t=xe(n%...
  function Se (line 1) | function Se(e,t){for(var n=0;n<e.length;n+=1){var r=e[n];if(Array.isArra...
  function e (line 1) | function e(t,n,r){g(this,e),this.rules=t,this.isStatic=!Te&&Se(t,n),this...
  function Re (line 1) | function Re(e){return e.replace(Ae,"-").replace(Ie,"")}
  function je (line 1) | function je(e){return"string"==typeof e&&!0}
  function qe (line 1) | function qe(e,t,n){if("string"!=typeof t){var r=$e(t);r&&r!==We&&qe(e,r,...
  function t (line 1) | function t(n){g(this,t);var r=k(this,e.call(this,n));return r.getContext...
  function e (line 1) | function e(){g(this,e),this.masterSheet=fe.master,this.instance=this.mas...
  function t (line 1) | function t(n){g(this,t);var r=k(this,e.call(this,n));return r.getContext...
  function t (line 1) | function t(){g(this,t);var n=k(this,e.call(this));return n.attrs={},n.re...
  function et (line 1) | function et(e,t,n){var r=C(e),o=!je(e),a=t.displayName,i=void 0===a?func...
  function e (line 1) | function e(t,n){g(this,e),this.rules=t,this.componentId=n,this.isStatic=...
  function rt (line 1) | function rt(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++...
  function m (line 1) | function m(e,t,r,a,i,l){var u=r+e.length,s=a.length,c=p;return void 0!==...
  function e (line 1) | function e(e){this.matchPaths=e,this.pathCache=new Map}
  function e (line 1) | function e(e,t){this.pageDb=new Map,this.inFlightDb=new Map,this.pageDat...
  function r (line 1) | function r(t,n){return e.call(this,function(e){return t.components[e]()....
  function p (line 1) | function p(e){return function(e){return e.replace(/\/+/g,"/")}(["",e].jo...
  function t (line 1) | function t(t){var n;n=e.call(this,t)||this,(0,u.default)((0,l.default)((...
  function d (line 1) | function d(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototyp...
  function p (line 1) | function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function h (line 1) | function h(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function m (line 1) | function m(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
  function t (line 1) | function t(){var n,r;p(this,t);for(var o=arguments.length,a=Array(o),i=0...
  function t (line 1) | function t(){return p(this,t),h(this,e.apply(this,arguments))}
  function t (line 1) | function t(){var n,r;p(this,t);for(var o=arguments.length,a=Array(o),i=0...
  function R (line 1) | function R(e){this.uri=e}
  function t (line 1) | function t(){return p(this,t),h(this,e.apply(this,arguments))}
  method location (line 1) | get location(){return a}
  method transitioning (line 1) | get transitioning(){return i}
  method location (line 1) | get location(){return n[t]}
  method entries (line 1) | get entries(){return n}
  method index (line 1) | get index(){return t}
  method state (line 1) | get state(){return r[t]}
  function d (line 1) | function d(e){var t=e.staticQueryData,n=e.data,r=e.query,a=e.render,i=n?...
  function m (line 1) | function m(){throw new Error("It appears like Gatsby is misconfigured. G...
  function d (line 1) | function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r)...
  function s (line 1) | function s(e,t){var n=Object.keys(e);return Object.getOwnPropertySymbols...
  function c (line 1) | function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[...
  function f (line 1) | function f(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function o (line 1) | function o(){return e.apply(this,arguments)||this}
  function u (line 1) | function u(e,t){if("undefined"==typeof window)return[t,function(){}];var...
  function s (line 1) | function s(e,t){if(!1===t)return[e,function(){}];var n=u("dark-mode-enab...
  function _ (line 1) | function _(){var e=function(e,t){t||(t=e.slice(0));return e.raw=t,e}(["\...
  function ne (line 1) | function ne(){var e=function(e,t){t||(t=e.slice(0));return e.raw=t,e}(["...
  function De (line 1) | function De(e,t,o,a,i){for(var l,u,c=0,f=0,d=0,p=0,v=0,y=0,b=0,w=0,x=0,S...
  function Ue (line 1) | function Ue(e,t,n){var r=t.trim().split(c),o=r,a=r.length,i=e.length;swi...
  function ze (line 1) | function ze(e,t,n,r){var o=t,a=o.charCodeAt(0);switch(a<33&&(a=(o=o.trim...
  function Be (line 1) | function Be(e,t,n,r){var s,c=0,f=e+";",d=2*t+3*n+4*r;if(944===d)return f...
  function $e (line 1) | function $e(e,t){var n=e.indexOf(1===t?":":"{"),r=e.substring(0,3!==t?n:...
  function We (line 1) | function We(e,t){var n=Be(t,t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt...
  function He (line 1) | function He(e,t,n,r,o,a,i,l,u,s){for(var c,f=0,d=t;f<_e;++f)switch(c=Se[...
  function qe (line 1) | function qe(e,t,n,r){for(var o=t+1;o<n;++o)switch(r.charCodeAt(o)){case ...
  function Ve (line 1) | function Ve(e){for(var t in e){var n=e[t];switch(t){case"keyframe":Ne=0|...
  function Ge (line 1) | function Ge(t,n){if(void 0!==this&&this.constructor===Ge)return e(t);var...
  function r (line 1) | function r(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n...
  function o (line 1) | function o(e){return r.createElement("svg",e,r.createElement("g",{"data-...
  function o (line 1) | function o(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||vo...
  function t (line 1) | function t(t){if(t)try{e(t+"}")}catch(n){}}
  function e (line 1) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function o (line 1) | function o(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function t (line 1) | function t(){var e,n,r;!function(e,t){if(!(e instanceof t))throw new Typ...
  function s (line 1) | function s(e,t){if(!(this instanceof s))return new s(e,t);if(t&&t in i&&...
  function c (line 1) | function c(e,t,n){return(e=Array.isArray(e)?e:[e]).forEach(function(e){(...
  function f (line 1) | function f(e){return function(t){return Math.max(0,Math.min(e,t))}}
  function d (line 1) | function d(e,t){for(var n=0;n<t;n++)"number"!=typeof e[n]&&(e[n]=0);retu...
  function o (line 1) | function o(e){return r.createElement("svg",e,[r.createElement("defs",{ke...
  function o (line 1) | function o(e){return r.createElement("svg",e,[r.createElement("defs",{ke...
  function r (line 1) | function r(e){return Object.prototype.toString.call(e).slice(8,-1)}
  function o (line 1) | function o(e){return"Object"===r(e)&&(e.constructor===Object&&Object.get...
  function a (line 1) | function a(e){return"Array"===r(e)}
  function n (line 1) | function n(){return e.exports=n=Object.assign||function(e){for(var t=1;t...
  function y (line 1) | function y(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/e...
  function k (line 1) | function k(e,t,n){this.props=e,this.context=t,this.refs=w,this.updater=n...
  function x (line 1) | function x(){}
  function E (line 1) | function E(e,t,n){this.props=e,this.context=t,this.refs=w,this.updater=n...
  function P (line 1) | function P(e,t,n){var r=void 0,o={},i=null,l=null;if(null!=t)for(r in vo...
  function A (line 1) | function A(e){return"object"==typeof e&&null!==e&&e.$$typeof===a}
  function j (line 1) | function j(e,t,n,r){if(R.length){var o=R.pop();return o.result=e,o.keyPr...
  function N (line 1) | function N(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,...
  function F (line 1) | function F(e,t,n){return null==e?0:function e(t,n,r,o){var l=typeof t;"u...
  function M (line 1) | function M(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function...
  function L (line 1) | function L(e,t){e.func.call(e.context,t,e.count++)}
  function D (line 1) | function D(e,t,n){var r=e.result,o=e.keyPrefix;e=e.func.call(e.context,t...
  function U (line 1) | function U(e,t,n,r,o){var a="";null!=n&&(a=(""+n).replace(I,"$&/")+"/"),...
  function z (line 1) | function z(){var e=_.current;return null===e&&y("321"),e}
  function o (line 1) | function o(e,t){var n=Object.keys(e);return Object.getOwnPropertySymbols...
  function a (line 1) | function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function a (line 1) | function a(){throw new Error("setTimeout has not been defined")}
  function i (line 1) | function i(){throw new Error("clearTimeout has not been defined")}
  function l (line 1) | function l(e){if(n===setTimeout)return setTimeout(e,0);if((n===a||!n)&&s...
  function d (line 1) | function d(){c&&u&&(c=!1,u.length?s=u.concat(s):f=-1,s.length&&p())}
  function p (line 1) | function p(){if(!c){var e=l(d);c=!0;for(var t=s.length;t;){for(u=s,s=[];...
  function h (line 1) | function h(e,t){this.fun=e,this.array=t}
  function m (line 1) | function m(){}
  function v (line 1) | function v(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t...
  function y (line 1) | function y(e){return v(e)===d}
  function o (line 1) | function o(){}
  function a (line 1) | function a(){}
  function e (line 1) | function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes val...
  function t (line 1) | function t(){return e}
  function u (line 1) | function u(e,t){var n=Object.keys(e);return Object.getOwnPropertySymbols...
  function s (line 1) | function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function o (line 1) | function o(){return(o=Object.assign||function(e){for(var t=1;t<arguments...
  function l (line 1) | function l(e){if(7===e.length)return e;for(var t="#",n=1;n<4;n+=1)t+=e[n...
  function u (line 1) | function u(e,t,n,r,o){return function(e,t,n,r,o){var a=(e-n)/(t-n);if(0=...
  function t (line 1) | function t(t){e.call(this,t);var n=t.height,r=t.width,o=t.checked;this.t...
  function u (line 1) | function u(e,t,n){return Math.min(Math.max(t,e),n)}
  function s (line 1) | function s(e){var t=e.toString(16).toUpperCase();return t.length<2?"0"+t:t}
  function o (line 1) | function o(e){var t=function(){for(var e={},t=Object.keys(r),n=t.length,...
  function a (line 1) | function a(e,t){return function(n){return t(e(n))}}
  function i (line 1) | function i(e,t){for(var n=[t[e].parent,e],o=r[t[e].parent][e],i=t[e].par...
  function i (line 1) | function i(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/e...
  function d (line 1) | function d(e,t,n,r,o,a,i,s,c){l=!1,u=null,function(e,t,n,r,o,a,i,l,u){va...
  function m (line 1) | function m(){if(p)for(var e in h){var t=h[e],n=p.indexOf(e);if(-1<n||i("...
  function g (line 1) | function g(e,t,n){b[e]&&i("100",e),b[e]=t,w[e]=t.eventTypes[n].dependenc...
  function S (line 1) | function S(e,t,n){var r=e.type||"unknown-event";e.currentTarget=E(n),fun...
  function _ (line 1) | function _(e,t){return null==t&&i("30"),null==e?t:Array.isArray(e)?Array...
  function T (line 1) | function T(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}
  function O (line 1) | function O(e){if(e){var t=e._dispatchListeners,n=e._dispatchInstances;if...
  function A (line 1) | function A(e,t){var n=e.stateNode;if(!n)return null;var r=k(n);if(!r)ret...
  function I (line 1) | function I(e){if(null!==e&&(C=_(C,e)),e=C,C=null,e&&(T(e,O),C&&i("95"),s...
  function F (line 1) | function F(e){if(e[j])return e[j];for(;!e[j];){if(!e.parentNode)return n...
  function M (line 1) | function M(e){return!(e=e[j])||5!==e.tag&&6!==e.tag?null:e}
  function L (line 1) | function L(e){if(5===e.tag||6===e.tag)return e.stateNode;i("33")}
  function D (line 1) | function D(e){return e[N]||null}
  function U (line 1) | function U(e){do{e=e.return}while(e&&5!==e.tag);return e||null}
  function z (line 1) | function z(e,t,n){(t=A(e,n.dispatchConfig.phasedRegistrationNames[t]))&&...
  function B (line 1) | function B(e){if(e&&e.dispatchConfig.phasedRegistrationNames){for(var t=...
  function $ (line 1) | function $(e,t,n){e&&n&&n.dispatchConfig.registrationName&&(t=A(e,n.disp...
  function W (line 1) | function W(e){e&&e.dispatchConfig.registrationName&&$(e._targetInst,null...
  function H (line 1) | function H(e){T(e,B)}
  function V (line 1) | function V(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["We...
  function X (line 1) | function X(e){if(K[e])return K[e];if(!G[e])return e;var t,n=G[e];for(t i...
  function ae (line 1) | function ae(){if(oe)return oe;var e,t,n=re,r=n.length,o="value"in ne?ne....
  function ie (line 1) | function ie(){return!0}
  function le (line 1) | function le(){return!1}
  function ue (line 1) | function ue(e,t,n,r){for(var o in this.dispatchConfig=e,this._targetInst...
  function se (line 1) | function se(e,t,n,r){if(this.eventPool.length){var o=this.eventPool.pop(...
  function ce (line 1) | function ce(e){e instanceof this||i("279"),e.destructor(),10>this.eventP...
  function fe (line 1) | function fe(e){e.eventPool=[],e.getPooled=se,e.release=ce}
  function t (line 1) | function t(){}
  function n (line 1) | function n(){return r.apply(this,arguments)}
  function xe (line 1) | function xe(e,t){switch(e){case"keyup":return-1!==he.indexOf(t.keyCode);...
  function Ee (line 1) | function Ee(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}
  function Pe (line 1) | function Pe(e){if(e=x(e)){"function"!=typeof Te&&i("280");var t=k(e.stat...
  function Ae (line 1) | function Ae(e){Ce?Oe?Oe.push(e):Oe=[e]:Ce=e}
  function Ie (line 1) | function Ie(){if(Ce){var e=Ce,t=Oe;if(Oe=Ce=null,Pe(e),t)for(e=0;e<t.len...
  function Re (line 1) | function Re(e,t){return e(t)}
  function je (line 1) | function je(e,t,n){return e(t,n)}
  function Ne (line 1) | function Ne(){}
  function Me (line 1) | function Me(e,t){if(Fe)return e(t);Fe=!0;try{return Re(e,t)}finally{Fe=!...
  function De (line 1) | function De(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"inpu...
  function Ue (line 1) | function Ue(e){return(e=e.target||e.srcElement||window).correspondingUse...
  function ze (line 1) | function ze(e){if(!q)return!1;var t=(e="on"+e)in document;return t||((t=...
  function Be (line 1) | function Be(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCas...
  function $e (line 1) | function $e(e){e._valueTracker||(e._valueTracker=function(e){var t=Be(e)...
  function We (line 1) | function We(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n...
  function it (line 1) | function it(e){return null===e||"object"!=typeof e?null:"function"==type...
  function lt (line 1) | function lt(e){if(null==e)return null;if("function"==typeof e)return e.d...
  function ut (line 1) | function ut(e){var t="";do{e:switch(e.tag){case 3:case 4:case 6:case 7:c...
  function pt (line 1) | function pt(e,t,n,r,o){this.acceptsBooleans=2===t||3===t||4===t,this.att...
  function gt (line 1) | function gt(e){return e[1].toUpperCase()}
  function vt (line 1) | function vt(e,t,n,r){var o=ht.hasOwnProperty(t)?ht[t]:null;(null!==o?0==...
  function yt (line 1) | function yt(e){switch(typeof e){case"boolean":case"number":case"object":...
  function bt (line 1) | function bt(e,t){var n=t.checked;return o({},t,{defaultChecked:void 0,de...
  function wt (line 1) | function wt(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t....
  function kt (line 1) | function kt(e,t){null!=(t=t.checked)&&vt(e,"checked",t,!1)}
  function xt (line 1) | function xt(e,t){kt(e,t);var n=yt(t.value),r=t.type;if(null!=n)"number"=...
  function Et (line 1) | function Et(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
  function St (line 1) | function St(e,t,n){"number"===t&&e.ownerDocument.activeElement===e||(nul...
  function Tt (line 1) | function Tt(e,t,n){return(e=ue.getPooled(_t.change,e,t,n)).type="change"...
  function Pt (line 1) | function Pt(e){I(e)}
  function At (line 1) | function At(e){if(We(L(e)))return e}
  function It (line 1) | function It(e,t){if("change"===e)return t}
  function jt (line 1) | function jt(){Ct&&(Ct.detachEvent("onpropertychange",Nt),Ot=Ct=null)}
  function Nt (line 1) | function Nt(e){"value"===e.propertyName&&At(Ot)&&Me(Pt,e=Tt(Ot,e,Ue(e)))}
  function Ft (line 1) | function Ft(e,t,n){"focus"===e?(jt(),Ot=n,(Ct=t).attachEvent("onproperty...
  function Mt (line 1) | function Mt(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)retu...
  function Lt (line 1) | function Lt(e,t){if("click"===e)return At(t)}
  function Dt (line 1) | function Dt(e,t){if("input"===e||"change"===e)return At(t)}
  function $t (line 1) | function $t(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
  function Wt (line 1) | function Wt(){return $t}
  function Zt (line 1) | function Zt(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t}
  function en (line 1) | function en(e,t){if(Zt(e,t))return!0;if("object"!=typeof e||null===e||"o...
  function tn (line 1) | function tn(e){var t=e;if(e.alternate)for(;t.return;)t=t.return;else{if(...
  function nn (line 1) | function nn(e){2!==tn(e)&&i("188")}
  function rn (line 1) | function rn(e){if(!(e=function(e){var t=e.alternate;if(!t)return 3===(t=...
  function un (line 1) | function un(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&...
  function bn (line 1) | function bn(e,t){var n=e[0],r="on"+((e=e[1])[0].toUpperCase()+e.slice(1)...
  function En (line 1) | function En(e){var t=e.targetInst,n=t;do{if(!n){e.ancestors.push(n);brea...
  function _n (line 1) | function _n(e,t){if(!t)return null;var n=(kn(e)?Cn:On).bind(null,e);t.ad...
  function Tn (line 1) | function Tn(e,t){if(!t)return null;var n=(kn(e)?Cn:On).bind(null,e);t.ad...
  function Cn (line 1) | function Cn(e,t){je(On,e,t)}
  function On (line 1) | function On(e,t){if(Sn){var n=Ue(t);if(null===(n=F(n))||"number"!=typeof...
  function Rn (line 1) | function Rn(e){return Object.prototype.hasOwnProperty.call(e,In)||(e[In]...
  function jn (line 1) | function jn(e){if(void 0===(e=e||("undefined"!=typeof document?document:...
  function Nn (line 1) | function Nn(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function Fn (line 1) | function Fn(e,t){var n,r=Nn(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.t...
  function Mn (line 1) | function Mn(){for(var e=window,t=jn();t instanceof e.HTMLIFrameElement;)...
  function Ln (line 1) | function Ln(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
  function Dn (line 1) | function Dn(e){var t=Mn(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n...
  function qn (line 1) | function qn(e,t){var n=t.window===t?t.document:9===t.nodeType?t:t.ownerD...
  function Gn (line 1) | function Gn(e,t){return e=o({children:void 0},t),(t=function(e){var t=""...
  function Kn (line 1) | function Kn(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t...
  function Yn (line 1) | function Yn(e,t){return null!=t.dangerouslySetInnerHTML&&i("91"),o({},t,...
  function Xn (line 1) | function Xn(e,t){var n=t.value;null==n&&(n=t.defaultValue,null!=(t=t.chi...
  function Qn (line 1) | function Qn(e,t){var n=yt(t.value),r=yt(t.defaultValue);null!=n&&((n=""+...
  function Zn (line 1) | function Zn(e){var t=e.textContent;t===e._wrapperState.initialValue&&(e....
  function er (line 1) | function er(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
  function tr (line 1) | function tr(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?er(t...
  function ar (line 1) | function ar(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.n...
  function ur (line 1) | function ur(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"nu...
  function sr (line 1) | function sr(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=...
  function fr (line 1) | function fr(e,t){t&&(cr[e]&&(null!=t.children||null!=t.dangerouslySetInn...
  function dr (line 1) | function dr(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;swit...
  function pr (line 1) | function pr(e,t){var n=Rn(e=9===e.nodeType||11===e.nodeType?e:e.ownerDoc...
  function hr (line 1) | function hr(){}
  function vr (line 1) | function vr(e,t){switch(e){case"button":case"input":case"select":case"te...
  function yr (line 1) | function yr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"st...
  function Er (line 1) | function Er(e){for(e=e.nextSibling;e&&1!==e.nodeType&&3!==e.nodeType;)e=...
  function Sr (line 1) | function Sr(e){for(e=e.firstChild;e&&1!==e.nodeType&&3!==e.nodeType;)e=e...
  function Cr (line 1) | function Cr(e){0>Tr||(e.current=_r[Tr],_r[Tr]=null,Tr--)}
  function Or (line 1) | function Or(e,t){_r[++Tr]=e.current,e.current=t}
  function jr (line 1) | function jr(e,t){var n=e.type.contextTypes;if(!n)return Pr;var r=e.state...
  function Nr (line 1) | function Nr(e){return null!=(e=e.childContextTypes)}
  function Fr (line 1) | function Fr(e){Cr(Ir),Cr(Ar)}
  function Mr (line 1) | function Mr(e){Cr(Ir),Cr(Ar)}
  function Lr (line 1) | function Lr(e,t,n){Ar.current!==Pr&&i("168"),Or(Ar,t),Or(Ir,n)}
  function Dr (line 1) | function Dr(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"...
  function Ur (line 1) | function Ur(e){var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMe...
  function zr (line 1) | function zr(e,t,n){var r=e.stateNode;r||i("169"),n?(t=Dr(e,t,Rr),r.__rea...
  function Wr (line 1) | function Wr(e){return function(t){try{return e(t)}catch(n){}}}
  function Hr (line 1) | function Hr(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this....
  function qr (line 1) | function qr(e,t,n,r){return new Hr(e,t,n,r)}
  function Vr (line 1) | function Vr(e){return!(!(e=e.prototype)||!e.isReactComponent)}
  function Gr (line 1) | function Gr(e,t){var n=e.alternate;return null===n?((n=qr(e.tag,t,e.key,...
  function Kr (line 1) | function Kr(e,t,n,r,o,a){var l=2;if(r=e,"function"==typeof e)Vr(e)&&(l=1...
  function Yr (line 1) | function Yr(e,t,n,r){return(e=qr(7,e,r,t)).expirationTime=n,e}
  function Xr (line 1) | function Xr(e,t,n,r){return e=qr(8,e,r,t),t=0==(1&t)?Xe:et,e.elementType...
  function Qr (line 1) | function Qr(e,t,n){return(e=qr(6,e,null,t)).expirationTime=n,e}
  function Zr (line 1) | function Zr(e,t,n){return(t=qr(4,null!==e.children?e.children:[],e.key,t...
  function Jr (line 1) | function Jr(e,t){e.didError=!1;var n=e.earliestPendingTime;0===n?e.earli...
  function eo (line 1) | function eo(e,t){e.didError=!1,e.latestPingedTime>=t&&(e.latestPingedTim...
  function to (line 1) | function to(e,t){var n=e.earliestPendingTime;return n>t&&(t=n),(e=e.earl...
  function no (line 1) | function no(e,t){var n=t.earliestSuspendedTime,r=t.latestSuspendedTime,o...
  function ro (line 1) | function ro(e,t){if(e&&e.defaultProps)for(var n in t=o({},t),e=e.default...
  function ao (line 1) | function ao(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:o({},t,n),e.me...
  function lo (line 1) | function lo(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shoul...
  function uo (line 1) | function uo(e,t,n){var r=!1,o=Pr,a=t.contextType;return"object"==typeof ...
  function so (line 1) | function so(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceive...
  function co (line 1) | function co(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState...
  function po (line 1) | function po(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=...
  function ho (line 1) | function ho(e,t){"textarea"!==e.type&&i("31","[object Object]"===Object....
  function mo (line 1) | function mo(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.next...
  function xo (line 1) | function xo(e){return e===yo&&i("174"),e}
  function Eo (line 1) | function Eo(e,t){Or(ko,t),Or(wo,e),Or(bo,yo);var n=t.nodeType;switch(n){...
  function So (line 1) | function So(e){Cr(bo),Cr(wo),Cr(ko)}
  function _o (line 1) | function _o(e){xo(ko.current);var t=xo(bo.current),n=tr(t,e.type);t!==n&...
  function To (line 1) | function To(e){wo.current===e&&(Cr(bo),Cr(wo))}
  function Yo (line 1) | function Yo(){i("321")}
  function Xo (line 1) | function Xo(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length...
  function Qo (line 1) | function Qo(e,t,n,r,o,a){if(Mo=a,Lo=t,Uo=null!==e?e.memoizedState:null,F...
  function Zo (line 1) | function Zo(){Fo.current=sa,Mo=0,$o=Bo=zo=Uo=Do=Lo=null,Wo=0,Ho=null,qo=...
  function Jo (line 1) | function Jo(){var e={memoizedState:null,baseState:null,queue:null,baseUp...
  function ea (line 1) | function ea(){if(null!==$o)$o=(Bo=$o).next,Uo=null!==(Do=Uo)?Do.next:nul...
  function ta (line 1) | function ta(e,t){return"function"==typeof t?t(e):t}
  function na (line 1) | function na(e){var t=ea(),n=t.queue;if(null===n&&i("311"),n.lastRendered...
  function ra (line 1) | function ra(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null...
  function oa (line 1) | function oa(e,t,n,r){var o=Jo();qo|=e,o.memoizedState=ra(t,n,void 0,void...
  function aa (line 1) | function aa(e,t,n,r){var o=ea();r=void 0===r?null:r;var a=void 0;if(null...
  function ia (line 1) | function ia(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(nul...
  function la (line 1) | function la(){}
  function ua (line 1) | function ua(e,t,n){25>Ko||i("301");var r=e.alternate;if(e===Lo||null!==r...
  function ma (line 1) | function ma(e,t){var n=qr(5,null,null,0);n.elementType="DELETED",n.type=...
  function ga (line 1) | function ga(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==...
  function va (line 1) | function va(e){if(ha){var t=pa;if(t){var n=t;if(!ga(e,t)){if(!(t=Er(n))|...
  function ya (line 1) | function ya(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&18!==e.tag...
  function ba (line 1) | function ba(e){if(e!==da)return!1;if(!ha)return ya(e),ha=!0,!1;var t=e.t...
  function wa (line 1) | function wa(){pa=da=null,ha=!1}
  function Ea (line 1) | function Ea(e,t,n,r){t.child=null===e?vo(t,null,n,r):go(t,e.child,n,r)}
  function Sa (line 1) | function Sa(e,t,n,r,o){n=n.render;var a=t.ref;return Ba(t,o),r=Qo(e,t,n,...
  function _a (line 1) | function _a(e,t,n,r,o,a){if(null===e){var i=n.type;return"function"!=typ...
  function Ta (line 1) | function Ta(e,t,n,r,o,a){return null!==e&&en(e.memoizedProps,r)&&e.ref==...
  function Ca (line 1) | function Ca(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&...
  function Oa (line 1) | function Oa(e,t,n,r,o){var a=Nr(n)?Rr:Ar.current;return a=jr(t,a),Ba(t,o...
  function Pa (line 1) | function Pa(e,t,n,r,o){if(Nr(n)){var a=!0;Ur(t)}else a=!1;if(Ba(t,o),nul...
  function Aa (line 1) | function Aa(e,t,n,r,o,a){Ca(e,t);var i=0!=(64&t.effectTag);if(!r&&!i)ret...
  function Ia (line 1) | function Ia(e){var t=e.stateNode;t.pendingContext?Lr(0,t.pendingContext,...
  function Ra (line 1) | function Ra(e,t,n){var r=t.mode,o=t.pendingProps,a=t.memoizedState;if(0=...
  function ja (line 1) | function ja(e,t,n){if(null!==e&&(t.contextDependencies=e.contextDependen...
  function Na (line 1) | function Na(e,t,n){var r=t.expirationTime;if(null!==e){if(e.memoizedProp...
  function Ua (line 1) | function Ua(e,t){var n=e.type._context;Or(Fa,n._currentValue),n._current...
  function za (line 1) | function za(e){var t=Fa.current;Cr(Fa),e.type._context._currentValue=t}
  function Ba (line 1) | function Ba(e,t){Ma=e,Da=La=null;var n=e.contextDependencies;null!==n&&n...
  function $a (line 1) | function $a(e,t){return Da!==e&&!1!==t&&0!==t&&("number"==typeof t&&1073...
  function Ka (line 1) | function Ka(e){return{baseState:e,firstUpdate:null,lastUpdate:null,first...
  function Ya (line 1) | function Ya(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,la...
  function Xa (line 1) | function Xa(e){return{expirationTime:e,tag:Wa,payload:null,callback:null...
  function Qa (line 1) | function Qa(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.las...
  function Za (line 1) | function Za(e,t){var n=e.alternate;if(null===n){var r=e.updateQueue,o=nu...
  function Ja (line 1) | function Ja(e,t){var n=e.updateQueue;null===(n=null===n?e.updateQueue=Ka...
  function ei (line 1) | function ei(e,t){var n=e.alternate;return null!==n&&t===n.updateQueue&&(...
  function ti (line 1) | function ti(e,t,n,r,a,i){switch(n.tag){case Ha:return"function"==typeof(...
  function ni (line 1) | function ni(e,t,n,r,o){Ga=!1;for(var a=(t=ei(e,t)).baseState,i=null,l=0,...
  function ri (line 1) | function ri(e,t,n){null!==t.firstCapturedUpdate&&(null!==t.lastUpdate&&(...
  function oi (line 1) | function oi(e,t){for(;null!==e;){var n=e.callback;if(null!==n){e.callbac...
  function ai (line 1) | function ai(e,t){return{value:e,source:t,stack:ut(t)}}
  function ii (line 1) | function ii(e){e.effectTag|=4}
  function di (line 1) | function di(e,t){var n=t.source,r=t.stack;null===r&&null!==n&&(r=ut(n)),...
  function pi (line 1) | function pi(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(nul...
  function hi (line 1) | function hi(e,t,n){if(null!==(n=null!==(n=n.updateQueue)?n.lastEffect:nu...
  function mi (line 1) | function mi(e){switch("function"==typeof $r&&$r(e),e.tag){case 0:case 11...
  function gi (line 1) | function gi(e){return 5===e.tag||3===e.tag||4===e.tag}
  function vi (line 1) | function vi(e){e:{for(var t=e.return;null!==t;){if(gi(t)){var n=t;break ...
  function yi (line 1) | function yi(e){for(var t=e,n=!1,r=void 0,o=void 0;;){if(!n){n=t.return;e...
  function bi (line 1) | function bi(e,t){switch(t.tag){case 0:case 11:case 14:case 15:hi(Po,Ao,t...
  function ki (line 1) | function ki(e,t,n){(n=Xa(n)).tag=Va,n.payload={element:null};var r=t.val...
  function xi (line 1) | function xi(e,t,n){(n=Xa(n)).tag=Va;var r=e.type.getDerivedStateFromErro...
  function Ei (line 1) | function Ei(e){switch(e.tag){case 1:Nr(e.type)&&Fr();var t=e.effectTag;r...
  function Ui (line 1) | function Ui(){if(null!==Oi)for(var e=Oi.return;null!==e;){var t=e;switch...
  function zi (line 1) | function zi(){for(;null!==ji;){var e=ji.effectTag;if(16&e&&ar(ji.stateNo...
  function Bi (line 1) | function Bi(){for(;null!==ji;){if(256&ji.effectTag)e:{var e=ji.alternate...
  function $i (line 1) | function $i(e,t){for(;null!==ji;){var n=ji.effectTag;if(36&n){var r=ji.a...
  function Wi (line 1) | function Wi(){null!==Mi&&xr(Mi),null!==Li&&Li()}
  function Hi (line 1) | function Hi(e,t){Ni=Ci=!0,e.current===t&&i("177");var n=e.pendingCommitE...
  function qi (line 1) | function qi(e){for(;;){var t=e.alternate,n=e.return,r=e.sibling;if(0==(1...
  function Vi (line 1) | function Vi(e){var t=Na(e.alternate,e,Ai);return e.memoizedProps=e.pendi...
  function Gi (line 1) | function Gi(e,t){Ci&&i("243"),Wi(),Ci=!0;var n=Si.current;Si.current=sa;...
  function Ki (line 1) | function Ki(e,t){for(var n=e.return;null!==n;){switch(n.tag){case 1:var ...
  function Yi (line 1) | function Yi(e,t){var n=a.unstable_getCurrentPriorityLevel(),r=void 0;if(...
  function Xi (line 1) | function Xi(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),null!==Pi&&Ai...
  function Qi (line 1) | function Qi(e,t){e.expirationTime<t&&(e.expirationTime=t);var n=e.altern...
  function Zi (line 1) | function Zi(e,t){null!==(e=Qi(e,t))&&(!Ci&&0!==Ai&&t>Ai&&Ui(),Jr(e,t),Ci...
  function Ji (line 1) | function Ji(e,t,n,r,o){return a.unstable_runWithPriority(a.unstable_Imme...
  function bl (line 1) | function bl(){hl=1073741822-((a.unstable_now()-pl)/10|0)}
  function wl (line 1) | function wl(e,t){if(0!==nl){if(t<nl)return;null!==rl&&a.unstable_cancelC...
  function kl (line 1) | function kl(e,t,n,r,o){e.expirationTime=r,0!==o||Tl()?0<o&&(e.timeoutHan...
  function xl (line 1) | function xl(){return ol?ml:(Sl(),0!==il&&1!==il||(bl(),ml=hl),ml)}
  function El (line 1) | function El(e,t){null===e.nextScheduledRoot?(e.expirationTime=t,null===t...
  function Sl (line 1) | function Sl(){var e=0,t=null;if(null!==tl)for(var n=tl,r=el;null!==r;){v...
  function Tl (line 1) | function Tl(){return!!_l||!!a.unstable_shouldYield()&&(_l=!0)}
  function Cl (line 1) | function Cl(){try{if(!Tl()&&null!==el){bl();var e=el;do{var t=e.expirati...
  function Ol (line 1) | function Ol(e,t){if(Sl(),t)for(bl(),ml=hl;null!==al&&0!==il&&e<=il&&!(_l...
  function Pl (line 1) | function Pl(e,t){ol&&i("253"),al=e,il=t,Al(e,t,!1),Ol(1073741823,!1)}
  function Al (line 1) | function Al(e,t,n){if(ol&&i("245"),ol=!0,n){var r=e.finishedWork;null!==...
  function Il (line 1) | function Il(e,t,n){var r=e.firstBatch;if(null!==r&&r._expirationTime>=n&...
  function Rl (line 1) | function Rl(e){null===al&&i("246"),al.expirationTime=0,ul||(ul=!0,sl=e)}
  function jl (line 1) | function jl(e,t){var n=cl;cl=!0;try{return e(t)}finally{(cl=n)||ol||Ol(1...
  function Nl (line 1) | function Nl(e,t){if(cl&&!fl){fl=!0;try{return e(t)}finally{fl=!1}}return...
  function Fl (line 1) | function Fl(e,t,n){cl||ol||0===ll||(Ol(ll,!1),ll=0);var r=cl;cl=!0;try{r...
  function Ml (line 1) | function Ml(e,t,n,r,o){var a=t.current;e:if(n){t:{2===tn(n=n._reactInter...
  function Ll (line 1) | function Ll(e,t,n,r){var o=t.current;return Ml(e,t,n,o=Yi(xl(),o),r)}
  function Dl (line 1) | function Dl(e){if(!(e=e.current).child)return null;switch(e.child.tag){c...
  function Ul (line 1) | function Ul(e){var t=1073741822-25*(1+((1073741822-xl()+500)/25|0));t>=T...
  function zl (line 1) | function zl(){this._callbacks=null,this._didCommit=!1,this._onCommit=thi...
  function Bl (line 1) | function Bl(e,t,n){e={current:t=qr(3,null,null,t?3:0),containerInfo:e,pe...
  function $l (line 1) | function $l(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeTy...
  function Wl (line 1) | function Wl(e,t,n,r,o){var a=n._reactRootContainer;if(a){if("function"==...
  function Hl (line 1) | function Hl(e,t){var n=2<arguments.length&&void 0!==arguments[2]?argumen...
  function s (line 1) | function s(){if(!l){var e=n.expirationTime;u?E():u=!0,x(d,e)}}
  function c (line 1) | function c(){var e=n,t=n.next;if(n===t)n=null;else{var r=n.previous;n=r....
  function f (line 1) | function f(){if(-1===a&&null!==n&&1===n.priorityLevel){l=!0;try{do{c()}w...
  function d (line 1) | function d(e){l=!0;var o=r;r=e;try{if(e)for(;null!==n;){var a=t.unstable...
  function w (line 1) | function w(e){p=y(function(t){v(h),e(t)}),h=g(function(){b(p),e(t.unstab...
  function t (line 1) | function t(t,n){var r;return r=e.call(this,t,n)||this,(0,i.default)((0,a...
  function c (line 1) | function c(e){return e&&e.__esModule?e:{default:e}}
  function e (line 1) | function e(t){var n=this,r=t.addTransitionHook,u=t.stateStorage,c=t.getC...
  function e (line 1) | function e(){}
  function t (line 1) | function t(t,n){var r;return r=e.call(this,t,n)||this,(0,i.default)((0,a...
  function t (line 1) | function t(e,t){return"___"+e.toUpperCase()+t+"___"}
  function b (line 1) | function b(){return(b=Object.assign||function(e){for(var t=1;t<arguments...
  function k (line 1) | function k(){return(k=Object.assign||function(e){for(var t=1;t<arguments...
  function x (line 1) | function x(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=...
  function r (line 1) | function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o...
  function N (line 1) | function N(e,t){var n=Object.keys(e);return Object.getOwnPropertySymbols...
  function F (line 1) | function F(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function r (line 1) | function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o...
  function b (line 1) | function b(e){var t=y[e];return null!=t&&(window.___replace(t.toPath),!0)}
  function E (line 1) | function E(e,t){var n=this,o=t.location,a=o.pathname,i=o.hash,l=Object(r...
  function r (line 1) | function r(t){var n;return n=e.call(this,t)||this,w(t.location,null),n}
  function O (line 1) | function O(e,t){for(var n in e)if(!(n in t))return!0;for(var r in t)if(e...
  function P (line 1) | function P(e,t){var n=Object.keys(e);return Object.getOwnPropertySymbols...
  function A (line 1) | function A(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[...
  function I (line 1) | function I(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function r (line 1) | function r(t){var n;n=e.call(this)||this;var r=t.location,o=t.pageResour...
  function o (line 1) | function o(){return t.apply(this,arguments)||this}
  function f (line 1) | function f(e,t){var n=Object.keys(e);return Object.getOwnPropertySymbols...
  function d (line 1) | function d(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[...
  function p (line 1) | function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...

FILE: examples/minified/component---src-pages-index-tsx-65151e9f2f564e3fe49c.js
  function d (line 1) | function d(e,t){if(null==e)return{};var n,i,r={},a=Object.keys(e);for(i=...
  function r (line 1) | function r(e){return i.createElement("svg",e,i.createElement("g",{stroke...

FILE: examples/minified/webpack-runtime-c6e0a1eee0c3fa087a21.js
  function t (line 1) | function t(t){for(var n,u,c=t[0],f=t[1],i=t[2],p=0,l=[];p<c.length;p++)u...
  function r (line 1) | function r(){for(var e,t=0;t<a.length;t++){for(var r=a[t],n=!0,c=1;c<r.l...
  function u (line 1) | function u(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{...

FILE: examples/performance_tests/create_folders_with_files.py
  function make_sure_path_exists (line 7) | def make_sure_path_exists(path):

FILE: examples/performance_tests/create_performance_test.py
  function make_sure_path_exists (line 157) | def make_sure_path_exists(path):

FILE: main.go
  function printShellCompletion (line 17) | func printShellCompletion(cmd *cobra.Command, command string) error {
  function printFlagSuggestion (line 32) | func printFlagSuggestion(flagSet *pflag.FlagSet, unknownFlag string) {
  function main (line 50) | func main() {

FILE: main_test.go
  constant sccTestFlag (line 14) | sccTestFlag string = "-test.main"
  function TestMain (line 18) | func TestMain(m *testing.M) {
  function runSCC (line 29) | func runSCC(args ...string) (string, error) {
  function TestNoGitIgnore (line 36) | func TestNoGitIgnore(t *testing.T) {
  function TestIssue82 (line 66) | func TestIssue82(t *testing.T) {
  function TestIncludeExt (line 88) | func TestIncludeExt(t *testing.T) {
  function TestIssue115 (line 100) | func TestIssue115(t *testing.T) {
  function TestIssue120 (line 112) | func TestIssue120(t *testing.T) {
  function TestIssue152 (line 124) | func TestIssue152(t *testing.T) {
  function TestIssue250 (line 136) | func TestIssue250(t *testing.T) {
  function TestIssue259 (line 152) | func TestIssue259(t *testing.T) {
  function TestIssue260 (line 164) | func TestIssue260(t *testing.T) {
  function TestIssue345 (line 173) | func TestIssue345(t *testing.T) {
  function TestIssue379 (line 190) | func TestIssue379(t *testing.T) {
  function TestIssue457 (line 207) | func TestIssue457(t *testing.T) {
  function TestIssue564 (line 219) | func TestIssue564(t *testing.T) {
  function TestIssue610 (line 240) | func TestIssue610(t *testing.T) {
  function TestIssue339 (line 257) | func TestIssue339(t *testing.T) {
  function TestInvalidOption (line 272) | func TestInvalidOption(t *testing.T) {
  function TestFileFlagSyntax (line 283) | func TestFileFlagSyntax(t *testing.T) {
  function TestLineLength (line 307) | func TestLineLength(t *testing.T) {
  function TestMultipleFormatStdout (line 318) | func TestMultipleFormatStdout(t *testing.T) {
  function TestMultipleFormatWriteFile (line 343) | func TestMultipleFormatWriteFile(t *testing.T) {
  function TestRecursivelyIgnore (line 402) | func TestRecursivelyIgnore(t *testing.T) {
  function TestMultipleGitIgnore (line 462) | func TestMultipleGitIgnore(t *testing.T) {
  function TestFlagSuggestion (line 490) | func TestFlagSuggestion(t *testing.T) {
  function TestDeterministicOutput (line 517) | func TestDeterministicOutput(t *testing.T) {
  function TestLanguageNameTruncate (line 533) | func TestLanguageNameTruncate(t *testing.T) {
  function TestSpecificLanguages (line 546) | func TestSpecificLanguages(t *testing.T) {

FILE: mcp.go
  function startMCPServer (line 26) | func startMCPServer() {
  type mcpAnalyzeResponse (line 89) | type mcpAnalyzeResponse struct
  type mcpLanguageResult (line 100) | type mcpLanguageResult struct
  type mcpFileResult (line 112) | type mcpFileResult struct
  type mcpTotals (line 124) | type mcpTotals struct
  type mcpCOCOMO (line 134) | type mcpCOCOMO struct
  type mcpLOCOMO (line 140) | type mcpLOCOMO struct
  function mcpAnalyzeHandler (line 151) | func mcpAnalyzeHandler(ctx context.Context, request mcp.CallToolRequest)...
  function jsonMarshal (line 354) | func jsonMarshal(v interface{}) ([]byte, error) {
  function sortFileJobs (line 360) | func sortFileJobs(files []*processor.FileJob) {
  function splitAndTrimExtensions (line 399) | func splitAndTrimExtensions(s string) []string {

FILE: processor/bloom.go
  function init (line 7) | func init() {
  function BloomHash (line 13) | func BloomHash(b byte) uint64 {

FILE: processor/cocomo.go
  function EstimateCost (line 30) | func EstimateCost(effortApplied float64, averageWage int64, overhead flo...
  function EstimateEffort (line 35) | func EstimateEffort(sloc int64, eaf float64) float64 {
  function EstimateScheduleMonths (line 41) | func EstimateScheduleMonths(effortApplied float64) float64 {

FILE: processor/cocomo_test.go
  function TestEstimateCost (line 9) | func TestEstimateCost(t *testing.T) {
  function TestEstimateCostManyLines (line 19) | func TestEstimateCostManyLines(t *testing.T) {
  function TestEstimateScheduleMonths (line 29) | func TestEstimateScheduleMonths(t *testing.T) {

FILE: processor/detector.go
  function DetectLanguage (line 19) | func DetectLanguage(name string) ([]string, string) {
  function DetectSheBang (line 58) | func DetectSheBang(content string) (string, error) {
  function scanForSheBang (line 85) | func scanForSheBang(content []byte) (string, error) {
  type languageGuess (line 146) | type languageGuess struct
  function DetermineLanguage (line 153) | func DetermineLanguage(filename string, fallbackLanguage string, possibl...

FILE: processor/detector_test.go
  function TestDetectLanguage (line 9) | func TestDetectLanguage(t *testing.T) {
  function TestDetectSheBangEmpty (line 20) | func TestDetectSheBangEmpty(t *testing.T) {
  function TestDetectSheBangPerl (line 30) | func TestDetectSheBangPerl(t *testing.T) {
  function TestDetectSheBangPhp (line 54) | func TestDetectSheBangPhp(t *testing.T) {
  function TestDetectSheBangPython (line 71) | func TestDetectSheBangPython(t *testing.T) {
  function TestDetectSheBangAWK (line 89) | func TestDetectSheBangAWK(t *testing.T) {
  function TestDetectSheBangCsh (line 107) | func TestDetectSheBangCsh(t *testing.T) {
  function TestDetectSheBangD (line 124) | func TestDetectSheBangD(t *testing.T) {
  function TestDetectSheBangNode (line 140) | func TestDetectSheBangNode(t *testing.T) {
  function TestDetectSheBangLisp (line 157) | func TestDetectSheBangLisp(t *testing.T) {
  function TestDetectSheBangRacket (line 174) | func TestDetectSheBangRacket(t *testing.T) {
  function TestDetectSheBangFish (line 191) | func TestDetectSheBangFish(t *testing.T) {
  function TestDetectSheBangShell (line 209) | func TestDetectSheBangShell(t *testing.T) {
  function TestDetectSheBangRuby (line 226) | func TestDetectSheBangRuby(t *testing.T) {
  function TestDetectSheBangLua (line 243) | func TestDetectSheBangLua(t *testing.T) {
  function TestDetectSheBangMultiple (line 260) | func TestDetectSheBangMultiple(t *testing.T) {
  function TestDetectSheBangMultipleNewLine (line 270) | func TestDetectSheBangMultipleNewLine(t *testing.T) {
  function TestScanSheBang (line 281) | func TestScanSheBang(t *testing.T) {
  function TestScanSheBangFuzz (line 303) | func TestScanSheBangFuzz(t *testing.T) {
  function TestCheckFullNameSheBang (line 313) | func TestCheckFullNameSheBang(t *testing.T) {
  function TestCheckFullNameLicense (line 327) | func TestCheckFullNameLicense(t *testing.T) {
  function TestCheckFullNameXMake (line 341) | func TestCheckFullNameXMake(t *testing.T) {
  function TestGuessLanguageCoq (line 368) | func TestGuessLanguageCoq(t *testing.T) {
  function TestGuessLanguageSystemVerilog (line 376) | func TestGuessLanguageSystemVerilog(t *testing.T) {
  function TestGuessLanguageLanguageSetNoPossible (line 384) | func TestGuessLanguageLanguageSetNoPossible(t *testing.T) {
  function TestGuessLanguageSingleLanguageSet (line 392) | func TestGuessLanguageSingleLanguageSet(t *testing.T) {
  function TestGuessLanguageLanguageEmptyContent (line 400) | func TestGuessLanguageLanguageEmptyContent(t *testing.T) {
  function BenchmarkScanSheBangFuzz (line 410) | func BenchmarkScanSheBangFuzz(b *testing.B) {
  function BenchmarkScanSheBangReal (line 416) | func BenchmarkScanSheBangReal(b *testing.B) {

FILE: processor/file.go
  function getExtension (line 19) | func getExtension(name string) string {
  function newFileJob (line 44) | func newFileJob(path, name string, fileInfo os.FileInfo) *FileJob {

FILE: processor/file_test.go
  function TestGetExtension (line 11) | func TestGetExtension(t *testing.T) {
  function TestGetExtensionNoExtension (line 20) | func TestGetExtensionNoExtension(t *testing.T) {
  function TestGetExtensionMultipleDots (line 29) | func TestGetExtensionMultipleDots(t *testing.T) {
  function TestGetExtensionMultipleExtensions (line 38) | func TestGetExtensionMultipleExtensions(t *testing.T) {
  function TestGetExtensionStartsWith (line 47) | func TestGetExtensionStartsWith(t *testing.T) {
  function TestGetExtensionTypeScriptDefinition (line 56) | func TestGetExtensionTypeScriptDefinition(t *testing.T) {
  function TestGetExtensionSecondPass (line 65) | func TestGetExtensionSecondPass(t *testing.T) {
  function TestNewFileJobFullname (line 75) | func TestNewFileJobFullname(t *testing.T) {
  function TestNewFileJob (line 87) | func TestNewFileJob(t *testing.T) {
  function TestNewFileJobGitIgnore (line 98) | func TestNewFileJobGitIgnore(t *testing.T) {
  function TestNewFileJobIgnore (line 111) | func TestNewFileJobIgnore(t *testing.T) {
  function TestNewFileJobLicense (line 123) | func TestNewFileJobLicense(t *testing.T) {
  function TestNewFileJobYAML (line 134) | func TestNewFileJobYAML(t *testing.T) {
  function TestNewFileJobYAMLCloudformation (line 152) | func TestNewFileJobYAMLCloudformation(t *testing.T) {
  function TestNewFileJobSize (line 170) | func TestNewFileJobSize(t *testing.T) {
  function BenchmarkGetExtensionDifferent (line 186) | func BenchmarkGetExtensionDifferent(b *testing.B) {
  function BenchmarkGetExtensionSame (line 197) | func BenchmarkGetExtensionSame(b *testing.B) {
  constant letterBytes (line 205) | letterBytes = "abcdefghijklmnopqrstuvwxyz"
  function randStringBytes (line 207) | func randStringBytes(n int) string {

FILE: processor/filereader.go
  type FileReader (line 13) | type FileReader struct
    method ReadFile (line 25) | func (reader *FileReader) ReadFile(path string, size int) ([]byte, err...
  function NewFileReader (line 18) | func NewFileReader() FileReader {

FILE: processor/formatters.go
  function sortSummaryFiles (line 80) | func sortSummaryFiles(summary *LanguageSummary) {
  type languageSummaryCloc (line 114) | type languageSummaryCloc struct
  type summaryStruct (line 122) | type summaryStruct struct
  type headerStruct (line 129) | type headerStruct struct
  type languageReportStart (line 139) | type languageReportStart struct
  type languageReportEnd (line 143) | type languageReportEnd struct
  function getTabularShortBreak (line 147) | func getTabularShortBreak() string {
  function getTabularWideBreak (line 159) | func getTabularWideBreak() string {
  function toClocYAML (line 171) | func toClocYAML(input chan *FileJob) string {
  function toJSON (line 242) | func toJSON(input chan *FileJob) string {
  type Json2 (line 255) | type Json2 struct
  function toJSON2 (line 272) | func toJSON2(input chan *FileJob) string {
  function toCSV (line 312) | func toCSV(input chan *FileJob) string {
  function toCSVSummary (line 320) | func toCSVSummary(input chan *FileJob) string {
  function getCSVFilesSortFunc (line 358) | func getCSVFilesSortFunc(sortBy string) func(a, b []string) int {
  function toCSVFiles (line 413) | func toCSVFiles(input chan *FileJob) string {
  function toOpenMetrics (line 456) | func toOpenMetrics(input chan *FileJob) string {
  function toOpenMetricsSummary (line 464) | func toOpenMetricsSummary(input chan *FileJob) string {
  function toOpenMetricsFiles (line 482) | func toOpenMetricsFiles(input chan *FileJob) string {
  function toCSVStream (line 501) | func toCSVStream(input chan *FileJob) string {
  function toHtml (line 528) | func toHtml(input chan *FileJob) string {
  function toHtmlTable (line 534) | func toHtmlTable(input chan *FileJob) string {
  function toSqlInsert (line 680) | func toSqlInsert(input chan *FileJob) string {
  function escapeSQLString (line 748) | func escapeSQLString(input string) string {
  function toSql (line 766) | func toSql(input chan *FileJob) string {
  function fileSummarize (line 794) | func fileSummarize(input chan *FileJob) string {
  function fileSummarizeMulti (line 830) | func fileSummarizeMulti(input chan *FileJob) string {
  function fileSummarizeLong (line 898) | func fileSummarizeLong(input chan *FileJob) string {
  function unicodeAwareTrim (line 1063) | func unicodeAwareTrim(tmp string, size int) string {
  function unicodeAwareRightPad (line 1083) | func unicodeAwareRightPad(tmp string, size int) string {
  function fileSummarizeShort (line 1087) | func fileSummarizeShort(input chan *FileJob) string {
  function maxIn (line 1281) | func maxIn(i []int) int {
  function meanIn (line 1289) | func meanIn(i []int) int {
  function trimNameShort (line 1302) | func trimNameShort(summary LanguageSummary, trimmedName string) string {
  function calculateCocomoSLOCCount (line 1309) | func calculateCocomoSLOCCount(sumCode int64, str *strings.Builder) {
  function calculateCocomo (line 1330) | func calculateCocomo(sumCode int64, str *strings.Builder) {
  function esstimateCostScheduleMonths (line 1344) | func esstimateCostScheduleMonths(sumCode int64) (float64, float64, float...
  function calculateLocomo (line 1355) | func calculateLocomo(sumCode, sumComplexity int64, str *strings.Builder) {
  function calculateSize (line 1378) | func calculateSize(sumBytes int64, str *strings.Builder) {
  function isLeapYear (line 1423) | func isLeapYear(year int) bool {
  function aggregateLanguageSummary (line 1435) | func aggregateLanguageSummary(input chan *FileJob) []LanguageSummary {
  function sortLanguageSummary (line 1490) | func sortLanguageSummary(language []LanguageSummary) []LanguageSummary {

FILE: processor/formatters_test.go
  function TestCalculateCocomo (line 15) | func TestCalculateCocomo(t *testing.T) {
  function TestCalculateSizeSingleByte (line 24) | func TestCalculateSizeSingleByte(t *testing.T) {
  function TestCalculateSize (line 33) | func TestCalculateSize(t *testing.T) {
  function TestSortSummaryFilesEmpty (line 42) | func TestSortSummaryFilesEmpty(t *testing.T) {
  function TestSortSummaryFiles (line 47) | func TestSortSummaryFiles(t *testing.T) {
  function TestSortSummaryFilesName (line 142) | func TestSortSummaryFilesName(t *testing.T) {
  function TestSortLanguageSummaryName (line 176) | func TestSortLanguageSummaryName(t *testing.T) {
  function TestSortLanguageSummaryLine (line 196) | func TestSortLanguageSummaryLine(t *testing.T) {
  function TestSortLanguageSummaryBlank (line 220) | func TestSortLanguageSummaryBlank(t *testing.T) {
  function TestSortLanguageSummaryCode (line 244) | func TestSortLanguageSummaryCode(t *testing.T) {
  function TestSortLanguageSummaryComment (line 268) | func TestSortLanguageSummaryComment(t *testing.T) {
  function TestSortLanguageSummaryComplexity (line 292) | func TestSortLanguageSummaryComplexity(t *testing.T) {
  function TestSortLanguageSummaryBytes (line 316) | func TestSortLanguageSummaryBytes(t *testing.T) {
  function TestSortLanguageSummaryFiles (line 340) | func TestSortLanguageSummaryFiles(t *testing.T) {
  function TestSortSummaryNames (line 364) | func TestSortSummaryNames(t *testing.T) {
  function TestToJSONEmpty (line 388) | func TestToJSONEmpty(t *testing.T) {
  function TestToJSONSingle (line 398) | func TestToJSONSingle(t *testing.T) {
  function TestToJSONSingleWithoutFiles (line 428) | func TestToJSONSingleWithoutFiles(t *testing.T) {
  function TestToJSONMultiple (line 458) | func TestToJSONMultiple(t *testing.T) {
  function TestToYAMLEmpty (line 499) | func TestToYAMLEmpty(t *testing.T) {
  function TestToYAMLSingle (line 509) | func TestToYAMLSingle(t *testing.T) {
  function TestToYAMLMultiple (line 535) | func TestToYAMLMultiple(t *testing.T) {
  function TestToCsvMultiple (line 575) | func TestToCsvMultiple(t *testing.T) {
  function TestToCsvStreamMultiple (line 615) | func TestToCsvStreamMultiple(t *testing.T) {
  function TestToCsvFilesSorted (line 655) | func TestToCsvFilesSorted(t *testing.T) {
  function TestToOpenMetricsMultiple (line 707) | func TestToOpenMetricsMultiple(t *testing.T) {
  function TestToSQLSingle (line 772) | func TestToSQLSingle(t *testing.T) {
  function TestFileSummarizeWide (line 816) | func TestFileSummarizeWide(t *testing.T) {
  function TestFileSummarizeJson (line 844) | func TestFileSummarizeJson(t *testing.T) {
  function TestFileSummarizeCsv (line 872) | func TestFileSummarizeCsv(t *testing.T) {
  function TestFileSummarizeYaml (line 899) | func TestFileSummarizeYaml(t *testing.T) {
  function TestFileSummarizeYml (line 926) | func TestFileSummarizeYml(t *testing.T) {
  function TestFileSummarizeOpenMetrics (line 953) | func TestFileSummarizeOpenMetrics(t *testing.T) {
  function TestFileSummarizeOpenMetricsPerFile (line 1005) | func TestFileSummarizeOpenMetricsPerFile(t *testing.T) {
  function TestFileSummarizeHtml (line 1057) | func TestFileSummarizeHtml(t *testing.T) {
  function TestFileSummarizeHtmlTable (line 1084) | func TestFileSummarizeHtmlTable(t *testing.T) {
  function TestFileSummarizeDefault (line 1111) | func TestFileSummarizeDefault(t *testing.T) {
  function TestFileSummarizeLong (line 1138) | func TestFileSummarizeLong(t *testing.T) {
  function TestFileSummarizeShort (line 1176) | func TestFileSummarizeShort(t *testing.T) {
  function TestFileSummarizeShortSort (line 1214) | func TestFileSummarizeShortSort(t *testing.T) {
  function TestFileSummarizeLongSort (line 1259) | func TestFileSummarizeLongSort(t *testing.T) {
  function TestGetTabularShortBreak (line 1304) | func TestGetTabularShortBreak(t *testing.T) {
  function TestGetTabularWideBreak (line 1322) | func TestGetTabularWideBreak(t *testing.T) {
  function TestToHTML (line 1355) | func TestToHTML(t *testing.T) {
  function TestToHTMLTable (line 1407) | func TestToHTMLTable(t *testing.T) {
  function TestUnicodeAwareTrimAscii (line 1435) | func TestUnicodeAwareTrimAscii(t *testing.T) {
  function TestUnicodeAwareTrimExactSizeAscii (line 1443) | func TestUnicodeAwareTrimExactSizeAscii(t *testing.T) {
  function TestUnicodeAwareTrimUnicode (line 1451) | func TestUnicodeAwareTrimUnicode(t *testing.T) {
  function TestUnicodeAwareRightPad (line 1459) | func TestUnicodeAwareRightPad(t *testing.T) {
  function TestUnicodeAwareRightPadUnicode (line 1466) | func TestUnicodeAwareRightPadUnicode(t *testing.T) {
  function BenchmarkUnicodeAwareTrimExactSizeAscii (line 1473) | func BenchmarkUnicodeAwareTrimExactSizeAscii(b *testing.B) {
  function BenchmarkUnicodeAwareTrimUnicode (line 1483) | func BenchmarkUnicodeAwareTrimUnicode(b *testing.B) {
  function BenchmarkUnicodeAwareRightPad (line 1493) | func BenchmarkUnicodeAwareRightPad(b *testing.B) {
  function BenchmarkUnicodeAwareRightPadUnicode (line 1502) | func BenchmarkUnicodeAwareRightPadUnicode(b *testing.B) {
  function BenchmarkFileSummerize (line 1513) | func BenchmarkFileSummerize(b *testing.B) {
  function TestGetCSVFilesSortFunc (line 1543) | func TestGetCSVFilesSortFunc(t *testing.T) {
  function TestToCSVFilesHeader (line 1605) | func TestToCSVFilesHeader(t *testing.T) {
  function TestToCSVStreamHeader (line 1644) | func TestToCSVStreamHeader(t *testing.T) {
  function TestToJSONKeys (line 1701) | func TestToJSONKeys(t *testing.T) {
  function TestToJSON2Keys (line 1763) | func TestToJSON2Keys(t *testing.T) {

FILE: processor/helpers.go
  function makeTimestampMilli (line 10) | func makeTimestampMilli() int64 {
  function makeTimestampNano (line 16) | func makeTimestampNano() int64 {

FILE: processor/helpers_test.go
  function TestMakeTimestampNano (line 10) | func TestMakeTimestampNano(t *testing.T) {
  function TestMakeTimestampMilli (line 19) | func TestMakeTimestampMilli(t *testing.T) {

FILE: processor/locomo.go
  type LocomoPreset (line 18) | type LocomoPreset struct
  type LocomoResult (line 37) | type LocomoResult struct
  function GetLocomoPreset (line 49) | func GetLocomoPreset(name string) LocomoPreset {
  function LocomoComplexityDensity (line 58) | func LocomoComplexityDensity(complexity, code int64) float64 {
  function LocomoComplexityFactor (line 67) | func LocomoComplexityFactor(complexityDensity, complexityWeight float64)...
  function LocomoIterationFactor (line 73) | func LocomoIterationFactor(complexityDensity, baseIterations, iterationW...
  function LocomoEstimate (line 78) | func LocomoEstimate(sumCode, sumComplexity int64) LocomoResult {
  function parseLocomoConfig (line 140) | func parseLocomoConfig(config string, tokensPerLine, baseInputPerLine, c...

FILE: processor/locomo_test.go
  function TestLocomoComplexityDensityZeroCode (line 10) | func TestLocomoComplexityDensityZeroCode(t *testing.T) {
  function TestLocomoComplexityDensity (line 17) | func TestLocomoComplexityDensity(t *testing.T) {
  function TestLocomoComplexityFactor (line 24) | func TestLocomoComplexityFactor(t *testing.T) {
  function TestLocomoComplexityFactorLowDensity (line 32) | func TestLocomoComplexityFactorLowDensity(t *testing.T) {
  function TestLocomoIterationFactor (line 40) | func TestLocomoIterationFactor(t *testing.T) {
  function TestLocomoIterationFactorLowDensity (line 48) | func TestLocomoIterationFactorLowDensity(t *testing.T) {
  function TestLocomoEstimateBasic (line 56) | func TestLocomoEstimateBasic(t *testing.T) {
  function TestLocomoEstimateZeroCode (line 101) | func TestLocomoEstimateZeroCode(t *testing.T) {
  function TestLocomoEstimateHighComplexity (line 124) | func TestLocomoEstimateHighComplexity(t *testing.T) {
  function TestLocomoEstimateLocalLlama (line 151) | func TestLocomoEstimateLocalLlama(t *testing.T) {
  function TestGetLocomoPresetUnknown (line 174) | func TestGetLocomoPresetUnknown(t *testing.T) {
  function TestParseLocomoConfig (line 181) | func TestParseLocomoConfig(t *testing.T) {
  function TestParseLocomoConfigInvalid (line 190) | func TestParseLocomoConfigInvalid(t *testing.T) {
  function TestLocomoEstimateIterationFactorPopulated (line 200) | func TestLocomoEstimateIterationFactorPopulated(t *testing.T) {
  function TestLocomoCyclesOverride (line 225) | func TestLocomoCyclesOverride(t *testing.T) {
  function TestParseLocomoConfigPartialInvalid (line 264) | func TestParseLocomoConfigPartialInvalid(t *testing.T) {

FILE: processor/processor.go
  function ConfigureGc (line 276) | func ConfigureGc() {
  function ConfigureLazy (line 281) | func ConfigureLazy(lazy bool) {
  function ProcessConstants (line 287) | func ProcessConstants() {
  function setupCountAs (line 356) | func setupCountAs() {
  function LoadLanguageFeature (line 395) | func LoadLanguageFeature(loadName string) {
  function processLanguageFeature (line 422) | func processLanguageFeature(name string, value Language) {
  function processFlags (line 488) | func processFlags() {
  function LanguageDatabase (line 551) | func LanguageDatabase() map[string]Language {
  function printLanguages (line 555) | func printLanguages() {
  function Process (line 576) | func Process() {

FILE: processor/processor_test.go
  function TestProcessConstants (line 9) | func TestProcessConstants(t *testing.T) {
  function TestProcessConstantsPathExclude (line 22) | func TestProcessConstantsPathExclude(t *testing.T) {
  function TestConfigureGc (line 33) | func TestConfigureGc(t *testing.T) {
  function TestConfigureLazy (line 37) | func TestConfigureLazy(t *testing.T) {
  function TestLoadLanguageFeature (line 49) | func TestLoadLanguageFeature(t *testing.T) {
  function TestLoadLanguageFeatureNew (line 59) | func TestLoadLanguageFeatureNew(t *testing.T) {
  function TestProcessFlags (line 75) | func TestProcessFlags(t *testing.T) {
  function TestPrintLanguages (line 87) | func TestPrintLanguages(t *testing.T) {
  function TestProcess (line 91) | func TestProcess(t *testing.T) {
  function TestSetupCountAsLanguage (line 95) | func TestSetupCountAsLanguage(t *testing.T) {
  function TestSetupCountAsLanguageCase (line 108) | func TestSetupCountAsLanguageCase(t *testing.T) {
  function TestSetupCountAsExtension (line 121) | func TestSetupCountAsExtension(t *testing.T) {
  function TestSetupCountAsMultiple (line 134) | func TestSetupCountAsMultiple(t *testing.T) {

FILE: processor/result.go
  function ProcessResult (line 18) | func ProcessResult() ([]LanguageSummary, error) {

FILE: processor/similar_flags.go
  constant SimilarStringThreshold (line 12) | SimilarStringThreshold float64 = 0.75
  function StringSimilarRatio (line 26) | func StringSimilarRatio(s1, s2 string) float64 {
  type similarFlag (line 31) | type similarFlag struct
  function GetMostSimilarFlags (line 36) | func GetMostSimilarFlags(flagSet *pflag.FlagSet, flag string) []string {

FILE: processor/similar_flags_test.go
  function TestStringSimilarRatio (line 10) | func TestStringSimilarRatio(t *testing.T) {
  function TestGetMostSimilarFlags (line 114) | func TestGetMostSimilarFlags(t *testing.T) {

FILE: processor/structs.go
  constant TString (line 14) | TString int = iota + 1
  constant TSlcomment (line 15) | TSlcomment
  constant TMlcomment (line 16) | TMlcomment
  constant TComplexity (line 17) | TComplexity
  constant ByteTypeBlank (line 24) | ByteTypeBlank   byte = 0
  constant ByteTypeCode (line 25) | ByteTypeCode    byte = 1
  constant ByteTypeComment (line 26) | ByteTypeComment byte = 2
  constant ByteTypeString (line 27) | ByteTypeString  byte = 3
  type Quote (line 31) | type Quote struct
  type Language (line 39) | type Language struct
  type LanguageFeature (line 53) | type LanguageFeature struct
  type FileJobCallback (line 72) | type FileJobCallback interface
  type FileJob (line 78) | type FileJob struct
    method FilterContentByType (line 109) | func (fj *FileJob) FilterContentByType(keepTypes ...byte) []byte {
  type LanguageSummary (line 131) | type LanguageSummary struct
  type OpenClose (line 148) | type OpenClose struct
  type CheckDuplicates (line 155) | type CheckDuplicates struct
    method Add (line 161) | func (c *CheckDuplicates) Add(key int64, hash []byte) {
    method Check (line 171) | func (c *CheckDuplicates) Check(key int64, hash []byte) bool {
  type Trie (line 180) | type Trie struct
    method Insert (line 187) | func (root *Trie) Insert(tokenType int, token []byte) {
    method InsertClose (line 201) | func (root *Trie) InsertClose(tokenType int, openToken, closeToken []b...
    method Match (line 216) | func (root *Trie) Match(token []byte) (int, int, []byte) {

FILE: processor/structs_test.go
  function TestCheckDuplicates (line 12) | func TestCheckDuplicates(t *testing.T) {
  function TestMatch (line 37) | func TestMatch(t *testing.T) {
  function TestFileJobJSONIgnoreFields (line 100) | func TestFileJobJSONIgnoreFields(t *testing.T) {

FILE: processor/trace.go
  type traceLevel (line 10) | type traceLevel
    method String (line 19) | func (tl traceLevel) String() string {
  constant levelTrace (line 13) | levelTrace traceLevel = iota + 1
  constant levelDebug (line 14) | levelDebug
  constant levelWarn (line 15) | levelWarn
  constant levelError (line 16) | levelError
  function getFormattedTime (line 35) | func getFormattedTime() string {
  function prepareMsg (line 39) | func prepareMsg(template string, args []any) string {
  function doPrint (line 47) | func doPrint(dst io.Writer, level traceLevel, template string, args []an...
  function printWarn (line 52) | func printWarn(msg string) {
  function printWarnF (line 59) | func printWarnF(msg string, args ...any) {
  function printDebug (line 66) | func printDebug(msg string) {
  function printDebugF (line 73) | func printDebugF(msg string, args ...any) {
  function printTrace (line 80) | func printTrace(msg string) {
  function printTraceF (line 87) | func printTraceF(msg string, args ...any) {
  function printError (line 94) | func printError(msg string) {

FILE: processor/trace_test.go
  function TestTraceLevel (line 9) | func TestTraceLevel(t *testing.T) {
  function TestDoPrint (line 27) | func TestDoPrint(t *testing.T) {
  function TestPrintTrace (line 70) | func TestPrintTrace(t *testing.T) {
  function TestPrintDebug (line 77) | func TestPrintDebug(t *testing.T) {
  function TestPrintWarn (line 84) | func TestPrintWarn(t *testing.T) {
  function TestPrintError (line 91) | func TestPrintError(t *testing.T) {
  function TestPrintWarnF (line 95) | func TestPrintWarnF(t *testing.T) {
  function TestPrintDebugF (line 99) | func TestPrintDebugF(t *testing.T) {
  function TestPrintTraceF (line 103) | func TestPrintTraceF(t *testing.T) {
  function TestGetFormattedTime (line 107) | func TestGetFormattedTime(t *testing.T) {

FILE: processor/workers.go
  constant SBlank (line 18) | SBlank             int64 = 1
  constant SCode (line 19) | SCode              int64 = 2
  constant SComment (line 20) | SComment           int64 = 3
  constant SCommentCode (line 21) | SCommentCode       int64 = 4
  constant SMulticomment (line 22) | SMulticomment      int64 = 5
  constant SMulticommentCode (line 23) | SMulticommentCode  int64 = 6
  constant SMulticommentBlank (line 24) | SMulticommentBlank int64 = 7
  constant SString (line 25) | SString            int64 = 8
  constant SDocString (line 26) | SDocString         int64 = 9
  constant SheBang (line 30) | SheBang string = "#!"
  type LineType (line 33) | type LineType
  constant LINE_BLANK (line 37) | LINE_BLANK LineType = iota
  constant LINE_CODE (line 38) | LINE_CODE
  constant LINE_COMMENT (line 39) | LINE_COMMENT
  function checkForMatchSingle (line 65) | func checkForMatchSingle(currentByte byte, index int, endPoint int, matc...
  function isWhitespace (line 83) | func isWhitespace(currentByte byte) bool {
  function isBinary (line 93) | func isBinary(index int, currentByte byte) bool {
  function shouldProcess (line 97) | func shouldProcess(currentByte, processBytesMask byte) bool {
  function stateToByteType (line 101) | func stateToByteType(state int64) byte {
  function resetState (line 114) | func resetState(currentState int64) int64 {
  function stringState (line 127) | func stringState(fileJob *FileJob, index int, endPoint int, endString []...
  function docStringState (line 175) | func docStringState(fileJob *FileJob, index int, endPoint int, stringTri...
  function codeState (line 215) | func codeState(
  function commentState (line 296) | func commentState(fileJob *FileJob, index int, endPoint int, currentStat...
  function blankState (line 343) | func blankState(
  function verifyIgnoreEscape (line 410) | func verifyIgnoreEscape(langFeatures LanguageFeature, fileJob *FileJob, ...
  function CountStats (line 441) | func CountStats(fileJob *FileJob) {
  function minifiedGeneratedCheck (line 658) | func minifiedGeneratedCheck(avgLineByteCount int, fileJob *FileJob) {
  function checkBomSkip (line 669) | func checkBomSkip(fileJob *FileJob) int {
  function fileProcessorWorker (line 691) | func fileProcessorWorker(input chan *FileJob, output chan *FileJob) {
  function processFile (line 746) | func processFile(job *FileJob) bool {
  function hardRemapLanguage (line 838) | func hardRemapLanguage(job *FileJob) bool {
  function unknownRemapLanguage (line 856) | func unknownRemapLanguage(job *FileJob) bool {

FILE: processor/workers_regression_test.go
  function TestCountStatsIssue72 (line 9) | func TestCountStatsIssue72(t *testing.T) {
  function TestCountStatsPr76 (line 54) | func TestCountStatsPr76(t *testing.T) {
  function TestCountStatsIssue62 (line 84) | func TestCountStatsIssue62(t *testing.T) {
  function TestCountStatsIssue123 (line 125) | func TestCountStatsIssue123(t *testing.T) {
  function TestCountStatsIssue230 (line 154) | func TestCountStatsIssue230(t *testing.T) {
  function TestCountStatsComplexityLines (line 191) | func TestCountStatsComplexityLines(t *testing.T) {

FILE: processor/workers_test.go
  method SetContent (line 12) | func (job *FileJob) SetContent(content string) {
  function TestIsWhitespace (line 17) | func TestIsWhitespace(t *testing.T) {
  function TestIsBinaryTrue (line 23) | func TestIsBinaryTrue(t *testing.T) {
  function TestIsBinaryDisableCheck (line 31) | func TestIsBinaryDisableCheck(t *testing.T) {
  function TestCountStatsLines (line 39) | func TestCountStatsLines(t *testing.T) {
  function TestCountStatsCode (line 107) | func TestCountStatsCode(t *testing.T) {
  function TestCountStatsWithQuotes (line 185) | func TestCountStatsWithQuotes(t *testing.T) {
  function TestCountStatsBlankLines (line 231) | func TestCountStatsBlankLines(t *testing.T) {
  function TestCountStatsComplexityCount (line 292) | func TestCountStatsComplexityCount(t *testing.T) {
  function TestCountStatsComplexityCountFalse (line 317) | func TestCountStatsComplexityCountFalse(t *testing.T) {
  type linecounter (line 339) | type linecounter struct
    method ProcessLine (line 347) | func (l *linecounter) ProcessLine(job *FileJob, currentLine int64, lin...
  function TestCountStatsCallback (line 360) | func TestCountStatsCallback(t *testing.T) {
  function TestCountStatsCallbackInterrupt (line 389) | func TestCountStatsCallbackInterrupt(t *testing.T) {
  function TestCountStatsEdgeCase1 (line 412) | func TestCountStatsEdgeCase1(t *testing.T) {
  function TestCountStatsNestedComments (line 434) | func TestCountStatsNestedComments(t *testing.T) {
  function TestCountStatsNestedCommentsJava (line 462) | func TestCountStatsNestedCommentsJava(t *testing.T) {
  function TestCountStatsNestedCommentsRegression (line 489) | func TestCountStatsNestedCommentsRegression(t *testing.T) {
  function TestCountStatsSingleCommentRegression (line 516) | func TestCountStatsSingleCommentRegression(t *testing.T) {
  function TestCountStatsStringCheck (line 545) | func TestCountStatsStringCheck(t *testing.T) {
  function TestCountStatsBosque (line 575) | func TestCountStatsBosque(t *testing.T) {
  function TestCheckForMatchNoMatch (line 605) | func TestCheckForMatchNoMatch(t *testing.T) {
  function TestCheckForMatchHasMatch (line 624) | func TestCheckForMatchHasMatch(t *testing.T) {
  function TestCheckForMatchSingleNoMatch (line 643) | func TestCheckForMatchSingleNoMatch(t *testing.T) {
  function TestCheckForMatchSingleMatch (line 660) | func TestCheckForMatchSingleMatch(t *testing.T) {
  function TestCheckComplexityMatch (line 677) | func TestCheckComplexityMatch(t *testing.T) {
  function TestCheckComplexityNoMatch (line 696) | func TestCheckComplexityNoMatch(t *testing.T) {
  function TestCountStatsRubyRegression (line 715) | func TestCountStatsRubyRegression(t *testing.T) {
  function TestFileProcessorWorker (line 744) | func TestFileProcessorWorker(t *testing.T) {
  function TestEdgeCase (line 768) | func TestEdgeCase(t *testing.T) {
  function TestEdgeCaseOther (line 795) | func TestEdgeCaseOther(t *testing.T) {
  function TestCountStatsCSharpIgnoreEscape (line 822) | func TestCountStatsCSharpIgnoreEscape(t *testing.T) {
  function TestCheckBomSkipUTF8 (line 868) | func TestCheckBomSkipUTF8(t *testing.T) {
  function TestCheckBomSkip (line 879) | func TestCheckBomSkip(t *testing.T) {
  function TestCountStatsIssue73 (line 895) | func TestCountStatsIssue73(t *testing.T) {
  function TestCountStatsIssue106 (line 926) | func TestCountStatsIssue106(t *testing.T) {
  function TestMinifiedGeneratedCheck (line 937) | func TestMinifiedGeneratedCheck(t *testing.T) {
  function TestMinifiedGeneratedCheckTwoLines (line 952) | func TestMinifiedGeneratedCheckTwoLines(t *testing.T) {
  function TestMinifiedGeneratedCheckEdge (line 967) | func TestMinifiedGeneratedCheckEdge(t *testing.T) {
  function TestGenerated (line 982) | func TestGenerated(t *testing.T) {
  function TestCountStatsIssue182 (line 1007) | func TestCountStatsIssue182(t *testing.T) {
  function TestCountStatsIssue182Delphi (line 1044) | func TestCountStatsIssue182Delphi(t *testing.T) {
  function TestClassifyContentCountInvariance (line 1073) | func TestClassifyContentCountInvariance(t *testing.T) {
  function TestClassifyContentNilGuard (line 1115) | func TestClassifyContentNilGuard(t *testing.T) {
  function TestClassifyContentCodeOnly (line 1127) | func TestClassifyContentCodeOnly(t *testing.T) {
  function TestClassifyContentCommentOnly (line 1149) | func TestClassifyContentCommentOnly(t *testing.T) {
  function TestClassifyContentMultiLineComment (line 1176) | func TestClassifyContentMultiLineComment(t *testing.T) {
  function TestClassifyContentString (line 1196) | func TestClassifyContentString(t *testing.T) {
  function TestClassifyContentMixedLine (line 1221) | func TestClassifyContentMixedLine(t *testing.T) {
  function TestClassifyContentPythonDocstring (line 1251) | func TestClassifyContentPythonDocstring(t *testing.T) {
  function TestFilterContentByType (line 1276) | func TestFilterContentByType(t *testing.T) {
  function TestFilterContentByTypeNil (line 1308) | func TestFilterContentByTypeNil(t *testing.T) {
  function TestFilterContentByTypeMultiple (line 1319) | func TestFilterContentByTypeMultiple(t *testing.T) {
  function BenchmarkCountStatsLinesEmpty (line 1349) | func BenchmarkCountStatsLinesEmpty(b *testing.B) {
  function BenchmarkCountStatsLinesSingleChar (line 1359) | func BenchmarkCountStatsLinesSingleChar(b *testing.B) {
  function BenchmarkCountStatsLinesTwoLines (line 1369) | func BenchmarkCountStatsLinesTwoLines(b *testing.B) {
  function BenchmarkCountStatsLinesThreeLines (line 1379) | func BenchmarkCountStatsLinesThreeLines(b *testing.B) {
  function BenchmarkCountStatsLinesShortLine (line 1389) | func BenchmarkCountStatsLinesShortLine(b *testing.B) {
  function BenchmarkCountStatsLinesShortEmptyLine (line 1399) | func BenchmarkCountStatsLinesShortEmptyLine(b *testing.B) {
  function BenchmarkCountStatsLinesThreeShortLines (line 1409) | func BenchmarkCountStatsLinesThreeShortLines(b *testing.B) {
  function BenchmarkCountStatsLinesThreeShortEmptyLines (line 1419) | func BenchmarkCountStatsLinesThreeShortEmptyLines(b *testing.B) {
  function BenchmarkCountStatsLinesLongLine (line 1429) | func BenchmarkCountStatsLinesLongLine(b *testing.B) {
  function BenchmarkCountStatsLinesLongMixedLine (line 1439) | func BenchmarkCountStatsLinesLongMixedLine(b *testing.B) {
  function BenchmarkCountStatsLinesLongAlternateLine (line 1449) | func BenchmarkCountStatsLinesLongAlternateLine(b *testing.B) {
  function BenchmarkCountStatsLinesFiveHundredLongLines (line 1459) | func BenchmarkCountStatsLinesFiveHundredLongLines(b *testing.B) {
  function BenchmarkCountStatsLinesFiveHundredLongLinesTriggerComplexityIf (line 1475) | func BenchmarkCountStatsLinesFiveHundredLongLinesTriggerComplexityIf(b *...
  function BenchmarkCountStatsLinesFiveHundredLongLinesTriggerComplexityFor (line 1491) | func BenchmarkCountStatsLinesFiveHundredLongLinesTriggerComplexityFor(b ...
  function BenchmarkCountStatsLinesFourHundredLongLinesMixed (line 1507) | func BenchmarkCountStatsLinesFourHundredLongLinesMixed(b *testing.B) {
  function BenchmarkCheckByteEqualityReflect (line 1526) | func BenchmarkCheckByteEqualityReflect(b *testing.B) {
  function BenchmarkCheckByteEqualityBytes (line 1545) | func BenchmarkCheckByteEqualityBytes(b *testing.B) {
  function BenchmarkCheckByteEqualityLoop (line 1566) | func BenchmarkCheckByteEqualityLoop(b *testing.B) {
  function BenchmarkCheckByteEqualityLoopWithAdditional (line 1593) | func BenchmarkCheckByteEqualityLoopWithAdditional(b *testing.B) {
  function BenchmarkCheckArrayCheck (line 1620) | func BenchmarkCheckArrayCheck(b *testing.B) {
  function BenchmarkCheckMapCheck (line 1649) | func BenchmarkCheckMapCheck(b *testing.B) {
  function BenchmarkStringLoop (line 1678) | func BenchmarkStringLoop(b *testing.B) {
  function BenchmarkByteLoop (line 1700) | func BenchmarkByteLoop(b *testing.B) {
  function BenchmarkLoopInLoop (line 1722) | func BenchmarkLoopInLoop(b *testing.B) {
  function BenchmarkFlattenedLoop (line 1757) | func BenchmarkFlattenedLoop(b *testing.B) {
  function BenchmarkCheckComplexity (line 1785) | func BenchmarkCheckComplexity(b *testing.B) {
  function BenchmarkCheckLen (line 1814) | func BenchmarkCheckLen(b *testing.B) {
  function BenchmarkCheckLenPrecalc (line 1839) | func BenchmarkCheckLenPrecalc(b *testing.B) {
  function BenchmarkCountStatsNoClassify (line 1865) | func BenchmarkCountStatsNoClassify(b *testing.B) {
  function BenchmarkCountStatsWithClassify (line 1890) | func BenchmarkCountStatsWithClassify(b *testing.B) {

FILE: processor/workers_tokei_test.go
  function TestCountStatsJava (line 9) | func TestCountStatsJava(t *testing.T) {
  function TestCountStatsAccuracyCPlusPlus (line 58) | func TestCountStatsAccuracyCPlusPlus(t *testing.T) {
  function TestCountStatsAccuracyRakefile (line 100) | func TestCountStatsAccuracyRakefile(t *testing.T) {
  function TestCountStatsAccuracyRuby (line 137) | func TestCountStatsAccuracyRuby(t *testing.T) {
  function TestCountStatsAccuracyTokeiTest (line 184) | func TestCountStatsAccuracyTokeiTest(t *testing.T) {

FILE: scripts/include.go
  constant constantsFile (line 20) | constantsFile = "./processor/constants.go"
  function generateConstants (line 29) | func generateConstants() error {
  function main (line 87) | func main() {

FILE: vendor/github.com/agnivade/levenshtein/levenshtein.go
  constant minLengthThreshold (line 12) | minLengthThreshold = 32
  function ComputeDistance (line 20) | func ComputeDistance(a, b string) int {
  function trimLongestCommonSuffix (line 92) | func trimLongestCommonSuffix(a, b []rune) ([]rune, []rune) {
  function trimLongestCommonPrefix (line 104) | func trimLongestCommonPrefix(a, b []rune) ([]rune, []rune) {

FILE: vendor/github.com/bahlo/generic-list-go/list.go
  type Element (line 15) | type Element struct
  method Next (line 31) | func (e *Element[T]) Next() *Element[T] {
  method Prev (line 39) | func (e *Element[T]) Prev() *Element[T] {
  type List (line 48) | type List struct
  method Init (line 54) | func (l *List[T]) Init() *List[T] {
  function New (line 62) | func New[T any]() *List[T] { return new(List[T]).Init() }
  method Len (line 66) | func (l *List[T]) Len() int { return l.len }
  method Front (line 69) | func (l *List[T]) Front() *Element[T] {
  method Back (line 77) | func (l *List[T]) Back() *Element[T] {
  method lazyInit (line 85) | func (l *List[T]) lazyInit() {
  method insert (line 92) | func (l *List[T]) insert(e, at *Element[T]) *Element[T] {
  method insertValue (line 103) | func (l *List[T]) insertValue(v T, at *Element[T]) *Element[T] {
  method remove (line 108) | func (l *List[T]) remove(e *Element[T]) {
  method move (line 118) | func (l *List[T]) move(e, at *Element[T]) {
  method Remove (line 134) | func (l *List[T]) Remove(e *Element[T]) T {
  method PushFront (line 144) | func (l *List[T]) PushFront(v T) *Element[T] {
  method PushBack (line 150) | func (l *List[T]) PushBack(v T) *Element[T] {
  method InsertBefore (line 158) | func (l *List[T]) InsertBefore(v T, mark *Element[T]) *Element[T] {
  method InsertAfter (line 169) | func (l *List[T]) InsertAfter(v T, mark *Element[T]) *Element[T] {
  method MoveToFront (line 180) | func (l *List[T]) MoveToFront(e *Element[T]) {
  method MoveToBack (line 191) | func (l *List[T]) MoveToBack(e *Element[T]) {
  method MoveBefore (line 202) | func (l *List[T]) MoveBefore(e, mark *Element[T]) {
  method MoveAfter (line 212) | func (l *List[T]) MoveAfter(e, mark *Element[T]) {
  method PushBackList (line 221) | func (l *List[T]) PushBackList(other *List[T]) {
  method PushFrontList (line 230) | func (l *List[T]) PushFrontList(other *List[T]) {

FILE: vendor/github.com/boyter/gocodewalker/dir_suffix.go
  function isSuffixDir (line 19) | func isSuffixDir(base string, suffix string) bool {

FILE: vendor/github.com/boyter/gocodewalker/file.go
  constant GitIgnore (line 27) | GitIgnore             = ".gitignore"
  constant Ignore (line 28) | Ignore                = ".ignore"
  constant GitModules (line 29) | GitModules            = ".gitmodules"
  constant IgnoreBinaryFileBytes (line 30) | IgnoreBinaryFileBytes = 1000
  type SkipReason (line 37) | type SkipReason
  constant SkipReasonGitignore (line 40) | SkipReasonGitignore              SkipReason = "gitignore"
  constant SkipReasonIgnoreFile (line 41) | SkipReasonIgnoreFile             SkipReason = "ignore_file"
  constant SkipReasonCustomIgnore (line 42) | SkipReasonCustomIgnore           SkipReason = "custom_ignore"
  constant SkipReasonModuleIgnore (line 43) | SkipReasonModuleIgnore           SkipReason = "module_ignore"
  constant SkipReasonIncludeFilename (line 44) | SkipReasonIncludeFilename        SkipReason = "include_filename"
  constant SkipReasonExcludeFilename (line 45) | SkipReasonExcludeFilename        SkipReason = "exclude_filename"
  constant SkipReasonIncludeFilenameRegex (line 46) | SkipReasonIncludeFilenameRegex   SkipReason = "include_filename_regex"
  constant SkipReasonExcludeFilenameRegex (line 47) | SkipReasonExcludeFilenameRegex   SkipReason = "exclude_filename_regex"
  constant SkipReasonHidden (line 48) | SkipReasonHidden                 SkipReason = "hidden"
  constant SkipReasonAllowListExtension (line 49) | SkipReasonAllowListExtension     SkipReason = "allow_list_extension"
  constant SkipReasonExcludeListExtension (line 50) | SkipReasonExcludeListExtension   SkipReason = "exclude_list_extension"
  constant SkipReasonLocationExcludePattern (line 51) | SkipReasonLocationExcludePattern SkipReason = "location_exclude_pattern"
  constant SkipReasonBinary (line 52) | SkipReasonBinary                 SkipReason = "binary"
  constant SkipReasonIncludeDirectory (line 53) | SkipReasonIncludeDirectory       SkipReason = "include_directory"
  constant SkipReasonExcludeDirectory (line 54) | SkipReasonExcludeDirectory       SkipReason = "exclude_directory"
  constant SkipReasonIncludeDirectoryRegex (line 55) | SkipReasonIncludeDirectoryRegex  SkipReason = "include_directory_regex"
  constant SkipReasonExcludeDirectoryRegex (line 56) | SkipReasonExcludeDirectoryRegex  SkipReason = "exclude_directory_regex"
  type File (line 60) | type File struct
  type FileWalker (line 67) | type FileWalker struct
    method SetConcurrency (line 183) | func (f *FileWalker) SetConcurrency(i int) {
    method Walking (line 193) | func (f *FileWalker) Walking() bool {
    method Terminate (line 203) | func (f *FileWalker) Terminate() {
    method SetErrorHandler (line 212) | func (f *FileWalker) SetErrorHandler(errors func(error) bool) {
    method SetSkipHandler (line 221) | func (f *FileWalker) SetSkipHandler(handler func(path string, name str...
    method Start (line 231) | func (f *FileWalker) Start() error {
    method walkDirectoryRecursive (line 266) | func (f *FileWalker) walkDirectoryRecursive(iteration int,
  function NewFileWalker (line 104) | func NewFileWalker(directory string, fileListQueue chan<- *File) *FileWa...
  function NewParallelFileWalker (line 142) | func NewParallelFileWalker(directories []string, fileListQueue chan<- *F...
  function FindRepositoryRoot (line 788) | func FindRepositoryRoot(startDirectory string) string {
  function checkForGitOrMercurial (line 822) | func checkForGitOrMercurial(curdir string) bool {
  function GetExtension (line 837) | func GetExtension(name string) string {

FILE: vendor/github.com/boyter/gocodewalker/gitmodule.go
  function extractGitModuleFolders (line 8) | func extractGitModuleFolders(input string) []string {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/cache.go
  type Cache (line 10) | type Cache interface
  type cache (line 20) | type cache struct
    method Set (line 32) | func (c *cache) Set(path string, ignore GitIgnore) {
    method Get (line 50) | func (c *cache) Get(path string) GitIgnore {
  function NewCache (line 27) | func NewCache() Cache {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/error.go
  type Error (line 5) | type Error interface
  type err (line 17) | type err struct
    method Position (line 27) | func (e *err) Position() Position { return e._position }
    method Underlying (line 29) | func (e *err) Underlying() error { return e.error }
  function NewError (line 23) | func NewError(e error, p Position) Error {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/exclude.go
  function exclude (line 12) | func exclude(path string) (GitIgnore, error) {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/gitignore.go
  type GitIgnore (line 24) | type GitIgnore interface
  type ignore (line 62) | type ignore struct
    method Base (line 219) | func (i *ignore) Base() string {
    method Match (line 230) | func (i *ignore) Match(path string) Match {
    method MatchIsDir (line 250) | func (i *ignore) MatchIsDir(path string, _isdir bool) Match {
    method Absolute (line 270) | func (i *ignore) Absolute(path string, isdir bool) Match {
    method Relative (line 287) | func (i *ignore) Relative(path string, isdir bool) Match {
    method Ignore (line 310) | func (i *ignore) Ignore(path string) bool {
    method Include (line 323) | func (i *ignore) Include(path string) bool {
  function New (line 73) | func New(r io.Reader, base string, errors func(Error) bool) GitIgnore {
  function NewFromFile (line 89) | func NewFromFile(file string) (GitIgnore, error) {
  function NewWithErrors (line 121) | func NewWithErrors(file string, errors func(Error) bool) GitIgnore {
  function NewWithCache (line 180) | func NewWithCache(file string, cache Cache, errors func(Error) bool) Git...

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/lexer.go
  type lexer (line 15) | type lexer struct
    method Next (line 47) | func (l *lexer) Next() (*Token, Error) {
    method Position (line 130) | func (l *lexer) Position() Position {
    method String (line 136) | func (l *lexer) String() string {
    method read (line 147) | func (l *lexer) read() (rune, Error) {
    method unread (line 175) | func (l *lexer) unread(r ...rune) {
    method peek (line 214) | func (l *lexer) peek() (rune, Error) {
    method newline (line 227) | func (l *lexer) newline() {
    method comment (line 239) | func (l *lexer) comment() ([]rune, Error) {
    method escape (line 272) | func (l *lexer) escape() ([]rune, Error) {
    method eol (line 301) | func (l *lexer) eol() ([]rune, Error) {
    method whitespace (line 342) | func (l *lexer) whitespace() ([]rune, Error) {
    method pattern (line 377) | func (l *lexer) pattern() ([]rune, Error) {
    method token (line 437) | func (l *lexer) token(type_ TokenType, word []rune, e Error) (*Token, ...
    method err (line 462) | func (l *lexer) err(e error) Error {
    method beginning (line 472) | func (l *lexer) beginning() bool {
  type Lexer (line 25) | type Lexer interface
  function NewLexer (line 40) | func NewLexer(r io.Reader) Lexer {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/match.go
  type Match (line 10) | type Match interface

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/parser.go
  type Parser (line 11) | type Parser interface
  type parser (line 30) | type parser struct
    method Parse (line 47) | func (p *parser) Parse() []Pattern {
    method Next (line 64) | func (p *parser) Next() Pattern {
    method Position (line 127) | func (p *parser) Position() Position {
    method build (line 147) | func (p *parser) build(t *Token) (Pattern, Error) {
    method negation (line 163) | func (p *parser) negation(t *Token) (Pattern, Error) {
    method path (line 188) | func (p *parser) path(t *Token) (Pattern, Error) {
    method sequence (line 215) | func (p *parser) sequence(t *Token) ([]*Token, Error) {
    method separator (line 244) | func (p *parser) separator(t *Token) ([]*Token, Error) {
    method any (line 291) | func (p *parser) any(t *Token) ([]*Token, Error) {
    method pattern (line 326) | func (p *parser) pattern(t *Token) ([]*Token, Error) {
    method eol (line 361) | func (p *parser) eol() Error {
    method next (line 385) | func (p *parser) next() (*Token, Error) {
    method skip (line 400) | func (p *parser) skip() Error {
    method undo (line 420) | func (p *parser) undo(t *Token) {
    method err (line 430) | func (p *parser) err(e error) Error {
    method errors (line 437) | func (p *parser) errors(e Error) bool {
  function NewParser (line 40) | func NewParser(r io.Reader, err func(Error) bool) Parser {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/pattern.go
  type Pattern (line 13) | type Pattern interface
  type pattern (line 24) | type pattern struct
    method compile (line 117) | func (p *pattern) compile(tokens []*Token) Pattern {
    method Ignore (line 141) | func (p *pattern) Ignore() bool { return !p._negated }
    method Include (line 145) | func (p *pattern) Include() bool { return p._negated }
    method Position (line 148) | func (p *pattern) Position() Position { return p._position }
    method String (line 151) | func (p *pattern) String() string { return p._string }
    method name (line 165) | func (p *pattern) name(tokens []*Token) Pattern {
    method path (line 219) | func (p *pattern) path(tokens []*Token) Pattern {
    method any (line 252) | func (p *pattern) any(tokens []*Token) Pattern {
  type matchType (line 34) | type matchType
  constant matchComplex (line 37) | matchComplex matchType = iota
  constant matchExact (line 38) | matchExact
  constant matchSuffix (line 39) | matchSuffix
  type name (line 44) | type name struct
    method Match (line 189) | func (n *name) Match(path string, isdir bool) bool {
  type path (line 52) | type path struct
    method Match (line 237) | func (p *path) Match(path string, isdir bool) bool {
  type any (line 59) | type any struct
    method Match (line 270) | func (a *any) Match(path string, isdir bool) bool {
    method match (line 285) | func (a *any) match(path []string, tokens []*Token) bool {
  function NewPattern (line 68) | func NewPattern(tokens []*Token) Pattern {
  function containsGlob (line 159) | func containsGlob(s string) bool {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/position.go
  type Position (line 11) | type Position struct
    method String (line 19) | func (p Position) String() string {
    method Zero (line 35) | func (p Position) Zero() bool {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/repository.go
  constant File (line 11) | File = ".gitignore"
  type repository (line 15) | type repository struct
    method Match (line 176) | func (r *repository) Match(path string) Match {
    method Absolute (line 199) | func (r *repository) Absolute(path string, isdir bool) Match {
    method Relative (line 213) | func (r *repository) Relative(path string, isdir bool) Match {
  function NewRepository (line 28) | func NewRepository(base string) (GitIgnore, error) {
  function NewRepositoryWithFile (line 41) | func NewRepositoryWithFile(base, file string) (GitIgnore, error) {
  function NewRepositoryWithErrors (line 81) | func NewRepositoryWithErrors(base, file string, errors func(e Error) boo...
  function NewRepositoryWithCache (line 101) | func NewRepositoryWithCache(base, file string, cache Cache, errors func(...

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/rune.go
  constant _EOF (line 7) | _EOF       = rune(0)
  constant _CR (line 8) | _CR        = rune('\r')
  constant _NEWLINE (line 9) | _NEWLINE   = rune('\n')
  constant _COMMENT (line 10) | _COMMENT   = rune('#')
  constant _SEPARATOR (line 11) | _SEPARATOR = rune('/')
  constant _ESCAPE (line 12) | _ESCAPE    = rune('\\')
  constant _SPACE (line 13) | _SPACE     = rune(' ')
  constant _TAB (line 14) | _TAB       = rune('\t')
  constant _NEGATION (line 15) | _NEGATION  = rune('!')
  constant _WILDCARD (line 16) | _WILDCARD  = rune('*')

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/token.go
  type Token (line 12) | type Token struct
    method Name (line 32) | func (t *Token) Name() string {
    method Token (line 37) | func (t *Token) Token() string {
    method String (line 43) | func (t *Token) String() string {
  function NewToken (line 21) | func NewToken(t TokenType, word []rune, pos Position) *Token {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/tokenset.go
  type tokenset (line 6) | type tokenset
    method String (line 10) | func (t tokenset) String() string {

FILE: vendor/github.com/boyter/gocodewalker/go-gitignore/tokentype.go
  type TokenType (line 5) | type TokenType
    method String (line 21) | func (t TokenType) String() string {
  constant ILLEGAL (line 8) | ILLEGAL TokenType = iota
  constant EOF (line 9) | EOF
  constant EOL (line 10) | EOL
  constant WHITESPACE (line 11) | WHITESPACE
  constant COMMENT (line 12) | COMMENT
  constant SEPARATOR (line 13) | SEPARATOR
  constant NEGATION (line 14) | NEGATION
  constant PATTERN (line 15) | PATTERN
  constant ANY (line 16) | ANY
  constant BAD (line 17) | BAD

FILE: vendor/github.com/boyter/gocodewalker/hidden.go
  function IsHidden (line 12) | func IsHidden(file os.FileInfo, directory string) (bool, error) {
  function IsHiddenDirEntry (line 17) | func IsHiddenDirEntry(file fs.DirEntry, directory string) (bool, error) {

FILE: vendor/github.com/boyter/gocodewalker/hidden_windows.go
  function IsHidden (line 14) | func IsHidden(file os.FileInfo, directory string) (bool, error) {
  function IsHiddenDirEntry (line 19) | func IsHiddenDirEntry(file fs.DirEntry, directory string) (bool, error) {

FILE: vendor/github.com/boyter/simplecache/simplecache.go
  type CacheEvictionPolicy (line 12) | type CacheEvictionPolicy
  constant LRU (line 15) | LRU CacheEvictionPolicy = iota
  constant LFU (line 16) | LFU
  type cacheEntry (line 22) | type cacheEntry struct
  type Cache (line 31) | type Cache struct
  type CacheInterface (line 41) | type CacheInterface interface
  type Option (line 58) | type Option struct
  function New (line 66) | func New[T any](opts ...Option) *Cache[T] {
  method Set (line 95) | func (c *Cache[T]) Set(key string, value T) error {
  method evictLRU (line 123) | func (c *Cache[T]) evictLRU() {
  method evictLFU (line 145) | func (c *Cache[T]) evictLFU() {
  method Get (line 164) | func (c *Cache[T]) Get(key string) (T, bool) {
  method Delete (line 189) | func (c *Cache[T]) Delete(key string) {
  method Clear (line 197) | func (c *Cache[T]) Clear() {
  method Sum (line 205) | func (c *Cache[T]) Sum() int {

FILE: vendor/github.com/buger/jsonparser/bytes.go
  constant minInt64 (line 8) | minInt64 = `9223372036854775808`
  function parseInt (line 11) | func parseInt(bytes []byte) (v int64, ok bool, overflow bool) {

FILE: vendor/github.com/buger/jsonparser/bytes_safe.go
  function equalStr (line 11) | func equalStr(b *[]byte, s string) bool {
  function parseFloat (line 15) | func parseFloat(b *[]byte) (float64, error) {
  function bytesToString (line 19) | func bytesToString(b *[]byte) string {
  function StringToBytes (line 23) | func StringToBytes(s string) []byte {

FILE: vendor/github.com/buger/jsonparser/bytes_unsafe.go
  function equalStr (line 21) | func equalStr(b *[]byte, s string) bool {
  function parseFloat (line 25) | func parseFloat(b *[]byte) (float64, error) {
  function bytesToString (line 31) | func bytesToString(b *[]byte) string {
  function StringToBytes (line 35) | func StringToBytes(s string) []byte {

FILE: vendor/github.com/buger/jsonparser/escape.go
  constant supplementalPlanesOffset (line 10) | supplementalPlanesOffset = 0x10000
  constant highSurrogateOffset (line 11) | highSurrogateOffset = 0xD800
  constant lowSurrogateOffset (line 12) | lowSurrogateOffset = 0xDC00
  constant basicMultilingualPlaneReservedOffset (line 14) | basicMultilingualPlaneReservedOffset = 0xDFFF
  constant basicMultilingualPlaneOffset (line 15) | basicMultilingualPlaneOffset = 0xFFFF
  function combineUTF16Surrogates (line 17) | func combineUTF16Surrogates(high, low rune) rune {
  constant badHex (line 21) | badHex = -1
  function h2I (line 23) | func h2I(c byte) int {
  function decodeSingleUnicodeEscape (line 39) | func decodeSingleUnicodeEscape(in []byte) (rune, bool) {
  function isUTF16EncodedRune (line 58) | func isUTF16EncodedRune(r rune) bool {
  function decodeUnicodeEscape (line 62) | func decodeUnicodeEscape(in []byte) (rune, int) {
  function unescapeToUTF8 (line 96) | func unescapeToUTF8(in, out []byte) (inLen int, outLen int) {
  function Unescape (line 130) | func Unescape(in, out []byte) ([]byte, error) {

FILE: vendor/github.com/buger/jsonparser/fuzz.go
  function FuzzParseString (line 3) | func FuzzParseString(data []byte) int {
  function FuzzEachKey (line 11) | func FuzzEachKey(data []byte) int {
  function FuzzDelete (line 30) | func FuzzDelete(data []byte) int {
  function FuzzSet (line 35) | func FuzzSet(data []byte) int {
  function FuzzObjectEach (line 43) | func FuzzObjectEach(data []byte) int {
  function FuzzParseFloat (line 50) | func FuzzParseFloat(data []byte) int {
  function FuzzParseInt (line 58) | func FuzzParseInt(data []byte) int {
  function FuzzParseBool (line 66) | func FuzzParseBool(data []byte) int {
  function FuzzTokenStart (line 74) | func FuzzTokenStart(data []byte) int {
  function FuzzGetString (line 79) | func FuzzGetString(data []byte) int {
  function FuzzGetFloat (line 87) | func FuzzGetFloat(data []byte) int {
  function FuzzGetInt (line 95) | func FuzzGetInt(data []byte) int {
  function FuzzGetBoolean (line 103) | func FuzzGetBoolean(data []byte) int {
  function FuzzGetUnsafeString (line 111) | func FuzzGetUnsafeString(data []byte) int {

FILE: vendor/github.com/buger/jsonparser/parser.go
  constant unescapeStackBufSize (line 25) | unescapeStackBufSize = 64
  function tokenEnd (line 27) | func tokenEnd(data []byte) int {
  function findTokenStart (line 38) | func findTokenStart(data []byte, token byte) int {
  function findKeyStart (line 51) | func findKeyStart(data []byte, key string) (int, error) {
  function tokenStart (line 116) | func tokenStart(data []byte) int {
  function nextToken (line 128) | func nextToken(data []byte) int {
  function lastToken (line 142) | func lastToken(data []byte) int {
  function stringEnd (line 157) | func stringEnd(data []byte) (int, bool) {
  function blockEnd (line 187) | func blockEnd(data []byte, openSym byte, closeSym byte) int {
  function searchKeys (line 216) | func searchKeys(data []byte, keys ...string) int {
  function sameTree (line 362) | func sameTree(p1, p2 []string) bool {
  function EachKey (line 377) | func EachKey(data []byte, cb func(int, []byte, ValueType, error), paths ...
  type ValueType (line 557) | type ValueType
    method String (line 570) | func (vt ValueType) String() string {
  constant NotExist (line 560) | NotExist = ValueType(iota)
  constant String (line 561) | String
  constant Number (line 562) | Number
  constant Object (line 563) | Object
  constant Array (line 564) | Array
  constant Boolean (line 565) | Boolean
  constant Null (line 566) | Null
  constant Unknown (line 567) | Unknown
  function createInsertComponent (line 597) | func createInsertComponent(keys []string, setValue []byte, comma, object...
  function calcAllocateSpace (line 644) | func calcAllocateSpace(keys []string, setValue []byte, comma, object boo...
  function WriteToBuffer (line 685) | func WriteToBuffer(buffer []byte, str string) int {
  function Delete (line 698) | func Delete(data []byte, keys ...string) []byte {
  function Set (line 785) | func Set(data []byte, setValue []byte, keys ...string) (value []byte, er...
  function getType (line 858) | func getType(data []byte, offset int) ([]byte, ValueType, int, error) {
  function Get (line 936) | func Get(data []byte, keys ...string) (value []byte, dataType ValueType,...
  function internalGet (line 941) | func internalGet(data []byte, keys ...string) (value []byte, dataType Va...
  function ArrayEach (line 969) | func ArrayEach(data []byte, cb func(value []byte, dataType ValueType, of...
  function ObjectEach (line 1054) | func ObjectEach(data []byte, callback func(key []byte, value []byte, dat...
  function GetUnsafeString (line 1161) | func GetUnsafeString(data []byte, keys ...string) (val string, err error) {
  function GetString (line 1173) | func GetString(data []byte, keys ...string) (val string, err error) {
  function GetFloat (line 1195) | func GetFloat(data []byte, keys ...string) (val float64, err error) {
  function GetInt (line 1211) | func GetInt(data []byte, keys ...string) (val int64, err error) {
  function GetBoolean (line 1228) | func GetBoolean(data []byte, keys ...string) (val bool, err error) {
  function ParseBoolean (line 1243) | func ParseBoolean(b []byte) (bool, error) {
  function ParseString (line 1255) | func ParseString(b []byte) (string, error) {
  function ParseFloat (line 1265) | func ParseFloat(b []byte) (float64, error) {
  function ParseInt (line 1274) | func ParseInt(b []byte) (int64, error) {

FILE: vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go
  type Iterator (line 5) | type Iterator struct
  function FromString (line 16) | func FromString(s string) Iterator[string] {
  function FromBytes (line 24) | func FromBytes(b []byte) Iterator[[]byte] {

FILE: vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go
  type Scanner (line 9) | type Scanner struct
  function FromReader (line 19) | func FromReader(r io.Reader) *Scanner {

FILE: vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go
  method is (line 10) | func (lookup property) is(properties property) bool {
  constant _Ignore (line 14) | _Ignore = _Extend
  function splitFunc (line 21) | func splitFunc[T iterators.Stringish](data T, atEOF bool) (advance int, ...

FILE: vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go
  type property (line 8) | type property
  constant _CR (line 11) | _CR property = 1 << iota
  constant _Control (line 12) | _Control
  constant _Extend (line 13) | _Extend
  constant _ExtendedPictographic (line 14) | _ExtendedPictographic
  constant _L (line 15) | _L
  constant _LF (line 16) | _LF
  constant _LV (line 17) | _LV
  constant _LVT (line 18) | _LVT
  constant _Prepend (line 19) | _Prepend
  constant _RegionalIndicator (line 20) | _RegionalIndicator
  constant _SpacingMark (line 21) | _SpacingMark
  constant _T (line 22) | _T
  constant _V (line 23) | _V
  constant _ZWJ (line 24) | _ZWJ
  function lookup (line 30) | func lookup[T iterators.Stringish](s T) (v property, sz int) {
  function lookupValue (line 98) | func lookupValue(n uint32, b byte) property {

FILE: vendor/github.com/clipperhouse/uax29/v2/internal/iterators/iterator.go
  type Stringish (line 3) | type Stringish interface
  type SplitFunc (line 7) | type SplitFunc
  type Iterator (line 11) | type Iterator struct
  function New (line 19) | func New[T Stringish](split SplitFunc[T], data T) *Iterator[T] {
  method SetText (line 27) | func (iter *Iterator[T]) SetText(data T) {
  method Split (line 34) | func (iter *Iterator[T]) Split(split SplitFunc[T]) {
  method Next (line 40) | func (iter *Iterator[T]) Next() bool {
  method Value (line 67) | func (iter *Iterator[T]) Value() T {
  method Start (line 72) | func (iter *Iterator[T]) Start() int {
  method End (line 77) | func (iter *Iterator[T]) End() int {
  method Reset (line 82) | func (iter *Iterator[T]) Reset() {

FILE: vendor/github.com/danwakefield/fnmatch/fnmatch.go
  constant FNM_NOESCAPE (line 19) | FNM_NOESCAPE = (1 << iota)
  constant FNM_PATHNAME (line 20) | FNM_PATHNAME
  constant FNM_PERIOD (line 21) | FNM_PERIOD
  constant FNM_LEADING_DIR (line 23) | FNM_LEADING_DIR
  constant FNM_CASEFOLD (line 24) | FNM_CASEFOLD
  constant FNM_IGNORECASE (line 26) | FNM_IGNORECASE = FNM_CASEFOLD
  constant FNM_FILE_NAME (line 27) | FNM_FILE_NAME  = FNM_PATHNAME
  function unpackRune (line 30) | func unpackRune(str *string) rune {
  function Match (line 39) | func Match(pattern, s string, flags int) bool {
  function rangematch (line 149) | func rangematch(pattern *string, test rune, flags int) bool {
  function strchr (line 212) | func strchr(s string, c rune) int {

FILE: vendor/github.com/google/uuid/dce.go
  type Domain (line 14) | type Domain
    method String (line 70) | func (d Domain) String() string {
  constant Person (line 18) | Person = Domain(0)
  constant Group (line 19) | Group  = Domain(1)
  constant Org (line 20) | Org    = Domain(2)
  function NewDCESecurity (line 32) | func NewDCESecurity(domain Domain, id uint32) (UUID, error) {
  function NewDCEPerson (line 46) | func NewDCEPerson() (UUID, error) {
  function NewDCEGroup (line 54) | func NewDCEGroup() (UUID, error) {
  method Domain (line 60) | func (uuid UUID) Domain() Domain {
  method ID (line 66) | func (uuid UUID) ID() uint32 {

FILE: vendor/github.com/google/uuid/hash.go
  function NewHash (line 33) | func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID {
  function NewMD5 (line 49) | func NewMD5(space UUID, data []byte) UUID {
  function NewSHA1 (line 57) | func NewSHA1(space UUID, data []byte) UUID {

FILE: vendor/github.com/google/uuid/marshal.go
  method MarshalText (line 10) | func (uuid UUID) MarshalText() ([]byte, error) {
  method UnmarshalText (line 17) | func (uuid *UUID) UnmarshalText(data []byte) error {
  method MarshalBinary (line 27) | func (uuid UUID) MarshalBinary() ([]byte, error) {
  method UnmarshalBinary (line 32) | func (uuid *UUID) UnmarshalBinary(data []byte) error {

FILE: vendor/github.com/google/uuid/node.go
  function NodeInterface (line 21) | func NodeInterface() string {
  function SetNodeInterface (line 33) | func SetNodeInterface(name string) bool {
  function setNodeInterface (line 39) | func setNodeInterface(name string) bool {
  function NodeID (line 60) | func NodeID() []byte {
  function SetNodeID (line 73) | func SetNodeID(id []byte) bool {
  method NodeID (line 86) | func (uuid UUID) NodeID() []byte {

FILE: vendor/github.com/google/uuid/node_js.go
  function getHardwareInterface (line 12) | func getHardwareInterface(name string) (string, []byte) { return "", nil }

FILE: vendor/github.com/google/uuid/node_net.go
  function getHardwareInterface (line 19) | func getHardwareInterface(name string) (string, []byte) {

FILE: vendor/github.com/google/uuid/null.go
  type NullUUID (line 29) | type NullUUID struct
    method Scan (line 35) | func (nu *NullUUID) Scan(value interface{}) error {
    method Value (line 52) | func (nu NullUUID) Value() (driver.Value, error) {
    method MarshalBinary (line 61) | func (nu NullUUID) MarshalBinary() ([]byte, error) {
    method UnmarshalBinary (line 70) | func (nu *NullUUID) UnmarshalBinary(data []byte) error {
    method MarshalText (line 80) | func (nu NullUUID) MarshalText() ([]byte, error) {
    method UnmarshalText (line 89) | func (nu *NullUUID) UnmarshalText(data []byte) error {
    method MarshalJSON (line 101) | func (nu NullUUID) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 110) | func (nu *NullUUID) UnmarshalJSON(data []byte) error {

FILE: vendor/github.com/google/uuid/sql.go
  method Scan (line 15) | func (uuid *UUID) Scan(src interface{}) error {
  method Value (line 57) | func (uuid UUID) Value() (driver.Value, error) {

FILE: vendor/github.com/google/uuid/time.go
  type Time (line 15) | type Time
    method UnixTime (line 35) | func (t Time) UnixTime() (sec, nsec int64) {
  constant lillian (line 18) | lillian    = 2299160
  constant unix (line 19) | unix       = 2440587
  constant epoch (line 20) | epoch      = unix - lillian
  constant g1582 (line 21) | g1582      = epoch * 86400
  constant g1582ns100 (line 22) | g1582ns100 = g1582 * 10000000
  function GetTime (line 45) | func GetTime() (Time, uint16, error) {
  function getTime (line 51) | func getTime() (Time, uint16, error) {
  function ClockSequence (line 76) | func ClockSequence() int {
  function clockSequence (line 82) | func clockSequence() int {
  function SetClockSequence (line 91) | func SetClockSequence(seq int) {
  function setClockSequence (line 97) | func setClockSequence(seq int) {
  method Time (line 112) | func (uuid UUID) Time() Time {
  method ClockSequence (line 132) | func (uuid UUID) ClockSequence() int {

FILE: vendor/github.com/google/uuid/util.go
  function randomBits (line 12) | func randomBits(b []byte) {
  function xtob (line 39) | func xtob(x1, x2 byte) (byte, bool) {

FILE: vendor/github.com/google/uuid/uuid.go
  type UUID (line 20) | type UUID
    method String (line 244) | func (uuid UUID) String() string {
    method URN (line 252) | func (uuid UUID) URN() string {
    method Variant (line 272) | func (uuid UUID) Variant() Variant {
    method Version (line 286) | func (uuid UUID) Version() Version {
  type Version (line 23) | type Version
    method String (line 290) | func (v Version) String() string {
  type Variant (line 26) | type Variant
    method String (line 297) | func (v Variant) String() string {
  constant Invalid (line 30) | Invalid   = Variant(iota)
  constant RFC4122 (line 31) | RFC4122
  constant Reserved (line 32) | Reserved
  constant Microsoft (line 33) | Microsoft
  constant Future (line 34) | Future
  constant randPoolSize (line 37) | randPoolSize = 16 * 16
  type invalidLengthError (line 47) | type invalidLengthError struct
    method Error (line 49) | func (err invalidLengthError) Error() string {
  function IsInvalidLengthError (line 54) | func IsInvalidLengthError(err error) bool {
  function Parse (line 68) | func Parse(s string) (UUID, error) {
  function ParseBytes (line 120) | func ParseBytes(b []byte) (UUID, error) {
  function MustParse (line 166) | func MustParse(s string) UUID {
  function FromBytes (line 176) | func FromBytes(b []byte) (uuid UUID, err error) {
  function Must (line 182) | func Must(uuid UUID, err error) UUID {
  function Validate (line 195) | func Validate(s string) error {
  function encodeHex (line 259) | func encodeHex(dst []byte, uuid UUID) {
  function SetRand (line 319) | func SetRand(r io.Reader) {
  function EnableRandPool (line 338) | func EnableRandPool() {
  function DisableRandPool (line 348) | func DisableRandPool() {
  type UUIDs (line 356) | type UUIDs
    method Strings (line 359) | func (uuids UUIDs) Strings() []string {

FILE: vendor/github.com/google/uuid/version1.go
  function NewUUID (line 19) | func NewUUID() (UUID, error) {

FILE: vendor/github.com/google/uuid/version4.go
  function New (line 13) | func New() UUID {
  function NewString (line 21) | func NewString() string {
  function NewRandom (line 39) | func NewRandom() (UUID, error) {
  function NewRandomFromReader (line 47) | func NewRandomFromReader(r io.Reader) (UUID, error) {
  function newRandomFromPool (line 58) | func newRandomFromPool() (UUID, error) {

FILE: vendor/github.com/google/uuid/version6.go
  function NewV6 (line 21) | func NewV6() (UUID, error) {

FILE: vendor/github.com/google/uuid/version7.go
  function NewV7 (line 23) | func NewV7() (UUID, error) {
  function NewV7FromReader (line 35) | func NewV7FromReader(r io.Reader) (UUID, error) {
  function makeV7 (line 48) | func makeV7(uuid []byte) {
  constant nanoPerMilli (line 83) | nanoPerMilli = 1000000
  function getV7Time (line 88) | func getV7Time() (milli, seq int64) {

FILE: vendor/github.com/inconshreveable/mousetrap/trap_others.go
  function StartedByExplorer (line 14) | func StartedByExplorer() bool {

FILE: vendor/github.com/inconshreveable/mousetrap/trap_windows.go
  function getProcessEntry (line 8) | func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
  function StartedByExplorer (line 36) | func StartedByExplorer() bool {

FILE: vendor/github.com/mailru/easyjson/buffer/pool.go
  type PoolConfig (line 12) | type PoolConfig struct
  function initBuffers (line 27) | func initBuffers() {
  function init (line 33) | func init() {
  function Init (line 38) | func Init(cfg PoolConfig) {
  function putBuf (line 44) | func putBuf(buf []byte) {
  function getBuf (line 55) | func getBuf(size int) []byte {
  type Buffer (line 68) | type Buffer struct
    method EnsureSpace (line 79) | func (b *Buffer) EnsureSpace(s int) {
    method ensureSpaceSlow (line 85) | func (b *Buffer) ensureSpaceSlow(s int) {
    method AppendByte (line 109) | func (b *Buffer) AppendByte(data byte) {
    method AppendBytes (line 115) | func (b *Buffer) AppendBytes(data []byte) {
    method appendBytesSlow (line 123) | func (b *Buffer) appendBytesSlow(data []byte) {
    method AppendString (line 138) | func (b *Buffer) AppendString(data string) {
    method appendStringSlow (line 146) | func (b *Buffer) appendStringSlow(data string) {
    method Size (line 161) | func (b *Buffer) Size() int {
    method DumpTo (line 170) | func (b *Buffer) DumpTo(w io.Writer) (written int, err error) {
    method BuildBytes (line 192) | func (b *Buffer) BuildBytes(reuse ...[]byte) []byte {
    method ReadCloser (line 270) | func (b *Buffer) ReadCloser() io.ReadCloser {
  type readCloser (line 224) | type readCloser struct
    method Read (line 229) | func (r *readCloser) Read(p []byte) (n int, err error) {
    method Close (line 258) | func (r *readCloser) Close() error {

FILE: vendor/github.com/mailru/easyjson/jwriter/writer.go
  type Flags (line 14) | type Flags
  constant NilMapAsEmpty (line 17) | NilMapAsEmpty   Flags = 1 << iota
  constant NilSliceAsEmpty (line 18) | NilSliceAsEmpty
  type Writer (line 22) | type Writer struct
    method Size (line 31) | func (w *Writer) Size() int {
    method DumpTo (line 36) | func (w *Writer) DumpTo(out io.Writer) (written int, err error) {
    method BuildBytes (line 42) | func (w *Writer) BuildBytes(reuse ...[]byte) ([]byte, error) {
    method ReadCloser (line 52) | func (w *Writer) ReadCloser() (io.ReadCloser, error) {
    method RawByte (line 61) | func (w *Writer) RawByte(c byte) {
    method RawString (line 66) | func (w *Writer) RawString(s string) {
    method Raw (line 72) | func (w *Writer) Raw(data []byte, err error) {
    method RawText (line 87) | func (w *Writer) RawText(data []byte, err error) {
    method Base64Bytes (line 101) | func (w *Writer) Base64Bytes(data []byte) {
    method Uint8 (line 111) | func (w *Writer) Uint8(n uint8) {
    method Uint16 (line 116) | func (w *Writer) Uint16(n uint16) {
    method Uint32 (line 121) | func (w *Writer) Uint32(n uint32) {
    method Uint (line 126) | func (w *Writer) Uint(n uint) {
    method Uint64 (line 131) | func (w *Writer) Uint64(n uint64) {
    method Int8 (line 136) | func (w *Writer) Int8(n int8) {
    method Int16 (line 141) | func (w *Writer) Int16(n int16) {
    method Int32 (line 146) | func (w *Writer) Int32(n int32) {
    method Int (line 151) | func (w *Writer) Int(n int) {
    method Int64 (line 156) | func (w *Writer) Int64(n int64) {
    method Uint8Str (line 161) | func (w *Writer) Uint8Str(n uint8) {
    method Uint16Str (line 168) | func (w *Writer) Uint16Str(n uint16) {
    method Uint32Str (line 175) | func (w *Writer) Uint32Str(n uint32) {
    method UintStr (line 182) | func (w *Writer) UintStr(n uint) {
    method Uint64Str (line 189) | func (w *Writer) Uint64Str(n uint64) {
    method UintptrStr (line 196) | func (w *Writer) UintptrStr(n uintptr) {
    method Int8Str (line 203) | func (w *Writer) Int8Str(n int8) {
    method Int16Str (line 210) | func (w *Writer) Int16Str(n int16) {
    method Int32Str (line 217) | func (w *Writer) Int32Str(n int32) {
    method IntStr (line 224) | func (w *Writer) IntStr(n int) {
    method Int64Str (line 231) | func (w *Writer) Int64Str(n int64) {
    method Float32 (line 238) | func (w *Writer) Float32(n float32) {
    method Float32Str (line 243) | func (w *Writer) Float32Str(n float32) {
    method Float64 (line 250) | func (w *Writer) Float64(n float64) {
    method Float64Str (line 255) | func (w *Writer) Float64Str(n float64) {
    method Bool (line 262) | func (w *Writer) Bool(v bool) {
    method String (line 292) | func (w *Writer) String(s string) {
    method base64 (line 366) | func (w *Writer) base64(in []byte) {
  constant chars (line 271) | chars = "0123456789abcdef"
  function getTable (line 273) | func getTable(falseValues ...int) [128]bool {
  constant encode (line 363) | encode = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  constant padChar (line 364) | padChar = '='

FILE: vendor/github.com/mark3labs/mcp-go/mcp/consts.go
  constant ContentTypeText (line 4) | ContentTypeText     = "text"
  constant ContentTypeImage (line 5) | ContentTypeImage    = "image"
  constant ContentTypeAudio (line 6) | ContentTypeAudio    = "audio"
  constant ContentTypeLink (line 7) | ContentTypeLink     = "resource_link"
  constant ContentTypeResource (line 8) | ContentTypeResource = "resource"
  constant ElicitationModeForm (line 10) | ElicitationModeForm = "form"
  constant ElicitationModeURL (line 11) | ElicitationModeURL  = "url"

FILE: vendor/github.com/mark3labs/mcp-go/mcp/errors.go
  type URLElicitationRequiredError (line 34) | type URLElicitationRequiredError struct
    method Error (line 38) | func (e URLElicitationRequiredError) Error() string {
    method JSONRPCError (line 42) | func (e URLElicitationRequiredError) JSONRPCError() JSONRPCError {
    method Is (line 66) | func (e URLElicitationRequiredError) Is(target error) bool {
  type UnsupportedProtocolVersionError (line 57) | type UnsupportedProtocolVersionError struct
    method Error (line 61) | func (e UnsupportedProtocolVersionError) Error() string {
    method Is (line 72) | func (e UnsupportedProtocolVersionError) Is(target error) bool {
  function IsUnsupportedProtocolVersion (line 78) | func IsUnsupportedProtocolVersion(err error) bool {
  method AsError (line 86) | func (e *JSONRPCErrorDetails) AsError() error {

FILE: vendor/github.com/mark3labs/mcp-go/mcp/prompts.go
  type ListPromptsRequest (line 9) | type ListPromptsRequest struct
  type ListPromptsResult (line 16) | type ListPromptsResult struct
  type GetPromptRequest (line 23) | type GetPromptRequest struct
  type GetPromptParams (line 29) | type GetPromptParams struct
  type GetPromptResult (line 38) | type GetPromptResult struct
  type Prompt (line 49) | type Prompt struct
    method GetName (line 64) | func (p Prompt) GetName() string {
  type PromptArgument (line 71) | type PromptArgument struct
  type Role (line 83) | type Role
  constant RoleUser (line 86) | RoleUser      Role = "user"
  constant RoleAssistant (line 87) | RoleAssistant Role = "assistant"
  type PromptMessage (line 94) | type PromptMessage struct
  type PromptListChangedNotification (line 102) | type PromptListChangedNotification struct
  type PromptOption (line 108) | type PromptOption
  type ArgumentOption (line 112) | type ArgumentOption
  function NewPrompt (line 121) | func NewPrompt(name string, opts ...PromptOption) Prompt {
  function WithPromptDescription (line 135) | func WithPromptDescription(description string) PromptOption {
  function WithPromptIcons (line 143) | func WithPromptIcons(icons ...Icon) PromptOption {
  function WithArgument (line 151) | func WithArgument(name string, opts ...ArgumentOption) PromptOption {
  function ArgumentDescription (line 174) | func ArgumentDescription(desc string) ArgumentOption {
  function RequiredArgument (line 182) | func RequiredArgument() ArgumentOption {

FILE: vendor/github.com/mark3labs/mcp-go/mcp/resources.go
  type ResourceOption (line 11) | type ResourceOption
  function NewResource (line 16) | func NewResource(uri string, name string, opts ...ResourceOption) Resour...
  function WithResourceDescription (line 31) | func WithResourceDescription(description string) ResourceOption {
  function WithMIMEType (line 39) | func WithMIMEType(mimeType string) ResourceOption {
  function WithAnnotations (line 48) | func WithAnnotations(audience []Role, priority float64, lastModified str...
  function WithLastModified (line 62) | func WithLastModified(timestamp string) ResourceOption {
  type ResourceTemplateOption (line 73) | type ResourceTemplateOption
  function NewResourceTemplate (line 78) | func NewResourceTemplate(uriTemplate string, name string, opts ...Resour...
  function WithTemplateDescription (line 93) | func WithTemplateDescription(description string) ResourceTemplateOption {
  function WithTemplateMIMEType (line 101) | func WithTemplateMIMEType(mimeType string) ResourceTemplateOption {
  function WithTemplateAnnotations (line 109) | func WithTemplateAnnotations(audience []Role, priority float64, lastModi...
  function ValidateISO8601Timestamp (line 123) | func ValidateISO8601Timestamp(timestamp string) error {
  function WithResourceIcons (line 134) | func WithResourceIcons(icons ...Icon) ResourceOption {
  function WithTemplateIcons (line 142) | func WithTemplateIcons(icons ...Icon) ResourceTemplateOption {

FILE: vendor/github.com/mark3labs/mcp-go/mcp/tasks.go
  type TaskOption (line 9) | type TaskOption
  function NewTask (line 18) | func NewTask(taskId string, opts ...TaskOption) Task {
  function WithTaskStatus (line 35) | func WithTaskStatus(status TaskStatus) TaskOption {
  function WithTaskStatusMessage (line 42) | func WithTaskStatusMessage(message string) TaskOption {
  function WithTaskTTL (line 50) | func WithTaskTTL(ttlMs int64) TaskOption {
  function WithTaskPollInterval (line 57) | func WithTaskPollInterval(intervalMs int64) TaskOption {
  function WithTaskCreatedAt (line 65) | func WithTaskCreatedAt(createdAt string) TaskOption {
  function NewTaskParams (line 76) | func NewTaskParams(ttlMs *int64) TaskParams {
  function NewCreateTaskResult (line 83) | func NewCreateTaskResult(task Task) CreateTaskResult {
  function NewGetTaskResult (line 90) | func NewGetTaskResult(task Task) GetTaskResult {
  function NewListTasksResult (line 97) | func NewListTasksResult(tasks []Task) ListTasksResult {
  function NewCancelTaskResult (line 104) | func NewCancelTaskResult(task Task) CancelTaskResult {
  function NewTaskStatusNotification (line 111) | func NewTaskStatusNotification(task Task) TaskStatusNotification {
  function NewTasksCapability (line 127) | func NewTasksCapability() *TasksCapability {
  function NewTasksCapabilityWithToolsOnly (line 143) | func NewTasksCapabilityWithToolsOnly() *TasksCapability {
  constant RelatedTaskMetaKey (line 160) | RelatedTaskMetaKey = "io.modelcontextprotocol/related-task"
  function RelatedTaskMeta (line 164) | func RelatedTaskMeta(taskID string) map[string]any {
  function WithRelatedTask (line 172) | func WithRelatedTask(taskID string) *Meta {
  constant ModelImmediateResponseMetaKey (line 188) | ModelImmediateResponseMetaKey = "io.modelcontextprotocol/model-immediate...
  function WithModelImmediateResponse (line 202) | func WithModelImmediateResponse(message string) *Meta {

FILE: vendor/github.com/mark3labs/mcp-go/mcp/tools.go
  type ListToolsRequest (line 18) | type ListToolsRequest struct
  type ListToolsResult (line 25) | type ListToolsResult struct
  type CallToolResult (line 40) | type CallToolResult struct
    method MarshalJSON (line 475) | func (r CallToolResult) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 504) | func (r *CallToolResult) UnmarshalJSON(data []byte) error {
  type CallToolRequest (line 54) | type CallToolRequest struct
    method GetArguments (line 69) | func (r CallToolRequest) GetArguments() map[string]any {
    method GetRawArguments (line 78) | func (r CallToolRequest) GetRawArguments() any {
    method BindArguments (line 84) | func (r CallToolRequest) BindArguments(target any) error {
    method GetString (line 103) | func (r CallToolRequest) GetString(key string, defaultValue string) st...
    method RequireString (line 114) | func (r CallToolRequest) RequireString(key string) (string, error) {
    method GetInt (line 126) | func (r CallToolRequest) GetInt(key string, defaultValue int) int {
    method RequireInt (line 144) | func (r CallToolRequest) RequireInt(key string) (int, error) {
    method GetFloat (line 165) | func (r CallToolRequest) GetFloat(key string, defaultValue float64) fl...
    method RequireFloat (line 183) | func (r CallToolRequest) RequireFloat(key string) (float64, error) {
    method GetBool (line 204) | func (r CallToolRequest) GetBool(key string, defaultValue bool) bool {
    method RequireBool (line 224) | func (r CallToolRequest) RequireBool(key string) (bool, error) {
    method GetStringSlice (line 247) | func (r CallToolRequest) GetStringSlice(key string, defaultValue []str...
    method RequireStringSlice (line 267) | func (r CallToolRequest) RequireStringSlice(key string) ([]string, err...
    method GetIntSlice (line 291) | func (r CallToolRequest) GetIntSlice(key string, defaultValue []int) [...
    method RequireIntSlice (line 318) | func (r CallToolRequest) RequireIntSlice(key string) ([]int, error) {
    method GetFloatSlice (line 351) | func (r CallToolRequest) GetFloatSlice(key string, defaultValue []floa...
    method RequireFloatSlice (line 378) | func (r CallToolRequest) RequireFloatSlice(key string) ([]float64, err...
    method GetBoolSlice (line 411) | func (r CallToolRequest) GetBoolSlice(key string, defaultValue []bool)...
    method RequireBoolSlice (line 440) | func (r CallToolRequest) RequireBoolSlice(key string) ([]bool, error) {
  type CallToolParams (line 60) | type CallToolParams struct
  type ToolListChangedNotification (line 553) | type ToolListChangedNotification struct
  type TaskSupport (line 558) | type TaskSupport
  constant TaskSupportForbidden (line 562) | TaskSupportForbidden TaskSupport = "forbidden"
  constant TaskSupportOptional (line 564) | TaskSupportOptional TaskSupport = "optional"
  constant TaskSupportRequired (line 566) | TaskSupportRequired TaskSupport = "required"
  type ToolExecution (line 570) | type ToolExecution struct
  type Tool (line 576) | type Tool struct
    method GetName (line 602) | func (t Tool) GetName() string {
    method MarshalJSON (line 608) | func (t Tool) MarshalJSON() ([]byte, error) {
  type ToolArgumentsSchema (line 662) | type ToolArgumentsSchema struct
    method MarshalJSON (line 684) | func (tis ToolArgumentsSchema) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 699) | func (tis *ToolArgumentsSchema) UnmarshalJSON(data []byte) error {
  type ToolInputSchema (line 670) | type ToolInputSchema
    method MarshalJSON (line 674) | func (tis ToolInputSchema) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 689) | func (tis *ToolInputSchema) UnmarshalJSON(data []byte) error {
  type ToolOutputSchema (line 671) | type ToolOutputSchema
    method MarshalJSON (line 679) | func (tis ToolOutputSchema) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 694) | func (tis *ToolOutputSchema) UnmarshalJSON(data []byte) error {
  function toolArgumentsSchemaMarshalJSON (line 704) | func toolArgumentsSchemaMarshalJSON(tis ToolArgumentsSchema) ([]byte, er...
  function toolArgumentsSchemaUnmarshalJSON (line 735) | func toolArgumentsSchemaUnmarshalJSON(data []byte, tis *ToolArgumentsSch...
  type ToolAnnotation (line 757) | type ToolAnnotation struct
  type ToolOption (line 772) | type ToolOption
  type PropertyOption (line 776) | type PropertyOption
  function NewTool (line 785) | func NewTool(name string, opts ...ToolOption) Tool {
  function NewToolWithRawSchema (line 816) | func NewToolWithRawSchema(name, description string, schema json.RawMessa...
  function WithDescription (line 828) | func WithDescription(description string) ToolOption {
  function WithDeferLoading (line 836) | func WithDeferLoading(deferLoading bool) ToolOption {
  function WithInputSchema (line 844) | func WithInputSchema[T any]() ToolOption {
  function WithToolIcons (line 874) | func WithToolIcons(icons ...Icon) ToolOption {
  function WithTaskSupport (line 883) | func WithTaskSupport(support TaskSupport) ToolOption {
  function WithRawInputSchema (line 897) | func WithRawInputSchema(schema json.RawMessage) ToolOption {
  function WithOutputSchema (line 905) | func WithOutputSchema[T any]() ToolOption {
  function WithRawOutputSchema (line 945) | func WithRawOutputSchema(schema json.RawMessage) ToolOption {
  function WithToolAnnotation (line 952) | func WithToolAnnotation(annotation ToolAnnotation) ToolOption {
  function WithTitleAnnotation (line 960) | func WithTitleAnnotation(title string) ToolOption {
  function WithReadOnlyHintAnnotation (line 968) | func WithReadOnlyHintAnnotation(value bool) ToolOption {
  function WithDestructiveHintAnnotation (line 976) | func WithDestructiveHintAnnotation(value bool) ToolOption {
  function WithIdempotentHintAnnotation (line 984) | func WithIdempotentHintAnnotation(value bool) ToolOption {
  function WithOpenWorldHintAnnotation (line 992) | func WithOpenWorldHintAnnotation(value bool) ToolOption {
  function WithSchemaAdditionalProperties (line 1001) | func WithSchemaAdditionalProperties(schema any) ToolOption {
  function Description (line 1013) | func Description(desc string) PropertyOption {
  function Required (line 1021) | func Required() PropertyOption {
  function Title (line 1029) | func Title(title string) PropertyOption {
  function DefaultString (line 1041) | func DefaultString(value string) PropertyOption {
  function Enum (line 1049) | func Enum(values ...string) PropertyOption {
  function MaxLength (line 1057) | func MaxLength(max int) PropertyOption {
  function MinLength (line 1065) | func MinLength(min int) PropertyOption {
  function Pattern (line 1073) | func Pattern(pattern string) PropertyOption {
  function DefaultNumber (line 1085) | func DefaultNumber(value float64) PropertyOption {
  function Max (line 1093) | func Max(max float64) PropertyOption {
  function Min (line 1101) | func Min(min float64) PropertyOption {
  function MultipleOf (line 1109) | func MultipleOf(value float64) PropertyOption {
  function DefaultBool (line 1121) | func DefaultBool(value bool) PropertyOption {
  function DefaultArray (line 1133) | func DefaultArray[T any](value []T) PropertyOption {
  function WithBoolean (line 1145) | func WithBoolean(name string, opts ...PropertyOption) ToolOption {
  function WithNumber (line 1167) | func WithNumber(name string, opts ...PropertyOption) ToolOption {
  function WithString (line 1189) | func WithString(name string, opts ...PropertyOption) ToolOption {
  function WithObject (line 1211) | func WithObject(name string, opts ...PropertyOption) ToolOption {
  function WithArray (line 1236) | func WithArray(name string, opts ...PropertyOption) ToolOption {
  function WithAny (line 1259) | func WithAny(name string, opts ...PropertyOption) ToolOption {
  function Properties (line 1279) | func Properties(props map[string]any) PropertyOption {
  function AdditionalProperties (line 1287) | func AdditionalProperties(schema any) PropertyOption {
  function MinProperties (line 1294) | func MinProperties(min int) PropertyOption {
  function MaxProperties (line 1301) | func MaxProperties(max int) PropertyOption {
  function PropertyNames (line 1308) | func PropertyNames(schema map[string]any) PropertyOption {
  function Items (line 1328) | func Items(schema any) PropertyOption {
  function MinItems (line 1335) | func MinItems(min int) PropertyOption {
  function MaxItems (line 1342) | func MaxItems(max int) PropertyOption {
  function UniqueItems (line 1349) | func UniqueItems(unique bool) PropertyOption {
  function WithStringItems (line 1367) | func WithStringItems(opts ...PropertyOption) PropertyOption {
  function WithStringEnumItems (line 1387) | func WithStringEnumItems(values []string) PropertyOption {
  function WithNumberItems (line 1407) | func WithNumberItems(opts ...PropertyOption) PropertyOption {
  function WithBooleanItems (line 1432) | func WithBooleanItems(opts ...PropertyOption) PropertyOption {

FILE: vendor/github.com/mark3labs/mcp-go/mcp/typed_tools.go
  type TypedToolHandlerFunc (line 9) | type TypedToolHandlerFunc
  type StructuredToolHandlerFunc (line 12) | type StructuredToolHandlerFunc
  function NewTypedToolHandler (line 15) | func NewTypedToolHandler[T any](handler TypedToolHandlerFunc[T]) func(ct...
  function NewStructuredToolHandler (line 28) | func NewStructuredToolHandler[TArgs any, TResult any](handler Structured...

FILE: vendor/github.com/mark3labs/mcp-go/mcp/types.go
  type MCPMethod (line 15) | type MCPMethod
  constant MethodInitialize (line 20) | MethodInitialize MCPMethod = "initialize"
  constant MethodPing (line 24) | MethodPing MCPMethod = "ping"
  constant MethodResourcesList (line 28) | MethodResourcesList MCPMethod = "resources/list"
  constant MethodResourcesTemplatesList (line 32) | MethodResourcesTemplatesList MCPMethod = "resources/templates/list"
  constant MethodResourcesRead (line 36) | MethodResourcesRead MCPMethod = "resources/read"
  constant MethodPromptsList (line 40) | MethodPromptsList MCPMethod = "prompts/list"
  constant MethodPromptsGet (line 44) | MethodPromptsGet MCPMethod = "prompts/get"
  constant MethodToolsList (line 48) | MethodToolsList MCPMethod = "tools/list"
  constant MethodToolsCall (line 52) | MethodToolsCall MCPMethod = "tools/call"
  constant MethodSetLogLevel (line 56) | MethodSetLogLevel MCPMethod = "logging/setLevel"
  constant MethodElicitationCreate (line 60) | MethodElicitationCreate MCPMethod = "elicitation/create"
  constant MethodNotificationElicitationComplete (line 63) | MethodNotificationElicitationComplete MCPMethod = "notifications/elicita...
  constant MethodListRoots (line 67) | MethodListRoots MCPMethod = "roots/list"
  constant MethodTasksGet (line 71) | MethodTasksGet MCPMethod = "tasks/get"
  constant MethodTasksList (line 75) | MethodTasksList MCPMethod = "tasks/list"
  constant MethodTasksResult (line 79) | MethodTasksResult MCPMethod = "tasks/result"
  constant MethodTasksCancel (line 83) | MethodTasksCancel MCPMethod = "tasks/cancel"
  constant MethodNotificationResourcesListChanged (line 87) | MethodNotificationResourcesListChanged = "notifications/resources/list_c...
  constant MethodNotificationResourceUpdated (line 89) | MethodNotificationResourceUpdated = "notifications/resources/updated"
  constant MethodNotificationPromptsListChanged (line 93) | MethodNotificationPromptsListChanged = "notifications/prompts/list_changed"
  constant MethodNotificationToolsListChanged (line 97) | MethodNotificationToolsListChanged = "notifications/tools/list_changed"
  constant MethodNotificationRootsListChanged (line 101) | MethodNotificationRootsListChanged = "notifications/roots/list_changed"
  constant MethodNotificationTasksStatus (line 105) | MethodNotificationTasksStatus = "notifications/tasks/status"
  constant MethodCompletionComplete (line 109) | MethodCompletionComplete MCPMethod = "completion/complete"
  type URITemplate (line 112) | type URITemplate struct
    method MarshalJSON (line 116) | func (t *URITemplate) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 120) | func (t *URITemplate) UnmarshalJSON(data []byte) error {
  type JSONRPCMessage (line 136) | type JSONRPCMessage
  constant LATEST_PROTOCOL_VERSION (line 139) | LATEST_PROTOCOL_VERSION = "2025-11-25"
  constant JSONRPC_VERSION (line 150) | JSONRPC_VERSION = "2.0"
  type ProgressToken (line 153) | type ProgressToken
  type Cursor (line 156) | type Cursor
  type Meta (line 160) | type Meta struct
    method MarshalJSON (line 174) | func (m *Meta) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 184) | func (m *Meta) UnmarshalJSON(data []byte) error {
  function NewMetaFromMap (line 195) | func NewMetaFromMap(m map[string]any) *Meta {
  type Request (line 207) | type Request struct
  type RequestParams (line 212) | type RequestParams struct
  type Params (line 216) | type Params
  type Notification (line 218) | type Notification struct
  type NotificationParams (line 223) | type NotificationParams struct
    method MarshalJSON (line 233) | func (p NotificationParams) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 254) | func (p *NotificationParams) UnmarshalJSON(data []byte) error {
  type Result (line 285) | type Result struct
  type RequestId (line 293) | type RequestId struct
    method Value (line 303) | func (r RequestId) Value() any {
    method String (line 308) | func (r RequestId) String() string {
    method IsNil (line 327) | func (r RequestId) IsNil() bool {
    method MarshalJSON (line 331) | func (r RequestId) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 335) | func (r *RequestId) UnmarshalJSON(data []byte) error {
  function NewRequestId (line 298) | func NewRequestId(value any) RequestId {
  type JSONRPCRequest (line 363) | type JSONRPCRequest struct
  type JSONRPCNotification (line 371) | type JSONRPCNotification struct
  type JSONRPCResponse (line 377) | type JSONRPCResponse struct
  type JSONRPCError (line 384) | type JSONRPCError struct
  type JSONRPCErrorDetails (line 392) | type JSONRPCErrorDetails struct
  constant PARSE_ERROR (line 406) | PARSE_ERROR = -32700
  constant INVALID_REQUEST (line 409) | INVALID_REQUEST = -32600
  constant METHOD_NOT_FOUND (line 412) | METHOD_NOT_FOUND = -32601
  constant INVALID_PARAMS (line 415) | INVALID_PARAMS = -32602
  constant INTERNAL_ERROR (line 418) | INTERNAL_ERROR = -32603
  constant REQUEST_INTERRUPTED (line 421) | REQUEST_INTERRUPTED = -32800
  constant RESOURCE_NOT_FOUND (line 427) | RESOURCE_NOT_FOUND = -32002
  constant URL_ELICITATION_REQUIRED (line 430) | URL_ELICITATION_REQUIRED = -32042
  type EmptyResult (line 436) | type EmptyResult
  type CancelledNotification (line 451) | type CancelledNotification struct
  type CancelledNotificationParams (line 456) | type CancelledNotificationParams struct
  type InitializeRequest (line 472) | type InitializeRequest struct
  type InitializeParams (line 478) | type InitializeParams struct
  type InitializeResult (line 488) | type InitializeResult struct
  type InitializedNotification (line 506) | type InitializedNotification struct
  type ClientCapabilities (line 513) | type ClientCapabilities struct
  type ServerCapabilities (line 532) | type ServerCapabilities struct
  type Icon (line 575) | type Icon struct
  type Implementation (line 587) | type Implementation struct
  type PingRequest (line 602) | type PingRequest struct
  type ProgressNotification (line 611) | type ProgressNotification struct
  type ProgressNotificationParams (line 616) | type ProgressNotificationParams struct
  type PaginatedRequest (line 632) | type PaginatedRequest struct
  type PaginatedParams (line 637) | type PaginatedParams struct
  type PaginatedResult (line 643) | type PaginatedResult struct
  type ListResourcesRequest (line 655) | type ListResourcesRequest struct
  type ListResourcesResult (line 662) | type ListResourcesResult struct
  type ListResourceTemplatesRequest (line 669) | type ListResourceTemplatesRequest struct
  type ListResourceTemplatesResult (line 676) | type ListResourceTemplatesResult struct
  type ReadResourceRequest (line 683) | type ReadResourceRequest struct
  type ReadResourceParams (line 689) | type ReadResourceParams struct
  type ReadResourceResult (line 699) | type ReadResourceResult struct
  type ResourceListChangedNotification (line 708) | type ResourceListChangedNotification struct
  type SubscribeRequest (line 714) | type SubscribeRequest struct
  type SubscribeParams (line 720) | type SubscribeParams struct
  type UnsubscribeRequest (line 729) | type UnsubscribeRequest struct
  type UnsubscribeParams (line 735) | type UnsubscribeParams struct
  type ResourceUpdatedNotification (line 743) | type ResourceUpdatedNotification struct
  type ResourceUpdatedNotificationParams (line 747) | type ResourceUpdatedNotificationParams struct
  type Resource (line 754) | type Resource struct
    method GetName (line 776) | func (r Resource) GetName() string {
  type ResourceTemplate (line 782) | type ResourceTemplate struct
    method GetName (line 806) | func (rt ResourceTemplate) GetName() string {
  type ResourceContents (line 812) | type ResourceContents interface
  type TextResourceContents (line 816) | type TextResourceContents struct
    method isResourceContents (line 829) | func (TextResourceContents) isResourceContents() {}
  type BlobResourceContents (line 831) | type BlobResourceContents struct
    method isResourceContents (line 843) | func (BlobResourceContents) isResourceContents() {}
  type SetLevelRequest (line 849) | type SetLevelRequest struct
  type SetLevelParams (line 855) | type SetLevelParams struct
  type LoggingMessageNotification (line 865) | type LoggingMessageNotification struct
  type LoggingMessageNotificationParams (line 870) | type LoggingMessageNotificationParams struct
  type LoggingLevel (line 884) | type LoggingLevel
    method ShouldSendTo (line 908) | func (l LoggingLevel) ShouldSendTo(minLevel LoggingLevel) bool {
  constant LoggingLevelDebug (line 887) | LoggingLevelDebug     LoggingLevel = "debug"
  constant LoggingLevelInfo (line 888) | LoggingLevelInfo      LoggingLevel = "info"
  constant LoggingLevelNotice (line 889) | LoggingLevelNotice    LoggingLevel = "notice"
  constant LoggingLevelWarning (line 890) | LoggingLevelWarning   LoggingLevel = "warning"
  constant LoggingLevelError (line 891) | LoggingLevelError     LoggingLevel = "error"
  constant LoggingLevelCritical (line 892) | LoggingLevelCritical  LoggingLevel = "critical"
  constant LoggingLevelAlert (line 893) | LoggingLevelAlert     LoggingLevel = "alert"
  constant LoggingLevelEmergency (line 894) | LoggingLevelEmergency LoggingLevel = "emergency"
  type ElicitationRequest (line 921) | type ElicitationRequest struct
  type ElicitationParams (line 927) | type ElicitationParams struct
    method Validate (line 948) | func (p ElicitationParams) Validate() error {
  type ElicitationResult (line 974) | type ElicitationResult struct
  type ElicitationResponse (line 980) | type ElicitationResponse struct
  type ElicitationResponseAction (line 989) | type ElicitationResponseAction
  constant ElicitationResponseActionAccept (line 993) | ElicitationResponseActionAccept ElicitationResponseAction = "accept"
  constant ElicitationResponseActionDecline (line 995) | ElicitationResponseActionDecline ElicitationResponseAction = "decline"
  constant ElicitationResponseActionCancel (line 997) | ElicitationResponseActionCancel ElicitationResponseAction = "cancel"
  constant MethodSamplingCreateMessage (line 1004) | MethodSamplingCreateMessage MCPMethod = "sampling/createMessage"
  type CreateMessageRequest (line 1011) | type CreateMessageRequest struct
  type CreateMessageParams (line 1016) | type CreateMessageParams struct
  type CreateMessageResult (line 1031) | type CreateMessageResult struct
  type SamplingMessage (line 1041) | type SamplingMessage struct
  type Annotations (line 1046) | type Annotations struct
  type Annotated (line 1067) | type Annotated struct
  type Content (line 1071) | type Content interface
  type TextContent (line 1077) | type TextContent struct
    method isContent (line 1086) | func (TextContent) isContent() {}
  type ImageContent (line 1090) | type ImageContent struct
    method isContent (line 1101) | func (ImageContent) isContent() {}
  type AudioContent (line 1105) | type AudioContent struct
    method isContent (line 1116) | func (AudioContent) isContent() {}
  type ResourceLink (line 1119) | type ResourceLink struct
    method isContent (line 1132) | func (ResourceLink) isContent() {}
  type EmbeddedResource (line 1138) | type EmbeddedResource struct
    method isContent (line 1146) | func (EmbeddedResource) isContent() {}
  type ModelPreferences (line 1160) | type ModelPreferences struct
  type ModelHint (line 1190) | type ModelHint struct
  type CompleteRequest (line 1207) | type CompleteRequest struct
  type CompleteParams (line 1214) | type CompleteParams struct
    method UnmarshalJSON (line 1220) | func (p *CompleteParams) UnmarshalJSON(data []byte) error {
  type CompleteResult (line 1260) | type CompleteResult struct
  type CompleteArgument (line 1266) | type CompleteArgument struct
  type CompleteContext (line 1274) | type CompleteContext struct
  type Completion (line 1279) | type Completion struct
  type ResourceReference (line 1291) | type ResourceReference struct
  type PromptReference (line 1298) | type PromptReference struct
  type ListRootsRequest (line 1313) | type ListRootsRequest struct
  type ListRootsResult (line 1320) | type ListRootsResult struct
  type Root (line 1326) | type Root struct
  type RootsListChangedNotification (line 1343) | type RootsListChangedNotification struct
  type TasksCapability (line 1351) | type TasksCapability struct
  type TaskRequestsCapability (line 1361) | type TaskRequestsCapability struct
  type TaskStatus (line 1380) | type TaskStatus
    method IsTerminal (line 1399) | func (s TaskStatus) IsTerminal() bool {
  constant TaskStatusWorking (line 1384) | TaskStatusWorking TaskStatus = "working"
  constant TaskStatusInputRequired (line 1389) | TaskStatusInputRequired TaskStatus = "input_required"
  constant TaskStatusCompleted (line 1391) | TaskStatusCompleted TaskStatus = "completed"
  constant TaskStatusFailed (line 1393) | TaskStatusFailed TaskStatus = "failed"
  constant TaskStatusCancelled (line 1395) | TaskStatusCancelled TaskStatus = "cancelled"
  type Task (line 1404) | type Task struct
    method GetName (line 1423) | func (t Task) GetName() string {
  type TaskParams (line 1428) | type TaskParams struct
  type CreateTaskResult (line 1435) | type CreateTaskResult struct
  type GetTaskRequest (line 1441) | type GetTaskRequest struct
  type GetTaskParams (line 1447) | type GetTaskParams struct
  type GetTaskResult (line 1452) | type GetTaskResult struct
  type ListTasksRequest (line 1458) | type ListTasksRequest struct
  type ListTasksResult (line 1464) | type ListTasksResult struct
  type TaskResultRequest (line 1470) | type TaskResultRequest struct
  type TaskResultParams (line 1476) | type TaskResultParams struct
  type TaskResultResult (line 1482) | type TaskResultResult struct
  type CancelTaskRequest (line 1491) | type CancelTaskRequest struct
  type CancelTaskParams (line 1497) | type CancelTaskParams struct
  type CancelTaskResult (line 1502) | type CancelTaskResult struct
  type TaskStatusNotification (line 1508) | type TaskStatusNotification struct
  type TaskStatusNotificationParams (line 1513) | type TaskStatusNotificationParams struct
  type ClientRequest (line 1518) | type ClientRequest
  type ClientNotification (line 1521) | type ClientNotification
  type ClientResult (line 1524) | type ClientResult
  type ServerRequest (line 1527) | type ServerRequest
  type ServerNotification (line 1530) | type ServerNotification
  type ServerResult (line 1533) | type ServerResult
  type Named (line 1535) | type Named interface
  function MarshalContent (line 1540) | func MarshalContent(content Content) ([]byte, error) {
  function UnmarshalContent (line 1545) | func UnmarshalContent(data []byte) (Content, error) {
  type ElicitationCapability (line 1583) | type ElicitationCapability struct
  function NewElicitationCompleteNotification (line 1589) | func NewElicitationCompleteNotification(elicitationID string) JSONRPCNot...

FILE: vendor/github.com/mark3labs/mcp-go/mcp/utils.go
  function asType (line 75) | func asType[T any](content any) (*T, bool) {
  function AsTextContent (line 84) | func AsTextContent(content any) (*TextContent, bool) {
  function AsImageContent (line 89) | func AsImageContent(content any) (*ImageContent, bool) {
  function AsAudioContent (line 94) | func AsAudioContent(content any) (*AudioContent, bool) {
  function AsEmbeddedResource (line 99) | func AsEmbeddedResource(content any) (*EmbeddedResource, bool) {
  function AsTextResourceContents (line 104) | func AsTextResourceContents(content any) (*TextResourceContents, bool) {
  function AsBlobResourceContents (line 109) | func AsBlobResourceContents(content any) (*BlobResourceContents, bool) {
  function NewJSONRPCResponse (line 119) | func NewJSONRPCResponse(id RequestId, result Result) JSONRPCResponse {
  function NewJSONRPCResultResponse (line 129) | func NewJSONRPCResultResponse(id RequestId, result any) JSONRPCResponse {
  function NewJSONRPCErrorDetails (line 138) | func NewJSONRPCErrorDetails(code int, message string, data any) JSONRPCE...
  function NewJSONRPCError (line 147) | func NewJSONRPCError(
  function NewProgressNotification (line 162) | func NewProgressNotification(
  function NewLoggingMessageNotification (line 193) | func NewLoggingMessageNotification(
  function NewPromptMessage (line 216) | func NewPromptMessage(role Role, content Content) PromptMessage {
  function NewTextContent (line 225) | func NewTextContent(text string) TextContent {
  function NewImageContent (line 234) | func NewImageContent(data, mimeType string) ImageContent {
  function NewAudioContent (line 243) | func NewAudioContent(data, mimeType string) AudioContent {
  function NewResourceLink (line 252) | func NewResourceLink(uri, name, description, mimeType string) ResourceLi...
  function NewEmbeddedResource (line 263) | func NewEmbeddedResource(resource ResourceContents) EmbeddedResource {
  function NewToolResultText (line 271) | func NewToolResultText(text string) *CallToolResult {
  function NewToolResultJSON (line 283) | func NewToolResultJSON[T any](data T) (*CallToolResult, error) {
  function NewToolResultStructured (line 302) | func NewToolResultStructured(structured any, fallbackText string) *CallT...
  function NewToolResultStructuredOnly (line 317) | func NewToolResultStructuredOnly(structured any) *CallToolResult {
  function NewToolResultImage (line 339) | func NewToolResultImage(text, imageData, mimeType string) *CallToolResult {
  function NewToolResultAudio (line 356) | func NewToolResultAudio(text, audioData, mimeType string) *CallToolResult {
  function NewToolResultResource (line 373) | func NewToolResultResource(
  function NewToolResultError (line 393) | func NewToolResultError(text string) *CallToolResult {
  function NewToolResultErrorFromErr (line 408) | func NewToolResultErrorFromErr(text string, err error) *CallToolResult {
  function NewToolResultErrorf (line 426) | func NewToolResultErrorf(format string, a ...any) *CallToolResult {
  function NewListResourcesResult (line 439) | func NewListResourcesResult(
  function NewListResourceTemplatesResult (line 452) | func NewListResourceTemplatesResult(
  function NewReadResourceResult (line 465) | func NewReadResourceResult(text string) *ReadResourceResult {
  function NewListPromptsResult (line 476) | func NewListPromptsResult(
  function NewGetPromptResult (line 489) | func NewGetPromptResult(
  function NewListToolsResult (line 500) | func NewListToolsResult(tools []Tool, nextCursor Cursor) *ListToolsResult {
  function NewInitializeResult (line 510) | func NewInitializeResult(
  function FormatNumberResult (line 526) | func FormatNumberResult(value float64) *CallToolResult {
  function ExtractString (line 530) | func ExtractString(data map[string]any, key string) string {
  function ParseAnnotations (line 544) | func ParseAnnotations(data map[string]any) *Annotations {
  function ExtractMap (line 575) | func ExtractMap(data map[string]any, key string) map[string]any {
  function ParseContent (line 584) | func ParseContent(contentMap map[string]any) (Content, error) {
  function ParseGetPromptResult (line 650) | func ParseGetPromptResult(rawMessage *json.RawMessage) (*GetPromptResult...
  function ParseCallToolResult (line 716) | func ParseCallToolResult(rawMessage *json.RawMessage) (*CallToolResult, ...
  function ParseResourceContents (line 777) | func ParseResourceContents(contentMap map[string]any) (ResourceContents,...
  function ParseReadResourceResult (line 812) | func ParseReadResourceResult(rawMessage *json.RawMessage) (*ReadResource...
  function ParseArgument (line 860) | func ParseArgument(request CallToolRequest, key string, defaultVal any) ...
  function ParseBoolean (line 873) | func ParseBoolean(request CallToolRequest, key string, defaultValue bool...
  function ParseInt64 (line 880) | func ParseInt64(request CallToolRequest, key string, defaultValue int64)...
  function ParseInt32 (line 886) | func ParseInt32(request CallToolRequest, key string, defaultValue int32)...
  function ParseInt16 (line 892) | func ParseInt16(request CallToolRequest, key string, defaultValue int16)...
  function ParseInt8 (line 898) | func ParseInt8(request CallToolRequest, key string, defaultValue int8) i...
  function ParseInt (line 904) | func ParseInt(request CallToolRequest, key string, defaultValue int) int {
  function ParseUInt (line 910) | func ParseUInt(request CallToolRequest, key string, defaultValue uint) u...
  function ParseUInt64 (line 916) | func ParseUInt64(request CallToolRequest, key string, defaultValue uint6...
  function ParseUInt32 (line 922) | func ParseUInt32(request CallToolRequest, key string, defaultValue uint3...
  function ParseUInt16 (line 928) | func ParseUInt16(request CallToolRequest, key string, defaultValue uint1...
  function ParseUInt8 (line 934) | func ParseUInt8(request CallToolRequest, key string, defaultValue uint8)...
  function ParseFloat32 (line 940) | func ParseFloat32(request CallToolRequest, key string, defaultValue floa...
  function ParseFloat64 (line 946) | func ParseFloat64(request CallToolRequest, key string, defaultValue floa...
  function ParseString (line 952) | func ParseString(request CallToolRequest, key string, defaultValue strin...
  function ParseStringMap (line 958) | func ParseStringMap(request CallToolRequest, key string, defaultValue ma...
  function ToBoolPtr (line 964) | func ToBoolPtr(b bool) *bool {
  function ToInt64Ptr (line 969) | func ToInt64Ptr(i int64) *int64 {
  function GetTextFromContent (line 982) | func GetTextFromContent(content any) string {

FILE: vendor/github.com/mark3labs/mcp-go/server/completion.go
  type PromptCompletionProvider (line 9) | type PromptCompletionProvider interface
  type ResourceCompletionProvider (line 14) | type ResourceCompletionProvider interface
  type DefaultPromptCompletionProvider (line 20) | type DefaultPromptCompletionProvider struct
    method CompletePromptArgument (line 22) | func (p *DefaultPromptCompletionProvider) CompletePromptArgument(ctx c...
  type DefaultResourceCompletionProvider (line 29) | type DefaultResourceCompletionProvider struct
    method CompleteResourceArgument (line 31) | func (p *DefaultResourceCompletionProvider) CompleteResourceArgument(c...

FILE: vendor/github.com/mark3labs/mcp-go/server/constants.go
  constant HeaderKeySessionID (line 5) | HeaderKeySessionID       = "Mcp-Session-Id"
  constant HeaderKeyProtocolVersion (line 6) | HeaderKeyProtocolVersion = "Mcp-Protocol-Version"

FILE: vendor/github.com/mark3labs/mcp-go/server/ctx.go
  type contextKey (line 3) | type contextKey
  constant requestHeader (line 7) | requestHeader contextKey = iota

FILE: vendor/github.com/mark3labs/mcp-go/server/elicitation.go
  method RequestElicitation (line 20) | func (s *MCPServer) RequestElicitation(ctx context.Context, request mcp....
  method RequestURLElicitation (line 39) | func (s *MCPServer) RequestURLElicitation(
  method SendElicitationComplete (line 76) | func (s *MCPServer) SendElicitationComplete(

FILE: vendor/github.com/mark3labs/mcp-go/server/errors.go
  type ErrDynamicPathConfig (line 30) | type ErrDynamicPathConfig struct
    method Error (line 34) | func (e *ErrDynamicPathConfig) Error() string {

FILE: vendor/github.com/mark3labs/mcp-go/server/hooks.go
  type OnRegisterSessionHookFunc (line 12) | type OnRegisterSessionHookFunc
  type OnUnregisterSessionHookFunc (line 15) | type OnUnregisterSessionHookFunc
  type BeforeAnyHookFunc (line 19) | type BeforeAnyHookFunc
  type OnSuccessHookFunc (line 23) | type OnSuccessHookFunc
  type OnErrorHookFunc (line 58) | type OnErrorHookFunc
  type OnRequestInitializationFunc (line 62) | type OnRequestInitializationFunc
  type OnBeforeInitializeFunc (line 64) | type OnBeforeInitializeFunc
  type OnAfterInitializeFunc (line 65) | type OnAfterInitializeFunc
  type OnBeforePingFunc (line 67) | type OnBeforePingFunc
  type OnAfterPingFunc (line 68) | type OnAfterPingFunc
  type OnBeforeSetLevelFunc (line 70) | type OnBeforeSetLevelFunc
  type OnAfterSetLevelFunc (line 71) | type OnAfterSetLevelFunc
  type OnBeforeListResourcesFunc (line 73) | type OnBeforeListResourcesFunc
  type OnAfterListResourcesFunc (line 74) | type OnAfterListResourcesFunc
  type OnBeforeListResourceTemplatesFunc (line 76) | type OnBeforeListResourceTemplatesFunc
  type OnAfterListResourceTemplatesFunc (line 77) | type OnAfterListResourceTemplatesFunc
  type OnBeforeReadResourceFunc (line 79) | type OnBeforeReadResourceFunc
  type OnAfterReadResourceFunc (line 80) | type OnAfterReadResourceFunc
  type OnBeforeListPromptsFunc (line 82) | type OnBeforeListPromptsFunc
  type OnAfterListPromptsFunc (line 83) | type OnAfterListPromptsFunc
  type OnBeforeGetPromptFunc (line 85) | type OnBeforeGetPromptFunc
  type OnAfterGetPromptFunc (line 86) | type OnAfterGetPromptFunc
  type OnBeforeListToolsFunc (line 88) | type OnBeforeListToolsFunc
  type OnAfterListToolsFunc (line 89) | type OnAfterListToolsFunc
  type OnBeforeCallToolFunc (line 91) | type OnBeforeCallToolFunc
  type OnAfterCallToolFunc (line 92) | type OnAfterCallToolFunc
  type OnBeforeGetTaskFunc (line 94) | type OnBeforeGetTaskFunc
  type OnAfterGetTaskFunc (line 95) | type OnAfterGetTaskFunc
  type OnBeforeListTasksFunc (line 97) | type OnBeforeListTasksFunc
  type OnAfterListTasksFunc (line 98) | type OnAfterListTasksFunc
  type OnBeforeTaskResultFunc (line 100) | type OnBeforeTaskResultFunc
  type OnAfterTaskResultFunc (line 101) | type OnAfterTaskResultFunc
  type OnBeforeCancelTaskFunc (line 103) | type OnBeforeCancelTaskFunc
  type OnAfterCancelTaskFunc (line 104) | type OnAfterCancelTaskFunc
  type OnBeforeCompleteFunc (line 106) | type OnBeforeCompleteFunc
  type OnAfterCompleteFunc (line 107) | type OnAfterCompleteFunc
  type Hooks (line 109) | type Hooks struct
    method AddBeforeAny (line 148) | func (c *Hooks) AddBeforeAny(hook BeforeAnyHookFunc) {
    method AddOnSuccess (line 152) | func (c *Hooks) AddOnSuccess(hook OnSuccessHookFunc) {
    method AddOnError (line 201) | func (c *Hooks) AddOnError(hook OnErrorHookFunc) {
    method beforeAny (line 205) | func (c *Hooks) beforeAny(ctx context.Context, id any, method mcp.MCPM...
    method onSuccess (line 214) | func (c *Hooks) onSuccess(ctx context.Context, id any, method mcp.MCPM...
    method onError (line 237) | func (c *Hooks) onError(ctx context.Context, id any, method mcp.MCPMet...
    method AddOnRegisterSession (line 246) | func (c *Hooks) AddOnRegisterSession(hook OnRegisterSessionHookFunc) {
    method RegisterSession (line 250) | func (c *Hooks) RegisterSession(ctx context.Context, session ClientSes...
    method AddOnUnregisterSession (line 259) | func (c *Hooks) AddOnUnregisterSession(hook OnUnregisterSessionHookFun...
    method UnregisterSession (line 263) | func (c *Hooks) UnregisterSession(ctx context.Context, session ClientS...
    method AddOnRequestInitialization (line 272) | func (c *Hooks) AddOnRequestInitialization(hook OnRequestInitializatio...
    method onRequestInitialization (line 276) | func (c *Hooks) onRequestInitialization(ctx context.Context, id any, m...
    method AddBeforeInitialize (line 288) | func (c *Hooks) AddBeforeInitialize(hook OnBeforeInitializeFunc) {
    method AddAfterInitialize (line 292) | func (c *Hooks) AddAfterInitialize(hook OnAfterInitializeFunc) {
    method beforeInitialize (line 296) | func (c *Hooks) beforeInitialize(ctx context.Context, id any, message ...
    method afterInitialize (line 306) | func (c *Hooks) afterInitialize(ctx context.Context, id any, message *...
    method AddBeforePing (line 315) | func (c *Hooks) AddBeforePing(hook OnBeforePingFunc) {
    method AddAfterPing (line 319) | func (c *Hooks) AddAfterPing(hook OnAfterPingFunc) {
    method beforePing (line 323) | func (c *Hooks) beforePing(ctx context.Context, id any, message *mcp.P...
    method afterPing (line 333) | func (c *Hooks) afterPing(ctx context.Context, id any, message *mcp.Pi...
    method AddBeforeSetLevel (line 342) | func (c *Hooks) AddBeforeSetLevel(hook OnBeforeSetLevelFunc) {
    method AddAfterSetLevel (line 346) | func (c *Hooks) AddAfterSetLevel(hook OnAfterSetLevelFunc) {
    method beforeSetLevel (line 350) | func (c *Hooks) beforeSetLevel(ctx context.Context, id any, message *m...
    method afterSetLevel (line 360) | func (c *Hooks) afterSetLevel(ctx context.Context, id any, message *mc...
    method AddBeforeListResources (line 369) | func (c *Hooks) AddBeforeListResources(hook OnBeforeListResourcesFunc) {
    method AddAfterListResources (line 373) | func (c *Hooks) AddAfterListResources(hook OnAfterListResourcesFunc) {
    method beforeListResources (line 377) | func (c *Hooks) beforeListResources(ctx context.Context, id any, messa...
    method afterListResources (line 387) | func (c *Hooks) afterListResources(ctx context.Context, id any, messag...
    method AddBeforeListResourceTemplates (line 396) | func (c *Hooks) AddBeforeListResourceTemplates(hook OnBeforeListResour...
    method AddAfterListResourceTemplates (line 400) | func (c *Hooks) AddAfterListResourceTemplates(hook OnAfterListResource...
    method beforeListResourceTemplates (line 404) | func (c *Hooks) beforeListResourceTemplates(ctx context.Context, id an...
    method afterListResourceTemplates (line 414) | func (c *Hooks) afterListResourceTemplates(ctx context.Context, id any...
    method AddBeforeReadResource (line 423) | func (c *Hooks) AddBeforeReadResource(hook OnBeforeReadResourceFunc) {
    method AddAfterReadResource (line 427) | func (c *Hooks) AddAfterReadResource(hook OnAfterReadResourceFunc) {
    method beforeReadResource (line 431) | func (c *Hooks) beforeReadResource(ctx context.Context, id any, messag...
    method afterReadResource (line 441) | func (c *Hooks) afterReadResource(ctx context.Context, id any, message...
    method AddBeforeListPrompts (line 450) | func (c *Hooks) AddBeforeListPrompts(hook OnBeforeListPromptsFunc) {
    method AddAfterListPrompts (line 454) | func (c *Hooks) AddAfterListPrompts(hook OnAfterListPromptsFunc) {
    method beforeListPrompts (line 458) | func (c *Hooks) beforeListPrompts(ctx context.Context, id any, message...
    method afterListPrompts (line 468) | func (c *Hooks) afterListPrompts(ctx context.Context, id any, message ...
    method AddBeforeGetPrompt (line 477) | func (c *Hooks) AddBeforeGetPrompt(hook OnBeforeGetPromptFunc) {
    method AddAfterGetPrompt (line 481) | func (c *Hooks) AddAfterGetPrompt(hook OnAfterGetPromptFunc) {
    method beforeGetPrompt (line 485) | func (c *Hooks) beforeGetPrompt(ctx context.Context, id any, message *...
    method afterGetPrompt (line 495) | func (c *Hooks) afterGetPrompt(ctx context.Context, id any, message *m...
    method AddBeforeListTools (line 504) | func (c *Hooks) AddBeforeListTools(hook OnBeforeListToolsFunc) {
    method AddAfterListTools (line 508) | func (c *Hooks) AddAfterListTools(hook OnAfterListToolsFunc) {
    method beforeListTools (line 512) | func (c *Hooks) beforeListTools(ctx context.Context, id any, message *...
    method afterListTools (line 522) | func (c *Hooks) afterListTools(ctx context.Context, id any, message *m...
    method AddBeforeCallTool (line 531) | func (c *Hooks) AddBeforeCallTool(hook OnBeforeCallToolFunc) {
    method AddAfterCallTool (line 535) | func (c *Hooks) AddAfterCallTool(hook OnAfterCallToolFunc) {
    method beforeCallTool (line 539) | func (c *Hooks) beforeCallTool(ctx context.Context, id any, message *m...
    method afterCallTool (line 549) | func (c *Hooks) afterCallTool(ctx context.Context, id any, message *mc...
    method AddBeforeGetTask (line 558) | func (c *Hooks) AddBeforeGetTask(hook OnBeforeGetTaskFunc) {
    method AddAfterGetTask (line 562) | func (c *Hooks) AddAfterGetTask(hook OnAfterGetTaskFunc) {
    method beforeGetTask (line 566) | func (c *Hooks) beforeGetTask(ctx context.Context, id any, message *mc...
    method afterGetTask (line 576) | func (c *Hooks) afterGetTask(ctx context.Context, id any, message *mcp...
    method AddBeforeListTasks (line 585) | func (c *Hooks) AddBeforeListTasks(hook OnBeforeListTasksFunc) {
    method AddAfterListTasks (line 589) | func (c *Hooks) AddAfterListTasks(hook OnAfterListTasksFunc) {
    method beforeListTasks (line 593) | func (c *Hooks) beforeListTasks(ctx context.Context, id any, message *...
    method afterListTasks (line 603) | func (c *Hooks) afterListTasks(ctx context.Context, id any, message *m...
    method AddBeforeTaskResult (line 612) | func (c *Hooks) AddBeforeTaskResult(hook OnBeforeTaskResultFunc) {
    method AddAfterTaskResult (line 616) | func (c *Hooks) AddAfterTaskResult(hook OnAfterTaskResultFunc) {
    method beforeTaskResult (line 620) | func (c *Hooks) beforeTaskResult(ctx context.Context, id any, message ...
    method afterTaskResult (line 630) | func (c *Hooks) afterTaskResult(ctx context.Context, id any, message *...
    method AddBeforeCancelTask (line 639) | func (c *Hooks) AddBeforeCancelTask(hook OnBeforeCancelTaskFunc) {
    method AddAfterCancelTask (line 643) | func (c *Hooks) AddAfterCancelTask(hook OnAfterCancelTaskFunc) {
    method beforeCancelTask (line 647) | func (c *Hooks) beforeCancelTask(ctx context.Context, id any, message ...
    method afterCancelTask (line 657) | func (c *Hooks) afterCancelTask(ctx context.Context, id any, message *...
    method AddBeforeComplete (line 666) | func (c *Hooks) AddBeforeComplete(hook OnBeforeCompleteFunc) {
    method AddAfterComplete (line 670) | func (c *Hooks) AddAfterComplete(hook OnAfterCompleteFunc) {
    method beforeComplete (line 674) | func (c *Hooks) beforeComplete(ctx context.Context, id any, message *m...
    method afterComplete (line 684) | func (c *Hooks) afterComplete(ctx context.Context, id any, message *mc...

FILE: vendor/github.com/mark3labs/mcp-go/server/http_transport_options.go
  type HTTPContextFunc (line 11) | type HTTPContextFunc

FILE: vendor/github.com/mark3labs/mcp-go/server/inprocess_session.go
  type SamplingHandler (line 14) | type SamplingHandler interface
  type ElicitationHandler (line 19) | type ElicitationHandler interface
  type RootsHandler (line 24) | type RootsHandler interface
  type InProcessSession (line 28) | type InProcessSession struct
    method SessionID (line 59) | func (s *InProcessSession) SessionID() string {
    method NotificationChannel (line 63) | func (s *InProcessSession) NotificationChannel() chan<- mcp.JSONRPCNot...
    method Initialize (line 67) | func (s *InProcessSession) Initialize() {
    method Initialized (line 72) | func (s *InProcessSession) Initialized() bool {
    method GetClientInfo (line 76) | func (s *InProcessSession) GetClientInfo() mcp.Implementation {
    method SetClientInfo (line 85) | func (s *InProcessSession) SetClientInfo(clientInfo mcp.Implementation) {
    method GetClientCapabilities (line 89) | func (s *InProcessSession) GetClientCapabilities() mcp.ClientCapabilit...
    method SetClientCapabilities (line 98) | func (s *InProcessSession) SetClientCapabilities(clientCapabilities mc...
    method SetLogLevel (line 102) | func (s *InProcessSession) SetLogLevel(level mcp.LoggingLevel) {
    method GetLogLevel (line 106) | func (s *InProcessSession) GetLogLevel() mcp.LoggingLevel {
    method RequestSampling (line 114) | func (s *InProcessSession) RequestSampling(ctx context.Context, reques...
    method RequestElicitation (line 126) | func (s *InProcessSession) RequestElicitation(ctx context.Context, req...
    method ListRoots (line 140) | func (s *InProcessSession) ListRoots(ctx context.Context, request mcp....
  function NewInProcessSession (line 41) | func NewInProcessSession(sessionID string, samplingHandler SamplingHandl...
  function NewInProcessSessionWithHandlers (line 49) | func NewInProcessSessionWithHandlers(sessionID string, samplingHandler S...
  function GenerateInProcessSessionID (line 153) | func GenerateInProcessSessionID() string {

FILE: vendor/github.com/mark3labs/mcp-go/server/request_handler.go
  method HandleMessage (line 15) | func (s *MCPServer) HandleMessage(

FILE: vendor/github.com/mark3labs/mcp-go/server/roots.go
  method RequestRoots (line 20) | func (s *MCPServer) RequestRoots(ctx context.Context, request mcp.ListRo...

FILE: vendor/github.com/mark3labs/mcp-go/server/sampling.go
  method EnableSampling (line 12) | func (s *MCPServer) EnableSampling() {
  method RequestSampling (line 22) | func (s *MCPServer) RequestSampling(ctx context.Context, request mcp.Cre...
  type SessionWithSampling (line 42) | type SessionWithSampling interface
  type inProcessSamplingHandlerKey (line 48) | type inProcessSamplingHandlerKey struct
  function WithInProcessSamplingHandler (line 51) | func WithInProcessSamplingHandler(ctx context.Context, handler SamplingH...
  function InProcessSamplingHandlerFromContext (line 56) | func InProcessSamplingHandlerFromContext(ctx context.Context) SamplingHa...

FILE: vendor/github.com/mark3labs/mcp-go/server/server.go
  type resourceEntry (line 22) | type resourceEntry struct
  type resourceTemplateEntry (line 28) | type resourceTemplateEntry struct
  type taskEntry (line 34) | type taskEntry struct
  type ServerOption (line 47) | type ServerOption
  type ResourceHandlerFunc (line 50) | type ResourceHandlerFunc
  type ResourceTemplateHandlerFunc (line 53) | type ResourceTemplateHandlerFunc
  type PromptHandlerFunc (line 56) | type PromptHandlerFunc
  type ToolHandlerFunc (line 59) | type ToolHandlerFunc
  type TaskToolHandlerFunc (line 64) | type TaskToolHandlerFunc
  type ToolHandlerMiddleware (line 67) | type ToolHandlerMiddleware
  type ResourceHandlerMiddleware (line 70) | type ResourceHandlerMiddleware
  type ToolFilterFunc (line 73) | type ToolFilterFunc
  type ServerTool (line 76) | type ServerTool struct
  type ServerTaskTool (line 82) | type ServerTaskTool struct
  type ServerPrompt (line 88) | type ServerPrompt struct
  type ServerResource (line 94) | type ServerResource struct
  type ServerResourceTemplate (line 100) | type ServerResourceTemplate struct
  type serverKey (line 106) | type serverKey struct
  function ServerFromContext (line 109) | func ServerFromContext(ctx context.Context) *MCPServer {
  type UnparsableMessageError (line 118) | type UnparsableMessageError struct
    method Error (line 124) | func (e *UnparsableMessageError) Error() string {
    method Unwrap (line 128) | func (e *UnparsableMessageError) Unwrap() error {
    method GetMessage (line 132) | func (e *UnparsableMessageError) GetMessage() json.RawMessage {
    method GetMethod (line 136) | func (e *UnparsableMessageError) GetMethod() mcp.MCPMethod {
  type requestError (line 142) | type requestError struct
    method Error (line 148) | func (e *requestError) Error() string {
    method ToJSONRPCError (line 152) | func (e *requestError) ToJSONRPCError() mcp.JSONRPCError {
    method Unwrap (line 160) | func (e *requestError) Unwrap() error {
  type NotificationHandlerFunc (line 165) | type NotificationHandlerFunc
  type MCPServer (line 169) | type MCPServer struct
    method GetHooks (line 358) | func (s *MCPServer) GetHooks() *Hooks {
    method GenerateInProcessSessionID (line 489) | func (s *MCPServer) GenerateInProcessSessionID() string {
    method AddResources (line 494) | func (s *MCPServer) AddResources(resources ...ServerResource) {
    method SetResources (line 514) | func (s *MCPServer) SetResources(resources ...ServerResource) {
    method AddResource (line 522) | func (s *MCPServer) AddResource(
    method DeleteResources (line 530) | func (s *MCPServer) DeleteResources(uris ...string) {
    method RemoveResource (line 548) | func (s *MCPServer) RemoveResource(uri string) {
    method AddResourceTemplates (line 563) | func (s *MCPServer) AddResourceTemplates(resourceTemplates ...ServerRe...
    method SetResourceTemplates (line 583) | func (s *MCPServer) SetResourceTemplates(templates ...ServerResourceTe...
    method AddResourceTemplate (line 591) | func (s *MCPServer) AddResourceTemplate(
    method AddPrompts (line 599) | func (s *MCPServer) AddPrompts(prompts ...ServerPrompt) {
    method AddPrompt (line 617) | func (s *MCPServer) AddPrompt(prompt mcp.Prompt, handler PromptHandler...
    method SetPrompts (line 622) | func (s *MCPServer) SetPrompts(prompts ...ServerPrompt) {
    method DeletePrompts (line 631) | func (s *MCPServer) DeletePrompts(names ...string) {
    method AddTool (line 651) | func (s *MCPServer) AddTool(tool mcp.Tool, handler ToolHandlerFunc) {
    method AddTaskTool (line 656) | func (s *MCPServer) AddTaskTool(tool mcp.Tool, handler TaskToolHandler...
    method implicitlyRegisterToolCapabilities (line 663) | func (s *MCPServer) implicitlyRegisterToolCapabilities() {
    method implicitlyRegisterResourceCapabilities (line 670) | func (s *MCPServer) implicitlyRegisterResourceCapabilities() {
    method implicitlyRegisterPromptCapabilities (line 677) | func (s *MCPServer) implicitlyRegisterPromptCapabilities() {
    method implicitlyRegisterCapabilities (line 684) | func (s *MCPServer) implicitlyRegisterCapabilities(check func() bool, ...
    method AddTools (line 700) | func (s *MCPServer) AddTools(tools ...ServerTool) {
    method AddTaskTools (line 723) | func (s *MCPServer) AddTaskTools(taskTools ...ServerTaskTool) {
    method SetTools (line 746) | func (s *MCPServer) SetTools(tools ...ServerTool) {
    method GetTool (line 754) | func (s *MCPServer) GetTool(toolName string) *ServerTool {
    method ListTools (line 763) | func (s *MCPServer) ListTools() map[string]*ServerTool {
    method DeleteTools (line 778) | func (s *MCPServer) DeleteTools(names ...string) {
    method AddNotificationHandler (line 797) | func (s *MCPServer) AddNotificationHandler(
    method handleInitialize (line 806) | func (s *MCPServer) handleInitialize(
    method protocolVersion (line 910) | func (s *MCPServer) protocolVersion(clientVersion string) string {
    method handlePing (line 926) | func (s *MCPServer) handlePing(
    method handleSetLevel (line 934) | func (s *MCPServer) handleSetLevel(
    method handleListResources (line 1013) | func (s *MCPServer) handleListResources(
    method handleListResourceTemplates (line 1071) | func (s *MCPServer) handleListResourceTemplates(
    method handleReadResource (line 1129) | func (s *MCPServer) handleReadResource(
    method handleListPrompts (line 1273) | func (s *MCPServer) handleListPrompts(
    method handleGetPrompt (line 1311) | func (s *MCPServer) handleGetPrompt(
    method handleListTools (line 1340) | func (s *MCPServer) handleListTools(
    method handleToolCall (line 1437) | func (s *MCPServer) handleToolCall(
    method handleTaskAugmentedToolCall (line 1534) | func (s *MCPServer) handleTaskAugmentedToolCall(
    method executeTaskTool (line 1618) | func (s *MCPServer) executeTaskTool(
    method executeRegularToolAsTask (line 1697) | func (s *MCPServer) executeRegularToolAsTask(
    method handleNotification (line 1774) | func (s *MCPServer) handleNotification(
    method handleGetTask (line 1809) | func (s *MCPServer) handleGetTask(
    method handleListTasks (line 1828) | func (s *MCPServer) handleListTasks(
    method handleTaskResult (line 1865) | func (s *MCPServer) handleTaskResult(
    method handleCancelTask (line 1951) | func (s *MCPServer) handleCancelTask(
    method handleComplete (line 1979) | func (s *MCPServer) handleComplete(
    method createTask (line 2033) | func (s *MCPServer) createTask(ctx context.Context, taskID string, too...
    method getTask (line 2090) | func (s *MCPServer) getTask(ctx context.Context, taskID string) (mcp.T...
    method getTaskEntry (line 2119) | func (s *MCPServer) getTaskEntry(ctx context.Context, taskID string) (...
    method listTasks (line 2143) | func (s *MCPServer) listTasks(ctx context.Context) []mcp.Task {
    method completeTask (line 2161) | func (s *MCPServer) completeTask(entry *taskEntry, result any, err err...
    method cancelTask (line 2218) | func (s *MCPServer) cancelTask(ctx context.Context, taskID string) err...
    method scheduleTaskCleanup (line 2274) | func (s *MCPServer) scheduleTaskCleanup(taskID string, ttlMs int64) {
    method sendTaskStatusNotification (line 2295) | func (s *MCPServer) sendTaskStatusNotification(task mcp.Task) {
  function WithPaginationLimit (line 208) | func WithPaginationLimit(limit int) ServerOption {
  type serverCapabilities (line 215) | type serverCapabilities struct
  type resourceCapabilities (line 228) | type resourceCapabilities struct
  type promptCapabilities (line 234) | type promptCapabilities struct
  type toolCapabilities (line 239) | type toolCapabilities struct
  type taskCapabilities (line 244) | type taskCapabilities str
Copy disabled (too large) Download .json
Condensed preview — 1050 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (13,455K chars).
[
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 493,
    "preview": "{\n    \"name\": \"Go\",\n    \"image\": \"mcr.microsoft.com/devcontainers/go:1.25\",\n    \"customizations\": {\n        \"codespaces\""
  },
  {
    "path": ".gitattributes",
    "chars": 41,
    "preview": ".sccignore linguist-language=Ignore-List\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 62,
    "preview": "# These are supported funding model platforms\n\ngithub: boyter\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 673,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 1668,
    "preview": "name: \"Code scanning - action\"\n\non:\n  push:\n    branches: [master, ]\n  pull_request:\n    # The branches below must be a "
  },
  {
    "path": ".github/workflows/docker-publish.yml",
    "chars": 3508,
    "preview": "name: Docker\n\n# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and ar"
  },
  {
    "path": ".github/workflows/go.yml",
    "chars": 1161,
    "preview": "name: Go\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n\n  build:\n    runs-on: ub"
  },
  {
    "path": ".gitignore",
    "chars": 674,
    "preview": "# Binaries for programs and plugins\n*.exe\n*.dll\n*.so\n*.dylib\n\n# Test binary, build with `go test -c`\n*.test\n\nscc\n\n# Outp"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 1262,
    "preview": "# This is an example .goreleaser.yml file with some sensible defaults.\n# Make sure to check the documentation at https:/"
  },
  {
    "path": ".ignore",
    "chars": 22,
    "preview": "vendor/\nignorefile.txt"
  },
  {
    "path": ".sccignore",
    "chars": 21,
    "preview": "examples\n.github\ndist"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 51,
    "preview": "Do as Bill and Ted and be excellent to each other.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 951,
    "preview": "## How to contribute to sloc cloc and code (scc)\n\n#### **Did you find a bug?**\n\n* **Ensure the bug was not already repor"
  },
  {
    "path": "Dockerfile",
    "chars": 248,
    "preview": "FROM golang:1.25.2-alpine3.22 AS scc-get\n\nENV GOOS=linux \\\nGOARCH=amd64 \\\nCGO_ENABLED=0\n\nARG VERSION=v3.4.0\nCOPY . /scc\n"
  },
  {
    "path": "LANGUAGES.md",
    "chars": 6952,
    "preview": "```\nABAP (abap)\nABNF (abnf)\nActionScript (as)\nAda (ada,adb,ads,pad)\nAgda (agda)\nAlchemist (crn)\nAlex (x)\nAlgol 68 (a68)\n"
  },
  {
    "path": "LICENSE",
    "chars": 1099,
    "preview": "MIT License \n\nCopyright (c) 2021 Ben Boyter\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
  },
  {
    "path": "README.md",
    "chars": 68459,
    "preview": "# Sloc Cloc and Code (scc)\n\n![SCC illustration](./scc.jpg)\n\nA tool similar to cloc, sloccount and tokei. For counting th"
  },
  {
    "path": "SCC-OUTPUT-REPORT.html",
    "chars": 6062,
    "preview": "<html lang=\"en\"><head><meta charset=\"utf-8\" /><title>scc html output</title><style>table { border-collapse: collapse; }t"
  },
  {
    "path": "benchmark.sh",
    "chars": 7308,
    "preview": "#!/bin/bash\n\n# Assumes we need to install everything from scratch on a box for benchmarking\n# Also assumes we have copie"
  },
  {
    "path": "benchmark_to_chart.py",
    "chars": 1731,
    "preview": "#!/usr/bin/env python3\n\"\"\"Convert hyperfine JSON output from benchmark.sh into a Google Charts HTML page.\"\"\"\n\nimport jso"
  },
  {
    "path": "examples/complexity/complexity.cpp",
    "chars": 441,
    "preview": "// 4 Complexity\n#include <iostream>\n\nint main()\n{\n    int i = 0;\n    while(1) {\n        std::cin >> i;\n        if(i == 0"
  },
  {
    "path": "examples/complexity/complexity.java",
    "chars": 73,
    "preview": "printf(\" /* \");\nfor (i = 0; i < 100; i++) {\n    a += i;\n}\nprintf(\" */ \");"
  },
  {
    "path": "examples/countas/test.jsp",
    "chars": 50,
    "preview": "this should be counted as HTML using countas rules"
  },
  {
    "path": "examples/countas/test.new",
    "chars": 54,
    "preview": "this should be counted as java using the countas rules"
  },
  {
    "path": "examples/duplicates/1.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/10.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/11.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/12.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/13.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/14.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/15.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/16.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/17.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/18.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/19.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/2.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/20.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/3.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/4.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/5.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/6.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/7.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/8.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/duplicates/9.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/generated/test.cs",
    "chars": 14923,
    "preview": "// <auto-generated />\r\n/*\r\n\tBlamLib: .NET SDK for the Blam Engine\r\n\r\n\tSee license\\BlamLib\\BlamLib for specific license i"
  },
  {
    "path": "examples/generated/test.h",
    "chars": 8409,
    "preview": "/*  DO NOT EDIT THIS FILE.\r\n\r\n    It has been auto-edited by fixincludes from:\r\n\r\n\t\"/tmp/ndk-andrewhsieh/build/toolchain"
  },
  {
    "path": "examples/issue114/.gitignore",
    "chars": 35,
    "preview": "this should be counted as gitignore"
  },
  {
    "path": "examples/issue114/.ignore",
    "chars": 33,
    "preview": "this should be counted as .ignore"
  },
  {
    "path": "examples/issue114/.travis.yml",
    "chars": 25,
    "preview": "this should be a yml file"
  },
  {
    "path": "examples/issue114/java",
    "chars": 21,
    "preview": "This file is not java"
  },
  {
    "path": "examples/issue114/license",
    "chars": 33,
    "preview": "this should be counted as license"
  },
  {
    "path": "examples/issue114/makefile",
    "chars": 36,
    "preview": "this should be counted as a makefile"
  },
  {
    "path": "examples/issue120/test",
    "chars": 43,
    "preview": "#!/usr/bin/env perl\nprint \"Hello, World\\n\";"
  },
  {
    "path": "examples/issue120/test.java",
    "chars": 19,
    "preview": "this is a java file"
  },
  {
    "path": "examples/issue152/example.black.css",
    "chars": 33,
    "preview": "this is just to force a css match"
  },
  {
    "path": "examples/issue214/ббббббббббббббббббббббббббббббббб.md",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/issue214/ѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬ.md",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/issue214/中文中文中文中文中文中文中文中文中文中文中文中文中文中文中文中文.md",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/issue246.py",
    "chars": 634,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"\nDocstrings containing an apostrophe (') are handled incorrectly\nThe line above is counted as"
  },
  {
    "path": "examples/issue260/test.c",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/issue323/a.php",
    "chars": 6,
    "preview": "<?php\n"
  },
  {
    "path": "examples/issue323/b.php",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/issue339/matlab.m",
    "chars": 16152,
    "preview": "function [net,stats] = cnn_train_dag(net, imdb, getBatch, varargin)\n%CNN_TRAIN_DAG Demonstrates training a CNN using the"
  },
  {
    "path": "examples/issue339/objectivec.m",
    "chars": 27609,
    "preview": "//\n//  SGRtmpSession.m\n//  SGLivingPublisher\n//\n//  Created by iossinger on 16/6/16.\n//  Copyright © 2016年 iossinger. Al"
  },
  {
    "path": "examples/issue345/filename.cc",
    "chars": 76,
    "preview": "bool MyFunction() {\n    func(\"double\\\\escaped\\\\string\\\\\");\n    // comment\n}\n"
  },
  {
    "path": "examples/issue379/filename.py",
    "chars": 83,
    "preview": "a = ''\n# equals to 'test'\nb = 'test'''\n\n# comment\nfor i in range(10):\n    print(i)\n"
  },
  {
    "path": "examples/issue552/test.txt",
    "chars": 18,
    "preview": "- line 1\n- line 2\n"
  },
  {
    "path": "examples/issue564/a/level1/level2/test.py",
    "chars": 28,
    "preview": "print(\"test for issue 564\")\n"
  },
  {
    "path": "examples/issue564/b/c/level2/test.py",
    "chars": 28,
    "preview": "print(\"test for issue 564\")\n"
  },
  {
    "path": "examples/issue564/level1/level2/test.py",
    "chars": 28,
    "preview": "print(\"test for issue 564\")\n"
  },
  {
    "path": "examples/issue564/level1/test.go",
    "chars": 29,
    "preview": "package main\n\nfunc main() {}\n"
  },
  {
    "path": "examples/issue564/test.go",
    "chars": 29,
    "preview": "package main\n\nfunc main() {}\n"
  },
  {
    "path": "examples/issue610/issue610.ts",
    "chars": 214,
    "preview": "const url = `/foo/bar/*`;\n\nfunction getUrl(path?: string): string {\n  return path ?? url;\n}\n\nfunction getUrl2() {\n  retu"
  },
  {
    "path": "examples/language/.bash_login",
    "chars": 11,
    "preview": ".bash_login"
  },
  {
    "path": "examples/language/.cshrc",
    "chars": 6,
    "preview": ".cshrc"
  },
  {
    "path": "examples/language/.dockerignore",
    "chars": 45,
    "preview": "# ignore .git and .cache folders\n.git\n.cache\n"
  },
  {
    "path": "examples/language/.ignore",
    "chars": 7,
    "preview": ".ignore"
  },
  {
    "path": "examples/language/.kshrc",
    "chars": 6,
    "preview": ".kshrc"
  },
  {
    "path": "examples/language/.tcshrc",
    "chars": 7,
    "preview": ".tcshrc"
  },
  {
    "path": "examples/language/.zshrc",
    "chars": 6,
    "preview": ".zshrc"
  },
  {
    "path": "examples/language/Amber.ab",
    "chars": 951,
    "preview": "#!/usr/bin/env amber\nimport { \n    date_format_posix,\n    date_now,\n} from \"std/date\"\n\nfun collatz(num: Int): [Int]? {\n "
  },
  {
    "path": "examples/language/ArkTs.ets",
    "chars": 1551,
    "preview": "import appRouter from '@ohos.router';\nimport { AppConstants } from '../common/constants/AppConstants';\nimport { InfoList"
  },
  {
    "path": "examples/language/Blueprint.blp",
    "chars": 171,
    "preview": "using Gtk 4.0;\n\nGtk.Label {\n  /* multiline-comment */\n  label: _(\"Test\"); // single-line comment\n  visible: true;\n  // s"
  },
  {
    "path": "examples/language/Build.csx",
    "chars": 4816,
    "preview": "#load \"nuget:Dotnet.Build, 0.7.1\"\n#load \"nuget:dotnet-steps, 0.0.1\"\n#load \"nuget:github-changelog, 0.1.5\"\n#load \"Choco.c"
  },
  {
    "path": "examples/language/CMakeLists.txt",
    "chars": 891,
    "preview": "cmake_minimum_required(VERSION 3.20)\nproject(test_project) # project name\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STAN"
  },
  {
    "path": "examples/language/Dockerfile",
    "chars": 20,
    "preview": "this is a dockerfile"
  },
  {
    "path": "examples/language/FSharp.fs",
    "chars": 55,
    "preview": "match someBool with\r\n| true -> \"yah\"\r\n| false -> \"nope\""
  },
  {
    "path": "examples/language/GNUMakefile",
    "chars": 11,
    "preview": "gnumakefile"
  },
  {
    "path": "examples/language/Gemfile",
    "chars": 17,
    "preview": "This is a gemfile"
  },
  {
    "path": "examples/language/HassIQApp.mc",
    "chars": 1764,
    "preview": "using Toybox.Application;\nusing Toybox.Time;\n\nclass HassIQApp extends Application.AppBase {\n\tvar state = new HassIQState"
  },
  {
    "path": "examples/language/MLIR.mlir",
    "chars": 2503,
    "preview": "// An example from https://github.com/llvm/llvm-project/blob/main/mlir/test/mlir-runner/bare-ptr-call-conv.mlir\n\n// RUN:"
  },
  {
    "path": "examples/language/POML.poml",
    "chars": 567,
    "preview": "<!-- POML should always start with a POML tag to harvest most of its features. -->\n<poml>\n  <role>You are a patient comp"
  },
  {
    "path": "examples/language/PostScript.ps",
    "chars": 655,
    "preview": "%!PS\n% an example from https://github.com/bwipp/postscriptbarcode/blob/master/contrib/development/emit_c_style_array.ps\n"
  },
  {
    "path": "examples/language/Rakefile",
    "chars": 18,
    "preview": "This is a rakefile"
  },
  {
    "path": "examples/language/Sally.yarn",
    "chars": 825,
    "preview": "<<if visited(\"Sally\") is false>>\r\n    Player: Hey, Sally. #line:794945\r\n    Sally: Oh! Hi. #line:2dc39b\r\n    Sally: You "
  },
  {
    "path": "examples/language/TOML.toml",
    "chars": 527,
    "preview": "# testing\ntitle = \"TOML examples\"\n\nint_value = 42\nfloat_value = 3.1415\n\nis_active = true\ncreated_at = 2025-12-12T00:00:0"
  },
  {
    "path": "examples/language/TOON.toon",
    "chars": 1731,
    "preview": "\"C++\":\n  complexitychecks[13]: \"for \",for(,\"if \",if(,\"switch \",switch(,\"while \",while(,\"else \",\"|| \",\"&& \",\"!= \",\"== \"\n "
  },
  {
    "path": "examples/language/abnf.abnf",
    "chars": 645,
    "preview": "postal-address   = name-part street zip-part\n\nname-part        = *(personal-part SP) last-name [SP suffix] CRLF\nname-par"
  },
  {
    "path": "examples/language/alchemist.crn",
    "chars": 450,
    "preview": "_ -> readk + In_n\nreadk -> init0 + In_k\ninit0 + k -> r + t + init0\ninit0 + 0k -> init1\ninit1 + t -> k + init1\ninit1 + 0t"
  },
  {
    "path": "examples/language/algol68.a68",
    "chars": 1066,
    "preview": "BEGIN # Algol-68 prime number sieve, functional style #\n  \n  PROC error = (STRING s) VOID:\n     (print(( newline, \" erro"
  },
  {
    "path": "examples/language/apex.apex",
    "chars": 1257,
    "preview": "/**\n * Example Apex class demonstrating language features\n * for scc code counting validation\n */\npublic class AccountHa"
  },
  {
    "path": "examples/language/arturo.art",
    "chars": 9981,
    "preview": "; this is a comment\n; this is another comment\n\n;---------------------------------\n; VARIABLES & VALUES\n;----------------"
  },
  {
    "path": "examples/language/astro.astro",
    "chars": 371,
    "preview": "<p>Here are a few facts about me:</p>\n<ul>\n  <li>My name is {identity.firstName}.</li>\n  <li>I live in {identity.country"
  },
  {
    "path": "examples/language/barber_solutions.als",
    "chars": 1238,
    "preview": "/*\n * Solutions to barber.als.\n * Uncomment them one at a time and execute the command.\n */\n\n/*\n * (a) Use the analyzer "
  },
  {
    "path": "examples/language/bean.beancount",
    "chars": 766,
    "preview": "2014-02-05 * \"Moving money to Isle of Man\" ^transfers-offshore-17\n  Assets:WellsFargo:Savings          -40000.00 USD\n  A"
  },
  {
    "path": "examples/language/bicep.bicep",
    "chars": 1138,
    "preview": "/*\nthis is a multi\nline comment\n*/\nparam rgLocation string = resourceGroup().location\nparam storageNames array = [\n  'co"
  },
  {
    "path": "examples/language/bitbucket-pipelines.yml",
    "chars": 579,
    "preview": "image: node:10.15.0\n  \npipelines:\n  default:\n    - step:\n        name: Build and test\n        script:\n          - npm in"
  },
  {
    "path": "examples/language/boo.boo",
    "chars": 29,
    "preview": "this should be matched as boo"
  },
  {
    "path": "examples/language/bosque.bsq",
    "chars": 6900,
    "preview": "//-------------------------------------------------------------------------------------------------------\n// Copyright ("
  },
  {
    "path": "examples/language/bru.bru",
    "chars": 331,
    "preview": "post {\n  url: https://api.textlocal.in/login\n}\n\nbody {\n  {\n    \"username\": \"johnnash\",\n    \"password\": \"governingdynamic"
  },
  {
    "path": "examples/language/c3.c3",
    "chars": 109,
    "preview": "// This is a comment\nimport std::io;\n\n<*\nDoc contracts\n*>\nfn void main()\n{\n    io::printn(\"Hello, World!\");\n}"
  },
  {
    "path": "examples/language/cairo.cairo",
    "chars": 439,
    "preview": "fn main() -> felt252 {\n    fib(16)\n}\n\nfn fib(mut n: felt252) -> felt252 {\n    let mut a: felt252 = 0;\n    let mut b: fel"
  },
  {
    "path": "examples/language/capnproto.capnp",
    "chars": 398,
    "preview": "@0xdbb9ad1f14bf0b36;  # unique file ID, generated by `capnp id`\n\n# Add a comment \nstruct Person {\n  name @0 :Text;\n  bir"
  },
  {
    "path": "examples/language/chapel.chpl",
    "chars": 343,
    "preview": "class Integer {\n  var x:int;\n}\nproc deferInFunction() {\n  var c = new unmanaged Integer(1);\n  writeln(\"created \", c);\n  "
  },
  {
    "path": "examples/language/circom.circom",
    "chars": 672,
    "preview": "// 34 lines 23 code 7 comments 4 blanks\npragma circom 2.0.8;\n\n/*\n * Sum an array of non-zero values.\n */\nfunction sum(va"
  },
  {
    "path": "examples/language/clojure.cljc",
    "chars": 9,
    "preview": "some code"
  },
  {
    "path": "examples/language/cloudformation.json",
    "chars": 9241,
    "preview": "{\n  \"AWSTemplateFormatVersion\":\"2010-09-09\",\n  \"Description\":\"AWS CloudFormation Sample Template EC2InstanceWithSecurity"
  },
  {
    "path": "examples/language/cloudformation.yml",
    "chars": 4697,
    "preview": "AWSTemplateFormatVersion: '2010-09-09'\n\nDescription: AWS lambda search - implementation\n\nResources:\n\n  # https://docs.aw"
  },
  {
    "path": "examples/language/component.templ",
    "chars": 123,
    "preview": "package main\n\ntempl nameList(items []Item) {\n  <ul>\n  for _, item := range items {\n    <li>{ item.Name }</li>\n  }\n  </ul"
  },
  {
    "path": "examples/language/cuda.cu",
    "chars": 925,
    "preview": "#include <iostream>\n#include <math.h>\n// Kernel function to add the elements of two arrays\n__global__\nvoid add(int n, fl"
  },
  {
    "path": "examples/language/cypher.cypher",
    "chars": 868,
    "preview": "// movies.cypher\n// Example query to test scc complexity definitions for Cypher.\n\n/*\n  This multi-line block explains th"
  },
  {
    "path": "examples/language/d2.d2",
    "chars": 897,
    "preview": "# An example copy from https://d2lang.com/tour/intro/\nvars: {\n  d2-config: {\n    layout-engine: elk\n    # Terminal theme"
  },
  {
    "path": "examples/language/daml.daml",
    "chars": 316,
    "preview": "applyFilter (filter : Int -> Int -> Bool)\n    (x : Int)\n    (y : Int) = filter x y\n\ncompute = script do\n    applyFilter "
  },
  {
    "path": "examples/language/docker.nu",
    "chars": 514,
    "preview": "# docker wrapper that returns a nushell table\ndef docker [\n  ...args:string # command to be passed to the real docker co"
  },
  {
    "path": "examples/language/dot.gv",
    "chars": 381,
    "preview": "graph graphname {\n    // This attribute applies to the graph itself\n    size=\"1,1\";\n    // The label attribute can be us"
  },
  {
    "path": "examples/language/elixirtemplate.eex",
    "chars": 122,
    "preview": "Hi, <%= name %>\n\ndefmodule Example do\n  require EEx\n  EEx.function_from_file(:def, :greeting, \"greeting.eex\", [:name])\ne"
  },
  {
    "path": "examples/language/elm.elm",
    "chars": 76,
    "preview": "case someBool of\r\n    True ->\r\n        \"yah\"\r\n\r\n    False ->\r\n        \"nope\""
  },
  {
    "path": "examples/language/emit.emit",
    "chars": 389,
    "preview": "// emit program\ncreate x = 10;\n\nx = x - 3;\n\ncreate y;\n\ntime strike;\n\ny kills x;\n\ncreate traveler;\n\nprint(x); //timeline "
  },
  {
    "path": "examples/language/factor.factor",
    "chars": 554,
    "preview": "! Written for SCC by CapitalEx\nUSING: combinators io kernel math.order math.parser random\nranges ;\nIN: simple-guessing-g"
  },
  {
    "path": "examples/language/flow9.flow",
    "chars": 447,
    "preview": "import runtime;\n\n/*\nIf we list all the natural numbers below 10 that are multiples of 3 or 5, \nwe get 3, 5, 6 and 9. The"
  },
  {
    "path": "examples/language/fsl.fsl",
    "chars": 5379,
    "preview": "machine_name     : \"Should you use twitter?\";\nmachine_author   : \"MachinShin \";\nmachine_license  : MIT;\nmachine_comment "
  },
  {
    "path": "examples/language/fxml.fxml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?import javafx.scene.layout.VBox?>\r\n<?import javafx.scene.control.Label?>\r\n\r\n<V"
  },
  {
    "path": "examples/language/gleam.gleam",
    "chars": 294,
    "preview": "import gleam/int\nimport gleam/io\n\npub fn main() {\n  let x = int.random(2)\n  let y = int.random(2)\n  io.debug(x)\n  io.deb"
  },
  {
    "path": "examples/language/go.go",
    "chars": 165,
    "preview": "package main\n\nimport \"fmt\"\n\n// This is a comment\n/**\n\tanother comment\n**/\n\n// Msg function\nfunc Msg() {\n\n}\n\nfunc main() "
  },
  {
    "path": "examples/language/godot.tscn",
    "chars": 874,
    "preview": "[gd_scene load_steps=4 format=3 uid=\"uid://bam4cbdd6h24e\"]\n\n[ext_resource type=\"Texture2D\" uid=\"uid://dw1aad3whrra0\" pat"
  },
  {
    "path": "examples/language/goplus.gop",
    "chars": 490,
    "preview": "#!/usr/bin/gop run\n\n// test\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\nfunc collatz(num int32) []int32 {\n\tif num <= 0 {\n\t\tpanic(\"num mus"
  },
  {
    "path": "examples/language/graphql.graphql",
    "chars": 1156299,
    "preview": "directive @requiredCapabilities(\n  requiredCapabilities: [String!]\n) on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_"
  },
  {
    "path": "examples/language/gremlin.gremlin",
    "chars": 978,
    "preview": "// social_graph.gremlin\n// Example traversal to test scc complexity definitions for Gremlin.\n\n// Find a person named \"Ma"
  },
  {
    "path": "examples/language/gwion.gw",
    "chars": 596,
    "preview": "#import Std\n#import Math\n#import Modules\n\nfun int get_ncycles() {\n  if(me.args())\n    return me.arg(0) => Std.atoi;\n  re"
  },
  {
    "path": "examples/language/haml.haml",
    "chars": 245,
    "preview": "# file: app/controllers/movies_controller.rb\n\nclass MoviesController < ApplicationController\n  def index\n    @title = \"T"
  },
  {
    "path": "examples/language/hare.ha",
    "chars": 608,
    "preview": "use fmt;\nuse strings;\n\nexport type error = !str;\n\ntype example = struct {\n\tnumber: i64,\n\terror: error,\n};\n\nfn function(a"
  },
  {
    "path": "examples/language/haskell.hs",
    "chars": 1479,
    "preview": "module RBTree\n    ( RBTree\n    , empty\n    , insert\n    , member\n    , fromList\n    ) where\n\ndata Color = Red | Black\n  "
  },
  {
    "path": "examples/language/hcl.hcl",
    "chars": 4305,
    "preview": "#!/usr/bin/env packer build --force\n#\n#  Author: Hari Sekhon\n#  Date: 2023-06-13 02:46:59 +0100 (Tue, 13 Jun 2023)\n#\n#  "
  },
  {
    "path": "examples/language/ini.ini",
    "chars": 226,
    "preview": "; last modified 1 April 2001 by John Doe\n[owner]\nname = John Doe\norganization = Acme Widgets Inc.\n\n[database]\n; use IP a"
  },
  {
    "path": "examples/language/javascript.js",
    "chars": 402,
    "preview": "class Person {\n    constructor(name) {\n        this.name = name;\n    }\n}\n\nclass Student extends Person {\n    constructor"
  },
  {
    "path": "examples/language/jcl.jcl",
    "chars": 813,
    "preview": "//MTLUSR00 JOB (999,POK),'METAL',CLASS=A,MSGCLASS=H,NOTIFY=&SYSUID\n//*  example from: https://www.ibm.com/docs/en/zos/2."
  },
  {
    "path": "examples/language/jq.jq",
    "chars": 878,
    "preview": "# Use gojq for infinite precision integer arithmetic\ndef tobase($b):\n    def digit: \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXY"
  },
  {
    "path": "examples/language/jsonc.jsonc",
    "chars": 96,
    "preview": "// Line comment\n{\n  /*\n   * Multi\n   * Line\n   * Comment\n   */\n  \"text\": \"JSON with comments\"\n}\n"
  },
  {
    "path": "examples/language/jsonnet.jsonnet",
    "chars": 559,
    "preview": "local foo = \"bar\";\n\n// This is a comment\n# This is another comment\n/*\n * This is a bigger comment\n */\n\n{\n  local bar = \""
  },
  {
    "path": "examples/language/kitchen-sink.json5",
    "chars": 376,
    "preview": "// example from https://json5.org/\n{\n  // comments\n  unquoted: 'and you can quote me on that',\n  singleQuotes: 'I can us"
  },
  {
    "path": "examples/language/koto.koto",
    "chars": 315,
    "preview": "get_primes = |n: Number| -> Iterator\n  if n <= 1\n    return\n\n  sieve = []\n  sieve.resize (n + 1), true\n\n  for x in 2..=n"
  },
  {
    "path": "examples/language/lalrpop.lalrpop",
    "chars": 859,
    "preview": "// 37 lines 26 code 3 comments 8 blanks\nuse crate::ast::{ExprSymbol, Opcode};\nuse crate::tok9::Tok;\n\ngrammar<'input>(inp"
  },
  {
    "path": "examples/language/license",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/language/linear_solve.fut",
    "chars": 945,
    "preview": "-- Solving a linear system using Gauss-Jordan elimination without pivoting.\n--\n-- Taken from https://www.cs.cmu.edu/~sca"
  },
  {
    "path": "examples/language/livescript.ls",
    "chars": 824,
    "preview": "# Easy listing of implicit objects\ntable1 =\n  * id: 1\n    name: 'george'\n  * id: 2\n    name: 'mike'\n  * id: 3\n    name: "
  },
  {
    "path": "examples/language/llvmir.ll",
    "chars": 119,
    "preview": "; f returns the sum of the given operands.\ndefine i32 @f(i32 %x, i32 %y) {\n\t%result = add i32 %x, %y\n\tret i32 %result\n}"
  },
  {
    "path": "examples/language/lua.lua",
    "chars": 221,
    "preview": "-- lua test\n\nlocal function f(a)\n    for i = 1, a do\n        io.write(a .. \" x \" .. i .. \" = \" .. (i*a))\n        if i ~="
  },
  {
    "path": "examples/language/luau.luau",
    "chars": 281,
    "preview": "-- test for luau\n\nlocal function f(a: number): string\n    local res = \"\"\n    for i = 1, a do\n        res = res .. (a .. "
  },
  {
    "path": "examples/language/luna.luna",
    "chars": 502,
    "preview": "def barify t: 'bar ' + t.toText + ' bar'\n\n# This is a comment\nreportedValue = case myNumber of\n    Just v -> 'Got a numb"
  },
  {
    "path": "examples/language/main.cj",
    "chars": 512,
    "preview": "import std.sync.*\nimport std.time.*\nimport std.collection.*\n\nlet count = AtomicInt64(0)\n\nmain(): Int64 {\n    let list = "
  },
  {
    "path": "examples/language/makefile",
    "chars": 8,
    "preview": "makefile"
  },
  {
    "path": "examples/language/metal.metal",
    "chars": 8051,
    "preview": "/*\n\n Copyright (C) 2016 Apple Inc. All Rights Reserved.\n\n See LICENSE.txt for this sample’s licensing information\n\n\n\n Ab"
  },
  {
    "path": "examples/language/mojo.mojo",
    "chars": 923,
    "preview": "from std.collections import InlineArray\n\nstruct StaticMultiplicationTable:\n    comptime length = 81\n    var data: Inline"
  },
  {
    "path": "examples/language/moonbit.mbt",
    "chars": 410,
    "preview": "fn iter(data : Bytes) -> Iter[Byte] {\n  Iter::new(\n    fn(yield) {\n      // The code that actually does the iteration\n  "
  },
  {
    "path": "examples/language/nature.n",
    "chars": 906,
    "preview": "// example from https://github.com/nature-lang/nature/blob/89d3196ec6f6e077fc7c3cba05c58d9f1bea6a03/tests/features/cases"
  },
  {
    "path": "examples/language/nawk.awk",
    "chars": 565,
    "preview": "#!/usr/bin/nawk -f\n\nBEGIN {\n    print(\"Enter string to encode:\")\n}\n\n{\n    print(\"Encoded string:\")\n    print(rot13($0))\n"
  },
  {
    "path": "examples/language/perl.pl",
    "chars": 140,
    "preview": "#!/usr/bin/perl\n\nfor($i=1; $i<10; $i++){\n    for($j=1; $j<$i+1; $j++){\n       printf \"%-4s%-2d  \", \"$j*$i=\", $i*$j;\n    "
  },
  {
    "path": "examples/language/pkl.pkl",
    "chars": 1339,
    "preview": "// ===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the"
  },
  {
    "path": "examples/language/plain.txt",
    "chars": 24,
    "preview": "This a plain text file.\n"
  },
  {
    "path": "examples/language/python.py",
    "chars": 139,
    "preview": "#!/usr/bin/python3\n\n\nfor i in range(1, 10):\n    for j in range(1, i+1):\n        print(f\"{i}x{j}={i*j}\", end=' ')\n    els"
  },
  {
    "path": "examples/language/qasm.qasm",
    "chars": 2684,
    "preview": "// 89 lines 58 code 21 comments 10 blanks\n/*\n * Variational eigensolver example\n *\n * Goal is to estimate the energy for"
  },
  {
    "path": "examples/language/qsharp.qs",
    "chars": 750,
    "preview": "operation BellTest (count : Int, initial: Result) : (Int, Int, Int) {\n    mutable numOnes = 0;\n    mutable agree = 0;\n  "
  },
  {
    "path": "examples/language/racket.rkt",
    "chars": 3480,
    "preview": "#lang racket/base\n\n(require racket/private/norm-arity)\n\n(provide normalize-arity normalized-arity? arity=? arity-include"
  },
  {
    "path": "examples/language/raml.raml",
    "chars": 1252,
    "preview": "#%RAML 1.0\ntitle: API with Examples\n\ntypes:\n  User:\n    type: object\n    properties:\n      name: string\n      lastname: "
  },
  {
    "path": "examples/language/rebol.reb",
    "chars": 2939,
    "preview": "; An example comes from https://www.re-bol.com/rebol.html#section-11\n; This is a slightly edited version of the 3D Maze "
  },
  {
    "path": "examples/language/redscript.reds",
    "chars": 2570,
    "preview": "// redscript allows line comments\n/* as well as block comments */\n\n// it supports global functions\nfunc add2(x: Int32, y"
  },
  {
    "path": "examples/language/rscript.r",
    "chars": 188,
    "preview": "#!/usr/bin/env Rscript\r\n\r\nprint(\"===== Start =====\")\r\n\r\nfor (i in 1:9) {\r\n    for (j in 1:i) {\r\n        cat(i, 'x', j, '"
  },
  {
    "path": "examples/language/rtf.rtf",
    "chars": 2086,
    "preview": "{\\rtf1\\ansi\\deff0\n{\\colortbl;\\red0\\green0\\blue0;\\red255\\green0\\blue0;\\red0\\green128\\blue0;\\red0\\green0\\blue255;\\red255\\g"
  },
  {
    "path": "examples/language/scallop.scl",
    "chars": 762,
    "preview": "// There are three classes\nrel classes = {0, 1, 2}\n\n// There are 6 students, 2 in each class\nrel student = {\n  (0, \"tom\""
  },
  {
    "path": "examples/language/seed7.sd7",
    "chars": 460,
    "preview": "(*\n  Language test for Seed7\n*)\n\n$ include \"seed7_05.s7i\"; # import the standard library\n\nconst proc: main is func\n  loc"
  },
  {
    "path": "examples/language/slang.slang",
    "chars": 274,
    "preview": "// 15 lines 8 code 4 comments 2 blanks\n\nTexture2D<float4> in_tex;\nRWTexture2D<float4> out_tex;\n\n// Blit compute shader\n["
  },
  {
    "path": "examples/language/slint.slint",
    "chars": 3035,
    "preview": "// an example from https://releases.slint.dev/1.7.2/docs/slint/src/recipes/recipes#custom-table-view\n// 2 comments 5 bla"
  },
  {
    "path": "examples/language/smalltalk.cs.st",
    "chars": 1615,
    "preview": "Class: CookieMonster\nSuperclass: Monster\nCategory: Sesame Street\nInstance variables: state hunger\n \nprivate\n\n    askForC"
  },
  {
    "path": "examples/language/snakefile.smk",
    "chars": 1368,
    "preview": "# 67 lines 50 code 4 comments 13 blanks\n\"\"\"\nA sample Snakefile for testing line counting\n\"\"\"\n\nSAMPLES = [\"A\", \"B\"]\n\n\n# T"
  },
  {
    "path": "examples/language/stan.stan",
    "chars": 5682,
    "preview": "data{\n  int N_national_polls;    // Number of polls\n  int N_state_polls;    // Number of polls\n  int T;    // Number of "
  },
  {
    "path": "examples/language/syntax.wren",
    "chars": 3541,
    "preview": "// This file provides examples of syntactic constructs in wren, which is mainly\n// interesting for testing syntax highli"
  },
  {
    "path": "examples/language/systemd.service",
    "chars": 277,
    "preview": "# exampple systemd file\n[Unit]\nDescription=scc\n\n[Service]\nWorkingDirectory=/webapps/scc\nExecStart=/webapps/scc/scc\nResta"
  },
  {
    "path": "examples/language/tact.tact",
    "chars": 380,
    "preview": "// 20 lines 12 code 4 comments 4 blanks\n\nimport \"@stdlib/ownable\"; // comment\n\n/* comment */\nfun global() {\n    let str:"
  },
  {
    "path": "examples/language/teal.teal",
    "chars": 213,
    "preview": "#pragma version 4\n// loop 1 - 10\n// init loop var\nint 0 \nloop:\nint 1\n+\ndup\n// implement loop code\n// ...\n// check upper "
  },
  {
    "path": "examples/language/tera.tera",
    "chars": 264,
    "preview": "{% set map = section.pages | group_by(attribute=\"year\") %}\n{% set_global years = [] %}\n{% for year, ignored in map %}\n  "
  },
  {
    "path": "examples/language/test.ch",
    "chars": 560,
    "preview": "/*\n   Constants and macro definitions for the program\n   https://github.com/boyter/scc/issues/484\n*/\n\n// Define a consta"
  },
  {
    "path": "examples/language/test.dm",
    "chars": 287,
    "preview": "// A singleline comment\n/*\n  A multiline comment\n  /*\n    Nested multiline\n  */\n*/\n\n/proc/foo()\n\tfor(var/turf/station/T "
  },
  {
    "path": "examples/language/test.java",
    "chars": 6137,
    "preview": "package com.boyter.SpellingCorrector;\n\nimport java.util.*;\nimport java.util.stream.Stream;\n\n/**\n * A simple spell checke"
  },
  {
    "path": "examples/language/test.prg",
    "chars": 642,
    "preview": "/*\n   This program demonstrates the calculation\n   of the factorial of a number using a function.\n\n   https://github.com"
  },
  {
    "path": "examples/language/test.sieve",
    "chars": 5941,
    "preview": "require [\"fileinto\", \"reject\", \"vacation\", \"notify\", \"envelope\", \"body\", \"relational\", \"regex\", \"subaddress\", \"copy\", \"m"
  },
  {
    "path": "examples/language/test.tf",
    "chars": 589,
    "preview": "# This is a comment\n// This is another comment\n\n/* This is a\n   multiline\n   comment\n*/\n\nprovider \"null\" {}\n\nlocals {\n  "
  },
  {
    "path": "examples/language/test.tofu",
    "chars": 589,
    "preview": "# This is a comment\n// This is another comment\n\n/* This is a\n   multiline\n   comment\n*/\n\nprovider \"null\" {}\n\nlocals {\n  "
  },
  {
    "path": "examples/language/textile.textile",
    "chars": 167,
    "preview": "###. -*- mode: textile; -*-\n\nSee [\"Textile\":https://textile-lang.com].\n\n###.. ////////////////\n// Local Variables:\n// co"
  },
  {
    "path": "examples/language/ttcn.ttcn",
    "chars": 1361,
    "preview": "module TestSystem {\n\n// Define a subtype of integer\ntype integer myNewType (0..50)\n\n// Declare Request struct type with "
  },
  {
    "path": "examples/language/typescript.ts",
    "chars": 130,
    "preview": "const url = `/foo/bar/*`;\n\nfunction getUrl(path?: string): string {\n  return path ?? url;\n}\n\nfunction getUrl2() {\n  retu"
  }
]

// ... and 850 more files (download for full content)

About this extraction

This page contains the full source code of the boyter/scc GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1050 files (11.9 MB), approximately 3.2M tokens, and a symbol index with 90412 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!